@blockspool/cli 0.3.2 → 0.4.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.
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Retention & Cleanup
3
+ *
4
+ * Prune logic for all unbounded state accumulation points.
5
+ * Called automatically on session start and via `blockspool prune`.
6
+ */
7
+ import * as fs from 'node:fs';
8
+ import * as path from 'node:path';
9
+ import { spawnSync } from 'node:child_process';
10
+ import { DEFAULT_RETENTION_CONFIG, getBlockspoolDir, } from './solo-config.js';
11
+ import { readRunState, writeRunState } from './run-state.js';
12
+ function emptyReport() {
13
+ return {
14
+ runFoldersRemoved: 0,
15
+ historyLinesRemoved: 0,
16
+ artifactsRemoved: 0,
17
+ spoolArchivesRemoved: 0,
18
+ deferredProposalsRemoved: 0,
19
+ completedTicketsRemoved: 0,
20
+ mergedBranchesRemoved: 0,
21
+ totalPruned: 0,
22
+ };
23
+ }
24
+ // =============================================================================
25
+ // Config helper
26
+ // =============================================================================
27
+ export function getRetentionConfig(config) {
28
+ return {
29
+ ...DEFAULT_RETENTION_CONFIG,
30
+ ...(config?.retention ?? {}),
31
+ };
32
+ }
33
+ // =============================================================================
34
+ // Individual prune functions
35
+ // =============================================================================
36
+ /**
37
+ * Sort .blockspool/runs/ by mtime, delete oldest beyond cap.
38
+ */
39
+ export function pruneRunFolders(repoRoot, maxRuns, dryRun = false) {
40
+ const runsDir = path.join(getBlockspoolDir(repoRoot), 'runs');
41
+ if (!fs.existsSync(runsDir))
42
+ return 0;
43
+ const entries = fs.readdirSync(runsDir, { withFileTypes: true })
44
+ .filter(e => e.isDirectory())
45
+ .map(e => ({
46
+ name: e.name,
47
+ path: path.join(runsDir, e.name),
48
+ mtime: fs.statSync(path.join(runsDir, e.name)).mtimeMs,
49
+ }))
50
+ .sort((a, b) => b.mtime - a.mtime); // newest first
51
+ if (entries.length <= maxRuns)
52
+ return 0;
53
+ const toRemove = entries.slice(maxRuns);
54
+ if (!dryRun) {
55
+ for (const entry of toRemove) {
56
+ fs.rmSync(entry.path, { recursive: true, force: true });
57
+ }
58
+ }
59
+ return toRemove.length;
60
+ }
61
+ /**
62
+ * Keep last N lines in history.ndjson, rewrite file.
63
+ */
64
+ export function pruneHistory(repoRoot, maxEntries, dryRun = false) {
65
+ const historyPath = path.join(getBlockspoolDir(repoRoot), 'history.ndjson');
66
+ if (!fs.existsSync(historyPath))
67
+ return 0;
68
+ const content = fs.readFileSync(historyPath, 'utf-8');
69
+ const lines = content.split('\n').filter(l => l.trim().length > 0);
70
+ if (lines.length <= maxEntries)
71
+ return 0;
72
+ const removed = lines.length - maxEntries;
73
+ if (!dryRun) {
74
+ const kept = lines.slice(-maxEntries);
75
+ fs.writeFileSync(historyPath, kept.join('\n') + '\n');
76
+ }
77
+ return removed;
78
+ }
79
+ /**
80
+ * Within each run folder, keep newest N artifact files.
81
+ */
82
+ export function pruneArtifacts(repoRoot, maxPerRun, dryRun = false) {
83
+ const runsDir = path.join(getBlockspoolDir(repoRoot), 'runs');
84
+ if (!fs.existsSync(runsDir))
85
+ return 0;
86
+ let totalRemoved = 0;
87
+ const runDirs = fs.readdirSync(runsDir, { withFileTypes: true })
88
+ .filter(e => e.isDirectory());
89
+ for (const runDir of runDirs) {
90
+ const runPath = path.join(runsDir, runDir.name);
91
+ const files = fs.readdirSync(runPath, { withFileTypes: true })
92
+ .filter(e => e.isFile())
93
+ .map(e => ({
94
+ name: e.name,
95
+ path: path.join(runPath, e.name),
96
+ mtime: fs.statSync(path.join(runPath, e.name)).mtimeMs,
97
+ }))
98
+ .sort((a, b) => b.mtime - a.mtime);
99
+ if (files.length <= maxPerRun)
100
+ continue;
101
+ const toRemove = files.slice(maxPerRun);
102
+ if (!dryRun) {
103
+ for (const file of toRemove) {
104
+ fs.unlinkSync(file.path);
105
+ }
106
+ }
107
+ totalRemoved += toRemove.length;
108
+ }
109
+ return totalRemoved;
110
+ }
111
+ /**
112
+ * Delete oldest *.archived.ndjson in spool/ beyond cap.
113
+ */
114
+ export function pruneSpoolArchives(repoRoot, maxArchives, dryRun = false) {
115
+ const spoolDir = path.join(getBlockspoolDir(repoRoot), 'spool');
116
+ if (!fs.existsSync(spoolDir))
117
+ return 0;
118
+ const archives = fs.readdirSync(spoolDir)
119
+ .filter(f => f.endsWith('.archived.ndjson'))
120
+ .map(f => ({
121
+ name: f,
122
+ path: path.join(spoolDir, f),
123
+ mtime: fs.statSync(path.join(spoolDir, f)).mtimeMs,
124
+ }))
125
+ .sort((a, b) => b.mtime - a.mtime);
126
+ if (archives.length <= maxArchives)
127
+ return 0;
128
+ const toRemove = archives.slice(maxArchives);
129
+ if (!dryRun) {
130
+ for (const archive of toRemove) {
131
+ fs.unlinkSync(archive.path);
132
+ }
133
+ }
134
+ return toRemove.length;
135
+ }
136
+ /**
137
+ * Trim oldest deferred proposals from run-state.json beyond cap.
138
+ */
139
+ export function pruneDeferredProposals(repoRoot, maxDeferred, dryRun = false) {
140
+ const state = readRunState(repoRoot);
141
+ if (state.deferredProposals.length <= maxDeferred)
142
+ return 0;
143
+ const removed = state.deferredProposals.length - maxDeferred;
144
+ if (!dryRun) {
145
+ // Keep the newest (last added)
146
+ state.deferredProposals = state.deferredProposals.slice(-maxDeferred);
147
+ writeRunState(repoRoot, state);
148
+ }
149
+ return removed;
150
+ }
151
+ /**
152
+ * Hard-delete oldest completed tickets beyond cap.
153
+ * Uses the DatabaseAdapter interface (Postgres $1 placeholders).
154
+ */
155
+ export async function pruneCompletedTickets(adapter, maxCompleted, dryRun = false) {
156
+ if (!adapter)
157
+ return 0;
158
+ try {
159
+ const countResult = await adapter.query(`SELECT COUNT(*) as cnt FROM tickets WHERE status = 'done'`);
160
+ const count = countResult.rows[0]?.cnt ?? 0;
161
+ if (count <= maxCompleted)
162
+ return 0;
163
+ const toRemove = count - maxCompleted;
164
+ if (!dryRun) {
165
+ // Subquery to find oldest N completed tickets, then delete them.
166
+ // Works on both SQLite and Postgres.
167
+ await adapter.query(`DELETE FROM tickets WHERE id IN (
168
+ SELECT id FROM tickets WHERE status = 'done'
169
+ ORDER BY updated_at ASC LIMIT $1
170
+ )`, [toRemove]);
171
+ }
172
+ return toRemove;
173
+ }
174
+ catch {
175
+ // Table might not exist or schema differs — non-fatal
176
+ return 0;
177
+ }
178
+ }
179
+ /**
180
+ * Delete local blockspool/* branches that are fully merged, keeping the
181
+ * newest N merged branches. Only touches local branches — never deletes
182
+ * remote branches, and never touches unmerged branches.
183
+ *
184
+ * NOT called during auto-prune-on-start — only via `blockspool prune`.
185
+ */
186
+ export function pruneMergedBranches(repoRoot, maxMergedBranches, dryRun = false) {
187
+ try {
188
+ // Get the list of blockspool/* branches that are fully merged into HEAD
189
+ const mergedResult = spawnSync('git', ['branch', '--merged', 'HEAD', '--list', 'blockspool/*', '--sort=-committerdate', '--format=%(refname:short)'], { cwd: repoRoot, encoding: 'utf-8' });
190
+ if (mergedResult.status !== 0 || !mergedResult.stdout)
191
+ return 0;
192
+ // Check current branch so we never delete it
193
+ const headResult = spawnSync('git', ['branch', '--show-current'], {
194
+ cwd: repoRoot,
195
+ encoding: 'utf-8',
196
+ });
197
+ const currentBranch = headResult.stdout?.trim() ?? '';
198
+ const mergedBranches = mergedResult.stdout.trim().split('\n')
199
+ .filter(b => b && b !== currentBranch);
200
+ if (mergedBranches.length <= maxMergedBranches)
201
+ return 0;
202
+ // Keep the newest N, delete the rest
203
+ const toDelete = mergedBranches.slice(maxMergedBranches);
204
+ let removed = 0;
205
+ if (!dryRun) {
206
+ for (const branch of toDelete) {
207
+ const delResult = spawnSync('git', ['branch', '-d', branch], {
208
+ cwd: repoRoot,
209
+ encoding: 'utf-8',
210
+ });
211
+ if (delResult.status === 0)
212
+ removed++;
213
+ }
214
+ }
215
+ else {
216
+ removed = toDelete.length;
217
+ }
218
+ return removed;
219
+ }
220
+ catch {
221
+ return 0;
222
+ }
223
+ }
224
+ // =============================================================================
225
+ // Main prune (sync — file-system only)
226
+ // =============================================================================
227
+ export function pruneAll(repoRoot, config, dryRun = false) {
228
+ const report = emptyReport();
229
+ report.runFoldersRemoved = pruneRunFolders(repoRoot, config.maxRuns, dryRun);
230
+ report.historyLinesRemoved = pruneHistory(repoRoot, config.maxHistoryEntries, dryRun);
231
+ report.artifactsRemoved = pruneArtifacts(repoRoot, config.maxArtifactsPerRun, dryRun);
232
+ report.spoolArchivesRemoved = pruneSpoolArchives(repoRoot, config.maxSpoolArchives, dryRun);
233
+ report.deferredProposalsRemoved = pruneDeferredProposals(repoRoot, config.maxDeferredProposals, dryRun);
234
+ // Branch pruning is NOT run here — only via explicit `blockspool prune`
235
+ report.totalPruned =
236
+ report.runFoldersRemoved +
237
+ report.historyLinesRemoved +
238
+ report.artifactsRemoved +
239
+ report.spoolArchivesRemoved +
240
+ report.deferredProposalsRemoved;
241
+ return report;
242
+ }
243
+ /**
244
+ * Full prune including async DB operations.
245
+ */
246
+ export async function pruneAllAsync(repoRoot, config, adapter = null, dryRun = false) {
247
+ const report = pruneAll(repoRoot, config, dryRun);
248
+ report.completedTicketsRemoved = await pruneCompletedTickets(adapter, config.maxCompletedTickets, dryRun);
249
+ report.mergedBranchesRemoved = pruneMergedBranches(repoRoot, config.maxMergedBranches, dryRun);
250
+ report.totalPruned += report.completedTicketsRemoved + report.mergedBranchesRemoved;
251
+ return report;
252
+ }
253
+ /**
254
+ * Format a prune report for display.
255
+ */
256
+ export function formatPruneReport(report, dryRun = false) {
257
+ const prefix = dryRun ? 'Would remove' : 'Removed';
258
+ const lines = [];
259
+ if (report.runFoldersRemoved > 0) {
260
+ lines.push(` ${prefix} ${report.runFoldersRemoved} run folder(s)`);
261
+ }
262
+ if (report.historyLinesRemoved > 0) {
263
+ lines.push(` ${prefix} ${report.historyLinesRemoved} history line(s)`);
264
+ }
265
+ if (report.artifactsRemoved > 0) {
266
+ lines.push(` ${prefix} ${report.artifactsRemoved} artifact file(s)`);
267
+ }
268
+ if (report.spoolArchivesRemoved > 0) {
269
+ lines.push(` ${prefix} ${report.spoolArchivesRemoved} spool archive(s)`);
270
+ }
271
+ if (report.deferredProposalsRemoved > 0) {
272
+ lines.push(` ${prefix} ${report.deferredProposalsRemoved} deferred proposal(s)`);
273
+ }
274
+ if (report.completedTicketsRemoved > 0) {
275
+ lines.push(` ${prefix} ${report.completedTicketsRemoved} completed ticket(s)`);
276
+ }
277
+ if (report.mergedBranchesRemoved > 0) {
278
+ lines.push(` ${prefix} ${report.mergedBranchesRemoved} merged branch(es)`);
279
+ }
280
+ if (lines.length === 0) {
281
+ return ' Nothing to prune.';
282
+ }
283
+ return lines.join('\n');
284
+ }
285
+ //# sourceMappingURL=retention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retention.js","sourceRoot":"","sources":["../../src/lib/retention.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Persistent run state for cross-session cycle tracking.
3
+ *
4
+ * Stored in `.blockspool/run-state.json`. Tracks how many scout cycles
5
+ * have run so periodic tasks (like docs-audit) can trigger automatically.
6
+ */
7
+ export interface DeferredProposal {
8
+ category: string;
9
+ title: string;
10
+ description: string;
11
+ files: string[];
12
+ allowed_paths: string[];
13
+ confidence: number;
14
+ impact_score: number;
15
+ original_scope: string;
16
+ deferredAt: number;
17
+ }
18
+ export interface RunState {
19
+ /** Total scout cycles completed (persists across sessions) */
20
+ totalCycles: number;
21
+ /** Cycle number of the last docs-audit run */
22
+ lastDocsAuditCycle: number;
23
+ /** Timestamp of last run */
24
+ lastRunAt: number;
25
+ /** Proposals deferred because they were outside the session scope */
26
+ deferredProposals: DeferredProposal[];
27
+ }
28
+ /**
29
+ * Read the current run state from disk.
30
+ */
31
+ export declare function readRunState(repoRoot: string): RunState;
32
+ /**
33
+ * Write the run state to disk.
34
+ */
35
+ export declare function writeRunState(repoRoot: string, state: RunState): void;
36
+ /**
37
+ * Increment the cycle counter and return the new state.
38
+ */
39
+ export declare function recordCycle(repoRoot: string): RunState;
40
+ /**
41
+ * Check if a docs-audit cycle is due.
42
+ * Returns true every N cycles since the last docs-audit.
43
+ */
44
+ export declare function isDocsAuditDue(repoRoot: string, interval?: number): boolean;
45
+ /**
46
+ * Record that a docs-audit was run.
47
+ */
48
+ export declare function recordDocsAudit(repoRoot: string): void;
49
+ /**
50
+ * Defer a proposal for later when the scope matches.
51
+ */
52
+ export declare function deferProposal(repoRoot: string, proposal: DeferredProposal): void;
53
+ /**
54
+ * Retrieve and remove deferred proposals that now match the given scope.
55
+ * Also prunes proposals older than 7 days.
56
+ */
57
+ export declare function popDeferredForScope(repoRoot: string, scope: string): DeferredProposal[];
58
+ //# sourceMappingURL=run-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-state.d.ts","sourceRoot":"","sources":["../../src/lib/run-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;CACvC;AAeD;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAgBvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAOrE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAMtD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,OAAO,CAG9E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAItD;AAKD;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAMhF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE,CA8BvF"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Persistent run state for cross-session cycle tracking.
3
+ *
4
+ * Stored in `.blockspool/run-state.json`. Tracks how many scout cycles
5
+ * have run so periodic tasks (like docs-audit) can trigger automatically.
6
+ */
7
+ import * as fs from 'node:fs';
8
+ import * as path from 'node:path';
9
+ const RUN_STATE_FILE = 'run-state.json';
10
+ function statePath(repoRoot) {
11
+ return path.join(repoRoot, '.blockspool', RUN_STATE_FILE);
12
+ }
13
+ const DEFAULT_STATE = {
14
+ totalCycles: 0,
15
+ lastDocsAuditCycle: 0,
16
+ lastRunAt: 0,
17
+ deferredProposals: [],
18
+ };
19
+ /**
20
+ * Read the current run state from disk.
21
+ */
22
+ export function readRunState(repoRoot) {
23
+ const fp = statePath(repoRoot);
24
+ if (!fs.existsSync(fp))
25
+ return { ...DEFAULT_STATE };
26
+ try {
27
+ const raw = fs.readFileSync(fp, 'utf-8');
28
+ const parsed = JSON.parse(raw);
29
+ return {
30
+ totalCycles: parsed.totalCycles ?? 0,
31
+ lastDocsAuditCycle: parsed.lastDocsAuditCycle ?? 0,
32
+ lastRunAt: parsed.lastRunAt ?? 0,
33
+ deferredProposals: Array.isArray(parsed.deferredProposals) ? parsed.deferredProposals : [],
34
+ };
35
+ }
36
+ catch {
37
+ return { ...DEFAULT_STATE };
38
+ }
39
+ }
40
+ /**
41
+ * Write the run state to disk.
42
+ */
43
+ export function writeRunState(repoRoot, state) {
44
+ const fp = statePath(repoRoot);
45
+ const dir = path.dirname(fp);
46
+ if (!fs.existsSync(dir)) {
47
+ fs.mkdirSync(dir, { recursive: true });
48
+ }
49
+ fs.writeFileSync(fp, JSON.stringify(state, null, 2) + '\n');
50
+ }
51
+ /**
52
+ * Increment the cycle counter and return the new state.
53
+ */
54
+ export function recordCycle(repoRoot) {
55
+ const state = readRunState(repoRoot);
56
+ state.totalCycles += 1;
57
+ state.lastRunAt = Date.now();
58
+ writeRunState(repoRoot, state);
59
+ return state;
60
+ }
61
+ /**
62
+ * Check if a docs-audit cycle is due.
63
+ * Returns true every N cycles since the last docs-audit.
64
+ */
65
+ export function isDocsAuditDue(repoRoot, interval = 3) {
66
+ const state = readRunState(repoRoot);
67
+ return (state.totalCycles - state.lastDocsAuditCycle) >= interval;
68
+ }
69
+ /**
70
+ * Record that a docs-audit was run.
71
+ */
72
+ export function recordDocsAudit(repoRoot) {
73
+ const state = readRunState(repoRoot);
74
+ state.lastDocsAuditCycle = state.totalCycles;
75
+ writeRunState(repoRoot, state);
76
+ }
77
+ /** Max age for deferred proposals (7 days) */
78
+ const MAX_DEFERRED_AGE_MS = 7 * 24 * 60 * 60 * 1000;
79
+ /**
80
+ * Defer a proposal for later when the scope matches.
81
+ */
82
+ export function deferProposal(repoRoot, proposal) {
83
+ const state = readRunState(repoRoot);
84
+ // Avoid duplicates by title
85
+ if (state.deferredProposals.some(d => d.title === proposal.title))
86
+ return;
87
+ state.deferredProposals.push(proposal);
88
+ writeRunState(repoRoot, state);
89
+ }
90
+ /**
91
+ * Retrieve and remove deferred proposals that now match the given scope.
92
+ * Also prunes proposals older than 7 days.
93
+ */
94
+ export function popDeferredForScope(repoRoot, scope) {
95
+ const state = readRunState(repoRoot);
96
+ const now = Date.now();
97
+ const normalizedScope = scope.replace(/\*\*$/, '').replace(/\*$/, '').replace(/\/$/, '');
98
+ const matched = [];
99
+ const remaining = [];
100
+ for (const dp of state.deferredProposals) {
101
+ // Prune stale
102
+ if (now - dp.deferredAt > MAX_DEFERRED_AGE_MS)
103
+ continue;
104
+ const files = dp.files.length > 0 ? dp.files : dp.allowed_paths;
105
+ const inScope = !normalizedScope || files.length === 0 || files.every(f => f.startsWith(normalizedScope) || f.startsWith(normalizedScope + '/'));
106
+ if (inScope) {
107
+ matched.push(dp);
108
+ }
109
+ else {
110
+ remaining.push(dp);
111
+ }
112
+ }
113
+ if (matched.length > 0 || remaining.length !== state.deferredProposals.length) {
114
+ state.deferredProposals = remaining;
115
+ writeRunState(repoRoot, state);
116
+ }
117
+ return matched;
118
+ }
119
+ //# sourceMappingURL=run-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-state.js","sourceRoot":"","sources":["../../src/lib/run-state.ts"],"names":[],"mappings":"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"}
@@ -80,5 +80,8 @@ export declare function runAutoMode(options: {
80
80
  executeBackend?: string;
81
81
  codexModel?: string;
82
82
  codexUnsafeFullAccess?: boolean;
83
+ includeClaudeMd?: boolean;
84
+ docsAudit?: boolean;
85
+ docsAuditInterval?: string;
83
86
  }): Promise<void>;
84
87
  //# sourceMappingURL=solo-auto.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"solo-auto.d.ts","sourceRoot":"","sources":["../../src/lib/solo-auto.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAO3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAsB7D;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAa5D;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,EAC7C,cAAc,EAAE,MAAM,EAAE,EACxB,cAAc,EAAE,MAAM,EAAE,EACxB,mBAAmB,SAAM,GACxB,OAAO,CAAC;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwBpD;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,cAAc,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA0BjE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,CAO5E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8MhB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAuBvF;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,GAAG,OAAO,CAAC,IAAI,CAAC,CA+wBhB"}
1
+ {"version":3,"file":"solo-auto.d.ts","sourceRoot":"","sources":["../../src/lib/solo-auto.ts"],"names":[],"mappings":"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"}