@codeyam/codeyam-cli 0.1.0-staging.c90f8c9 → 0.1.0-staging.c9dc00c
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 +7 -7
- package/analyzer-template/packages/ai/index.ts +10 -2
- package/analyzer-template/packages/ai/package.json +2 -2
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +86 -18
- package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +67 -9
- package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +41 -17
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.ts +10 -17
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +308 -50
- package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +15 -6
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +837 -243
- 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 +54 -3
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +60 -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 +80 -5
- 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 +393 -97
- package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +58 -3
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +283 -1
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +9 -5
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +11 -3
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +297 -7
- 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/mergeStatements.ts +90 -96
- package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
- 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/ai/src/lib/worker/analyzeScopeWorker.ts +114 -2
- 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 +71 -9
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +19 -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 +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 +37 -0
- 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 +459 -39
- 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 +14 -1
- package/analyzer-template/packages/database/src/lib/kysely/tables/commitsTable.ts +6 -0
- package/analyzer-template/packages/database/src/lib/kysely/tables/labsRequestsTable.ts +52 -0
- 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 +12 -0
- package/analyzer-template/packages/database/src/lib/loadEntityBranches.ts +12 -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/updateCommitMetadata.ts +7 -14
- 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 +11 -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/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/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/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.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +9 -0
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.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/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/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/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/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/Commit.ts +2 -0
- 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/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/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/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 +90 -10
- 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 +11 -6
- package/analyzer-template/project/orchestrateCapture/taskRunner.ts +4 -2
- package/analyzer-template/project/orchestrateCapture.ts +45 -6
- package/analyzer-template/project/start.ts +35 -11
- 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/analyzer-template/scripts/comboWorkerLoop.cjs +98 -50
- 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/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 +75 -4
- 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 +4 -4
- package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture.js +38 -6
- package/background/src/lib/virtualized/project/orchestrateCapture.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 +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 +4 -0
- package/codeyam-cli/src/cli.js.map +1 -1
- package/codeyam-cli/src/commands/analyze.js +2 -0
- 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 +14 -4
- 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 +42 -184
- package/codeyam-cli/src/commands/init.js.map +1 -1
- package/codeyam-cli/src/commands/memory.js +264 -0
- package/codeyam-cli/src/commands/memory.js.map +1 -0
- 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 +2 -0
- 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/analysisRunner.js +1 -1
- package/codeyam-cli/src/utils/analysisRunner.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 +4 -0
- package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/utils/install-skills.js +71 -46
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/labsAutoCheck.js +48 -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 +6 -0
- package/codeyam-cli/src/utils/rules/index.js.map +1 -0
- package/codeyam-cli/src/utils/rules/parser.js +83 -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/ruleState.js +150 -0
- package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
- package/codeyam-cli/src/utils/rules/staleness.js +137 -0
- package/codeyam-cli/src/utils/rules/staleness.js.map +1 -0
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +20 -43
- 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 +31 -0
- package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/CopyButton-CA3JxPb7.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/EntityItem-B86KKU7e.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-DLqD3qNt.js → EntityTypeBadge-B5ctlSYt.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-Ba2JVPzP.js → EntityTypeIcon-BqY8gDAW.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-C8lyxW9k.js → InlineSpinner-ClaLpuOo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-aht4aafF.js → InteractivePreview-BDhPilK7.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CVtiBnY5.js → LibraryFunctionPreview-VeqEBv9v.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-B0GLXMsr.js → LoadingDots-Bs7Nn1Jr.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-xgeCVgSM.js → LogViewer-Bm3PmcCz.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-D4TZhLuw.js → ReportIssueModal-C6PKeMYR.js} +3 -13
- package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-DuDvi0jm.js → SafeScreenshot-Gq3Ocjo6.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DEx02QDa.js → ScenarioViewer-BNLaXBHR.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-DyFZkK0l.js → TruncatedFilePath-CiwXDxLh.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{_index-BwqWJOgH.js → _index-B3TDXxnk.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-DoLIqZX2.js → activity.(_tab)-BtBFH820.js} +6 -16
- package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-CN61MOMa.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.labs-survey-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.memory-profile-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-PttOB2SF.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-Cx24_aWc.js → chevron-down-TJp6ofnp.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-CXRTFQ3F.js → chunk-JZWAC4HX-JE9ZIoBl.js} +12 -12
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BOARzkeR.js → circle-check-CXhHQYrI.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/copy-6y9ALfGT.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-BdhJEx6B.js → createLucideIcon-Ca9fAY46.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-C5lqplTC.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-C2N4Op8e.js → entity._sha._-n38keI1k.js} +10 -10
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js → entity._sha.scenarios._scenarioId.fullscreen-CBoafmVs.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-D1T4TGjf.js → entity._sha_.create-scenario-DGgZjdFg.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CTBG2mmz.js → entity._sha_.edit._scenarioId-38yPijoD.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CS2cb_eZ.js → entry.client-BSHEfydn.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DMJ7zii9.js → fileTableUtils-DCPhhSMo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-0N0YJQv7.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{git-B4RJRvYB.js → git-DXnyr8uP.js} +8 -8
- package/codeyam-cli/src/webserver/build/client/assets/globals-EVn6Z9pz.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-lzqtyFU8.js → index-CcsFv748.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-B1h680n5.js → index-ChN9-fAY.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/labs-CmBYA0PH.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-B7B9V-bu.js → loader-circle-CTqLEAGU.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-aa4ff97b.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/memory-BSlqS1QA.js +81 -0
- package/codeyam-cli/src/webserver/build/client/assets/pause-D6vreykR.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/root-DVAbJY8B.js +62 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-CxXUmBSd.js → search-B8VUL8nl.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/settings-BK-cnzp-.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-DwFIBT09.js → simulations-CPoAg7Zo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/terminal-BrCP7uQo.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-B6LgvRJg.js → triangle-alert-BZz2NjYa.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-C1v1PQzo.js → useCustomSizes-DNwUduNu.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-aSv48UbS.js → useLastLogLine-COky1GVF.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-DYxHZQuP.js → useReportContext-CpZgwliL.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-mBRpZPiu.js → useToast-Bv9JFvUO.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-Cz2RkDCa.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-CUVsWicu.js +260 -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-power-rules-hook.sh → codeyam-memory-hook.sh} +12 -13
- package/codeyam-cli/templates/codeyam:diagnose.md +195 -496
- package/codeyam-cli/templates/codeyam:memory.md +403 -0
- package/codeyam-cli/templates/codeyam:new-rule.md +2 -2
- package/codeyam-cli/templates/codeyam:setup.md +12 -0
- 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 +136 -0
- package/package.json +8 -6
- package/packages/ai/index.js +3 -2
- package/packages/ai/index.js.map +1 -1
- package/packages/ai/src/lib/analyzeScope.js +68 -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/methodSemantics.js +41 -17
- package/packages/ai/src/lib/astScopes/methodSemantics.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 +239 -43
- package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +654 -166
- 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 +52 -3
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +55 -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 +73 -5
- 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 +333 -86
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.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 +205 -1
- 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 +10 -2
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +209 -3
- 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/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/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/ai/src/lib/worker/analyzeScopeWorker.js +94 -1
- package/packages/ai/src/lib/worker/analyzeScopeWorker.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 +54 -6
- 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/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 +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 +33 -8
- 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 +399 -31
- 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 +11 -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/kysely/tables/labsRequestsTable.js +35 -0
- package/packages/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
- 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 +9 -0
- package/packages/database/src/lib/loadCommits.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/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/database/src/lib/updateCommitMetadata.js +5 -4
- package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/scripts/finalize-analyzer.cjs +8 -76
- package/codeyam-cli/src/webserver/build/client/assets/EntityItem-BXhEawa3.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BRb-0kQl.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-Cs4MdYtv.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/git-commit-horizontal-CysbcZxi.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/globals-DMUaGAqV.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-f874c610.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-Bz5TunQg.js +0 -57
- package/codeyam-cli/src/webserver/build/client/assets/rules-hEkvVw2-.js +0 -97
- package/codeyam-cli/src/webserver/build/client/assets/settings-CS5f3WzT.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-uNNbimct.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-B08qC4Y7.js +0 -257
- package/codeyam-cli/templates/codeyam:power-rules.md +0 -449
- /package/codeyam-cli/src/webserver/build/client/assets/{api.rules-l0sNRNKZ.js → api.agent-transcripts-l0sNRNKZ.js} +0 -0
package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts
CHANGED
|
@@ -152,8 +152,11 @@ export default function fillInSchemaGapsAndUnknowns(
|
|
|
152
152
|
schema[previousSubPath],
|
|
153
153
|
)
|
|
154
154
|
) {
|
|
155
|
-
|
|
156
|
-
|
|
155
|
+
// When fillInUnknowns=false, add missing gaps as 'unknown' to preserve raw schema.
|
|
156
|
+
// When fillInUnknowns=true, infer the type using checkIfKnownType.
|
|
157
|
+
const newValue = fillInUnknowns
|
|
158
|
+
? (checkIfKnownType(previousSubPath, functionKeysMapping) ?? 'object')
|
|
159
|
+
: 'unknown';
|
|
157
160
|
|
|
158
161
|
if (
|
|
159
162
|
!schema[previousSubPath] ||
|
|
@@ -166,10 +169,14 @@ export default function fillInSchemaGapsAndUnknowns(
|
|
|
166
169
|
|
|
167
170
|
// Handle the wrong function chaining function().function()
|
|
168
171
|
if (isFunction && !existingSchema(previousSubPath)) {
|
|
172
|
+
// When fillInUnknowns=false, use 'unknown' for non-function paths.
|
|
173
|
+
// When fillInUnknowns=true, infer the type.
|
|
169
174
|
schema[previousSubPath] = previousSubPath.endsWith(')')
|
|
170
175
|
? 'function'
|
|
171
|
-
:
|
|
172
|
-
|
|
176
|
+
: fillInUnknowns
|
|
177
|
+
? (checkIfKnownType(previousSubPath, functionKeysMapping) ??
|
|
178
|
+
'object')
|
|
179
|
+
: 'unknown';
|
|
173
180
|
changeMade = true;
|
|
174
181
|
}
|
|
175
182
|
|
|
@@ -205,16 +212,88 @@ export default function fillInSchemaGapsAndUnknowns(
|
|
|
205
212
|
}
|
|
206
213
|
}
|
|
207
214
|
|
|
215
|
+
/**
|
|
216
|
+
* Pre-built indexes that can be reused across multiple calls to fillInDirectSchemaGapsAndUnknowns.
|
|
217
|
+
* Build once with buildSchemaIndexes(), then pass to all calls processing the same schema.
|
|
218
|
+
*/
|
|
219
|
+
export interface SchemaIndexes {
|
|
220
|
+
functionKeysMapping: Record<string, string[]>;
|
|
221
|
+
prefixMaxDepth: Map<string, number>;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Build indexes for a schema that can be reused across multiple calls.
|
|
226
|
+
* This avoids rebuilding indexes (~1-2 seconds for 18k keys) on every call.
|
|
227
|
+
*
|
|
228
|
+
* @param schema - The schema to build indexes from (typically the full dependency schema)
|
|
229
|
+
* @returns Indexes that can be passed to fillInDirectSchemaGapsAndUnknowns
|
|
230
|
+
*/
|
|
231
|
+
export function buildSchemaIndexes(
|
|
232
|
+
schema: Record<string, string>,
|
|
233
|
+
): SchemaIndexes {
|
|
234
|
+
// Build functionKeysMapping + prefixMaxDepth in a single pass
|
|
235
|
+
// Avoid repeated split/join work by caching parts and building prefixes incrementally.
|
|
236
|
+
const functionKeysMapping: Record<string, string[]> = {};
|
|
237
|
+
const prefixMaxDepth = new Map<string, number>();
|
|
238
|
+
const partsCache = new Map<string, string[]>();
|
|
239
|
+
|
|
240
|
+
for (const key in schema) {
|
|
241
|
+
const parts = getCachedParts(partsCache, key);
|
|
242
|
+
const lastPart = parts[parts.length - 1];
|
|
243
|
+
const prefixes = buildPrefixParts(parts);
|
|
244
|
+
|
|
245
|
+
if (
|
|
246
|
+
key.endsWith(')') ||
|
|
247
|
+
schema[key] === 'function' ||
|
|
248
|
+
lastPart === 'length'
|
|
249
|
+
) {
|
|
250
|
+
const allButLastPart = parts.length > 1 ? prefixes[parts.length - 2] : '';
|
|
251
|
+
functionKeysMapping[allButLastPart] ||= [];
|
|
252
|
+
functionKeysMapping[allButLastPart].push(lastPart);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
for (let i = 0; i < prefixes.length; i++) {
|
|
256
|
+
const prefix = prefixes[i];
|
|
257
|
+
const existingMax = prefixMaxDepth.get(prefix) ?? 0;
|
|
258
|
+
if (parts.length > existingMax) {
|
|
259
|
+
prefixMaxDepth.set(prefix, parts.length);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return { functionKeysMapping, prefixMaxDepth };
|
|
265
|
+
}
|
|
266
|
+
|
|
208
267
|
export function fillInDirectSchemaGapsAndUnknowns({
|
|
209
268
|
scopeName,
|
|
210
269
|
schema,
|
|
211
270
|
mergedSchema,
|
|
212
271
|
attempts = 0,
|
|
272
|
+
// Pre-built indexes from buildSchemaIndexes() - use for cross-call caching
|
|
273
|
+
prebuiltIndexes,
|
|
274
|
+
// Internal: pre-computed indexes to avoid rebuilding on recursion
|
|
275
|
+
_functionKeysMapping,
|
|
276
|
+
_prefixMaxDepth,
|
|
277
|
+
_partsCache,
|
|
278
|
+
_prefixPartsCache,
|
|
279
|
+
_knownTypeCache,
|
|
280
|
+
_guessTypeCache,
|
|
281
|
+
_nameHintCache,
|
|
213
282
|
}: {
|
|
214
283
|
scopeName?: string;
|
|
215
284
|
schema: Record<string, string>;
|
|
216
285
|
mergedSchema?: Record<string, string>;
|
|
217
286
|
attempts?: number;
|
|
287
|
+
/** Pre-built indexes from buildSchemaIndexes() - pass to reuse across multiple calls */
|
|
288
|
+
prebuiltIndexes?: SchemaIndexes;
|
|
289
|
+
// Internal: pre-computed indexes to avoid rebuilding on recursion (used by recursive calls)
|
|
290
|
+
_functionKeysMapping?: Record<string, string[]>;
|
|
291
|
+
_prefixMaxDepth?: Map<string, number>;
|
|
292
|
+
_partsCache?: Map<string, string[]>;
|
|
293
|
+
_prefixPartsCache?: Map<string, string[]>;
|
|
294
|
+
_knownTypeCache?: Map<string, string | undefined>;
|
|
295
|
+
_guessTypeCache?: Map<string, string | undefined>;
|
|
296
|
+
_nameHintCache?: Map<string, string | undefined>;
|
|
218
297
|
}) {
|
|
219
298
|
try {
|
|
220
299
|
const existingSchema = (path: any) => {
|
|
@@ -225,105 +304,239 @@ export function fillInDirectSchemaGapsAndUnknowns({
|
|
|
225
304
|
}
|
|
226
305
|
};
|
|
227
306
|
|
|
228
|
-
const
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
307
|
+
const partsCache = _partsCache ?? new Map<string, string[]>();
|
|
308
|
+
const prefixPartsCache = _prefixPartsCache ?? new Map<string, string[]>();
|
|
309
|
+
const knownTypeCache =
|
|
310
|
+
_knownTypeCache ?? new Map<string, string | undefined>();
|
|
311
|
+
const guessTypeCache =
|
|
312
|
+
_guessTypeCache ?? new Map<string, string | undefined>();
|
|
313
|
+
const nameHintCache =
|
|
314
|
+
_nameHintCache ?? new Map<string, string | undefined>();
|
|
315
|
+
|
|
316
|
+
const getParts = (path: string) => getCachedParts(partsCache, path);
|
|
317
|
+
const getPrefixParts = (path: string) => {
|
|
318
|
+
const cached = prefixPartsCache.get(path);
|
|
319
|
+
if (cached) return cached;
|
|
320
|
+
const prefixes = buildPrefixParts(getParts(path));
|
|
321
|
+
prefixPartsCache.set(path, prefixes);
|
|
322
|
+
return prefixes;
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
// Index resolution priority:
|
|
326
|
+
// 1. _functionKeysMapping/_prefixMaxDepth (from recursive calls within this invocation)
|
|
327
|
+
// 2. prebuiltIndexes (from cross-call caching - built once, reused across multiple calls)
|
|
328
|
+
// 3. Build new indexes (fallback - expensive for large schemas)
|
|
329
|
+
const functionKeysMapping =
|
|
330
|
+
_functionKeysMapping ??
|
|
331
|
+
prebuiltIndexes?.functionKeysMapping ??
|
|
332
|
+
(() => {
|
|
333
|
+
const mapping: Record<string, string[]> = {};
|
|
334
|
+
for (const key in schema) {
|
|
335
|
+
const parts = getParts(key);
|
|
238
336
|
const lastPart = parts[parts.length - 1];
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
337
|
+
if (
|
|
338
|
+
key.endsWith(')') ||
|
|
339
|
+
schema[key] === 'function' ||
|
|
340
|
+
lastPart === 'length'
|
|
341
|
+
) {
|
|
342
|
+
const prefixes = getPrefixParts(key);
|
|
343
|
+
const allButLastPart =
|
|
344
|
+
parts.length > 1 ? prefixes[parts.length - 2] : '';
|
|
345
|
+
mapping[allButLastPart] ||= [];
|
|
346
|
+
mapping[allButLastPart].push(lastPart);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return mapping;
|
|
350
|
+
})();
|
|
351
|
+
|
|
352
|
+
// Build prefix index for O(1) lookups in checkIfObjectOrFunction
|
|
353
|
+
// Maps each prefix to the max depth of keys that have this prefix
|
|
354
|
+
// This replaces O(n) scans with O(1) lookups, fixing the O(n²) bottleneck
|
|
355
|
+
let prefixMaxDepth =
|
|
356
|
+
_prefixMaxDepth ?? prebuiltIndexes?.prefixMaxDepth ?? null;
|
|
357
|
+
if (!prefixMaxDepth) {
|
|
358
|
+
prefixMaxDepth = new Map<string, number>();
|
|
359
|
+
const targetSchema = mergedSchema ?? schema;
|
|
360
|
+
for (const key in targetSchema) {
|
|
361
|
+
const keyParts = getParts(key);
|
|
362
|
+
const prefixes = buildPrefixParts(keyParts);
|
|
363
|
+
// Record each prefix of this key with its max depth
|
|
364
|
+
for (let i = 0; i < prefixes.length; i++) {
|
|
365
|
+
const prefix = prefixes[i];
|
|
366
|
+
const existingMax = prefixMaxDepth.get(prefix) ?? 0;
|
|
367
|
+
if (keyParts.length > existingMax) {
|
|
368
|
+
prefixMaxDepth.set(prefix, keyParts.length);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
245
373
|
|
|
246
|
-
|
|
247
|
-
const
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
374
|
+
// O(1) replacement for checkIfObjectOrFunction
|
|
375
|
+
const checkIfObjectOrFunctionFast = (path: string): string | undefined => {
|
|
376
|
+
const maxDepth = prefixMaxDepth!.get(path);
|
|
377
|
+
|
|
378
|
+
if (maxDepth === undefined) return undefined; // No key starts with this path
|
|
379
|
+
|
|
380
|
+
const pathParts = getParts(path);
|
|
381
|
+
// Check if path's last part ends with ')' → function
|
|
382
|
+
const lastPart = pathParts[pathParts.length - 1];
|
|
383
|
+
if (lastPart?.endsWith(')')) {
|
|
384
|
+
return 'function';
|
|
253
385
|
}
|
|
254
386
|
|
|
255
|
-
|
|
256
|
-
|
|
387
|
+
// Check if there are deeper keys
|
|
388
|
+
if (maxDepth > pathParts.length) {
|
|
389
|
+
return 'object';
|
|
257
390
|
}
|
|
258
391
|
|
|
259
|
-
|
|
260
|
-
|
|
392
|
+
return undefined;
|
|
393
|
+
};
|
|
261
394
|
|
|
395
|
+
let changeMade = false;
|
|
396
|
+
const getKnownType = (path: string) => {
|
|
397
|
+
if (knownTypeCache.has(path)) return knownTypeCache.get(path);
|
|
398
|
+
const known = checkIfKnownType(path, functionKeysMapping);
|
|
399
|
+
knownTypeCache.set(path, known);
|
|
400
|
+
return known;
|
|
401
|
+
};
|
|
402
|
+
const guessTypeFromName = (lastPart: string, defaultType: string) => {
|
|
403
|
+
if (nameHintCache.has(lastPart)) {
|
|
404
|
+
return nameHintCache.get(lastPart) ?? defaultType;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
let hint: string | undefined;
|
|
262
408
|
if (isLikelyBoolean(lastPart)) {
|
|
263
|
-
|
|
409
|
+
hint = 'boolean';
|
|
264
410
|
} else if (isLikelyDate(lastPart)) {
|
|
265
|
-
|
|
411
|
+
hint = 'date';
|
|
266
412
|
} else if (isLikelyAction(lastPart)) {
|
|
267
|
-
|
|
413
|
+
hint = 'function';
|
|
268
414
|
} else if (pluralize.isPlural(lastPart)) {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
415
|
+
// Default to number instead of array - safer for JSX rendering
|
|
416
|
+
// Arrays cause "Objects are not valid as a React child" errors when rendered directly
|
|
417
|
+
hint = 'number';
|
|
272
418
|
}
|
|
419
|
+
|
|
420
|
+
nameHintCache.set(lastPart, hint);
|
|
421
|
+
return hint ?? defaultType;
|
|
422
|
+
};
|
|
423
|
+
const guessTypeForPath = (path: string, defaultType = 'string') => {
|
|
424
|
+
const cacheKey = `${path}|${defaultType}`;
|
|
425
|
+
if (guessTypeCache.has(cacheKey)) {
|
|
426
|
+
return guessTypeCache.get(cacheKey);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
let knownType = getKnownType(path);
|
|
430
|
+
if (!knownType) {
|
|
431
|
+
// Use optimized O(1) prefix lookup instead of O(n) scan
|
|
432
|
+
knownType = checkIfObjectOrFunctionFast(path);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
if (knownType) {
|
|
436
|
+
guessTypeCache.set(cacheKey, knownType);
|
|
437
|
+
return knownType;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
const keyParts = getParts(path);
|
|
441
|
+
const lastPart = keyParts[keyParts.length - 1];
|
|
442
|
+
const guessed = guessTypeFromName(lastPart, defaultType);
|
|
443
|
+
guessTypeCache.set(cacheKey, guessed);
|
|
444
|
+
return guessed;
|
|
273
445
|
};
|
|
274
446
|
|
|
275
447
|
for (const key in schema) {
|
|
276
448
|
if (!schema[key]) schema[key] = 'unknown';
|
|
277
449
|
if (schema[key].includes(' | unknown')) {
|
|
278
|
-
|
|
279
|
-
|
|
450
|
+
const cleaned = schema[key].replace(' | unknown', '');
|
|
451
|
+
if (schema[key] !== cleaned) {
|
|
452
|
+
schema[key] = cleaned;
|
|
453
|
+
changeMade = true;
|
|
454
|
+
}
|
|
280
455
|
} else if (schema[key].startsWith('unknown | ')) {
|
|
281
456
|
// Handle "unknown | undefined" -> "string | undefined"
|
|
282
457
|
const remainingType = schema[key].substring('unknown | '.length);
|
|
283
458
|
const newType = guessTypeForPath(key, 'string');
|
|
284
459
|
if (newType) {
|
|
285
|
-
|
|
286
|
-
|
|
460
|
+
const replacement = `${newType} | ${remainingType}`;
|
|
461
|
+
if (schema[key] !== replacement) {
|
|
462
|
+
schema[key] = replacement;
|
|
463
|
+
changeMade = true;
|
|
464
|
+
}
|
|
287
465
|
}
|
|
288
466
|
} else if (schema[key] === 'unknown') {
|
|
289
467
|
const newType = guessTypeForPath(key, 'string');
|
|
290
|
-
|
|
468
|
+
// Don't convert 'unknown' to 'object' — 'object' is just inferred from
|
|
469
|
+
// having child properties, which isn't more useful than 'unknown' and
|
|
470
|
+
// prevents enrichment from filling in the actual type later.
|
|
471
|
+
if (newType && newType !== 'object' && schema[key] !== newType) {
|
|
291
472
|
schema[key] = newType;
|
|
292
473
|
changeMade = true;
|
|
293
474
|
}
|
|
294
475
|
}
|
|
295
476
|
|
|
296
|
-
const keyParts =
|
|
477
|
+
const keyParts = getParts(key);
|
|
478
|
+
const prefixParts = getPrefixParts(key);
|
|
297
479
|
for (let i = 0; i < keyParts.length; i++) {
|
|
298
|
-
|
|
299
|
-
const lastSubPathPart =
|
|
300
|
-
|
|
301
|
-
const
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
480
|
+
if (i === 0) continue;
|
|
481
|
+
const lastSubPathPart = keyParts[i];
|
|
482
|
+
const previousSubPath = prefixParts[i - 1];
|
|
483
|
+
const isSignatureIndex =
|
|
484
|
+
lastSubPathPart.includes('signature[') &&
|
|
485
|
+
SIGNATURE_INDEX_REGEX.test(lastSubPathPart);
|
|
486
|
+
|
|
487
|
+
if (lastSubPathPart.includes('[')) {
|
|
488
|
+
const cleaned = cleanOutBoundary(lastSubPathPart);
|
|
489
|
+
if (cleaned.match(/\[\d*\]/) && !isSignatureIndex) {
|
|
490
|
+
// Fix 39: Don't overwrite explicit 'object' types with 'array'
|
|
491
|
+
// This handles spurious [] paths from components like JsonNode that handle
|
|
492
|
+
// both arrays and objects. When metadata is explicitly typed as 'object',
|
|
493
|
+
// paths like metadata[] (from dynamic iteration) should not change it.
|
|
494
|
+
const existingType = schema[previousSubPath];
|
|
495
|
+
const baseType = existingType?.split(' | ')[0];
|
|
496
|
+
|
|
497
|
+
// Also check if this path has meaningful object property children (non-[] children).
|
|
498
|
+
// If it does, it's an object with mixed access patterns (e.g., agent.entries
|
|
499
|
+
// AND agent[].type), not a pure array. Don't infer 'array' in that case.
|
|
500
|
+
// Exclude .length since it exists on arrays too and is NOT evidence of object-ness.
|
|
501
|
+
let hasObjectPropertyChildren = false;
|
|
502
|
+
if (baseType !== 'array' && baseType !== 'object') {
|
|
503
|
+
const dotPrefix = previousSubPath + '.';
|
|
504
|
+
const lengthPath = previousSubPath + '.length';
|
|
505
|
+
for (const schemaKey in schema) {
|
|
506
|
+
if (
|
|
507
|
+
schemaKey.startsWith(dotPrefix) &&
|
|
508
|
+
schemaKey !== lengthPath
|
|
509
|
+
) {
|
|
510
|
+
hasObjectPropertyChildren = true;
|
|
511
|
+
break;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
if (
|
|
517
|
+
baseType !== 'array' &&
|
|
518
|
+
baseType !== 'object' &&
|
|
519
|
+
!hasObjectPropertyChildren
|
|
520
|
+
) {
|
|
521
|
+
// Preserve nullability from existing type (e.g., 'unknown | undefined' -> 'array | undefined')
|
|
522
|
+
let newType = 'array';
|
|
523
|
+
if (existingType?.includes(' | undefined')) {
|
|
524
|
+
newType = 'array | undefined';
|
|
525
|
+
} else if (existingType?.includes(' | null')) {
|
|
526
|
+
newType = 'array | null';
|
|
527
|
+
}
|
|
528
|
+
if (schema[previousSubPath] !== newType) {
|
|
529
|
+
schema[previousSubPath] = newType;
|
|
530
|
+
changeMade = true;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
320
533
|
}
|
|
321
534
|
}
|
|
322
535
|
|
|
323
536
|
const isFunction =
|
|
324
537
|
lastSubPathPart.endsWith(')') ||
|
|
325
538
|
lastSubPathPart === 'functionCallReturnValue' ||
|
|
326
|
-
|
|
539
|
+
isSignatureIndex;
|
|
327
540
|
|
|
328
541
|
if (
|
|
329
542
|
!isFunction &&
|
|
@@ -331,15 +544,36 @@ export function fillInDirectSchemaGapsAndUnknowns({
|
|
|
331
544
|
schema[previousSubPath],
|
|
332
545
|
)
|
|
333
546
|
) {
|
|
334
|
-
const
|
|
335
|
-
|
|
336
|
-
|
|
547
|
+
const existingType = schema[previousSubPath];
|
|
548
|
+
const baseExistingType = existingType?.split(' | ')[0];
|
|
549
|
+
// Skip if the base type is already a structured type
|
|
337
550
|
if (
|
|
338
|
-
!
|
|
339
|
-
|
|
551
|
+
!['object', 'array', 'function', 'async-function'].includes(
|
|
552
|
+
baseExistingType,
|
|
553
|
+
)
|
|
340
554
|
) {
|
|
341
|
-
|
|
342
|
-
|
|
555
|
+
let newValue = getKnownType(previousSubPath) ?? 'object';
|
|
556
|
+
// Don't overwrite 'unknown' with 'object' — 'object' is just
|
|
557
|
+
// inferred from child properties and isn't more useful than 'unknown'
|
|
558
|
+
if (
|
|
559
|
+
newValue === 'object' &&
|
|
560
|
+
existingType &&
|
|
561
|
+
existingType.split(' | ')[0] === 'unknown'
|
|
562
|
+
) {
|
|
563
|
+
// preserve existing 'unknown' (possibly with nullability)
|
|
564
|
+
} else {
|
|
565
|
+
// Preserve nullability from existing type
|
|
566
|
+
if (existingType?.includes(' | undefined')) {
|
|
567
|
+
newValue = `${newValue} | undefined`;
|
|
568
|
+
} else if (existingType?.includes(' | null')) {
|
|
569
|
+
newValue = `${newValue} | null`;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
if (!existingType || existingType !== newValue) {
|
|
573
|
+
schema[previousSubPath] = newValue;
|
|
574
|
+
changeMade = true;
|
|
575
|
+
}
|
|
576
|
+
}
|
|
343
577
|
}
|
|
344
578
|
}
|
|
345
579
|
|
|
@@ -347,8 +581,7 @@ export function fillInDirectSchemaGapsAndUnknowns({
|
|
|
347
581
|
if (isFunction && !existingSchema(previousSubPath)) {
|
|
348
582
|
schema[previousSubPath] = previousSubPath.endsWith(')')
|
|
349
583
|
? 'function'
|
|
350
|
-
: (
|
|
351
|
-
'object');
|
|
584
|
+
: (getKnownType(previousSubPath) ?? 'object');
|
|
352
585
|
changeMade = true;
|
|
353
586
|
}
|
|
354
587
|
|
|
@@ -358,10 +591,12 @@ export function fillInDirectSchemaGapsAndUnknowns({
|
|
|
358
591
|
const functionReturnValuePath = `${previousSubPath}.functionCallReturnValue`;
|
|
359
592
|
|
|
360
593
|
// Extract the method name from lastSubPathPart (e.g., "then()" -> "then")
|
|
361
|
-
const
|
|
362
|
-
const
|
|
363
|
-
|
|
364
|
-
|
|
594
|
+
const parenIndex = lastSubPathPart.indexOf('(');
|
|
595
|
+
const methodName =
|
|
596
|
+
parenIndex === -1
|
|
597
|
+
? lastSubPathPart
|
|
598
|
+
: lastSubPathPart.slice(0, parenIndex);
|
|
599
|
+
const isPromiseMethod = PROMISE_METHODS.has(methodName);
|
|
365
600
|
const isPreviousAsync = schema[previousSubPath] === 'async-function';
|
|
366
601
|
|
|
367
602
|
// Don't set to 'function' if this is a promise method on an async function
|
|
@@ -386,6 +621,15 @@ export function fillInDirectSchemaGapsAndUnknowns({
|
|
|
386
621
|
schema,
|
|
387
622
|
mergedSchema,
|
|
388
623
|
attempts: ++attempts,
|
|
624
|
+
prebuiltIndexes,
|
|
625
|
+
// Pass pre-computed indexes to avoid rebuilding on each recursive call
|
|
626
|
+
_functionKeysMapping: functionKeysMapping,
|
|
627
|
+
_prefixMaxDepth: prefixMaxDepth,
|
|
628
|
+
_partsCache: partsCache,
|
|
629
|
+
_prefixPartsCache: prefixPartsCache,
|
|
630
|
+
_knownTypeCache: knownTypeCache,
|
|
631
|
+
_guessTypeCache: guessTypeCache,
|
|
632
|
+
_nameHintCache: nameHintCache,
|
|
389
633
|
});
|
|
390
634
|
}
|
|
391
635
|
|
|
@@ -395,9 +639,10 @@ export function fillInDirectSchemaGapsAndUnknowns({
|
|
|
395
639
|
// However, if the parent could be an 'object' or other type, keep .length as it may be
|
|
396
640
|
// a custom property.
|
|
397
641
|
for (const key of Object.keys(schema)) {
|
|
398
|
-
const parts =
|
|
642
|
+
const parts = getParts(key);
|
|
399
643
|
if (parts[parts.length - 1] === 'length') {
|
|
400
|
-
const
|
|
644
|
+
const prefixes = getPrefixParts(key);
|
|
645
|
+
const parentPath = parts.length > 1 ? prefixes[parts.length - 2] : '';
|
|
401
646
|
const parentType = schema[parentPath];
|
|
402
647
|
if (parentType) {
|
|
403
648
|
// Split union types and filter out nullable parts
|
|
@@ -434,6 +679,35 @@ export function fillInDirectSchemaGapsAndUnknowns({
|
|
|
434
679
|
}
|
|
435
680
|
}
|
|
436
681
|
|
|
682
|
+
const SIGNATURE_INDEX_REGEX = /signature\[\d+\]/;
|
|
683
|
+
const PROMISE_METHODS = new Set(['then', 'catch', 'finally']);
|
|
684
|
+
|
|
685
|
+
function getCachedParts(cache: Map<string, string[]>, path: string): string[] {
|
|
686
|
+
const cached = cache.get(path);
|
|
687
|
+
if (cached) return cached;
|
|
688
|
+
const parts = splitOutsideParenthesesAndArrays(path);
|
|
689
|
+
cache.set(path, parts);
|
|
690
|
+
return parts;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
function buildPrefixParts(parts: string[]): string[] {
|
|
694
|
+
if (parts.length === 0) return [];
|
|
695
|
+
const prefixes = new Array(parts.length);
|
|
696
|
+
let prefix = '';
|
|
697
|
+
for (let i = 0; i < parts.length; i++) {
|
|
698
|
+
const part = parts[i];
|
|
699
|
+
if (i === 0) {
|
|
700
|
+
prefix = part;
|
|
701
|
+
} else if (part.startsWith('[') || part.startsWith('(')) {
|
|
702
|
+
prefix += part;
|
|
703
|
+
} else {
|
|
704
|
+
prefix += `.${part}`;
|
|
705
|
+
}
|
|
706
|
+
prefixes[i] = prefix;
|
|
707
|
+
}
|
|
708
|
+
return prefixes;
|
|
709
|
+
}
|
|
710
|
+
|
|
437
711
|
function checkIfObjectOrFunction(path: string, schema: ScopeNode['schema']) {
|
|
438
712
|
const pathParts = splitOutsideParenthesesAndArrays(path);
|
|
439
713
|
for (const structureKey in schema) {
|
|
@@ -486,6 +760,17 @@ const STRONG_ARRAY_METHODS = new Set([
|
|
|
486
760
|
'with',
|
|
487
761
|
]);
|
|
488
762
|
|
|
763
|
+
/**
|
|
764
|
+
* Check if a method call argument looks like a string literal.
|
|
765
|
+
* String literals start with ' or " (e.g., includes('foo'), indexOf("bar"))
|
|
766
|
+
*/
|
|
767
|
+
function hasStringLiteralArgument(methodCall: string): boolean {
|
|
768
|
+
const parenIndex = methodCall.indexOf('(');
|
|
769
|
+
if (parenIndex === -1) return false;
|
|
770
|
+
const arg = methodCall.slice(parenIndex + 1).trim();
|
|
771
|
+
return arg.startsWith("'") || arg.startsWith('"') || arg.startsWith('`');
|
|
772
|
+
}
|
|
773
|
+
|
|
489
774
|
function checkIfKnownType(
|
|
490
775
|
key: string,
|
|
491
776
|
functionAndAttributesKeysMapping: Record<string, string[]>,
|
|
@@ -495,19 +780,20 @@ function checkIfKnownType(
|
|
|
495
780
|
let hasStrongArrayEvidence = false;
|
|
496
781
|
let hasOnlyAmbiguousArrayMethods = true;
|
|
497
782
|
let hasLengthAccess = false;
|
|
498
|
-
let
|
|
783
|
+
let hasIncludesOrIndexOfWithVariable = false;
|
|
784
|
+
|
|
785
|
+
const entries = functionAndAttributesKeysMapping[key];
|
|
786
|
+
if (!entries || entries.length === 0) return;
|
|
499
787
|
|
|
500
|
-
for (const functionOrAttributeName of
|
|
501
|
-
[]) {
|
|
788
|
+
for (const functionOrAttributeName of entries) {
|
|
502
789
|
// Extract the method name without arguments for checking against ambiguous list
|
|
503
790
|
const methodName = functionOrAttributeName.split('(')[0].trim();
|
|
504
791
|
|
|
792
|
+
const knownType = knownMethodCalls(functionOrAttributeName);
|
|
505
793
|
const couldBeArray =
|
|
506
|
-
|
|
507
|
-
functionOrAttributeName === 'length';
|
|
794
|
+
knownType.includes('array') || functionOrAttributeName === 'length';
|
|
508
795
|
const couldBeString =
|
|
509
|
-
|
|
510
|
-
functionOrAttributeName === 'length';
|
|
796
|
+
knownType.includes('string') || functionOrAttributeName === 'length';
|
|
511
797
|
|
|
512
798
|
// Track .length access
|
|
513
799
|
if (functionOrAttributeName === 'length') {
|
|
@@ -515,8 +801,15 @@ function checkIfKnownType(
|
|
|
515
801
|
}
|
|
516
802
|
|
|
517
803
|
// Track methods that exist on both arrays and strings (like includes, indexOf)
|
|
518
|
-
if (
|
|
519
|
-
|
|
804
|
+
// Check if .includes() or .indexOf() is called with a variable argument (not a string literal).
|
|
805
|
+
// Pattern: arr.includes(item) -> likely array (checking if item exists)
|
|
806
|
+
// Pattern: str.includes('substring') -> likely string (checking for substring)
|
|
807
|
+
if (
|
|
808
|
+
(methodName === 'includes' || methodName === 'indexOf') &&
|
|
809
|
+
functionOrAttributeName.includes('(') &&
|
|
810
|
+
!hasStringLiteralArgument(functionOrAttributeName)
|
|
811
|
+
) {
|
|
812
|
+
hasIncludesOrIndexOfWithVariable = true;
|
|
520
813
|
}
|
|
521
814
|
|
|
522
815
|
// Check if this is strong evidence of an array (unambiguous array methods)
|
|
@@ -549,18 +842,21 @@ function checkIfKnownType(
|
|
|
549
842
|
return 'array';
|
|
550
843
|
}
|
|
551
844
|
|
|
552
|
-
// When
|
|
553
|
-
//
|
|
554
|
-
//
|
|
555
|
-
//
|
|
556
|
-
if (isArray &&
|
|
845
|
+
// When .includes() or .indexOf() is called with a variable argument, prefer array.
|
|
846
|
+
// Pattern: arr.includes(item) -> likely array (checking if item exists in collection)
|
|
847
|
+
// String literals are already filtered by hasStringLiteralArgument, so if we get here
|
|
848
|
+
// with a variable argument, it's strong evidence of array membership testing.
|
|
849
|
+
if (isArray && hasIncludesOrIndexOfWithVariable) {
|
|
557
850
|
return 'array';
|
|
558
851
|
}
|
|
559
852
|
|
|
853
|
+
// When both array and string are possible, prefer string.
|
|
854
|
+
// Strings have .length, .slice(), .includes(), etc. just like arrays.
|
|
855
|
+
// We only infer 'array' if we have STRONG evidence (like .map, .filter, .reduce).
|
|
560
856
|
if (isString) return 'string';
|
|
561
857
|
|
|
562
|
-
// Only infer array if we have strong evidence
|
|
563
|
-
//
|
|
858
|
+
// Only infer array if we have strong evidence (already handled above)
|
|
859
|
+
// or non-ambiguous array methods that don't exist on strings
|
|
564
860
|
if (isArray && !hasOnlyAmbiguousArrayMethods) {
|
|
565
861
|
return 'array';
|
|
566
862
|
}
|