@detergent-software/atk 3.0.0-dev.1 → 3.0.0-dev.10

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 (181) hide show
  1. package/README.md +361 -0
  2. package/build/commands/audit.d.ts.map +1 -1
  3. package/build/commands/audit.js +77 -37
  4. package/build/commands/audit.js.map +1 -1
  5. package/build/commands/browse.d.ts.map +1 -1
  6. package/build/commands/browse.js +50 -115
  7. package/build/commands/browse.js.map +1 -1
  8. package/build/commands/diff.d.ts.map +1 -1
  9. package/build/commands/diff.js +2 -1
  10. package/build/commands/diff.js.map +1 -1
  11. package/build/commands/info.d.ts.map +1 -1
  12. package/build/commands/info.js +1 -1
  13. package/build/commands/info.js.map +1 -1
  14. package/build/commands/init.d.ts.map +1 -1
  15. package/build/commands/init.js +39 -405
  16. package/build/commands/init.js.map +1 -1
  17. package/build/commands/install.d.ts.map +1 -1
  18. package/build/commands/install.js +46 -31
  19. package/build/commands/install.js.map +1 -1
  20. package/build/commands/list.d.ts +2 -2
  21. package/build/commands/list.d.ts.map +1 -1
  22. package/build/commands/list.js +131 -27
  23. package/build/commands/list.js.map +1 -1
  24. package/build/commands/outdated.d.ts.map +1 -1
  25. package/build/commands/outdated.js +7 -6
  26. package/build/commands/outdated.js.map +1 -1
  27. package/build/commands/prune.d.ts.map +1 -1
  28. package/build/commands/prune.js +35 -47
  29. package/build/commands/prune.js.map +1 -1
  30. package/build/commands/publish.d.ts +3 -1
  31. package/build/commands/publish.d.ts.map +1 -1
  32. package/build/commands/publish.js +67 -390
  33. package/build/commands/publish.js.map +1 -1
  34. package/build/commands/setup.d.ts +1 -1
  35. package/build/commands/setup.d.ts.map +1 -1
  36. package/build/commands/setup.js +49 -242
  37. package/build/commands/setup.js.map +1 -1
  38. package/build/commands/sync.d.ts.map +1 -1
  39. package/build/commands/sync.js +111 -120
  40. package/build/commands/sync.js.map +1 -1
  41. package/build/commands/uninstall.d.ts.map +1 -1
  42. package/build/commands/uninstall.js +103 -218
  43. package/build/commands/uninstall.js.map +1 -1
  44. package/build/commands/update.d.ts.map +1 -1
  45. package/build/commands/update.js +30 -23
  46. package/build/commands/update.js.map +1 -1
  47. package/build/components/AssetTable.d.ts +3 -1
  48. package/build/components/AssetTable.d.ts.map +1 -1
  49. package/build/components/AssetTable.js +30 -37
  50. package/build/components/AssetTable.js.map +1 -1
  51. package/build/components/DryRunBanner.d.ts +3 -3
  52. package/build/components/DryRunBanner.d.ts.map +1 -1
  53. package/build/components/DryRunBanner.js +2 -2
  54. package/build/components/DryRunBanner.js.map +1 -1
  55. package/build/components/FilterBar.d.ts +10 -3
  56. package/build/components/FilterBar.d.ts.map +1 -1
  57. package/build/components/FilterBar.js +4 -4
  58. package/build/components/FilterBar.js.map +1 -1
  59. package/build/components/InitSuccess.d.ts +5 -0
  60. package/build/components/InitSuccess.d.ts.map +1 -0
  61. package/build/components/InitSuccess.js +20 -0
  62. package/build/components/InitSuccess.js.map +1 -0
  63. package/build/components/InstallSummary.d.ts +3 -3
  64. package/build/components/InstallSummary.d.ts.map +1 -1
  65. package/build/components/InstallSummary.js +2 -2
  66. package/build/components/InstallSummary.js.map +1 -1
  67. package/build/components/Link.d.ts +7 -0
  68. package/build/components/Link.d.ts.map +1 -0
  69. package/build/components/Link.js +6 -0
  70. package/build/components/Link.js.map +1 -0
  71. package/build/components/ListActionBar.d.ts +9 -0
  72. package/build/components/ListActionBar.d.ts.map +1 -0
  73. package/build/components/ListActionBar.js +30 -0
  74. package/build/components/ListActionBar.js.map +1 -0
  75. package/build/components/ListBrowseList.d.ts +25 -0
  76. package/build/components/ListBrowseList.d.ts.map +1 -0
  77. package/build/components/ListBrowseList.js +55 -0
  78. package/build/components/ListBrowseList.js.map +1 -0
  79. package/build/components/ListExpandedRow.d.ts +36 -0
  80. package/build/components/ListExpandedRow.d.ts.map +1 -0
  81. package/build/components/ListExpandedRow.js +46 -0
  82. package/build/components/ListExpandedRow.js.map +1 -0
  83. package/build/components/ListHelpBar.d.ts +19 -0
  84. package/build/components/ListHelpBar.d.ts.map +1 -0
  85. package/build/components/ListHelpBar.js +11 -0
  86. package/build/components/ListHelpBar.js.map +1 -0
  87. package/build/components/PromptField.d.ts +19 -0
  88. package/build/components/PromptField.d.ts.map +1 -0
  89. package/build/components/PromptField.js +7 -0
  90. package/build/components/PromptField.js.map +1 -0
  91. package/build/components/StatusBadge.d.ts +1 -1
  92. package/build/components/StatusBadge.d.ts.map +1 -1
  93. package/build/components/StatusBadge.js +4 -0
  94. package/build/components/StatusBadge.js.map +1 -1
  95. package/build/components/index.d.ts +7 -0
  96. package/build/components/index.d.ts.map +1 -1
  97. package/build/components/index.js +7 -0
  98. package/build/components/index.js.map +1 -1
  99. package/build/hooks/useBrowseState.d.ts +23 -0
  100. package/build/hooks/useBrowseState.d.ts.map +1 -1
  101. package/build/hooks/useBrowseState.js +77 -1
  102. package/build/hooks/useBrowseState.js.map +1 -1
  103. package/build/hooks/useConfirmation.d.ts +18 -0
  104. package/build/hooks/useConfirmation.d.ts.map +1 -0
  105. package/build/hooks/useConfirmation.js +56 -0
  106. package/build/hooks/useConfirmation.js.map +1 -0
  107. package/build/hooks/useInitState.d.ts +72 -0
  108. package/build/hooks/useInitState.d.ts.map +1 -0
  109. package/build/hooks/useInitState.js +372 -0
  110. package/build/hooks/useInitState.js.map +1 -0
  111. package/build/hooks/useListActions.d.ts +14 -0
  112. package/build/hooks/useListActions.d.ts.map +1 -0
  113. package/build/hooks/useListActions.js +151 -0
  114. package/build/hooks/useListActions.js.map +1 -0
  115. package/build/hooks/useListState.d.ts +147 -0
  116. package/build/hooks/useListState.d.ts.map +1 -0
  117. package/build/hooks/useListState.js +445 -0
  118. package/build/hooks/useListState.js.map +1 -0
  119. package/build/hooks/usePublishState.d.ts +115 -0
  120. package/build/hooks/usePublishState.d.ts.map +1 -0
  121. package/build/hooks/usePublishState.js +673 -0
  122. package/build/hooks/usePublishState.js.map +1 -0
  123. package/build/hooks/useSetupState.d.ts +59 -0
  124. package/build/hooks/useSetupState.d.ts.map +1 -0
  125. package/build/hooks/useSetupState.js +295 -0
  126. package/build/hooks/useSetupState.js.map +1 -0
  127. package/build/hooks/useUninstallState.d.ts +102 -0
  128. package/build/hooks/useUninstallState.d.ts.map +1 -0
  129. package/build/hooks/useUninstallState.js +342 -0
  130. package/build/hooks/useUninstallState.js.map +1 -0
  131. package/build/lib/checksum.d.ts +39 -0
  132. package/build/lib/checksum.d.ts.map +1 -1
  133. package/build/lib/checksum.js +101 -13
  134. package/build/lib/checksum.js.map +1 -1
  135. package/build/lib/config.d.ts +4 -1
  136. package/build/lib/config.d.ts.map +1 -1
  137. package/build/lib/config.js +9 -9
  138. package/build/lib/config.js.map +1 -1
  139. package/build/lib/diagnostics.js +1 -1
  140. package/build/lib/diagnostics.js.map +1 -1
  141. package/build/lib/format.d.ts +6 -0
  142. package/build/lib/format.d.ts.map +1 -0
  143. package/build/lib/format.js +18 -0
  144. package/build/lib/format.js.map +1 -0
  145. package/build/lib/github.d.ts +8 -0
  146. package/build/lib/github.d.ts.map +1 -1
  147. package/build/lib/github.js +9 -0
  148. package/build/lib/github.js.map +1 -1
  149. package/build/lib/installer.d.ts +1 -0
  150. package/build/lib/installer.d.ts.map +1 -1
  151. package/build/lib/installer.js +7 -7
  152. package/build/lib/installer.js.map +1 -1
  153. package/build/lib/lockfile.d.ts.map +1 -1
  154. package/build/lib/lockfile.js +1 -4
  155. package/build/lib/lockfile.js.map +1 -1
  156. package/build/lib/publisher.d.ts +35 -0
  157. package/build/lib/publisher.d.ts.map +1 -1
  158. package/build/lib/publisher.js +210 -16
  159. package/build/lib/publisher.js.map +1 -1
  160. package/build/lib/schemas/config.d.ts +7 -3
  161. package/build/lib/schemas/config.d.ts.map +1 -1
  162. package/build/lib/schemas/config.js +12 -2
  163. package/build/lib/schemas/config.js.map +1 -1
  164. package/build/lib/schemas/index.d.ts +1 -1
  165. package/build/lib/schemas/index.d.ts.map +1 -1
  166. package/build/lib/schemas/index.js +1 -1
  167. package/build/lib/schemas/index.js.map +1 -1
  168. package/build/lib/schemas/lockfile.d.ts +18 -0
  169. package/build/lib/schemas/lockfile.d.ts.map +1 -1
  170. package/build/lib/schemas/lockfile.js +10 -0
  171. package/build/lib/schemas/lockfile.js.map +1 -1
  172. package/build/lib/tool-resolver.d.ts +17 -6
  173. package/build/lib/tool-resolver.d.ts.map +1 -1
  174. package/build/lib/tool-resolver.js +31 -15
  175. package/build/lib/tool-resolver.js.map +1 -1
  176. package/build/lib/updater.d.ts.map +1 -1
  177. package/build/lib/updater.js +2 -1
  178. package/build/lib/updater.js.map +1 -1
  179. package/package.json +78 -65
  180. package/tool-adapters/claude-code.json +1 -1
  181. package/tool-adapters/copilot-cli.json +1 -1
