@opendatalabs/personal-server-ts-server 1.33.8 → 1.34.1

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 (167) hide show
  1. package/dist/__fixtures__/bound-record-store.d.ts +19 -0
  2. package/dist/__fixtures__/bound-record-store.d.ts.map +1 -0
  3. package/dist/__fixtures__/bound-record-store.js +60 -0
  4. package/dist/__fixtures__/bound-record-store.js.map +1 -0
  5. package/dist/__fixtures__/cg-pdpp-client/pdpp-authorization-strategy.d.ts +41 -0
  6. package/dist/__fixtures__/cg-pdpp-client/pdpp-authorization-strategy.d.ts.map +1 -0
  7. package/dist/__fixtures__/cg-pdpp-client/pdpp-authorization-strategy.js +34 -0
  8. package/dist/__fixtures__/cg-pdpp-client/pdpp-authorization-strategy.js.map +1 -0
  9. package/dist/__fixtures__/cg-pdpp-client/pdpp-context-client.d.ts +112 -0
  10. package/dist/__fixtures__/cg-pdpp-client/pdpp-context-client.d.ts.map +1 -0
  11. package/dist/__fixtures__/cg-pdpp-client/pdpp-context-client.js +226 -0
  12. package/dist/__fixtures__/cg-pdpp-client/pdpp-context-client.js.map +1 -0
  13. package/dist/__fixtures__/cg-pdpp-client/pdpp-types.d.ts +135 -0
  14. package/dist/__fixtures__/cg-pdpp-client/pdpp-types.d.ts.map +1 -0
  15. package/dist/__fixtures__/cg-pdpp-client/pdpp-types.js +21 -0
  16. package/dist/__fixtures__/cg-pdpp-client/pdpp-types.js.map +1 -0
  17. package/dist/api-auth.d.ts +18 -2
  18. package/dist/api-auth.d.ts.map +1 -1
  19. package/dist/api-auth.js +114 -22
  20. package/dist/api-auth.js.map +1 -1
  21. package/dist/app.d.ts +60 -1
  22. package/dist/app.d.ts.map +1 -1
  23. package/dist/app.js +139 -1
  24. package/dist/app.js.map +1 -1
  25. package/dist/bootstrap.d.ts +10 -0
  26. package/dist/bootstrap.d.ts.map +1 -1
  27. package/dist/bootstrap.js +359 -8
  28. package/dist/bootstrap.js.map +1 -1
  29. package/dist/enclave-main.d.ts +4 -0
  30. package/dist/enclave-main.d.ts.map +1 -1
  31. package/dist/enclave-main.js +152 -1
  32. package/dist/enclave-main.js.map +1 -1
  33. package/dist/middleware/body-limit.d.ts +1 -1
  34. package/dist/middleware/body-limit.d.ts.map +1 -1
  35. package/dist/middleware/body-limit.js +8 -3
  36. package/dist/middleware/body-limit.js.map +1 -1
  37. package/dist/middleware/cors.d.ts.map +1 -1
  38. package/dist/middleware/cors.js +1 -0
  39. package/dist/middleware/cors.js.map +1 -1
  40. package/dist/package.json +9 -1
  41. package/dist/pdpp/bootstrap.d.ts +72 -0
  42. package/dist/pdpp/bootstrap.d.ts.map +1 -0
  43. package/dist/pdpp/bootstrap.js +270 -0
  44. package/dist/pdpp/bootstrap.js.map +1 -0
  45. package/dist/pdpp/chain-enforcement.d.ts +95 -0
  46. package/dist/pdpp/chain-enforcement.d.ts.map +1 -0
  47. package/dist/pdpp/chain-enforcement.js +145 -0
  48. package/dist/pdpp/chain-enforcement.js.map +1 -0
  49. package/dist/pdpp/client-document-fetch.d.ts +63 -0
  50. package/dist/pdpp/client-document-fetch.d.ts.map +1 -0
  51. package/dist/pdpp/client-document-fetch.js +254 -0
  52. package/dist/pdpp/client-document-fetch.js.map +1 -0
  53. package/dist/pdpp/declaration-registry.d.ts +83 -0
  54. package/dist/pdpp/declaration-registry.d.ts.map +1 -0
  55. package/dist/pdpp/declaration-registry.js +251 -0
  56. package/dist/pdpp/declaration-registry.js.map +1 -0
  57. package/dist/pdpp/deployment.d.ts +70 -0
  58. package/dist/pdpp/deployment.d.ts.map +1 -0
  59. package/dist/pdpp/deployment.js +104 -0
  60. package/dist/pdpp/deployment.js.map +1 -0
  61. package/dist/pdpp/record-schema.d.ts +2 -0
  62. package/dist/pdpp/record-schema.d.ts.map +1 -0
  63. package/dist/pdpp/record-schema.js +2 -0
  64. package/dist/pdpp/record-schema.js.map +1 -0
  65. package/dist/pdpp/records-bootstrap.d.ts +111 -0
  66. package/dist/pdpp/records-bootstrap.d.ts.map +1 -0
  67. package/dist/pdpp/records-bootstrap.js +353 -0
  68. package/dist/pdpp/records-bootstrap.js.map +1 -0
  69. package/dist/pdpp/source-id-compat.d.ts +5 -0
  70. package/dist/pdpp/source-id-compat.d.ts.map +1 -0
  71. package/dist/pdpp/source-id-compat.js +16 -0
  72. package/dist/pdpp/source-id-compat.js.map +1 -0
  73. package/dist/pdpp/test-connections.d.ts +6 -0
  74. package/dist/pdpp/test-connections.d.ts.map +1 -0
  75. package/dist/pdpp/test-connections.js +37 -0
  76. package/dist/pdpp/test-connections.js.map +1 -0
  77. package/dist/routes/auth-device.d.ts.map +1 -1
  78. package/dist/routes/auth-device.js +3 -0
  79. package/dist/routes/auth-device.js.map +1 -1
  80. package/dist/routes/chunked-scope-import.d.ts +41 -0
  81. package/dist/routes/chunked-scope-import.d.ts.map +1 -0
  82. package/dist/routes/chunked-scope-import.js +901 -0
  83. package/dist/routes/chunked-scope-import.js.map +1 -0
  84. package/dist/routes/data.d.ts +23 -1
  85. package/dist/routes/data.d.ts.map +1 -1
  86. package/dist/routes/data.js +112 -1
  87. package/dist/routes/data.js.map +1 -1
  88. package/dist/routes/grants.d.ts.map +1 -1
  89. package/dist/routes/grants.js +2 -0
  90. package/dist/routes/grants.js.map +1 -1
  91. package/dist/routes/mcp.d.ts.map +1 -1
  92. package/dist/routes/mcp.js +3 -0
  93. package/dist/routes/mcp.js.map +1 -1
  94. package/dist/routes/pdpp-auth.d.ts +157 -0
  95. package/dist/routes/pdpp-auth.d.ts.map +1 -0
  96. package/dist/routes/pdpp-auth.js +953 -0
  97. package/dist/routes/pdpp-auth.js.map +1 -0
  98. package/dist/routes/pdpp-blobs.d.ts +26 -0
  99. package/dist/routes/pdpp-blobs.d.ts.map +1 -0
  100. package/dist/routes/pdpp-blobs.js +179 -0
  101. package/dist/routes/pdpp-blobs.js.map +1 -0
  102. package/dist/routes/pdpp-connections.d.ts +28 -0
  103. package/dist/routes/pdpp-connections.d.ts.map +1 -0
  104. package/dist/routes/pdpp-connections.js +144 -0
  105. package/dist/routes/pdpp-connections.js.map +1 -0
  106. package/dist/routes/pdpp-declarations.d.ts +58 -0
  107. package/dist/routes/pdpp-declarations.d.ts.map +1 -0
  108. package/dist/routes/pdpp-declarations.js +94 -0
  109. package/dist/routes/pdpp-declarations.js.map +1 -0
  110. package/dist/routes/pdpp-instance-bindings.d.ts +26 -0
  111. package/dist/routes/pdpp-instance-bindings.d.ts.map +1 -0
  112. package/dist/routes/pdpp-instance-bindings.js +124 -0
  113. package/dist/routes/pdpp-instance-bindings.js.map +1 -0
  114. package/dist/routes/pdpp-records.d.ts +158 -0
  115. package/dist/routes/pdpp-records.d.ts.map +1 -0
  116. package/dist/routes/pdpp-records.js +1537 -0
  117. package/dist/routes/pdpp-records.js.map +1 -0
  118. package/dist/routes/pdpp-well-known.d.ts +13 -0
  119. package/dist/routes/pdpp-well-known.d.ts.map +1 -0
  120. package/dist/routes/pdpp-well-known.js +20 -0
  121. package/dist/routes/pdpp-well-known.js.map +1 -0
  122. package/dist/storage/declaration-witness.d.ts +56 -0
  123. package/dist/storage/declaration-witness.d.ts.map +1 -0
  124. package/dist/storage/declaration-witness.js +273 -0
  125. package/dist/storage/declaration-witness.js.map +1 -0
  126. package/dist/storage/hierarchy.d.ts +25 -1
  127. package/dist/storage/hierarchy.d.ts.map +1 -1
  128. package/dist/storage/hierarchy.js +210 -16
  129. package/dist/storage/hierarchy.js.map +1 -1
  130. package/dist/storage/import-operations.d.ts +11 -0
  131. package/dist/storage/import-operations.d.ts.map +1 -0
  132. package/dist/storage/import-operations.js +261 -0
  133. package/dist/storage/import-operations.js.map +1 -0
  134. package/dist/storage/index-manager.d.ts +24 -2
  135. package/dist/storage/index-manager.d.ts.map +1 -1
  136. package/dist/storage/index-manager.js +279 -30
  137. package/dist/storage/index-manager.js.map +1 -1
  138. package/dist/storage/index-schema.d.ts +1 -1
  139. package/dist/storage/index-schema.d.ts.map +1 -1
  140. package/dist/storage/index-schema.js +189 -8
  141. package/dist/storage/index-schema.js.map +1 -1
  142. package/dist/storage/legacy-scope-authority.d.ts +14 -0
  143. package/dist/storage/legacy-scope-authority.d.ts.map +1 -0
  144. package/dist/storage/legacy-scope-authority.js +298 -0
  145. package/dist/storage/legacy-scope-authority.js.map +1 -0
  146. package/dist/storage/node-data-storage.d.ts +6 -0
  147. package/dist/storage/node-data-storage.d.ts.map +1 -1
  148. package/dist/storage/node-data-storage.js +161 -2
  149. package/dist/storage/node-data-storage.js.map +1 -1
  150. package/dist/storage/pdpp-grant-binding-sqlite-store.d.ts +17 -0
  151. package/dist/storage/pdpp-grant-binding-sqlite-store.d.ts.map +1 -0
  152. package/dist/storage/pdpp-grant-binding-sqlite-store.js +159 -0
  153. package/dist/storage/pdpp-grant-binding-sqlite-store.js.map +1 -0
  154. package/dist/storage/pdpp-records-sqlite-store.d.ts +112 -0
  155. package/dist/storage/pdpp-records-sqlite-store.d.ts.map +1 -0
  156. package/dist/storage/pdpp-records-sqlite-store.js +1440 -0
  157. package/dist/storage/pdpp-records-sqlite-store.js.map +1 -0
  158. package/dist/storage/pdpp-stream-completion.d.ts +5 -0
  159. package/dist/storage/pdpp-stream-completion.d.ts.map +1 -0
  160. package/dist/storage/pdpp-stream-completion.js +10 -0
  161. package/dist/storage/pdpp-stream-completion.js.map +1 -0
  162. package/dist/storage/scope-deletion-history.d.ts +8 -0
  163. package/dist/storage/scope-deletion-history.d.ts.map +1 -0
  164. package/dist/storage/scope-deletion-history.js +40 -0
  165. package/dist/storage/scope-deletion-history.js.map +1 -0
  166. package/dist/ui/ps-lite-debug.js +3981 -1109
  167. package/package.json +12 -4
