@agentshouse/mdruntime 0.1.0-c3fa75348e547 → 0.1.0-c3faae279d4d2
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 +385 -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 +150 -81
- 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 +30 -11
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +320 -111
- 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 -16
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +11 -89
- 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 +33 -10
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +90 -10
- 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 +16 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +711 -0
- package/dist/connection.d.ts +7 -132
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +100 -3568
- 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 +136 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +248 -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 +53 -44
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +938 -715
- 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 +16 -4
- 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 +33 -28
- 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 +4 -10
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +74 -41
- package/dist/identity.d.ts +0 -2
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -6
- package/dist/index.d.ts +33 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/install.d.ts +56 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +554 -0
- package/dist/job.d.ts +33 -0
- package/dist/job.d.ts.map +1 -0
- package/dist/job.js +54 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +268 -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 +163 -0
- package/dist/locks.d.ts +9 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +61 -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 +14 -7
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +241 -107
- package/dist/messages.d.ts +52 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +162 -0
- package/dist/model.d.ts +8 -10
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +6 -18
- package/dist/models.d.ts +14 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +195 -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 +17 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +107 -17
- 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 +57 -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 +3 -5
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +98 -172
- package/dist/{chat/parts.d.ts → parts.d.ts} +12 -9
- package/dist/parts.d.ts.map +1 -0
- package/dist/{chat/parts.js → parts.js} +53 -46
- 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 +226 -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 +25 -191
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -470
- 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 +20 -9
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +287 -99
- package/dist/react.d.ts +11 -4
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +2 -14
- 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 +13 -17
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +2 -8
- package/dist/reads.d.ts +36 -10
- package/dist/reads.d.ts.map +1 -1
- package/dist/reads.js +157 -84
- package/dist/recovery.d.ts +3 -2
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +43 -8
- package/dist/refresh.d.ts +18 -15
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +143 -58
- package/dist/refusal.d.ts +5 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +55 -0
- package/dist/replica.d.ts +56 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +332 -190
- package/dist/room-draft.d.ts +25 -8
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +161 -74
- 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 +31 -30
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +59 -118
- 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 +57 -14
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +537 -192
- package/dist/saves.d.ts +70 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +1005 -0
- 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 +11 -2
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +89 -5
- package/dist/shared.d.ts +6 -7
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +75 -104
- package/dist/shown.d.ts +31 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +292 -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 +4 -5
- 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 +212 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +431 -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 -158
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +136 -734
- 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 +223 -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 +416 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +740 -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 +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 +50 -6
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +16 -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.map +0 -1
- 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.map +0 -1
- package/dist/chat/read.d.ts.map +0 -1
- 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/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 -25
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -642
package/dist/memory.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
import { 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: 604_800,
|
|
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,14 +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
|
-
|
|
61
|
-
|
|
58
|
+
const attached = new Map();
|
|
59
|
+
const linked = new WeakMap();
|
|
60
|
+
const carried = new Map();
|
|
62
61
|
let expiring = [];
|
|
62
|
+
let openings = 0;
|
|
63
|
+
const declaredRooms = new Set();
|
|
63
64
|
let replicated = [];
|
|
65
|
+
let heldCursor = null;
|
|
64
66
|
let issued = 0;
|
|
65
67
|
function scriptConversations(entries) {
|
|
66
68
|
scripted.clear();
|
|
@@ -88,8 +90,48 @@ export function createMemoryAdapter(options = {}) {
|
|
|
88
90
|
const wanted = ordinals.get(`${locator}\u0000${target}`);
|
|
89
91
|
return held !== undefined && wanted !== undefined && held >= wanted;
|
|
90
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), { types });
|
|
117
|
+
held.set(key, facts === null ? null : JSON.parse(JSON.stringify(facts)));
|
|
118
|
+
}
|
|
119
|
+
return held.get(key);
|
|
120
|
+
}
|
|
121
|
+
function factsIn(room, paths) {
|
|
122
|
+
const facts = {};
|
|
123
|
+
for (const path of paths) {
|
|
124
|
+
const content = room.documents?.[path];
|
|
125
|
+
const held = room.facts?.[path] ?? (content === undefined ? null : factsAt(room, path, content));
|
|
126
|
+
if (held !== null)
|
|
127
|
+
facts[path] = held;
|
|
128
|
+
}
|
|
129
|
+
return facts;
|
|
130
|
+
}
|
|
91
131
|
function retain(entries) {
|
|
92
132
|
for (const room of entries) {
|
|
133
|
+
for (const [path, content] of Object.entries(room.documents ?? {}))
|
|
134
|
+
factsAt(room, path, content);
|
|
93
135
|
note(room.locator, room);
|
|
94
136
|
const versions = served.get(room.locator) ?? new Map();
|
|
95
137
|
versions.set(room.roomVersion, room);
|
|
@@ -107,6 +149,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
107
149
|
replica: room.replica,
|
|
108
150
|
...(room.typedSelection === undefined ? {} : { typedSelection: room.typedSelection }),
|
|
109
151
|
providerOwnedPaths: room.providerOwnedPaths,
|
|
152
|
+
authoredPaths: room.authoredPaths,
|
|
110
153
|
};
|
|
111
154
|
}
|
|
112
155
|
function page(room, after) {
|
|
@@ -122,27 +165,43 @@ export function createMemoryAdapter(options = {}) {
|
|
|
122
165
|
roomVersion: room.roomVersion,
|
|
123
166
|
...(opening ? { models: modelsOf(room) } : {}),
|
|
124
167
|
documents: named(room.documents ?? {}, taken),
|
|
168
|
+
facts: factsIn(room, taken),
|
|
125
169
|
revisions: named(room.revisions ?? {}, [...taken, ...targets]),
|
|
126
170
|
...(room.fileIds === undefined
|
|
127
171
|
? {}
|
|
128
172
|
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
173
|
+
...(room.created === undefined
|
|
174
|
+
? {}
|
|
175
|
+
: { created: named(room.created, [...taken, ...targets]) }),
|
|
129
176
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
130
177
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
178
|
+
...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
|
|
131
179
|
...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
|
|
132
180
|
};
|
|
133
181
|
}
|
|
134
|
-
function
|
|
182
|
+
function foldersMoved(room, from) {
|
|
183
|
+
const now = new Set(room.folders ?? []);
|
|
184
|
+
const before = new Set(from.folders ?? []);
|
|
185
|
+
const folders = [...now].filter((folder) => !before.has(folder)).sort();
|
|
186
|
+
const folderRemovals = [...before].filter((folder) => !now.has(folder)).sort();
|
|
187
|
+
return {
|
|
188
|
+
...(folders.length === 0 ? {} : { folders }),
|
|
189
|
+
...(folderRemovals.length === 0 ? {} : { folderRemovals }),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
function advancement(room, from, at, whole = false) {
|
|
135
193
|
const current = room.documents ?? {};
|
|
136
194
|
const previous = from.documents ?? {};
|
|
137
195
|
const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
|
|
138
196
|
const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
|
|
139
197
|
const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
|
|
140
198
|
room.fileIds?.[path] !== from.fileIds?.[path] ||
|
|
199
|
+
room.created?.[path] !== from.created?.[path] ||
|
|
141
200
|
!sameChange(room.changes?.[path], from.changes?.[path]);
|
|
142
201
|
const changed = Object.keys(current)
|
|
143
202
|
.filter((path) => current[path] !== previous[path] || headMoved(path))
|
|
144
203
|
.sort();
|
|
145
|
-
const size = pageSize ?? changed.length;
|
|
204
|
+
const size = whole ? changed.length : (pageSize ?? changed.length);
|
|
146
205
|
const taken = changed.slice(at, at + size);
|
|
147
206
|
const next = at + taken.length;
|
|
148
207
|
const opening = at === 0;
|
|
@@ -158,12 +217,17 @@ export function createMemoryAdapter(options = {}) {
|
|
|
158
217
|
roomVersion: room.roomVersion,
|
|
159
218
|
...(models === undefined ? {} : { models }),
|
|
160
219
|
documents: named(current, taken),
|
|
220
|
+
facts: factsIn(room, taken),
|
|
161
221
|
revisions: named(room.revisions ?? {}, [...taken, ...targets]),
|
|
162
222
|
...(room.fileIds === undefined
|
|
163
223
|
? {}
|
|
164
224
|
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
225
|
+
...(room.created === undefined
|
|
226
|
+
? {}
|
|
227
|
+
: { created: named(room.created, [...taken, ...targets]) }),
|
|
165
228
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
166
229
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
230
|
+
...(opening ? foldersMoved(room, from) : {}),
|
|
167
231
|
removals: opening
|
|
168
232
|
? [
|
|
169
233
|
...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
|
|
@@ -173,6 +237,26 @@ export function createMemoryAdapter(options = {}) {
|
|
|
173
237
|
...(pageToken === undefined ? {} : { pageToken }),
|
|
174
238
|
};
|
|
175
239
|
}
|
|
240
|
+
function carry(locator) {
|
|
241
|
+
const at = carried.get(locator);
|
|
242
|
+
const current = rooms.find((entry) => entry.locator === locator);
|
|
243
|
+
if (at === undefined || current === undefined || current.roomVersion === at)
|
|
244
|
+
return;
|
|
245
|
+
const from = served.get(locator)?.get(at);
|
|
246
|
+
carried.set(locator, current.roomVersion);
|
|
247
|
+
if (from === undefined)
|
|
248
|
+
return;
|
|
249
|
+
const page = advancement(current, from, 0, true);
|
|
250
|
+
for (const observer of observers) {
|
|
251
|
+
observer({
|
|
252
|
+
kind: 'room-change',
|
|
253
|
+
locator,
|
|
254
|
+
from: at,
|
|
255
|
+
roomVersion: current.roomVersion,
|
|
256
|
+
read: async () => page,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
176
260
|
function pageOf(conversation, after) {
|
|
177
261
|
const messages = conversation.messages ?? [];
|
|
178
262
|
const first = typeof after === 'string' ? messages.findIndex((message) => message.position > after) : 0;
|
|
@@ -187,16 +271,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
187
271
|
: {}),
|
|
188
272
|
};
|
|
189
273
|
}
|
|
190
|
-
function historiesOf(
|
|
191
|
-
const asked = input?.conversations;
|
|
192
|
-
if (!Array.isArray(asked))
|
|
193
|
-
return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
|
|
274
|
+
function historiesOf(request) {
|
|
194
275
|
const histories = [];
|
|
195
|
-
for (const entry of
|
|
196
|
-
const conversation =
|
|
276
|
+
for (const entry of request.conversations) {
|
|
277
|
+
const conversation = scripted.get(entry.conversation);
|
|
197
278
|
if (conversation === undefined)
|
|
198
279
|
continue;
|
|
199
|
-
const outcome = conversation.outcomes?.
|
|
280
|
+
const outcome = conversation.outcomes?.history;
|
|
200
281
|
if (outcome !== undefined)
|
|
201
282
|
return outcome;
|
|
202
283
|
histories.push(pageOf(conversation, entry.after));
|
|
@@ -207,15 +288,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
207
288
|
function conversationAction(request) {
|
|
208
289
|
const name = request.name;
|
|
209
290
|
const input = (request.input ?? {});
|
|
210
|
-
if (name === '
|
|
211
|
-
return historiesOf(request.input);
|
|
212
|
-
if (name === 'conversation.create') {
|
|
291
|
+
if (name === 'conversations/create') {
|
|
213
292
|
issued += 1;
|
|
214
293
|
const conversation = `conversation-${issued}`;
|
|
215
294
|
scripted.set(conversation, { conversation });
|
|
216
|
-
return { kind: 'action', result: { conversation } };
|
|
295
|
+
return { kind: 'action', result: { conversation_id: conversation } };
|
|
217
296
|
}
|
|
218
|
-
const named = typeof input.
|
|
297
|
+
const named = typeof input.conversation_id === 'string' ? input.conversation_id : '';
|
|
219
298
|
const conversation = scripted.get(named);
|
|
220
299
|
if (conversation === undefined) {
|
|
221
300
|
return {
|
|
@@ -228,34 +307,28 @@ export function createMemoryAdapter(options = {}) {
|
|
|
228
307
|
const outcome = conversation.outcomes?.[name];
|
|
229
308
|
if (outcome !== undefined)
|
|
230
309
|
return outcome;
|
|
231
|
-
if (name === '
|
|
310
|
+
if (name === 'conversations/send') {
|
|
232
311
|
const operation = typeof input.operation_id === 'string' ? input.operation_id : null;
|
|
233
312
|
const answered = operation === null ? undefined : sentTurns.get(operation);
|
|
234
313
|
if (answered !== undefined)
|
|
235
|
-
return { kind: 'action', result: {
|
|
314
|
+
return { kind: 'action', result: { message_id: answered } };
|
|
236
315
|
issued += 1;
|
|
237
316
|
const turn = `turn-${issued}`;
|
|
238
|
-
unsealed.set(turn, named);
|
|
239
317
|
if (operation !== null)
|
|
240
318
|
sentTurns.set(operation, turn);
|
|
241
|
-
return { kind: 'action', result: { turn } };
|
|
242
|
-
}
|
|
243
|
-
if (name === 'conversation.cancel') {
|
|
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 } };
|
|
319
|
+
return { kind: 'action', result: { message_id: turn } };
|
|
250
320
|
}
|
|
251
|
-
if (name === '
|
|
321
|
+
if (name === 'conversations/delete')
|
|
252
322
|
scripted.delete(named);
|
|
253
|
-
return { kind: 'action', result: {
|
|
323
|
+
return { kind: 'action', result: { conversation_id: named } };
|
|
254
324
|
}
|
|
255
325
|
function announceList() {
|
|
256
|
-
const entries = [...scripted.values()].flatMap(({ conversation, listed }) => listed === undefined
|
|
257
|
-
|
|
258
|
-
|
|
326
|
+
const entries = [...scripted.values()].flatMap(({ conversation, listed, messages = [] }) => listed === undefined
|
|
327
|
+
? []
|
|
328
|
+
: [{ conversation, ...listed, newest: messages.at(-1)?.position ?? null }]);
|
|
329
|
+
for (const listener of listeners) {
|
|
330
|
+
listener({ kind: 'list', entries, whole: true, more: false, cursor: null });
|
|
331
|
+
}
|
|
259
332
|
}
|
|
260
333
|
function discovery() {
|
|
261
334
|
return {
|
|
@@ -267,8 +340,42 @@ export function createMemoryAdapter(options = {}) {
|
|
|
267
340
|
...(options.member === undefined ? {} : { member: options.member }),
|
|
268
341
|
};
|
|
269
342
|
}
|
|
343
|
+
function discovered() {
|
|
344
|
+
return resolveScript(scripts.discover, discovery, undefined).then((answer) => {
|
|
345
|
+
if (answer.kind === 'discovery')
|
|
346
|
+
for (const room of answer.rooms)
|
|
347
|
+
note(room.locator, room);
|
|
348
|
+
return answer;
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
function opened(notify) {
|
|
352
|
+
const opening = ++openings;
|
|
353
|
+
notify({ kind: 'opened' });
|
|
354
|
+
void discovered()
|
|
355
|
+
.catch(() => ({ kind: 'transport-uncertainty' }))
|
|
356
|
+
.then((answer) => {
|
|
357
|
+
if (opening !== openings)
|
|
358
|
+
return;
|
|
359
|
+
if (answer.kind !== 'discovery') {
|
|
360
|
+
openings += 1;
|
|
361
|
+
carried.clear();
|
|
362
|
+
const revoked = answer.kind === 'revoked-authorization';
|
|
363
|
+
notify({ kind: 'closed', revoked, lost: !revoked, authorityChanged: false });
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
declaredRooms.clear();
|
|
367
|
+
for (const room of answer.rooms)
|
|
368
|
+
declaredRooms.add(room.locator);
|
|
369
|
+
notify({ kind: 'discovered', discovery: answer });
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
function emitAll(event) {
|
|
373
|
+
for (const observer of observers)
|
|
374
|
+
observer(event);
|
|
375
|
+
}
|
|
270
376
|
return {
|
|
271
|
-
...(options.
|
|
377
|
+
...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
|
|
378
|
+
...(options.typedPaths === undefined ? {} : { typedPaths: options.typedPaths }),
|
|
272
379
|
setRooms(next) {
|
|
273
380
|
rooms = [...next];
|
|
274
381
|
retain(rooms);
|
|
@@ -277,30 +384,37 @@ export function createMemoryAdapter(options = {}) {
|
|
|
277
384
|
scriptConversations(next);
|
|
278
385
|
},
|
|
279
386
|
open() {
|
|
387
|
+
carried.clear();
|
|
280
388
|
announceList();
|
|
281
|
-
|
|
282
|
-
observer({ kind: 'opened' });
|
|
389
|
+
opened(emitAll);
|
|
283
390
|
},
|
|
284
|
-
close({ revoked = false, lost = !revoked } = {}) {
|
|
285
|
-
|
|
286
|
-
|
|
391
|
+
close({ revoked = false, lost = !revoked, authorityChanged = false } = {}) {
|
|
392
|
+
openings += 1;
|
|
393
|
+
carried.clear();
|
|
394
|
+
emitAll({ kind: 'closed', revoked, lost, authorityChanged });
|
|
287
395
|
},
|
|
288
396
|
expire(locators) {
|
|
289
397
|
expiring = [...locators];
|
|
290
398
|
},
|
|
291
|
-
notifyRoomVersion({ locator
|
|
292
|
-
|
|
293
|
-
observer({ kind: 'room-version', locator, roomVersion });
|
|
399
|
+
notifyRoomVersion({ locator }) {
|
|
400
|
+
carry(locator);
|
|
294
401
|
},
|
|
295
|
-
notifyAuthorityChanged() {
|
|
296
|
-
|
|
297
|
-
|
|
402
|
+
notifyAuthorityChanged(locators) {
|
|
403
|
+
const named = new Set(locators ?? [...declaredRooms, ...rooms.map((room) => room.locator)]);
|
|
404
|
+
const listed = rooms.filter((room) => named.has(room.locator));
|
|
405
|
+
const left = [...named].filter((locator) => !listed.some((room) => room.locator === locator));
|
|
406
|
+
for (const room of listed)
|
|
407
|
+
declaredRooms.add(room.locator);
|
|
408
|
+
for (const locator of left)
|
|
409
|
+
declaredRooms.delete(locator);
|
|
410
|
+
emitAll({
|
|
411
|
+
kind: 'authority-changed',
|
|
412
|
+
rooms: listed.map(declared),
|
|
413
|
+
left,
|
|
414
|
+
...(options.member === undefined ? {} : { member: options.member }),
|
|
415
|
+
});
|
|
298
416
|
},
|
|
299
417
|
notifyConversation(event) {
|
|
300
|
-
if (event.kind === 'accepted-message') {
|
|
301
|
-
sealed.add(event.message.turn);
|
|
302
|
-
unsealed.delete(event.message.turn);
|
|
303
|
-
}
|
|
304
418
|
for (const listener of listeners)
|
|
305
419
|
listener(event);
|
|
306
420
|
},
|
|
@@ -309,24 +423,31 @@ export function createMemoryAdapter(options = {}) {
|
|
|
309
423
|
observer(mode);
|
|
310
424
|
},
|
|
311
425
|
heldRooms() {
|
|
312
|
-
return
|
|
313
|
-
},
|
|
314
|
-
heldDemand() {
|
|
315
|
-
return heldDemand;
|
|
426
|
+
return [...carried.keys()].sort();
|
|
316
427
|
},
|
|
317
428
|
replicatedConversations() {
|
|
318
429
|
return replicated;
|
|
319
430
|
},
|
|
431
|
+
heldConversationCursor() {
|
|
432
|
+
return heldCursor;
|
|
433
|
+
},
|
|
320
434
|
conversations: {
|
|
321
435
|
replicate(next) {
|
|
322
436
|
replicated = [...next];
|
|
323
437
|
},
|
|
438
|
+
hold(cursor) {
|
|
439
|
+
heldCursor = cursor;
|
|
440
|
+
},
|
|
324
441
|
observe(notify) {
|
|
325
442
|
listeners.add(notify);
|
|
326
443
|
return () => {
|
|
327
444
|
listeners.delete(notify);
|
|
328
445
|
};
|
|
329
446
|
},
|
|
447
|
+
history: (request) => Promise.resolve(historiesOf(request)),
|
|
448
|
+
...(options.agents === undefined
|
|
449
|
+
? {}
|
|
450
|
+
: { agents: () => Promise.resolve(structuredClone(options.agents)) }),
|
|
330
451
|
},
|
|
331
452
|
serviceMode: {
|
|
332
453
|
observe(notify) {
|
|
@@ -337,46 +458,47 @@ export function createMemoryAdapter(options = {}) {
|
|
|
337
458
|
},
|
|
338
459
|
},
|
|
339
460
|
roomStream: {
|
|
340
|
-
hold(asked
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
const expired = expiring.filter((locator) => held.includes(locator));
|
|
344
|
-
expiring = [];
|
|
345
|
-
const moved = asked.flatMap((room) => {
|
|
461
|
+
hold(asked) {
|
|
462
|
+
const named = asked.map((room) => room.locator);
|
|
463
|
+
const unknown = asked.flatMap((room) => {
|
|
346
464
|
const current = rooms.find((entry) => entry.locator === room.locator);
|
|
465
|
+
const version = room.roomVersion;
|
|
347
466
|
return current === undefined ||
|
|
348
|
-
|
|
349
|
-
|
|
467
|
+
(version !== null &&
|
|
468
|
+
(current.roomVersion === version || served.get(room.locator)?.has(version) === true))
|
|
350
469
|
? []
|
|
351
|
-
: [
|
|
470
|
+
: [room.locator];
|
|
352
471
|
});
|
|
472
|
+
const expired = [
|
|
473
|
+
...new Set([...expiring.filter((locator) => named.includes(locator)), ...unknown]),
|
|
474
|
+
];
|
|
475
|
+
expiring = expiring.filter((locator) => !named.includes(locator));
|
|
353
476
|
queueMicrotask(() => {
|
|
354
|
-
for (const
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
477
|
+
for (const room of asked) {
|
|
478
|
+
if (expired.includes(room.locator) || room.roomVersion === null)
|
|
479
|
+
carried.delete(room.locator);
|
|
480
|
+
else {
|
|
481
|
+
carried.set(room.locator, room.roomVersion);
|
|
482
|
+
carry(room.locator);
|
|
483
|
+
}
|
|
358
484
|
}
|
|
485
|
+
emitAll({ kind: 'caught-up', expired });
|
|
359
486
|
});
|
|
360
487
|
},
|
|
361
|
-
reopen() {
|
|
362
|
-
queueMicrotask(() => {
|
|
363
|
-
for (const observer of observers) {
|
|
364
|
-
observer({ kind: 'closed', revoked: false, lost: false });
|
|
365
|
-
}
|
|
366
|
-
});
|
|
367
|
-
},
|
|
368
|
-
published() { },
|
|
369
488
|
observe(notify) {
|
|
370
489
|
observers.add(notify);
|
|
371
490
|
queueMicrotask(() => {
|
|
372
491
|
if (!observers.has(notify))
|
|
373
492
|
return;
|
|
374
493
|
if (options.unopened === true) {
|
|
375
|
-
notify({ kind: 'closed', revoked: false, lost: true });
|
|
494
|
+
notify({ kind: 'closed', revoked: false, lost: true, authorityChanged: false });
|
|
376
495
|
return;
|
|
377
496
|
}
|
|
378
497
|
announceList();
|
|
379
|
-
|
|
498
|
+
opened((event) => {
|
|
499
|
+
if (observers.has(notify))
|
|
500
|
+
notify(event);
|
|
501
|
+
});
|
|
380
502
|
});
|
|
381
503
|
return () => {
|
|
382
504
|
observers.delete(notify);
|
|
@@ -393,12 +515,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
393
515
|
return resolveScript(scripts.authorize, () => ({}), undefined);
|
|
394
516
|
},
|
|
395
517
|
async discover(_authorization) {
|
|
396
|
-
return
|
|
397
|
-
if (answer.kind === 'discovery')
|
|
398
|
-
for (const room of answer.rooms)
|
|
399
|
-
note(room.locator, room);
|
|
400
|
-
return answer;
|
|
401
|
-
});
|
|
518
|
+
return discovered();
|
|
402
519
|
},
|
|
403
520
|
reached,
|
|
404
521
|
follows(locator, roomVersion, next) {
|
|
@@ -455,7 +572,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
455
572
|
retryable: false,
|
|
456
573
|
affected: {},
|
|
457
574
|
};
|
|
458
|
-
}, request).then((answer) =>
|
|
575
|
+
}, request).then((answer) => {
|
|
576
|
+
const destination = request.changeBatch.between?.destination.room;
|
|
577
|
+
if (answer.kind === 'accepted' && answer.destination !== undefined && destination) {
|
|
578
|
+
note(destination, answer.destination);
|
|
579
|
+
}
|
|
580
|
+
return note(request.locator, answer);
|
|
581
|
+
});
|
|
459
582
|
},
|
|
460
583
|
async history(_authorization, request) {
|
|
461
584
|
return resolveScript(scripts.history, () => {
|
|
@@ -471,31 +594,42 @@ export function createMemoryAdapter(options = {}) {
|
|
|
471
594
|
},
|
|
472
595
|
async binary(_authorization, request) {
|
|
473
596
|
return resolveScript(scripts.binary, () => {
|
|
474
|
-
if (request.kind === 'reference') {
|
|
475
|
-
return { kind: 'rejected', code: 'unscripted-binary', fields: {}, retryable: false };
|
|
476
|
-
}
|
|
477
597
|
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
478
598
|
if (room === undefined)
|
|
479
599
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
480
|
-
const blob = room
|
|
600
|
+
const blob = heldBlob(room, request.path);
|
|
481
601
|
return blob === undefined
|
|
482
602
|
? { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false }
|
|
483
|
-
: { kind: 'binary', blob };
|
|
603
|
+
: { kind: 'binary', body: blob.stream(), mediaType: blob.type };
|
|
484
604
|
}, request);
|
|
485
605
|
},
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
606
|
+
async link(_authorization, request) {
|
|
607
|
+
return resolveScript(scripts.link, () => {
|
|
608
|
+
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
609
|
+
if (room === undefined)
|
|
610
|
+
return { kind: 'room-not-readable', locator: request.locator };
|
|
611
|
+
const blob = heldBlob(room, request.path);
|
|
612
|
+
if (blob === undefined) {
|
|
613
|
+
return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
|
|
614
|
+
}
|
|
615
|
+
const url = linked.get(blob) ?? URL.createObjectURL(blob);
|
|
616
|
+
linked.set(blob, url);
|
|
617
|
+
return { kind: 'link', url, name: lastName(request.path), mediaType: blob.type };
|
|
618
|
+
}, request);
|
|
619
|
+
},
|
|
620
|
+
async attach(_authorization, request) {
|
|
621
|
+
return resolveScript(scripts.attach, () => {
|
|
622
|
+
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
623
|
+
if (room === undefined)
|
|
624
|
+
return { kind: 'room-not-readable', locator: request.locator };
|
|
625
|
+
const path = freePath(room, request.name);
|
|
626
|
+
attached.set(`${room.locator}\u0000${path}`, request.blob);
|
|
627
|
+
return { kind: 'attached', path, revision: `attached-${attached.size}` };
|
|
628
|
+
}, request);
|
|
495
629
|
},
|
|
496
630
|
async action(_authorization, request) {
|
|
497
631
|
return resolveScript(scripts.action, () => {
|
|
498
|
-
if (request.name.startsWith('
|
|
632
|
+
if (request.name.startsWith('conversations/'))
|
|
499
633
|
return conversationAction(request);
|
|
500
634
|
return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
|
|
501
635
|
}, request).then((answer) => {
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { AcceptedMessage } from './adapter.js';
|
|
2
|
+
import type { JobMarker } from './job.js';
|
|
3
|
+
import type { Connection } from './tables.js';
|
|
4
|
+
export declare const MESSAGE_TABLES: readonly string[];
|
|
5
|
+
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";
|
|
6
|
+
export declare const JOB_MARKERS = "SELECT json_extract(part.value, '$.text') AS said,\n json_extract(message, '$.accepted_at') AS at\n FROM conversation_messages, json_each(message, '$.parts') AS part\n WHERE conversation = ? AND instr(message, '\"marker\":\"job\"') > 0\n AND json_extract(part.value, '$.type') = 'marker'\n AND json_extract(part.value, '$.marker') = 'job'\n ORDER BY position, identity, part.key";
|
|
7
|
+
export type HeldConversation = {
|
|
8
|
+
readonly conversation: string;
|
|
9
|
+
readonly read: string | null | undefined;
|
|
10
|
+
readonly partial: boolean;
|
|
11
|
+
};
|
|
12
|
+
export type MessageWindow = {
|
|
13
|
+
readonly messages: AcceptedMessage[];
|
|
14
|
+
readonly more: boolean;
|
|
15
|
+
};
|
|
16
|
+
export type HeldSource = {
|
|
17
|
+
readonly source: unknown;
|
|
18
|
+
readonly sender: string | null;
|
|
19
|
+
};
|
|
20
|
+
export type HeldRow = {
|
|
21
|
+
readonly conversation: string;
|
|
22
|
+
readonly said: {
|
|
23
|
+
readonly text: string;
|
|
24
|
+
readonly role: string | null;
|
|
25
|
+
readonly at: string | null;
|
|
26
|
+
} | null;
|
|
27
|
+
readonly failure: string | null;
|
|
28
|
+
readonly opened: HeldSource | null;
|
|
29
|
+
readonly asking: (HeldSource & {
|
|
30
|
+
readonly identity: string;
|
|
31
|
+
readonly text: string;
|
|
32
|
+
readonly at: string | null;
|
|
33
|
+
}) | null;
|
|
34
|
+
};
|
|
35
|
+
export type ConversationWrite = {
|
|
36
|
+
readonly conversation: string;
|
|
37
|
+
readonly messages: readonly AcceptedMessage[];
|
|
38
|
+
readonly read?: {
|
|
39
|
+
readonly at: string | null;
|
|
40
|
+
readonly partial: boolean;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export declare function heldConversations(connection: Connection, conversations: readonly string[] | null): HeldConversation[];
|
|
44
|
+
export declare function keptMessages(connection: Connection, { conversation, messages, read }: ConversationWrite): null;
|
|
45
|
+
export declare function messageWindow(connection: Connection, conversation: string, limit: number, before: readonly [string, string] | null, phrase: string | null): MessageWindow;
|
|
46
|
+
export declare function messageCount(connection: Connection, conversation: string, phrase: string | null): number;
|
|
47
|
+
export declare function conversationRows(connection: Connection, conversations: readonly string[]): HeldRow[];
|
|
48
|
+
export declare function jobMarkers(connection: Connection, conversation: string): JobMarker[];
|
|
49
|
+
export declare function turnArrived(connection: Connection, conversation: string, turn: string): boolean;
|
|
50
|
+
export declare function droppedMessages(connection: Connection, conversations: readonly string[]): void;
|
|
51
|
+
export declare function forgottenMessages(connection: Connection): void;
|
|
52
|
+
//# 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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"}
|