@agentshouse/mdruntime 0.1.0-c4ca57eefb98a → 0.1.0-c4d7cf2ec26a6
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 +2 -2
- package/dist/acceptance.d.ts +6 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +386 -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 +86 -67
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +3 -10
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +21 -56
- package/dist/bootstrap.d.ts +11 -10
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +219 -82
- 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 +2 -1
- package/dist/chain.d.ts.map +1 -1
- package/dist/chain.js +3 -7
- package/dist/change.d.ts +1 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +4 -2
- 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 +21 -6
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3 -1
- package/dist/collection.d.ts +2 -4
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +1 -17
- package/dist/compile.d.ts +6 -6
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +267 -323
- package/dist/connection.d.ts +5 -143
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +102 -5311
- 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 +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 +41 -45
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +860 -869
- 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 +15 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/entry.d.ts +2 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +17 -7
- package/dist/figures.d.ts +49 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +197 -0
- 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 -7
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +29 -31
- package/dist/identity.d.ts +0 -1
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -3
- package/dist/index.d.ts +26 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- 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 +5 -4
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +62 -23
- 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 +1 -1
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +19 -9
- package/dist/memory.d.ts +11 -4
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +172 -82
- package/dist/messages.d.ts +27 -3
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +97 -19
- package/dist/model.d.ts +2 -10
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +0 -18
- package/dist/models.d.ts +14 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +195 -0
- package/dist/observation.d.ts +2 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +14 -14
- package/dist/opened.js +3 -3
- 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 +4 -4
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +3 -0
- package/dist/overlay.d.ts +1 -0
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +11 -0
- package/dist/parts.d.ts +60 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +126 -0
- package/dist/paths.d.ts +1 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +22 -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 +14 -209
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -505
- package/dist/questions.d.ts +34 -0
- package/dist/questions.d.ts.map +1 -0
- package/dist/questions.js +122 -0
- package/dist/reach.d.ts +15 -13
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +183 -137
- package/dist/react.d.ts +10 -2
- package/dist/react.d.ts.map +1 -1
- 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 +2 -16
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +4 -10
- package/dist/reads.d.ts +36 -10
- package/dist/reads.d.ts.map +1 -1
- package/dist/reads.js +158 -78
- package/dist/recovery.d.ts +1 -0
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +35 -1
- package/dist/refresh.d.ts +7 -5
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +33 -5
- package/dist/refusal.d.ts +5 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +56 -0
- package/dist/replica.d.ts +9 -9
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +53 -21
- package/dist/room-draft.d.ts +4 -3
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +67 -54
- 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 +14 -21
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +48 -184
- 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 +5 -1
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +21 -20
- 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 -63
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +9 -52
- package/dist/seed.d.ts +11 -2
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +71 -0
- package/dist/shared.d.ts +1 -7
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +13 -105
- 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 +39 -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 +0 -6
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +0 -6
- 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 +107 -157
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +143 -395
- package/dist/stored.d.ts +59 -38
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +285 -205
- 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 +120 -56
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +217 -98
- 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/validation.d.ts +3 -4
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +42 -100
- package/dist/windows.d.ts +1 -12
- package/dist/windows.d.ts.map +1 -1
- package/dist/windows.js +2 -75
- package/dist/wire.d.ts +17 -5
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +7 -1
- package/package.json +2 -2
- package/dist/fence.d.ts +0 -6
- package/dist/fence.d.ts.map +0 -1
- package/dist/fence.js +0 -10
- package/dist/fulltext.d.ts +0 -27
- package/dist/fulltext.d.ts.map +0 -1
- package/dist/fulltext.js +0 -370
- package/dist/words.d.ts +0 -19
- package/dist/words.d.ts.map +0 -1
- package/dist/words.js +0 -156
package/dist/memory.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { documentFacts, parse } from '@agentshouse/mdmodel';
|
|
2
|
+
import { NO_ROOM_TYPES, schemaTypes } from './attached-model.js';
|
|
1
3
|
import { sameChange } from './overlay.js';
|
|
2
4
|
const ATTACHMENTS = 'attachments';
|
|
3
5
|
function lastName(path) {
|
|
@@ -5,7 +7,6 @@ function lastName(path) {
|
|
|
5
7
|
}
|
|
6
8
|
const FIXTURE_RETENTION = {
|
|
7
9
|
history: { kind: 'duration', seconds: 1 },
|
|
8
|
-
outcome: 604_800,
|
|
9
10
|
refreshHorizon: 1,
|
|
10
11
|
};
|
|
11
12
|
function declaredRetention(value) {
|
|
@@ -52,15 +53,16 @@ export function createMemoryAdapter(options = {}) {
|
|
|
52
53
|
const listeners = new Set();
|
|
53
54
|
const modeObservers = new Set();
|
|
54
55
|
const scripted = new Map();
|
|
55
|
-
const unsealed = new Map();
|
|
56
|
-
const sealed = new Set();
|
|
57
56
|
const sentTurns = new Map();
|
|
58
57
|
const historyPageSize = options.historyPageSize;
|
|
59
58
|
const attached = new Map();
|
|
60
59
|
const linked = new WeakMap();
|
|
61
|
-
|
|
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();
|
|
@@ -101,8 +103,35 @@ export function createMemoryAdapter(options = {}) {
|
|
|
101
103
|
return path;
|
|
102
104
|
}
|
|
103
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
|
+
}
|
|
104
131
|
function retain(entries) {
|
|
105
132
|
for (const room of entries) {
|
|
133
|
+
for (const [path, content] of Object.entries(room.documents ?? {}))
|
|
134
|
+
factsAt(room, path, content);
|
|
106
135
|
note(room.locator, room);
|
|
107
136
|
const versions = served.get(room.locator) ?? new Map();
|
|
108
137
|
versions.set(room.roomVersion, room);
|
|
@@ -120,6 +149,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
120
149
|
replica: room.replica,
|
|
121
150
|
...(room.typedSelection === undefined ? {} : { typedSelection: room.typedSelection }),
|
|
122
151
|
providerOwnedPaths: room.providerOwnedPaths,
|
|
152
|
+
authoredPaths: room.authoredPaths,
|
|
123
153
|
};
|
|
124
154
|
}
|
|
125
155
|
function page(room, after) {
|
|
@@ -135,10 +165,14 @@ export function createMemoryAdapter(options = {}) {
|
|
|
135
165
|
roomVersion: room.roomVersion,
|
|
136
166
|
...(opening ? { models: modelsOf(room) } : {}),
|
|
137
167
|
documents: named(room.documents ?? {}, taken),
|
|
168
|
+
facts: factsIn(room, taken),
|
|
138
169
|
revisions: named(room.revisions ?? {}, [...taken, ...targets]),
|
|
139
170
|
...(room.fileIds === undefined
|
|
140
171
|
? {}
|
|
141
172
|
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
173
|
+
...(room.created === undefined
|
|
174
|
+
? {}
|
|
175
|
+
: { created: named(room.created, [...taken, ...targets]) }),
|
|
142
176
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
143
177
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
144
178
|
...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
|
|
@@ -155,18 +189,19 @@ export function createMemoryAdapter(options = {}) {
|
|
|
155
189
|
...(folderRemovals.length === 0 ? {} : { folderRemovals }),
|
|
156
190
|
};
|
|
157
191
|
}
|
|
158
|
-
function advancement(room, from, at) {
|
|
192
|
+
function advancement(room, from, at, whole = false) {
|
|
159
193
|
const current = room.documents ?? {};
|
|
160
194
|
const previous = from.documents ?? {};
|
|
161
195
|
const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
|
|
162
196
|
const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
|
|
163
197
|
const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
|
|
164
198
|
room.fileIds?.[path] !== from.fileIds?.[path] ||
|
|
199
|
+
room.created?.[path] !== from.created?.[path] ||
|
|
165
200
|
!sameChange(room.changes?.[path], from.changes?.[path]);
|
|
166
201
|
const changed = Object.keys(current)
|
|
167
202
|
.filter((path) => current[path] !== previous[path] || headMoved(path))
|
|
168
203
|
.sort();
|
|
169
|
-
const size = pageSize ?? changed.length;
|
|
204
|
+
const size = whole ? changed.length : (pageSize ?? changed.length);
|
|
170
205
|
const taken = changed.slice(at, at + size);
|
|
171
206
|
const next = at + taken.length;
|
|
172
207
|
const opening = at === 0;
|
|
@@ -182,10 +217,14 @@ export function createMemoryAdapter(options = {}) {
|
|
|
182
217
|
roomVersion: room.roomVersion,
|
|
183
218
|
...(models === undefined ? {} : { models }),
|
|
184
219
|
documents: named(current, taken),
|
|
220
|
+
facts: factsIn(room, taken),
|
|
185
221
|
revisions: named(room.revisions ?? {}, [...taken, ...targets]),
|
|
186
222
|
...(room.fileIds === undefined
|
|
187
223
|
? {}
|
|
188
224
|
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
225
|
+
...(room.created === undefined
|
|
226
|
+
? {}
|
|
227
|
+
: { created: named(room.created, [...taken, ...targets]) }),
|
|
189
228
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
190
229
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
191
230
|
...(opening ? foldersMoved(room, from) : {}),
|
|
@@ -198,6 +237,26 @@ export function createMemoryAdapter(options = {}) {
|
|
|
198
237
|
...(pageToken === undefined ? {} : { pageToken }),
|
|
199
238
|
};
|
|
200
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
|
+
}
|
|
201
260
|
function pageOf(conversation, after) {
|
|
202
261
|
const messages = conversation.messages ?? [];
|
|
203
262
|
const first = typeof after === 'string' ? messages.findIndex((message) => message.position > after) : 0;
|
|
@@ -212,16 +271,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
212
271
|
: {}),
|
|
213
272
|
};
|
|
214
273
|
}
|
|
215
|
-
function historiesOf(
|
|
216
|
-
const asked = input?.conversations;
|
|
217
|
-
if (!Array.isArray(asked))
|
|
218
|
-
return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
|
|
274
|
+
function historiesOf(request) {
|
|
219
275
|
const histories = [];
|
|
220
|
-
for (const entry of
|
|
221
|
-
const conversation =
|
|
276
|
+
for (const entry of request.conversations) {
|
|
277
|
+
const conversation = scripted.get(entry.conversation);
|
|
222
278
|
if (conversation === undefined)
|
|
223
279
|
continue;
|
|
224
|
-
const outcome = conversation.outcomes?.
|
|
280
|
+
const outcome = conversation.outcomes?.history;
|
|
225
281
|
if (outcome !== undefined)
|
|
226
282
|
return outcome;
|
|
227
283
|
histories.push(pageOf(conversation, entry.after));
|
|
@@ -232,15 +288,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
232
288
|
function conversationAction(request) {
|
|
233
289
|
const name = request.name;
|
|
234
290
|
const input = (request.input ?? {});
|
|
235
|
-
if (name === '
|
|
236
|
-
return historiesOf(request.input);
|
|
237
|
-
if (name === 'conversation.create') {
|
|
291
|
+
if (name === 'conversations/create') {
|
|
238
292
|
issued += 1;
|
|
239
293
|
const conversation = `conversation-${issued}`;
|
|
240
294
|
scripted.set(conversation, { conversation });
|
|
241
|
-
return { kind: 'action', result: { conversation } };
|
|
295
|
+
return { kind: 'action', result: { conversation_id: conversation } };
|
|
242
296
|
}
|
|
243
|
-
const named = typeof input.
|
|
297
|
+
const named = typeof input.conversation_id === 'string' ? input.conversation_id : '';
|
|
244
298
|
const conversation = scripted.get(named);
|
|
245
299
|
if (conversation === undefined) {
|
|
246
300
|
return {
|
|
@@ -253,36 +307,28 @@ export function createMemoryAdapter(options = {}) {
|
|
|
253
307
|
const outcome = conversation.outcomes?.[name];
|
|
254
308
|
if (outcome !== undefined)
|
|
255
309
|
return outcome;
|
|
256
|
-
if (name === '
|
|
310
|
+
if (name === 'conversations/send') {
|
|
257
311
|
const operation = typeof input.operation_id === 'string' ? input.operation_id : null;
|
|
258
312
|
const answered = operation === null ? undefined : sentTurns.get(operation);
|
|
259
313
|
if (answered !== undefined)
|
|
260
|
-
return { kind: 'action', result: {
|
|
314
|
+
return { kind: 'action', result: { message_id: answered } };
|
|
261
315
|
issued += 1;
|
|
262
316
|
const turn = `turn-${issued}`;
|
|
263
|
-
unsealed.set(turn, named);
|
|
264
317
|
if (operation !== null)
|
|
265
318
|
sentTurns.set(operation, turn);
|
|
266
|
-
return { kind: 'action', result: { turn } };
|
|
267
|
-
}
|
|
268
|
-
if (name === 'conversation.cancel') {
|
|
269
|
-
const turn = typeof input.turn === 'string' ? input.turn : '';
|
|
270
|
-
if (sealed.has(turn) || !unsealed.has(turn)) {
|
|
271
|
-
return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
|
|
272
|
-
}
|
|
273
|
-
unsealed.delete(turn);
|
|
274
|
-
return { kind: 'action', result: { turn, cancelled: true } };
|
|
319
|
+
return { kind: 'action', result: { message_id: turn } };
|
|
275
320
|
}
|
|
276
|
-
if (name === '
|
|
321
|
+
if (name === 'conversations/delete')
|
|
277
322
|
scripted.delete(named);
|
|
278
|
-
return { kind: 'action', result: {
|
|
323
|
+
return { kind: 'action', result: { conversation_id: named } };
|
|
279
324
|
}
|
|
280
325
|
function announceList() {
|
|
281
326
|
const entries = [...scripted.values()].flatMap(({ conversation, listed, messages = [] }) => listed === undefined
|
|
282
327
|
? []
|
|
283
328
|
: [{ conversation, ...listed, newest: messages.at(-1)?.position ?? null }]);
|
|
284
|
-
for (const listener of listeners)
|
|
285
|
-
listener({ kind: 'list', entries });
|
|
329
|
+
for (const listener of listeners) {
|
|
330
|
+
listener({ kind: 'list', entries, whole: true, more: false, cursor: null });
|
|
331
|
+
}
|
|
286
332
|
}
|
|
287
333
|
function discovery() {
|
|
288
334
|
return {
|
|
@@ -294,9 +340,42 @@ export function createMemoryAdapter(options = {}) {
|
|
|
294
340
|
...(options.member === undefined ? {} : { member: options.member }),
|
|
295
341
|
};
|
|
296
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
|
+
}
|
|
297
376
|
return {
|
|
298
|
-
...(options.exhaustiveDiscovery === undefined ? {} : { exhaustiveDiscovery: true }),
|
|
299
377
|
...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
|
|
378
|
+
...(options.typedPaths === undefined ? {} : { typedPaths: options.typedPaths }),
|
|
300
379
|
setRooms(next) {
|
|
301
380
|
rooms = [...next];
|
|
302
381
|
retain(rooms);
|
|
@@ -305,33 +384,37 @@ export function createMemoryAdapter(options = {}) {
|
|
|
305
384
|
scriptConversations(next);
|
|
306
385
|
},
|
|
307
386
|
open() {
|
|
387
|
+
carried.clear();
|
|
308
388
|
announceList();
|
|
309
|
-
|
|
310
|
-
observer({ kind: 'opened' });
|
|
389
|
+
opened(emitAll);
|
|
311
390
|
},
|
|
312
|
-
close({ revoked = false, lost = !revoked } = {}) {
|
|
313
|
-
|
|
314
|
-
|
|
391
|
+
close({ revoked = false, lost = !revoked, authorityChanged = false } = {}) {
|
|
392
|
+
openings += 1;
|
|
393
|
+
carried.clear();
|
|
394
|
+
emitAll({ kind: 'closed', revoked, lost, authorityChanged });
|
|
315
395
|
},
|
|
316
396
|
expire(locators) {
|
|
317
397
|
expiring = [...locators];
|
|
318
398
|
},
|
|
319
|
-
notifyRoomVersion({ locator
|
|
320
|
-
|
|
321
|
-
observer({ kind: 'room-version', locator, roomVersion });
|
|
399
|
+
notifyRoomVersion({ locator }) {
|
|
400
|
+
carry(locator);
|
|
322
401
|
},
|
|
323
|
-
notifyAuthorityChanged(
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
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
|
+
});
|
|
329
416
|
},
|
|
330
417
|
notifyConversation(event) {
|
|
331
|
-
if (event.kind === 'accepted-message') {
|
|
332
|
-
sealed.add(event.message.turn);
|
|
333
|
-
unsealed.delete(event.message.turn);
|
|
334
|
-
}
|
|
335
418
|
for (const listener of listeners)
|
|
336
419
|
listener(event);
|
|
337
420
|
},
|
|
@@ -340,21 +423,31 @@ export function createMemoryAdapter(options = {}) {
|
|
|
340
423
|
observer(mode);
|
|
341
424
|
},
|
|
342
425
|
heldRooms() {
|
|
343
|
-
return
|
|
426
|
+
return [...carried.keys()].sort();
|
|
344
427
|
},
|
|
345
428
|
replicatedConversations() {
|
|
346
429
|
return replicated;
|
|
347
430
|
},
|
|
431
|
+
heldConversationCursor() {
|
|
432
|
+
return heldCursor;
|
|
433
|
+
},
|
|
348
434
|
conversations: {
|
|
349
435
|
replicate(next) {
|
|
350
436
|
replicated = [...next];
|
|
351
437
|
},
|
|
438
|
+
hold(cursor) {
|
|
439
|
+
heldCursor = cursor;
|
|
440
|
+
},
|
|
352
441
|
observe(notify) {
|
|
353
442
|
listeners.add(notify);
|
|
354
443
|
return () => {
|
|
355
444
|
listeners.delete(notify);
|
|
356
445
|
};
|
|
357
446
|
},
|
|
447
|
+
history: (request) => Promise.resolve(historiesOf(request)),
|
|
448
|
+
...(options.agents === undefined
|
|
449
|
+
? {}
|
|
450
|
+
: { agents: () => Promise.resolve(structuredClone(options.agents)) }),
|
|
358
451
|
},
|
|
359
452
|
serviceMode: {
|
|
360
453
|
observe(notify) {
|
|
@@ -366,44 +459,46 @@ export function createMemoryAdapter(options = {}) {
|
|
|
366
459
|
},
|
|
367
460
|
roomStream: {
|
|
368
461
|
hold(asked) {
|
|
369
|
-
|
|
370
|
-
const
|
|
371
|
-
expiring = [];
|
|
372
|
-
const moved = asked.flatMap((room) => {
|
|
462
|
+
const named = asked.map((room) => room.locator);
|
|
463
|
+
const unknown = asked.flatMap((room) => {
|
|
373
464
|
const current = rooms.find((entry) => entry.locator === room.locator);
|
|
465
|
+
const version = room.roomVersion;
|
|
374
466
|
return current === undefined ||
|
|
375
|
-
|
|
376
|
-
|
|
467
|
+
(version !== null &&
|
|
468
|
+
(current.roomVersion === version || served.get(room.locator)?.has(version) === true))
|
|
377
469
|
? []
|
|
378
|
-
: [
|
|
470
|
+
: [room.locator];
|
|
379
471
|
});
|
|
472
|
+
const expired = [
|
|
473
|
+
...new Set([...expiring.filter((locator) => named.includes(locator)), ...unknown]),
|
|
474
|
+
];
|
|
475
|
+
expiring = expiring.filter((locator) => !named.includes(locator));
|
|
380
476
|
queueMicrotask(() => {
|
|
381
|
-
for (const
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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
|
+
}
|
|
385
484
|
}
|
|
485
|
+
emitAll({ kind: 'caught-up', expired });
|
|
386
486
|
});
|
|
387
487
|
},
|
|
388
|
-
reopen() {
|
|
389
|
-
queueMicrotask(() => {
|
|
390
|
-
for (const observer of observers) {
|
|
391
|
-
observer({ kind: 'closed', revoked: false, lost: false });
|
|
392
|
-
}
|
|
393
|
-
});
|
|
394
|
-
},
|
|
395
|
-
published() { },
|
|
396
488
|
observe(notify) {
|
|
397
489
|
observers.add(notify);
|
|
398
490
|
queueMicrotask(() => {
|
|
399
491
|
if (!observers.has(notify))
|
|
400
492
|
return;
|
|
401
493
|
if (options.unopened === true) {
|
|
402
|
-
notify({ kind: 'closed', revoked: false, lost: true });
|
|
494
|
+
notify({ kind: 'closed', revoked: false, lost: true, authorityChanged: false });
|
|
403
495
|
return;
|
|
404
496
|
}
|
|
405
497
|
announceList();
|
|
406
|
-
|
|
498
|
+
opened((event) => {
|
|
499
|
+
if (observers.has(notify))
|
|
500
|
+
notify(event);
|
|
501
|
+
});
|
|
407
502
|
});
|
|
408
503
|
return () => {
|
|
409
504
|
observers.delete(notify);
|
|
@@ -420,12 +515,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
420
515
|
return resolveScript(scripts.authorize, () => ({}), undefined);
|
|
421
516
|
},
|
|
422
517
|
async discover(_authorization) {
|
|
423
|
-
return
|
|
424
|
-
if (answer.kind === 'discovery')
|
|
425
|
-
for (const room of answer.rooms)
|
|
426
|
-
note(room.locator, room);
|
|
427
|
-
return answer;
|
|
428
|
-
});
|
|
518
|
+
return discovered();
|
|
429
519
|
},
|
|
430
520
|
reached,
|
|
431
521
|
follows(locator, roomVersion, next) {
|
|
@@ -539,7 +629,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
539
629
|
},
|
|
540
630
|
async action(_authorization, request) {
|
|
541
631
|
return resolveScript(scripts.action, () => {
|
|
542
|
-
if (request.name.startsWith('
|
|
632
|
+
if (request.name.startsWith('conversations/'))
|
|
543
633
|
return conversationAction(request);
|
|
544
634
|
return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
|
|
545
635
|
}, request).then((answer) => {
|
package/dist/messages.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { AcceptedMessage } from './adapter.js';
|
|
2
|
+
import type { JobMarker } from './job.js';
|
|
2
3
|
import type { Connection } from './tables.js';
|
|
3
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";
|
|
4
7
|
export type HeldConversation = {
|
|
5
8
|
readonly conversation: string;
|
|
6
9
|
readonly read: string | null | undefined;
|
|
@@ -10,6 +13,25 @@ export type MessageWindow = {
|
|
|
10
13
|
readonly messages: AcceptedMessage[];
|
|
11
14
|
readonly more: boolean;
|
|
12
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
|
+
};
|
|
13
35
|
export type ConversationWrite = {
|
|
14
36
|
readonly conversation: string;
|
|
15
37
|
readonly messages: readonly AcceptedMessage[];
|
|
@@ -18,10 +40,12 @@ export type ConversationWrite = {
|
|
|
18
40
|
readonly partial: boolean;
|
|
19
41
|
};
|
|
20
42
|
};
|
|
21
|
-
export declare function heldConversations(connection: Connection): HeldConversation[];
|
|
43
|
+
export declare function heldConversations(connection: Connection, conversations: readonly string[] | null): HeldConversation[];
|
|
22
44
|
export declare function keptMessages(connection: Connection, { conversation, messages, read }: ConversationWrite): null;
|
|
23
|
-
export declare function messageWindow(connection: Connection, conversation: string, limit: number, before: readonly [string, string] | null): MessageWindow;
|
|
24
|
-
export declare function messageCount(connection: Connection, conversation: string): number;
|
|
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[];
|
|
25
49
|
export declare function turnArrived(connection: Connection, conversation: string, turn: string): boolean;
|
|
26
50
|
export declare function droppedMessages(connection: Connection, conversations: readonly string[]): void;
|
|
27
51
|
export declare function forgottenMessages(connection: Connection): void;
|
package/dist/messages.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
|