@@ -0,0 +1,342 @@
1
+ import { useEffect, useReducer, useRef } from 'react';
2
+ import { findInstalledAsset, LockfileLockedError, readLockfile, withLockfileLock } from '../lib/lockfile.js';
3
+ import { findProjectRoot } from '../lib/paths.js';
4
+ import { fetchRegistry, findBundle } from '../lib/registry.js';
5
+ import { resolveTools } from '../lib/tool-resolver.js';
6
+ import { executeBundleUninstall, planBundleUninstall, planUninstall, uninstallAsset } from '../lib/uninstaller.js';
7
+ // ---------------------------------------------------------------------------
8
+ // Initial state factory
9
+ // ---------------------------------------------------------------------------
10
+ export function createInitialState(flags) {
11
+ return {
12
+ bundleError: null,
13
+ bundleResult: null,
14
+ errorMessage: '',
15
+ flags,
16
+ outcome: null,
17
+ phase: 'loading',
18
+ progress: 'Initializing...',
19
+ singleError: null,
20
+ singleResult: null,
21
+ };
22
+ }
23
+ // ---------------------------------------------------------------------------
24
+ // Pure reducer
25
+ // ---------------------------------------------------------------------------
26
+ export function uninstallReducer(state, action) {
27
+ switch (action.type) {
28
+ case 'CANCEL': {
29
+ // Cancellation from the confirming phase leads to done
30
+ if (state.phase !== 'confirming')
31
+ return state;
32
+ return { ...state, phase: 'done' };
33
+ }
34
+ case 'CONFIRM': {
35
+ // Confirmation from the confirming phase transitions to executing
36
+ if (state.phase !== 'confirming')
37
+ return state;
38
+ return { ...state, phase: 'executing', progress: 'Executing...' };
39
+ }
40
+ case 'ERROR':
41
+ return { ...state, errorMessage: action.message, phase: 'error' };
42
+ case 'EXECUTE_DONE': {
43
+ return {
44
+ ...state,
45
+ bundleError: action.bundleError ?? state.bundleError,
46
+ bundleResult: action.bundleResult ?? state.bundleResult,
47
+ phase: 'done',
48
+ singleError: action.singleError ?? state.singleError,
49
+ singleResult: action.singleResult ?? state.singleResult,
50
+ };
51
+ }
52
+ case 'EXECUTE_ERROR': {
53
+ return { ...state, errorMessage: action.message, phase: 'error' };
54
+ }
55
+ case 'EXECUTE_PROGRESS': {
56
+ if (state.phase !== 'executing')
57
+ return state;
58
+ return { ...state, progress: action.message };
59
+ }
60
+ case 'LOAD_DONE': {
61
+ const { outcome } = action;
62
+ // Determine the next phase based on the outcome variant
63
+ switch (outcome.outcome) {
64
+ // Confirmation needed
65
+ case 'bundle-confirming':
66
+ case 'confirming':
67
+ return { ...state, outcome, phase: 'confirming' };
68
+ // Terminal outcomes — go straight to done
69
+ case 'bundle-not-installed':
70
+ case 'bundle-success':
71
+ case 'dry-run-bundle':
72
+ // falls through
73
+ case 'dry-run-single':
74
+ case 'not-installed':
75
+ case 'success':
76
+ return { ...state, outcome, phase: 'done' };
77
+ default:
78
+ return { ...state, outcome, phase: 'done' };
79
+ }
80
+ }
81
+ case 'LOAD_PROGRESS': {
82
+ if (state.phase !== 'loading')
83
+ return state;
84
+ return { ...state, progress: action.message };
85
+ }
86
+ default:
87
+ return state;
88
+ }
89
+ }
90
+ // ---------------------------------------------------------------------------
91
+ // Hook
92
+ // ---------------------------------------------------------------------------
93
+ export function useUninstallState(flags) {
94
+ const [state, dispatch] = useReducer(uninstallReducer, undefined, () => createInitialState(flags));
95
+ // Guard against React development-mode double-firing of effects.
96
+ const hasLoadedRef = useRef(false);
97
+ // --- Loading phase-gated effect ---
98
+ useEffect(() => {
99
+ if (state.phase !== 'loading')
100
+ return;
101
+ if (hasLoadedRef.current)
102
+ return;
103
+ hasLoadedRef.current = true;
104
+ let cancelled = false;
105
+ const load = async () => {
106
+ const { cascade, dryRun, name, projectRoot, refresh, tool, yes } = state.flags;
107
+ const projectDir = findProjectRoot(projectRoot);
108
+ const tools = await resolveTools(tool);
109
+ const toolNames = tools.map((t) => t.tool);
110
+ // Step 1: Try bundle detection first
111
+ dispatch({ message: 'Fetching registry...', type: 'LOAD_PROGRESS' });
112
+ const registry = await fetchRegistry({ force: refresh });
113
+ if (cancelled)
114
+ return;
115
+ const bundle = findBundle(registry, name);
116
+ if (bundle) {
117
+ // Bundle uninstall path
118
+ dispatch({ message: 'Planning bundle removal...', type: 'LOAD_PROGRESS' });
119
+ const lockfile = await readLockfile(projectDir);
120
+ if (cancelled)
121
+ return;
122
+ const plan = planBundleUninstall(lockfile, bundle.name, bundle.version);
123
+ // If nothing to remove, return not-installed outcome
124
+ if (plan.assetsToRemove.length === 0 && plan.orphansToRemove.length === 0) {
125
+ dispatch({ outcome: { bundleName: bundle.name, outcome: 'bundle-not-installed' }, type: 'LOAD_DONE' });
126
+ return;
127
+ }
128
+ // Dry-run: return plan without executing
129
+ if (dryRun) {
130
+ dispatch({ outcome: { outcome: 'dry-run-bundle', plan, tools: toolNames }, type: 'LOAD_DONE' });
131
+ return;
132
+ }
133
+ // If --yes flag, execute immediately for all tools
134
+ if (yes) {
135
+ dispatch({ message: 'Removing bundle assets...', type: 'LOAD_PROGRESS' });
136
+ // Execute bundle uninstall with the first adapter (bundle uninstall works on lockfile entries)
137
+ const result = await executeBundleUninstall(plan, {
138
+ adapter: tools[0].adapter,
139
+ cascade,
140
+ onProgress: (message) => {
141
+ if (!cancelled)
142
+ dispatch({ message, type: 'LOAD_PROGRESS' });
143
+ },
144
+ projectDir,
145
+ });
146
+ if (cancelled)
147
+ return;
148
+ dispatch({ outcome: { outcome: 'bundle-success', plan, result, tools: toolNames }, type: 'LOAD_DONE' });
149
+ return;
150
+ }
151
+ // Otherwise, return the plan for confirmation prompt
152
+ if (!process.stdin.isTTY) {
153
+ dispatch({
154
+ message: 'Confirmation required but stdin is not interactive. Use --yes (-y) to skip the prompt.',
155
+ type: 'ERROR',
156
+ });
157
+ return;
158
+ }
159
+ dispatch({ outcome: { outcome: 'bundle-confirming', plan, tools }, type: 'LOAD_DONE' });
160
+ return;
161
+ }
162
+ // Dry-run for single asset: read lockfile directly (skip lock), compute plan, return
163
+ if (dryRun) {
164
+ dispatch({ message: 'Reading lockfile...', type: 'LOAD_PROGRESS' });
165
+ const lockfile = await readLockfile(projectDir);
166
+ if (cancelled)
167
+ return;
168
+ const installed = findInstalledAsset(lockfile, name);
169
+ if (!installed) {
170
+ dispatch({ outcome: { name, outcome: 'not-installed' }, type: 'LOAD_DONE' });
171
+ return;
172
+ }
173
+ const plan = planUninstall(lockfile, name);
174
+ dispatch({ outcome: { outcome: 'dry-run-single', plan, tools }, type: 'LOAD_DONE' });
175
+ return;
176
+ }
177
+ // Fall through to existing single-asset uninstall logic
178
+ try {
179
+ const result = await withLockfileLock(projectDir, async () => {
180
+ dispatch({ message: 'Reading lockfile...', type: 'LOAD_PROGRESS' });
181
+ const lockfile = await readLockfile(projectDir);
182
+ if (cancelled)
183
+ return null;
184
+ const installed = findInstalledAsset(lockfile, name);
185
+ if (!installed) {
186
+ return { name, outcome: 'not-installed' };
187
+ }
188
+ // Compute the plan for display
189
+ const plan = planUninstall(lockfile, name);
190
+ // If dependents exist and no --yes flag, ask for confirmation
191
+ if (plan.dependents.length > 0 && !yes) {
192
+ if (!process.stdin.isTTY) {
193
+ throw new Error('Confirmation required but stdin is not interactive. Use --yes (-y) to skip the prompt.');
194
+ }
195
+ return {
196
+ adapter: tools[0].adapter,
197
+ lockfile,
198
+ outcome: 'confirming',
199
+ plan,
200
+ tool: tools[0].tool,
201
+ tools,
202
+ };
203
+ }
204
+ // Uninstall for all tools
205
+ dispatch({ message: `Uninstalling ${name}...`, type: 'LOAD_PROGRESS' });
206
+ const toolResults = [];
207
+ for (const { adapter: toolAdapter, tool: toolName } of tools) {
208
+ const results = await uninstallAsset(name, {
209
+ adapter: toolAdapter,
210
+ cascade,
211
+ lockfile,
212
+ onProgress: (message) => {
213
+ if (!cancelled)
214
+ dispatch({ message, type: 'LOAD_PROGRESS' });
215
+ },
216
+ plan,
217
+ projectDir,
218
+ });
219
+ toolResults.push({ plan, results, tool: toolName });
220
+ }
221
+ return { outcome: 'success', toolResults };
222
+ });
223
+ if (cancelled)
224
+ return;
225
+ if (result === null)
226
+ return;
227
+ dispatch({ outcome: result, type: 'LOAD_DONE' });
228
+ }
229
+ catch (error) {
230
+ if (cancelled)
231
+ return;
232
+ if (error instanceof LockfileLockedError) {
233
+ dispatch({
234
+ message: 'Another ATK process is currently modifying this project. Please wait and try again.',
235
+ type: 'ERROR',
236
+ });
237
+ return;
238
+ }
239
+ throw error;
240
+ }
241
+ };
242
+ load().catch((err) => {
243
+ if (!cancelled) {
244
+ dispatch({ message: err instanceof Error ? err.message : String(err), type: 'ERROR' });
245
+ }
246
+ });
247
+ return () => {
248
+ cancelled = true;
249
+ };
250
+ // Phase-gated effect: only runs when entering 'loading'
251
+ // eslint-disable-next-line react-hooks/exhaustive-deps
252
+ }, [state.phase]);
253
+ // --- Executing phase-gated effect ---
254
+ useEffect(() => {
255
+ if (state.phase !== 'executing')
256
+ return;
257
+ let cancelled = false;
258
+ const execute = async () => {
259
+ const { outcome } = state;
260
+ if (!outcome) {
261
+ dispatch({ message: 'Internal error: no outcome available for execution.', type: 'EXECUTE_ERROR' });
262
+ return;
263
+ }
264
+ const { cascade, name, projectRoot } = state.flags;
265
+ const projectDir = findProjectRoot(projectRoot);
266
+ // Handle bundle confirmation execution
267
+ if (outcome.outcome === 'bundle-confirming') {
268
+ const { plan, tools } = outcome;
269
+ try {
270
+ // Execute with first adapter (bundle uninstall works on lockfile entries)
271
+ const result = await executeBundleUninstall(plan, {
272
+ adapter: tools[0].adapter,
273
+ cascade,
274
+ onProgress: (message) => {
275
+ if (!cancelled)
276
+ dispatch({ message, type: 'EXECUTE_PROGRESS' });
277
+ },
278
+ projectDir,
279
+ });
280
+ if (cancelled)
281
+ return;
282
+ dispatch({ bundleResult: result, type: 'EXECUTE_DONE' });
283
+ }
284
+ catch (err) {
285
+ if (cancelled)
286
+ return;
287
+ dispatch({
288
+ bundleError: err instanceof Error ? err.message : String(err),
289
+ type: 'EXECUTE_DONE',
290
+ });
291
+ }
292
+ return;
293
+ }
294
+ // Handle single-asset confirmation execution for all tools
295
+ if (outcome.outcome === 'confirming') {
296
+ const { lockfile, plan, tools } = outcome;
297
+ try {
298
+ // Uninstall for all tools
299
+ const allResults = [];
300
+ for (const { adapter: toolAdapter } of tools) {
301
+ const results = await uninstallAsset(name, {
302
+ adapter: toolAdapter,
303
+ cascade,
304
+ lockfile,
305
+ onProgress: (message) => {
306
+ if (!cancelled)
307
+ dispatch({ message, type: 'EXECUTE_PROGRESS' });
308
+ },
309
+ plan,
310
+ projectDir,
311
+ });
312
+ allResults.push(...results);
313
+ }
314
+ if (cancelled)
315
+ return;
316
+ dispatch({ singleResult: allResults, type: 'EXECUTE_DONE' });
317
+ }
318
+ catch (err) {
319
+ if (cancelled)
320
+ return;
321
+ dispatch({
322
+ singleError: err instanceof Error ? err.message : String(err),
323
+ type: 'EXECUTE_DONE',
324
+ });
325
+ }
326
+ return;
327
+ }
328
+ };
329
+ execute().catch((err) => {
330
+ if (!cancelled) {
331
+ dispatch({ message: err instanceof Error ? err.message : String(err), type: 'EXECUTE_ERROR' });
332
+ }
333
+ });
334
+ return () => {
335
+ cancelled = true;
336
+ };
337
+ // Phase-gated effect: only runs when entering 'executing'
338
+ // eslint-disable-next-line react-hooks/exhaustive-deps
339
+ }, [state.phase]);
340
+ return [state, dispatch];
341
+ }
342
+ //# sourceMappingURL=useUninstallState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUninstallState.js","sourceRoot":"","sources":["../../src/hooks/useUninstallState.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,25 @@
1
+ /** Describes a single config-entry verification failure. */
2
+ export interface ConfigEntryFailure {
3
+ file: string;
4
+ key: string;
5
+ reason: ConfigEntryFailureReason;
6
+ }
7
+ /** Reason a config-entry verification can fail. */
8
+ export type ConfigEntryFailureReason = 'CONFIG_CHECKSUM_MISMATCH' | 'CONFIG_FILE_NOT_FOUND' | 'CONFIG_KEY_NOT_FOUND';
9
+ /** Recursively collect all files in a directory. */
10
+ export declare function collectFilesRecursive(dirPath: string, baseDir: string): Promise<Array<{
11
+ absolutePath: string;
12
+ relativePath: string;
13
+ }>>;
14
+ /**
15
+ * Compute a deterministic SHA-256 checksum for a config entry value.
16
+ *
17
+ * Strips the `_managedBy` metadata key (added by ATK at write time),
18
+ * serializes the remaining keys in sorted order, and returns the hex digest.
19
+ * Both the installer (write path) and the verifier (read path) use this
20
+ * helper so the checksum logic stays in one place.
21
+ */
22
+ export declare function computeConfigEntryChecksum(entry: Record<string, unknown>): string;
1
23
  /**
2
24
  * Compute a combined SHA-256 hash for all files in a directory (recursively).
3
25
  * Files are sorted by relative path to ensure deterministic output.
@@ -28,4 +50,21 @@ export declare function verifyChecksums(files: Array<{
28
50
  expected: string;
29
51
  path: string;
30
52
  }>>;
53
+ /**
54
+ * Verify config-file entries against their expected checksums.
55
+ *
56
+ * For each entry the function:
57
+ * 1. Reads and parses the config file as JSON → `CONFIG_FILE_NOT_FOUND` on failure.
58
+ * 2. Splits the dot-path key into section/child and looks up the value →
59
+ * `CONFIG_KEY_NOT_FOUND` if missing.
60
+ * 3. Computes a checksum via `computeConfigEntryChecksum()` and compares →
61
+ * `CONFIG_CHECKSUM_MISMATCH` on divergence.
62
+ *
63
+ * Returns only the entries that failed (empty array = all OK).
64
+ */
65
+ export declare function verifyConfigEntries(entries: Array<{
66
+ checksum: string;
67
+ file: string;
68
+ key: string;
69
+ }>, projectDir: string): Promise<ConfigEntryFailure[]>;
31
70
  //# sourceMappingURL=checksum.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../../src/lib/checksum.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAcpE;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjG;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAC/C,OAAO,CAAC,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAgBpE"}
