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