@agentshouse/mdruntime 0.1.0-c49444f2a8fc6 → 0.1.0-c4d7cf2ec26a6

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.
Files changed (213) hide show
  1. package/dist/acceptance.d.ts +6 -0
  2. package/dist/acceptance.d.ts.map +1 -0
  3. package/dist/acceptance.js +386 -0
  4. package/dist/actions.d.ts +20 -0
  5. package/dist/actions.d.ts.map +1 -0
  6. package/dist/actions.js +251 -0
  7. package/dist/adapter.d.ts +6 -0
  8. package/dist/adapter.d.ts.map +1 -1
  9. package/dist/bootstrap.js +1 -0
  10. package/dist/cell.d.ts +6 -0
  11. package/dist/cell.d.ts.map +1 -0
  12. package/dist/cell.js +9 -0
  13. package/dist/change.d.ts.map +1 -1
  14. package/dist/change.js +4 -2
  15. package/dist/chat-types.d.ts +5 -0
  16. package/dist/chat-types.d.ts.map +1 -0
  17. package/dist/chat-types.js +13 -0
  18. package/dist/client.d.ts +12 -1
  19. package/dist/client.d.ts.map +1 -1
  20. package/dist/client.js +1 -0
  21. package/dist/compile.d.ts +5 -0
  22. package/dist/compile.d.ts.map +1 -1
  23. package/dist/compile.js +190 -59
  24. package/dist/connection.d.ts +5 -143
  25. package/dist/connection.d.ts.map +1 -1
  26. package/dist/connection.js +101 -5309
  27. package/dist/conversation-live.d.ts +136 -0
  28. package/dist/conversation-live.d.ts.map +1 -0
  29. package/dist/conversation-live.js +248 -0
  30. package/dist/conversation-row.d.ts.map +1 -1
  31. package/dist/conversation-row.js +7 -1
  32. package/dist/conversation.d.ts +22 -35
  33. package/dist/conversation.d.ts.map +1 -1
  34. package/dist/conversation.js +827 -972
  35. package/dist/discovery.d.ts +10 -0
  36. package/dist/discovery.d.ts.map +1 -0
  37. package/dist/discovery.js +175 -0
  38. package/dist/durability.d.ts +9 -0
  39. package/dist/durability.d.ts.map +1 -1
  40. package/dist/figures.d.ts +49 -0
  41. package/dist/figures.d.ts.map +1 -0
  42. package/dist/figures.js +197 -0
  43. package/dist/holdings.d.ts +29 -0
  44. package/dist/holdings.d.ts.map +1 -0
  45. package/dist/holdings.js +95 -0
  46. package/dist/host.d.ts +1 -0
  47. package/dist/host.d.ts.map +1 -1
  48. package/dist/host.js +7 -4
  49. package/dist/index.d.ts +16 -4
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +3 -0
  52. package/dist/install.d.ts +56 -0
  53. package/dist/install.d.ts.map +1 -0
  54. package/dist/install.js +554 -0
  55. package/dist/lifecycle.d.ts +7 -0
  56. package/dist/lifecycle.d.ts.map +1 -0
  57. package/dist/lifecycle.js +268 -0
  58. package/dist/listing.d.ts +53 -0
  59. package/dist/listing.d.ts.map +1 -0
  60. package/dist/listing.js +176 -0
  61. package/dist/live.d.ts.map +1 -1
  62. package/dist/live.js +0 -2
  63. package/dist/locks.d.ts +9 -0
  64. package/dist/locks.d.ts.map +1 -0
  65. package/dist/locks.js +61 -0
  66. package/dist/log.d.ts +1 -0
  67. package/dist/log.d.ts.map +1 -1
  68. package/dist/lost.d.ts +5 -0
  69. package/dist/lost.d.ts.map +1 -0
  70. package/dist/lost.js +61 -0
  71. package/dist/memory.d.ts.map +1 -1
  72. package/dist/memory.js +1 -0
  73. package/dist/messages.d.ts +1 -1
  74. package/dist/messages.d.ts.map +1 -1
  75. package/dist/messages.js +3 -3
  76. package/dist/models.d.ts +14 -0
  77. package/dist/models.d.ts.map +1 -0
  78. package/dist/models.js +195 -0
  79. package/dist/observation.d.ts.map +1 -1
  80. package/dist/observation.js +12 -17
  81. package/dist/opened.js +3 -3
  82. package/dist/opening.d.ts +4 -0
  83. package/dist/opening.d.ts.map +1 -0
  84. package/dist/opening.js +57 -0
  85. package/dist/outcome.d.ts +4 -1
  86. package/dist/outcome.d.ts.map +1 -1
  87. package/dist/outcome.js +3 -0
  88. package/dist/parts.d.ts +1 -0
  89. package/dist/parts.d.ts.map +1 -1
  90. package/dist/parts.js +8 -0
  91. package/dist/paths.d.ts +1 -0
  92. package/dist/paths.d.ts.map +1 -1
  93. package/dist/paths.js +22 -0
  94. package/dist/preparation.d.ts +20 -0
  95. package/dist/preparation.d.ts.map +1 -0
  96. package/dist/preparation.js +226 -0
  97. package/dist/queries.d.ts +16 -0
  98. package/dist/queries.d.ts.map +1 -0
  99. package/dist/queries.js +272 -0
  100. package/dist/query.d.ts +10 -0
  101. package/dist/query.d.ts.map +1 -1
  102. package/dist/questions.d.ts +2 -0
  103. package/dist/questions.d.ts.map +1 -1
  104. package/dist/questions.js +5 -1
  105. package/dist/reach.d.ts +3 -1
  106. package/dist/reach.d.ts.map +1 -1
  107. package/dist/reach.js +11 -0
  108. package/dist/react.d.ts +7 -1
  109. package/dist/react.d.ts.map +1 -1
  110. package/dist/readiness.d.ts +0 -1
  111. package/dist/readiness.d.ts.map +1 -1
  112. package/dist/reads.d.ts +37 -0
  113. package/dist/reads.d.ts.map +1 -0
  114. package/dist/reads.js +171 -0
  115. package/dist/refusal.d.ts +5 -0
  116. package/dist/refusal.d.ts.map +1 -0
  117. package/dist/refusal.js +56 -0
  118. package/dist/replica.d.ts +1 -3
  119. package/dist/replica.d.ts.map +1 -1
  120. package/dist/replica.js +3 -2
  121. package/dist/room-draft.d.ts +1 -1
  122. package/dist/room-draft.d.ts.map +1 -1
  123. package/dist/room-draft.js +2 -2
  124. package/dist/room-drafts.d.ts +24 -0
  125. package/dist/room-drafts.d.ts.map +1 -0
  126. package/dist/room-drafts.js +217 -0
  127. package/dist/runtime.d.ts +43 -0
  128. package/dist/runtime.d.ts.map +1 -0
  129. package/dist/runtime.js +1 -0
  130. package/dist/save.d.ts +5 -1
  131. package/dist/save.d.ts.map +1 -1
  132. package/dist/save.js +12 -14
  133. package/dist/saves.d.ts +70 -0
  134. package/dist/saves.d.ts.map +1 -0
  135. package/dist/saves.js +1005 -0
  136. package/dist/seed.d.ts +11 -2
  137. package/dist/seed.d.ts.map +1 -1
  138. package/dist/seed.js +71 -0
  139. package/dist/shared.d.ts +1 -6
  140. package/dist/shared.d.ts.map +1 -1
  141. package/dist/shared.js +13 -95
  142. package/dist/shown.d.ts +31 -0
  143. package/dist/shown.d.ts.map +1 -0
  144. package/dist/shown.js +292 -0
  145. package/dist/socket/admission.d.ts +7 -0
  146. package/dist/socket/admission.d.ts.map +1 -0
  147. package/dist/socket/admission.js +39 -0
  148. package/dist/socket/answers.d.ts +6 -0
  149. package/dist/socket/answers.d.ts.map +1 -0
  150. package/dist/socket/answers.js +20 -0
  151. package/dist/socket/lanes.d.ts +20 -0
  152. package/dist/socket/lanes.d.ts.map +1 -0
  153. package/dist/socket/lanes.js +77 -0
  154. package/dist/socket/reads.d.ts +10 -0
  155. package/dist/socket/reads.d.ts.map +1 -0
  156. package/dist/socket/reads.js +31 -0
  157. package/dist/socket/rooms.d.ts +44 -0
  158. package/dist/socket/rooms.d.ts.map +1 -0
  159. package/dist/socket/rooms.js +90 -0
  160. package/dist/socket/session.d.ts +39 -0
  161. package/dist/socket/session.d.ts.map +1 -0
  162. package/dist/socket/session.js +23 -0
  163. package/dist/socket.d.ts +70 -0
  164. package/dist/socket.d.ts.map +1 -0
  165. package/dist/socket.js +175 -0
  166. package/dist/source.d.ts.map +1 -1
  167. package/dist/source.js +5 -4
  168. package/dist/store/fences.d.ts +16 -0
  169. package/dist/store/fences.d.ts.map +1 -0
  170. package/dist/store/fences.js +26 -0
  171. package/dist/store/installs.d.ts +30 -0
  172. package/dist/store/installs.d.ts.map +1 -0
  173. package/dist/store/installs.js +34 -0
  174. package/dist/store/readiness.d.ts +10 -0
  175. package/dist/store/readiness.d.ts.map +1 -0
  176. package/dist/store/readiness.js +52 -0
  177. package/dist/store/records.d.ts +212 -0
  178. package/dist/store/records.d.ts.map +1 -0
  179. package/dist/store/records.js +431 -0
  180. package/dist/store/room-held.d.ts +8 -0
  181. package/dist/store/room-held.d.ts.map +1 -0
  182. package/dist/store/room-held.js +17 -0
  183. package/dist/store/space.d.ts +11 -0
  184. package/dist/store/space.d.ts.map +1 -0
  185. package/dist/store/space.js +41 -0
  186. package/dist/store/watchers.d.ts +17 -0
  187. package/dist/store/watchers.d.ts.map +1 -0
  188. package/dist/store/watchers.js +56 -0
  189. package/dist/store/writes.d.ts +24 -0
  190. package/dist/store/writes.d.ts.map +1 -0
  191. package/dist/store/writes.js +125 -0
  192. package/dist/store.d.ts +111 -206
  193. package/dist/store.d.ts.map +1 -1
  194. package/dist/store.js +142 -398
  195. package/dist/stored.d.ts +1 -1
  196. package/dist/stored.d.ts.map +1 -1
  197. package/dist/stored.js +25 -11
  198. package/dist/surface.d.ts +88 -0
  199. package/dist/surface.d.ts.map +1 -0
  200. package/dist/surface.js +223 -0
  201. package/dist/sync.d.ts +19 -0
  202. package/dist/sync.d.ts.map +1 -0
  203. package/dist/sync.js +532 -0
  204. package/dist/tables.d.ts +32 -4
  205. package/dist/tables.d.ts.map +1 -1
  206. package/dist/tables.js +42 -8
  207. package/dist/tallies.d.ts +18 -0
  208. package/dist/tallies.d.ts.map +1 -0
  209. package/dist/tallies.js +129 -0
  210. package/dist/wire.d.ts +8 -1
  211. package/dist/wire.d.ts.map +1 -1
  212. package/dist/wire.js +4 -0
  213. package/package.json +2 -2
