@agentshouse/mdruntime 0.1.0-cb95ca2c884cf → 0.1.0-cba3c6127c178
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 +19 -16
- package/dist/adapter.d.ts +149 -57
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +7 -10
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +40 -41
- package/dist/attempt.d.ts.map +1 -1
- package/dist/attempt.js +14 -1
- package/dist/binary.d.ts +0 -5
- package/dist/binary.d.ts.map +1 -1
- package/dist/binary.js +1 -1
- package/dist/bootstrap.d.ts +31 -11
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +323 -89
- package/dist/chain.d.ts +12 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +64 -0
- package/dist/change-set.d.ts +9 -14
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +11 -63
- package/dist/change.d.ts +31 -1
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +10 -1
- package/dist/client.d.ts +32 -16
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +100 -12
- package/dist/collection.d.ts +11 -7
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +38 -79
- package/dist/compile.d.ts +11 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +586 -0
- package/dist/connection.d.ts +47 -17
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +3695 -982
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/{chat/context.js → context.js} +1 -4
- package/dist/conversation.d.ts +39 -17
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +691 -259
- 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 +10 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +5 -0
- package/dist/entry.d.ts +20 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +160 -0
- package/dist/fence.d.ts +6 -0
- package/dist/fence.d.ts.map +1 -0
- package/dist/fence.js +10 -0
- package/dist/file.d.ts +2 -19
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +7 -122
- package/dist/host.d.ts +11 -3
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +126 -19
- package/dist/index.d.ts +20 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/job.d.ts +14 -0
- package/dist/job.d.ts.map +1 -0
- package/dist/job.js +28 -0
- package/dist/live.d.ts +23 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +127 -0
- package/dist/media.d.ts +8 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +218 -0
- package/dist/memory.d.ts +18 -5
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +246 -94
- package/dist/messages.d.ts +28 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +89 -0
- package/dist/model.d.ts +11 -9
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +8 -5
- 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 +22 -4
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +120 -14
- 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 +49 -7
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +40 -0
- package/dist/overlay.d.ts +3 -4
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +100 -182
- package/dist/paths.d.ts +1 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +4 -0
- package/dist/query.d.ts +40 -183
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -464
- package/dist/reach.d.ts +18 -6
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +223 -80
- package/dist/react.d.ts +10 -6
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +7 -17
- package/dist/readiness.d.ts +50 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +27 -0
- package/dist/recovery.d.ts +26 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +224 -0
- package/dist/refresh.d.ts +17 -14
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +139 -51
- package/dist/replica.d.ts +58 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +315 -154
- package/dist/room-draft.d.ts +37 -6
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +161 -74
- package/dist/rows.d.ts +30 -37
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +59 -126
- package/dist/save.d.ts +52 -9
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +543 -173
- package/dist/search.d.ts +15 -55
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +10 -121
- package/dist/seed.d.ts +16 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +75 -0
- package/dist/shared.d.ts +15 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +421 -0
- package/dist/status.d.ts +5 -0
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +3 -1
- package/dist/store.d.ts +104 -76
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +327 -442
- package/dist/stored.d.ts +138 -0
- package/dist/stored.d.ts.map +1 -0
- package/dist/stored.js +576 -0
- package/dist/tables.d.ts +326 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +587 -0
- package/dist/transfer.d.ts +0 -5
- package/dist/transfer.d.ts.map +1 -1
- package/dist/turn.d.ts +9 -0
- package/dist/turn.d.ts.map +1 -0
- package/dist/turn.js +75 -0
- package/dist/validation.d.ts +29 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +104 -0
- package/dist/windows.d.ts +11 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +16 -0
- package/dist/wire.d.ts +173 -32
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +58 -31
- package/package.json +22 -19
- package/AGENTS.md +0 -299
- package/dist/chat/acts.d.ts +0 -34
- package/dist/chat/acts.d.ts.map +0 -1
- package/dist/chat/acts.js +0 -36
- package/dist/chat/context.d.ts +0 -3
- package/dist/chat/context.d.ts.map +0 -1
- package/dist/chat/input.d.ts +0 -9
- package/dist/chat/input.d.ts.map +0 -1
- package/dist/chat/input.js +0 -99
- package/dist/chat/kit.d.ts +0 -60
- package/dist/chat/kit.d.ts.map +0 -1
- package/dist/chat/kit.js +0 -123
- package/dist/chat/lasting.d.ts +0 -6
- package/dist/chat/lasting.d.ts.map +0 -1
- package/dist/chat/lasting.js +0 -19
- package/dist/chat/list.d.ts +0 -20
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -59
- package/dist/chat/markdown.d.ts +0 -19
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -187
- package/dist/chat/message.d.ts +0 -6
- package/dist/chat/message.d.ts.map +0 -1
- package/dist/chat/message.js +0 -192
- package/dist/chat/messages.d.ts +0 -21
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -151
- package/dist/chat/name.d.ts +0 -6
- package/dist/chat/name.d.ts.map +0 -1
- package/dist/chat/name.js +0 -37
- package/dist/chat/opened.d.ts +0 -11
- package/dist/chat/opened.d.ts.map +0 -1
- package/dist/chat/opened.js +0 -17
- package/dist/chat/overlay.d.ts +0 -31
- package/dist/chat/overlay.d.ts.map +0 -1
- package/dist/chat/overlay.js +0 -97
- package/dist/chat/parts.d.ts +0 -57
- package/dist/chat/parts.d.ts.map +0 -1
- package/dist/chat/parts.js +0 -119
- package/dist/chat/process.d.ts +0 -20
- package/dist/chat/process.d.ts.map +0 -1
- package/dist/chat/process.js +0 -32
- package/dist/chat/provider.d.ts +0 -63
- package/dist/chat/provider.d.ts.map +0 -1
- package/dist/chat/provider.js +0 -645
- package/dist/chat/question.d.ts +0 -9
- package/dist/chat/question.d.ts.map +0 -1
- package/dist/chat/question.js +0 -80
- package/dist/chat/questions.d.ts +0 -31
- package/dist/chat/questions.d.ts.map +0 -1
- package/dist/chat/questions.js +0 -111
- package/dist/chat/read.d.ts +0 -5
- package/dist/chat/read.d.ts.map +0 -1
- package/dist/chat/read.js +0 -13
- package/dist/chat/ready.d.ts +0 -33
- package/dist/chat/ready.d.ts.map +0 -1
- package/dist/chat/ready.js +0 -91
- package/dist/chat/style.d.ts +0 -4
- package/dist/chat/style.d.ts.map +0 -1
- package/dist/chat/style.js +0 -302
- package/dist/chat.d.ts +0 -14
- package/dist/chat.d.ts.map +0 -1
- package/dist/chat.js +0 -8
- package/dist/read-side.d.ts +0 -18
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -440
package/dist/attempt.js
CHANGED
|
@@ -21,8 +21,21 @@ export function identities(mint = () => changeBatchIdentity()) {
|
|
|
21
21
|
},
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
|
+
const blobs = new WeakMap();
|
|
24
25
|
export function intentOf(name, about) {
|
|
25
|
-
|
|
26
|
+
const carried = [];
|
|
27
|
+
const json = JSON.stringify(about, (_key, value) => {
|
|
28
|
+
if (!(value instanceof Blob))
|
|
29
|
+
return value;
|
|
30
|
+
let identity = blobs.get(value);
|
|
31
|
+
if (identity === undefined) {
|
|
32
|
+
identity = changeBatchIdentity();
|
|
33
|
+
blobs.set(value, identity);
|
|
34
|
+
}
|
|
35
|
+
carried.push(identity);
|
|
36
|
+
return null;
|
|
37
|
+
});
|
|
38
|
+
return `${name}\u0000${json}\u0000${carried.join(',')}`;
|
|
26
39
|
}
|
|
27
40
|
export function attempts(mint) {
|
|
28
41
|
const numbers = identities(mint);
|
package/dist/binary.d.ts
CHANGED
|
@@ -3,7 +3,6 @@ export type BinaryFileRecord = {
|
|
|
3
3
|
readonly state: 'accepted';
|
|
4
4
|
readonly revision: string;
|
|
5
5
|
readonly path: string;
|
|
6
|
-
readonly fileRef: string;
|
|
7
6
|
readonly byteLength: number;
|
|
8
7
|
readonly mediaType: string;
|
|
9
8
|
readonly sha256: string;
|
|
@@ -15,9 +14,5 @@ export type BinaryFileRecord = {
|
|
|
15
14
|
readonly mediaType: string;
|
|
16
15
|
readonly sha256: string;
|
|
17
16
|
};
|
|
18
|
-
export type BinaryReference = {
|
|
19
|
-
readonly fileRef: string;
|
|
20
|
-
readonly referrer: unknown;
|
|
21
|
-
};
|
|
22
17
|
export declare function binaryRecord(path: string, held: HeldBinary, revision: string | undefined): BinaryFileRecord;
|
|
23
18
|
//# sourceMappingURL=binary.d.ts.map
|
package/dist/binary.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binary.d.ts","sourceRoot":"","sources":["../src/binary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,MAAM,gBAAgB,GACxB;IACE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"binary.d.ts","sourceRoot":"","sources":["../src/binary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,MAAM,gBAAgB,GACxB;IACE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IACE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEN,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,gBAAgB,CAKlB"}
|
package/dist/binary.js
CHANGED
|
@@ -4,5 +4,5 @@ export function binaryRecord(path, held, revision) {
|
|
|
4
4
|
return { state: 'pending', localId: held.localId, path, ...facts };
|
|
5
5
|
if (revision === undefined)
|
|
6
6
|
throw new Error(`the accepted binary file ${path} has no revision`);
|
|
7
|
-
return { state: 'accepted', revision, path,
|
|
7
|
+
return { state: 'accepted', revision, path, ...facts };
|
|
8
8
|
}
|
package/dist/bootstrap.d.ts
CHANGED
|
@@ -1,24 +1,44 @@
|
|
|
1
1
|
import type { ModelState } from './model.js';
|
|
2
|
-
import type { Adapter, AdapterFailure, Authorization, DiscoveredRoom, RetryableRefusal, RoomModels } from './adapter.js';
|
|
3
|
-
import {
|
|
4
|
-
import type {
|
|
5
|
-
import { type
|
|
2
|
+
import type { Adapter, TypedPath, AdapterFailure, Authorization, BootstrapPart, DiscoveredRoom, NotReady, RetryableRefusal, RoomModels } from './adapter.js';
|
|
3
|
+
import type { Composition } from './collection.js';
|
|
4
|
+
import type { InstallationStep } from './readiness.js';
|
|
5
|
+
import { type Refreshing } from './refresh.js';
|
|
6
|
+
import type { ReplicaRecord } from './replica.js';
|
|
7
|
+
import type { StagedPage, TransferRecord } from './store.js';
|
|
8
|
+
import { type Unconfirmed } from './transfer.js';
|
|
6
9
|
export type Bootstrapped = {
|
|
7
10
|
kind: 'staged';
|
|
8
|
-
|
|
9
|
-
|
|
11
|
+
record: ReplicaRecord;
|
|
12
|
+
refreshed: boolean;
|
|
10
13
|
};
|
|
11
|
-
export type BootstrapOutcome = Bootstrapped |
|
|
14
|
+
export type BootstrapOutcome = Bootstrapped | Unconfirmed | NotReady | RetryableRefusal | AdapterFailure;
|
|
12
15
|
export type HeldModels = {
|
|
13
16
|
collection: ModelState;
|
|
14
|
-
selection: ModelState;
|
|
15
17
|
};
|
|
16
18
|
export type Remodel = (models: RoomModels | undefined, held: HeldModels) => HeldModels;
|
|
19
|
+
export type Reads = Pick<Adapter, 'bootstrap' | 'refresh' | 'reached'>;
|
|
20
|
+
export type Arriving = {
|
|
21
|
+
at(bytes: number): void;
|
|
22
|
+
end(): void;
|
|
23
|
+
};
|
|
24
|
+
export type Resumed = {
|
|
25
|
+
readonly record: TransferRecord | null;
|
|
26
|
+
readonly staged: ReadonlySet<string>;
|
|
27
|
+
};
|
|
17
28
|
export type Staging = {
|
|
18
29
|
held(locator: string): TransferRecord | null;
|
|
19
|
-
|
|
20
|
-
|
|
30
|
+
turn(locator: string, step: InstallationStep): Promise<() => void>;
|
|
31
|
+
unqueued(): Promise<void>;
|
|
32
|
+
queued(text: number): () => void;
|
|
33
|
+
arriving(locator: string): Arriving;
|
|
34
|
+
readonly streamed: boolean;
|
|
35
|
+
stage(record: TransferRecord, page: StagedPage, composition: Composition): Promise<TransferRecord | null>;
|
|
36
|
+
resume(record: TransferRecord, parts: readonly BootstrapPart[], composition: Composition): Promise<Resumed | null>;
|
|
37
|
+
derive(locator: string, key: number, composition: Composition): Promise<boolean>;
|
|
38
|
+
refreshing(locator: string, key: number, composition: Composition): Promise<Refreshing>;
|
|
21
39
|
abandon(locator: string): Promise<void>;
|
|
40
|
+
setAside(locator: string): Promise<void>;
|
|
41
|
+
release(key: number): Promise<void>;
|
|
22
42
|
};
|
|
23
|
-
export declare function bootstrapRoom(adapter:
|
|
43
|
+
export declare function bootstrapRoom(adapter: Reads, authorization: Authorization, room: DiscoveredRoom, held: HeldModels, builtIn: ModelState, typedPaths: readonly TypedPath[], remodel: Remodel, continuing: () => boolean, staging: Staging): Promise<BootstrapOutcome>;
|
|
24
44
|
//# sourceMappingURL=bootstrap.d.ts.map
|
package/dist/bootstrap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,aAAa,EAEb,cAAc,
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
|
package/dist/bootstrap.js
CHANGED
|
@@ -1,107 +1,341 @@
|
|
|
1
1
|
import { transferIdentity } from './identity.js';
|
|
2
|
-
import { advancement } from './refresh.js';
|
|
3
|
-
import {
|
|
4
|
-
import { readStaged } from './replica.js';
|
|
2
|
+
import { advancement, pageEntries } from './refresh.js';
|
|
3
|
+
import { entriesIn } from './shared.js';
|
|
5
4
|
import { unconfirmed } from './transfer.js';
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
])
|
|
11
|
-
|
|
5
|
+
const NOTHING_PRIOR = () => Promise.resolve(new Map());
|
|
6
|
+
const PARTS_IN_FLIGHT = 6;
|
|
7
|
+
function textOf(page) {
|
|
8
|
+
let text = 0;
|
|
9
|
+
for (const [, content] of entriesIn(page.documents))
|
|
10
|
+
text += content.length;
|
|
11
|
+
return text;
|
|
12
|
+
}
|
|
13
|
+
async function pageOf(page, part) {
|
|
14
|
+
return {
|
|
15
|
+
entries: await pageEntries(page, [], page.roomVersion, NOTHING_PRIOR),
|
|
16
|
+
folders: page.folders ?? [],
|
|
17
|
+
...(part === undefined ? {} : { part }),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export async function bootstrapRoom(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging) {
|
|
21
|
+
if (staging.held(room.locator) !== null)
|
|
22
|
+
await staging.abandon(room.locator);
|
|
23
|
+
const begun = () => started(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging);
|
|
24
|
+
const first = await begun();
|
|
25
|
+
if (first.kind !== 'expired')
|
|
26
|
+
return first;
|
|
27
|
+
await staging.setAside(room.locator);
|
|
28
|
+
try {
|
|
29
|
+
const replacement = await begun();
|
|
30
|
+
if (replacement.kind !== 'expired')
|
|
31
|
+
return replacement;
|
|
32
|
+
await staging.abandon(room.locator);
|
|
33
|
+
return unconfirmed;
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
if (first.key !== null)
|
|
37
|
+
await staging.release(first.key);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function dropped(ahead) {
|
|
41
|
+
void ahead?.fetched.then(({ next, written }) => {
|
|
42
|
+
written();
|
|
43
|
+
dropped(next);
|
|
44
|
+
}, () => { });
|
|
45
|
+
}
|
|
46
|
+
function compositionFor(room, models, builtIn, typedPaths) {
|
|
12
47
|
return {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
48
|
+
model: models.collection,
|
|
49
|
+
selection: room.typedSelection === undefined
|
|
50
|
+
? null
|
|
51
|
+
: { roots: room.typedSelection.roots, model: builtIn },
|
|
52
|
+
typedPaths,
|
|
18
53
|
};
|
|
19
54
|
}
|
|
20
|
-
async function
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
55
|
+
async function started(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging) {
|
|
56
|
+
const mode = { paged: false };
|
|
57
|
+
let outcome;
|
|
58
|
+
try {
|
|
59
|
+
outcome = await bundle(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging, mode);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
await stopped(staging, room.locator, mode).catch(() => { });
|
|
63
|
+
throw error;
|
|
26
64
|
}
|
|
27
|
-
|
|
28
|
-
|
|
65
|
+
if (outcome.kind !== 'staged' && outcome.kind !== 'expired') {
|
|
66
|
+
await stopped(staging, room.locator, mode);
|
|
67
|
+
}
|
|
68
|
+
return outcome;
|
|
69
|
+
}
|
|
70
|
+
function stopped(staging, locator, mode) {
|
|
71
|
+
return mode.paged ? staging.abandon(locator) : staging.setAside(locator);
|
|
29
72
|
}
|
|
30
|
-
|
|
73
|
+
async function bundle(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging, mode) {
|
|
31
74
|
const locator = room.locator;
|
|
32
75
|
const selection = room.replica.selection;
|
|
33
|
-
const
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
76
|
+
const ending = new AbortController();
|
|
77
|
+
const arriving = staging.arriving(locator);
|
|
78
|
+
const downloaded = await staging.turn(locator, 'downloading');
|
|
79
|
+
const asking = (token) => adapter.bootstrap(authorization, {
|
|
80
|
+
locator,
|
|
81
|
+
selection,
|
|
82
|
+
signal: ending.signal,
|
|
83
|
+
...(token === null
|
|
84
|
+
? { arriving: (bytes) => arriving.at(bytes) }
|
|
85
|
+
: { pageToken: token }),
|
|
86
|
+
});
|
|
87
|
+
const fetching = (token) => {
|
|
88
|
+
const fetched = (async () => {
|
|
89
|
+
await staging.unqueued();
|
|
90
|
+
const page = continuing() ? await asking(token) : unconfirmed;
|
|
91
|
+
if (page.kind !== 'bootstrap')
|
|
92
|
+
return { page, next: null, written: () => { } };
|
|
93
|
+
const written = staging.queued(textOf(page));
|
|
94
|
+
const later = page.pageToken;
|
|
95
|
+
if (later === undefined && page.parts === undefined) {
|
|
96
|
+
downloaded();
|
|
97
|
+
arriving.end();
|
|
98
|
+
}
|
|
99
|
+
return { page, written, next: later === undefined || !continuing() ? null : fetching(later) };
|
|
100
|
+
})();
|
|
101
|
+
fetched.catch(() => { });
|
|
102
|
+
return { fetched };
|
|
103
|
+
};
|
|
104
|
+
let transfer = null;
|
|
105
|
+
let ahead = fetching(null);
|
|
106
|
+
try {
|
|
107
|
+
while (ahead !== null) {
|
|
108
|
+
if (!continuing())
|
|
109
|
+
return unconfirmed;
|
|
110
|
+
const fetched = await ahead.fetched;
|
|
111
|
+
ahead = fetched.next;
|
|
112
|
+
try {
|
|
113
|
+
if (!continuing())
|
|
114
|
+
return unconfirmed;
|
|
115
|
+
const page = fetched.page;
|
|
116
|
+
if (page.kind === 'beyond-horizon')
|
|
117
|
+
return { kind: 'expired', key: transfer?.key ?? null };
|
|
118
|
+
if (page.kind !== 'bootstrap')
|
|
119
|
+
return page;
|
|
120
|
+
if (transfer === null && page.parts !== undefined) {
|
|
121
|
+
const parted = await parts(page, page.parts);
|
|
122
|
+
if (parted.kind !== 'parted')
|
|
123
|
+
return parted;
|
|
124
|
+
transfer = parted.transfer;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (transfer === null)
|
|
128
|
+
mode.paged = true;
|
|
129
|
+
const models = remodel(page.models, transfer?.models ?? held);
|
|
130
|
+
const staged = await staging.stage({
|
|
131
|
+
locator,
|
|
132
|
+
transfer: transfer?.transfer ?? transferIdentity(),
|
|
133
|
+
selection,
|
|
134
|
+
from: transfer !== null && adapter.reached(locator, page.roomVersion, transfer.from)
|
|
135
|
+
? transfer.from
|
|
136
|
+
: page.roomVersion,
|
|
137
|
+
last: transfer !== null && !adapter.reached(locator, page.roomVersion, transfer.last)
|
|
138
|
+
? transfer.last
|
|
139
|
+
: page.roomVersion,
|
|
140
|
+
done: { bytes: (transfer?.done.bytes ?? 0) + (page.bytes ?? 0) },
|
|
141
|
+
models,
|
|
142
|
+
key: transfer?.key ?? null,
|
|
143
|
+
}, await pageOf(page), compositionFor(room, models, builtIn, typedPaths));
|
|
144
|
+
if (staged === null)
|
|
145
|
+
return unconfirmed;
|
|
146
|
+
transfer = staged;
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
fetched.written();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
ending.abort();
|
|
155
|
+
downloaded();
|
|
156
|
+
arriving.end();
|
|
157
|
+
dropped(ahead);
|
|
158
|
+
}
|
|
159
|
+
if (transfer === null)
|
|
160
|
+
return unconfirmed;
|
|
161
|
+
return installed(transfer);
|
|
162
|
+
async function parts(head, listed) {
|
|
163
|
+
const models = remodel(head.models, held);
|
|
164
|
+
const composition = compositionFor(room, models, builtIn, typedPaths);
|
|
165
|
+
const resumed = await staging.resume({
|
|
44
166
|
locator,
|
|
167
|
+
transfer: transferIdentity(),
|
|
45
168
|
selection,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
169
|
+
from: head.roomVersion,
|
|
170
|
+
last: head.roomVersion,
|
|
171
|
+
done: { bytes: 0 },
|
|
172
|
+
models,
|
|
173
|
+
key: null,
|
|
174
|
+
}, listed, composition);
|
|
175
|
+
if (resumed === null)
|
|
176
|
+
return unconfirmed;
|
|
177
|
+
let staged = resumed.record ?? {
|
|
54
178
|
locator,
|
|
55
|
-
transfer:
|
|
179
|
+
transfer: transferIdentity(),
|
|
56
180
|
selection,
|
|
57
|
-
from:
|
|
58
|
-
last:
|
|
59
|
-
|
|
60
|
-
models
|
|
181
|
+
from: head.roomVersion,
|
|
182
|
+
last: head.roomVersion,
|
|
183
|
+
done: { bytes: 0 },
|
|
184
|
+
models,
|
|
185
|
+
key: null,
|
|
61
186
|
};
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
187
|
+
const wanted = listed.filter((part) => !resumed.staged.has(part.id));
|
|
188
|
+
let arrived = staged.done.bytes;
|
|
189
|
+
const partial = new Map();
|
|
190
|
+
const report = () => {
|
|
191
|
+
let bytes = arrived;
|
|
192
|
+
for (const held of partial.values())
|
|
193
|
+
bytes += held;
|
|
194
|
+
arriving.at(bytes);
|
|
195
|
+
};
|
|
196
|
+
report();
|
|
197
|
+
const arrivals = [];
|
|
198
|
+
let woken = null;
|
|
199
|
+
let next = 0;
|
|
200
|
+
let flying = 0;
|
|
201
|
+
let halted = false;
|
|
202
|
+
let stopped = false;
|
|
203
|
+
let admitted = Promise.resolve();
|
|
204
|
+
const fetched = () => {
|
|
205
|
+
if ((next < wanted.length && !halted) || flying > 0)
|
|
206
|
+
return;
|
|
207
|
+
downloaded();
|
|
208
|
+
arriving.end();
|
|
209
|
+
};
|
|
210
|
+
const landed = (one) => {
|
|
211
|
+
flying -= 1;
|
|
212
|
+
if (stopped)
|
|
213
|
+
one.written();
|
|
214
|
+
else
|
|
215
|
+
arrivals.push(one);
|
|
216
|
+
woken?.();
|
|
217
|
+
ask();
|
|
218
|
+
fetched();
|
|
219
|
+
};
|
|
220
|
+
const fetch = async (part) => {
|
|
221
|
+
let written = () => { };
|
|
222
|
+
const admission = admitted.then(async () => {
|
|
223
|
+
await staging.unqueued();
|
|
224
|
+
written = staging.queued(part.bytes);
|
|
225
|
+
});
|
|
226
|
+
admitted = admission;
|
|
227
|
+
await admission;
|
|
228
|
+
const page = continuing()
|
|
229
|
+
? await adapter.bootstrap(authorization, {
|
|
230
|
+
locator,
|
|
231
|
+
selection,
|
|
232
|
+
signal: ending.signal,
|
|
233
|
+
pageToken: part.id,
|
|
234
|
+
arriving: (bytes) => {
|
|
235
|
+
partial.set(part.id, Math.min(bytes, part.bytes));
|
|
236
|
+
report();
|
|
237
|
+
},
|
|
238
|
+
})
|
|
239
|
+
: unconfirmed;
|
|
240
|
+
landed({ part, page, written });
|
|
241
|
+
};
|
|
242
|
+
const ask = () => {
|
|
243
|
+
while (!stopped && !halted && flying < PARTS_IN_FLIGHT && next < wanted.length) {
|
|
244
|
+
const part = wanted[next];
|
|
245
|
+
next += 1;
|
|
246
|
+
flying += 1;
|
|
247
|
+
fetch(part).catch((error) => landed({ part, page: unconfirmed, written: () => { }, error }));
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
let failed = null;
|
|
251
|
+
ask();
|
|
252
|
+
fetched();
|
|
253
|
+
try {
|
|
254
|
+
for (;;) {
|
|
255
|
+
while (arrivals.length === 0) {
|
|
256
|
+
if (flying === 0 && (halted || next >= wanted.length))
|
|
257
|
+
break;
|
|
258
|
+
await new Promise((wake) => (woken = wake));
|
|
259
|
+
woken = null;
|
|
260
|
+
}
|
|
261
|
+
const one = arrivals.shift();
|
|
262
|
+
if (one === undefined)
|
|
263
|
+
break;
|
|
264
|
+
const { part, page, written, error } = one;
|
|
265
|
+
try {
|
|
266
|
+
if (error !== undefined)
|
|
267
|
+
throw error;
|
|
268
|
+
if (!continuing())
|
|
269
|
+
return unconfirmed;
|
|
270
|
+
if (page.kind !== 'bootstrap') {
|
|
271
|
+
halted = true;
|
|
272
|
+
failed ??= page.kind === 'beyond-horizon' ? unconfirmed : page;
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
partial.delete(part.id);
|
|
276
|
+
arrived += part.bytes;
|
|
277
|
+
report();
|
|
278
|
+
const kept = await staging.stage({ ...staged, done: { bytes: staged.done.bytes + part.bytes } }, await pageOf({ ...page, roomVersion: head.roomVersion }, part.id), composition);
|
|
279
|
+
if (kept === null)
|
|
280
|
+
return unconfirmed;
|
|
281
|
+
staged = kept;
|
|
282
|
+
}
|
|
283
|
+
finally {
|
|
284
|
+
written();
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
finally {
|
|
289
|
+
stopped = true;
|
|
290
|
+
for (const one of arrivals.splice(0))
|
|
291
|
+
one.written();
|
|
292
|
+
}
|
|
293
|
+
if (failed !== null)
|
|
294
|
+
return failed;
|
|
295
|
+
if (staged.key === null) {
|
|
296
|
+
const empty = await staging.stage(staged, { entries: [], folders: [] }, composition);
|
|
297
|
+
if (empty === null)
|
|
298
|
+
return unconfirmed;
|
|
299
|
+
staged = empty;
|
|
97
300
|
}
|
|
98
|
-
return { kind: '
|
|
301
|
+
return { kind: 'parted', transfer: staged };
|
|
99
302
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
303
|
+
async function installed(transfer) {
|
|
304
|
+
const composition = compositionFor(room, transfer.models, builtIn, typedPaths);
|
|
305
|
+
if (!(await staging.derive(locator, transfer.key, composition)))
|
|
306
|
+
return unconfirmed;
|
|
307
|
+
await staging.turn(locator, 'replaying');
|
|
308
|
+
if (!continuing())
|
|
309
|
+
return unconfirmed;
|
|
310
|
+
const record = {
|
|
311
|
+
locator,
|
|
312
|
+
name: room.name,
|
|
313
|
+
handle: room.handle,
|
|
314
|
+
operations: room.operations,
|
|
315
|
+
replica: room.replica,
|
|
316
|
+
model: transfer.models.collection,
|
|
317
|
+
typedSelection: room.typedSelection ?? null,
|
|
318
|
+
providerOwnedPaths: room.providerOwnedPaths,
|
|
319
|
+
roomVersion: transfer.from,
|
|
320
|
+
transfer: transfer.transfer,
|
|
321
|
+
inventory: transfer.done,
|
|
322
|
+
key: transfer.key,
|
|
323
|
+
};
|
|
324
|
+
const last = transfer.last;
|
|
325
|
+
const refresh = adapter.refresh;
|
|
326
|
+
const reconciled = last === transfer.from &&
|
|
327
|
+
(staging.streamed || adapter.reached(locator, last, room.roomVersion))
|
|
328
|
+
? { kind: 'still-current' }
|
|
329
|
+
: refresh === undefined
|
|
330
|
+
? unconfirmed
|
|
331
|
+
: await advancement(refresh, authorization, record, remodel, continuing, await staging.refreshing(locator, record.key, composition));
|
|
332
|
+
if (reconciled.kind === 'advanced') {
|
|
333
|
+
return { kind: 'staged', record: reconciled.record, refreshed: true };
|
|
334
|
+
}
|
|
335
|
+
if (reconciled.kind === 'still-current')
|
|
336
|
+
return { kind: 'staged', record, refreshed: false };
|
|
337
|
+
if (reconciled.kind === 'beyond-horizon')
|
|
338
|
+
return { kind: 'expired', key: record.key };
|
|
339
|
+
return reconciled;
|
|
103
340
|
}
|
|
104
|
-
if (!RESUMABLE.has(reconciled.kind))
|
|
105
|
-
await staging.abandon(locator);
|
|
106
|
-
return reconciled;
|
|
107
341
|
}
|
package/dist/chain.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DocumentQuery, GroupQuery } from '@agentshouse/mdmodel';
|
|
2
|
+
import type { MdRuntimeClient } from './client.js';
|
|
3
|
+
import type { DocumentResult, GroupResult, PendingResult } from './query.js';
|
|
4
|
+
type Rows = DocumentResult | GroupResult;
|
|
5
|
+
export type WindowAnswer = Rows | PendingResult;
|
|
6
|
+
export type WindowChain = {
|
|
7
|
+
want(count: number): void;
|
|
8
|
+
close(): void;
|
|
9
|
+
};
|
|
10
|
+
export declare function chainedWindows(runtime: MdRuntimeClient, query: DocumentQuery | GroupQuery, count: number, publish: (answers: readonly (WindowAnswer | null)[], settled: boolean) => void): WindowChain;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../src/chain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE7E,KAAK,IAAI,GAAG,cAAc,GAAG,WAAW,CAAC;AAEzC,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,aAAa,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAaF,wBAAgB,cAAc,CAC5B,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,aAAa,GAAG,UAAU,EACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GAC7E,WAAW,CAkEb"}
|
package/dist/chain.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
function answered(answer) {
|
|
2
|
+
return answer !== null && !('pending' in answer);
|
|
3
|
+
}
|
|
4
|
+
export function chainedWindows(runtime, query, count, publish) {
|
|
5
|
+
let links = [];
|
|
6
|
+
let wanted = count;
|
|
7
|
+
let closed = false;
|
|
8
|
+
const observe = runtime.observe;
|
|
9
|
+
const open = (after, shown) => {
|
|
10
|
+
const link = { after, observation: null, value: shown, fresh: false };
|
|
11
|
+
void observe('query', after === undefined ? query : { ...query, after }).then((observation) => {
|
|
12
|
+
if (closed || !links.includes(link)) {
|
|
13
|
+
observation.close();
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
link.observation = observation;
|
|
17
|
+
const take = (value) => {
|
|
18
|
+
link.value = value;
|
|
19
|
+
link.fresh = true;
|
|
20
|
+
settle();
|
|
21
|
+
};
|
|
22
|
+
observation.subscribe(take);
|
|
23
|
+
take(observation.current());
|
|
24
|
+
}, () => { });
|
|
25
|
+
return link;
|
|
26
|
+
};
|
|
27
|
+
const settle = () => {
|
|
28
|
+
if (closed)
|
|
29
|
+
return;
|
|
30
|
+
const next = [];
|
|
31
|
+
for (let at = 0; at < wanted; at += 1) {
|
|
32
|
+
const before = next[at - 1];
|
|
33
|
+
if (before !== undefined && !before.fresh) {
|
|
34
|
+
next.push(...links.slice(at, wanted));
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
if (before !== undefined && (!answered(before.value) || before.value.next === undefined)) {
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
const after = before === undefined ? undefined : before.value.next;
|
|
41
|
+
const held = links[at];
|
|
42
|
+
next.push(held !== undefined && held.after === after ? held : open(after, held?.value ?? null));
|
|
43
|
+
}
|
|
44
|
+
for (const link of links)
|
|
45
|
+
if (!next.includes(link))
|
|
46
|
+
link.observation?.close();
|
|
47
|
+
links = next;
|
|
48
|
+
publish(links.map((link) => link.value), links.every((link) => link.fresh));
|
|
49
|
+
};
|
|
50
|
+
settle();
|
|
51
|
+
return {
|
|
52
|
+
want(count) {
|
|
53
|
+
if (count === wanted)
|
|
54
|
+
return;
|
|
55
|
+
wanted = count;
|
|
56
|
+
settle();
|
|
57
|
+
},
|
|
58
|
+
close() {
|
|
59
|
+
closed = true;
|
|
60
|
+
for (const link of links)
|
|
61
|
+
link.observation?.close();
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|