@agentshouse/mdruntime 0.1.0-cc7bd7a53214e → 0.1.0-ccbe92df1c4f6
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/AGENTS.md +302 -200
- package/README.md +22 -11
- package/dist/adapter.d.ts +172 -49
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +1 -9
- package/dist/attached-model.d.ts +14 -0
- package/dist/attached-model.d.ts.map +1 -0
- package/dist/attached-model.js +57 -0
- package/dist/attempt.d.ts +16 -0
- package/dist/attempt.d.ts.map +1 -0
- package/dist/attempt.js +70 -0
- 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 +39 -6
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +188 -45
- package/dist/chain.d.ts +11 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +64 -0
- package/dist/change-set.d.ts +9 -14
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +11 -56
- package/dist/change.d.ts +45 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +34 -0
- package/dist/chat/acts.d.ts +33 -0
- package/dist/chat/acts.d.ts.map +1 -0
- package/dist/chat/acts.js +36 -0
- package/dist/chat/context.d.ts +3 -0
- package/dist/chat/context.d.ts.map +1 -0
- package/dist/chat/context.js +10 -0
- package/dist/chat/earlier.d.ts +10 -0
- package/dist/chat/earlier.d.ts.map +1 -0
- package/dist/chat/earlier.js +54 -0
- package/dist/chat/house.d.ts +25 -0
- package/dist/chat/house.d.ts.map +1 -0
- package/dist/chat/house.js +38 -0
- package/dist/chat/input.d.ts +11 -0
- package/dist/chat/input.d.ts.map +1 -0
- package/dist/chat/input.js +92 -0
- package/dist/chat/kit.d.ts +61 -0
- package/dist/chat/kit.d.ts.map +1 -0
- package/dist/chat/kit.js +123 -0
- package/dist/chat/lasting.d.ts +6 -0
- package/dist/chat/lasting.d.ts.map +1 -0
- package/dist/chat/lasting.js +19 -0
- package/dist/chat/list.d.ts +28 -0
- package/dist/chat/list.d.ts.map +1 -0
- package/dist/chat/list.js +103 -0
- package/dist/chat/markdown.d.ts +20 -0
- package/dist/chat/markdown.d.ts.map +1 -0
- package/dist/chat/markdown.js +229 -0
- package/dist/chat/message.d.ts +7 -0
- package/dist/chat/message.d.ts.map +1 -0
- package/dist/chat/message.js +254 -0
- package/dist/chat/messages.d.ts +35 -0
- package/dist/chat/messages.d.ts.map +1 -0
- package/dist/chat/messages.js +210 -0
- package/dist/chat/name.d.ts +7 -0
- package/dist/chat/name.d.ts.map +1 -0
- package/dist/chat/name.js +37 -0
- package/dist/chat/opened.d.ts +12 -0
- package/dist/chat/opened.d.ts.map +1 -0
- package/dist/chat/opened.js +19 -0
- package/dist/chat/overlay.d.ts +32 -0
- package/dist/chat/overlay.d.ts.map +1 -0
- package/dist/chat/overlay.js +103 -0
- package/dist/chat/parts.d.ts +58 -0
- package/dist/chat/parts.d.ts.map +1 -0
- package/dist/chat/parts.js +120 -0
- package/dist/chat/pieces.d.ts +62 -0
- package/dist/chat/pieces.d.ts.map +1 -0
- package/dist/chat/pieces.js +1110 -0
- package/dist/chat/process.d.ts +20 -0
- package/dist/chat/process.d.ts.map +1 -0
- package/dist/chat/process.js +32 -0
- package/dist/chat/provider.d.ts +70 -0
- package/dist/chat/provider.d.ts.map +1 -0
- package/dist/chat/provider.js +635 -0
- package/dist/chat/question.d.ts +9 -0
- package/dist/chat/question.d.ts.map +1 -0
- package/dist/chat/question.js +69 -0
- package/dist/chat/questions.d.ts +31 -0
- package/dist/chat/questions.d.ts.map +1 -0
- package/dist/chat/questions.js +111 -0
- package/dist/chat/read.d.ts +5 -0
- package/dist/chat/read.d.ts.map +1 -0
- package/dist/chat/read.js +13 -0
- package/dist/chat/ready.d.ts +37 -0
- package/dist/chat/ready.d.ts.map +1 -0
- package/dist/chat/ready.js +93 -0
- package/dist/chat/room-file.d.ts +8 -0
- package/dist/chat/room-file.d.ts.map +1 -0
- package/dist/chat/room-file.js +72 -0
- package/dist/chat/steady.d.ts +3 -0
- package/dist/chat/steady.d.ts.map +1 -0
- package/dist/chat/steady.js +26 -0
- package/dist/chat/style.d.ts +4 -0
- package/dist/chat/style.d.ts.map +1 -0
- package/dist/chat/style.js +307 -0
- package/dist/chat.d.ts +15 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +8 -0
- package/dist/client.d.ts +35 -14
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +108 -26
- package/dist/collection.d.ts +9 -13
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +47 -56
- package/dist/compile.d.ts +16 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +721 -0
- package/dist/connection.d.ts +61 -24
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +3786 -906
- package/dist/conversation.d.ts +56 -16
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +736 -242
- package/dist/digest.d.ts +7 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +113 -0
- package/dist/durability.d.ts +5 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +5 -0
- package/dist/entry.d.ts +19 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +151 -0
- package/dist/expectation.d.ts +21 -0
- package/dist/expectation.d.ts.map +1 -0
- package/dist/expectation.js +70 -0
- package/dist/failure.d.ts +13 -0
- package/dist/failure.d.ts.map +1 -0
- package/dist/failure.js +19 -0
- package/dist/fence.d.ts +6 -0
- package/dist/fence.d.ts.map +1 -0
- package/dist/fence.js +10 -0
- package/dist/file.d.ts +2 -10
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +3 -120
- package/dist/fulltext.d.ts +27 -0
- package/dist/fulltext.d.ts.map +1 -0
- package/dist/fulltext.js +368 -0
- package/dist/host.d.ts +15 -2
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +113 -30
- package/dist/identity.d.ts +4 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +16 -1
- package/dist/index.d.ts +20 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/live.d.ts +22 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +123 -0
- package/dist/memory.d.ts +21 -7
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +171 -47
- package/dist/messages.d.ts +28 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +90 -0
- package/dist/model.d.ts +17 -14
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +16 -4
- 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 +19 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +113 -12
- package/dist/open.d.ts +2 -0
- package/dist/open.d.ts.map +1 -0
- package/dist/open.js +1 -0
- package/dist/opened.d.ts +22 -0
- package/dist/opened.d.ts.map +1 -0
- package/dist/opened.js +107 -0
- package/dist/outcome.d.ts +62 -3
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +67 -1
- package/dist/overlay.d.ts +15 -5
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +136 -180
- package/dist/paths.d.ts +0 -1
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +0 -16
- package/dist/query.d.ts +65 -5
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +122 -40
- package/dist/reach.d.ts +11 -4
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +202 -73
- package/dist/react.d.ts +43 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +54 -0
- package/dist/readiness.d.ts +63 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +33 -0
- package/dist/reads.d.ts +11 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +100 -0
- package/dist/recovery.d.ts +25 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +198 -0
- package/dist/refresh.d.ts +19 -7
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +129 -53
- package/dist/replica.d.ts +60 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +319 -154
- package/dist/room-draft.d.ts +40 -9
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +153 -37
- package/dist/rows.d.ts +30 -34
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +168 -82
- package/dist/save.d.ts +72 -6
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +889 -178
- package/dist/search.d.ts +41 -29
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +37 -105
- package/dist/seed.d.ts +16 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +75 -0
- package/dist/shared.d.ts +16 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +431 -0
- package/dist/status.d.ts +6 -2
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +0 -8
- package/dist/store.d.ts +124 -58
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +359 -344
- package/dist/stored.d.ts +145 -0
- package/dist/stored.d.ts.map +1 -0
- package/dist/stored.js +567 -0
- package/dist/tables.d.ts +344 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +580 -0
- 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 +30 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +162 -0
- package/dist/windows.d.ts +22 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +89 -0
- package/dist/wire.d.ts +170 -45
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +69 -46
- package/dist/words.d.ts +19 -0
- package/dist/words.d.ts.map +1 -0
- package/dist/words.js +150 -0
- package/package.json +39 -9
- package/dist/attachment.d.ts +0 -3
- package/dist/attachment.d.ts.map +0 -1
- package/dist/attachment.js +0 -8
- package/dist/read-side.d.ts +0 -18
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -377
package/dist/memory.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import { ROOM_CONTRACT_VERSION, } from './adapter.js';
|
|
2
|
-
import { MD_MODEL } from './collection.js';
|
|
3
1
|
import { sameChange } from './overlay.js';
|
|
4
2
|
const FIXTURE_RETENTION = {
|
|
5
3
|
history: { kind: 'duration', seconds: 1 },
|
|
6
|
-
outcome:
|
|
4
|
+
outcome: 604_800,
|
|
7
5
|
refreshHorizon: 1,
|
|
8
6
|
};
|
|
9
7
|
function declaredRetention(value) {
|
|
@@ -15,6 +13,19 @@ function declaredRetention(value) {
|
|
|
15
13
|
}
|
|
16
14
|
throw new Error('history retention duration must be a finite positive number of seconds');
|
|
17
15
|
}
|
|
16
|
+
const MODEL_ABSENT = { kind: 'model-unavailable', reason: 'not-readable' };
|
|
17
|
+
function modelsOf(room) {
|
|
18
|
+
return {
|
|
19
|
+
collection: room.model ?? MODEL_ABSENT,
|
|
20
|
+
...(room.typedSelection === undefined
|
|
21
|
+
? {}
|
|
22
|
+
: { selection: room.selectionModel ?? MODEL_ABSENT }),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function changedModels(room, from) {
|
|
26
|
+
const now = modelsOf(room);
|
|
27
|
+
return JSON.stringify(now) === JSON.stringify(modelsOf(from)) ? undefined : now;
|
|
28
|
+
}
|
|
18
29
|
function named(source, paths) {
|
|
19
30
|
const taken = {};
|
|
20
31
|
for (const path of paths) {
|
|
@@ -31,8 +42,6 @@ async function resolveScript(answer, fallback, request) {
|
|
|
31
42
|
}
|
|
32
43
|
export function createMemoryAdapter(options = {}) {
|
|
33
44
|
let rooms = options.rooms === undefined ? [] : [...options.rooms];
|
|
34
|
-
const mdModel = options.mdModel ?? MD_MODEL;
|
|
35
|
-
const supportedVersions = options.supportedVersions ?? [ROOM_CONTRACT_VERSION];
|
|
36
45
|
const capabilities = options.capabilities ?? [];
|
|
37
46
|
const providerLimits = options.providerLimits ?? [];
|
|
38
47
|
const retention = declaredRetention(options.retention);
|
|
@@ -46,8 +55,10 @@ export function createMemoryAdapter(options = {}) {
|
|
|
46
55
|
const scripted = new Map();
|
|
47
56
|
const unsealed = new Map();
|
|
48
57
|
const sealed = new Set();
|
|
58
|
+
const sentTurns = new Map();
|
|
49
59
|
const historyPageSize = options.historyPageSize;
|
|
50
|
-
let
|
|
60
|
+
let held = [];
|
|
61
|
+
let expiring = [];
|
|
51
62
|
let replicated = [];
|
|
52
63
|
let issued = 0;
|
|
53
64
|
function scriptConversations(entries) {
|
|
@@ -89,37 +100,54 @@ export function createMemoryAdapter(options = {}) {
|
|
|
89
100
|
return {
|
|
90
101
|
name: room.name,
|
|
91
102
|
locator: room.locator,
|
|
103
|
+
handle: room.handle,
|
|
92
104
|
roomVersion: room.roomVersion,
|
|
93
105
|
operations: room.operations,
|
|
94
106
|
replica: room.replica,
|
|
95
|
-
attachedModel: room.attachedModel,
|
|
96
107
|
...(room.typedSelection === undefined ? {} : { typedSelection: room.typedSelection }),
|
|
97
108
|
providerOwnedPaths: room.providerOwnedPaths,
|
|
98
109
|
};
|
|
99
110
|
}
|
|
100
|
-
function page(room,
|
|
111
|
+
function page(room, after) {
|
|
101
112
|
const paths = Object.keys(room.documents ?? {}).sort();
|
|
113
|
+
const opening = after === undefined;
|
|
114
|
+
const from = opening ? 0 : paths.filter((path) => path <= after).length;
|
|
102
115
|
const size = pageSize ?? paths.length;
|
|
103
116
|
const taken = paths.slice(from, from + size);
|
|
104
117
|
const next = from + taken.length;
|
|
105
|
-
const targets =
|
|
118
|
+
const targets = opening ? Object.keys(room.binaryFiles ?? {}) : [];
|
|
106
119
|
return {
|
|
107
120
|
kind: 'bootstrap',
|
|
108
121
|
roomVersion: room.roomVersion,
|
|
122
|
+
...(opening ? { models: modelsOf(room) } : {}),
|
|
109
123
|
documents: named(room.documents ?? {}, taken),
|
|
110
|
-
revisions: named(room.revisions ?? {}, taken),
|
|
124
|
+
revisions: named(room.revisions ?? {}, [...taken, ...targets]),
|
|
125
|
+
...(room.fileIds === undefined
|
|
126
|
+
? {}
|
|
127
|
+
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
111
128
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
112
|
-
|
|
113
|
-
...(
|
|
114
|
-
...(next < paths.length ? { pageToken:
|
|
129
|
+
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
130
|
+
...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
|
|
131
|
+
...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function foldersMoved(room, from) {
|
|
135
|
+
const now = new Set(room.folders ?? []);
|
|
136
|
+
const before = new Set(from.folders ?? []);
|
|
137
|
+
const folders = [...now].filter((folder) => !before.has(folder)).sort();
|
|
138
|
+
const folderRemovals = [...before].filter((folder) => !now.has(folder)).sort();
|
|
139
|
+
return {
|
|
140
|
+
...(folders.length === 0 ? {} : { folders }),
|
|
141
|
+
...(folderRemovals.length === 0 ? {} : { folderRemovals }),
|
|
115
142
|
};
|
|
116
143
|
}
|
|
117
144
|
function advancement(room, from, at) {
|
|
118
145
|
const current = room.documents ?? {};
|
|
119
146
|
const previous = from.documents ?? {};
|
|
120
|
-
const currentTargets = new Set(room.
|
|
121
|
-
const previousTargets = new Set(from.
|
|
147
|
+
const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
|
|
148
|
+
const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
|
|
122
149
|
const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
|
|
150
|
+
room.fileIds?.[path] !== from.fileIds?.[path] ||
|
|
123
151
|
!sameChange(room.changes?.[path], from.changes?.[path]);
|
|
124
152
|
const changed = Object.keys(current)
|
|
125
153
|
.filter((path) => current[path] !== previous[path] || headMoved(path))
|
|
@@ -134,22 +162,25 @@ export function createMemoryAdapter(options = {}) {
|
|
|
134
162
|
const targets = opening
|
|
135
163
|
? [...currentTargets].filter((target) => !previousTargets.has(target) || headMoved(target))
|
|
136
164
|
: [];
|
|
137
|
-
const
|
|
138
|
-
const declared = opening && JSON.stringify(attachments) !== JSON.stringify(from.attachments ?? []);
|
|
165
|
+
const models = opening ? changedModels(room, from) : undefined;
|
|
139
166
|
return {
|
|
140
167
|
kind: 'net-advancement',
|
|
141
168
|
roomVersion: room.roomVersion,
|
|
169
|
+
...(models === undefined ? {} : { models }),
|
|
142
170
|
documents: named(current, taken),
|
|
143
|
-
revisions: named(room.revisions ?? {}, taken),
|
|
171
|
+
revisions: named(room.revisions ?? {}, [...taken, ...targets]),
|
|
172
|
+
...(room.fileIds === undefined
|
|
173
|
+
? {}
|
|
174
|
+
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
144
175
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
145
|
-
|
|
176
|
+
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
177
|
+
...(opening ? foldersMoved(room, from) : {}),
|
|
146
178
|
removals: opening
|
|
147
179
|
? [
|
|
148
180
|
...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
|
|
149
181
|
...[...previousTargets].filter((target) => !currentTargets.has(target) && !(target in current)),
|
|
150
182
|
].sort()
|
|
151
183
|
: [],
|
|
152
|
-
...(declared ? { attachments } : {}),
|
|
153
184
|
...(pageToken === undefined ? {} : { pageToken }),
|
|
154
185
|
};
|
|
155
186
|
}
|
|
@@ -170,7 +201,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
170
201
|
function historiesOf(input) {
|
|
171
202
|
const asked = input?.conversations;
|
|
172
203
|
if (!Array.isArray(asked))
|
|
173
|
-
return { kind: 'rejected', code: 'invalid_request', fields: {} };
|
|
204
|
+
return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
|
|
174
205
|
const histories = [];
|
|
175
206
|
for (const entry of asked) {
|
|
176
207
|
const conversation = typeof entry.conversation === 'string' ? scripted.get(entry.conversation) : undefined;
|
|
@@ -198,21 +229,32 @@ export function createMemoryAdapter(options = {}) {
|
|
|
198
229
|
const named = typeof input.conversation === 'string' ? input.conversation : '';
|
|
199
230
|
const conversation = scripted.get(named);
|
|
200
231
|
if (conversation === undefined) {
|
|
201
|
-
return {
|
|
232
|
+
return {
|
|
233
|
+
kind: 'rejected',
|
|
234
|
+
code: 'unknown-conversation',
|
|
235
|
+
fields: { conversation: named },
|
|
236
|
+
retryable: false,
|
|
237
|
+
};
|
|
202
238
|
}
|
|
203
239
|
const outcome = conversation.outcomes?.[name];
|
|
204
240
|
if (outcome !== undefined)
|
|
205
241
|
return outcome;
|
|
206
242
|
if (name === 'conversation.send') {
|
|
243
|
+
const operation = typeof input.operation_id === 'string' ? input.operation_id : null;
|
|
244
|
+
const answered = operation === null ? undefined : sentTurns.get(operation);
|
|
245
|
+
if (answered !== undefined)
|
|
246
|
+
return { kind: 'action', result: { turn: answered } };
|
|
207
247
|
issued += 1;
|
|
208
248
|
const turn = `turn-${issued}`;
|
|
209
249
|
unsealed.set(turn, named);
|
|
250
|
+
if (operation !== null)
|
|
251
|
+
sentTurns.set(operation, turn);
|
|
210
252
|
return { kind: 'action', result: { turn } };
|
|
211
253
|
}
|
|
212
254
|
if (name === 'conversation.cancel') {
|
|
213
255
|
const turn = typeof input.turn === 'string' ? input.turn : '';
|
|
214
256
|
if (sealed.has(turn) || !unsealed.has(turn)) {
|
|
215
|
-
return { kind: 'rejected', code: 'turn-sealed', fields: { turn } };
|
|
257
|
+
return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
|
|
216
258
|
}
|
|
217
259
|
unsealed.delete(turn);
|
|
218
260
|
return { kind: 'action', result: { turn, cancelled: true } };
|
|
@@ -221,18 +263,23 @@ export function createMemoryAdapter(options = {}) {
|
|
|
221
263
|
scripted.delete(named);
|
|
222
264
|
return { kind: 'action', result: { conversation: named } };
|
|
223
265
|
}
|
|
266
|
+
function announceList() {
|
|
267
|
+
const entries = [...scripted.values()].flatMap(({ conversation, listed }) => listed === undefined ? [] : [{ conversation, ...listed }]);
|
|
268
|
+
for (const listener of listeners)
|
|
269
|
+
listener({ kind: 'list', entries });
|
|
270
|
+
}
|
|
224
271
|
function discovery() {
|
|
225
272
|
return {
|
|
226
273
|
kind: 'discovery',
|
|
227
|
-
supportedVersions,
|
|
228
|
-
mdModel,
|
|
229
274
|
rooms: rooms.map(declared),
|
|
230
275
|
capabilities,
|
|
231
276
|
providerLimits,
|
|
232
277
|
retention,
|
|
278
|
+
...(options.member === undefined ? {} : { member: options.member }),
|
|
233
279
|
};
|
|
234
280
|
}
|
|
235
281
|
return {
|
|
282
|
+
...(options.exhaustiveDiscovery === undefined ? {} : { exhaustiveDiscovery: true }),
|
|
236
283
|
setRooms(next) {
|
|
237
284
|
rooms = [...next];
|
|
238
285
|
retain(rooms);
|
|
@@ -240,9 +287,28 @@ export function createMemoryAdapter(options = {}) {
|
|
|
240
287
|
setConversations(next) {
|
|
241
288
|
scriptConversations(next);
|
|
242
289
|
},
|
|
243
|
-
|
|
290
|
+
open() {
|
|
291
|
+
announceList();
|
|
292
|
+
for (const observer of observers)
|
|
293
|
+
observer({ kind: 'opened' });
|
|
294
|
+
},
|
|
295
|
+
close({ revoked = false, lost = !revoked } = {}) {
|
|
244
296
|
for (const observer of observers)
|
|
245
|
-
observer(
|
|
297
|
+
observer({ kind: 'closed', revoked, lost });
|
|
298
|
+
},
|
|
299
|
+
expire(locators) {
|
|
300
|
+
expiring = [...locators];
|
|
301
|
+
},
|
|
302
|
+
notifyRoomVersion({ locator, roomVersion }) {
|
|
303
|
+
for (const observer of observers)
|
|
304
|
+
observer({ kind: 'room-version', locator, roomVersion });
|
|
305
|
+
},
|
|
306
|
+
notifyAuthorityChanged(scope) {
|
|
307
|
+
for (const observer of observers) {
|
|
308
|
+
observer(scope === undefined
|
|
309
|
+
? { kind: 'authority-changed' }
|
|
310
|
+
: { kind: 'authority-changed', scope });
|
|
311
|
+
}
|
|
246
312
|
},
|
|
247
313
|
notifyConversation(event) {
|
|
248
314
|
if (event.kind === 'accepted-message') {
|
|
@@ -256,8 +322,8 @@ export function createMemoryAdapter(options = {}) {
|
|
|
256
322
|
for (const observer of modeObservers)
|
|
257
323
|
observer(mode);
|
|
258
324
|
},
|
|
259
|
-
|
|
260
|
-
return
|
|
325
|
+
heldRooms() {
|
|
326
|
+
return held;
|
|
261
327
|
},
|
|
262
328
|
replicatedConversations() {
|
|
263
329
|
return replicated;
|
|
@@ -281,12 +347,47 @@ export function createMemoryAdapter(options = {}) {
|
|
|
281
347
|
};
|
|
282
348
|
},
|
|
283
349
|
},
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
350
|
+
roomStream: {
|
|
351
|
+
hold(asked) {
|
|
352
|
+
held = asked.map((room) => room.locator);
|
|
353
|
+
const expired = expiring.filter((locator) => held.includes(locator));
|
|
354
|
+
expiring = [];
|
|
355
|
+
const moved = asked.flatMap((room) => {
|
|
356
|
+
const current = rooms.find((entry) => entry.locator === room.locator);
|
|
357
|
+
return current === undefined ||
|
|
358
|
+
expired.includes(room.locator) ||
|
|
359
|
+
current.roomVersion === room.roomVersion
|
|
360
|
+
? []
|
|
361
|
+
: [{ locator: room.locator, roomVersion: current.roomVersion }];
|
|
362
|
+
});
|
|
363
|
+
queueMicrotask(() => {
|
|
364
|
+
for (const observer of observers) {
|
|
365
|
+
for (const room of moved)
|
|
366
|
+
observer({ kind: 'room-version', ...room });
|
|
367
|
+
observer({ kind: 'opening', expired });
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
},
|
|
371
|
+
reopen() {
|
|
372
|
+
queueMicrotask(() => {
|
|
373
|
+
for (const observer of observers) {
|
|
374
|
+
observer({ kind: 'closed', revoked: false, lost: false });
|
|
375
|
+
}
|
|
376
|
+
});
|
|
287
377
|
},
|
|
378
|
+
published() { },
|
|
288
379
|
observe(notify) {
|
|
289
380
|
observers.add(notify);
|
|
381
|
+
queueMicrotask(() => {
|
|
382
|
+
if (!observers.has(notify))
|
|
383
|
+
return;
|
|
384
|
+
if (options.unopened === true) {
|
|
385
|
+
notify({ kind: 'closed', revoked: false, lost: true });
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
announceList();
|
|
389
|
+
notify({ kind: 'opened' });
|
|
390
|
+
});
|
|
290
391
|
return () => {
|
|
291
392
|
observers.delete(notify);
|
|
292
393
|
};
|
|
@@ -298,13 +399,6 @@ export function createMemoryAdapter(options = {}) {
|
|
|
298
399
|
else
|
|
299
400
|
scripts[operation] = answer;
|
|
300
401
|
},
|
|
301
|
-
async model(_authorization, request) {
|
|
302
|
-
return resolveScript(scripts.model, () => {
|
|
303
|
-
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
304
|
-
const answer = request.attached === 'collection' ? room?.model : room?.selectionModel;
|
|
305
|
-
return answer ?? { kind: 'model-unavailable', reason: 'not-readable' };
|
|
306
|
-
}, request);
|
|
307
|
-
},
|
|
308
402
|
async authorize() {
|
|
309
403
|
return resolveScript(scripts.authorize, () => ({}), undefined);
|
|
310
404
|
},
|
|
@@ -317,13 +411,21 @@ export function createMemoryAdapter(options = {}) {
|
|
|
317
411
|
});
|
|
318
412
|
},
|
|
319
413
|
reached,
|
|
414
|
+
follows(locator, roomVersion, next) {
|
|
415
|
+
const scripted = scripts.follows;
|
|
416
|
+
if (typeof scripted === 'boolean')
|
|
417
|
+
return scripted;
|
|
418
|
+
if (scripted !== undefined)
|
|
419
|
+
return scripted(locator, roomVersion, next);
|
|
420
|
+
return true;
|
|
421
|
+
},
|
|
320
422
|
async bootstrap(_authorization, request) {
|
|
321
423
|
return resolveScript(scripts.bootstrap, () => {
|
|
322
424
|
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
323
425
|
if (room === undefined) {
|
|
324
426
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
325
427
|
}
|
|
326
|
-
return page(room, request.pageToken
|
|
428
|
+
return page(room, request.pageToken);
|
|
327
429
|
}, request).then((answer) => note(request.locator, answer));
|
|
328
430
|
},
|
|
329
431
|
async refresh(_authorization, request) {
|
|
@@ -341,10 +443,6 @@ export function createMemoryAdapter(options = {}) {
|
|
|
341
443
|
}
|
|
342
444
|
return advancement(continuation.room, continuation.from, continuation.at);
|
|
343
445
|
}
|
|
344
|
-
if (request.minPosition !== undefined &&
|
|
345
|
-
!reached(room.locator, room.roomVersion, request.minPosition)) {
|
|
346
|
-
return { kind: 'retryable-refusal', code: 'replica_behind', fields: {} };
|
|
347
|
-
}
|
|
348
446
|
if (request.fromRoomVersion === room.roomVersion) {
|
|
349
447
|
return { kind: 'still-current' };
|
|
350
448
|
}
|
|
@@ -360,8 +458,20 @@ export function createMemoryAdapter(options = {}) {
|
|
|
360
458
|
if (room === undefined) {
|
|
361
459
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
362
460
|
}
|
|
363
|
-
return {
|
|
364
|
-
|
|
461
|
+
return {
|
|
462
|
+
kind: 'rejected',
|
|
463
|
+
code: 'unscripted-mutation',
|
|
464
|
+
fields: {},
|
|
465
|
+
retryable: false,
|
|
466
|
+
affected: {},
|
|
467
|
+
};
|
|
468
|
+
}, request).then((answer) => {
|
|
469
|
+
const destination = request.changeBatch.between?.destination.room;
|
|
470
|
+
if (answer.kind === 'accepted' && answer.destination !== undefined && destination) {
|
|
471
|
+
note(destination, answer.destination);
|
|
472
|
+
}
|
|
473
|
+
return note(request.locator, answer);
|
|
474
|
+
});
|
|
365
475
|
},
|
|
366
476
|
async history(_authorization, request) {
|
|
367
477
|
return resolveScript(scripts.history, () => {
|
|
@@ -375,11 +485,25 @@ export function createMemoryAdapter(options = {}) {
|
|
|
375
485
|
};
|
|
376
486
|
}, request);
|
|
377
487
|
},
|
|
488
|
+
async binary(_authorization, request) {
|
|
489
|
+
return resolveScript(scripts.binary, () => {
|
|
490
|
+
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
491
|
+
if (room === undefined)
|
|
492
|
+
return { kind: 'room-not-readable', locator: request.locator };
|
|
493
|
+
const blob = room.blobs?.[request.path];
|
|
494
|
+
return blob === undefined
|
|
495
|
+
? { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false }
|
|
496
|
+
: { kind: 'binary', body: blob.stream(), mediaType: blob.type };
|
|
497
|
+
}, request);
|
|
498
|
+
},
|
|
499
|
+
async link(_authorization, request) {
|
|
500
|
+
return resolveScript(scripts.link, () => ({ kind: 'rejected', code: 'unscripted-link', fields: {}, retryable: false }), request);
|
|
501
|
+
},
|
|
378
502
|
async action(_authorization, request) {
|
|
379
503
|
return resolveScript(scripts.action, () => {
|
|
380
504
|
if (request.name.startsWith('conversation.'))
|
|
381
505
|
return conversationAction(request);
|
|
382
|
-
return { kind: 'rejected', code: 'unscripted-action', fields: {} };
|
|
506
|
+
return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
|
|
383
507
|
}, request).then((answer) => {
|
|
384
508
|
if (answer.kind === 'action' && answer.at !== undefined)
|
|
385
509
|
note(answer.at.locator, answer.at);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { AcceptedMessage } from './adapter.js';
|
|
2
|
+
import type { Connection } from './tables.js';
|
|
3
|
+
export declare const MESSAGE_TABLES: readonly string[];
|
|
4
|
+
export type HeldConversation = {
|
|
5
|
+
readonly conversation: string;
|
|
6
|
+
readonly read: string | null | undefined;
|
|
7
|
+
readonly partial: boolean;
|
|
8
|
+
};
|
|
9
|
+
export type MessageWindow = {
|
|
10
|
+
readonly messages: AcceptedMessage[];
|
|
11
|
+
readonly more: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type ConversationWrite = {
|
|
14
|
+
readonly conversation: string;
|
|
15
|
+
readonly messages: readonly AcceptedMessage[];
|
|
16
|
+
readonly read?: {
|
|
17
|
+
readonly at: string | null;
|
|
18
|
+
readonly partial: boolean;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
export declare function heldConversations(connection: Connection): HeldConversation[];
|
|
22
|
+
export declare function keptMessages(connection: Connection, { conversation, messages, read }: ConversationWrite): null;
|
|
23
|
+
export declare function messageWindow(connection: Connection, conversation: string, limit: number, before: readonly [string, string] | null): MessageWindow;
|
|
24
|
+
export declare function messageCount(connection: Connection, conversation: string): number;
|
|
25
|
+
export declare function turnArrived(connection: Connection, conversation: string, turn: string): boolean;
|
|
26
|
+
export declare function droppedMessages(connection: Connection, conversations: readonly string[]): void;
|
|
27
|
+
export declare function forgottenMessages(connection: Connection): void;
|
|
28
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,aAAa,CAAC;AAE1D,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAM3C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAE7F,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3E,CAAC;AAMF,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,gBAAgB,EAAE,CAmB5E;AAED,wBAAgB,YAAY,CAC1B,UAAU,EAAE,UAAU,EACtB,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,iBAAiB,GAClD,IAAI,CAoCN;AAYD,wBAAgB,aAAa,CAC3B,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GACvC,aAAa,CAUf;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAMjF;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAO/F;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAW9F;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAG9D"}
|
package/dist/messages.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { indexMessage, unindexMessages } from './fulltext.js';
|
|
2
|
+
export const MESSAGE_TABLES = [
|
|
3
|
+
'CREATE TABLE conversation_reads (conversation TEXT PRIMARY KEY, read TEXT, partial INTEGER NOT NULL) WITHOUT ROWID',
|
|
4
|
+
'CREATE TABLE conversation_messages (id INTEGER PRIMARY KEY, conversation TEXT NOT NULL, identity TEXT NOT NULL, turn TEXT NOT NULL, position TEXT NOT NULL, message TEXT NOT NULL, text TEXT NOT NULL)',
|
|
5
|
+
'CREATE UNIQUE INDEX conversation_messages_identity ON conversation_messages (conversation, identity)',
|
|
6
|
+
'CREATE INDEX conversation_messages_position ON conversation_messages (conversation, position, identity)',
|
|
7
|
+
'CREATE INDEX conversation_messages_turn ON conversation_messages (conversation, turn)',
|
|
8
|
+
];
|
|
9
|
+
function text(value) {
|
|
10
|
+
return typeof value === 'string' ? value : String(value);
|
|
11
|
+
}
|
|
12
|
+
export function heldConversations(connection) {
|
|
13
|
+
const held = new Map();
|
|
14
|
+
for (const row of connection.rows('SELECT conversation, read, partial FROM conversation_reads')) {
|
|
15
|
+
held.set(text(row.conversation), {
|
|
16
|
+
conversation: text(row.conversation),
|
|
17
|
+
read: row.read === null ? null : text(row.read),
|
|
18
|
+
partial: Number(row.partial) === 1,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
for (const row of connection.rows('SELECT DISTINCT conversation FROM conversation_messages WHERE conversation NOT IN (SELECT conversation FROM conversation_reads)')) {
|
|
22
|
+
held.set(text(row.conversation), {
|
|
23
|
+
conversation: text(row.conversation),
|
|
24
|
+
read: undefined,
|
|
25
|
+
partial: true,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return [...held.values()];
|
|
29
|
+
}
|
|
30
|
+
export function keptMessages(connection, { conversation, messages, read }) {
|
|
31
|
+
for (const message of messages) {
|
|
32
|
+
const [held] = connection.rows('SELECT id FROM conversation_messages WHERE conversation = ? AND identity = ?', [conversation, message.identity]);
|
|
33
|
+
const record = [
|
|
34
|
+
message.turn,
|
|
35
|
+
message.position,
|
|
36
|
+
JSON.stringify(message.message ?? null),
|
|
37
|
+
message.text,
|
|
38
|
+
];
|
|
39
|
+
let id;
|
|
40
|
+
if (held === undefined) {
|
|
41
|
+
connection.run('INSERT INTO conversation_messages (conversation, identity, turn, position, message, text) VALUES (?, ?, ?, ?, ?, ?)', [conversation, message.identity, ...record]);
|
|
42
|
+
id = Number(connection.rows('SELECT last_insert_rowid() AS id')[0].id);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
id = Number(held.id);
|
|
46
|
+
unindexMessages(connection, [id]);
|
|
47
|
+
connection.run('UPDATE conversation_messages SET turn = ?, position = ?, message = ?, text = ? WHERE id = ?', [...record, id]);
|
|
48
|
+
}
|
|
49
|
+
indexMessage(connection, id, message.text);
|
|
50
|
+
}
|
|
51
|
+
if (read !== undefined) {
|
|
52
|
+
connection.run('INSERT OR REPLACE INTO conversation_reads (conversation, read, partial) VALUES (?, ?, ?)', [conversation, read.at, read.partial ? 1 : 0]);
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
function accepted(row) {
|
|
57
|
+
return {
|
|
58
|
+
identity: text(row.identity),
|
|
59
|
+
turn: text(row.turn),
|
|
60
|
+
position: text(row.position),
|
|
61
|
+
text: text(row.text),
|
|
62
|
+
message: JSON.parse(text(row.message)),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function messageWindow(connection, conversation, limit, before) {
|
|
66
|
+
const rows = connection.rows(`SELECT identity, turn, position, message, text FROM conversation_messages WHERE conversation = ?${before === null ? '' : ' AND (position < ? OR (position = ? AND identity < ?))'} ORDER BY position DESC, identity DESC LIMIT ?`, before === null
|
|
67
|
+
? [conversation, limit + 1]
|
|
68
|
+
: [conversation, before[0], before[0], before[1], limit + 1]);
|
|
69
|
+
return { messages: rows.slice(0, limit).map(accepted).reverse(), more: rows.length > limit };
|
|
70
|
+
}
|
|
71
|
+
export function messageCount(connection, conversation) {
|
|
72
|
+
const [counted] = connection.rows('SELECT count(*) AS held FROM conversation_messages WHERE conversation = ?', [conversation]);
|
|
73
|
+
return Number(counted?.held ?? 0);
|
|
74
|
+
}
|
|
75
|
+
export function turnArrived(connection, conversation, turn) {
|
|
76
|
+
return (connection.rows('SELECT 1 FROM conversation_messages WHERE conversation = ? AND turn = ? LIMIT 1', [conversation, turn]).length > 0);
|
|
77
|
+
}
|
|
78
|
+
export function droppedMessages(connection, conversations) {
|
|
79
|
+
for (const conversation of conversations) {
|
|
80
|
+
unindexMessages(connection, connection
|
|
81
|
+
.rows('SELECT id FROM conversation_messages WHERE conversation = ?', [conversation])
|
|
82
|
+
.map((row) => Number(row.id)));
|
|
83
|
+
connection.run('DELETE FROM conversation_messages WHERE conversation = ?', [conversation]);
|
|
84
|
+
connection.run('DELETE FROM conversation_reads WHERE conversation = ?', [conversation]);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export function forgottenMessages(connection) {
|
|
88
|
+
connection.run('DELETE FROM conversation_messages');
|
|
89
|
+
connection.run('DELETE FROM conversation_reads');
|
|
90
|
+
}
|
package/dist/model.d.ts
CHANGED
|
@@ -1,31 +1,27 @@
|
|
|
1
|
-
import type { Definition,
|
|
1
|
+
import type { Definition, ValueFacts, VerifiedModel } from '@agentshouse/mdmodel';
|
|
2
|
+
import type { Open } from './open.js';
|
|
2
3
|
export type ModelIdentity = {
|
|
3
4
|
identity: string;
|
|
4
5
|
version: string;
|
|
5
6
|
};
|
|
6
7
|
export type ModelSnapshot = ModelIdentity & {
|
|
7
8
|
schema: string | null;
|
|
9
|
+
revision: string | null;
|
|
8
10
|
};
|
|
9
|
-
export type ModelUnavailableReason = 'not-readable' | 'revoked' | 'not-acquired' | '
|
|
11
|
+
export type ModelUnavailableReason = Open<'not-readable' | 'revoked' | 'not-acquired' | 'invalid'>;
|
|
10
12
|
export type ModelResult = {
|
|
11
13
|
kind: 'model';
|
|
12
14
|
snapshot: ModelSnapshot;
|
|
13
15
|
} | {
|
|
14
16
|
kind: 'model-unavailable';
|
|
15
17
|
reason: ModelUnavailableReason;
|
|
16
|
-
} | {
|
|
17
|
-
kind: 'transport-uncertainty';
|
|
18
|
-
} | {
|
|
19
|
-
kind: 'revoked-authorization';
|
|
20
|
-
};
|
|
21
|
-
export type MdType = {
|
|
22
|
-
name: string;
|
|
23
|
-
fields: Readonly<Record<string, FieldSpec>>;
|
|
24
|
-
sections: Readonly<Record<string, SectionSpec>>;
|
|
25
18
|
};
|
|
19
|
+
export type MdType = Definition;
|
|
26
20
|
export type ModelState = {
|
|
27
21
|
status: 'unavailable';
|
|
28
22
|
reason: ModelUnavailableReason;
|
|
23
|
+
schema?: string | null;
|
|
24
|
+
revision?: string | null;
|
|
29
25
|
} | {
|
|
30
26
|
status: 'current' | 'cached';
|
|
31
27
|
snapshot: ModelSnapshot;
|
|
@@ -33,23 +29,30 @@ export type ModelState = {
|
|
|
33
29
|
types: VerifiedModel['types'];
|
|
34
30
|
};
|
|
35
31
|
export type TypesResult = {
|
|
36
|
-
status: 'unavailable'
|
|
32
|
+
status: Open<'unavailable'>;
|
|
37
33
|
reason: ModelUnavailableReason;
|
|
34
|
+
types: null;
|
|
35
|
+
schema?: string | null;
|
|
36
|
+
revision?: string | null;
|
|
38
37
|
} | {
|
|
39
|
-
status: 'current' | 'cached'
|
|
38
|
+
status: Open<'current' | 'cached'>;
|
|
40
39
|
identity: string;
|
|
41
40
|
version: string;
|
|
42
41
|
verifiedWith: ModelIdentity;
|
|
43
42
|
types: readonly MdType[];
|
|
43
|
+
schema: string | null;
|
|
44
|
+
revision: string | null;
|
|
44
45
|
};
|
|
45
46
|
export type ValidationReceipt = {
|
|
46
47
|
identity: string;
|
|
47
48
|
version: string;
|
|
48
|
-
source: 'current' | 'cached'
|
|
49
|
+
source: Open<'current' | 'cached'>;
|
|
49
50
|
};
|
|
50
51
|
export declare const NO_MODEL: ModelState;
|
|
51
52
|
export declare function definitionOf(state: ModelState, type: string | undefined): Definition | undefined;
|
|
52
53
|
export declare function modelTypes(state: ModelState): TypesResult;
|
|
53
54
|
export declare function cached(state: ModelState): ModelState;
|
|
54
55
|
export declare function sameModel(left: ModelIdentity, right: ModelIdentity): boolean;
|
|
56
|
+
export declare function sameTyping(left: ModelState, right: ModelState): boolean;
|
|
57
|
+
export declare function referenceField(facts: ValueFacts | undefined): boolean;
|
|
55
58
|
//# sourceMappingURL=model.d.ts.map
|
package/dist/model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAC/F,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,cAAc,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC,CAAC;AACnG,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC;AAChC,MAAM,MAAM,UAAU,GAClB;IACE,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GACD;IACE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CAC/B,CAAC;AACN,MAAM,MAAM,WAAW,GACnB;IACE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5B,MAAM,EAAE,sBAAsB,CAAC;IAC/B,KAAK,EAAE,IAAI,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GACD;IACE,MAAM,EAAE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AACN,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC;CACpC,CAAC;AACF,eAAO,MAAM,QAAQ,EAAE,UAA8D,CAAC;AACtF,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAGhG;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAgBzD;AACD,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAEpD;AACD,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAE5E;AACD,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CASvE;AACD,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAErE"}
|
package/dist/model.js
CHANGED
|
@@ -6,15 +6,15 @@ export function definitionOf(state, type) {
|
|
|
6
6
|
}
|
|
7
7
|
export function modelTypes(state) {
|
|
8
8
|
return state.status === 'unavailable'
|
|
9
|
-
? { ...state }
|
|
9
|
+
? { ...state, types: null }
|
|
10
10
|
: {
|
|
11
11
|
status: state.status,
|
|
12
12
|
identity: state.snapshot.identity,
|
|
13
13
|
version: state.snapshot.version,
|
|
14
14
|
verifiedWith: { ...state.verifiedWith },
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
schema: state.snapshot.schema,
|
|
16
|
+
revision: state.snapshot.revision,
|
|
17
|
+
types: structuredClone(Object.values(state.types).sort((left, right) => left.name < right.name ? -1 : left.name > right.name ? 1 : 0)),
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
20
|
export function cached(state) {
|
|
@@ -23,3 +23,15 @@ export function cached(state) {
|
|
|
23
23
|
export function sameModel(left, right) {
|
|
24
24
|
return left.identity === right.identity && left.version === right.version;
|
|
25
25
|
}
|
|
26
|
+
export function sameTyping(left, right) {
|
|
27
|
+
if (left === right)
|
|
28
|
+
return true;
|
|
29
|
+
if (left.status === 'unavailable' || right.status === 'unavailable') {
|
|
30
|
+
return left.status === right.status;
|
|
31
|
+
}
|
|
32
|
+
return (left.snapshot.schema === right.snapshot.schema &&
|
|
33
|
+
sameModel(left.verifiedWith, right.verifiedWith));
|
|
34
|
+
}
|
|
35
|
+
export function referenceField(facts) {
|
|
36
|
+
return facts?.reference !== undefined || facts?.items?.reference !== undefined;
|
|
37
|
+
}
|
package/dist/name.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"name.d.ts","sourceRoot":"","sources":["../src/name.ts"],"names":[],"mappings":"AAgHA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D"}
|