@codeyam/codeyam-cli 0.1.0-staging.323686 → 0.1.0-staging.4684848
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 +7 -7
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +6 -6
- package/analyzer-template/packages/ai/index.ts +7 -1
- package/analyzer-template/packages/ai/package.json +2 -2
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +62 -18
- package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +67 -9
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.ts +10 -17
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +409 -50
- package/analyzer-template/packages/ai/src/lib/astScopes/sharedPatterns.ts +28 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +21 -6
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +992 -249
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +5 -1
- 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 +31 -3
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +37 -15
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.ts +70 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +140 -14
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +179 -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 +367 -96
- package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +33 -15
- package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +58 -3
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +315 -6
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +9 -5
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +49 -5
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +649 -142
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +1 -1
- package/analyzer-template/packages/ai/src/lib/isolateScopes.ts +51 -3
- package/analyzer-template/packages/ai/src/lib/mergeJsonTypeDefinitions.ts +5 -0
- package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +90 -96
- package/analyzer-template/packages/ai/src/lib/promptGenerators/collapseNullableObjects.ts +118 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +24 -4
- package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +25 -13
- package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +4 -3
- package/analyzer-template/packages/analyze/index.ts +2 -0
- 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/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 +89 -9
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +19 -4
- package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
- package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +0 -3
- 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/TransformationTracer.ts +1315 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +61 -13
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +87 -25
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +229 -19
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +117 -9
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +571 -74
- 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/index.ts +1 -0
- package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
- package/analyzer-template/packages/aws/package.json +1 -1
- package/analyzer-template/packages/database/package.json +1 -1
- package/analyzer-template/packages/database/src/lib/analysisBranchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/analysisToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/branchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/commitBranchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/commitToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/fileToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/kysely/db.ts +6 -0
- package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +1 -1
- package/analyzer-template/packages/database/src/lib/kysely/tables/labsRequestsTable.ts +52 -0
- package/analyzer-template/packages/database/src/lib/projectToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/saveFiles.ts +1 -1
- package/analyzer-template/packages/database/src/lib/scenarioToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/userScenarioToDb.ts +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -0
- 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 +3 -0
- 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/debugReportsTable.d.ts +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts +23 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts.map +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +7 -0
- package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
- 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/package.json +1 -1
- package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +7 -0
- package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +6 -5
- package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +7 -0
- package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
- 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/fs/rsyncCopy.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +93 -2
- package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
- package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +108 -2
- package/analyzer-template/project/constructMockCode.ts +90 -10
- package/analyzer-template/project/writeMockDataTsx.ts +181 -8
- package/analyzer-template/project/writeScenarioComponents.ts +60 -12
- package/analyzer-template/project/writeSimpleRoot.ts +21 -11
- package/background/src/lib/local/createLocalAnalyzer.js +1 -1
- package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
- package/background/src/lib/virtualized/project/constructMockCode.js +75 -4
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +162 -4
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +60 -15
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/background/src/lib/virtualized/project/writeSimpleRoot.js +21 -11
- package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
- package/codeyam-cli/scripts/apply-setup.js +180 -0
- package/codeyam-cli/scripts/apply-setup.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/codeyam-cli.js +18 -2
- package/codeyam-cli/src/codeyam-cli.js.map +1 -1
- package/codeyam-cli/src/commands/analyze.js +4 -2
- package/codeyam-cli/src/commands/analyze.js.map +1 -1
- package/codeyam-cli/src/commands/baseline.js +2 -0
- package/codeyam-cli/src/commands/baseline.js.map +1 -1
- package/codeyam-cli/src/commands/debug.js +9 -5
- package/codeyam-cli/src/commands/debug.js.map +1 -1
- package/codeyam-cli/src/commands/default.js +31 -20
- package/codeyam-cli/src/commands/default.js.map +1 -1
- package/codeyam-cli/src/commands/detect-universal-mocks.js +2 -0
- package/codeyam-cli/src/commands/detect-universal-mocks.js.map +1 -1
- package/codeyam-cli/src/commands/init.js +49 -257
- package/codeyam-cli/src/commands/init.js.map +1 -1
- package/codeyam-cli/src/commands/memory.js +17 -26
- package/codeyam-cli/src/commands/memory.js.map +1 -1
- package/codeyam-cli/src/commands/recapture.js +2 -0
- package/codeyam-cli/src/commands/recapture.js.map +1 -1
- package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
- package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
- package/codeyam-cli/src/commands/setup-simulations.js +284 -0
- package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
- package/codeyam-cli/src/commands/test-startup.js +2 -0
- package/codeyam-cli/src/commands/test-startup.js.map +1 -1
- package/codeyam-cli/src/commands/verify.js +14 -2
- package/codeyam-cli/src/commands/verify.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +128 -86
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
- package/codeyam-cli/src/utils/analyzer.js +7 -0
- package/codeyam-cli/src/utils/analyzer.js.map +1 -1
- package/codeyam-cli/src/utils/backgroundServer.js +9 -0
- package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/utils/generateReport.js +2 -2
- package/codeyam-cli/src/utils/install-skills.js +70 -45
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/labsAutoCheck.js +19 -0
- package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -0
- package/codeyam-cli/src/utils/progress.js +7 -0
- package/codeyam-cli/src/utils/progress.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +4 -0
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/requireSimulations.js +10 -0
- package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js +82 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +230 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +67 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js +105 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js +34 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js +162 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +75 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +378 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +115 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js +127 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js +50 -0
- package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +116 -0
- package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/index.js +5 -0
- package/codeyam-cli/src/utils/ruleReflection/index.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js +44 -0
- package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js +85 -0
- package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/types.js +5 -0
- package/codeyam-cli/src/utils/ruleReflection/types.js.map +1 -0
- package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +293 -0
- package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -0
- package/codeyam-cli/src/utils/rules/index.js +1 -0
- package/codeyam-cli/src/utils/rules/index.js.map +1 -1
- package/codeyam-cli/src/utils/rules/parser.js +2 -25
- package/codeyam-cli/src/utils/rules/parser.js.map +1 -1
- package/codeyam-cli/src/utils/rules/ruleState.js +150 -0
- package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
- package/codeyam-cli/src/utils/rules/staleness.js +16 -11
- package/codeyam-cli/src/utils/rules/staleness.js.map +1 -1
- package/codeyam-cli/src/utils/serverState.js +37 -10
- package/codeyam-cli/src/utils/serverState.js.map +1 -1
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +21 -44
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/database.js +15 -3
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/backgroundServer.js +24 -0
- package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/CopyButton-CQ-wF3Tv.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-DsN1wKrm.js → EntityItem-HdckCi0m.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-DLqD3qNt.js → EntityTypeBadge-Dh5RJMOE.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-Ba2JVPzP.js → EntityTypeIcon-BnjjBHJu.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-C8lyxW9k.js → InlineSpinner-CUSfu6W5.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-aht4aafF.js → InteractivePreview-Coll1aD6.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CVtiBnY5.js → LibraryFunctionPreview-lYMY8h-y.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-B0GLXMsr.js → LoadingDots-ay8XeA59.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-xgeCVgSM.js → LogViewer-Dpul1_ik.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-OApQuNyq.js → ReportIssueModal-CRBCfV2W.js} +3 -8
- package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-DuDvi0jm.js → SafeScreenshot-DRTFDNFt.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DzccYyI8.js → ScenarioViewer-d6PSFxhS.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-DyFZkK0l.js → TruncatedFilePath-DDEOQ6Iw.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{_index-BwqWJOgH.js → _index-CkziGg5F.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BwavGCpm.js → activity.(_tab)-B2v1pm9w.js} +6 -11
- package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-BXIaK8Md.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.agent-transcripts-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.labs-unlock-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.save-fixture-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/book-open-qbapxy6o.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-Cx24_aWc.js → chevron-down-C-mKrwr1.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-CXRTFQ3F.js → chunk-JZWAC4HX-BAvUl1nT.js} +12 -12
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BOARzkeR.js → circle-check-DlrT-SzI.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/copy-clIxnCqQ.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-BdhJEx6B.js → createLucideIcon-B931Etud.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-BBnGWYga.js → dev.empty-BoPM6KnE.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-oVRMh9Hl.js +16 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js → entity._sha.scenarios._scenarioId.fullscreen-BjyzwQ7H.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-D1T4TGjf.js → entity._sha_.create-scenario-DxuyDmZA.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CTBG2mmz.js → entity._sha_.edit._scenarioId-DESSZGQp.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CS2cb_eZ.js → entry.client-D5Yb90Ad.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DMJ7zii9.js → fileTableUtils-DuObVYgh.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{files-CJ6lTdTA.js → files-CDfz4Y-i.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{git-CPTZZ-JZ.js → git-D6jOlDQw.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-CKT08Djd.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-B1h680n5.js → index-DvOt1KIt.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-lzqtyFU8.js → index-WfQFdoWK.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/labs-BbGyC1RY.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-B7B9V-bu.js → loader-circle-Bb7Y9k5O.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-fd06e67a.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/memory-BXebUPaL.js +78 -0
- package/codeyam-cli/src/webserver/build/client/assets/pause-DaAHX2on.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/root-CvNE9MaT.js +62 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-CxXUmBSd.js → search-DIqAPIrO.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/settings-DCIzBZM9.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-DwFIBT09.js → simulations-C6n_fNQY.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/terminal-CmPsszJy.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-B6LgvRJg.js → triangle-alert-Beg-oV50.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-C1v1PQzo.js → useCustomSizes-D7TLbP3M.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-aSv48UbS.js → useLastLogLine-Ce5rnai3.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-DYxHZQuP.js → useReportContext-B4D3wj27.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-mBRpZPiu.js → useToast-BDt_-DnY.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/{index-DVzYx8PN.js → index-DDr9Cp9M.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-DjwiujaU.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:debug.md → codeyam-debug.md} +1 -1
- package/codeyam-cli/templates/codeyam-diagnose.md +481 -0
- package/codeyam-cli/templates/codeyam-memory-hook.sh +19 -20
- package/codeyam-cli/templates/codeyam-memory.md +392 -0
- package/codeyam-cli/templates/codeyam-new-rule.md +13 -0
- package/codeyam-cli/templates/{codeyam:setup.md → codeyam-setup.md} +13 -1
- package/codeyam-cli/templates/{codeyam:sim.md → codeyam-sim.md} +1 -1
- package/codeyam-cli/templates/{codeyam:test.md → codeyam-test.md} +1 -1
- package/codeyam-cli/templates/{codeyam:verify.md → codeyam-verify.md} +1 -1
- package/codeyam-cli/templates/rule-notification-hook.py +56 -0
- package/codeyam-cli/templates/rule-reflection-hook.py +627 -0
- package/codeyam-cli/templates/rules-instructions.md +132 -0
- package/package.json +10 -10
- package/packages/ai/index.js +3 -2
- package/packages/ai/index.js.map +1 -1
- package/packages/ai/src/lib/analyzeScope.js +50 -13
- package/packages/ai/src/lib/analyzeScope.js.map +1 -1
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +54 -8
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
- package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js +10 -14
- package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js.map +1 -1
- package/packages/ai/src/lib/astScopes/processExpression.js +317 -44
- package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
- package/packages/ai/src/lib/astScopes/sharedPatterns.js +25 -0
- package/packages/ai/src/lib/astScopes/sharedPatterns.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +763 -171
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +5 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.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 +33 -3
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +36 -11
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js +63 -0
- package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +122 -12
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +173 -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 +309 -84
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
- package/packages/ai/src/lib/dataStructureChunking.js +26 -11
- package/packages/ai/src/lib/dataStructureChunking.js.map +1 -1
- package/packages/ai/src/lib/generateEntityDataStructure.js +46 -2
- package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarioData.js +227 -4
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarios.js +7 -1
- package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlows.js +26 -4
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +447 -80
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
- package/packages/ai/src/lib/isolateScopes.js +39 -3
- package/packages/ai/src/lib/isolateScopes.js.map +1 -1
- package/packages/ai/src/lib/mergeJsonTypeDefinitions.js +5 -0
- package/packages/ai/src/lib/mergeJsonTypeDefinitions.js.map +1 -1
- 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/collapseNullableObjects.js +97 -0
- package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js.map +1 -0
- 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/generateEntityScenarioDataGenerator.js +17 -2
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
- package/packages/ai/src/lib/resolvePathToControllable.js +24 -14
- package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
- package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
- package/packages/analyze/index.js +1 -0
- package/packages/analyze/index.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/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 +65 -7
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +17 -4
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.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 +0 -3
- 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/TransformationTracer.js +880 -0
- package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -0
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +56 -10
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +75 -21
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +150 -17
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +56 -8
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +478 -54
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.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/index.js +1 -0
- package/packages/analyze/src/lib/index.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/analysisBranchToDb.js +1 -1
- package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
- package/packages/database/src/lib/analysisToDb.js +1 -1
- package/packages/database/src/lib/analysisToDb.js.map +1 -1
- package/packages/database/src/lib/branchToDb.js +1 -1
- package/packages/database/src/lib/branchToDb.js.map +1 -1
- package/packages/database/src/lib/commitBranchToDb.js +1 -1
- package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
- package/packages/database/src/lib/commitToDb.js +1 -1
- package/packages/database/src/lib/commitToDb.js.map +1 -1
- package/packages/database/src/lib/fileToDb.js +1 -1
- package/packages/database/src/lib/fileToDb.js.map +1 -1
- package/packages/database/src/lib/kysely/db.js +3 -0
- package/packages/database/src/lib/kysely/db.js.map +1 -1
- package/packages/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
- package/packages/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
- package/packages/database/src/lib/projectToDb.js +1 -1
- package/packages/database/src/lib/projectToDb.js.map +1 -1
- package/packages/database/src/lib/saveFiles.js +1 -1
- package/packages/database/src/lib/saveFiles.js.map +1 -1
- package/packages/database/src/lib/scenarioToDb.js +1 -1
- package/packages/database/src/lib/scenarioToDb.js.map +1 -1
- package/packages/utils/src/lib/fs/rsyncCopy.js +93 -2
- package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
- package/scripts/finalize-analyzer.cjs +8 -76
- package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-BJUiQqZF.js +0 -23
- package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-7522edd4.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/memory-yxFcrxBX.js +0 -92
- package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +0 -62
- package/codeyam-cli/src/webserver/build/client/assets/settings-CS5f3WzT.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-4Cr0uToj.js +0 -257
- package/codeyam-cli/templates/codeyam:diagnose.md +0 -803
- package/codeyam-cli/templates/codeyam:memory.md +0 -462
- package/codeyam-cli/templates/codeyam:new-rule.md +0 -13
|
@@ -72,7 +72,11 @@ export class JavascriptFrameworkManager implements EquivalencyManager {
|
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
finalize(scopeNode: ScopeNode, scopeDataStructure: ScopeDataStructure) {
|
|
75
|
-
cleanNonObjectFunctions
|
|
75
|
+
// Don't call cleanNonObjectFunctions with final=true here.
|
|
76
|
+
// The aggressive cleanup (transformKeyMapping, clearAttributes) removes method call
|
|
77
|
+
// evidence like .includes() before type inference can use it.
|
|
78
|
+
// Instead, defer final cleanup to toSerializable() when we're done with inference.
|
|
79
|
+
cleanNonObjectFunctions(scopeNode, scopeDataStructure, false);
|
|
76
80
|
cleanKnownObjectFunctions(scopeNode, scopeDataStructure);
|
|
77
81
|
this.handleUniformArrays(scopeNode, scopeDataStructure);
|
|
78
82
|
}
|
|
@@ -41,6 +41,7 @@ export interface BatchProcessorStats {
|
|
|
41
41
|
|
|
42
42
|
export class BatchSchemaProcessor {
|
|
43
43
|
private workQueue: WorkItem[] = [];
|
|
44
|
+
private queueIndex = 0;
|
|
44
45
|
private stats: BatchProcessorStats = {
|
|
45
46
|
itemsProcessed: 0,
|
|
46
47
|
itemsSkipped: 0, // Kept for API compatibility, always 0
|
|
@@ -71,17 +72,28 @@ export class BatchSchemaProcessor {
|
|
|
71
72
|
* Check if there are more items to process.
|
|
72
73
|
*/
|
|
73
74
|
hasWork(): boolean {
|
|
74
|
-
return this.workQueue.length
|
|
75
|
+
return this.queueIndex < this.workQueue.length;
|
|
75
76
|
}
|
|
76
77
|
|
|
77
78
|
/**
|
|
78
79
|
* Get the next work item from the queue.
|
|
79
80
|
*/
|
|
80
81
|
getNextWork(): WorkItem | undefined {
|
|
81
|
-
|
|
82
|
+
if (this.queueIndex >= this.workQueue.length) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const item = this.workQueue[this.queueIndex++];
|
|
82
87
|
if (item) {
|
|
83
88
|
this.stats.itemsProcessed++;
|
|
84
89
|
}
|
|
90
|
+
|
|
91
|
+
// Once we've consumed the queue, reset to avoid unbounded growth
|
|
92
|
+
if (this.queueIndex >= this.workQueue.length) {
|
|
93
|
+
this.workQueue = [];
|
|
94
|
+
this.queueIndex = 0;
|
|
95
|
+
}
|
|
96
|
+
|
|
85
97
|
return item;
|
|
86
98
|
}
|
|
87
99
|
|
|
@@ -122,6 +134,7 @@ export class BatchSchemaProcessor {
|
|
|
122
134
|
*/
|
|
123
135
|
reset(): void {
|
|
124
136
|
this.workQueue = [];
|
|
137
|
+
this.queueIndex = 0;
|
|
125
138
|
this.stats = {
|
|
126
139
|
itemsProcessed: 0,
|
|
127
140
|
itemsSkipped: 0,
|
|
@@ -134,6 +147,6 @@ export class BatchSchemaProcessor {
|
|
|
134
147
|
* Get current queue size (for debugging/monitoring).
|
|
135
148
|
*/
|
|
136
149
|
getQueueSize(): number {
|
|
137
|
-
return this.workQueue.length;
|
|
150
|
+
return this.workQueue.length - this.queueIndex;
|
|
138
151
|
}
|
|
139
152
|
}
|
|
@@ -117,9 +117,10 @@ export class ScopeTreeManager {
|
|
|
117
117
|
*/
|
|
118
118
|
findNode(name: string): ScopeTreeNode | undefined {
|
|
119
119
|
const queue: ScopeTreeNode[] = [this.tree];
|
|
120
|
+
let index = 0;
|
|
120
121
|
|
|
121
|
-
while (queue.length
|
|
122
|
-
const node = queue
|
|
122
|
+
while (index < queue.length) {
|
|
123
|
+
const node = queue[index++]!;
|
|
123
124
|
if (node.name === name) {
|
|
124
125
|
return node;
|
|
125
126
|
}
|
|
@@ -135,9 +136,10 @@ export class ScopeTreeManager {
|
|
|
135
136
|
getAllNames(): string[] {
|
|
136
137
|
const names: string[] = [];
|
|
137
138
|
const queue: ScopeTreeNode[] = [this.tree];
|
|
139
|
+
let index = 0;
|
|
138
140
|
|
|
139
|
-
while (queue.length
|
|
140
|
-
const node = queue
|
|
141
|
+
while (index < queue.length) {
|
|
142
|
+
const node = queue[index++]!;
|
|
141
143
|
names.push(node.name);
|
|
142
144
|
queue.push(...node.children);
|
|
143
145
|
}
|
package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts
CHANGED
|
@@ -35,6 +35,24 @@ const getParts = (path: string): string[] => {
|
|
|
35
35
|
return parts;
|
|
36
36
|
};
|
|
37
37
|
|
|
38
|
+
function buildPrefixParts(parts: string[]): string[] {
|
|
39
|
+
if (parts.length === 0) return [];
|
|
40
|
+
const prefixes = new Array(parts.length);
|
|
41
|
+
let current = '';
|
|
42
|
+
for (let i = 0; i < parts.length; i++) {
|
|
43
|
+
const part = parts[i];
|
|
44
|
+
if (i === 0) {
|
|
45
|
+
current = part;
|
|
46
|
+
} else if (part.startsWith('[') || part.startsWith('(')) {
|
|
47
|
+
current += part;
|
|
48
|
+
} else {
|
|
49
|
+
current += `.${part}`;
|
|
50
|
+
}
|
|
51
|
+
prefixes[i] = current;
|
|
52
|
+
}
|
|
53
|
+
return prefixes;
|
|
54
|
+
}
|
|
55
|
+
|
|
38
56
|
/**
|
|
39
57
|
* Clear the module-level cache.
|
|
40
58
|
* Call this between entity analyses to prevent unbounded memory growth.
|
|
@@ -133,6 +151,7 @@ function scrub(
|
|
|
133
151
|
|
|
134
152
|
for (const keyPath of sortedKeys) {
|
|
135
153
|
const keyParts = getParts(keyPath);
|
|
154
|
+
const prefixParts = buildPrefixParts(keyParts);
|
|
136
155
|
|
|
137
156
|
if (
|
|
138
157
|
IGNORE_CLASSES_AND_OBJECTS.find(
|
|
@@ -145,7 +164,7 @@ function scrub(
|
|
|
145
164
|
|
|
146
165
|
// walk back through the prefixes: foo.bar.baz.qux → foo.bar.baz → foo.bar …
|
|
147
166
|
for (let cut = keyParts.length - 1; cut > 0; --cut) {
|
|
148
|
-
const prefix =
|
|
167
|
+
const prefix = prefixParts[cut - 1];
|
|
149
168
|
const rootKind = rootTable.get(prefix);
|
|
150
169
|
if (!rootKind) continue;
|
|
151
170
|
|
|
@@ -153,9 +172,18 @@ function scrub(
|
|
|
153
172
|
const rawMethod = rawToken.split('(')[0];
|
|
154
173
|
|
|
155
174
|
// Check if it's a prototype method (e.g., map, filter, toString)
|
|
175
|
+
// Only match when the token is actually a method reference/call:
|
|
176
|
+
// - Has parentheses (explicit call like map(), filter(x => x))
|
|
177
|
+
// - OR is typed as "function" (method reference like .split)
|
|
178
|
+
// Bare property names that happen to match method names
|
|
179
|
+
// (like .entries = "array", .values = "object") are preserved.
|
|
156
180
|
if (protoMethodSets[rootKind].has(rawMethod)) {
|
|
157
|
-
|
|
158
|
-
|
|
181
|
+
const isMethodCall = rawToken.includes('(');
|
|
182
|
+
const isMethodReference = mapping[keyPath] === 'function';
|
|
183
|
+
if (isMethodCall || isMethodReference) {
|
|
184
|
+
onRemove(keyPath);
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
159
187
|
}
|
|
160
188
|
|
|
161
189
|
// Check if it's a built-in property (e.g., length on arrays/strings)
|
package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts
CHANGED
|
@@ -178,17 +178,36 @@ export function clearCleanNonObjectFunctionsCache(): {
|
|
|
178
178
|
// Maps parent prefix -> array of last parts (method names without parens)
|
|
179
179
|
type PrefixIndex = Map<string, string[]>;
|
|
180
180
|
|
|
181
|
+
function buildPrefixPartsWithRoot(parts: string[]): string[] {
|
|
182
|
+
const prefixes = new Array(parts.length + 1);
|
|
183
|
+
prefixes[0] = '';
|
|
184
|
+
let current = '';
|
|
185
|
+
for (let i = 0; i < parts.length; i++) {
|
|
186
|
+
const part = parts[i];
|
|
187
|
+
if (i === 0) {
|
|
188
|
+
current = part;
|
|
189
|
+
} else if (part.startsWith('[') || part.startsWith('(')) {
|
|
190
|
+
current += part;
|
|
191
|
+
} else {
|
|
192
|
+
current += `.${part}`;
|
|
193
|
+
}
|
|
194
|
+
prefixes[i + 1] = current;
|
|
195
|
+
}
|
|
196
|
+
return prefixes;
|
|
197
|
+
}
|
|
198
|
+
|
|
181
199
|
function buildPrefixIndex(allPaths: string[]): PrefixIndex {
|
|
182
200
|
const index: PrefixIndex = new Map();
|
|
183
201
|
|
|
184
202
|
for (const path of allPaths) {
|
|
185
203
|
const parts = cachedSplit(path);
|
|
186
204
|
if (parts.length < 1) continue;
|
|
205
|
+
const prefixes = buildPrefixPartsWithRoot(parts);
|
|
187
206
|
|
|
188
207
|
// For each possible prefix length, add the last part to that prefix's entry
|
|
189
208
|
// This allows lookup at any depth
|
|
190
209
|
for (let prefixLen = 0; prefixLen < parts.length; prefixLen++) {
|
|
191
|
-
const prefix =
|
|
210
|
+
const prefix = prefixes[prefixLen];
|
|
192
211
|
const lastPart = parts[prefixLen]?.split('(')?.[0];
|
|
193
212
|
if (lastPart) {
|
|
194
213
|
let existing = index.get(prefix);
|
|
@@ -491,7 +510,7 @@ function removeNonTransformingArrayMethods(variablePath: string): string {
|
|
|
491
510
|
const part = keyParts[i];
|
|
492
511
|
|
|
493
512
|
const arrayMethod = getMethodName(part);
|
|
494
|
-
if (isValidArrayMethod(arrayMethod)) {
|
|
513
|
+
if (isValidFunctionCall(part) && isValidArrayMethod(arrayMethod)) {
|
|
495
514
|
const nextPart = keyParts[i + 1];
|
|
496
515
|
if (
|
|
497
516
|
!nonTransformingArrayMethodsSet.has(arrayMethod) ||
|
|
@@ -531,7 +550,7 @@ function removeIsolatingArrayMethods(
|
|
|
531
550
|
const part = keyParts[i];
|
|
532
551
|
|
|
533
552
|
const arrayMethod = getMethodName(part);
|
|
534
|
-
if (isValidArrayMethod(arrayMethod)) {
|
|
553
|
+
if (isValidFunctionCall(part) && isValidArrayMethod(arrayMethod)) {
|
|
535
554
|
const nextPart = keyParts[i + 1];
|
|
536
555
|
const prevPart = i > 1 ? keyParts[i - 1] : undefined;
|
|
537
556
|
if (
|
|
@@ -1085,29 +1104,32 @@ function clearAttributes(
|
|
|
1085
1104
|
knownBasePaths.add(path);
|
|
1086
1105
|
}
|
|
1087
1106
|
|
|
1107
|
+
// OPTIMIZATION: Instead of O(keys × basePaths), use O(keys × keyDepth) where keyDepth is small
|
|
1108
|
+
// For each key, find all its prefixes and check if any is a known basePath (O(1) Set lookup)
|
|
1088
1109
|
for (const key in mapping) {
|
|
1089
1110
|
const keyParts = cachedSplit(key);
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
)
|
|
1097
|
-
|
|
1111
|
+
if (keyParts.length <= 1) continue; // No possible parent basePath
|
|
1112
|
+
|
|
1113
|
+
// Check each prefix of the key to see if it's a known basePath
|
|
1114
|
+
// Start from shortest prefix (most likely to match) for early exit
|
|
1115
|
+
for (let prefixLen = 1; prefixLen < keyParts.length; prefixLen++) {
|
|
1116
|
+
const prefix = joinParenthesesAndArrays(keyParts.slice(0, prefixLen));
|
|
1117
|
+
if (!knownBasePaths.has(prefix)) continue;
|
|
1118
|
+
|
|
1119
|
+
// Found a matching basePath - now check the conditions
|
|
1120
|
+
const basePath = prefix;
|
|
1121
|
+
|
|
1098
1122
|
// Preserve functionCallReturnValue for non-string types, UNLESS
|
|
1099
1123
|
// the method is a primitive-returning method (like some, every, includes, indexOf)
|
|
1100
1124
|
// whose return values are not mockable
|
|
1101
|
-
const methodPart = keyParts[
|
|
1125
|
+
const methodPart = keyParts[prefixLen];
|
|
1102
1126
|
const methodName = methodPart?.split('(')[0];
|
|
1103
1127
|
const isPrimitiveReturning = primitiveReturningMethodsSet.has(
|
|
1104
1128
|
methodName ?? '',
|
|
1105
1129
|
);
|
|
1106
1130
|
if (
|
|
1107
1131
|
mapping[basePath] !== 'string' &&
|
|
1108
|
-
keyParts[
|
|
1109
|
-
'functionCallReturnValue',
|
|
1110
|
-
) &&
|
|
1132
|
+
keyParts[prefixLen + 1]?.startsWith('functionCallReturnValue') &&
|
|
1111
1133
|
!isPrimitiveReturning
|
|
1112
1134
|
)
|
|
1113
1135
|
continue;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coerces object/array values to primitive types when the schema expects a primitive.
|
|
3
|
+
*
|
|
4
|
+
* The LLM sometimes generates an object or array where the schema expects a primitive
|
|
5
|
+
* type like "string", "number", or "boolean". For example:
|
|
6
|
+
* Schema: { body: "string" }
|
|
7
|
+
* LLM output: { body: { "env": "production" } }
|
|
8
|
+
*
|
|
9
|
+
* This causes runtime errors like `TypeError: body.match is not a function` because
|
|
10
|
+
* the code expects a string but gets an object.
|
|
11
|
+
*
|
|
12
|
+
* Coercion rules:
|
|
13
|
+
* - object/array → string: JSON.stringify
|
|
14
|
+
* - object/array → number: 0
|
|
15
|
+
* - object/array → boolean: false
|
|
16
|
+
*
|
|
17
|
+
* @param data The mock data object to coerce (mutated in place)
|
|
18
|
+
* @param schema The schema describing expected types
|
|
19
|
+
*/
|
|
20
|
+
export default function coerceObjectsToPrimitivesBySchema<T>(
|
|
21
|
+
data: T,
|
|
22
|
+
schema: unknown,
|
|
23
|
+
): T {
|
|
24
|
+
if (data === null || data === undefined) {
|
|
25
|
+
return data;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (typeof data !== 'object') {
|
|
29
|
+
return data;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (Array.isArray(data)) {
|
|
33
|
+
const itemSchema = Array.isArray(schema) ? schema[0] : undefined;
|
|
34
|
+
for (let i = 0; i < data.length; i++) {
|
|
35
|
+
data[i] = coerceObjectsToPrimitivesBySchema(data[i], itemSchema);
|
|
36
|
+
}
|
|
37
|
+
return data;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const dataObj = data as Record<string, unknown>;
|
|
41
|
+
const schemaObj = schema as Record<string, unknown> | undefined;
|
|
42
|
+
|
|
43
|
+
for (const key of Object.keys(dataObj)) {
|
|
44
|
+
const value = dataObj[key];
|
|
45
|
+
const fieldSchema = schemaObj?.[key];
|
|
46
|
+
|
|
47
|
+
if (value === null || value === undefined) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (typeof value === 'object' && typeof fieldSchema === 'string') {
|
|
52
|
+
// Schema expects a primitive but the value is an object/array.
|
|
53
|
+
// Coerce to the expected type.
|
|
54
|
+
const schemaType = fieldSchema.toLowerCase();
|
|
55
|
+
|
|
56
|
+
if (schemaType.includes('string')) {
|
|
57
|
+
dataObj[key] = JSON.stringify(value);
|
|
58
|
+
} else if (schemaType.includes('number')) {
|
|
59
|
+
dataObj[key] = 0;
|
|
60
|
+
} else if (schemaType.includes('boolean')) {
|
|
61
|
+
dataObj[key] = false;
|
|
62
|
+
}
|
|
63
|
+
} else if (typeof value === 'object' && value !== null) {
|
|
64
|
+
// Both value and schema are objects — recurse
|
|
65
|
+
coerceObjectsToPrimitivesBySchema(value, fieldSchema);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return data;
|
|
70
|
+
}
|
|
@@ -14,23 +14,112 @@ const isStandaloneIndex = (s?: string) => !!s && STANDALONE_INDEX_RE.test(s);
|
|
|
14
14
|
// The regex matches any path ending with .length that has [] somewhere before it
|
|
15
15
|
const DYNAMIC_LENGTH_RE = /\[\].*\.length$/;
|
|
16
16
|
|
|
17
|
+
// Cache for type string analysis to avoid repeated split/filter operations.
|
|
18
|
+
// These functions are called multiple times per path segment across thousands of paths.
|
|
19
|
+
const typeAnalysisCache = new Map<
|
|
20
|
+
string,
|
|
21
|
+
{ isSkippable: boolean; baseType: string; isNullable: boolean }
|
|
22
|
+
>();
|
|
23
|
+
|
|
24
|
+
function getTypeAnalysis(t: string) {
|
|
25
|
+
const cached = typeAnalysisCache.get(t);
|
|
26
|
+
if (cached) return cached;
|
|
27
|
+
const parts = t.split('|').map((s) => s.trim());
|
|
28
|
+
const base = parts.filter((s) => s !== 'undefined' && s !== 'null');
|
|
29
|
+
const result = {
|
|
30
|
+
isSkippable:
|
|
31
|
+
base.length === 1 &&
|
|
32
|
+
(base[0] === 'object' ||
|
|
33
|
+
base[0] === 'array' ||
|
|
34
|
+
base[0] === 'function' ||
|
|
35
|
+
base[0] === 'unknown'),
|
|
36
|
+
baseType: base[0],
|
|
37
|
+
isNullable: parts.includes('undefined') || parts.includes('null'),
|
|
38
|
+
};
|
|
39
|
+
typeAnalysisCache.set(t, result);
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
|
|
17
43
|
// Treat these as structural placeholders (don't commit them as concrete leaves)
|
|
18
44
|
function isSkippableLeafType(t: string) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
);
|
|
45
|
+
return getTypeAnalysis(t).isSkippable;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Extract the base structural type from a potentially nullable type string.
|
|
49
|
+
// e.g., 'object | undefined' → 'object', 'array | null' → 'array'
|
|
50
|
+
function getBaseSkippableType(t: string): string {
|
|
51
|
+
return getTypeAnalysis(t).baseType;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Check if a type string has nullable annotations (| undefined or | null)
|
|
55
|
+
function isNullableType(t: string): boolean {
|
|
56
|
+
return getTypeAnalysis(t).isNullable;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Matches paths containing [][] — e.g., "items[][]" or "items[][].text"
|
|
60
|
+
const DOUBLE_ARRAY_RE = /\[\]\[\]/;
|
|
61
|
+
|
|
62
|
+
// Matches a [].property segment — e.g., "items[].name" (but not "items[][]")
|
|
63
|
+
const ARRAY_OBJECT_PROPERTY_RE = /\[\]\.[^[\]]/;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* When scope analysis produces both `prefix[].property` (array of objects) and
|
|
67
|
+
* `prefix[][]` (array of arrays) for the same prefix, there's a conflict about
|
|
68
|
+
* what the array elements are. Object-property paths are more specific and come
|
|
69
|
+
* from actual property access; double-array paths come from mixed iteration
|
|
70
|
+
* patterns in the scope analysis. Drop the double-array paths when both exist.
|
|
71
|
+
*/
|
|
72
|
+
function resolveDoubleArrayConflicts(
|
|
73
|
+
schema: Record<string, string>,
|
|
74
|
+
): Record<string, string> {
|
|
75
|
+
// Collect prefixes that end in [] and have object property children
|
|
76
|
+
const objectArrayPrefixes = new Set<string>();
|
|
77
|
+
for (const path of Object.keys(schema)) {
|
|
78
|
+
if (!ARRAY_OBJECT_PROPERTY_RE.test(path)) continue;
|
|
79
|
+
// Extract every "...[]" prefix that is followed by ".prop"
|
|
80
|
+
let idx = 0;
|
|
81
|
+
while ((idx = path.indexOf('[].', idx)) !== -1) {
|
|
82
|
+
objectArrayPrefixes.add(path.slice(0, idx + 2)); // includes the "[]"
|
|
83
|
+
idx += 3;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (objectArrayPrefixes.size === 0) return schema;
|
|
88
|
+
|
|
89
|
+
// Check if any double-array paths actually conflict
|
|
90
|
+
let hasConflict = false;
|
|
91
|
+
for (const path of Object.keys(schema)) {
|
|
92
|
+
if (!DOUBLE_ARRAY_RE.test(path)) continue;
|
|
93
|
+
const idx = path.indexOf('[][]');
|
|
94
|
+
if (idx !== -1 && objectArrayPrefixes.has(path.slice(0, idx + 2))) {
|
|
95
|
+
hasConflict = true;
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (!hasConflict) return schema;
|
|
101
|
+
|
|
102
|
+
// Filter out conflicting double-array paths
|
|
103
|
+
const resolved: Record<string, string> = {};
|
|
104
|
+
for (const [path, value] of Object.entries(schema)) {
|
|
105
|
+
if (DOUBLE_ARRAY_RE.test(path)) {
|
|
106
|
+
const idx = path.indexOf('[][]');
|
|
107
|
+
if (idx !== -1 && objectArrayPrefixes.has(path.slice(0, idx + 2))) {
|
|
108
|
+
continue; // drop this conflicting path
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
resolved[path] = value;
|
|
112
|
+
}
|
|
113
|
+
return resolved;
|
|
26
114
|
}
|
|
27
115
|
|
|
28
116
|
export default function convertDotNotation(
|
|
29
117
|
schema: Record<string, string>,
|
|
30
118
|
): JsonTypeDefinition {
|
|
119
|
+
const resolved = resolveDoubleArrayConflicts(schema);
|
|
31
120
|
const result: JsonTypeDefinition = {};
|
|
32
121
|
|
|
33
|
-
for (const [rawPath, typ] of Object.entries(
|
|
122
|
+
for (const [rawPath, typ] of Object.entries(resolved)) {
|
|
34
123
|
// Skip paths with .length after array notation from dynamic iteration
|
|
35
124
|
// e.g., metadata[].length, metadata[][].length
|
|
36
125
|
if (DYNAMIC_LENGTH_RE.test(rawPath)) continue;
|
|
@@ -218,6 +307,17 @@ export default function convertDotNotation(
|
|
|
218
307
|
// If the next segment after '[]' is another '[]' or a standalone index,
|
|
219
308
|
// we need an array at cursor[key][0], not an object (for patterns like "key[][]" or "key[][0]")
|
|
220
309
|
if (afterArray === '[]' || isStandaloneIndex(afterArray)) {
|
|
310
|
+
// But don't overwrite an existing populated object — object properties
|
|
311
|
+
// (from paths like key[].property) take precedence over double-array hints
|
|
312
|
+
// (from paths like key[][]) which come from mixed access patterns in scope analysis
|
|
313
|
+
if (
|
|
314
|
+
cursor[key][0] &&
|
|
315
|
+
typeof cursor[key][0] === 'object' &&
|
|
316
|
+
!Array.isArray(cursor[key][0]) &&
|
|
317
|
+
Object.keys(cursor[key][0]).length > 0
|
|
318
|
+
) {
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
221
321
|
if (!Array.isArray(cursor[key][0])) cursor[key][0] = [];
|
|
222
322
|
} else {
|
|
223
323
|
// Default case: create an object
|
|
@@ -242,15 +342,41 @@ export default function convertDotNotation(
|
|
|
242
342
|
cursor[key] = typ;
|
|
243
343
|
} else {
|
|
244
344
|
// Structural/placeholder terminal
|
|
245
|
-
|
|
345
|
+
const nullable = isNullableType(typ);
|
|
346
|
+
const baseType = getBaseSkippableType(typ);
|
|
347
|
+
|
|
348
|
+
if (baseType === 'array') {
|
|
246
349
|
if (!Array.isArray(cursor[key])) cursor[key] = [];
|
|
350
|
+
if (nullable) {
|
|
351
|
+
(cursor[key] as any)._nullable = true;
|
|
352
|
+
}
|
|
247
353
|
} else if (
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
354
|
+
baseType === 'object' ||
|
|
355
|
+
baseType === 'function' ||
|
|
356
|
+
baseType === 'unknown'
|
|
251
357
|
) {
|
|
252
|
-
if (
|
|
253
|
-
|
|
358
|
+
if (nullable) {
|
|
359
|
+
// Nullable object: ensure it's an actual object (not a string
|
|
360
|
+
// placeholder) so _nullable can be set and child paths can
|
|
361
|
+
// populate properties on it.
|
|
362
|
+
if (
|
|
363
|
+
cursor[key] === undefined ||
|
|
364
|
+
typeof cursor[key] === 'string'
|
|
365
|
+
) {
|
|
366
|
+
cursor[key] = {};
|
|
367
|
+
}
|
|
368
|
+
if (
|
|
369
|
+
typeof cursor[key] === 'object' &&
|
|
370
|
+
cursor[key] !== null &&
|
|
371
|
+
!Array.isArray(cursor[key])
|
|
372
|
+
) {
|
|
373
|
+
(cursor[key] as any)._nullable = true;
|
|
374
|
+
}
|
|
375
|
+
} else {
|
|
376
|
+
// Non-nullable: preserve existing behavior (string placeholder)
|
|
377
|
+
if (cursor[key] === undefined) {
|
|
378
|
+
cursor[key] = typ;
|
|
379
|
+
}
|
|
254
380
|
}
|
|
255
381
|
}
|
|
256
382
|
}
|