@agentshouse/mdruntime 0.1.0-c09bf842921ff → 0.1.0-c0b4d0492dec3

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 (108) hide show
  1. package/README.md +1 -1
  2. package/dist/adapter.d.ts +15 -16
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/bootstrap.d.ts +8 -4
  5. package/dist/bootstrap.d.ts.map +1 -1
  6. package/dist/bootstrap.js +206 -76
  7. package/dist/change.d.ts +1 -0
  8. package/dist/change.d.ts.map +1 -1
  9. package/dist/chat-types.d.ts +3 -0
  10. package/dist/chat-types.d.ts.map +1 -0
  11. package/dist/chat-types.js +2 -0
  12. package/dist/client.d.ts +5 -0
  13. package/dist/client.d.ts.map +1 -1
  14. package/dist/client.js +1 -0
  15. package/dist/compile.d.ts +5 -0
  16. package/dist/compile.d.ts.map +1 -1
  17. package/dist/compile.js +186 -55
  18. package/dist/connection.d.ts +8 -2
  19. package/dist/connection.d.ts.map +1 -1
  20. package/dist/connection.js +1386 -1040
  21. package/dist/conversation-row.d.ts +33 -0
  22. package/dist/conversation-row.d.ts.map +1 -0
  23. package/dist/conversation-row.js +47 -0
  24. package/dist/conversation.d.ts +13 -5
  25. package/dist/conversation.d.ts.map +1 -1
  26. package/dist/conversation.js +354 -192
  27. package/dist/entry.d.ts.map +1 -1
  28. package/dist/entry.js +1 -0
  29. package/dist/figures.d.ts +48 -0
  30. package/dist/figures.d.ts.map +1 -0
  31. package/dist/figures.js +197 -0
  32. package/dist/host.d.ts.map +1 -1
  33. package/dist/host.js +3 -3
  34. package/dist/index.d.ts +9 -4
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +3 -1
  37. package/dist/job.d.ts +20 -1
  38. package/dist/job.d.ts.map +1 -1
  39. package/dist/job.js +26 -0
  40. package/dist/live.d.ts +4 -4
  41. package/dist/live.d.ts.map +1 -1
  42. package/dist/live.js +53 -15
  43. package/dist/memory.d.ts +1 -0
  44. package/dist/memory.d.ts.map +1 -1
  45. package/dist/memory.js +11 -3
  46. package/dist/messages.d.ts +25 -1
  47. package/dist/messages.d.ts.map +1 -1
  48. package/dist/messages.js +82 -3
  49. package/dist/model.d.ts +0 -2
  50. package/dist/model.d.ts.map +1 -1
  51. package/dist/model.js +0 -6
  52. package/dist/outcome.d.ts +1 -0
  53. package/dist/outcome.d.ts.map +1 -1
  54. package/dist/outcome.js +3 -0
  55. package/dist/overlay.d.ts +1 -0
  56. package/dist/overlay.d.ts.map +1 -1
  57. package/dist/overlay.js +11 -0
  58. package/dist/parts.d.ts +59 -0
  59. package/dist/parts.d.ts.map +1 -0
  60. package/dist/parts.js +118 -0
  61. package/dist/query.d.ts +10 -0
  62. package/dist/query.d.ts.map +1 -1
  63. package/dist/questions.d.ts +32 -0
  64. package/dist/questions.d.ts.map +1 -0
  65. package/dist/questions.js +118 -0
  66. package/dist/reach.d.ts +5 -5
  67. package/dist/reach.d.ts.map +1 -1
  68. package/dist/reach.js +156 -99
  69. package/dist/read.d.ts +7 -0
  70. package/dist/read.d.ts.map +1 -0
  71. package/dist/read.js +17 -0
  72. package/dist/reads.d.ts +35 -0
  73. package/dist/reads.d.ts.map +1 -0
  74. package/dist/reads.js +128 -0
  75. package/dist/recovery.d.ts.map +1 -1
  76. package/dist/recovery.js +9 -1
  77. package/dist/refresh.d.ts +1 -1
  78. package/dist/refresh.d.ts.map +1 -1
  79. package/dist/refresh.js +4 -0
  80. package/dist/replica.d.ts.map +1 -1
  81. package/dist/replica.js +23 -6
  82. package/dist/save.d.ts.map +1 -1
  83. package/dist/save.js +10 -7
  84. package/dist/source.d.ts +61 -0
  85. package/dist/source.d.ts.map +1 -0
  86. package/dist/source.js +81 -0
  87. package/dist/status.d.ts +0 -2
  88. package/dist/status.d.ts.map +1 -1
  89. package/dist/status.js +0 -6
  90. package/dist/store.d.ts +85 -25
  91. package/dist/store.d.ts.map +1 -1
  92. package/dist/store.js +136 -98
  93. package/dist/stored.d.ts +55 -28
  94. package/dist/stored.d.ts.map +1 -1
  95. package/dist/stored.js +187 -74
  96. package/dist/tables.d.ts +99 -19
  97. package/dist/tables.d.ts.map +1 -1
  98. package/dist/tables.js +171 -34
  99. package/dist/tallies.d.ts +18 -0
  100. package/dist/tallies.d.ts.map +1 -0
  101. package/dist/tallies.js +129 -0
  102. package/dist/wire.d.ts +6 -0
  103. package/dist/wire.d.ts.map +1 -1
  104. package/dist/wire.js +3 -0
  105. package/package.json +2 -2
  106. package/dist/fence.d.ts +0 -6
  107. package/dist/fence.d.ts.map +0 -1
  108. package/dist/fence.js +0 -10
