@codeyam/codeyam-cli 0.1.0-staging.323686 → 0.1.0-staging.4813bf3

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.
Files changed (444) hide show
  1. package/analyzer-template/.build-info.json +7 -7
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +5 -5
  4. package/analyzer-template/packages/ai/index.ts +7 -1
  5. package/analyzer-template/packages/ai/package.json +2 -2
  6. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +62 -18
  7. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +67 -9
  8. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.ts +10 -17
  9. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +409 -50
  10. package/analyzer-template/packages/ai/src/lib/astScopes/sharedPatterns.ts +28 -0
  11. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +21 -6
  12. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +992 -249
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +5 -1
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +16 -3
  15. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
  16. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +31 -3
  17. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +37 -15
  18. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.ts +70 -0
  19. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +126 -11
  20. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +179 -0
  21. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.ts +40 -30
  22. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +367 -96
  23. package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +33 -15
  24. package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +58 -3
  25. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +315 -6
  26. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +9 -5
  27. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +49 -5
  28. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
  29. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +649 -142
  30. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +1 -1
  31. package/analyzer-template/packages/ai/src/lib/isolateScopes.ts +51 -3
  32. package/analyzer-template/packages/ai/src/lib/mergeJsonTypeDefinitions.ts +5 -0
  33. package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +90 -96
  34. package/analyzer-template/packages/ai/src/lib/promptGenerators/collapseNullableObjects.ts +118 -0
  35. package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
  36. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +24 -4
  37. package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +25 -13
  38. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +4 -3
  39. package/analyzer-template/packages/analyze/index.ts +2 -0
  40. package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +65 -59
  41. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +113 -26
  42. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
  43. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
  44. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
  45. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
  46. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
  47. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
  48. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +89 -9
  49. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +19 -4
  50. package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
  51. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +0 -3
  52. package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
  53. package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
  54. package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +1315 -0
  55. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +61 -13
  56. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +37 -0
  57. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +229 -19
  58. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +117 -9
  59. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +459 -39
  60. package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
  61. package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
  62. package/analyzer-template/packages/analyze/src/lib/index.ts +1 -0
  63. package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
  64. package/analyzer-template/packages/aws/package.json +1 -1
  65. package/analyzer-template/packages/database/package.json +1 -1
  66. package/analyzer-template/packages/database/src/lib/analysisBranchToDb.ts +1 -1
  67. package/analyzer-template/packages/database/src/lib/analysisToDb.ts +1 -1
  68. package/analyzer-template/packages/database/src/lib/branchToDb.ts +1 -1
  69. package/analyzer-template/packages/database/src/lib/commitBranchToDb.ts +1 -1
  70. package/analyzer-template/packages/database/src/lib/commitToDb.ts +1 -1
  71. package/analyzer-template/packages/database/src/lib/fileToDb.ts +1 -1
  72. package/analyzer-template/packages/database/src/lib/kysely/db.ts +6 -0
  73. package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +1 -1
  74. package/analyzer-template/packages/database/src/lib/kysely/tables/labsRequestsTable.ts +52 -0
  75. package/analyzer-template/packages/database/src/lib/projectToDb.ts +1 -1
  76. package/analyzer-template/packages/database/src/lib/saveFiles.ts +1 -1
  77. package/analyzer-template/packages/database/src/lib/scenarioToDb.ts +1 -1
  78. package/analyzer-template/packages/database/src/lib/userScenarioToDb.ts +1 -1
  79. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js +1 -1
  80. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js.map +1 -1
  81. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js +1 -1
  82. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js.map +1 -1
  83. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js +1 -1
  84. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js.map +1 -1
  85. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js +1 -1
  86. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js.map +1 -1
  87. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js +1 -1
  88. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js.map +1 -1
  89. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js +1 -1
  90. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js.map +1 -1
  91. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -0
  92. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
  93. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +3 -0
  94. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
  95. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts +1 -1
  96. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts +23 -0
  97. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts.map +1 -0
  98. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  99. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  100. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js +1 -1
  101. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js.map +1 -1
  102. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js +1 -1
  103. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js.map +1 -1
  104. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js +1 -1
  105. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js.map +1 -1
  106. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +7 -0
  107. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  108. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
  109. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  110. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  111. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  112. package/analyzer-template/packages/github/package.json +1 -1
  113. package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +7 -0
  114. package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +6 -5
  115. package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
  116. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +7 -0
  117. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  118. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
  119. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  120. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  121. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  122. package/analyzer-template/project/constructMockCode.ts +90 -10
  123. package/analyzer-template/project/writeMockDataTsx.ts +181 -8
  124. package/analyzer-template/project/writeScenarioComponents.ts +60 -12
  125. package/analyzer-template/project/writeSimpleRoot.ts +21 -11
  126. package/background/src/lib/local/createLocalAnalyzer.js +1 -1
  127. package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
  128. package/background/src/lib/virtualized/project/constructMockCode.js +75 -4
  129. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  130. package/background/src/lib/virtualized/project/writeMockDataTsx.js +162 -4
  131. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  132. package/background/src/lib/virtualized/project/writeScenarioComponents.js +60 -15
  133. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  134. package/background/src/lib/virtualized/project/writeSimpleRoot.js +21 -11
  135. package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
  136. package/codeyam-cli/scripts/apply-setup.js +180 -0
  137. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  138. package/codeyam-cli/src/cli.js +2 -0
  139. package/codeyam-cli/src/cli.js.map +1 -1
  140. package/codeyam-cli/src/codeyam-cli.js +18 -2
  141. package/codeyam-cli/src/codeyam-cli.js.map +1 -1
  142. package/codeyam-cli/src/commands/analyze.js +4 -2
  143. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  144. package/codeyam-cli/src/commands/baseline.js +2 -0
  145. package/codeyam-cli/src/commands/baseline.js.map +1 -1
  146. package/codeyam-cli/src/commands/debug.js +9 -5
  147. package/codeyam-cli/src/commands/debug.js.map +1 -1
  148. package/codeyam-cli/src/commands/default.js +31 -20
  149. package/codeyam-cli/src/commands/default.js.map +1 -1
  150. package/codeyam-cli/src/commands/detect-universal-mocks.js +2 -0
  151. package/codeyam-cli/src/commands/detect-universal-mocks.js.map +1 -1
  152. package/codeyam-cli/src/commands/init.js +49 -257
  153. package/codeyam-cli/src/commands/init.js.map +1 -1
  154. package/codeyam-cli/src/commands/memory.js +17 -26
  155. package/codeyam-cli/src/commands/memory.js.map +1 -1
  156. package/codeyam-cli/src/commands/recapture.js +2 -0
  157. package/codeyam-cli/src/commands/recapture.js.map +1 -1
  158. package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
  159. package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
  160. package/codeyam-cli/src/commands/setup-simulations.js +284 -0
  161. package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
  162. package/codeyam-cli/src/commands/test-startup.js +2 -0
  163. package/codeyam-cli/src/commands/test-startup.js.map +1 -1
  164. package/codeyam-cli/src/commands/verify.js +14 -2
  165. package/codeyam-cli/src/commands/verify.js.map +1 -1
  166. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +128 -86
  167. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  168. package/codeyam-cli/src/utils/analyzer.js +7 -0
  169. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  170. package/codeyam-cli/src/utils/backgroundServer.js +5 -0
  171. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  172. package/codeyam-cli/src/utils/generateReport.js +2 -2
  173. package/codeyam-cli/src/utils/install-skills.js +70 -45
  174. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  175. package/codeyam-cli/src/utils/labsAutoCheck.js +19 -0
  176. package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -0
  177. package/codeyam-cli/src/utils/progress.js +7 -0
  178. package/codeyam-cli/src/utils/progress.js.map +1 -1
  179. package/codeyam-cli/src/utils/queue/job.js +4 -0
  180. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  181. package/codeyam-cli/src/utils/requireSimulations.js +10 -0
  182. package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
  183. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js +82 -0
  184. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js.map +1 -0
  185. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +230 -0
  186. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -0
  187. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +67 -0
  188. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -0
  189. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js +105 -0
  190. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js.map +1 -0
  191. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js +34 -0
  192. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js.map +1 -0
  193. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js +162 -0
  194. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js.map +1 -0
  195. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +75 -0
  196. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -0
  197. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +378 -0
  198. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -0
  199. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +115 -0
  200. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -0
  201. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js +127 -0
  202. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js.map +1 -0
  203. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js +50 -0
  204. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js.map +1 -0
  205. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +116 -0
  206. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -0
  207. package/codeyam-cli/src/utils/ruleReflection/index.js +5 -0
  208. package/codeyam-cli/src/utils/ruleReflection/index.js.map +1 -0
  209. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js +44 -0
  210. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js.map +1 -0
  211. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js +85 -0
  212. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js.map +1 -0
  213. package/codeyam-cli/src/utils/ruleReflection/types.js +5 -0
  214. package/codeyam-cli/src/utils/ruleReflection/types.js.map +1 -0
  215. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +293 -0
  216. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -0
  217. package/codeyam-cli/src/utils/rules/index.js +1 -0
  218. package/codeyam-cli/src/utils/rules/index.js.map +1 -1
  219. package/codeyam-cli/src/utils/rules/parser.js +2 -25
  220. package/codeyam-cli/src/utils/rules/parser.js.map +1 -1
  221. package/codeyam-cli/src/utils/rules/ruleState.js +150 -0
  222. package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
  223. package/codeyam-cli/src/utils/rules/staleness.js +16 -11
  224. package/codeyam-cli/src/utils/rules/staleness.js.map +1 -1
  225. package/codeyam-cli/src/utils/serverState.js +37 -10
  226. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  227. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +21 -44
  228. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  229. package/codeyam-cli/src/webserver/app/lib/database.js +15 -3
  230. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  231. package/codeyam-cli/src/webserver/backgroundServer.js +24 -0
  232. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  233. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-CA3JxPb7.js +1 -0
  234. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-DsN1wKrm.js → EntityItem-B86KKU7e.js} +1 -1
  235. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-DLqD3qNt.js → EntityTypeBadge-B5ctlSYt.js} +1 -1
  236. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-Ba2JVPzP.js → EntityTypeIcon-BqY8gDAW.js} +1 -1
  237. package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-C8lyxW9k.js → InlineSpinner-ClaLpuOo.js} +1 -1
  238. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-aht4aafF.js → InteractivePreview-BDhPilK7.js} +2 -2
  239. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CVtiBnY5.js → LibraryFunctionPreview-VeqEBv9v.js} +1 -1
  240. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-B0GLXMsr.js → LoadingDots-Bs7Nn1Jr.js} +1 -1
  241. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-xgeCVgSM.js → LogViewer-Bm3PmcCz.js} +1 -1
  242. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-OApQuNyq.js → ReportIssueModal-CgMEzchJ.js} +3 -8
  243. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-DuDvi0jm.js → SafeScreenshot-Gq3Ocjo6.js} +1 -1
  244. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DzccYyI8.js → ScenarioViewer-CBui0id_.js} +2 -2
  245. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-DyFZkK0l.js → TruncatedFilePath-CiwXDxLh.js} +1 -1
  246. package/codeyam-cli/src/webserver/build/client/assets/{_index-BwqWJOgH.js → _index-B3TDXxnk.js} +1 -1
  247. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BwavGCpm.js → activity.(_tab)-BtBFH820.js} +6 -11
  248. package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-CN61MOMa.js +11 -0
  249. package/codeyam-cli/src/webserver/build/client/assets/api.agent-transcripts-l0sNRNKZ.js +1 -0
  250. package/codeyam-cli/src/webserver/build/client/assets/api.labs-unlock-l0sNRNKZ.js +1 -0
  251. package/codeyam-cli/src/webserver/build/client/assets/api.save-fixture-l0sNRNKZ.js +1 -0
  252. package/codeyam-cli/src/webserver/build/client/assets/book-open-PttOB2SF.js +6 -0
  253. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-Cx24_aWc.js → chevron-down-TJp6ofnp.js} +1 -1
  254. package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-CXRTFQ3F.js → chunk-JZWAC4HX-JE9ZIoBl.js} +12 -12
  255. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BOARzkeR.js → circle-check-CXhHQYrI.js} +1 -1
  256. package/codeyam-cli/src/webserver/build/client/assets/copy-6y9ALfGT.js +11 -0
  257. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-BdhJEx6B.js → createLucideIcon-Ca9fAY46.js} +1 -1
  258. package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-BBnGWYga.js → dev.empty-C0epRiVn.js} +1 -1
  259. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-BJUiQqZF.js → entity._sha._-BVnB8a9L.js} +10 -10
  260. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js → entity._sha.scenarios._scenarioId.fullscreen-CBoafmVs.js} +1 -1
  261. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-D1T4TGjf.js → entity._sha_.create-scenario-DGgZjdFg.js} +1 -1
  262. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CTBG2mmz.js → entity._sha_.edit._scenarioId-38yPijoD.js} +1 -1
  263. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CS2cb_eZ.js → entry.client-BSHEfydn.js} +1 -1
  264. package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DMJ7zii9.js → fileTableUtils-DCPhhSMo.js} +1 -1
  265. package/codeyam-cli/src/webserver/build/client/assets/{files-CJ6lTdTA.js → files-0N0YJQv7.js} +1 -1
  266. package/codeyam-cli/src/webserver/build/client/assets/{git-CPTZZ-JZ.js → git-DXnyr8uP.js} +1 -1
  267. package/codeyam-cli/src/webserver/build/client/assets/globals-CKT08Djd.css +1 -0
  268. package/codeyam-cli/src/webserver/build/client/assets/{index-lzqtyFU8.js → index-CcsFv748.js} +1 -1
  269. package/codeyam-cli/src/webserver/build/client/assets/{index-B1h680n5.js → index-ChN9-fAY.js} +1 -1
  270. package/codeyam-cli/src/webserver/build/client/assets/labs-BLJ7HxOC.js +1 -0
  271. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-B7B9V-bu.js → loader-circle-CTqLEAGU.js} +1 -1
  272. package/codeyam-cli/src/webserver/build/client/assets/manifest-b171b9d3.js +1 -0
  273. package/codeyam-cli/src/webserver/build/client/assets/memory-CCQd4aZA.js +78 -0
  274. package/codeyam-cli/src/webserver/build/client/assets/pause-D6vreykR.js +11 -0
  275. package/codeyam-cli/src/webserver/build/client/assets/root-CHhiHoo_.js +62 -0
  276. package/codeyam-cli/src/webserver/build/client/assets/{search-CxXUmBSd.js → search-B8VUL8nl.js} +1 -1
  277. package/codeyam-cli/src/webserver/build/client/assets/settings-BejnUJ6R.js +1 -0
  278. package/codeyam-cli/src/webserver/build/client/assets/{simulations-DwFIBT09.js → simulations-CPoAg7Zo.js} +1 -1
  279. package/codeyam-cli/src/webserver/build/client/assets/terminal-BrCP7uQo.js +11 -0
  280. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-B6LgvRJg.js → triangle-alert-BZz2NjYa.js} +1 -1
  281. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-C1v1PQzo.js → useCustomSizes-DNwUduNu.js} +1 -1
  282. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-aSv48UbS.js → useLastLogLine-COky1GVF.js} +1 -1
  283. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-DYxHZQuP.js → useReportContext-CpZgwliL.js} +1 -1
  284. package/codeyam-cli/src/webserver/build/client/assets/{useToast-mBRpZPiu.js → useToast-Bv9JFvUO.js} +1 -1
  285. package/codeyam-cli/src/webserver/build/server/assets/{index-DVzYx8PN.js → index-8Fv-lH1-.js} +1 -1
  286. package/codeyam-cli/src/webserver/build/server/assets/server-build-Akn3iYFP.js +257 -0
  287. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  288. package/codeyam-cli/src/webserver/build-info.json +5 -5
  289. package/codeyam-cli/templates/{codeyam:debug.md → codeyam-debug.md} +1 -1
  290. package/codeyam-cli/templates/codeyam-diagnose.md +481 -0
  291. package/codeyam-cli/templates/codeyam-memory-hook.sh +19 -20
  292. package/codeyam-cli/templates/codeyam-memory.md +392 -0
  293. package/codeyam-cli/templates/codeyam-new-rule.md +13 -0
  294. package/codeyam-cli/templates/{codeyam:setup.md → codeyam-setup.md} +13 -1
  295. package/codeyam-cli/templates/{codeyam:sim.md → codeyam-sim.md} +1 -1
  296. package/codeyam-cli/templates/{codeyam:test.md → codeyam-test.md} +1 -1
  297. package/codeyam-cli/templates/{codeyam:verify.md → codeyam-verify.md} +1 -1
  298. package/codeyam-cli/templates/rule-notification-hook.py +56 -0
  299. package/codeyam-cli/templates/rule-reflection-hook.py +627 -0
  300. package/codeyam-cli/templates/rules-instructions.md +132 -0
  301. package/package.json +2 -2
  302. package/packages/ai/index.js +3 -2
  303. package/packages/ai/index.js.map +1 -1
  304. package/packages/ai/src/lib/analyzeScope.js +50 -13
  305. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  306. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +54 -8
  307. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  308. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js +10 -14
  309. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js.map +1 -1
  310. package/packages/ai/src/lib/astScopes/processExpression.js +317 -44
  311. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  312. package/packages/ai/src/lib/astScopes/sharedPatterns.js +25 -0
  313. package/packages/ai/src/lib/astScopes/sharedPatterns.js.map +1 -1
  314. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +763 -171
  315. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  316. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +5 -1
  317. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
  318. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
  319. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
  320. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
  321. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
  322. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +33 -3
  323. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  324. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +36 -11
  325. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  326. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js +63 -0
  327. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js.map +1 -0
  328. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +113 -11
  329. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
  330. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +173 -0
  331. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
  332. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
  333. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
  334. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +309 -84
  335. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  336. package/packages/ai/src/lib/dataStructureChunking.js +26 -11
  337. package/packages/ai/src/lib/dataStructureChunking.js.map +1 -1
  338. package/packages/ai/src/lib/generateEntityDataStructure.js +46 -2
  339. package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
  340. package/packages/ai/src/lib/generateEntityScenarioData.js +227 -4
  341. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  342. package/packages/ai/src/lib/generateEntityScenarios.js +7 -1
  343. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  344. package/packages/ai/src/lib/generateExecutionFlows.js +26 -4
  345. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  346. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +447 -80
  347. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
  348. package/packages/ai/src/lib/isolateScopes.js +39 -3
  349. package/packages/ai/src/lib/isolateScopes.js.map +1 -1
  350. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js +5 -0
  351. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js.map +1 -1
  352. package/packages/ai/src/lib/mergeStatements.js +70 -51
  353. package/packages/ai/src/lib/mergeStatements.js.map +1 -1
  354. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js +97 -0
  355. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js.map +1 -0
  356. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
  357. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  358. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +17 -2
  359. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  360. package/packages/ai/src/lib/resolvePathToControllable.js +24 -14
  361. package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
  362. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  363. package/packages/analyze/index.js +1 -0
  364. package/packages/analyze/index.js.map +1 -1
  365. package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
  366. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  367. package/packages/analyze/src/lib/ProjectAnalyzer.js +96 -26
  368. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  369. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
  370. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
  371. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
  372. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
  373. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
  374. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
  375. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
  376. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
  377. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
  378. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
  379. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
  380. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
  381. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +65 -7
  382. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  383. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +17 -4
  384. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  385. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
  386. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  387. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +0 -3
  388. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  389. package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
  390. package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
  391. package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
  392. package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
  393. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +880 -0
  394. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -0
  395. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +56 -10
  396. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  397. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +33 -8
  398. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  399. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +150 -17
  400. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  401. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +56 -8
  402. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  403. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +399 -31
  404. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  405. package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
  406. package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
  407. package/packages/analyze/src/lib/index.js +1 -0
  408. package/packages/analyze/src/lib/index.js.map +1 -1
  409. package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
  410. package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
  411. package/packages/database/src/lib/analysisBranchToDb.js +1 -1
  412. package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
  413. package/packages/database/src/lib/analysisToDb.js +1 -1
  414. package/packages/database/src/lib/analysisToDb.js.map +1 -1
  415. package/packages/database/src/lib/branchToDb.js +1 -1
  416. package/packages/database/src/lib/branchToDb.js.map +1 -1
  417. package/packages/database/src/lib/commitBranchToDb.js +1 -1
  418. package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
  419. package/packages/database/src/lib/commitToDb.js +1 -1
  420. package/packages/database/src/lib/commitToDb.js.map +1 -1
  421. package/packages/database/src/lib/fileToDb.js +1 -1
  422. package/packages/database/src/lib/fileToDb.js.map +1 -1
  423. package/packages/database/src/lib/kysely/db.js +3 -0
  424. package/packages/database/src/lib/kysely/db.js.map +1 -1
  425. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  426. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  427. package/packages/database/src/lib/projectToDb.js +1 -1
  428. package/packages/database/src/lib/projectToDb.js.map +1 -1
  429. package/packages/database/src/lib/saveFiles.js +1 -1
  430. package/packages/database/src/lib/saveFiles.js.map +1 -1
  431. package/packages/database/src/lib/scenarioToDb.js +1 -1
  432. package/packages/database/src/lib/scenarioToDb.js.map +1 -1
  433. package/scripts/finalize-analyzer.cjs +8 -76
  434. package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +0 -6
  435. package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +0 -6
  436. package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +0 -1
  437. package/codeyam-cli/src/webserver/build/client/assets/manifest-7522edd4.js +0 -1
  438. package/codeyam-cli/src/webserver/build/client/assets/memory-yxFcrxBX.js +0 -92
  439. package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +0 -62
  440. package/codeyam-cli/src/webserver/build/client/assets/settings-CS5f3WzT.js +0 -1
  441. package/codeyam-cli/src/webserver/build/server/assets/server-build-4Cr0uToj.js +0 -257
  442. package/codeyam-cli/templates/codeyam:diagnose.md +0 -803
  443. package/codeyam-cli/templates/codeyam:memory.md +0 -462
  444. package/codeyam-cli/templates/codeyam:new-rule.md +0 -13
