@agentshouse/mdruntime 0.1.0-c3903a68dcbbf → 0.1.0-c6e4c19c13638
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 +72 -41
- package/README.md +11 -11
- package/dist/adapter.d.ts +80 -51
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +1 -9
- package/dist/attached-model.d.ts +11 -0
- package/dist/attached-model.d.ts.map +1 -0
- package/dist/attached-model.js +34 -0
- package/dist/bootstrap.d.ts +5 -3
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +3 -3
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +2 -6
- package/dist/client.d.ts +4 -9
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3 -16
- package/dist/collection.d.ts +0 -2
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +2 -12
- package/dist/connection.d.ts +11 -28
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +518 -639
- package/dist/conversation.d.ts +22 -11
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +250 -105
- package/dist/host.d.ts +7 -2
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +37 -57
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/memory.d.ts +11 -5
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +78 -27
- package/dist/model.d.ts +4 -11
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +4 -3
- package/dist/observation.d.ts +2 -0
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +24 -14
- package/dist/outcome.d.ts +5 -21
- package/dist/outcome.d.ts.map +1 -1
- 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 +8 -3
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +104 -36
- package/dist/reach.d.ts +40 -0
- package/dist/reach.d.ts.map +1 -0
- package/dist/reach.js +270 -0
- package/dist/react.d.ts +31 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +62 -0
- package/dist/read-side.d.ts +4 -0
- package/dist/read-side.d.ts.map +1 -1
- package/dist/read-side.js +116 -54
- package/dist/refresh.d.ts +2 -1
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +7 -3
- package/dist/replica.d.ts +4 -4
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +14 -19
- package/dist/room-draft.d.ts +3 -0
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +6 -4
- package/dist/rows.d.ts +2 -1
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +75 -38
- package/dist/save.d.ts +1 -2
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +92 -51
- package/dist/store.d.ts +6 -16
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +10 -32
- package/dist/wire.d.ts +51 -16
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +50 -65
- package/package.json +14 -2
package/dist/reach.js
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { unheldView } from './conversation.js';
|
|
2
|
+
import { modelTypes, NO_MODEL } from './model.js';
|
|
3
|
+
import { applied, observing } from './observation.js';
|
|
4
|
+
import { beneath } from './paths.js';
|
|
5
|
+
import { reconciled } from './read-side.js';
|
|
6
|
+
import { moveTarget, readParts } from './room-draft.js';
|
|
7
|
+
import { documentKey } from './rows.js';
|
|
8
|
+
const UNHELD_TYPES = { collection: modelTypes(NO_MODEL), typedSelection: null };
|
|
9
|
+
const UNDECLARED = { kind: 'undeclared' };
|
|
10
|
+
function undeclared() {
|
|
11
|
+
return Promise.resolve(UNDECLARED);
|
|
12
|
+
}
|
|
13
|
+
const NO_CONVERSATION = {
|
|
14
|
+
list: () => Promise.resolve([]),
|
|
15
|
+
read: (conversation) => Promise.resolve(unheldView(conversation)),
|
|
16
|
+
create: undeclared,
|
|
17
|
+
send: undeclared,
|
|
18
|
+
answer: undeclared,
|
|
19
|
+
interrupt: undeclared,
|
|
20
|
+
kill: undeclared,
|
|
21
|
+
cancel: undeclared,
|
|
22
|
+
delete: undeclared,
|
|
23
|
+
};
|
|
24
|
+
const NO_CHAT_DRAFT = {
|
|
25
|
+
write: () => Promise.resolve(),
|
|
26
|
+
discard: () => Promise.resolve(),
|
|
27
|
+
};
|
|
28
|
+
export function holds(reach, room) {
|
|
29
|
+
return (reach === null ||
|
|
30
|
+
reach.rooms.includes(room) ||
|
|
31
|
+
reach.documents.some((document) => document.room === room));
|
|
32
|
+
}
|
|
33
|
+
function wholly(reach, room) {
|
|
34
|
+
return reach === null || reach.rooms.includes(room);
|
|
35
|
+
}
|
|
36
|
+
export function governs(reach, room) {
|
|
37
|
+
if (wholly(reach, room.locator)) {
|
|
38
|
+
return { collection: true, selection: room.typedSelection !== null };
|
|
39
|
+
}
|
|
40
|
+
const selected = (path) => room.typedSelection?.roots.some((root) => beneath(root, path)) ?? false;
|
|
41
|
+
const paths = reach.documents
|
|
42
|
+
.filter((document) => document.room === room.locator)
|
|
43
|
+
.map(({ path }) => path);
|
|
44
|
+
return { collection: paths.some((path) => !selected(path)), selection: paths.some(selected) };
|
|
45
|
+
}
|
|
46
|
+
function covers(reach, room, path) {
|
|
47
|
+
return (reach === null ||
|
|
48
|
+
reach.rooms.includes(room) ||
|
|
49
|
+
reach.documents.some((document) => document.room === room && document.path === path));
|
|
50
|
+
}
|
|
51
|
+
function conversing(reach) {
|
|
52
|
+
return reach === null || reach.conversations;
|
|
53
|
+
}
|
|
54
|
+
export function planReach(reach) {
|
|
55
|
+
return reach === null
|
|
56
|
+
? null
|
|
57
|
+
: {
|
|
58
|
+
rooms: [...new Set(reach.rooms)].sort(),
|
|
59
|
+
documents: [
|
|
60
|
+
...new Set(reach.documents.map(({ room, path }) => documentKey(room, path))),
|
|
61
|
+
].sort(),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function roomsWithin(reach, rooms) {
|
|
65
|
+
return rooms.filter((room) => wholly(reach, room.locator));
|
|
66
|
+
}
|
|
67
|
+
function typesWithin(reach, room, types) {
|
|
68
|
+
if (room === undefined)
|
|
69
|
+
return structuredClone(UNHELD_TYPES);
|
|
70
|
+
const governed = governs(reach, room);
|
|
71
|
+
return {
|
|
72
|
+
collection: governed.collection ? types.collection : modelTypes(NO_MODEL),
|
|
73
|
+
typedSelection: governed.selection ? types.typedSelection : null,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function moves(reach, room, move) {
|
|
77
|
+
return move === undefined || covers(reach, room, moveTarget(move));
|
|
78
|
+
}
|
|
79
|
+
function draftWithin(reach, draft) {
|
|
80
|
+
return covers(reach, draft.room, draft.path) && moves(reach, draft.room, draft.parts.move);
|
|
81
|
+
}
|
|
82
|
+
function draftsWithin(reach, drafts) {
|
|
83
|
+
return drafts.filter((draft) => draftWithin(reach, draft));
|
|
84
|
+
}
|
|
85
|
+
function shownDraft(reach, draft) {
|
|
86
|
+
return draft !== null && draftWithin(reach, draft) ? draft : null;
|
|
87
|
+
}
|
|
88
|
+
function writeWithin(reach, write) {
|
|
89
|
+
return write.outcome === 'written'
|
|
90
|
+
? { outcome: 'written', roomDraft: shownDraft(reach, write.roomDraft) }
|
|
91
|
+
: { outcome: 'stale', current: shownDraft(reach, write.current) };
|
|
92
|
+
}
|
|
93
|
+
function savedWithin(reach, room, result) {
|
|
94
|
+
if (reach === null || result.outcome === 'saved')
|
|
95
|
+
return result;
|
|
96
|
+
const { file, location, referrers, ...refusal } = result;
|
|
97
|
+
const hidden = file !== undefined && !covers(reach, room, file);
|
|
98
|
+
return {
|
|
99
|
+
...refusal,
|
|
100
|
+
...(file === undefined || hidden ? {} : { file }),
|
|
101
|
+
...(location === undefined || hidden ? {} : { location }),
|
|
102
|
+
...(referrers === undefined
|
|
103
|
+
? {}
|
|
104
|
+
: { referrers: referrers.filter((path) => covers(reach, room, path)) }),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function statusWithin(reach, status) {
|
|
108
|
+
return {
|
|
109
|
+
...status,
|
|
110
|
+
attentionRequired: status.attentionRequired.filter((entry) => covers(reach, entry.room, entry.path)),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function queueWithin(reach, room, entries) {
|
|
114
|
+
return entries.filter(({ batch }) => batch.changes.every((change) => covers(reach, room, change.path) &&
|
|
115
|
+
(change.kind !== 'move' || covers(reach, room, change.to))));
|
|
116
|
+
}
|
|
117
|
+
function unreached(room) {
|
|
118
|
+
return new Error(`No Local Replica for ${room}`);
|
|
119
|
+
}
|
|
120
|
+
export function narrowed(runtime, given) {
|
|
121
|
+
const { md, watch } = runtime;
|
|
122
|
+
let reach = given;
|
|
123
|
+
const open = new Set();
|
|
124
|
+
function following(begin) {
|
|
125
|
+
let stop = begin();
|
|
126
|
+
const restart = () => {
|
|
127
|
+
stop();
|
|
128
|
+
stop = begin();
|
|
129
|
+
};
|
|
130
|
+
open.add(restart);
|
|
131
|
+
return () => {
|
|
132
|
+
open.delete(restart);
|
|
133
|
+
stop();
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const within = (topic, input, deliver) => {
|
|
137
|
+
if (topic === 'rooms') {
|
|
138
|
+
return following(() => watch(topic, input, (rooms) => deliver(roomsWithin(reach, rooms))));
|
|
139
|
+
}
|
|
140
|
+
if (topic === 'sync-status') {
|
|
141
|
+
return following(() => watch(topic, input, (status) => deliver(statusWithin(reach, status))));
|
|
142
|
+
}
|
|
143
|
+
if (topic === 'room-drafts') {
|
|
144
|
+
return following(() => watch(topic, input, (drafts) => deliver(draftsWithin(reach, drafts))));
|
|
145
|
+
}
|
|
146
|
+
if (topic === 'queue') {
|
|
147
|
+
const room = input[0];
|
|
148
|
+
return following(() => {
|
|
149
|
+
if (!holds(reach, room)) {
|
|
150
|
+
deliver([]);
|
|
151
|
+
return () => { };
|
|
152
|
+
}
|
|
153
|
+
return watch(topic, input, (entries) => deliver(queueWithin(reach, room, entries)));
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
if (topic === 'query') {
|
|
157
|
+
const plan = runtime.plan(input[0], reach);
|
|
158
|
+
let held = null;
|
|
159
|
+
return following(() => {
|
|
160
|
+
let first = true;
|
|
161
|
+
return runtime.watchPlan({ ...plan, reach: planReach(reach) }, (message) => {
|
|
162
|
+
if (!first) {
|
|
163
|
+
held = applied(held, message);
|
|
164
|
+
deliver(message);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
first = false;
|
|
168
|
+
if (held === null) {
|
|
169
|
+
held = message;
|
|
170
|
+
deliver(message);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const next = reconciled(held, message);
|
|
174
|
+
if (next === null)
|
|
175
|
+
return;
|
|
176
|
+
held = next.keyed;
|
|
177
|
+
deliver(next.change);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
if (topic === 'conversation') {
|
|
182
|
+
return following(() => {
|
|
183
|
+
if (conversing(reach))
|
|
184
|
+
return watch(topic, input, deliver);
|
|
185
|
+
deliver(unheldView(input[0]));
|
|
186
|
+
return () => { };
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
if (topic === 'conversations') {
|
|
190
|
+
return following(() => {
|
|
191
|
+
if (conversing(reach))
|
|
192
|
+
return watch(topic, input, deliver);
|
|
193
|
+
deliver([]);
|
|
194
|
+
return () => { };
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
return watch(topic, input, deliver);
|
|
198
|
+
};
|
|
199
|
+
const conversation = () => (conversing(reach) ? md.conversation : NO_CONVERSATION);
|
|
200
|
+
const chatDraft = () => (conversing(reach) ? md.chatDraft : NO_CHAT_DRAFT);
|
|
201
|
+
const view = {
|
|
202
|
+
...md,
|
|
203
|
+
rooms: () => roomsWithin(reach, md.rooms()),
|
|
204
|
+
query: ((input) => runtime.query(runtime.plan(input, reach))),
|
|
205
|
+
search: (input) => runtime.search(input, reach),
|
|
206
|
+
types(room) {
|
|
207
|
+
if (wholly(reach, room))
|
|
208
|
+
return md.types(room);
|
|
209
|
+
if (!holds(reach, room))
|
|
210
|
+
return structuredClone(UNHELD_TYPES);
|
|
211
|
+
const listed = md.rooms().find(({ locator }) => locator === room);
|
|
212
|
+
return typesWithin(reach, listed, md.types(room));
|
|
213
|
+
},
|
|
214
|
+
async save(room, roomDrafts, writtenBy) {
|
|
215
|
+
if (!holds(reach, room))
|
|
216
|
+
throw unreached(room);
|
|
217
|
+
const outside = roomDrafts.find(({ path }) => !covers(reach, room, path) ||
|
|
218
|
+
!moves(reach, room, md.roomDraft.read(room, path)?.parts.move));
|
|
219
|
+
if (outside !== undefined)
|
|
220
|
+
return { outcome: 'refused', rule: 'stale', file: outside.path };
|
|
221
|
+
return savedWithin(reach, room, await md.save(room, roomDrafts, writtenBy));
|
|
222
|
+
},
|
|
223
|
+
history: (room, path, query) => covers(reach, room, path)
|
|
224
|
+
? md.history(room, path, query)
|
|
225
|
+
: Promise.resolve({ kind: 'room-not-readable', locator: room }),
|
|
226
|
+
reached: (room, roomVersion, path) => (path === undefined ? wholly(reach, room) : covers(reach, room, path)) &&
|
|
227
|
+
md.reached(room, roomVersion, path),
|
|
228
|
+
log: () => (reach === null ? md.log() : ''),
|
|
229
|
+
roomDraft: {
|
|
230
|
+
list: () => md.roomDraft.list().then((drafts) => draftsWithin(reach, drafts)),
|
|
231
|
+
read: (room, path) => covers(reach, room, path) ? shownDraft(reach, md.roomDraft.read(room, path)) : null,
|
|
232
|
+
async write(room, path, revision, parts) {
|
|
233
|
+
if (!covers(reach, room, path) || !moves(reach, room, readParts(parts).move)) {
|
|
234
|
+
throw unreached(room);
|
|
235
|
+
}
|
|
236
|
+
return writeWithin(reach, await md.roomDraft.write(room, path, revision, parts));
|
|
237
|
+
},
|
|
238
|
+
async discard(room, path, revision) {
|
|
239
|
+
if (!covers(reach, room, path))
|
|
240
|
+
return { outcome: 'stale', current: null };
|
|
241
|
+
return writeWithin(reach, await md.roomDraft.discard(room, path, revision));
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
conversation: {
|
|
245
|
+
list: () => conversation().list(),
|
|
246
|
+
read: (id, options) => conversation().read(id, options),
|
|
247
|
+
create: (input) => conversation().create(input),
|
|
248
|
+
send: (id) => conversation().send(id),
|
|
249
|
+
answer: (id, answer) => conversation().answer(id, answer),
|
|
250
|
+
interrupt: (id) => conversation().interrupt(id),
|
|
251
|
+
kill: (id) => conversation().kill(id),
|
|
252
|
+
cancel: (id, turn) => conversation().cancel(id, turn),
|
|
253
|
+
delete: (id) => conversation().delete(id),
|
|
254
|
+
},
|
|
255
|
+
chatDraft: {
|
|
256
|
+
write: (id, draft) => chatDraft().write(id, draft),
|
|
257
|
+
discard: (id) => chatDraft().discard(id),
|
|
258
|
+
},
|
|
259
|
+
observe: observing(within),
|
|
260
|
+
};
|
|
261
|
+
return {
|
|
262
|
+
md: view,
|
|
263
|
+
watch: within,
|
|
264
|
+
narrow(next) {
|
|
265
|
+
reach = next;
|
|
266
|
+
for (const restart of [...open])
|
|
267
|
+
restart();
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
}
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { MdRuntimeClient } from './client.js';
|
|
2
|
+
import type { AppRoom, ConnectionRefusal, SaveResult } from './connection.js';
|
|
3
|
+
import type { ServiceMode } from './adapter.js';
|
|
4
|
+
import type { ConversationEntry, ConversationOptions, ConversationView } from './conversation.js';
|
|
5
|
+
import type { QueueEntry } from './outcome.js';
|
|
6
|
+
import type { DocumentQuery, DocumentResult, GroupQuery, GroupResult } from './query.js';
|
|
7
|
+
import type { RoomDraft, RoomDraftParts } from './room-draft.js';
|
|
8
|
+
import type { SyncStatus } from './status.js';
|
|
9
|
+
type Client = MdRuntimeClient | null;
|
|
10
|
+
export declare function useObserve(client: Client, topic: 'deployment-facts'): unknown;
|
|
11
|
+
export declare function useObserve(client: Client, topic: 'rooms'): readonly AppRoom[] | undefined;
|
|
12
|
+
export declare function useObserve(client: Client, topic: 'connection-refusal'): ConnectionRefusal | null | undefined;
|
|
13
|
+
export declare function useObserve(client: Client, topic: 'storage-loss'): string | null | undefined;
|
|
14
|
+
export declare function useObserve(client: Client, topic: 'sync-status'): SyncStatus | undefined;
|
|
15
|
+
export declare function useObserve(client: Client, topic: 'service-mode'): ServiceMode | undefined;
|
|
16
|
+
export declare function useObserve(client: Client, topic: 'query', query: DocumentQuery): DocumentResult | undefined;
|
|
17
|
+
export declare function useObserve(client: Client, topic: 'query', query: GroupQuery): GroupResult | undefined;
|
|
18
|
+
export declare function useObserve(client: Client, topic: 'queue', locator: string): readonly QueueEntry[] | undefined;
|
|
19
|
+
export declare function useObserve(client: Client, topic: 'room-drafts'): readonly RoomDraft[] | undefined;
|
|
20
|
+
export declare function useObserve(client: Client, topic: 'presentation'): unknown;
|
|
21
|
+
export declare function useObserve(client: Client, topic: 'conversation', conversation: string, options: ConversationOptions): ConversationView | undefined;
|
|
22
|
+
export declare function useObserve(client: Client, topic: 'conversations'): readonly ConversationEntry[] | undefined;
|
|
23
|
+
export type Saving = {
|
|
24
|
+
readonly busy: boolean;
|
|
25
|
+
readonly outcome: SaveResult | null;
|
|
26
|
+
readonly failure: Error | null;
|
|
27
|
+
save(room: string, roomDrafts: ReadonlyMap<string, RoomDraftParts>): Promise<SaveResult>;
|
|
28
|
+
};
|
|
29
|
+
export declare function useSave(client: MdRuntimeClient): Saving;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"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"}
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
+
export function useObserve(client, topic, ...input) {
|
|
3
|
+
const key = JSON.stringify([topic, ...input]);
|
|
4
|
+
const [held, setHeld] = useState(null);
|
|
5
|
+
const opened = useRef(input);
|
|
6
|
+
opened.current = input;
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
if (client === null)
|
|
9
|
+
return;
|
|
10
|
+
let live = true;
|
|
11
|
+
let observation = null;
|
|
12
|
+
const observe = client.observe;
|
|
13
|
+
void observe(topic, ...opened.current).then((open) => {
|
|
14
|
+
if (!live) {
|
|
15
|
+
open.close();
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
observation = open;
|
|
19
|
+
const take = (value) => {
|
|
20
|
+
if (live)
|
|
21
|
+
setHeld({ client, key, value });
|
|
22
|
+
};
|
|
23
|
+
take(open.current());
|
|
24
|
+
open.subscribe(take);
|
|
25
|
+
});
|
|
26
|
+
return () => {
|
|
27
|
+
live = false;
|
|
28
|
+
observation?.close();
|
|
29
|
+
};
|
|
30
|
+
}, [client, key]);
|
|
31
|
+
return held !== null && held.client === client && held.key === key ? held.value : undefined;
|
|
32
|
+
}
|
|
33
|
+
const IDLE = { busy: false, outcome: null, failure: null };
|
|
34
|
+
async function written(client, room, roomDrafts) {
|
|
35
|
+
const kept = [];
|
|
36
|
+
for (const [path, parts] of roomDrafts) {
|
|
37
|
+
const prior = await client.roomDraft.read(room, path);
|
|
38
|
+
const write = await client.roomDraft.write(room, path, prior?.revision ?? null, parts);
|
|
39
|
+
if (write.outcome !== 'written' || write.roomDraft === null) {
|
|
40
|
+
throw new Error(`the Room Draft at ${path} was not written`);
|
|
41
|
+
}
|
|
42
|
+
kept.push({ path, revision: write.roomDraft.revision });
|
|
43
|
+
}
|
|
44
|
+
return client.save(room, kept);
|
|
45
|
+
}
|
|
46
|
+
export function useSave(client) {
|
|
47
|
+
const [state, setState] = useState(IDLE);
|
|
48
|
+
const save = useCallback(async (room, roomDrafts) => {
|
|
49
|
+
setState({ busy: true, outcome: null, failure: null });
|
|
50
|
+
try {
|
|
51
|
+
const outcome = await written(client, room, roomDrafts);
|
|
52
|
+
setState({ busy: false, outcome, failure: null });
|
|
53
|
+
return outcome;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
const failure = error instanceof Error ? error : new Error(String(error));
|
|
57
|
+
setState({ busy: false, outcome: null, failure });
|
|
58
|
+
throw failure;
|
|
59
|
+
}
|
|
60
|
+
}, [client]);
|
|
61
|
+
return { ...state, save };
|
|
62
|
+
}
|
package/dist/read-side.d.ts
CHANGED
|
@@ -10,5 +10,9 @@ export type ReadSide = {
|
|
|
10
10
|
document(room: string, path: string): SearchedDocument | null;
|
|
11
11
|
close(): void;
|
|
12
12
|
};
|
|
13
|
+
export declare function reconciled(previous: KeyedResult, next: KeyedResult): {
|
|
14
|
+
keyed: KeyedResult;
|
|
15
|
+
change: QueryChange;
|
|
16
|
+
} | null;
|
|
13
17
|
export declare function createReadSide(): ReadSide;
|
|
14
18
|
//# sourceMappingURL=read-side.d.ts.map
|
package/dist/read-side.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-side.d.ts","sourceRoot":"","sources":["../src/read-side.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"read-side.d.ts","sourceRoot":"","sources":["../src/read-side.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAU,KAAK,WAAW,EAAE,KAAK,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAC3F,OAAO,KAAK,EAOV,IAAI,EAIJ,WAAW,EAIZ,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAuDpD,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACxC,KAAK,CACH,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,KAAK,IAAI,GACpD,MAAM,IAAI,CAAC;IACd,SAAS,IAAI,SAAS,gBAAgB,EAAE,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAC;IAC9D,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AA+UF,wBAAgB,UAAU,CACxB,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,WAAW,GAChB;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GAAG,IAAI,CA4BpD;AAED,wBAAgB,cAAc,IAAI,QAAQ,CA4HzC"}
|
package/dist/read-side.js
CHANGED
|
@@ -1,62 +1,71 @@
|
|
|
1
|
-
import { and, BasicIndex, configureIndexDevMode, count, createCollection, createLiveQueryCollection, deepEquals, eq,
|
|
1
|
+
import { and, BasicIndex, configureIndexDevMode, count, createCollection, createLiveQueryCollection, deepEquals, eq, inArray, or, toArray, } from '@tanstack/db';
|
|
2
|
+
import { ARRAY_INDEX, pointerSegments } from '@agentshouse/mdmodel';
|
|
2
3
|
import { rowsOf } from './observation.js';
|
|
3
4
|
import { documentKey } from './rows.js';
|
|
4
5
|
function every(expressions) {
|
|
5
6
|
const [first, second, ...rest] = expressions;
|
|
6
7
|
return second === undefined ? first : and(first, second, ...rest);
|
|
7
8
|
}
|
|
8
|
-
function
|
|
9
|
-
|
|
10
|
-
return second === undefined ? first : or(first, second, ...rest);
|
|
9
|
+
function same(held, value) {
|
|
10
|
+
return Array.isArray(held) ? held.includes(value) : held === value;
|
|
11
11
|
}
|
|
12
|
-
function
|
|
13
|
-
|
|
12
|
+
function ordered(held, [operator, bound]) {
|
|
13
|
+
if (typeof held !== typeof bound || held === null || typeof held === 'object')
|
|
14
|
+
return false;
|
|
15
|
+
const left = held;
|
|
16
|
+
const right = bound;
|
|
17
|
+
if (operator === 'gt')
|
|
18
|
+
return left > right;
|
|
19
|
+
if (operator === 'gte')
|
|
20
|
+
return left >= right;
|
|
21
|
+
if (operator === 'lt')
|
|
22
|
+
return left < right;
|
|
23
|
+
return left <= right;
|
|
14
24
|
}
|
|
15
|
-
function
|
|
25
|
+
function satisfied(test, held) {
|
|
16
26
|
if (test.op === 'eq')
|
|
17
|
-
return
|
|
18
|
-
if (test.op === 'ne')
|
|
19
|
-
return test.value
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const compare = { gt, gte, lt, lte };
|
|
37
|
-
return every(test.bounds.map(([operator, bound]) => compare[operator](field, bound)));
|
|
38
|
-
}
|
|
39
|
-
if (test.op === 'all') {
|
|
40
|
-
return every([not(isUndefined(size)), ...test.values.map((value) => inArray(value, field))]);
|
|
41
|
-
}
|
|
42
|
-
if (test.op === 'size')
|
|
43
|
-
return eq(size, test.size);
|
|
44
|
-
return test.exists ? not(isUndefined(written)) : isUndefined(written);
|
|
27
|
+
return same(held, test.value);
|
|
28
|
+
if (test.op === 'ne')
|
|
29
|
+
return !same(held, test.value);
|
|
30
|
+
if (test.op === 'in')
|
|
31
|
+
return test.values.some((value) => same(held, value));
|
|
32
|
+
if (test.op === 'nin')
|
|
33
|
+
return !test.values.some((value) => same(held, value));
|
|
34
|
+
if (test.op === 'range')
|
|
35
|
+
return test.bounds.every((bound) => ordered(held, bound));
|
|
36
|
+
if (test.op === 'all')
|
|
37
|
+
return Array.isArray(held) && test.values.every((value) => same(held, value));
|
|
38
|
+
return Array.isArray(held) && held.length === test.size;
|
|
39
|
+
}
|
|
40
|
+
function tested(test, reached) {
|
|
41
|
+
if (test.op === 'exists')
|
|
42
|
+
return test.exists === (reached !== undefined);
|
|
43
|
+
if (reached === undefined)
|
|
44
|
+
return test.op === 'ne' || test.op === 'nin';
|
|
45
|
+
return reached.some((held) => satisfied(test, held));
|
|
45
46
|
}
|
|
46
47
|
function conditioned(condition, row) {
|
|
47
48
|
if ('every' in condition)
|
|
48
|
-
return
|
|
49
|
+
return condition.every.every((item) => conditioned(item, row));
|
|
49
50
|
if ('some' in condition)
|
|
50
|
-
return
|
|
51
|
-
return tested(condition.test, row.
|
|
51
|
+
return condition.some.some((item) => conditioned(item, row));
|
|
52
|
+
return tested(condition.test, row.reached[condition.field]);
|
|
53
|
+
}
|
|
54
|
+
function narrowed(query, where, alias) {
|
|
55
|
+
return where === null ? query : query.fn.where((row) => conditioned(where, row[alias]));
|
|
56
|
+
}
|
|
57
|
+
function reached(reach, room, document) {
|
|
58
|
+
return reach === null
|
|
59
|
+
? []
|
|
60
|
+
: [or(inArray(room, [...reach.rooms]), inArray(document, [...reach.documents]))];
|
|
52
61
|
}
|
|
53
|
-
function scoped(scope, row, rooms) {
|
|
62
|
+
function scoped(scope, row, rooms, reach) {
|
|
54
63
|
return every([
|
|
55
64
|
eq(row.kind, 'document'),
|
|
56
65
|
...(rooms === null ? [] : [inArray(row.room, [...rooms])]),
|
|
66
|
+
...reached(reach, row.room, row.key),
|
|
57
67
|
...(scope.types === null ? [] : [inArray(row.type, [...scope.types])]),
|
|
58
68
|
...(scope.pathPrefix === null ? [] : [inArray(scope.pathPrefix, row.directories)]),
|
|
59
|
-
...(scope.where === null ? [] : [conditioned(scope.where, row)]),
|
|
60
69
|
]);
|
|
61
70
|
}
|
|
62
71
|
function keyed(key, row) {
|
|
@@ -68,25 +77,26 @@ function live(query) {
|
|
|
68
77
|
startSync: true,
|
|
69
78
|
});
|
|
70
79
|
}
|
|
71
|
-
function related(q, rows, scope, field, kept) {
|
|
80
|
+
function related(q, rows, scope, field, kept, reach) {
|
|
72
81
|
const matched = kept === 'source' ? 'target' : 'source';
|
|
73
82
|
const from = q.from({ r: rows });
|
|
74
|
-
|
|
75
|
-
.where(({ r }) => every([eq(r.kind, 'reference'), ...(field === null ? [] : [
|
|
83
|
+
const joined = from
|
|
84
|
+
.where(({ r }) => every([eq(r.kind, 'reference'), ...(field === null ? [] : [inArray(field, r.forms)])]))
|
|
76
85
|
.innerJoin({ m: rows }, ({ r, m }) => eq(r[matched], m.key))
|
|
77
|
-
.where(({ m }) => scoped(scope, m, null))
|
|
86
|
+
.where(({ m }) => scoped(scope, m, null, reach));
|
|
87
|
+
return narrowed(joined, scope.where, 'm')
|
|
78
88
|
.groupBy(({ r }) => r[kept])
|
|
79
89
|
.select(({ r }) => ({ key: r[kept] }));
|
|
80
90
|
}
|
|
81
91
|
function filtered(q, rows, plan) {
|
|
82
92
|
const from = q.from({ d: rows });
|
|
83
|
-
let query = from.where(({ d }) => scoped(plan.root, d, plan.rooms));
|
|
93
|
+
let query = narrowed(from.where(({ d }) => scoped(plan.root, d, plan.rooms, plan.reach)), plan.root.where, 'd');
|
|
84
94
|
if (plan.hop !== null) {
|
|
85
|
-
const hop = related(q, rows, plan.hop, plan.hop.field, 'source');
|
|
95
|
+
const hop = related(q, rows, plan.hop, plan.hop.field, 'source', plan.reach);
|
|
86
96
|
query = query.innerJoin({ h: hop }, ({ d, h }) => eq(d.key, h.key));
|
|
87
97
|
}
|
|
88
98
|
if (plan.backlinks !== null) {
|
|
89
|
-
const backlinks = related(q, rows, plan.backlinks, plan.backlinks.field, 'target');
|
|
99
|
+
const backlinks = related(q, rows, plan.backlinks, plan.backlinks.field, 'target', plan.reach);
|
|
90
100
|
query = query.innerJoin({ k: backlinks }, ({ d, k }) => eq(d.key, k.key));
|
|
91
101
|
}
|
|
92
102
|
return query;
|
|
@@ -111,20 +121,19 @@ function documents(q, rows, plan, shape) {
|
|
|
111
121
|
room: d.room,
|
|
112
122
|
path: d.path,
|
|
113
123
|
type: d.type,
|
|
114
|
-
...(shape.fields ===
|
|
115
|
-
...(Array.isArray(shape.fields) ? named('field', shape.fields, d.fields) : {}),
|
|
124
|
+
...(shape.fields === null ? {} : { fields: d.fields }),
|
|
116
125
|
...(shape.sections === 'all' ? { sections: b.sections } : {}),
|
|
117
126
|
...(Array.isArray(shape.sections) ? named('section', shape.sections, b.sections) : {}),
|
|
118
127
|
...(shape.preamble ? { preamble: b.preamble } : {}),
|
|
119
128
|
...(shape.markdown ? { markdown: b.markdown } : {}),
|
|
120
|
-
...(shape.backlinks ? { backlinks: toArray(backlinked(q, rows, d)) } : {}),
|
|
129
|
+
...(shape.backlinks ? { backlinks: toArray(backlinked(q, rows, d, plan.reach)) } : {}),
|
|
121
130
|
...(shape.change ? { change: d.change } : {}),
|
|
122
131
|
}));
|
|
123
132
|
}
|
|
124
|
-
function backlinked(q, rows, document) {
|
|
133
|
+
function backlinked(q, rows, document, reach) {
|
|
125
134
|
const from = q.from({ r: rows });
|
|
126
135
|
return from
|
|
127
|
-
.where(({ r }) => eq(r.target, document.key))
|
|
136
|
+
.where(({ r }) => every([eq(r.target, document.key), ...reached(reach, r.room, r.source)]))
|
|
128
137
|
.orderBy(({ r }) => r.path, { stringSort: 'lexical' })
|
|
129
138
|
.orderBy(({ r }) => r.field, { stringSort: 'lexical' })
|
|
130
139
|
.select(({ r }) => ({ path: r.path, type: r.type, field: r.field }));
|
|
@@ -170,6 +179,55 @@ function part(row, prefix, names, whole) {
|
|
|
170
179
|
return whole;
|
|
171
180
|
return present(names.map((name, index) => [name, row[`${prefix}${index}`]]));
|
|
172
181
|
}
|
|
182
|
+
function masked(pointers) {
|
|
183
|
+
const root = { whole: false, members: new Map() };
|
|
184
|
+
for (const pointer of pointers) {
|
|
185
|
+
let mask = root;
|
|
186
|
+
for (const token of pointerSegments(pointer)) {
|
|
187
|
+
const next = mask.members.get(token) ?? { whole: false, members: new Map() };
|
|
188
|
+
mask.members.set(token, next);
|
|
189
|
+
mask = next;
|
|
190
|
+
}
|
|
191
|
+
mask.whole = true;
|
|
192
|
+
}
|
|
193
|
+
return root;
|
|
194
|
+
}
|
|
195
|
+
function merged(left, right) {
|
|
196
|
+
if (left === undefined)
|
|
197
|
+
return right;
|
|
198
|
+
const members = new Map(left.members);
|
|
199
|
+
for (const [token, mask] of right.members)
|
|
200
|
+
members.set(token, merged(members.get(token), mask));
|
|
201
|
+
return { whole: left.whole || right.whole, members };
|
|
202
|
+
}
|
|
203
|
+
function cut(value, mask) {
|
|
204
|
+
if (mask.whole)
|
|
205
|
+
return value;
|
|
206
|
+
if (Array.isArray(value)) {
|
|
207
|
+
const each = {
|
|
208
|
+
whole: false,
|
|
209
|
+
members: new Map([...mask.members].filter(([token]) => !ARRAY_INDEX.test(token))),
|
|
210
|
+
};
|
|
211
|
+
const kept = [];
|
|
212
|
+
value.forEach((item, index) => {
|
|
213
|
+
const part = cut(item, merged(mask.members.get(String(index)), each));
|
|
214
|
+
if (part !== undefined)
|
|
215
|
+
kept[index] = part;
|
|
216
|
+
});
|
|
217
|
+
return kept.length === 0 ? undefined : kept;
|
|
218
|
+
}
|
|
219
|
+
if (typeof value !== 'object' || value === null)
|
|
220
|
+
return undefined;
|
|
221
|
+
const kept = Object.entries(value).flatMap(([key, held]) => {
|
|
222
|
+
const member = mask.members.get(key);
|
|
223
|
+
const part = member === undefined ? undefined : cut(held, member);
|
|
224
|
+
return part === undefined ? [] : [[key, part]];
|
|
225
|
+
});
|
|
226
|
+
return kept.length === 0 ? undefined : Object.fromEntries(kept);
|
|
227
|
+
}
|
|
228
|
+
function selected(fields, pointers) {
|
|
229
|
+
return (cut(fields, masked(pointers)) ?? {});
|
|
230
|
+
}
|
|
173
231
|
function documentOf(row, shape) {
|
|
174
232
|
if (row.type === null)
|
|
175
233
|
return { room: row.room, path: row.path };
|
|
@@ -179,7 +237,11 @@ function documentOf(row, shape) {
|
|
|
179
237
|
type: row.type,
|
|
180
238
|
...(shape.fields === null
|
|
181
239
|
? {}
|
|
182
|
-
: {
|
|
240
|
+
: {
|
|
241
|
+
fields: shape.fields === 'all'
|
|
242
|
+
? row.fields
|
|
243
|
+
: selected(row.fields, shape.fields),
|
|
244
|
+
}),
|
|
183
245
|
...(shape.sections === null
|
|
184
246
|
? {}
|
|
185
247
|
: {
|
|
@@ -214,7 +276,7 @@ function keyedOf(plan, entries) {
|
|
|
214
276
|
keys: bounded.map(([key]) => key),
|
|
215
277
|
};
|
|
216
278
|
}
|
|
217
|
-
function reconciled(previous, next) {
|
|
279
|
+
export function reconciled(previous, next) {
|
|
218
280
|
const before = rowsOf(previous.result);
|
|
219
281
|
const held = new Map(previous.keys.map((key, index) => [key, before[index]]));
|
|
220
282
|
const changed = [];
|
package/dist/refresh.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Adapter, AdapterFailure, Authorization, RetryableRefusal } from './adapter.js';
|
|
2
|
+
import type { Remodel } from './bootstrap.js';
|
|
2
3
|
import { type ConfirmedLayer } from './replica.js';
|
|
3
4
|
import { type Refused, type Unconfirmed } from './transfer.js';
|
|
4
5
|
export type RefreshOutcome = {
|
|
@@ -9,5 +10,5 @@ export type RefreshOutcome = {
|
|
|
9
10
|
} | {
|
|
10
11
|
kind: 'beyond-horizon';
|
|
11
12
|
} | RetryableRefusal | Unconfirmed | Refused | AdapterFailure;
|
|
12
|
-
export declare function refreshRoom(adapter: Adapter, authorization: Authorization, confirmed: ConfirmedLayer, continuing: () => boolean
|
|
13
|
+
export declare function refreshRoom(adapter: Adapter, authorization: Authorization, confirmed: ConfirmedLayer, remodel: Remodel, continuing: () => boolean): Promise<RefreshOutcome>;
|
|
13
14
|
//# sourceMappingURL=refresh.d.ts.map
|
package/dist/refresh.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,aAAa,EAGb,gBAAgB,EAEjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAe,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,OAAO,GACP,cAAc,CAAC;AAEnB,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,cAAc,EACzB,
|
|
1
|
+
{"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,aAAa,EAGb,gBAAgB,EAEjB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAe,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,OAAO,GACP,cAAc,CAAC;AAEnB,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,OAAO,GACxB,OAAO,CAAC,cAAc,CAAC,CA8EzB"}
|