@agentshouse/mdruntime 0.1.0-c49444f2a8fc6 → 0.1.0-c4ef58fbdca7b
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/dist/acceptance.d.ts +6 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +389 -0
- package/dist/actions.d.ts +20 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +251 -0
- package/dist/adapter.d.ts +5 -0
- package/dist/adapter.d.ts.map +1 -1
- package/dist/cell.d.ts +6 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +9 -0
- package/dist/chat-types.d.ts +5 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +13 -0
- package/dist/client.d.ts +12 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +1 -0
- package/dist/compile.d.ts +5 -0
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +186 -55
- package/dist/connection.d.ts +5 -143
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +101 -5309
- package/dist/conversation-live.d.ts +136 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +248 -0
- package/dist/conversation-row.d.ts.map +1 -1
- package/dist/conversation-row.js +7 -1
- package/dist/conversation.d.ts +22 -35
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +827 -972
- package/dist/discovery.d.ts +10 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +175 -0
- package/dist/durability.d.ts +9 -0
- package/dist/durability.d.ts.map +1 -1
- package/dist/figures.d.ts +49 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +197 -0
- package/dist/holdings.d.ts +29 -0
- package/dist/holdings.d.ts.map +1 -0
- package/dist/holdings.js +95 -0
- package/dist/host.d.ts +1 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +7 -4
- package/dist/index.d.ts +15 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/install.d.ts +56 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +556 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +268 -0
- package/dist/listing.d.ts +53 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +175 -0
- package/dist/locks.d.ts +9 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +61 -0
- package/dist/log.d.ts +1 -0
- package/dist/log.d.ts.map +1 -1
- package/dist/lost.d.ts +5 -0
- package/dist/lost.d.ts.map +1 -0
- package/dist/lost.js +61 -0
- package/dist/messages.d.ts +1 -1
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +1 -1
- package/dist/models.d.ts +14 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +193 -0
- package/dist/opening.d.ts +4 -0
- package/dist/opening.d.ts.map +1 -0
- package/dist/opening.js +57 -0
- package/dist/outcome.d.ts +4 -1
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +3 -0
- package/dist/preparation.d.ts +20 -0
- package/dist/preparation.d.ts.map +1 -0
- package/dist/preparation.js +226 -0
- package/dist/queries.d.ts +16 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +272 -0
- package/dist/query.d.ts +10 -0
- package/dist/query.d.ts.map +1 -1
- package/dist/questions.d.ts +2 -0
- package/dist/questions.d.ts.map +1 -1
- package/dist/questions.js +4 -0
- package/dist/reach.d.ts +3 -1
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +11 -0
- package/dist/react.d.ts +7 -1
- package/dist/react.d.ts.map +1 -1
- package/dist/readiness.d.ts +0 -1
- package/dist/readiness.d.ts.map +1 -1
- package/dist/reads.d.ts +37 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +171 -0
- package/dist/refusal.d.ts +5 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +56 -0
- package/dist/replica.d.ts +0 -3
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +2 -1
- package/dist/room-drafts.d.ts +24 -0
- package/dist/room-drafts.d.ts.map +1 -0
- package/dist/room-drafts.js +216 -0
- package/dist/runtime.d.ts +43 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +3 -1
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +7 -5
- package/dist/saves.d.ts +70 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +1006 -0
- package/dist/seed.d.ts +11 -2
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +71 -0
- package/dist/shared.d.ts +1 -1
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +9 -5
- package/dist/shown.d.ts +31 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +295 -0
- package/dist/socket/admission.d.ts +7 -0
- package/dist/socket/admission.d.ts.map +1 -0
- package/dist/socket/admission.js +39 -0
- package/dist/socket/answers.d.ts +6 -0
- package/dist/socket/answers.d.ts.map +1 -0
- package/dist/socket/answers.js +20 -0
- package/dist/socket/lanes.d.ts +20 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +77 -0
- package/dist/socket/reads.d.ts +10 -0
- package/dist/socket/reads.d.ts.map +1 -0
- package/dist/socket/reads.js +31 -0
- package/dist/socket/rooms.d.ts +43 -0
- package/dist/socket/rooms.d.ts.map +1 -0
- package/dist/socket/rooms.js +90 -0
- package/dist/socket/session.d.ts +39 -0
- package/dist/socket/session.d.ts.map +1 -0
- package/dist/socket/session.js +23 -0
- package/dist/socket.d.ts +70 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +175 -0
- package/dist/store/fences.d.ts +16 -0
- package/dist/store/fences.d.ts.map +1 -0
- package/dist/store/fences.js +26 -0
- package/dist/store/installs.d.ts +30 -0
- package/dist/store/installs.d.ts.map +1 -0
- package/dist/store/installs.js +34 -0
- package/dist/store/readiness.d.ts +10 -0
- package/dist/store/readiness.d.ts.map +1 -0
- package/dist/store/readiness.js +52 -0
- package/dist/store/records.d.ts +212 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +431 -0
- package/dist/store/room-held.d.ts +8 -0
- package/dist/store/room-held.d.ts.map +1 -0
- package/dist/store/room-held.js +17 -0
- package/dist/store/space.d.ts +11 -0
- package/dist/store/space.d.ts.map +1 -0
- package/dist/store/space.js +43 -0
- package/dist/store/watchers.d.ts +17 -0
- package/dist/store/watchers.d.ts.map +1 -0
- package/dist/store/watchers.js +57 -0
- package/dist/store/writes.d.ts +24 -0
- package/dist/store/writes.d.ts.map +1 -0
- package/dist/store/writes.js +125 -0
- package/dist/store.d.ts +111 -206
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +142 -398
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +22 -8
- package/dist/surface.d.ts +88 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +223 -0
- package/dist/sync.d.ts +20 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +532 -0
- package/dist/tables.d.ts +32 -3
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +36 -2
- package/dist/tallies.d.ts +18 -0
- package/dist/tallies.d.ts.map +1 -0
- package/dist/tallies.js +129 -0
- package/dist/wire.d.ts +8 -1
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +4 -0
- package/package.json +2 -2
package/dist/messages.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { AcceptedMessage } from './adapter.js';
|
|
|
2
2
|
import type { JobMarker } from './job.js';
|
|
3
3
|
import type { Connection } from './tables.js';
|
|
4
4
|
export declare const MESSAGE_TABLES: readonly string[];
|
|
5
|
-
export declare const ROWS = "WITH chosen AS (\n SELECT listed.value AS conversation,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'assistant' ORDER BY position DESC, identity DESC LIMIT 1) AS answer,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND text <> '' ORDER BY position DESC, identity DESC LIMIT 1) AS said,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' ORDER BY position, identity LIMIT 1) AS opened,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' AND json_extract(message, '$.waiting') = 1 ORDER BY position, identity LIMIT 1) AS asking\n FROM json_each(?) AS listed\n )\n SELECT chosen.conversation AS conversation,\n substr(said.text, 1, 512) AS said_text,\n json_extract(said.message, '$.role') AS said_role,\n json_extract(said.message, '$.accepted_at') AS said_at,\n substr(json_extract(answer.message, '$.failure'), 1, 512) AS failure,\n json_extract(opened.message, '$.source') AS opened_source,\n json_extract(opened.message, '$.sender') AS opened_sender,\n asking.identity AS asking_identity,\n
|
|
5
|
+
export declare const ROWS = "WITH chosen AS (\n SELECT listed.value AS conversation,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'assistant' ORDER BY position DESC, identity DESC LIMIT 1) AS answer,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND text <> '' ORDER BY position DESC, identity DESC LIMIT 1) AS said,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' ORDER BY position, identity LIMIT 1) AS opened,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' AND json_extract(message, '$.waiting') = 1 ORDER BY position, identity LIMIT 1) AS asking\n FROM json_each(?) AS listed\n )\n SELECT chosen.conversation AS conversation,\n substr(said.text, 1, 512) AS said_text,\n json_extract(said.message, '$.role') AS said_role,\n json_extract(said.message, '$.accepted_at') AS said_at,\n substr(json_extract(answer.message, '$.failure'), 1, 512) AS failure,\n json_extract(opened.message, '$.source') AS opened_source,\n json_extract(opened.message, '$.sender') AS opened_sender,\n asking.identity AS asking_identity,\n asking.text AS asking_text,\n json_extract(asking.message, '$.accepted_at') AS asking_at,\n json_extract(asking.message, '$.source') AS asking_source,\n json_extract(asking.message, '$.sender') AS asking_sender\n FROM chosen\n LEFT JOIN conversation_messages said ON said.id = chosen.said\n LEFT JOIN conversation_messages answer ON answer.id = chosen.answer\n LEFT JOIN conversation_messages opened ON opened.id = chosen.opened\n LEFT JOIN conversation_messages asking ON asking.id = chosen.asking";
|
|
6
6
|
export declare const JOB_MARKERS = "SELECT json_extract(part.value, '$.text') AS said,\n json_extract(message, '$.accepted_at') AS at\n FROM conversation_messages, json_each(message, '$.parts') AS part\n WHERE conversation = ? AND instr(message, '\"marker\":\"job\"') > 0\n AND json_extract(part.value, '$.type') = 'marker'\n AND json_extract(part.value, '$.marker') = 'job'\n ORDER BY position, identity, part.key";
|
|
7
7
|
export type HeldConversation = {
|
|
8
8
|
readonly conversation: string;
|
package/dist/messages.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,aAAa,CAAC;AAQ1D,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAQ3C,CAAC;AAQF,eAAO,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
|
package/dist/messages.js
CHANGED
|
@@ -31,7 +31,7 @@ export const ROWS = `WITH chosen AS (
|
|
|
31
31
|
json_extract(opened.message, '$.source') AS opened_source,
|
|
32
32
|
json_extract(opened.message, '$.sender') AS opened_sender,
|
|
33
33
|
asking.identity AS asking_identity,
|
|
34
|
-
|
|
34
|
+
asking.text AS asking_text,
|
|
35
35
|
json_extract(asking.message, '$.accepted_at') AS asking_at,
|
|
36
36
|
json_extract(asking.message, '$.source') AS asking_source,
|
|
37
37
|
json_extract(asking.message, '$.sender') AS asking_sender
|
package/dist/models.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ScopedRefusal } from './adapter.js';
|
|
2
|
+
import { type ModelState } from './model.js';
|
|
3
|
+
import { type ReplicaRecord } from './replica.js';
|
|
4
|
+
import type { Runtime } from './runtime.js';
|
|
5
|
+
import type { RoomDeclaration } from './socket.js';
|
|
6
|
+
import type { RuntimeStore } from './store.js';
|
|
7
|
+
export declare function declaredAsHeld(held: ReplicaRecord | undefined, room: RoomDeclaration): boolean;
|
|
8
|
+
export declare function revoked(model: ModelState | undefined): boolean;
|
|
9
|
+
export declare function keepNaming(runtime: Runtime, local: RuntimeStore, room: RoomDeclaration): Promise<void>;
|
|
10
|
+
export declare function retainModel(runtime: Runtime, local: RuntimeStore, room: RoomDeclaration, given: ModelState | null): Promise<void>;
|
|
11
|
+
export declare function scoped(runtime: Runtime, result: ScopedRefusal, room: RoomDeclaration, local: RuntimeStore): Promise<void>;
|
|
12
|
+
export declare function settleModels(runtime: Runtime, held: readonly RoomDeclaration[], status: 'current' | 'cached', local: RuntimeStore): Promise<void>;
|
|
13
|
+
export declare function cachedModels(runtime: Runtime, local: RuntimeStore): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAKlD,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAQ9F;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAE9D;AAMD,wBAAsB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,iBAqB5F;AAMD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,UAAU,GAAG,IAAI,iBAsDzB;AAED,wBAAsB,MAAM,CAC1B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,YAAY,iBA0BpB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,SAAS,eAAe,EAAE,EAChC,MAAM,EAAE,SAAS,GAAG,QAAQ,EAC5B,KAAK,EAAE,YAAY,iBAsDpB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAcvF"}
|
package/dist/models.js
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { changeSet } from './change-set.js';
|
|
2
|
+
import { composedOf } from './collection.js';
|
|
3
|
+
import { admitted, declarationOf, list, listedLocators } from './listing.js';
|
|
4
|
+
import { loseRooms } from './lost.js';
|
|
5
|
+
import { NO_MODEL } from './model.js';
|
|
6
|
+
import { storedRecord } from './replica.js';
|
|
7
|
+
import { overlayDiff, preparedAfter, replayed, sliceAt } from './saves.js';
|
|
8
|
+
import { emitRooms } from './shown.js';
|
|
9
|
+
export function declaredAsHeld(held, room) {
|
|
10
|
+
return (held === undefined ||
|
|
11
|
+
(JSON.stringify(held.operations) === JSON.stringify(room.operations) &&
|
|
12
|
+
JSON.stringify(held.replica) === JSON.stringify(room.replica) &&
|
|
13
|
+
JSON.stringify(held.providerOwnedPaths) === JSON.stringify(room.providerOwnedPaths) &&
|
|
14
|
+
JSON.stringify(held.typedSelection) === JSON.stringify(room.typedSelection ?? null)));
|
|
15
|
+
}
|
|
16
|
+
export function revoked(model) {
|
|
17
|
+
return model?.status === 'unavailable' && model.reason === 'revoked';
|
|
18
|
+
}
|
|
19
|
+
function unheldModelOf({ socket }, locator) {
|
|
20
|
+
return socket.rooms.standing(locator).unheldModel ?? NO_MODEL;
|
|
21
|
+
}
|
|
22
|
+
export async function keepNaming(runtime, local, room) {
|
|
23
|
+
const { store, socket } = runtime;
|
|
24
|
+
const held = await store.record(room.locator);
|
|
25
|
+
if (held === undefined || (held.name === room.name && held.handle === room.handle))
|
|
26
|
+
return;
|
|
27
|
+
await store.exclusive(async () => {
|
|
28
|
+
if (!socket.continuing())
|
|
29
|
+
return;
|
|
30
|
+
const current = await store.record(room.locator);
|
|
31
|
+
if (current === undefined)
|
|
32
|
+
return;
|
|
33
|
+
const record = { ...current, name: room.name, handle: room.handle };
|
|
34
|
+
await local.commit({
|
|
35
|
+
rooms: [
|
|
36
|
+
{
|
|
37
|
+
locator: room.locator,
|
|
38
|
+
key: record.key,
|
|
39
|
+
record: storedRecord(record),
|
|
40
|
+
composed: composedOf(store.composed(record)),
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
});
|
|
44
|
+
emitRooms(runtime);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async function modelNow(runtime, locator) {
|
|
48
|
+
return (await runtime.store.record(locator))?.model ?? unheldModelOf(runtime, locator);
|
|
49
|
+
}
|
|
50
|
+
export async function retainModel(runtime, local, room, given) {
|
|
51
|
+
const { store, socket } = runtime;
|
|
52
|
+
const held = await store.record(room.locator);
|
|
53
|
+
const previous = held?.model ?? unheldModelOf(runtime, room.locator);
|
|
54
|
+
const next = given ?? previous;
|
|
55
|
+
if (JSON.stringify(previous) === JSON.stringify(next) && declaredAsHeld(held, room))
|
|
56
|
+
return;
|
|
57
|
+
await store.exclusive(async () => {
|
|
58
|
+
if (!socket.continuing())
|
|
59
|
+
return;
|
|
60
|
+
const work = await store.work(room.locator);
|
|
61
|
+
const current = work.replica;
|
|
62
|
+
let changed = null;
|
|
63
|
+
if (current !== undefined) {
|
|
64
|
+
const record = {
|
|
65
|
+
...current.record,
|
|
66
|
+
name: room.name,
|
|
67
|
+
handle: room.handle,
|
|
68
|
+
operations: room.operations,
|
|
69
|
+
replica: room.replica,
|
|
70
|
+
providerOwnedPaths: room.providerOwnedPaths,
|
|
71
|
+
typedSelection: room.typedSelection ?? null,
|
|
72
|
+
model: next,
|
|
73
|
+
};
|
|
74
|
+
const confirmedLayer = await sliceAt(store, record, 'confirmed', current.queue, current.overlaid);
|
|
75
|
+
const replayedLayer = await replayed(store, record, confirmedLayer, current.queue);
|
|
76
|
+
const diff = await overlayDiff(record, current, replayedLayer.visible, replayedLayer.touched);
|
|
77
|
+
const answer = await local.commit({
|
|
78
|
+
rooms: [
|
|
79
|
+
{
|
|
80
|
+
locator: room.locator,
|
|
81
|
+
key: record.key,
|
|
82
|
+
record: storedRecord(record),
|
|
83
|
+
roots: record.typedSelection?.roots ?? [],
|
|
84
|
+
composed: composedOf(store.composed(record)),
|
|
85
|
+
overlay: diff.overlay,
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
});
|
|
89
|
+
preparedAfter(runtime, room.locator, answer);
|
|
90
|
+
changed = changeSet(room.locator, {
|
|
91
|
+
documents: answer.changed[room.locator] ?? [],
|
|
92
|
+
room: true,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else
|
|
96
|
+
socket.rooms.stand(room.locator, { unheldModel: next });
|
|
97
|
+
list(runtime, room, admitted(runtime, room));
|
|
98
|
+
if (changed === null)
|
|
99
|
+
emitRooms(runtime);
|
|
100
|
+
else
|
|
101
|
+
store.changed(changed);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
export async function scoped(runtime, result, room, local) {
|
|
105
|
+
const { socket, journal } = runtime;
|
|
106
|
+
if (result.scope === 'content' && !result.retryable) {
|
|
107
|
+
journal.record(`scoped refusal ${room.locator} ${result.scope} ${result.code}`);
|
|
108
|
+
await loseRooms(runtime, [room.locator]);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
socket.rooms.stand(room.locator, {
|
|
112
|
+
refusal: { code: result.code, fields: result.fields, retryable: result.retryable },
|
|
113
|
+
});
|
|
114
|
+
let scopedAway = room;
|
|
115
|
+
if (result.scope === 'model')
|
|
116
|
+
await retainModel(runtime, local, room, {
|
|
117
|
+
status: 'unavailable',
|
|
118
|
+
reason: 'not-readable',
|
|
119
|
+
});
|
|
120
|
+
else if (result.scope !== 'operation') {
|
|
121
|
+
socket.rooms.stand(room.locator, { unreadable: true });
|
|
122
|
+
scopedAway = { ...room, replica: { ...room.replica, admission: 'unavailable' } };
|
|
123
|
+
await retainModel(runtime, local, scopedAway, null);
|
|
124
|
+
}
|
|
125
|
+
if (!socket.continuing())
|
|
126
|
+
return;
|
|
127
|
+
list(runtime, scopedAway, admitted(runtime, scopedAway));
|
|
128
|
+
emitRooms(runtime);
|
|
129
|
+
journal.record(`scoped refusal ${room.locator} ${result.scope} ${result.code}`);
|
|
130
|
+
}
|
|
131
|
+
export async function settleModels(runtime, held, status, local) {
|
|
132
|
+
const { store, socket, journal } = runtime;
|
|
133
|
+
const owed = (model) => model.status !== 'unavailable' && model.status !== status;
|
|
134
|
+
const declaredAnew = await store.exclusive(async () => {
|
|
135
|
+
if (!socket.continuing())
|
|
136
|
+
return [];
|
|
137
|
+
const stored = await store.rooms(held.map(({ locator }) => locator));
|
|
138
|
+
const unchanged = held.filter((room) => {
|
|
139
|
+
const record = stored.get(room.locator)?.record;
|
|
140
|
+
return (owed(record?.model ?? unheldModelOf(runtime, room.locator)) && declaredAsHeld(record, room));
|
|
141
|
+
});
|
|
142
|
+
const records = unchanged.flatMap((room) => {
|
|
143
|
+
const record = stored.get(room.locator)?.record;
|
|
144
|
+
return record === undefined
|
|
145
|
+
? []
|
|
146
|
+
: [{ ...record, model: { ...record.model, status } }];
|
|
147
|
+
});
|
|
148
|
+
if (records.length > 0) {
|
|
149
|
+
try {
|
|
150
|
+
await local.commit({
|
|
151
|
+
rooms: records.map((record) => ({
|
|
152
|
+
locator: record.locator,
|
|
153
|
+
key: record.key,
|
|
154
|
+
record: storedRecord(record),
|
|
155
|
+
composed: composedOf(store.composed(record)),
|
|
156
|
+
})),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
journal.record(`model ${status} persistence failed`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
for (const room of unchanged) {
|
|
164
|
+
const { unheldModel } = socket.rooms.standing(room.locator);
|
|
165
|
+
if (!stored.has(room.locator) && unheldModel !== null) {
|
|
166
|
+
socket.rooms.stand(room.locator, {
|
|
167
|
+
unheldModel: { ...unheldModel, status },
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
list(runtime, room, admitted(runtime, room));
|
|
171
|
+
}
|
|
172
|
+
if (unchanged.length > 0)
|
|
173
|
+
emitRooms(runtime);
|
|
174
|
+
return held.filter((room) => {
|
|
175
|
+
const record = stored.get(room.locator)?.record;
|
|
176
|
+
return (!unchanged.includes(room) && owed(record?.model ?? unheldModelOf(runtime, room.locator)));
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
for (const room of declaredAnew) {
|
|
180
|
+
const model = await modelNow(runtime, room.locator);
|
|
181
|
+
if (owed(model))
|
|
182
|
+
await retainModel(runtime, local, room, { ...model, status });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
export async function cachedModels(runtime, local) {
|
|
186
|
+
const { store, socket } = runtime;
|
|
187
|
+
const held = await store.rooms();
|
|
188
|
+
await settleModels(runtime, listedLocators(runtime, held).flatMap((locator) => {
|
|
189
|
+
const room = socket.rooms.discovered(locator) ??
|
|
190
|
+
declarationOf(runtime, locator, held.get(locator))?.room;
|
|
191
|
+
return room === undefined ? [] : [room];
|
|
192
|
+
}), 'cached', local);
|
|
193
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opening.d.ts","sourceRoot":"","sources":["../src/opening.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CA2CxF"}
|
package/dist/opening.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { conversationsOpened } from './conversation.js';
|
|
2
|
+
import { detectStorageLoss, nextGeneration, refusedForSpace } from './durability.js';
|
|
3
|
+
import { sweep } from './install.js';
|
|
4
|
+
import { eraseFenced } from './lost.js';
|
|
5
|
+
import { prepare } from './preparation.js';
|
|
6
|
+
import { emitRooms, emitStorageLoss, statusShown } from './shown.js';
|
|
7
|
+
export async function open(runtime, opened) {
|
|
8
|
+
const { store, socket, journal, shell, conversations, build, usableWhenHeld } = runtime;
|
|
9
|
+
if (socket.closed())
|
|
10
|
+
throw new Error('runtime closed');
|
|
11
|
+
const interrupted = await opened.fences();
|
|
12
|
+
const kept = shell.generation;
|
|
13
|
+
const storedGeneration = await opened.generation();
|
|
14
|
+
const loss = detectStorageLoss(storedGeneration, kept);
|
|
15
|
+
const generation = nextGeneration(storedGeneration, kept);
|
|
16
|
+
if (generation !== storedGeneration)
|
|
17
|
+
await opened.rememberGeneration(generation);
|
|
18
|
+
if (generation !== kept)
|
|
19
|
+
await shell.keepGeneration(generation);
|
|
20
|
+
if (loss !== null) {
|
|
21
|
+
store.device.set({ storageLoss: loss });
|
|
22
|
+
emitStorageLoss(runtime);
|
|
23
|
+
}
|
|
24
|
+
const held = await opened.opened();
|
|
25
|
+
store.device.set({
|
|
26
|
+
heldWhenOpened: usableWhenHeld.length > 0 && (await opened.covering()).rooms.size > 0,
|
|
27
|
+
});
|
|
28
|
+
try {
|
|
29
|
+
await opened.demote();
|
|
30
|
+
await store.ask({ kind: 'read.builds', build });
|
|
31
|
+
for (const key of held.orphans)
|
|
32
|
+
await opened.release(key);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (!refusedForSpace(error))
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
if (held.erasing || held.orphans.length > 0)
|
|
39
|
+
queueMicrotask(() => sweep(runtime));
|
|
40
|
+
await conversationsOpened(conversations, opened);
|
|
41
|
+
if (interrupted.length > 0) {
|
|
42
|
+
queueMicrotask(() => {
|
|
43
|
+
void eraseFenced(runtime, interrupted).catch(() => {
|
|
44
|
+
journal.record('erasure failed');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
statusShown(runtime);
|
|
49
|
+
prepare(runtime);
|
|
50
|
+
emitRooms(runtime);
|
|
51
|
+
void store
|
|
52
|
+
.exclusive(() => runtime.unpair(opened))
|
|
53
|
+
.catch(() => {
|
|
54
|
+
journal.record('unpair failed');
|
|
55
|
+
});
|
|
56
|
+
return opened;
|
|
57
|
+
}
|
package/dist/outcome.d.ts
CHANGED
|
@@ -13,7 +13,9 @@ export type CallResult = {
|
|
|
13
13
|
kind: 'action';
|
|
14
14
|
result: unknown;
|
|
15
15
|
at?: RoomVersionAt;
|
|
16
|
-
} | Refused<'rejected'>
|
|
16
|
+
} | (Refused<'rejected'> & {
|
|
17
|
+
reset?: string;
|
|
18
|
+
}) | Refused<'undeclared'> | Failure;
|
|
17
19
|
export type HistoryAnswer = Exclude<HistoryResult, {
|
|
18
20
|
kind: Failure['kind'];
|
|
19
21
|
}> | Failure;
|
|
@@ -65,6 +67,7 @@ export type Offline = {
|
|
|
65
67
|
readonly kind: 'offline';
|
|
66
68
|
};
|
|
67
69
|
export declare const OFFLINE: Offline;
|
|
70
|
+
export declare function answeredResult(value: unknown): boolean;
|
|
68
71
|
export declare const UNCERTAIN: Failure;
|
|
69
72
|
export declare function undeclared(name: string): CallResult;
|
|
70
73
|
export declare function failure(result: AdapterFailure): Failure;
|
package/dist/outcome.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../src/outcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,eAAe,EACf,aAAa,EACb,aAAa,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE1D,KAAK,OAAO,CAAC,IAAI,SAAS,MAAM,IAAI,eAAe,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,OAAO,GACf,OAAO,CAAC,uBAAuB,CAAC,GAChC,OAAO,CAAC,uBAAuB,CAAC,GAChC,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACpD,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAC9C,aAAa,CAAC;AAElB,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,aAAa,CAAA;CAAE,GACvD,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../src/outcome.ts"],"names":[],"mappings":"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"}
|
package/dist/outcome.js
CHANGED
|
@@ -44,6 +44,9 @@ export function lockedRoom(locator) {
|
|
|
44
44
|
return { kind: ROOM_LOCKED, locator, code: ROOM_LOCKED, fields: {}, retryable: true };
|
|
45
45
|
}
|
|
46
46
|
export const OFFLINE = { kind: 'offline' };
|
|
47
|
+
export function answeredResult(value) {
|
|
48
|
+
return typeof value === 'object' && value !== null && !('pending' in value);
|
|
49
|
+
}
|
|
47
50
|
export const UNCERTAIN = {
|
|
48
51
|
kind: 'transport-uncertainty',
|
|
49
52
|
code: 'transport-uncertainty',
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { PlanReach } from './query.js';
|
|
2
|
+
import { type PortReach } from './reach.js';
|
|
3
|
+
import { type CodeAvailability, type ConnectionAvailability, type Readiness } from './readiness.js';
|
|
4
|
+
import type { Runtime } from './runtime.js';
|
|
5
|
+
export type ReadinessPort = {
|
|
6
|
+
readonly target: string;
|
|
7
|
+
readonly code: CodeAvailability;
|
|
8
|
+
};
|
|
9
|
+
export type ReadinessWatch = {
|
|
10
|
+
readonly port: ReadinessPort;
|
|
11
|
+
readonly reach: PortReach | null;
|
|
12
|
+
readonly deliver: (readiness: Readiness) => void;
|
|
13
|
+
};
|
|
14
|
+
export declare function prepare(runtime: Runtime, locators?: readonly string[]): void;
|
|
15
|
+
export declare function roomsOfReach(reach: PlanReach): ReadonlySet<string>;
|
|
16
|
+
export declare function connectionNow(runtime: Runtime): Promise<ConnectionAvailability>;
|
|
17
|
+
export declare function deliverOwedReadiness(runtime: Runtime, owed: readonly ReadinessWatch[]): Promise<void>;
|
|
18
|
+
export declare function watchReadiness({ store }: Runtime, port: ReadinessPort, reach: PortReach | null, deliver: (readiness: Readiness) => void): () => void;
|
|
19
|
+
export declare function filled(runtime: Runtime): void;
|
|
20
|
+
//# sourceMappingURL=preparation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preparation.d.ts","sourceRoot":"","sources":["../src/preparation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAE3B,KAAK,SAAS,EAEf,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAK5C,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;CAClD,CAAC;AAuCF,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAE,SAAS,MAAM,EAAO,QA8BzE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAElE;AAmDD,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAMrF;AAkFD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,cAAc,EAAE,iBAI3F;AAED,wBAAgB,cAAc,CAC5B,EAAE,KAAK,EAAE,EAAE,OAAO,EAClB,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,SAAS,GAAG,IAAI,EACvB,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,GACtC,MAAM,IAAI,CAQZ;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,QAMtC"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { changeSet } from './change-set.js';
|
|
2
|
+
import { installationOf } from './install.js';
|
|
3
|
+
import { listedLocators } from './listing.js';
|
|
4
|
+
import { planReach } from './reach.js';
|
|
5
|
+
import { readinessOf, } from './readiness.js';
|
|
6
|
+
import { roomOfKey } from './rows.js';
|
|
7
|
+
import { recoverReads } from './shown.js';
|
|
8
|
+
import { yielded } from './turn.js';
|
|
9
|
+
async function prepareReplica(runtime, locator) {
|
|
10
|
+
const { store, socket } = runtime;
|
|
11
|
+
for (;;) {
|
|
12
|
+
const held = (await store.rooms([locator])).get(locator);
|
|
13
|
+
if (held === undefined || socket.closed() || held.indexed)
|
|
14
|
+
return;
|
|
15
|
+
const key = held.record.key;
|
|
16
|
+
const done = await store.exclusive(async () => {
|
|
17
|
+
const local = await store.open();
|
|
18
|
+
return store.rederive(local, key, store.composed(held.record));
|
|
19
|
+
});
|
|
20
|
+
if (!done.done)
|
|
21
|
+
continue;
|
|
22
|
+
if ((await store.rooms([locator])).get(locator)?.record.key !== key)
|
|
23
|
+
continue;
|
|
24
|
+
store.changed(changeSet(locator, { documents: null }));
|
|
25
|
+
recoverReads(runtime);
|
|
26
|
+
store.readiness.queue();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async function unprepared({ store, socket }) {
|
|
31
|
+
const held = (await store.covering()).rooms;
|
|
32
|
+
return [...store.device.now().unpreparedDemand, ...held.keys()].find((locator) => !(held.get(locator)?.indexed ?? false) && !socket.rooms.standing(locator).unpreparable);
|
|
33
|
+
}
|
|
34
|
+
function unpreparedBy({ store, socket, journal }, locator, error) {
|
|
35
|
+
socket.rooms.stand(locator, { unpreparable: true });
|
|
36
|
+
journal.record(`preparation failed ${locator} ${error instanceof Error ? error.name : 'unknown'}`);
|
|
37
|
+
store.readiness.queue();
|
|
38
|
+
}
|
|
39
|
+
export function prepare(runtime, locators = []) {
|
|
40
|
+
const { store, socket, journal } = runtime;
|
|
41
|
+
const { device } = store;
|
|
42
|
+
if (locators.length > 0) {
|
|
43
|
+
device.set({ unpreparedDemand: new Set([...device.now().unpreparedDemand, ...locators]) });
|
|
44
|
+
}
|
|
45
|
+
if (device.now().preparing)
|
|
46
|
+
return;
|
|
47
|
+
device.set({ preparing: true });
|
|
48
|
+
void (async () => {
|
|
49
|
+
try {
|
|
50
|
+
for (let waiting = await unprepared(runtime); waiting !== undefined; waiting = await unprepared(runtime)) {
|
|
51
|
+
await yielded();
|
|
52
|
+
if (socket.closed())
|
|
53
|
+
return;
|
|
54
|
+
const demand = new Set(device.now().unpreparedDemand);
|
|
55
|
+
demand.delete(waiting);
|
|
56
|
+
device.set({ unpreparedDemand: demand });
|
|
57
|
+
await prepareReplica(runtime, waiting).catch((error) => unpreparedBy(runtime, waiting, error));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
journal.record('preparation failed');
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
device.set({ preparing: false });
|
|
65
|
+
}
|
|
66
|
+
})();
|
|
67
|
+
}
|
|
68
|
+
export function roomsOfReach(reach) {
|
|
69
|
+
return new Set([...reach.rooms, ...reach.documents.map(roomOfKey)]);
|
|
70
|
+
}
|
|
71
|
+
function requiredRooms(runtime, given, held) {
|
|
72
|
+
const { roomsListed } = runtime.socket.session.now();
|
|
73
|
+
const reach = planReach(given);
|
|
74
|
+
const listed = new Set(listedLocators(runtime, held));
|
|
75
|
+
if (reach === null)
|
|
76
|
+
return { listed: roomsListed, rooms: [...listed].sort() };
|
|
77
|
+
const named = [...roomsOfReach(reach)].sort();
|
|
78
|
+
if (roomsListed)
|
|
79
|
+
return { listed: true, rooms: named.filter((room) => listed.has(room)) };
|
|
80
|
+
return { listed: named.every((room) => held.has(room)), rooms: named };
|
|
81
|
+
}
|
|
82
|
+
function roomState({ socket }, locator, held) {
|
|
83
|
+
const listedRoom = socket.rooms.discovered(locator);
|
|
84
|
+
if (socket.session.now().roomsListed &&
|
|
85
|
+
(listedRoom === undefined ||
|
|
86
|
+
listedRoom.replica.admission !== 'admitted' ||
|
|
87
|
+
socket.rooms.standing(locator).unreadable))
|
|
88
|
+
return 'unadmitted';
|
|
89
|
+
const stored = held.get(locator);
|
|
90
|
+
if (stored === undefined)
|
|
91
|
+
return 'acquiring';
|
|
92
|
+
if (!stored.indexed)
|
|
93
|
+
return 'preparing';
|
|
94
|
+
return 'complete';
|
|
95
|
+
}
|
|
96
|
+
function conversationCoverage({ socket, conversations }, reach) {
|
|
97
|
+
const declaredConversations = reach === null || reach.conversations;
|
|
98
|
+
if (!declaredConversations || socket.conversations() === undefined)
|
|
99
|
+
return 'undeclared';
|
|
100
|
+
if (!conversations.known() || !conversations.current())
|
|
101
|
+
return 'acquiring';
|
|
102
|
+
return 'complete';
|
|
103
|
+
}
|
|
104
|
+
function connectionOf({ socket }, lastCompleted) {
|
|
105
|
+
if (socket.isOpen())
|
|
106
|
+
return 'connected';
|
|
107
|
+
if (socket.session.now().moving.providerUnreachable)
|
|
108
|
+
return 'unreachable';
|
|
109
|
+
return !socket.streamed && lastCompleted !== null ? 'connected' : 'connecting';
|
|
110
|
+
}
|
|
111
|
+
export async function connectionNow(runtime) {
|
|
112
|
+
const { store, socket } = runtime;
|
|
113
|
+
if (socket.isOpen() || socket.session.now().moving.providerUnreachable || socket.streamed) {
|
|
114
|
+
return connectionOf(runtime, null);
|
|
115
|
+
}
|
|
116
|
+
return connectionOf(runtime, (await (await store.open()).facts()).lastCompleted);
|
|
117
|
+
}
|
|
118
|
+
async function readinessHeld({ store }) {
|
|
119
|
+
const local = await store.open();
|
|
120
|
+
const [held, facts] = await Promise.all([store.covering(), local.facts()]);
|
|
121
|
+
return { held: held.rooms, facts };
|
|
122
|
+
}
|
|
123
|
+
function readinessFor(runtime, port, reach, { held, facts }) {
|
|
124
|
+
const { store, socket, usableWhenHeld } = runtime;
|
|
125
|
+
const required = requiredRooms(runtime, reach, held);
|
|
126
|
+
const coverage = required.rooms.map((room) => ({ room, state: roomState(runtime, room, held) }));
|
|
127
|
+
const preparing = coverage
|
|
128
|
+
.filter((room) => room.state === 'preparing' && !socket.rooms.standing(room.room).unpreparable)
|
|
129
|
+
.map(({ room }) => room);
|
|
130
|
+
if (preparing.length > 0)
|
|
131
|
+
prepare(runtime, preparing);
|
|
132
|
+
const { persistence, storageLoss, heldWhenOpened } = store.device.now();
|
|
133
|
+
return readinessOf({
|
|
134
|
+
code: port.code,
|
|
135
|
+
coverage: {
|
|
136
|
+
listed: required.listed,
|
|
137
|
+
rooms: coverage,
|
|
138
|
+
conversations: conversationCoverage(runtime, reach),
|
|
139
|
+
},
|
|
140
|
+
persistence,
|
|
141
|
+
connection: connectionOf(runtime, facts.lastCompleted),
|
|
142
|
+
house: socket.session.now().refusal !== null
|
|
143
|
+
? 'refused'
|
|
144
|
+
: socket.writesHeld()
|
|
145
|
+
? 'write-halted'
|
|
146
|
+
: 'open',
|
|
147
|
+
space: store.space.full() ? 'full' : null,
|
|
148
|
+
installation: installationOf(store, coverage, held),
|
|
149
|
+
lost: storageLoss !== null,
|
|
150
|
+
established: facts.targets[port.target]?.established === true ||
|
|
151
|
+
(heldWhenOpened && usableWhenHeld.includes(port.target)),
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
function establish(runtime, name) {
|
|
155
|
+
const { store, journal } = runtime;
|
|
156
|
+
const { device } = store;
|
|
157
|
+
if (device.now().establishing.has(name))
|
|
158
|
+
return;
|
|
159
|
+
device.set({ establishing: new Set([...device.now().establishing, name]) });
|
|
160
|
+
void store
|
|
161
|
+
.durably(async (local) => {
|
|
162
|
+
const { targets } = await local.facts();
|
|
163
|
+
await local.fact('targets', { ...targets, [name]: { established: true } });
|
|
164
|
+
})
|
|
165
|
+
.then(() => {
|
|
166
|
+
store.readiness.queue();
|
|
167
|
+
void probeEachMinute(runtime);
|
|
168
|
+
}, () => {
|
|
169
|
+
journal.record(`target record failed ${name}`);
|
|
170
|
+
})
|
|
171
|
+
.finally(() => {
|
|
172
|
+
const establishing = new Set(device.now().establishing);
|
|
173
|
+
establishing.delete(name);
|
|
174
|
+
device.set({ establishing });
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
function deliverReadiness(runtime, watch, held) {
|
|
178
|
+
if (!runtime.store.readiness.held(watch))
|
|
179
|
+
return;
|
|
180
|
+
const readiness = readinessFor(runtime, watch.port, watch.reach, held);
|
|
181
|
+
if (readiness.ready && held.facts.targets[watch.port.target]?.established !== true) {
|
|
182
|
+
establish(runtime, watch.port.target);
|
|
183
|
+
}
|
|
184
|
+
if (!runtime.store.readiness.changed(watch, JSON.stringify(readiness)))
|
|
185
|
+
return;
|
|
186
|
+
watch.deliver(structuredClone(readiness));
|
|
187
|
+
}
|
|
188
|
+
export async function deliverOwedReadiness(runtime, owed) {
|
|
189
|
+
const held = await readinessHeld(runtime);
|
|
190
|
+
if (runtime.socket.closed())
|
|
191
|
+
return;
|
|
192
|
+
for (const watch of owed)
|
|
193
|
+
deliverReadiness(runtime, watch, held);
|
|
194
|
+
}
|
|
195
|
+
export function watchReadiness({ store }, port, reach, deliver) {
|
|
196
|
+
const watch = { port, reach, deliver };
|
|
197
|
+
const stop = store.readiness.add(watch);
|
|
198
|
+
void store.open().then(() => store.readiness.owe([watch]), () => store.readiness.owe([watch]));
|
|
199
|
+
return stop;
|
|
200
|
+
}
|
|
201
|
+
export function filled(runtime) {
|
|
202
|
+
const { store, socket, journal } = runtime;
|
|
203
|
+
if (socket.closed() || !store.space.fill())
|
|
204
|
+
return;
|
|
205
|
+
journal.record('space full');
|
|
206
|
+
store.readiness.queue();
|
|
207
|
+
void probeEachMinute(runtime);
|
|
208
|
+
}
|
|
209
|
+
async function installedTarget({ store, usableWhenHeld }) {
|
|
210
|
+
if (store.device.now().heldWhenOpened && usableWhenHeld.length > 0)
|
|
211
|
+
return true;
|
|
212
|
+
const { targets } = await (await store.open()).facts();
|
|
213
|
+
return Object.values(targets).some((target) => target.established);
|
|
214
|
+
}
|
|
215
|
+
async function probeEachMinute(runtime) {
|
|
216
|
+
const { store, socket } = runtime;
|
|
217
|
+
const { space } = store;
|
|
218
|
+
const idle = () => !space.full() || space.probing() || socket.closed();
|
|
219
|
+
if (idle())
|
|
220
|
+
return;
|
|
221
|
+
if (!(await installedTarget(runtime).catch(() => false)))
|
|
222
|
+
return;
|
|
223
|
+
if (idle())
|
|
224
|
+
return;
|
|
225
|
+
space.probeEachMinute();
|
|
226
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type FiguresCover } from './figures.js';
|
|
2
|
+
import type { Cover, Ran } from './live.js';
|
|
3
|
+
import { type Plan, type QueryResult } from './query.js';
|
|
4
|
+
import { type Deliver, type Fail, type PortReach } from './reach.js';
|
|
5
|
+
import type { Runtime } from './runtime.js';
|
|
6
|
+
import { type SearchResult } from './search.js';
|
|
7
|
+
import type { QueryRoom } from './store.js';
|
|
8
|
+
export declare function figuresCover(runtime: Runtime): Promise<FiguresCover>;
|
|
9
|
+
export declare function answeredPlan(runtime: Runtime, plan: Plan, cover: () => Promise<Cover>): Promise<Ran>;
|
|
10
|
+
export declare function rowsQuery(runtime: Runtime, plan: Plan): Promise<QueryResult>;
|
|
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.js").RoomTally[]>;
|
|
13
|
+
export declare function watchPlan(runtime: Runtime, plan: Plan, deliver: Deliver, fail: Fail): () => void;
|
|
14
|
+
export declare function watchPlanned(runtime: Runtime, planning: Promise<Plan>, deliver: Deliver, fail: Fail): () => void;
|
|
15
|
+
export declare function searched(runtime: Runtime, input: unknown, reach: PortReach | null): Promise<SearchResult>;
|
|
16
|
+
//# sourceMappingURL=queries.d.ts.map
|
|
@@ -0,0 +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;AAuFrE,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAa1E;AA2ED,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,CAqDvB"}
|