@agentshouse/app-bridge 0.1.0-cd783686e8a2c → 0.1.0-cd8ceab09121a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +9 -7
  2. package/dist/calls.d.ts +1007 -0
  3. package/dist/calls.js +1 -0
  4. package/dist/index.d.ts +60 -13
  5. package/dist/mdmodel/blocks.d.ts +10 -0
  6. package/dist/mdmodel/condition.d.ts +160 -0
  7. package/dist/mdmodel/definition.d.ts +81 -0
  8. package/dist/mdmodel/divide.d.ts +2 -0
  9. package/dist/mdmodel/document.d.ts +15 -0
  10. package/dist/mdmodel/fields.d.ts +5 -0
  11. package/dist/mdmodel/index.d.ts +20 -0
  12. package/dist/mdmodel/links.d.ts +28 -0
  13. package/dist/mdmodel/paths.d.ts +25 -0
  14. package/dist/mdmodel/profile.d.ts +5 -0
  15. package/dist/mdmodel/project.d.ts +21 -0
  16. package/dist/mdmodel/references.d.ts +3 -0
  17. package/dist/mdmodel/types.d.ts +167 -0
  18. package/dist/mdmodel/validate.d.ts +31 -0
  19. package/dist/mdmodel/version.d.ts +1 -0
  20. package/dist/mdmodel/yaml.d.ts +55 -0
  21. package/dist/mdruntime/adapter.d.ts +513 -0
  22. package/dist/mdruntime/binary.d.ts +17 -0
  23. package/dist/mdruntime/chain.d.ts +10 -0
  24. package/dist/mdruntime/change-set.d.ts +27 -0
  25. package/dist/mdruntime/change.d.ts +118 -0
  26. package/dist/mdruntime/client.d.ts +90 -0
  27. package/dist/mdruntime/collection.d.ts +25 -0
  28. package/dist/mdruntime/compile.d.ts +15 -0
  29. package/dist/mdruntime/connection.d.ts +151 -0
  30. package/dist/mdruntime/conversation.d.ts +118 -0
  31. package/dist/mdruntime/durability.d.ts +12 -0
  32. package/dist/mdruntime/failure.d.ts +12 -0
  33. package/dist/mdruntime/file.d.ts +11 -0
  34. package/dist/mdruntime/fulltext.d.ts +26 -0
  35. package/dist/mdruntime/identity.d.ts +6 -0
  36. package/dist/mdruntime/messages.d.ts +27 -0
  37. package/dist/mdruntime/model.d.ts +57 -0
  38. package/dist/mdruntime/observation.d.ts +43 -0
  39. package/dist/mdruntime/open.d.ts +1 -0
  40. package/dist/mdruntime/opened.d.ts +21 -0
  41. package/dist/mdruntime/outcome.d.ts +76 -0
  42. package/dist/mdruntime/overlay.d.ts +24 -0
  43. package/dist/mdruntime/query.d.ts +283 -0
  44. package/dist/mdruntime/reach.d.ts +52 -0
  45. package/dist/mdruntime/readiness.d.ts +63 -0
  46. package/dist/mdruntime/recovery.d.ts +24 -0
  47. package/dist/mdruntime/replica.d.ts +68 -0
  48. package/dist/mdruntime/room-draft.d.ts +158 -0
  49. package/dist/mdruntime/save.d.ts +100 -0
  50. package/dist/mdruntime/search.d.ts +72 -0
  51. package/dist/mdruntime/seed.d.ts +15 -0
  52. package/dist/mdruntime/shared.d.ts +15 -0
  53. package/dist/mdruntime/status.d.ts +26 -0
  54. package/dist/mdruntime/store.d.ts +169 -0
  55. package/dist/mdruntime/stored.d.ts +149 -0
  56. package/dist/mdruntime/tables.d.ts +353 -0
  57. package/dist/mdruntime/transfer.d.ts +9 -0
  58. package/dist/mdruntime/wire.d.ts +234 -0
  59. package/dist/test-host.d.ts +11 -5
  60. package/dist/test-host.js +73 -22
  61. package/docs/families.md +70 -11
  62. package/package.json +8 -6
