@tpitre/story-ui 3.6.2 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -32
- package/dist/cli/index.js +0 -5
- package/dist/cli/setup.js +1 -1
- package/dist/mcp-server/routes/generateStory.d.ts.map +1 -1
- package/dist/mcp-server/routes/generateStory.js +142 -87
- package/dist/mcp-server/routes/generateStoryStream.d.ts.map +1 -1
- package/dist/mcp-server/routes/generateStoryStream.js +149 -31
- package/dist/story-generator/dynamicPackageDiscovery.d.ts +35 -2
- package/dist/story-generator/dynamicPackageDiscovery.d.ts.map +1 -1
- package/dist/story-generator/dynamicPackageDiscovery.js +332 -6
- package/dist/story-generator/enhancedComponentDiscovery.d.ts.map +1 -1
- package/dist/story-generator/enhancedComponentDiscovery.js +149 -2
- package/dist/story-generator/framework-adapters/base-adapter.d.ts +1 -0
- package/dist/story-generator/framework-adapters/base-adapter.d.ts.map +1 -1
- package/dist/story-generator/framework-adapters/base-adapter.js +12 -2
- package/dist/story-generator/framework-adapters/react-adapter.d.ts.map +1 -1
- package/dist/story-generator/framework-adapters/react-adapter.js +2 -0
- package/dist/story-generator/framework-adapters/svelte-adapter.d.ts.map +1 -1
- package/dist/story-generator/framework-adapters/svelte-adapter.js +53 -7
- package/dist/story-generator/framework-adapters/vue-adapter.d.ts.map +1 -1
- package/dist/story-generator/framework-adapters/vue-adapter.js +21 -1
- package/dist/story-generator/framework-adapters/web-components-adapter.d.ts.map +1 -1
- package/dist/story-generator/framework-adapters/web-components-adapter.js +4 -0
- package/dist/story-generator/llm-providers/openai-provider.js +2 -2
- package/dist/story-generator/promptGenerator.d.ts.map +1 -1
- package/dist/story-generator/promptGenerator.js +179 -26
- package/dist/story-generator/selfHealingLoop.d.ts +112 -0
- package/dist/story-generator/selfHealingLoop.d.ts.map +1 -0
- package/dist/story-generator/selfHealingLoop.js +202 -0
- package/dist/story-generator/validateStory.d.ts.map +1 -1
- package/dist/story-generator/validateStory.js +81 -12
- package/dist/story-ui.config.d.ts +2 -0
- package/dist/story-ui.config.d.ts.map +1 -1
- package/dist/templates/StoryUI/StoryUIPanel.d.ts +0 -5
- package/dist/templates/StoryUI/StoryUIPanel.d.ts.map +1 -1
- package/dist/templates/StoryUI/StoryUIPanel.js +411 -223
- package/package.json +4 -4
- package/templates/StoryUI/StoryUIPanel.mdx +84 -0
- package/templates/StoryUI/StoryUIPanel.tsx +493 -265
- package/dist/templates/StoryUI/StoryUIPanel.stories.d.ts +0 -18
- package/dist/templates/StoryUI/StoryUIPanel.stories.d.ts.map +0 -1
- package/dist/templates/StoryUI/StoryUIPanel.stories.js +0 -37
- package/templates/StoryUI/StoryUIPanel.stories.tsx +0 -44
- package/templates/StoryUI/manager.tsx +0 -859
|
@@ -12,6 +12,7 @@ import * as path from 'path';
|
|
|
12
12
|
import { generateStory } from '../../story-generator/generateStory.js';
|
|
13
13
|
import { EnhancedComponentDiscovery } from '../../story-generator/enhancedComponentDiscovery.js';
|
|
14
14
|
import { buildClaudePrompt as buildFlexiblePrompt, buildFrameworkAwarePrompt, detectProjectFramework, } from '../../story-generator/promptGenerator.js';
|
|
15
|
+
import { getAdapter } from '../../story-generator/framework-adapters/index.js';
|
|
15
16
|
import { loadUserConfig, validateConfig } from '../../story-generator/configLoader.js';
|
|
16
17
|
import { extractAndValidateCodeBlock, createFallbackStory } from '../../story-generator/validateStory.js';
|
|
17
18
|
import { isBlacklistedComponent, isBlacklistedIcon, getBlacklistErrorMessage, ICON_CORRECTIONS } from '../../story-generator/componentBlacklist.js';
|
|
@@ -19,7 +20,10 @@ import { StoryTracker } from '../../story-generator/storyTracker.js';
|
|
|
19
20
|
import { getDocumentation } from '../../story-generator/documentation-sources.js';
|
|
20
21
|
import { postProcessStory } from '../../story-generator/postProcessStory.js';
|
|
21
22
|
import { validateStory } from '../../story-generator/storyValidator.js';
|
|
23
|
+
import { validateStoryCode } from '../../story-generator/validateStory.js';
|
|
24
|
+
import { aggregateValidationErrors, shouldContinueRetrying, buildSelfHealingPrompt, hasNoErrors, getTotalErrorCount, createEmptyErrors, formatErrorsForLog, selectBestAttempt, } from '../../story-generator/selfHealingLoop.js';
|
|
22
25
|
import { StoryHistoryManager } from '../../story-generator/storyHistory.js';
|
|
26
|
+
import { logger } from '../../story-generator/logger.js';
|
|
23
27
|
import { UrlRedirectService } from '../../story-generator/urlRedirectService.js';
|
|
24
28
|
import { chatCompletion, generateTitle as llmGenerateTitle, isProviderConfigured, getProviderInfo, chatCompletionWithImages, buildMessageWithImages } from '../../story-generator/llm-providers/story-llm-service.js';
|
|
25
29
|
import { processImageInputs } from '../../story-generator/imageProcessor.js';
|
|
@@ -94,11 +98,30 @@ class StreamWriter {
|
|
|
94
98
|
return Date.now() - this.startTime;
|
|
95
99
|
}
|
|
96
100
|
}
|
|
101
|
+
// Build suggestion using the user's actual discovered components (design-system agnostic)
|
|
102
|
+
function buildComponentSuggestion(components) {
|
|
103
|
+
if (!components?.length) {
|
|
104
|
+
return 'Check your story-ui.config.js to ensure components are properly configured.';
|
|
105
|
+
}
|
|
106
|
+
// Show a sample of the user's actual available components (up to 5)
|
|
107
|
+
const sampleComponents = components
|
|
108
|
+
.slice(0, 5)
|
|
109
|
+
.map(c => c.name)
|
|
110
|
+
.join(', ');
|
|
111
|
+
const moreCount = components.length > 5
|
|
112
|
+
? ` and ${components.length - 5} more`
|
|
113
|
+
: '';
|
|
114
|
+
return `Your available components include: ${sampleComponents}${moreCount}. Check story-ui.config.js if expected components are missing.`;
|
|
115
|
+
}
|
|
97
116
|
// Analyze prompt to determine intent
|
|
98
117
|
async function analyzeIntent(prompt, config, conversation, previousCode, options) {
|
|
99
|
-
// Determine framework
|
|
118
|
+
// Determine framework - priority: config > explicit option > auto-detect > default
|
|
100
119
|
let framework = 'react';
|
|
101
|
-
if (
|
|
120
|
+
if (config.componentFramework) {
|
|
121
|
+
// First priority: use config.componentFramework if set
|
|
122
|
+
framework = config.componentFramework;
|
|
123
|
+
}
|
|
124
|
+
else if (options.framework) {
|
|
102
125
|
framework = options.framework;
|
|
103
126
|
}
|
|
104
127
|
else if (options.autoDetectFramework) {
|
|
@@ -458,25 +481,53 @@ export async function generateStoryFromPromptStream(req, res) {
|
|
|
458
481
|
const messages = [
|
|
459
482
|
{ role: 'user', content: initialPrompt }
|
|
460
483
|
];
|
|
461
|
-
// Step 4: Call LLM
|
|
484
|
+
// Step 4: Call LLM with Self-Healing Loop
|
|
462
485
|
currentStep++;
|
|
463
486
|
stream.sendProgress(currentStep, totalSteps, 'llm_thinking', 'AI is generating your story...');
|
|
464
|
-
//
|
|
487
|
+
// Determine framework for self-healing options
|
|
488
|
+
const detectedFrameworkForHealing = config.componentFramework ||
|
|
489
|
+
framework ||
|
|
490
|
+
intent.framework ||
|
|
491
|
+
'react';
|
|
492
|
+
// Get available component names for self-healing prompts
|
|
493
|
+
const availableComponentNames = components.map(c => c.name);
|
|
494
|
+
// Self-healing options (design-system agnostic)
|
|
495
|
+
const selfHealingOptions = {
|
|
496
|
+
maxAttempts: 3,
|
|
497
|
+
availableComponents: availableComponentNames,
|
|
498
|
+
framework: detectedFrameworkForHealing,
|
|
499
|
+
importPath: config.importPath,
|
|
500
|
+
};
|
|
501
|
+
// Initialize self-healing state
|
|
465
502
|
let aiText = '';
|
|
466
|
-
let
|
|
467
|
-
const
|
|
503
|
+
let finalErrors = createEmptyErrors();
|
|
504
|
+
const errorHistory = [];
|
|
505
|
+
const allAttempts = [];
|
|
468
506
|
let attempts = 0;
|
|
469
|
-
|
|
507
|
+
let selfHealingUsed = false;
|
|
508
|
+
let lastClaudeResponse = '';
|
|
509
|
+
// Self-Healing Retry Loop
|
|
510
|
+
while (attempts < selfHealingOptions.maxAttempts) {
|
|
470
511
|
attempts++;
|
|
471
512
|
stream.trackLLMCall();
|
|
472
513
|
if (attempts > 1) {
|
|
473
|
-
|
|
514
|
+
selfHealingUsed = true;
|
|
515
|
+
const allErrors = [
|
|
516
|
+
...finalErrors.syntaxErrors,
|
|
517
|
+
...finalErrors.patternErrors,
|
|
518
|
+
...finalErrors.importErrors,
|
|
519
|
+
];
|
|
520
|
+
stream.sendRetry(attempts, selfHealingOptions.maxAttempts, 'AI self-healing: fixing validation errors', allErrors);
|
|
521
|
+
logger.log(`🔄 Self-healing attempt ${attempts}/${selfHealingOptions.maxAttempts}`);
|
|
474
522
|
}
|
|
523
|
+
// Call LLM
|
|
475
524
|
const claudeResponse = await callLLM(messages, processedImages.length > 0 ? processedImages : undefined);
|
|
525
|
+
lastClaudeResponse = claudeResponse;
|
|
526
|
+
// Extract code block
|
|
476
527
|
const extractedCode = extractCodeBlock(claudeResponse);
|
|
477
528
|
if (!extractedCode) {
|
|
478
529
|
aiText = claudeResponse;
|
|
479
|
-
if (attempts <
|
|
530
|
+
if (attempts < selfHealingOptions.maxAttempts) {
|
|
480
531
|
messages.push({ role: 'assistant', content: aiText });
|
|
481
532
|
messages.push({ role: 'user', content: 'You did not provide a code block. Please provide the complete story in a single `tsx` code block.' });
|
|
482
533
|
continue;
|
|
@@ -488,46 +539,92 @@ export async function generateStoryFromPromptStream(req, res) {
|
|
|
488
539
|
else {
|
|
489
540
|
aiText = extractedCode;
|
|
490
541
|
}
|
|
491
|
-
// Step 5:
|
|
542
|
+
// Step 5: Comprehensive Validation (Pattern + AST + Import)
|
|
492
543
|
currentStep = 5;
|
|
493
544
|
stream.sendProgress(currentStep, totalSteps, 'validating', 'Validating generated code...');
|
|
494
|
-
|
|
495
|
-
|
|
545
|
+
// 1. Pattern validation
|
|
546
|
+
const patternErrors = validateStory(aiText);
|
|
547
|
+
// 2. AST validation with auto-fix attempt
|
|
548
|
+
let astResult = null;
|
|
549
|
+
let codeToValidate = aiText;
|
|
550
|
+
try {
|
|
551
|
+
astResult = validateStoryCode(aiText, 'story.tsx', config);
|
|
552
|
+
if (astResult.fixedCode) {
|
|
553
|
+
codeToValidate = astResult.fixedCode;
|
|
554
|
+
aiText = codeToValidate;
|
|
555
|
+
logger.log('🔧 Auto-fix applied for syntax issues');
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
catch (astError) {
|
|
559
|
+
logger.error('AST validation error:', astError);
|
|
560
|
+
}
|
|
561
|
+
// 3. Import validation
|
|
562
|
+
const importValidation = await preValidateImports(codeToValidate, config, discovery);
|
|
563
|
+
const importErrors = importValidation.isValid ? [] : importValidation.errors;
|
|
564
|
+
// Aggregate all errors
|
|
565
|
+
const currentErrors = aggregateValidationErrors(astResult, patternErrors, importErrors);
|
|
566
|
+
errorHistory.push(currentErrors);
|
|
567
|
+
allAttempts.push({ code: aiText, errors: currentErrors });
|
|
568
|
+
// Check if we have no errors
|
|
569
|
+
if (hasNoErrors(currentErrors)) {
|
|
570
|
+
logger.log('✅ Validation passed on attempt', attempts);
|
|
496
571
|
stream.sendValidation({
|
|
497
572
|
isValid: true,
|
|
498
573
|
errors: [],
|
|
499
574
|
warnings: [],
|
|
500
|
-
autoFixApplied:
|
|
575
|
+
autoFixApplied: !!astResult?.fixedCode
|
|
501
576
|
});
|
|
577
|
+
finalErrors = currentErrors;
|
|
502
578
|
break;
|
|
503
579
|
}
|
|
580
|
+
// Log validation failures
|
|
581
|
+
logger.log(`⚠️ Attempt ${attempts} validation errors: ${formatErrorsForLog(currentErrors)}`);
|
|
504
582
|
stream.sendValidation({
|
|
505
583
|
isValid: false,
|
|
506
|
-
errors:
|
|
584
|
+
errors: [
|
|
585
|
+
...currentErrors.syntaxErrors,
|
|
586
|
+
...currentErrors.patternErrors,
|
|
587
|
+
...currentErrors.importErrors,
|
|
588
|
+
],
|
|
507
589
|
warnings: [],
|
|
508
|
-
autoFixApplied:
|
|
590
|
+
autoFixApplied: !!astResult?.fixedCode
|
|
509
591
|
});
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
592
|
+
finalErrors = currentErrors;
|
|
593
|
+
// Check if we should continue retrying
|
|
594
|
+
const retryDecision = shouldContinueRetrying(attempts, selfHealingOptions.maxAttempts, errorHistory);
|
|
595
|
+
if (!retryDecision.shouldRetry) {
|
|
596
|
+
logger.log(`🛑 Stopping retries: ${retryDecision.reason}`);
|
|
597
|
+
break;
|
|
598
|
+
}
|
|
599
|
+
// Build self-healing prompt and add to messages
|
|
600
|
+
const healingPrompt = buildSelfHealingPrompt(aiText, currentErrors, attempts, selfHealingOptions);
|
|
601
|
+
messages.push({ role: 'assistant', content: claudeResponse });
|
|
602
|
+
messages.push({ role: 'user', content: healingPrompt });
|
|
603
|
+
}
|
|
604
|
+
// Select best attempt if we still have errors
|
|
605
|
+
if (!hasNoErrors(finalErrors) && allAttempts.length > 0) {
|
|
606
|
+
const bestAttempt = selectBestAttempt(allAttempts);
|
|
607
|
+
if (bestAttempt) {
|
|
608
|
+
aiText = bestAttempt.code;
|
|
609
|
+
finalErrors = bestAttempt.errors;
|
|
610
|
+
logger.log(`📌 Selected best attempt with ${getTotalErrorCount(finalErrors)} errors`);
|
|
517
611
|
}
|
|
518
612
|
}
|
|
519
|
-
//
|
|
613
|
+
// Log self-healing summary
|
|
614
|
+
if (selfHealingUsed) {
|
|
615
|
+
logger.log(`🔄 Self-healing summary: ${attempts} attempts, final errors: ${formatErrorsForLog(finalErrors)}`);
|
|
616
|
+
}
|
|
617
|
+
// Step 6: Code extraction and final processing
|
|
520
618
|
currentStep = 6;
|
|
521
619
|
stream.sendProgress(currentStep, totalSteps, 'code_extracted', 'Processing generated code...');
|
|
522
|
-
//
|
|
523
|
-
|
|
524
|
-
if (!preValidation.isValid) {
|
|
620
|
+
// If we still have import errors after all attempts, report them
|
|
621
|
+
if (finalErrors.importErrors.length > 0) {
|
|
525
622
|
stream.sendError({
|
|
526
623
|
code: 'INVALID_IMPORTS',
|
|
527
624
|
message: 'Generated code contains invalid imports',
|
|
528
|
-
details:
|
|
625
|
+
details: finalErrors.importErrors.join('; '),
|
|
529
626
|
recoverable: true,
|
|
530
|
-
suggestion:
|
|
627
|
+
suggestion: buildComponentSuggestion(components)
|
|
531
628
|
});
|
|
532
629
|
res.end();
|
|
533
630
|
return;
|
|
@@ -569,11 +666,22 @@ export async function generateStoryFromPromptStream(req, res) {
|
|
|
569
666
|
// Step 7: Post-processing
|
|
570
667
|
currentStep++;
|
|
571
668
|
stream.sendProgress(currentStep, totalSteps, 'post_processing', 'Applying finishing touches...');
|
|
572
|
-
//
|
|
573
|
-
|
|
669
|
+
// Detect framework from config or auto-detection
|
|
670
|
+
const detectedFramework = config.componentFramework ||
|
|
671
|
+
framework ||
|
|
672
|
+
intent.framework ||
|
|
673
|
+
'react';
|
|
674
|
+
// Only add React import for React framework
|
|
675
|
+
if (detectedFramework === 'react' && !fileContents.includes("import React from 'react';")) {
|
|
574
676
|
fileContents = "import React from 'react';\n" + fileContents;
|
|
575
677
|
}
|
|
576
678
|
let fixedFileContents = postProcessStory(fileContents, config.importPath);
|
|
679
|
+
// Apply framework-specific post-processing
|
|
680
|
+
const frameworkAdapter = getAdapter(detectedFramework);
|
|
681
|
+
if (frameworkAdapter) {
|
|
682
|
+
logger.log(`🔧 Applying ${detectedFramework} framework post-processing`);
|
|
683
|
+
fixedFileContents = frameworkAdapter.postProcess(fixedFileContents);
|
|
684
|
+
}
|
|
577
685
|
// Generate title
|
|
578
686
|
let aiTitle;
|
|
579
687
|
if (isActualUpdate && originalTitle) {
|
|
@@ -631,6 +739,10 @@ export async function generateStoryFromPromptStream(req, res) {
|
|
|
631
739
|
finalFileName = fileName || fileNameFromTitle(aiTitle, hash);
|
|
632
740
|
storyId = `story-${hash}`;
|
|
633
741
|
}
|
|
742
|
+
// Ensure file extension is correct
|
|
743
|
+
if (finalFileName && !finalFileName.endsWith('.stories.tsx')) {
|
|
744
|
+
finalFileName = finalFileName + '.stories.tsx';
|
|
745
|
+
}
|
|
634
746
|
// Step 8: Save story
|
|
635
747
|
currentStep++;
|
|
636
748
|
stream.sendProgress(currentStep, totalSteps, 'saving', 'Saving your story...');
|
|
@@ -712,7 +824,13 @@ async function buildClaudePromptWithContext(userPrompt, config, conversation, pr
|
|
|
712
824
|
const discoveredComponents = components || await discovery.discoverAll();
|
|
713
825
|
let useFrameworkAware = false;
|
|
714
826
|
let frameworkOptions;
|
|
715
|
-
|
|
827
|
+
// Priority: config.componentFramework > explicit option > auto-detect
|
|
828
|
+
if (config.componentFramework) {
|
|
829
|
+
// First priority: use config.componentFramework if set
|
|
830
|
+
useFrameworkAware = true;
|
|
831
|
+
frameworkOptions = { framework: config.componentFramework };
|
|
832
|
+
}
|
|
833
|
+
else if (options?.framework) {
|
|
716
834
|
useFrameworkAware = true;
|
|
717
835
|
frameworkOptions = { framework: options.framework };
|
|
718
836
|
}
|
|
@@ -10,12 +10,17 @@ export interface PackageExports {
|
|
|
10
10
|
packageVersion: string;
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
|
-
* Dynamically discovers what components are actually available in an installed package
|
|
13
|
+
* Dynamically discovers what components are actually available in an installed package.
|
|
14
|
+
*
|
|
15
|
+
* IMPORTANT: This class is FRAMEWORK-aware, not DESIGN-SYSTEM-aware.
|
|
16
|
+
* It uses GENERIC patterns based on the framework type (React, Vue, Angular, Svelte, Web Components)
|
|
17
|
+
* without any knowledge of specific design systems (Mantine, Vuetify, Material, Skeleton, Shoelace, etc.)
|
|
14
18
|
*/
|
|
15
19
|
export declare class DynamicPackageDiscovery {
|
|
16
20
|
private packageName;
|
|
17
21
|
private projectRoot;
|
|
18
|
-
|
|
22
|
+
private framework;
|
|
23
|
+
constructor(packageName: string, projectRoot?: string, framework?: string);
|
|
19
24
|
/**
|
|
20
25
|
* Get the real exports from the installed package
|
|
21
26
|
*/
|
|
@@ -63,8 +68,36 @@ export declare class DynamicPackageDiscovery {
|
|
|
63
68
|
/**
|
|
64
69
|
* Alternative discovery method when package imports fail due to CSS
|
|
65
70
|
* Analyzes package.json exports and TypeScript definitions
|
|
71
|
+
*
|
|
72
|
+
* IMPORTANT: This uses GENERIC framework-based discovery patterns.
|
|
73
|
+
* It has NO knowledge of specific design systems - only framework types.
|
|
66
74
|
*/
|
|
67
75
|
private discoverFromPackageStructure;
|
|
76
|
+
/**
|
|
77
|
+
* GENERIC Vue Framework Discovery: Parse ES module re-exports
|
|
78
|
+
* Works with Vue component libraries that use: export * from "./ComponentName/index.js" pattern
|
|
79
|
+
* Searches common locations: lib/components/, src/components/, components/
|
|
80
|
+
*/
|
|
81
|
+
private discoverVueFrameworkComponents;
|
|
82
|
+
/**
|
|
83
|
+
* GENERIC Web Components Discovery: Parse custom-elements.json manifest
|
|
84
|
+
* Custom Elements Manifest is a standard spec for documenting Web Components
|
|
85
|
+
* Works with any Web Components library that provides a custom-elements.json manifest
|
|
86
|
+
*/
|
|
87
|
+
private discoverWebComponentsFromManifest;
|
|
88
|
+
/**
|
|
89
|
+
* GENERIC Angular Framework Discovery: Scan module directories
|
|
90
|
+
* Works with Angular component libraries that use NgModule patterns
|
|
91
|
+
* Discovers modules based on directory structure and file patterns
|
|
92
|
+
*/
|
|
93
|
+
private discoverAngularFrameworkComponents;
|
|
94
|
+
/**
|
|
95
|
+
* GENERIC Svelte Framework Discovery: Scan for .svelte component files
|
|
96
|
+
* Works with any Svelte component library that includes .svelte files
|
|
97
|
+
* Searches common locations: dist/, src/, lib/, components/
|
|
98
|
+
* Also detects CSS-only packages that provide no Svelte components
|
|
99
|
+
*/
|
|
100
|
+
private discoverSvelteFrameworkComponents;
|
|
68
101
|
/**
|
|
69
102
|
* Scan package subdirectories for components (e.g., antd/button, chakra-ui/input)
|
|
70
103
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamicPackageDiscovery.d.ts","sourceRoot":"","sources":["../../story-generator/dynamicPackageDiscovery.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED
|
|
1
|
+
{"version":3,"file":"dynamicPackageDiscovery.d.ts","sourceRoot":"","sources":["../../story-generator/dynamicPackageDiscovery.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;GAMG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;gBAEd,WAAW,EAAE,MAAM,EAAE,WAAW,GAAE,MAAsB,EAAE,SAAS,GAAE,MAAgB;IAMjG;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IA0H7D;;OAEG;YACW,cAAc;IAiD5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2BzB;;OAEG;IACH,OAAO,CAAC,eAAe;IA4BvB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAyB/B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IASlC;;OAEG;IACH,OAAO,CAAC,aAAa;IA6BrB;;OAEG;IACG,0BAA0B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAYrD;;OAEG;IACG,sBAAsB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAC9D,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC;IAyBF;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkC5B;;;;;;OAMG;IACH,OAAO,CAAC,4BAA4B;IAyFpC;;;;OAIG;IACH,OAAO,CAAC,8BAA8B;IAwDtC;;;;OAIG;IACH,OAAO,CAAC,iCAAiC;IAyDzC;;;;OAIG;IACH,OAAO,CAAC,kCAAkC;IA0E1C;;;;;OAKG;IACH,OAAO,CAAC,iCAAiC;IAqFzC;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAiDnC;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAoCpC;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,6BAA6B;IAyBrC;;OAEG;IACH,OAAO,CAAC,iCAAiC;CA+B1C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,uBAAuB,CAEzG;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGvG"}
|