@nexus-ai-nexoralabs/cli 0.1.3 → 0.1.4
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/.env.example +16 -16
- package/LICENSE +21 -21
- package/README.md +135 -106
- package/dist/api/index.d.ts +4 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +9 -3
- package/dist/api/index.js.map +1 -1
- package/dist/chat/chatService.d.ts.map +1 -1
- package/dist/chat/chatService.js +22 -3
- package/dist/chat/chatService.js.map +1 -1
- package/dist/chat/conversationService.d.ts +7 -1
- package/dist/chat/conversationService.d.ts.map +1 -1
- package/dist/chat/conversationService.js +48 -15
- package/dist/chat/conversationService.js.map +1 -1
- package/dist/cli/agentRunner.d.ts.map +1 -1
- package/dist/cli/agentRunner.js +88 -8
- package/dist/cli/agentRunner.js.map +1 -1
- package/dist/cli/chatRunner.d.ts +65 -0
- package/dist/cli/chatRunner.d.ts.map +1 -0
- package/dist/cli/chatRunner.js +289 -0
- package/dist/cli/chatRunner.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/inputEngine.d.ts +10 -0
- package/dist/cli/inputEngine.d.ts.map +1 -1
- package/dist/cli/inputEngine.js +28 -1
- package/dist/cli/inputEngine.js.map +1 -1
- package/dist/cli/main.d.ts +4 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +89 -25
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/uiFormatters.d.ts +11 -1
- package/dist/cli/uiFormatters.d.ts.map +1 -1
- package/dist/cli/uiFormatters.js +253 -15
- package/dist/cli/uiFormatters.js.map +1 -1
- package/dist/intelligence/modelGateway.d.ts +1 -0
- package/dist/intelligence/modelGateway.d.ts.map +1 -1
- package/dist/intelligence/modelGateway.js +63 -6
- package/dist/intelligence/modelGateway.js.map +1 -1
- package/dist/intelligence/modelRegistry.d.ts +2 -2
- package/dist/intelligence/modelRegistry.d.ts.map +1 -1
- package/dist/intelligence/modelRegistry.js +72 -31
- package/dist/intelligence/modelRegistry.js.map +1 -1
- package/dist/intelligence/modelRouter.d.ts.map +1 -1
- package/dist/intelligence/modelRouter.js +62 -16
- package/dist/intelligence/modelRouter.js.map +1 -1
- package/dist/intelligence/providers/embeddedInferenceProvider.d.ts.map +1 -1
- package/dist/intelligence/providers/embeddedInferenceProvider.js +2224 -6
- package/dist/intelligence/providers/embeddedInferenceProvider.js.map +1 -1
- package/dist/intelligence/runtime/runtimeManager.d.ts +5 -0
- package/dist/intelligence/runtime/runtimeManager.d.ts.map +1 -1
- package/dist/intelligence/runtime/runtimeManager.js +64 -4
- package/dist/intelligence/runtime/runtimeManager.js.map +1 -1
- package/dist/orchestration/agentExecutionService.d.ts.map +1 -1
- package/dist/orchestration/agentExecutionService.js +22 -0
- package/dist/orchestration/agentExecutionService.js.map +1 -1
- package/dist/orchestration/agentTaskService.d.ts +24 -10
- package/dist/orchestration/agentTaskService.d.ts.map +1 -1
- package/dist/orchestration/agentTaskService.js +76 -13
- package/dist/orchestration/agentTaskService.js.map +1 -1
- package/dist/orchestration/codingAgentService.d.ts.map +1 -1
- package/dist/orchestration/codingAgentService.js +2 -0
- package/dist/orchestration/codingAgentService.js.map +1 -1
- package/dist/orchestration/goalCompletionVerifier.d.ts +9 -0
- package/dist/orchestration/goalCompletionVerifier.d.ts.map +1 -1
- package/dist/orchestration/goalCompletionVerifier.js +131 -9
- package/dist/orchestration/goalCompletionVerifier.js.map +1 -1
- package/dist/orchestration/index.d.ts +16 -2
- package/dist/orchestration/index.d.ts.map +1 -1
- package/dist/orchestration/index.js +20 -4
- package/dist/orchestration/index.js.map +1 -1
- package/dist/orchestration/placeholderDetector.d.ts +74 -0
- package/dist/orchestration/placeholderDetector.d.ts.map +1 -0
- package/dist/orchestration/placeholderDetector.js +741 -0
- package/dist/orchestration/placeholderDetector.js.map +1 -0
- package/dist/orchestration/planner.d.ts.map +1 -1
- package/dist/orchestration/planner.js +94 -55
- package/dist/orchestration/planner.js.map +1 -1
- package/dist/orchestration/projectOrchestrator.d.ts +63 -0
- package/dist/orchestration/projectOrchestrator.d.ts.map +1 -0
- package/dist/orchestration/projectOrchestrator.js +555 -0
- package/dist/orchestration/projectOrchestrator.js.map +1 -0
- package/dist/orchestration/taskDecompositionService.d.ts +36 -0
- package/dist/orchestration/taskDecompositionService.d.ts.map +1 -0
- package/dist/orchestration/taskDecompositionService.js +367 -0
- package/dist/orchestration/taskDecompositionService.js.map +1 -0
- package/dist/orchestration/taskDecompositionTypes.d.ts +62 -0
- package/dist/orchestration/taskDecompositionTypes.d.ts.map +1 -0
- package/dist/orchestration/taskDecompositionTypes.js +5 -0
- package/dist/orchestration/taskDecompositionTypes.js.map +1 -0
- package/dist/preview/previewServer.d.ts.map +1 -1
- package/dist/preview/previewServer.js +28 -7
- package/dist/preview/previewServer.js.map +1 -1
- package/dist/preview/previewService.d.ts +32 -3
- package/dist/preview/previewService.d.ts.map +1 -1
- package/dist/preview/previewService.js +370 -108
- package/dist/preview/previewService.js.map +1 -1
- package/dist/preview/previewTypes.d.ts +1 -1
- package/dist/preview/previewTypes.d.ts.map +1 -1
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +3 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/migration.d.ts.map +1 -1
- package/dist/storage/migration.js +79 -0
- package/dist/storage/migration.js.map +1 -1
- package/dist/storage/repositories/agentTaskRepository.d.ts +13 -0
- package/dist/storage/repositories/agentTaskRepository.d.ts.map +1 -1
- package/dist/storage/repositories/agentTaskRepository.js +87 -25
- package/dist/storage/repositories/agentTaskRepository.js.map +1 -1
- package/dist/storage/repositories/conversationRepository.d.ts +5 -1
- package/dist/storage/repositories/conversationRepository.d.ts.map +1 -1
- package/dist/storage/repositories/conversationRepository.js +69 -0
- package/dist/storage/repositories/conversationRepository.js.map +1 -1
- package/dist/storage/repositories/messageRepository.d.ts +3 -0
- package/dist/storage/repositories/messageRepository.d.ts.map +1 -1
- package/dist/storage/repositories/messageRepository.js +29 -0
- package/dist/storage/repositories/messageRepository.js.map +1 -1
- package/dist/storage/repositories/taskArtifactRepository.d.ts +19 -0
- package/dist/storage/repositories/taskArtifactRepository.d.ts.map +1 -0
- package/dist/storage/repositories/taskArtifactRepository.js +82 -0
- package/dist/storage/repositories/taskArtifactRepository.js.map +1 -0
- package/dist/storage/repositories/types.d.ts +32 -0
- package/dist/storage/repositories/types.d.ts.map +1 -1
- package/dist/tools/adapters/filesystemAdapter.d.ts.map +1 -1
- package/dist/tools/adapters/filesystemAdapter.js +8 -1
- package/dist/tools/adapters/filesystemAdapter.js.map +1 -1
- package/dist/ui/public/app.js +777 -777
- package/dist/ui/public/index.html +117 -117
- package/dist/ui/public/styles.css +413 -413
- package/package.json +64 -63
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS AI — Task Decomposition Service
|
|
3
|
+
*
|
|
4
|
+
* Intelligently analyzes user goals and derives coherent, bounded,
|
|
5
|
+
* dependency-linked child tasks for medium and large projects.
|
|
6
|
+
* Keeps small requests small (1-3 units) and breaks large composite
|
|
7
|
+
* requests into structured units with explicit verification criteria.
|
|
8
|
+
*/
|
|
9
|
+
import { extractBrandCandidates } from './placeholderDetector.js';
|
|
10
|
+
import { Logger } from '../common/logger.js';
|
|
11
|
+
export class TaskDecompositionService {
|
|
12
|
+
modelGateway;
|
|
13
|
+
logger;
|
|
14
|
+
constructor(modelGateway, logLevel = 'info') {
|
|
15
|
+
this.modelGateway = modelGateway;
|
|
16
|
+
this.logger = new Logger('TaskDecompositionService', logLevel);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Analyze goal and produce a decomposition plan.
|
|
20
|
+
*/
|
|
21
|
+
async decompose(options) {
|
|
22
|
+
const goal = options.taskGoal.trim();
|
|
23
|
+
this.logger.info(`Analyzing goal for decomposition`, { goalLength: goal.length });
|
|
24
|
+
// 1. Check complexity
|
|
25
|
+
const complexity = this.estimateComplexity(goal);
|
|
26
|
+
if (complexity === 'low' && !options.forceDecompose) {
|
|
27
|
+
this.logger.info(`Goal classified as low complexity -> single unit execution`);
|
|
28
|
+
return {
|
|
29
|
+
parentGoal: goal,
|
|
30
|
+
isDecomposed: false,
|
|
31
|
+
estimatedComplexity: 'low',
|
|
32
|
+
reasoning: 'Goal is a focused, single-operation task that does not require decomposition.',
|
|
33
|
+
units: [
|
|
34
|
+
{
|
|
35
|
+
id: 'unit-1-main',
|
|
36
|
+
title: goal.length > 50 ? `${goal.slice(0, 47)}...` : goal,
|
|
37
|
+
description: goal,
|
|
38
|
+
category: 'component',
|
|
39
|
+
dependencies: [],
|
|
40
|
+
targetFiles: this.inferTargetFiles(goal),
|
|
41
|
+
expectedOutput: 'Complete implementation fulfilling the requested goal.',
|
|
42
|
+
verificationCriteria: ['Valid syntax and output', 'No placeholder content'],
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// 2. Medium or High Complexity: Generate structured decomposition plan
|
|
48
|
+
const plan = this.generateDecompositionPlan(goal, complexity);
|
|
49
|
+
this.logger.info(`Decomposed into ${plan.units.length} coherent units`, {
|
|
50
|
+
complexity: plan.estimatedComplexity,
|
|
51
|
+
unitTitles: plan.units.map((u) => u.title),
|
|
52
|
+
});
|
|
53
|
+
return plan;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Estimate complexity based on linguistic structure, section keywords, and project scope.
|
|
57
|
+
*/
|
|
58
|
+
estimateComplexity(goal) {
|
|
59
|
+
const lower = goal.toLowerCase();
|
|
60
|
+
// Check for explicit multi-section keywords
|
|
61
|
+
const sectionKeywords = [
|
|
62
|
+
'navbar', 'header', 'hero', 'features', 'solutions', 'dashboard',
|
|
63
|
+
'testimonials', 'pricing', 'faq', 'cta', 'footer', 'menu', 'about',
|
|
64
|
+
'contact', 'gallery', 'portfolio', 'services', 'reviews', 'calculator',
|
|
65
|
+
];
|
|
66
|
+
const matchedSections = sectionKeywords.filter((k) => lower.includes(k));
|
|
67
|
+
const isLargeProject = lower.includes('landing page') ||
|
|
68
|
+
lower.includes('landing website') ||
|
|
69
|
+
lower.includes('website') ||
|
|
70
|
+
lower.includes('web page') ||
|
|
71
|
+
lower.includes('webpage') ||
|
|
72
|
+
lower.includes('web application') ||
|
|
73
|
+
lower.includes('webapp') ||
|
|
74
|
+
lower.includes('web app') ||
|
|
75
|
+
lower.includes('full stack') ||
|
|
76
|
+
lower.includes('platform') ||
|
|
77
|
+
lower.includes('dashboard') ||
|
|
78
|
+
lower.includes('saas');
|
|
79
|
+
if (matchedSections.length >= 4 || (isLargeProject && matchedSections.length >= 2)) {
|
|
80
|
+
return 'high';
|
|
81
|
+
}
|
|
82
|
+
if (matchedSections.length >= 2 || isLargeProject || lower.includes('calculator')) {
|
|
83
|
+
return 'medium';
|
|
84
|
+
}
|
|
85
|
+
return 'low';
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Generate structured decomposition plan with dependencies.
|
|
89
|
+
*/
|
|
90
|
+
generateDecompositionPlan(goal, complexity) {
|
|
91
|
+
const lower = goal.toLowerCase();
|
|
92
|
+
const brandName = this.extractBrandName(goal);
|
|
93
|
+
const reqFolder = this.extractRequestedFolder(goal);
|
|
94
|
+
const prefix = reqFolder ? `${reqFolder}/` : '';
|
|
95
|
+
const units = [];
|
|
96
|
+
// ── CASE A: Calculator Project ───────────────────────────────────────────
|
|
97
|
+
if (lower.includes('calculator')) {
|
|
98
|
+
units.push({
|
|
99
|
+
id: 'unit-1-foundation',
|
|
100
|
+
title: 'Calculator UI Structure',
|
|
101
|
+
description: `Build complete semantic HTML skeleton and display grid for the calculator application (${brandName || 'Modern Calculator'}) in ${reqFolder || 'project root'}.`,
|
|
102
|
+
category: 'foundation',
|
|
103
|
+
dependencies: [],
|
|
104
|
+
targetFiles: [`${prefix}index.html`],
|
|
105
|
+
expectedOutput: 'Clean HTML with display, number keypad (0-9), operator buttons (+, -, *, /), clear, and equals buttons.',
|
|
106
|
+
verificationCriteria: ['index.html contains complete display and button keypad', 'No placeholder comments'],
|
|
107
|
+
});
|
|
108
|
+
units.push({
|
|
109
|
+
id: 'unit-2-logic',
|
|
110
|
+
title: 'Calculator Computation Logic',
|
|
111
|
+
description: `Implement calculator state machine, button click handlers, operations (+, -, *, /), keyboard events, and display updates in JavaScript (${prefix}script.js).`,
|
|
112
|
+
category: 'logic',
|
|
113
|
+
dependencies: ['unit-1-foundation'],
|
|
114
|
+
targetFiles: [`${prefix}script.js`, `${prefix}index.html`],
|
|
115
|
+
expectedOutput: 'Working JavaScript arithmetic engine supporting addition, subtraction, multiplication, division, decimal input, and clear.',
|
|
116
|
+
verificationCriteria: ['script.js contains real event listeners and arithmetic functions', 'index.html connects script.js'],
|
|
117
|
+
});
|
|
118
|
+
units.push({
|
|
119
|
+
id: 'unit-3-styling',
|
|
120
|
+
title: 'Calculator Responsive Styling',
|
|
121
|
+
description: `Implement modern aesthetic styling, CSS grid layout, responsive dimensions, button hover/active states, and dark theme in CSS (${prefix}style.css).`,
|
|
122
|
+
category: 'styling',
|
|
123
|
+
dependencies: ['unit-1-foundation'],
|
|
124
|
+
targetFiles: [`${prefix}style.css`, `${prefix}index.html`],
|
|
125
|
+
expectedOutput: 'Polished CSS styling with glassmorphism or sleek dark mode theme, centered layout, and responsive keypad.',
|
|
126
|
+
verificationCriteria: ['style.css contains real layout rules and color variables', 'index.html links style.css'],
|
|
127
|
+
});
|
|
128
|
+
units.push({
|
|
129
|
+
id: 'unit-4-integration',
|
|
130
|
+
title: 'Calculator Integration & Verification',
|
|
131
|
+
description: 'Verify end-to-end integration between HTML, CSS, and JS. Ensure calculation display and buttons are fully interactive.',
|
|
132
|
+
category: 'integration',
|
|
133
|
+
dependencies: ['unit-1-foundation', 'unit-2-logic', 'unit-3-styling'],
|
|
134
|
+
targetFiles: [`${prefix}index.html`, `${prefix}style.css`, `${prefix}script.js`],
|
|
135
|
+
expectedOutput: '100% complete, fully verified calculator ready for live preview.',
|
|
136
|
+
verificationCriteria: ['All 3 files exist and are valid', 'No unresolved references or placeholders'],
|
|
137
|
+
});
|
|
138
|
+
return {
|
|
139
|
+
parentGoal: goal,
|
|
140
|
+
isDecomposed: true,
|
|
141
|
+
estimatedComplexity: complexity,
|
|
142
|
+
reasoning: 'Decomposed into UI structure, calculation logic, responsive styling, and end-to-end integration.',
|
|
143
|
+
units,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// ── CASE B: Web Landing Page / SaaS / Brand / Portfolio ──────────────────
|
|
147
|
+
const targetBrand = brandName || 'Modern Tech';
|
|
148
|
+
// 1. Foundation
|
|
149
|
+
units.push({
|
|
150
|
+
id: 'unit-1-foundation',
|
|
151
|
+
title: 'Project Foundation & Base Layout',
|
|
152
|
+
description: `Scaffold complete, semantic HTML5 structure for ${targetBrand} including meta tags, responsive viewport, Google Fonts, and base CSS variables with full rich markup. Do not output placeholder comments or empty skeleton tags.`,
|
|
153
|
+
category: 'foundation',
|
|
154
|
+
dependencies: [],
|
|
155
|
+
targetFiles: ['index.html', 'styles.css'],
|
|
156
|
+
expectedOutput: `Valid HTML5 document with title containing '${targetBrand}', linked stylesheets, and CSS design tokens.`,
|
|
157
|
+
verificationCriteria: ['index.html has DOCTYPE, head, title, and body', 'styles.css has root color tokens and reset rules'],
|
|
158
|
+
});
|
|
159
|
+
// 2. Navigation Bar
|
|
160
|
+
units.push({
|
|
161
|
+
id: 'unit-2-navbar',
|
|
162
|
+
title: 'Navigation Header & Brand Identity',
|
|
163
|
+
description: `Implement sticky header navbar with ${targetBrand} brand logo, navigation links, and primary action button.`,
|
|
164
|
+
category: 'component',
|
|
165
|
+
dependencies: ['unit-1-foundation'],
|
|
166
|
+
targetFiles: ['index.html', 'styles.css'],
|
|
167
|
+
expectedOutput: `Header element with brand logo '${targetBrand}', navigation links, and responsive styling.`,
|
|
168
|
+
verificationCriteria: ['header or nav element exists', `${targetBrand} brand text present`, 'Navigation links styled and visible'],
|
|
169
|
+
});
|
|
170
|
+
// 3. Hero Section
|
|
171
|
+
units.push({
|
|
172
|
+
id: 'unit-3-hero',
|
|
173
|
+
title: 'Hero Section & Value Proposition',
|
|
174
|
+
description: `Create high-impact Hero banner with headline, sub-headline, primary and secondary CTA buttons, and key visual highlights for ${targetBrand}.`,
|
|
175
|
+
category: 'component',
|
|
176
|
+
dependencies: ['unit-2-navbar'],
|
|
177
|
+
targetFiles: ['index.html', 'styles.css'],
|
|
178
|
+
expectedOutput: 'Rich hero section with bold typography, value proposition paragraph, action buttons, and accent styling.',
|
|
179
|
+
verificationCriteria: ['hero section exists with h1 heading', 'CTA buttons present with real text', 'No placeholder comments'],
|
|
180
|
+
});
|
|
181
|
+
// 4. Features Section
|
|
182
|
+
units.push({
|
|
183
|
+
id: 'unit-4-features',
|
|
184
|
+
title: 'Core Features & Capabilities',
|
|
185
|
+
description: `Build comprehensive features grid with 4 to 6 distinct capability cards showcasing ${targetBrand}'s unique advantages.`,
|
|
186
|
+
category: 'component',
|
|
187
|
+
dependencies: ['unit-3-hero'],
|
|
188
|
+
targetFiles: ['index.html', 'styles.css'],
|
|
189
|
+
expectedOutput: 'Features grid with at least 4 feature cards containing distinct icons/titles/descriptions.',
|
|
190
|
+
verificationCriteria: ['features section exists', 'At least 3 feature cards with real paragraphs', 'Clean CSS grid or flex layout'],
|
|
191
|
+
});
|
|
192
|
+
// 5. Solutions / Menu / Specialty Section
|
|
193
|
+
const normalized = goal.normalize('NFD').replace(/[\u0300-\u036f]/g, '').toLowerCase();
|
|
194
|
+
const isCafe = lower.includes('cafe') ||
|
|
195
|
+
lower.includes('café') ||
|
|
196
|
+
normalized.includes('cafe') ||
|
|
197
|
+
lower.includes('coffee') ||
|
|
198
|
+
lower.includes('brew') ||
|
|
199
|
+
lower.includes('roastery') ||
|
|
200
|
+
lower.includes('restaurant') ||
|
|
201
|
+
lower.includes('bakery') ||
|
|
202
|
+
lower.includes('bistro');
|
|
203
|
+
if (isCafe) {
|
|
204
|
+
units.push({
|
|
205
|
+
id: 'unit-5-menu',
|
|
206
|
+
title: 'Artisanal Menu & Offerings',
|
|
207
|
+
description: `Implement curated cafe menu section with categorized beverages, artisanal bakes, pricing, and origin details for ${targetBrand}.`,
|
|
208
|
+
category: 'component',
|
|
209
|
+
dependencies: ['unit-4-features'],
|
|
210
|
+
targetFiles: ['index.html', 'styles.css'],
|
|
211
|
+
expectedOutput: 'Menu section displaying categorized specialty coffees, signature brews, and pricing.',
|
|
212
|
+
verificationCriteria: ['menu section exists with real item names and prices', 'Visual card styling for menu items'],
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
units.push({
|
|
217
|
+
id: 'unit-5-solutions',
|
|
218
|
+
title: 'Enterprise Solutions & Architecture',
|
|
219
|
+
description: `Implement solutions showcase with architecture highlights, workflow diagrams, and integration capabilities for ${targetBrand}.`,
|
|
220
|
+
category: 'component',
|
|
221
|
+
dependencies: ['unit-4-features'],
|
|
222
|
+
targetFiles: ['index.html', 'styles.css'],
|
|
223
|
+
expectedOutput: 'Solutions section detailing enterprise use cases, platform integrations, and scalability highlights.',
|
|
224
|
+
verificationCriteria: ['solutions section exists with detailed content', 'Interactive tabs or grid cards styled in CSS'],
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
// 6. Interactive Module / Dashboard Preview
|
|
228
|
+
if (/\b(?:dashboard|analytics|live metrics)\b/i.test(lower) ||
|
|
229
|
+
(/\b(?:product|platform)\b/i.test(lower) && !/\b(?:production|production-quality)\b/i.test(lower)) ||
|
|
230
|
+
lower.includes('nexora') ||
|
|
231
|
+
lower.includes('saas')) {
|
|
232
|
+
units.push({
|
|
233
|
+
id: 'unit-6-dashboard',
|
|
234
|
+
title: 'Interactive Product Dashboard Visual',
|
|
235
|
+
description: `Build interactive dashboard preview with real-time metrics cards, chart visualizations, active nodes status, and control toggles for ${targetBrand}.`,
|
|
236
|
+
category: 'component',
|
|
237
|
+
dependencies: ['unit-5-solutions', 'unit-5-menu'].filter((dep) => units.some((u) => u.id === dep)),
|
|
238
|
+
targetFiles: ['index.html', 'styles.css', 'scripts.js'],
|
|
239
|
+
expectedOutput: 'Dashboard component with live metrics, latency/throughput counters, and interactive visual widgets.',
|
|
240
|
+
verificationCriteria: ['dashboard container exists with metrics items', 'CSS styling for dashboard panels', 'No empty container placeholders'],
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
// 7. Testimonials / Social Proof
|
|
244
|
+
units.push({
|
|
245
|
+
id: 'unit-7-testimonials',
|
|
246
|
+
title: 'Customer Testimonials & Social Proof',
|
|
247
|
+
description: `Add customer reviews and testimonials section with customer quotes, author names, roles/companies, and 5-star ratings for ${targetBrand}.`,
|
|
248
|
+
category: 'component',
|
|
249
|
+
dependencies: units.length > 0 ? [units[units.length - 1].id] : [],
|
|
250
|
+
targetFiles: ['index.html', 'styles.css'],
|
|
251
|
+
expectedOutput: 'Testimonials section with at least 3 distinct customer review cards with author avatars/ratings.',
|
|
252
|
+
verificationCriteria: ['testimonials section exists', 'At least 2 testimonial cards with realistic quotes'],
|
|
253
|
+
});
|
|
254
|
+
// 8. Pricing & Plans
|
|
255
|
+
if (lower.includes('pricing') || lower.includes('plan') || lower.includes('saas') || lower.includes('nexora') || complexity === 'high') {
|
|
256
|
+
units.push({
|
|
257
|
+
id: 'unit-8-pricing',
|
|
258
|
+
title: 'Tiered Pricing & Plans',
|
|
259
|
+
description: `Implement tiered pricing table (e.g. Starter, Professional, Enterprise) with feature comparison lists, highlighted popular badge, and checkout CTA buttons for ${targetBrand}.`,
|
|
260
|
+
category: 'component',
|
|
261
|
+
dependencies: units.length > 0 ? [units[units.length - 1].id] : [],
|
|
262
|
+
targetFiles: ['index.html', 'styles.css'],
|
|
263
|
+
expectedOutput: 'Pricing section with 3 tier cards, feature checklists, prices ($/mo), and selection buttons.',
|
|
264
|
+
verificationCriteria: ['pricing section exists with 3 pricing cards', 'Pricing numbers, features, and buttons present'],
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
// 9. FAQ Section
|
|
268
|
+
if (lower.includes('faq') || lower.includes('question') || complexity === 'high') {
|
|
269
|
+
units.push({
|
|
270
|
+
id: 'unit-9-faq',
|
|
271
|
+
title: 'Frequently Asked Questions (FAQ)',
|
|
272
|
+
description: `Build FAQ accordion section with 4 to 6 common questions and detailed answers regarding ${targetBrand}.`,
|
|
273
|
+
category: 'component',
|
|
274
|
+
dependencies: units.length > 0 ? [units[units.length - 1].id] : [],
|
|
275
|
+
targetFiles: ['index.html', 'styles.css', 'scripts.js'],
|
|
276
|
+
expectedOutput: 'FAQ accordion with 4+ questions and expandable answer panels with JavaScript toggling.',
|
|
277
|
+
verificationCriteria: ['faq section exists with questions and answers', 'No skeleton or placeholder questions'],
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
// 10. Call to Action (CTA) & Footer
|
|
281
|
+
units.push({
|
|
282
|
+
id: 'unit-10-cta-footer',
|
|
283
|
+
title: 'Conversion CTA Banner & Complete Footer',
|
|
284
|
+
description: `Create final conversion CTA section with email input / launch button, and multi-column footer with company links, copyright, social icons, and legal pages for ${targetBrand}.`,
|
|
285
|
+
category: 'component',
|
|
286
|
+
dependencies: units.length > 0 ? [units[units.length - 1].id] : [],
|
|
287
|
+
targetFiles: ['index.html', 'styles.css'],
|
|
288
|
+
expectedOutput: 'Engaging CTA banner and comprehensive 4-column footer with valid anchor links.',
|
|
289
|
+
verificationCriteria: ['cta section and footer element exist', 'Copyright and navigation links present in footer'],
|
|
290
|
+
});
|
|
291
|
+
// 11. Responsive Styling & Dynamic Interactions
|
|
292
|
+
units.push({
|
|
293
|
+
id: 'unit-11-interactions',
|
|
294
|
+
title: 'Responsive Design & Dynamic JavaScript',
|
|
295
|
+
description: `Implement mobile navigation toggle, smooth scroll navigation, FAQ accordion click handlers, dashboard live ticker, and responsive media queries across devices.`,
|
|
296
|
+
category: 'logic',
|
|
297
|
+
dependencies: units.map((u) => u.id),
|
|
298
|
+
targetFiles: ['styles.css', 'scripts.js', 'index.html'],
|
|
299
|
+
expectedOutput: 'JavaScript interactivity for mobile menu, smooth scrolling, and accordion toggles, plus responsive CSS media queries.',
|
|
300
|
+
verificationCriteria: ['scripts.js contains working DOM interaction code', 'styles.css has media queries for mobile/tablet'],
|
|
301
|
+
});
|
|
302
|
+
// 12. Final Project Integration & Verification
|
|
303
|
+
units.push({
|
|
304
|
+
id: 'unit-12-final-integration',
|
|
305
|
+
title: 'Final Project Integration & Verification',
|
|
306
|
+
description: `Perform complete cross-file audit: verify all sections render rich visible text, all styles and scripts are linked, and zero placeholder comments or empty shells exist in ${targetBrand}.`,
|
|
307
|
+
category: 'integration',
|
|
308
|
+
dependencies: units.map((u) => u.id),
|
|
309
|
+
targetFiles: ['index.html', 'styles.css', 'scripts.js'],
|
|
310
|
+
expectedOutput: `Complete, verified, production-grade ${targetBrand} web project ready for preview server hosting.`,
|
|
311
|
+
verificationCriteria: ['All project files exist and pass integrity check', 'HTML contains rich substantive content and no skeletons'],
|
|
312
|
+
});
|
|
313
|
+
return {
|
|
314
|
+
parentGoal: goal,
|
|
315
|
+
isDecomposed: true,
|
|
316
|
+
estimatedComplexity: complexity,
|
|
317
|
+
reasoning: `Decomposed ${targetBrand} into ${units.length} coherent modular units spanning foundation, components, styling, logic, and final integration.`,
|
|
318
|
+
units,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Extract brand name from prompt text (e.g. 'NOVARA AI', 'NEXORA', 'Bean & Brew', 'DevForge').
|
|
323
|
+
*/
|
|
324
|
+
extractBrandName(goal) {
|
|
325
|
+
const candidates = extractBrandCandidates(goal);
|
|
326
|
+
if (candidates.length > 0) {
|
|
327
|
+
return candidates[0];
|
|
328
|
+
}
|
|
329
|
+
return null;
|
|
330
|
+
}
|
|
331
|
+
inferTargetFiles(goal) {
|
|
332
|
+
const lower = goal.toLowerCase();
|
|
333
|
+
if (lower.includes('.py') || lower.includes('python'))
|
|
334
|
+
return ['main.py'];
|
|
335
|
+
if (lower.includes('.json'))
|
|
336
|
+
return ['data.json'];
|
|
337
|
+
if (lower.includes('.md') || lower.includes('readme'))
|
|
338
|
+
return ['README.md'];
|
|
339
|
+
return ['index.html', 'styles.css'];
|
|
340
|
+
}
|
|
341
|
+
extractRequestedFolder(goal) {
|
|
342
|
+
const match = goal.match(/(?:folder|directory)\s+[`"']?([a-zA-Z0-9_\-]+)[`"']?/i);
|
|
343
|
+
if (match && match[1]) {
|
|
344
|
+
const f = match[1].trim();
|
|
345
|
+
const forbidden = ['a', 'the', 'new', 'containing', 'named', 'called', 'with', 'for'];
|
|
346
|
+
if (!forbidden.includes(f.toLowerCase())) {
|
|
347
|
+
return f;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
inferProjectFolder(goal) {
|
|
353
|
+
const requested = this.extractRequestedFolder(goal);
|
|
354
|
+
if (requested)
|
|
355
|
+
return requested;
|
|
356
|
+
const match = goal.match(/(?:folder|directory|project)\s+[`"']?([a-zA-Z0-9_\-]+)[`"']?/i);
|
|
357
|
+
if (match && match[1]) {
|
|
358
|
+
return match[1].trim();
|
|
359
|
+
}
|
|
360
|
+
const brand = this.extractBrandName(goal);
|
|
361
|
+
if (brand) {
|
|
362
|
+
return brand.toLowerCase().replace(/[^a-z0-9]/g, '-').replace(/-+/g, '-');
|
|
363
|
+
}
|
|
364
|
+
return 'project';
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=taskDecompositionService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskDecompositionService.js","sourceRoot":"","sources":["../../src/orchestration/taskDecompositionService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS AI — Task Decomposition & Project Orchestration Types
|
|
3
|
+
*/
|
|
4
|
+
export interface DecomposedTaskUnit {
|
|
5
|
+
/** Unique unit identifier within the plan (e.g. 'unit-1-foundation'). */
|
|
6
|
+
id: string;
|
|
7
|
+
/** Human-readable title for UI and task history. */
|
|
8
|
+
title: string;
|
|
9
|
+
/** Specific, bounded implementation instructions for the model. */
|
|
10
|
+
description: string;
|
|
11
|
+
/** Categorical stage of this unit. */
|
|
12
|
+
category: 'foundation' | 'component' | 'styling' | 'logic' | 'integration';
|
|
13
|
+
/** IDs of prerequisite units that must be completed before this unit can execute. */
|
|
14
|
+
dependencies: string[];
|
|
15
|
+
/** Relative file paths created or modified by this unit. */
|
|
16
|
+
targetFiles: string[];
|
|
17
|
+
/** Concrete expected output to guide generation and verification. */
|
|
18
|
+
expectedOutput: string;
|
|
19
|
+
/** Rules/checks that must pass for this unit to be marked verified. */
|
|
20
|
+
verificationCriteria: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface DecompositionPlan {
|
|
23
|
+
/** Original user task goal. */
|
|
24
|
+
parentGoal: string;
|
|
25
|
+
/** Whether the request is complex enough to warrant multi-task decomposition. */
|
|
26
|
+
isDecomposed: boolean;
|
|
27
|
+
/** Ordered list of implementation units. */
|
|
28
|
+
units: DecomposedTaskUnit[];
|
|
29
|
+
/** Architectural reasoning for this decomposition breakdown. */
|
|
30
|
+
reasoning: string;
|
|
31
|
+
/** Complexity estimate of the requested project. */
|
|
32
|
+
estimatedComplexity: 'low' | 'medium' | 'high';
|
|
33
|
+
}
|
|
34
|
+
export interface ChildTaskExecutionResult {
|
|
35
|
+
unitId: string;
|
|
36
|
+
taskId: string;
|
|
37
|
+
title: string;
|
|
38
|
+
success: boolean;
|
|
39
|
+
status: 'completed' | 'failed' | 'blocked';
|
|
40
|
+
summary: string;
|
|
41
|
+
artifacts: string[];
|
|
42
|
+
error?: string;
|
|
43
|
+
attemptCount: number;
|
|
44
|
+
}
|
|
45
|
+
export interface ProjectOrchestrationResult {
|
|
46
|
+
parentTaskId: string;
|
|
47
|
+
success: boolean;
|
|
48
|
+
status: 'completed' | 'failed' | 'blocked';
|
|
49
|
+
totalUnits: number;
|
|
50
|
+
completedUnits: number;
|
|
51
|
+
failedUnits: number;
|
|
52
|
+
childResults: ChildTaskExecutionResult[];
|
|
53
|
+
finalVerificationPassed: boolean;
|
|
54
|
+
summary: string;
|
|
55
|
+
error?: string;
|
|
56
|
+
durationMs: number;
|
|
57
|
+
}
|
|
58
|
+
export interface DecomposeOptions {
|
|
59
|
+
taskGoal: string;
|
|
60
|
+
forceDecompose?: boolean;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=taskDecompositionTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskDecompositionTypes.d.ts","sourceRoot":"","sources":["../../src/orchestration/taskDecompositionTypes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,EAAE,EAAE,MAAM,CAAC;IACX,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,QAAQ,EAAE,YAAY,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,CAAC;IAC3E,qFAAqF;IACrF,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,qEAAqE;IACrE,cAAc,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,YAAY,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,mBAAmB,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CAChD;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,wBAAwB,EAAE,CAAC;IACzC,uBAAuB,EAAE,OAAO,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskDecompositionTypes.js","sourceRoot":"","sources":["../../src/orchestration/taskDecompositionTypes.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"previewServer.d.ts","sourceRoot":"","sources":["../../src/preview/previewServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"previewServer.d.ts","sourceRoot":"","sources":["../../src/preview/previewServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AA+B3D,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,aAAa,CAAyB;gBAElC,QAAQ,GAAE,OAAO,qBAAqB,EAAE,QAAiB;IAIrE;;OAEG;mBACkB,YAAY;IAyBjC;;OAEG;IACG,KAAK,CACT,UAAU,EAAE,MAAM,EAClB,SAAS,SAAe,EACxB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,iBAAiB,CAAC;IA8C7B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B;;OAEG;IACH,OAAO,IAAI,iBAAiB,GAAG,IAAI;IAInC,OAAO,CAAC,aAAa;CAoHtB"}
|
|
@@ -20,8 +20,8 @@ const MIME_TYPES = {
|
|
|
20
20
|
'.html': 'text/html; charset=utf-8',
|
|
21
21
|
'.htm': 'text/html; charset=utf-8',
|
|
22
22
|
'.css': 'text/css; charset=utf-8',
|
|
23
|
-
'.js': '
|
|
24
|
-
'.mjs': '
|
|
23
|
+
'.js': 'text/javascript; charset=utf-8',
|
|
24
|
+
'.mjs': 'text/javascript; charset=utf-8',
|
|
25
25
|
'.json': 'application/json; charset=utf-8',
|
|
26
26
|
'.png': 'image/png',
|
|
27
27
|
'.jpg': 'image/jpeg',
|
|
@@ -30,8 +30,18 @@ const MIME_TYPES = {
|
|
|
30
30
|
'.svg': 'image/svg+xml',
|
|
31
31
|
'.ico': 'image/x-icon',
|
|
32
32
|
'.webp': 'image/webp',
|
|
33
|
+
'.woff': 'font/woff',
|
|
34
|
+
'.woff2': 'font/woff2',
|
|
35
|
+
'.ttf': 'font/ttf',
|
|
36
|
+
'.otf': 'font/otf',
|
|
33
37
|
'.txt': 'text/plain; charset=utf-8',
|
|
34
38
|
};
|
|
39
|
+
function isSubpathOrEqual(parentDir, childPath) {
|
|
40
|
+
const isWin = process.platform === 'win32';
|
|
41
|
+
const p = isWin ? parentDir.toLowerCase() : parentDir;
|
|
42
|
+
const c = isWin ? childPath.toLowerCase() : childPath;
|
|
43
|
+
return c === p || c.startsWith(p + (isWin ? '\\' : '/')) || c.startsWith(p + path.sep);
|
|
44
|
+
}
|
|
35
45
|
export class PreviewServer {
|
|
36
46
|
server = null;
|
|
37
47
|
logger;
|
|
@@ -104,6 +114,8 @@ export class PreviewServer {
|
|
|
104
114
|
projectDir: canonicalProjectDir,
|
|
105
115
|
entryFile,
|
|
106
116
|
};
|
|
117
|
+
this.logger.info(`[PreviewServer] Artifact root: ${canonicalProjectDir}`);
|
|
118
|
+
this.logger.info(`[PreviewServer] Entry point: ${entryFile}`);
|
|
107
119
|
this.logger.info(`PreviewServer listening at ${url} serving ${canonicalProjectDir}`);
|
|
108
120
|
return this.currentInfo;
|
|
109
121
|
}
|
|
@@ -156,12 +168,20 @@ export class PreviewServer {
|
|
|
156
168
|
if (reqPath === '/' || reqPath === '') {
|
|
157
169
|
reqPath = '/' + entryFile;
|
|
158
170
|
}
|
|
171
|
+
// Safe Favicon handling: if favicon.ico is requested and missing on disk, return 204 No Content
|
|
172
|
+
if (reqPath === '/favicon.ico' && !fs.existsSync(path.resolve(canonicalProjectDir, 'favicon.ico'))) {
|
|
173
|
+
res.writeHead(204, {
|
|
174
|
+
'Content-Type': 'image/x-icon',
|
|
175
|
+
'Cache-Control': 'public, max-age=86400',
|
|
176
|
+
});
|
|
177
|
+
res.end();
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
159
180
|
// Strip leading slashes to resolve safely relative to projectDir
|
|
160
181
|
const relativeTarget = reqPath.replace(/^\/+/, '');
|
|
161
182
|
const candidatePath = path.resolve(canonicalProjectDir, relativeTarget);
|
|
162
|
-
// Path traversal check 1: relative path check
|
|
163
|
-
|
|
164
|
-
if (rel.startsWith('..') || path.isAbsolute(rel)) {
|
|
183
|
+
// Path traversal check 1: relative path and boundary check
|
|
184
|
+
if (!isSubpathOrEqual(canonicalProjectDir, candidatePath)) {
|
|
165
185
|
this.logger.warn(`Path traversal attempt blocked: '${reqPath}'`);
|
|
166
186
|
res.writeHead(403, { 'Content-Type': 'text/plain' });
|
|
167
187
|
res.end('Forbidden: Access outside project directory is denied.');
|
|
@@ -185,14 +205,15 @@ export class PreviewServer {
|
|
|
185
205
|
return;
|
|
186
206
|
}
|
|
187
207
|
}
|
|
188
|
-
// Path traversal check 2: canonical realpath check
|
|
208
|
+
// Path traversal check 2: canonical realpath check (case-insensitive on Windows)
|
|
189
209
|
const canonicalFile = fs.realpathSync(fileToServe);
|
|
190
|
-
if (!
|
|
210
|
+
if (!isSubpathOrEqual(canonicalProjectDir, canonicalFile)) {
|
|
191
211
|
this.logger.warn(`Symlink path traversal blocked: '${canonicalFile}'`);
|
|
192
212
|
res.writeHead(403, { 'Content-Type': 'text/plain' });
|
|
193
213
|
res.end('Forbidden: Access outside project directory is denied.');
|
|
194
214
|
return;
|
|
195
215
|
}
|
|
216
|
+
this.logger.info(`[PreviewServer] Serving: ${canonicalFile}`);
|
|
196
217
|
const ext = path.extname(canonicalFile).toLowerCase();
|
|
197
218
|
const contentType = MIME_TYPES[ext] || 'application/octet-stream';
|
|
198
219
|
const fileStat = fs.statSync(canonicalFile);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"previewServer.js","sourceRoot":"","sources":["../../src/preview/previewServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAE3B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,MAAM,UAAU,GAA2B;IACzC,OAAO,EAAE,0BAA0B;IACnC,MAAM,EAAE,0BAA0B;IAClC,MAAM,EAAE,yBAAyB;IACjC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"previewServer.js","sourceRoot":"","sources":["../../src/preview/previewServer.ts"],"names":[],"mappings":"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"}
|