package/dist/stored.d.ts CHANGED
@@ -10,6 +10,7 @@ export type StoredEntry = {
10
10
  readonly binary: HeldBinary | null;
11
11
  readonly revision: string | null;
12
12
  readonly fileId: string | null;
13
+ readonly created: string | null;
13
14
  readonly change: HeadChange | null;
14
15
  readonly written: string | null;
15
16
  readonly facts: SavedFacts | null;
@@ -29,32 +30,45 @@ export type Referrer = {
29
30
  readonly path: string;
30
31
  readonly target: string;
31
32
  };
32
- export type HeldKey = {
33
- readonly key: number;
33
+ export type HeldRoomRow = {
34
34
  readonly locator: string;
35
- readonly transfer: string;
36
- readonly rederiving: number | null;
35
+ readonly key: number;
36
+ readonly record: string;
37
+ readonly indexed: boolean;
38
+ readonly documents: number;
37
39
  };
38
- export type ReplicaOpened = {
40
+ export type HeldRoomWork = {
41
+ readonly room: (HeldRoomRow & {
42
+ readonly overlaid: readonly string[];
43
+ }) | null;
44
+ readonly queue: readonly {
45
+ readonly id: string;
46
+ readonly batch: string;
47
+ readonly state: string;
48
+ }[];
49
+ };
50
+ export type Covering = {
39
51
  readonly rooms: readonly {
40
52
  readonly locator: string;
41
53
  readonly key: number;
42
- readonly record: string;
54
+ readonly transfer: string;
55
+ readonly roomVersion: string;
56
+ readonly indexed: boolean;
57
+ readonly documents: number;
58
+ readonly bytes: number;
59
+ readonly offline: string;
43
60
  }[];
44
- readonly keys: readonly HeldKey[];
45
- readonly facts: Readonly<Record<string, string>>;
46
- readonly presentation: readonly {
47
- readonly app: string;
48
- readonly value: string;
49
- }[];
50
- readonly overlaid: readonly {
51
- readonly key: number;
52
- readonly path: string;
53
- }[];
54
- readonly erasing: readonly {
55
- readonly key: number;
61
+ readonly queues: readonly {
56
62
  readonly locator: string;
63
+ readonly ids: readonly string[];
57
64
  }[];
65
+ };
66
+ export type HeldLocators = {
67
+ readonly held: readonly string[];
68
+ readonly staged: readonly string[];
69
+ };
70
+ export type ReplicaOpened = {
71
+ readonly erasing: boolean;
58
72
  readonly orphans: readonly number[];
59
73
  };
60
74
  export type RoomCommit = {
@@ -77,14 +91,9 @@ export type RoomCommit = {
77
91
  };
78
92
  };
79
93
  export type Committed = {
80
- readonly counts: Readonly<Record<string, number>>;
81
94
  readonly changed: Readonly<Record<string, readonly string[] | null>>;
82
95
  readonly indexed: Readonly<Record<string, boolean>>;
83
96
  };
84
- export type CountedRoom = {
85
- readonly key: number;
86
- readonly roots: readonly string[];
87
- };
88
97
  export declare function entered(connection: Connection, locator: string, composition: Composition, rows: readonly StoredEntry[]): number;
89
98
  export declare function stage(connection: Connection, request: {
90
99
  readonly locator: string;
@@ -93,7 +102,20 @@ export declare function stage(connection: Connection, request: {
93
102
  readonly fingerprint: string;
94
103
  readonly entries: readonly StoredEntry[];
95
104
  readonly folders: readonly string[];
105
+ readonly part: string | null;
96
106
  }): number;
107
+ export type Resumed = {
108
+ readonly key: number | null;
109
+ readonly transfer: string;
110
+ readonly staged: readonly string[];
111
+ };
112
+ export declare function resume(connection: Connection, request: {
113
+ readonly locator: string;
114
+ readonly transfer: string;
115
+ readonly fingerprint: string;
116
+ readonly parts: readonly string[];
117
+ readonly published: number | null;
118
+ }): Resumed;
97
119
  export declare function refreshing(connection: Connection, request: {
98
120
  readonly key: number;
99
121
  readonly composed: Composed;
@@ -103,7 +125,6 @@ export declare function refreshing(connection: Connection, request: {
103
125
  readonly folderRemovals: readonly string[];
104
126
  }): null;
105
127
  export declare function unrefresh(connection: Connection, key: number): null;
106
- export declare function counts(connection: Connection, rooms: readonly CountedRoom[]): number[];
107
128
  export declare function commit(connection: Connection, rooms: readonly RoomCommit[]): Committed;
108
129
  export declare function fenceRooms(connection: Connection, locators: readonly string[]): null;
109
130
  export declare function abandon(connection: Connection, locator: string): null;
@@ -118,12 +139,18 @@ export declare function rederive(connection: Connection, key: number, composed:
118
139
  export declare function entries(connection: Connection, key: number, view: View, list: readonly string[]): HeldEntry[];
119
140
  export declare function typed(connection: Connection, key: number, view: View, list: readonly string[]): TypedEntry[];
120
141
  export declare function referrers(connection: Connection, key: number, view: View, targets: readonly string[]): Referrer[];
121
- export declare function files(connection: Connection, key: number, view: View, after: string | null, limit: number): {
122
- readonly path: string;
123
- readonly revision: string;
124
- }[];
125
142
  export declare function folders(connection: Connection, key: number, view: View, list: readonly string[]): string[];
126
143
  export declare function typedWithin(connection: Connection, key: number, view: View, roots: readonly string[], within: boolean): boolean;
127
144
  export declare function opened(connection: Connection): ReplicaOpened;
145
+ export declare function heldRooms(connection: Connection, locators: readonly string[] | null): readonly HeldRoomRow[];
146
+ export declare function heldRoom(connection: Connection, locator: string): HeldRoomRow | null;
147
+ export declare function overlaid(connection: Connection, key: number): readonly string[];
148
+ export declare function covering(connection: Connection): Covering['rooms'];
149
+ export declare function offlineMode(connection: Connection, locator: string): string | null;
150
+ export declare function stagedLocators(connection: Connection): readonly string[];
151
+ export declare function heldLocators(connection: Connection): readonly string[];
152
+ export declare function demoted(connection: Connection): null;
153
+ export declare function facts(connection: Connection): Readonly<Record<string, string>>;
154
+ export declare function presentation(connection: Connection, app: string): string | null;
128
155
  export declare function ended(connection: Connection): void;
129
156
  //# sourceMappingURL=stored.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stored.d.ts","sourceRoot":"","sources":["../src/stored.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stored.d.ts","sourceRoot":"","sources":["../src/stored.ts"],"names":[],"mappings":"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"}
package/dist/stored.js CHANGED
@@ -1,11 +1,11 @@
1
- import { sql } from '@agentshouse/mdmodel';
1
+ import { instantKey, sql } from '@agentshouse/mdmodel';
2
2
  import { composedOf } from './collection.js';
3
3
  import { described, derived, heldOf } from './rows.js';
4
4
  export const REPLICA_TABLES = [
5
5
  'CREATE TABLE replica_keys (key INTEGER PRIMARY KEY AUTOINCREMENT, locator TEXT NOT NULL, transfer TEXT NOT NULL, fingerprint TEXT NOT NULL, rederiving INTEGER)',
6
- 'CREATE TABLE replica_rooms (locator TEXT PRIMARY KEY, key INTEGER NOT NULL, record TEXT NOT NULL) WITHOUT ROWID',
6
+ 'CREATE TABLE replica_rooms (locator TEXT PRIMARY KEY, key INTEGER NOT NULL, record TEXT NOT NULL, documents INTEGER NOT NULL DEFAULT 0) WITHOUT ROWID',
7
7
  'CREATE TABLE replica_models (identity TEXT NOT NULL, version TEXT NOT NULL, schema TEXT NOT NULL, PRIMARY KEY (identity, version)) WITHOUT ROWID',
8
- 'CREATE TABLE replica_entries (id INTEGER PRIMARY KEY, key INTEGER NOT NULL, layer INTEGER NOT NULL, path TEXT NOT NULL, visible INTEGER NOT NULL, present INTEGER NOT NULL, queried INTEGER NOT NULL, binary TEXT, revision TEXT, file_id TEXT, change TEXT, written TEXT, type TEXT, declared TEXT, folder TEXT NOT NULL, fields TEXT, links TEXT, content TEXT)',
8
+ "CREATE TABLE replica_entries (id INTEGER PRIMARY KEY, key INTEGER NOT NULL, layer INTEGER NOT NULL, path TEXT NOT NULL, visible INTEGER NOT NULL, present INTEGER NOT NULL, queried INTEGER NOT NULL, binary TEXT, revision TEXT, file_id TEXT, change TEXT, written TEXT, type TEXT, declared TEXT, folder TEXT NOT NULL, fields TEXT, links TEXT, part TEXT, created TEXT, created_instant TEXT, changed_instant TEXT, bytes INTEGER GENERATED ALWAYS AS (CASE WHEN binary IS NULL THEN length(CAST(content AS BLOB)) ELSE binary ->> '$.byteLength' END) STORED, content TEXT)",
9
9
  'CREATE UNIQUE INDEX replica_entries_path ON replica_entries (key, layer, path)',
10
10
  'CREATE INDEX replica_entries_visible ON replica_entries (key, visible, present, path, binary)',
11
11
  'CREATE INDEX replica_entries_folder ON replica_entries (key, folder, path)',
@@ -14,7 +14,7 @@ export const REPLICA_TABLES = [
14
14
  sql.VALUE_TABLE,
15
15
  'CREATE TABLE replica_links (doc INTEGER NOT NULL, key INTEGER NOT NULL, kind TEXT NOT NULL, keys TEXT NOT NULL, places TEXT NOT NULL, target TEXT NOT NULL, field TEXT NOT NULL, PRIMARY KEY (doc, kind, keys, places, target)) WITHOUT ROWID',
16
16
  'CREATE INDEX replica_links_target ON replica_links (key, target, kind, keys)',
17
- 'CREATE TABLE replica_folders (key INTEGER NOT NULL, layer INTEGER NOT NULL, path TEXT NOT NULL, present INTEGER NOT NULL, PRIMARY KEY (key, layer, path)) WITHOUT ROWID',
17
+ 'CREATE TABLE replica_folders (key INTEGER NOT NULL, layer INTEGER NOT NULL, path TEXT NOT NULL, present INTEGER NOT NULL, part TEXT, PRIMARY KEY (key, layer, path)) WITHOUT ROWID',
18
18
  'CREATE TABLE replica_erasing (key INTEGER PRIMARY KEY, locator TEXT NOT NULL)',
19
19
  'CREATE TABLE replica_facts (name TEXT PRIMARY KEY, value TEXT NOT NULL) WITHOUT ROWID',
20
20
  'CREATE TABLE replica_presentation (app TEXT PRIMARY KEY, value TEXT NOT NULL) WITHOUT ROWID',
@@ -76,8 +76,8 @@ function removeEntry(connection, key, layer, path) {
76
76
  dropDerived(connection, id);
77
77
  connection.run('DELETE FROM replica_entries WHERE id = ?', [id]);
78
78
  }
79
- function insertEntry(connection, key, layer, entry, present, made) {
80
- connection.run('INSERT INTO replica_entries (key, layer, path, visible, present, queried, content, binary, revision, file_id, change, written, type, declared, folder, fields, links) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [
79
+ function insertEntry(connection, key, layer, entry, present, made, part = null) {
80
+ connection.run('INSERT INTO replica_entries (key, layer, path, visible, present, queried, content, binary, revision, file_id, created, created_instant, change, changed_instant, written, type, declared, folder, fields, links, part) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [
81
81
  key,
82
82
  layer,
83
83
  entry.path,
@@ -88,13 +88,17 @@ function insertEntry(connection, key, layer, entry, present, made) {
88
88
  entry.binary === null ? null : JSON.stringify(entry.binary),
89
89
  entry.revision,
90
90
  entry.fileId,
91
+ entry.created,
92
+ instantKey(entry.created),
91
93
  entry.change === null ? null : JSON.stringify(entry.change),
94
+ instantKey(entry.change?.time),
92
95
  entry.written,
93
96
  made.type,
94
97
  made.declared,
95
98
  made.folder,
96
99
  made.fields,
97
100
  made.links,
101
+ part,
98
102
  ]);
99
103
  }
100
104
  function textOf(entry) {
@@ -109,9 +113,9 @@ function putEntry(connection, key, layer, entry, present, composition) {
109
113
  const id = entryId(connection, key, layer, entry.path);
110
114
  writeDerived(connection, id, key, entry.path, heldOf(entry.path, content, entry.facts), composition);
111
115
  }
112
- function placeEntry(connection, key, entry) {
116
+ function placeEntry(connection, key, entry, part) {
113
117
  removeEntry(connection, key, CONFIRMED, entry.path);
114
- insertEntry(connection, key, CONFIRMED, entry, true, described(entry.path, textOf(entry), entry.facts));
118
+ insertEntry(connection, key, CONFIRMED, entry, true, described(entry.path, textOf(entry), entry.facts), part);
115
119
  }
116
120
  function revealed(connection, key, touched) {
117
121
  if (touched.length === 0)
@@ -138,17 +142,83 @@ export function entered(connection, locator, composition, rows) {
138
142
  return key;
139
143
  }
140
144
  export function stage(connection, request) {
145
+ if (request.key === null) {
146
+ for (const row of connection.rows(STAGED_KEYS, [request.locator])) {
147
+ erasing(connection, number(row.key), request.locator);
148
+ }
149
+ }
141
150
  const key = request.key ??
142
151
  newKey(connection, request.locator, request.transfer, request.fingerprint, false);
143
152
  recomposed(connection, key, request.fingerprint);
144
- connection.run('UPDATE replica_keys SET rederiving = coalesce(rederiving, last) FROM (SELECT coalesce(max(id), 0) AS last FROM replica_entries) WHERE key = ?', [key]);
153
+ owing(connection, key);
145
154
  for (const entry of request.entries)
146
- placeEntry(connection, key, entry);
155
+ placeEntry(connection, key, entry, request.part);
147
156
  for (const path of request.folders) {
148
- connection.run('INSERT OR REPLACE INTO replica_folders (key, layer, path, present) VALUES (?, ?, ?, 1)', [key, CONFIRMED, path]);
157
+ connection.run('INSERT OR REPLACE INTO replica_folders (key, layer, path, present, part) VALUES (?, ?, ?, 1, ?)', [key, CONFIRMED, path, request.part]);
149
158
  }
150
159
  return key;
151
160
  }
161
+ function owing(connection, key) {
162
+ connection.run('UPDATE replica_keys SET rederiving = coalesce(rederiving, last) FROM (SELECT coalesce(max(id), 0) AS last FROM replica_entries) WHERE key = ?', [key]);
163
+ }
164
+ const STAGED_KEYS = `SELECT k.key, k.transfer FROM replica_keys k WHERE k.locator = ?
165
+ AND NOT EXISTS (SELECT 1 FROM replica_rooms r WHERE r.key = k.key)
166
+ AND NOT EXISTS (SELECT 1 FROM replica_erasing e WHERE e.key = k.key)
167
+ ORDER BY k.key DESC`;
168
+ const UNPARTED = `EXISTS (SELECT 1 FROM replica_entries e WHERE e.key = k.key AND e.part IS NULL)
169
+ OR EXISTS (SELECT 1 FROM replica_folders f WHERE f.key = k.key AND f.part IS NULL)`;
170
+ function partsOf(connection, key, layer) {
171
+ const scoped = layer === null ? '' : ` AND layer = ${layer}`;
172
+ return new Set(connection
173
+ .rows(`SELECT part FROM replica_entries WHERE key = ?${scoped} AND part IS NOT NULL UNION SELECT part FROM replica_folders WHERE key = ?${scoped} AND part IS NOT NULL`, [key, key])
174
+ .map((row) => text(row.part)));
175
+ }
176
+ function resumable(connection, locator) {
177
+ let kept = null;
178
+ for (const row of connection.rows(STAGED_KEYS, [locator])) {
179
+ const key = number(row.key);
180
+ const parted = kept === null &&
181
+ connection.rows(`SELECT 1 FROM replica_keys k WHERE k.key = ? AND NOT (${UNPARTED})`, [key])
182
+ .length > 0;
183
+ if (parted)
184
+ kept = { key, transfer: text(row.transfer) };
185
+ else
186
+ erasing(connection, key, locator);
187
+ }
188
+ return kept;
189
+ }
190
+ export function resume(connection, request) {
191
+ const wanted = new Set(request.parts);
192
+ const held = resumable(connection, request.locator);
193
+ const staged = held === null ? new Set() : partsOf(connection, held.key, null);
194
+ const dropped = [...staged].filter((part) => !wanted.has(part));
195
+ if (held !== null && dropped.length > 0) {
196
+ const named = JSON.stringify(dropped);
197
+ const rows = `SELECT id FROM replica_entries WHERE key = ? AND part IN (SELECT value FROM json_each(?))`;
198
+ for (const table of ['replica_values', 'replica_links']) {
199
+ connection.run(`DELETE FROM ${table} WHERE doc IN (${rows})`, [held.key, named]);
200
+ }
201
+ connection.run(`DELETE FROM replica_entries WHERE id IN (${rows})`, [held.key, named]);
202
+ connection.run('DELETE FROM replica_folders WHERE key = ? AND part IN (SELECT value FROM json_each(?))', [held.key, named]);
203
+ }
204
+ const kept = [...staged].filter((part) => wanted.has(part));
205
+ const publishedParts = request.published === null
206
+ ? new Set()
207
+ : partsOf(connection, request.published, CONFIRMED);
208
+ const copied = request.parts.filter((part) => !staged.has(part) && publishedParts.has(part));
209
+ if (held === null && copied.length === 0) {
210
+ return { key: null, transfer: request.transfer, staged: [] };
211
+ }
212
+ const key = held?.key ?? newKey(connection, request.locator, request.transfer, request.fingerprint, false);
213
+ recomposed(connection, key, request.fingerprint);
214
+ if (copied.length > 0 && request.published !== null) {
215
+ owing(connection, key);
216
+ const named = JSON.stringify(copied);
217
+ connection.run(`INSERT INTO replica_entries (key, layer, path, visible, present, queried, content, binary, revision, file_id, created, created_instant, change, changed_instant, written, type, declared, folder, fields, links, part) SELECT ?, ${CONFIRMED}, path, 1, 1, queried, content, binary, revision, file_id, created, created_instant, change, changed_instant, written, type, declared, folder, fields, links, part FROM replica_entries WHERE key = ? AND layer = ${CONFIRMED} AND present = 1 AND part IN (SELECT value FROM json_each(?)) ORDER BY path`, [key, request.published, named]);
218
+ connection.run(`INSERT OR REPLACE INTO replica_folders (key, layer, path, present, part) SELECT ?, ${CONFIRMED}, path, 1, part FROM replica_folders WHERE key = ? AND layer = ${CONFIRMED} AND present = 1 AND part IN (SELECT value FROM json_each(?))`, [key, request.published, named]);
219
+ }
220
+ return { key, transfer: held?.transfer ?? request.transfer, staged: [...kept, ...copied] };
221
+ }
152
222
  export function refreshing(connection, request) {
153
223
  const held = connection.rows('SELECT 1 FROM replica_keys k WHERE k.key = ? AND NOT EXISTS (SELECT 1 FROM replica_erasing e WHERE e.key = k.key)', [request.key]);
154
224
  if (held.length === 0)
@@ -165,6 +235,7 @@ export function refreshing(connection, request) {
165
235
  binary: null,
166
236
  revision: null,
167
237
  fileId: null,
238
+ created: null,
168
239
  change: null,
169
240
  written: null,
170
241
  facts: null,
@@ -224,15 +295,18 @@ function counted(connection, key, roots) {
224
295
  const [row] = connection.rows(`SELECT count(*) AS held FROM replica_entries WHERE key = ? AND visible = 1 AND present = 1 AND (binary IS NOT NULL OR substr(path, -3) = '.md') AND NOT ${beneathRoots('replica_entries.path')}`, [key, JSON.stringify(roots)]);
225
296
  return number(row.held);
226
297
  }
227
- export function counts(connection, rooms) {
228
- return rooms.map(({ key, roots }) => counted(connection, key, roots));
229
- }
230
298
  function erasing(connection, key, locator) {
231
299
  connection.run('INSERT OR REPLACE INTO replica_erasing (key, locator) VALUES (?, ?)', [
232
300
  key,
233
301
  locator,
234
302
  ]);
235
303
  }
304
+ function saved(connection, key, entry, at) {
305
+ if (!entry.present || entry.created !== null)
306
+ return entry;
307
+ const [held] = connection.rows(`SELECT created FROM replica_entries WHERE key = ? AND layer = ${OVERLAY} AND path = ? AND present = 1`, [key, entry.path]);
308
+ return { ...entry, created: text(held?.created) ?? at };
309
+ }
236
310
  function commitRoom(connection, room) {
237
311
  const touched = new Set();
238
312
  recomposed(connection, room.key, room.composed.fingerprint);
@@ -254,8 +328,9 @@ function commitRoom(connection, room) {
254
328
  removeEntry(connection, room.key, CONFIRMED, path);
255
329
  touched.add(path);
256
330
  }
331
+ const savedAt = new Date().toISOString();
257
332
  for (const entry of room.overlay?.set ?? []) {
258
- putEntry(connection, room.key, OVERLAY, entry, entry.present, composition);
333
+ putEntry(connection, room.key, OVERLAY, saved(connection, room.key, entry, savedAt), entry.present, composition);
259
334
  touched.add(entry.path);
260
335
  }
261
336
  for (const path of room.overlay?.cleared ?? []) {
@@ -288,20 +363,21 @@ const HELD_RECORDS = `SELECT r.locator, r.key, CASE WHEN m.schema IS NULL THEN r
288
363
  ON m.identity = json_extract(r.record, '$.model.snapshot.identity')
289
364
  AND m.version = json_extract(r.record, '$.model.snapshot.version')`;
290
365
  export function commit(connection, rooms) {
291
- const counted = {};
292
366
  const changed = {};
293
367
  const indexed = {};
294
368
  for (const room of rooms) {
295
369
  changed[room.locator] = commitRoom(connection, room);
296
- counted[room.locator] = counts(connection, [
297
- { key: room.key, roots: room.roots ?? rootsOf(connection, room.locator) },
298
- ])[0];
370
+ connection.run('UPDATE replica_rooms SET documents = ? WHERE locator = ? AND key = ?', [
371
+ counted(connection, room.key, room.roots ?? rootsOf(connection, room.locator)),
372
+ room.locator,
373
+ room.key,
374
+ ]);
299
375
  const [held] = connection.rows('SELECT rederiving FROM replica_keys WHERE key = ?', [room.key]);
300
376
  indexed[room.locator] = held !== undefined && held.rederiving === null;
301
377
  }
302
378
  if (rooms.some((room) => room.record !== undefined))
303
379
  connection.run(UNHELD_MODELS);
304
- return { counts: counted, changed, indexed };
380
+ return { changed, indexed };
305
381
  }
306
382
  function rootsOf(connection, locator) {
307
383
  const [row] = connection.rows('SELECT record FROM replica_rooms WHERE locator = ?', [locator]);
@@ -400,6 +476,7 @@ function heldEntry(row) {
400
476
  binary: json(row.binary),
401
477
  revision: text(row.revision),
402
478
  fileId: text(row.file_id),
479
+ created: text(row.created),
403
480
  change: json(row.change),
404
481
  written: text(row.written),
405
482
  type: text(row.type),
@@ -416,7 +493,7 @@ function factsHeld(row) {
416
493
  links: json(row.links) ?? [],
417
494
  };
418
495
  }
419
- const ENTRY_COLUMNS = 'e.path, e.content, e.binary, e.revision, e.file_id, e.change, e.written, e.type, e.declared, e.fields, e.links';
496
+ const ENTRY_COLUMNS = 'e.path, e.content, e.binary, e.revision, e.file_id, e.created, e.change, e.written, e.type, e.declared, e.fields, e.links';
420
497
  function unrefreshed(alias) {
421
498
  return `NOT EXISTS (SELECT 1 FROM replica_entries r WHERE r.key = ${alias}.key AND r.layer = ${REFRESHED} AND r.path = ${alias}.path)`;
422
499
  }
@@ -427,22 +504,6 @@ function viewed(view, alias) {
427
504
  return `${alias}.layer = ${CONFIRMED}`;
428
505
  return `${alias}.present = 1 AND (${alias}.layer = ${REFRESHED} OR (${alias}.layer = ${CONFIRMED} AND ${unrefreshed(alias)}))`;
429
506
  }
430
- function layers(view) {
431
- if (view !== 'refreshed')
432
- return [viewed(view, 'e')];
433
- return [
434
- `e.layer = ${REFRESHED} AND e.present = 1`,
435
- `e.layer = ${CONFIRMED} AND e.present = 1 AND ${unrefreshed('e')}`,
436
- ];
437
- }
438
- function pathOrdered(connection, columns, key, view, condition, after, limit) {
439
- const beyond = after === null ? '' : ' AND e.path > ?';
440
- const parts = layers(view).map((layer) => `SELECT ${columns} FROM replica_entries e WHERE e.key = ? AND ${layer}${condition}${beyond}`);
441
- return connection.rows(`${parts.join(' UNION ALL ')} ORDER BY path LIMIT ?`, [
442
- ...parts.flatMap(() => (after === null ? [key] : [key, after])),
443
- limit,
444
- ]);
445
- }
446
507
  export function entries(connection, key, view, list) {
447
508
  if (list.length === 0)
448
509
  return [];
@@ -468,53 +529,105 @@ export function referrers(connection, key, view, targets) {
468
529
  .rows(`SELECT DISTINCT e.path, l.target FROM replica_links l JOIN replica_entries e ON e.id = l.doc WHERE l.key = ? AND l.target IN (SELECT value FROM json_each(?)) AND ${viewed(view, 'e')}`, [key, paths(targets)])
469
530
  .map((row) => ({ path: text(row.path), target: text(row.target) }));
470
531
  }
471
- export function files(connection, key, view, after, limit) {
472
- return pathOrdered(connection, 'e.path, e.revision', key, view, ' AND e.content IS NOT NULL AND e.revision IS NOT NULL', after, limit).map((row) => ({ path: text(row.path), revision: text(row.revision) }));
473
- }
474
532
  export function folders(connection, key, view, list) {
475
533
  return list.filter((path) => connection.rows(`SELECT 1 FROM replica_folders f WHERE f.key = ? AND f.layer = ${CONFIRMED} AND f.present = 1 AND f.path = ? UNION ALL SELECT 1 FROM replica_entries e WHERE e.key = ? AND ${viewed(view, 'e')} AND e.path >= ? AND e.path < ? LIMIT 1`, [key, path, key, `${path}/`, `${path}0`]).length > 0);
476
534
  }
477
535
  export function typedWithin(connection, key, view, roots, within) {
478
536
  return (connection.rows(`SELECT 1 FROM replica_entries e WHERE e.key = ? AND ${viewed(view, 'e')} AND e.declared IS NOT NULL AND e.declared <> 'any' AND ${within ? '' : 'NOT '}${beneathRoots('e.path')} LIMIT 1`, [key, JSON.stringify(roots)]).length > 0);
479
537
  }
538
+ const ORPHANS = `SELECT k.key FROM replica_keys k
539
+ WHERE NOT EXISTS (SELECT 1 FROM replica_rooms r WHERE r.key = k.key)
540
+ AND NOT EXISTS (SELECT 1 FROM replica_erasing e WHERE e.key = k.key)
541
+ AND (${UNPARTED} OR NOT EXISTS (
542
+ SELECT 1 FROM replica_entries e WHERE e.key = k.key
543
+ UNION ALL SELECT 1 FROM replica_folders f WHERE f.key = k.key
544
+ ))`;
545
+ const STAGED = `SELECT DISTINCT k.locator FROM replica_keys k
546
+ WHERE NOT EXISTS (SELECT 1 FROM replica_rooms r WHERE r.key = k.key)
547
+ AND NOT EXISTS (SELECT 1 FROM replica_erasing e WHERE e.key = k.key)
548
+ AND k.key NOT IN (${ORPHANS})`;
480
549
  export function opened(connection) {
481
- const facts = {};
482
- for (const row of connection.rows('SELECT name, value FROM replica_facts')) {
483
- facts[text(row.name)] = text(row.value);
484
- }
485
550
  return {
486
- rooms: connection.rows(HELD_RECORDS).map((row) => ({
487
- locator: text(row.locator),
488
- key: number(row.key),
489
- record: text(row.record),
490
- })),
491
- keys: connection
492
- .rows('SELECT key, locator, transfer, rederiving FROM replica_keys')
493
- .map((row) => ({
494
- key: number(row.key),
495
- locator: text(row.locator),
496
- transfer: text(row.transfer),
497
- rederiving: cursor(row.rederiving),
498
- })),
499
- facts,
500
- presentation: connection.rows('SELECT app, value FROM replica_presentation').map((row) => ({
501
- app: text(row.app),
502
- value: text(row.value),
503
- })),
504
- overlaid: connection
505
- .rows(`SELECT key, path FROM replica_entries WHERE layer = ${OVERLAY}`)
506
- .map((row) => ({ key: number(row.key), path: text(row.path) })),
507
- orphans: connection
508
- .rows(`SELECT k.key FROM replica_keys k
509
- WHERE NOT EXISTS (SELECT 1 FROM replica_rooms r WHERE r.key = k.key)
510
- AND NOT EXISTS (SELECT 1 FROM replica_erasing e WHERE e.key = k.key)`)
511
- .map((row) => number(row.key)),
512
- erasing: connection.rows('SELECT key, locator FROM replica_erasing').map((row) => ({
513
- key: number(row.key),
514
- locator: text(row.locator),
515
- })),
551
+ orphans: connection.rows(ORPHANS).map((row) => number(row.key)),
552
+ erasing: connection.rows('SELECT 1 FROM replica_erasing LIMIT 1').length > 0,
516
553
  };
517
554
  }
555
+ const ROOM_ROWS = `SELECT h.locator, h.key, h.record, r.documents, k.rederiving IS NULL AS indexed
556
+ FROM (${HELD_RECORDS}) h
557
+ JOIN replica_rooms r ON r.locator = h.locator
558
+ LEFT JOIN replica_keys k ON k.key = h.key`;
559
+ function roomRow(row) {
560
+ return {
561
+ locator: text(row.locator),
562
+ key: number(row.key),
563
+ record: text(row.record),
564
+ indexed: number(row.indexed) === 1,
565
+ documents: number(row.documents),
566
+ };
567
+ }
568
+ export function heldRooms(connection, locators) {
569
+ return (locators === null
570
+ ? connection.rows(`${ROOM_ROWS} ORDER BY h.locator`)
571
+ : connection.rows(`${ROOM_ROWS} WHERE h.locator IN (SELECT value FROM json_each(?)) ORDER BY h.locator`, [JSON.stringify(locators)])).map(roomRow);
572
+ }
573
+ export function heldRoom(connection, locator) {
574
+ return heldRooms(connection, [locator])[0] ?? null;
575
+ }
576
+ export function overlaid(connection, key) {
577
+ return connection
578
+ .rows(`SELECT path FROM replica_entries WHERE key = ? AND layer = ${OVERLAY}`, [key])
579
+ .map((row) => text(row.path));
580
+ }
581
+ export function covering(connection) {
582
+ return connection
583
+ .rows(`SELECT r.locator, r.key, r.documents, json_extract(r.record, '$.transfer') AS transfer,
584
+ json_extract(r.record, '$.roomVersion') AS room_version,
585
+ coalesce(json_extract(r.record, '$.inventory.bytes'), 0) AS bytes,
586
+ json_extract(r.record, '$.replica.offline') AS offline,
587
+ k.rederiving IS NULL AS indexed
588
+ FROM replica_rooms r LEFT JOIN replica_keys k ON k.key = r.key ORDER BY r.locator`)
589
+ .map((row) => ({
590
+ locator: text(row.locator),
591
+ key: number(row.key),
592
+ transfer: text(row.transfer),
593
+ roomVersion: text(row.room_version),
594
+ indexed: number(row.indexed) === 1,
595
+ documents: number(row.documents),
596
+ bytes: number(row.bytes),
597
+ offline: text(row.offline),
598
+ }));
599
+ }
600
+ export function offlineMode(connection, locator) {
601
+ const [held] = connection.rows("SELECT json_extract(record, '$.replica.offline') AS offline FROM replica_rooms WHERE locator = ?", [locator]);
602
+ return text(held?.offline);
603
+ }
604
+ export function stagedLocators(connection) {
605
+ return connection.rows(STAGED).map((row) => text(row.locator));
606
+ }
607
+ export function heldLocators(connection) {
608
+ return connection
609
+ .rows(`SELECT locator FROM replica_rooms
610
+ UNION SELECT locator FROM authored_room_drafts
611
+ UNION SELECT locator FROM authored_queues
612
+ UNION ${STAGED}`)
613
+ .map((row) => text(row.locator));
614
+ }
615
+ export function demoted(connection) {
616
+ connection.run(`UPDATE replica_rooms SET record = json_set(record, '$.model.status', 'cached')
617
+ WHERE json_extract(record, '$.model.status') = 'current'`);
618
+ return null;
619
+ }
620
+ export function facts(connection) {
621
+ const held = {};
622
+ for (const row of connection.rows('SELECT name, value FROM replica_facts')) {
623
+ held[text(row.name)] = text(row.value);
624
+ }
625
+ return held;
626
+ }
627
+ export function presentation(connection, app) {
628
+ const [held] = connection.rows('SELECT value FROM replica_presentation WHERE app = ?', [app]);
629
+ return text(held?.value);
630
+ }
518
631
  export function ended(connection) {
519
632
  for (const statement of REPLICA_TABLES) {
520
633
  const table = /^CREATE TABLE (\w+)/u.exec(statement)?.[1];