@agentshouse/mdruntime 0.1.0-c588e78cf6975 → 0.1.0-c59a5a6bd2f31
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 +2 -2
- package/dist/acceptance.d.ts +26 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +384 -0
- package/dist/adapter.d.ts +38 -25
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +3 -10
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +21 -56
- package/dist/bootstrap.d.ts +8 -4
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +209 -78
- package/dist/chain.d.ts +2 -1
- package/dist/chain.d.ts.map +1 -1
- package/dist/change.d.ts +1 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/chat-types.d.ts +3 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +2 -0
- package/dist/client.d.ts +14 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3 -0
- package/dist/collection.d.ts +2 -1
- package/dist/collection.d.ts.map +1 -1
- package/dist/compile.d.ts +7 -7
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +229 -297
- package/dist/connection.d.ts +19 -43
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +1325 -3586
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +7 -0
- package/dist/conversation-row.d.ts +33 -0
- package/dist/conversation-row.d.ts.map +1 -0
- package/dist/conversation-row.js +47 -0
- package/dist/conversation.d.ts +18 -9
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +375 -224
- package/dist/durability.d.ts +6 -0
- package/dist/durability.d.ts.map +1 -1
- package/dist/entry.d.ts +2 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +17 -8
- package/dist/figures.d.ts +48 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +197 -0
- package/dist/host.d.ts +4 -5
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +22 -21
- package/dist/identity.d.ts +0 -1
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -3
- package/dist/index.d.ts +18 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/install.d.ts +86 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +537 -0
- package/dist/job.d.ts +33 -0
- package/dist/job.d.ts.map +1 -0
- package/dist/job.js +54 -0
- package/dist/live.d.ts +5 -4
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +62 -20
- package/dist/log.d.ts +1 -0
- package/dist/log.d.ts.map +1 -1
- package/dist/memory.d.ts +4 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +43 -4
- package/dist/messages.d.ts +27 -3
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +97 -19
- package/dist/model.d.ts +2 -9
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +0 -9
- package/dist/observation.d.ts +2 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +7 -2
- package/dist/outcome.d.ts +1 -0
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +3 -0
- package/dist/overlay.d.ts +1 -0
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +11 -0
- package/dist/parts.d.ts +59 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +118 -0
- package/dist/query.d.ts +13 -210
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -508
- package/dist/questions.d.ts +32 -0
- package/dist/questions.d.ts.map +1 -0
- package/dist/questions.js +118 -0
- package/dist/reach.d.ts +11 -11
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +166 -113
- package/dist/react.d.ts +4 -2
- package/dist/react.d.ts.map +1 -1
- package/dist/read.d.ts +7 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +17 -0
- package/dist/readiness.d.ts +0 -2
- package/dist/readiness.d.ts.map +1 -1
- package/dist/reads.d.ts +35 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +128 -0
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +9 -1
- package/dist/refresh.d.ts +1 -1
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +8 -20
- package/dist/replica.d.ts +8 -8
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +50 -18
- package/dist/room-draft.d.ts +3 -2
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +4 -4
- package/dist/room-drafts.d.ts +29 -0
- package/dist/room-drafts.d.ts.map +1 -0
- package/dist/room-drafts.js +216 -0
- package/dist/rows.d.ts +14 -22
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +48 -189
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +11 -8
- package/dist/saves.d.ts +96 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +999 -0
- package/dist/search.d.ts +12 -63
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +9 -52
- package/dist/seed.d.ts +16 -2
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +66 -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/reads.d.ts +10 -0
- package/dist/socket/reads.d.ts.map +1 -0
- package/dist/socket/reads.js +31 -0
- package/dist/socket.d.ts +43 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +96 -0
- package/dist/source.d.ts +61 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +81 -0
- package/dist/status.d.ts +0 -2
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +0 -6
- package/dist/store/fences.d.ts +16 -0
- package/dist/store/fences.d.ts.map +1 -0
- package/dist/store/fences.js +26 -0
- package/dist/store/installs.d.ts +30 -0
- package/dist/store/installs.d.ts.map +1 -0
- package/dist/store/installs.js +34 -0
- package/dist/store/records.d.ts +212 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +408 -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/watchers.d.ts +15 -0
- package/dist/store/watchers.d.ts.map +1 -0
- package/dist/store/watchers.js +36 -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 +78 -156
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +117 -401
- package/dist/stored.d.ts +58 -65
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +264 -243
- package/dist/tables.d.ts +107 -51
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +193 -59
- package/dist/tallies.d.ts +18 -0
- package/dist/tallies.d.ts.map +1 -0
- package/dist/tallies.js +129 -0
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +7 -4
- package/dist/windows.d.ts +1 -12
- package/dist/windows.d.ts.map +1 -1
- package/dist/windows.js +2 -75
- package/dist/wire.d.ts +14 -0
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +5 -0
- package/package.json +2 -2
- package/dist/fence.d.ts +0 -6
- package/dist/fence.d.ts.map +0 -1
- package/dist/fence.js +0 -10
- package/dist/fulltext.d.ts +0 -27
- package/dist/fulltext.d.ts.map +0 -1
- package/dist/fulltext.js +0 -370
- package/dist/words.d.ts +0 -19
- package/dist/words.d.ts.map +0 -1
- package/dist/words.js +0 -156
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-drafts.d.ts","sourceRoot":"","sources":["../src/room-drafts.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5D,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAQL,KAAK,SAAS,EAEd,KAAK,cAAc,EACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGxC,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,MAAM,IAAI,OAAO,CAAC;IAClB,gBAAgB,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,IAAI,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC5D,KAAK,CACH,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAChF,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9E,CAAC;AAMF,wBAAsB,SAAS,CAC7B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAMnC;AA0CD,wBAAgB,iBAAiB,CAC/B,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,EAC/B,WAAW,EAAE,OAAO,EACpB,OAAO,GAAE,SAAS,CAAC,WAAW,CAAC,GAAG,IAAW,GAC5C,OAAO,CAAC,IAAI,CAAC,CAuBf;AAOD,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU5F;AA4DD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,gBAAgB,CAkDzE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,mBAAmB,CA0B/E;AAED,wBAAgB,eAAe,CAC7B,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,EAC/B,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAChC,MAAM,IAAI,CAiBZ;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,EAC/B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAChC,MAAM,IAAI,CASZ"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { plain } from '@agentshouse/mdmodel';
|
|
2
|
+
import { changeSet } from './change-set.js';
|
|
3
|
+
import { collectionOf } from './collection.js';
|
|
4
|
+
import { runtimeError } from './failure.js';
|
|
5
|
+
import { roomDraftRevision } from './identity.js';
|
|
6
|
+
import { normalize } from './paths.js';
|
|
7
|
+
import { slicing } from './replica.js';
|
|
8
|
+
import { binaryBase, gatheredParts, held, heldFile, readParts, staleWrite, underneath, } from './room-draft.js';
|
|
9
|
+
import { stepped } from './turn.js';
|
|
10
|
+
const ROOM_DRAFTS = 'room-drafts';
|
|
11
|
+
const presentationTopic = (app) => `presentation\u0000${app}`;
|
|
12
|
+
export async function visibleOf(store, locator, paths) {
|
|
13
|
+
const kept = await store.record(locator);
|
|
14
|
+
if (kept === undefined)
|
|
15
|
+
return undefined;
|
|
16
|
+
const local = await store.open();
|
|
17
|
+
const slice = await stepped(slicing(await local.entries(kept.key, 'visible', paths), paths));
|
|
18
|
+
return { ...slice, collection: collectionOf(slice.documents, store.composed(kept)) };
|
|
19
|
+
}
|
|
20
|
+
function roomDraftOf(record, visible) {
|
|
21
|
+
return structuredClone({
|
|
22
|
+
room: record.locator,
|
|
23
|
+
path: record.path,
|
|
24
|
+
revision: record.revision,
|
|
25
|
+
parts: record.parts,
|
|
26
|
+
changedUnderneath: underneath(record.parts, record.path, visible),
|
|
27
|
+
returned: record.returned,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
async function roomDraftsOf(store, records) {
|
|
31
|
+
const rooms = new Map();
|
|
32
|
+
for (const record of records) {
|
|
33
|
+
const paths = rooms.get(record.locator) ?? [];
|
|
34
|
+
paths.push(record.path);
|
|
35
|
+
rooms.set(record.locator, paths);
|
|
36
|
+
}
|
|
37
|
+
const layers = new Map();
|
|
38
|
+
for (const [locator, paths] of rooms) {
|
|
39
|
+
layers.set(locator, await visibleOf(store, locator, paths));
|
|
40
|
+
}
|
|
41
|
+
return records.map((record) => roomDraftOf(record, layers.get(record.locator)));
|
|
42
|
+
}
|
|
43
|
+
function inOrder(records) {
|
|
44
|
+
return [...records].sort((left, right) => {
|
|
45
|
+
if (left.locator !== right.locator)
|
|
46
|
+
return left.locator < right.locator ? -1 : 1;
|
|
47
|
+
if (left.path !== right.path)
|
|
48
|
+
return left.path < right.path ? -1 : 1;
|
|
49
|
+
return 0;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
async function snapshotRoomDrafts(store) {
|
|
53
|
+
return roomDraftsOf(store, inOrder(await store.drafts()));
|
|
54
|
+
}
|
|
55
|
+
export function publishRoomDrafts({ store, closed }, waitingOnly, touched = null) {
|
|
56
|
+
const unwatched = () => closed() || store.watching(ROOM_DRAFTS).length === 0;
|
|
57
|
+
if (unwatched())
|
|
58
|
+
return Promise.resolve();
|
|
59
|
+
return store.publication(async () => {
|
|
60
|
+
if (unwatched())
|
|
61
|
+
return;
|
|
62
|
+
const records = await store.drafts();
|
|
63
|
+
if (closed())
|
|
64
|
+
return;
|
|
65
|
+
if (touched !== null &&
|
|
66
|
+
!records.some((record) => touched.some(({ locator, path }) => locator === record.locator && (path === null || path === record.path)))) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const value = await roomDraftsOf(store, inOrder(records));
|
|
70
|
+
if (closed())
|
|
71
|
+
return;
|
|
72
|
+
const answered = store.watching(ROOM_DRAFTS, waitingOnly ? 'waiting' : 'all');
|
|
73
|
+
for (const watcher of answered)
|
|
74
|
+
watcher.answer(value);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
async function presentationOf(store, app) {
|
|
78
|
+
const value = await (await store.open()).presentation(app);
|
|
79
|
+
return value === undefined ? null : structuredClone(value);
|
|
80
|
+
}
|
|
81
|
+
export function emitPresentation({ store, closed }, app) {
|
|
82
|
+
const topic = presentationTopic(app);
|
|
83
|
+
const listening = () => store.watching(topic, 'ready');
|
|
84
|
+
if (closed() || listening().length === 0)
|
|
85
|
+
return Promise.resolve();
|
|
86
|
+
return store.publication(async () => {
|
|
87
|
+
if (closed() || listening().length === 0)
|
|
88
|
+
return;
|
|
89
|
+
const value = await presentationOf(store, app);
|
|
90
|
+
if (closed())
|
|
91
|
+
return;
|
|
92
|
+
for (const watcher of listening())
|
|
93
|
+
watcher.answer(value);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
async function writtenRoomDraft({ store, publishChangeSet }, room, path, revision, input, next) {
|
|
97
|
+
const parts = readParts(input, path);
|
|
98
|
+
if (path === '' || normalize(path) !== path)
|
|
99
|
+
throw runtimeError('room-draft-malformed', `room-draft-malformed at ${path}: a path inside the Room, such as notes/a.md`);
|
|
100
|
+
const local = await store.open();
|
|
101
|
+
const current = await store.draft(room, path);
|
|
102
|
+
if ((current?.revision ?? null) !== revision) {
|
|
103
|
+
return staleWrite(current === undefined ? null : ((await roomDraftsOf(store, [current]))[0] ?? null));
|
|
104
|
+
}
|
|
105
|
+
const file = parts.file === undefined
|
|
106
|
+
? undefined
|
|
107
|
+
: await heldFile(parts.file.blob, parts.file.base === undefined
|
|
108
|
+
? binaryBase(await visibleOf(store, room, [path]), path)
|
|
109
|
+
: parts.file.base);
|
|
110
|
+
const record = {
|
|
111
|
+
locator: room,
|
|
112
|
+
path,
|
|
113
|
+
revision: next,
|
|
114
|
+
parts: held(current?.parts, parts, file),
|
|
115
|
+
returned: current?.returned ?? null,
|
|
116
|
+
};
|
|
117
|
+
await local.keepRoomDraft(record, parts.file === undefined || file === undefined
|
|
118
|
+
? []
|
|
119
|
+
: [{ key: file.localId, blob: parts.file.blob }]);
|
|
120
|
+
await publishChangeSet(changeSet(room, { drafts: [path] }));
|
|
121
|
+
return { outcome: 'written', roomDraft: (await roomDraftsOf(store, [record]))[0] ?? null };
|
|
122
|
+
}
|
|
123
|
+
async function keptPresentation({ store, publishChangeSet }, app, next) {
|
|
124
|
+
const local = await store.open();
|
|
125
|
+
const stored = next(await local.presentation(app));
|
|
126
|
+
await local.present({ app, value: stored });
|
|
127
|
+
await publishChangeSet(changeSet('', { presentation: app }));
|
|
128
|
+
}
|
|
129
|
+
export function roomDraftSurface(drafting) {
|
|
130
|
+
const { store, publishChangeSet, statusShown } = drafting;
|
|
131
|
+
return {
|
|
132
|
+
list() {
|
|
133
|
+
return store
|
|
134
|
+
.exclusive(async () => {
|
|
135
|
+
await store.open();
|
|
136
|
+
return snapshotRoomDrafts(store);
|
|
137
|
+
})
|
|
138
|
+
.then((listed) => {
|
|
139
|
+
publishRoomDrafts(drafting, true);
|
|
140
|
+
return listed;
|
|
141
|
+
});
|
|
142
|
+
},
|
|
143
|
+
async read(room, path) {
|
|
144
|
+
const record = await store.draft(room, path);
|
|
145
|
+
return record === undefined ? null : ((await roomDraftsOf(store, [record]))[0] ?? null);
|
|
146
|
+
},
|
|
147
|
+
write(room, path, revision, input, next = roomDraftRevision()) {
|
|
148
|
+
if (typeof next !== 'string' || next === '')
|
|
149
|
+
return Promise.reject(runtimeError('room-draft-malformed'));
|
|
150
|
+
return store.gathered(`room-draft\u0000${room}\u0000${path}`, { revision, input, next }, (earlier, later) => {
|
|
151
|
+
if (later.revision !== earlier.next)
|
|
152
|
+
return null;
|
|
153
|
+
const parts = gatheredParts(earlier.input, later.input);
|
|
154
|
+
return parts === null
|
|
155
|
+
? null
|
|
156
|
+
: { revision: earlier.revision, input: parts, next: later.next };
|
|
157
|
+
}, (written) => writtenRoomDraft(drafting, room, path, written.revision, written.input, written.next));
|
|
158
|
+
},
|
|
159
|
+
discard(room, path, revision) {
|
|
160
|
+
return store.exclusive(async () => {
|
|
161
|
+
const local = await store.open();
|
|
162
|
+
const current = await store.draft(room, path);
|
|
163
|
+
if (current === undefined || current.revision !== revision) {
|
|
164
|
+
return staleWrite(current === undefined ? null : ((await roomDraftsOf(store, [current]))[0] ?? null));
|
|
165
|
+
}
|
|
166
|
+
await local.discardRoomDraft(room, path);
|
|
167
|
+
await Promise.all([publishChangeSet(changeSet(room, { drafts: [path] })), statusShown()]);
|
|
168
|
+
return { outcome: 'written', roomDraft: null };
|
|
169
|
+
});
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
export function presentationSurface(drafting) {
|
|
174
|
+
const { store } = drafting;
|
|
175
|
+
return {
|
|
176
|
+
read(app) {
|
|
177
|
+
return store.exclusive(() => presentationOf(store, app));
|
|
178
|
+
},
|
|
179
|
+
write(app, value) {
|
|
180
|
+
return store.exclusive(() => keptPresentation(drafting, app, () => structuredClone(value)));
|
|
181
|
+
},
|
|
182
|
+
edit(app, members) {
|
|
183
|
+
return store.gathered(`presentation\u0000${app}`, structuredClone(members), (earlier, later) => ({ ...earlier, ...later }), (edited) => keptPresentation(drafting, app, (kept) => Object.fromEntries([
|
|
184
|
+
...Object.entries(plain(kept) ? kept : {}).filter(([member]) => !Object.hasOwn(edited, member)),
|
|
185
|
+
...Object.entries(edited).filter(([, value]) => value !== null),
|
|
186
|
+
])));
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
export function watchRoomDrafts({ store, closed }, deliver) {
|
|
191
|
+
const watcher = store.watch(ROOM_DRAFTS, deliver);
|
|
192
|
+
const unwatched = () => closed() || !watcher.held();
|
|
193
|
+
void store
|
|
194
|
+
.exclusive(async () => {
|
|
195
|
+
await store.open();
|
|
196
|
+
})
|
|
197
|
+
.then(() => store.publication(async () => {
|
|
198
|
+
if (unwatched())
|
|
199
|
+
return;
|
|
200
|
+
const value = await snapshotRoomDrafts(store);
|
|
201
|
+
if (!unwatched())
|
|
202
|
+
watcher.answer(value);
|
|
203
|
+
}), () => { });
|
|
204
|
+
return watcher.stop;
|
|
205
|
+
}
|
|
206
|
+
export function watchPresentation({ store, closed }, app, deliver) {
|
|
207
|
+
const watcher = store.watch(presentationTopic(app), deliver);
|
|
208
|
+
void store
|
|
209
|
+
.exclusive(async () => {
|
|
210
|
+
const value = await presentationOf(store, app);
|
|
211
|
+
if (!closed() && watcher.held())
|
|
212
|
+
watcher.answer(value);
|
|
213
|
+
})
|
|
214
|
+
.catch(() => { });
|
|
215
|
+
return watcher.stop;
|
|
216
|
+
}
|
package/dist/rows.d.ts
CHANGED
|
@@ -1,15 +1,7 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type HeldValue } from '@agentshouse/mdmodel';
|
|
2
|
+
import type { SavedFacts } from './adapter.js';
|
|
2
3
|
import { type Composition } from './collection.js';
|
|
3
|
-
|
|
4
|
-
type HeldValue = {
|
|
5
|
-
readonly keys: string;
|
|
6
|
-
readonly places: string;
|
|
7
|
-
readonly item: number;
|
|
8
|
-
readonly kind: ValueKind;
|
|
9
|
-
readonly value: string | number | null;
|
|
10
|
-
readonly size: number | null;
|
|
11
|
-
};
|
|
12
|
-
type LinkKind = 'field' | 'section' | 'body';
|
|
4
|
+
type LinkKind = 'field' | 'link';
|
|
13
5
|
type HeldLink = {
|
|
14
6
|
readonly kind: LinkKind;
|
|
15
7
|
readonly keys: string;
|
|
@@ -23,8 +15,14 @@ export type Described = {
|
|
|
23
15
|
readonly queried: boolean;
|
|
24
16
|
readonly folder: string;
|
|
25
17
|
readonly fields: string | null;
|
|
18
|
+
readonly links: string | null;
|
|
19
|
+
};
|
|
20
|
+
export type Held = {
|
|
21
|
+
readonly type: string | null;
|
|
22
|
+
readonly fields: Readonly<Record<string, unknown>> | null;
|
|
23
|
+
readonly links: readonly string[];
|
|
26
24
|
};
|
|
27
|
-
export type Derived =
|
|
25
|
+
export type Derived = {
|
|
28
26
|
readonly values: readonly HeldValue[];
|
|
29
27
|
readonly links: readonly HeldLink[];
|
|
30
28
|
};
|
|
@@ -33,15 +31,9 @@ export declare function roomOfKey(key: string): string;
|
|
|
33
31
|
export declare function pathOfKey(key: string): string;
|
|
34
32
|
export declare function markdownPath(path: string): boolean;
|
|
35
33
|
export declare function folderOf(path: string): string;
|
|
36
|
-
export
|
|
37
|
-
export
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
readonly glob: boolean;
|
|
41
|
-
};
|
|
42
|
-
export declare function placedOf(pointer: string, reach: Reach): Placed;
|
|
43
|
-
export declare function kindOf(value: unknown): ValueKind;
|
|
44
|
-
export declare function described(path: string, content: string | null, outlined: Outline | null): Described;
|
|
45
|
-
export declare function derived(path: string, content: string | null, outlined: Outline | null, composition: Composition): Derived;
|
|
34
|
+
export declare function writtenFacts(path: string, content: string, composition: Composition): SavedFacts | null;
|
|
35
|
+
export declare function described(path: string, content: string | null, facts: SavedFacts | null): Described;
|
|
36
|
+
export declare function heldOf(path: string, content: string | null, facts: SavedFacts | null): Held;
|
|
37
|
+
export declare function derived(path: string, held: Held, composition: Composition): Derived;
|
|
46
38
|
export {};
|
|
47
39
|
//# sourceMappingURL=rows.d.ts.map
|
package/dist/rows.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rows.d.ts","sourceRoot":"","sources":["../src/rows.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"rows.d.ts","sourceRoot":"","sources":["../src/rows.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8C,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9D,KAAK,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjC,KAAK,QAAQ,GAAG;IACd,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAC1D,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;CACrC,CAAC;AAMF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAaD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,WAAW,GACvB,UAAU,GAAG,IAAI,CAQnB;AAED,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,KAAK,EAAE,UAAU,GAAG,IAAI,GACvB,SAAS,CAeX;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAK3F;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAYnF"}
|
package/dist/rows.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { byCodePoint, documentFacts, indexed, parse } from '@agentshouse/mdmodel';
|
|
2
2
|
import { governing } from './collection.js';
|
|
3
3
|
import { definitionOf } from './model.js';
|
|
4
4
|
function keyOf(...parts) {
|
|
@@ -19,201 +19,60 @@ export function markdownPath(path) {
|
|
|
19
19
|
export function folderOf(path) {
|
|
20
20
|
return path.slice(0, Math.max(path.lastIndexOf('/'), 0));
|
|
21
21
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const keys = [first];
|
|
25
|
-
const gaps = [[]];
|
|
26
|
-
for (const segment of rest) {
|
|
27
|
-
if (ARRAY_INDEX.test(segment)) {
|
|
28
|
-
gaps.at(-1).push(segment);
|
|
29
|
-
continue;
|
|
30
|
-
}
|
|
31
|
-
keys.push(segment);
|
|
32
|
-
gaps.push([]);
|
|
33
|
-
}
|
|
34
|
-
const places = gaps
|
|
35
|
-
.map((gap, at) => {
|
|
36
|
-
const open = at < gaps.length - 1 ? reach !== 'exact' : reach === 'link';
|
|
37
|
-
return `/${gap.map((number) => `[.:]${number}`).join('')}.${open ? '*' : ''}`;
|
|
38
|
-
})
|
|
39
|
-
.join('');
|
|
40
|
-
return {
|
|
41
|
-
keys: keys.map((key) => `/${key}`).join(''),
|
|
42
|
-
places,
|
|
43
|
-
glob: /[[*]/u.test(places),
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
function placesOf({ done, head, tail }) {
|
|
47
|
-
return `${done}/${head}${tail}.`;
|
|
48
|
-
}
|
|
49
|
-
function throughOf(keys, places) {
|
|
50
|
-
const gaps = places.split('/').slice(1);
|
|
51
|
-
return keys
|
|
52
|
-
.split('/')
|
|
53
|
-
.slice(1)
|
|
54
|
-
.map((key, at) => `/${key}${gaps[at].replace(/\.\d*/gu, '').replaceAll(':', '/')}`)
|
|
55
|
-
.join('');
|
|
56
|
-
}
|
|
57
|
-
function plainObject(value) {
|
|
58
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
59
|
-
}
|
|
60
|
-
function compared(reading, exact, value) {
|
|
61
|
-
if (!reading.references.has(exact))
|
|
22
|
+
function byKey(_key, value) {
|
|
23
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
62
24
|
return value;
|
|
63
|
-
return (
|
|
64
|
-
}
|
|
65
|
-
export function kindOf(value) {
|
|
66
|
-
if (value === undefined)
|
|
67
|
-
return 'undefined';
|
|
68
|
-
if (value === null)
|
|
69
|
-
return 'null';
|
|
70
|
-
if (Array.isArray(value))
|
|
71
|
-
return 'array';
|
|
72
|
-
if (typeof value === 'object')
|
|
73
|
-
return 'object';
|
|
74
|
-
return typeof value;
|
|
25
|
+
return Object.fromEntries(Object.entries(value).sort(([one], [other]) => byCodePoint(one, other)));
|
|
75
26
|
}
|
|
76
|
-
function
|
|
77
|
-
|
|
78
|
-
return value;
|
|
79
|
-
if (typeof value === 'boolean')
|
|
80
|
-
return value ? 1 : 0;
|
|
81
|
-
if (Array.isArray(value))
|
|
82
|
-
return JSON.stringify(value);
|
|
83
|
-
return null;
|
|
27
|
+
function fieldsText(fields) {
|
|
28
|
+
return JSON.stringify(fields, byKey);
|
|
84
29
|
}
|
|
85
|
-
function
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
item: -1,
|
|
90
|
-
kind: kindOf(value),
|
|
91
|
-
value: scalarOf(value),
|
|
92
|
-
size: Array.isArray(value) ? value.length : null,
|
|
93
|
-
});
|
|
94
|
-
if (!Array.isArray(value))
|
|
95
|
-
return;
|
|
96
|
-
value.forEach((item, index) => {
|
|
97
|
-
const itemKind = kindOf(item);
|
|
98
|
-
reading.values.push({
|
|
99
|
-
keys,
|
|
100
|
-
places,
|
|
101
|
-
item: index,
|
|
102
|
-
kind: itemKind,
|
|
103
|
-
value: itemKind === 'array' ? null : scalarOf(item),
|
|
104
|
-
size: null,
|
|
105
|
-
});
|
|
30
|
+
export function writtenFacts(path, content, composition) {
|
|
31
|
+
const model = governing(composition, path);
|
|
32
|
+
const facts = documentFacts(path, parse(content, path), {
|
|
33
|
+
types: model.status === 'unavailable' ? {} : model.types,
|
|
106
34
|
});
|
|
35
|
+
return facts === null
|
|
36
|
+
? null
|
|
37
|
+
: { ...facts, fields: JSON.parse(fieldsText(facts.fields)) };
|
|
107
38
|
}
|
|
108
|
-
function
|
|
109
|
-
const value = Array.isArray(node)
|
|
110
|
-
? node.map((item, index) => compared(reading, `${at.exact}/${index}`, item))
|
|
111
|
-
: compared(reading, at.exact, node);
|
|
112
|
-
const places = placesOf(at);
|
|
113
|
-
held(reading, at.keys, places, value);
|
|
114
|
-
if (typeof value !== 'string' || !reading.references.has(at.exact))
|
|
115
|
-
return;
|
|
116
|
-
reading.links.push({
|
|
117
|
-
kind: 'field',
|
|
118
|
-
keys: at.keys,
|
|
119
|
-
places,
|
|
120
|
-
target: value,
|
|
121
|
-
field: throughOf(at.keys, places),
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
function walk(reading, node, at) {
|
|
125
|
-
record(reading, node, at);
|
|
126
|
-
if (Array.isArray(node)) {
|
|
127
|
-
node.forEach((item, index) => walk(reading, item, { ...at, tail: `${at.tail}.${index}`, exact: `${at.exact}/${index}` }));
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
if (!plainObject(node))
|
|
131
|
-
return;
|
|
132
|
-
for (const [key, value] of Object.entries(node)) {
|
|
133
|
-
const segment = escapePointer(key);
|
|
134
|
-
const exact = `${at.exact}/${segment}`;
|
|
135
|
-
walk(reading, value, ARRAY_INDEX.test(segment)
|
|
136
|
-
? { ...at, head: `${at.head}${at.tail.replaceAll('.', ':')}:${segment}`, tail: '', exact }
|
|
137
|
-
: { keys: `${at.keys}/${segment}`, done: placesOf(at), head: '', tail: '', exact });
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
function bodyOf(targets) {
|
|
141
|
-
return targets.map((target) => ({ kind: 'body', keys: '', places: '', target, field: '' }));
|
|
142
|
-
}
|
|
143
|
-
function typedRows(path, content, document, composition, body) {
|
|
144
|
-
const definition = definitionOf(governing(composition, path), document.type);
|
|
145
|
-
const reading = {
|
|
146
|
-
path,
|
|
147
|
-
references: new Set(definition === undefined ? [] : references(document, definition).map((one) => one.pointer)),
|
|
148
|
-
values: [],
|
|
149
|
-
links: [],
|
|
150
|
-
};
|
|
151
|
-
for (const [name, value] of Object.entries(document.fields)) {
|
|
152
|
-
const segment = escapePointer(name);
|
|
153
|
-
walk(reading, value, {
|
|
154
|
-
keys: `/${segment}`,
|
|
155
|
-
done: '',
|
|
156
|
-
head: '',
|
|
157
|
-
tail: '',
|
|
158
|
-
exact: `/${segment}`,
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
const links = reading.links;
|
|
162
|
-
if (definition !== undefined && content !== null) {
|
|
163
|
-
const sectioned = new Set();
|
|
164
|
-
for (const { target: reached } of sectionReferences(path, content, definition)) {
|
|
165
|
-
if (reached === null || sectioned.has(reached))
|
|
166
|
-
continue;
|
|
167
|
-
sectioned.add(reached);
|
|
168
|
-
links.push({ kind: 'section', keys: '', places: '', target: reached, field: '' });
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
return { values: reading.values, links: [...links, ...body] };
|
|
172
|
-
}
|
|
173
|
-
function readOf(path, declared, document) {
|
|
39
|
+
export function described(path, content, facts) {
|
|
174
40
|
const folder = folderOf(path);
|
|
175
|
-
const unread = {
|
|
176
|
-
if (
|
|
177
|
-
return {
|
|
178
|
-
|
|
41
|
+
const unread = { type: null, fields: null, links: null, folder };
|
|
42
|
+
if (content === null)
|
|
43
|
+
return { ...unread, declared: null, queried: true };
|
|
44
|
+
if (facts === null)
|
|
45
|
+
return { ...unread, declared: null, queried: !markdownPath(path) };
|
|
46
|
+
const links = JSON.stringify(facts.links);
|
|
47
|
+
if (!markdownPath(path))
|
|
48
|
+
return { ...unread, declared: facts.type, queried: true, links };
|
|
179
49
|
return {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
},
|
|
187
|
-
document,
|
|
50
|
+
type: facts.type,
|
|
51
|
+
declared: facts.type,
|
|
52
|
+
queried: true,
|
|
53
|
+
folder,
|
|
54
|
+
fields: fieldsText(facts.fields),
|
|
55
|
+
links,
|
|
188
56
|
};
|
|
189
57
|
}
|
|
190
|
-
function
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
return read(path, content, outlined).described;
|
|
211
|
-
}
|
|
212
|
-
export function derived(path, content, outlined, composition) {
|
|
213
|
-
const { described: columns, document, links } = read(path, content, outlined);
|
|
214
|
-
const body = bodyOf(links);
|
|
215
|
-
if (document !== null) {
|
|
216
|
-
return { ...columns, ...typedRows(path, content, document, composition, body) };
|
|
217
|
-
}
|
|
218
|
-
return { ...columns, values: [], links: markdownPath(path) ? [] : body };
|
|
58
|
+
export function heldOf(path, content, facts) {
|
|
59
|
+
if (content === null || facts === null)
|
|
60
|
+
return { type: null, fields: null, links: [] };
|
|
61
|
+
return markdownPath(path)
|
|
62
|
+
? { type: facts.type, fields: facts.fields, links: facts.links }
|
|
63
|
+
: { type: null, fields: null, links: facts.links };
|
|
64
|
+
}
|
|
65
|
+
export function derived(path, held, composition) {
|
|
66
|
+
const stored = held.links.map((target) => ({
|
|
67
|
+
kind: 'link',
|
|
68
|
+
keys: '',
|
|
69
|
+
places: '',
|
|
70
|
+
target,
|
|
71
|
+
field: '',
|
|
72
|
+
}));
|
|
73
|
+
if (held.type === null || held.fields === null)
|
|
74
|
+
return { values: [], links: stored };
|
|
75
|
+
const definition = definitionOf(governing(composition, path), held.type);
|
|
76
|
+
const { values, links: fields } = indexed(path, held.fields, definition);
|
|
77
|
+
return { values, links: [...fields, ...stored] };
|
|
219
78
|
}
|
package/dist/save.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"AACA,OAAO,EAkBL,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAKL,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,YAAY,EAEjB,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAc,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAInD,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,WAAW,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,cAAc,EAAE,eAAe,CAAC;IACnD,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AAE9F,KAAK,QAAQ,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AAE1D,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GAAG,QAAQ,CAAC;AAgN3E,wBAAiB,iBAAiB,CAChC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,YAAY,GACpB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,CAOtC;AAoDD,wBAAiB,gBAAgB,CAC/B,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,YAAY,GACpB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,CAyBtC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtE;AAED,wBAAiB,WAAW,CAC1B,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,GACpB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,CAItC;
|
|
1
|
+
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"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"}
|
package/dist/save.js
CHANGED
|
@@ -321,6 +321,8 @@ function* incoming(collection, removed, candidates) {
|
|
|
321
321
|
function affected(change) {
|
|
322
322
|
return change.kind === 'move' ? [change.path, change.to] : [change.path];
|
|
323
323
|
}
|
|
324
|
+
const WRITE = ['write'];
|
|
325
|
+
const MOVE_OUT = ['write', 'erase'];
|
|
324
326
|
function guard(changes, input, removing) {
|
|
325
327
|
const overridden = new Map();
|
|
326
328
|
const existing = {
|
|
@@ -338,9 +340,9 @@ function guard(changes, input, removing) {
|
|
|
338
340
|
if (covered(input.providerOwnedPaths, normalized)) {
|
|
339
341
|
return refuse('provider-owned-path', normalized);
|
|
340
342
|
}
|
|
341
|
-
const operation
|
|
342
|
-
|
|
343
|
-
|
|
343
|
+
for (const operation of change.kind === 'remove' ? removing : WRITE)
|
|
344
|
+
if (!input.local && !covered(input.operations[operation], normalized))
|
|
345
|
+
return refuse(`${operation}-grant`, normalized);
|
|
344
346
|
}
|
|
345
347
|
if (change.kind === 'create' || change.kind === 'arrival') {
|
|
346
348
|
const taken = existing.has(change.path) ? change.path : occupied(change.path);
|
|
@@ -974,7 +976,7 @@ function roomReferencesIn(path, content, composition) {
|
|
|
974
976
|
const parsed = parse(content, path);
|
|
975
977
|
if (!parsed.ok)
|
|
976
978
|
return [];
|
|
977
|
-
return roomReferences(
|
|
979
|
+
return roomReferences(parsed.document, definitionOf(governing(composition, path), parsed.document.type));
|
|
978
980
|
}
|
|
979
981
|
function* admittedRooms(changes, visible, resulting, composition) {
|
|
980
982
|
const from = new Map();
|
|
@@ -1020,7 +1022,7 @@ async function batching(input) {
|
|
|
1020
1022
|
const rewritten = await stepped(rewrites(changes, input.visible));
|
|
1021
1023
|
if (rewritten.kind === 'refused')
|
|
1022
1024
|
return rewritten;
|
|
1023
|
-
const refusal = guard(changes, input,
|
|
1025
|
+
const refusal = guard(changes, input, WRITE);
|
|
1024
1026
|
if (refusal !== null)
|
|
1025
1027
|
return refusal;
|
|
1026
1028
|
const preconditions = await stepped(preconditionsOf(changes, input.visible, input.bases));
|
|
@@ -1069,9 +1071,10 @@ function arrivingText(path, to, source, moved) {
|
|
|
1069
1071
|
return applied.outcome === 'applied' ? serialize(applied.document) : content;
|
|
1070
1072
|
}
|
|
1071
1073
|
function arrivalOf({ path, to }, source, moved) {
|
|
1072
|
-
const { documents, revisions, fileIds, changes, binaries } = source.visible;
|
|
1074
|
+
const { documents, revisions, fileIds, created, changes, binaries } = source.visible;
|
|
1073
1075
|
const kept = {
|
|
1074
1076
|
...(fileIds[path] === undefined ? {} : { fileId: fileIds[path] }),
|
|
1077
|
+
...(created[path] === undefined ? {} : { created: created[path] }),
|
|
1075
1078
|
...(changes[path] === undefined ? {} : { change: changes[path] }),
|
|
1076
1079
|
};
|
|
1077
1080
|
const heads = {
|
|
@@ -1101,7 +1104,7 @@ async function moving(input) {
|
|
|
1101
1104
|
if (moves.length === 0)
|
|
1102
1105
|
return refuse('no-change');
|
|
1103
1106
|
const removals = moves.map(({ path }) => ({ kind: 'remove', path }));
|
|
1104
|
-
const leaves = guard(removals, { ...source, local: input.local, bases: [] },
|
|
1107
|
+
const leaves = guard(removals, { ...source, local: input.local, bases: [] }, MOVE_OUT);
|
|
1105
1108
|
if (leaves !== null)
|
|
1106
1109
|
return leaves;
|
|
1107
1110
|
const uploading = moves.find(({ path }) => source.visible.binaries[path]?.state === 'pending');
|
|
@@ -1109,7 +1112,7 @@ async function moving(input) {
|
|
|
1109
1112
|
return refuse('unknown-revision', uploading.path);
|
|
1110
1113
|
const moved = new Map(moves.map(({ path, to }) => [path, to]));
|
|
1111
1114
|
const arrivals = moves.map((move) => arrivalOf(move, source, moved));
|
|
1112
|
-
const arrives = guard(arrivals, { ...destination, local: input.local, bases: [] },
|
|
1115
|
+
const arrives = guard(arrivals, { ...destination, local: input.local, bases: [] }, WRITE);
|
|
1113
1116
|
if (arrives !== null)
|
|
1114
1117
|
return arrives;
|
|
1115
1118
|
const bound = input.providerLimits.find((limit) => limit.name === MOVE_DOCUMENTS)?.value;
|