@@ -0,0 +1,76 @@
1
+ import type { ActionResult, AdapterFailure, BinaryLinkResult, HistoryResult, HistoryRevision, ProviderRefusal, RoomVersionAt, ScopedRefusal } from './adapter.js';
2
+ import type { ChangeBatch } from './change.js';
3
+ import type { KeptBinary, KeptResult } from './opened.js';
4
+ type Refused<Kind extends string> = ProviderRefusal & {
5
+ kind: Kind;
6
+ };
7
+ export type Failure = Refused<'transport-uncertainty'> | Refused<'revoked-authorization'> | (Refused<'room-not-readable'> & {
8
+ locator: string;
9
+ }) | (Refused<'room-locked'> & {
10
+ locator: string;
11
+ }) | ScopedRefusal;
12
+ export type CallResult = {
13
+ kind: 'action';
14
+ result: unknown;
15
+ at?: RoomVersionAt;
16
+ } | Refused<'rejected'> | Refused<'undeclared'> | Failure;
17
+ export type HistoryAnswer = Exclude<HistoryResult, {
18
+ kind: Failure['kind'];
19
+ }> | Failure;
20
+ type BinaryRefusal = Refused<'rejected'> | Refused<'absent'> | Failure;
21
+ export type BinaryAnswer = {
22
+ kind: 'binary';
23
+ stream: ReadableStream<Uint8Array>;
24
+ byteLength: number;
25
+ mediaType: string;
26
+ } | BinaryRefusal;
27
+ export type HeldBinaryAnswer = KeptBinary | BinaryRefusal;
28
+ export type BinaryLinkAnswer = {
29
+ kind: 'link';
30
+ url: string;
31
+ name: string;
32
+ } | Refused<'rejected'> | Refused<'absent'> | Failure;
33
+ export type Resolution = {
34
+ readonly kind: 'document';
35
+ readonly room: string;
36
+ readonly path: string;
37
+ } | {
38
+ readonly kind: 'deleted';
39
+ readonly room: string;
40
+ readonly path: string;
41
+ readonly revision: HistoryRevision;
42
+ } | Refused<'unreadable'> | Refused<'absent'> | Failure;
43
+ export declare const UNREADABLE: Refused<'unreadable'>;
44
+ export declare const LOCKED_UNREADABLE: Refused<'unreadable'>;
45
+ export declare const ABSENT_TARGET: Refused<'absent'>;
46
+ export declare function absentBinary(path: string): Refused<'absent'>;
47
+ export declare function binaryAnswer(result: KeptResult): HeldBinaryAnswer;
48
+ export declare function binaryLinkAnswer(result: BinaryLinkResult): BinaryLinkAnswer;
49
+ export declare const ROOM_LOCKED = "room-locked";
50
+ export declare function lockedRoom(locator: string): Refused<'room-locked'> & {
51
+ locator: string;
52
+ };
53
+ export type Offline = {
54
+ readonly kind: 'offline';
55
+ };
56
+ export declare const OFFLINE: Offline;
57
+ export declare const UNCERTAIN: Failure;
58
+ export declare function undeclared(name: string): CallResult;
59
+ export declare function failure(result: AdapterFailure): Failure;
60
+ export declare function calledResult(result: ActionResult): CallResult;
61
+ export declare function historyAnswer(result: HistoryResult): HistoryAnswer;
62
+ export type Submission = {
63
+ readonly state: 'waiting' | 'submitted';
64
+ } | {
65
+ readonly state: 'reset';
66
+ readonly reset: string;
67
+ };
68
+ export type QueueEntry = {
69
+ readonly batch: ChangeBatch;
70
+ } & (Submission | {
71
+ readonly state: 'local';
72
+ } | {
73
+ readonly state: 'accepted';
74
+ readonly roomVersion: string;
75
+ });
76
+ export {};
@@ -0,0 +1,24 @@
1
+ import type { BinaryFile, HeadChange } from './adapter.js';
2
+ import type { ChangeBatch } from './change.js';
3
+ export type Heads = {
4
+ revisions: Readonly<Record<string, string>>;
5
+ fileIds: Readonly<Record<string, string>>;
6
+ changes: Readonly<Record<string, HeadChange>>;
7
+ };
8
+ export type HeldBinary = ({
9
+ readonly state: 'accepted';
10
+ } & BinaryFile) | {
11
+ readonly state: 'pending';
12
+ readonly localId: string;
13
+ readonly byteLength: number;
14
+ readonly mediaType: string;
15
+ readonly sha256: string;
16
+ };
17
+ export type Layer = Heads & {
18
+ documents: Readonly<Record<string, string>>;
19
+ binaries: Readonly<Record<string, HeldBinary>>;
20
+ };
21
+ export declare function acceptedBinaries(files: Readonly<Record<string, BinaryFile>>): Generator<readonly [string, HeldBinary]>;
22
+ export declare function sameBinary(left: HeldBinary | undefined, right: HeldBinary | undefined): boolean;
23
+ export declare function sameChange(left: HeadChange | undefined, right: HeadChange | undefined): boolean;
24
+ export declare function overlaying(base: Layer, queue: readonly ChangeBatch[], unapplied?: () => void): Generator<number, Layer, void>;
@@ -0,0 +1,283 @@
1
+ import { type Definition } from '../mdmodel/index.js';
2
+ import type { HeadChange } from './adapter.js';
3
+ import type { BinaryFileRecord } from './binary.js';
4
+ import type { Open } from './open.js';
5
+ export type Value = string | number | boolean | null;
6
+ export type Predicate = Value | {
7
+ $eq: Value;
8
+ } | {
9
+ $ne: Value;
10
+ } | {
11
+ $in: readonly Value[];
12
+ } | {
13
+ $nin: readonly Value[];
14
+ } | {
15
+ $gt?: Value;
16
+ $gte?: Value;
17
+ $lt?: Value;
18
+ $lte?: Value;
19
+ } | {
20
+ $all: readonly Value[];
21
+ } | {
22
+ $size: number;
23
+ } | {
24
+ $exists: boolean;
25
+ };
26
+ export type Where = {
27
+ $and?: readonly Where[];
28
+ $or?: readonly Where[];
29
+ [field: string]: Predicate | readonly Where[] | undefined;
30
+ };
31
+ export type Related = {
32
+ types?: readonly string[];
33
+ where?: Where;
34
+ pathPrefix?: string;
35
+ };
36
+ export type Filter = {
37
+ rooms?: readonly string[];
38
+ types?: readonly string[];
39
+ where?: Where;
40
+ pathPrefix?: string;
41
+ folder?: string;
42
+ paths?: readonly string[];
43
+ hop?: Related & {
44
+ field: string;
45
+ };
46
+ backlinks?: Related & {
47
+ field?: string;
48
+ };
49
+ };
50
+ export type Key = 'room' | 'path' | 'type' | 'folder' | {
51
+ field: string;
52
+ };
53
+ export type Select = 'all' | {
54
+ fields?: 'all' | readonly string[];
55
+ sections?: 'all' | readonly string[];
56
+ preamble?: true;
57
+ markdown?: true;
58
+ backlinks?: true;
59
+ change?: true;
60
+ fileId?: true;
61
+ revision?: true;
62
+ };
63
+ export type OrderOptions = {
64
+ nulls?: 'first' | 'last';
65
+ stringSort?: 'lexical' | 'locale';
66
+ locale?: string;
67
+ localeOptions?: Readonly<Record<string, unknown>>;
68
+ };
69
+ export type Direction = 'asc' | 'desc';
70
+ export type DocumentQuery = Filter & {
71
+ select: Select;
72
+ orderBy?: readonly ({
73
+ by: Key;
74
+ direction?: Direction;
75
+ } & OrderOptions)[];
76
+ limit?: number;
77
+ after?: string;
78
+ total?: true;
79
+ };
80
+ export type GroupQuery = Filter & {
81
+ groupBy: readonly Exclude<Key, 'path'>[];
82
+ orderBy?: readonly {
83
+ by: 'count' | Exclude<Key, 'path'>;
84
+ direction?: Direction;
85
+ }[];
86
+ limit?: number;
87
+ after?: string;
88
+ total?: true;
89
+ };
90
+ export type LocalQuery = DocumentQuery | GroupQuery;
91
+ export type Backlink = {
92
+ path: string;
93
+ type: string;
94
+ field: string;
95
+ };
96
+ export type QueryDocument = {
97
+ room: string;
98
+ path: string;
99
+ type?: string;
100
+ fields?: Readonly<Record<string, unknown>>;
101
+ sections?: Readonly<Record<string, string>>;
102
+ preamble?: string;
103
+ markdown?: string;
104
+ backlinks?: readonly Backlink[];
105
+ change?: HeadChange | null;
106
+ fileId?: string | null;
107
+ revision?: string | null;
108
+ binaryFile?: BinaryFileRecord;
109
+ };
110
+ export type QueryGroup = {
111
+ key: readonly unknown[];
112
+ count: number;
113
+ };
114
+ export type CoveredRoom = {
115
+ room: string;
116
+ generation: string;
117
+ current: boolean;
118
+ };
119
+ export type QueryCoverage = {
120
+ rooms: readonly CoveredRoom[];
121
+ indexes: readonly string[];
122
+ overlay: readonly string[];
123
+ };
124
+ export type Awaits = Open<'acquisition' | 'preparation' | 'unlock'>;
125
+ export type PendingRoom = {
126
+ room: string;
127
+ awaits: Awaits;
128
+ };
129
+ export type PendingResult = {
130
+ pending: readonly PendingRoom[];
131
+ };
132
+ export type DocumentRows = {
133
+ documents: readonly QueryDocument[];
134
+ next?: string;
135
+ total?: number;
136
+ };
137
+ export type GroupRows = {
138
+ groups: readonly QueryGroup[];
139
+ next?: string;
140
+ total?: number;
141
+ };
142
+ export type QueryRows = DocumentRows | GroupRows;
143
+ export type DocumentResult = DocumentRows & {
144
+ coverage: QueryCoverage;
145
+ };
146
+ export type GroupResult = GroupRows & {
147
+ coverage: QueryCoverage;
148
+ };
149
+ export type QueryResult = DocumentResult | GroupResult | PendingResult;
150
+ export type QueryErrorCode = 'invalid-query' | 'unknown-type' | 'unknown-field' | 'wrong-kind';
151
+ export type RoomFacts = {
152
+ locator: string;
153
+ available: boolean;
154
+ types: readonly Definition[];
155
+ };
156
+ export type HeldRooms = {
157
+ listed: boolean;
158
+ rooms: readonly RoomFacts[];
159
+ };
160
+ export type Test = {
161
+ op: 'eq';
162
+ value: Value;
163
+ } | {
164
+ op: 'ne';
165
+ value: Value;
166
+ } | {
167
+ op: 'in';
168
+ values: readonly Value[];
169
+ } | {
170
+ op: 'nin';
171
+ values: readonly Value[];
172
+ } | {
173
+ op: 'range';
174
+ bounds: readonly (readonly ['gt' | 'gte' | 'lt' | 'lte', Value])[];
175
+ } | {
176
+ op: 'all';
177
+ values: readonly Value[];
178
+ } | {
179
+ op: 'size';
180
+ size: number;
181
+ } | {
182
+ op: 'exists';
183
+ exists: boolean;
184
+ };
185
+ export type Condition = {
186
+ every: readonly Condition[];
187
+ } | {
188
+ some: readonly Condition[];
189
+ } | {
190
+ field: string;
191
+ test: Test;
192
+ };
193
+ export type Scope = {
194
+ types: readonly string[] | null;
195
+ where: Condition | null;
196
+ pathPrefix: string | null;
197
+ };
198
+ export type KeyPlan = {
199
+ of: 'room';
200
+ } | {
201
+ of: 'path';
202
+ } | {
203
+ of: 'type';
204
+ } | {
205
+ of: 'folder';
206
+ } | {
207
+ of: 'field';
208
+ field: string;
209
+ };
210
+ export type DocumentShape = {
211
+ kind: 'documents';
212
+ fields: 'all' | readonly string[] | null;
213
+ sections: 'all' | readonly string[] | null;
214
+ preamble: boolean;
215
+ markdown: boolean;
216
+ backlinks: boolean;
217
+ change: boolean;
218
+ fileId: boolean;
219
+ revision: boolean;
220
+ orderBy: readonly {
221
+ key: KeyPlan;
222
+ options: OrderOptions & {
223
+ direction: Direction;
224
+ };
225
+ }[];
226
+ };
227
+ export type GroupShape = {
228
+ kind: 'groups';
229
+ groupBy: readonly KeyPlan[];
230
+ orderBy: readonly {
231
+ by: 'count' | number;
232
+ direction: Direction;
233
+ }[];
234
+ };
235
+ export type PlanArea = {
236
+ room: string;
237
+ path: string;
238
+ types: readonly string[];
239
+ };
240
+ export type PlanReach = {
241
+ rooms: readonly string[];
242
+ documents: readonly string[];
243
+ areas: readonly PlanArea[];
244
+ };
245
+ export type Continuation = {
246
+ text: string;
247
+ values: readonly unknown[] | null;
248
+ };
249
+ export type Plan = {
250
+ key: string;
251
+ rooms: readonly string[] | null;
252
+ reach: PlanReach | null;
253
+ locked: readonly string[];
254
+ root: Scope;
255
+ folder: string | null;
256
+ paths: readonly string[] | null;
257
+ hop: (Scope & {
258
+ field: string;
259
+ }) | null;
260
+ backlinks: (Scope & {
261
+ field: string | null;
262
+ }) | null;
263
+ shape: DocumentShape | GroupShape;
264
+ limit: number | null;
265
+ after: Continuation | null;
266
+ total: boolean;
267
+ };
268
+ export declare class QueryError extends Error {
269
+ readonly code: QueryErrorCode;
270
+ readonly retryable = false;
271
+ constructor(code: QueryErrorCode, at: string, problem: string);
272
+ }
273
+ type Entries = Readonly<Record<string, unknown>>;
274
+ export declare function invalid(at: string, problem: string): never;
275
+ export declare function plain(value: unknown): value is Entries;
276
+ export declare function known(value: Entries, allowed: readonly string[], at: string): void;
277
+ export declare function flag(input: unknown, at: string): boolean;
278
+ export declare function planOf(input: unknown, facts: HeldRooms, reach?: PlanReach | null): Plan;
279
+ export declare function limitOf(input: unknown): number | null;
280
+ export declare function filterOf(input: unknown, facts: HeldRooms, reach?: PlanReach | null): Plan;
281
+ export declare function queryKey(query: unknown): string;
282
+ export declare function identityOf(plan: Plan): string;
283
+ export {};
@@ -0,0 +1,52 @@
1
+ import type { MdRuntime, ReadinessPort, RuntimeTopic } from './connection.js';
2
+ import type { Plan, PlanReach, QueryResult } from './query.js';
3
+ import type { Readiness } from './readiness.js';
4
+ import { type SearchResult } from './search.js';
5
+ export type ReachedDocument = {
6
+ readonly room: string;
7
+ readonly path: string;
8
+ };
9
+ export type ReachedArea = {
10
+ readonly room: string;
11
+ readonly path: string;
12
+ readonly types: readonly string[];
13
+ };
14
+ export type PortReach = {
15
+ readonly rooms: readonly string[];
16
+ readonly documents: readonly ReachedDocument[];
17
+ readonly areas?: readonly ReachedArea[];
18
+ readonly conversations: boolean;
19
+ };
20
+ export type Deliver = (message: unknown) => void;
21
+ export type Watch = (topic: RuntimeTopic, input: readonly unknown[], deliver: Deliver) => () => void;
22
+ export type RuntimeView = {
23
+ md: MdRuntime;
24
+ watch: Watch;
25
+ };
26
+ export type NarrowedView = RuntimeView & {
27
+ narrow(reach: PortReach | null): void;
28
+ facts(port: ReadinessPort): void;
29
+ };
30
+ export type Reachable = RuntimeView & {
31
+ plan(input: unknown, reach: PortReach | null): Plan;
32
+ query(plan: Plan): Promise<QueryResult>;
33
+ watchPlan(plan: Plan, deliver: (message: unknown) => void): () => void;
34
+ search(input: unknown, reach: PortReach | null, locked: readonly string[]): Promise<SearchResult>;
35
+ watchReadiness(port: ReadinessPort, reach: PortReach | null, deliver: (readiness: Readiness) => void): () => void;
36
+ locked(room: string): boolean;
37
+ lockedRooms(): readonly string[];
38
+ watchLocks(notify: () => void): () => void;
39
+ located(room: string, path: string, destination: string): ReachedDocument | null;
40
+ };
41
+ export declare function holds(reach: PortReach | null, room: string): boolean;
42
+ export declare function governs(reach: PortReach | null, room: {
43
+ readonly locator: string;
44
+ readonly typedSelection: {
45
+ roots: readonly string[];
46
+ } | null;
47
+ }): {
48
+ readonly collection: boolean;
49
+ readonly selection: boolean;
50
+ };
51
+ export declare function planReach(reach: PortReach | null): PlanReach | null;
52
+ export declare function narrowed(runtime: Reachable, given: PortReach | null, told: ReadinessPort): NarrowedView;
@@ -0,0 +1,63 @@
1
+ import type { Open } from './open.js';
2
+ export type CodeAvailability = Open<'stored' | 'absent'>;
3
+ export type RoomPreparation = Open<'complete' | 'acquiring' | 'preparing' | 'refused' | 'unadmitted'>;
4
+ export type RoomCoverage = {
5
+ readonly room: string;
6
+ readonly state: RoomPreparation;
7
+ };
8
+ export type ConversationCoverage = Open<'complete' | 'acquiring' | 'undeclared'>;
9
+ export type SearchObligation = Open<'required' | 'unused'>;
10
+ export type TargetCoverage = {
11
+ readonly complete: boolean;
12
+ readonly listed: boolean;
13
+ readonly rooms: readonly RoomCoverage[];
14
+ readonly conversations: ConversationCoverage;
15
+ readonly search: SearchObligation;
16
+ };
17
+ export type Persistence = Open<'granted' | 'denied' | 'unavailable'>;
18
+ export type Durability = Open<'persistent' | 'best-effort'>;
19
+ export type ConnectionAvailability = Open<'connected' | 'connecting' | 'unreachable'>;
20
+ export type HouseOutcome = Open<'open' | 'write-halted' | 'refused'>;
21
+ export type Space = Open<'full'>;
22
+ export type RefusedRoom = {
23
+ readonly room: string;
24
+ readonly name: string;
25
+ readonly file: string;
26
+ readonly rule: string;
27
+ readonly location: string | null;
28
+ };
29
+ export type InstallationStep = Open<'listing' | 'downloading' | 'writing' | 'replaying'>;
30
+ export type InstallationPause = Open<'hidden'>;
31
+ export type InstallationAmount = {
32
+ readonly done: number;
33
+ readonly total: number;
34
+ };
35
+ export type Installation = {
36
+ readonly step: InstallationStep | null;
37
+ readonly paused: InstallationPause | null;
38
+ readonly rooms: InstallationAmount;
39
+ readonly parts: InstallationAmount;
40
+ readonly bytes: InstallationAmount;
41
+ readonly received: InstallationAmount;
42
+ };
43
+ export type ReadinessStatus = Open<'preparing' | 'paused' | 'refused' | 'ready' | 'lost'>;
44
+ export type Readiness = {
45
+ readonly status: ReadinessStatus;
46
+ readonly ready: boolean;
47
+ readonly usable: boolean;
48
+ readonly code: CodeAvailability;
49
+ readonly coverage: TargetCoverage;
50
+ readonly durability: Durability;
51
+ readonly persistence: Persistence;
52
+ readonly connection: ConnectionAvailability;
53
+ readonly house: HouseOutcome;
54
+ readonly space: Space | null;
55
+ readonly installation: Installation;
56
+ readonly refused: readonly RefusedRoom[];
57
+ readonly lost: boolean;
58
+ };
59
+ export type ReadinessFacts = Omit<Readiness, 'status' | 'ready' | 'usable' | 'durability' | 'coverage'> & {
60
+ readonly coverage: Omit<TargetCoverage, 'complete'>;
61
+ readonly established: boolean;
62
+ };
63
+ export declare function readinessOf(facts: ReadinessFacts): Readiness;
@@ -0,0 +1,24 @@
1
+ export type Attempted = 'done' | 'again' | {
2
+ readonly at: number;
3
+ };
4
+ export type Attempt = (signal: AbortSignal) => Promise<Attempted>;
5
+ export type AttemptOptions = {
6
+ readonly at?: number;
7
+ readonly again?: boolean;
8
+ };
9
+ export type RecoveryOptions = {
10
+ readonly firstMs?: number;
11
+ readonly maxMs?: number;
12
+ readonly attempts?: number;
13
+ readonly inFlight?: number;
14
+ };
15
+ export type Recovery = {
16
+ attempt(intent: string, run: Attempt, options?: AttemptOptions): Promise<boolean>;
17
+ pending(intent: string): boolean;
18
+ resume(): void;
19
+ cancel(intent: string): void;
20
+ scope(inFlight?: number): Recovery;
21
+ retire(): Promise<void>;
22
+ };
23
+ export declare function retryDelay(tries: number, firstMs?: number, maxMs?: number): number;
24
+ export declare function createRecovery(options?: RecoveryOptions): Recovery;
@@ -0,0 +1,68 @@
1
+ import type { BootstrapInventory, MutationResult, OperationScopes, ReplicaAdmission, TypedSelection } from './adapter.js';
2
+ import { type ChangeBatch, type Precondition } from './change.js';
3
+ import { type Collection, type Composition } from './collection.js';
4
+ import type { ModelState } from './model.js';
5
+ import { type Layer } from './overlay.js';
6
+ import type { HeldEntry, OverlayEntry, StoredEntry } from './tables.js';
7
+ export type ReplicaRecord = {
8
+ readonly locator: string;
9
+ readonly name: string;
10
+ readonly handle: string;
11
+ readonly operations: OperationScopes;
12
+ readonly replica: ReplicaAdmission;
13
+ readonly model: ModelState;
14
+ readonly typedSelection: TypedSelection | null;
15
+ readonly providerOwnedPaths: readonly string[];
16
+ readonly roomVersion: string;
17
+ readonly transfer: string;
18
+ readonly inventory: BootstrapInventory | null;
19
+ readonly key: number;
20
+ };
21
+ export type HeldReplica = {
22
+ readonly record: ReplicaRecord;
23
+ readonly queue: readonly ChangeBatch[];
24
+ readonly overlaid: ReadonlySet<string>;
25
+ readonly count: number;
26
+ readonly confirmed: number;
27
+ readonly indexed: boolean;
28
+ };
29
+ export type VisibleLayer = Layer & {
30
+ readonly collection: Collection;
31
+ };
32
+ export type Slice = Layer & {
33
+ readonly written: Readonly<Record<string, string>>;
34
+ readonly held: ReadonlySet<string>;
35
+ };
36
+ export declare function compositionOf(record: Pick<ReplicaRecord, 'model' | 'typedSelection'>, builtIn: ModelState): Composition;
37
+ export declare function sameMembership(record: Pick<ReplicaRecord, 'typedSelection'>, other: Pick<ReplicaRecord, 'typedSelection'>): boolean;
38
+ export declare function storedRecord(record: ReplicaRecord): string;
39
+ export declare function slicing(entries: readonly HeldEntry[], paths: Iterable<string>): Generator<number, Slice, void>;
40
+ export declare function entryAt(layer: Layer & {
41
+ readonly written?: Readonly<Record<string, string>>;
42
+ }, path: string): StoredEntry | null;
43
+ export declare function slicingWith(slice: Slice, set: readonly StoredEntry[], removed: readonly string[]): Generator<number, Slice, void>;
44
+ export declare function touchedBy(queue: readonly ChangeBatch[]): Set<string>;
45
+ export declare function movedBy(queue: readonly ChangeBatch[], locator: string): Set<string>;
46
+ export type Replayed = {
47
+ readonly visible: VisibleLayer;
48
+ readonly touched: ReadonlySet<string>;
49
+ };
50
+ export declare function replaying(confirmed: Slice, queue: readonly ChangeBatch[], locator: string, composition: Composition): Generator<number, Replayed, void>;
51
+ export declare function overlayOf(visible: Layer, touched: Iterable<string>): Generator<number, OverlayEntry[], void>;
52
+ export declare function holds(layer: Layer, preconditions: readonly Precondition[]): boolean;
53
+ export declare function landed(batch: ChangeBatch, confirmed: Layer, current?: Readonly<Record<string, string>>): boolean;
54
+ export type Standing = {
55
+ readonly withdrawn: readonly ChangeBatch[];
56
+ readonly kept: readonly ChangeBatch[];
57
+ };
58
+ export declare function standing(confirmed: Slice, queue: readonly ChangeBatch[], withdrawable: (batch: ChangeBatch) => boolean, local: boolean, locator: string, composition: Composition): Generator<number, Standing, void>;
59
+ type Accepted = Extract<MutationResult, {
60
+ kind: 'accepted';
61
+ }>;
62
+ export type Returned = {
63
+ readonly set: readonly StoredEntry[];
64
+ readonly removed: readonly string[];
65
+ };
66
+ export declare function returnedPaths(submitted: ChangeBatch, accepted: Accepted): Set<string>;
67
+ export declare function returning(confirmed: Slice, submitted: ChangeBatch, accepted: Accepted, writtenAt: string): Generator<number, Returned, void>;
68
+ export {};