@codeyam/codeyam-cli 0.1.0-staging.323686 → 0.1.0-staging.4684848

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) 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 +6 -6
  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 +140 -14
  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 +87 -25
  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 +571 -74
  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/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
  123. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +93 -2
  124. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  125. package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +108 -2
  126. package/analyzer-template/project/constructMockCode.ts +90 -10
  127. package/analyzer-template/project/writeMockDataTsx.ts +181 -8
  128. package/analyzer-template/project/writeScenarioComponents.ts +60 -12
  129. package/analyzer-template/project/writeSimpleRoot.ts +21 -11
  130. package/background/src/lib/local/createLocalAnalyzer.js +1 -1
  131. package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
  132. package/background/src/lib/virtualized/project/constructMockCode.js +75 -4
  133. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  134. package/background/src/lib/virtualized/project/writeMockDataTsx.js +162 -4
  135. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  136. package/background/src/lib/virtualized/project/writeScenarioComponents.js +60 -15
  137. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  138. package/background/src/lib/virtualized/project/writeSimpleRoot.js +21 -11
  139. package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
  140. package/codeyam-cli/scripts/apply-setup.js +180 -0
  141. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  142. package/codeyam-cli/src/cli.js +2 -0
  143. package/codeyam-cli/src/cli.js.map +1 -1
  144. package/codeyam-cli/src/codeyam-cli.js +18 -2
  145. package/codeyam-cli/src/codeyam-cli.js.map +1 -1
  146. package/codeyam-cli/src/commands/analyze.js +4 -2
  147. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  148. package/codeyam-cli/src/commands/baseline.js +2 -0
  149. package/codeyam-cli/src/commands/baseline.js.map +1 -1
  150. package/codeyam-cli/src/commands/debug.js +9 -5
  151. package/codeyam-cli/src/commands/debug.js.map +1 -1
  152. package/codeyam-cli/src/commands/default.js +31 -20
  153. package/codeyam-cli/src/commands/default.js.map +1 -1
  154. package/codeyam-cli/src/commands/detect-universal-mocks.js +2 -0
  155. package/codeyam-cli/src/commands/detect-universal-mocks.js.map +1 -1
  156. package/codeyam-cli/src/commands/init.js +49 -257
  157. package/codeyam-cli/src/commands/init.js.map +1 -1
  158. package/codeyam-cli/src/commands/memory.js +17 -26
  159. package/codeyam-cli/src/commands/memory.js.map +1 -1
  160. package/codeyam-cli/src/commands/recapture.js +2 -0
  161. package/codeyam-cli/src/commands/recapture.js.map +1 -1
  162. package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
  163. package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
  164. package/codeyam-cli/src/commands/setup-simulations.js +284 -0
  165. package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
  166. package/codeyam-cli/src/commands/test-startup.js +2 -0
  167. package/codeyam-cli/src/commands/test-startup.js.map +1 -1
  168. package/codeyam-cli/src/commands/verify.js +14 -2
  169. package/codeyam-cli/src/commands/verify.js.map +1 -1
  170. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +128 -86
  171. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  172. package/codeyam-cli/src/utils/analyzer.js +7 -0
  173. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  174. package/codeyam-cli/src/utils/backgroundServer.js +9 -0
  175. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  176. package/codeyam-cli/src/utils/generateReport.js +2 -2
  177. package/codeyam-cli/src/utils/install-skills.js +70 -45
  178. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  179. package/codeyam-cli/src/utils/labsAutoCheck.js +19 -0
  180. package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -0
  181. package/codeyam-cli/src/utils/progress.js +7 -0
  182. package/codeyam-cli/src/utils/progress.js.map +1 -1
  183. package/codeyam-cli/src/utils/queue/job.js +4 -0
  184. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  185. package/codeyam-cli/src/utils/requireSimulations.js +10 -0
  186. package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
  187. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js +82 -0
  188. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js.map +1 -0
  189. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +230 -0
  190. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -0
  191. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +67 -0
  192. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -0
  193. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js +105 -0
  194. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js.map +1 -0
  195. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js +34 -0
  196. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js.map +1 -0
  197. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js +162 -0
  198. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js.map +1 -0
  199. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +75 -0
  200. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -0
  201. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +378 -0
  202. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -0
  203. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +115 -0
  204. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -0
  205. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js +127 -0
  206. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js.map +1 -0
  207. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js +50 -0
  208. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js.map +1 -0
  209. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +116 -0
  210. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -0
  211. package/codeyam-cli/src/utils/ruleReflection/index.js +5 -0
  212. package/codeyam-cli/src/utils/ruleReflection/index.js.map +1 -0
  213. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js +44 -0
  214. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js.map +1 -0
  215. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js +85 -0
  216. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js.map +1 -0
  217. package/codeyam-cli/src/utils/ruleReflection/types.js +5 -0
  218. package/codeyam-cli/src/utils/ruleReflection/types.js.map +1 -0
  219. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +293 -0
  220. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -0
  221. package/codeyam-cli/src/utils/rules/index.js +1 -0
  222. package/codeyam-cli/src/utils/rules/index.js.map +1 -1
  223. package/codeyam-cli/src/utils/rules/parser.js +2 -25
  224. package/codeyam-cli/src/utils/rules/parser.js.map +1 -1
  225. package/codeyam-cli/src/utils/rules/ruleState.js +150 -0
  226. package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
  227. package/codeyam-cli/src/utils/rules/staleness.js +16 -11
  228. package/codeyam-cli/src/utils/rules/staleness.js.map +1 -1
  229. package/codeyam-cli/src/utils/serverState.js +37 -10
  230. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  231. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +21 -44
  232. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  233. package/codeyam-cli/src/webserver/app/lib/database.js +15 -3
  234. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  235. package/codeyam-cli/src/webserver/backgroundServer.js +24 -0
  236. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  237. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-CQ-wF3Tv.js +1 -0
  238. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-DsN1wKrm.js → EntityItem-HdckCi0m.js} +1 -1
  239. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-DLqD3qNt.js → EntityTypeBadge-Dh5RJMOE.js} +1 -1
  240. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-Ba2JVPzP.js → EntityTypeIcon-BnjjBHJu.js} +1 -1
  241. package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-C8lyxW9k.js → InlineSpinner-CUSfu6W5.js} +1 -1
  242. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-aht4aafF.js → InteractivePreview-Coll1aD6.js} +2 -2
  243. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CVtiBnY5.js → LibraryFunctionPreview-lYMY8h-y.js} +1 -1
  244. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-B0GLXMsr.js → LoadingDots-ay8XeA59.js} +1 -1
  245. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-xgeCVgSM.js → LogViewer-Dpul1_ik.js} +1 -1
  246. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-OApQuNyq.js → ReportIssueModal-CRBCfV2W.js} +3 -8
  247. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-DuDvi0jm.js → SafeScreenshot-DRTFDNFt.js} +1 -1
  248. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DzccYyI8.js → ScenarioViewer-d6PSFxhS.js} +2 -2
  249. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-DyFZkK0l.js → TruncatedFilePath-DDEOQ6Iw.js} +1 -1
  250. package/codeyam-cli/src/webserver/build/client/assets/{_index-BwqWJOgH.js → _index-CkziGg5F.js} +1 -1
  251. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BwavGCpm.js → activity.(_tab)-B2v1pm9w.js} +6 -11
  252. package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-BXIaK8Md.js +11 -0
  253. package/codeyam-cli/src/webserver/build/client/assets/api.agent-transcripts-l0sNRNKZ.js +1 -0
  254. package/codeyam-cli/src/webserver/build/client/assets/api.labs-unlock-l0sNRNKZ.js +1 -0
  255. package/codeyam-cli/src/webserver/build/client/assets/api.save-fixture-l0sNRNKZ.js +1 -0
  256. package/codeyam-cli/src/webserver/build/client/assets/book-open-qbapxy6o.js +6 -0
  257. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-Cx24_aWc.js → chevron-down-C-mKrwr1.js} +1 -1
  258. package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-CXRTFQ3F.js → chunk-JZWAC4HX-BAvUl1nT.js} +12 -12
  259. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BOARzkeR.js → circle-check-DlrT-SzI.js} +1 -1
  260. package/codeyam-cli/src/webserver/build/client/assets/copy-clIxnCqQ.js +11 -0
  261. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-BdhJEx6B.js → createLucideIcon-B931Etud.js} +1 -1
  262. package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-BBnGWYga.js → dev.empty-BoPM6KnE.js} +1 -1
  263. package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-oVRMh9Hl.js +16 -0
  264. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js → entity._sha.scenarios._scenarioId.fullscreen-BjyzwQ7H.js} +1 -1
  265. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-D1T4TGjf.js → entity._sha_.create-scenario-DxuyDmZA.js} +1 -1
  266. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CTBG2mmz.js → entity._sha_.edit._scenarioId-DESSZGQp.js} +1 -1
  267. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CS2cb_eZ.js → entry.client-D5Yb90Ad.js} +1 -1
  268. package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DMJ7zii9.js → fileTableUtils-DuObVYgh.js} +1 -1
  269. package/codeyam-cli/src/webserver/build/client/assets/{files-CJ6lTdTA.js → files-CDfz4Y-i.js} +1 -1
  270. package/codeyam-cli/src/webserver/build/client/assets/{git-CPTZZ-JZ.js → git-D6jOlDQw.js} +1 -1
  271. package/codeyam-cli/src/webserver/build/client/assets/globals-CKT08Djd.css +1 -0
  272. package/codeyam-cli/src/webserver/build/client/assets/{index-B1h680n5.js → index-DvOt1KIt.js} +1 -1
  273. package/codeyam-cli/src/webserver/build/client/assets/{index-lzqtyFU8.js → index-WfQFdoWK.js} +1 -1
  274. package/codeyam-cli/src/webserver/build/client/assets/labs-BbGyC1RY.js +1 -0
  275. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-B7B9V-bu.js → loader-circle-Bb7Y9k5O.js} +1 -1
  276. package/codeyam-cli/src/webserver/build/client/assets/manifest-fd06e67a.js +1 -0
  277. package/codeyam-cli/src/webserver/build/client/assets/memory-BXebUPaL.js +78 -0
  278. package/codeyam-cli/src/webserver/build/client/assets/pause-DaAHX2on.js +11 -0
  279. package/codeyam-cli/src/webserver/build/client/assets/root-CvNE9MaT.js +62 -0
  280. package/codeyam-cli/src/webserver/build/client/assets/{search-CxXUmBSd.js → search-DIqAPIrO.js} +1 -1
  281. package/codeyam-cli/src/webserver/build/client/assets/settings-DCIzBZM9.js +1 -0
  282. package/codeyam-cli/src/webserver/build/client/assets/{simulations-DwFIBT09.js → simulations-C6n_fNQY.js} +1 -1
  283. package/codeyam-cli/src/webserver/build/client/assets/terminal-CmPsszJy.js +11 -0
  284. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-B6LgvRJg.js → triangle-alert-Beg-oV50.js} +1 -1
  285. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-C1v1PQzo.js → useCustomSizes-D7TLbP3M.js} +1 -1
  286. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-aSv48UbS.js → useLastLogLine-Ce5rnai3.js} +1 -1
  287. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-DYxHZQuP.js → useReportContext-B4D3wj27.js} +1 -1
  288. package/codeyam-cli/src/webserver/build/client/assets/{useToast-mBRpZPiu.js → useToast-BDt_-DnY.js} +1 -1
  289. package/codeyam-cli/src/webserver/build/server/assets/{index-DVzYx8PN.js → index-DDr9Cp9M.js} +1 -1
  290. package/codeyam-cli/src/webserver/build/server/assets/server-build-DjwiujaU.js +257 -0
  291. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  292. package/codeyam-cli/src/webserver/build-info.json +5 -5
  293. package/codeyam-cli/templates/{codeyam:debug.md → codeyam-debug.md} +1 -1
  294. package/codeyam-cli/templates/codeyam-diagnose.md +481 -0
  295. package/codeyam-cli/templates/codeyam-memory-hook.sh +19 -20
  296. package/codeyam-cli/templates/codeyam-memory.md +392 -0
  297. package/codeyam-cli/templates/codeyam-new-rule.md +13 -0
  298. package/codeyam-cli/templates/{codeyam:setup.md → codeyam-setup.md} +13 -1
  299. package/codeyam-cli/templates/{codeyam:sim.md → codeyam-sim.md} +1 -1
  300. package/codeyam-cli/templates/{codeyam:test.md → codeyam-test.md} +1 -1
  301. package/codeyam-cli/templates/{codeyam:verify.md → codeyam-verify.md} +1 -1
  302. package/codeyam-cli/templates/rule-notification-hook.py +56 -0
  303. package/codeyam-cli/templates/rule-reflection-hook.py +627 -0
  304. package/codeyam-cli/templates/rules-instructions.md +132 -0
  305. package/package.json +10 -10
  306. package/packages/ai/index.js +3 -2
  307. package/packages/ai/index.js.map +1 -1
  308. package/packages/ai/src/lib/analyzeScope.js +50 -13
  309. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  310. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +54 -8
  311. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  312. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js +10 -14
  313. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js.map +1 -1
  314. package/packages/ai/src/lib/astScopes/processExpression.js +317 -44
  315. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  316. package/packages/ai/src/lib/astScopes/sharedPatterns.js +25 -0
  317. package/packages/ai/src/lib/astScopes/sharedPatterns.js.map +1 -1
  318. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +763 -171
  319. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  320. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +5 -1
  321. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
  322. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
  323. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
  324. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
  325. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
  326. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +33 -3
  327. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  328. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +36 -11
  329. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  330. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js +63 -0
  331. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js.map +1 -0
  332. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +122 -12
  333. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
  334. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +173 -0
  335. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
  336. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
  337. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
  338. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +309 -84
  339. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  340. package/packages/ai/src/lib/dataStructureChunking.js +26 -11
  341. package/packages/ai/src/lib/dataStructureChunking.js.map +1 -1
  342. package/packages/ai/src/lib/generateEntityDataStructure.js +46 -2
  343. package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
  344. package/packages/ai/src/lib/generateEntityScenarioData.js +227 -4
  345. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  346. package/packages/ai/src/lib/generateEntityScenarios.js +7 -1
  347. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  348. package/packages/ai/src/lib/generateExecutionFlows.js +26 -4
  349. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  350. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +447 -80
  351. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
  352. package/packages/ai/src/lib/isolateScopes.js +39 -3
  353. package/packages/ai/src/lib/isolateScopes.js.map +1 -1
  354. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js +5 -0
  355. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js.map +1 -1
  356. package/packages/ai/src/lib/mergeStatements.js +70 -51
  357. package/packages/ai/src/lib/mergeStatements.js.map +1 -1
  358. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js +97 -0
  359. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js.map +1 -0
  360. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
  361. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  362. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +17 -2
  363. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  364. package/packages/ai/src/lib/resolvePathToControllable.js +24 -14
  365. package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
  366. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  367. package/packages/analyze/index.js +1 -0
  368. package/packages/analyze/index.js.map +1 -1
  369. package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
  370. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  371. package/packages/analyze/src/lib/ProjectAnalyzer.js +96 -26
  372. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  373. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
  374. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
  375. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
  376. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
  377. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
  378. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
  379. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
  380. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
  381. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
  382. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
  383. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
  384. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
  385. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +65 -7
  386. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  387. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +17 -4
  388. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  389. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
  390. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  391. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +0 -3
  392. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  393. package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
  394. package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
  395. package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
  396. package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
  397. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +880 -0
  398. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -0
  399. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +56 -10
  400. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  401. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +75 -21
  402. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  403. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +150 -17
  404. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  405. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +56 -8
  406. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  407. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +478 -54
  408. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  409. package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
  410. package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
  411. package/packages/analyze/src/lib/index.js +1 -0
  412. package/packages/analyze/src/lib/index.js.map +1 -1
  413. package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
  414. package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
  415. package/packages/database/src/lib/analysisBranchToDb.js +1 -1
  416. package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
  417. package/packages/database/src/lib/analysisToDb.js +1 -1
  418. package/packages/database/src/lib/analysisToDb.js.map +1 -1
  419. package/packages/database/src/lib/branchToDb.js +1 -1
  420. package/packages/database/src/lib/branchToDb.js.map +1 -1
  421. package/packages/database/src/lib/commitBranchToDb.js +1 -1
  422. package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
  423. package/packages/database/src/lib/commitToDb.js +1 -1
  424. package/packages/database/src/lib/commitToDb.js.map +1 -1
  425. package/packages/database/src/lib/fileToDb.js +1 -1
  426. package/packages/database/src/lib/fileToDb.js.map +1 -1
  427. package/packages/database/src/lib/kysely/db.js +3 -0
  428. package/packages/database/src/lib/kysely/db.js.map +1 -1
  429. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  430. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  431. package/packages/database/src/lib/projectToDb.js +1 -1
  432. package/packages/database/src/lib/projectToDb.js.map +1 -1
  433. package/packages/database/src/lib/saveFiles.js +1 -1
  434. package/packages/database/src/lib/saveFiles.js.map +1 -1
  435. package/packages/database/src/lib/scenarioToDb.js +1 -1
  436. package/packages/database/src/lib/scenarioToDb.js.map +1 -1
  437. package/packages/utils/src/lib/fs/rsyncCopy.js +93 -2
  438. package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  439. package/scripts/finalize-analyzer.cjs +8 -76
  440. package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +0 -6
  441. package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-BJUiQqZF.js +0 -23
  442. package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +0 -6
  443. package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +0 -1
  444. package/codeyam-cli/src/webserver/build/client/assets/manifest-7522edd4.js +0 -1
  445. package/codeyam-cli/src/webserver/build/client/assets/memory-yxFcrxBX.js +0 -92
  446. package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +0 -62
  447. package/codeyam-cli/src/webserver/build/client/assets/settings-CS5f3WzT.js +0 -1
  448. package/codeyam-cli/src/webserver/build/server/assets/server-build-4Cr0uToj.js +0 -257
  449. package/codeyam-cli/templates/codeyam:diagnose.md +0 -803
  450. package/codeyam-cli/templates/codeyam:memory.md +0 -462
  451. package/codeyam-cli/templates/codeyam:new-rule.md +0 -13
