@codeyam/codeyam-cli 0.1.0-staging.1669d45 → 0.1.0-staging.2a88920
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/analyzer-template/.build-info.json +8 -8
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +5 -5
- package/analyzer-template/packages/ai/index.ts +15 -2
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +87 -51
- package/analyzer-template/packages/ai/src/lib/astScopes/arrayDerivationDetector.ts +199 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +98 -9
- package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +139 -23
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.ts +6 -126
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +555 -28
- package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +88 -7
- package/analyzer-template/packages/ai/src/lib/completionCall.ts +198 -34
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +772 -243
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.ts +205 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +10 -2
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +16 -3
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +43 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +122 -15
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +160 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.ts +40 -30
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +319 -88
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.ts +129 -0
- package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +156 -0
- package/analyzer-template/packages/ai/src/lib/e2eDataTracking.ts +334 -0
- package/analyzer-template/packages/ai/src/lib/extractCriticalDataKeys.ts +120 -0
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +642 -7
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +35 -6
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +383 -6
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +1299 -51
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +239 -0
- package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +90 -96
- package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChunkPrompt.ts +82 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateCriticalKeysPrompt.ts +103 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +23 -6
- package/analyzer-template/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.ts +391 -0
- package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +179 -45
- package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +26 -4
- package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +114 -2
- package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +65 -59
- package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +113 -26
- package/analyzer-template/packages/analyze/src/lib/analysisContext.ts +44 -4
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +30 -19
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +14 -4
- package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +6 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
- package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +33 -10
- package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
- package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +189 -76
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +29 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +77 -9
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +118 -10
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +276 -17
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.ts +56 -11
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
- package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
- package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
- package/analyzer-template/packages/aws/package.json +2 -2
- package/analyzer-template/packages/database/src/lib/kysely/db.ts +8 -1
- package/analyzer-template/packages/database/src/lib/kysely/tables/commitsTable.ts +6 -0
- package/analyzer-template/packages/database/src/lib/loadAnalyses.ts +58 -1
- package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +13 -0
- package/analyzer-template/packages/database/src/lib/loadBranch.ts +16 -1
- package/analyzer-template/packages/database/src/lib/loadCommit.ts +11 -0
- package/analyzer-template/packages/database/src/lib/loadCommits.ts +28 -0
- package/analyzer-template/packages/database/src/lib/loadEntities.ts +26 -3
- package/analyzer-template/packages/database/src/lib/loadEntityBranches.ts +12 -0
- package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +7 -14
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +8 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js +3 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts +2 -0
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js +45 -2
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +8 -0
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js +11 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js +7 -0
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts +3 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +22 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts +3 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +23 -4
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js +9 -0
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts +2 -2
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +5 -4
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/index.d.ts +1 -1
- package/analyzer-template/packages/github/dist/types/index.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/index.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts +25 -1
- package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts +2 -0
- package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +56 -6
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts +9 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js +29 -3
- package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js.map +1 -1
- package/analyzer-template/packages/github/package.json +1 -1
- package/analyzer-template/packages/types/index.ts +1 -0
- package/analyzer-template/packages/types/src/types/Analysis.ts +25 -0
- package/analyzer-template/packages/types/src/types/Commit.ts +2 -0
- package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +70 -6
- package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
- package/analyzer-template/packages/utils/dist/types/index.d.ts +1 -1
- package/analyzer-template/packages/utils/dist/types/index.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/index.js.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts +25 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts +2 -0
- package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +56 -6
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts +9 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js +29 -3
- package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js.map +1 -1
- package/analyzer-template/packages/utils/src/lib/safeFileName.ts +48 -3
- package/analyzer-template/playwright/capture.ts +20 -8
- package/analyzer-template/playwright/captureStatic.ts +1 -1
- package/analyzer-template/project/analyzeBaselineCommit.ts +5 -0
- package/analyzer-template/project/analyzeRegularCommit.ts +5 -0
- package/analyzer-template/project/captureLibraryFunctionDirect.ts +29 -26
- package/analyzer-template/project/constructMockCode.ts +367 -37
- package/analyzer-template/project/createEntitiesAndSortFiles.ts +83 -0
- package/analyzer-template/project/loadReadyToBeCaptured.ts +65 -41
- package/analyzer-template/project/orchestrateCapture/AwsCaptureTaskRunner.ts +12 -4
- package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +18 -7
- package/analyzer-template/project/orchestrateCapture/taskRunner.ts +4 -2
- package/analyzer-template/project/orchestrateCapture.ts +71 -6
- package/analyzer-template/project/reconcileMockDataKeys.ts +152 -9
- package/analyzer-template/project/runAnalysis.ts +4 -0
- package/analyzer-template/project/start.ts +35 -11
- package/analyzer-template/project/writeMockDataTsx.ts +127 -4
- package/analyzer-template/project/writeScenarioComponents.ts +101 -8
- package/analyzer-template/scripts/comboWorkerLoop.cjs +98 -50
- package/background/src/lib/virtualized/project/analyzeBaselineCommit.js +5 -0
- package/background/src/lib/virtualized/project/analyzeBaselineCommit.js.map +1 -1
- package/background/src/lib/virtualized/project/analyzeRegularCommit.js +5 -0
- package/background/src/lib/virtualized/project/analyzeRegularCommit.js.map +1 -1
- package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js +3 -3
- package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js.map +1 -1
- package/background/src/lib/virtualized/project/constructMockCode.js +300 -7
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js +73 -1
- package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js.map +1 -1
- package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js +19 -8
- package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js +2 -2
- package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js +7 -5
- package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture.js +58 -6
- package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +126 -9
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
- package/background/src/lib/virtualized/project/runAnalysis.js +3 -0
- package/background/src/lib/virtualized/project/runAnalysis.js.map +1 -1
- package/background/src/lib/virtualized/project/start.js +32 -11
- package/background/src/lib/virtualized/project/start.js.map +1 -1
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +101 -4
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +57 -8
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/codeyam-cli/src/cli.js +2 -0
- package/codeyam-cli/src/cli.js.map +1 -1
- package/codeyam-cli/src/commands/debug.js +7 -5
- package/codeyam-cli/src/commands/debug.js.map +1 -1
- package/codeyam-cli/src/commands/memory.js +273 -0
- package/codeyam-cli/src/commands/memory.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +4 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
- package/codeyam-cli/src/utils/analysisRunner.js +21 -2
- package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
- package/codeyam-cli/src/utils/install-skills.js +42 -6
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +1 -0
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/queue/manager.js +6 -0
- package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
- package/codeyam-cli/src/utils/rules/index.js +5 -0
- package/codeyam-cli/src/utils/rules/index.js.map +1 -0
- package/codeyam-cli/src/utils/rules/parser.js +106 -0
- package/codeyam-cli/src/utils/rules/parser.js.map +1 -0
- package/codeyam-cli/src/utils/rules/pathMatcher.js +18 -0
- package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -0
- package/codeyam-cli/src/utils/rules/staleness.js +132 -0
- package/codeyam-cli/src/utils/rules/staleness.js.map +1 -0
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +2 -0
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/database.js +7 -3
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/bootstrap.js +40 -0
- package/codeyam-cli/src/webserver/bootstrap.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityItem-DsN1wKrm.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-COi5OvsN.js → EntityTypeBadge-DLqD3qNt.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-BwdQv49w.js → EntityTypeIcon-Ba2JVPzP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-CEleMv_j.js → InlineSpinner-C8lyxW9k.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-D68KarMg.js → InteractivePreview-aht4aafF.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-L75Wvqgw.js → LibraryFunctionPreview-CVtiBnY5.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-C53WM8qn.js → LoadingDots-B0GLXMsr.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-CrNkmy4i.js → LogViewer-xgeCVgSM.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-OApQuNyq.js +16 -0
- package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-CQifa1n-.js → SafeScreenshot-DuDvi0jm.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-CyaBFX7l.js → ScenarioViewer-DzccYyI8.js} +3 -13
- package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-D36O1rzU.js → TruncatedFilePath-DyFZkK0l.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/_index-BwqWJOgH.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BwavGCpm.js +32 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.health-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.memory-profile-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.restart-server-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-DgTPh8H-.js → chevron-down-Cx24_aWc.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-DdQKK6on.js → chunk-EPOLDU6W-CXRTFQ3F.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-Dmr2bb1R.js → circle-check-BOARzkeR.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-Do4ZLUYa.js → createLucideIcon-BdhJEx6B.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BBnGWYga.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CbdFyxZh.js → entity._sha._-BJUiQqZF.js} +12 -12
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-B4iCfs5M.js → entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-wDWZZO1W.js → entity._sha_.create-scenario-D1T4TGjf.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-BMbl7MeQ.js → entity._sha_.edit._scenarioId-CTBG2mmz.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-5wRKRIH9.js → entry.client-CS2cb_eZ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DD3SDH7t.js → fileTableUtils-DMJ7zii9.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-CJ6lTdTA.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{git-zXjT7J0G.js → git-CPTZZ-JZ.js} +8 -8
- package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-DLbXwndH.js → index-B1h680n5.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-gPZ-lad1.js → index-lzqtyFU8.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BsPXJ81F.js → loader-circle-B7B9V-bu.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-a78b90a2.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/memory--GCbFsBE.js +92 -0
- package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +62 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-P2FKIUql.js → search-CxXUmBSd.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{settings-B2eDuBj8.js → settings-CS5f3WzT.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-L18M6-kN.js → simulations-DwFIBT09.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-BDz7kbVA.js → triangle-alert-B6LgvRJg.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-29dDmbH8.js → useCustomSizes-C1v1PQzo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-BUm0UVJm.js → useLastLogLine-aSv48UbS.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-CkIOKTrZ.js → useReportContext-DYxHZQuP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-KKw5kTn-.js → useToast-mBRpZPiu.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-BM6TDT1Y.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-dYC34MHw.js +257 -0
- package/codeyam-cli/src/webserver/build/server/index.js +1 -1
- package/codeyam-cli/src/webserver/build-info.json +5 -5
- package/codeyam-cli/templates/codeyam-memory-hook.sh +200 -0
- package/codeyam-cli/templates/codeyam:debug.md +47 -3
- package/codeyam-cli/templates/codeyam:diagnose.md +203 -25
- package/codeyam-cli/templates/codeyam:memory.md +341 -0
- package/codeyam-cli/templates/codeyam:new-rule.md +13 -0
- package/codeyam-cli/templates/rule-reflection-hook.py +160 -0
- package/codeyam-cli/templates/rules-instructions.md +93 -0
- package/package.json +8 -5
- package/packages/ai/index.js +7 -3
- package/packages/ai/index.js.map +1 -1
- package/packages/ai/src/lib/analyzeScope.js +70 -29
- package/packages/ai/src/lib/analyzeScope.js.map +1 -1
- package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js +150 -0
- package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js.map +1 -0
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +78 -8
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
- package/packages/ai/src/lib/astScopes/methodSemantics.js +109 -23
- package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
- package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js +1 -102
- package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js.map +1 -1
- package/packages/ai/src/lib/astScopes/processExpression.js +440 -27
- package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
- package/packages/ai/src/lib/completionCall.js +161 -30
- package/packages/ai/src/lib/completionCall.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +589 -166
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js +179 -0
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +7 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
- package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +41 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +104 -11
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +159 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
- package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +265 -79
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js +107 -0
- package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js.map +1 -0
- package/packages/ai/src/lib/dataStructureChunking.js +111 -0
- package/packages/ai/src/lib/dataStructureChunking.js.map +1 -0
- package/packages/ai/src/lib/e2eDataTracking.js +241 -0
- package/packages/ai/src/lib/e2eDataTracking.js.map +1 -0
- package/packages/ai/src/lib/extractCriticalDataKeys.js +96 -0
- package/packages/ai/src/lib/extractCriticalDataKeys.js.map +1 -0
- package/packages/ai/src/lib/generateEntityScenarioData.js +525 -8
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarios.js +26 -2
- package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlows.js +281 -4
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +946 -42
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js +194 -0
- package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js.map +1 -0
- package/packages/ai/src/lib/mergeStatements.js +70 -51
- package/packages/ai/src/lib/mergeStatements.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js +54 -0
- package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js.map +1 -0
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +15 -7
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js +335 -0
- package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js.map +1 -0
- package/packages/ai/src/lib/resolvePathToControllable.js +155 -41
- package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
- package/packages/ai/src/lib/worker/SerializableDataStructure.js +7 -0
- package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
- package/packages/ai/src/lib/worker/analyzeScopeWorker.js +94 -1
- package/packages/ai/src/lib/worker/analyzeScopeWorker.js.map +1 -1
- package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
- package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/ProjectAnalyzer.js +96 -26
- package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/analysisContext.js +30 -5
- package/packages/analyze/src/lib/analysisContext.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +21 -9
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +14 -4
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +5 -0
- package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +31 -10
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
- package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
- package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
- package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +160 -68
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +25 -8
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +71 -9
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +57 -9
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +233 -9
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js +46 -9
- package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
- package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
- package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
- package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
- package/packages/database/src/lib/kysely/db.js +8 -1
- package/packages/database/src/lib/kysely/db.js.map +1 -1
- package/packages/database/src/lib/kysely/tables/commitsTable.js +3 -0
- package/packages/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
- package/packages/database/src/lib/loadAnalyses.js +45 -2
- package/packages/database/src/lib/loadAnalyses.js.map +1 -1
- package/packages/database/src/lib/loadAnalysis.js +8 -0
- package/packages/database/src/lib/loadAnalysis.js.map +1 -1
- package/packages/database/src/lib/loadBranch.js +11 -1
- package/packages/database/src/lib/loadBranch.js.map +1 -1
- package/packages/database/src/lib/loadCommit.js +7 -0
- package/packages/database/src/lib/loadCommit.js.map +1 -1
- package/packages/database/src/lib/loadCommits.js +22 -1
- package/packages/database/src/lib/loadCommits.js.map +1 -1
- package/packages/database/src/lib/loadEntities.js +23 -4
- package/packages/database/src/lib/loadEntities.js.map +1 -1
- package/packages/database/src/lib/loadEntityBranches.js +9 -0
- package/packages/database/src/lib/loadEntityBranches.js.map +1 -1
- package/packages/database/src/lib/updateCommitMetadata.js +5 -4
- package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/packages/types/index.js.map +1 -1
- package/packages/utils/src/lib/safeFileName.js +29 -3
- package/packages/utils/src/lib/safeFileName.js.map +1 -1
- package/scripts/finalize-analyzer.cjs +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/EntityItem-vauWK972.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-DzJRkCkr.js +0 -11
- package/codeyam-cli/src/webserver/build/client/assets/_index-Be83mo_j.js +0 -11
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BN6wu6Y-.js +0 -37
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-Bn6aCAy_.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-DKyMFI90.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-DTTQ3gY7.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-22590fcf.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-BsAarjAM.js +0 -57
- package/codeyam-cli/src/webserver/build/server/assets/index-BND5I5fv.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-CFXnd7MG.js +0 -228
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import completionCall from './completionCall';
|
|
2
2
|
import { saveLlmCall } from '~codeyam/aws/dynamodb';
|
|
3
3
|
import generateEntityScenariosGenerator from './promptGenerators/generateEntityScenariosGenerator';
|
|
4
|
+
import { getFlowsForScenarioGeneration } from './generateExecutionFlows';
|
|
4
5
|
|
|
5
6
|
import {
|
|
6
7
|
Analysis,
|
|
@@ -13,6 +14,13 @@ import { awsLog } from '~codeyam/utils';
|
|
|
13
14
|
import { sanitizePlaywrightInstructions } from './validatePlaywrightInstructions';
|
|
14
15
|
import { AI, DEFAULT_LARGER_MODEL, parseJsonSafe } from '~codeyam/ai';
|
|
15
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Maximum number of execution flows to send to the LLM for scenario generation.
|
|
19
|
+
* When there are more flows than this threshold, we filter to the top N
|
|
20
|
+
* highest priority flows to avoid overwhelming the LLM and wasting tokens.
|
|
21
|
+
*/
|
|
22
|
+
const MAX_FLOWS_FOR_SCENARIO_GENERATION = 30;
|
|
23
|
+
|
|
16
24
|
export interface ScenarioResult {
|
|
17
25
|
name: string;
|
|
18
26
|
testName: string;
|
|
@@ -75,9 +83,26 @@ export default async function generateEntityScenarios({
|
|
|
75
83
|
};
|
|
76
84
|
}
|
|
77
85
|
|
|
86
|
+
// Filter execution flows to top N highest priority when there are many flows
|
|
87
|
+
// This prevents overwhelming the LLM and wasting tokens on low-priority flows
|
|
88
|
+
let filteredFlows = executionFlows;
|
|
89
|
+
if (
|
|
90
|
+
executionFlows &&
|
|
91
|
+
executionFlows.length > MAX_FLOWS_FOR_SCENARIO_GENERATION
|
|
92
|
+
) {
|
|
93
|
+
filteredFlows = getFlowsForScenarioGeneration(executionFlows, {
|
|
94
|
+
maxFlows: MAX_FLOWS_FOR_SCENARIO_GENERATION,
|
|
95
|
+
ensureGroupDiversity: true,
|
|
96
|
+
}) as ExecutionFlow[];
|
|
97
|
+
|
|
98
|
+
console.log(
|
|
99
|
+
`CodeYam: Filtered ${executionFlows.length} flows to ${filteredFlows.length} for scenario generation`,
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
78
103
|
const prompt = generateEntityScenariosGenerator({
|
|
79
104
|
entity,
|
|
80
|
-
executionFlows,
|
|
105
|
+
executionFlows: filteredFlows,
|
|
81
106
|
error,
|
|
82
107
|
});
|
|
83
108
|
|
|
@@ -151,11 +176,15 @@ export default async function generateEntityScenarios({
|
|
|
151
176
|
return { scenarios: [], llmCall };
|
|
152
177
|
}
|
|
153
178
|
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
179
|
+
const dataScenarios = result[`${error ? 'errorD' : 'd'}ataScenarios`];
|
|
180
|
+
|
|
181
|
+
// Gracefully handle missing dataScenarios (e.g., when LLM returns unexpected format
|
|
182
|
+
// or when test fixtures don't include the expected key)
|
|
183
|
+
if (!Array.isArray(dataScenarios)) {
|
|
184
|
+
return { scenarios: [], llmCall };
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const scenarios = (dataScenarios as unknown as ScenarioResult[]).map(
|
|
159
188
|
(scenarioInfo) =>
|
|
160
189
|
({
|
|
161
190
|
projectId: entity.projectId,
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* instead of LLM calls. Flows are derived from:
|
|
6
6
|
* 1. conditionalUsages - variables used in if/ternary/&&/switch
|
|
7
7
|
* 2. conditionalEffects - setter calls inside conditionals
|
|
8
|
+
* 3. jsxRenderingUsages - arrays rendered via .map() and strings interpolated in JSX
|
|
8
9
|
*
|
|
9
10
|
* Only paths that resolve to controllable data sources produce flows,
|
|
10
11
|
* eliminating the problem of invalid paths like useState variables.
|
|
@@ -20,13 +21,16 @@ import { awsLog } from '~codeyam/utils';
|
|
|
20
21
|
import { gatherAttributesMap } from './promptGenerators/gatherAttributesMap';
|
|
21
22
|
import { fillInDirectSchemaGapsAndUnknowns } from './dataStructure/helpers/fillInSchemaGapsAndUnknowns';
|
|
22
23
|
import { clearAttributesFromMapping } from './dataStructure/helpers/cleanNonObjectFunctions';
|
|
23
|
-
import type { CompoundConditional
|
|
24
|
+
import type { CompoundConditional } from '~codeyam/types';
|
|
24
25
|
import { LlmCall } from '~codeyam/types';
|
|
25
26
|
import generateExecutionFlowsFromConditionalEffects from './generateExecutionFlowsFromConditionalEffects';
|
|
26
27
|
import generateExecutionFlowsFromConditionals, {
|
|
27
28
|
ChildComponentConditionalData,
|
|
28
29
|
} from './generateExecutionFlowsFromConditionals';
|
|
30
|
+
import generateExecutionFlowsFromJsxUsages from './generateExecutionFlowsFromJsxUsages';
|
|
31
|
+
import resolvePathToControllable from './resolvePathToControllable';
|
|
29
32
|
import { AI } from '~codeyam/ai';
|
|
33
|
+
import type { JsxRenderingUsage, ConditionalUsage } from './astScopes/types';
|
|
30
34
|
|
|
31
35
|
interface GenerateExecutionFlowsArgs {
|
|
32
36
|
entity: Pick<Entity, 'sha' | 'name' | 'filePath' | 'code' | 'metadata'>;
|
|
@@ -55,6 +59,7 @@ export default function generateExecutionFlows({
|
|
|
55
59
|
});
|
|
56
60
|
|
|
57
61
|
const isolatedDataStructure = entity.metadata?.isolatedDataStructure;
|
|
62
|
+
|
|
58
63
|
const equivalentSignatureVariables =
|
|
59
64
|
isolatedDataStructure?.equivalentSignatureVariables ?? {};
|
|
60
65
|
const { attributesMap, associationMap } = gatherAttributesMap(
|
|
@@ -92,10 +97,11 @@ export default function generateExecutionFlows({
|
|
|
92
97
|
});
|
|
93
98
|
|
|
94
99
|
// Build fullToShortPathMap from associationMap
|
|
95
|
-
//
|
|
96
|
-
//
|
|
100
|
+
// When reverse=true (which is what we pass), associationMap maps short→full
|
|
101
|
+
// (e.g., "state" → "useFetcher<...>().functionCallReturnValue.state")
|
|
102
|
+
// We need full→short for path resolution lookups
|
|
97
103
|
const fullToShortPathMap: Record<string, string> = {};
|
|
98
|
-
for (const [
|
|
104
|
+
for (const [shortPath, fullPath] of Object.entries(associationMap)) {
|
|
99
105
|
fullToShortPathMap[fullPath] = shortPath;
|
|
100
106
|
}
|
|
101
107
|
|
|
@@ -106,6 +112,11 @@ export default function generateExecutionFlows({
|
|
|
106
112
|
entity.metadata?.isolatedDataStructure?.compoundConditionals ?? [];
|
|
107
113
|
const conditionalEffects: ConditionalEffect[] =
|
|
108
114
|
entity.metadata?.isolatedDataStructure?.conditionalEffects ?? [];
|
|
115
|
+
// Get derivedVariables for multi-level derivation tracing
|
|
116
|
+
// This allows tracing through intermediate derived variables that aren't directly
|
|
117
|
+
// used in conditionals (e.g., isInCurrentRun that feeds into isAnalyzing)
|
|
118
|
+
const derivedVariables =
|
|
119
|
+
entity.metadata?.isolatedDataStructure?.derivedVariables;
|
|
109
120
|
|
|
110
121
|
// Build child component data for merging child flows into parent
|
|
111
122
|
// This requires:
|
|
@@ -132,6 +143,7 @@ export default function generateExecutionFlows({
|
|
|
132
143
|
childIsolated.equivalentSignatureVariables ?? {},
|
|
133
144
|
compoundConditionals: childIsolated.compoundConditionals ?? [],
|
|
134
145
|
gatingConditions,
|
|
146
|
+
jsxRenderingUsages: childIsolated.jsxRenderingUsages ?? [],
|
|
135
147
|
};
|
|
136
148
|
}
|
|
137
149
|
}
|
|
@@ -147,6 +159,8 @@ export default function generateExecutionFlows({
|
|
|
147
159
|
Object.keys(childComponentData).length > 0
|
|
148
160
|
? childComponentData
|
|
149
161
|
: undefined,
|
|
162
|
+
derivedVariables,
|
|
163
|
+
sourceEquivalencies: mergedDataStructure.sourceEquivalencies,
|
|
150
164
|
});
|
|
151
165
|
|
|
152
166
|
console.log(
|
|
@@ -169,8 +183,22 @@ export default function generateExecutionFlows({
|
|
|
169
183
|
`CodeYam: Generated ${effectsBasedFlows.length} flows from conditional effects`,
|
|
170
184
|
);
|
|
171
185
|
|
|
186
|
+
// Generate flows from JSX rendering usages (array.map, text interpolation)
|
|
187
|
+
const jsxRenderingUsages: JsxRenderingUsage[] =
|
|
188
|
+
entity.metadata?.isolatedDataStructure?.jsxRenderingUsages ?? [];
|
|
189
|
+
|
|
190
|
+
const jsxBasedFlows = generateExecutionFlowsFromJsxUsages({
|
|
191
|
+
jsxRenderingUsages,
|
|
192
|
+
attributesMap: resolvedAttributesMap,
|
|
193
|
+
equivalentSignatureVariables,
|
|
194
|
+
fullToShortPathMap,
|
|
195
|
+
structure: isolatedDataStructure?.structure ?? {},
|
|
196
|
+
});
|
|
197
|
+
|
|
172
198
|
// Merge all flows, deduplicating by ID
|
|
173
199
|
// Effects-based flows take precedence as they have precise data source paths
|
|
200
|
+
// Conditionals-based flows second
|
|
201
|
+
// JSX-based flows last (lower priority as they're variation flows)
|
|
174
202
|
const allFlows: ExecutionFlow[] = [];
|
|
175
203
|
const seenIds = new Set<string>();
|
|
176
204
|
|
|
@@ -190,12 +218,361 @@ export default function generateExecutionFlows({
|
|
|
190
218
|
}
|
|
191
219
|
}
|
|
192
220
|
|
|
193
|
-
|
|
194
|
-
|
|
221
|
+
// Add JSX-based flows (lowest priority - variation flows)
|
|
222
|
+
for (const flow of jsxBasedFlows) {
|
|
223
|
+
if (!seenIds.has(flow.id)) {
|
|
224
|
+
seenIds.add(flow.id);
|
|
225
|
+
allFlows.push(flow);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Build a map of gating paths → child components they gate
|
|
230
|
+
// This allows us to identify which flows control child component rendering
|
|
231
|
+
const gatingPathToChildren = buildGatingPathToChildrenMap(
|
|
232
|
+
childBoundaryGatingConditions,
|
|
233
|
+
equivalentSignatureVariables,
|
|
234
|
+
resolvedAttributesMap,
|
|
235
|
+
fullToShortPathMap,
|
|
195
236
|
);
|
|
196
237
|
|
|
238
|
+
// Calculate priority and childComponentsControlled for each flow
|
|
239
|
+
for (const flow of allFlows) {
|
|
240
|
+
calculateFlowPriority(flow, gatingPathToChildren);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Sort flows by priority (highest first)
|
|
244
|
+
allFlows.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
245
|
+
|
|
197
246
|
return {
|
|
198
247
|
executionFlows: allFlows,
|
|
199
248
|
llmCall: null as LlmCall | null, // No LLM calls in static analysis mode
|
|
200
249
|
};
|
|
201
250
|
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Build a map of gating paths to the child components they gate.
|
|
254
|
+
* This is used to identify which flows control child component rendering.
|
|
255
|
+
*/
|
|
256
|
+
function buildGatingPathToChildrenMap(
|
|
257
|
+
childBoundaryGatingConditions: Record<string, ConditionalUsage[]>,
|
|
258
|
+
equivalentSignatureVariables: Record<string, string | string[]>,
|
|
259
|
+
attributesMap: Record<string, string>,
|
|
260
|
+
fullToShortPathMap: Record<string, string>,
|
|
261
|
+
): Map<string, string[]> {
|
|
262
|
+
const gatingPathToChildren = new Map<string, string[]>();
|
|
263
|
+
|
|
264
|
+
for (const [childName, gatingConditions] of Object.entries(
|
|
265
|
+
childBoundaryGatingConditions,
|
|
266
|
+
)) {
|
|
267
|
+
for (const condition of gatingConditions) {
|
|
268
|
+
// Get the path that gates this child
|
|
269
|
+
let gatingPath = condition.path;
|
|
270
|
+
|
|
271
|
+
// If there's a derivedFrom sourcePath, use that
|
|
272
|
+
if (condition.derivedFrom?.sourcePath) {
|
|
273
|
+
gatingPath = condition.derivedFrom.sourcePath;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Try to resolve to a controllable path
|
|
277
|
+
const resolution = resolvePathToControllable(
|
|
278
|
+
gatingPath,
|
|
279
|
+
attributesMap,
|
|
280
|
+
equivalentSignatureVariables,
|
|
281
|
+
fullToShortPathMap,
|
|
282
|
+
);
|
|
283
|
+
|
|
284
|
+
// Get the equivalent, handling array case (use first element if array)
|
|
285
|
+
const equiv = equivalentSignatureVariables[gatingPath];
|
|
286
|
+
const equivPath = Array.isArray(equiv) ? equiv[0] : equiv;
|
|
287
|
+
const finalPath =
|
|
288
|
+
resolution.isControllable && resolution.resolvedPath
|
|
289
|
+
? resolution.resolvedPath
|
|
290
|
+
: (equivPath ?? gatingPath);
|
|
291
|
+
|
|
292
|
+
// Add this child to the list of children gated by this path
|
|
293
|
+
const existing = gatingPathToChildren.get(finalPath) ?? [];
|
|
294
|
+
if (!existing.includes(childName)) {
|
|
295
|
+
existing.push(childName);
|
|
296
|
+
gatingPathToChildren.set(finalPath, existing);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// Also handle comparison conditions like "activeTab === 'scenarios'"
|
|
300
|
+
const comparisonMatch = gatingPath.match(
|
|
301
|
+
/^([a-zA-Z_][a-zA-Z0-9_]*)\s*(===?|!==?)\s*['"]?([^'"]+)['"]?$/,
|
|
302
|
+
);
|
|
303
|
+
if (comparisonMatch) {
|
|
304
|
+
const [, varName] = comparisonMatch;
|
|
305
|
+
const varResolution = resolvePathToControllable(
|
|
306
|
+
varName,
|
|
307
|
+
attributesMap,
|
|
308
|
+
equivalentSignatureVariables,
|
|
309
|
+
fullToShortPathMap,
|
|
310
|
+
);
|
|
311
|
+
// Get the equivalent, handling array case (use first element if array)
|
|
312
|
+
const varEquiv = equivalentSignatureVariables[varName];
|
|
313
|
+
const varEquivPath = Array.isArray(varEquiv) ? varEquiv[0] : varEquiv;
|
|
314
|
+
const resolvedVarPath =
|
|
315
|
+
varResolution.isControllable && varResolution.resolvedPath
|
|
316
|
+
? varResolution.resolvedPath
|
|
317
|
+
: (varEquivPath ?? varName);
|
|
318
|
+
|
|
319
|
+
const varExisting = gatingPathToChildren.get(resolvedVarPath) ?? [];
|
|
320
|
+
if (!varExisting.includes(childName)) {
|
|
321
|
+
varExisting.push(childName);
|
|
322
|
+
gatingPathToChildren.set(resolvedVarPath, varExisting);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
return gatingPathToChildren;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Calculate priority and childComponentsControlled for a flow.
|
|
333
|
+
*
|
|
334
|
+
* Priority factors (in order of importance):
|
|
335
|
+
* 1. Controls rendering of child components (more components = higher priority)
|
|
336
|
+
* 2. Controls JSX rendering (impact = 'high')
|
|
337
|
+
* 3. Number of conditions required
|
|
338
|
+
*/
|
|
339
|
+
function calculateFlowPriority(
|
|
340
|
+
flow: ExecutionFlow,
|
|
341
|
+
gatingPathToChildren: Map<string, string[]>,
|
|
342
|
+
): void {
|
|
343
|
+
// Find which child components this flow controls
|
|
344
|
+
const childComponentsControlled = new Set<string>();
|
|
345
|
+
|
|
346
|
+
for (const rv of flow.requiredValues) {
|
|
347
|
+
// Check if this required value's path gates any child components
|
|
348
|
+
const children = gatingPathToChildren.get(rv.attributePath);
|
|
349
|
+
if (children) {
|
|
350
|
+
// Only count truthy values as "enabling" the child component
|
|
351
|
+
// Falsy values would hide the child, not enable it
|
|
352
|
+
if (rv.comparison === 'truthy' || rv.comparison === 'equals') {
|
|
353
|
+
for (const child of children) {
|
|
354
|
+
childComponentsControlled.add(child);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Also check without function call markers for broader matching
|
|
360
|
+
const simplifiedPath = rv.attributePath
|
|
361
|
+
.replace(/\(\)/g, '')
|
|
362
|
+
.replace(/\.functionCallReturnValue/g, '');
|
|
363
|
+
const childrenSimplified = gatingPathToChildren.get(simplifiedPath);
|
|
364
|
+
if (childrenSimplified) {
|
|
365
|
+
if (rv.comparison === 'truthy' || rv.comparison === 'equals') {
|
|
366
|
+
for (const child of childrenSimplified) {
|
|
367
|
+
childComponentsControlled.add(child);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// Set childComponentsControlled if any were found
|
|
374
|
+
if (childComponentsControlled.size > 0) {
|
|
375
|
+
flow.childComponentsControlled = Array.from(childComponentsControlled);
|
|
376
|
+
|
|
377
|
+
// Upgrade impact to 'high' if this flow controls child components
|
|
378
|
+
// A flow that controls which child components render DOES impact JSX rendering,
|
|
379
|
+
// even if the condition itself isn't directly in the JSX tree.
|
|
380
|
+
// This ensures flows like viewMode === 'screenshot' (which controls SafeScreenshot
|
|
381
|
+
// rendering via ScenarioViewer) get proper prioritization.
|
|
382
|
+
if (flow.impact !== 'high') {
|
|
383
|
+
flow.impact = 'high';
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// Calculate priority score
|
|
388
|
+
let priority = 0;
|
|
389
|
+
|
|
390
|
+
// Base priority by impact level
|
|
391
|
+
if (flow.impact === 'high') {
|
|
392
|
+
priority += 100;
|
|
393
|
+
} else if (flow.impact === 'medium') {
|
|
394
|
+
priority += 50;
|
|
395
|
+
} else {
|
|
396
|
+
priority += 25;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// Add priority for each child component controlled
|
|
400
|
+
// Each child component adds significant priority
|
|
401
|
+
priority += (flow.childComponentsControlled?.length ?? 0) * 75;
|
|
402
|
+
|
|
403
|
+
// Add small bonus for number of required values (more specific = slightly higher priority)
|
|
404
|
+
priority += Math.min(flow.requiredValues.length * 5, 25);
|
|
405
|
+
|
|
406
|
+
flow.priority = priority;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Get execution flows suitable for LLM scenario generation.
|
|
411
|
+
*
|
|
412
|
+
* Filters and sorts flows based on priority, ensuring diversity
|
|
413
|
+
* across exclusive groups and respecting min/max thresholds.
|
|
414
|
+
*/
|
|
415
|
+
export function getFlowsForScenarioGeneration(
|
|
416
|
+
flows: ExecutionFlow[],
|
|
417
|
+
options: {
|
|
418
|
+
/** Maximum number of flows to return (default: 20) */
|
|
419
|
+
maxFlows?: number;
|
|
420
|
+
/** Minimum priority threshold (default: 0) */
|
|
421
|
+
minPriority?: number;
|
|
422
|
+
/** Ensure at least one flow per exclusive group (default: false) */
|
|
423
|
+
ensureGroupDiversity?: boolean;
|
|
424
|
+
/** Return both included and excluded flows (default: false) */
|
|
425
|
+
includeExcludedFlows?: boolean;
|
|
426
|
+
} = {},
|
|
427
|
+
):
|
|
428
|
+
| ExecutionFlow[]
|
|
429
|
+
| { includedFlows: ExecutionFlow[]; excludedFlows: ExecutionFlow[] } {
|
|
430
|
+
const {
|
|
431
|
+
maxFlows = 20,
|
|
432
|
+
minPriority = 0,
|
|
433
|
+
ensureGroupDiversity = false,
|
|
434
|
+
includeExcludedFlows = false,
|
|
435
|
+
} = options;
|
|
436
|
+
|
|
437
|
+
// Filter by minimum priority
|
|
438
|
+
let eligibleFlows = flows.filter((f) => (f.priority ?? 0) >= minPriority);
|
|
439
|
+
|
|
440
|
+
// Flows should already be sorted by priority, but ensure it
|
|
441
|
+
eligibleFlows = [...eligibleFlows].sort(
|
|
442
|
+
(a, b) => (b.priority ?? 0) - (a.priority ?? 0),
|
|
443
|
+
);
|
|
444
|
+
|
|
445
|
+
let includedFlows: ExecutionFlow[];
|
|
446
|
+
|
|
447
|
+
if (ensureGroupDiversity) {
|
|
448
|
+
// Ensure diversity across exclusive groups
|
|
449
|
+
includedFlows = selectFlowsWithGroupDiversity(eligibleFlows, maxFlows);
|
|
450
|
+
} else {
|
|
451
|
+
// Simple top-N selection
|
|
452
|
+
includedFlows = eligibleFlows.slice(0, maxFlows);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
if (includeExcludedFlows) {
|
|
456
|
+
const includedIds = new Set(includedFlows.map((f) => f.id));
|
|
457
|
+
const excludedFlows = flows.filter((f) => !includedIds.has(f.id));
|
|
458
|
+
return { includedFlows, excludedFlows };
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
return includedFlows;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
* Build a map of attribute-value pairs to help identify related flows.
|
|
466
|
+
* Flows with the same attributePath but different values are considered "value siblings".
|
|
467
|
+
* For example, viewMode='interactive' and viewMode='screenshot' are value siblings.
|
|
468
|
+
*/
|
|
469
|
+
function buildValueGroupMap(flows: ExecutionFlow[]): Map<string, string[]> {
|
|
470
|
+
// Map from attributePath to array of (flowId, value) pairs
|
|
471
|
+
const pathToValues = new Map<
|
|
472
|
+
string,
|
|
473
|
+
Array<{ flowId: string; value: string }>
|
|
474
|
+
>();
|
|
475
|
+
|
|
476
|
+
for (const flow of flows) {
|
|
477
|
+
for (const rv of flow.requiredValues) {
|
|
478
|
+
// Only consider equals comparisons with specific values (not truthy/falsy)
|
|
479
|
+
if (
|
|
480
|
+
rv.comparison === 'equals' &&
|
|
481
|
+
rv.value &&
|
|
482
|
+
rv.value !== 'truthy' &&
|
|
483
|
+
rv.value !== 'falsy'
|
|
484
|
+
) {
|
|
485
|
+
// Normalize the attributePath for comparison
|
|
486
|
+
const normalizedPath = rv.attributePath
|
|
487
|
+
.toLowerCase()
|
|
488
|
+
.replace(/[^a-z0-9]/g, '');
|
|
489
|
+
|
|
490
|
+
if (!pathToValues.has(normalizedPath)) {
|
|
491
|
+
pathToValues.set(normalizedPath, []);
|
|
492
|
+
}
|
|
493
|
+
pathToValues
|
|
494
|
+
.get(normalizedPath)!
|
|
495
|
+
.push({ flowId: flow.id, value: rv.value });
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
// Now create the value group map: flowId -> list of sibling flowIds
|
|
501
|
+
const valueGroupMap = new Map<string, string[]>();
|
|
502
|
+
|
|
503
|
+
for (const [, flowValues] of pathToValues) {
|
|
504
|
+
// Only create groups if there are multiple different values for the same path
|
|
505
|
+
const uniqueValues = new Set(flowValues.map((fv) => fv.value));
|
|
506
|
+
if (uniqueValues.size > 1) {
|
|
507
|
+
// This attribute has multiple values, so all flows are siblings
|
|
508
|
+
const siblingIds = flowValues.map((fv) => fv.flowId);
|
|
509
|
+
for (const fv of flowValues) {
|
|
510
|
+
valueGroupMap.set(
|
|
511
|
+
fv.flowId,
|
|
512
|
+
siblingIds.filter((id) => id !== fv.flowId),
|
|
513
|
+
);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
return valueGroupMap;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
/**
|
|
522
|
+
* Select flows ensuring diversity across exclusive groups AND attribute values.
|
|
523
|
+
* Guarantees:
|
|
524
|
+
* 1. At least one flow per exclusive group
|
|
525
|
+
* 2. When a flow with a specific attribute value is selected, include sibling values too
|
|
526
|
+
*/
|
|
527
|
+
function selectFlowsWithGroupDiversity(
|
|
528
|
+
flows: ExecutionFlow[],
|
|
529
|
+
maxFlows: number,
|
|
530
|
+
): ExecutionFlow[] {
|
|
531
|
+
const selected: ExecutionFlow[] = [];
|
|
532
|
+
const selectedIds = new Set<string>();
|
|
533
|
+
const groupsRepresented = new Set<string>();
|
|
534
|
+
|
|
535
|
+
// Build value group map to identify sibling flows
|
|
536
|
+
const valueGroupMap = buildValueGroupMap(flows);
|
|
537
|
+
|
|
538
|
+
// First pass: ensure at least one flow per exclusive group
|
|
539
|
+
for (const flow of flows) {
|
|
540
|
+
if (selectedIds.has(flow.id)) continue;
|
|
541
|
+
if (selected.length >= maxFlows) break;
|
|
542
|
+
|
|
543
|
+
if (flow.exclusiveGroup && !groupsRepresented.has(flow.exclusiveGroup)) {
|
|
544
|
+
selected.push(flow);
|
|
545
|
+
selectedIds.add(flow.id);
|
|
546
|
+
groupsRepresented.add(flow.exclusiveGroup);
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// Second pass: fill remaining slots with highest priority flows
|
|
551
|
+
// But also include sibling value flows when we select a flow with a specific value
|
|
552
|
+
for (const flow of flows) {
|
|
553
|
+
if (selectedIds.has(flow.id)) continue;
|
|
554
|
+
if (selected.length >= maxFlows) break;
|
|
555
|
+
|
|
556
|
+
selected.push(flow);
|
|
557
|
+
selectedIds.add(flow.id);
|
|
558
|
+
|
|
559
|
+
// Check if this flow has sibling value flows that should also be included
|
|
560
|
+
const siblingIds = valueGroupMap.get(flow.id);
|
|
561
|
+
if (siblingIds && siblingIds.length > 0) {
|
|
562
|
+
// Try to include sibling flows (different values of the same attribute)
|
|
563
|
+
for (const siblingId of siblingIds) {
|
|
564
|
+
if (selectedIds.has(siblingId)) continue;
|
|
565
|
+
if (selected.length >= maxFlows) break;
|
|
566
|
+
|
|
567
|
+
const siblingFlow = flows.find((f) => f.id === siblingId);
|
|
568
|
+
if (siblingFlow) {
|
|
569
|
+
selected.push(siblingFlow);
|
|
570
|
+
selectedIds.add(siblingId);
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
// Re-sort by priority to maintain consistent ordering
|
|
577
|
+
return selected.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
578
|
+
}
|
package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts
CHANGED
|
@@ -18,7 +18,7 @@ export interface GenerateExecutionFlowsOptions {
|
|
|
18
18
|
/** Map of controllable paths to their types (for path resolution) */
|
|
19
19
|
attributesMap?: Record<string, string>;
|
|
20
20
|
/** Map from local variable names to data sources */
|
|
21
|
-
equivalentSignatureVariables?: Record<string, string>;
|
|
21
|
+
equivalentSignatureVariables?: Record<string, string | string[]>;
|
|
22
22
|
/** Map from full paths to short paths */
|
|
23
23
|
fullToShortPathMap?: Record<string, string>;
|
|
24
24
|
/**
|