@agentshouse/mdruntime 0.1.0-cedb03eaa48b6 → 0.1.0-cee9c8aa4cd86
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 +86 -71
- package/README.md +9 -8
- package/dist/adapter.d.ts +44 -18
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +4 -1
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +13 -3
- package/dist/bootstrap.d.ts +13 -6
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +90 -61
- package/dist/chain.d.ts +11 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +64 -0
- package/dist/change-set.d.ts +9 -16
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +11 -89
- package/dist/change.d.ts +31 -1
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +10 -1
- package/dist/chat/house.d.ts +25 -0
- package/dist/chat/house.d.ts.map +1 -0
- package/dist/chat/house.js +38 -0
- package/dist/chat/input.d.ts +3 -1
- package/dist/chat/input.d.ts.map +1 -1
- package/dist/chat/input.js +11 -18
- package/dist/chat/list.d.ts +2 -1
- package/dist/chat/list.d.ts.map +1 -1
- package/dist/chat/list.js +7 -3
- package/dist/chat/markdown.d.ts +1 -0
- package/dist/chat/markdown.d.ts.map +1 -1
- package/dist/chat/markdown.js +78 -20
- package/dist/chat/message.d.ts +1 -0
- package/dist/chat/message.d.ts.map +1 -1
- package/dist/chat/message.js +73 -11
- package/dist/chat/messages.d.ts +14 -1
- package/dist/chat/messages.d.ts.map +1 -1
- package/dist/chat/messages.js +79 -24
- package/dist/chat/name.d.ts +1 -0
- package/dist/chat/name.d.ts.map +1 -1
- package/dist/chat/name.js +1 -1
- package/dist/chat/opened.d.ts +1 -0
- package/dist/chat/opened.d.ts.map +1 -1
- package/dist/chat/opened.js +2 -0
- package/dist/chat/overlay.d.ts +1 -0
- package/dist/chat/overlay.d.ts.map +1 -1
- package/dist/chat/overlay.js +11 -5
- package/dist/chat/parts.d.ts +1 -0
- package/dist/chat/parts.d.ts.map +1 -1
- package/dist/chat/parts.js +3 -2
- package/dist/chat/pieces.d.ts +62 -0
- package/dist/chat/pieces.d.ts.map +1 -0
- package/dist/chat/pieces.js +1110 -0
- package/dist/chat/provider.d.ts +8 -1
- package/dist/chat/provider.d.ts.map +1 -1
- package/dist/chat/provider.js +88 -81
- package/dist/chat/ready.d.ts +5 -2
- package/dist/chat/ready.d.ts.map +1 -1
- package/dist/chat/ready.js +7 -5
- package/dist/chat/room-file.d.ts +8 -0
- package/dist/chat/room-file.d.ts.map +1 -0
- package/dist/chat/room-file.js +72 -0
- package/dist/chat/steady.d.ts +3 -0
- package/dist/chat/steady.d.ts.map +1 -0
- package/dist/chat/steady.js +26 -0
- package/dist/chat/style.d.ts.map +1 -1
- package/dist/chat/style.js +5 -0
- package/dist/chat.d.ts +3 -2
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +2 -2
- package/dist/client.d.ts +6 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +29 -2
- package/dist/collection.d.ts +6 -19
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +30 -317
- package/dist/compile.d.ts +16 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +718 -0
- package/dist/connection.d.ts +11 -5
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +1931 -706
- package/dist/conversation.d.ts +9 -3
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +85 -61
- package/dist/digest.d.ts +7 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +113 -0
- package/dist/durability.d.ts +2 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/entry.d.ts +3 -1
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +18 -24
- package/dist/file.d.ts +2 -10
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +3 -120
- package/dist/fulltext.d.ts +27 -0
- package/dist/fulltext.d.ts.map +1 -0
- package/dist/fulltext.js +368 -0
- package/dist/host.d.ts +0 -1
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +10 -3
- 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 +8 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/live.d.ts +22 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +123 -0
- package/dist/memory.d.ts +1 -0
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +22 -6
- package/dist/messages.d.ts +28 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +90 -0
- package/dist/name.d.ts +4 -0
- package/dist/name.d.ts.map +1 -0
- package/dist/name.js +122 -0
- package/dist/observation.d.ts +12 -0
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +84 -0
- package/dist/opened.d.ts +22 -0
- package/dist/opened.d.ts.map +1 -0
- package/dist/opened.js +107 -0
- package/dist/outcome.d.ts +29 -4
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +25 -0
- package/dist/overlay.d.ts +2 -5
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +86 -171
- package/dist/query.d.ts +2 -1
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +1 -0
- package/dist/reach.d.ts +5 -1
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +158 -52
- package/dist/readiness.d.ts +3 -3
- package/dist/readiness.d.ts.map +1 -1
- package/dist/reads.js +1 -1
- package/dist/recovery.d.ts +2 -2
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +8 -7
- package/dist/refresh.d.ts +10 -13
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +74 -51
- package/dist/replica.d.ts +54 -36
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +277 -184
- package/dist/room-draft.d.ts +3 -1
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +29 -22
- package/dist/rows.d.ts +29 -31
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +113 -69
- package/dist/save.d.ts +50 -14
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +502 -178
- package/dist/search.d.ts +11 -43
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +0 -213
- package/dist/shared.d.ts +8 -3
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +129 -66
- package/dist/store.d.ts +79 -93
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +318 -687
- package/dist/stored.d.ts +138 -0
- package/dist/stored.d.ts.map +1 -0
- package/dist/stored.js +544 -0
- package/dist/tables.d.ts +332 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +570 -0
- package/dist/turn.d.ts +4 -2
- package/dist/turn.d.ts.map +1 -1
- package/dist/turn.js +46 -22
- package/dist/validation.d.ts +30 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +162 -0
- package/dist/windows.d.ts +2 -6
- package/dist/windows.d.ts.map +1 -1
- package/dist/windows.js +30 -34
- package/dist/wire.d.ts +16 -0
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +4 -0
- package/dist/words.d.ts +19 -0
- package/dist/words.d.ts.map +1 -0
- package/dist/words.js +150 -0
- package/package.json +10 -4
- package/dist/read-side.d.ts +0 -27
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -824
package/dist/query.js
CHANGED
|
@@ -441,6 +441,7 @@ export function planOf(input, facts, reach = null) {
|
|
|
441
441
|
key: queryKey(input),
|
|
442
442
|
rooms,
|
|
443
443
|
reach,
|
|
444
|
+
locked: [],
|
|
444
445
|
root,
|
|
445
446
|
folder: input.folder === undefined ? null : directory(input.folder, 'folder'),
|
|
446
447
|
paths: input.paths === undefined ? null : pathsOf(input.paths),
|
package/dist/reach.d.ts
CHANGED
|
@@ -26,9 +26,13 @@ export type Reachable = RuntimeView & {
|
|
|
26
26
|
plan(input: unknown, reach: PortReach | null): Plan;
|
|
27
27
|
query(plan: Plan): Promise<QueryResult>;
|
|
28
28
|
watchPlan(plan: Plan, deliver: (message: unknown) => void): () => void;
|
|
29
|
-
search(input: unknown, reach: PortReach | null): Promise<SearchResult>;
|
|
29
|
+
search(input: unknown, reach: PortReach | null, locked: readonly string[]): Promise<SearchResult>;
|
|
30
30
|
watchReadiness(port: ReadinessPort, reach: PortReach | null, deliver: (readiness: Readiness) => void): () => void;
|
|
31
31
|
referrerScope(referrer: unknown): ReferrerScope | null;
|
|
32
|
+
locked(room: string): boolean;
|
|
33
|
+
lockedRooms(): readonly string[];
|
|
34
|
+
watchLocks(notify: () => void): () => void;
|
|
35
|
+
located(room: string, path: string, destination: string): ReachedDocument | null;
|
|
32
36
|
};
|
|
33
37
|
export declare function holds(reach: PortReach | null, room: string): boolean;
|
|
34
38
|
export declare function governs(reach: PortReach | null, room: {
|
package/dist/reach.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reach.d.ts","sourceRoot":"","sources":["../src/reach.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAEV,SAAS,EACT,aAAa,EAEb,YAAY,EAEb,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"reach.d.ts","sourceRoot":"","sources":["../src/reach.ts"],"names":[],"mappings":"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"}
|
package/dist/reach.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { unheldView } from './conversation.js';
|
|
2
2
|
import { modelTypes, NO_MODEL } from './model.js';
|
|
3
|
-
import {
|
|
3
|
+
import { changeOf, digestApplied, digestOf, observing, } from './observation.js';
|
|
4
4
|
import { runtimeError } from './failure.js';
|
|
5
|
-
import { failure, undeclared, } from './outcome.js';
|
|
5
|
+
import { absentReference, failure, lockedRoom, ROOM_LOCKED, undeclared, UNREADABLE, } from './outcome.js';
|
|
6
6
|
import { beneath } from './paths.js';
|
|
7
|
-
import { reconciled } from './read-side.js';
|
|
8
7
|
import { moveTarget, readParts, staleWrite, } from './room-draft.js';
|
|
9
8
|
import { documentKey } from './rows.js';
|
|
10
9
|
import { undeclaredSearch } from './search.js';
|
|
@@ -17,6 +16,7 @@ const NO_CONVERSATION = {
|
|
|
17
16
|
read: (conversation) => Promise.resolve(unheldView(conversation)),
|
|
18
17
|
create: unconversed('conversation.create'),
|
|
19
18
|
send: unconversed('conversation.send'),
|
|
19
|
+
attach: unconversed('conversation.attach'),
|
|
20
20
|
answer: unconversed('conversation.answer'),
|
|
21
21
|
interrupt: unconversed('conversation.interrupt'),
|
|
22
22
|
kill: unconversed('conversation.kill'),
|
|
@@ -59,15 +59,10 @@ function refers(reach, scope) {
|
|
|
59
59
|
return true;
|
|
60
60
|
if (scope === null)
|
|
61
61
|
return false;
|
|
62
|
-
if (scope.kind === 'conversations')
|
|
63
|
-
return reach.conversations;
|
|
64
62
|
return scope.path === undefined
|
|
65
63
|
? wholly(reach, scope.locator)
|
|
66
64
|
: covers(reach, scope.locator, scope.path);
|
|
67
65
|
}
|
|
68
|
-
function unreachedReference(fileRef) {
|
|
69
|
-
return { kind: 'absent', code: 'binary-file-absent', fields: { fileRef }, retryable: false };
|
|
70
|
-
}
|
|
71
66
|
export function planReach(reach) {
|
|
72
67
|
return reach === null
|
|
73
68
|
? null
|
|
@@ -91,7 +86,7 @@ function typesWithin(reach, room, types) {
|
|
|
91
86
|
};
|
|
92
87
|
}
|
|
93
88
|
function moves(reach, room, move) {
|
|
94
|
-
return move === undefined || covers(reach, room, moveTarget(move));
|
|
89
|
+
return move === undefined || covers(reach, move.room ?? room, moveTarget(move));
|
|
95
90
|
}
|
|
96
91
|
function draftWithin(reach, draft) {
|
|
97
92
|
return covers(reach, draft.room, draft.path) && moves(reach, draft.room, draft.parts.move);
|
|
@@ -128,29 +123,54 @@ function statusWithin(reach, status) {
|
|
|
128
123
|
};
|
|
129
124
|
}
|
|
130
125
|
function queueWithin(reach, room, entries) {
|
|
131
|
-
return entries
|
|
132
|
-
(
|
|
126
|
+
return entries
|
|
127
|
+
.filter(({ batch }) => batch.changes.every((change) => covers(reach, room, change.path) &&
|
|
128
|
+
(change.kind !== 'move' || covers(reach, room, change.to))))
|
|
129
|
+
.map((entry) => {
|
|
130
|
+
const { between, ...batch } = entry.batch;
|
|
131
|
+
if (between === undefined)
|
|
132
|
+
return entry;
|
|
133
|
+
return wholly(reach, between.source.room) && wholly(reach, between.destination.room)
|
|
134
|
+
? entry
|
|
135
|
+
: { ...entry, batch };
|
|
136
|
+
});
|
|
133
137
|
}
|
|
134
138
|
function unreached(room) {
|
|
135
139
|
return runtimeError('room-not-held', `No Local Replica for ${room}`);
|
|
136
140
|
}
|
|
141
|
+
function lockedError(room) {
|
|
142
|
+
return runtimeError(ROOM_LOCKED, `${room} is locked until House confirms its access`, true);
|
|
143
|
+
}
|
|
144
|
+
function deviceUnreached() {
|
|
145
|
+
return runtimeError('device-unreached', 'Only the panel cleans up this device');
|
|
146
|
+
}
|
|
137
147
|
export function narrowed(runtime, given, told) {
|
|
138
148
|
const { md, watch } = runtime;
|
|
139
149
|
let reach = given;
|
|
140
150
|
let port = told;
|
|
141
151
|
const open = new Set();
|
|
142
|
-
function following(begin) {
|
|
152
|
+
function following(begin, locking = false) {
|
|
143
153
|
let stop = begin();
|
|
144
154
|
const restart = () => {
|
|
145
155
|
stop();
|
|
146
156
|
stop = begin();
|
|
147
157
|
};
|
|
148
158
|
open.add(restart);
|
|
159
|
+
const unwatch = locking ? runtime.watchLocks(restart) : () => { };
|
|
149
160
|
return () => {
|
|
150
161
|
open.delete(restart);
|
|
162
|
+
unwatch();
|
|
151
163
|
stop();
|
|
152
164
|
};
|
|
153
165
|
}
|
|
166
|
+
const unlocking = (rooms) => {
|
|
167
|
+
const locked = (rooms ?? []).filter((room) => runtime.locked(room));
|
|
168
|
+
return locked.length === 0
|
|
169
|
+
? null
|
|
170
|
+
: { pending: locked.map((room) => ({ room, awaits: 'unlock' })) };
|
|
171
|
+
};
|
|
172
|
+
const unlocked = (entries) => entries.filter((entry) => !runtime.locked(entry.room));
|
|
173
|
+
const intoLocked = (held) => held.some((move) => move?.room !== undefined && runtime.locked(move.room));
|
|
154
174
|
const within = (topic, input, deliver) => {
|
|
155
175
|
if (topic === 'rooms') {
|
|
156
176
|
return following(() => watch(topic, input, (rooms) => deliver(roomsWithin(reach, rooms))));
|
|
@@ -159,45 +179,60 @@ export function narrowed(runtime, given, told) {
|
|
|
159
179
|
return following(() => runtime.watchReadiness(port, reach, deliver));
|
|
160
180
|
}
|
|
161
181
|
if (topic === 'sync-status') {
|
|
162
|
-
return following(() => watch(topic, input, (status) =>
|
|
182
|
+
return following(() => watch(topic, input, (status) => {
|
|
183
|
+
const within = statusWithin(reach, status);
|
|
184
|
+
deliver({ ...within, attentionRequired: unlocked(within.attentionRequired) });
|
|
185
|
+
}), true);
|
|
163
186
|
}
|
|
164
187
|
if (topic === 'room-drafts') {
|
|
165
|
-
return following(() => watch(topic, input, (drafts) => deliver(draftsWithin(reach, drafts))));
|
|
188
|
+
return following(() => watch(topic, input, (drafts) => deliver(unlocked(draftsWithin(reach, drafts)))), true);
|
|
166
189
|
}
|
|
167
190
|
if (topic === 'queue') {
|
|
168
191
|
const room = input[0];
|
|
169
192
|
return following(() => {
|
|
170
|
-
if (!holds(reach, room)) {
|
|
193
|
+
if (!holds(reach, room) || runtime.locked(room)) {
|
|
171
194
|
deliver([]);
|
|
172
195
|
return () => { };
|
|
173
196
|
}
|
|
174
197
|
return watch(topic, input, (entries) => deliver(queueWithin(reach, room, entries)));
|
|
175
|
-
});
|
|
198
|
+
}, true);
|
|
176
199
|
}
|
|
177
200
|
if (topic === 'query') {
|
|
178
201
|
const plan = runtime.plan(input[0], reach);
|
|
179
202
|
let held = null;
|
|
180
203
|
return following(() => {
|
|
204
|
+
const locked = unlocking(plan.rooms);
|
|
205
|
+
if (locked !== null) {
|
|
206
|
+
const answer = { result: locked, keys: [] };
|
|
207
|
+
if (held === null || changeOf(held, answer) !== null)
|
|
208
|
+
deliver(answer);
|
|
209
|
+
held = digestOf(answer);
|
|
210
|
+
return () => { };
|
|
211
|
+
}
|
|
181
212
|
let first = true;
|
|
182
|
-
|
|
213
|
+
let open = true;
|
|
214
|
+
const heard = (message) => {
|
|
183
215
|
if (!first) {
|
|
184
|
-
held =
|
|
216
|
+
held = digestApplied(held, message);
|
|
185
217
|
deliver(message);
|
|
186
218
|
return;
|
|
187
219
|
}
|
|
188
220
|
first = false;
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
deliver(next.message);
|
|
221
|
+
const change = held === null ? message : changeOf(held, message);
|
|
222
|
+
held = digestOf(message);
|
|
223
|
+
if (change !== null)
|
|
224
|
+
deliver(change);
|
|
225
|
+
};
|
|
226
|
+
const current = { ...plan, reach: planReach(reach), locked: runtime.lockedRooms() };
|
|
227
|
+
const stop = runtime.watchPlan(current, (message) => {
|
|
228
|
+
if (open)
|
|
229
|
+
heard(message);
|
|
199
230
|
});
|
|
200
|
-
|
|
231
|
+
return () => {
|
|
232
|
+
open = false;
|
|
233
|
+
stop();
|
|
234
|
+
};
|
|
235
|
+
}, true);
|
|
201
236
|
}
|
|
202
237
|
if (topic === 'conversation') {
|
|
203
238
|
return following(() => {
|
|
@@ -217,16 +252,32 @@ export function narrowed(runtime, given, told) {
|
|
|
217
252
|
}
|
|
218
253
|
return watch(topic, input, deliver);
|
|
219
254
|
};
|
|
255
|
+
const files = new Map();
|
|
256
|
+
let handed = 0;
|
|
257
|
+
const hand = async (reading) => {
|
|
258
|
+
const answer = await reading;
|
|
259
|
+
if (answer.kind !== 'binary')
|
|
260
|
+
return answer;
|
|
261
|
+
handed += 1;
|
|
262
|
+
const file = String(handed);
|
|
263
|
+
files.set(file, answer.file);
|
|
264
|
+
return { ...answer, file };
|
|
265
|
+
};
|
|
220
266
|
const conversation = () => (conversing(reach) ? md.conversation : NO_CONVERSATION);
|
|
221
267
|
const chatDraft = () => (conversing(reach) ? md.chatDraft : NO_CHAT_DRAFT);
|
|
222
268
|
const view = {
|
|
223
269
|
...md,
|
|
224
270
|
rooms: () => roomsWithin(reach, md.rooms()),
|
|
225
|
-
query: ((input) =>
|
|
271
|
+
query: ((input) => {
|
|
272
|
+
const plan = runtime.plan(input, reach);
|
|
273
|
+
return Promise.resolve(unlocking(plan.rooms) ?? runtime.query({ ...plan, locked: runtime.lockedRooms() }));
|
|
274
|
+
}),
|
|
226
275
|
search: (input) => port.search === 'required'
|
|
227
|
-
? runtime.search(input, reach)
|
|
276
|
+
? runtime.search(input, reach, runtime.lockedRooms())
|
|
228
277
|
: Promise.resolve(undeclaredSearch()),
|
|
229
278
|
types(room) {
|
|
279
|
+
if (holds(reach, room) && runtime.locked(room))
|
|
280
|
+
throw lockedError(room);
|
|
230
281
|
if (wholly(reach, room))
|
|
231
282
|
return md.types(room);
|
|
232
283
|
if (!holds(reach, room))
|
|
@@ -237,50 +288,100 @@ export function narrowed(runtime, given, told) {
|
|
|
237
288
|
async save(room, roomDrafts, writtenBy) {
|
|
238
289
|
if (!holds(reach, room))
|
|
239
290
|
throw unreached(room);
|
|
240
|
-
|
|
241
|
-
|
|
291
|
+
if (runtime.locked(room))
|
|
292
|
+
return { outcome: 'refused', code: ROOM_LOCKED, retryable: true };
|
|
293
|
+
const held = (await Promise.all(roomDrafts.map(({ path }) => md.roomDraft.read(room, path)))).map((draft) => draft?.parts.move);
|
|
294
|
+
const outside = roomDrafts.find(({ path }, at) => !covers(reach, room, path) || !moves(reach, room, held[at]));
|
|
242
295
|
if (outside !== undefined) {
|
|
243
296
|
return { outcome: 'refused', code: 'stale', retryable: false, file: outside.path };
|
|
244
297
|
}
|
|
298
|
+
if (intoLocked(held))
|
|
299
|
+
return { outcome: 'refused', code: ROOM_LOCKED, retryable: true };
|
|
245
300
|
return savedWithin(reach, room, await md.save(room, roomDrafts, writtenBy));
|
|
246
301
|
},
|
|
247
302
|
async saveParts(room, parts, writtenBy) {
|
|
248
303
|
if (!holds(reach, room))
|
|
249
304
|
throw unreached(room);
|
|
250
|
-
if (
|
|
305
|
+
if (runtime.locked(room))
|
|
306
|
+
return { outcome: 'refused', code: ROOM_LOCKED, retryable: true };
|
|
307
|
+
const held = parts.map(({ parts: one }) => readParts(one).move);
|
|
308
|
+
if (parts.some(({ path }, at) => !covers(reach, room, path) || !moves(reach, room, held[at]))) {
|
|
251
309
|
throw unreached(room);
|
|
252
310
|
}
|
|
311
|
+
if (intoLocked(held))
|
|
312
|
+
return { outcome: 'refused', code: ROOM_LOCKED, retryable: true };
|
|
253
313
|
return savedWithin(reach, room, await md.saveParts(room, parts, writtenBy));
|
|
254
314
|
},
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
315
|
+
resolve(room, path, destination) {
|
|
316
|
+
const at = runtime.located(room, path, destination);
|
|
317
|
+
return at !== null && !covers(reach, at.room, at.path)
|
|
318
|
+
? Promise.resolve(UNREADABLE)
|
|
319
|
+
: md.resolve(room, path, destination);
|
|
320
|
+
},
|
|
321
|
+
history: (room, path, query) => !covers(reach, room, path)
|
|
322
|
+
? Promise.resolve(failure({ kind: 'room-not-readable', locator: room }))
|
|
323
|
+
: runtime.locked(room)
|
|
324
|
+
? Promise.resolve(lockedRoom(room))
|
|
325
|
+
: md.history(room, path, query),
|
|
258
326
|
binaryFile: {
|
|
259
|
-
read: (room, path, revision) => covers(reach, room, path)
|
|
260
|
-
?
|
|
261
|
-
:
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
327
|
+
read: (room, path, revision) => !covers(reach, room, path)
|
|
328
|
+
? Promise.resolve(failure({ kind: 'room-not-readable', locator: room }))
|
|
329
|
+
: runtime.locked(room)
|
|
330
|
+
? Promise.resolve(lockedRoom(room))
|
|
331
|
+
: hand(md.binaryFile.read(room, path, revision)),
|
|
332
|
+
link: (room, path, revision) => !covers(reach, room, path)
|
|
333
|
+
? Promise.resolve(failure({ kind: 'room-not-readable', locator: room }))
|
|
334
|
+
: runtime.locked(room)
|
|
335
|
+
? Promise.resolve(lockedRoom(room))
|
|
336
|
+
: md.binaryFile.link(room, path, revision),
|
|
337
|
+
readReference(reference) {
|
|
338
|
+
const scope = runtime.referrerScope(reference.referrer);
|
|
339
|
+
if (!refers(reach, scope))
|
|
340
|
+
return Promise.resolve(absentReference(reference.fileRef));
|
|
341
|
+
if (scope !== null && runtime.locked(scope.locator)) {
|
|
342
|
+
return Promise.resolve(lockedRoom(scope.locator));
|
|
343
|
+
}
|
|
344
|
+
return hand(md.binaryFile.readReference(reference));
|
|
345
|
+
},
|
|
346
|
+
async part(file, part) {
|
|
347
|
+
const key = files.get(file);
|
|
348
|
+
if (key === undefined)
|
|
349
|
+
return null;
|
|
350
|
+
const bytes = await md.binaryFile.part(key, part);
|
|
351
|
+
if (bytes === null)
|
|
352
|
+
files.delete(file);
|
|
353
|
+
return bytes;
|
|
354
|
+
},
|
|
268
355
|
},
|
|
269
|
-
reached: (room, roomVersion, path) => (path === undefined ? wholly(reach, room) : covers(reach, room, path)) &&
|
|
270
|
-
|
|
356
|
+
reached: async (room, roomVersion, path) => (path === undefined ? wholly(reach, room) : covers(reach, room, path)) &&
|
|
357
|
+
!runtime.locked(room) &&
|
|
358
|
+
(await md.reached(room, roomVersion, path)),
|
|
271
359
|
log: () => (reach === null ? md.log() : ''),
|
|
360
|
+
cleanUp: () => (reach === null ? md.cleanUp() : Promise.reject(deviceUnreached())),
|
|
272
361
|
roomDraft: {
|
|
273
|
-
list: () => md.roomDraft.list().then((drafts) => draftsWithin(reach, drafts)),
|
|
274
|
-
|
|
362
|
+
list: () => md.roomDraft.list().then((drafts) => unlocked(draftsWithin(reach, drafts))),
|
|
363
|
+
async read(room, path) {
|
|
364
|
+
if (!covers(reach, room, path))
|
|
365
|
+
return null;
|
|
366
|
+
if (runtime.locked(room))
|
|
367
|
+
throw lockedError(room);
|
|
368
|
+
return shownDraft(reach, await md.roomDraft.read(room, path));
|
|
369
|
+
},
|
|
275
370
|
async write(room, path, revision, parts) {
|
|
276
|
-
|
|
371
|
+
const move = readParts(parts).move;
|
|
372
|
+
if (!covers(reach, room, path) || !moves(reach, room, move))
|
|
277
373
|
throw unreached(room);
|
|
278
|
-
|
|
374
|
+
if (runtime.locked(room))
|
|
375
|
+
throw lockedError(room);
|
|
376
|
+
if (intoLocked([move]))
|
|
377
|
+
throw lockedError(move.room);
|
|
279
378
|
return writeWithin(reach, await md.roomDraft.write(room, path, revision, parts));
|
|
280
379
|
},
|
|
281
380
|
async discard(room, path, revision) {
|
|
282
381
|
if (!covers(reach, room, path))
|
|
283
382
|
return staleWrite(null);
|
|
383
|
+
if (runtime.locked(room))
|
|
384
|
+
throw lockedError(room);
|
|
284
385
|
return writeWithin(reach, await md.roomDraft.discard(room, path, revision));
|
|
285
386
|
},
|
|
286
387
|
},
|
|
@@ -289,6 +390,11 @@ export function narrowed(runtime, given, told) {
|
|
|
289
390
|
read: (id, options) => conversation().read(id, options),
|
|
290
391
|
create: (input) => conversation().create(input),
|
|
291
392
|
send: (id, operation, draft) => conversation().send(id, operation, draft),
|
|
393
|
+
attach: (room, file) => !wholly(reach, room)
|
|
394
|
+
? Promise.resolve(failure({ kind: 'room-not-readable', locator: room }))
|
|
395
|
+
: runtime.locked(room)
|
|
396
|
+
? Promise.resolve(lockedRoom(room))
|
|
397
|
+
: conversation().attach(room, file),
|
|
292
398
|
answer: (id, answer) => conversation().answer(id, answer),
|
|
293
399
|
interrupt: (id) => conversation().interrupt(id),
|
|
294
400
|
kill: (id) => conversation().kill(id),
|
package/dist/readiness.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { Open } from './open.js';
|
|
2
2
|
export type CodeAvailability = Open<'stored' | 'absent'>;
|
|
3
|
-
export type RoomPreparation = Open<'complete' | 'acquiring' | 'preparing' | '
|
|
3
|
+
export type RoomPreparation = Open<'complete' | 'acquiring' | 'preparing' | 'refused' | 'unadmitted'>;
|
|
4
4
|
export type RoomCoverage = {
|
|
5
5
|
readonly room: string;
|
|
6
6
|
readonly state: RoomPreparation;
|
|
7
7
|
};
|
|
8
|
-
export type ConversationCoverage = Open<'complete' | 'acquiring' | '
|
|
8
|
+
export type ConversationCoverage = Open<'complete' | 'acquiring' | 'undeclared'>;
|
|
9
9
|
export type SearchObligation = Open<'required' | 'unused'>;
|
|
10
10
|
export type TargetCoverage = {
|
|
11
11
|
readonly complete: boolean;
|
|
@@ -19,7 +19,7 @@ export type Durability = Open<'persistent' | 'best-effort'>;
|
|
|
19
19
|
export type ConnectionAvailability = Open<'connected' | 'connecting' | 'unreachable'>;
|
|
20
20
|
export type HouseOutcome = Open<'open' | 'write-halted' | 'refused'>;
|
|
21
21
|
export type CapacityCause = {
|
|
22
|
-
readonly cause: Open<'insufficient-space' | '
|
|
22
|
+
readonly cause: Open<'insufficient-space' | 'storage-exceeded'>;
|
|
23
23
|
readonly needed: number | null;
|
|
24
24
|
readonly available: number | null;
|
|
25
25
|
};
|
package/dist/readiness.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;AAEzD,MAAM,MAAM,eAAe,GAAG,IAAI,CAChC,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":"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"}
|
package/dist/reads.js
CHANGED
|
@@ -5,7 +5,7 @@ function declaredAs(declaration) {
|
|
|
5
5
|
return declared;
|
|
6
6
|
}
|
|
7
7
|
function sameHeld(one, other) {
|
|
8
|
-
return one
|
|
8
|
+
return one === other;
|
|
9
9
|
}
|
|
10
10
|
function failed(answer) {
|
|
11
11
|
return answer?.kind === 'transport-uncertainty';
|
package/dist/recovery.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export type AttemptOptions = {
|
|
|
8
8
|
};
|
|
9
9
|
export type RecoveryOptions = {
|
|
10
10
|
readonly firstMs?: number;
|
|
11
|
-
readonly
|
|
11
|
+
readonly maxMs?: number;
|
|
12
12
|
readonly attempts?: number;
|
|
13
13
|
readonly inFlight?: number;
|
|
14
14
|
};
|
|
@@ -20,6 +20,6 @@ export type Recovery = {
|
|
|
20
20
|
scope(inFlight?: number): Recovery;
|
|
21
21
|
retire(): Promise<void>;
|
|
22
22
|
};
|
|
23
|
-
export declare function retryDelay(tries: number, firstMs?: number,
|
|
23
|
+
export declare function retryDelay(tries: number, firstMs?: number, maxMs?: number): number;
|
|
24
24
|
export declare function createRecovery(options?: RecoveryOptions): Recovery;
|
|
25
25
|
//# sourceMappingURL=recovery.d.ts.map
|
package/dist/recovery.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../src/recovery.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAElE,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../src/recovery.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAElE,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACnC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB,CAAC;AAsBF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAW,EAAE,KAAK,SAAS,GAAG,MAAM,CAGpF;AAwKD,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAStE"}
|
package/dist/recovery.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// A first retry waits about a second, so a passing failure clears before the next attempt.
|
|
2
2
|
const FIRST_MS = 1_000;
|
|
3
3
|
// Waits stop doubling at half a minute, so work resumes soon after a long failure ends.
|
|
4
|
-
const
|
|
4
|
+
const MAX_MS = 30_000;
|
|
5
5
|
const ATTEMPTS = 8;
|
|
6
|
-
export function retryDelay(tries, firstMs = FIRST_MS,
|
|
7
|
-
const
|
|
8
|
-
return
|
|
6
|
+
export function retryDelay(tries, firstMs = FIRST_MS, maxMs = MAX_MS) {
|
|
7
|
+
const longest = Math.min(maxMs, firstMs * 2 ** tries);
|
|
8
|
+
return longest / 2 + (Math.random() * longest) / 2;
|
|
9
9
|
}
|
|
10
10
|
function owner(backoff, inFlight, release = () => { }) {
|
|
11
11
|
const intents = new Map();
|
|
@@ -84,7 +84,8 @@ function owner(backoff, inFlight, release = () => { }) {
|
|
|
84
84
|
return;
|
|
85
85
|
}
|
|
86
86
|
if (result === 'again') {
|
|
87
|
-
|
|
87
|
+
// The next attempt waits the doubling backoff, up to its maximum.
|
|
88
|
+
const delay = retryDelay(intent.tries - 1, backoff.firstMs, backoff.maxMs);
|
|
88
89
|
wait(key, intent, Date.now() + delay, false);
|
|
89
90
|
}
|
|
90
91
|
else
|
|
@@ -135,7 +136,7 @@ function owner(backoff, inFlight, release = () => { }) {
|
|
|
135
136
|
wait(key, intent, options.at, true);
|
|
136
137
|
else if (options.again === true) {
|
|
137
138
|
intent.tries = 1;
|
|
138
|
-
wait(key, intent, Date.now() + retryDelay(0, backoff.firstMs, backoff.
|
|
139
|
+
wait(key, intent, Date.now() + retryDelay(0, backoff.firstMs, backoff.maxMs), false);
|
|
139
140
|
}
|
|
140
141
|
else
|
|
141
142
|
launch(key, intent);
|
|
@@ -191,7 +192,7 @@ function owner(backoff, inFlight, release = () => { }) {
|
|
|
191
192
|
export function createRecovery(options = {}) {
|
|
192
193
|
return owner({
|
|
193
194
|
firstMs: options.firstMs ?? FIRST_MS,
|
|
194
|
-
|
|
195
|
+
maxMs: options.maxMs ?? MAX_MS,
|
|
195
196
|
attempts: options.attempts ?? ATTEMPTS,
|
|
196
197
|
}, options.inFlight ?? Infinity);
|
|
197
198
|
}
|
package/dist/refresh.d.ts
CHANGED
|
@@ -1,24 +1,21 @@
|
|
|
1
1
|
import type { AdapterFailure, Authorization, RetryableRefusal } from './adapter.js';
|
|
2
2
|
import type { Reads, Remodel } from './bootstrap.js';
|
|
3
|
-
import {
|
|
4
|
-
import type {
|
|
5
|
-
import
|
|
3
|
+
import type { ReplicaRecord } from './replica.js';
|
|
4
|
+
import type { RefreshedPage } from './store.js';
|
|
5
|
+
import type { HeldEntry } from './tables.js';
|
|
6
|
+
import { type Unconfirmed } from './transfer.js';
|
|
6
7
|
export type Advancement = {
|
|
7
8
|
kind: 'still-current';
|
|
8
9
|
} | {
|
|
9
10
|
kind: 'advanced';
|
|
10
11
|
record: ReplicaRecord;
|
|
12
|
+
changed: ReadonlySet<string>;
|
|
11
13
|
} | {
|
|
12
14
|
kind: 'beyond-horizon';
|
|
13
15
|
} | RetryableRefusal | Unconfirmed | AdapterFailure;
|
|
14
|
-
export type
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
} | {
|
|
20
|
-
kind: 'beyond-horizon';
|
|
21
|
-
} | RetryableRefusal | Unconfirmed | Refused | AdapterFailure;
|
|
22
|
-
export declare function advancement(adapter: Reads, authorization: Authorization, held: ReplicaRecord, remodel: Remodel, continuing: () => boolean): Promise<Advancement>;
|
|
23
|
-
export declare function refreshRoom(adapter: Reads, authorization: Authorization, confirmed: ConfirmedLayer, remodel: Remodel, continuing: () => boolean): Promise<RefreshOutcome>;
|
|
16
|
+
export type Refreshing = {
|
|
17
|
+
prior(paths: readonly string[]): Promise<ReadonlyMap<string, HeldEntry>>;
|
|
18
|
+
stage(page: RefreshedPage): Promise<boolean>;
|
|
19
|
+
};
|
|
20
|
+
export declare function advancement(adapter: Reads, authorization: Authorization, held: ReplicaRecord, remodel: Remodel, continuing: () => boolean, staging: Refreshing): Promise<Advancement>;
|
|
24
21
|
//# 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,EAAE,cAAc,EAAE,aAAa,EAAe,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAe,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACjG,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE9D,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,cAAc,CAAC;AAEnB,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACzE,KAAK,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C,CAAC;AAkEF,wBAAsB,WAAW,CAC/B,OAAO,EAAE,KAAK,EACd,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,OAAO,EACzB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,WAAW,CAAC,CA+CtB"}
|