specweave 1.0.71 → 1.0.73

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 (43) hide show
  1. package/CLAUDE.md +38 -31
  2. package/dist/src/cli/commands/save.d.ts.map +1 -1
  3. package/dist/src/cli/commands/save.js +29 -6
  4. package/dist/src/cli/commands/save.js.map +1 -1
  5. package/dist/src/core/auto/e2e-coverage.d.ts +413 -0
  6. package/dist/src/core/auto/e2e-coverage.d.ts.map +1 -0
  7. package/dist/src/core/auto/e2e-coverage.js +1378 -0
  8. package/dist/src/core/auto/e2e-coverage.js.map +1 -0
  9. package/dist/src/core/auto/increment-planner.js +7 -1
  10. package/dist/src/core/auto/increment-planner.js.map +1 -1
  11. package/dist/src/core/auto/index.d.ts +2 -0
  12. package/dist/src/core/auto/index.d.ts.map +1 -1
  13. package/dist/src/core/auto/index.js +10 -0
  14. package/dist/src/core/auto/index.js.map +1 -1
  15. package/dist/src/core/auto/plan-approval.d.ts +104 -0
  16. package/dist/src/core/auto/plan-approval.d.ts.map +1 -0
  17. package/dist/src/core/auto/plan-approval.js +361 -0
  18. package/dist/src/core/auto/plan-approval.js.map +1 -0
  19. package/dist/src/core/plugins/skill-trigger-extractor.d.ts +147 -0
  20. package/dist/src/core/plugins/skill-trigger-extractor.d.ts.map +1 -0
  21. package/dist/src/core/plugins/skill-trigger-extractor.js +352 -0
  22. package/dist/src/core/plugins/skill-trigger-extractor.js.map +1 -0
  23. package/dist/src/core/plugins/skill-trigger-index.d.ts +91 -0
  24. package/dist/src/core/plugins/skill-trigger-index.d.ts.map +1 -0
  25. package/dist/src/core/plugins/skill-trigger-index.js +196 -0
  26. package/dist/src/core/plugins/skill-trigger-index.js.map +1 -0
  27. package/package.json +1 -1
  28. package/plugins/specweave/commands/auto.md +197 -0
  29. package/plugins/specweave/commands/save.md +24 -1
  30. package/plugins/specweave/commands/skip-increment.md +93 -0
  31. package/plugins/specweave/hooks/lib/resolve-package.sh +126 -0
  32. package/plugins/specweave/hooks/lib/sync-spec-content.sh +47 -3
  33. package/plugins/specweave/hooks/stop-auto.sh +230 -11
  34. package/plugins/specweave/hooks/user-prompt-submit.sh +4 -2
  35. package/plugins/specweave/hooks/v2/handlers/github-sync-handler.sh +8 -0
  36. package/plugins/specweave/hooks/v2/handlers/living-docs-handler.sh +10 -3
  37. package/plugins/specweave/hooks/v2/handlers/living-specs-handler.sh +18 -7
  38. package/plugins/specweave/hooks/v2/handlers/project-bridge-handler.sh +10 -3
  39. package/plugins/specweave/hooks/v2/session-end.sh +50 -2
  40. package/plugins/specweave/hooks/v2/session-start.sh +68 -4
  41. package/plugins/specweave/scripts/chunk-prompt.js +204 -0
  42. package/plugins/specweave/scripts/setup-auto.sh +66 -0
  43. package/src/templates/CLAUDE.md.template +37 -30