@@ -0,0 +1,217 @@
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, socket }, waitingOnly, touched = null) {
56
+ const unwatched = () => socket.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 (socket.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 (socket.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, socket }, app) {
82
+ const topic = presentationTopic(app);
83
+ const listening = () => store.watching(topic, 'ready');
84
+ if (socket.closed() || listening().length === 0)
85
+ return Promise.resolve();
86
+ return store.publication(async () => {
87
+ if (socket.closed() || listening().length === 0)
88
+ return;
89
+ const value = await presentationOf(store, app);
90
+ if (socket.closed())
91
+ return;
92
+ for (const watcher of listening())
93
+ watcher.answer(value);
94
+ });
95
+ }
96
+ async function writtenRoomDraft({ store }, 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]);
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 store.changed(changeSet(room, { drafts: [path] }));
121
+ return { outcome: 'written', roomDraft: (await roomDraftsOf(store, [record]))[0] };
122
+ }
123
+ async function keptPresentation({ store }, app, value) {
124
+ await (await store.open()).present({ app, value });
125
+ await store.changed(changeSet('', { presentation: app }));
126
+ }
127
+ export function roomDraftSurface(runtime) {
128
+ const { store } = runtime;
129
+ return {
130
+ list() {
131
+ return store
132
+ .exclusive(async () => {
133
+ await store.open();
134
+ return snapshotRoomDrafts(store);
135
+ })
136
+ .then((listed) => {
137
+ publishRoomDrafts(runtime, true);
138
+ return listed;
139
+ });
140
+ },
141
+ async read(room, path) {
142
+ const record = await store.draft(room, path);
143
+ return record === undefined ? null : (await roomDraftsOf(store, [record]))[0];
144
+ },
145
+ write(room, path, revision, input, next = roomDraftRevision()) {
146
+ if (typeof next !== 'string' || next === '')
147
+ return Promise.reject(runtimeError('room-draft-malformed'));
148
+ return store.gathered(`room-draft\u0000${room}\u0000${path}`, { revision, input, next }, (earlier, later) => {
149
+ if (later.revision !== earlier.next)
150
+ return null;
151
+ const parts = gatheredParts(earlier.input, later.input);
152
+ return parts === null
153
+ ? null
154
+ : { revision: earlier.revision, input: parts, next: later.next };
155
+ }, (written) => writtenRoomDraft(runtime, room, path, written.revision, written.input, written.next));
156
+ },
157
+ discard(room, path, revision) {
158
+ return store.exclusive(async () => {
159
+ const local = await store.open();
160
+ const current = await store.draft(room, path);
161
+ if (current === undefined || current.revision !== revision) {
162
+ return staleWrite(current === undefined ? null : (await roomDraftsOf(store, [current]))[0]);
163
+ }
164
+ await local.discardRoomDraft(room, path);
165
+ await store.changed(changeSet(room, { drafts: [path] }));
166
+ return { outcome: 'written', roomDraft: null };
167
+ });
168
+ },
169
+ };
170
+ }
171
+ export function presentationSurface(runtime) {
172
+ const { store } = runtime;
173
+ return {
174
+ read(app) {
175
+ return store.exclusive(() => presentationOf(store, app));
176
+ },
177
+ write(app, value) {
178
+ return store.exclusive(() => keptPresentation(runtime, app, structuredClone(value)));
179
+ },
180
+ edit(app, members) {
181
+ return store.gathered(`presentation\u0000${app}`, structuredClone(members), (earlier, later) => ({ ...earlier, ...later }), async (edited) => {
182
+ const kept = await (await store.open()).presentation(app);
183
+ await keptPresentation(runtime, app, 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
+ }
191
+ export function watchRoomDrafts({ store, socket }, deliver) {
192
+ const watcher = store.watch(ROOM_DRAFTS, deliver);
193
+ const unwatched = () => socket.closed() || !watcher.held();
194
+ void store
195
+ .exclusive(async () => {
196
+ await store.open();
197
+ })
198
+ .then(() => store.publication(async () => {
199
+ if (unwatched())
200
+ return;
201
+ const value = await snapshotRoomDrafts(store);
202
+ if (!unwatched())
203
+ watcher.answer(value);
204
+ }), () => { });
205
+ return watcher.stop;
206
+ }
207
+ export function watchPresentation({ store, socket }, app, deliver) {
208
+ const watcher = store.watch(presentationTopic(app), deliver);
209
+ void store
210
+ .exclusive(async () => {
211
+ const value = await presentationOf(store, app);
212
+ if (!socket.closed() && watcher.held())
213
+ watcher.answer(value);
214
+ })
215
+ .catch(() => { });
216
+ return watcher.stop;
217
+ }
@@ -0,0 +1,43 @@
1
+ import type { Authorization, DiscoveredRoom, PathRule, ScopedRefusal, TypedPath } from './adapter.js';
2
+ import type { ChangeSet } from './change-set.js';
3
+ import type { ChangeBatch } from './change.js';
4
+ import type { RuntimeShell } from './durability.js';
5
+ import type { LiveConversations } from './conversation-live.js';
6
+ import type { FiguresRead } from './figures.js';
7
+ import type { Withheld } from './install.js';
8
+ import type { LiveQueries } from './live.js';
9
+ import type { Log } from './log.js';
10
+ import type { ModelState } from './model.js';
11
+ import type { ReadAnswers } from './reads.js';
12
+ import type { Recovery } from './recovery.js';
13
+ import type { ReplicaRecord } from './replica.js';
14
+ import type { RuntimeSocket, RoomDeclaration } from './socket.js';
15
+ import type { CycleProgress } from './status.js';
16
+ import type { Settling } from './saves.js';
17
+ import type { HeldCover, RuntimeStore, Store, Work } from './store.js';
18
+ import type { schemaTypes } from './attached-model.js';
19
+ export type Runtime = {
20
+ readonly store: Store;
21
+ readonly socket: RuntimeSocket;
22
+ readonly journal: Log;
23
+ readonly recovery: Recovery;
24
+ readonly shell: RuntimeShell;
25
+ readonly localSaves: boolean;
26
+ readonly roomTypes: Parameters<typeof schemaTypes>[1];
27
+ readonly builtIn: ModelState;
28
+ readonly typedPaths: readonly TypedPath[];
29
+ readonly pathRule: PathRule;
30
+ readonly usableWhenHeld: readonly string[];
31
+ readonly build: string;
32
+ readonly conversations: LiveConversations;
33
+ readonly liveQueries: LiveQueries<HeldCover>;
34
+ readonly figures: FiguresRead;
35
+ readonly lastAnswers: ReadAnswers;
36
+ settle(local: RuntimeStore, locator: string, work: Work, record: ReplicaRecord, queue: readonly ChangeBatch[], settling?: Settling): Promise<ChangeSet>;
37
+ scoped(result: ScopedRefusal, room: RoomDeclaration, local: RuntimeStore): Promise<void>;
38
+ submitLater(locator: string): void;
39
+ unpair(local: RuntimeStore): Promise<void>;
40
+ advanced(room: DiscoveredRoom, local: RuntimeStore, authorized: Authorization): Promise<Withheld | null>;
41
+ withhold(withheld: Withheld, room: DiscoveredRoom, local: RuntimeStore, progress: CycleProgress): Promise<void>;
42
+ };
43
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
package/dist/save.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { type Validation } from '@agentshouse/mdmodel';
2
- import type { OperationScopes, ProviderLimit } from './adapter.js';
2
+ import type { OperationScopes, PathRule, ProviderLimit } from './adapter.js';
3
3
  import { type Change, type ChangeBatch, type Precondition, type WrittenBy } from './change.js';
4
4
  import { type Composition } from './collection.js';
5
5
  import { type Layer } from './overlay.js';
@@ -19,7 +19,9 @@ export type SaveInput = {
19
19
  baseRoomVersion: string;
20
20
  operations: import('./adapter.js').OperationScopes;
21
21
  providerOwnedPaths: readonly string[];
22
+ authoredPaths?: readonly string[];
22
23
  providerLimits: readonly ProviderLimit[];
24
+ pathRule: PathRule;
23
25
  visible: VisibleLayer;
24
26
  folders: ReadonlySet<string>;
25
27
  handle: string;
@@ -75,6 +77,7 @@ export type MoveSide = {
75
77
  composition: Composition;
76
78
  operations: OperationScopes;
77
79
  providerOwnedPaths: readonly string[];
80
+ authoredPaths?: readonly string[];
78
81
  visible: VisibleLayer;
79
82
  folders: ReadonlySet<string>;
80
83
  queued: ReadonlySet<string>;
@@ -89,6 +92,7 @@ export type MoveInput = {
89
92
  readonly to: string;
90
93
  }[];
91
94
  providerLimits: readonly ProviderLimit[];
95
+ pathRule: PathRule;
92
96
  local: boolean;
93
97
  writtenBy?: WrittenBy;
94
98
  };
@@ -1 +1 @@
1
- {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"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"}
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,QAAQ,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7E,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,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,QAAQ,EAAE,QAAQ,CAAC;IACnB,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;AA8M3E,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;AAoKD,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAYlF;AAoND,MAAM,MAAM,QAAQ,GAChB;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5B,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC,CAAC;IACnD,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC7B,GACD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AAM9C,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AAmN9C,KAAK,WAAW,GAAG,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,KAAK,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;AAE5F,wBAAiB,SAAS,CACxB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,OAAO,EAAE,YAAY,EACrB,UAAU,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,EAC3C,KAAK,EAAE,WAAW,GACjB,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAgEnC;AAUD,wBAAgB,MAAM,CACpB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,WAAW,GACjB,OAAO,CAsCT;AAED,wBAAiB,QAAQ,CACvB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,KAAK,EAAE,WAAW,GACjB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,IAAI,CAAC,CAU7C;AAmND,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAE/C,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,eAAe,CAAC;IAC5B,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,QAAQ,CAAC;IACjB,WAAW,EAAE,QAAQ,CAAC;IACtB,KAAK,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjE,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,WAAW,CAAA;CAAE,GAAG,QAAQ,CAAC;AAuInG,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAE/D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAEjE"}
package/dist/save.js CHANGED
@@ -4,8 +4,8 @@ import { immutable, leaving, queuedFile, departure, } from './change.js';
4
4
  import { collectionOf, documentsOf, governing, } from './collection.js';
5
5
  import { changeBatchIdentity } from './identity.js';
6
6
  import { overlaying } from './overlay.js';
7
- import { ancestors, covered, normalize } from './paths.js';
8
- import { sorting } from './shared.js';
7
+ import { ancestors, authoredAt, covered, normalize } from './paths.js';
8
+ import { entriesIn, sorting } from './shared.js';
9
9
  import { paced, ROW_WEIGHT, stepped } from './turn.js';
10
10
  import { validatedCollection } from './validation.js';
11
11
  function refuse(code, file, location) {
@@ -20,9 +20,6 @@ function refuse(code, file, location) {
20
20
  };
21
21
  }
22
22
  function repointed(document, definition, from, to, moves, settled) {
23
- const parsed = parse(document.content, from);
24
- if (!parsed.ok)
25
- return [];
26
23
  const changes = [];
27
24
  const names = new Set();
28
25
  for (const { pointer, value } of definition === undefined
@@ -45,7 +42,7 @@ function repointed(document, definition, from, to, moves, settled) {
45
42
  }
46
43
  if (changes.length === 0)
47
44
  return [];
48
- const applied = apply(parsed.document, changes);
45
+ const applied = apply(document, changes);
49
46
  if (applied.outcome !== 'applied')
50
47
  return [];
51
48
  const next = applied.document;
@@ -337,9 +334,12 @@ function guard(changes, input, removing) {
337
334
  const normalized = normalize(path);
338
335
  if (normalized === null || normalized === '')
339
336
  return refuse('room-root', path);
340
- if (covered(input.providerOwnedPaths, normalized)) {
337
+ if (covered(input.providerOwnedPaths, normalized) ||
338
+ (input.authoredPaths !== undefined && !authoredAt(input.authoredPaths, normalized))) {
341
339
  return refuse('provider-owned-path', normalized);
342
340
  }
341
+ if (!input.pathRule(normalized))
342
+ return refuse('invalid-path', normalized);
343
343
  for (const operation of change.kind === 'remove' ? removing : WRITE)
344
344
  if (!input.local && !covered(input.operations[operation], normalized))
345
345
  return refuse(`${operation}-grant`, normalized);
@@ -883,7 +883,7 @@ export function* limiting(queue, batch, limits, state) {
883
883
  const at = queue.indexOf(batch);
884
884
  const rewritten = yield* providerRewritten(batch, yield* state(queue.slice(0, at)));
885
885
  const limited = yield* exceeding(limits, batch.changes, rewritten.changes, yield* state(queue.slice(0, at + 1)));
886
- return limited?.kind === 'refused' ? limited.refusal : null;
886
+ return limited?.refusal ?? null;
887
887
  }
888
888
  function typedText(content) {
889
889
  if (content === undefined)
@@ -900,7 +900,7 @@ function touchedLibrary(resulting, touched, composition) {
900
900
  })
901
901
  .sort((left, right) => (left.path < right.path ? -1 : left.path > right.path ? 1 : 0));
902
902
  const contents = new Map(entries.map(({ path, content }) => [path, content]));
903
- const binaries = new Set(Object.keys(resulting.binaries).filter((path) => resulting.binaries[path] !== undefined));
903
+ const binaries = new Set(Array.from(entriesIn(resulting.binaries), ([path]) => path));
904
904
  return validatedCollection(() => Promise.resolve({ entries, next: null }), async (paths) => {
905
905
  const known = new Map();
906
906
  const pace = paced();
@@ -1100,11 +1100,9 @@ function arrivalOf({ path, to }, source, moved) {
1100
1100
  };
1101
1101
  }
1102
1102
  async function moving(input) {
1103
- const { source, destination, moves } = input;
1104
- if (moves.length === 0)
1105
- return refuse('no-change');
1103
+ const { source, destination, moves, pathRule } = input;
1106
1104
  const removals = moves.map(({ path }) => ({ kind: 'remove', path }));
1107
- const leaves = guard(removals, { ...source, local: input.local, bases: [] }, MOVE_OUT);
1105
+ const leaves = guard(removals, { ...source, local: input.local, bases: [], pathRule }, MOVE_OUT);
1108
1106
  if (leaves !== null)
1109
1107
  return leaves;
1110
1108
  const uploading = moves.find(({ path }) => source.visible.binaries[path]?.state === 'pending');
@@ -1112,7 +1110,7 @@ async function moving(input) {
1112
1110
  return refuse('unknown-revision', uploading.path);
1113
1111
  const moved = new Map(moves.map(({ path, to }) => [path, to]));
1114
1112
  const arrivals = moves.map((move) => arrivalOf(move, source, moved));
1115
- const arrives = guard(arrivals, { ...destination, local: input.local, bases: [] }, WRITE);
1113
+ const arrives = guard(arrivals, { ...destination, local: input.local, bases: [], pathRule }, WRITE);
1116
1114
  if (arrives !== null)
1117
1115
  return arrives;
1118
1116
  const bound = input.providerLimits.find((limit) => limit.name === MOVE_DOCUMENTS)?.value;
@@ -0,0 +1,70 @@
1
+ import { type ChangeSet } from './change-set.js';
2
+ import { type ChangeBatch, type WrittenBy } from './change.js';
3
+ import { type AttachAnswer, type BinaryLinkAnswer, type HeldBinaryAnswer, type HeldShownAnswer } from './outcome.js';
4
+ import { type HeldReplica, type ReplicaRecord, type Slice, type VisibleLayer } from './replica.js';
5
+ import { type ReturnReason, type RoomDraftParts } from './room-draft.js';
6
+ import type { Runtime } from './runtime.js';
7
+ import { type SaveRefusal } from './save.js';
8
+ import type { AuthoredWrite, CommittedWrite, PendingState, RoomCommit, RuntimeStore, Store, StoredEntry, View, Work } from './store.js';
9
+ export type SaveResult = {
10
+ outcome: 'saved';
11
+ identifier: string;
12
+ } | ({
13
+ outcome: 'refused';
14
+ } & SaveRefusal);
15
+ export type SavedRoomDraft = {
16
+ readonly path: string;
17
+ readonly revision: string;
18
+ };
19
+ export type SavedParts = {
20
+ readonly path: string;
21
+ readonly parts: RoomDraftParts;
22
+ };
23
+ export type BinaryFileSurface = {
24
+ read(room: string, path: string, revision?: string): Promise<HeldBinaryAnswer>;
25
+ link(room: string, path: string, revision?: string): Promise<BinaryLinkAnswer>;
26
+ show(room: string, path: string, revision?: string): Promise<HeldShownAnswer>;
27
+ attach(room: string, file: File): Promise<AttachAnswer>;
28
+ part(file: string, part: number): Promise<Uint8Array | null>;
29
+ };
30
+ export type Leaving = {
31
+ batch: ChangeBatch;
32
+ returned: ReturnReason | null;
33
+ };
34
+ export declare function withdrawable(states: ReadonlyMap<string, PendingState>): (batch: ChangeBatch) => boolean;
35
+ export declare function sliceAt(store: Store, record: ReplicaRecord, view: View, queue: readonly ChangeBatch[], extra?: Iterable<string>, moved?: Iterable<string>): Promise<Slice>;
36
+ export declare function landedWhole(store: Store, locator: string, batch: ChangeBatch, confirmedLayer: Slice, current?: Readonly<Record<string, string>>): Promise<boolean>;
37
+ export type Settling = {
38
+ leaving?: readonly Leaving[];
39
+ room?: boolean;
40
+ view?: View;
41
+ commit?: Pick<RoomCommit, 'published' | 'refreshed'>;
42
+ changes?: {
43
+ readonly set: readonly StoredEntry[];
44
+ readonly removed: readonly string[];
45
+ };
46
+ };
47
+ export declare function preparedAfter(runtime: Runtime, locator: string, answer: CommittedWrite): void;
48
+ export declare function replayed(store: Store, record: ReplicaRecord, confirmedLayer: Slice, queue: readonly ChangeBatch[]): import("./turn.js").Later<import("./replica.js").Replayed>;
49
+ export declare function overlayDiff(record: ReplicaRecord, before: HeldReplica | undefined, visible: VisibleLayer, touched: ReadonlySet<string>): Promise<{
50
+ overlay: NonNullable<RoomCommit['overlay']>;
51
+ touched: ReadonlySet<string>;
52
+ }>;
53
+ export type Settlement = {
54
+ readonly locator: string;
55
+ readonly left: readonly ChangeBatch[];
56
+ readonly commit: {
57
+ readonly rooms: readonly RoomCommit[];
58
+ readonly writes: readonly AuthoredWrite[];
59
+ };
60
+ apply(answer: CommittedWrite): ChangeSet;
61
+ };
62
+ export declare function settle(runtime: Runtime, local: RuntimeStore, locator: string, work: Work, record: ReplicaRecord, queue: readonly ChangeBatch[], settling?: Settling): Promise<ChangeSet>;
63
+ export declare function together(runtime: Runtime, local: RuntimeStore, settlements: readonly Settlement[]): Promise<ChangeSet>;
64
+ export declare function settlement(runtime: Runtime, local: RuntimeStore, locator: string, work: Work, record: ReplicaRecord, queue: readonly ChangeBatch[], settling?: Settling): Promise<Settlement>;
65
+ export declare function unpairing(runtime: Runtime, local: RuntimeStore, locator: string, batches: readonly ChangeBatch[]): Promise<Settlement>;
66
+ export declare function saveRoomDrafts(runtime: Runtime, locator: string, named: readonly SavedRoomDraft[], writtenBy: WrittenBy | undefined): Promise<SaveResult>;
67
+ export declare function saveParts(runtime: Runtime, locator: string, named: readonly SavedParts[], writtenBy: WrittenBy | undefined): Promise<SaveResult>;
68
+ export declare function batchFile(store: Store, batch: ChangeBatch): (localId: string) => Promise<Blob>;
69
+ export declare function binaryFileSurface(runtime: Runtime): BinaryFileSurface;
70
+ //# sourceMappingURL=saves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saves.d.ts","sourceRoot":"","sources":["../src/saves.ts"],"names":[],"mappings":"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"}