@@ -10,8 +10,17 @@ CREATE TABLE IF NOT EXISTS data_files (
10
10
  created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
11
11
  size_bytes INTEGER NOT NULL DEFAULT 0,
12
12
  version INTEGER NOT NULL DEFAULT 1,
13
+ cas_revision INTEGER NOT NULL DEFAULT 1,
13
14
  data_point_id TEXT,
14
- after_tombstone_version INTEGER
15
+ after_tombstone_version INTEGER,
16
+ producer TEXT,
17
+ producer_provenance TEXT
18
+ )`;
19
+ const CREATE_SCOPE_REVISIONS_SQL = `
20
+ CREATE TABLE IF NOT EXISTS scope_revisions (
21
+ scope TEXT PRIMARY KEY,
22
+ cas_revision INTEGER NOT NULL,
23
+ closed_for_writes INTEGER NOT NULL DEFAULT 0
15
24
  )`;
16
25
  const CREATE_INDEXES_SQL = [
17
26
  "CREATE INDEX IF NOT EXISTS idx_data_files_scope ON data_files (scope)",
@@ -19,12 +28,53 @@ const CREATE_INDEXES_SQL = [
19
28
  "CREATE INDEX IF NOT EXISTS idx_data_files_file_id ON data_files (file_id)",
20
29
  "CREATE INDEX IF NOT EXISTS idx_data_files_schema_id ON data_files (schema_id)",
21
30
  "CREATE INDEX IF NOT EXISTS idx_data_files_data_point_id ON data_files (data_point_id)",
31
+ "CREATE INDEX IF NOT EXISTS idx_data_files_scope_cas_revision ON data_files (scope, cas_revision)",
22
32
  ];
23
- export const INDEX_SCHEMA_VERSION = 4;
33
+ export const INDEX_SCHEMA_VERSION = 14;
34
+ const CREATE_LEGACY_SCOPE_TAKEOVERS_SQL = `
35
+ CREATE TABLE IF NOT EXISTS legacy_scope_takeovers (
36
+ scope TEXT NOT NULL,
37
+ instance TEXT NOT NULL DEFAULT '',
38
+ generation INTEGER NOT NULL DEFAULT 1,
39
+ superseded_version INTEGER NOT NULL,
40
+ superseded_cas_revision INTEGER NOT NULL,
41
+ superseded_collected_at TEXT NOT NULL,
42
+ superseded_path TEXT NOT NULL,
43
+ taken_over_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
44
+ PRIMARY KEY (scope, instance, generation, superseded_path)
45
+ )`;
46
+ const CREATE_LEGACY_SCOPE_VERDICTS_SQL = `
47
+ CREATE TABLE IF NOT EXISTS legacy_scope_takeover_verdicts (
48
+ scope TEXT NOT NULL,
49
+ instance TEXT NOT NULL,
50
+ generation INTEGER NOT NULL DEFAULT 1,
51
+ legacy_version_id INTEGER NOT NULL,
52
+ canonical_cursor TEXT NOT NULL,
53
+ verdict TEXT NOT NULL CHECK (verdict IN ('covered', 'not_covered')),
54
+ comparison_case TEXT NOT NULL,
55
+ reason_counts_json TEXT NOT NULL,
56
+ applied_exceptions_json TEXT NOT NULL,
57
+ reason_json TEXT,
58
+ legacy_bytes INTEGER NOT NULL,
59
+ canonical_bytes INTEGER NOT NULL,
60
+ byte_delta INTEGER NOT NULL,
61
+ evaluated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
62
+ PRIMARY KEY (scope, instance, generation)
63
+ )`;
64
+ const CREATE_LEGACY_SCOPE_RESETS_SQL = `
65
+ CREATE TABLE IF NOT EXISTS legacy_scope_takeover_resets (
66
+ scope TEXT PRIMARY KEY,
67
+ reset_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
68
+ )`;
24
69
  function hasColumn(db, table, column) {
25
70
  const rows = db.pragma(`table_info(${table})`);
26
71
  return rows.some((row) => row.name === column);
27
72
  }
73
+ function hasTable(db, table) {
74
+ return (db
75
+ .prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?")
76
+ .get(table) !== undefined);
77
+ }
28
78
  function migrateSchema(db, currentVersion) {
29
79
  if (currentVersion < 2 && !hasColumn(db, "data_files", "schema_id")) {
30
80
  db.exec("ALTER TABLE data_files ADD COLUMN schema_id TEXT");
@@ -46,6 +96,94 @@ function migrateSchema(db, currentVersion) {
46
96
  // existed can claim to post-date a tombstone.
47
97
  db.exec("ALTER TABLE data_files ADD COLUMN after_tombstone_version INTEGER");
48
98
  }
99
+ // `< 6`, not `< 5`: owner-import builds stamped version 5 without these
100
+ // columns, so a version-5 database cannot be trusted to have them.
101
+ if (currentVersion < 6) {
102
+ if (!hasColumn(db, "data_files", "producer")) {
103
+ db.exec("ALTER TABLE data_files ADD COLUMN producer TEXT");
104
+ }
105
+ if (!hasColumn(db, "data_files", "producer_provenance")) {
106
+ db.exec("ALTER TABLE data_files ADD COLUMN producer_provenance TEXT");
107
+ }
108
+ }
109
+ if (currentVersion < 6) {
110
+ if (!hasColumn(db, "data_files", "cas_revision")) {
111
+ db.exec("ALTER TABLE data_files ADD COLUMN cas_revision INTEGER NOT NULL DEFAULT 1");
112
+ db.exec("UPDATE data_files SET cas_revision = version");
113
+ }
114
+ db.exec(CREATE_SCOPE_REVISIONS_SQL);
115
+ db.exec(`
116
+ INSERT OR IGNORE INTO scope_revisions (scope, cas_revision)
117
+ SELECT scope, MAX(cas_revision) FROM data_files GROUP BY scope
118
+ `);
119
+ }
120
+ if (currentVersion < 7 &&
121
+ !hasColumn(db, "scope_revisions", "closed_for_writes")) {
122
+ db.exec("ALTER TABLE scope_revisions ADD COLUMN closed_for_writes INTEGER NOT NULL DEFAULT 0");
123
+ }
124
+ if (currentVersion < 10 &&
125
+ !hasColumn(db, "legacy_scope_takeovers", "instance")) {
126
+ db.exec("ALTER TABLE legacy_scope_takeovers ADD COLUMN instance TEXT");
127
+ }
128
+ if (currentVersion < 11 &&
129
+ !hasColumn(db, "legacy_scope_takeover_verdicts", "comparison_case")) {
130
+ db.exec("ALTER TABLE legacy_scope_takeover_verdicts ADD COLUMN comparison_case TEXT NOT NULL DEFAULT 'same_time'");
131
+ }
132
+ if (currentVersion < 11 &&
133
+ !hasColumn(db, "legacy_scope_takeover_verdicts", "reason_counts_json")) {
134
+ db.exec("ALTER TABLE legacy_scope_takeover_verdicts ADD COLUMN reason_counts_json TEXT NOT NULL DEFAULT '{}'");
135
+ }
136
+ if (currentVersion < 12 &&
137
+ !hasColumn(db, "legacy_scope_takeover_verdicts", "applied_exceptions_json")) {
138
+ db.exec("ALTER TABLE legacy_scope_takeover_verdicts ADD COLUMN applied_exceptions_json TEXT NOT NULL DEFAULT '[]'");
139
+ }
140
+ if (currentVersion < 13) {
141
+ const columns = db.pragma("table_info(legacy_scope_takeovers)");
142
+ if (columns.find((column) => column.name === "instance")?.pk !== 2) {
143
+ db.transaction(() => {
144
+ db.exec("ALTER TABLE legacy_scope_takeovers RENAME TO legacy_scope_takeovers_old");
145
+ db.exec(CREATE_LEGACY_SCOPE_TAKEOVERS_SQL);
146
+ db.exec(`INSERT INTO legacy_scope_takeovers
147
+ (scope, instance, superseded_version, superseded_cas_revision,
148
+ superseded_collected_at, superseded_path, taken_over_at)
149
+ SELECT scope, COALESCE(instance, ''), superseded_version,
150
+ superseded_cas_revision, superseded_collected_at,
151
+ superseded_path, taken_over_at
152
+ FROM legacy_scope_takeovers_old`);
153
+ db.exec("DROP TABLE legacy_scope_takeovers_old");
154
+ })();
155
+ }
156
+ }
157
+ if (currentVersion < 14) {
158
+ db.transaction(() => {
159
+ db.exec("ALTER TABLE legacy_scope_takeovers RENAME TO legacy_scope_takeovers_old");
160
+ db.exec(CREATE_LEGACY_SCOPE_TAKEOVERS_SQL);
161
+ const takeoverGeneration = hasTable(db, "pdpp_instance_binding")
162
+ ? "COALESCE((SELECT generation FROM pdpp_instance_binding WHERE instance = legacy_scope_takeovers_old.instance), 1)"
163
+ : "1";
164
+ db.exec(`INSERT INTO legacy_scope_takeovers
165
+ (scope, instance, generation, superseded_version, superseded_cas_revision,
166
+ superseded_collected_at, superseded_path, taken_over_at)
167
+ SELECT scope, instance, ${takeoverGeneration}, superseded_version, superseded_cas_revision,
168
+ superseded_collected_at, superseded_path, taken_over_at
169
+ FROM legacy_scope_takeovers_old`);
170
+ db.exec("DROP TABLE legacy_scope_takeovers_old");
171
+ db.exec("ALTER TABLE legacy_scope_takeover_verdicts RENAME TO legacy_scope_takeover_verdicts_old");
172
+ db.exec(CREATE_LEGACY_SCOPE_VERDICTS_SQL);
173
+ const verdictGeneration = hasTable(db, "pdpp_instance_binding")
174
+ ? "COALESCE((SELECT generation FROM pdpp_instance_binding WHERE instance = legacy_scope_takeover_verdicts_old.instance), 1)"
175
+ : "1";
176
+ db.exec(`INSERT INTO legacy_scope_takeover_verdicts
177
+ (scope, instance, generation, legacy_version_id, canonical_cursor,
178
+ verdict, comparison_case, reason_counts_json, applied_exceptions_json,
179
+ reason_json, legacy_bytes, canonical_bytes, byte_delta, evaluated_at)
180
+ SELECT scope, instance, ${verdictGeneration}, legacy_version_id, canonical_cursor, verdict,
181
+ comparison_case, reason_counts_json, applied_exceptions_json,
182
+ reason_json, legacy_bytes, canonical_bytes, byte_delta, evaluated_at
183
+ FROM legacy_scope_takeover_verdicts_old`);
184
+ db.exec("DROP TABLE legacy_scope_takeover_verdicts_old");
185
+ })();
186
+ }
49
187
  }
50
188
  function ensureSchemaVersion(db) {
51
189
  const currentVersion = db.pragma("user_version", { simple: true });
@@ -58,12 +196,55 @@ function ensureSchemaVersion(db) {
58
196
  /** Open/create SQLite database, run CREATE TABLE IF NOT EXISTS, set WAL mode */
59
197
  export function initializeDatabase(dbPath) {
60
198
  const db = new Database(dbPath);
61
- db.pragma("journal_mode = WAL");
62
- db.exec(CREATE_TABLE_SQL);
63
- ensureSchemaVersion(db);
64
- for (const sql of CREATE_INDEXES_SQL) {
65
- db.exec(sql);
199
+ try {
200
+ db.pragma("busy_timeout = 5000");
201
+ const deadline = performance.now() + 5000;
202
+ const pause = new Int32Array(new SharedArrayBuffer(4));
203
+ for (;;) {
204
+ try {
205
+ if (db.pragma("journal_mode", { simple: true }) !== "wal") {
206
+ db.pragma("journal_mode = WAL");
207
+ }
208
+ break;
209
+ }
210
+ catch (err) {
211
+ if (err.code !== "SQLITE_BUSY" ||
212
+ performance.now() >= deadline)
213
+ throw err;
214
+ Atomics.wait(pause, 0, 0, Math.min(50, deadline - performance.now()));
215
+ }
216
+ }
217
+ db.pragma("synchronous = FULL");
218
+ db.exec(CREATE_TABLE_SQL);
219
+ db.exec(CREATE_SCOPE_REVISIONS_SQL);
220
+ db.exec(CREATE_LEGACY_SCOPE_TAKEOVERS_SQL);
221
+ db.exec(CREATE_LEGACY_SCOPE_VERDICTS_SQL);
222
+ db.exec(CREATE_LEGACY_SCOPE_RESETS_SQL);
223
+ ensureSchemaVersion(db);
224
+ db.exec(`CREATE TABLE IF NOT EXISTS owner_import_operations (
225
+ authority TEXT NOT NULL,
226
+ owner TEXT NOT NULL,
227
+ scope TEXT NOT NULL,
228
+ operation TEXT NOT NULL,
229
+ body_sha256 TEXT NOT NULL,
230
+ state TEXT NOT NULL CHECK(state IN ('prepared', 'accepted', 'deleted', 'cancelled')),
231
+ collected_at TEXT NOT NULL,
232
+ path TEXT NOT NULL,
233
+ envelope_bytes BLOB,
234
+ metadata_json TEXT,
235
+ receipt_json TEXT,
236
+ PRIMARY KEY(authority, owner, scope, operation)
237
+ )`);
238
+ db.exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_owner_import_operations_path ON owner_import_operations(path)");
239
+ db.exec("CREATE INDEX IF NOT EXISTS idx_owner_import_operations_recovery ON owner_import_operations(operation) WHERE state = 'prepared' OR (state IN ('deleted', 'cancelled') AND metadata_json IS NOT NULL)");
240
+ for (const sql of CREATE_INDEXES_SQL) {
241
+ db.exec(sql);
242
+ }
243
+ return db;
244
+ }
245
+ catch (err) {
246
+ db.close();
247
+ throw err;
66
248
  }
67
- return db;
68
249
  }
69
250
  //# sourceMappingURL=index-schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-schema.js","sourceRoot":"","sources":["../../src/storage/index-schema.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;EAavB,CAAC;AAEH,MAAM,kBAAkB,GAAG;IACzB,uEAAuE;IACvE,qFAAqF;IACrF,2EAA2E;IAC3E,+EAA+E;IAC/E,uFAAuF;CACxF,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAEtC,SAAS,SAAS,CAChB,EAAqB,EACrB,KAAa,EACb,MAAc;IAEd,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,KAAK,GAAG,CAA4B,CAAC;IAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,aAAa,CAAC,EAAqB,EAAE,cAAsB;IAClE,IAAI,cAAc,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC;QACpE,EAAE,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,CAAC;YAC5C,oEAAoE;YACpE,sEAAsE;YACtE,oDAAoD;YACpD,EAAE,CAAC,IAAI,CACL,sEAAsE,CACvE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,eAAe,CAAC,EAAE,CAAC;YAClD,EAAE,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IACD,IACE,cAAc,GAAG,CAAC;QAClB,CAAC,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,yBAAyB,CAAC,EACvD,CAAC;QACD,mEAAmE;QACnE,8CAA8C;QAC9C,EAAE,CAAC,IAAI,CACL,mEAAmE,CACpE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAqB;IAChD,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAW,CAAC;IAC7E,IAAI,cAAc,GAAG,oBAAoB,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,uCAAuC,cAAc,sBAAsB,oBAAoB,EAAE,CAClG,CAAC;IACJ,CAAC;IACD,aAAa,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IAClC,EAAE,CAAC,MAAM,CAAC,kBAAkB,oBAAoB,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEhC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC1B,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACxB,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACrC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"index-schema.js","sourceRoot":"","sources":["../../src/storage/index-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Database } from "better-sqlite3";
2
+ import type { LegacyScopeAuthority } from "@opendatalabs/personal-server-ts-core/storage/legacy-scope-view";
3
+ /**
4
+ * Registry facts for the legacy scope view, plus its durable takeover ledger.
5
+ * It does not open the record store: opening it migrates and sweeps, and this
6
+ * must also answer when PDPP is disabled. A table that was never created
7
+ * holds no connection and no evidence.
8
+ *
9
+ * It shares the record store's database connection, so its reads inside
10
+ * `readSnapshot` see that same snapshot. Takeover writes only the separate
11
+ * diagnostic ledger; it never changes the legacy index or its files.
12
+ */
13
+ export declare function createLegacyScopeAuthority(db: Database): LegacyScopeAuthority;
14
+ //# sourceMappingURL=legacy-scope-authority.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-scope-authority.d.ts","sourceRoot":"","sources":["../../src/storage/legacy-scope-authority.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EACV,oBAAoB,EAGrB,MAAM,iEAAiE,CAAC;AAmDzE;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,QAAQ,GAAG,oBAAoB,CA+W7E"}
@@ -0,0 +1,298 @@
1
+ function reasonForRow(row) {
2
+ return row.reason_json
3
+ ? JSON.parse(row.reason_json)
4
+ : null;
5
+ }
6
+ function coverageFromRow(row) {
7
+ const reason = reasonForRow(row);
8
+ return {
9
+ covered: row.verdict === "covered",
10
+ comparisonCase: row.comparison_case,
11
+ reasonCounts: JSON.parse(row.reason_counts_json),
12
+ appliedExceptions: JSON.parse(row.applied_exceptions_json),
13
+ reason: (row.verdict === "covered"
14
+ ? null
15
+ : (reason?.reason ?? null)),
16
+ missingEntityCount: reason?.missingEntityCount ?? 0,
17
+ mismatchedFieldPaths: reason?.mismatchedFieldPaths ?? [],
18
+ legacyBytes: row.legacy_bytes,
19
+ canonicalBytes: row.canonical_bytes,
20
+ byteDelta: row.byte_delta,
21
+ };
22
+ }
23
+ /**
24
+ * Registry facts for the legacy scope view, plus its durable takeover ledger.
25
+ * It does not open the record store: opening it migrates and sweeps, and this
26
+ * must also answer when PDPP is disabled. A table that was never created
27
+ * holds no connection and no evidence.
28
+ *
29
+ * It shares the record store's database connection, so its reads inside
30
+ * `readSnapshot` see that same snapshot. Takeover writes only the separate
31
+ * diagnostic ledger; it never changes the legacy index or its files.
32
+ */
33
+ export function createLegacyScopeAuthority(db) {
34
+ const hasTable = (name) => db
35
+ .prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?")
36
+ .get(name) !== undefined;
37
+ const isReset = (scope) => hasTable("legacy_scope_takeover_resets") &&
38
+ db
39
+ .prepare("SELECT 1 FROM legacy_scope_takeover_resets WHERE scope = ?")
40
+ .get(scope) !== undefined;
41
+ return {
42
+ listMethodConnections(methods) {
43
+ if (methods.length === 0 || !hasTable("pdpp_instance_binding")) {
44
+ return [];
45
+ }
46
+ // `listConnections` hides deleted connections; a deleted one is still
47
+ // evidence that the scope's data lived in the registry.
48
+ const rows = db
49
+ .prepare(`SELECT * FROM pdpp_instance_binding
50
+ WHERE method IN (${methods.map(() => "?").join(", ")})
51
+ ORDER BY instance`)
52
+ .all(...methods);
53
+ return rows.map((row) => ({
54
+ instance: row.instance,
55
+ sourceId: row.source_id ?? null,
56
+ method: row.method,
57
+ deletedAt: row.deleted_at ?? null,
58
+ generation: row.generation,
59
+ resetClock: row.reset_clock,
60
+ }));
61
+ },
62
+ hasHeldData(instance, streams) {
63
+ if (streams?.length === 0)
64
+ return false;
65
+ const streamFilter = streams
66
+ ? ` AND stream IN (${streams.map(() => "?").join(", ")})`
67
+ : "";
68
+ const tables = [
69
+ "pdpp_records",
70
+ "pdpp_record_changes",
71
+ "pdpp_stream_completion",
72
+ ].filter(hasTable);
73
+ return tables.some((table) => db
74
+ .prepare(`SELECT 1 FROM ${table} WHERE instance = ?${streamFilter} LIMIT 1`)
75
+ .get(instance, ...(streams ?? [])) !== undefined);
76
+ },
77
+ readSnapshot: (read) => db.transaction(read).deferred(),
78
+ writeClock() {
79
+ if (!hasTable("pdpp_write_clock"))
80
+ return 0;
81
+ return (db
82
+ .prepare("SELECT value FROM pdpp_write_clock WHERE id = 1")
83
+ .get()?.value ?? 0);
84
+ },
85
+ arrivalRevision() {
86
+ if (!hasTable("pdpp_record_arrival_clock"))
87
+ return 0;
88
+ return (db
89
+ .prepare("SELECT value FROM pdpp_record_arrival_clock WHERE id = 1")
90
+ .get()?.value ?? 0);
91
+ },
92
+ hasTakeover(scope, instance, generation) {
93
+ const instanceFilter = instance === undefined
94
+ ? ""
95
+ : generation === undefined
96
+ ? " AND (instance = ? OR instance = '')"
97
+ : " AND ((instance = ? AND generation = ?) OR instance = '')";
98
+ const params = instance === undefined
99
+ ? [scope]
100
+ : generation === undefined
101
+ ? [scope, instance]
102
+ : [scope, instance, generation];
103
+ return (hasTable("legacy_scope_takeovers") &&
104
+ db
105
+ .prepare(`SELECT 1 FROM legacy_scope_takeovers WHERE scope = ?${instanceFilter}`)
106
+ .get(...params) !== undefined);
107
+ },
108
+ hasCoveredHead(scope, head, instance) {
109
+ const instanceFilter = instance === undefined ? "" : " AND (instance = ? OR instance = '')";
110
+ const params = instance === undefined
111
+ ? [scope, head.path]
112
+ : [scope, head.path, instance];
113
+ return (hasTable("legacy_scope_takeovers") &&
114
+ db
115
+ .prepare(`SELECT 1 FROM legacy_scope_takeovers WHERE scope = ? AND superseded_path = ?${instanceFilter}`)
116
+ .get(...params) !== undefined);
117
+ },
118
+ isReset(scope) {
119
+ return isReset(scope);
120
+ },
121
+ cachedVerdict(scope, instance, generation, legacyVersionId, canonicalCursor) {
122
+ if (!hasTable("legacy_scope_takeover_verdicts"))
123
+ return null;
124
+ const row = db
125
+ .prepare(`SELECT * FROM legacy_scope_takeover_verdicts
126
+ WHERE scope = ? AND instance = ? AND generation = ? AND legacy_version_id = ? AND canonical_cursor = ?`)
127
+ .get(scope, instance, generation, legacyVersionId, canonicalCursor);
128
+ return row ? coverageFromRow(row) : null;
129
+ },
130
+ verdictFor(scope) {
131
+ if (!hasTable("legacy_scope_takeover_verdicts"))
132
+ return [];
133
+ const rows = db
134
+ .prepare("SELECT * FROM legacy_scope_takeover_verdicts WHERE scope = ? ORDER BY instance")
135
+ .all(scope);
136
+ return rows.map((row) => ({
137
+ scope: row.scope,
138
+ instance: row.instance,
139
+ generation: row.generation,
140
+ legacyVersionId: row.legacy_version_id,
141
+ canonicalCursor: row.canonical_cursor,
142
+ verdict: row.verdict,
143
+ comparisonCase: row.comparison_case,
144
+ reasonCounts: JSON.parse(row.reason_counts_json),
145
+ appliedExceptions: JSON.parse(row.applied_exceptions_json),
146
+ reason: reasonForRow(row),
147
+ legacyBytes: row.legacy_bytes,
148
+ canonicalBytes: row.canonical_bytes,
149
+ byteDelta: row.byte_delta,
150
+ evaluatedAt: row.evaluated_at,
151
+ }));
152
+ },
153
+ resetTakeover(scope) {
154
+ db.transaction(() => {
155
+ if (hasTable("legacy_scope_takeover_verdicts"))
156
+ db.prepare("DELETE FROM legacy_scope_takeover_verdicts WHERE scope = ?").run(scope);
157
+ if (hasTable("legacy_scope_takeovers"))
158
+ db.prepare("DELETE FROM legacy_scope_takeovers WHERE scope = ?").run(scope);
159
+ if (hasTable("legacy_scope_takeover_resets"))
160
+ db.prepare("INSERT OR REPLACE INTO legacy_scope_takeover_resets (scope) VALUES (?)").run(scope);
161
+ }).immediate();
162
+ },
163
+ eligibleLegacyHead(scope) {
164
+ return readEligibleLegacyHead(scope);
165
+ },
166
+ confirmRead(scope, expectedHead, selectionIsCurrent, verdict) {
167
+ if (!hasTable("data_files"))
168
+ return expectedHead === null;
169
+ const validate = () => {
170
+ if (isReset(scope))
171
+ return false;
172
+ const currentHead = readEligibleLegacyHead(scope);
173
+ if (!sameHead(currentHead, expectedHead) || !selectionIsCurrent()) {
174
+ return false;
175
+ }
176
+ if (verdict &&
177
+ verdict.writeClock !==
178
+ db
179
+ .prepare("SELECT value FROM pdpp_write_clock WHERE id = 1")
180
+ .get().value)
181
+ return false;
182
+ if (verdict &&
183
+ verdict.arrivalRevision !==
184
+ db
185
+ .prepare("SELECT value FROM pdpp_record_arrival_clock WHERE id = 1")
186
+ .get().value)
187
+ return false;
188
+ if (expectedHead === null)
189
+ return true;
190
+ if (verdict?.cached)
191
+ return true;
192
+ if (!hasTable("legacy_scope_takeovers"))
193
+ return false;
194
+ if (verdict) {
195
+ if (!hasTable("legacy_scope_takeover_verdicts"))
196
+ return false;
197
+ const coverage = verdict.coverage;
198
+ db.prepare(`INSERT INTO legacy_scope_takeover_verdicts
199
+ (scope, instance, generation, legacy_version_id, canonical_cursor, verdict, comparison_case, reason_counts_json, applied_exceptions_json, reason_json,
200
+ legacy_bytes, canonical_bytes, byte_delta)
201
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
202
+ ON CONFLICT(scope, instance, generation) DO UPDATE SET
203
+ legacy_version_id = excluded.legacy_version_id,
204
+ canonical_cursor = excluded.canonical_cursor,
205
+ verdict = excluded.verdict,
206
+ comparison_case = excluded.comparison_case,
207
+ reason_counts_json = excluded.reason_counts_json,
208
+ applied_exceptions_json = excluded.applied_exceptions_json,
209
+ reason_json = excluded.reason_json,
210
+ legacy_bytes = excluded.legacy_bytes,
211
+ canonical_bytes = excluded.canonical_bytes,
212
+ byte_delta = excluded.byte_delta,
213
+ evaluated_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now')
214
+ `).run(scope, verdict.instance, verdict.generation, expectedHead.id, verdict.canonicalCursor, coverage.covered ? "covered" : "not_covered", coverage.comparisonCase, JSON.stringify(coverage.reasonCounts), JSON.stringify(coverage.appliedExceptions), coverage.covered && coverage.missingEntityCount === 0
215
+ ? null
216
+ : JSON.stringify({
217
+ reason: coverage.covered
218
+ ? "proven_deletion"
219
+ : coverage.reason,
220
+ missingEntityCount: coverage.missingEntityCount,
221
+ mismatchedFieldPaths: coverage.mismatchedFieldPaths,
222
+ }), coverage.legacyBytes, coverage.canonicalBytes, coverage.byteDelta);
223
+ if (!coverage.covered)
224
+ return true;
225
+ db.prepare(`INSERT OR IGNORE INTO legacy_scope_takeovers
226
+ (scope, instance, generation, superseded_version, superseded_cas_revision, superseded_collected_at, superseded_path)
227
+ VALUES (?, ?, ?, ?, ?, ?, ?)`).run(scope, verdict.instance, verdict.generation, expectedHead.version, expectedHead.casRevision, expectedHead.collectedAt, expectedHead.path);
228
+ return true;
229
+ }
230
+ // A non-null producer is explicit ownership evidence from another
231
+ // legacy pipeline. Null covers manual and old connector files.
232
+ db.prepare(`
233
+ INSERT OR IGNORE INTO legacy_scope_takeovers (
234
+ scope, superseded_version, superseded_cas_revision,
235
+ superseded_collected_at, superseded_path
236
+ )
237
+ SELECT scope, version, cas_revision, collected_at, path
238
+ FROM data_files
239
+ WHERE scope = ?
240
+ AND (producer IS NULL OR producer NOT IN ('pdpp-projector', 'pdpp-import-projection'))
241
+ ORDER BY julianday(collected_at) DESC, id DESC
242
+ `).run(scope);
243
+ return true;
244
+ };
245
+ try {
246
+ return expectedHead === null || verdict?.cached
247
+ ? db.transaction(validate).deferred()
248
+ : db.transaction(validate).immediate();
249
+ }
250
+ catch (error) {
251
+ if (expectedHead !== null &&
252
+ typeof error === "object" &&
253
+ error !== null &&
254
+ "code" in error &&
255
+ (error.code === "SQLITE_BUSY" || error.code === "SQLITE_LOCKED")) {
256
+ return false;
257
+ }
258
+ throw error;
259
+ }
260
+ },
261
+ };
262
+ function readEligibleLegacyHead(scope) {
263
+ if (!hasTable("data_files"))
264
+ return null;
265
+ const latest = db
266
+ .prepare(`
267
+ SELECT id, path, version, cas_revision, collected_at, producer
268
+ FROM data_files
269
+ WHERE scope = ?
270
+ ORDER BY julianday(collected_at) DESC, id DESC
271
+ LIMIT 1
272
+ `)
273
+ .get(scope);
274
+ if (!latest ||
275
+ latest.producer === "pdpp-projector" ||
276
+ latest.producer === "pdpp-import-projection") {
277
+ return null;
278
+ }
279
+ return {
280
+ id: latest.id,
281
+ path: latest.path,
282
+ version: latest.version,
283
+ casRevision: latest.cas_revision,
284
+ collectedAt: latest.collected_at,
285
+ };
286
+ }
287
+ }
288
+ function sameHead(left, right) {
289
+ return left === null
290
+ ? right === null
291
+ : right !== null &&
292
+ left.id === right.id &&
293
+ left.path === right.path &&
294
+ left.version === right.version &&
295
+ left.casRevision === right.casRevision &&
296
+ left.collectedAt === right.collectedAt;
297
+ }
298
+ //# sourceMappingURL=legacy-scope-authority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-scope-authority.js","sourceRoot":"","sources":["../../src/storage/legacy-scope-authority.ts"],"names":[],"mappings":"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"}
@@ -5,5 +5,11 @@ export interface NodeDataStorageDeps {
5
5
  indexManager: IndexManager;
6
6
  hierarchyOptions: HierarchyManagerOptions;
7
7
  }
8
+ /** Finish committed stages and discard stages that lost their index race. */
9
+ export declare function recoverStagedDataFiles(deps: NodeDataStorageDeps): Promise<void>;
10
+ /** Rebuild a lost legacy index from finalized envelopes, never from stages. */
11
+ export declare function reindexLegacyDataFiles(deps: NodeDataStorageDeps & {
12
+ closeRecoveredScopeForWrites?: (scope: string) => boolean | Promise<boolean>;
13
+ }): Promise<number>;
8
14
  export declare function createNodeDataStorage(deps: NodeDataStorageDeps): DataStoragePort;
9
15
  //# sourceMappingURL=node-data-storage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-data-storage.d.ts","sourceRoot":"","sources":["../../src/storage/node-data-storage.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AACvG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qDAAqD,CAAC;AACxF,OAAO,KAAK,EAGV,eAAe,EAEhB,MAAM,6CAA6C,CAAC;AAGrD,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,uBAAuB,CAAC;CAC3C;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,mBAAmB,GACxB,eAAe,CA8KjB"}
1
+ {"version":3,"file":"node-data-storage.d.ts","sourceRoot":"","sources":["../../src/storage/node-data-storage.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AACvG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qDAAqD,CAAC;AACxF,OAAO,KAAK,EAGV,eAAe,EAEhB,MAAM,6CAA6C,CAAC;AAKrD,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,uBAAuB,CAAC;CAC3C;AAED,6EAA6E;AAC7E,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,IAAI,CAAC,CAkCf;AAED,+EAA+E;AAC/E,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,mBAAmB,GAAG;IAC1B,4BAA4B,CAAC,EAAE,CAC7B,KAAK,EAAE,MAAM,KACV,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC,GACA,OAAO,CAAC,MAAM,CAAC,CA+DjB;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,mBAAmB,GACxB,eAAe,CA2OjB"}