@@ -19,7 +19,7 @@ export interface GenerateFlowsFromJsxUsagesArgs {
19
19
  /** Map of controllable paths to their types */
20
20
  attributesMap: Record<string, string>;
21
21
  /** Map from local variable names to data sources */
22
- equivalentSignatureVariables: Record<string, string>;
22
+ equivalentSignatureVariables: Record<string, string | string[]>;
23
23
  /** Map from full paths to short paths */
24
24
  fullToShortPathMap: Record<string, string>;
25
25
  /** Structure map for type lookup */
@@ -743,6 +743,48 @@ function processScope({
743
743
  };
744
744
  }
745
745
 
746
+ /**
747
+ * Check if a code string contains only type declarations (type aliases, interfaces, etc.)
748
+ * that don't contribute to runtime behavior. This is used to determine if the root scope
749
+ * should be considered "empty" for scope extraction purposes.
750
+ */
751
+ function containsOnlyTypeDeclarations(code: string): boolean {
752
+ try {
753
+ const sourceFile = ts.createSourceFile(
754
+ 'temp.ts',
755
+ code,
756
+ ts.ScriptTarget.Latest,
757
+ true,
758
+ ts.ScriptKind.TS,
759
+ );
760
+
761
+ // Check each statement - if any is NOT a type-only declaration, return false
762
+ for (const statement of sourceFile.statements) {
763
+ if (
764
+ ts.isTypeAliasDeclaration(statement) ||
765
+ ts.isInterfaceDeclaration(statement) ||
766
+ ts.isEnumDeclaration(statement) ||
767
+ // Import declarations that are type-only
768
+ (ts.isImportDeclaration(statement) &&
769
+ statement.importClause?.isTypeOnly) ||
770
+ // Export declarations that are type-only
771
+ (ts.isExportDeclaration(statement) && statement.isTypeOnly)
772
+ ) {
773
+ // This is a type-only declaration, continue checking
774
+ continue;
775
+ }
776
+ // Found a non-type statement
777
+ return false;
778
+ }
779
+
780
+ // All statements are type-only (or there are no statements)
781
+ return sourceFile.statements.length > 0;
782
+ } catch {
783
+ // If parsing fails, assume it's not type-only
784
+ return false;
785
+ }
786
+ }
787
+
746
788
  /**
747
789
  * Main entry point.
748
790
  *
@@ -792,9 +834,15 @@ export default function isolateScopes(
792
834
  const jsxLimit = options?.jsxLimit ?? 10;
793
835
  processJSXForScope(isolatedScopes, generateSyntheticName, jsxLimit);
794
836
 
795
- // If the root scope text is empty and there's only one child scope,
796
- // return that child scope as the root scope
797
- if (isolatedScopes.text.trim().length === 0) {
837
+ // If the root scope text is empty (or only contains type declarations) and there's
838
+ // only one child scope, return that child scope as the root scope.
839
+ // Type declarations (type aliases, interfaces) don't contribute to runtime behavior,
840
+ // so we treat them as "empty" for scope extraction purposes.
841
+ const rootTextIsEffectivelyEmpty =
842
+ isolatedScopes.text.trim().length === 0 ||
843
+ containsOnlyTypeDeclarations(isolatedScopes.text);
844
+
845
+ if (rootTextIsEffectivelyEmpty) {
798
846
  const childScopeArray = Object.values(isolatedScopes.childScopes);
799
847
  if (childScopeArray.length === 1) {
800
848
  return childScopeArray[0];
@@ -11,6 +11,11 @@ export default function mergeJsonTypeDefinitions(
11
11
  if (!typeDef) continue;
12
12
  if (typeof typeDef === 'string') continue;
13
13
  for (const [key, value] of Object.entries(typeDef)) {
14
+ // Preserve _nullable boolean markers set by convertDotNotation
15
+ if (key === '_nullable' && typeof value === 'boolean') {
16
+ mergedDef[key] = value;
17
+ continue;
18
+ }
14
19
  if (typeof value === 'string') {
15
20
  if (!mergedDef[key]) {
16
21
  mergedDef[key] = value;
@@ -7,58 +7,12 @@ import {
7
7
 
8
8
  export interface Statement {
9
9
  structure: { [key: string]: string };
10
- equivalentVariables: { [key: string]: string };
10
+ // Supports multiple equivalencies per key for OR expressions (e.g., x = a || b)
11
+ equivalentVariables: { [key: string]: string | string[] };
11
12
  llmCall?: LlmCall;
12
13
  }
13
14
 
14
15
  export default function mergeStatements(statements: Statement[]) {
15
- // Debug: Log input statements to understand what we're merging
16
- const hasStateStructure = statements.some((s) =>
17
- Object.keys(s.structure || {}).some(
18
- (k) => k === 'state' || k.includes('state'),
19
- ),
20
- );
21
- const hasStateEquiv = statements.some((s) =>
22
- Object.keys(s.equivalentVariables || {}).some(
23
- (k) => k === 'state' || k.includes('state'),
24
- ),
25
- );
26
- if (hasStateStructure || hasStateEquiv) {
27
- console.log(
28
- `[UNION-TYPE] mergeStatements INPUT: ${statements.length} statements`,
29
- );
30
- statements.forEach((s, i) => {
31
- const stateInStructure = Object.entries(s.structure || {}).filter(
32
- ([k]) => k === 'state' || k.includes('state'),
33
- );
34
- const stateInEquiv = Object.entries(s.equivalentVariables || {}).filter(
35
- ([k]) => k === 'state' || k.includes('state'),
36
- );
37
- const sigInEquiv = Object.entries(s.equivalentVariables || {}).filter(
38
- ([k, v]) => k === 'state' || v === 'signature[0]',
39
- );
40
- if (
41
- stateInStructure.length > 0 ||
42
- stateInEquiv.length > 0 ||
43
- sigInEquiv.length > 0
44
- ) {
45
- console.log(`[UNION-TYPE] Statement ${i}:`);
46
- if (stateInStructure.length > 0)
47
- console.log(
48
- `[UNION-TYPE] structure: ${JSON.stringify(Object.fromEntries(stateInStructure))}`,
49
- );
50
- if (stateInEquiv.length > 0)
51
- console.log(
52
- `[UNION-TYPE] equivalentVariables (state): ${JSON.stringify(Object.fromEntries(stateInEquiv))}`,
53
- );
54
- if (sigInEquiv.length > 0)
55
- console.log(
56
- `[UNION-TYPE] equivalentVariables (sig): ${JSON.stringify(Object.fromEntries(sigInEquiv))}`,
57
- );
58
- }
59
- });
60
- }
61
-
62
16
  // This should be handled by the AST Analyzer but it currently has a bug
63
17
  const ensureFunctionCallReturnValue = (path: string, value: string) => {
64
18
  if (path.endsWith(')') && value !== 'function') {
@@ -172,12 +126,54 @@ export default function mergeStatements(statements: Statement[]) {
172
126
  // settingsData → fetcher.data.data uses fetcher::cyDuplicateKey1::.data.data
173
127
  const activeRemappings: Record<string, string> = {};
174
128
 
129
+ // Helper to normalize value to array and process
130
+ const normalizeValue = (value: string | string[]): string[] =>
131
+ Array.isArray(value) ? value : [value];
132
+
175
133
  const equivalentVariables = statements.reduce((acc: any, result) => {
176
- for (const [key, value] of Object.entries(
134
+ for (const [key, rawValue] of Object.entries(
177
135
  result.equivalentVariables ?? {},
178
136
  )) {
137
+ // Handle arrays from AST analyzer (OR expressions like x = a || b)
138
+ // These should be preserved as arrays to track all sources
139
+ if (Array.isArray(rawValue)) {
140
+ const keyOptions = deBinaryPath(key);
141
+ const validValues = rawValue.filter(
142
+ (v): v is string => typeof v === 'string' && v.length > 0,
143
+ );
144
+ if (validValues.length === 0) continue;
145
+
146
+ // Process each array value through deBinaryPath
147
+ const allValueOptions: string[] = [];
148
+ for (const value of validValues) {
149
+ const valueOptions = deBinaryPath(value);
150
+ allValueOptions.push(...valueOptions);
151
+ }
152
+
153
+ // Remove duplicates while preserving order
154
+ const uniqueValueOptions = [...new Set(allValueOptions)];
155
+ const finalValue =
156
+ uniqueValueOptions.length === 1
157
+ ? uniqueValueOptions[0]
158
+ : uniqueValueOptions;
159
+
160
+ delete result.equivalentVariables[key];
161
+ if (keyOptions.length >= 2) {
162
+ for (const keyOption of keyOptions) {
163
+ result.equivalentVariables[keyOption] = finalValue;
164
+ }
165
+ } else {
166
+ result.equivalentVariables[keyOptions[0]] = finalValue;
167
+ }
168
+ continue;
169
+ }
170
+
171
+ // Original logic for string values with potential binary expressions in the string
172
+ const firstValue = rawValue;
173
+ if (!firstValue) continue;
174
+
179
175
  const keyOptions = deBinaryPath(key);
180
- const valueOptions = deBinaryPath(value);
176
+ const valueOptions = deBinaryPath(firstValue);
181
177
  delete result.equivalentVariables[key];
182
178
  if (keyOptions.length === 2) {
183
179
  if (valueOptions.length === 2) {
@@ -199,27 +195,38 @@ export default function mergeStatements(statements: Statement[]) {
199
195
  }
200
196
  }
201
197
 
202
- for (const [key, value] of Object.entries(
198
+ for (const [key, rawValue] of Object.entries(
203
199
  result.equivalentVariables ?? {},
204
200
  )) {
201
+ // Normalize to array for consistent handling
202
+ const values = normalizeValue(rawValue);
203
+
205
204
  // Apply any active remappings to the VALUE, but ONLY for property paths
206
205
  // e.g., if fetcher was remapped to fetcher::cyDuplicateKey1::,
207
206
  // then "fetcher.data.data" should become "fetcher::cyDuplicateKey1::.data.data"
208
207
  // However, we should NOT remap standalone variable references like "description"
209
208
  // because that would lose type information from the original variable.
210
- let remappedValue = value;
211
- for (const [originalKey, remappedKey] of Object.entries(
212
- activeRemappings,
213
- )) {
214
- // Only remap if the value is a property path (contains a dot after the key)
215
- // This preserves type information for simple variable references
216
- const keyRegex = new RegExp(
217
- `^${originalKey.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}(?=\\.)`,
218
- );
219
- if (keyRegex.test(remappedValue)) {
220
- remappedValue = remappedValue.replace(keyRegex, remappedKey);
209
+ const remappedValues = values.map((value) => {
210
+ let remappedValue = value;
211
+ for (const [originalKey, remappedKey] of Object.entries(
212
+ activeRemappings,
213
+ )) {
214
+ // Only remap if the value is a property path (contains a dot after the key)
215
+ // This preserves type information for simple variable references
216
+ const keyRegex = new RegExp(
217
+ `^${originalKey.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}(?=\\.)`,
218
+ );
219
+ if (keyRegex.test(remappedValue)) {
220
+ remappedValue = remappedValue.replace(keyRegex, remappedKey);
221
+ }
221
222
  }
222
- }
223
+ return remappedValue;
224
+ });
225
+
226
+ // Use array if multiple values, string if single
227
+ const remappedValue =
228
+ remappedValues.length === 1 ? remappedValues[0] : remappedValues;
229
+ const firstRemappedValue = remappedValues[0];
223
230
 
224
231
  if (acc[key]) {
225
232
  if (acc[key] === remappedValue) continue;
@@ -247,45 +254,32 @@ export default function mergeStatements(statements: Statement[]) {
247
254
  // If we have equivalentVariables[A] = B, and structure[A] is more specific than structure[B],
248
255
  // then update structure[B] to match structure[A]
249
256
  // This handles cases like: "state" -> "signature[0]" where "state" has a union type
250
-
251
- // Debug: Log union types in merged structure
252
- const unionTypesInStructure = Object.entries(structure).filter(
253
- ([_, v]) => typeof v === 'string' && v.includes("'") && v.includes(' | '),
254
- );
255
- if (unionTypesInStructure.length > 0) {
256
- console.log(
257
- `[UNION-TYPE] mergeStatements: Found ${unionTypesInStructure.length} union types in merged structure`,
258
- );
259
- unionTypesInStructure.forEach(([k, v]) =>
260
- console.log(`[UNION-TYPE] structure["${k}"] = ${v}`),
261
- );
262
- console.log(
263
- `[UNION-TYPE] mergeStatements: equivalentVariables = ${JSON.stringify(equivalentVariables)}`,
264
- );
265
- }
266
-
267
- for (const [source, target] of Object.entries(equivalentVariables) as [
268
- string,
257
+ for (const [source, rawTarget] of Object.entries(equivalentVariables) as [
269
258
  string,
259
+ string | string[],
270
260
  ][]) {
261
+ // Normalize to array for consistent handling
262
+ const targets = Array.isArray(rawTarget) ? rawTarget : [rawTarget];
271
263
  const sourceType = structure[source];
272
- const targetType = structure[target];
273
264
 
274
- // Check if source has a more specific type (union type vs generic type)
275
- if (sourceType) {
276
- const sourceIsUnion =
277
- sourceType.includes("'") && sourceType.includes(' | ');
265
+ for (const target of targets) {
266
+ if (typeof target !== 'string') continue;
278
267
 
279
- if (sourceIsUnion) {
280
- // Target doesn't exist or is generic - propagate the union type
281
- const targetIsGeneric =
282
- !targetType || targetType === 'string' || targetType === 'unknown';
268
+ const targetType = structure[target];
283
269
 
284
- if (targetIsGeneric) {
285
- console.log(
286
- `[UNION-TYPE] mergeStatements: Propagating "${source}" (${sourceType}) -> "${target}"`,
287
- );
288
- structure[target] = sourceType;
270
+ // Check if source has a more specific type (union type vs generic type)
271
+ if (sourceType) {
272
+ const sourceIsUnion =
273
+ sourceType.includes("'") && sourceType.includes(' | ');
274
+
275
+ if (sourceIsUnion) {
276
+ // Target doesn't exist or is generic - propagate the union type
277
+ const targetIsGeneric =
278
+ !targetType || targetType === 'string' || targetType === 'unknown';
279
+
280
+ if (targetIsGeneric) {
281
+ structure[target] = sourceType;
282
+ }
289
283
  }
290
284
  }
291
285
  }
@@ -0,0 +1,118 @@
1
+ import { JsonTypeDefinition } from '~codeyam/types';
2
+
3
+ /**
4
+ * Check whether all non-`_nullable` children of an object are simple strings.
5
+ * "Leaf-like" nullable objects (all-string children) get collapsed to
6
+ * `"object | null"` so the LLM knows the field can be null.
7
+ * Objects with nested structure (object/array children) keep their shape
8
+ * so the LLM can still generate proper data when the field is truthy.
9
+ */
10
+ function isLeafLikeObject(obj: Record<string, any>): boolean {
11
+ for (const key of Object.keys(obj)) {
12
+ if (key === '_nullable') continue;
13
+ const value = obj[key];
14
+ if (typeof value !== 'string') return false;
15
+ }
16
+ return true;
17
+ }
18
+
19
+ /**
20
+ * Collapse *leaf-like* nullable objects/arrays in the data structure to type strings.
21
+ *
22
+ * When convertDotNotation marks an object or array as `_nullable: true`
23
+ * (meaning the schema had `object | undefined`, `object | null`, etc.),
24
+ * we decide whether to collapse it:
25
+ *
26
+ * - **Leaf-like** (all children are simple strings): collapse to `"object | null"`.
27
+ * Example: `{ _nullable: true, type: "string", path: "string" }` → `"object | null"`
28
+ *
29
+ * - **Rich** (has object/array children): strip `_nullable` and keep the structure
30
+ * so the LLM can generate proper nested data when the field is truthy.
31
+ * Example: `{ _nullable: true, items: [...], name: "string" }` → `{ items: [...], name: "string" }`
32
+ *
33
+ * Non-nullable objects are recursively processed but left as nested structures.
34
+ */
35
+ export default function collapseNullableObjects(
36
+ data: JsonTypeDefinition,
37
+ ): JsonTypeDefinition {
38
+ if (typeof data !== 'object' || data === null) {
39
+ return data;
40
+ }
41
+
42
+ if (Array.isArray(data)) {
43
+ return data.map((item: any) =>
44
+ typeof item === 'object' && item !== null
45
+ ? collapseNullableObjects(item as JsonTypeDefinition)
46
+ : item,
47
+ ) as any as JsonTypeDefinition;
48
+ }
49
+
50
+ const result: JsonTypeDefinition = {};
51
+
52
+ for (const key of Object.keys(data)) {
53
+ // Skip the _nullable marker itself (shouldn't appear at top level, but be safe)
54
+ if (key === '_nullable') continue;
55
+
56
+ const value = data[key];
57
+
58
+ if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
59
+ const hasNullable = (value as any)._nullable === true;
60
+ if (hasNullable && isLeafLikeObject(value as Record<string, any>)) {
61
+ // Leaf-like nullable object → collapse to type string
62
+ const childKeys = Object.keys(value as any).filter(
63
+ (k) => k !== '_nullable',
64
+ );
65
+ console.log(
66
+ `[collapseNullableObjects] collapsed "${key}" → "object | null" (leaf-like, children: [${childKeys.join(', ')}])`,
67
+ );
68
+ result[key] = 'object | null';
69
+ } else if (hasNullable) {
70
+ // Rich nullable object → strip _nullable, keep structure
71
+ const childKeys = Object.keys(value as any).filter(
72
+ (k) => k !== '_nullable',
73
+ );
74
+ console.log(
75
+ `[collapseNullableObjects] kept structure for nullable "${key}" (rich, children: [${childKeys.join(', ')}])`,
76
+ );
77
+ result[key] = collapseNullableObjects(value as JsonTypeDefinition);
78
+ } else {
79
+ // Non-nullable → recurse
80
+ result[key] = collapseNullableObjects(value as JsonTypeDefinition);
81
+ }
82
+ } else if (Array.isArray(value)) {
83
+ const hasNullable = (value as any)._nullable === true;
84
+ if (
85
+ hasNullable &&
86
+ value.length <= 1 &&
87
+ value.every((v) => typeof v === 'string')
88
+ ) {
89
+ // Leaf-like nullable array → collapse to type string
90
+ console.log(
91
+ `[collapseNullableObjects] collapsed "${key}" → "array | null" (leaf-like)`,
92
+ );
93
+ result[key] = 'array | null';
94
+ } else if (hasNullable) {
95
+ // Rich nullable array → strip _nullable, keep structure
96
+ console.log(
97
+ `[collapseNullableObjects] kept structure for nullable array "${key}" (${value.length} elements)`,
98
+ );
99
+ result[key] = value.map((item) =>
100
+ typeof item === 'object' && item !== null
101
+ ? collapseNullableObjects(item as JsonTypeDefinition)
102
+ : item,
103
+ ) as JsonTypeDefinition[];
104
+ } else {
105
+ // Non-nullable → recurse elements
106
+ result[key] = value.map((item) =>
107
+ typeof item === 'object' && item !== null
108
+ ? collapseNullableObjects(item as JsonTypeDefinition)
109
+ : item,
110
+ ) as JsonTypeDefinition[];
111
+ }
112
+ } else {
113
+ result[key] = value;
114
+ }
115
+ }
116
+
117
+ return result;
118
+ }
@@ -139,16 +139,19 @@ export function gatherAttributesMap(
139
139
  // Use merged type if available, otherwise fall back to isolated type
140
140
  const typeValue =
141
141
  mergedSignatureSchema[key] ?? isolatedSignatureSchema[key];
142
- const equivalentSignatureVariable =
143
- equivalentSignatureVariables[keyParts[0]];
144
- const equivalentSignatureVariableParts = splitOutsideParenthesesAndArrays(
145
- equivalentSignatureVariable,
146
- );
142
+ // Handle array case (OR expressions) - use first element if array
143
+ const rawEquivalent = equivalentSignatureVariables[keyParts[0]];
144
+ const equivalentSignatureVariable = Array.isArray(rawEquivalent)
145
+ ? rawEquivalent[0]
146
+ : rawEquivalent;
147
+ const equivalentSignatureVariableParts = equivalentSignatureVariable
148
+ ? splitOutsideParenthesesAndArrays(equivalentSignatureVariable)
149
+ : [];
147
150
  if (
148
151
  equivalentSignatureVariable &&
149
- !equivalentSignatureVariableParts[0].includes('(')
152
+ !equivalentSignatureVariableParts[0]?.includes('(')
150
153
  ) {
151
- const equivalentKey = equivalentSignatureVariables[keyParts[0]];
154
+ const equivalentKey = equivalentSignatureVariable;
152
155
  const equivalentPath = joinParenthesesAndArrays([
153
156
  equivalentKey,
154
157
  ...keyParts.slice(1),
@@ -7,6 +7,7 @@ import {
7
7
  } from '~codeyam/types';
8
8
  import noErrorAttributes from './noErrorAttributes';
9
9
  import simplifyKeysForLLM from './simplifyKeysForLLM';
10
+ import collapseNullableObjects from './collapseNullableObjects';
10
11
 
11
12
  /**
12
13
  * Sort object keys by the size of their JSON-stringified values (smallest first).
@@ -99,11 +100,17 @@ ${JSON.stringify(defaultScenarioData.data, null, 2)}
99
100
  // while the reconcileMockDataKeys function will still match the simplified response back to original keys.
100
101
  // Then sort keys by size (smallest first) so small keys appear before large keys,
101
102
  // increasing the chance the LLM generates all keys for large schemas.
102
- const cleanedDataForMocks = structure.dataForMocks
103
- ? simplifyKeysForLLM(
104
- noErrorAttributes(structure.dataForMocks) as JsonTypeDefinition,
105
- )
103
+
104
+ const afterNoError = structure.dataForMocks
105
+ ? (noErrorAttributes(structure.dataForMocks) as JsonTypeDefinition)
106
+ : null;
107
+
108
+ const afterSimplify = afterNoError ? simplifyKeysForLLM(afterNoError) : null;
109
+
110
+ const cleanedDataForMocks = afterSimplify
111
+ ? collapseNullableObjects(afterSimplify)
106
112
  : null;
113
+
107
114
  const sortedDataForMocks =
108
115
  cleanedDataForMocks &&
109
116
  typeof cleanedDataForMocks === 'object' &&
@@ -111,6 +118,19 @@ ${JSON.stringify(defaultScenarioData.data, null, 2)}
111
118
  ? sortKeysBySize(cleanedDataForMocks as Record<string, any>)
112
119
  : cleanedDataForMocks;
113
120
 
121
+ // Log nullable-related content in final prompt JSON
122
+ if (sortedDataForMocks) {
123
+ const finalJson = JSON.stringify(sortedDataForMocks, null, 2);
124
+ const hasNullableMarker = finalJson.includes('_nullable');
125
+ const nullCollapsed = (finalJson.match(/"object \| null"/g) || []).length;
126
+ const arrayCollapsed = (finalJson.match(/"array \| null"/g) || []).length;
127
+ if (hasNullableMarker || nullCollapsed > 0 || arrayCollapsed > 0) {
128
+ console.log(
129
+ `[generateEntityScenarioDataGenerator] final prompt: ${nullCollapsed} "object | null", ${arrayCollapsed} "array | null"${hasNullableMarker ? ', WARNING: _nullable still present!' : ''}`,
130
+ );
131
+ }
132
+ }
133
+
114
134
  // When mockData has already been generated via chunks, skip it in the main call
115
135
  const mockDataSection = options?.mockDataAlreadyGenerated
116
136
  ? '## mockData Structure\nmockData has been pre-generated—return `{}` for mockData.'
@@ -525,7 +525,7 @@ function findControllableBaseForDerivedPath(
525
525
  export default function resolvePathToControllable(
526
526
  localPath: string,
527
527
  attributesMap: Record<string, string>,
528
- equivalentSignatureVariables: Record<string, string>,
528
+ equivalentSignatureVariables: Record<string, string | string[]>,
529
529
  fullToShortPathMap: Record<string, string>,
530
530
  ): PathResolutionResult {
531
531
  const chain: string[] = [localPath];
@@ -600,7 +600,11 @@ export default function resolvePathToControllable(
600
600
 
601
601
  // 4. Equivalent variable resolution
602
602
  const localVarName = extractLocalVariableName(localPath);
603
- const dataSourceBase = equivalentSignatureVariables[localVarName];
603
+ // Handle array case (OR expressions) - use first element if array
604
+ const rawDataSourceBase = equivalentSignatureVariables[localVarName];
605
+ const dataSourceBase = Array.isArray(rawDataSourceBase)
606
+ ? rawDataSourceBase[0]
607
+ : rawDataSourceBase;
604
608
 
605
609
  if (dataSourceBase) {
606
610
  chain.push(`equivalent var: ${localVarName} → ${dataSourceBase}`);
@@ -626,18 +630,26 @@ export default function resolvePathToControllable(
626
630
  baseVarName in equivalentSignatureVariables &&
627
631
  baseVarName !== localVarName
628
632
  ) {
629
- const baseDataSource = equivalentSignatureVariables[baseVarName];
630
- chain.push(`transitive resolution: ${baseVarName} → ${baseDataSource}`);
631
- // Append the array access suffix to the resolved base
632
- if (baseDataSource.endsWith('()')) {
633
- fullResolvedPath =
634
- baseDataSource + '.functionCallReturnValue' + accessSuffix;
635
- } else if (baseDataSource.endsWith('.functionCallReturnValue')) {
636
- fullResolvedPath = baseDataSource + accessSuffix;
637
- } else {
638
- fullResolvedPath = baseDataSource + accessSuffix;
633
+ // Handle array case (OR expressions) - use first element if array
634
+ const rawBaseDataSource = equivalentSignatureVariables[baseVarName];
635
+ const baseDataSource = Array.isArray(rawBaseDataSource)
636
+ ? rawBaseDataSource[0]
637
+ : rawBaseDataSource;
638
+ if (baseDataSource) {
639
+ chain.push(
640
+ `transitive resolution: ${baseVarName} ${baseDataSource}`,
641
+ );
642
+ // Append the array access suffix to the resolved base
643
+ if (baseDataSource.endsWith('()')) {
644
+ fullResolvedPath =
645
+ baseDataSource + '.functionCallReturnValue' + accessSuffix;
646
+ } else if (baseDataSource.endsWith('.functionCallReturnValue')) {
647
+ fullResolvedPath = baseDataSource + accessSuffix;
648
+ } else {
649
+ fullResolvedPath = baseDataSource + accessSuffix;
650
+ }
651
+ chain.push(`transitively resolved: ${fullResolvedPath}`);
639
652
  }
640
- chain.push(`transitively resolved: ${fullResolvedPath}`);
641
653
  }
642
654
  }
643
655
 
@@ -63,7 +63,7 @@ export interface EnrichedConditionalUsage {
63
63
  /** For comparison conditions, the literal values being compared against */
64
64
  comparedValues?: string[];
65
65
  /** Where this conditional usage occurs */
66
- location: 'if' | 'ternary' | 'logical-and' | 'switch';
66
+ location: 'if' | 'ternary' | 'logical-and' | 'switch' | 'unconditional';
67
67
  /**
68
68
  * The traced source data path in the format "scopeName.path"
69
69
  * e.g., "useParams().functionCallReturnValue['*']"
@@ -120,7 +120,8 @@ export interface SerializableDataStructure {
120
120
  functionResults: Record<string, SerializableFunctionResult>;
121
121
 
122
122
  // Equivalent signature variables for root scope
123
- equivalentSignatureVariables: Record<string, string>;
123
+ // Values can be arrays for OR expressions where a variable maps to multiple sources
124
+ equivalentSignatureVariables: Record<string, string | string[]>;
124
125
 
125
126
  environmentVariables: string[];
126
127
 
@@ -296,7 +297,7 @@ export function getSourceEquivalencies(
296
297
 
297
298
  export function getEquivalentSignatureVariables(
298
299
  dataStructure: SerializableDataStructure,
299
- ): Record<string, string> {
300
+ ): Record<string, string | string[]> {
300
301
  return dataStructure.equivalentSignatureVariables;
301
302
  }
302
303
 
@@ -41,6 +41,8 @@ export { default as mergeValidatedDataStructures } from './src/lib/files/scenari
41
41
 
42
42
  export { discoverDirectDependencies } from './src/lib/files/analyze/dependencyResolver';
43
43
 
44
+ export { transformationTracer } from './src/lib/files/scenarios/TransformationTracer';
45
+
44
46
  export { default as getAnalysisError } from './src/lib/utils/getAnalysisError';
45
47
  export { default as measureAndReportExecutionTime } from './src/lib/utils/measureAndReportExecutionTime';
46
48