@agentshouse/mdruntime 0.1.0-caee7332d2235 → 0.1.0-caf080a9a9c60
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 +29 -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 +162 -122
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +7 -10
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +40 -41
- package/dist/binary.d.ts +0 -5
- package/dist/binary.d.ts.map +1 -1
- package/dist/binary.js +1 -1
- package/dist/bootstrap.d.ts +30 -11
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +309 -113
- 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 +10 -16
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +17 -94
- package/dist/change.d.ts +32 -1
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +14 -3
- package/dist/chat-types.d.ts +5 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +13 -0
- package/dist/client.d.ts +33 -19
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +112 -21
- package/dist/collection.d.ts +29 -22
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +47 -354
- 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 -137
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +111 -3623
- 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 +66 -49
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +962 -799
- 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 +19 -4
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +5 -0
- package/dist/entry.d.ts +5 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +33 -29
- 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 +20 -8
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +103 -45
- 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 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -4
- 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 +17 -7
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +272 -118
- 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 +8 -11
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +6 -23
- 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 +15 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +98 -14
- 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 +47 -9
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +56 -2
- package/dist/overlay.d.ts +7 -5
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +69 -169
- 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 +3 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +10 -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 +285 -0
- package/dist/query.d.ts +21 -207
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -493
- 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 +465 -0
- package/dist/reach.d.ts +20 -9
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +306 -111
- package/dist/react.d.ts +15 -2
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +33 -1
- package/dist/{chat/read.d.ts → read.d.ts} +2 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/{chat/read.js → read.js} +4 -0
- package/dist/readiness.d.ts +13 -17
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +2 -8
- package/dist/reads.d.ts +38 -10
- package/dist/reads.d.ts.map +1 -1
- package/dist/reads.js +163 -83
- 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 +18 -15
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +145 -79
- 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 -39
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +319 -208
- 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 +28 -11
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +194 -117
- 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 -31
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +60 -125
- 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 +43 -50
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +661 -228
- 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 +12 -95
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +10 -266
- package/dist/seed.d.ts +11 -2
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +71 -1
- package/dist/shared.d.ts +4 -9
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +61 -120
- 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 +54 -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 -166
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +158 -797
- 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 +1 -1
- package/dist/turn.d.ts.map +1 -1
- package/dist/turn.js +31 -20
- 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 +1 -16
- package/dist/windows.d.ts.map +1 -1
- package/dist/windows.js +2 -79
- package/dist/wire.d.ts +72 -8
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +24 -5
- package/package.json +19 -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 -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/earlier.d.ts +0 -10
- package/dist/chat/earlier.d.ts.map +0 -1
- package/dist/chat/earlier.js +0 -54
- package/dist/chat/input.d.ts +0 -9
- package/dist/chat/input.d.ts.map +0 -1
- package/dist/chat/input.js +0 -99
- package/dist/chat/kit.d.ts +0 -61
- package/dist/chat/kit.d.ts.map +0 -1
- package/dist/chat/kit.js +0 -123
- package/dist/chat/lasting.d.ts +0 -6
- package/dist/chat/lasting.d.ts.map +0 -1
- package/dist/chat/lasting.js +0 -19
- package/dist/chat/list.d.ts +0 -27
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -99
- package/dist/chat/markdown.d.ts +0 -21
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -246
- package/dist/chat/message.d.ts +0 -6
- package/dist/chat/message.d.ts.map +0 -1
- package/dist/chat/message.js +0 -192
- package/dist/chat/messages.d.ts +0 -22
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -171
- 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/pieces.d.ts +0 -62
- package/dist/chat/pieces.d.ts.map +0 -1
- package/dist/chat/pieces.js +0 -1110
- 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 -630
- package/dist/chat/question.d.ts +0 -9
- package/dist/chat/question.d.ts.map +0 -1
- package/dist/chat/question.js +0 -69
- package/dist/chat/questions.d.ts.map +0 -1
- package/dist/chat/read.d.ts.map +0 -1
- package/dist/chat/ready.d.ts +0 -34
- package/dist/chat/ready.d.ts.map +0 -1
- package/dist/chat/ready.js +0 -91
- package/dist/chat/steady.d.ts +0 -3
- package/dist/chat/steady.d.ts.map +0 -1
- package/dist/chat/steady.js +0 -26
- 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 -27
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -826
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: 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 = 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
|
+
}
|
|
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,27 +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]),
|
|
125
176
|
...(room.fileIds === undefined
|
|
126
177
|
? {}
|
|
127
178
|
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
179
|
+
...(room.created === undefined
|
|
180
|
+
? {}
|
|
181
|
+
: { created: named(room.created, [...taken, ...targets]) }),
|
|
128
182
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
129
183
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
184
|
+
...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
|
|
130
185
|
...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
|
|
131
186
|
};
|
|
132
187
|
}
|
|
133
|
-
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) {
|
|
134
199
|
const current = room.documents ?? {};
|
|
135
200
|
const previous = from.documents ?? {};
|
|
136
201
|
const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
|
|
137
202
|
const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
|
|
138
203
|
const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
|
|
139
204
|
room.fileIds?.[path] !== from.fileIds?.[path] ||
|
|
205
|
+
room.created?.[path] !== from.created?.[path] ||
|
|
140
206
|
!sameChange(room.changes?.[path], from.changes?.[path]);
|
|
141
207
|
const changed = Object.keys(current)
|
|
142
208
|
.filter((path) => current[path] !== previous[path] || headMoved(path))
|
|
143
209
|
.sort();
|
|
144
|
-
const size = pageSize ?? changed.length;
|
|
210
|
+
const size = whole ? changed.length : (pageSize ?? changed.length);
|
|
145
211
|
const taken = changed.slice(at, at + size);
|
|
146
212
|
const next = at + taken.length;
|
|
147
213
|
const opening = at === 0;
|
|
@@ -157,12 +223,17 @@ export function createMemoryAdapter(options = {}) {
|
|
|
157
223
|
roomVersion: room.roomVersion,
|
|
158
224
|
...(models === undefined ? {} : { models }),
|
|
159
225
|
documents: named(current, taken),
|
|
226
|
+
facts: factsIn(room, taken),
|
|
160
227
|
revisions: named(room.revisions ?? {}, [...taken, ...targets]),
|
|
161
228
|
...(room.fileIds === undefined
|
|
162
229
|
? {}
|
|
163
230
|
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
231
|
+
...(room.created === undefined
|
|
232
|
+
? {}
|
|
233
|
+
: { created: named(room.created, [...taken, ...targets]) }),
|
|
164
234
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
165
235
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
236
|
+
...(opening ? foldersMoved(room, from) : {}),
|
|
166
237
|
removals: opening
|
|
167
238
|
? [
|
|
168
239
|
...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
|
|
@@ -172,30 +243,45 @@ export function createMemoryAdapter(options = {}) {
|
|
|
172
243
|
...(pageToken === undefined ? {} : { pageToken }),
|
|
173
244
|
};
|
|
174
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
|
+
}
|
|
175
266
|
function pageOf(conversation, after) {
|
|
176
267
|
const messages = conversation.messages ?? [];
|
|
177
|
-
const first = typeof after === 'string' ? messages.findIndex((message) => message.
|
|
268
|
+
const first = typeof after === 'string' ? messages.findIndex((message) => message.change > after) : 0;
|
|
178
269
|
const from = first === -1 ? messages.length : first;
|
|
179
270
|
const page = messages.slice(from, from + (historyPageSize ?? messages.length));
|
|
180
271
|
const last = page.at(-1);
|
|
181
272
|
return {
|
|
182
273
|
conversation: conversation.conversation,
|
|
183
274
|
messages: page,
|
|
184
|
-
...(last !== undefined && from + page.length < messages.length
|
|
185
|
-
? { next: last.position }
|
|
186
|
-
: {}),
|
|
275
|
+
...(last !== undefined && from + page.length < messages.length ? { next: last.change } : {}),
|
|
187
276
|
};
|
|
188
277
|
}
|
|
189
|
-
function historiesOf(
|
|
190
|
-
const asked = input?.conversations;
|
|
191
|
-
if (!Array.isArray(asked))
|
|
192
|
-
return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
|
|
278
|
+
function historiesOf(request) {
|
|
193
279
|
const histories = [];
|
|
194
|
-
for (const entry of
|
|
195
|
-
const conversation =
|
|
280
|
+
for (const entry of request.conversations) {
|
|
281
|
+
const conversation = scripted.get(entry.conversation);
|
|
196
282
|
if (conversation === undefined)
|
|
197
283
|
continue;
|
|
198
|
-
const outcome = conversation.outcomes?.
|
|
284
|
+
const outcome = conversation.outcomes?.history;
|
|
199
285
|
if (outcome !== undefined)
|
|
200
286
|
return outcome;
|
|
201
287
|
histories.push(pageOf(conversation, entry.after));
|
|
@@ -206,15 +292,22 @@ export function createMemoryAdapter(options = {}) {
|
|
|
206
292
|
function conversationAction(request) {
|
|
207
293
|
const name = request.name;
|
|
208
294
|
const input = (request.input ?? {});
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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;
|
|
212
305
|
issued += 1;
|
|
213
306
|
const conversation = `conversation-${issued}`;
|
|
214
307
|
scripted.set(conversation, { conversation });
|
|
215
|
-
return { kind: 'action', result: { conversation } };
|
|
308
|
+
return first({ kind: 'action', result: { conversation_id: conversation } });
|
|
216
309
|
}
|
|
217
|
-
const named = typeof input.
|
|
310
|
+
const named = typeof input.conversation_id === 'string' ? input.conversation_id : '';
|
|
218
311
|
const conversation = scripted.get(named);
|
|
219
312
|
if (conversation === undefined) {
|
|
220
313
|
return {
|
|
@@ -227,34 +320,34 @@ export function createMemoryAdapter(options = {}) {
|
|
|
227
320
|
const outcome = conversation.outcomes?.[name];
|
|
228
321
|
if (outcome !== undefined)
|
|
229
322
|
return outcome;
|
|
230
|
-
if (name === '
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
if (answered !== undefined)
|
|
234
|
-
return { kind: 'action', result: { turn: answered } };
|
|
323
|
+
if (name === 'conversations/send') {
|
|
324
|
+
if (repeated !== undefined)
|
|
325
|
+
return repeated;
|
|
235
326
|
issued += 1;
|
|
236
|
-
|
|
237
|
-
unsealed.set(turn, named);
|
|
238
|
-
if (operation !== null)
|
|
239
|
-
sentTurns.set(operation, turn);
|
|
240
|
-
return { kind: 'action', result: { turn } };
|
|
327
|
+
return first({ kind: 'action', result: { message_id: `turn-${issued}` } });
|
|
241
328
|
}
|
|
242
|
-
if (name === '
|
|
243
|
-
const turn = typeof input.turn === 'string' ? input.turn : '';
|
|
244
|
-
if (sealed.has(turn) || !unsealed.has(turn)) {
|
|
245
|
-
return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
|
|
246
|
-
}
|
|
247
|
-
unsealed.delete(turn);
|
|
248
|
-
return { kind: 'action', result: { turn, cancelled: true } };
|
|
249
|
-
}
|
|
250
|
-
if (name === 'conversation.delete')
|
|
329
|
+
if (name === 'conversations/delete')
|
|
251
330
|
scripted.delete(named);
|
|
252
|
-
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
|
+
};
|
|
253
343
|
}
|
|
254
344
|
function announceList() {
|
|
255
|
-
const entries = [...scripted.values()].flatMap(({ conversation, listed }) => listed === undefined
|
|
256
|
-
|
|
257
|
-
|
|
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
|
+
}
|
|
258
351
|
}
|
|
259
352
|
function discovery() {
|
|
260
353
|
return {
|
|
@@ -266,8 +359,42 @@ export function createMemoryAdapter(options = {}) {
|
|
|
266
359
|
...(options.member === undefined ? {} : { member: options.member }),
|
|
267
360
|
};
|
|
268
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
|
+
}
|
|
269
395
|
return {
|
|
270
|
-
...(options.
|
|
396
|
+
...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
|
|
397
|
+
...(options.typedPaths === undefined ? {} : { typedPaths: options.typedPaths }),
|
|
271
398
|
setRooms(next) {
|
|
272
399
|
rooms = [...next];
|
|
273
400
|
retain(rooms);
|
|
@@ -276,33 +403,37 @@ export function createMemoryAdapter(options = {}) {
|
|
|
276
403
|
scriptConversations(next);
|
|
277
404
|
},
|
|
278
405
|
open() {
|
|
406
|
+
carried.clear();
|
|
279
407
|
announceList();
|
|
280
|
-
|
|
281
|
-
observer({ kind: 'opened' });
|
|
408
|
+
opened(emitAll);
|
|
282
409
|
},
|
|
283
|
-
close({ revoked = false, lost = !revoked } = {}) {
|
|
284
|
-
|
|
285
|
-
|
|
410
|
+
close({ revoked = false, lost = !revoked, authorityChanged = false } = {}) {
|
|
411
|
+
openings += 1;
|
|
412
|
+
carried.clear();
|
|
413
|
+
emitAll({ kind: 'closed', revoked, lost, authorityChanged });
|
|
286
414
|
},
|
|
287
415
|
expire(locators) {
|
|
288
416
|
expiring = [...locators];
|
|
289
417
|
},
|
|
290
|
-
notifyRoomVersion({ locator
|
|
291
|
-
|
|
292
|
-
observer({ kind: 'room-version', locator, roomVersion });
|
|
418
|
+
notifyRoomVersion({ locator }) {
|
|
419
|
+
carry(locator);
|
|
293
420
|
},
|
|
294
|
-
notifyAuthorityChanged(
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
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
|
+
});
|
|
300
435
|
},
|
|
301
436
|
notifyConversation(event) {
|
|
302
|
-
if (event.kind === 'accepted-message') {
|
|
303
|
-
sealed.add(event.message.turn);
|
|
304
|
-
unsealed.delete(event.message.turn);
|
|
305
|
-
}
|
|
306
437
|
for (const listener of listeners)
|
|
307
438
|
listener(event);
|
|
308
439
|
},
|
|
@@ -311,21 +442,31 @@ export function createMemoryAdapter(options = {}) {
|
|
|
311
442
|
observer(mode);
|
|
312
443
|
},
|
|
313
444
|
heldRooms() {
|
|
314
|
-
return
|
|
445
|
+
return [...carried.keys()].sort();
|
|
315
446
|
},
|
|
316
447
|
replicatedConversations() {
|
|
317
448
|
return replicated;
|
|
318
449
|
},
|
|
450
|
+
heldConversationCursor() {
|
|
451
|
+
return heldCursor;
|
|
452
|
+
},
|
|
319
453
|
conversations: {
|
|
320
454
|
replicate(next) {
|
|
321
455
|
replicated = [...next];
|
|
322
456
|
},
|
|
457
|
+
hold(cursor) {
|
|
458
|
+
heldCursor = cursor;
|
|
459
|
+
},
|
|
323
460
|
observe(notify) {
|
|
324
461
|
listeners.add(notify);
|
|
325
462
|
return () => {
|
|
326
463
|
listeners.delete(notify);
|
|
327
464
|
};
|
|
328
465
|
},
|
|
466
|
+
history: (request) => Promise.resolve(historiesOf(request)),
|
|
467
|
+
...(options.agents === undefined
|
|
468
|
+
? {}
|
|
469
|
+
: { agents: () => Promise.resolve(structuredClone(options.agents)) }),
|
|
329
470
|
},
|
|
330
471
|
serviceMode: {
|
|
331
472
|
observe(notify) {
|
|
@@ -337,44 +478,46 @@ export function createMemoryAdapter(options = {}) {
|
|
|
337
478
|
},
|
|
338
479
|
roomStream: {
|
|
339
480
|
hold(asked) {
|
|
340
|
-
|
|
341
|
-
const
|
|
342
|
-
expiring = [];
|
|
343
|
-
const moved = asked.flatMap((room) => {
|
|
481
|
+
const named = asked.map((room) => room.locator);
|
|
482
|
+
const unknown = asked.flatMap((room) => {
|
|
344
483
|
const current = rooms.find((entry) => entry.locator === room.locator);
|
|
484
|
+
const version = room.roomVersion;
|
|
345
485
|
return current === undefined ||
|
|
346
|
-
|
|
347
|
-
|
|
486
|
+
(version !== null &&
|
|
487
|
+
(current.roomVersion === version || served.get(room.locator)?.has(version) === true))
|
|
348
488
|
? []
|
|
349
|
-
: [
|
|
489
|
+
: [room.locator];
|
|
350
490
|
});
|
|
491
|
+
const expired = [
|
|
492
|
+
...new Set([...expiring.filter((locator) => named.includes(locator)), ...unknown]),
|
|
493
|
+
];
|
|
494
|
+
expiring = expiring.filter((locator) => !named.includes(locator));
|
|
351
495
|
queueMicrotask(() => {
|
|
352
|
-
for (const
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
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
|
+
}
|
|
356
503
|
}
|
|
504
|
+
emitAll({ kind: 'caught-up', expired });
|
|
357
505
|
});
|
|
358
506
|
},
|
|
359
|
-
reopen() {
|
|
360
|
-
queueMicrotask(() => {
|
|
361
|
-
for (const observer of observers) {
|
|
362
|
-
observer({ kind: 'closed', revoked: false, lost: false });
|
|
363
|
-
}
|
|
364
|
-
});
|
|
365
|
-
},
|
|
366
|
-
published() { },
|
|
367
507
|
observe(notify) {
|
|
368
508
|
observers.add(notify);
|
|
369
509
|
queueMicrotask(() => {
|
|
370
510
|
if (!observers.has(notify))
|
|
371
511
|
return;
|
|
372
512
|
if (options.unopened === true) {
|
|
373
|
-
notify({ kind: 'closed', revoked: false, lost: true });
|
|
513
|
+
notify({ kind: 'closed', revoked: false, lost: true, authorityChanged: false });
|
|
374
514
|
return;
|
|
375
515
|
}
|
|
376
516
|
announceList();
|
|
377
|
-
|
|
517
|
+
opened((event) => {
|
|
518
|
+
if (observers.has(notify))
|
|
519
|
+
notify(event);
|
|
520
|
+
});
|
|
378
521
|
});
|
|
379
522
|
return () => {
|
|
380
523
|
observers.delete(notify);
|
|
@@ -391,12 +534,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
391
534
|
return resolveScript(scripts.authorize, () => ({}), undefined);
|
|
392
535
|
},
|
|
393
536
|
async discover(_authorization) {
|
|
394
|
-
return
|
|
395
|
-
if (answer.kind === 'discovery')
|
|
396
|
-
for (const room of answer.rooms)
|
|
397
|
-
note(room.locator, room);
|
|
398
|
-
return answer;
|
|
399
|
-
});
|
|
537
|
+
return discovered();
|
|
400
538
|
},
|
|
401
539
|
reached,
|
|
402
540
|
follows(locator, roomVersion, next) {
|
|
@@ -453,7 +591,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
453
591
|
retryable: false,
|
|
454
592
|
affected: {},
|
|
455
593
|
};
|
|
456
|
-
}, 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
|
+
});
|
|
457
601
|
},
|
|
458
602
|
async history(_authorization, request) {
|
|
459
603
|
return resolveScript(scripts.history, () => {
|
|
@@ -469,35 +613,45 @@ export function createMemoryAdapter(options = {}) {
|
|
|
469
613
|
},
|
|
470
614
|
async binary(_authorization, request) {
|
|
471
615
|
return resolveScript(scripts.binary, () => {
|
|
472
|
-
if (request.kind === 'reference') {
|
|
473
|
-
return { kind: 'rejected', code: 'unscripted-binary', fields: {}, retryable: false };
|
|
474
|
-
}
|
|
475
616
|
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
476
617
|
if (room === undefined)
|
|
477
618
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
478
|
-
const blob = room
|
|
619
|
+
const blob = heldBlob(room, request.path);
|
|
479
620
|
return blob === undefined
|
|
480
|
-
? { kind: 'rejected', code: '
|
|
481
|
-
: { kind: 'binary', blob };
|
|
621
|
+
? { kind: 'rejected', code: 'not_found', fields: {}, retryable: false }
|
|
622
|
+
: { kind: 'binary', body: blob.stream(), mediaType: blob.type };
|
|
482
623
|
}, request);
|
|
483
624
|
},
|
|
484
625
|
async link(_authorization, request) {
|
|
485
|
-
return resolveScript(scripts.link, () =>
|
|
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);
|
|
486
638
|
},
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
return
|
|
495
|
-
|
|
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);
|
|
496
648
|
},
|
|
497
649
|
async action(_authorization, request) {
|
|
498
650
|
return resolveScript(scripts.action, () => {
|
|
499
|
-
if (request.name.startsWith('
|
|
651
|
+
if (request.name.startsWith('conversations/'))
|
|
500
652
|
return conversationAction(request);
|
|
653
|
+
if (request.name === 'agent-functions/decide')
|
|
654
|
+
return decided(request);
|
|
501
655
|
return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
|
|
502
656
|
}, request).then((answer) => {
|
|
503
657
|
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
|