1
+ {"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../../src/lib/checksum.ts"],"names":[],"mappings":"AAIA,4DAA4D;AAC5D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,wBAAwB,CAAC;CAClC;AAED,mDAAmD;AACnD,MAAM,MAAM,wBAAwB,GAChC,0BAA0B,GAC1B,uBAAuB,GACvB,sBAAsB,CAAC;AAE3B,oDAAoD;AACpD,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAgBhE;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAMjF;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAcpE;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjG;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAC/C,OAAO,CAAC,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAgBpE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,EAC/D,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAsE/B"}
@@ -1,12 +1,43 @@
1
1
  import { createHash } from 'node:crypto';
2
2
  import { readdir, readFile } from 'node:fs/promises';
3
3
  import { join } from 'node:path';
4
+ /** Recursively collect all files in a directory. */
5
+ export async function collectFilesRecursive(dirPath, baseDir) {
6
+ const results = [];
7
+ const entries = await readdir(dirPath, { withFileTypes: true });
8
+ for (const entry of entries) {
9
+ const fullPath = join(dirPath, entry.name);
10
+ if (entry.isDirectory()) {
11
+ const subFiles = await collectFilesRecursive(fullPath, baseDir);
12
+ results.push(...subFiles);
13
+ }
14
+ else if (entry.isFile()) {
15
+ const relativePath = fullPath.slice(baseDir.length + 1).replace(/\\/g, '/');
16
+ results.push({ absolutePath: fullPath, relativePath });
17
+ }
18
+ }
19
+ return results;
20
+ }
21
+ /**
22
+ * Compute a deterministic SHA-256 checksum for a config entry value.
23
+ *
24
+ * Strips the `_managedBy` metadata key (added by ATK at write time),
25
+ * serializes the remaining keys in sorted order, and returns the hex digest.
26
+ * Both the installer (write path) and the verifier (read path) use this
27
+ * helper so the checksum logic stays in one place.
28
+ */
29
+ export function computeConfigEntryChecksum(entry) {
30
+ const cleaned = { ...entry };
31
+ delete cleaned['_managedBy'];
32
+ const serialized = JSON.stringify(cleaned, Object.keys(cleaned).sort());
33
+ return hashString(serialized);
34
+ }
4
35
  /**
5
36
  * Compute a combined SHA-256 hash for all files in a directory (recursively).
6
37
  * Files are sorted by relative path to ensure deterministic output.
7
38
  */
