@codeyam/codeyam-cli 0.1.0-staging.1669d45 → 0.1.0-staging.323686

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 (362) hide show
  1. package/analyzer-template/.build-info.json +8 -8
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +3 -3
  4. package/analyzer-template/packages/ai/index.ts +9 -1
  5. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +48 -34
  6. package/analyzer-template/packages/ai/src/lib/astScopes/arrayDerivationDetector.ts +199 -0
  7. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +31 -0
  8. package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +139 -23
  9. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.ts +6 -126
  10. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +277 -8
  11. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +73 -1
  12. package/analyzer-template/packages/ai/src/lib/completionCall.ts +198 -34
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +108 -1
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.ts +205 -0
  15. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +10 -2
  16. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +23 -0
  17. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +87 -2
  18. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +32 -7
  19. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.ts +129 -0
  20. package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +156 -0
  21. package/analyzer-template/packages/ai/src/lib/e2eDataTracking.ts +334 -0
  22. package/analyzer-template/packages/ai/src/lib/extractCriticalDataKeys.ts +120 -0
  23. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +626 -6
  24. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +26 -1
  25. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +375 -6
  26. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +1003 -45
  27. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +239 -0
  28. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChunkPrompt.ts +82 -0
  29. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateCriticalKeysPrompt.ts +103 -0
  30. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +23 -6
  31. package/analyzer-template/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.ts +391 -0
  32. package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +154 -32
  33. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +22 -1
  34. package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +114 -2
  35. package/analyzer-template/packages/analyze/src/lib/analysisContext.ts +44 -4
  36. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +10 -13
  37. package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +6 -0
  38. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +33 -7
  39. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +142 -73
  40. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +42 -5
  41. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +1 -1
  42. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +77 -0
  43. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.ts +56 -11
  44. package/analyzer-template/packages/aws/package.json +1 -1
  45. package/analyzer-template/packages/database/src/lib/kysely/db.ts +8 -1
  46. package/analyzer-template/packages/database/src/lib/kysely/tables/commitsTable.ts +6 -0
  47. package/analyzer-template/packages/database/src/lib/loadAnalyses.ts +58 -1
  48. package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +13 -0
  49. package/analyzer-template/packages/database/src/lib/loadBranch.ts +16 -1
  50. package/analyzer-template/packages/database/src/lib/loadCommit.ts +11 -0
  51. package/analyzer-template/packages/database/src/lib/loadCommits.ts +28 -0
  52. package/analyzer-template/packages/database/src/lib/loadEntities.ts +26 -3
  53. package/analyzer-template/packages/database/src/lib/loadEntityBranches.ts +12 -0
  54. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +7 -14
  55. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
  56. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +8 -1
  57. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
  58. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts.map +1 -1
  59. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts +1 -0
  60. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts.map +1 -1
  61. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js +3 -0
  62. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
  63. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts +2 -0
  64. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts.map +1 -1
  65. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js +45 -2
  66. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js.map +1 -1
  67. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
  68. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +8 -0
  69. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
  70. package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js +11 -1
  71. package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js.map +1 -1
  72. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.d.ts.map +1 -1
  73. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js +7 -0
  74. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js.map +1 -1
  75. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts +3 -1
  76. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
  77. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +22 -1
  78. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
  79. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts +3 -1
  80. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts.map +1 -1
  81. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +23 -4
  82. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
  83. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.d.ts.map +1 -1
  84. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js +9 -0
  85. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js.map +1 -1
  86. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts +2 -2
  87. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  88. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +5 -4
  89. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  90. package/analyzer-template/packages/github/dist/types/index.d.ts +1 -1
  91. package/analyzer-template/packages/github/dist/types/index.d.ts.map +1 -1
  92. package/analyzer-template/packages/github/dist/types/index.js.map +1 -1
  93. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts +25 -1
  94. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts.map +1 -1
  95. package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts +2 -0
  96. package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts.map +1 -1
  97. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +51 -1
  98. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  99. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts +9 -1
  100. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
  101. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js +29 -3
  102. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js.map +1 -1
  103. package/analyzer-template/packages/types/index.ts +1 -0
  104. package/analyzer-template/packages/types/src/types/Analysis.ts +25 -0
  105. package/analyzer-template/packages/types/src/types/Commit.ts +2 -0
  106. package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +64 -1
  107. package/analyzer-template/packages/utils/dist/types/index.d.ts +1 -1
  108. package/analyzer-template/packages/utils/dist/types/index.d.ts.map +1 -1
  109. package/analyzer-template/packages/utils/dist/types/index.js.map +1 -1
  110. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts +25 -1
  111. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts.map +1 -1
  112. package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts +2 -0
  113. package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts.map +1 -1
  114. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +51 -1
  115. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  116. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts +9 -1
  117. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
  118. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js +29 -3
  119. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js.map +1 -1
  120. package/analyzer-template/packages/utils/src/lib/safeFileName.ts +48 -3
  121. package/analyzer-template/playwright/capture.ts +20 -8
  122. package/analyzer-template/playwright/captureStatic.ts +1 -1
  123. package/analyzer-template/project/analyzeBaselineCommit.ts +5 -0
  124. package/analyzer-template/project/analyzeRegularCommit.ts +5 -0
  125. package/analyzer-template/project/captureLibraryFunctionDirect.ts +29 -26
  126. package/analyzer-template/project/constructMockCode.ts +314 -29
  127. package/analyzer-template/project/createEntitiesAndSortFiles.ts +83 -0
  128. package/analyzer-template/project/loadReadyToBeCaptured.ts +65 -41
  129. package/analyzer-template/project/orchestrateCapture/AwsCaptureTaskRunner.ts +12 -4
  130. package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +18 -7
  131. package/analyzer-template/project/orchestrateCapture/taskRunner.ts +4 -2
  132. package/analyzer-template/project/orchestrateCapture.ts +71 -6
  133. package/analyzer-template/project/reconcileMockDataKeys.ts +152 -9
  134. package/analyzer-template/project/runAnalysis.ts +4 -0
  135. package/analyzer-template/project/start.ts +35 -11
  136. package/analyzer-template/project/writeMockDataTsx.ts +114 -2
  137. package/analyzer-template/project/writeScenarioComponents.ts +101 -8
  138. package/analyzer-template/scripts/comboWorkerLoop.cjs +98 -50
  139. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js +5 -0
  140. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js.map +1 -1
  141. package/background/src/lib/virtualized/project/analyzeRegularCommit.js +5 -0
  142. package/background/src/lib/virtualized/project/analyzeRegularCommit.js.map +1 -1
  143. package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js +3 -3
  144. package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js.map +1 -1
  145. package/background/src/lib/virtualized/project/constructMockCode.js +255 -4
  146. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  147. package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js +73 -1
  148. package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js.map +1 -1
  149. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js +19 -8
  150. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js.map +1 -1
  151. package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js +2 -2
  152. package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js.map +1 -1
  153. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js +7 -5
  154. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
  155. package/background/src/lib/virtualized/project/orchestrateCapture.js +58 -6
  156. package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
  157. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +126 -9
  158. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  159. package/background/src/lib/virtualized/project/runAnalysis.js +3 -0
  160. package/background/src/lib/virtualized/project/runAnalysis.js.map +1 -1
  161. package/background/src/lib/virtualized/project/start.js +32 -11
  162. package/background/src/lib/virtualized/project/start.js.map +1 -1
  163. package/background/src/lib/virtualized/project/writeMockDataTsx.js +89 -2
  164. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  165. package/background/src/lib/virtualized/project/writeScenarioComponents.js +57 -8
  166. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  167. package/codeyam-cli/src/cli.js +2 -0
  168. package/codeyam-cli/src/cli.js.map +1 -1
  169. package/codeyam-cli/src/commands/memory.js +273 -0
  170. package/codeyam-cli/src/commands/memory.js.map +1 -0
  171. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +4 -0
  172. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  173. package/codeyam-cli/src/utils/analysisRunner.js +21 -2
  174. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  175. package/codeyam-cli/src/utils/install-skills.js +20 -6
  176. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  177. package/codeyam-cli/src/utils/queue/job.js +1 -0
  178. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  179. package/codeyam-cli/src/utils/queue/manager.js +6 -0
  180. package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
  181. package/codeyam-cli/src/utils/rules/index.js +5 -0
  182. package/codeyam-cli/src/utils/rules/index.js.map +1 -0
  183. package/codeyam-cli/src/utils/rules/parser.js +106 -0
  184. package/codeyam-cli/src/utils/rules/parser.js.map +1 -0
  185. package/codeyam-cli/src/utils/rules/pathMatcher.js +18 -0
  186. package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -0
  187. package/codeyam-cli/src/utils/rules/staleness.js +132 -0
  188. package/codeyam-cli/src/utils/rules/staleness.js.map +1 -0
  189. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +2 -0
  190. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  191. package/codeyam-cli/src/webserver/app/lib/database.js +7 -3
  192. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  193. package/codeyam-cli/src/webserver/bootstrap.js +40 -0
  194. package/codeyam-cli/src/webserver/bootstrap.js.map +1 -1
  195. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-DsN1wKrm.js +11 -0
  196. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-COi5OvsN.js → EntityTypeBadge-DLqD3qNt.js} +1 -1
  197. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-BwdQv49w.js → EntityTypeIcon-Ba2JVPzP.js} +1 -1
  198. package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-CEleMv_j.js → InlineSpinner-C8lyxW9k.js} +1 -1
  199. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-D68KarMg.js → InteractivePreview-aht4aafF.js} +2 -2
  200. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-L75Wvqgw.js → LibraryFunctionPreview-CVtiBnY5.js} +1 -1
  201. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-C53WM8qn.js → LoadingDots-B0GLXMsr.js} +1 -1
  202. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-CrNkmy4i.js → LogViewer-xgeCVgSM.js} +1 -1
  203. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-OApQuNyq.js +16 -0
  204. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-CQifa1n-.js → SafeScreenshot-DuDvi0jm.js} +1 -1
  205. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-CyaBFX7l.js → ScenarioViewer-DzccYyI8.js} +3 -13
  206. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-D36O1rzU.js → TruncatedFilePath-DyFZkK0l.js} +1 -1
  207. package/codeyam-cli/src/webserver/build/client/assets/_index-BwqWJOgH.js +11 -0
  208. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BwavGCpm.js +32 -0
  209. package/codeyam-cli/src/webserver/build/client/assets/api.health-l0sNRNKZ.js +1 -0
  210. package/codeyam-cli/src/webserver/build/client/assets/api.memory-profile-l0sNRNKZ.js +1 -0
  211. package/codeyam-cli/src/webserver/build/client/assets/api.restart-server-l0sNRNKZ.js +1 -0
  212. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-DgTPh8H-.js → chevron-down-Cx24_aWc.js} +1 -1
  213. package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-DdQKK6on.js → chunk-EPOLDU6W-CXRTFQ3F.js} +1 -1
  214. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-Dmr2bb1R.js → circle-check-BOARzkeR.js} +1 -1
  215. package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +6 -0
  216. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-Do4ZLUYa.js → createLucideIcon-BdhJEx6B.js} +1 -1
  217. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BBnGWYga.js +1 -0
  218. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CbdFyxZh.js → entity._sha._-BJUiQqZF.js} +12 -12
  219. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-B4iCfs5M.js → entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js} +1 -1
  220. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-wDWZZO1W.js → entity._sha_.create-scenario-D1T4TGjf.js} +1 -1
  221. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-BMbl7MeQ.js → entity._sha_.edit._scenarioId-CTBG2mmz.js} +1 -1
  222. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-5wRKRIH9.js → entry.client-CS2cb_eZ.js} +1 -1
  223. package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +6 -0
  224. package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DD3SDH7t.js → fileTableUtils-DMJ7zii9.js} +1 -1
  225. package/codeyam-cli/src/webserver/build/client/assets/files-CJ6lTdTA.js +1 -0
  226. package/codeyam-cli/src/webserver/build/client/assets/{git-zXjT7J0G.js → git-CPTZZ-JZ.js} +8 -8
  227. package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +1 -0
  228. package/codeyam-cli/src/webserver/build/client/assets/{index-DLbXwndH.js → index-B1h680n5.js} +1 -1
  229. package/codeyam-cli/src/webserver/build/client/assets/{index-gPZ-lad1.js → index-lzqtyFU8.js} +1 -1
  230. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BsPXJ81F.js → loader-circle-B7B9V-bu.js} +1 -1
  231. package/codeyam-cli/src/webserver/build/client/assets/manifest-7522edd4.js +1 -0
  232. package/codeyam-cli/src/webserver/build/client/assets/memory-yxFcrxBX.js +92 -0
  233. package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +62 -0
  234. package/codeyam-cli/src/webserver/build/client/assets/{search-P2FKIUql.js → search-CxXUmBSd.js} +1 -1
  235. package/codeyam-cli/src/webserver/build/client/assets/{settings-B2eDuBj8.js → settings-CS5f3WzT.js} +1 -1
  236. package/codeyam-cli/src/webserver/build/client/assets/{simulations-L18M6-kN.js → simulations-DwFIBT09.js} +1 -1
  237. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-BDz7kbVA.js → triangle-alert-B6LgvRJg.js} +1 -1
  238. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-29dDmbH8.js → useCustomSizes-C1v1PQzo.js} +1 -1
  239. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-BUm0UVJm.js → useLastLogLine-aSv48UbS.js} +1 -1
  240. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-CkIOKTrZ.js → useReportContext-DYxHZQuP.js} +1 -1
  241. package/codeyam-cli/src/webserver/build/client/assets/{useToast-KKw5kTn-.js → useToast-mBRpZPiu.js} +1 -1
  242. package/codeyam-cli/src/webserver/build/server/assets/index-DVzYx8PN.js +1 -0
  243. package/codeyam-cli/src/webserver/build/server/assets/server-build-4Cr0uToj.js +257 -0
  244. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  245. package/codeyam-cli/src/webserver/build-info.json +5 -5
  246. package/codeyam-cli/templates/codeyam-memory-hook.sh +200 -0
  247. package/codeyam-cli/templates/codeyam:debug.md +47 -3
  248. package/codeyam-cli/templates/codeyam:diagnose.md +203 -25
  249. package/codeyam-cli/templates/codeyam:memory.md +462 -0
  250. package/codeyam-cli/templates/codeyam:new-rule.md +13 -0
  251. package/package.json +8 -5
  252. package/packages/ai/index.js +5 -2
  253. package/packages/ai/index.js.map +1 -1
  254. package/packages/ai/src/lib/analyzeScope.js +41 -17
  255. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  256. package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js +150 -0
  257. package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js.map +1 -0
  258. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +24 -0
  259. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  260. package/packages/ai/src/lib/astScopes/methodSemantics.js +109 -23
  261. package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
  262. package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js +1 -102
  263. package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js.map +1 -1
  264. package/packages/ai/src/lib/astScopes/processExpression.js +228 -11
  265. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  266. package/packages/ai/src/lib/completionCall.js +161 -30
  267. package/packages/ai/src/lib/completionCall.js.map +1 -1
  268. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +86 -1
  269. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  270. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js +179 -0
  271. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js.map +1 -1
  272. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +7 -1
  273. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
  274. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +19 -0
  275. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  276. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +70 -2
  277. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  278. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +29 -7
  279. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  280. package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js +107 -0
  281. package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js.map +1 -0
  282. package/packages/ai/src/lib/dataStructureChunking.js +111 -0
  283. package/packages/ai/src/lib/dataStructureChunking.js.map +1 -0
  284. package/packages/ai/src/lib/e2eDataTracking.js +241 -0
  285. package/packages/ai/src/lib/e2eDataTracking.js.map +1 -0
  286. package/packages/ai/src/lib/extractCriticalDataKeys.js +96 -0
  287. package/packages/ai/src/lib/extractCriticalDataKeys.js.map +1 -0
  288. package/packages/ai/src/lib/generateEntityScenarioData.js +510 -7
  289. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  290. package/packages/ai/src/lib/generateEntityScenarios.js +19 -1
  291. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  292. package/packages/ai/src/lib/generateExecutionFlows.js +273 -4
  293. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  294. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +738 -40
  295. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
  296. package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js +194 -0
  297. package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js.map +1 -0
  298. package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js +54 -0
  299. package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js.map +1 -0
  300. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +15 -7
  301. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  302. package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js +335 -0
  303. package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js.map +1 -0
  304. package/packages/ai/src/lib/resolvePathToControllable.js +131 -27
  305. package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
  306. package/packages/ai/src/lib/worker/SerializableDataStructure.js +7 -0
  307. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  308. package/packages/ai/src/lib/worker/analyzeScopeWorker.js +94 -1
  309. package/packages/ai/src/lib/worker/analyzeScopeWorker.js.map +1 -1
  310. package/packages/analyze/src/lib/analysisContext.js +30 -5
  311. package/packages/analyze/src/lib/analysisContext.js.map +1 -1
  312. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +8 -4
  313. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  314. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +5 -0
  315. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
  316. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +31 -7
  317. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  318. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +116 -66
  319. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  320. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +37 -5
  321. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  322. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +1 -1
  323. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  324. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +65 -0
  325. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  326. package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js +46 -9
  327. package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js.map +1 -1
  328. package/packages/database/src/lib/kysely/db.js +8 -1
  329. package/packages/database/src/lib/kysely/db.js.map +1 -1
  330. package/packages/database/src/lib/kysely/tables/commitsTable.js +3 -0
  331. package/packages/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
  332. package/packages/database/src/lib/loadAnalyses.js +45 -2
  333. package/packages/database/src/lib/loadAnalyses.js.map +1 -1
  334. package/packages/database/src/lib/loadAnalysis.js +8 -0
  335. package/packages/database/src/lib/loadAnalysis.js.map +1 -1
  336. package/packages/database/src/lib/loadBranch.js +11 -1
  337. package/packages/database/src/lib/loadBranch.js.map +1 -1
  338. package/packages/database/src/lib/loadCommit.js +7 -0
  339. package/packages/database/src/lib/loadCommit.js.map +1 -1
  340. package/packages/database/src/lib/loadCommits.js +22 -1
  341. package/packages/database/src/lib/loadCommits.js.map +1 -1
  342. package/packages/database/src/lib/loadEntities.js +23 -4
  343. package/packages/database/src/lib/loadEntities.js.map +1 -1
  344. package/packages/database/src/lib/loadEntityBranches.js +9 -0
  345. package/packages/database/src/lib/loadEntityBranches.js.map +1 -1
  346. package/packages/database/src/lib/updateCommitMetadata.js +5 -4
  347. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  348. package/packages/types/index.js.map +1 -1
  349. package/packages/utils/src/lib/safeFileName.js +29 -3
  350. package/packages/utils/src/lib/safeFileName.js.map +1 -1
  351. package/scripts/finalize-analyzer.cjs +3 -3
  352. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-vauWK972.js +0 -1
  353. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-DzJRkCkr.js +0 -11
  354. package/codeyam-cli/src/webserver/build/client/assets/_index-Be83mo_j.js +0 -11
  355. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BN6wu6Y-.js +0 -37
  356. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-Bn6aCAy_.js +0 -1
  357. package/codeyam-cli/src/webserver/build/client/assets/files-DKyMFI90.js +0 -1
  358. package/codeyam-cli/src/webserver/build/client/assets/globals-DTTQ3gY7.css +0 -1
  359. package/codeyam-cli/src/webserver/build/client/assets/manifest-22590fcf.js +0 -1
  360. package/codeyam-cli/src/webserver/build/client/assets/root-BsAarjAM.js +0 -57
  361. package/codeyam-cli/src/webserver/build/server/assets/index-BND5I5fv.js +0 -1
  362. package/codeyam-cli/src/webserver/build/server/assets/server-build-CFXnd7MG.js +0 -228
