@agentshouse/mdruntime 0.1.0-c2aaa9c0e3ca4 → 0.1.0-c2af3ddcc243b
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 +23 -19
- package/dist/acceptance.d.ts +3 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +299 -0
- package/dist/act-lanes.d.ts +30 -0
- package/dist/act-lanes.d.ts.map +1 -0
- package/dist/act-lanes.js +225 -0
- package/dist/actions.d.ts +26 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +302 -0
- package/dist/adapter.d.ts +176 -97
- 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 +311 -89
- package/dist/cell.d.ts +6 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +9 -0
- package/dist/chain.d.ts +12 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +64 -0
- package/dist/change-set.d.ts +13 -14
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +17 -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 +46 -28
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +133 -27
- 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 +18 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +724 -0
- package/dist/connection.d.ts +8 -116
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +111 -2412
- 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 +140 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +250 -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 +80 -45
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +1090 -588
- package/dist/declaration.d.ts +10 -0
- package/dist/declaration.d.ts.map +1 -0
- package/dist/declaration.js +24 -0
- package/dist/digest.d.ts +7 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +113 -0
- package/dist/discovery.d.ts +10 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +150 -0
- package/dist/durability.d.ts +23 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +9 -0
- package/dist/entry.d.ts +20 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +161 -0
- package/dist/expectation.d.ts +26 -13
- package/dist/expectation.d.ts.map +1 -1
- package/dist/expectation.js +72 -19
- package/dist/failure.d.ts +3 -0
- package/dist/failure.d.ts.map +1 -1
- package/dist/failure.js +6 -0
- package/dist/figures.d.ts +49 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +197 -0
- package/dist/file.d.ts +2 -19
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +7 -122
- package/dist/holdings.d.ts +29 -0
- package/dist/holdings.d.ts.map +1 -0
- package/dist/holdings.js +95 -0
- package/dist/host.d.ts +28 -4
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +171 -27
- package/dist/index.d.ts +40 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -2
- package/dist/install.d.ts +54 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +530 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +277 -0
- package/dist/listing.d.ts +48 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +139 -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 +7 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +32 -0
- package/dist/lost.d.ts +5 -0
- package/dist/lost.d.ts.map +1 -0
- package/dist/lost.js +49 -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 +22 -6
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +282 -101
- package/dist/messages.d.ts +56 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +158 -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 +10 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +153 -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 +53 -0
- package/dist/outcome.d.ts +56 -8
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +58 -0
- package/dist/overlay.d.ts +8 -4
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +136 -192
- package/dist/page-metadata.d.ts +8 -0
- package/dist/page-metadata.d.ts.map +1 -0
- package/dist/page-metadata.js +19 -0
- package/dist/parts.d.ts +4 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +13 -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 +227 -0
- package/dist/presence.d.ts +52 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +220 -0
- package/dist/queries.d.ts +16 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +282 -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 -7
- package/dist/questions.d.ts.map +1 -0
- package/dist/{chat/questions.js → questions.js} +11 -7
- package/dist/queue.d.ts +40 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +450 -0
- package/dist/reach.d.ts +21 -7
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +343 -98
- package/dist/react.d.ts +21 -6
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +40 -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 +39 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +178 -0
- package/dist/recovery.d.ts +28 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +254 -0
- package/dist/refresh.d.ts +17 -14
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +145 -53
- 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 +50 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +339 -162
- package/dist/retried.d.ts +30 -0
- package/dist/retried.d.ts.map +1 -0
- package/dist/retried.js +72 -0
- package/dist/room-draft.d.ts +39 -10
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +194 -118
- 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 +34 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +42 -43
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +800 -259
- package/dist/saves.d.ts +32 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +410 -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 +33 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +295 -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 +28 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +103 -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/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 +67 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +164 -0
- package/dist/source.d.ts +54 -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/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 +214 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +438 -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 +111 -117
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +161 -488
- package/dist/stored.d.ts +157 -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 +220 -0
- package/dist/sync.d.ts +19 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +535 -0
- package/dist/tables.d.ts +415 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +761 -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 +228 -36
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +75 -33
- package/package.json +23 -19
- package/AGENTS.md +0 -299
- package/dist/attempt.d.ts +0 -16
- package/dist/attempt.d.ts.map +0 -1
- package/dist/attempt.js +0 -57
- package/dist/chat/acts.d.ts +0 -34
- 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 -20
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -59
- package/dist/chat/markdown.d.ts +0 -19
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -187
- 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 -645
- 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/log.d.ts +0 -5
- package/dist/log.d.ts.map +0 -1
- package/dist/log.js +0 -14
- 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,13 @@
|
|
|
1
|
+
import { definitionAt, documentFacts, parse } from '@agentshouse/mdmodel';
|
|
2
|
+
import { roomTypesOf, schemaTypes } from './attached-model.js';
|
|
3
|
+
import { selected } from './collection.js';
|
|
1
4
|
import { sameChange } from './overlay.js';
|
|
5
|
+
const ATTACHMENTS = 'attachments';
|
|
6
|
+
function lastName(path) {
|
|
7
|
+
return path.slice(path.lastIndexOf('/') + 1);
|
|
8
|
+
}
|
|
2
9
|
const FIXTURE_RETENTION = {
|
|
3
10
|
history: { kind: 'duration', seconds: 1 },
|
|
4
|
-
outcome: 1,
|
|
5
11
|
refreshHorizon: 1,
|
|
6
12
|
};
|
|
7
13
|
function declaredRetention(value) {
|
|
@@ -15,12 +21,7 @@ function declaredRetention(value) {
|
|
|
15
21
|
}
|
|
16
22
|
const MODEL_ABSENT = { kind: 'model-unavailable', reason: 'not-readable' };
|
|
17
23
|
function modelsOf(room) {
|
|
18
|
-
return {
|
|
19
|
-
collection: room.model ?? MODEL_ABSENT,
|
|
20
|
-
...(room.typedSelection === undefined
|
|
21
|
-
? {}
|
|
22
|
-
: { selection: room.selectionModel ?? MODEL_ABSENT }),
|
|
23
|
-
};
|
|
24
|
+
return { collection: room.model ?? MODEL_ABSENT };
|
|
24
25
|
}
|
|
25
26
|
function changedModels(room, from) {
|
|
26
27
|
const now = modelsOf(room);
|
|
@@ -53,12 +54,16 @@ export function createMemoryAdapter(options = {}) {
|
|
|
53
54
|
const listeners = new Set();
|
|
54
55
|
const modeObservers = new Set();
|
|
55
56
|
const scripted = new Map();
|
|
56
|
-
const
|
|
57
|
-
const sealed = new Set();
|
|
57
|
+
const repeats = new Map();
|
|
58
58
|
const historyPageSize = options.historyPageSize;
|
|
59
|
-
|
|
59
|
+
const attached = new Map();
|
|
60
|
+
const linked = new WeakMap();
|
|
61
|
+
const carried = new Map();
|
|
60
62
|
let expiring = [];
|
|
63
|
+
let openings = 0;
|
|
64
|
+
const declaredRooms = new Set();
|
|
61
65
|
let replicated = [];
|
|
66
|
+
let heldCursor = null;
|
|
62
67
|
let issued = 0;
|
|
63
68
|
function scriptConversations(entries) {
|
|
64
69
|
scripted.clear();
|
|
@@ -86,8 +91,53 @@ export function createMemoryAdapter(options = {}) {
|
|
|
86
91
|
const wanted = ordinals.get(`${locator}\u0000${target}`);
|
|
87
92
|
return held !== undefined && wanted !== undefined && held >= wanted;
|
|
88
93
|
}
|
|
94
|
+
function heldBlob(room, path) {
|
|
95
|
+
return attached.get(`${room.locator}\u0000${path}`) ?? room.blobs?.[path];
|
|
96
|
+
}
|
|
97
|
+
function freePath(room, name) {
|
|
98
|
+
const dot = name.lastIndexOf('.');
|
|
99
|
+
const stem = dot > 0 ? name.slice(0, dot) : name;
|
|
100
|
+
const extension = dot > 0 ? name.slice(dot) : '';
|
|
101
|
+
for (let count = 1;; count += 1) {
|
|
102
|
+
const path = `${ATTACHMENTS}/${count === 1 ? stem : `${stem}-${count}`}${extension}`;
|
|
103
|
+
if (heldBlob(room, path) === undefined && room.documents?.[path] === undefined)
|
|
104
|
+
return path;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const saved = new WeakMap();
|
|
108
|
+
const roomTypes = roomTypesOf(options.roomTypes);
|
|
109
|
+
function factsAt(room, path, content) {
|
|
110
|
+
const types = selected({ selection: room.typedSelection ?? null }, path)
|
|
111
|
+
? roomTypes.types
|
|
112
|
+
: schemaTypes(room.model?.kind === 'model' ? room.model.snapshot.schema : null, roomTypes);
|
|
113
|
+
let held = saved.get(types);
|
|
114
|
+
if (held === undefined) {
|
|
115
|
+
held = new Map();
|
|
116
|
+
saved.set(types, held);
|
|
117
|
+
}
|
|
118
|
+
const key = `${path}\u0000${content}`;
|
|
119
|
+
if (!held.has(key)) {
|
|
120
|
+
const facts = documentFacts(path, parse(content, path, definitionAt({ types }, path, options.typedPaths)), {
|
|
121
|
+
types,
|
|
122
|
+
});
|
|
123
|
+
held.set(key, facts === null ? null : JSON.parse(JSON.stringify(facts)));
|
|
124
|
+
}
|
|
125
|
+
return held.get(key);
|
|
126
|
+
}
|
|
127
|
+
function factsIn(room, paths) {
|
|
128
|
+
const facts = {};
|
|
129
|
+
for (const path of paths) {
|
|
130
|
+
const content = room.documents?.[path];
|
|
131
|
+
const held = room.facts?.[path] ?? (content === undefined ? null : factsAt(room, path, content));
|
|
132
|
+
if (held !== null)
|
|
133
|
+
facts[path] = held;
|
|
134
|
+
}
|
|
135
|
+
return facts;
|
|
136
|
+
}
|
|
89
137
|
function retain(entries) {
|
|
90
138
|
for (const room of entries) {
|
|
139
|
+
for (const [path, content] of Object.entries(room.documents ?? {}))
|
|
140
|
+
factsAt(room, path, content);
|
|
91
141
|
note(room.locator, room);
|
|
92
142
|
const versions = served.get(room.locator) ?? new Map();
|
|
93
143
|
versions.set(room.roomVersion, room);
|
|
@@ -103,8 +153,9 @@ export function createMemoryAdapter(options = {}) {
|
|
|
103
153
|
roomVersion: room.roomVersion,
|
|
104
154
|
operations: room.operations,
|
|
105
155
|
replica: room.replica,
|
|
106
|
-
|
|
156
|
+
typedSelection: room.typedSelection ?? null,
|
|
107
157
|
providerOwnedPaths: room.providerOwnedPaths,
|
|
158
|
+
authoredPaths: room.authoredPaths ?? ['**'],
|
|
108
159
|
};
|
|
109
160
|
}
|
|
110
161
|
function page(room, after) {
|
|
@@ -120,23 +171,43 @@ export function createMemoryAdapter(options = {}) {
|
|
|
120
171
|
roomVersion: room.roomVersion,
|
|
121
172
|
...(opening ? { models: modelsOf(room) } : {}),
|
|
122
173
|
documents: named(room.documents ?? {}, taken),
|
|
174
|
+
facts: factsIn(room, taken),
|
|
123
175
|
revisions: named(room.revisions ?? {}, [...taken, ...targets]),
|
|
176
|
+
...(room.fileIds === undefined
|
|
177
|
+
? {}
|
|
178
|
+
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
179
|
+
...(room.created === undefined
|
|
180
|
+
? {}
|
|
181
|
+
: { created: named(room.created, [...taken, ...targets]) }),
|
|
124
182
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
125
183
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
184
|
+
...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
|
|
126
185
|
...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
|
|
127
186
|
};
|
|
128
187
|
}
|
|
129
|
-
function
|
|
188
|
+
function foldersMoved(room, from) {
|
|
189
|
+
const now = new Set(room.folders ?? []);
|
|
190
|
+
const before = new Set(from.folders ?? []);
|
|
191
|
+
const folders = [...now].filter((folder) => !before.has(folder)).sort();
|
|
192
|
+
const folderRemovals = [...before].filter((folder) => !now.has(folder)).sort();
|
|
193
|
+
return {
|
|
194
|
+
...(folders.length === 0 ? {} : { folders }),
|
|
195
|
+
...(folderRemovals.length === 0 ? {} : { folderRemovals }),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
function advancement(room, from, at, whole = false) {
|
|
130
199
|
const current = room.documents ?? {};
|
|
131
200
|
const previous = from.documents ?? {};
|
|
132
201
|
const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
|
|
133
202
|
const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
|
|
134
203
|
const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
|
|
204
|
+
room.fileIds?.[path] !== from.fileIds?.[path] ||
|
|
205
|
+
room.created?.[path] !== from.created?.[path] ||
|
|
135
206
|
!sameChange(room.changes?.[path], from.changes?.[path]);
|
|
136
207
|
const changed = Object.keys(current)
|
|
137
208
|
.filter((path) => current[path] !== previous[path] || headMoved(path))
|
|
138
209
|
.sort();
|
|
139
|
-
const size = pageSize ?? changed.length;
|
|
210
|
+
const size = whole ? changed.length : (pageSize ?? changed.length);
|
|
140
211
|
const taken = changed.slice(at, at + size);
|
|
141
212
|
const next = at + taken.length;
|
|
142
213
|
const opening = at === 0;
|
|
@@ -152,9 +223,17 @@ export function createMemoryAdapter(options = {}) {
|
|
|
152
223
|
roomVersion: room.roomVersion,
|
|
153
224
|
...(models === undefined ? {} : { models }),
|
|
154
225
|
documents: named(current, taken),
|
|
226
|
+
facts: factsIn(room, taken),
|
|
155
227
|
revisions: named(room.revisions ?? {}, [...taken, ...targets]),
|
|
228
|
+
...(room.fileIds === undefined
|
|
229
|
+
? {}
|
|
230
|
+
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
231
|
+
...(room.created === undefined
|
|
232
|
+
? {}
|
|
233
|
+
: { created: named(room.created, [...taken, ...targets]) }),
|
|
156
234
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
157
235
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
236
|
+
...(opening ? foldersMoved(room, from) : {}),
|
|
158
237
|
removals: opening
|
|
159
238
|
? [
|
|
160
239
|
...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
|
|
@@ -164,30 +243,45 @@ export function createMemoryAdapter(options = {}) {
|
|
|
164
243
|
...(pageToken === undefined ? {} : { pageToken }),
|
|
165
244
|
};
|
|
166
245
|
}
|
|
246
|
+
function carry(locator) {
|
|
247
|
+
const at = carried.get(locator);
|
|
248
|
+
const current = rooms.find((entry) => entry.locator === locator);
|
|
249
|
+
if (at === undefined || current === undefined || current.roomVersion === at)
|
|
250
|
+
return;
|
|
251
|
+
const from = served.get(locator)?.get(at);
|
|
252
|
+
carried.set(locator, current.roomVersion);
|
|
253
|
+
if (from === undefined)
|
|
254
|
+
return;
|
|
255
|
+
const page = advancement(current, from, 0, true);
|
|
256
|
+
for (const observer of observers) {
|
|
257
|
+
observer({
|
|
258
|
+
kind: 'room-change',
|
|
259
|
+
locator,
|
|
260
|
+
from: at,
|
|
261
|
+
roomVersion: current.roomVersion,
|
|
262
|
+
read: async () => page,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
167
266
|
function pageOf(conversation, after) {
|
|
168
267
|
const messages = conversation.messages ?? [];
|
|
169
|
-
const first = typeof after === 'string' ? messages.findIndex((message) => message.
|
|
268
|
+
const first = typeof after === 'string' ? messages.findIndex((message) => message.change > after) : 0;
|
|
170
269
|
const from = first === -1 ? messages.length : first;
|
|
171
270
|
const page = messages.slice(from, from + (historyPageSize ?? messages.length));
|
|
172
271
|
const last = page.at(-1);
|
|
173
272
|
return {
|
|
174
273
|
conversation: conversation.conversation,
|
|
175
274
|
messages: page,
|
|
176
|
-
...(last !== undefined && from + page.length < messages.length
|
|
177
|
-
? { next: last.position }
|
|
178
|
-
: {}),
|
|
275
|
+
...(last !== undefined && from + page.length < messages.length ? { next: last.change } : {}),
|
|
179
276
|
};
|
|
180
277
|
}
|
|
181
|
-
function historiesOf(
|
|
182
|
-
const asked = input?.conversations;
|
|
183
|
-
if (!Array.isArray(asked))
|
|
184
|
-
return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
|
|
278
|
+
function historiesOf(request) {
|
|
185
279
|
const histories = [];
|
|
186
|
-
for (const entry of
|
|
187
|
-
const conversation =
|
|
280
|
+
for (const entry of request.conversations) {
|
|
281
|
+
const conversation = scripted.get(entry.conversation);
|
|
188
282
|
if (conversation === undefined)
|
|
189
283
|
continue;
|
|
190
|
-
const outcome = conversation.outcomes?.
|
|
284
|
+
const outcome = conversation.outcomes?.history;
|
|
191
285
|
if (outcome !== undefined)
|
|
192
286
|
return outcome;
|
|
193
287
|
histories.push(pageOf(conversation, entry.after));
|
|
@@ -198,15 +292,22 @@ export function createMemoryAdapter(options = {}) {
|
|
|
198
292
|
function conversationAction(request) {
|
|
199
293
|
const name = request.name;
|
|
200
294
|
const input = (request.input ?? {});
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
295
|
+
const operation = typeof input.operation_id === 'string' ? `${name}\u0000${input.operation_id}` : null;
|
|
296
|
+
const first = (answer) => {
|
|
297
|
+
if (operation !== null)
|
|
298
|
+
repeats.set(operation, answer);
|
|
299
|
+
return answer;
|
|
300
|
+
};
|
|
301
|
+
const repeated = operation === null ? undefined : repeats.get(operation);
|
|
302
|
+
if (name === 'conversations/create') {
|
|
303
|
+
if (repeated !== undefined)
|
|
304
|
+
return repeated;
|
|
204
305
|
issued += 1;
|
|
205
306
|
const conversation = `conversation-${issued}`;
|
|
206
307
|
scripted.set(conversation, { conversation });
|
|
207
|
-
return { kind: 'action', result: { conversation } };
|
|
308
|
+
return first({ kind: 'action', result: { conversation_id: conversation } });
|
|
208
309
|
}
|
|
209
|
-
const named = typeof input.
|
|
310
|
+
const named = typeof input.conversation_id === 'string' ? input.conversation_id : '';
|
|
210
311
|
const conversation = scripted.get(named);
|
|
211
312
|
if (conversation === undefined) {
|
|
212
313
|
return {
|
|
@@ -219,28 +320,34 @@ export function createMemoryAdapter(options = {}) {
|
|
|
219
320
|
const outcome = conversation.outcomes?.[name];
|
|
220
321
|
if (outcome !== undefined)
|
|
221
322
|
return outcome;
|
|
222
|
-
if (name === '
|
|
323
|
+
if (name === 'conversations/send') {
|
|
324
|
+
if (repeated !== undefined)
|
|
325
|
+
return repeated;
|
|
223
326
|
issued += 1;
|
|
224
|
-
|
|
225
|
-
unsealed.set(turn, named);
|
|
226
|
-
return { kind: 'action', result: { turn } };
|
|
227
|
-
}
|
|
228
|
-
if (name === 'conversation.cancel') {
|
|
229
|
-
const turn = typeof input.turn === 'string' ? input.turn : '';
|
|
230
|
-
if (sealed.has(turn) || !unsealed.has(turn)) {
|
|
231
|
-
return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
|
|
232
|
-
}
|
|
233
|
-
unsealed.delete(turn);
|
|
234
|
-
return { kind: 'action', result: { turn, cancelled: true } };
|
|
327
|
+
return first({ kind: 'action', result: { message_id: `turn-${issued}` } });
|
|
235
328
|
}
|
|
236
|
-
if (name === '
|
|
329
|
+
if (name === 'conversations/delete')
|
|
237
330
|
scripted.delete(named);
|
|
238
|
-
return { kind: 'action', result: {
|
|
331
|
+
return { kind: 'action', result: { conversation_id: named } };
|
|
332
|
+
}
|
|
333
|
+
function decided(request) {
|
|
334
|
+
const { request: asked, message, decision, } = (request.input ?? {});
|
|
335
|
+
return {
|
|
336
|
+
kind: 'action',
|
|
337
|
+
result: {
|
|
338
|
+
request: asked,
|
|
339
|
+
...(message === undefined ? {} : { message }),
|
|
340
|
+
state: decision === 'approve' ? 'started' : 'declined',
|
|
341
|
+
},
|
|
342
|
+
};
|
|
239
343
|
}
|
|
240
344
|
function announceList() {
|
|
241
|
-
const entries = [...scripted.values()].flatMap(({ conversation, listed }) => listed === undefined
|
|
242
|
-
|
|
243
|
-
|
|
345
|
+
const entries = [...scripted.values()].flatMap(({ conversation, listed, messages = [] }) => listed === undefined
|
|
346
|
+
? []
|
|
347
|
+
: [{ conversation, ...listed, newest: messages.at(-1)?.change ?? null }]);
|
|
348
|
+
for (const listener of listeners) {
|
|
349
|
+
listener({ kind: 'list', entries, whole: true, more: false, cursor: null });
|
|
350
|
+
}
|
|
244
351
|
}
|
|
245
352
|
function discovery() {
|
|
246
353
|
return {
|
|
@@ -252,7 +359,42 @@ export function createMemoryAdapter(options = {}) {
|
|
|
252
359
|
...(options.member === undefined ? {} : { member: options.member }),
|
|
253
360
|
};
|
|
254
361
|
}
|
|
362
|
+
function discovered() {
|
|
363
|
+
return resolveScript(scripts.discover, discovery, undefined).then((answer) => {
|
|
364
|
+
if (answer.kind === 'discovery')
|
|
365
|
+
for (const room of answer.rooms)
|
|
366
|
+
note(room.locator, room);
|
|
367
|
+
return answer;
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
function opened(notify) {
|
|
371
|
+
const opening = ++openings;
|
|
372
|
+
notify({ kind: 'opened' });
|
|
373
|
+
void discovered()
|
|
374
|
+
.catch(() => ({ kind: 'transport-uncertainty' }))
|
|
375
|
+
.then((answer) => {
|
|
376
|
+
if (opening !== openings)
|
|
377
|
+
return;
|
|
378
|
+
if (answer.kind !== 'discovery') {
|
|
379
|
+
openings += 1;
|
|
380
|
+
carried.clear();
|
|
381
|
+
const revoked = answer.kind === 'revoked-authorization';
|
|
382
|
+
notify({ kind: 'closed', revoked, lost: !revoked, authorityChanged: false });
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
declaredRooms.clear();
|
|
386
|
+
for (const room of answer.rooms)
|
|
387
|
+
declaredRooms.add(room.locator);
|
|
388
|
+
notify({ kind: 'discovered', discovery: answer });
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
function emitAll(event) {
|
|
392
|
+
for (const observer of observers)
|
|
393
|
+
observer(event);
|
|
394
|
+
}
|
|
255
395
|
return {
|
|
396
|
+
...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
|
|
397
|
+
...(options.typedPaths === undefined ? {} : { typedPaths: options.typedPaths }),
|
|
256
398
|
setRooms(next) {
|
|
257
399
|
rooms = [...next];
|
|
258
400
|
retain(rooms);
|
|
@@ -261,26 +403,37 @@ export function createMemoryAdapter(options = {}) {
|
|
|
261
403
|
scriptConversations(next);
|
|
262
404
|
},
|
|
263
405
|
open() {
|
|
406
|
+
carried.clear();
|
|
264
407
|
announceList();
|
|
265
|
-
|
|
266
|
-
observer({ kind: 'opened' });
|
|
408
|
+
opened(emitAll);
|
|
267
409
|
},
|
|
268
|
-
close(revoked = false) {
|
|
269
|
-
|
|
270
|
-
|
|
410
|
+
close({ revoked = false, lost = !revoked, authorityChanged = false } = {}) {
|
|
411
|
+
openings += 1;
|
|
412
|
+
carried.clear();
|
|
413
|
+
emitAll({ kind: 'closed', revoked, lost, authorityChanged });
|
|
271
414
|
},
|
|
272
415
|
expire(locators) {
|
|
273
416
|
expiring = [...locators];
|
|
274
417
|
},
|
|
275
|
-
notifyRoomVersion({ locator
|
|
276
|
-
|
|
277
|
-
|
|
418
|
+
notifyRoomVersion({ locator }) {
|
|
419
|
+
carry(locator);
|
|
420
|
+
},
|
|
421
|
+
notifyAuthorityChanged(locators) {
|
|
422
|
+
const named = new Set(locators ?? [...declaredRooms, ...rooms.map((room) => room.locator)]);
|
|
423
|
+
const listed = rooms.filter((room) => named.has(room.locator));
|
|
424
|
+
const left = [...named].filter((locator) => !listed.some((room) => room.locator === locator));
|
|
425
|
+
for (const room of listed)
|
|
426
|
+
declaredRooms.add(room.locator);
|
|
427
|
+
for (const locator of left)
|
|
428
|
+
declaredRooms.delete(locator);
|
|
429
|
+
emitAll({
|
|
430
|
+
kind: 'authority-changed',
|
|
431
|
+
rooms: listed.map(declared),
|
|
432
|
+
left,
|
|
433
|
+
...(options.member === undefined ? {} : { member: options.member }),
|
|
434
|
+
});
|
|
278
435
|
},
|
|
279
436
|
notifyConversation(event) {
|
|
280
|
-
if (event.kind === 'accepted-message') {
|
|
281
|
-
sealed.add(event.message.turn);
|
|
282
|
-
unsealed.delete(event.message.turn);
|
|
283
|
-
}
|
|
284
437
|
for (const listener of listeners)
|
|
285
438
|
listener(event);
|
|
286
439
|
},
|
|
@@ -289,21 +442,31 @@ export function createMemoryAdapter(options = {}) {
|
|
|
289
442
|
observer(mode);
|
|
290
443
|
},
|
|
291
444
|
heldRooms() {
|
|
292
|
-
return
|
|
445
|
+
return [...carried.keys()].sort();
|
|
293
446
|
},
|
|
294
447
|
replicatedConversations() {
|
|
295
448
|
return replicated;
|
|
296
449
|
},
|
|
450
|
+
heldConversationCursor() {
|
|
451
|
+
return heldCursor;
|
|
452
|
+
},
|
|
297
453
|
conversations: {
|
|
298
454
|
replicate(next) {
|
|
299
455
|
replicated = [...next];
|
|
300
456
|
},
|
|
457
|
+
hold(cursor) {
|
|
458
|
+
heldCursor = cursor;
|
|
459
|
+
},
|
|
301
460
|
observe(notify) {
|
|
302
461
|
listeners.add(notify);
|
|
303
462
|
return () => {
|
|
304
463
|
listeners.delete(notify);
|
|
305
464
|
};
|
|
306
465
|
},
|
|
466
|
+
history: (request) => Promise.resolve(historiesOf(request)),
|
|
467
|
+
...(options.agents === undefined
|
|
468
|
+
? {}
|
|
469
|
+
: { agents: () => Promise.resolve(structuredClone(options.agents)) }),
|
|
307
470
|
},
|
|
308
471
|
serviceMode: {
|
|
309
472
|
observe(notify) {
|
|
@@ -315,29 +478,30 @@ export function createMemoryAdapter(options = {}) {
|
|
|
315
478
|
},
|
|
316
479
|
roomStream: {
|
|
317
480
|
hold(asked) {
|
|
318
|
-
|
|
319
|
-
const
|
|
320
|
-
expiring = [];
|
|
321
|
-
const moved = asked.flatMap((room) => {
|
|
481
|
+
const named = asked.map((room) => room.locator);
|
|
482
|
+
const unknown = asked.flatMap((room) => {
|
|
322
483
|
const current = rooms.find((entry) => entry.locator === room.locator);
|
|
484
|
+
const version = room.roomVersion;
|
|
323
485
|
return current === undefined ||
|
|
324
|
-
|
|
325
|
-
|
|
486
|
+
(version !== null &&
|
|
487
|
+
(current.roomVersion === version || served.get(room.locator)?.has(version) === true))
|
|
326
488
|
? []
|
|
327
|
-
: [
|
|
489
|
+
: [room.locator];
|
|
328
490
|
});
|
|
491
|
+
const expired = [
|
|
492
|
+
...new Set([...expiring.filter((locator) => named.includes(locator)), ...unknown]),
|
|
493
|
+
];
|
|
494
|
+
expiring = expiring.filter((locator) => !named.includes(locator));
|
|
329
495
|
queueMicrotask(() => {
|
|
330
|
-
for (const
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
496
|
+
for (const room of asked) {
|
|
497
|
+
if (expired.includes(room.locator) || room.roomVersion === null)
|
|
498
|
+
carried.delete(room.locator);
|
|
499
|
+
else {
|
|
500
|
+
carried.set(room.locator, room.roomVersion);
|
|
501
|
+
carry(room.locator);
|
|
502
|
+
}
|
|
334
503
|
}
|
|
335
|
-
|
|
336
|
-
},
|
|
337
|
-
reopen() {
|
|
338
|
-
queueMicrotask(() => {
|
|
339
|
-
for (const observer of observers)
|
|
340
|
-
observer({ kind: 'closed', revoked: false });
|
|
504
|
+
emitAll({ kind: 'caught-up', expired });
|
|
341
505
|
});
|
|
342
506
|
},
|
|
343
507
|
observe(notify) {
|
|
@@ -346,11 +510,14 @@ export function createMemoryAdapter(options = {}) {
|
|
|
346
510
|
if (!observers.has(notify))
|
|
347
511
|
return;
|
|
348
512
|
if (options.unopened === true) {
|
|
349
|
-
notify({ kind: 'closed', revoked: false });
|
|
513
|
+
notify({ kind: 'closed', revoked: false, lost: true, authorityChanged: false });
|
|
350
514
|
return;
|
|
351
515
|
}
|
|
352
516
|
announceList();
|
|
353
|
-
|
|
517
|
+
opened((event) => {
|
|
518
|
+
if (observers.has(notify))
|
|
519
|
+
notify(event);
|
|
520
|
+
});
|
|
354
521
|
});
|
|
355
522
|
return () => {
|
|
356
523
|
observers.delete(notify);
|
|
@@ -367,12 +534,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
367
534
|
return resolveScript(scripts.authorize, () => ({}), undefined);
|
|
368
535
|
},
|
|
369
536
|
async discover(_authorization) {
|
|
370
|
-
return
|
|
371
|
-
if (answer.kind === 'discovery')
|
|
372
|
-
for (const room of answer.rooms)
|
|
373
|
-
note(room.locator, room);
|
|
374
|
-
return answer;
|
|
375
|
-
});
|
|
537
|
+
return discovered();
|
|
376
538
|
},
|
|
377
539
|
reached,
|
|
378
540
|
follows(locator, roomVersion, next) {
|
|
@@ -429,7 +591,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
429
591
|
retryable: false,
|
|
430
592
|
affected: {},
|
|
431
593
|
};
|
|
432
|
-
}, request).then((answer) =>
|
|
594
|
+
}, request).then((answer) => {
|
|
595
|
+
const destination = request.changeBatch.between?.destination.room;
|
|
596
|
+
if (answer.kind === 'accepted' && answer.destination !== undefined && destination) {
|
|
597
|
+
note(destination, answer.destination);
|
|
598
|
+
}
|
|
599
|
+
return note(request.locator, answer);
|
|
600
|
+
});
|
|
433
601
|
},
|
|
434
602
|
async history(_authorization, request) {
|
|
435
603
|
return resolveScript(scripts.history, () => {
|
|
@@ -445,32 +613,45 @@ export function createMemoryAdapter(options = {}) {
|
|
|
445
613
|
},
|
|
446
614
|
async binary(_authorization, request) {
|
|
447
615
|
return resolveScript(scripts.binary, () => {
|
|
448
|
-
if (request.kind === 'reference') {
|
|
449
|
-
return { kind: 'rejected', code: 'unscripted-binary', fields: {}, retryable: false };
|
|
450
|
-
}
|
|
451
616
|
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
452
617
|
if (room === undefined)
|
|
453
618
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
454
|
-
const blob = room
|
|
619
|
+
const blob = heldBlob(room, request.path);
|
|
455
620
|
return blob === undefined
|
|
456
|
-
? { kind: 'rejected', code: '
|
|
457
|
-
: { kind: 'binary', blob };
|
|
621
|
+
? { kind: 'rejected', code: 'not_found', fields: {}, retryable: false }
|
|
622
|
+
: { kind: 'binary', body: blob.stream(), mediaType: blob.type };
|
|
458
623
|
}, request);
|
|
459
624
|
},
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
625
|
+
async link(_authorization, request) {
|
|
626
|
+
return resolveScript(scripts.link, () => {
|
|
627
|
+
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
628
|
+
if (room === undefined)
|
|
629
|
+
return { kind: 'room-not-readable', locator: request.locator };
|
|
630
|
+
const blob = heldBlob(room, request.path);
|
|
631
|
+
if (blob === undefined) {
|
|
632
|
+
return { kind: 'rejected', code: 'not_found', fields: {}, retryable: false };
|
|
633
|
+
}
|
|
634
|
+
const url = linked.get(blob) ?? URL.createObjectURL(blob);
|
|
635
|
+
linked.set(blob, url);
|
|
636
|
+
return { kind: 'link', url, name: lastName(request.path), mediaType: blob.type };
|
|
637
|
+
}, request);
|
|
638
|
+
},
|
|
639
|
+
async attach(_authorization, request) {
|
|
640
|
+
return resolveScript(scripts.attach, () => {
|
|
641
|
+
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
642
|
+
if (room === undefined)
|
|
643
|
+
return { kind: 'room-not-readable', locator: request.locator };
|
|
644
|
+
const path = freePath(room, request.name);
|
|
645
|
+
attached.set(`${room.locator}\u0000${path}`, request.blob);
|
|
646
|
+
return { kind: 'attached', path, revision: `attached-${attached.size}` };
|
|
647
|
+
}, request);
|
|
469
648
|
},
|
|
470
649
|
async action(_authorization, request) {
|
|
471
650
|
return resolveScript(scripts.action, () => {
|
|
472
|
-
if (request.name.startsWith('
|
|
651
|
+
if (request.name.startsWith('conversations/'))
|
|
473
652
|
return conversationAction(request);
|
|
653
|
+
if (request.name === 'agent-functions/decide')
|
|
654
|
+
return decided(request);
|
|
474
655
|
return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
|
|
475
656
|
}, request).then((answer) => {
|
|
476
657
|
if (answer.kind === 'action' && answer.at !== undefined)
|
|
@@ -0,0 +1,56 @@
|
|
|
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 ConversationFact = 'openedTurn' | 'dismissedSuggestion';
|
|
34
|
+
export type HeldFact = {
|
|
35
|
+
readonly conversation: string;
|
|
36
|
+
readonly name: ConversationFact;
|
|
37
|
+
readonly value: string;
|
|
38
|
+
};
|
|
39
|
+
export type ConversationWrite = {
|
|
40
|
+
readonly conversation: string;
|
|
41
|
+
readonly messages: readonly AcceptedMessage[];
|
|
42
|
+
readonly read?: {
|
|
43
|
+
readonly at: string | null;
|
|
44
|
+
readonly partial: boolean;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
export declare function heldConversations(connection: Connection, conversations: readonly string[] | null): HeldConversation[];
|
|
48
|
+
export declare function keptMessages(connection: Connection, { conversation, messages, read }: ConversationWrite): null;
|
|
49
|
+
export declare function messageWindow(connection: Connection, conversation: string, limit: number, before: readonly [string, string] | null, phrase: string | null): MessageWindow;
|
|
50
|
+
export declare function messageCount(connection: Connection, conversation: string, phrase: string | null): number;
|
|
51
|
+
export declare function conversationRows(connection: Connection, conversations: readonly string[]): HeldRow[];
|
|
52
|
+
export declare function turnArrived(connection: Connection, conversation: string, turn: string): boolean;
|
|
53
|
+
export declare function conversationFacts(connection: Connection): HeldFact[];
|
|
54
|
+
export declare function keptFact(connection: Connection, { conversation, name, value }: HeldFact): null;
|
|
55
|
+
export declare function forgottenConversations(connection: Connection): void;
|
|
56
|
+
//# 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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"}
|