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