@agentshouse/mdruntime 0.1.0-c4478f1a5ac2a → 0.1.0-c44d5cc00aee5
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 +174 -119
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +6 -10
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +35 -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 +309 -109
- 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 -16
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +17 -88
- 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 +3 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +11 -0
- package/dist/client.d.ts +42 -24
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +133 -27
- package/dist/collection.d.ts +29 -21
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +48 -290
- 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 +7 -118
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +109 -2967
- 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 +143 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +254 -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 +78 -47
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +1069 -690
- 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 +5 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +33 -28
- 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 +27 -4
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +168 -27
- 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 +40 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -3
- 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 +23 -7
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +282 -110
- 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 -13
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +7 -24
- 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 +19 -3
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +116 -20
- 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 +52 -8
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +57 -0
- package/dist/overlay.d.ts +8 -5
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +131 -166
- 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 +27 -186
- 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 +342 -97
- package/dist/react.d.ts +19 -4
- 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 +5 -2
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +65 -8
- package/dist/refresh.d.ts +17 -14
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +145 -54
- 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 +338 -189
- 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 +31 -29
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +60 -118
- 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 +43 -48
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +791 -274
- 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 -77
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +10 -186
- 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 +6 -7
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +75 -104
- package/dist/shown.d.ts +33 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +302 -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 -142
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +159 -687
- 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 +128 -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 +228 -36
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +75 -33
- package/package.json +19 -19
- package/AGENTS.md +0 -309
- package/dist/attempt.d.ts +0 -16
- package/dist/attempt.d.ts.map +0 -1
- package/dist/attempt.js +0 -70
- package/dist/chat/acts.d.ts +0 -33
- package/dist/chat/acts.d.ts.map +0 -1
- package/dist/chat/acts.js +0 -36
- package/dist/chat/context.d.ts +0 -3
- package/dist/chat/context.d.ts.map +0 -1
- package/dist/chat/input.d.ts +0 -9
- package/dist/chat/input.d.ts.map +0 -1
- package/dist/chat/input.js +0 -99
- package/dist/chat/kit.d.ts +0 -60
- package/dist/chat/kit.d.ts.map +0 -1
- package/dist/chat/kit.js +0 -123
- package/dist/chat/lasting.d.ts +0 -6
- package/dist/chat/lasting.d.ts.map +0 -1
- package/dist/chat/lasting.js +0 -19
- package/dist/chat/list.d.ts +0 -26
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -62
- package/dist/chat/markdown.d.ts +0 -20
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -188
- package/dist/chat/message.d.ts +0 -6
- package/dist/chat/message.d.ts.map +0 -1
- package/dist/chat/message.js +0 -192
- package/dist/chat/messages.d.ts +0 -21
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -151
- package/dist/chat/name.d.ts +0 -6
- package/dist/chat/name.d.ts.map +0 -1
- package/dist/chat/name.js +0 -37
- package/dist/chat/opened.d.ts +0 -11
- package/dist/chat/opened.d.ts.map +0 -1
- package/dist/chat/opened.js +0 -17
- package/dist/chat/overlay.d.ts +0 -31
- package/dist/chat/overlay.d.ts.map +0 -1
- package/dist/chat/overlay.js +0 -97
- package/dist/chat/parts.d.ts +0 -57
- package/dist/chat/parts.d.ts.map +0 -1
- package/dist/chat/parts.js +0 -119
- package/dist/chat/process.d.ts +0 -20
- package/dist/chat/process.d.ts.map +0 -1
- package/dist/chat/process.js +0 -32
- package/dist/chat/provider.d.ts +0 -63
- package/dist/chat/provider.d.ts.map +0 -1
- package/dist/chat/provider.js +0 -620
- package/dist/chat/question.d.ts +0 -9
- package/dist/chat/question.d.ts.map +0 -1
- package/dist/chat/question.js +0 -80
- package/dist/chat/questions.d.ts.map +0 -1
- package/dist/chat/read.d.ts.map +0 -1
- package/dist/chat/ready.d.ts +0 -33
- package/dist/chat/ready.d.ts.map +0 -1
- package/dist/chat/ready.js +0 -91
- package/dist/chat/style.d.ts +0 -4
- package/dist/chat/style.d.ts.map +0 -1
- package/dist/chat/style.js +0 -302
- package/dist/chat.d.ts +0 -14
- package/dist/chat.d.ts.map +0 -1
- package/dist/chat.js +0 -8
- package/dist/fence.d.ts +0 -6
- package/dist/fence.d.ts.map +0 -1
- package/dist/fence.js +0 -10
- package/dist/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 -25
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -639
package/dist/memory.js
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
import { definitionAt, documentFacts, parse } from '@agentshouse/mdmodel';
|
|
2
|
+
import { NO_ROOM_TYPES, 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: 604_800,
|
|
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,13 +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();
|
|
58
|
-
const sentTurns = new Map();
|
|
57
|
+
const repeats = new Map();
|
|
59
58
|
const historyPageSize = options.historyPageSize;
|
|
60
|
-
|
|
59
|
+
const attached = new Map();
|
|
60
|
+
const linked = new WeakMap();
|
|
61
|
+
const carried = new Map();
|
|
61
62
|
let expiring = [];
|
|
63
|
+
let openings = 0;
|
|
64
|
+
const declaredRooms = new Set();
|
|
62
65
|
let replicated = [];
|
|
66
|
+
let heldCursor = null;
|
|
63
67
|
let issued = 0;
|
|
64
68
|
function scriptConversations(entries) {
|
|
65
69
|
scripted.clear();
|
|
@@ -87,8 +91,53 @@ export function createMemoryAdapter(options = {}) {
|
|
|
87
91
|
const wanted = ordinals.get(`${locator}\u0000${target}`);
|
|
88
92
|
return held !== undefined && wanted !== undefined && held >= wanted;
|
|
89
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 = options.roomTypes ?? NO_ROOM_TYPES;
|
|
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
|
+
}
|
|
90
137
|
function retain(entries) {
|
|
91
138
|
for (const room of entries) {
|
|
139
|
+
for (const [path, content] of Object.entries(room.documents ?? {}))
|
|
140
|
+
factsAt(room, path, content);
|
|
92
141
|
note(room.locator, room);
|
|
93
142
|
const versions = served.get(room.locator) ?? new Map();
|
|
94
143
|
versions.set(room.roomVersion, room);
|
|
@@ -104,8 +153,9 @@ export function createMemoryAdapter(options = {}) {
|
|
|
104
153
|
roomVersion: room.roomVersion,
|
|
105
154
|
operations: room.operations,
|
|
106
155
|
replica: room.replica,
|
|
107
|
-
|
|
156
|
+
typedSelection: room.typedSelection ?? null,
|
|
108
157
|
providerOwnedPaths: room.providerOwnedPaths,
|
|
158
|
+
authoredPaths: room.authoredPaths ?? ['**'],
|
|
109
159
|
};
|
|
110
160
|
}
|
|
111
161
|
function page(room, after) {
|
|
@@ -121,23 +171,43 @@ export function createMemoryAdapter(options = {}) {
|
|
|
121
171
|
roomVersion: room.roomVersion,
|
|
122
172
|
...(opening ? { models: modelsOf(room) } : {}),
|
|
123
173
|
documents: named(room.documents ?? {}, taken),
|
|
174
|
+
facts: factsIn(room, taken),
|
|
124
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]) }),
|
|
125
182
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
126
183
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
184
|
+
...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
|
|
127
185
|
...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
|
|
128
186
|
};
|
|
129
187
|
}
|
|
130
|
-
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) {
|
|
131
199
|
const current = room.documents ?? {};
|
|
132
200
|
const previous = from.documents ?? {};
|
|
133
201
|
const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
|
|
134
202
|
const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
|
|
135
203
|
const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
|
|
204
|
+
room.fileIds?.[path] !== from.fileIds?.[path] ||
|
|
205
|
+
room.created?.[path] !== from.created?.[path] ||
|
|
136
206
|
!sameChange(room.changes?.[path], from.changes?.[path]);
|
|
137
207
|
const changed = Object.keys(current)
|
|
138
208
|
.filter((path) => current[path] !== previous[path] || headMoved(path))
|
|
139
209
|
.sort();
|
|
140
|
-
const size = pageSize ?? changed.length;
|
|
210
|
+
const size = whole ? changed.length : (pageSize ?? changed.length);
|
|
141
211
|
const taken = changed.slice(at, at + size);
|
|
142
212
|
const next = at + taken.length;
|
|
143
213
|
const opening = at === 0;
|
|
@@ -153,9 +223,17 @@ export function createMemoryAdapter(options = {}) {
|
|
|
153
223
|
roomVersion: room.roomVersion,
|
|
154
224
|
...(models === undefined ? {} : { models }),
|
|
155
225
|
documents: named(current, taken),
|
|
226
|
+
facts: factsIn(room, taken),
|
|
156
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]) }),
|
|
157
234
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
158
235
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
236
|
+
...(opening ? foldersMoved(room, from) : {}),
|
|
159
237
|
removals: opening
|
|
160
238
|
? [
|
|
161
239
|
...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
|
|
@@ -165,30 +243,45 @@ export function createMemoryAdapter(options = {}) {
|
|
|
165
243
|
...(pageToken === undefined ? {} : { pageToken }),
|
|
166
244
|
};
|
|
167
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
|
+
}
|
|
168
266
|
function pageOf(conversation, after) {
|
|
169
267
|
const messages = conversation.messages ?? [];
|
|
170
|
-
const first = typeof after === 'string' ? messages.findIndex((message) => message.
|
|
268
|
+
const first = typeof after === 'string' ? messages.findIndex((message) => message.change > after) : 0;
|
|
171
269
|
const from = first === -1 ? messages.length : first;
|
|
172
270
|
const page = messages.slice(from, from + (historyPageSize ?? messages.length));
|
|
173
271
|
const last = page.at(-1);
|
|
174
272
|
return {
|
|
175
273
|
conversation: conversation.conversation,
|
|
176
274
|
messages: page,
|
|
177
|
-
...(last !== undefined && from + page.length < messages.length
|
|
178
|
-
? { next: last.position }
|
|
179
|
-
: {}),
|
|
275
|
+
...(last !== undefined && from + page.length < messages.length ? { next: last.change } : {}),
|
|
180
276
|
};
|
|
181
277
|
}
|
|
182
|
-
function historiesOf(
|
|
183
|
-
const asked = input?.conversations;
|
|
184
|
-
if (!Array.isArray(asked))
|
|
185
|
-
return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
|
|
278
|
+
function historiesOf(request) {
|
|
186
279
|
const histories = [];
|
|
187
|
-
for (const entry of
|
|
188
|
-
const conversation =
|
|
280
|
+
for (const entry of request.conversations) {
|
|
281
|
+
const conversation = scripted.get(entry.conversation);
|
|
189
282
|
if (conversation === undefined)
|
|
190
283
|
continue;
|
|
191
|
-
const outcome = conversation.outcomes?.
|
|
284
|
+
const outcome = conversation.outcomes?.history;
|
|
192
285
|
if (outcome !== undefined)
|
|
193
286
|
return outcome;
|
|
194
287
|
histories.push(pageOf(conversation, entry.after));
|
|
@@ -199,15 +292,22 @@ export function createMemoryAdapter(options = {}) {
|
|
|
199
292
|
function conversationAction(request) {
|
|
200
293
|
const name = request.name;
|
|
201
294
|
const input = (request.input ?? {});
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
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;
|
|
205
305
|
issued += 1;
|
|
206
306
|
const conversation = `conversation-${issued}`;
|
|
207
307
|
scripted.set(conversation, { conversation });
|
|
208
|
-
return { kind: 'action', result: { conversation } };
|
|
308
|
+
return first({ kind: 'action', result: { conversation_id: conversation } });
|
|
209
309
|
}
|
|
210
|
-
const named = typeof input.
|
|
310
|
+
const named = typeof input.conversation_id === 'string' ? input.conversation_id : '';
|
|
211
311
|
const conversation = scripted.get(named);
|
|
212
312
|
if (conversation === undefined) {
|
|
213
313
|
return {
|
|
@@ -220,34 +320,34 @@ export function createMemoryAdapter(options = {}) {
|
|
|
220
320
|
const outcome = conversation.outcomes?.[name];
|
|
221
321
|
if (outcome !== undefined)
|
|
222
322
|
return outcome;
|
|
223
|
-
if (name === '
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
if (answered !== undefined)
|
|
227
|
-
return { kind: 'action', result: { turn: answered } };
|
|
323
|
+
if (name === 'conversations/send') {
|
|
324
|
+
if (repeated !== undefined)
|
|
325
|
+
return repeated;
|
|
228
326
|
issued += 1;
|
|
229
|
-
|
|
230
|
-
unsealed.set(turn, named);
|
|
231
|
-
if (operation !== null)
|
|
232
|
-
sentTurns.set(operation, turn);
|
|
233
|
-
return { kind: 'action', result: { turn } };
|
|
234
|
-
}
|
|
235
|
-
if (name === 'conversation.cancel') {
|
|
236
|
-
const turn = typeof input.turn === 'string' ? input.turn : '';
|
|
237
|
-
if (sealed.has(turn) || !unsealed.has(turn)) {
|
|
238
|
-
return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
|
|
239
|
-
}
|
|
240
|
-
unsealed.delete(turn);
|
|
241
|
-
return { kind: 'action', result: { turn, cancelled: true } };
|
|
327
|
+
return first({ kind: 'action', result: { message_id: `turn-${issued}` } });
|
|
242
328
|
}
|
|
243
|
-
if (name === '
|
|
329
|
+
if (name === 'conversations/delete')
|
|
244
330
|
scripted.delete(named);
|
|
245
|
-
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
|
+
};
|
|
246
343
|
}
|
|
247
344
|
function announceList() {
|
|
248
|
-
const entries = [...scripted.values()].flatMap(({ conversation, listed }) => listed === undefined
|
|
249
|
-
|
|
250
|
-
|
|
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
|
+
}
|
|
251
351
|
}
|
|
252
352
|
function discovery() {
|
|
253
353
|
return {
|
|
@@ -259,8 +359,42 @@ export function createMemoryAdapter(options = {}) {
|
|
|
259
359
|
...(options.member === undefined ? {} : { member: options.member }),
|
|
260
360
|
};
|
|
261
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
|
+
}
|
|
262
395
|
return {
|
|
263
|
-
...(options.
|
|
396
|
+
...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
|
|
397
|
+
...(options.typedPaths === undefined ? {} : { typedPaths: options.typedPaths }),
|
|
264
398
|
setRooms(next) {
|
|
265
399
|
rooms = [...next];
|
|
266
400
|
retain(rooms);
|
|
@@ -269,26 +403,37 @@ export function createMemoryAdapter(options = {}) {
|
|
|
269
403
|
scriptConversations(next);
|
|
270
404
|
},
|
|
271
405
|
open() {
|
|
406
|
+
carried.clear();
|
|
272
407
|
announceList();
|
|
273
|
-
|
|
274
|
-
observer({ kind: 'opened' });
|
|
408
|
+
opened(emitAll);
|
|
275
409
|
},
|
|
276
|
-
close(revoked = false) {
|
|
277
|
-
|
|
278
|
-
|
|
410
|
+
close({ revoked = false, lost = !revoked, authorityChanged = false } = {}) {
|
|
411
|
+
openings += 1;
|
|
412
|
+
carried.clear();
|
|
413
|
+
emitAll({ kind: 'closed', revoked, lost, authorityChanged });
|
|
279
414
|
},
|
|
280
415
|
expire(locators) {
|
|
281
416
|
expiring = [...locators];
|
|
282
417
|
},
|
|
283
|
-
notifyRoomVersion({ locator
|
|
284
|
-
|
|
285
|
-
|
|
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
|
+
});
|
|
286
435
|
},
|
|
287
436
|
notifyConversation(event) {
|
|
288
|
-
if (event.kind === 'accepted-message') {
|
|
289
|
-
sealed.add(event.message.turn);
|
|
290
|
-
unsealed.delete(event.message.turn);
|
|
291
|
-
}
|
|
292
437
|
for (const listener of listeners)
|
|
293
438
|
listener(event);
|
|
294
439
|
},
|
|
@@ -297,21 +442,31 @@ export function createMemoryAdapter(options = {}) {
|
|
|
297
442
|
observer(mode);
|
|
298
443
|
},
|
|
299
444
|
heldRooms() {
|
|
300
|
-
return
|
|
445
|
+
return [...carried.keys()].sort();
|
|
301
446
|
},
|
|
302
447
|
replicatedConversations() {
|
|
303
448
|
return replicated;
|
|
304
449
|
},
|
|
450
|
+
heldConversationCursor() {
|
|
451
|
+
return heldCursor;
|
|
452
|
+
},
|
|
305
453
|
conversations: {
|
|
306
454
|
replicate(next) {
|
|
307
455
|
replicated = [...next];
|
|
308
456
|
},
|
|
457
|
+
hold(cursor) {
|
|
458
|
+
heldCursor = cursor;
|
|
459
|
+
},
|
|
309
460
|
observe(notify) {
|
|
310
461
|
listeners.add(notify);
|
|
311
462
|
return () => {
|
|
312
463
|
listeners.delete(notify);
|
|
313
464
|
};
|
|
314
465
|
},
|
|
466
|
+
history: (request) => Promise.resolve(historiesOf(request)),
|
|
467
|
+
...(options.agents === undefined
|
|
468
|
+
? {}
|
|
469
|
+
: { agents: () => Promise.resolve(structuredClone(options.agents)) }),
|
|
315
470
|
},
|
|
316
471
|
serviceMode: {
|
|
317
472
|
observe(notify) {
|
|
@@ -323,43 +478,46 @@ export function createMemoryAdapter(options = {}) {
|
|
|
323
478
|
},
|
|
324
479
|
roomStream: {
|
|
325
480
|
hold(asked) {
|
|
326
|
-
|
|
327
|
-
const
|
|
328
|
-
expiring = [];
|
|
329
|
-
const moved = asked.flatMap((room) => {
|
|
481
|
+
const named = asked.map((room) => room.locator);
|
|
482
|
+
const unknown = asked.flatMap((room) => {
|
|
330
483
|
const current = rooms.find((entry) => entry.locator === room.locator);
|
|
484
|
+
const version = room.roomVersion;
|
|
331
485
|
return current === undefined ||
|
|
332
|
-
|
|
333
|
-
|
|
486
|
+
(version !== null &&
|
|
487
|
+
(current.roomVersion === version || served.get(room.locator)?.has(version) === true))
|
|
334
488
|
? []
|
|
335
|
-
: [
|
|
489
|
+
: [room.locator];
|
|
336
490
|
});
|
|
491
|
+
const expired = [
|
|
492
|
+
...new Set([...expiring.filter((locator) => named.includes(locator)), ...unknown]),
|
|
493
|
+
];
|
|
494
|
+
expiring = expiring.filter((locator) => !named.includes(locator));
|
|
337
495
|
queueMicrotask(() => {
|
|
338
|
-
for (const
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
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
|
+
}
|
|
342
503
|
}
|
|
504
|
+
emitAll({ kind: 'caught-up', expired });
|
|
343
505
|
});
|
|
344
506
|
},
|
|
345
|
-
reopen() {
|
|
346
|
-
queueMicrotask(() => {
|
|
347
|
-
for (const observer of observers)
|
|
348
|
-
observer({ kind: 'closed', revoked: false });
|
|
349
|
-
});
|
|
350
|
-
},
|
|
351
|
-
published() { },
|
|
352
507
|
observe(notify) {
|
|
353
508
|
observers.add(notify);
|
|
354
509
|
queueMicrotask(() => {
|
|
355
510
|
if (!observers.has(notify))
|
|
356
511
|
return;
|
|
357
512
|
if (options.unopened === true) {
|
|
358
|
-
notify({ kind: 'closed', revoked: false });
|
|
513
|
+
notify({ kind: 'closed', revoked: false, lost: true, authorityChanged: false });
|
|
359
514
|
return;
|
|
360
515
|
}
|
|
361
516
|
announceList();
|
|
362
|
-
|
|
517
|
+
opened((event) => {
|
|
518
|
+
if (observers.has(notify))
|
|
519
|
+
notify(event);
|
|
520
|
+
});
|
|
363
521
|
});
|
|
364
522
|
return () => {
|
|
365
523
|
observers.delete(notify);
|
|
@@ -376,12 +534,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
376
534
|
return resolveScript(scripts.authorize, () => ({}), undefined);
|
|
377
535
|
},
|
|
378
536
|
async discover(_authorization) {
|
|
379
|
-
return
|
|
380
|
-
if (answer.kind === 'discovery')
|
|
381
|
-
for (const room of answer.rooms)
|
|
382
|
-
note(room.locator, room);
|
|
383
|
-
return answer;
|
|
384
|
-
});
|
|
537
|
+
return discovered();
|
|
385
538
|
},
|
|
386
539
|
reached,
|
|
387
540
|
follows(locator, roomVersion, next) {
|
|
@@ -438,7 +591,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
438
591
|
retryable: false,
|
|
439
592
|
affected: {},
|
|
440
593
|
};
|
|
441
|
-
}, 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
|
+
});
|
|
442
601
|
},
|
|
443
602
|
async history(_authorization, request) {
|
|
444
603
|
return resolveScript(scripts.history, () => {
|
|
@@ -454,32 +613,45 @@ export function createMemoryAdapter(options = {}) {
|
|
|
454
613
|
},
|
|
455
614
|
async binary(_authorization, request) {
|
|
456
615
|
return resolveScript(scripts.binary, () => {
|
|
457
|
-
if (request.kind === 'reference') {
|
|
458
|
-
return { kind: 'rejected', code: 'unscripted-binary', fields: {}, retryable: false };
|
|
459
|
-
}
|
|
460
616
|
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
461
617
|
if (room === undefined)
|
|
462
618
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
463
|
-
const blob = room
|
|
619
|
+
const blob = heldBlob(room, request.path);
|
|
464
620
|
return blob === undefined
|
|
465
|
-
? { kind: 'rejected', code: '
|
|
466
|
-
: { kind: 'binary', blob };
|
|
621
|
+
? { kind: 'rejected', code: 'not_found', fields: {}, retryable: false }
|
|
622
|
+
: { kind: 'binary', body: blob.stream(), mediaType: blob.type };
|
|
623
|
+
}, request);
|
|
624
|
+
},
|
|
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 };
|
|
467
637
|
}, request);
|
|
468
638
|
},
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
return
|
|
477
|
-
|
|
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);
|
|
478
648
|
},
|
|
479
649
|
async action(_authorization, request) {
|
|
480
650
|
return resolveScript(scripts.action, () => {
|
|
481
|
-
if (request.name.startsWith('
|
|
651
|
+
if (request.name.startsWith('conversations/'))
|
|
482
652
|
return conversationAction(request);
|
|
653
|
+
if (request.name === 'agent-functions/decide')
|
|
654
|
+
return decided(request);
|
|
483
655
|
return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
|
|
484
656
|
}, request).then((answer) => {
|
|
485
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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"}
|