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