8
39
  export async function hashDirectory(dirPath) {
9
- const files = await collectFiles(dirPath, dirPath);
40
+ const files = await collectFilesRecursive(dirPath, dirPath);
10
41
  files.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
11
42
  const hash = createHash('sha256');
12
43
  for (const file of files) {
@@ -58,21 +89,78 @@ export async function verifyChecksums(files) {
58
89
  }
59
90
  return failures;
60
91
  }
61
- /** Recursively collect all files in a directory. */
62
- async function collectFiles(dirPath, baseDir) {
63
- const results = [];
64
- const entries = await readdir(dirPath, { withFileTypes: true });
92
+ /**
93
+ * Verify config-file entries against their expected checksums.
94
+ *
95
+ * For each entry the function:
96
+ * 1. Reads and parses the config file as JSON → `CONFIG_FILE_NOT_FOUND` on failure.
97
+ * 2. Splits the dot-path key into section/child and looks up the value →
98
+ * `CONFIG_KEY_NOT_FOUND` if missing.
99
+ * 3. Computes a checksum via `computeConfigEntryChecksum()` and compares →
100
+ * `CONFIG_CHECKSUM_MISMATCH` on divergence.
101
+ *
102
+ * Returns only the entries that failed (empty array = all OK).
103
+ */
104
+ export async function verifyConfigEntries(entries, projectDir) {
105
+ const failures = [];
65
106
  for (const entry of entries) {
66
- const fullPath = join(dirPath, entry.name);
67
- if (entry.isDirectory()) {
68
- const subFiles = await collectFiles(fullPath, baseDir);
69
- results.push(...subFiles);
107
+ const absolutePath = join(projectDir, entry.file);
108
+ // 1. Read and parse the config file
109
+ let config;
110
+ try {
111
+ const raw = await readFile(absolutePath, 'utf-8');
112
+ config = JSON.parse(raw);
70
113
  }
71
- else if (entry.isFile()) {
72
- const relativePath = fullPath.slice(baseDir.length + 1).replace(/\\/g, '/');
73
- results.push({ absolutePath: fullPath, relativePath });
114
+ catch {
115
+ failures.push({ file: entry.file, key: entry.key, reason: 'CONFIG_FILE_NOT_FOUND' });
116
+ continue;
117
+ }
118
+ // 2. Look up the value via dot-path (sectionKey.childKey)
119
+ const dotIndex = entry.key.indexOf('.');
120
+ const sectionKey = dotIndex === -1 ? entry.key : entry.key.slice(0, dotIndex);
121
+ const childKey = dotIndex === -1 ? undefined : entry.key.slice(dotIndex + 1);
122
+ const section = config[sectionKey];
123
+ if (childKey === undefined ||
124
+ section === null ||
125
+ section === undefined ||
126
+ typeof section !== 'object') {
127
+ // No child key means the key format is unexpected, or section missing
128
+ if (childKey === undefined) {
129
+ // Single-segment key — look up directly
130
+ if (!(sectionKey in config)) {
131
+ failures.push({ file: entry.file, key: entry.key, reason: 'CONFIG_KEY_NOT_FOUND' });
132
+ continue;
133
+ }
134
+ const value = config[sectionKey];
135
+ if (value === null || value === undefined || typeof value !== 'object') {
136
+ failures.push({ file: entry.file, key: entry.key, reason: 'CONFIG_KEY_NOT_FOUND' });
137
+ continue;
138
+ }
139
+ const actual = computeConfigEntryChecksum(value);
140
+ if (actual !== entry.checksum) {
141
+ failures.push({ file: entry.file, key: entry.key, reason: 'CONFIG_CHECKSUM_MISMATCH' });
142
+ }
143
+ continue;
144
+ }
145
+ failures.push({ file: entry.file, key: entry.key, reason: 'CONFIG_KEY_NOT_FOUND' });
146
+ continue;
147
+ }
148
+ const sectionObj = section;
149
+ if (!(childKey in sectionObj)) {
150
+ failures.push({ file: entry.file, key: entry.key, reason: 'CONFIG_KEY_NOT_FOUND' });
151
+ continue;
152
+ }
153
+ const value = sectionObj[childKey];
154
+ if (value === null || value === undefined || typeof value !== 'object') {
155
+ failures.push({ file: entry.file, key: entry.key, reason: 'CONFIG_KEY_NOT_FOUND' });
156
+ continue;
157
+ }
158
+ // 3. Compute checksum and compare
159
+ const actual = computeConfigEntryChecksum(value);
160
+ if (actual !== entry.checksum) {
161
+ failures.push({ file: entry.file, key: entry.key, reason: 'CONFIG_CHECKSUM_MISMATCH' });
74
162
  }
75
163
  }
76
- return results;
164
+ return failures;
77
165
  }
78
166
  //# sourceMappingURL=checksum.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"checksum.js","sourceRoot":"","sources":["../../src/lib/checksum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnE,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,gEAAgE;QAChE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,gBAAwB;IAC7E,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,MAAM,KAAK,gBAAgB,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAgD;IAEhD,MAAM,QAAQ,GAA8D,EAAE,CAAC;IAE/E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,mBAAmB,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,oDAAoD;AACpD,KAAK,UAAU,YAAY,CACzB,OAAe,EACf,OAAe;IAEf,MAAM,OAAO,GAA0D,EAAE,CAAC;IAC1E,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC5B,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1B,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC5E,OAAO,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"checksum.js","sourceRoot":"","sources":["../../src/lib/checksum.ts"],"names":[],"mappings":"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"}
@@ -40,20 +40,23 @@ export declare function saveConfig(config: Config): Promise<void>;
40
40
  export declare function getProjectConfigPath(projectDir: string): string;
41
41
  /**
42
42
  * Check whether a local project config (.atkrc.json) exists in the given directory.
43
+ * The config stores the developer's selected tools (`tools: string[]`).
43
44
  */
44
45
  export declare function hasLocalConfig(projectDir: string): boolean;
45
46
  /**
46
47
  * Load merged config: user-level config only.
47
- * Project config now only stores `{ tool }` and does not contribute to Config fields.
48
+ * Project config now only stores `{ tools: string[] }` and does not contribute to Config fields.
48
49
  */
49
50
  export declare function loadMergedConfig(projectDir: string): Promise<Config>;
50
51
  /**
51
52
  * Load the project-level config from .atkrc.json in the project directory.
52
53
  * Returns null if no project config exists.
54
+ * Legacy `{ tool: string }` files are automatically migrated to `{ tools: string[] }` on read via schema preprocess.
53
55
  */
54
56
  export declare function loadProjectConfig(projectDir: string): Promise<null | ProjectConfig>;
55
57
  /**
56
58
  * Save the project-level config to .atkrc.json in the project directory.
59
+ * Always writes the new `{ tools: string[] }` format, never the legacy `{ tool }` format.
57
60
  */
58
61
  export declare function saveProjectConfig(projectDir: string, config: ProjectConfig): Promise<void>;
59
62
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,MAAM,EAGX,KAAK,aAAa,EAEnB,MAAM,qBAAqB,CAAC;AAI7B;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAKnE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAe5G;AAED;;;;GAIG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAUlD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBpE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB9D;AAID;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK1E;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC,CASzF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBhG;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAuBjF"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,MAAM,EAGX,KAAK,aAAa,EAEnB,MAAM,qBAAqB,CAAC;AAI7B;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAKnE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAe5G;AAED;;;;GAIG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAUlD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBpE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB9D;AAID;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK1E;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC,CASzF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAchG;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAuBjF"}