@agentshouse/mdruntime 0.1.0-cf04ede9fb796 → 0.1.0-cf0c43fc48aad
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 +12 -12
- package/dist/acceptance.d.ts +0 -3
- package/dist/acceptance.d.ts.map +1 -1
- package/dist/acceptance.js +74 -164
- package/dist/act-lanes.d.ts +30 -0
- package/dist/act-lanes.d.ts.map +1 -0
- package/dist/act-lanes.js +225 -0
- package/dist/actions.d.ts +8 -2
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +118 -67
- package/dist/adapter.d.ts +27 -48
- package/dist/adapter.d.ts.map +1 -1
- package/dist/bootstrap.d.ts +1 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +6 -19
- package/dist/change-set.d.ts +4 -0
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +6 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +4 -2
- package/dist/client.d.ts +9 -18
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +32 -15
- package/dist/collection.d.ts +22 -4
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +12 -2
- package/dist/compile.d.ts +2 -0
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +31 -24
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +26 -21
- package/dist/conversation-live.d.ts +10 -6
- package/dist/conversation-live.d.ts.map +1 -1
- package/dist/conversation-live.js +8 -6
- package/dist/conversation.d.ts +28 -10
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +194 -141
- package/dist/declaration.d.ts +10 -0
- package/dist/declaration.d.ts.map +1 -0
- package/dist/declaration.js +24 -0
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +19 -44
- package/dist/durability.d.ts +3 -0
- package/dist/durability.d.ts.map +1 -1
- package/dist/entry.js +1 -1
- package/dist/expectation.d.ts +26 -13
- package/dist/expectation.d.ts.map +1 -1
- package/dist/expectation.js +72 -19
- package/dist/failure.d.ts +3 -0
- package/dist/failure.d.ts.map +1 -1
- package/dist/failure.js +6 -0
- package/dist/host.d.ts +17 -2
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +45 -11
- package/dist/index.d.ts +12 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -6
- package/dist/install.d.ts +2 -4
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +52 -78
- package/dist/lifecycle.d.ts +1 -1
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +40 -31
- package/dist/listing.d.ts +6 -11
- package/dist/listing.d.ts.map +1 -1
- package/dist/listing.js +25 -62
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +3 -3
- package/dist/locks.d.ts +2 -4
- package/dist/locks.d.ts.map +1 -1
- package/dist/locks.js +10 -39
- package/dist/lost.d.ts.map +1 -1
- package/dist/lost.js +10 -22
- package/dist/media.d.ts +1 -1
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +4 -4
- package/dist/memory.d.ts +4 -2
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +44 -23
- package/dist/messages.d.ts +9 -5
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +25 -35
- package/dist/model.d.ts +0 -1
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +0 -5
- package/dist/models.d.ts +4 -8
- package/dist/models.d.ts.map +1 -1
- package/dist/models.js +95 -137
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +12 -17
- package/dist/opened.d.ts +1 -1
- package/dist/opened.d.ts.map +1 -1
- package/dist/opened.js +5 -5
- package/dist/opening.d.ts.map +1 -1
- package/dist/opening.js +5 -9
- package/dist/outcome.d.ts +3 -0
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +15 -0
- package/dist/overlay.d.ts +5 -1
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +36 -21
- package/dist/page-metadata.d.ts +8 -0
- package/dist/page-metadata.d.ts.map +1 -0
- package/dist/page-metadata.js +19 -0
- package/dist/parts.d.ts +3 -59
- package/dist/parts.d.ts.map +1 -1
- package/dist/parts.js +10 -123
- package/dist/preparation.d.ts.map +1 -1
- package/dist/preparation.js +25 -24
- package/dist/presence.d.ts +52 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +220 -0
- package/dist/queries.d.ts +1 -1
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +24 -14
- package/dist/query.d.ts +0 -1
- package/dist/query.d.ts.map +1 -1
- package/dist/questions.d.ts +0 -5
- package/dist/questions.d.ts.map +1 -1
- package/dist/questions.js +0 -7
- package/dist/queue.d.ts +40 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +450 -0
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +67 -22
- package/dist/react.d.ts +5 -0
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +33 -1
- package/dist/reads.d.ts +3 -1
- package/dist/reads.d.ts.map +1 -1
- package/dist/reads.js +9 -2
- package/dist/recovery.d.ts +3 -1
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +29 -7
- package/dist/refresh.js +2 -2
- package/dist/refusal.d.ts.map +1 -1
- package/dist/refusal.js +5 -6
- package/dist/replica.d.ts +5 -11
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +13 -15
- package/dist/retried.d.ts +30 -0
- package/dist/retried.d.ts.map +1 -0
- package/dist/retried.js +72 -0
- package/dist/room-draft.d.ts +4 -6
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +46 -57
- package/dist/room-drafts.d.ts.map +1 -1
- package/dist/room-drafts.js +17 -16
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +3 -4
- package/dist/runtime.d.ts +9 -18
- package/dist/runtime.d.ts.map +1 -1
- package/dist/save.d.ts +42 -90
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +334 -167
- package/dist/saves.d.ts +2 -40
- package/dist/saves.d.ts.map +1 -1
- package/dist/saves.js +107 -705
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +2 -3
- package/dist/shared.d.ts +0 -5
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +4 -90
- package/dist/shown.d.ts +4 -3
- package/dist/shown.d.ts.map +1 -1
- package/dist/shown.js +26 -31
- package/dist/socket/lanes.d.ts +12 -4
- package/dist/socket/lanes.d.ts.map +1 -1
- package/dist/socket/lanes.js +34 -8
- package/dist/socket/session.d.ts +0 -1
- package/dist/socket/session.d.ts.map +1 -1
- package/dist/socket.d.ts +3 -6
- package/dist/socket.d.ts.map +1 -1
- package/dist/socket.js +5 -16
- package/dist/source.d.ts +0 -7
- package/dist/source.d.ts.map +1 -1
- package/dist/source.js +5 -4
- package/dist/store/records.d.ts +8 -6
- package/dist/store/records.d.ts.map +1 -1
- package/dist/store/records.js +13 -6
- package/dist/store/space.d.ts +1 -1
- package/dist/store/space.d.ts.map +1 -1
- package/dist/store/space.js +0 -2
- package/dist/store/watchers.js +1 -2
- package/dist/store.d.ts +11 -6
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +38 -13
- package/dist/stored.d.ts +2 -1
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +11 -11
- package/dist/surface.d.ts +1 -1
- package/dist/surface.d.ts.map +1 -1
- package/dist/surface.js +13 -16
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +88 -85
- package/dist/tables.d.ts +6 -8
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +41 -20
- package/dist/tallies.js +5 -5
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +2 -2
- package/dist/wire.d.ts +51 -7
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +15 -4
- package/package.json +3 -2
- package/dist/attempt.d.ts +0 -16
- package/dist/attempt.d.ts.map +0 -1
- package/dist/attempt.js +0 -70
- package/dist/job.d.ts +0 -33
- package/dist/job.d.ts.map +0 -1
- package/dist/job.js +0 -54
- package/dist/log.d.ts +0 -6
- package/dist/log.d.ts.map +0 -1
- package/dist/log.js +0 -14
- package/dist/socket/rooms.d.ts +0 -44
- package/dist/socket/rooms.d.ts.map +0 -1
- package/dist/socket/rooms.js +0 -90
- package/dist/store/fences.d.ts +0 -16
- package/dist/store/fences.d.ts.map +0 -1
- package/dist/store/fences.js +0 -26
package/dist/preparation.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { changeSet } from './change-set.js';
|
|
2
|
+
import { uncaught } from './failure.js';
|
|
2
3
|
import { installationOf } from './install.js';
|
|
3
4
|
import { listedLocators } from './listing.js';
|
|
4
5
|
import { planReach } from './reach.js';
|
|
@@ -27,17 +28,18 @@ async function prepareReplica(runtime, locator) {
|
|
|
27
28
|
return;
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
|
-
async function unprepared({ store
|
|
31
|
+
async function unprepared({ store }) {
|
|
31
32
|
const held = (await store.covering()).rooms;
|
|
32
|
-
|
|
33
|
+
const { unpreparedDemand, unpreparable } = store.device.now();
|
|
34
|
+
return [...unpreparedDemand, ...held.keys()].find((locator) => !(held.get(locator)?.indexed ?? false) && !unpreparable.has(locator));
|
|
33
35
|
}
|
|
34
|
-
function unpreparedBy({ store
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
function unpreparedBy({ store }, locator) {
|
|
37
|
+
const { unpreparable } = store.device.now();
|
|
38
|
+
store.device.set({ unpreparable: new Set([...unpreparable, locator]) });
|
|
37
39
|
store.readiness.queue();
|
|
38
40
|
}
|
|
39
41
|
export function prepare(runtime, locators = []) {
|
|
40
|
-
const { store, socket
|
|
42
|
+
const { store, socket } = runtime;
|
|
41
43
|
const { device } = store;
|
|
42
44
|
if (locators.length > 0) {
|
|
43
45
|
device.set({ unpreparedDemand: new Set([...device.now().unpreparedDemand, ...locators]) });
|
|
@@ -54,11 +56,11 @@ export function prepare(runtime, locators = []) {
|
|
|
54
56
|
const demand = new Set(device.now().unpreparedDemand);
|
|
55
57
|
demand.delete(waiting);
|
|
56
58
|
device.set({ unpreparedDemand: demand });
|
|
57
|
-
await prepareReplica(runtime, waiting).catch((
|
|
59
|
+
await prepareReplica(runtime, waiting).catch(() => unpreparedBy(runtime, waiting));
|
|
58
60
|
}
|
|
59
61
|
}
|
|
60
|
-
catch {
|
|
61
|
-
|
|
62
|
+
catch (error) {
|
|
63
|
+
uncaught(error);
|
|
62
64
|
}
|
|
63
65
|
finally {
|
|
64
66
|
device.set({ preparing: false });
|
|
@@ -79,12 +81,9 @@ function requiredRooms(runtime, given, held) {
|
|
|
79
81
|
return { listed: true, rooms: named.filter((room) => listed.has(room)) };
|
|
80
82
|
return { listed: named.every((room) => held.has(room)), rooms: named };
|
|
81
83
|
}
|
|
82
|
-
function roomState({ socket }, locator, held) {
|
|
83
|
-
const listedRoom = socket.rooms.discovered(locator);
|
|
84
|
+
function roomState({ socket, presence }, locator, held) {
|
|
84
85
|
if (socket.session.now().roomsListed &&
|
|
85
|
-
(
|
|
86
|
-
listedRoom.replica.admission !== 'admitted' ||
|
|
87
|
-
socket.rooms.standing(locator).unreadable))
|
|
86
|
+
(presence.room(locator) === undefined || !presence.available(locator)))
|
|
88
87
|
return 'unadmitted';
|
|
89
88
|
const stored = held.get(locator);
|
|
90
89
|
if (stored === undefined)
|
|
@@ -124,8 +123,9 @@ function readinessFor(runtime, port, reach, { held, facts }) {
|
|
|
124
123
|
const { store, socket, usableWhenHeld } = runtime;
|
|
125
124
|
const required = requiredRooms(runtime, reach, held);
|
|
126
125
|
const coverage = required.rooms.map((room) => ({ room, state: roomState(runtime, room, held) }));
|
|
126
|
+
const { unpreparable } = store.device.now();
|
|
127
127
|
const preparing = coverage
|
|
128
|
-
.filter((room) => room.state === 'preparing' && !
|
|
128
|
+
.filter((room) => room.state === 'preparing' && !unpreparable.has(room.room))
|
|
129
129
|
.map(({ room }) => room);
|
|
130
130
|
if (preparing.length > 0)
|
|
131
131
|
prepare(runtime, preparing);
|
|
@@ -152,7 +152,7 @@ function readinessFor(runtime, port, reach, { held, facts }) {
|
|
|
152
152
|
});
|
|
153
153
|
}
|
|
154
154
|
function establish(runtime, name) {
|
|
155
|
-
const { store
|
|
155
|
+
const { store } = runtime;
|
|
156
156
|
const { device } = store;
|
|
157
157
|
if (device.now().establishing.has(name))
|
|
158
158
|
return;
|
|
@@ -165,9 +165,7 @@ function establish(runtime, name) {
|
|
|
165
165
|
.then(() => {
|
|
166
166
|
store.readiness.queue();
|
|
167
167
|
void probeEachMinute(runtime);
|
|
168
|
-
},
|
|
169
|
-
journal.record(`target record failed ${name}`);
|
|
170
|
-
})
|
|
168
|
+
}, uncaught)
|
|
171
169
|
.finally(() => {
|
|
172
170
|
const establishing = new Set(device.now().establishing);
|
|
173
171
|
establishing.delete(name);
|
|
@@ -199,15 +197,14 @@ export function watchReadiness({ store }, port, reach, deliver) {
|
|
|
199
197
|
return stop;
|
|
200
198
|
}
|
|
201
199
|
export function filled(runtime) {
|
|
202
|
-
const { store, socket
|
|
200
|
+
const { store, socket } = runtime;
|
|
203
201
|
if (socket.closed() || !store.space.fill())
|
|
204
202
|
return;
|
|
205
|
-
journal.record('space full');
|
|
206
203
|
store.readiness.queue();
|
|
207
204
|
void probeEachMinute(runtime);
|
|
208
205
|
}
|
|
209
|
-
async function installedTarget({ store
|
|
210
|
-
if (store.device.now().heldWhenOpened
|
|
206
|
+
async function installedTarget({ store }) {
|
|
207
|
+
if (store.device.now().heldWhenOpened)
|
|
211
208
|
return true;
|
|
212
209
|
const { targets } = await (await store.open()).facts();
|
|
213
210
|
return Object.values(targets).some((target) => target.established);
|
|
@@ -218,7 +215,11 @@ async function probeEachMinute(runtime) {
|
|
|
218
215
|
const idle = () => !space.full() || space.probing() || socket.closed();
|
|
219
216
|
if (idle())
|
|
220
217
|
return;
|
|
221
|
-
|
|
218
|
+
const installed = await installedTarget(runtime).catch((error) => {
|
|
219
|
+
uncaught(error);
|
|
220
|
+
return false;
|
|
221
|
+
});
|
|
222
|
+
if (!installed)
|
|
222
223
|
return;
|
|
223
224
|
if (idle())
|
|
224
225
|
return;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { DiscoveredRoom, ProviderRefusal, ScopedRefusal } from './adapter.js';
|
|
2
|
+
import type { ModelState } from './model.js';
|
|
3
|
+
type Repairable = {
|
|
4
|
+
readonly reset: string | undefined;
|
|
5
|
+
};
|
|
6
|
+
type Standing = {
|
|
7
|
+
readonly stale: boolean;
|
|
8
|
+
readonly repairable: Repairable | null;
|
|
9
|
+
readonly repairing: boolean;
|
|
10
|
+
readonly reloadDue: boolean;
|
|
11
|
+
};
|
|
12
|
+
type Listing = {
|
|
13
|
+
readonly whole: boolean;
|
|
14
|
+
readonly live: boolean;
|
|
15
|
+
};
|
|
16
|
+
export type Presence = {
|
|
17
|
+
list(found: readonly DiscoveredRoom[], how: Listing): readonly DiscoveredRoom[];
|
|
18
|
+
room(locator: string): DiscoveredRoom | undefined;
|
|
19
|
+
rooms(): readonly DiscoveredRoom[];
|
|
20
|
+
available(locator: string, selection?: string): boolean;
|
|
21
|
+
refusal(locator: string): ProviderRefusal | null;
|
|
22
|
+
unheldModel(locator: string): ModelState | null;
|
|
23
|
+
refused(locator: string, refusal: ScopedRefusal | null): void;
|
|
24
|
+
readable(locator: string): boolean;
|
|
25
|
+
modelled(locator: string, model: ModelState | null): void;
|
|
26
|
+
installed(locator: string, bootstrapped: boolean): void;
|
|
27
|
+
locked(locator: string, stored: () => Promise<string | null>): Promise<boolean>;
|
|
28
|
+
lockedAmong(stored: ReadonlyMap<string, string>): readonly string[];
|
|
29
|
+
connectionLost(lapsed: () => void): void;
|
|
30
|
+
connectionLive(): void;
|
|
31
|
+
lapse(): void;
|
|
32
|
+
stood(locator: string, stale: boolean, repairable?: Repairable | null): void;
|
|
33
|
+
repairing(locator: string, running: boolean): void;
|
|
34
|
+
reload(locator: string, due: boolean): void;
|
|
35
|
+
standing(locator: string): Standing;
|
|
36
|
+
settled(): boolean;
|
|
37
|
+
repairsOwed(): readonly string[];
|
|
38
|
+
askAgain(locator: string, ask: () => void): void;
|
|
39
|
+
stopAsking(locator?: string): void;
|
|
40
|
+
lose(locator: string, during: number): boolean;
|
|
41
|
+
writing(locator: string): boolean;
|
|
42
|
+
unwritten(locator: string): void;
|
|
43
|
+
lost(locator: string): boolean;
|
|
44
|
+
losses(): number;
|
|
45
|
+
lostSince(locator: string, losses: number): boolean;
|
|
46
|
+
liftable(locator: string, discovery: number): boolean;
|
|
47
|
+
lift(locator: string, discovery: number, unfenced: boolean): void;
|
|
48
|
+
close(): void;
|
|
49
|
+
};
|
|
50
|
+
export declare function createPresence(): Presence;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=presence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../src/presence.ts"],"names":[],"mappings":"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"}
|
package/dist/presence.js
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
const UNANSWERED = {
|
|
2
|
+
stale: false,
|
|
3
|
+
repairable: null,
|
|
4
|
+
repairing: false,
|
|
5
|
+
reloadDue: false,
|
|
6
|
+
refusal: null,
|
|
7
|
+
unreading: false,
|
|
8
|
+
unreadable: false,
|
|
9
|
+
unheldModel: null,
|
|
10
|
+
confirmed: false,
|
|
11
|
+
};
|
|
12
|
+
// A Room the Provider answers not ready is asked again after these waits, the last repeating, so a chunk build that catches up within seconds installs at once and a long one is asked every 15 seconds.
|
|
13
|
+
const NOT_READY_MS = [1_000, 2_000, 3_000, 5_000, 8_000, 11_000, 15_000];
|
|
14
|
+
// A Room that locks offline stays readable this long after the connection drops, so a laptop waking or changing network keeps working while a disconnected device locks soon after.
|
|
15
|
+
const LOCK_GRACE_MS = 120_000;
|
|
16
|
+
export function createPresence() {
|
|
17
|
+
const listed = new Map();
|
|
18
|
+
const answered = new Map();
|
|
19
|
+
const marks = new Map();
|
|
20
|
+
const lastLost = new Map();
|
|
21
|
+
const unready = new Map();
|
|
22
|
+
let lossCount = 0;
|
|
23
|
+
let lockGrace = null;
|
|
24
|
+
function answer(locator) {
|
|
25
|
+
return answered.get(locator) ?? UNANSWERED;
|
|
26
|
+
}
|
|
27
|
+
function change(locator, next) {
|
|
28
|
+
answered.set(locator, { ...answer(locator), ...next });
|
|
29
|
+
}
|
|
30
|
+
function heard(locator, next) {
|
|
31
|
+
if (!marks.has(locator))
|
|
32
|
+
change(locator, next);
|
|
33
|
+
}
|
|
34
|
+
function readied(locator) {
|
|
35
|
+
const held = unready.get(locator);
|
|
36
|
+
if (held === undefined)
|
|
37
|
+
return;
|
|
38
|
+
if (held.timer !== null)
|
|
39
|
+
clearTimeout(held.timer);
|
|
40
|
+
unready.delete(locator);
|
|
41
|
+
}
|
|
42
|
+
function stopAsking(locator) {
|
|
43
|
+
for (const held of locator === undefined ? [...unready.keys()] : [locator])
|
|
44
|
+
readied(held);
|
|
45
|
+
}
|
|
46
|
+
function connectionLive() {
|
|
47
|
+
if (lockGrace !== null)
|
|
48
|
+
clearTimeout(lockGrace);
|
|
49
|
+
lockGrace = null;
|
|
50
|
+
}
|
|
51
|
+
function readable(locator) {
|
|
52
|
+
const { unreadable, unreading } = answer(locator);
|
|
53
|
+
if (!unreadable || marks.has(locator))
|
|
54
|
+
return false;
|
|
55
|
+
change(locator, {
|
|
56
|
+
unreadable: false,
|
|
57
|
+
...(unreading ? { refusal: null, unreading: false } : {}),
|
|
58
|
+
});
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
function locks(locator, mode) {
|
|
62
|
+
return mode === 'locked' && !answer(locator).confirmed && !marks.has(locator);
|
|
63
|
+
}
|
|
64
|
+
function liftable(locator, discovery) {
|
|
65
|
+
const mark = marks.get(locator);
|
|
66
|
+
return mark === undefined || mark.during < discovery;
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
list(found, { whole, live }) {
|
|
70
|
+
const kept = found.filter(({ locator }) => !marks.has(locator));
|
|
71
|
+
if (whole)
|
|
72
|
+
listed.clear();
|
|
73
|
+
for (const room of kept) {
|
|
74
|
+
listed.set(room.locator, room);
|
|
75
|
+
change(room.locator, {
|
|
76
|
+
refusal: null,
|
|
77
|
+
unreading: false,
|
|
78
|
+
...(live && room.replica.admission === 'admitted' ? { confirmed: true } : {}),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return kept;
|
|
82
|
+
},
|
|
83
|
+
room: (locator) => listed.get(locator),
|
|
84
|
+
rooms: () => [...listed.values()],
|
|
85
|
+
available(locator, selection) {
|
|
86
|
+
if (marks.has(locator))
|
|
87
|
+
return false;
|
|
88
|
+
const room = listed.get(locator);
|
|
89
|
+
if (room === undefined)
|
|
90
|
+
return true;
|
|
91
|
+
return ((selection === undefined || selection === room.replica.selection) &&
|
|
92
|
+
room.replica.admission === 'admitted' &&
|
|
93
|
+
!answer(locator).unreadable);
|
|
94
|
+
},
|
|
95
|
+
refusal: (locator) => answer(locator).refusal,
|
|
96
|
+
unheldModel: (locator) => answer(locator).unheldModel,
|
|
97
|
+
refused(locator, refusal) {
|
|
98
|
+
if (refusal === null) {
|
|
99
|
+
heard(locator, { unreadable: true });
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const unreading = refusal.scope !== 'operation' && refusal.scope !== 'model';
|
|
103
|
+
heard(locator, {
|
|
104
|
+
refusal: { code: refusal.code, fields: refusal.fields, retryable: refusal.retryable },
|
|
105
|
+
unreading,
|
|
106
|
+
...(unreading ? { unreadable: true } : {}),
|
|
107
|
+
});
|
|
108
|
+
},
|
|
109
|
+
readable,
|
|
110
|
+
modelled(locator, model) {
|
|
111
|
+
heard(locator, { unheldModel: model });
|
|
112
|
+
},
|
|
113
|
+
installed(locator, bootstrapped) {
|
|
114
|
+
if (marks.has(locator))
|
|
115
|
+
return;
|
|
116
|
+
if (bootstrapped) {
|
|
117
|
+
readied(locator);
|
|
118
|
+
change(locator, { unheldModel: null });
|
|
119
|
+
}
|
|
120
|
+
change(locator, { stale: false });
|
|
121
|
+
readable(locator);
|
|
122
|
+
},
|
|
123
|
+
async locked(locator, stored) {
|
|
124
|
+
if (marks.has(locator) || answer(locator).confirmed)
|
|
125
|
+
return false;
|
|
126
|
+
return locks(locator, (await stored()) ?? listed.get(locator)?.replica.offline);
|
|
127
|
+
},
|
|
128
|
+
lockedAmong(stored) {
|
|
129
|
+
const modes = new Map([...listed].map(([locator, room]) => [locator, room.replica.offline]));
|
|
130
|
+
for (const [locator, mode] of stored)
|
|
131
|
+
modes.set(locator, mode);
|
|
132
|
+
return [...modes]
|
|
133
|
+
.filter(([locator, mode]) => locks(locator, mode))
|
|
134
|
+
.map(([locator]) => locator)
|
|
135
|
+
.sort();
|
|
136
|
+
},
|
|
137
|
+
connectionLost(lapsed) {
|
|
138
|
+
if (lockGrace !== null)
|
|
139
|
+
return;
|
|
140
|
+
lockGrace = setTimeout(() => {
|
|
141
|
+
lockGrace = null;
|
|
142
|
+
lapsed();
|
|
143
|
+
}, LOCK_GRACE_MS);
|
|
144
|
+
},
|
|
145
|
+
connectionLive,
|
|
146
|
+
lapse() {
|
|
147
|
+
for (const [locator, held] of answered) {
|
|
148
|
+
if (held.confirmed)
|
|
149
|
+
answered.set(locator, { ...held, confirmed: false });
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
stood(locator, stale, repairable) {
|
|
153
|
+
heard(locator, { stale, ...(repairable === undefined ? {} : { repairable }) });
|
|
154
|
+
},
|
|
155
|
+
repairing(locator, running) {
|
|
156
|
+
change(locator, { repairing: running });
|
|
157
|
+
},
|
|
158
|
+
reload(locator, due) {
|
|
159
|
+
change(locator, { reloadDue: due });
|
|
160
|
+
},
|
|
161
|
+
standing(locator) {
|
|
162
|
+
const { stale, repairable, repairing, reloadDue } = answer(locator);
|
|
163
|
+
return { stale, repairable, repairing, reloadDue };
|
|
164
|
+
},
|
|
165
|
+
settled: () => ![...answered].some(([locator, { stale }]) => stale && !marks.has(locator)),
|
|
166
|
+
repairsOwed: () => [...answered]
|
|
167
|
+
.filter(([locator, { stale, repairable }]) => stale && repairable !== null && !marks.has(locator))
|
|
168
|
+
.map(([locator]) => locator),
|
|
169
|
+
askAgain(locator, ask) {
|
|
170
|
+
const held = unready.get(locator) ?? { tries: 0, timer: null };
|
|
171
|
+
unready.set(locator, held);
|
|
172
|
+
if (held.timer !== null)
|
|
173
|
+
return;
|
|
174
|
+
const wait = NOT_READY_MS[Math.min(held.tries, NOT_READY_MS.length - 1)];
|
|
175
|
+
held.tries += 1;
|
|
176
|
+
held.timer = setTimeout(() => {
|
|
177
|
+
held.timer = null;
|
|
178
|
+
ask();
|
|
179
|
+
}, wait);
|
|
180
|
+
},
|
|
181
|
+
stopAsking,
|
|
182
|
+
lose(locator, during) {
|
|
183
|
+
if (marks.has(locator))
|
|
184
|
+
return false;
|
|
185
|
+
marks.set(locator, { during, written: false });
|
|
186
|
+
lastLost.set(locator, ++lossCount);
|
|
187
|
+
listed.delete(locator);
|
|
188
|
+
readied(locator);
|
|
189
|
+
const { repairing, reloadDue } = answer(locator);
|
|
190
|
+
answered.set(locator, { ...UNANSWERED, repairing, reloadDue });
|
|
191
|
+
return true;
|
|
192
|
+
},
|
|
193
|
+
writing(locator) {
|
|
194
|
+
const mark = marks.get(locator);
|
|
195
|
+
if (mark === undefined || mark.written)
|
|
196
|
+
return false;
|
|
197
|
+
marks.set(locator, { ...mark, written: true });
|
|
198
|
+
return true;
|
|
199
|
+
},
|
|
200
|
+
unwritten(locator) {
|
|
201
|
+
const mark = marks.get(locator);
|
|
202
|
+
if (mark !== undefined)
|
|
203
|
+
marks.set(locator, { ...mark, written: false });
|
|
204
|
+
},
|
|
205
|
+
lost: (locator) => marks.has(locator),
|
|
206
|
+
losses: () => lossCount,
|
|
207
|
+
lostSince: (locator, losses) => marks.has(locator) || (lastLost.get(locator) ?? 0) > losses,
|
|
208
|
+
liftable,
|
|
209
|
+
lift(locator, discovery, unfenced) {
|
|
210
|
+
const mark = marks.get(locator);
|
|
211
|
+
if (mark !== undefined && liftable(locator, discovery) && (unfenced || !mark.written)) {
|
|
212
|
+
marks.delete(locator);
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
close() {
|
|
216
|
+
stopAsking();
|
|
217
|
+
connectionLive();
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
}
|
package/dist/queries.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export declare function figuresCover(runtime: Runtime): Promise<FiguresCover>;
|
|
|
9
9
|
export declare function answeredPlan(runtime: Runtime, plan: Plan, cover: () => Promise<Cover>): Promise<Ran>;
|
|
10
10
|
export declare function rowsQuery(runtime: Runtime, plan: Plan): Promise<QueryResult>;
|
|
11
11
|
export declare function planned(runtime: Runtime, input: unknown, reach: PortReach | null): Promise<Plan>;
|
|
12
|
-
export declare function roomTallies(runtime: Runtime, rooms: readonly QueryRoom[], since: string): Promise<readonly import("./tallies.
|
|
12
|
+
export declare function roomTallies(runtime: Runtime, rooms: readonly QueryRoom[], since: string): Promise<readonly import("./tallies.ts").RoomTally[]>;
|
|
13
13
|
export declare function watchPlan(runtime: Runtime, plan: Plan, deliver: Deliver, fail: Fail): () => void;
|
|
14
14
|
export declare function watchPlanned(runtime: Runtime, planning: Promise<Plan>, deliver: Deliver, fail: Fail): () => void;
|
|
15
15
|
export declare function searched(runtime: Runtime, input: unknown, reach: PortReach | null): Promise<SearchResult>;
|
package/dist/queries.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAE9D,OAAO,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAK5C,OAAO,EAIL,KAAK,IAAI,EACT,KAAK,WAAW,EAEjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAa,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAGhF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,KAAK,EAAa,SAAS,EAAgB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAE9D,OAAO,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAK5C,OAAO,EAIL,KAAK,IAAI,EACT,KAAK,WAAW,EAEjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAa,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAGhF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,KAAK,EAAa,SAAS,EAAgB,MAAM,YAAY,CAAC;AAqFrE,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAa1E;AAoGD,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAC1B,OAAO,CAAC,GAAG,CAAC,CAQd;AAQD,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAWlF;AAED,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,SAAS,GAAG,IAAI,GACtB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,wDAO7F;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,IAAI,CAchG;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,EACvB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,GACT,MAAM,IAAI,CAeZ;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,SAAS,GAAG,IAAI,GACtB,OAAO,CAAC,YAAY,CAAC,CAkDvB"}
|
package/dist/queries.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { identityOf } from '@agentshouse/mdmodel';
|
|
2
2
|
import { ROOM_TOTALS } from './figures.js';
|
|
3
3
|
import { roomInFlight } from './install.js';
|
|
4
|
-
import { roomFacts } from './listing.js';
|
|
4
|
+
import { compositionFor, roomFacts } from './listing.js';
|
|
5
5
|
import { lockedRooms } from './locks.js';
|
|
6
6
|
import { OFFLINE, UNCERTAIN, failure } from './outcome.js';
|
|
7
7
|
import { connectionNow, prepare, roomsOfReach } from './preparation.js';
|
|
@@ -13,10 +13,10 @@ import { searchPlanOf } from './search.js';
|
|
|
13
13
|
import { seedApplies, seededResult, watchSeeded } from './seed.js';
|
|
14
14
|
import { capped, MAXIMUM_WINDOW } from './windows.js';
|
|
15
15
|
const QUERY_BYTES = 1 << 20;
|
|
16
|
-
function everyRoom({
|
|
16
|
+
function everyRoom({ presence }, held) {
|
|
17
17
|
return [
|
|
18
18
|
...new Set([
|
|
19
|
-
...
|
|
19
|
+
...presence.rooms().map(({ locator }) => locator),
|
|
20
20
|
...held.rooms.keys(),
|
|
21
21
|
...held.queues.keys(),
|
|
22
22
|
]),
|
|
@@ -29,10 +29,8 @@ function reachedRooms(runtime, plan, held) {
|
|
|
29
29
|
.filter((locator) => (reached === null || reached.has(locator)) && !plan.locked.includes(locator))
|
|
30
30
|
.sort();
|
|
31
31
|
}
|
|
32
|
-
function awaited({ socket }, locator) {
|
|
33
|
-
return (!socket.session.now().roomsListed ||
|
|
34
|
-
(socket.rooms.declared(locator) !== undefined &&
|
|
35
|
-
socket.rooms.discovered(locator)?.replica.admission === 'admitted'));
|
|
32
|
+
function awaited({ socket, presence }, locator) {
|
|
33
|
+
return (!socket.session.now().roomsListed || presence.room(locator)?.replica.admission === 'admitted');
|
|
36
34
|
}
|
|
37
35
|
function coveredRooms(runtime, locators, whole, held) {
|
|
38
36
|
const { store, socket } = runtime;
|
|
@@ -64,7 +62,7 @@ function coveredRooms(runtime, locators, whole, held) {
|
|
|
64
62
|
}
|
|
65
63
|
if (pending.length > 0)
|
|
66
64
|
return { pending };
|
|
67
|
-
return { coverage: { rooms: coverage,
|
|
65
|
+
return { coverage: { rooms: coverage, overlay }, rooms: read };
|
|
68
66
|
}
|
|
69
67
|
function covered(runtime, plan, held) {
|
|
70
68
|
return coveredRooms(runtime, reachedRooms(runtime, plan, held), plan.rooms === null && plan.reach === null, held);
|
|
@@ -119,7 +117,22 @@ async function windowRows(local, plan, rooms, unchanged) {
|
|
|
119
117
|
}
|
|
120
118
|
return null;
|
|
121
119
|
}
|
|
122
|
-
|
|
120
|
+
function freeTextAsked(plan) {
|
|
121
|
+
return plan.shape.kind === 'documents' && (plan.shape.sections !== null || plan.shape.preamble);
|
|
122
|
+
}
|
|
123
|
+
async function composedRooms(runtime, plan, rooms) {
|
|
124
|
+
if (!freeTextAsked(plan))
|
|
125
|
+
return rooms;
|
|
126
|
+
const held = await runtime.store.rooms(rooms.map(({ locator }) => locator));
|
|
127
|
+
return rooms.map((room) => {
|
|
128
|
+
const stored = held.get(room.locator);
|
|
129
|
+
return stored === undefined
|
|
130
|
+
? room
|
|
131
|
+
: { ...room, composition: compositionFor(runtime, stored.record) };
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
async function coveredRows(runtime, plan, cover) {
|
|
135
|
+
const { store } = runtime;
|
|
123
136
|
for (;;) {
|
|
124
137
|
const before = await cover();
|
|
125
138
|
if ('pending' in before)
|
|
@@ -128,7 +141,7 @@ async function coveredRows({ store }, plan, cover) {
|
|
|
128
141
|
const keys = before.rooms.map(({ key }) => key);
|
|
129
142
|
const changes = local.changes(keys);
|
|
130
143
|
const current = () => local.changes(keys) === changes;
|
|
131
|
-
const rows = await windowRows(local, plan, before.rooms, current);
|
|
144
|
+
const rows = await windowRows(local, plan, await composedRooms(runtime, plan, before.rooms), current);
|
|
132
145
|
const after = await cover();
|
|
133
146
|
if (rows !== null && sameCover(before, after))
|
|
134
147
|
return { rows, cover: before, current };
|
|
@@ -213,7 +226,7 @@ export function watchPlanned(runtime, planning, deliver, fail) {
|
|
|
213
226
|
};
|
|
214
227
|
}
|
|
215
228
|
export async function searched(runtime, input, reach) {
|
|
216
|
-
const { store, socket
|
|
229
|
+
const { store, socket } = runtime;
|
|
217
230
|
const { session } = socket;
|
|
218
231
|
const asked = searchPlanOf(input);
|
|
219
232
|
await socket.ready;
|
|
@@ -249,12 +262,10 @@ export async function searched(runtime, input, reach) {
|
|
|
249
262
|
const { closed, authorization, refusal } = session.now();
|
|
250
263
|
if (closed || authorization === undefined || refusal !== null)
|
|
251
264
|
return UNCERTAIN;
|
|
252
|
-
journal.record('transfer search');
|
|
253
265
|
try {
|
|
254
266
|
const result = await search(authorization, { text: asked.text, rooms });
|
|
255
267
|
if (result.kind === 'revoked-authorization')
|
|
256
268
|
await refuse(runtime, 'revoked-authorization');
|
|
257
|
-
journal.record(`outcome search ${result.kind}`);
|
|
258
269
|
if (result.kind === 'rejected')
|
|
259
270
|
return result;
|
|
260
271
|
if (result.kind !== 'found')
|
|
@@ -266,7 +277,6 @@ export async function searched(runtime, input, reach) {
|
|
|
266
277
|
};
|
|
267
278
|
}
|
|
268
279
|
catch {
|
|
269
|
-
journal.record('outcome search transport-uncertainty');
|
|
270
280
|
return UNCERTAIN;
|
|
271
281
|
}
|
|
272
282
|
}
|
package/dist/query.d.ts
CHANGED
package/dist/query.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IAChC,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,SAAS,OAAO,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
package/dist/questions.d.ts
CHANGED
|
@@ -26,9 +26,4 @@ export declare function entered(field: ChatField): boolean;
|
|
|
26
26
|
export declare function questionsOf(view: Pick<ConversationView, 'questions'> | null): readonly ChatQuestion[];
|
|
27
27
|
export declare function openQuestion(questions: readonly unknown[]): string | null;
|
|
28
28
|
export declare function questionAsked(questions: readonly unknown[]): string | null;
|
|
29
|
-
export type ChatLone = {
|
|
30
|
-
readonly question: ChatQuestion;
|
|
31
|
-
readonly field: ChatField;
|
|
32
|
-
};
|
|
33
|
-
export declare function loneOf(questions: readonly ChatQuestion[]): ChatLone | null;
|
|
34
29
|
//# sourceMappingURL=questions.d.ts.map
|
package/dist/questions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"questions.d.ts","sourceRoot":"","sources":["../src/questions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,cAAc,CAAC;IAC5E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3D,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAuCF,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAEjD;AA2DD,wBAAgB,WAAW,CACzB,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,GAAG,IAAI,GAC/C,SAAS,YAAY,EAAE,CAiBzB;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI,CAKzE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI,CAE1E
|
|
1
|
+
{"version":3,"file":"questions.d.ts","sourceRoot":"","sources":["../src/questions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,cAAc,CAAC;IAC5E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3D,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAuCF,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAEjD;AA2DD,wBAAgB,WAAW,CACzB,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,GAAG,IAAI,GAC/C,SAAS,YAAY,EAAE,CAiBzB;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI,CAKzE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI,CAE1E"}
|
package/dist/questions.js
CHANGED
|
@@ -113,10 +113,3 @@ export function openQuestion(questions) {
|
|
|
113
113
|
export function questionAsked(questions) {
|
|
114
114
|
return questionsOf({ questions })[0]?.asked ?? null;
|
|
115
115
|
}
|
|
116
|
-
export function loneOf(questions) {
|
|
117
|
-
const asked = questions.length === 1 && !questions[0]?.secret ? questions[0] : undefined;
|
|
118
|
-
const only = asked?.fields.length === 1 ? asked.fields[0] : undefined;
|
|
119
|
-
return asked !== undefined && only !== undefined && entered(only)
|
|
120
|
-
? { question: asked, field: only }
|
|
121
|
-
: null;
|
|
122
|
-
}
|
package/dist/queue.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { MutationResult } from './adapter.js';
|
|
2
|
+
import { type ChangeBatch } from './change.js';
|
|
3
|
+
import { type HeldReplica, type ReplicaRecord, type Returned, type Slice } from './replica.js';
|
|
4
|
+
import type { Runtime } from './runtime.js';
|
|
5
|
+
import type { SavePlan } from './save.js';
|
|
6
|
+
import type { SaveResult } from './saves.js';
|
|
7
|
+
import type { PendingState, RoomCommit, Store, StoredFile, View, Work } from './store.js';
|
|
8
|
+
export type Queueing = Pick<Runtime, 'store' | 'localSaves'> & {
|
|
9
|
+
readonly socket: Pick<Runtime['socket'], 'continuing'>;
|
|
10
|
+
readonly presence: Pick<Runtime['presence'], 'lost' | 'unheldModel' | 'room'>;
|
|
11
|
+
};
|
|
12
|
+
export type Restand = {
|
|
13
|
+
readonly locator: string;
|
|
14
|
+
readonly record: ReplicaRecord;
|
|
15
|
+
readonly accepted?: string;
|
|
16
|
+
readonly adopted?: Returned;
|
|
17
|
+
readonly installed?: Pick<RoomCommit, 'published' | 'refreshed'>;
|
|
18
|
+
readonly refused?: true;
|
|
19
|
+
readonly after?: () => void;
|
|
20
|
+
};
|
|
21
|
+
export type Appending = {
|
|
22
|
+
readonly plan: SavePlan;
|
|
23
|
+
readonly files: readonly StoredFile[];
|
|
24
|
+
readonly held: ReadonlyMap<string, {
|
|
25
|
+
readonly replica: HeldReplica;
|
|
26
|
+
readonly confirmed: Slice;
|
|
27
|
+
}>;
|
|
28
|
+
readonly after?: () => Promise<void>;
|
|
29
|
+
};
|
|
30
|
+
type Answer = Extract<MutationResult, {
|
|
31
|
+
kind: 'conflicted' | 'rejected';
|
|
32
|
+
}>;
|
|
33
|
+
export declare function withdrawable(states: ReadonlyMap<string, PendingState>): (batch: ChangeBatch) => boolean;
|
|
34
|
+
export declare function sliceAt(store: Store, record: ReplicaRecord, view: View, queue: readonly ChangeBatch[], extra?: Iterable<string>, moved?: Iterable<string>): Promise<Slice>;
|
|
35
|
+
export declare function settle(runtime: Queueing, locators: readonly string[], decide: (held: ReadonlyMap<string, Work>) => Promise<readonly Restand[]>): Promise<void>;
|
|
36
|
+
export declare function answered(runtime: Queueing, locator: string, head: ChangeBatch, answer: Answer): Promise<void>;
|
|
37
|
+
export declare function unpair(runtime: Queueing): Promise<void>;
|
|
38
|
+
export declare function append(runtime: Queueing, appending: Appending): Promise<SaveResult>;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
|