@@ -192,6 +192,36 @@ const safeString = (s: string, level: number) => {
192
192
  return s?.replace ? s.replace(/"/g, "'").replace(/\n/g, '\\n') : s;
193
193
  };
194
194
 
195
+ /**
196
+ * Clean up malformed LLM-generated function values.
197
+ * The LLM sometimes generates function values with an invalid "(function)" prefix like:
198
+ * - "(function)() => {}"
199
+ * - "(function)(event) => {}"
200
+ * - "(function)(id) => {}"
201
+ *
202
+ * This strips the prefix and adds TypeScript `any` type annotations to parameters.
203
+ * Returns null if the value doesn't match the malformed pattern.
204
+ */
205
+ const cleanMalformedFunctionValue = (value: string): string | null => {
206
+ // Match "(function)" followed by optional params in parens, then "=>"
207
+ const match = value.match(/^\(function\)(\([^)]*\))\s*=>\s*(.*)$/);
208
+ if (!match) return null;
209
+
210
+ const [, paramsWithParens, body] = match;
211
+
212
+ // Extract parameter names and add `: any` type annotation
213
+ // e.g., "(event)" -> "(event: any)", "()" -> "()"
214
+ const params = paramsWithParens.slice(1, -1).trim(); // Remove outer parens
215
+ const typedParams = params
216
+ ? params
217
+ .split(',')
218
+ .map((p) => `${p.trim()}: any`)
219
+ .join(', ')
220
+ : '';
221
+
222
+ return `(${typedParams}) => ${body}`;
223
+ };
224
+
195
225
  /**
196
226
  * Check if a mock key's schema indicates it should be instantiated as a Map.
197
227
  * A Map is indicated by:
@@ -310,6 +340,38 @@ function extractAllKeys(obj: JsonTypeDefinition | undefined): string[] {
310
340
  */
