@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
|
@@ -121,7 +121,11 @@ export default function fillInSchemaGapsAndUnknowns(scopeNode, fillInUnknowns =
|
|
|
121
121
|
lastSubPathPart.match(/signature\[\d+\]/);
|
|
122
122
|
if (!isFunction &&
|
|
123
123
|
!['object', 'array', 'function', 'async-function'].includes(schema[previousSubPath])) {
|
|
124
|
-
|
|
124
|
+
// When fillInUnknowns=false, add missing gaps as 'unknown' to preserve raw schema.
|
|
125
|
+
// When fillInUnknowns=true, infer the type using checkIfKnownType.
|
|
126
|
+
const newValue = fillInUnknowns
|
|
127
|
+
? (checkIfKnownType(previousSubPath, functionKeysMapping) ?? 'object')
|
|
128
|
+
: 'unknown';
|
|
125
129
|
if (!schema[previousSubPath] ||
|
|
126
130
|
(fillInUnknowns && schema[previousSubPath] !== newValue)) {
|
|
127
131
|
schema[previousSubPath] = newValue;
|
|
@@ -130,10 +134,14 @@ export default function fillInSchemaGapsAndUnknowns(scopeNode, fillInUnknowns =
|
|
|
130
134
|
}
|
|
131
135
|
// Handle the wrong function chaining function().function()
|
|
132
136
|
if (isFunction && !existingSchema(previousSubPath)) {
|
|
137
|
+
// When fillInUnknowns=false, use 'unknown' for non-function paths.
|
|
138
|
+
// When fillInUnknowns=true, infer the type.
|
|
133
139
|
schema[previousSubPath] = previousSubPath.endsWith(')')
|
|
134
140
|
? 'function'
|
|
135
|
-
:
|
|
136
|
-
|
|
141
|
+
: fillInUnknowns
|
|
142
|
+
? (checkIfKnownType(previousSubPath, functionKeysMapping) ??
|
|
143
|
+
'object')
|
|
144
|
+
: 'unknown';
|
|
137
145
|
changeMade = true;
|
|
138
146
|
}
|
|
139
147
|
// Handle function chains: if we have x().y(), set x().functionCallReturnValue to 'function'
|
|
@@ -160,7 +168,45 @@ export default function fillInSchemaGapsAndUnknowns(scopeNode, fillInUnknowns =
|
|
|
160
168
|
fillInSchemaGapsAndUnknowns(scopeNode, fillInUnknowns, ++attempts);
|
|
161
169
|
}
|
|
162
170
|
}
|
|
163
|
-
|
|
171
|
+
/**
|
|
172
|
+
* Build indexes for a schema that can be reused across multiple calls.
|
|
173
|
+
* This avoids rebuilding indexes (~1-2 seconds for 18k keys) on every call.
|
|
174
|
+
*
|
|
175
|
+
* @param schema - The schema to build indexes from (typically the full dependency schema)
|
|
176
|
+
* @returns Indexes that can be passed to fillInDirectSchemaGapsAndUnknowns
|
|
177
|
+
*/
|
|
178
|
+
export function buildSchemaIndexes(schema) {
|
|
179
|
+
// Build functionKeysMapping + prefixMaxDepth in a single pass
|
|
180
|
+
// Avoid repeated split/join work by caching parts and building prefixes incrementally.
|
|
181
|
+
const functionKeysMapping = {};
|
|
182
|
+
const prefixMaxDepth = new Map();
|
|
183
|
+
const partsCache = new Map();
|
|
184
|
+
for (const key in schema) {
|
|
185
|
+
const parts = getCachedParts(partsCache, key);
|
|
186
|
+
const lastPart = parts[parts.length - 1];
|
|
187
|
+
const prefixes = buildPrefixParts(parts);
|
|
188
|
+
if (key.endsWith(')') ||
|
|
189
|
+
schema[key] === 'function' ||
|
|
190
|
+
lastPart === 'length') {
|
|
191
|
+
const allButLastPart = parts.length > 1 ? prefixes[parts.length - 2] : '';
|
|
192
|
+
functionKeysMapping[allButLastPart] || (functionKeysMapping[allButLastPart] = []);
|
|
193
|
+
functionKeysMapping[allButLastPart].push(lastPart);
|
|
194
|
+
}
|
|
195
|
+
for (let i = 0; i < prefixes.length; i++) {
|
|
196
|
+
const prefix = prefixes[i];
|
|
197
|
+
const existingMax = prefixMaxDepth.get(prefix) ?? 0;
|
|
198
|
+
if (parts.length > existingMax) {
|
|
199
|
+
prefixMaxDepth.set(prefix, parts.length);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return { functionKeysMapping, prefixMaxDepth };
|
|
204
|
+
}
|
|
205
|
+
export function fillInDirectSchemaGapsAndUnknowns({ scopeName, schema, mergedSchema, attempts = 0,
|
|
206
|
+
// Pre-built indexes from buildSchemaIndexes() - use for cross-call caching
|
|
207
|
+
prebuiltIndexes,
|
|
208
|
+
// Internal: pre-computed indexes to avoid rebuilding on recursion
|
|
209
|
+
_functionKeysMapping, _prefixMaxDepth, _partsCache, _prefixPartsCache, _knownTypeCache, _guessTypeCache, _nameHintCache, }) {
|
|
164
210
|
try {
|
|
165
211
|
const existingSchema = (path) => {
|
|
166
212
|
const options = [path, `${scopeName}.${path}`, `${scopeName}().${path}`];
|
|
@@ -169,112 +215,250 @@ export function fillInDirectSchemaGapsAndUnknowns({ scopeName, schema, mergedSch
|
|
|
169
215
|
return schema[option];
|
|
170
216
|
}
|
|
171
217
|
};
|
|
172
|
-
const
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
218
|
+
const partsCache = _partsCache ?? new Map();
|
|
219
|
+
const prefixPartsCache = _prefixPartsCache ?? new Map();
|
|
220
|
+
const knownTypeCache = _knownTypeCache ?? new Map();
|
|
221
|
+
const guessTypeCache = _guessTypeCache ?? new Map();
|
|
222
|
+
const nameHintCache = _nameHintCache ?? new Map();
|
|
223
|
+
const getParts = (path) => getCachedParts(partsCache, path);
|
|
224
|
+
const getPrefixParts = (path) => {
|
|
225
|
+
const cached = prefixPartsCache.get(path);
|
|
226
|
+
if (cached)
|
|
227
|
+
return cached;
|
|
228
|
+
const prefixes = buildPrefixParts(getParts(path));
|
|
229
|
+
prefixPartsCache.set(path, prefixes);
|
|
230
|
+
return prefixes;
|
|
231
|
+
};
|
|
232
|
+
// Index resolution priority:
|
|
233
|
+
// 1. _functionKeysMapping/_prefixMaxDepth (from recursive calls within this invocation)
|
|
234
|
+
// 2. prebuiltIndexes (from cross-call caching - built once, reused across multiple calls)
|
|
235
|
+
// 3. Build new indexes (fallback - expensive for large schemas)
|
|
236
|
+
const functionKeysMapping = _functionKeysMapping ??
|
|
237
|
+
prebuiltIndexes?.functionKeysMapping ??
|
|
238
|
+
(() => {
|
|
239
|
+
const mapping = {};
|
|
240
|
+
for (const key in schema) {
|
|
241
|
+
const parts = getParts(key);
|
|
242
|
+
const lastPart = parts[parts.length - 1];
|
|
243
|
+
if (key.endsWith(')') ||
|
|
244
|
+
schema[key] === 'function' ||
|
|
245
|
+
lastPart === 'length') {
|
|
246
|
+
const prefixes = getPrefixParts(key);
|
|
247
|
+
const allButLastPart = parts.length > 1 ? prefixes[parts.length - 2] : '';
|
|
248
|
+
mapping[allButLastPart] || (mapping[allButLastPart] = []);
|
|
249
|
+
mapping[allButLastPart].push(lastPart);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return mapping;
|
|
253
|
+
})();
|
|
254
|
+
// Build prefix index for O(1) lookups in checkIfObjectOrFunction
|
|
255
|
+
// Maps each prefix to the max depth of keys that have this prefix
|
|
256
|
+
// This replaces O(n) scans with O(1) lookups, fixing the O(n²) bottleneck
|
|
257
|
+
let prefixMaxDepth = _prefixMaxDepth ?? prebuiltIndexes?.prefixMaxDepth ?? null;
|
|
258
|
+
if (!prefixMaxDepth) {
|
|
259
|
+
prefixMaxDepth = new Map();
|
|
260
|
+
const targetSchema = mergedSchema ?? schema;
|
|
261
|
+
for (const key in targetSchema) {
|
|
262
|
+
const keyParts = getParts(key);
|
|
263
|
+
const prefixes = buildPrefixParts(keyParts);
|
|
264
|
+
// Record each prefix of this key with its max depth
|
|
265
|
+
for (let i = 0; i < prefixes.length; i++) {
|
|
266
|
+
const prefix = prefixes[i];
|
|
267
|
+
const existingMax = prefixMaxDepth.get(prefix) ?? 0;
|
|
268
|
+
if (keyParts.length > existingMax) {
|
|
269
|
+
prefixMaxDepth.set(prefix, keyParts.length);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
195
272
|
}
|
|
196
|
-
|
|
197
|
-
|
|
273
|
+
}
|
|
274
|
+
// O(1) replacement for checkIfObjectOrFunction
|
|
275
|
+
const checkIfObjectOrFunctionFast = (path) => {
|
|
276
|
+
const maxDepth = prefixMaxDepth.get(path);
|
|
277
|
+
if (maxDepth === undefined)
|
|
278
|
+
return undefined; // No key starts with this path
|
|
279
|
+
const pathParts = getParts(path);
|
|
280
|
+
// Check if path's last part ends with ')' → function
|
|
281
|
+
const lastPart = pathParts[pathParts.length - 1];
|
|
282
|
+
if (lastPart?.endsWith(')')) {
|
|
283
|
+
return 'function';
|
|
198
284
|
}
|
|
199
|
-
|
|
200
|
-
|
|
285
|
+
// Check if there are deeper keys
|
|
286
|
+
if (maxDepth > pathParts.length) {
|
|
287
|
+
return 'object';
|
|
288
|
+
}
|
|
289
|
+
return undefined;
|
|
290
|
+
};
|
|
291
|
+
let changeMade = false;
|
|
292
|
+
const getKnownType = (path) => {
|
|
293
|
+
if (knownTypeCache.has(path))
|
|
294
|
+
return knownTypeCache.get(path);
|
|
295
|
+
const known = checkIfKnownType(path, functionKeysMapping);
|
|
296
|
+
knownTypeCache.set(path, known);
|
|
297
|
+
return known;
|
|
298
|
+
};
|
|
299
|
+
const guessTypeFromName = (lastPart, defaultType) => {
|
|
300
|
+
if (nameHintCache.has(lastPart)) {
|
|
301
|
+
return nameHintCache.get(lastPart) ?? defaultType;
|
|
302
|
+
}
|
|
303
|
+
let hint;
|
|
201
304
|
if (isLikelyBoolean(lastPart)) {
|
|
202
|
-
|
|
305
|
+
hint = 'boolean';
|
|
203
306
|
}
|
|
204
307
|
else if (isLikelyDate(lastPart)) {
|
|
205
|
-
|
|
308
|
+
hint = 'date';
|
|
206
309
|
}
|
|
207
310
|
else if (isLikelyAction(lastPart)) {
|
|
208
|
-
|
|
311
|
+
hint = 'function';
|
|
209
312
|
}
|
|
210
313
|
else if (pluralize.isPlural(lastPart)) {
|
|
211
|
-
|
|
314
|
+
// Default to number instead of array - safer for JSX rendering
|
|
315
|
+
// Arrays cause "Objects are not valid as a React child" errors when rendered directly
|
|
316
|
+
hint = 'number';
|
|
317
|
+
}
|
|
318
|
+
nameHintCache.set(lastPart, hint);
|
|
319
|
+
return hint ?? defaultType;
|
|
320
|
+
};
|
|
321
|
+
const guessTypeForPath = (path, defaultType = 'string') => {
|
|
322
|
+
const cacheKey = `${path}|${defaultType}`;
|
|
323
|
+
if (guessTypeCache.has(cacheKey)) {
|
|
324
|
+
return guessTypeCache.get(cacheKey);
|
|
325
|
+
}
|
|
326
|
+
let knownType = getKnownType(path);
|
|
327
|
+
if (!knownType) {
|
|
328
|
+
// Use optimized O(1) prefix lookup instead of O(n) scan
|
|
329
|
+
knownType = checkIfObjectOrFunctionFast(path);
|
|
212
330
|
}
|
|
213
|
-
|
|
214
|
-
|
|
331
|
+
if (knownType) {
|
|
332
|
+
guessTypeCache.set(cacheKey, knownType);
|
|
333
|
+
return knownType;
|
|
215
334
|
}
|
|
335
|
+
const keyParts = getParts(path);
|
|
336
|
+
const lastPart = keyParts[keyParts.length - 1];
|
|
337
|
+
const guessed = guessTypeFromName(lastPart, defaultType);
|
|
338
|
+
guessTypeCache.set(cacheKey, guessed);
|
|
339
|
+
return guessed;
|
|
216
340
|
};
|
|
217
341
|
for (const key in schema) {
|
|
218
342
|
if (!schema[key])
|
|
219
343
|
schema[key] = 'unknown';
|
|
220
344
|
if (schema[key].includes(' | unknown')) {
|
|
221
|
-
|
|
222
|
-
|
|
345
|
+
const cleaned = schema[key].replace(' | unknown', '');
|
|
346
|
+
if (schema[key] !== cleaned) {
|
|
347
|
+
schema[key] = cleaned;
|
|
348
|
+
changeMade = true;
|
|
349
|
+
}
|
|
223
350
|
}
|
|
224
351
|
else if (schema[key].startsWith('unknown | ')) {
|
|
225
352
|
// Handle "unknown | undefined" -> "string | undefined"
|
|
226
353
|
const remainingType = schema[key].substring('unknown | '.length);
|
|
227
354
|
const newType = guessTypeForPath(key, 'string');
|
|
228
355
|
if (newType) {
|
|
229
|
-
|
|
230
|
-
|
|
356
|
+
const replacement = `${newType} | ${remainingType}`;
|
|
357
|
+
if (schema[key] !== replacement) {
|
|
358
|
+
schema[key] = replacement;
|
|
359
|
+
changeMade = true;
|
|
360
|
+
}
|
|
231
361
|
}
|
|
232
362
|
}
|
|
233
363
|
else if (schema[key] === 'unknown') {
|
|
234
364
|
const newType = guessTypeForPath(key, 'string');
|
|
235
|
-
|
|
365
|
+
// Don't convert 'unknown' to 'object' — 'object' is just inferred from
|
|
366
|
+
// having child properties, which isn't more useful than 'unknown' and
|
|
367
|
+
// prevents enrichment from filling in the actual type later.
|
|
368
|
+
if (newType && newType !== 'object' && schema[key] !== newType) {
|
|
236
369
|
schema[key] = newType;
|
|
237
370
|
changeMade = true;
|
|
238
371
|
}
|
|
239
372
|
}
|
|
240
|
-
const keyParts =
|
|
373
|
+
const keyParts = getParts(key);
|
|
374
|
+
const prefixParts = getPrefixParts(key);
|
|
241
375
|
for (let i = 0; i < keyParts.length; i++) {
|
|
242
|
-
|
|
243
|
-
const lastSubPathPart = subPathParts[subPathParts.length - 1];
|
|
244
|
-
const previousSubPathParts = subPathParts.slice(0, i);
|
|
245
|
-
if (previousSubPathParts.length === 0)
|
|
376
|
+
if (i === 0)
|
|
246
377
|
continue;
|
|
247
|
-
const
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
378
|
+
const lastSubPathPart = keyParts[i];
|
|
379
|
+
const previousSubPath = prefixParts[i - 1];
|
|
380
|
+
const isSignatureIndex = lastSubPathPart.includes('signature[') &&
|
|
381
|
+
SIGNATURE_INDEX_REGEX.test(lastSubPathPart);
|
|
382
|
+
if (lastSubPathPart.includes('[')) {
|
|
383
|
+
const cleaned = cleanOutBoundary(lastSubPathPart);
|
|
384
|
+
if (cleaned.match(/\[\d*\]/) && !isSignatureIndex) {
|
|
385
|
+
// Fix 39: Don't overwrite explicit 'object' types with 'array'
|
|
386
|
+
// This handles spurious [] paths from components like JsonNode that handle
|
|
387
|
+
// both arrays and objects. When metadata is explicitly typed as 'object',
|
|
388
|
+
// paths like metadata[] (from dynamic iteration) should not change it.
|
|
389
|
+
const existingType = schema[previousSubPath];
|
|
390
|
+
const baseType = existingType?.split(' | ')[0];
|
|
391
|
+
// Also check if this path has meaningful object property children (non-[] children).
|
|
392
|
+
// If it does, it's an object with mixed access patterns (e.g., agent.entries
|
|
393
|
+
// AND agent[].type), not a pure array. Don't infer 'array' in that case.
|
|
394
|
+
// Exclude .length since it exists on arrays too and is NOT evidence of object-ness.
|
|
395
|
+
let hasObjectPropertyChildren = false;
|
|
396
|
+
if (baseType !== 'array' && baseType !== 'object') {
|
|
397
|
+
const dotPrefix = previousSubPath + '.';
|
|
398
|
+
const lengthPath = previousSubPath + '.length';
|
|
399
|
+
for (const schemaKey in schema) {
|
|
400
|
+
if (schemaKey.startsWith(dotPrefix) &&
|
|
401
|
+
schemaKey !== lengthPath) {
|
|
402
|
+
hasObjectPropertyChildren = true;
|
|
403
|
+
break;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
if (baseType !== 'array' &&
|
|
408
|
+
baseType !== 'object' &&
|
|
409
|
+
!hasObjectPropertyChildren) {
|
|
410
|
+
// Preserve nullability from existing type (e.g., 'unknown | undefined' -> 'array | undefined')
|
|
411
|
+
let newType = 'array';
|
|
412
|
+
if (existingType?.includes(' | undefined')) {
|
|
413
|
+
newType = 'array | undefined';
|
|
414
|
+
}
|
|
415
|
+
else if (existingType?.includes(' | null')) {
|
|
416
|
+
newType = 'array | null';
|
|
417
|
+
}
|
|
418
|
+
if (schema[previousSubPath] !== newType) {
|
|
419
|
+
schema[previousSubPath] = newType;
|
|
420
|
+
changeMade = true;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
258
423
|
}
|
|
259
424
|
}
|
|
260
425
|
const isFunction = lastSubPathPart.endsWith(')') ||
|
|
261
426
|
lastSubPathPart === 'functionCallReturnValue' ||
|
|
262
|
-
|
|
427
|
+
isSignatureIndex;
|
|
263
428
|
if (!isFunction &&
|
|
264
429
|
!['object', 'array', 'function', 'async-function'].includes(schema[previousSubPath])) {
|
|
265
|
-
const
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
430
|
+
const existingType = schema[previousSubPath];
|
|
431
|
+
const baseExistingType = existingType?.split(' | ')[0];
|
|
432
|
+
// Skip if the base type is already a structured type
|
|
433
|
+
if (!['object', 'array', 'function', 'async-function'].includes(baseExistingType)) {
|
|
434
|
+
let newValue = getKnownType(previousSubPath) ?? 'object';
|
|
435
|
+
// Don't overwrite 'unknown' with 'object' — 'object' is just
|
|
436
|
+
// inferred from child properties and isn't more useful than 'unknown'
|
|
437
|
+
if (newValue === 'object' &&
|
|
438
|
+
existingType &&
|
|
439
|
+
existingType.split(' | ')[0] === 'unknown') {
|
|
440
|
+
// preserve existing 'unknown' (possibly with nullability)
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
// Preserve nullability from existing type
|
|
444
|
+
if (existingType?.includes(' | undefined')) {
|
|
445
|
+
newValue = `${newValue} | undefined`;
|
|
446
|
+
}
|
|
447
|
+
else if (existingType?.includes(' | null')) {
|
|
448
|
+
newValue = `${newValue} | null`;
|
|
449
|
+
}
|
|
450
|
+
if (!existingType || existingType !== newValue) {
|
|
451
|
+
schema[previousSubPath] = newValue;
|
|
452
|
+
changeMade = true;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
270
455
|
}
|
|
271
456
|
}
|
|
272
457
|
// Handle the wrong function chaining function().function()
|
|
273
458
|
if (isFunction && !existingSchema(previousSubPath)) {
|
|
274
459
|
schema[previousSubPath] = previousSubPath.endsWith(')')
|
|
275
460
|
? 'function'
|
|
276
|
-
: (
|
|
277
|
-
'object');
|
|
461
|
+
: (getKnownType(previousSubPath) ?? 'object');
|
|
278
462
|
changeMade = true;
|
|
279
463
|
}
|
|
280
464
|
// Handle function chains: if we have x().y(), set x().functionCallReturnValue to 'function'
|
|
@@ -282,8 +466,11 @@ export function fillInDirectSchemaGapsAndUnknowns({ scopeName, schema, mergedSch
|
|
|
282
466
|
if (lastSubPathPart.endsWith(')') && previousSubPath.endsWith(')')) {
|
|
283
467
|
const functionReturnValuePath = `${previousSubPath}.functionCallReturnValue`;
|
|
284
468
|
// Extract the method name from lastSubPathPart (e.g., "then()" -> "then")
|
|
285
|
-
const
|
|
286
|
-
const
|
|
469
|
+
const parenIndex = lastSubPathPart.indexOf('(');
|
|
470
|
+
const methodName = parenIndex === -1
|
|
471
|
+
? lastSubPathPart
|
|
472
|
+
: lastSubPathPart.slice(0, parenIndex);
|
|
473
|
+
const isPromiseMethod = PROMISE_METHODS.has(methodName);
|
|
287
474
|
const isPreviousAsync = schema[previousSubPath] === 'async-function';
|
|
288
475
|
// Don't set to 'function' if this is a promise method on an async function
|
|
289
476
|
// (we want the awaited value, not the promise)
|
|
@@ -304,6 +491,15 @@ export function fillInDirectSchemaGapsAndUnknowns({ scopeName, schema, mergedSch
|
|
|
304
491
|
schema,
|
|
305
492
|
mergedSchema,
|
|
306
493
|
attempts: ++attempts,
|
|
494
|
+
prebuiltIndexes,
|
|
495
|
+
// Pass pre-computed indexes to avoid rebuilding on each recursive call
|
|
496
|
+
_functionKeysMapping: functionKeysMapping,
|
|
497
|
+
_prefixMaxDepth: prefixMaxDepth,
|
|
498
|
+
_partsCache: partsCache,
|
|
499
|
+
_prefixPartsCache: prefixPartsCache,
|
|
500
|
+
_knownTypeCache: knownTypeCache,
|
|
501
|
+
_guessTypeCache: guessTypeCache,
|
|
502
|
+
_nameHintCache: nameHintCache,
|
|
307
503
|
});
|
|
308
504
|
}
|
|
309
505
|
// Remove .length paths when the parent is typed as 'array' or 'string' (or nullable variants).
|
|
@@ -312,9 +508,10 @@ export function fillInDirectSchemaGapsAndUnknowns({ scopeName, schema, mergedSch
|
|
|
312
508
|
// However, if the parent could be an 'object' or other type, keep .length as it may be
|
|
313
509
|
// a custom property.
|
|
314
510
|
for (const key of Object.keys(schema)) {
|
|
315
|
-
const parts =
|
|
511
|
+
const parts = getParts(key);
|
|
316
512
|
if (parts[parts.length - 1] === 'length') {
|
|
317
|
-
const
|
|
513
|
+
const prefixes = getPrefixParts(key);
|
|
514
|
+
const parentPath = parts.length > 1 ? prefixes[parts.length - 2] : '';
|
|
318
515
|
const parentType = schema[parentPath];
|
|
319
516
|
if (parentType) {
|
|
320
517
|
// Split union types and filter out nullable parts
|
|
@@ -339,6 +536,36 @@ export function fillInDirectSchemaGapsAndUnknowns({ scopeName, schema, mergedSch
|
|
|
339
536
|
throw error;
|
|
340
537
|
}
|
|
341
538
|
}
|
|
539
|
+
const SIGNATURE_INDEX_REGEX = /signature\[\d+\]/;
|
|
540
|
+
const PROMISE_METHODS = new Set(['then', 'catch', 'finally']);
|
|
541
|
+
function getCachedParts(cache, path) {
|
|
542
|
+
const cached = cache.get(path);
|
|
543
|
+
if (cached)
|
|
544
|
+
return cached;
|
|
545
|
+
const parts = splitOutsideParenthesesAndArrays(path);
|
|
546
|
+
cache.set(path, parts);
|
|
547
|
+
return parts;
|
|
548
|
+
}
|
|
549
|
+
function buildPrefixParts(parts) {
|
|
550
|
+
if (parts.length === 0)
|
|
551
|
+
return [];
|
|
552
|
+
const prefixes = new Array(parts.length);
|
|
553
|
+
let prefix = '';
|
|
554
|
+
for (let i = 0; i < parts.length; i++) {
|
|
555
|
+
const part = parts[i];
|
|
556
|
+
if (i === 0) {
|
|
557
|
+
prefix = part;
|
|
558
|
+
}
|
|
559
|
+
else if (part.startsWith('[') || part.startsWith('(')) {
|
|
560
|
+
prefix += part;
|
|
561
|
+
}
|
|
562
|
+
else {
|
|
563
|
+
prefix += `.${part}`;
|
|
564
|
+
}
|
|
565
|
+
prefixes[i] = prefix;
|
|
566
|
+
}
|
|
567
|
+
return prefixes;
|
|
568
|
+
}
|
|
342
569
|
function checkIfObjectOrFunction(path, schema) {
|
|
343
570
|
const pathParts = splitOutsideParenthesesAndArrays(path);
|
|
344
571
|
for (const structureKey in schema) {
|
|
@@ -389,28 +616,45 @@ const STRONG_ARRAY_METHODS = new Set([
|
|
|
389
616
|
'toSpliced',
|
|
390
617
|
'with',
|
|
391
618
|
]);
|
|
619
|
+
/**
|
|
620
|
+
* Check if a method call argument looks like a string literal.
|
|
621
|
+
* String literals start with ' or " (e.g., includes('foo'), indexOf("bar"))
|
|
622
|
+
*/
|
|
623
|
+
function hasStringLiteralArgument(methodCall) {
|
|
624
|
+
const parenIndex = methodCall.indexOf('(');
|
|
625
|
+
if (parenIndex === -1)
|
|
626
|
+
return false;
|
|
627
|
+
const arg = methodCall.slice(parenIndex + 1).trim();
|
|
628
|
+
return arg.startsWith("'") || arg.startsWith('"') || arg.startsWith('`');
|
|
629
|
+
}
|
|
392
630
|
function checkIfKnownType(key, functionAndAttributesKeysMapping) {
|
|
393
631
|
let isArray;
|
|
394
632
|
let isString;
|
|
395
633
|
let hasStrongArrayEvidence = false;
|
|
396
634
|
let hasOnlyAmbiguousArrayMethods = true;
|
|
397
635
|
let hasLengthAccess = false;
|
|
398
|
-
let
|
|
399
|
-
|
|
400
|
-
|
|
636
|
+
let hasIncludesOrIndexOfWithVariable = false;
|
|
637
|
+
const entries = functionAndAttributesKeysMapping[key];
|
|
638
|
+
if (!entries || entries.length === 0)
|
|
639
|
+
return;
|
|
640
|
+
for (const functionOrAttributeName of entries) {
|
|
401
641
|
// Extract the method name without arguments for checking against ambiguous list
|
|
402
642
|
const methodName = functionOrAttributeName.split('(')[0].trim();
|
|
403
|
-
const
|
|
404
|
-
|
|
405
|
-
const couldBeString =
|
|
406
|
-
functionOrAttributeName === 'length';
|
|
643
|
+
const knownType = knownMethodCalls(functionOrAttributeName);
|
|
644
|
+
const couldBeArray = knownType.includes('array') || functionOrAttributeName === 'length';
|
|
645
|
+
const couldBeString = knownType.includes('string') || functionOrAttributeName === 'length';
|
|
407
646
|
// Track .length access
|
|
408
647
|
if (functionOrAttributeName === 'length') {
|
|
409
648
|
hasLengthAccess = true;
|
|
410
649
|
}
|
|
411
650
|
// Track methods that exist on both arrays and strings (like includes, indexOf)
|
|
412
|
-
if (
|
|
413
|
-
|
|
651
|
+
// Check if .includes() or .indexOf() is called with a variable argument (not a string literal).
|
|
652
|
+
// Pattern: arr.includes(item) -> likely array (checking if item exists)
|
|
653
|
+
// Pattern: str.includes('substring') -> likely string (checking for substring)
|
|
654
|
+
if ((methodName === 'includes' || methodName === 'indexOf') &&
|
|
655
|
+
functionOrAttributeName.includes('(') &&
|
|
656
|
+
!hasStringLiteralArgument(functionOrAttributeName)) {
|
|
657
|
+
hasIncludesOrIndexOfWithVariable = true;
|
|
414
658
|
}
|
|
415
659
|
// Check if this is strong evidence of an array (unambiguous array methods)
|
|
416
660
|
if (STRONG_ARRAY_METHODS.has(methodName)) {
|
|
@@ -437,17 +681,20 @@ function checkIfKnownType(key, functionAndAttributesKeysMapping) {
|
|
|
437
681
|
if (isArray && hasStrongArrayEvidence) {
|
|
438
682
|
return 'array';
|
|
439
683
|
}
|
|
440
|
-
// When
|
|
441
|
-
//
|
|
442
|
-
//
|
|
443
|
-
//
|
|
444
|
-
if (isArray &&
|
|
684
|
+
// When .includes() or .indexOf() is called with a variable argument, prefer array.
|
|
685
|
+
// Pattern: arr.includes(item) -> likely array (checking if item exists in collection)
|
|
686
|
+
// String literals are already filtered by hasStringLiteralArgument, so if we get here
|
|
687
|
+
// with a variable argument, it's strong evidence of array membership testing.
|
|
688
|
+
if (isArray && hasIncludesOrIndexOfWithVariable) {
|
|
445
689
|
return 'array';
|
|
446
690
|
}
|
|
691
|
+
// When both array and string are possible, prefer string.
|
|
692
|
+
// Strings have .length, .slice(), .includes(), etc. just like arrays.
|
|
693
|
+
// We only infer 'array' if we have STRONG evidence (like .map, .filter, .reduce).
|
|
447
694
|
if (isString)
|
|
448
695
|
return 'string';
|
|
449
|
-
// Only infer array if we have strong evidence
|
|
450
|
-
//
|
|
696
|
+
// Only infer array if we have strong evidence (already handled above)
|
|
697
|
+
// or non-ambiguous array methods that don't exist on strings
|
|
451
698
|
if (isArray && !hasOnlyAmbiguousArrayMethods) {
|
|
452
699
|
return 'array';
|
|
453
700
|
}
|