@lorepack/cli 0.0.0-stage → 0.1.0-alpha.0

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 (229) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/commands/activate.d.ts +20 -0
  3. package/dist/commands/activate.d.ts.map +1 -0
  4. package/dist/commands/activate.js +171 -0
  5. package/dist/commands/activate.js.map +1 -0
  6. package/dist/commands/build.d.ts +3 -0
  7. package/dist/commands/build.d.ts.map +1 -0
  8. package/dist/commands/build.js +53 -0
  9. package/dist/commands/build.js.map +1 -0
  10. package/dist/commands/config.d.ts +14 -0
  11. package/dist/commands/config.d.ts.map +1 -0
  12. package/dist/commands/config.js +109 -0
  13. package/dist/commands/config.js.map +1 -0
  14. package/dist/commands/connect.d.ts +5 -0
  15. package/dist/commands/connect.d.ts.map +1 -0
  16. package/dist/commands/connect.js +196 -0
  17. package/dist/commands/connect.js.map +1 -0
  18. package/dist/commands/deploy.d.ts +14 -0
  19. package/dist/commands/deploy.d.ts.map +1 -0
  20. package/dist/commands/deploy.js +248 -0
  21. package/dist/commands/deploy.js.map +1 -0
  22. package/dist/commands/dev.d.ts +25 -0
  23. package/dist/commands/dev.d.ts.map +1 -0
  24. package/dist/commands/dev.js +227 -0
  25. package/dist/commands/dev.js.map +1 -0
  26. package/dist/commands/diff.d.ts +3 -0
  27. package/dist/commands/diff.d.ts.map +1 -0
  28. package/dist/commands/diff.js +75 -0
  29. package/dist/commands/diff.js.map +1 -0
  30. package/dist/commands/doctor.d.ts +14 -0
  31. package/dist/commands/doctor.d.ts.map +1 -0
  32. package/dist/commands/doctor.js +96 -0
  33. package/dist/commands/doctor.js.map +1 -0
  34. package/dist/commands/export.d.ts +3 -0
  35. package/dist/commands/export.d.ts.map +1 -0
  36. package/dist/commands/export.js +126 -0
  37. package/dist/commands/export.js.map +1 -0
  38. package/dist/commands/index.d.ts +8 -0
  39. package/dist/commands/index.d.ts.map +1 -0
  40. package/dist/commands/index.js +51 -0
  41. package/dist/commands/index.js.map +1 -0
  42. package/dist/commands/init.d.ts +3 -0
  43. package/dist/commands/init.d.ts.map +1 -0
  44. package/dist/commands/init.js +95 -0
  45. package/dist/commands/init.js.map +1 -0
  46. package/dist/commands/inspect.d.ts +15 -0
  47. package/dist/commands/inspect.d.ts.map +1 -0
  48. package/dist/commands/inspect.js +527 -0
  49. package/dist/commands/inspect.js.map +1 -0
  50. package/dist/commands/mcp.d.ts +12 -0
  51. package/dist/commands/mcp.d.ts.map +1 -0
  52. package/dist/commands/mcp.js +219 -0
  53. package/dist/commands/mcp.js.map +1 -0
  54. package/dist/commands/pack.d.ts +9 -0
  55. package/dist/commands/pack.d.ts.map +1 -0
  56. package/dist/commands/pack.js +57 -0
  57. package/dist/commands/pack.js.map +1 -0
  58. package/dist/commands/plan.d.ts +3 -0
  59. package/dist/commands/plan.d.ts.map +1 -0
  60. package/dist/commands/plan.js +44 -0
  61. package/dist/commands/plan.js.map +1 -0
  62. package/dist/commands/prune.d.ts +7 -0
  63. package/dist/commands/prune.d.ts.map +1 -0
  64. package/dist/commands/prune.js +341 -0
  65. package/dist/commands/prune.js.map +1 -0
  66. package/dist/commands/search.d.ts +3 -0
  67. package/dist/commands/search.d.ts.map +1 -0
  68. package/dist/commands/search.js +84 -0
  69. package/dist/commands/search.js.map +1 -0
  70. package/dist/commands/serve.d.ts +20 -0
  71. package/dist/commands/serve.d.ts.map +1 -0
  72. package/dist/commands/serve.js +66 -0
  73. package/dist/commands/serve.js.map +1 -0
  74. package/dist/commands/status.d.ts +3 -0
  75. package/dist/commands/status.d.ts.map +1 -0
  76. package/dist/commands/status.js +27 -0
  77. package/dist/commands/status.js.map +1 -0
  78. package/dist/commands/target.d.ts +71 -0
  79. package/dist/commands/target.d.ts.map +1 -0
  80. package/dist/commands/target.js +945 -0
  81. package/dist/commands/target.js.map +1 -0
  82. package/dist/entry.d.ts +3 -0
  83. package/dist/entry.d.ts.map +1 -0
  84. package/dist/entry.js +19 -0
  85. package/dist/entry.js.map +1 -0
  86. package/dist/framework/context.d.ts +49 -0
  87. package/dist/framework/context.d.ts.map +1 -0
  88. package/dist/framework/context.js +47 -0
  89. package/dist/framework/context.js.map +1 -0
  90. package/dist/framework/exit.d.ts +36 -0
  91. package/dist/framework/exit.d.ts.map +1 -0
  92. package/dist/framework/exit.js +57 -0
  93. package/dist/framework/exit.js.map +1 -0
  94. package/dist/framework/metadata.d.ts +38 -0
  95. package/dist/framework/metadata.d.ts.map +1 -0
  96. package/dist/framework/metadata.js +47 -0
  97. package/dist/framework/metadata.js.map +1 -0
  98. package/dist/framework/program.d.ts +47 -0
  99. package/dist/framework/program.d.ts.map +1 -0
  100. package/dist/framework/program.js +189 -0
  101. package/dist/framework/program.js.map +1 -0
  102. package/dist/index.d.ts +7 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +7 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/migrations/README.md +7 -0
  107. package/dist/migrations/build/0001_catalog.sql +85 -0
  108. package/dist/migrations/build/0002_tables.sql +43 -0
  109. package/dist/migrations/build/0003_table-cell-range.sql +13 -0
  110. package/dist/migrations/build/0004_chunk-page.sql +11 -0
  111. package/dist/migrations/state/0001_state.sql +40 -0
  112. package/dist/public-entry.js +38563 -0
  113. package/dist/public-entry.js.map +7 -0
  114. package/dist/public-index.js +36428 -0
  115. package/dist/public-index.js.map +7 -0
  116. package/dist/services/build.d.ts +48 -0
  117. package/dist/services/build.d.ts.map +1 -0
  118. package/dist/services/build.js +499 -0
  119. package/dist/services/build.js.map +1 -0
  120. package/dist/services/builds.d.ts +40 -0
  121. package/dist/services/builds.d.ts.map +1 -0
  122. package/dist/services/builds.js +184 -0
  123. package/dist/services/builds.js.map +1 -0
  124. package/dist/services/cancellation.d.ts +27 -0
  125. package/dist/services/cancellation.d.ts.map +1 -0
  126. package/dist/services/cancellation.js +41 -0
  127. package/dist/services/cancellation.js.map +1 -0
  128. package/dist/services/cloudflare-target.d.ts +38 -0
  129. package/dist/services/cloudflare-target.d.ts.map +1 -0
  130. package/dist/services/cloudflare-target.js +471 -0
  131. package/dist/services/cloudflare-target.js.map +1 -0
  132. package/dist/services/comparer.d.ts +15 -0
  133. package/dist/services/comparer.d.ts.map +1 -0
  134. package/dist/services/comparer.js +43 -0
  135. package/dist/services/comparer.js.map +1 -0
  136. package/dist/services/config-resolve.d.ts +60 -0
  137. package/dist/services/config-resolve.d.ts.map +1 -0
  138. package/dist/services/config-resolve.js +178 -0
  139. package/dist/services/config-resolve.js.map +1 -0
  140. package/dist/services/deploy.d.ts +70 -0
  141. package/dist/services/deploy.d.ts.map +1 -0
  142. package/dist/services/deploy.js +260 -0
  143. package/dist/services/deploy.js.map +1 -0
  144. package/dist/services/dev-session.d.ts +52 -0
  145. package/dist/services/dev-session.d.ts.map +1 -0
  146. package/dist/services/dev-session.js +102 -0
  147. package/dist/services/dev-session.js.map +1 -0
  148. package/dist/services/doctor.d.ts +35 -0
  149. package/dist/services/doctor.d.ts.map +1 -0
  150. package/dist/services/doctor.js +389 -0
  151. package/dist/services/doctor.js.map +1 -0
  152. package/dist/services/export.d.ts +20 -0
  153. package/dist/services/export.d.ts.map +1 -0
  154. package/dist/services/export.js +129 -0
  155. package/dist/services/export.js.map +1 -0
  156. package/dist/services/init.d.ts +46 -0
  157. package/dist/services/init.d.ts.map +1 -0
  158. package/dist/services/init.js +231 -0
  159. package/dist/services/init.js.map +1 -0
  160. package/dist/services/packing.d.ts +25 -0
  161. package/dist/services/packing.d.ts.map +1 -0
  162. package/dist/services/packing.js +69 -0
  163. package/dist/services/packing.js.map +1 -0
  164. package/dist/services/parse-cache.d.ts +47 -0
  165. package/dist/services/parse-cache.d.ts.map +1 -0
  166. package/dist/services/parse-cache.js +65 -0
  167. package/dist/services/parse-cache.js.map +1 -0
  168. package/dist/services/project.d.ts +49 -0
  169. package/dist/services/project.d.ts.map +1 -0
  170. package/dist/services/project.js +119 -0
  171. package/dist/services/project.js.map +1 -0
  172. package/dist/services/remote-prune.d.ts +7 -0
  173. package/dist/services/remote-prune.d.ts.map +1 -0
  174. package/dist/services/remote-prune.js +34 -0
  175. package/dist/services/remote-prune.js.map +1 -0
  176. package/dist/services/retention.d.ts +20 -0
  177. package/dist/services/retention.d.ts.map +1 -0
  178. package/dist/services/retention.js +106 -0
  179. package/dist/services/retention.js.map +1 -0
  180. package/dist/services/revalidate.d.ts +36 -0
  181. package/dist/services/revalidate.d.ts.map +1 -0
  182. package/dist/services/revalidate.js +73 -0
  183. package/dist/services/revalidate.js.map +1 -0
  184. package/dist/services/search.d.ts +25 -0
  185. package/dist/services/search.d.ts.map +1 -0
  186. package/dist/services/search.js +88 -0
  187. package/dist/services/search.js.map +1 -0
  188. package/dist/services/serving.d.ts +70 -0
  189. package/dist/services/serving.d.ts.map +1 -0
  190. package/dist/services/serving.js +240 -0
  191. package/dist/services/serving.js.map +1 -0
  192. package/dist/services/status.d.ts +54 -0
  193. package/dist/services/status.d.ts.map +1 -0
  194. package/dist/services/status.js +203 -0
  195. package/dist/services/status.js.map +1 -0
  196. package/dist/services/studio-assets.d.ts +13 -0
  197. package/dist/services/studio-assets.d.ts.map +1 -0
  198. package/dist/services/studio-assets.js +94 -0
  199. package/dist/services/studio-assets.js.map +1 -0
  200. package/dist/services/studio-diagnostics.d.ts +28 -0
  201. package/dist/services/studio-diagnostics.d.ts.map +1 -0
  202. package/dist/services/studio-diagnostics.js +88 -0
  203. package/dist/services/studio-diagnostics.js.map +1 -0
  204. package/dist/services/studio-endpoints.d.ts +61 -0
  205. package/dist/services/studio-endpoints.d.ts.map +1 -0
  206. package/dist/services/studio-endpoints.js +88 -0
  207. package/dist/services/studio-endpoints.js.map +1 -0
  208. package/dist/services/studio-mutations.d.ts +32 -0
  209. package/dist/services/studio-mutations.d.ts.map +1 -0
  210. package/dist/services/studio-mutations.js +149 -0
  211. package/dist/services/studio-mutations.js.map +1 -0
  212. package/dist/services/versions.d.ts +38 -0
  213. package/dist/services/versions.d.ts.map +1 -0
  214. package/dist/services/versions.js +46 -0
  215. package/dist/services/versions.js.map +1 -0
  216. package/dist/services/watch.d.ts +103 -0
  217. package/dist/services/watch.d.ts.map +1 -0
  218. package/dist/services/watch.js +420 -0
  219. package/dist/services/watch.js.map +1 -0
  220. package/package.json +73 -4
  221. package/studio-dist/assets/ibm-plex-mono-latin-400-normal-Dm_PoFIZ.woff2 +0 -0
  222. package/studio-dist/assets/ibm-plex-mono-latin-500-normal-C_OblDzq.woff2 +0 -0
  223. package/studio-dist/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  224. package/studio-dist/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  225. package/studio-dist/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  226. package/studio-dist/assets/index-BuAYbQVX.js +66 -0
  227. package/studio-dist/assets/index-C_3XEUt4.css +1 -0
  228. package/studio-dist/index.html +30 -0
  229. package/README.md +0 -3