311
341
  const BARE_TYPE_MARKERS = ['function', 'async-function'];
312
342
 
343
+ /**
344
+ * Check if a string is a TypeScript arrow function type annotation rather than
345
+ * a valid JavaScript arrow function expression.
346
+ *
347
+ * TypeScript arrow types look like function expressions (they contain '=>') but
348
+ * their "body" is a type name, not a JS expression:
349
+ * - "() => void"
350
+ * - "(event: MouseEvent) => void"
351
+ * - "() => string"
352
+ * - "() => Promise<void>"
353
+ * - "(id: string, name: string) => boolean"
354
+ *
355
+ * Valid JS arrow functions have actual expression bodies:
356
+ * - "() => {}"
357
+ * - "() => 'hello'"
358
+ * - "(x) => x + 1"
359
+ * - "() => { console.log('hi'); }"
360
+ */
361
+ const ARROW_TYPE_RETURN_TYPES =
362
+ /^(void|string|number|boolean|any|unknown|never|null|undefined|object|Date|Promise<\w+>)$/i;
363
+
364
+ const isArrowFunctionTypeAnnotation = (value: string): boolean => {
365
+ const arrowIndex = value.indexOf('=>');
366
+ if (arrowIndex === -1) return false;
367
+
368
+ const body = value.slice(arrowIndex + 2).trim();
369
+
370
+ // A real JS function would have {}, an expression, a string literal, etc.
371
+ // A type annotation has a bare type keyword as the "body".
372
+ return ARROW_TYPE_RETURN_TYPES.test(body);
373
+ };
374
+
313
375
  /**
314
376
  * Check if a value is a bare function type marker that should be filtered out.
315
377
  * These markers indicate the LLM detected a function but couldn't generate meaningful mock data.
@@ -336,6 +398,59 @@ const isBareTypeMarker = (value: unknown): boolean => {
336
398
  return false;
337
399
  };
338
400
 
401
+ /**
402
+ * Escape newlines that appear inside string literals within a code string,
403
+ * while preserving structural newlines (those between statements/lines of code).
404
+ *
405
+ * This handles cases where LLM generates function bodies like:
406
+ * - "() => { console.log('line1\nline2'); }" - escape the \n inside the string
407
+ * - "() => {\n console.log('x');\n}" - preserve structural \n between statements
408
+ * - "() => Promise.resolve('a\nb')" - escape the \n inside the string argument
409
+ *
410
+ * The algorithm tracks whether we're inside a string literal (single, double, or
411
+ * backtick quotes) and only escapes newlines that appear within quotes.
412
+ */
413
+ const escapeNewlinesInStringLiterals = (code: string): string => {
414
+ let result = '';
415
+ let inString = false;
416
+ let stringChar = ''; // The quote character that started the current string
417
+
418
+ for (let i = 0; i < code.length; i++) {
419
+ const char = code[i];
420
+ const prevChar = i > 0 ? code[i - 1] : '';
421
+
422
+ // Check for string literal boundaries (single, double, or backtick quotes)
423
+ // Skip escaped quotes (preceded by backslash)
424
+ if ((char === '"' || char === "'" || char === '`') && prevChar !== '\\') {
425
+ if (!inString) {
426
+ // Starting a string literal
427
+ inString = true;
428
+ stringChar = char;
429
+ } else if (char === stringChar) {
430
+ // Ending the current string literal
431
+ inString = false;
432
+ stringChar = '';
433
+ }
434
+ // If char is a different quote type while in a string, it's just a character
435
+ }
436
+
437
+ // Escape newlines only when inside a string literal
438
+ if (char === '\n') {
439
+ if (inString) {
440
+ // Inside a string literal - escape the newline
441
+ result += '\\n';
442
+ } else {
443
+ // Outside string - keep the structural newline
444
+ result += char;
445
+ }
446
+ } else {
447
+ result += char;
448
+ }
449
+ }
450
+
451
+ return result;
452
+ };
453
+
339
454
  /**
340
455
  * Normalize mock data by merging entries that have the same normalized function name.
341
456
  * e.g., "useLastLogLine(projectSlug, !!simulatingEntitySha)" and
@@ -734,13 +849,19 @@ const jsonToCode = (
734
849
  stringValue.startsWith('Promise.') ||
735
850
  stringValue.startsWith('new Promise');
736
851
 
852
+ // Check if the string contains newlines (potential issue for string literals)
853
+ const hasNewlines = stringValue.includes('\n');
854
+
737
855
  // Handle special type indicators that need transformation
738
856
  let outputValue: string;
739
857
  if (stringValue === 'promise' || looksLikePromise) {
740
858
  // The key is a function call (e.g., "revalidate()"), so output a function
741
859
  // that returns a Promise, not the Promise itself
860
+ // Important: Escape newlines inside Promise expressions to avoid
861
+ // "unterminated string literal" errors when the Promise contains
862
+ // multi-line string arguments like Promise.resolve('line1\nline2')
742
863
  const promiseExpr = looksLikePromise
743
- ? stringValue
864
+ ? stringValue.replace(/\n/g, '\\n')
744
865
  : 'Promise.resolve()';
745
866
  outputValue = `() => ${promiseExpr}`;
746
867
  console.log(
@@ -752,10 +873,49 @@ const jsonToCode = (
752
873
  `CodeYam: Nested func transform (string->function): "${key}" -> "${funcName}": () => {}`,
753
874
  );
754
875
  } else if (looksLikeFunction) {
755
- outputValue = stringValue;
756
- console.log(
757
- `CodeYam: Nested func transform (string): "${key}" -> "${funcName}": ${stringValue.substring(0, 30)}...`,
758
- );
876
+ // Check for "[native code]" in function body — this is what
877
+ // Function.prototype.toString() returns for built-in functions.
878
+ // The LLM sometimes generates "function () { [native code] }" which
879
+ // is not valid JavaScript (the "[" is parsed as array destructuring).
880
+ if (stringValue.includes('[native code]')) {
881
+ outputValue = '() => {}';
882
+ console.log(
883
+ `CodeYam: Nested func transform (native-code->noop): "${key}" -> "${funcName}": () => {}`,
884
+ );
885
+ } else if (cleanMalformedFunctionValue(stringValue)) {
886
+ // Check for malformed LLM-generated function values like "(function)() => {}"
887
+ // These have an invalid "(function)" prefix that must be stripped
888
+ outputValue = cleanMalformedFunctionValue(stringValue)!;
889
+ console.log(
890
+ `CodeYam: Nested func transform (malformed->clean): "${key}" -> "${funcName}": ${outputValue}`,
891
+ );
892
+ } else if (isArrowFunctionTypeAnnotation(stringValue)) {
893
+ // TypeScript arrow function type annotations like "() => void",
894
+ // "(event: MouseEvent) => void", "() => Promise<void>" contain '=>'
895
+ // so they pass the looksLikeFunction check, but they are TYPE syntax,
896
+ // not valid JavaScript expressions. Convert to a no-op function.
897
+ outputValue = '() => {}';
898
+ console.log(
899
+ `CodeYam: Nested func transform (type-annotation->function): "${key}" -> "${funcName}": () => {}`,
900
+ );
901
+ } else {
902
+ // Handle newlines in function expressions:
903
+ // - Newlines inside string literals must be escaped to avoid
904
+ // "unterminated string literal" errors
905
+ // - Structural newlines (between statements) should be kept as-is
906
+ // to produce valid multi-line JavaScript
907
+ //
908
+ // We escape ONLY newlines that appear inside string literals (single,
909
+ // double, or template quotes). Structural newlines are preserved.
910
+ if (hasNewlines) {
911
+ outputValue = escapeNewlinesInStringLiterals(stringValue);
912
+ } else {
913
+ outputValue = stringValue;
914
+ }
915
+ console.log(
916
+ `CodeYam: Nested func transform (string): "${key}" -> "${funcName}": ${stringValue.substring(0, 30)}...`,
917
+ );
918
+ }
759
919
  } else {
760
920
  // Plain string value - must be quoted
761
921
  outputValue = `"${safeString(stringValue, level)}"`;
@@ -783,9 +943,22 @@ const jsonToCode = (
783
943
  if (isBareTypeMarker(stringValue)) {
784
944
  continue;
785
945
  }
786
- keyStrings.push(
787
- `${levelSpacing}"${safeString(key, level)}": "${safeString(stringValue, level)}"`,
788
- );
946
+ // Check for malformed LLM-generated function values like "(function)(id) => {}"
947
+ // These can appear on plain keys (e.g., "closeToast") and need to be output as
948
+ // actual functions, not quoted strings
949
+ const cleanedPlainKeyFn = cleanMalformedFunctionValue(stringValue);
950
+ if (cleanedPlainKeyFn) {
951
+ keyStrings.push(
952
+ `${levelSpacing}"${safeString(key, level)}": ${cleanedPlainKeyFn}`,
953
+ );
954
+ console.log(
955
+ `CodeYam: Plain key func transform (malformed->clean): "${key}": ${cleanedPlainKeyFn}`,
956
+ );
957
+ } else {
958
+ keyStrings.push(
959
+ `${levelSpacing}"${safeString(key, level)}": "${safeString(stringValue, level)}"`,
960
+ );
961
+ }
789
962
  }
790
963
  } else {
791
964
  // Skip plain keys that have function-call versions (at the same nesting level where
@@ -987,10 +987,19 @@ function addMockToContent(
987
987
  /[.*+?^${}()|[\]\\]/g,
988
988
  '\\$&',
989
989
  );
990
- // Create regex that matches the call (with optional whitespace variations)
990
+ // Create regex that matches the call (with optional whitespace variations).
991
+ // TypeScript formatters commonly break type parameters across lines, e.g.:
992
+ // useLoaderData<
993
+ // typeof loader
994
+ // >()
995
+ // So we allow optional whitespace around < and > delimiters, not just
996
+ // where whitespace already exists in the call signature string.
991
997
  const callRegex = new RegExp(
992
- escapedCallSignature.replace(/\s+/g, '\\s*'),
993
- 'g',
998
+ escapedCallSignature
999
+ .replace(/\s+/g, '\\s*')
1000
+ .replace(/</g, '\\s*<\\s*')
1001
+ .replace(/>/g, '\\s*>\\s*'),
1002
+ 'gs',
994
1003
  );
995
1004
  fileContent = fileContent.replace(callRegex, `${mockFunctionName}()`);
996
1005
  }
@@ -1012,15 +1021,29 @@ function addMockToContent(
1012
1021
  rootAnalysis.metadata?.scenariosDataStructure?.dataForMocks;
1013
1022
 
1014
1023
  // Find matching call signature key in dataForMocks
1024
+ // IMPORTANT: First try exact match with type parameters (e.g., "useLoaderData<LoaderData>()")
1025
+ // to avoid picking the wrong variant (e.g., "useLoaderData<typeof loader>()" which may
1026
+ // have different properties). Fall back to base name matching only if exact match fails.
1015
1027
  const hookBaseName = importedExport.name.split(/[<(]/)[0];
1016
- const callSignatureKey = dataForMocks
1017
- ? Object.keys(dataForMocks).find((key) => {
1028
+ const expectedKey = importedExport.calls?.[0];
1029
+ let callSignatureKey: string | undefined;
1030
+
1031
+ if (dataForMocks) {
1032
+ const keys = Object.keys(dataForMocks);
1033
+
1034
+ // First try exact match with the expected call signature
1035
+ if (expectedKey && keys.includes(expectedKey)) {
1036
+ callSignatureKey = expectedKey;
1037
+ } else {
1038
+ // Fall back to base name matching
1039
+ callSignatureKey = keys.find((key) => {
1018
1040
  // Split on ., <, or ( to get the true base name
1019
1041
  // This handles both "useFlags()" -> "useFlags" and "trpc.useUtils()" -> "trpc"
1020
1042
  const keyBaseName = key.split(/[.<(]/)[0];
1021
1043
  return keyBaseName === hookBaseName;
1022
- })
1023
- : undefined;
1044
+ });
1045
+ }
1046
+ }
1024
1047
 
1025
1048
  // Use the call signature if found, otherwise construct it
1026
1049
  const dataKey =
@@ -1061,18 +1084,36 @@ function addMockToContent(
1061
1084
  // IMPORTANT: We inline scenarios().data() inside the function rather than
1062
1085
  // storing in a const - see comment in constructMockCode.ts for why.
1063
1086
  if (!mockCode) {
1064
- mockCode = `function ${importedExport.name}(...args) {
1065
- return scenarios().data()?.["${dataKey}"];
1087
+ mockCode = `// PATCHED: memoize to return stable reference (prevents infinite useEffect re-triggers)
1088
+ const _${importedExport.name}Ref = {
1089
+ current: null,
1090
+ };
1091
+ function ${importedExport.name}(...args) {
1092
+ if (!_${importedExport.name}Ref.current) {
1093
+ _${importedExport.name}Ref.current = scenarios().data()?.["${dataKey}"];
1094
+ }
1095
+ return _${importedExport.name}Ref.current;
1066
1096
  }`;
1067
1097
  }
1068
1098
  } else {
1069
1099
  // Helper to find matching call signature key from dataForMocks
1100
+ // IMPORTANT: First try exact match with type parameters (e.g., "useLoaderData<LoaderData>()")
1101
+ // to avoid picking the wrong variant. Fall back to base name matching only if needed.
1070
1102
  const hookBaseName = importedExport.name.split(/[<(]/)[0];
1103
+ const expectedKey = importedExport.calls?.[0];
1071
1104
  const findMatchingKey = (
1072
1105
  dataForMocks: Record<string, unknown> | undefined,
1073
1106
  ): string | undefined => {
1074
1107
  if (!dataForMocks) return undefined;
1075
- return Object.keys(dataForMocks).find((key) => {
1108
+ const keys = Object.keys(dataForMocks);
1109
+
1110
+ // First try exact match with the expected call signature
1111
+ if (expectedKey && keys.includes(expectedKey)) {
1112
+ return expectedKey;
1113
+ }
1114
+
1115
+ // Fall back to base name matching
1116
+ return keys.find((key) => {
1076
1117
  // Split on ., <, or ( to get the true base name
1077
1118
  // This handles both "useFlags()" -> "useFlags" and "trpc.useUtils()" -> "trpc"
1078
1119
  const keyBaseName = key.split(/[.<(]/)[0];
@@ -1131,8 +1172,15 @@ function addMockToContent(
1131
1172
  // IMPORTANT: We inline scenarios().data() inside the function rather than
1132
1173
  // storing in a const - see comment in constructMockCode.ts for why.
1133
1174
  if (!mockCode && dataKey) {
1134
- mockCode = `function ${importedExport.name}(...args) {
1135
- return scenarios().data()?.["${dataKey}"];
1175
+ mockCode = `// PATCHED: memoize to return stable reference (prevents infinite useEffect re-triggers)
1176
+ const _${importedExport.name}Ref = {
1177
+ current: null,
1178
+ };
1179
+ function ${importedExport.name}(...args) {
1180
+ if (!_${importedExport.name}Ref.current) {
1181
+ _${importedExport.name}Ref.current = scenarios().data()?.["${dataKey}"];
1182
+ }
1183
+ return _${importedExport.name}Ref.current;
1136
1184
  }`;
1137
1185
  }
1138
1186
  }
@@ -277,16 +277,17 @@ export default async function writeSimpleRoot(
277
277
  let mockKey: string | undefined;
278
278
 
279
279
  if (matchingKeys.length > 1) {
280
- // Parse root.tsx to find how this hook is used
281
- // Look for patterns like: const { prop1, prop2 } = useLoaderData()
282
- // or: const result = useLoaderData()
280
+ // Parse root.tsx to find how this hook is used, INCLUDING type parameters
281
+ // Look for patterns like: const { prop1, prop2 } = useLoaderData<LoaderData>()
282
+ // or: const result = useLoaderData<typeof loader>()
283
283
  const hookUsageRegex = new RegExp(
284
- `(?:const|let|var)\\s+(?:\\{([^}]+)\\}|([a-zA-Z_][a-zA-Z0-9_]*))\\s*=\\s*${entityName}(?:<[^>]*>)?\\s*\\(`,
284
+ `(?:const|let|var)\\s+(?:\\{([^}]+)\\}|([a-zA-Z_][a-zA-Z0-9_]*))\\s*=\\s*${entityName}(<[^>]+>)?\\s*\\(`,
285
285
  'g',
286
286
  );
287
287
 
288
288
  const matches = [...newContent.matchAll(hookUsageRegex)];
289
289
  const rootPropertyNames: string[] = [];
290
+ const typeParamsUsed: Set<string> = new Set();
290
291
 
291
292
  for (const match of matches) {
292
293
  if (match[1]) {
@@ -300,17 +301,26 @@ export default async function writeSimpleRoot(
300
301
  // Simple assignment: const result = ...
301
302
  rootPropertyNames.push(match[2]);
302
303
  }
304
+ // Capture type parameters used (e.g., "<LoaderData>", "<typeof loader>")
305
+ if (match[3]) {
306
+ typeParamsUsed.add(match[3]);
307
+ }
303
308
  }
304
309
 
305
- // Find a key that matches by call signature
306
- // For call signature format (e.g., "useLoaderData()"), just use the first match
307
- mockKey = matchingKeys[0];
310
+ // First, try to find a key that matches the exact type parameters used in the source
311
+ // e.g., if source has useLoaderData<LoaderData>(), prefer "useLoaderData<LoaderData>()" key
312
+ if (typeParamsUsed.size > 0) {
313
+ for (const typeParam of typeParamsUsed) {
314
+ const exactKey = `${entityName}${typeParam}()`;
315
+ if (matchingKeys.includes(exactKey)) {
316
+ mockKey = exactKey;
317
+ break;
318
+ }
319
+ }
320
+ }
308
321
 
309
- // Fallback: if no match found but there are multiple keys,
310
- // exclude the route's key (which we can identify from mockedImports variable names)
322
+ // Fallback: if no exact type parameter match, use the first match
311
323
  if (!mockKey) {
312
- // The route's variable names would be in its own analysis
313
- // For simplicity, just use the first key that's different from the most common pattern
314
324
  mockKey = matchingKeys[0];
315
325
  }
316
326
  } else if (matchingKeys.length === 1) {
@@ -16,7 +16,7 @@ export async function createAnalyzerTemplate(absoluteCodeyamRootPath) {
16
16
  await copyFolderToArchive({
17
17
  source: folder,
18
18
  destination: `${absoluteCodeyamRootPath}/${folderName}`,
19
- exclude: ['__tests__'],
19
+ exclude: ['__tests__', 'node_modules'],
20
20
  recursive: true,
21
21
  });
22
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"createLocalAnalyzer.js","sourceRoot":"","sources":["../../../../../../background/src/lib/local/createLocalAnalyzer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createLocalAnalyzer.js","sourceRoot":"","sources":["../../../../../../background/src/lib/local/createLocalAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -957,11 +957,19 @@ options) {
957
957
  // Valid patterns where arrow function is NOT bare:
958
958
  // 1. Property value: "key: (arg) => ..." - ends with ':'
959
959
  // 2. Function argument: ".map((arg) => ..." - ends with '('
960
+ // 3. Method call: "?.map" followed directly by the arrow function
961
+ // In this case, the '(' is consumed by the arrow function regex match,
962
+ // so beforeTrimmed ends with the method name (e.g., 'map'), not '('.
963
+ // We detect this by checking if beforeTrimmed ends with an identifier
964
+ // that could be a method name (preceded by '.' or '?.').
960
965
  // NOTE: We don't include ',' because "{ prop, () => {} }" is invalid
961
966
  // (can't distinguish function argument from object property context)
962
967
  const isPropertyValue = beforeTrimmed.endsWith(':');
963
968
  const isFunctionArg = beforeTrimmed.endsWith('(');
964
- const hasPropertyName = isPropertyValue || isFunctionArg;
969
+ // Check if before ends with a method call pattern like ".map" or "?.map"
970
+ // The '(' after the method name is consumed by the arrow function regex
971
+ const isMethodCallArg = /\??\.\w+$/.test(beforeTrimmed);
972
+ const hasPropertyName = isPropertyValue || isFunctionArg || isMethodCallArg;
965
973
  if (!hasPropertyName) {
966
974
  // This is a bare arrow function - filter it out
967
975
  // Found arrow function start, need to find its end
@@ -1162,6 +1170,16 @@ options) {
1162
1170
  returnValueContents = `${arrayBasePath}?.map((__item__, __idx__) => (\n${indent(trimmedContent)}\n))`;
1163
1171
  }
1164
1172
  else {
1173
+ // When generating object-wrapped .map(), ensure original item data is preserved.
1174
+ // If no data spread was included (e.g., because this is a plain array property,
1175
+ // not a function return), add ...__item__ to spread the original item properties.
1176
+ // Without this, the .map() would create new objects with only nested function
1177
+ // properties, losing data like filePath, frontmatter, body, etc.
1178
+ const hasDataSpread = mappedContents.includes('...scenarios()') ||
1179
+ mappedContents.includes('...__item__');
1180
+ if (!hasDataSpread) {
1181
+ mappedContents = `...__item__,\n${mappedContents}`;
1182
+ }
1165
1183
  returnValueContents = `${arrayBasePath}?.map((__item__, __idx__) => ({\n${indent(mappedContents)}\n}))`;
1166
1184
  }
1167
1185
  } // Close the empty content check else block
@@ -1223,6 +1241,13 @@ options) {
1223
1241
  mappedContents = filterOutArrowFunctions(mappedContents);
1224
1242
  mappedContents = filterOutBareObjects(mappedContents, true);
1225
1243
  mappedContents = cleanupContent(mappedContents);
1244
+ // Same as needsWrapper branch: ensure item data is preserved in .map()
1245
+ const hasDataSpreadInner = mappedContents.includes('...scenarios()') ||
1246
+ mappedContents.includes('...__item__');
1247
+ if (!hasDataSpreadInner && mappedContents.trim().length > 0) {
1248
+ // Insert ...__item__ after the opening brace
1249
+ mappedContents = mappedContents.replace(/^\s*\{/, '{\n...__item__,');
1250
+ }
1226
1251
  returnValueContents = `${arrayBasePath}?.map((__item__, __idx__) => (\n${indent(mappedContents)}\n))`;
1227
1252
  }
1228
1253
  }
@@ -1423,6 +1448,36 @@ options) {
1423
1448
  }
1424
1449
  return 0;
1425
1450
  });
1451
+ // OPTIMIZATION: Pre-compute prefix indexes for O(1) lookups instead of O(n) scans.
1452
+ // This reduces complexity from O(n²) to O(n) for large schemas (9k+ keys).
1453
+ //
1454
+ // 1. extendedReturnValuePrefixes: Set of all path prefixes that have a .functionCallReturnValue extension
1455
+ // Used by hasExtendedFunctionCallReturnValue check at line ~1754
1456
+ // 2. functionCallsWithReturnValue: Set of function call paths where .functionCallReturnValue IMMEDIATELY follows
1457
+ // Used by hasProperFunctionCallPath check at line ~1787
1458
+ // IMPORTANT: Only includes paths where the function call is directly followed by .functionCallReturnValue
1459
+ // e.g., "a.b().functionCallReturnValue" -> adds "a.b()" but NOT "a" even if "a" ends with ")"
1460
+ const extendedReturnValuePrefixes = new Set();
1461
+ const functionCallsWithReturnValue = new Set();
1462
+ for (const k of relevantKeys) {
1463
+ const parts = splitOutsideParenthesesAndArrays(k);
1464
+ const returnValueIndex = parts.findIndex((part) => part.startsWith(RETURN_VALUE));
1465
+ if (returnValueIndex !== -1) {
1466
+ // Add all prefixes of k up to (but not including) functionCallReturnValue
1467
+ const prefix = joinParenthesesAndArrays(parts.slice(0, returnValueIndex));
1468
+ extendedReturnValuePrefixes.add(prefix);
1469
+ // ONLY add to functionCallsWithReturnValue if functionCallReturnValue IMMEDIATELY follows
1470
+ if (prefix.endsWith(')')) {
1471
+ functionCallsWithReturnValue.add(prefix);
1472
+ }
1473
+ // Also add intermediate prefixes for nested paths to extendedReturnValuePrefixes
1474
+ // This helps hasExtendedFunctionCallReturnValue which checks key + '.'
1475
+ for (let i = 1; i < returnValueIndex; i++) {
1476
+ const partialPrefix = joinParenthesesAndArrays(parts.slice(0, i));
1477
+ extendedReturnValuePrefixes.add(partialPrefix);
1478
+ }
1479
+ }
1480
+ }
1426
1481
  for (const key of sortedKeys) {
1427
1482
  const value = relevantReturnValueSchema[key];
1428
1483
  const parts = splitOutsideParenthesesAndArrays(key);
@@ -1468,7 +1523,9 @@ options) {
1468
1523
  // nested inside (e.g., methods on array elements passed as arguments).
1469
1524
  if (hasSignaturePath)
1470
1525
  continue;
1471
- const hasExtendedFunctionCallReturnValue = Object.keys(relevantReturnValueSchema).some((k) => k.startsWith(key + '.') && k.includes(`.${RETURN_VALUE}`));
1526
+ // OPTIMIZATION: Use pre-computed index instead of O(n) scan
1527
+ // Old code: Object.keys(relevantReturnValueSchema).some((k) => k.startsWith(key + '.') && k.includes('.functionCallReturnValue'))
1528
+ const hasExtendedFunctionCallReturnValue = extendedReturnValuePrefixes.has(key);
1472
1529
  // Skip JSX components - they look like function calls (e.g., Context.Provider())
1473
1530
  // but they're React components used in JSX, not functions that need mocking
1474
1531
  // Check both the value type and whether the functionCallReturnValue is jsx-component
@@ -1493,7 +1550,9 @@ options) {
1493
1550
  // This part is a function call, and the next part is NOT .functionCallReturnValue
1494
1551
  // Check if there's any path with .functionCallReturnValue for this function call
1495
1552
  const functionCallPath = joinParenthesesAndArrays(parts.slice(0, i + 1));
1496
- const hasProperFunctionCallPath = Object.keys(relevantReturnValueSchema).some((k) => k.startsWith(functionCallPath + '.functionCallReturnValue'));
1553
+ // OPTIMIZATION: Use pre-computed index instead of O(n) scan
1554
+ // Old code: Object.keys(relevantReturnValueSchema).some((k) => k.startsWith(functionCallPath + '.functionCallReturnValue'))
1555
+ const hasProperFunctionCallPath = functionCallsWithReturnValue.has(functionCallPath);
1497
1556
  if (hasProperFunctionCallPath) {
1498
1557
  // Skip this path - the .functionCallReturnValue path will handle it correctly
1499
1558
  shouldSkipKey = true;
@@ -2005,7 +2064,19 @@ options) {
2005
2064
  const safeReturnValue = isSimpleDataPath
2006
2065
  ? `${returnValue} ?? {}`
2007
2066
  : returnValue;
2008
- return `${isRootAsyncFunction ? 'async ' : ''}function ${safeFunctionName}(...args) {\n${indent(`return ${safeReturnValue};`)}\n}`;
2067
+ const refName = `_${safeFunctionName}Ref`;
2068
+ const assignment = `${refName}.current = ${safeReturnValue};`;
2069
+ const ifBlock = `if (!${refName}.current) {\n${indent(assignment)}\n}`;
2070
+ const body = `${ifBlock}\nreturn ${refName}.current;`;
2071
+ return [
2072
+ `// PATCHED: memoize to return stable reference (prevents infinite useEffect re-triggers)`,
2073
+ `const ${refName} = {`,
2074
+ ` current: null,`,
2075
+ `};`,
2076
+ `${isRootAsyncFunction ? 'async ' : ''}function ${safeFunctionName}(...args) {`,
2077
+ indent(body),
2078
+ `}`,
2079
+ ].join('\n');
2009
2080
  }
2010
2081
  else {
2011
2082
  // Generate safe const name: