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