@@ -0,0 +1,184 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { assertIdentifier, decodeValue, LocalStateStore, openReadOnly, stateMigrationsDirectory, tableLocator, } from '@lorepack/backend-local';
4
+ import { assertBuildId, buildManifestSchema, count, LoreError, } from '@lorepack/core';
5
+ /**
6
+ * Reading sealed builds: history, resolution of a short id, and the snapshot the diff
7
+ * engine works on.
8
+ *
9
+ * Everything here reads build data only. Nothing re-parses a source, which is what lets
10
+ * `lorepack diff` and `lorepack rollback` work in a project whose source directory has been
11
+ * deleted, and what makes both operations instant.
12
+ */
13
+ export function openStateStore(loreDirectory) {
14
+ if (!existsSync(join(loreDirectory, 'state.sqlite'))) {
15
+ throw new LoreError('LORE_E_BUILD_NOT_FOUND', 'This project has no builds yet.', {
16
+ remediation: 'Run `lorepack build` to create the first one.',
17
+ });
18
+ }
19
+ return LocalStateStore.open(loreDirectory, stateMigrationsDirectory());
20
+ }
21
+ /**
22
+ * Resolves a full id or an unambiguous prefix.
23
+ *
24
+ * An ambiguous prefix lists the candidates rather than picking one. Silently choosing
25
+ * would mean activating a build the user did not name.
26
+ */
27
+ export function resolveBuildId(builds, reference) {
28
+ const needle = reference.trim();
29
+ if (needle === '') {
30
+ throw new LoreError('LORE_E_INVALID_ARGUMENT', 'No build was named.', {
31
+ remediation: 'Pass a build id, or run `lorepack builds` to list them.',
32
+ });
33
+ }
34
+ const exact = builds.find((build) => build.buildId === needle);
35
+ if (exact !== undefined)
36
+ return exact.buildId;
37
+ const matches = builds.filter((build) => build.buildId.startsWith(needle));
38
+ if (matches.length === 1)
39
+ return matches[0].buildId;
40
+ if (matches.length === 0) {
41
+ throw new LoreError('LORE_E_BUILD_NOT_FOUND', `No build matches ${needle}.`, {
42
+ remediation: builds.length === 0
43
+ ? 'Run `lorepack build` to create one.'
44
+ : `Available builds:\n${builds.map((build) => ` ${build.buildId}`).join('\n')}`,
45
+ subject: needle,
46
+ });
47
+ }
48
+ throw new LoreError('LORE_E_INVALID_ARGUMENT', `${needle} matches ${count(matches.length, 'build')}.`, {
49
+ remediation: `Use a longer prefix. Candidates:\n${matches
50
+ .map((build) => ` ${build.buildId}`)
51
+ .join('\n')}`,
52
+ subject: needle,
53
+ });
54
+ }
55
+ /**
56
+ * The build a rollback returns to: the newest activatable one that is not already live.
57
+ *
58
+ * One definition, used by `lorepack rollback` and by the Studio endpoint behind the same button,
59
+ * because two definitions is how a terminal and a browser end up returning to different
60
+ * builds from the same history.
61
+ */
62
+ export function previousBuild(builds, active) {
63
+ const candidates = builds.filter((build) => build.buildId !== active && (build.state === 'verified' || build.state === 'active'));
64
+ const previous = candidates[0];
65
+ if (previous === undefined) {
66
+ throw new LoreError('LORE_E_BUILD_NOT_FOUND', 'There is no earlier verified build to return to.', { remediation: 'Run `lorepack builds` to see the history.' });
67
+ }
68
+ return previous.buildId;
69
+ }
70
+ export function buildDirectory(loreDirectory, buildId) {
71
+ return join(loreDirectory, 'builds', buildId);
72
+ }
73
+ /** Reads the canonical records a diff compares, straight out of the sealed build. */
74
+ export function readSnapshot(loreDirectory, buildId) {
75
+ const directory = buildDirectory(loreDirectory, buildId);
76
+ const manifestPath = join(directory, 'manifest.json');
77
+ if (!existsSync(manifestPath)) {
78
+ throw new LoreError('LORE_E_BUILD_NOT_FOUND', `Build ${buildId} has no manifest.`, {
79
+ remediation: 'The build directory is incomplete. Rebuild, or activate another build.',
80
+ subject: buildId,
81
+ });
82
+ }
83
+ const manifest = buildManifestSchema.parse(JSON.parse(readFileSync(manifestPath, 'utf8')));
84
+ const db = openReadOnly(join(directory, 'context.sqlite'));
85
+ try {
86
+ const artifacts = db
87
+ .prepare('SELECT id, relative_path, content_hash, status, authority FROM artifacts ORDER BY id')
88
+ .all();
89
+ const supersessions = db
90
+ .prepare('SELECT artifact_id, superseded_id FROM supersessions')
91
+ .all();
92
+ const superseded = new Map();
93
+ for (const row of supersessions) {
94
+ const list = superseded.get(row.artifact_id) ?? [];
95
+ list.push(row.superseded_id);
96
+ superseded.set(row.artifact_id, list);
97
+ }
98
+ const chunks = db.prepare('SELECT id, revision_hash FROM chunks ORDER BY id').all();
99
+ const tableRows = db
100
+ .prepare('SELECT id, artifact_id, name, sheet, sql_name, row_count, relative_path, line_start, line_end, cell_range FROM tables ORDER BY id')
101
+ .all();
102
+ const tables = tableRows.map((table) => {
103
+ const columns = db
104
+ .prepare('SELECT ordinal, name, sql_name, type FROM table_columns WHERE table_id = ? ORDER BY ordinal')
105
+ .all(table.id);
106
+ const physical = assertIdentifier(table.sql_name);
107
+ const rows = db.prepare(`SELECT * FROM ${physical}`).all();
108
+ return {
109
+ tableId: table.id,
110
+ name: table.name,
111
+ rows: table.row_count,
112
+ columns: columns.map((column) => column.name),
113
+ locator: tableLocator(table),
114
+ cells: rows.flatMap((row, rowIndex) => columns.map((column) => ({
115
+ row: rowIndex,
116
+ column: column.name,
117
+ value: decodeValue(row[column.sql_name], column.type),
118
+ }))),
119
+ };
120
+ });
121
+ return {
122
+ buildId,
123
+ formatVersion: manifest.formatVersion,
124
+ schemaVersion: manifest.schemaVersion,
125
+ compilerVersion: manifest.compilerVersion,
126
+ configurationHash: manifest.configurationHash,
127
+ capabilities: manifest.capabilities,
128
+ canonicalRoots: manifest.canonicalRoots,
129
+ artifacts: artifacts.map((row) => ({
130
+ id: row.id,
131
+ relativePath: row.relative_path,
132
+ contentHash: row.content_hash,
133
+ status: row.status,
134
+ authority: Number(row.authority),
135
+ supersedes: superseded.get(row.id) ?? [],
136
+ })),
137
+ chunks: chunks.map((row) => ({ id: row.id, revisionHash: row.revision_hash })),
138
+ tables,
139
+ };
140
+ }
141
+ finally {
142
+ db.close();
143
+ }
144
+ }
145
+ /**
146
+ * Pre-flight before a pointer change: the build exists, passed validation, its database
147
+ * opens, and its integrity check passes.
148
+ *
149
+ * Activation is cheap, but activating a corrupt build is not, so the check happens before
150
+ * the pointer moves rather than at the first request that fails.
151
+ */
152
+ export function assertActivatable(loreDirectory, build) {
153
+ if (build.state !== 'verified' && build.state !== 'active') {
154
+ throw new LoreError('LORE_E_BUILD_VALIDATION', `Build ${build.buildId} is ${build.state}, and only a verified build may be activated.`, {
155
+ remediation: 'Activate a build that passed validation, or run `lorepack build` again.',
156
+ subject: build.buildId,
157
+ });
158
+ }
159
+ const databasePath = join(buildDirectory(loreDirectory, build.buildId), 'context.sqlite');
160
+ if (!existsSync(databasePath)) {
161
+ throw new LoreError('LORE_E_BUILD_NOT_FOUND', `Build ${build.buildId} is recorded but its files are missing.`, {
162
+ remediation: 'Run `lorepack build` to recreate it. The active build is unchanged.',
163
+ subject: build.buildId,
164
+ });
165
+ }
166
+ const db = openReadOnly(databasePath);
167
+ try {
168
+ const rows = db.prepare('PRAGMA integrity_check').all();
169
+ const problems = rows
170
+ .map((row) => row.integrity_check ?? '')
171
+ .filter((value) => value !== '' && value !== 'ok');
172
+ if (problems.length > 0) {
173
+ throw new LoreError('LORE_E_OBJECT_CORRUPT', `Build ${build.buildId} failed its integrity check: ${problems.join('; ')}`, {
174
+ remediation: 'Run `lorepack build` to produce a fresh build. The active build is unchanged.',
175
+ subject: build.buildId,
176
+ });
177
+ }
178
+ }
179
+ finally {
180
+ db.close();
181
+ }
182
+ }
183
+ export { assertBuildId };
184
+ //# sourceMappingURL=builds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builds.js","sourceRoot":"","sources":["../../src/services/builds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,YAAY,EACZ,wBAAwB,EACxB,YAAY,GACb,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,aAAa,EAGb,mBAAmB,EAEnB,KAAK,EACL,SAAS,GAEV,MAAM,gBAAgB,CAAC;AAExB;;;;;;;GAOG;AAEH,MAAM,UAAU,cAAc,CAAC,aAAqB;IAClD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,SAAS,CAAC,wBAAwB,EAAE,iCAAiC,EAAE;YAC/E,WAAW,EAAE,+CAA+C;SAC7D,CAAC,CAAC;IACL,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,wBAAwB,EAAE,CAAC,CAAC;AACzE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,MAA+B,EAAE,SAAiB;IAC/E,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,SAAS,CAAC,yBAAyB,EAAE,qBAAqB,EAAE;YACpE,WAAW,EAAE,yDAAyD;SACvE,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;IAC/D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IAE9C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAQ,OAAO,CAAC,CAAC,CAAkB,CAAC,OAAO,CAAC;IAEtE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,SAAS,CAAC,wBAAwB,EAAE,oBAAoB,MAAM,GAAG,EAAE;YAC3E,WAAW,EACT,MAAM,CAAC,MAAM,KAAK,CAAC;gBACjB,CAAC,CAAC,qCAAqC;gBACvC,CAAC,CAAC,sBAAsB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACpF,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,SAAS,CACjB,yBAAyB,EACzB,GAAG,MAAM,YAAY,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EACtD;QACE,WAAW,EAAE,qCAAqC,OAAO;aACtD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;aACpC,IAAI,CAAC,IAAI,CAAC,EAAE;QACf,OAAO,EAAE,MAAM;KAChB,CACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,MAA+B,EAAE,MAAsB;IACnF,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAChG,CAAC;IACF,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,SAAS,CACjB,wBAAwB,EACxB,kDAAkD,EAClD,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAC7D,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC,OAAO,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,aAAqB,EAAE,OAAgB;IACpE,OAAO,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,YAAY,CAAC,aAAqB,EAAE,OAAgB;IAClE,MAAM,SAAS,GAAG,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CAAC,wBAAwB,EAAE,SAAS,OAAO,mBAAmB,EAAE;YACjF,WAAW,EAAE,wEAAwE;YACrF,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3F,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,EAAE;aACjB,OAAO,CACN,sFAAsF,CACvF;aACA,GAAG,EAMJ,CAAC;QAEH,MAAM,aAAa,GAAG,EAAE;aACrB,OAAO,CAAC,sDAAsD,CAAC;aAC/D,GAAG,EAA2D,CAAC;QAClE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC/C,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC7B,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC,GAAG,EAG/E,CAAC;QAEH,MAAM,SAAS,GAAG,EAAE;aACjB,OAAO,CACN,mIAAmI,CACpI;aACA,GAAG,EAWJ,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,EAAE;iBACf,OAAO,CACN,6FAA6F,CAC9F;iBACA,GAAG,CAAC,KAAK,CAAC,EAAE,CAA6E,CAAC;YAC7F,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAClD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAoC,CAAC;YAC7F,OAAO;gBACL,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,SAAS;gBACrB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC7C,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC;gBAC5B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CACpC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBACvB,GAAG,EAAE,QAAQ;oBACb,MAAM,EAAE,MAAM,CAAC,IAAI;oBACnB,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAsB,CAAe;iBACtF,CAAC,CAAC,CACJ;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,OAAO;YACP,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;YAC7C,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACjC,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,YAAY,EAAE,GAAG,CAAC,aAAa;gBAC/B,WAAW,EAAE,GAAG,CAAC,YAAY;gBAC7B,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;gBAChC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;aACzC,CAAC,CAAC;YACH,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;YAC9E,MAAM;SACP,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,aAAqB,EAAE,KAAmB;IAC1E,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3D,MAAM,IAAI,SAAS,CACjB,yBAAyB,EACzB,SAAS,KAAK,CAAC,OAAO,OAAO,KAAK,CAAC,KAAK,+CAA+C,EACvF;YACE,WAAW,EAAE,yEAAyE;YACtF,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CACF,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC1F,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CACjB,wBAAwB,EACxB,SAAS,KAAK,CAAC,OAAO,yCAAyC,EAC/D;YACE,WAAW,EAAE,qEAAqE;YAClF,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CACF,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,GAAG,EAAyC,CAAC;QAC/F,MAAM,QAAQ,GAAG,IAAI;aAClB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;aACvC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC;QACrD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,SAAS,CACjB,uBAAuB,EACvB,SAAS,KAAK,CAAC,OAAO,gCAAgC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC3E;gBACE,WAAW,EACT,+EAA+E;gBACjF,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CACF,CAAC;QACJ,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * A cancellation checkpoint: give the process a chance to hear the signal, then honour it.
3
+ *
4
+ * The yield is the load-bearing half, and its absence was #146.
5
+ *
6
+ * Node delivers signals from the event loop, but a build stage can run without ever
7
+ * reaching it. `await` only suspends until a promise settles, and every promise awaited in
8
+ * the parse loop is settled already: `FileObjectStore` is asynchronous in signature and
9
+ * synchronous inside. The whole stage therefore runs as one unbroken chain of microtasks,
10
+ * the loop is never reached, the SIGINT handler never runs, and `signal.aborted` stays
11
+ * false however often it is read. The checkpoints were correct and unreachable, which is
12
+ * why a test that set the flag itself passed while Ctrl-C did nothing at all.
13
+ *
14
+ * `setImmediate` rather than `queueMicrotask`: only a full turn of the loop lets libuv
15
+ * deliver a pending signal. It costs microseconds against work measured in milliseconds per
16
+ * artifact, and a 500 document corpus builds no slower with it than without.
17
+ *
18
+ * Cancellation is therefore granular to the checkpoints, not to the instant: a signal that
19
+ * arrives inside one long synchronous call, such as writing the catalog, is honoured at the
20
+ * next checkpoint rather than immediately. What the guarantee promises is that `builds/`
21
+ * and the active pointer are unchanged, and a checkpoint before every write is enough for
22
+ * that.
23
+ */
24
+ export declare function checkpoint(signal: AbortSignal | undefined, state?: {
25
+ readonly hasActiveBuild?: boolean;
26
+ }): Promise<void>;
27
+ //# sourceMappingURL=cancellation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellation.d.ts","sourceRoot":"","sources":["../../src/services/cancellation.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,KAAK,GAAE;IAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GAChD,OAAO,CAAC,IAAI,CAAC,CAcf"}
@@ -0,0 +1,41 @@
1
+ import { LoreError } from '@lorepack/core';
2
+ /**
3
+ * A cancellation checkpoint: give the process a chance to hear the signal, then honour it.
4
+ *
5
+ * The yield is the load-bearing half, and its absence was #146.
6
+ *
7
+ * Node delivers signals from the event loop, but a build stage can run without ever
8
+ * reaching it. `await` only suspends until a promise settles, and every promise awaited in
9
+ * the parse loop is settled already: `FileObjectStore` is asynchronous in signature and
10
+ * synchronous inside. The whole stage therefore runs as one unbroken chain of microtasks,
11
+ * the loop is never reached, the SIGINT handler never runs, and `signal.aborted` stays
12
+ * false however often it is read. The checkpoints were correct and unreachable, which is
13
+ * why a test that set the flag itself passed while Ctrl-C did nothing at all.
14
+ *
15
+ * `setImmediate` rather than `queueMicrotask`: only a full turn of the loop lets libuv
16
+ * deliver a pending signal. It costs microseconds against work measured in milliseconds per
17
+ * artifact, and a 500 document corpus builds no slower with it than without.
18
+ *
19
+ * Cancellation is therefore granular to the checkpoints, not to the instant: a signal that
20
+ * arrives inside one long synchronous call, such as writing the catalog, is honoured at the
21
+ * next checkpoint rather than immediately. What the guarantee promises is that `builds/`
22
+ * and the active pointer are unchanged, and a checkpoint before every write is enough for
23
+ * that.
24
+ */
25
+ export async function checkpoint(signal, state = {}) {
26
+ if (signal === undefined)
27
+ return;
28
+ await new Promise((resolve) => {
29
+ setImmediate(resolve);
30
+ });
31
+ if (!signal.aborted)
32
+ return;
33
+ throw new LoreError('LORE_E_CANCELLED', 'The build was cancelled.', {
34
+ // The first build in a project is the most likely one to be interrupted, and it is
35
+ // exactly the case where "the previously active build is still serving" is false (#168).
36
+ remediation: state.hasActiveBuild === true
37
+ ? 'Nothing was changed. The previously active build is still serving.'
38
+ : 'Nothing was changed. This project still has no build.',
39
+ });
40
+ }
41
+ //# sourceMappingURL=cancellation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellation.js","sourceRoot":"","sources":["../../src/services/cancellation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAA+B,EAC/B,KAAK,GAA0C,EAAE;IAEjD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO;IACjC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC5B,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO;IAC5B,MAAM,IAAI,SAAS,CAAC,kBAAkB,EAAE,0BAA0B,EAAE;QAClE,mFAAmF;QACnF,yFAAyF;QACzF,WAAW,EACT,KAAK,CAAC,cAAc,KAAK,IAAI;YAC3B,CAAC,CAAC,oEAAoE;YACtE,CAAC,CAAC,uDAAuD;KAC9D,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { type DeploymentTarget } from '@lorepack/core';
2
+ import { type D1CatalogDatabaseLike, type D1DatabaseLike, type D1QueryDatabaseLike, type ProjectionMigrationDatabaseLike, type R2BucketLike } from '@lorepack/deploy-cloudflare';
3
+ import { type CloudflareTargetAdapter, readCloudflareTargetReceipt } from '../commands/target.js';
4
+ interface CloudflareDatabaseInfo {
5
+ readonly name: string;
6
+ }
7
+ export interface ResolvedCloudflareTargetResources {
8
+ readonly receipt: ReturnType<typeof readCloudflareTargetReceipt>;
9
+ readonly endpoint: string;
10
+ readonly catalogDb: ProjectionMigrationDatabaseLike & D1CatalogDatabaseLike & D1QueryDatabaseLike & D1DatabaseLike;
11
+ readonly objects: R2BucketLike;
12
+ }
13
+ export interface CloudflareResolverAdapter extends CloudflareTargetAdapter {
14
+ listDatabases(): Promise<readonly CloudflareDatabaseInfo[]>;
15
+ openCatalogDatabase(name: string): ProjectionMigrationDatabaseLike & D1CatalogDatabaseLike & D1QueryDatabaseLike & D1DatabaseLike;
16
+ openObjectsBucket(name: string): R2BucketLike;
17
+ }
18
+ export declare function resolveCloudflareTarget(projectRoot: string): Promise<DeploymentTarget>;
19
+ export declare function resolveCloudflareTargetWithAdapter(projectRoot: string, adapter: CloudflareResolverAdapter): Promise<DeploymentTarget>;
20
+ export declare function resolveCloudflareResourcesWithAdapter(projectRoot: string, adapter: CloudflareResolverAdapter): Promise<ResolvedCloudflareTargetResources>;
21
+ export declare function createWranglerDeployAdapter(): CloudflareResolverAdapter;
22
+ export declare function isWranglerD1TransactionControl(query: string): boolean;
23
+ export declare function wranglerD1ExecutionMode(query: string): 'skip' | 'command' | 'file';
24
+ export declare class WranglerD1TransactionBatch {
25
+ #private;
26
+ get active(): boolean;
27
+ begin(): void;
28
+ stage(sql: string): void;
29
+ flush(): string | null;
30
+ commit(): string | null;
31
+ rollback(): void;
32
+ }
33
+ export declare function renderWranglerSqlBatch(statements: readonly string[]): string;
34
+ export declare function parseWranglerJson(stdout: string): unknown;
35
+ export declare function isWranglerMissingObjectFailure(text: string): boolean;
36
+ export declare function isRetryableWranglerRemoteR2Failure(text: string): boolean;
37
+ export {};
38
+ //# sourceMappingURL=cloudflare-target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-target.d.ts","sourceRoot":"","sources":["../../src/services/cloudflare-target.ts"],"names":[],"mappings":"AAKA,OAAO,EAAgB,KAAK,gBAAgB,EAAa,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,+BAA+B,EAEpC,KAAK,YAAY,EAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,uBAAuB,EAG5B,2BAA2B,EAC5B,MAAM,uBAAuB,CAAC;AAiB/B,UAAU,sBAAsB;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAC;IACjE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,+BAA+B,GACjD,qBAAqB,GACrB,mBAAmB,GACnB,cAAc,CAAC;IACjB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;CAChC;AAED,MAAM,WAAW,yBAA0B,SAAQ,uBAAuB;IACxE,aAAa,IAAI,OAAO,CAAC,SAAS,sBAAsB,EAAE,CAAC,CAAC;IAC5D,mBAAmB,CACjB,IAAI,EAAE,MAAM,GACX,+BAA+B,GAAG,qBAAqB,GAAG,mBAAmB,GAAG,cAAc,CAAC;IAClG,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;CAC/C;AAeD,wBAAsB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAE5F;AAED,wBAAsB,kCAAkC,CACtD,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAY3B;AAED,wBAAsB,qCAAqC,CACzD,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,iCAAiC,CAAC,CAoE5C;AAED,wBAAgB,2BAA2B,IAAI,yBAAyB,CA0BvE;AAwFD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAErE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAGlF;AAED,qBAAa,0BAA0B;;IAGrC,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,KAAK,IAAI,IAAI,CAEZ;IAED,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAGvB;IAED,KAAK,IAAI,MAAM,GAAG,IAAI,CAKrB;IAED,MAAM,IAAI,MAAM,GAAG,IAAI,CAItB;IAED,QAAQ,IAAI,IAAI,CAEf;CACF;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAE5E;AAmGD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAQzD;AA4ED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMpE;AAED,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIxE"}