@lovelybunch/core 1.0.3
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.
- package/dist/change-proposal.d.ts +71 -0
- package/dist/change-proposal.d.ts.map +1 -0
- package/dist/change-proposal.js +205 -0
- package/dist/change-proposal.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown-storage.d.ts +34 -0
- package/dist/markdown-storage.d.ts.map +1 -0
- package/dist/markdown-storage.js +356 -0
- package/dist/markdown-storage.js.map +1 -0
- package/dist/migration.d.ts +57 -0
- package/dist/migration.d.ts.map +1 -0
- package/dist/migration.js +250 -0
- package/dist/migration.js.map +1 -0
- package/dist/storage.d.ts +57 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +403 -0
- package/dist/storage.js.map +1 -0
- package/dist/unified-storage.d.ts +59 -0
- package/dist/unified-storage.d.ts.map +1 -0
- package/dist/unified-storage.js +199 -0
- package/dist/unified-storage.js.map +1 -0
- package/dist/validation.d.ts +62 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +500 -0
- package/dist/validation.js.map +1 -0
- package/package.json +45 -0
package/dist/storage.js
ADDED
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { MarkdownStorageAdapter } from './markdown-storage.js';
|
|
5
|
+
export class FileStorageAdapter {
|
|
6
|
+
basePath;
|
|
7
|
+
proposalsPath;
|
|
8
|
+
configPath;
|
|
9
|
+
agentsPath;
|
|
10
|
+
constructor(basePath = '.gait') {
|
|
11
|
+
this.basePath = basePath;
|
|
12
|
+
this.proposalsPath = path.join(basePath, 'proposals');
|
|
13
|
+
this.configPath = path.join(basePath, 'config.json');
|
|
14
|
+
this.agentsPath = path.join(basePath, 'agents');
|
|
15
|
+
}
|
|
16
|
+
async init() {
|
|
17
|
+
// Create .gait directory structure
|
|
18
|
+
await fs.mkdir(this.basePath, { recursive: true });
|
|
19
|
+
await fs.mkdir(this.proposalsPath, { recursive: true });
|
|
20
|
+
await fs.mkdir(this.agentsPath, { recursive: true });
|
|
21
|
+
// Create additional directories
|
|
22
|
+
await fs.mkdir(path.join(this.basePath, 'specs'), { recursive: true });
|
|
23
|
+
await fs.mkdir(path.join(this.basePath, 'flags'), { recursive: true });
|
|
24
|
+
await fs.mkdir(path.join(this.basePath, 'experiments'), { recursive: true });
|
|
25
|
+
await fs.mkdir(path.join(this.basePath, 'templates'), { recursive: true });
|
|
26
|
+
await fs.mkdir(path.join(this.basePath, 'context'), { recursive: true });
|
|
27
|
+
await fs.mkdir(path.join(this.basePath, 'context', 'decisions'), { recursive: true });
|
|
28
|
+
await fs.mkdir(path.join(this.basePath, 'context', 'knowledge'), { recursive: true });
|
|
29
|
+
// Create default config if it doesn't exist
|
|
30
|
+
const configExists = await this.fileExists(this.configPath);
|
|
31
|
+
if (!configExists) {
|
|
32
|
+
const defaultConfig = {
|
|
33
|
+
version: '1.0.0',
|
|
34
|
+
repository: {
|
|
35
|
+
name: path.basename(process.cwd()),
|
|
36
|
+
description: 'GAIT-managed repository'
|
|
37
|
+
},
|
|
38
|
+
policies: {
|
|
39
|
+
requireApproval: true,
|
|
40
|
+
minApprovers: 1,
|
|
41
|
+
allowSelfApproval: false,
|
|
42
|
+
autoMerge: false
|
|
43
|
+
},
|
|
44
|
+
storage: {
|
|
45
|
+
type: 'file',
|
|
46
|
+
path: this.basePath
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
await this.saveConfig(defaultConfig);
|
|
50
|
+
}
|
|
51
|
+
// Create context system files
|
|
52
|
+
await this.createContextSystem();
|
|
53
|
+
}
|
|
54
|
+
async createContextSystem() {
|
|
55
|
+
// Copy template files to context directory
|
|
56
|
+
await this.copyTemplateFiles();
|
|
57
|
+
}
|
|
58
|
+
async copyTemplateFiles() {
|
|
59
|
+
const templateBasePath = this.getTemplatePath();
|
|
60
|
+
const contextTemplatePath = path.join(templateBasePath, 'context');
|
|
61
|
+
// Check if template directory exists
|
|
62
|
+
if (!(await this.fileExists(contextTemplatePath))) {
|
|
63
|
+
console.warn('Template directory not found, falling back to minimal context files');
|
|
64
|
+
await this.createMinimalContext();
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// Copy template files
|
|
68
|
+
await this.copyTemplateDirectory(contextTemplatePath, path.join(this.basePath, 'context'));
|
|
69
|
+
}
|
|
70
|
+
getTemplatePath() {
|
|
71
|
+
// Get current file path and navigate to packages/shared/template
|
|
72
|
+
const currentFile = fileURLToPath(import.meta.url);
|
|
73
|
+
const currentDir = path.dirname(currentFile);
|
|
74
|
+
// Navigate up from packages/core/dist (or src) to packages/shared/template
|
|
75
|
+
return path.resolve(currentDir, '../../shared/template');
|
|
76
|
+
}
|
|
77
|
+
async copyTemplateDirectory(sourceDir, targetDir) {
|
|
78
|
+
// Ensure target directory exists
|
|
79
|
+
await fs.mkdir(targetDir, { recursive: true });
|
|
80
|
+
const entries = await fs.readdir(sourceDir, { withFileTypes: true });
|
|
81
|
+
for (const entry of entries) {
|
|
82
|
+
const sourcePath = path.join(sourceDir, entry.name);
|
|
83
|
+
const targetPath = path.join(targetDir, entry.name);
|
|
84
|
+
if (entry.isDirectory()) {
|
|
85
|
+
await this.copyTemplateDirectory(sourcePath, targetPath);
|
|
86
|
+
}
|
|
87
|
+
else if (entry.isFile()) {
|
|
88
|
+
// Only copy if target doesn't exist
|
|
89
|
+
if (!(await this.fileExists(targetPath))) {
|
|
90
|
+
const content = await fs.readFile(sourcePath, 'utf-8');
|
|
91
|
+
const processedContent = this.processTemplateContent(content);
|
|
92
|
+
await fs.writeFile(targetPath, processedContent, 'utf-8');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
processTemplateContent(content) {
|
|
98
|
+
const projectName = path.basename(process.cwd());
|
|
99
|
+
const date = new Date().toISOString().split('T')[0];
|
|
100
|
+
return content
|
|
101
|
+
.replace(/\{\{projectName\}\}/g, projectName)
|
|
102
|
+
.replace(/\{\{date\}\}/g, date);
|
|
103
|
+
}
|
|
104
|
+
async createMinimalContext() {
|
|
105
|
+
// Fallback: create minimal context files if templates aren't available
|
|
106
|
+
const minimalProject = `---
|
|
107
|
+
version: "1.0"
|
|
108
|
+
updated: "${new Date().toISOString().split('T')[0]}"
|
|
109
|
+
type: project-context
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
# ${path.basename(process.cwd())} - Project Context
|
|
113
|
+
|
|
114
|
+
This project uses GAIT for intent-driven development.
|
|
115
|
+
|
|
116
|
+
## Getting Started
|
|
117
|
+
|
|
118
|
+
1. Initialize GAIT: \`gait init\`
|
|
119
|
+
2. Create proposals: \`gait propose "Your intent"\`
|
|
120
|
+
3. View proposals: \`gait list\`
|
|
121
|
+
`;
|
|
122
|
+
await this.createContextFile('project.md', minimalProject);
|
|
123
|
+
}
|
|
124
|
+
async createContextFile(relativePath, content) {
|
|
125
|
+
const filePath = path.join(this.basePath, 'context', relativePath);
|
|
126
|
+
const fileExists = await this.fileExists(filePath);
|
|
127
|
+
if (!fileExists) {
|
|
128
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async saveProposal(proposal) {
|
|
132
|
+
const filePath = path.join(this.proposalsPath, `${proposal.id}.json`);
|
|
133
|
+
const data = JSON.stringify(proposal, null, 2);
|
|
134
|
+
await fs.writeFile(filePath, data, 'utf-8');
|
|
135
|
+
}
|
|
136
|
+
async loadProposal(id) {
|
|
137
|
+
const filePath = path.join(this.proposalsPath, `${id}.json`);
|
|
138
|
+
if (!(await this.fileExists(filePath))) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
const data = await fs.readFile(filePath, 'utf-8');
|
|
142
|
+
const proposal = JSON.parse(data);
|
|
143
|
+
// Convert date strings back to Date objects
|
|
144
|
+
this.hydrateDates(proposal);
|
|
145
|
+
return proposal;
|
|
146
|
+
}
|
|
147
|
+
async loadAllProposals() {
|
|
148
|
+
const files = await fs.readdir(this.proposalsPath);
|
|
149
|
+
const proposals = [];
|
|
150
|
+
for (const file of files) {
|
|
151
|
+
if (file.endsWith('.json')) {
|
|
152
|
+
const filePath = path.join(this.proposalsPath, file);
|
|
153
|
+
const data = await fs.readFile(filePath, 'utf-8');
|
|
154
|
+
const proposal = JSON.parse(data);
|
|
155
|
+
this.hydrateDates(proposal);
|
|
156
|
+
proposals.push(proposal);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return proposals;
|
|
160
|
+
}
|
|
161
|
+
async deleteProposal(id) {
|
|
162
|
+
const filePath = path.join(this.proposalsPath, `${id}.json`);
|
|
163
|
+
if (!(await this.fileExists(filePath))) {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
await fs.unlink(filePath);
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
async saveConfig(config) {
|
|
170
|
+
const data = JSON.stringify(config, null, 2);
|
|
171
|
+
await fs.writeFile(this.configPath, data, 'utf-8');
|
|
172
|
+
}
|
|
173
|
+
async loadConfig() {
|
|
174
|
+
if (!(await this.fileExists(this.configPath))) {
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
const data = await fs.readFile(this.configPath, 'utf-8');
|
|
178
|
+
return JSON.parse(data);
|
|
179
|
+
}
|
|
180
|
+
async fileExists(filePath) {
|
|
181
|
+
try {
|
|
182
|
+
await fs.access(filePath);
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
hydrateDates(proposal) {
|
|
190
|
+
// Convert date strings back to Date objects
|
|
191
|
+
proposal.metadata.createdAt = new Date(proposal.metadata.createdAt);
|
|
192
|
+
proposal.metadata.updatedAt = new Date(proposal.metadata.updatedAt);
|
|
193
|
+
// Convert other date fields
|
|
194
|
+
proposal.planSteps.forEach(step => {
|
|
195
|
+
if (step.executedAt) {
|
|
196
|
+
step.executedAt = new Date(step.executedAt);
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
proposal.evidence.forEach(e => {
|
|
200
|
+
e.timestamp = new Date(e.timestamp);
|
|
201
|
+
});
|
|
202
|
+
proposal.policies.forEach(p => {
|
|
203
|
+
if (p.checkedAt) {
|
|
204
|
+
p.checkedAt = new Date(p.checkedAt);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
proposal.featureFlags.forEach(f => {
|
|
208
|
+
f.createdAt = new Date(f.createdAt);
|
|
209
|
+
f.updatedAt = new Date(f.updatedAt);
|
|
210
|
+
});
|
|
211
|
+
proposal.experiments.forEach(e => {
|
|
212
|
+
if (e.startedAt) {
|
|
213
|
+
e.startedAt = new Date(e.startedAt);
|
|
214
|
+
}
|
|
215
|
+
if (e.endedAt) {
|
|
216
|
+
e.endedAt = new Date(e.endedAt);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
proposal.telemetryContracts.forEach(t => {
|
|
220
|
+
t.approvals.forEach(a => {
|
|
221
|
+
a.approvedAt = new Date(a.approvedAt);
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
if (proposal.releasePlan.schedule) {
|
|
225
|
+
proposal.releasePlan.schedule = new Date(proposal.releasePlan.schedule);
|
|
226
|
+
}
|
|
227
|
+
proposal.metadata.aiInteractions.forEach(ai => {
|
|
228
|
+
ai.timestamp = new Date(ai.timestamp);
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Check if GAIT is initialized in the current directory
|
|
233
|
+
*/
|
|
234
|
+
async isInitialized() {
|
|
235
|
+
return this.fileExists(this.configPath);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get the base path for storage
|
|
239
|
+
*/
|
|
240
|
+
getBasePath() {
|
|
241
|
+
return this.basePath;
|
|
242
|
+
}
|
|
243
|
+
// Agent Management Methods
|
|
244
|
+
async saveAgent(agent) {
|
|
245
|
+
const content = this.agentToMarkdown(agent);
|
|
246
|
+
// For new agents, save to root directory
|
|
247
|
+
// For existing agents, find their current location and save there
|
|
248
|
+
let filePath;
|
|
249
|
+
const existingPath = await this.findAgentPath(agent.id);
|
|
250
|
+
if (existingPath) {
|
|
251
|
+
filePath = existingPath;
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
filePath = path.join(this.agentsPath, `${agent.id}.md`);
|
|
255
|
+
}
|
|
256
|
+
// Ensure directory exists
|
|
257
|
+
const dir = path.dirname(filePath);
|
|
258
|
+
await fs.mkdir(dir, { recursive: true });
|
|
259
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
260
|
+
}
|
|
261
|
+
async findAgentPath(id) {
|
|
262
|
+
// First try the direct path
|
|
263
|
+
const directPath = path.join(this.agentsPath, `${id}.md`);
|
|
264
|
+
if (await this.fileExists(directPath)) {
|
|
265
|
+
return directPath;
|
|
266
|
+
}
|
|
267
|
+
// Search in subdirectories
|
|
268
|
+
const agentFiles = await this.findAgentFiles(this.agentsPath);
|
|
269
|
+
for (const agentPath of agentFiles) {
|
|
270
|
+
const relativePath = path.relative(this.agentsPath, agentPath);
|
|
271
|
+
const agentId = this.pathToId(relativePath);
|
|
272
|
+
if (agentId === id) {
|
|
273
|
+
return agentPath;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
pathToId(relativePath) {
|
|
279
|
+
return relativePath.replace(/\.md$/, '').replace(/[\/\\]/g, '-');
|
|
280
|
+
}
|
|
281
|
+
async loadAgent(id) {
|
|
282
|
+
// First try the direct path (for backward compatibility)
|
|
283
|
+
let filePath = path.join(this.agentsPath, `${id}.md`);
|
|
284
|
+
if (await this.fileExists(filePath)) {
|
|
285
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
286
|
+
return this.markdownToAgent(content, id);
|
|
287
|
+
}
|
|
288
|
+
// If not found directly, search for it in subdirectories
|
|
289
|
+
const agentFiles = await this.findAgentFiles(this.agentsPath);
|
|
290
|
+
for (const agentPath of agentFiles) {
|
|
291
|
+
const relativePath = path.relative(this.agentsPath, agentPath);
|
|
292
|
+
const agentId = this.pathToId(relativePath);
|
|
293
|
+
if (agentId === id) {
|
|
294
|
+
const content = await fs.readFile(agentPath, 'utf-8');
|
|
295
|
+
return this.markdownToAgent(content, id);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
async loadAllAgents() {
|
|
301
|
+
const agentFiles = await this.findAgentFiles(this.agentsPath);
|
|
302
|
+
const agents = [];
|
|
303
|
+
for (const filePath of agentFiles) {
|
|
304
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
305
|
+
const relativePath = path.relative(this.agentsPath, filePath);
|
|
306
|
+
const id = this.pathToId(relativePath);
|
|
307
|
+
const agent = this.markdownToAgent(content, id);
|
|
308
|
+
if (agent) {
|
|
309
|
+
agents.push(agent);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return agents;
|
|
313
|
+
}
|
|
314
|
+
async findAgentFiles(dir) {
|
|
315
|
+
const files = [];
|
|
316
|
+
try {
|
|
317
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
318
|
+
for (const entry of entries) {
|
|
319
|
+
const fullPath = path.join(dir, entry.name);
|
|
320
|
+
if (entry.isDirectory()) {
|
|
321
|
+
// Recursively search subdirectories
|
|
322
|
+
const subFiles = await this.findAgentFiles(fullPath);
|
|
323
|
+
files.push(...subFiles);
|
|
324
|
+
}
|
|
325
|
+
else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
326
|
+
files.push(fullPath);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
catch (error) {
|
|
331
|
+
// If directory doesn't exist or can't be read, return empty array
|
|
332
|
+
console.warn(`Could not read directory ${dir}:`, error);
|
|
333
|
+
}
|
|
334
|
+
return files;
|
|
335
|
+
}
|
|
336
|
+
async deleteAgent(id) {
|
|
337
|
+
// First try the direct path (for backward compatibility)
|
|
338
|
+
let filePath = path.join(this.agentsPath, `${id}.md`);
|
|
339
|
+
if (await this.fileExists(filePath)) {
|
|
340
|
+
await fs.unlink(filePath);
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
// If not found directly, search for it in subdirectories
|
|
344
|
+
const agentFiles = await this.findAgentFiles(this.agentsPath);
|
|
345
|
+
for (const agentPath of agentFiles) {
|
|
346
|
+
const relativePath = path.relative(this.agentsPath, agentPath);
|
|
347
|
+
const agentId = this.pathToId(relativePath);
|
|
348
|
+
if (agentId === id) {
|
|
349
|
+
await fs.unlink(agentPath);
|
|
350
|
+
return true;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
agentToMarkdown(agent) {
|
|
356
|
+
const frontmatter = {
|
|
357
|
+
name: agent.name,
|
|
358
|
+
description: agent.description,
|
|
359
|
+
...(agent.tools && agent.tools.length > 0 && { tools: agent.tools.join(', ') }),
|
|
360
|
+
...(agent.metadata && {
|
|
361
|
+
createdAt: agent.metadata.createdAt.toISOString(),
|
|
362
|
+
updatedAt: agent.metadata.updatedAt.toISOString(),
|
|
363
|
+
...(agent.metadata.version && { version: agent.metadata.version })
|
|
364
|
+
})
|
|
365
|
+
};
|
|
366
|
+
const yamlFrontmatter = Object.entries(frontmatter)
|
|
367
|
+
.map(([key, value]) => `${key}: ${typeof value === 'string' && value.includes(':') ? `"${value}"` : value}`)
|
|
368
|
+
.join('\n');
|
|
369
|
+
return `---\n${yamlFrontmatter}\n---\n\n${agent.content || ''}`;
|
|
370
|
+
}
|
|
371
|
+
markdownToAgent(content, id) {
|
|
372
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
|
373
|
+
if (!frontmatterMatch) {
|
|
374
|
+
return null;
|
|
375
|
+
}
|
|
376
|
+
const [, frontmatter, agentContent] = frontmatterMatch;
|
|
377
|
+
const metadata = {};
|
|
378
|
+
frontmatter.split('\n').forEach(line => {
|
|
379
|
+
const [key, ...values] = line.split(':');
|
|
380
|
+
if (key && values.length > 0) {
|
|
381
|
+
const value = values.join(':').trim().replace(/^"(.*)"$/, '$1');
|
|
382
|
+
metadata[key.trim()] = value;
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
const tools = metadata.tools ? metadata.tools.split(',').map(t => t.trim()) : undefined;
|
|
386
|
+
return {
|
|
387
|
+
id,
|
|
388
|
+
name: metadata.name || '',
|
|
389
|
+
description: metadata.description || '',
|
|
390
|
+
tools,
|
|
391
|
+
content: agentContent.trim() || undefined,
|
|
392
|
+
metadata: {
|
|
393
|
+
createdAt: new Date(metadata.createdAt || Date.now()),
|
|
394
|
+
updatedAt: new Date(metadata.updatedAt || Date.now()),
|
|
395
|
+
author: { type: 'human', id: 'current-user', name: 'Current User' },
|
|
396
|
+
version: metadata.version
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
// Export a singleton instance using MarkdownStorageAdapter for markdown file support
|
|
402
|
+
export const fileStorage = new MarkdownStorageAdapter();
|
|
403
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAgB/D,MAAM,OAAO,kBAAkB;IACrB,QAAQ,CAAS;IACjB,aAAa,CAAS;IACtB,UAAU,CAAS;IACnB,UAAU,CAAS;IAE3B,YAAY,WAAmB,OAAO;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACtD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,mCAAmC;QACnC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAErD,gCAAgC;QAChC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtF,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtF,4CAA4C;QAC5C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,aAAa,GAAe;gBAChC,OAAO,EAAE,OAAO;gBAChB,UAAU,EAAE;oBACV,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;oBAClC,WAAW,EAAE,yBAAyB;iBACvC;gBACD,QAAQ,EAAE;oBACR,eAAe,EAAE,IAAI;oBACrB,YAAY,EAAE,CAAC;oBACf,iBAAiB,EAAE,KAAK;oBACxB,SAAS,EAAE,KAAK;iBACjB;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,QAAQ;iBACpB;aACF,CAAC;YACF,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACvC,CAAC;QAED,8BAA8B;QAC9B,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;IACnC,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC/B,2CAA2C;QAC3C,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAChD,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;QAEnE,qCAAqC;QACrC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;YACpF,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,sBAAsB;QACtB,MAAM,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAC7F,CAAC;IAEO,eAAe;QACrB,iEAAiE;QACjE,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC7C,2EAA2E;QAC3E,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC;IAC3D,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,SAAiB,EAAE,SAAiB;QACtE,iCAAiC;QACjC,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAErE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAEpD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC3D,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC1B,oCAAoC;gBACpC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;oBACzC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBACvD,MAAM,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;oBAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,OAAe;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpD,OAAO,OAAO;aACX,OAAO,CAAC,sBAAsB,EAAE,WAAW,CAAC;aAC5C,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAEO,KAAK,CAAC,oBAAoB;QAChC,uEAAuE;QACvE,MAAM,cAAc,GAAG;;YAEf,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;;;IAI9C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;;;;;;;;;CAS/B,CAAC;QAEE,MAAM,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAC7D,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,YAAoB,EAAE,OAAe;QACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEnD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAGD,KAAK,CAAC,YAAY,CAAC,QAAwB;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAU;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAE7D,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC;QAEpD,4CAA4C;QAC5C,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAE5B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnD,MAAM,SAAS,GAAqB,EAAE,CAAC;QAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;gBACrD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC;gBACpD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAC5B,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAE7D,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAkB;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC;IACxC,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,QAAgB;QACvC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,QAAwB;QAC3C,4CAA4C;QAC5C,QAAQ,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpE,QAAQ,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAEpE,4BAA4B;QAC5B,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAChC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAC5B,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAC5B,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;gBAChB,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAChC,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACpC,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAC/B,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;gBAChB,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC;YACD,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBACd,CAAC,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACtC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACtB,CAAC,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAClC,QAAQ,CAAC,WAAW,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC1E,CAAC;QAED,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;YAC5C,EAAE,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,2BAA2B;IAC3B,KAAK,CAAC,SAAS,CAAC,KAAY;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAE5C,yCAAyC;QACzC,kEAAkE;QAClE,IAAI,QAAgB,CAAC;QAErB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxD,IAAI,YAAY,EAAE,CAAC;YACjB,QAAQ,GAAG,YAAY,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;QAED,0BAA0B;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzC,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,EAAU;QACpC,4BAA4B;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1D,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,2BAA2B;QAC3B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE9D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAE5C,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;gBACnB,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,QAAQ,CAAC,YAAoB;QACnC,OAAO,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,EAAU;QACxB,yDAAyD;QACzD,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAEtD,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,yDAAyD;QACzD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE9D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAE5C,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACtD,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAY,EAAE,CAAC;QAE3B,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC9D,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAChD,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,GAAW;QACtC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAE/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAE5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,oCAAoC;oBACpC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;oBACrD,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;gBAC1B,CAAC;qBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACxD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kEAAkE;YAClE,OAAO,CAAC,IAAI,CAAC,4BAA4B,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,yDAAyD;QACzD,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAEtD,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,yDAAyD;QACzD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE9D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAE5C,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;gBACnB,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC3B,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,eAAe,CAAC,KAAY;QAClC,MAAM,WAAW,GAAG;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/E,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI;gBACpB,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE;gBACjD,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE;gBACjD,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;aACnE,CAAC;SACH,CAAC;QAEF,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;aAChD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;aAC3G,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO,QAAQ,eAAe,YAAY,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;IAClE,CAAC;IAEO,eAAe,CAAC,OAAe,EAAE,EAAU;QACjD,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC5E,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC,GAAG,gBAAgB,CAAC;QACvD,MAAM,QAAQ,GAA2B,EAAE,CAAC;QAE5C,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACrC,MAAM,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBAChE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC;YAC/B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAExF,OAAO;YACL,EAAE;YACF,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;YACzB,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;YACvC,KAAK;YACL,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,SAAS;YACzC,QAAQ,EAAE;gBACR,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACrD,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACrD,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE;gBACnE,OAAO,EAAE,QAAQ,CAAC,OAAO;aAC1B;SACF,CAAC;IACJ,CAAC;CAEF;AAED,qFAAqF;AACrF,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,sBAAsB,EAAE,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { ChangeProposal, GaitConfig } from '@lovelybunch/types';
|
|
2
|
+
import type { StorageAdapter } from './storage.js';
|
|
3
|
+
/**
|
|
4
|
+
* Unified storage adapter that automatically detects and handles both JSON and Markdown formats
|
|
5
|
+
* Provides backward compatibility during the migration period
|
|
6
|
+
*/
|
|
7
|
+
export declare class UnifiedStorageAdapter implements StorageAdapter {
|
|
8
|
+
private jsonStorage;
|
|
9
|
+
private markdownStorage;
|
|
10
|
+
private preferredFormat;
|
|
11
|
+
constructor(basePath?: string, preferredFormat?: 'json' | 'markdown');
|
|
12
|
+
init(): Promise<void>;
|
|
13
|
+
saveProposal(proposal: ChangeProposal): Promise<void>;
|
|
14
|
+
loadProposal(id: string): Promise<ChangeProposal | null>;
|
|
15
|
+
loadAllProposals(): Promise<ChangeProposal[]>;
|
|
16
|
+
deleteProposal(id: string): Promise<boolean>;
|
|
17
|
+
saveConfig(config: GaitConfig): Promise<void>;
|
|
18
|
+
loadConfig(): Promise<GaitConfig | null>;
|
|
19
|
+
isInitialized(): Promise<boolean>;
|
|
20
|
+
getBasePath(): string;
|
|
21
|
+
/**
|
|
22
|
+
* Get the current storage format being used
|
|
23
|
+
*/
|
|
24
|
+
getCurrentFormat(): Promise<'json' | 'markdown' | 'mixed' | 'none'>;
|
|
25
|
+
/**
|
|
26
|
+
* Set the preferred format for new proposals
|
|
27
|
+
*/
|
|
28
|
+
setPreferredFormat(format: 'json' | 'markdown'): void;
|
|
29
|
+
/**
|
|
30
|
+
* Get the preferred format
|
|
31
|
+
*/
|
|
32
|
+
getPreferredFormat(): 'json' | 'markdown';
|
|
33
|
+
/**
|
|
34
|
+
* Auto-migrate to preferred format if needed
|
|
35
|
+
*/
|
|
36
|
+
autoMigrate(options?: {
|
|
37
|
+
force?: boolean;
|
|
38
|
+
}): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Get storage statistics
|
|
41
|
+
*/
|
|
42
|
+
getStorageStats(): Promise<{
|
|
43
|
+
format: 'json' | 'markdown' | 'mixed' | 'none';
|
|
44
|
+
jsonCount: number;
|
|
45
|
+
markdownCount: number;
|
|
46
|
+
totalCount: number;
|
|
47
|
+
preferredFormat: 'json' | 'markdown';
|
|
48
|
+
}>;
|
|
49
|
+
/**
|
|
50
|
+
* Validate storage integrity
|
|
51
|
+
*/
|
|
52
|
+
validateStorage(): Promise<{
|
|
53
|
+
valid: boolean;
|
|
54
|
+
issues: string[];
|
|
55
|
+
duplicates: string[];
|
|
56
|
+
}>;
|
|
57
|
+
}
|
|
58
|
+
export declare const unifiedStorage: UnifiedStorageAdapter;
|
|
59
|
+
//# sourceMappingURL=unified-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified-storage.d.ts","sourceRoot":"","sources":["../src/unified-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAC1D,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,eAAe,CAAsB;gBAEjC,QAAQ,GAAE,MAAgB,EAAE,eAAe,GAAE,MAAM,GAAG,UAAuB;IAMnF,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrB,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IASrD,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAmBxD,gBAAgB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IA0B7C,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU5C,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7C,UAAU,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAIxC,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAIvC,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IAIzE;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAIrD;;OAEG;IACH,kBAAkB,IAAI,MAAM,GAAG,UAAU;IAIzC;;OAEG;IACG,WAAW,CAAC,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAiCtE;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC;QAC/B,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;QAC/C,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,GAAG,UAAU,CAAC;KACtC,CAAC;IAQF;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC;QAC/B,KAAK,EAAE,OAAO,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,UAAU,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;CA6CH;AAGD,eAAO,MAAM,cAAc,uBAAiD,CAAC"}
|