@@ -0,0 +1,361 @@
1
+ /**
2
+ * Plan Approval for Auto Mode
3
+ *
4
+ * Displays increment plan and handles user approval/modification before execution.
5
+ *
6
+ * @module plan-approval
7
+ */
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+ /**
11
+ * Format increment plan for display
12
+ *
13
+ * @param plan - Planning result to display
14
+ * @param options - Display options
15
+ * @returns Formatted string
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const output = formatPlanDisplay(plan, { showDetails: true });
20
+ * console.log(output);
21
+ * ```
22
+ */
23
+ export function formatPlanDisplay(plan, options = {}) {
24
+ const { showDetails = true, showDependencies = true, format = 'text' } = options;
25
+ if (format === 'json') {
26
+ return JSON.stringify(plan, null, 2);
27
+ }
28
+ const lines = [];
29
+ const isMarkdown = format === 'markdown';
30
+ // Header
31
+ if (isMarkdown) {
32
+ lines.push('## 📋 Increment Plan');
33
+ lines.push('');
34
+ }
35
+ else {
36
+ lines.push('📋 Increment Plan');
37
+ lines.push('═'.repeat(50));
38
+ }
39
+ // Summary
40
+ lines.push('');
41
+ lines.push(`Total Features: ${plan.totalFeatures}`);
42
+ lines.push(`Total Tasks: ~${plan.totalTasks}`);
43
+ lines.push(`Estimated Duration: ${plan.estimatedDuration}`);
44
+ lines.push(`Increments: ${plan.increments.length}`);
45
+ lines.push('');
46
+ // Increments table/list
47
+ if (isMarkdown) {
48
+ lines.push('### Increments');
49
+ lines.push('');
50
+ lines.push('| # | Name | Tasks | Features | Dependencies |');
51
+ lines.push('|---|------|-------|----------|--------------|');
52
+ for (let i = 0; i < plan.increments.length; i++) {
53
+ const inc = plan.increments[i];
54
+ const deps = inc.dependencies.length > 0 ? inc.dependencies.map((d) => `#${d.split('-')[0]}`).join(', ') : '-';
55
+ lines.push(`| ${i + 1} | ${inc.name} | ~${inc.estimatedTasks} | ${inc.features.length} | ${deps} |`);
56
+ }
57
+ }
58
+ else {
59
+ lines.push('Increments:');
60
+ lines.push('-'.repeat(50));
61
+ for (let i = 0; i < plan.increments.length; i++) {
62
+ const inc = plan.increments[i];
63
+ lines.push(` ${i + 1}. ${inc.name}`);
64
+ lines.push(` ID: ${inc.id}`);
65
+ lines.push(` Tasks: ~${inc.estimatedTasks}`);
66
+ lines.push(` Features: ${inc.features.map((f) => f.name).join(', ')}`);
67
+ if (showDependencies && inc.dependencies.length > 0) {
68
+ lines.push(` Depends on: ${inc.dependencies.join(', ')}`);
69
+ }
70
+ lines.push('');
71
+ }
72
+ }
73
+ // Detailed feature breakdown
74
+ if (showDetails) {
75
+ lines.push('');
76
+ if (isMarkdown) {
77
+ lines.push('### Feature Breakdown');
78
+ lines.push('');
79
+ }
80
+ else {
81
+ lines.push('Feature Breakdown:');
82
+ lines.push('-'.repeat(50));
83
+ }
84
+ for (const inc of plan.increments) {
85
+ lines.push(`${inc.name}:`);
86
+ for (const feature of inc.features) {
87
+ const complexityIcon = feature.complexity === 'complex' ? '🔴' : feature.complexity === 'medium' ? '🟡' : '🟢';
88
+ lines.push(` ${complexityIcon} ${feature.name} (~${feature.estimatedTasks} tasks)`);
89
+ if (feature.description !== feature.name) {
90
+ lines.push(` "${feature.description}"`);
91
+ }
92
+ }
93
+ lines.push('');
94
+ }
95
+ }
96
+ // Dependency graph visualization
97
+ if (showDependencies && plan.increments.some((inc) => inc.dependencies.length > 0)) {
98
+ lines.push('');
99
+ if (isMarkdown) {
100
+ lines.push('### Execution Order');
101
+ lines.push('```');
102
+ }
103
+ else {
104
+ lines.push('Execution Order:');
105
+ lines.push('-'.repeat(50));
106
+ }
107
+ // Simple ASCII dependency graph
108
+ for (let i = 0; i < plan.increments.length; i++) {
109
+ const inc = plan.increments[i];
110
+ const prefix = i === 0 ? '┌' : i === plan.increments.length - 1 ? '└' : '├';
111
+ const deps = inc.dependencies.length > 0 ? ` ← depends on: ${inc.dependencies.join(', ')}` : '';
112
+ lines.push(`${prefix}─ ${inc.id}${deps}`);
113
+ }
114
+ if (isMarkdown) {
115
+ lines.push('```');
116
+ }
117
+ }
118
+ return lines.join('\n');
119
+ }
120
+ /**
121
+ * Log approved plan to file
122
+ *
123
+ * @param plan - Approved plan
124
+ * @param projectPath - Project root path
125
+ */
126
+ export function logApprovedPlan(plan, projectPath) {
127
+ const logsDir = path.join(projectPath, '.specweave/logs');
128
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
129
+ const logFile = path.join(logsDir, `plan-approved-${timestamp}.json`);
130
+ // Ensure logs directory exists
131
+ if (!fs.existsSync(logsDir)) {
132
+ fs.mkdirSync(logsDir, { recursive: true });
133
+ }
134
+ const logEntry = {
135
+ timestamp: new Date().toISOString(),
136
+ event: 'plan_approved',
137
+ plan: {
138
+ totalFeatures: plan.totalFeatures,
139
+ totalTasks: plan.totalTasks,
140
+ estimatedDuration: plan.estimatedDuration,
141
+ increments: plan.increments.map((inc) => ({
142
+ id: inc.id,
143
+ name: inc.name,
144
+ estimatedTasks: inc.estimatedTasks,
145
+ featureCount: inc.features.length,
146
+ dependencies: inc.dependencies,
147
+ })),
148
+ },
149
+ };
150
+ fs.writeFileSync(logFile, JSON.stringify(logEntry, null, 2));
151
+ // Also append to auto-sessions.log
152
+ const sessionsLog = path.join(logsDir, 'auto-sessions.log');
153
+ const logLine = JSON.stringify({
154
+ timestamp: new Date().toISOString(),
155
+ event: 'plan_approved',
156
+ increments: plan.increments.length,
157
+ totalTasks: plan.totalTasks,
158
+ });
159
+ fs.appendFileSync(sessionsLog, logLine + '\n');
160
+ }
161
+ /**
162
+ * Generate approval prompt text
163
+ *
164
+ * @param plan - Planning result
165
+ * @returns Prompt text for user approval
166
+ */
167
+ export function generateApprovalPrompt(plan) {
168
+ const lines = [];
169
+ lines.push('');
170
+ lines.push('💡 Review the plan above.');
171
+ lines.push('');
172
+ lines.push('Options:');
173
+ lines.push(' 1. Approve - Start execution with this plan');
174
+ lines.push(' 2. Modify - Adjust increment structure');
175
+ lines.push(' 3. Cancel - Abort and return to prompt');
176
+ lines.push('');
177
+ lines.push('To skip this prompt in future: use --yes flag');
178
+ lines.push('');
179
+ return lines.join('\n');
180
+ }
181
+ /**
182
+ * Validate plan is executable
183
+ *
184
+ * @param plan - Planning result to validate
185
+ * @returns Validation result with any issues
186
+ */
187
+ export function validatePlan(plan) {
188
+ const issues = [];
189
+ // Check for empty plan
190
+ if (plan.increments.length === 0) {
191
+ issues.push('Plan has no increments');
192
+ }
193
+ // Check for increments with no features
194
+ for (const inc of plan.increments) {
195
+ if (inc.features.length === 0) {
196
+ issues.push(`Increment ${inc.id} has no features`);
197
+ }
198
+ }
199
+ // Check for circular dependencies
200
+ const visited = new Set();
201
+ const visiting = new Set();
202
+ function detectCycle(incId) {
203
+ if (visiting.has(incId))
204
+ return true;
205
+ if (visited.has(incId))
206
+ return false;
207
+ visiting.add(incId);
208
+ const inc = plan.increments.find((i) => i.id === incId);
209
+ if (inc) {
210
+ for (const depId of inc.dependencies) {
211
+ if (detectCycle(depId)) {
212
+ issues.push(`Circular dependency detected involving ${incId}`);
213
+ return true;
214
+ }
215
+ }
216
+ }
217
+ visiting.delete(incId);
218
+ visited.add(incId);
219
+ return false;
220
+ }
221
+ for (const inc of plan.increments) {
222
+ detectCycle(inc.id);
223
+ }
224
+ // Check for missing dependencies
225
+ const allIds = new Set(plan.increments.map((i) => i.id));
226
+ for (const inc of plan.increments) {
227
+ for (const depId of inc.dependencies) {
228
+ if (!allIds.has(depId)) {
229
+ issues.push(`Increment ${inc.id} depends on non-existent increment ${depId}`);
230
+ }
231
+ }
232
+ }
233
+ // Warn about very large increments
234
+ for (const inc of plan.increments) {
235
+ if (inc.estimatedTasks > 20) {
236
+ issues.push(`Warning: Increment ${inc.id} has ~${inc.estimatedTasks} tasks (consider splitting)`);
237
+ }
238
+ }
239
+ return {
240
+ valid: issues.filter((i) => !i.startsWith('Warning:')).length === 0,
241
+ issues,
242
+ };
243
+ }
244
+ /**
245
+ * Save plan to state for later execution
246
+ *
247
+ * @param plan - Planning result to save
248
+ * @param projectPath - Project root path
249
+ */
250
+ export function savePlanToState(plan, projectPath) {
251
+ const stateDir = path.join(projectPath, '.specweave/state');
252
+ const planFile = path.join(stateDir, 'pending-plan.json');
253
+ // Ensure state directory exists
254
+ if (!fs.existsSync(stateDir)) {
255
+ fs.mkdirSync(stateDir, { recursive: true });
256
+ }
257
+ const planState = {
258
+ savedAt: new Date().toISOString(),
259
+ plan,
260
+ status: 'pending_approval',
261
+ };
262
+ fs.writeFileSync(planFile, JSON.stringify(planState, null, 2));
263
+ }
264
+ /**
265
+ * Load saved plan from state
266
+ *
267
+ * @param projectPath - Project root path
268
+ * @returns Saved plan or null if none exists
269
+ */
270
+ export function loadPlanFromState(projectPath) {
271
+ const planFile = path.join(projectPath, '.specweave/state/pending-plan.json');
272
+ if (!fs.existsSync(planFile)) {
273
+ return null;
274
+ }
275
+ try {
276
+ const content = fs.readFileSync(planFile, 'utf-8');
277
+ const state = JSON.parse(content);
278
+ return {
279
+ plan: state.plan,
280
+ savedAt: state.savedAt,
281
+ };
282
+ }
283
+ catch {
284
+ return null;
285
+ }
286
+ }
287
+ /**
288
+ * Clear saved plan from state
289
+ *
290
+ * @param projectPath - Project root path
291
+ */
292
+ export function clearPlanFromState(projectPath) {
293
+ const planFile = path.join(projectPath, '.specweave/state/pending-plan.json');
294
+ if (fs.existsSync(planFile)) {
295
+ fs.unlinkSync(planFile);
296
+ }
297
+ }
298
+ /**
299
+ * Process user's plan modification request
300
+ *
301
+ * @param plan - Original plan
302
+ * @param modification - User's modification description
303
+ * @returns Modified plan
304
+ */
305
+ export function applyPlanModification(plan, modification) {
306
+ const increments = [...plan.increments];
307
+ switch (modification.type) {
308
+ case 'merge': {
309
+ // Merge multiple increments into one
310
+ const toMerge = increments.filter((inc) => modification.incrementIds.includes(inc.id));
311
+ if (toMerge.length < 2)
312
+ break;
313
+ const merged = {
314
+ id: toMerge[0].id,
315
+ name: modification.newName || toMerge.map((i) => i.name).join(' & '),
316
+ description: toMerge.map((i) => i.description).join('; '),
317
+ features: toMerge.flatMap((i) => i.features),
318
+ estimatedTasks: toMerge.reduce((sum, i) => sum + i.estimatedTasks, 0),
319
+ dependencies: [...new Set(toMerge.flatMap((i) => i.dependencies))].filter((d) => !modification.incrementIds.includes(d)),
320
+ priority: Math.min(...toMerge.map((i) => i.priority)),
321
+ };
322
+ // Remove merged increments and add new one
323
+ const filtered = increments.filter((inc) => !modification.incrementIds.includes(inc.id));
324
+ filtered.splice(merged.priority - 1, 0, merged);
325
+ return {
326
+ ...plan,
327
+ increments: filtered,
328
+ };
329
+ }
330
+ case 'remove': {
331
+ // Remove increments from plan
332
+ const filtered = increments.filter((inc) => !modification.incrementIds.includes(inc.id));
333
+ const totalTasks = filtered.reduce((sum, i) => sum + i.estimatedTasks, 0);
334
+ return {
335
+ ...plan,
336
+ increments: filtered,
337
+ totalTasks,
338
+ totalFeatures: filtered.reduce((sum, i) => sum + i.features.length, 0),
339
+ };
340
+ }
341
+ case 'reorder': {
342
+ // Reorder increments (incrementIds is the new order)
343
+ const reordered = modification.incrementIds
344
+ .map((id) => increments.find((inc) => inc.id === id))
345
+ .filter((inc) => inc !== undefined);
346
+ // Add any increments not in the reorder list at the end
347
+ const remaining = increments.filter((inc) => !modification.incrementIds.includes(inc.id));
348
+ return {
349
+ ...plan,
350
+ increments: [...reordered, ...remaining].map((inc, idx) => ({
351
+ ...inc,
352
+ priority: idx + 1,
353
+ })),
354
+ };
355
+ }
356
+ default:
357
+ return plan;
358
+ }
359
+ return plan;
360
+ }
361
+ //# sourceMappingURL=plan-approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-approval.js","sourceRoot":"","sources":["../../../../src/core/auto/plan-approval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Skill Trigger Extractor
3
+ *
4
+ * Extracts activation trigger keywords from SKILL.md and AGENT.md files.
5
+ * These triggers enable automatic skill activation based on user prompts.
6
+ *
7
+ * @module core/plugins/skill-trigger-extractor
8
+ * @version 1.0.0
9
+ */
10
+ /**
11
+ * Extracted trigger data from a skill or agent
12
+ */
13
+ export interface ExtractedTriggers {
14
+ /** Skill or agent name */
15
+ name: string;
16
+ /** Parent plugin name */
17
+ plugin: string;
18
+ /** Type: skill or agent */
19
+ type: 'skill' | 'agent';
20
+ /** Description from frontmatter */
21
+ description: string;
22
+ /** Extracted trigger keywords (normalized) */
23
+ triggers: string[];
24
+ /** Path to the source file */
25
+ path: string;
26
+ }
27
+ /**
28
+ * Skill triggers index structure
29
+ */
30
+ export interface SkillTriggersIndex {
31
+ /** Inverted index: keyword → skill/agent names */
32
+ keywords: Record<string, string[]>;
33
+ /** Skills/agents metadata */
34
+ skills: Record<string, SkillMetadata>;
35
+ /** Generation timestamp */
36
+ generatedAt: string;
37
+ /** Total skill count */
38
+ skillCount: number;
39
+ /** Total keyword count */
40
+ keywordCount: number;
41
+ }
42
+ /**
43
+ * Metadata for a skill in the index
44
+ */
45
+ export interface SkillMetadata {
46
+ /** Parent plugin name */
47
+ plugin: string;
48
+ /** Type: skill or agent */
49
+ type: 'skill' | 'agent';
50
+ /** Trigger keywords */
51
+ triggers: string[];
52
+ /** Short description (first 150 chars) */
53
+ description: string;
54
+ /** Full qualified name for invocation */
55
+ fqn: string;
56
+ }
57
+ /**
58
+ * SkillTriggerExtractor - Extract activation triggers from plugin skills
59
+ */
60
+ export declare class SkillTriggerExtractor {
61
+ /**
62
+ * Extract triggers from a single SKILL.md or AGENT.md content
63
+ *
64
+ * @param content - File content
65
+ * @param name - Skill/agent name
66
+ * @param plugin - Parent plugin name
67
+ * @param type - 'skill' or 'agent'
68
+ * @param filePath - Path to the file
69
+ * @returns Extracted triggers
70
+ */
71
+ extractFromContent(content: string, name: string, plugin: string, type: 'skill' | 'agent', filePath: string): ExtractedTriggers;
72
+ /**
73
+ * Extract description from YAML frontmatter
74
+ *
75
+ * @param content - File content
76
+ * @returns Description string
77
+ */
78
+ private extractDescription;
79
+ /**
80
+ * Extract trigger keywords from content and description
81
+ *
82
+ * Looks for:
83
+ * 1. "Activates for:" sections in description
84
+ * 2. Keywords in YAML frontmatter
85
+ * 3. Technology names and patterns in the description
86
+ *
87
+ * @param content - Full file content
88
+ * @param description - Extracted description
89
+ * @returns Array of normalized trigger keywords
90
+ */
91
+ extractTriggerKeywords(content: string, description: string): string[];
92
+ /**
93
+ * Parse a keyword list from comma/or separated string
94
+ *
95
+ * @param text - Keyword list text
96
+ * @returns Array of normalized keywords
97
+ */
98
+ private parseKeywordList;
99
+ /**
100
+ * Extract technology terms from text
101
+ *
102
+ * @param text - Text to extract from
103
+ * @returns Array of technology terms
104
+ */
105
+ private extractTechnologyTerms;
106
+ /**
107
+ * Check if a term is a strong technology term (not generic)
108
+ *
109
+ * @param term - Term to check
110
+ * @returns True if strong technology term
111
+ */
112
+ private isStrongTechnologyTerm;
113
+ /**
114
+ * Check if word is a stop word (common words to ignore)
115
+ *
116
+ * @param word - Word to check
117
+ * @returns True if stop word
118
+ */
119
+ private isStopWord;
120
+ /**
121
+ * Scan all plugins and extract triggers
122
+ *
123
+ * @param pluginsDir - Path to plugins directory
124
+ * @returns Array of extracted triggers
125
+ */
126
+ scanAllPlugins(pluginsDir: string): Promise<ExtractedTriggers[]>;
127
+ /**
128
+ * Build the skill triggers index from extracted triggers
129
+ *
130
+ * @param triggers - Array of extracted triggers
131
+ * @returns Skill triggers index
132
+ */
133
+ buildIndex(triggers: ExtractedTriggers[]): SkillTriggersIndex;
134
+ /**
135
+ * Match a user prompt against the trigger index
136
+ *
137
+ * @param prompt - User prompt
138
+ * @param index - Skill triggers index
139
+ * @returns Array of matched skill FQNs sorted by relevance
140
+ */
141
+ matchPrompt(prompt: string, index: SkillTriggersIndex): Array<{
142
+ fqn: string;
143
+ score: number;
144
+ matchedKeywords: string[];
145
+ }>;
146
+ }
147
+ //# sourceMappingURL=skill-trigger-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-trigger-extractor.d.ts","sourceRoot":"","sources":["../../../../src/core/plugins/skill-trigger-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACnC,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,qBAAa,qBAAqB;IAChC;;;;;;;;;OASG;IACH,kBAAkB,CAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,GAAG,OAAO,EACvB,QAAQ,EAAE,MAAM,GACf,iBAAiB;IAcpB;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;;;;;;;;;;OAWG;IACH,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE;IA0CtE;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAoBxB;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IA6D9B;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAkB9B;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAiBlB;;;;;OAKG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAgEtE;;;;;OAKG;IACH,UAAU,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,kBAAkB;IAqC7D;;;;;;OAMG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CA4BzH"}