@agentshouse/mdruntime 0.1.0-c8ca66ac9e99d → 0.1.0-c8e865ef64c82
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 +187 -97
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +6 -10
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +35 -41
- package/dist/binary.d.ts +0 -5
- package/dist/binary.d.ts.map +1 -1
- package/dist/binary.js +1 -1
- package/dist/bootstrap.d.ts +31 -11
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +311 -89
- 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 -63
- package/dist/change.d.ts +32 -1
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +14 -3
- package/dist/chat-types.d.ts +3 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +11 -0
- package/dist/client.d.ts +48 -29
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +133 -28
- package/dist/collection.d.ts +31 -9
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +49 -80
- 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 +8 -116
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +111 -2411
- 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 +147 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +258 -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 +83 -45
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +1105 -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 +197 -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 +28 -3
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +170 -25
- package/dist/index.d.ts +41 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -2
- 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 +215 -0
- package/dist/memory.d.ts +24 -6
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +291 -101
- package/dist/messages.d.ts +56 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +158 -0
- package/dist/model.d.ts +11 -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 +24 -5
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +135 -28
- 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 +60 -8
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +64 -0
- package/dist/overlay.d.ts +8 -4
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +136 -192
- 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 +49 -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 +450 -0
- package/dist/reach.d.ts +21 -7
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +343 -98
- 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 +49 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +27 -0
- package/dist/reads.d.ts +39 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +178 -0
- package/dist/recovery.d.ts +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 -53
- package/dist/refusal.d.ts +5 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +55 -0
- package/dist/replica.d.ts +50 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +339 -162
- package/dist/retried.d.ts +30 -0
- package/dist/retried.d.ts.map +1 -0
- package/dist/retried.js +72 -0
- package/dist/room-draft.d.ts +39 -10
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +196 -120
- 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 +30 -37
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +60 -128
- 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 +42 -43
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +800 -259
- package/dist/saves.d.ts +32 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +410 -0
- package/dist/search.d.ts +15 -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 +302 -0
- package/dist/socket/admission.d.ts +7 -0
- package/dist/socket/admission.d.ts.map +1 -0
- package/dist/socket/admission.js +39 -0
- package/dist/socket/answers.d.ts +6 -0
- package/dist/socket/answers.d.ts.map +1 -0
- package/dist/socket/answers.js +20 -0
- package/dist/socket/lanes.d.ts +28 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +103 -0
- package/dist/socket/reads.d.ts +10 -0
- package/dist/socket/reads.d.ts.map +1 -0
- package/dist/socket/reads.js +31 -0
- package/dist/socket/session.d.ts +38 -0
- package/dist/socket/session.d.ts.map +1 -0
- package/dist/socket/session.js +23 -0
- package/dist/socket.d.ts +67 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +164 -0
- package/dist/source.d.ts +54 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +82 -0
- package/dist/status.d.ts +5 -2
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +3 -7
- package/dist/store/installs.d.ts +30 -0
- package/dist/store/installs.d.ts.map +1 -0
- package/dist/store/installs.js +34 -0
- package/dist/store/readiness.d.ts +10 -0
- package/dist/store/readiness.d.ts.map +1 -0
- package/dist/store/readiness.js +52 -0
- package/dist/store/records.d.ts +215 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +439 -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 -119
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +158 -522
- 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 +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 +415 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +761 -0
- package/dist/tallies.d.ts +18 -0
- package/dist/tallies.d.ts.map +1 -0
- package/dist/tallies.js +128 -0
- package/dist/transfer.d.ts +0 -5
- package/dist/transfer.d.ts.map +1 -1
- package/dist/turn.d.ts +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 +104 -0
- package/dist/windows.d.ts +11 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +16 -0
- package/dist/wire.d.ts +229 -36
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +76 -33
- package/package.json +23 -19
- package/AGENTS.md +0 -299
- package/dist/attempt.d.ts +0 -16
- package/dist/attempt.d.ts.map +0 -1
- package/dist/attempt.js +0 -70
- package/dist/chat/acts.d.ts +0 -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 -26
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -62
- package/dist/chat/markdown.d.ts +0 -20
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -188
- package/dist/chat/message.d.ts +0 -6
- package/dist/chat/message.d.ts.map +0 -1
- package/dist/chat/message.js +0 -192
- package/dist/chat/messages.d.ts +0 -21
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -151
- package/dist/chat/name.d.ts +0 -6
- package/dist/chat/name.d.ts.map +0 -1
- package/dist/chat/name.js +0 -37
- package/dist/chat/opened.d.ts +0 -11
- package/dist/chat/opened.d.ts.map +0 -1
- package/dist/chat/opened.js +0 -17
- package/dist/chat/overlay.d.ts +0 -31
- package/dist/chat/overlay.d.ts.map +0 -1
- package/dist/chat/overlay.js +0 -97
- package/dist/chat/parts.d.ts +0 -57
- package/dist/chat/parts.d.ts.map +0 -1
- package/dist/chat/parts.js +0 -119
- package/dist/chat/process.d.ts +0 -20
- package/dist/chat/process.d.ts.map +0 -1
- package/dist/chat/process.js +0 -32
- package/dist/chat/provider.d.ts +0 -63
- package/dist/chat/provider.d.ts.map +0 -1
- package/dist/chat/provider.js +0 -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 -440
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) {
|
|
@@ -120,23 +173,43 @@ export function createMemoryAdapter(options = {}) {
|
|
|
120
173
|
roomVersion: room.roomVersion,
|
|
121
174
|
...(opening ? { models: modelsOf(room) } : {}),
|
|
122
175
|
documents: named(room.documents ?? {}, taken),
|
|
176
|
+
facts: factsIn(room, taken),
|
|
123
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
185
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
186
|
+
...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
|
|
126
187
|
...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
|
|
127
188
|
};
|
|
128
189
|
}
|
|
129
|
-
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) {
|
|
130
201
|
const current = room.documents ?? {};
|
|
131
202
|
const previous = from.documents ?? {};
|
|
132
203
|
const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
|
|
133
204
|
const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
|
|
134
205
|
const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
|
|
206
|
+
room.fileIds?.[path] !== from.fileIds?.[path] ||
|
|
207
|
+
room.created?.[path] !== from.created?.[path] ||
|
|
135
208
|
!sameChange(room.changes?.[path], from.changes?.[path]);
|
|
136
209
|
const changed = Object.keys(current)
|
|
137
210
|
.filter((path) => current[path] !== previous[path] || headMoved(path))
|
|
138
211
|
.sort();
|
|
139
|
-
const size = pageSize ?? changed.length;
|
|
212
|
+
const size = whole ? changed.length : (pageSize ?? changed.length);
|
|
140
213
|
const taken = changed.slice(at, at + size);
|
|
141
214
|
const next = at + taken.length;
|
|
142
215
|
const opening = at === 0;
|
|
@@ -152,9 +225,17 @@ export function createMemoryAdapter(options = {}) {
|
|
|
152
225
|
roomVersion: room.roomVersion,
|
|
153
226
|
...(models === undefined ? {} : { models }),
|
|
154
227
|
documents: named(current, taken),
|
|
228
|
+
facts: factsIn(room, taken),
|
|
155
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]) }),
|
|
156
236
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
157
237
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
238
|
+
...(opening ? foldersMoved(room, from) : {}),
|
|
158
239
|
removals: opening
|
|
159
240
|
? [
|
|
160
241
|
...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
|
|
@@ -164,30 +245,45 @@ export function createMemoryAdapter(options = {}) {
|
|
|
164
245
|
...(pageToken === undefined ? {} : { pageToken }),
|
|
165
246
|
};
|
|
166
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
|
+
}
|
|
167
268
|
function pageOf(conversation, after) {
|
|
168
269
|
const messages = conversation.messages ?? [];
|
|
169
|
-
const first = typeof after === 'string' ? messages.findIndex((message) => message.
|
|
270
|
+
const first = typeof after === 'string' ? messages.findIndex((message) => message.change > after) : 0;
|
|
170
271
|
const from = first === -1 ? messages.length : first;
|
|
171
272
|
const page = messages.slice(from, from + (historyPageSize ?? messages.length));
|
|
172
273
|
const last = page.at(-1);
|
|
173
274
|
return {
|
|
174
275
|
conversation: conversation.conversation,
|
|
175
276
|
messages: page,
|
|
176
|
-
...(last !== undefined && from + page.length < messages.length
|
|
177
|
-
? { next: last.position }
|
|
178
|
-
: {}),
|
|
277
|
+
...(last !== undefined && from + page.length < messages.length ? { next: last.change } : {}),
|
|
179
278
|
};
|
|
180
279
|
}
|
|
181
|
-
function historiesOf(
|
|
182
|
-
const asked = input?.conversations;
|
|
183
|
-
if (!Array.isArray(asked))
|
|
184
|
-
return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
|
|
280
|
+
function historiesOf(request) {
|
|
185
281
|
const histories = [];
|
|
186
|
-
for (const entry of
|
|
187
|
-
const conversation =
|
|
282
|
+
for (const entry of request.conversations) {
|
|
283
|
+
const conversation = scripted.get(entry.conversation);
|
|
188
284
|
if (conversation === undefined)
|
|
189
285
|
continue;
|
|
190
|
-
const outcome = conversation.outcomes?.
|
|
286
|
+
const outcome = conversation.outcomes?.history;
|
|
191
287
|
if (outcome !== undefined)
|
|
192
288
|
return outcome;
|
|
193
289
|
histories.push(pageOf(conversation, entry.after));
|
|
@@ -198,15 +294,22 @@ export function createMemoryAdapter(options = {}) {
|
|
|
198
294
|
function conversationAction(request) {
|
|
199
295
|
const name = request.name;
|
|
200
296
|
const input = (request.input ?? {});
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
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;
|
|
204
307
|
issued += 1;
|
|
205
308
|
const conversation = `conversation-${issued}`;
|
|
206
309
|
scripted.set(conversation, { conversation });
|
|
207
|
-
return { kind: 'action', result: { conversation } };
|
|
310
|
+
return first({ kind: 'action', result: { conversation_id: conversation } });
|
|
208
311
|
}
|
|
209
|
-
const named = typeof input.
|
|
312
|
+
const named = typeof input.conversation_id === 'string' ? input.conversation_id : '';
|
|
210
313
|
const conversation = scripted.get(named);
|
|
211
314
|
if (conversation === undefined) {
|
|
212
315
|
return {
|
|
@@ -219,28 +322,41 @@ export function createMemoryAdapter(options = {}) {
|
|
|
219
322
|
const outcome = conversation.outcomes?.[name];
|
|
220
323
|
if (outcome !== undefined)
|
|
221
324
|
return outcome;
|
|
222
|
-
if (name === '
|
|
325
|
+
if (name === 'conversations/send') {
|
|
326
|
+
if (repeated !== undefined)
|
|
327
|
+
return repeated;
|
|
223
328
|
issued += 1;
|
|
224
|
-
|
|
225
|
-
unsealed.set(turn, named);
|
|
226
|
-
return { kind: 'action', result: { turn } };
|
|
329
|
+
return first({ kind: 'action', result: { message_id: `turn-${issued}` } });
|
|
227
330
|
}
|
|
228
|
-
if (name === '
|
|
229
|
-
const turn = typeof input.turn === 'string' ? input.turn : '';
|
|
230
|
-
if (sealed.has(turn) || !unsealed.has(turn)) {
|
|
231
|
-
return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
|
|
232
|
-
}
|
|
233
|
-
unsealed.delete(turn);
|
|
234
|
-
return { kind: 'action', result: { turn, cancelled: true } };
|
|
235
|
-
}
|
|
236
|
-
if (name === 'conversation.delete')
|
|
331
|
+
if (name === 'conversations/delete')
|
|
237
332
|
scripted.delete(named);
|
|
238
|
-
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
|
+
};
|
|
239
345
|
}
|
|
240
346
|
function announceList() {
|
|
241
|
-
const entries = [...scripted.values()].flatMap(({ conversation, listed }) => listed === undefined
|
|
242
|
-
|
|
243
|
-
|
|
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
|
+
}
|
|
244
360
|
}
|
|
245
361
|
function discovery() {
|
|
246
362
|
return {
|
|
@@ -252,7 +368,42 @@ export function createMemoryAdapter(options = {}) {
|
|
|
252
368
|
...(options.member === undefined ? {} : { member: options.member }),
|
|
253
369
|
};
|
|
254
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
|
+
}
|
|
255
404
|
return {
|
|
405
|
+
...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
|
|
406
|
+
...(options.typedPaths === undefined ? {} : { typedPaths: options.typedPaths }),
|
|
256
407
|
setRooms(next) {
|
|
257
408
|
rooms = [...next];
|
|
258
409
|
retain(rooms);
|
|
@@ -260,27 +411,41 @@ export function createMemoryAdapter(options = {}) {
|
|
|
260
411
|
setConversations(next) {
|
|
261
412
|
scriptConversations(next);
|
|
262
413
|
},
|
|
414
|
+
setAgents(next) {
|
|
415
|
+
agents = structuredClone(next);
|
|
416
|
+
},
|
|
263
417
|
open() {
|
|
418
|
+
carried.clear();
|
|
264
419
|
announceList();
|
|
265
|
-
|
|
266
|
-
observer({ kind: 'opened' });
|
|
420
|
+
opened(emitAll);
|
|
267
421
|
},
|
|
268
|
-
close(revoked = false) {
|
|
269
|
-
|
|
270
|
-
|
|
422
|
+
close({ revoked = false, lost = !revoked, authorityChanged = false } = {}) {
|
|
423
|
+
openings += 1;
|
|
424
|
+
carried.clear();
|
|
425
|
+
emitAll({ kind: 'closed', revoked, lost, authorityChanged });
|
|
271
426
|
},
|
|
272
427
|
expire(locators) {
|
|
273
428
|
expiring = [...locators];
|
|
274
429
|
},
|
|
275
|
-
notifyRoomVersion({ locator
|
|
276
|
-
|
|
277
|
-
|
|
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
|
+
});
|
|
278
447
|
},
|
|
279
448
|
notifyConversation(event) {
|
|
280
|
-
if (event.kind === 'accepted-message') {
|
|
281
|
-
sealed.add(event.message.turn);
|
|
282
|
-
unsealed.delete(event.message.turn);
|
|
283
|
-
}
|
|
284
449
|
for (const listener of listeners)
|
|
285
450
|
listener(event);
|
|
286
451
|
},
|
|
@@ -289,21 +454,28 @@ export function createMemoryAdapter(options = {}) {
|
|
|
289
454
|
observer(mode);
|
|
290
455
|
},
|
|
291
456
|
heldRooms() {
|
|
292
|
-
return
|
|
457
|
+
return [...carried.keys()].sort();
|
|
293
458
|
},
|
|
294
459
|
replicatedConversations() {
|
|
295
460
|
return replicated;
|
|
296
461
|
},
|
|
462
|
+
heldConversationCursor() {
|
|
463
|
+
return heldCursor;
|
|
464
|
+
},
|
|
297
465
|
conversations: {
|
|
298
466
|
replicate(next) {
|
|
299
467
|
replicated = [...next];
|
|
300
468
|
},
|
|
469
|
+
hold(cursor) {
|
|
470
|
+
heldCursor = cursor;
|
|
471
|
+
},
|
|
301
472
|
observe(notify) {
|
|
302
473
|
listeners.add(notify);
|
|
303
474
|
return () => {
|
|
304
475
|
listeners.delete(notify);
|
|
305
476
|
};
|
|
306
477
|
},
|
|
478
|
+
history: (request) => Promise.resolve(historiesOf(request)),
|
|
307
479
|
},
|
|
308
480
|
serviceMode: {
|
|
309
481
|
observe(notify) {
|
|
@@ -315,29 +487,30 @@ export function createMemoryAdapter(options = {}) {
|
|
|
315
487
|
},
|
|
316
488
|
roomStream: {
|
|
317
489
|
hold(asked) {
|
|
318
|
-
|
|
319
|
-
const
|
|
320
|
-
expiring = [];
|
|
321
|
-
const moved = asked.flatMap((room) => {
|
|
490
|
+
const named = asked.map((room) => room.locator);
|
|
491
|
+
const unknown = asked.flatMap((room) => {
|
|
322
492
|
const current = rooms.find((entry) => entry.locator === room.locator);
|
|
493
|
+
const version = room.roomVersion;
|
|
323
494
|
return current === undefined ||
|
|
324
|
-
|
|
325
|
-
|
|
495
|
+
(version !== null &&
|
|
496
|
+
(current.roomVersion === version || served.get(room.locator)?.has(version) === true))
|
|
326
497
|
? []
|
|
327
|
-
: [
|
|
498
|
+
: [room.locator];
|
|
328
499
|
});
|
|
500
|
+
const expired = [
|
|
501
|
+
...new Set([...expiring.filter((locator) => named.includes(locator)), ...unknown]),
|
|
502
|
+
];
|
|
503
|
+
expiring = expiring.filter((locator) => !named.includes(locator));
|
|
329
504
|
queueMicrotask(() => {
|
|
330
|
-
for (const
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
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
|
+
}
|
|
334
512
|
}
|
|
335
|
-
|
|
336
|
-
},
|
|
337
|
-
reopen() {
|
|
338
|
-
queueMicrotask(() => {
|
|
339
|
-
for (const observer of observers)
|
|
340
|
-
observer({ kind: 'closed', revoked: false });
|
|
513
|
+
emitAll({ kind: 'caught-up', expired });
|
|
341
514
|
});
|
|
342
515
|
},
|
|
343
516
|
observe(notify) {
|
|
@@ -346,11 +519,14 @@ export function createMemoryAdapter(options = {}) {
|
|
|
346
519
|
if (!observers.has(notify))
|
|
347
520
|
return;
|
|
348
521
|
if (options.unopened === true) {
|
|
349
|
-
notify({ kind: 'closed', revoked: false });
|
|
522
|
+
notify({ kind: 'closed', revoked: false, lost: true, authorityChanged: false });
|
|
350
523
|
return;
|
|
351
524
|
}
|
|
352
525
|
announceList();
|
|
353
|
-
|
|
526
|
+
opened((event) => {
|
|
527
|
+
if (observers.has(notify))
|
|
528
|
+
notify(event);
|
|
529
|
+
});
|
|
354
530
|
});
|
|
355
531
|
return () => {
|
|
356
532
|
observers.delete(notify);
|
|
@@ -367,12 +543,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
367
543
|
return resolveScript(scripts.authorize, () => ({}), undefined);
|
|
368
544
|
},
|
|
369
545
|
async discover(_authorization) {
|
|
370
|
-
return
|
|
371
|
-
if (answer.kind === 'discovery')
|
|
372
|
-
for (const room of answer.rooms)
|
|
373
|
-
note(room.locator, room);
|
|
374
|
-
return answer;
|
|
375
|
-
});
|
|
546
|
+
return discovered();
|
|
376
547
|
},
|
|
377
548
|
reached,
|
|
378
549
|
follows(locator, roomVersion, next) {
|
|
@@ -429,7 +600,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
429
600
|
retryable: false,
|
|
430
601
|
affected: {},
|
|
431
602
|
};
|
|
432
|
-
}, 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
|
+
});
|
|
433
610
|
},
|
|
434
611
|
async history(_authorization, request) {
|
|
435
612
|
return resolveScript(scripts.history, () => {
|
|
@@ -445,32 +622,45 @@ export function createMemoryAdapter(options = {}) {
|
|
|
445
622
|
},
|
|
446
623
|
async binary(_authorization, request) {
|
|
447
624
|
return resolveScript(scripts.binary, () => {
|
|
448
|
-
if (request.kind === 'reference') {
|
|
449
|
-
return { kind: 'rejected', code: 'unscripted-binary', fields: {}, retryable: false };
|
|
450
|
-
}
|
|
451
625
|
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
452
626
|
if (room === undefined)
|
|
453
627
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
454
|
-
const blob = room
|
|
628
|
+
const blob = heldBlob(room, request.path);
|
|
455
629
|
return blob === undefined
|
|
456
|
-
? { kind: 'rejected', code: '
|
|
457
|
-
: { kind: 'binary', blob };
|
|
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) };
|
|
458
646
|
}, request);
|
|
459
647
|
},
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
return
|
|
468
|
-
|
|
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);
|
|
469
657
|
},
|
|
470
658
|
async action(_authorization, request) {
|
|
471
659
|
return resolveScript(scripts.action, () => {
|
|
472
|
-
if (request.name.startsWith('
|
|
660
|
+
if (request.name.startsWith('conversations/'))
|
|
473
661
|
return conversationAction(request);
|
|
662
|
+
if (request.name === 'agent-functions/decide')
|
|
663
|
+
return decided(request);
|
|
474
664
|
return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
|
|
475
665
|
}, request).then((answer) => {
|
|
476
666
|
if (answer.kind === 'action' && answer.at !== undefined)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { AcceptedMessage } from './adapter.js';
|
|
2
|
+
import type { Connection } from './tables.js';
|
|
3
|
+
export declare const MESSAGE_TABLES: readonly string[];
|
|
4
|
+
export declare const ROWS = "WITH chosen AS (\n SELECT listed.value AS conversation,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'assistant' ORDER BY position DESC, identity DESC LIMIT 1) AS answer,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND text <> '' ORDER BY position DESC, identity DESC LIMIT 1) AS said,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' ORDER BY position, identity LIMIT 1) AS opened,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' AND json_extract(message, '$.waiting') = 1 ORDER BY position, identity LIMIT 1) AS asking\n FROM json_each(?) AS listed\n )\n SELECT chosen.conversation AS conversation,\n substr(said.text, 1, 512) AS said_text,\n json_extract(said.message, '$.role') AS said_role,\n json_extract(said.message, '$.accepted_at') AS said_at,\n substr(json_extract(answer.message, '$.failure'), 1, 512) AS failure,\n json_extract(opened.message, '$.source') AS opened_source,\n json_extract(opened.message, '$.sender') AS opened_sender,\n asking.identity AS asking_identity,\n asking.text AS asking_text,\n json_extract(asking.message, '$.accepted_at') AS asking_at,\n json_extract(asking.message, '$.source') AS asking_source,\n json_extract(asking.message, '$.sender') AS asking_sender\n FROM chosen\n LEFT JOIN conversation_messages said ON said.id = chosen.said\n LEFT JOIN conversation_messages answer ON answer.id = chosen.answer\n LEFT JOIN conversation_messages opened ON opened.id = chosen.opened\n LEFT JOIN conversation_messages asking ON asking.id = chosen.asking";
|
|
5
|
+
export type HeldConversation = {
|
|
6
|
+
readonly conversation: string;
|
|
7
|
+
readonly read: string | null | undefined;
|
|
8
|
+
readonly partial: boolean;
|
|
9
|
+
};
|
|
10
|
+
export type MessageWindow = {
|
|
11
|
+
readonly messages: AcceptedMessage[];
|
|
12
|
+
readonly more: boolean;
|
|
13
|
+
};
|
|
14
|
+
export type HeldSource = {
|
|
15
|
+
readonly source: unknown;
|
|
16
|
+
readonly sender: string | null;
|
|
17
|
+
};
|
|
18
|
+
export type HeldRow = {
|
|
19
|
+
readonly conversation: string;
|
|
20
|
+
readonly said: {
|
|
21
|
+
readonly text: string;
|
|
22
|
+
readonly role: string | null;
|
|
23
|
+
readonly at: string | null;
|
|
24
|
+
} | null;
|
|
25
|
+
readonly failure: string | null;
|
|
26
|
+
readonly opened: HeldSource | null;
|
|
27
|
+
readonly asking: (HeldSource & {
|
|
28
|
+
readonly identity: string;
|
|
29
|
+
readonly text: string;
|
|
30
|
+
readonly at: string | null;
|
|
31
|
+
}) | null;
|
|
32
|
+
};
|
|
33
|
+
export type ConversationFact = 'openedTurn' | 'dismissedSuggestion';
|
|
34
|
+
export type HeldFact = {
|
|
35
|
+
readonly conversation: string;
|
|
36
|
+
readonly name: ConversationFact;
|
|
37
|
+
readonly value: string;
|
|
38
|
+
};
|
|
39
|
+
export type ConversationWrite = {
|
|
40
|
+
readonly conversation: string;
|
|
41
|
+
readonly messages: readonly AcceptedMessage[];
|
|
42
|
+
readonly read?: {
|
|
43
|
+
readonly at: string | null;
|
|
44
|
+
readonly partial: boolean;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
export declare function heldConversations(connection: Connection, conversations: readonly string[] | null): HeldConversation[];
|
|
48
|
+
export declare function keptMessages(connection: Connection, { conversation, messages, read }: ConversationWrite): null;
|
|
49
|
+
export declare function messageWindow(connection: Connection, conversation: string, limit: number, before: readonly [string, string] | null, phrase: string | null): MessageWindow;
|
|
50
|
+
export declare function messageCount(connection: Connection, conversation: string, phrase: string | null): number;
|
|
51
|
+
export declare function conversationRows(connection: Connection, conversations: readonly string[]): HeldRow[];
|
|
52
|
+
export declare function turnArrived(connection: Connection, conversation: string, turn: string): boolean;
|
|
53
|
+
export declare function conversationFacts(connection: Connection): HeldFact[];
|
|
54
|
+
export declare function keptFact(connection: Connection, { conversation, name, value }: HeldFact): null;
|
|
55
|
+
export declare function forgottenConversations(connection: Connection): void;
|
|
56
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
|