@@ -1,5 +1,6 @@
1
1
  import OpenAI from 'openai';
2
2
  import * as lib from '../lib';
3
+ import { trackDataSnapshot } from './e2eDataTracking';
3
4
 
4
5
  import PQueue from 'p-queue';
5
6
  import { default as PRetry, Options } from 'p-retry';
@@ -9,6 +10,7 @@ import { getModelInfo } from './modelInfo';
9
10
  import { AI } from './types';
10
11
  import { callClaudeCli } from './services/claudeCliAIService';
11
12
  import { isClaudeCliMode } from './services/aiServiceMode';
13
+ import { awsLogDebugLevel } from '~codeyam/utils';
12
14
 
13
15
  // set to 'true' only locally for e.g. benchmarking unassisted error rates
14
16
  const RETRIES_DISABLED = false;
@@ -66,7 +68,11 @@ export default async function completionCall({
66
68
  // When CODEYAM_LLM_FIXTURES_DIR is set, load responses from captured JSON files
67
69
  // instead of making real API calls
68
70
  if (process.env.CODEYAM_LLM_FIXTURES_DIR) {
69
- return await replayLlmCall(type, process.env.CODEYAM_LLM_FIXTURES_DIR);
71
+ return await replayLlmCall(
72
+ type,
73
+ process.env.CODEYAM_LLM_FIXTURES_DIR,
74
+ systemMessage,
75
+ );
70
76
  }
71
77
 
72
78
  console.log(
@@ -133,10 +139,35 @@ export default async function completionCall({
133
139
  () => {
134
140
  queueEndTime = Date.now();
135
141
  return PRetry(
136
- () => {
137
- return openai.chat.completions.create(params, {
138
- timeout: 5 * 60 * 1000, // 5 minute timeout
139
- });
142
+ async () => {
143
+ const callStartTime = Date.now();
144
+ const waitingMessages = [
145
+ 'Waiting for LLM response',
146
+ 'Still waiting for LLM response',
147
+ 'LLM call in progress',
148
+ 'Processing LLM request',
149
+ 'Awaiting LLM completion',
150
+ ];
151
+
152
+ const logInterval = setInterval(() => {
153
+ const elapsedSeconds = Math.floor(
154
+ (Date.now() - callStartTime) / 1000,
155
+ );
156
+ const messageIndex =
157
+ Math.floor(elapsedSeconds / 10) % waitingMessages.length;
158
+ awsLogDebugLevel(
159
+ 1,
160
+ `${waitingMessages[messageIndex]} [type=${type}, model=${model}, elapsed=${elapsedSeconds}s]`,
161
+ );
162
+ }, 10000);
163
+
164
+ try {
165
+ return await openai.chat.completions.create(params, {
166
+ timeout: 5 * 60 * 1000, // 5 minute timeout
167
+ });
168
+ } finally {
169
+ clearInterval(logInterval);
170
+ }
140
171
  },
141
172
  {
142
173
  ...defaultRetryOptions,
@@ -282,21 +313,46 @@ Please provide a corrected version with valid JSON only. Do not include any expl
282
313
  const correctionChatCompletion = await queue.add(
283
314
  () => {
284
315
  return PRetry(
285
- () => {
286
- return openai.chat.completions.create(
287
- {
288
- ...params,
289
- messages: [
290
- { role: 'system', content: systemMessage },
291
- { role: 'user', content: prompt },
292
- { role: 'assistant', content: completion },
293
- { role: 'user', content: correctionPrompt },
294
- ],
295
- },
296
- {
297
- timeout: 5 * 60 * 1000,
298
- },
299
- );
316
+ async () => {
317
+ const correctionStartTime = Date.now();
318
+ const waitingMessages = [
319
+ 'Waiting for LLM correction response',
320
+ 'Still waiting for LLM correction',
321
+ 'LLM correction in progress',
322
+ 'Processing LLM correction request',
323
+ 'Awaiting LLM correction completion',
324
+ ];
325
+
326
+ const logInterval = setInterval(() => {
327
+ const elapsedSeconds = Math.floor(
328
+ (Date.now() - correctionStartTime) / 1000,
329
+ );
330
+ const messageIndex =
331
+ Math.floor(elapsedSeconds / 10) % waitingMessages.length;
332
+ awsLogDebugLevel(
333
+ 1,
334
+ `${waitingMessages[messageIndex]} [type=${type}, model=${model}, elapsed=${elapsedSeconds}s]`,
335
+ );
336
+ }, 10000);
337
+
338
+ try {
339
+ return await openai.chat.completions.create(
340
+ {
341
+ ...params,
342
+ messages: [
343
+ { role: 'system', content: systemMessage },
344
+ { role: 'user', content: prompt },
345
+ { role: 'assistant', content: completion },
346
+ { role: 'user', content: correctionPrompt },
347
+ ],
348
+ },
349
+ {
350
+ timeout: 5 * 60 * 1000,
351
+ },
352
+ );
353
+ } finally {
354
+ clearInterval(logInterval);
355
+ }
300
356
  },
301
357
  {
302
358
  ...defaultRetryOptions,
@@ -372,6 +428,12 @@ Please provide a corrected version with valid JSON only. Do not include any expl
372
428
  }
373
429
  }
374
430
 
431
+ // Track the completion for E2E debugging
432
+ trackDataSnapshot(`completionCall_${type}`, {
433
+ completion,
434
+ finishReason: chatCompletion.choices[0].finish_reason,
435
+ });
436
+
375
437
  return {
376
438
  finishReason: chatCompletion.choices[0].finish_reason,
377
439
  completion,
@@ -388,11 +450,13 @@ export const QueueSize = () => queue.size;
388
450
  *
389
451
  * @param type - The prompt type to look up (e.g., 'generateEntityScenarios')
390
452
  * @param fixturesDir - Directory containing captured LLM call JSON files
453
+ * @param systemMessage - The system message for the call (used for content-based matching)
391
454
  * @returns Mocked completion response matching the structure of a real LLM call
392
455
  */
393
456
  async function replayLlmCall(
394
457
  type: string,
395
458
  fixturesDir: string,
459
+ systemMessage?: string,
396
460
  ): Promise<{
397
461
  finishReason: string;
398
462
  completion: string;
@@ -443,6 +507,16 @@ async function replayLlmCall(
443
507
  }
444
508
  }
445
509
 
510
+ // Sort fixtures by created_at timestamp to ensure deterministic ordering
511
+ // This is critical because filesystem order is not guaranteed
512
+ for (const promptType of Object.keys(callsByType)) {
513
+ callsByType[promptType].sort((a, b) => {
514
+ const timeA = a.created_at ?? 0;
515
+ const timeB = b.created_at ?? 0;
516
+ return timeA - timeB;
517
+ });
518
+ }
519
+
446
520
  const matchingCalls = callsByType[type];
447
521
 
448
522
  if (!matchingCalls || matchingCalls.length === 0) {
@@ -468,34 +542,124 @@ async function replayLlmCall(
468
542
  };
469
543
  }
470
544
 
471
- // Track call count per type and cycle through multiple responses
472
- const callKey = `${fixturesDir}::${type}`;
473
- if (!callIndexByType[callKey]) {
474
- callIndexByType[callKey] = 0;
545
+ // For scenario data generation calls, match by scenario name instead of cycling by index.
546
+ // This is critical because scenarios may be processed in parallel with Promise.all,
547
+ // causing non-deterministic call order. Matching by scenario name ensures each call
548
+ // gets the correct fixture regardless of execution order.
549
+ //
550
+ // We group fixtures by scenario name and track indices per scenario to handle
551
+ // multiple calls for the same scenario (e.g., main call + continuation call).
552
+ let call: any;
553
+ const scenarioBasedTypes = [
554
+ 'generateEntityScenarioData',
555
+ 'generateChunkMockData',
556
+ 'generateMissingMockData',
557
+ ];
558
+
559
+ if (scenarioBasedTypes.includes(type) && systemMessage) {
560
+ // Extract scenario name from system message: 'Scenario name must match exactly: "NAME"'
561
+ // or from chunk system message which includes scenario name
562
+ const scenarioNameMatch = systemMessage.match(
563
+ /Scenario name must match exactly: "([^"]+)"/,
564
+ );
565
+ const requestedScenarioName = scenarioNameMatch?.[1];
566
+
567
+ if (requestedScenarioName) {
568
+ // Group fixtures by scenario name
569
+ const fixturesByScenario: Record<string, any[]> = {};
570
+ for (const fixture of matchingCalls) {
571
+ try {
572
+ const props = JSON.parse(fixture.props || '{}');
573
+ const scenarioName = props.scenario?.name || '__NO_SCENARIO__';
574
+ if (!fixturesByScenario[scenarioName]) {
575
+ fixturesByScenario[scenarioName] = [];
576
+ }
577
+ fixturesByScenario[scenarioName].push(fixture);
578
+ } catch {
579
+ // Skip fixtures that can't be parsed
580
+ }
581
+ }
582
+
583
+ const scenarioFixtures = fixturesByScenario[requestedScenarioName];
584
+ if (scenarioFixtures && scenarioFixtures.length > 0) {
585
+ // Track call index per (type, scenario) combination
586
+ const scenarioCallKey = `${fixturesDir}::${type}::${requestedScenarioName}`;
587
+ if (callIndexByType[scenarioCallKey] === undefined) {
588
+ callIndexByType[scenarioCallKey] = 0;
589
+ }
590
+ const scenarioCallIndex = callIndexByType[scenarioCallKey];
591
+ callIndexByType[scenarioCallKey] =
592
+ (scenarioCallIndex + 1) % scenarioFixtures.length;
593
+
594
+ call = scenarioFixtures[scenarioCallIndex];
595
+ console.log(
596
+ `CodeYam Test: ✅ Matched fixture for scenario '${requestedScenarioName}' [${scenarioCallIndex + 1}/${scenarioFixtures.length}]`,
597
+ );
598
+ } else {
599
+ const availableScenarios = Object.keys(fixturesByScenario).join(', ');
600
+ console.warn(
601
+ `CodeYam Test: ⚠️ No fixture found for scenario '${requestedScenarioName}'. Available: [${availableScenarios}]`,
602
+ );
603
+ }
604
+ } else {
605
+ console.warn(
606
+ `CodeYam Test: ⚠️ Could not extract scenario name from system message for type '${type}'`,
607
+ );
608
+ }
475
609
  }
476
- const callIndex = callIndexByType[callKey];
477
- callIndexByType[callKey] = (callIndex + 1) % matchingCalls.length;
478
610
 
479
- const call = matchingCalls[callIndex];
611
+ // Fall back to index-based cycling if no scenario match was found
612
+ if (!call) {
613
+ const callKey = `${fixturesDir}::${type}`;
614
+ if (callIndexByType[callKey] === undefined) {
615
+ callIndexByType[callKey] = 0;
616
+ }
617
+ const callIndex = callIndexByType[callKey];
618
+ callIndexByType[callKey] = (callIndex + 1) % matchingCalls.length;
619
+ call = matchingCalls[callIndex];
480
620
 
481
- console.log(
482
- `CodeYam Test: Replaying LLM response for '${type}' [${callIndex + 1}/${matchingCalls.length}]`,
483
- );
621
+ console.log(
622
+ `CodeYam Test: Replaying LLM response for '${type}' [${callIndex + 1}/${matchingCalls.length}]`,
623
+ );
624
+ }
484
625
 
485
626
  // Extract the actual completion content from the OpenAI response
486
627
  // The response field contains the full OpenAI API response as a JSON string
487
- let completion: string;
628
+ let rawCompletion: string;
488
629
  try {
489
630
  const responseObj = JSON.parse(call.response);
490
- completion = responseObj.choices?.[0]?.message?.content || call.response;
631
+ rawCompletion =
632
+ responseObj.choices?.[0]?.message?.content || call.response;
491
633
  } catch {
492
634
  // If parsing fails, use the response as-is (for backwards compatibility)
493
- completion = call.response;
635
+ rawCompletion = call.response;
494
636
  }
495
637
 
638
+ // Apply the same post-processing as real completionCall() does
639
+ // This ensures replayed responses are processed identically to real API calls
640
+ // Step 1: Remove <think>...</think> sections that some models include
641
+ let processedCompletion = rawCompletion;
642
+ if (rawCompletion) {
643
+ processedCompletion = rawCompletion
644
+ .replace(/<think>[\s\S]*?<\/think>/g, '')
645
+ .trim();
646
+ }
647
+
648
+ // Step 2: Extract JSON from text that might have extra content around it
649
+ // (Only for JSON responses - we assume most LLM calls expect JSON)
650
+ const completion = processedCompletion
651
+ ? (processedCompletion.match(/\{[\s\S]*\}/)?.[0] ?? processedCompletion)
652
+ : processedCompletion;
653
+
654
+ // Track the replayed completion for E2E debugging
655
+ trackDataSnapshot(`completionCall_${type}`, {
656
+ completion: completion || '',
657
+ finishReason: 'stop',
658
+ });
659
+
496
660
  return {
497
661
  finishReason: 'stop',
498
- completion,
662
+ completion: completion || '',
499
663
  stats: {
500
664
  model: call.model ?? 'fixture',
501
665
  prompt_type: type,
@@ -82,6 +82,8 @@
82
82
  import { ScopeAnalysis } from '~codeyam/types';
83
83
  import { EquivalencyManager } from './equivalencyManagers/EquivalencyManager';
84
84
  import fillInSchemaGapsAndUnknowns from './helpers/fillInSchemaGapsAndUnknowns';
85
+ import { clearCleanKnownObjectFunctionsCache } from './helpers/cleanKnownObjectFunctions';
86
+ import { clearCleanNonObjectFunctionsCache } from './helpers/cleanNonObjectFunctions';
85
87
 
86
88
  /**
87
89
  * Patterns that indicate recursive type structures in schema paths.
@@ -332,6 +334,19 @@ export function resetScopeDataStructureMetrics() {
332
334
  followEquivalenciesEarlyExitPhase1Count = 0;
333
335
  followEquivalenciesWithWorkCount = 0;
334
336
  addEquivalencyCallCount = 0;
337
+
338
+ // Clear module-level caches to prevent unbounded memory growth across entities
339
+ const knownObjectCache = clearCleanKnownObjectFunctionsCache();
340
+ const nonObjectCache = clearCleanNonObjectFunctionsCache();
341
+ if (knownObjectCache.count > 0 || nonObjectCache.count > 0) {
342
+ const totalBytes =
343
+ knownObjectCache.estimatedBytes + nonObjectCache.estimatedBytes;
344
+ console.log('CodeYam: Cleared analysis caches', {
345
+ knownObjectCache: `${knownObjectCache.count} entries, ${(knownObjectCache.estimatedBytes / 1024).toFixed(1)}KB`,
346
+ nonObjectCache: `${nonObjectCache.count} entries, ${(nonObjectCache.estimatedBytes / 1024).toFixed(1)}KB`,
347
+ totalKB: `${(totalBytes / 1024).toFixed(1)}KB`,
348
+ });
349
+ }
335
350
  }
336
351
 
337
352
  // Performance: Pre-computed Sets for equivalency reason filtering (O(1) vs O(n))
@@ -436,6 +451,13 @@ export class ScopeDataStructure {
436
451
  import('../astScopes/types').ConditionalUsage[]
437
452
  > = {};
438
453
 
454
+ /**
455
+ * JSX rendering usages collected during AST analysis.
456
+ * Tracks arrays rendered via .map() and strings interpolated in JSX.
457
+ */
458
+ private rawJsxRenderingUsages: import('../astScopes/types').JsxRenderingUsage[] =
459
+ [];
460
+
439
461
  private lastAddToSchemaId = 0;
440
462
  private lastEquivalencyId = 0;
441
463
  private lastEquivalencyDatabaseId = 0;
@@ -3876,13 +3898,29 @@ export class ScopeDataStructure {
3876
3898
  // "useFetcher<...>().state" for execution flow validation
3877
3899
  if (equivalentValue.schemaPath.endsWith('.functionCallReturnValue')) {
3878
3900
  // Extract the hook call path (everything before .functionCallReturnValue)
3879
- const hookCallPath = equivalentValue.schemaPath.slice(
3901
+ let hookCallPath = equivalentValue.schemaPath.slice(
3880
3902
  0,
3881
3903
  -'.functionCallReturnValue'.length,
3882
3904
  );
3883
3905
  // Only include if it looks like a hook call (contains parentheses)
3884
3906
  // and the variable name (path) is a simple identifier (no dots)
3885
3907
  if (hookCallPath.includes('(') && !path.includes('.')) {
3908
+ // Special case: If hookCallPath is a callback scope (cyScope pattern),
3909
+ // trace through it to find what the callback actually returns.
3910
+ // This handles useState(() => { return prop; }) patterns.
3911
+ const cyScopeMatch = hookCallPath.match(/^(cyScope\d+)\(\)$/);
3912
+ if (cyScopeMatch) {
3913
+ // Use the equivalency database to trace the callback's return value
3914
+ // to its actual source (e.g., viewModeFromUrl -> segments -> params -> useParams)
3915
+ const dbEntry = this.getEquivalenciesDatabaseEntry(
3916
+ scopeNode.name, // Component scope
3917
+ path, // variable name (e.g., viewMode)
3918
+ );
3919
+ if (dbEntry?.sourceCandidates?.length > 0) {
3920
+ // Use the traced source instead of the callback scope
3921
+ hookCallPath = dbEntry.sourceCandidates[0].schemaPath;
3922
+ }
3923
+ }
3886
3924
  equivalentSignatureVariables[path] = hookCallPath;
3887
3925
  }
3888
3926
  }
@@ -4000,6 +4038,7 @@ export class ScopeDataStructure {
4000
4038
  // E.g., analysis → currentEntityAnalysis → useLoaderData().functionCallReturnValue.currentEntityAnalysis
4001
4039
  // We need multiple passes because resolutions can depend on each other
4002
4040
  const maxIterations = 5; // Prevent infinite loops
4041
+
4003
4042
  for (let iteration = 0; iteration < maxIterations; iteration++) {
4004
4043
  let changed = false;
4005
4044
 
@@ -4078,6 +4117,40 @@ export class ScopeDataStructure {
4078
4117
  }
4079
4118
  }
4080
4119
 
4120
+ // Fix 38: Handle cyScope lazy initializer return values
4121
+ // When we have viewMode -> cyScope20(), trace through to find what cyScope20 returns.
4122
+ // The lazy initializer's return value should be the controllable data source.
4123
+ // Pattern: cyScopeN() where N is a number
4124
+ const cyScopeMatch = sourcePath.match(/^(cyScope\d+)\(\)$/);
4125
+ if (cyScopeMatch) {
4126
+ const cyScopeName = cyScopeMatch[1];
4127
+ const cyScopeNode = this.scopeNodes[cyScopeName];
4128
+
4129
+ if (cyScopeNode?.equivalencies) {
4130
+ // Look for returnValue equivalency in the cyScope
4131
+ const returnValueEquivs =
4132
+ cyScopeNode.equivalencies['returnValue'];
4133
+ if (returnValueEquivs && returnValueEquivs.length > 0) {
4134
+ // Get the first return value source
4135
+ const returnSource = returnValueEquivs[0].schemaPath;
4136
+
4137
+ // If the return source is a simple variable (not a complex path),
4138
+ // resolve varName directly to that variable
4139
+ if (
4140
+ returnSource &&
4141
+ !returnSource.includes('(') &&
4142
+ !returnSource.includes('[')
4143
+ ) {
4144
+ // Update varName to point to the return source
4145
+ if (equivalentSignatureVariables[varName] !== returnSource) {
4146
+ equivalentSignatureVariables[varName] = returnSource;
4147
+ changed = true;
4148
+ }
4149
+ }
4150
+ }
4151
+ }
4152
+ }
4153
+
4081
4154
  continue;
4082
4155
  }
4083
4156
 
@@ -4503,6 +4576,33 @@ export class ScopeDataStructure {
4503
4576
  return enriched;
4504
4577
  }
4505
4578
 
4579
+ /**
4580
+ * Add JSX rendering usages from AST analysis.
4581
+ * These track arrays rendered via .map() and strings interpolated in JSX.
4582
+ */
4583
+ addJsxRenderingUsages(
4584
+ usages: import('../astScopes/types').JsxRenderingUsage[],
4585
+ ): void {
4586
+ // Add usages, avoiding duplicates based on path and renderingType
4587
+ for (const usage of usages) {
4588
+ const exists = this.rawJsxRenderingUsages.some(
4589
+ (existing) =>
4590
+ existing.path === usage.path &&
4591
+ existing.renderingType === usage.renderingType,
4592
+ );
4593
+ if (!exists) {
4594
+ this.rawJsxRenderingUsages.push(usage);
4595
+ }
4596
+ }
4597
+ }
4598
+
4599
+ /**
4600
+ * Get JSX rendering usages collected during analysis.
4601
+ */
4602
+ getJsxRenderingUsages(): import('../astScopes/types').JsxRenderingUsage[] {
4603
+ return this.rawJsxRenderingUsages;
4604
+ }
4605
+
4506
4606
  toSerializable(): SerializableDataStructure {
4507
4607
  // Helper to clean cyScope and cyDuplicateKey from a string for output
4508
4608
  const cleanCyScope = (str: string): string =>
@@ -5003,6 +5103,12 @@ export class ScopeDataStructure {
5003
5103
  ? enrichedGatingConditions
5004
5104
  : undefined;
5005
5105
 
5106
+ // Get JSX rendering usages (arrays via .map(), strings via interpolation)
5107
+ const jsxRenderingUsages =
5108
+ this.rawJsxRenderingUsages.length > 0
5109
+ ? this.rawJsxRenderingUsages
5110
+ : undefined;
5111
+
5006
5112
  return {
5007
5113
  externalFunctionCalls: deduplicatedExternalFunctionCalls,
5008
5114
  rootFunction,
@@ -5013,6 +5119,7 @@ export class ScopeDataStructure {
5013
5119
  conditionalEffects,
5014
5120
  compoundConditionals,
5015
5121
  childBoundaryGatingConditions,
5122
+ jsxRenderingUsages,
5016
5123
  };
5017
5124
  }
5018
5125