scai 0.1.178 → 1.0.0

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 (770) hide show
  1. package/README.md +162 -267
  2. package/dist/__tests__/CommitSuggesterCmd.test.js +112 -0
  3. package/dist/__tests__/CommitSuggesterCmd.test.js.map +1 -0
  4. package/dist/__tests__/EvalReportCmd.test.js +645 -0
  5. package/dist/__tests__/EvalReportCmd.test.js.map +1 -0
  6. package/dist/__tests__/ModelCmd.test.js +64 -0
  7. package/dist/__tests__/ModelCmd.test.js.map +1 -0
  8. package/dist/__tests__/agents/agentActions.test.js +345 -0
  9. package/dist/__tests__/agents/agentActions.test.js.map +1 -0
  10. package/dist/__tests__/agents/agentFeedback.test.js +118 -0
  11. package/dist/__tests__/agents/agentFeedback.test.js.map +1 -0
  12. package/dist/__tests__/agents/agentGeneralScope.test.js +74 -0
  13. package/dist/__tests__/agents/agentGeneralScope.test.js.map +1 -0
  14. package/dist/__tests__/agents/agentLoop.test.js +1723 -0
  15. package/dist/__tests__/agents/agentLoop.test.js.map +1 -0
  16. package/dist/__tests__/agents/agentPolicyState.test.js +948 -0
  17. package/dist/__tests__/agents/agentPolicyState.test.js.map +1 -0
  18. package/dist/__tests__/agents/agentReadEvidence.test.js +170 -0
  19. package/dist/__tests__/agents/agentReadEvidence.test.js.map +1 -0
  20. package/dist/__tests__/agents/agentReadPersistence.test.js +129 -0
  21. package/dist/__tests__/agents/agentReadPersistence.test.js.map +1 -0
  22. package/dist/__tests__/agents/agentResumeCheckpoint.test.js +90 -0
  23. package/dist/__tests__/agents/agentResumeCheckpoint.test.js.map +1 -0
  24. package/dist/__tests__/agents/agentSearchBatchPlanner.test.js +289 -0
  25. package/dist/__tests__/agents/agentSearchBatchPlanner.test.js.map +1 -0
  26. package/dist/__tests__/agents/agentSearchOwnership.test.js +166 -0
  27. package/dist/__tests__/agents/agentSearchOwnership.test.js.map +1 -0
  28. package/dist/__tests__/agents/agentSearchRanking.test.js +139 -0
  29. package/dist/__tests__/agents/agentSearchRanking.test.js.map +1 -0
  30. package/dist/__tests__/agents/agentSearchRouting.test.js +584 -0
  31. package/dist/__tests__/agents/agentSearchRouting.test.js.map +1 -0
  32. package/dist/__tests__/agents/agentSearchScoring.test.js +23 -0
  33. package/dist/__tests__/agents/agentSearchScoring.test.js.map +1 -0
  34. package/dist/__tests__/agents/agentSearchShared.test.js +78 -0
  35. package/dist/__tests__/agents/agentSearchShared.test.js.map +1 -0
  36. package/dist/__tests__/agents/agentStateMachine.test.js +58 -0
  37. package/dist/__tests__/agents/agentStateMachine.test.js.map +1 -0
  38. package/dist/__tests__/agents/agentTaskPersistence.test.js +156 -0
  39. package/dist/__tests__/agents/agentTaskPersistence.test.js.map +1 -0
  40. package/dist/__tests__/agents/agentTools.test.js +69 -0
  41. package/dist/__tests__/agents/agentTools.test.js.map +1 -0
  42. package/dist/__tests__/agents/agentTransform.test.js +779 -0
  43. package/dist/__tests__/agents/agentTransform.test.js.map +1 -0
  44. package/dist/__tests__/agents/analysisPlanGenStep.test.js +157 -0
  45. package/dist/__tests__/agents/analysisPlanGenStep.test.js.map +1 -0
  46. package/dist/__tests__/agents/answerOnlyCompletion.test.js +75 -0
  47. package/dist/__tests__/agents/answerOnlyCompletion.test.js.map +1 -0
  48. package/dist/__tests__/agents/decideNextAction.test.js +1662 -0
  49. package/dist/__tests__/agents/decideNextAction.test.js.map +1 -0
  50. package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js +258 -0
  51. package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js.map +1 -0
  52. package/dist/__tests__/agents/evidenceVerifierStep.test.js +113 -0
  53. package/dist/__tests__/agents/evidenceVerifierStep.test.js.map +1 -0
  54. package/dist/__tests__/agents/executionPolicyResolver.test.js +208 -0
  55. package/dist/__tests__/agents/executionPolicyResolver.test.js.map +1 -0
  56. package/dist/__tests__/agents/fileCheckStep.test.js +299 -0
  57. package/dist/__tests__/agents/fileCheckStep.test.js.map +1 -0
  58. package/dist/__tests__/agents/giveUpEvaluatorStep.test.js +35 -0
  59. package/dist/__tests__/agents/giveUpEvaluatorStep.test.js.map +1 -0
  60. package/dist/__tests__/agents/guardState.test.js +297 -0
  61. package/dist/__tests__/agents/guardState.test.js.map +1 -0
  62. package/dist/__tests__/agents/mainAgentHeuristics.test.js +72 -0
  63. package/dist/__tests__/agents/mainAgentHeuristics.test.js.map +1 -0
  64. package/dist/__tests__/agents/objectiveEvaluatorStep.test.js +60 -0
  65. package/dist/__tests__/agents/objectiveEvaluatorStep.test.js.map +1 -0
  66. package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js +207 -0
  67. package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js.map +1 -0
  68. package/dist/__tests__/agents/prompting.test.js +363 -0
  69. package/dist/__tests__/agents/prompting.test.js.map +1 -0
  70. package/dist/__tests__/agents/readinessGateStep.test.js +180 -0
  71. package/dist/__tests__/agents/readinessGateStep.test.js.map +1 -0
  72. package/dist/__tests__/agents/reasonNextStep.test.js +56 -0
  73. package/dist/__tests__/agents/reasonNextStep.test.js.map +1 -0
  74. package/dist/__tests__/agents/reasonNextTaskStep.test.js +284 -0
  75. package/dist/__tests__/agents/reasonNextTaskStep.test.js.map +1 -0
  76. package/dist/__tests__/agents/resolveAgentTargetClassification.test.js +170 -0
  77. package/dist/__tests__/agents/resolveAgentTargetClassification.test.js.map +1 -0
  78. package/dist/__tests__/agents/resolveProgressState.test.js +526 -0
  79. package/dist/__tests__/agents/resolveProgressState.test.js.map +1 -0
  80. package/dist/__tests__/agents/resumeCheckpoint.test.js +50 -0
  81. package/dist/__tests__/agents/resumeCheckpoint.test.js.map +1 -0
  82. package/dist/__tests__/agents/routingDecisionStep.test.js +134 -0
  83. package/dist/__tests__/agents/routingDecisionStep.test.js.map +1 -0
  84. package/dist/__tests__/agents/scopeClassificationStep.test.js +118 -0
  85. package/dist/__tests__/agents/scopeClassificationStep.test.js.map +1 -0
  86. package/dist/__tests__/agents/searchContext.test.js +97 -0
  87. package/dist/__tests__/agents/searchContext.test.js.map +1 -0
  88. package/dist/__tests__/agents/selectRelevantSourcesStep.test.js +73 -0
  89. package/dist/__tests__/agents/selectRelevantSourcesStep.test.js.map +1 -0
  90. package/dist/__tests__/agents/structuredOutput.test.js +45 -0
  91. package/dist/__tests__/agents/structuredOutput.test.js.map +1 -0
  92. package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js +59 -0
  93. package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js.map +1 -0
  94. package/dist/__tests__/agents/transformPlanGenStep.test.js +92 -0
  95. package/dist/__tests__/agents/transformPlanGenStep.test.js.map +1 -0
  96. package/dist/__tests__/agents/understandIntentStep.test.js +237 -0
  97. package/dist/__tests__/agents/understandIntentStep.test.js.map +1 -0
  98. package/dist/__tests__/agents/understandResumeContext.test.js +65 -0
  99. package/dist/__tests__/agents/understandResumeContext.test.js.map +1 -0
  100. package/dist/__tests__/agents/understandScope.test.js +227 -0
  101. package/dist/__tests__/agents/understandScope.test.js.map +1 -0
  102. package/dist/__tests__/agents/validateChangesStep.test.js +52 -0
  103. package/dist/__tests__/agents/validateChangesStep.test.js.map +1 -0
  104. package/dist/__tests__/askCommandTaskBinding.test.js +176 -0
  105. package/dist/__tests__/askCommandTaskBinding.test.js.map +1 -0
  106. package/dist/__tests__/commandVisibility.test.js +25 -0
  107. package/dist/__tests__/commandVisibility.test.js.map +1 -0
  108. package/dist/__tests__/config.devOutput.test.js +82 -0
  109. package/dist/__tests__/config.devOutput.test.js.map +1 -0
  110. package/dist/__tests__/currentContext.test.js +43 -0
  111. package/dist/__tests__/currentContext.test.js.map +1 -0
  112. package/dist/__tests__/daemonWorker.test.js +51 -0
  113. package/dist/__tests__/daemonWorker.test.js.map +1 -0
  114. package/dist/__tests__/dialogState.test.js +113 -0
  115. package/dist/__tests__/dialogState.test.js.map +1 -0
  116. package/dist/__tests__/evalCommands.test.js +506 -0
  117. package/dist/__tests__/evalCommands.test.js.map +1 -0
  118. package/dist/__tests__/evalCommandsSummary.test.js +68 -0
  119. package/dist/__tests__/evalCommandsSummary.test.js.map +1 -0
  120. package/dist/__tests__/example.test.js +1 -0
  121. package/dist/__tests__/example.test.js.map +1 -0
  122. package/dist/__tests__/factory.commitCommand.test.js +45 -0
  123. package/dist/__tests__/factory.commitCommand.test.js.map +1 -0
  124. package/dist/__tests__/factory.devOutputCommand.test.js +122 -0
  125. package/dist/__tests__/factory.devOutputCommand.test.js.map +1 -0
  126. package/dist/__tests__/factory.evalCommands.test.js +38 -0
  127. package/dist/__tests__/factory.evalCommands.test.js.map +1 -0
  128. package/dist/__tests__/factory.planCommand.test.js +35 -0
  129. package/dist/__tests__/factory.planCommand.test.js.map +1 -0
  130. package/dist/__tests__/factory.setupCommand.test.js +34 -0
  131. package/dist/__tests__/factory.setupCommand.test.js.map +1 -0
  132. package/dist/__tests__/factory.statusCommand.test.js +54 -0
  133. package/dist/__tests__/factory.statusCommand.test.js.map +1 -0
  134. package/dist/__tests__/fileRules/queryTokenRules.test.js +35 -0
  135. package/dist/__tests__/fileRules/queryTokenRules.test.js.map +1 -0
  136. package/dist/__tests__/fileRules/searchPathClassification.test.js +57 -0
  137. package/dist/__tests__/fileRules/searchPathClassification.test.js.map +1 -0
  138. package/dist/__tests__/generate.ollamaRecovery.test.js +344 -0
  139. package/dist/__tests__/generate.ollamaRecovery.test.js.map +1 -0
  140. package/dist/__tests__/index.modelStartup.test.js +24 -0
  141. package/dist/__tests__/index.modelStartup.test.js.map +1 -0
  142. package/dist/__tests__/indexCmd.test.js +85 -0
  143. package/dist/__tests__/indexCmd.test.js.map +1 -0
  144. package/dist/__tests__/indexSlashCommand.test.js +50 -0
  145. package/dist/__tests__/indexSlashCommand.test.js.map +1 -0
  146. package/dist/__tests__/ollamaService.test.js +103 -0
  147. package/dist/__tests__/ollamaService.test.js.map +1 -0
  148. package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js +68 -0
  149. package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js.map +1 -0
  150. package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js +68 -0
  151. package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js.map +1 -0
  152. package/dist/__tests__/pipeline/modules/fileSearchModule.test.js +284 -0
  153. package/dist/__tests__/pipeline/modules/fileSearchModule.test.js.map +1 -0
  154. package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js +1139 -0
  155. package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js.map +1 -0
  156. package/dist/__tests__/pipeline/modules/readFileModule.test.js +146 -0
  157. package/dist/__tests__/pipeline/modules/readFileModule.test.js.map +1 -0
  158. package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js +192 -0
  159. package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js.map +1 -0
  160. package/dist/__tests__/repoIdentity.test.js +31 -0
  161. package/dist/__tests__/repoIdentity.test.js.map +1 -0
  162. package/dist/__tests__/resumeContext.test.js +87 -0
  163. package/dist/__tests__/resumeContext.test.js.map +1 -0
  164. package/dist/__tests__/resumeState.test.js +239 -0
  165. package/dist/__tests__/resumeState.test.js.map +1 -0
  166. package/dist/__tests__/search/SearchOrchestrator.test.js +836 -0
  167. package/dist/__tests__/search/SearchOrchestrator.test.js.map +1 -0
  168. package/dist/__tests__/shellDialogUi.test.js +52 -0
  169. package/dist/__tests__/shellDialogUi.test.js.map +1 -0
  170. package/dist/__tests__/shellSession.test.js +102 -0
  171. package/dist/__tests__/shellSession.test.js.map +1 -0
  172. package/dist/__tests__/statusOwner.test.js +215 -0
  173. package/dist/__tests__/statusOwner.test.js.map +1 -0
  174. package/dist/__tests__/testing/contextEval.test.js +244 -0
  175. package/dist/__tests__/testing/contextEval.test.js.map +1 -0
  176. package/dist/__tests__/testing/harnessArtifacts.test.js +124 -0
  177. package/dist/__tests__/testing/harnessArtifacts.test.js.map +1 -0
  178. package/dist/__tests__/testing/llmTraceSession.test.js +67 -0
  179. package/dist/__tests__/testing/llmTraceSession.test.js.map +1 -0
  180. package/dist/__tests__/testing/registerDevCliCommands.test.js +35 -0
  181. package/dist/__tests__/testing/registerDevCliCommands.test.js.map +1 -0
  182. package/dist/__tests__/testing/runDiagnosis.test.js +159 -0
  183. package/dist/__tests__/testing/runDiagnosis.test.js.map +1 -0
  184. package/dist/__tests__/testing/runtimeLogReader.test.js +66 -0
  185. package/dist/__tests__/testing/runtimeLogReader.test.js.map +1 -0
  186. package/dist/__tests__/testing/testCommands.test.js +53 -0
  187. package/dist/__tests__/testing/testCommands.test.js.map +1 -0
  188. package/dist/__tests__/utils/compileSearchQuery.test.js +38 -0
  189. package/dist/__tests__/utils/compileSearchQuery.test.js.map +1 -0
  190. package/dist/__tests__/utils/consolePresentation.test.js +105 -0
  191. package/dist/__tests__/utils/consolePresentation.test.js.map +1 -0
  192. package/dist/__tests__/utils/extractFileReferences.test.js +41 -0
  193. package/dist/__tests__/utils/extractFileReferences.test.js.map +1 -0
  194. package/dist/__tests__/utils/log.test.js +34 -0
  195. package/dist/__tests__/utils/log.test.js.map +1 -0
  196. package/dist/__tests__/utils/runtimeLogger.test.js +200 -0
  197. package/dist/__tests__/utils/runtimeLogger.test.js.map +1 -0
  198. package/dist/__tests__/utils/spinner.test.js +31 -0
  199. package/dist/__tests__/utils/spinner.test.js.map +1 -0
  200. package/dist/__tests__/utils/verifyFocusPreference.test.js +41 -0
  201. package/dist/__tests__/utils/verifyFocusPreference.test.js.map +1 -0
  202. package/dist/agent/actions/index.js +301 -0
  203. package/dist/agent/actions/index.js.map +1 -0
  204. package/dist/agent/actions/normalize.js +360 -0
  205. package/dist/agent/actions/normalize.js.map +1 -0
  206. package/dist/agent/actions/schemas.js +129 -0
  207. package/dist/agent/actions/schemas.js.map +1 -0
  208. package/dist/agent/evidence/index.js +320 -0
  209. package/dist/agent/evidence/index.js.map +1 -0
  210. package/dist/agent/feedback/index.js +187 -0
  211. package/dist/agent/feedback/index.js.map +1 -0
  212. package/dist/agent/finalization/index.js +35 -0
  213. package/dist/agent/finalization/index.js.map +1 -0
  214. package/dist/agent/index.js +126 -0
  215. package/dist/agent/index.js.map +1 -0
  216. package/dist/agent/logging/index.js +350 -0
  217. package/dist/agent/logging/index.js.map +1 -0
  218. package/dist/agent/persistence/boot.js +58 -0
  219. package/dist/agent/persistence/boot.js.map +1 -0
  220. package/dist/agent/persistence/currentTask.js +36 -0
  221. package/dist/agent/persistence/currentTask.js.map +1 -0
  222. package/dist/agent/persistence/hydrate.js +42 -0
  223. package/dist/agent/persistence/hydrate.js.map +1 -0
  224. package/dist/agent/persistence/index.js +15 -0
  225. package/dist/agent/persistence/index.js.map +1 -0
  226. package/dist/agent/persistence/snapshots.js +97 -0
  227. package/dist/agent/persistence/snapshots.js.map +1 -0
  228. package/dist/agent/persistence/steps.js +95 -0
  229. package/dist/agent/persistence/steps.js.map +1 -0
  230. package/dist/agent/persistence/tasks.js +195 -0
  231. package/dist/agent/persistence/tasks.js.map +1 -0
  232. package/dist/agent/persistence/turns.js +92 -0
  233. package/dist/agent/persistence/turns.js.map +1 -0
  234. package/dist/agent/policy/ambiguityResolution.js +226 -0
  235. package/dist/agent/policy/ambiguityResolution.js.map +1 -0
  236. package/dist/agent/policy/contracts.js +2 -0
  237. package/dist/agent/policy/contracts.js.map +1 -0
  238. package/dist/agent/policy/coveragePolicy.js +309 -0
  239. package/dist/agent/policy/coveragePolicy.js.map +1 -0
  240. package/dist/agent/policy/endDecisionPolicy.js +31 -0
  241. package/dist/agent/policy/endDecisionPolicy.js.map +1 -0
  242. package/dist/agent/policy/index.js +344 -0
  243. package/dist/agent/policy/index.js.map +1 -0
  244. package/dist/agent/policy/loopReview.js +778 -0
  245. package/dist/agent/policy/loopReview.js.map +1 -0
  246. package/dist/agent/policy/readinessPolicy.js +108 -0
  247. package/dist/agent/policy/readinessPolicy.js.map +1 -0
  248. package/dist/agent/policy/resolutionPipeline.js +356 -0
  249. package/dist/agent/policy/resolutionPipeline.js.map +1 -0
  250. package/dist/agent/policy/targetClassification.js +33 -0
  251. package/dist/agent/policy/targetClassification.js.map +1 -0
  252. package/dist/agent/prompting/actionChoice.js +90 -0
  253. package/dist/agent/prompting/actionChoice.js.map +1 -0
  254. package/dist/agent/prompting/finalAnswer.js +38 -0
  255. package/dist/agent/prompting/finalAnswer.js.map +1 -0
  256. package/dist/agent/prompting/index.js +14 -0
  257. package/dist/agent/prompting/index.js.map +1 -0
  258. package/dist/agent/prompting/plan.js +59 -0
  259. package/dist/agent/prompting/plan.js.map +1 -0
  260. package/dist/agent/prompting/transform.js +175 -0
  261. package/dist/agent/prompting/transform.js.map +1 -0
  262. package/dist/agent/prompting/understand.js +70 -0
  263. package/dist/agent/prompting/understand.js.map +1 -0
  264. package/dist/agent/read/freshness.js +29 -0
  265. package/dist/agent/read/freshness.js.map +1 -0
  266. package/dist/agent/read/fullReadPrompt.js +43 -0
  267. package/dist/agent/read/fullReadPrompt.js.map +1 -0
  268. package/dist/agent/read/index.js +140 -0
  269. package/dist/agent/read/index.js.map +1 -0
  270. package/dist/agent/read/persistence.js +88 -0
  271. package/dist/agent/read/persistence.js.map +1 -0
  272. package/dist/agent/read/summarizeReadEvidence.js +733 -0
  273. package/dist/agent/read/summarizeReadEvidence.js.map +1 -0
  274. package/dist/agent/read/targetResolution.js +126 -0
  275. package/dist/agent/read/targetResolution.js.map +1 -0
  276. package/dist/agent/resume/checkpoint.js +41 -0
  277. package/dist/agent/resume/checkpoint.js.map +1 -0
  278. package/dist/agent/runtime/lifecycle.js +67 -0
  279. package/dist/agent/runtime/lifecycle.js.map +1 -0
  280. package/dist/agent/runtime/progress.js +178 -0
  281. package/dist/agent/runtime/progress.js.map +1 -0
  282. package/dist/agent/runtime/runAgentLoop.js +402 -0
  283. package/dist/agent/runtime/runAgentLoop.js.map +1 -0
  284. package/dist/agent/runtime/runAgentPlanOnly.js +127 -0
  285. package/dist/agent/runtime/runAgentPlanOnly.js.map +1 -0
  286. package/dist/agent/runtime/understand.js +336 -0
  287. package/dist/agent/runtime/understand.js.map +1 -0
  288. package/dist/agent/search/batchPlanner.js +274 -0
  289. package/dist/agent/search/batchPlanner.js.map +1 -0
  290. package/dist/agent/search/candidateRetentionPolicy.js +184 -0
  291. package/dist/agent/search/candidateRetentionPolicy.js.map +1 -0
  292. package/dist/agent/search/directory.js +51 -0
  293. package/dist/agent/search/directory.js.map +1 -0
  294. package/dist/agent/search/exactTarget.js +151 -0
  295. package/dist/agent/search/exactTarget.js.map +1 -0
  296. package/dist/agent/search/fragment.js +110 -0
  297. package/dist/agent/search/fragment.js.map +1 -0
  298. package/dist/agent/search/index.js +166 -0
  299. package/dist/agent/search/index.js.map +1 -0
  300. package/dist/agent/search/laneClassifier.js +119 -0
  301. package/dist/agent/search/laneClassifier.js.map +1 -0
  302. package/dist/agent/search/limits.js +10 -0
  303. package/dist/agent/search/limits.js.map +1 -0
  304. package/dist/agent/search/ranking.js +22 -0
  305. package/dist/agent/search/ranking.js.map +1 -0
  306. package/dist/agent/search/regex.js +83 -0
  307. package/dist/agent/search/regex.js.map +1 -0
  308. package/dist/agent/search/routePolicy.js +11 -0
  309. package/dist/agent/search/routePolicy.js.map +1 -0
  310. package/dist/agent/search/searchContext.js +128 -0
  311. package/dist/agent/search/searchContext.js.map +1 -0
  312. package/dist/agent/search/semantic.js +113 -0
  313. package/dist/agent/search/semantic.js.map +1 -0
  314. package/dist/agent/search/semanticIndexSearch.js +202 -0
  315. package/dist/agent/search/semanticIndexSearch.js.map +1 -0
  316. package/dist/agent/search/shared.js +283 -0
  317. package/dist/agent/search/shared.js.map +1 -0
  318. package/dist/agent/search/shell.js +202 -0
  319. package/dist/agent/search/shell.js.map +1 -0
  320. package/dist/agent/search/snippetEvidence.js +57 -0
  321. package/dist/agent/search/snippetEvidence.js.map +1 -0
  322. package/dist/agent/search/types.js +2 -0
  323. package/dist/agent/search/types.js.map +1 -0
  324. package/dist/agent/state/index.js +99 -0
  325. package/dist/agent/state/index.js.map +1 -0
  326. package/dist/agent/state/memory.js +56 -0
  327. package/dist/agent/state/memory.js.map +1 -0
  328. package/dist/agent/structuredOutput/index.js +28 -0
  329. package/dist/agent/structuredOutput/index.js.map +1 -0
  330. package/dist/agent/tools/index.js +199 -0
  331. package/dist/agent/tools/index.js.map +1 -0
  332. package/dist/agent/transform/index.js +519 -0
  333. package/dist/agent/transform/index.js.map +1 -0
  334. package/dist/agent/transform/syntax.js +49 -0
  335. package/dist/agent/transform/syntax.js.map +1 -0
  336. package/dist/agent/types.js +20 -0
  337. package/dist/agent/types.js.map +1 -0
  338. package/dist/agents/actionRegistry.js +114 -0
  339. package/dist/agents/actionRegistry.js.map +1 -0
  340. package/dist/agents/agent.js +5 -0
  341. package/dist/agents/agent.js.map +1 -0
  342. package/dist/agents/agentActions.js +5 -0
  343. package/dist/agents/agentActions.js.map +1 -0
  344. package/dist/agents/agentEvidence.js +5 -0
  345. package/dist/agents/agentEvidence.js.map +1 -0
  346. package/dist/agents/agentFeedback.js +5 -0
  347. package/dist/agents/agentFeedback.js.map +1 -0
  348. package/dist/agents/agentLogging.js +5 -0
  349. package/dist/agents/agentLogging.js.map +1 -0
  350. package/dist/agents/agentLoop.js +5 -0
  351. package/dist/agents/agentLoop.js.map +1 -0
  352. package/dist/agents/agentMemory.js +5 -0
  353. package/dist/agents/agentMemory.js.map +1 -0
  354. package/dist/agents/agentPlanMode.js +5 -0
  355. package/dist/agents/agentPlanMode.js.map +1 -0
  356. package/dist/agents/agentPolicyState.js +5 -0
  357. package/dist/agents/agentPolicyState.js.map +1 -0
  358. package/dist/agents/agentProgress.js +93 -0
  359. package/dist/agents/agentProgress.js.map +1 -0
  360. package/dist/agents/agentSchemas.js +5 -0
  361. package/dist/agents/agentSchemas.js.map +1 -0
  362. package/dist/agents/agentSearchScoring.js +5 -0
  363. package/dist/agents/agentSearchScoring.js.map +1 -0
  364. package/dist/agents/agentStateMachine.js +5 -0
  365. package/dist/agents/agentStateMachine.js.map +1 -0
  366. package/dist/agents/agentTools.js +5 -0
  367. package/dist/agents/agentTools.js.map +1 -0
  368. package/dist/agents/agentTypes.js +5 -0
  369. package/dist/agents/agentTypes.js.map +1 -0
  370. package/dist/agents/agentUnderstand.js +5 -0
  371. package/dist/agents/agentUnderstand.js.map +1 -0
  372. package/dist/agents/analysisPlanGenStep.js +194 -17
  373. package/dist/agents/analysisPlanGenStep.js.map +1 -0
  374. package/dist/agents/answerOnlyCompletion.js +32 -0
  375. package/dist/agents/answerOnlyCompletion.js.map +1 -0
  376. package/dist/agents/collaboratorStep.js +1 -0
  377. package/dist/agents/collaboratorStep.js.map +1 -0
  378. package/dist/agents/decideNextAction.js +444 -0
  379. package/dist/agents/decideNextAction.js.map +1 -0
  380. package/dist/agents/deriveFocusFromSearchStep.js +83 -0
  381. package/dist/agents/deriveFocusFromSearchStep.js.map +1 -0
  382. package/dist/agents/evidenceVerifierStep.js +104 -13
  383. package/dist/agents/evidenceVerifierStep.js.map +1 -0
  384. package/dist/agents/fileCheckStep.js +381 -12
  385. package/dist/agents/fileCheckStep.js.map +1 -0
  386. package/dist/agents/giveUpEvaluatorStep.js +63 -0
  387. package/dist/agents/giveUpEvaluatorStep.js.map +1 -0
  388. package/dist/agents/guardPolicy.js +20 -0
  389. package/dist/agents/guardPolicy.js.map +1 -0
  390. package/dist/agents/guards/executionPolicyResolver.js +165 -0
  391. package/dist/agents/guards/executionPolicyResolver.js.map +1 -0
  392. package/dist/agents/guards/guardState.js +195 -0
  393. package/dist/agents/guards/guardState.js.map +1 -0
  394. package/dist/agents/guards/resolveProgressState.js +403 -0
  395. package/dist/agents/guards/resolveProgressState.js.map +1 -0
  396. package/dist/agents/infoPlanGenStep.js +66 -8
  397. package/dist/agents/infoPlanGenStep.js.map +1 -0
  398. package/dist/agents/integrateFeedbackStep.js +1 -0
  399. package/dist/agents/integrateFeedbackStep.js.map +1 -0
  400. package/dist/agents/iterationFileSelector.js +8 -7
  401. package/dist/agents/iterationFileSelector.js.map +1 -0
  402. package/dist/agents/mainAgentActivityLog.js +85 -0
  403. package/dist/agents/mainAgentActivityLog.js.map +1 -0
  404. package/dist/agents/mainAgentHeuristics.js +173 -0
  405. package/dist/agents/mainAgentHeuristics.js.map +1 -0
  406. package/dist/agents/mainAgentVerify.js +159 -0
  407. package/dist/agents/mainAgentVerify.js.map +1 -0
  408. package/dist/agents/objectiveEvaluatorStep.js +103 -0
  409. package/dist/agents/objectiveEvaluatorStep.js.map +1 -0
  410. package/dist/agents/outerLoopRecoveryEvaluator.js +108 -0
  411. package/dist/agents/outerLoopRecoveryEvaluator.js.map +1 -0
  412. package/dist/agents/readinessGateStep.js +95 -9
  413. package/dist/agents/readinessGateStep.js.map +1 -0
  414. package/dist/agents/reasonNextStep.js +9 -8
  415. package/dist/agents/reasonNextStep.js.map +1 -0
  416. package/dist/agents/reasonNextTaskStep.js +267 -144
  417. package/dist/agents/reasonNextTaskStep.js.map +1 -0
  418. package/dist/agents/researchPlanGenStep.js +61 -25
  419. package/dist/agents/researchPlanGenStep.js.map +1 -0
  420. package/dist/agents/resolveAgentTargetClassification.js +5 -0
  421. package/dist/agents/resolveAgentTargetClassification.js.map +1 -0
  422. package/dist/agents/resolveExecutionModeStep.js +1 -0
  423. package/dist/agents/resolveExecutionModeStep.js.map +1 -0
  424. package/dist/agents/resolveExplicitTargetsStep.js +74 -0
  425. package/dist/agents/resolveExplicitTargetsStep.js.map +1 -0
  426. package/dist/agents/routingDecisionStep.js +58 -11
  427. package/dist/agents/routingDecisionStep.js.map +1 -0
  428. package/dist/agents/scopeClassificationStep.js +66 -3
  429. package/dist/agents/scopeClassificationStep.js.map +1 -0
  430. package/dist/agents/selectRelevantSourcesStep.js +13 -5
  431. package/dist/agents/selectRelevantSourcesStep.js.map +1 -0
  432. package/dist/agents/structuralPreloadStep.js +3 -4
  433. package/dist/agents/structuralPreloadStep.js.map +1 -0
  434. package/dist/agents/transformPlanGenStep.js +105 -18
  435. package/dist/agents/transformPlanGenStep.js.map +1 -0
  436. package/dist/agents/understandIntentStep.js +237 -17
  437. package/dist/agents/understandIntentStep.js.map +1 -0
  438. package/dist/agents/validateChangesStep.js +16 -2
  439. package/dist/agents/validateChangesStep.js.map +1 -0
  440. package/dist/agents/writeFileStep.js +1 -0
  441. package/dist/agents/writeFileStep.js.map +1 -0
  442. package/dist/commands/AskCmd.js +139 -44
  443. package/dist/commands/AskCmd.js.map +1 -0
  444. package/dist/commands/BackupCmd.js +1 -0
  445. package/dist/commands/BackupCmd.js.map +1 -0
  446. package/dist/commands/ChangeLogUpdateCmd.js +1 -0
  447. package/dist/commands/ChangeLogUpdateCmd.js.map +1 -0
  448. package/dist/commands/CommitSuggesterCmd.js +55 -13
  449. package/dist/commands/CommitSuggesterCmd.js.map +1 -0
  450. package/dist/commands/DaemonCmd.js +52 -14
  451. package/dist/commands/DaemonCmd.js.map +1 -0
  452. package/dist/commands/DeleteIndex.js +1 -0
  453. package/dist/commands/DeleteIndex.js.map +1 -0
  454. package/dist/commands/EvalReportCmd.js +374 -0
  455. package/dist/commands/EvalReportCmd.js.map +1 -0
  456. package/dist/commands/FindCmd.js +1 -0
  457. package/dist/commands/FindCmd.js.map +1 -0
  458. package/dist/commands/GitCmd.js +1 -0
  459. package/dist/commands/GitCmd.js.map +1 -0
  460. package/dist/commands/IndexCmd.js +11 -79
  461. package/dist/commands/IndexCmd.js.map +1 -0
  462. package/dist/commands/InspectCmd.js +1 -0
  463. package/dist/commands/InspectCmd.js.map +1 -0
  464. package/dist/commands/ModelCmd.js +24 -0
  465. package/dist/commands/ModelCmd.js.map +1 -0
  466. package/dist/commands/ReadlineSingleton.js +1 -0
  467. package/dist/commands/ReadlineSingleton.js.map +1 -0
  468. package/dist/commands/ResetDbCmd.js +18 -1
  469. package/dist/commands/ResetDbCmd.js.map +1 -0
  470. package/dist/commands/ReviewCmd.js +1 -0
  471. package/dist/commands/ReviewCmd.js.map +1 -0
  472. package/dist/commands/StatusCmd.js +22 -0
  473. package/dist/commands/StatusCmd.js.map +1 -0
  474. package/dist/commands/StopDaemonCmd.js +1 -0
  475. package/dist/commands/StopDaemonCmd.js.map +1 -0
  476. package/dist/commands/SummaryCmd.js +1 -0
  477. package/dist/commands/SummaryCmd.js.map +1 -0
  478. package/dist/commands/SwitchCmd.js +9 -15
  479. package/dist/commands/SwitchCmd.js.map +1 -0
  480. package/dist/commands/TasksCmd.js +142 -57
  481. package/dist/commands/TasksCmd.js.map +1 -0
  482. package/dist/commands/TestCmd.js +66 -0
  483. package/dist/commands/TestCmd.js.map +1 -0
  484. package/dist/commands/WorkflowCmd.js +1 -0
  485. package/dist/commands/WorkflowCmd.js.map +1 -0
  486. package/dist/commands/commandVisibility.js +27 -0
  487. package/dist/commands/commandVisibility.js.map +1 -0
  488. package/dist/commands/evalCommands.js +1337 -0
  489. package/dist/commands/evalCommands.js.map +1 -0
  490. package/dist/commands/factory.js +206 -38
  491. package/dist/commands/factory.js.map +1 -0
  492. package/dist/config.js +62 -11
  493. package/dist/config.js.map +1 -0
  494. package/dist/constants.js +21 -3
  495. package/dist/constants.js.map +1 -0
  496. package/dist/context.js +33 -32
  497. package/dist/context.js.map +1 -0
  498. package/dist/daemon/daemonQueues.js +1 -20
  499. package/dist/daemon/daemonQueues.js.map +1 -0
  500. package/dist/daemon/daemonWorker.js +26 -37
  501. package/dist/daemon/daemonWorker.js.map +1 -0
  502. package/dist/daemon/generateSummaries.js +1 -0
  503. package/dist/daemon/generateSummaries.js.map +1 -0
  504. package/dist/daemon/runFolderCapsuleBatch.js +1 -0
  505. package/dist/daemon/runFolderCapsuleBatch.js.map +1 -0
  506. package/dist/daemon/runIndexingBatch.js +1 -0
  507. package/dist/daemon/runIndexingBatch.js.map +1 -0
  508. package/dist/daemon/runKgBatch.js +9 -1
  509. package/dist/daemon/runKgBatch.js.map +1 -0
  510. package/dist/db/backup.js +1 -0
  511. package/dist/db/backup.js.map +1 -0
  512. package/dist/db/client.js +18 -3
  513. package/dist/db/client.js.map +1 -0
  514. package/dist/db/fileIndex.js +110 -152
  515. package/dist/db/fileIndex.js.map +1 -0
  516. package/dist/db/functionExtractors/extractFromJava.js +1 -0
  517. package/dist/db/functionExtractors/extractFromJava.js.map +1 -0
  518. package/dist/db/functionExtractors/extractFromJs.js +1 -0
  519. package/dist/db/functionExtractors/extractFromJs.js.map +1 -0
  520. package/dist/db/functionExtractors/extractFromTs.js +1 -0
  521. package/dist/db/functionExtractors/extractFromTs.js.map +1 -0
  522. package/dist/db/functionExtractors/extractFromXML.js +1 -0
  523. package/dist/db/functionExtractors/extractFromXML.js.map +1 -0
  524. package/dist/db/functionExtractors/index.js +1 -0
  525. package/dist/db/functionExtractors/index.js.map +1 -0
  526. package/dist/db/functionIndex.js +9 -0
  527. package/dist/db/functionIndex.js.map +1 -0
  528. package/dist/db/schema.js +314 -99
  529. package/dist/db/schema.js.map +1 -0
  530. package/dist/db/sqlTemplates.js +1 -0
  531. package/dist/db/sqlTemplates.js.map +1 -0
  532. package/dist/fileRules/builtins.js +1 -0
  533. package/dist/fileRules/builtins.js.map +1 -0
  534. package/dist/fileRules/classifyFile.js +1 -0
  535. package/dist/fileRules/classifyFile.js.map +1 -0
  536. package/dist/fileRules/codeAllowedExtensions.js +1 -0
  537. package/dist/fileRules/codeAllowedExtensions.js.map +1 -0
  538. package/dist/fileRules/detectFileType.js +1 -0
  539. package/dist/fileRules/detectFileType.js.map +1 -0
  540. package/dist/fileRules/fileClassifier.js +1 -0
  541. package/dist/fileRules/fileClassifier.js.map +1 -0
  542. package/dist/fileRules/fileExceptions.js +1 -0
  543. package/dist/fileRules/fileExceptions.js.map +1 -0
  544. package/dist/fileRules/ignoredExtensions.js +1 -0
  545. package/dist/fileRules/ignoredExtensions.js.map +1 -0
  546. package/dist/fileRules/ignoredPaths.js +48 -5
  547. package/dist/fileRules/ignoredPaths.js.map +1 -0
  548. package/dist/fileRules/queryTokenRules.js +176 -0
  549. package/dist/fileRules/queryTokenRules.js.map +1 -0
  550. package/dist/fileRules/searchPathClassification.js +58 -0
  551. package/dist/fileRules/searchPathClassification.js.map +1 -0
  552. package/dist/fileRules/shouldIgnoreFiles.js +1 -0
  553. package/dist/fileRules/shouldIgnoreFiles.js.map +1 -0
  554. package/dist/fileRules/stopWords.js +9 -0
  555. package/dist/fileRules/stopWords.js.map +1 -0
  556. package/dist/fileRules/wellKnownRepoFiles.js +1 -0
  557. package/dist/fileRules/wellKnownRepoFiles.js.map +1 -0
  558. package/dist/git/commitSummary.js +227 -0
  559. package/dist/git/commitSummary.js.map +1 -0
  560. package/dist/github/api.js +1 -0
  561. package/dist/github/api.js.map +1 -0
  562. package/dist/github/auth.js +1 -0
  563. package/dist/github/auth.js.map +1 -0
  564. package/dist/github/github.js +1 -0
  565. package/dist/github/github.js.map +1 -0
  566. package/dist/github/githubAuthCheck.js +1 -0
  567. package/dist/github/githubAuthCheck.js.map +1 -0
  568. package/dist/github/postComments.js +1 -0
  569. package/dist/github/postComments.js.map +1 -0
  570. package/dist/github/repo.js +15 -24
  571. package/dist/github/repo.js.map +1 -0
  572. package/dist/github/token.js +1 -0
  573. package/dist/github/token.js.map +1 -0
  574. package/dist/github/types.js +1 -0
  575. package/dist/github/types.js.map +1 -0
  576. package/dist/index.js +318 -37
  577. package/dist/index.js.map +1 -0
  578. package/dist/lib/generate.js +264 -20
  579. package/dist/lib/generate.js.map +1 -0
  580. package/dist/lib/generateFolderCapsules.js +1 -0
  581. package/dist/lib/generateFolderCapsules.js.map +1 -0
  582. package/dist/lib/ollamaModelPolicy.js +59 -0
  583. package/dist/lib/ollamaModelPolicy.js.map +1 -0
  584. package/dist/lib/spinner.js +29 -9
  585. package/dist/lib/spinner.js.map +1 -0
  586. package/dist/modelSetup.js +25 -78
  587. package/dist/modelSetup.js.map +1 -0
  588. package/dist/pipeline/modules/changeLogModule.js +10 -1
  589. package/dist/pipeline/modules/changeLogModule.js.map +1 -0
  590. package/dist/pipeline/modules/cleanupModule.js +1 -0
  591. package/dist/pipeline/modules/cleanupModule.js.map +1 -0
  592. package/dist/pipeline/modules/codeTransformModule.js +10 -16
  593. package/dist/pipeline/modules/codeTransformModule.js.map +1 -0
  594. package/dist/pipeline/modules/commentModule.js +12 -0
  595. package/dist/pipeline/modules/commentModule.js.map +1 -0
  596. package/dist/pipeline/modules/commitSuggesterModule.js +82 -12
  597. package/dist/pipeline/modules/commitSuggesterModule.js.map +1 -0
  598. package/dist/pipeline/modules/contextReviewModule.js +12 -1
  599. package/dist/pipeline/modules/contextReviewModule.js.map +1 -0
  600. package/dist/pipeline/modules/dialogAnswerModule.js +58 -0
  601. package/dist/pipeline/modules/dialogAnswerModule.js.map +1 -0
  602. package/dist/pipeline/modules/fileSearchModule.js +5 -143
  603. package/dist/pipeline/modules/fileSearchModule.js.map +1 -0
  604. package/dist/pipeline/modules/finalAnswerModule.js +1176 -151
  605. package/dist/pipeline/modules/finalAnswerModule.js.map +1 -0
  606. package/dist/pipeline/modules/kgModule.js +18 -1
  607. package/dist/pipeline/modules/kgModule.js.map +1 -0
  608. package/dist/pipeline/modules/planAnswerModule.js +99 -0
  609. package/dist/pipeline/modules/planAnswerModule.js.map +1 -0
  610. package/dist/pipeline/modules/readFileModule.js +300 -0
  611. package/dist/pipeline/modules/readFileModule.js.map +1 -0
  612. package/dist/pipeline/modules/reviewModule.js +10 -1
  613. package/dist/pipeline/modules/reviewModule.js.map +1 -0
  614. package/dist/pipeline/modules/searchDbModule.js +159 -0
  615. package/dist/pipeline/modules/searchDbModule.js.map +1 -0
  616. package/dist/pipeline/modules/searchListDirectoryModule.js +62 -0
  617. package/dist/pipeline/modules/searchListDirectoryModule.js.map +1 -0
  618. package/dist/pipeline/modules/searchModuleShared.js +71 -0
  619. package/dist/pipeline/modules/searchModuleShared.js.map +1 -0
  620. package/dist/pipeline/modules/searchRegexModule.js +59 -0
  621. package/dist/pipeline/modules/searchRegexModule.js.map +1 -0
  622. package/dist/pipeline/modules/semanticAnalysisModule.js +185 -28
  623. package/dist/pipeline/modules/semanticAnalysisModule.js.map +1 -0
  624. package/dist/pipeline/modules/summaryModule.js +11 -1
  625. package/dist/pipeline/modules/summaryModule.js.map +1 -0
  626. package/dist/pipeline/registry/moduleRegistry.js +9 -0
  627. package/dist/pipeline/registry/moduleRegistry.js.map +1 -0
  628. package/dist/pipeline/runModulePipeline.js +1 -0
  629. package/dist/pipeline/runModulePipeline.js.map +1 -0
  630. package/dist/scripts/dbScriptSupport.js +172 -0
  631. package/dist/scripts/dbScriptSupport.js.map +1 -0
  632. package/dist/scripts/dbcheck.js +173 -267
  633. package/dist/scripts/dbcheck.js.map +1 -0
  634. package/dist/scripts/dboverview.js +161 -0
  635. package/dist/scripts/dboverview.js.map +1 -0
  636. package/dist/scripts/migrateDb.js +1 -0
  637. package/dist/scripts/migrateDb.js.map +1 -0
  638. package/dist/search/SearchOrchestrator.js +928 -0
  639. package/dist/search/SearchOrchestrator.js.map +1 -0
  640. package/dist/search/sharedRankingPolicy.js +283 -0
  641. package/dist/search/sharedRankingPolicy.js.map +1 -0
  642. package/dist/setup/reindexOwner.js +97 -0
  643. package/dist/setup/reindexOwner.js.map +1 -0
  644. package/dist/setup/setupOwner.js +100 -0
  645. package/dist/setup/setupOwner.js.map +1 -0
  646. package/dist/shell/dialogUi.js +81 -0
  647. package/dist/shell/dialogUi.js.map +1 -0
  648. package/dist/shellSession.js +126 -0
  649. package/dist/shellSession.js.map +1 -0
  650. package/dist/status/statusOwner.js +239 -0
  651. package/dist/status/statusOwner.js.map +1 -0
  652. package/dist/testing/contextEval.js +514 -0
  653. package/dist/testing/contextEval.js.map +1 -0
  654. package/dist/testing/fixtures/transform/small-file.input.js +5 -0
  655. package/dist/testing/fixtures/transform/small-file.input.js.map +1 -0
  656. package/dist/testing/harnessArtifacts.js +112 -0
  657. package/dist/testing/harnessArtifacts.js.map +1 -0
  658. package/dist/testing/llmTraceSession.js +67 -0
  659. package/dist/testing/llmTraceSession.js.map +1 -0
  660. package/dist/testing/registerDevCliCommands.js +43 -0
  661. package/dist/testing/registerDevCliCommands.js.map +1 -0
  662. package/dist/testing/runDiagnosis.js +248 -0
  663. package/dist/testing/runDiagnosis.js.map +1 -0
  664. package/dist/testing/runtimeLogReader.js +144 -0
  665. package/dist/testing/runtimeLogReader.js.map +1 -0
  666. package/dist/testing/testCommands.js +35 -303
  667. package/dist/testing/testCommands.js.map +1 -0
  668. package/dist/testing/testRegistry.js +233 -0
  669. package/dist/testing/testRegistry.js.map +1 -0
  670. package/dist/types.js +1 -0
  671. package/dist/types.js.map +1 -0
  672. package/dist/utils/buildContextualPrompt.js +26 -75
  673. package/dist/utils/buildContextualPrompt.js.map +1 -0
  674. package/dist/utils/changeLogPrompt.js +1 -0
  675. package/dist/utils/changeLogPrompt.js.map +1 -0
  676. package/dist/utils/checkModel.js +17 -92
  677. package/dist/utils/checkModel.js.map +1 -0
  678. package/dist/utils/commentMap.js +1 -0
  679. package/dist/utils/commentMap.js.map +1 -0
  680. package/dist/utils/compileSearchQuery.js +23 -9
  681. package/dist/utils/compileSearchQuery.js.map +1 -0
  682. package/dist/utils/consolePresentation.js +208 -0
  683. package/dist/utils/consolePresentation.js.map +1 -0
  684. package/dist/utils/contentUtils.js +17 -2
  685. package/dist/utils/contentUtils.js.map +1 -0
  686. package/dist/utils/debugContext.js +1 -0
  687. package/dist/utils/debugContext.js.map +1 -0
  688. package/dist/utils/dialogState.js +201 -0
  689. package/dist/utils/dialogState.js.map +1 -0
  690. package/dist/utils/editor.js +1 -0
  691. package/dist/utils/editor.js.map +1 -0
  692. package/dist/utils/executionEvidence.js +50 -0
  693. package/dist/utils/executionEvidence.js.map +1 -0
  694. package/dist/utils/extractFileReferences.js +140 -6
  695. package/dist/utils/extractFileReferences.js.map +1 -0
  696. package/dist/utils/fileEvidenceCache.js +50 -0
  697. package/dist/utils/fileEvidenceCache.js.map +1 -0
  698. package/dist/utils/fileTree.js +1 -0
  699. package/dist/utils/fileTree.js.map +1 -0
  700. package/dist/utils/loadRelevantFolderCapsules.js +35 -5
  701. package/dist/utils/loadRelevantFolderCapsules.js.map +1 -0
  702. package/dist/utils/log.js +10 -1
  703. package/dist/utils/log.js.map +1 -0
  704. package/dist/utils/normalizeData.js +1 -0
  705. package/dist/utils/normalizeData.js.map +1 -0
  706. package/dist/utils/ollamaModelStatus.js +28 -0
  707. package/dist/utils/ollamaModelStatus.js.map +1 -0
  708. package/dist/utils/ollamaService.js +294 -0
  709. package/dist/utils/ollamaService.js.map +1 -0
  710. package/dist/utils/outputFormatter.js +1 -0
  711. package/dist/utils/outputFormatter.js.map +1 -0
  712. package/dist/utils/parseTaggedContent.js +1 -0
  713. package/dist/utils/parseTaggedContent.js.map +1 -0
  714. package/dist/utils/planActions.js +27 -46
  715. package/dist/utils/planActions.js.map +1 -0
  716. package/dist/utils/promptBuilderHelper.js +1 -0
  717. package/dist/utils/promptBuilderHelper.js.map +1 -0
  718. package/dist/utils/promptLogHelper.js +29 -13
  719. package/dist/utils/promptLogHelper.js.map +1 -0
  720. package/dist/utils/queryAnchors.js +71 -0
  721. package/dist/utils/queryAnchors.js.map +1 -0
  722. package/dist/utils/repoIdentity.js +82 -0
  723. package/dist/utils/repoIdentity.js.map +1 -0
  724. package/dist/utils/repoKey.js +1 -0
  725. package/dist/utils/repoKey.js.map +1 -0
  726. package/dist/utils/resolveTargetsToFiles.js +1 -0
  727. package/dist/utils/resolveTargetsToFiles.js.map +1 -0
  728. package/dist/utils/resumeContext.js +219 -0
  729. package/dist/utils/resumeContext.js.map +1 -0
  730. package/dist/utils/resumeState.js +310 -0
  731. package/dist/utils/resumeState.js.map +1 -0
  732. package/dist/utils/rollingPlan.js +118 -0
  733. package/dist/utils/rollingPlan.js.map +1 -0
  734. package/dist/utils/runQueryWithDaemonControl.js +11 -3
  735. package/dist/utils/runQueryWithDaemonControl.js.map +1 -0
  736. package/dist/utils/runtimeLogger.js +252 -0
  737. package/dist/utils/runtimeLogger.js.map +1 -0
  738. package/dist/utils/sanitizeQuery.js +1 -0
  739. package/dist/utils/sanitizeQuery.js.map +1 -0
  740. package/dist/utils/sharedUtils.js +1 -0
  741. package/dist/utils/sharedUtils.js.map +1 -0
  742. package/dist/utils/sleep.js +1 -0
  743. package/dist/utils/sleep.js.map +1 -0
  744. package/dist/utils/splitCodeIntoChunk.js +1 -0
  745. package/dist/utils/splitCodeIntoChunk.js.map +1 -0
  746. package/dist/utils/time.js +66 -0
  747. package/dist/utils/time.js.map +1 -0
  748. package/dist/utils/verifyFocusPreference.js +107 -0
  749. package/dist/utils/verifyFocusPreference.js.map +1 -0
  750. package/dist/utils/vscode.js +1 -0
  751. package/dist/utils/vscode.js.map +1 -0
  752. package/dist/workflow/workflowResolver.js +1 -0
  753. package/dist/workflow/workflowResolver.js.map +1 -0
  754. package/dist/workflow/workflowRunner.js +1 -0
  755. package/dist/workflow/workflowRunner.js.map +1 -0
  756. package/package.json +3 -3
  757. package/dist/agents/MainAgent.js +0 -1886
  758. package/dist/agents/contextReviewStep.js +0 -101
  759. package/dist/agents/finalPlanGenStep.js +0 -107
  760. package/dist/agents/structuralAnalysisStep.js +0 -46
  761. package/dist/agents/validationAnalysisStep.js +0 -87
  762. package/dist/pipeline/modules/chunkManagerModule.js +0 -24
  763. package/dist/pipeline/modules/cleanGeneratedTestsModule.js +0 -33
  764. package/dist/pipeline/modules/fileReaderModule.js +0 -72
  765. package/dist/pipeline/modules/gatherInfoModule.js +0 -181
  766. package/dist/pipeline/modules/generateTestsModule.js +0 -68
  767. package/dist/pipeline/modules/preserveCodeModule.js +0 -195
  768. package/dist/pipeline/modules/refactorModule.js +0 -40
  769. package/dist/pipeline/modules/repairTestsModule.js +0 -48
  770. package/dist/pipeline/modules/runTestsModule.js +0 -37
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Writes eval and integration run artifacts to repo-local folders for later review.
3
+ *
4
+ * Why this exists:
5
+ * - local evals and integration runs should leave reviewable evidence on disk
6
+ * - artifacts let us compare model output against source after the run
7
+ * - artifact timestamps should match the local-time runtime logs instead of drifting to UTC
8
+ * - the folder shape stays simple so humans and tools can inspect it easily
9
+ *
10
+ * Output examples:
11
+ * - `artifacts/evals/20260320T101530123+0100_explicit_target_fast_path/final_answer.txt`
12
+ * - `artifacts/integration/20260320T101601456+0100_resumed_continuity_summary/report.md`
13
+ */
14
+ import fs from "fs";
15
+ import path from "path";
16
+ import { getDbForRepo } from "../db/client.js";
17
+ import { resolveCanonicalRepoIdentity } from "../utils/repoIdentity.js";
18
+ import { formatLocalIso } from "../utils/time.js";
19
+ import { diagnoseRun, parseRoutingDecision, parseRunLogInsightsFromText } from "./runDiagnosis.js";
20
+ function sanitizeSegment(value) {
21
+ return value
22
+ .trim()
23
+ .toLowerCase()
24
+ .replace(/[^a-z0-9._-]+/g, "_")
25
+ .replace(/_+/g, "_")
26
+ .replace(/^_+|_+$/g, "") || "run";
27
+ }
28
+ function buildTimestamp() {
29
+ const localIso = formatLocalIso(new Date());
30
+ return localIso
31
+ .replace(/[-:]/g, "")
32
+ .replace(/\.(\d{3})([+-]\d{2})(\d{2})$/, "$1$2$3");
33
+ }
34
+ export function loadTaskArtifacts(taskId) {
35
+ if (typeof taskId !== "number") {
36
+ return { task: null, steps: [] };
37
+ }
38
+ const db = getDbForRepo();
39
+ const task = db.prepare("SELECT * FROM tasks WHERE id = ?").get(taskId);
40
+ const steps = db.prepare(`
41
+ SELECT *
42
+ FROM steps
43
+ WHERE task_id = ?
44
+ ORDER BY
45
+ CASE WHEN step_index IS NULL THEN 1 ELSE 0 END ASC,
46
+ step_index ASC,
47
+ id ASC
48
+ `).all(taskId);
49
+ return {
50
+ task: task ?? null,
51
+ steps,
52
+ };
53
+ }
54
+ /**
55
+ * Creates one stable artifact folder for a single saved eval or integration run.
56
+ *
57
+ * Why this exists:
58
+ * - integration tracing needs the artifact folder before the run starts
59
+ * - later artifact writers should append into that same folder instead of creating a new one
60
+ */
61
+ export function createHarnessArtifactDir(kind, caseId) {
62
+ const repoIdentity = resolveCanonicalRepoIdentity();
63
+ const baseDir = path.join(repoIdentity.repoRootPath, "artifacts", kind);
64
+ const dirName = `${buildTimestamp()}_${sanitizeSegment(caseId)}`;
65
+ const artifactDir = path.join(baseDir, dirName);
66
+ fs.mkdirSync(artifactDir, { recursive: true });
67
+ return artifactDir;
68
+ }
69
+ export function writeHarnessArtifacts(input) {
70
+ const artifactDir = input.artifactDir ?? createHarnessArtifactDir(input.kind, input.caseId);
71
+ const { task, steps } = loadTaskArtifacts(input.taskId);
72
+ const routing = parseRoutingDecision(task);
73
+ const insights = parseRunLogInsightsFromText(input.runLog, routing);
74
+ const diagnosis = diagnoseRun({
75
+ task,
76
+ steps,
77
+ routing,
78
+ insights,
79
+ query: input.query,
80
+ finalAnswerText: input.finalAnswerText,
81
+ failures: Array.isArray(input.result.failures) ? input.result.failures : [],
82
+ passed: input.result.passed === true,
83
+ });
84
+ fs.writeFileSync(path.join(artifactDir, "case.json"), JSON.stringify({
85
+ id: input.caseId,
86
+ query: input.query,
87
+ taskId: input.taskId ?? null,
88
+ }, null, 2));
89
+ fs.writeFileSync(path.join(artifactDir, "run.log"), input.runLog, "utf-8");
90
+ fs.writeFileSync(path.join(artifactDir, "final_answer.txt"), input.finalAnswerText || "", "utf-8");
91
+ fs.writeFileSync(path.join(artifactDir, "eval_result.json"), JSON.stringify(input.result, null, 2));
92
+ fs.writeFileSync(path.join(artifactDir, "task.json"), JSON.stringify(task, null, 2));
93
+ fs.writeFileSync(path.join(artifactDir, "steps.json"), JSON.stringify(steps, null, 2));
94
+ fs.writeFileSync(path.join(artifactDir, "diagnosis.json"), JSON.stringify(diagnosis, null, 2));
95
+ if (input.contextSnapshot !== undefined) {
96
+ fs.writeFileSync(path.join(artifactDir, "context_snapshot.json"), JSON.stringify(input.contextSnapshot, null, 2));
97
+ }
98
+ if (typeof input.reportText === "string") {
99
+ fs.writeFileSync(path.join(artifactDir, "report.md"), input.reportText, "utf-8");
100
+ }
101
+ if (input.outputFiles?.length) {
102
+ const fileManifest = input.outputFiles.map((file) => ({ path: file.path }));
103
+ fs.writeFileSync(path.join(artifactDir, "output_files.json"), JSON.stringify(fileManifest, null, 2));
104
+ for (const file of input.outputFiles) {
105
+ const outputPath = path.join(artifactDir, "files", file.path);
106
+ fs.mkdirSync(path.dirname(outputPath), { recursive: true });
107
+ fs.writeFileSync(outputPath, file.content, "utf-8");
108
+ }
109
+ }
110
+ return artifactDir;
111
+ }
112
+ //# sourceMappingURL=harnessArtifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harnessArtifacts.js","sourceRoot":"","sources":["../../src/testing/harnessArtifacts.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Writes eval and integration run artifacts to repo-local folders for later review.\n *\n * Why this exists:\n * - local evals and integration runs should leave reviewable evidence on disk\n * - artifacts let us compare model output against source after the run\n * - artifact timestamps should match the local-time runtime logs instead of drifting to UTC\n * - the folder shape stays simple so humans and tools can inspect it easily\n *\n * Output examples:\n * - `artifacts/evals/20260320T101530123+0100_explicit_target_fast_path/final_answer.txt`\n * - `artifacts/integration/20260320T101601456+0100_resumed_continuity_summary/report.md`\n */\nimport fs from \"fs\";\nimport path from \"path\";\nimport { getDbForRepo } from \"../db/client.js\";\nimport { resolveCanonicalRepoIdentity } from \"../utils/repoIdentity.js\";\nimport { formatLocalIso } from \"../utils/time.js\";\nimport { diagnoseRun, parseRoutingDecision, parseRunLogInsightsFromText } from \"./runDiagnosis.js\";\n\ntype ArtifactKind = \"evals\" | \"integration\";\n\nexport type HarnessArtifactFile = {\n path: string;\n content: string;\n};\n\nexport type HarnessArtifactInput = {\n kind: ArtifactKind;\n caseId: string;\n query: string;\n taskId?: number;\n runLog: string;\n finalAnswerText: string;\n result: Record<string, unknown>;\n contextSnapshot?: unknown;\n reportText?: string;\n artifactDir?: string;\n outputFiles?: HarnessArtifactFile[];\n};\n\nfunction sanitizeSegment(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\") || \"run\";\n}\n\nfunction buildTimestamp(): string {\n const localIso = formatLocalIso(new Date());\n return localIso\n .replace(/[-:]/g, \"\")\n .replace(/\\.(\\d{3})([+-]\\d{2})(\\d{2})$/, \"$1$2$3\");\n}\n\nexport function loadTaskArtifacts(taskId: number | undefined): {\n task: Record<string, unknown> | null;\n steps: Record<string, unknown>[];\n} {\n if (typeof taskId !== \"number\") {\n return { task: null, steps: [] };\n }\n\n const db = getDbForRepo();\n const task = db.prepare(\"SELECT * FROM tasks WHERE id = ?\").get(taskId) as Record<string, unknown> | undefined;\n const steps = db.prepare(`\n SELECT *\n FROM steps\n WHERE task_id = ?\n ORDER BY\n CASE WHEN step_index IS NULL THEN 1 ELSE 0 END ASC,\n step_index ASC,\n id ASC\n `).all(taskId) as Record<string, unknown>[];\n\n return {\n task: task ?? null,\n steps,\n };\n}\n\n/**\n * Creates one stable artifact folder for a single saved eval or integration run.\n *\n * Why this exists:\n * - integration tracing needs the artifact folder before the run starts\n * - later artifact writers should append into that same folder instead of creating a new one\n */\nexport function createHarnessArtifactDir(kind: ArtifactKind, caseId: string): string {\n const repoIdentity = resolveCanonicalRepoIdentity();\n const baseDir = path.join(repoIdentity.repoRootPath, \"artifacts\", kind);\n const dirName = `${buildTimestamp()}_${sanitizeSegment(caseId)}`;\n const artifactDir = path.join(baseDir, dirName);\n fs.mkdirSync(artifactDir, { recursive: true });\n return artifactDir;\n}\n\nexport function writeHarnessArtifacts(input: HarnessArtifactInput): string {\n const artifactDir = input.artifactDir ?? createHarnessArtifactDir(input.kind, input.caseId);\n const { task, steps } = loadTaskArtifacts(input.taskId);\n const routing = parseRoutingDecision(task);\n const insights = parseRunLogInsightsFromText(input.runLog, routing);\n const diagnosis = diagnoseRun({\n task,\n steps,\n routing,\n insights,\n query: input.query,\n finalAnswerText: input.finalAnswerText,\n failures: Array.isArray(input.result.failures) ? input.result.failures as string[] : [],\n passed: input.result.passed === true,\n });\n\n fs.writeFileSync(path.join(artifactDir, \"case.json\"), JSON.stringify({\n id: input.caseId,\n query: input.query,\n taskId: input.taskId ?? null,\n }, null, 2));\n fs.writeFileSync(path.join(artifactDir, \"run.log\"), input.runLog, \"utf-8\");\n fs.writeFileSync(path.join(artifactDir, \"final_answer.txt\"), input.finalAnswerText || \"\", \"utf-8\");\n fs.writeFileSync(path.join(artifactDir, \"eval_result.json\"), JSON.stringify(input.result, null, 2));\n fs.writeFileSync(path.join(artifactDir, \"task.json\"), JSON.stringify(task, null, 2));\n fs.writeFileSync(path.join(artifactDir, \"steps.json\"), JSON.stringify(steps, null, 2));\n fs.writeFileSync(path.join(artifactDir, \"diagnosis.json\"), JSON.stringify(diagnosis, null, 2));\n\n if (input.contextSnapshot !== undefined) {\n fs.writeFileSync(\n path.join(artifactDir, \"context_snapshot.json\"),\n JSON.stringify(input.contextSnapshot, null, 2)\n );\n }\n if (typeof input.reportText === \"string\") {\n fs.writeFileSync(path.join(artifactDir, \"report.md\"), input.reportText, \"utf-8\");\n }\n if (input.outputFiles?.length) {\n const fileManifest = input.outputFiles.map((file) => ({ path: file.path }));\n fs.writeFileSync(\n path.join(artifactDir, \"output_files.json\"),\n JSON.stringify(fileManifest, null, 2)\n );\n for (const file of input.outputFiles) {\n const outputPath = path.join(artifactDir, \"files\", file.path);\n fs.mkdirSync(path.dirname(outputPath), { recursive: true });\n fs.writeFileSync(outputPath, file.content, \"utf-8\");\n }\n }\n\n return artifactDir;\n}\n"]}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Tracks one integration-run LLM trace session and writes one JSON file per model call.
3
+ *
4
+ * Why this exists:
5
+ * - integration runs need exact per-call model inputs saved before later diagnosis
6
+ * - `generate()` is the shared model gateway, so one session hook can cover most calls
7
+ * - each call gets a stable id so `run.log` output can point back to the saved trace file
8
+ */
9
+ import fs from "fs";
10
+ import path from "path";
11
+ let activeSession = null;
12
+ function sanitizeSegment(value) {
13
+ return value
14
+ .trim()
15
+ .replace(/[^a-zA-Z0-9._-]+/g, "_")
16
+ .replace(/_+/g, "_")
17
+ .replace(/^_+|_+$/g, "") || "llm";
18
+ }
19
+ function buildCallId(sequence, caller) {
20
+ return `llm-${String(sequence).padStart(4, "0")}-${sanitizeSegment(caller)}`;
21
+ }
22
+ function isLikelyStructuredContext(value) {
23
+ if (!value || typeof value !== "object")
24
+ return false;
25
+ const record = value;
26
+ return "initContext" in record && "task" in record;
27
+ }
28
+ export function startLlmTraceSession(artifactDir) {
29
+ activeSession = {
30
+ baseDir: path.join(artifactDir, "llm_calls"),
31
+ nextSequence: 1,
32
+ };
33
+ fs.mkdirSync(activeSession.baseDir, { recursive: true });
34
+ }
35
+ export function stopLlmTraceSession() {
36
+ activeSession = null;
37
+ }
38
+ export function isLlmTraceSessionActive() {
39
+ return activeSession !== null;
40
+ }
41
+ export function writeLlmTraceRecord(input) {
42
+ if (!activeSession)
43
+ return undefined;
44
+ const sequence = activeSession.nextSequence++;
45
+ const callId = buildCallId(sequence, input.caller);
46
+ const filePath = path.join(activeSession.baseDir, `${String(sequence).padStart(4, "0")}_${sanitizeSegment(input.caller)}.json`);
47
+ const suspiciousFullContext = isLikelyStructuredContext(input.inputContext);
48
+ const payload = {
49
+ callId,
50
+ caller: input.caller,
51
+ query: input.query,
52
+ model: input.model,
53
+ requestBody: input.requestBody,
54
+ promptText: input.promptText,
55
+ inputContext: input.inputContext,
56
+ suspiciousFullContext,
57
+ timestamp: input.startedAt,
58
+ startedAt: input.startedAt,
59
+ finishedAt: input.finishedAt,
60
+ durationMs: input.durationMs,
61
+ attemptCount: input.attemptCount,
62
+ errorMessage: input.errorMessage,
63
+ };
64
+ fs.writeFileSync(filePath, JSON.stringify(payload, null, 2), "utf-8");
65
+ return { callId, filePath };
66
+ }
67
+ //# sourceMappingURL=llmTraceSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llmTraceSession.js","sourceRoot":"","sources":["../../src/testing/llmTraceSession.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAqBxB,IAAI,aAAa,GAAgC,IAAI,CAAC;AAEtD,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,KAAK;SACT,IAAI,EAAE;SACN,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC;SACjC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC;AACtC,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,MAAc;IACnD,OAAO,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAc;IAC/C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,OAAO,aAAa,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,aAAa,GAAG;QACd,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC;QAC5C,YAAY,EAAE,CAAC;KAChB,CAAC;IACF,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,aAAa,KAAK,IAAI,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAA0B;IAC5D,IAAI,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IAErC,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACxB,aAAa,CAAC,OAAO,EACrB,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAC7E,CAAC;IAEF,MAAM,qBAAqB,GAAG,yBAAyB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG;QACd,MAAM;QACN,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,qBAAqB;QACrB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,YAAY,EAAE,KAAK,CAAC,YAAY;KACjC,CAAC;IAEF,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACtE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC","sourcesContent":["/**\n * Tracks one integration-run LLM trace session and writes one JSON file per model call.\n *\n * Why this exists:\n * - integration runs need exact per-call model inputs saved before later diagnosis\n * - `generate()` is the shared model gateway, so one session hook can cover most calls\n * - each call gets a stable id so `run.log` output can point back to the saved trace file\n */\nimport fs from \"fs\";\nimport path from \"path\";\n\nexport type LlmTraceRecordInput = {\n caller: string;\n query: string;\n model: string;\n requestBody: unknown;\n promptText: string;\n inputContext: unknown;\n startedAt: string;\n finishedAt: string;\n durationMs: number;\n attemptCount: number;\n errorMessage?: string;\n};\n\ntype LlmTraceSessionState = {\n baseDir: string;\n nextSequence: number;\n};\n\nlet activeSession: LlmTraceSessionState | null = null;\n\nfunction sanitizeSegment(value: string): string {\n return value\n .trim()\n .replace(/[^a-zA-Z0-9._-]+/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\") || \"llm\";\n}\n\nfunction buildCallId(sequence: number, caller: string): string {\n return `llm-${String(sequence).padStart(4, \"0\")}-${sanitizeSegment(caller)}`;\n}\n\nfunction isLikelyStructuredContext(value: unknown): boolean {\n if (!value || typeof value !== \"object\") return false;\n const record = value as Record<string, unknown>;\n return \"initContext\" in record && \"task\" in record;\n}\n\nexport function startLlmTraceSession(artifactDir: string): void {\n activeSession = {\n baseDir: path.join(artifactDir, \"llm_calls\"),\n nextSequence: 1,\n };\n fs.mkdirSync(activeSession.baseDir, { recursive: true });\n}\n\nexport function stopLlmTraceSession(): void {\n activeSession = null;\n}\n\nexport function isLlmTraceSessionActive(): boolean {\n return activeSession !== null;\n}\n\nexport function writeLlmTraceRecord(input: LlmTraceRecordInput): { callId: string; filePath: string } | undefined {\n if (!activeSession) return undefined;\n\n const sequence = activeSession.nextSequence++;\n const callId = buildCallId(sequence, input.caller);\n const filePath = path.join(\n activeSession.baseDir,\n `${String(sequence).padStart(4, \"0\")}_${sanitizeSegment(input.caller)}.json`\n );\n\n const suspiciousFullContext = isLikelyStructuredContext(input.inputContext);\n const payload = {\n callId,\n caller: input.caller,\n query: input.query,\n model: input.model,\n requestBody: input.requestBody,\n promptText: input.promptText,\n inputContext: input.inputContext,\n suspiciousFullContext,\n timestamp: input.startedAt,\n startedAt: input.startedAt,\n finishedAt: input.finishedAt,\n durationMs: input.durationMs,\n attemptCount: input.attemptCount,\n errorMessage: input.errorMessage,\n };\n\n fs.writeFileSync(filePath, JSON.stringify(payload, null, 2), \"utf-8\");\n return { callId, filePath };\n}\n"]}
@@ -0,0 +1,43 @@
1
+ import { listRegisteredTests, printTestCommand, runAllTestsCommand, runRegisteredTestCommand, } from "../commands/TestCmd.js";
2
+ /**
3
+ * Registers development CLI commands for test helpers.
4
+ *
5
+ * To run the full suite:
6
+ * scai tests
7
+ *
8
+ * To run a specific registered test by ID:
9
+ * scai test-run <id>
10
+ *
11
+ * To list all available registered test IDs and descriptions:
12
+ * scai test-list
13
+ *
14
+ * To print the exact npx vitest command for running tests:
15
+ * scai test-cmd [id]
16
+ */
17
+ export function registerDevCliCommands(cmd, _runQuery) {
18
+ cmd
19
+ .command("tests")
20
+ .description("Run the full Vitest suite")
21
+ .action(() => {
22
+ runAllTestsCommand();
23
+ });
24
+ cmd
25
+ .command("test-run <id>")
26
+ .description("Run one registered Vitest target by id")
27
+ .action((id) => {
28
+ runRegisteredTestCommand(id);
29
+ });
30
+ cmd
31
+ .command("test-list")
32
+ .description("List registered test ids and descriptions")
33
+ .action(() => {
34
+ listRegisteredTests();
35
+ });
36
+ cmd
37
+ .command("test-cmd [id]")
38
+ .description("Print the exact npx vitest command for the full suite or one id")
39
+ .action((id) => {
40
+ printTestCommand(id);
41
+ });
42
+ }
43
+ //# sourceMappingURL=registerDevCliCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registerDevCliCommands.js","sourceRoot":"","sources":["../../src/testing/registerDevCliCommands.ts"],"names":[],"mappings":"AASA,OAAO,EACH,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,GAC3B,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,sBAAsB,CAClC,GAAY,EACZ,SAGqB;IAErB,GAAG;SACE,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,GAAG,EAAE;QACT,kBAAkB,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEP,GAAG;SACE,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,CAAC,EAAU,EAAE,EAAE;QACnB,wBAAwB,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEP,GAAG;SACE,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,GAAG,EAAE;QACT,mBAAmB,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEP,GAAG;SACE,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,iEAAiE,CAAC;SAC9E,MAAM,CAAC,CAAC,EAAW,EAAE,EAAE;QACpB,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACX,CAAC","sourcesContent":["/**\n * Registers dev-only CLI commands for tests and evals.\n *\n * Why this file exists:\n * - the direct CLI still needs one thin composition point for dev commands\n * - test commands should stay grouped so help text and wiring do not drift\n * - dev-only commands should stay out of the default user-facing CLI surface\n */\nimport type { Command } from \"commander\";\nimport {\n listRegisteredTests,\n printTestCommand,\n runAllTestsCommand,\n runRegisteredTestCommand,\n} from \"../commands/TestCmd.js\";\n\n/**\n * Registers development CLI commands for test helpers.\n *\n * To run the full suite:\n * scai tests\n *\n * To run a specific registered test by ID:\n * scai test-run <id>\n *\n * To list all available registered test IDs and descriptions:\n * scai test-list\n *\n * To print the exact npx vitest command for running tests:\n * scai test-cmd [id]\n */\nexport function registerDevCliCommands(\n cmd: Command,\n _runQuery: (\n query: string,\n options?: { resumeTaskId?: number; continueCurrentTask?: boolean; bindAsCurrentTask?: boolean }\n ) => Promise<unknown>\n): void {\n cmd\n .command(\"tests\")\n .description(\"Run the full Vitest suite\")\n .action(() => {\n runAllTestsCommand();\n });\n\n cmd\n .command(\"test-run <id>\")\n .description(\"Run one registered Vitest target by id\")\n .action((id: string) => {\n runRegisteredTestCommand(id);\n });\n\n cmd\n .command(\"test-list\")\n .description(\"List registered test ids and descriptions\")\n .action(() => {\n listRegisteredTests();\n });\n\n cmd\n .command(\"test-cmd [id]\")\n .description(\"Print the exact npx vitest command for the full suite or one id\")\n .action((id?: string) => {\n printTestCommand(id);\n });\n}\n"]}
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Classifies saved runs into a likely subsystem issue using deterministic signals.
3
+ *
4
+ * Why this exists:
5
+ * - raw logs show what happened, but they do not say where to look first
6
+ * - eval reports and saved artifacts should agree on the likely failure category
7
+ * - the rules stay deterministic so diagnosis does not depend on another model call
8
+ *
9
+ * Example diagnoses:
10
+ * - final answer + deferred task + zero steps -> persistence
11
+ * - explicit target resolved + broad fallback entered -> routing
12
+ * - answer present but explicit file anchor missing -> answer-quality
13
+ */
14
+ import { extractStepPayloadsFromRuntimeLog } from "./runtimeLogReader.js";
15
+ export function parseRoutingDecision(task) {
16
+ if (!task?.routing_decision_json)
17
+ return null;
18
+ try {
19
+ return JSON.parse(task.routing_decision_json);
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ /**
26
+ * Pulls one logged JSON block for a given step from the run log.
27
+ * Example: `readinessGateStep` -> `{ readiness: { decision: "ready" } }`.
28
+ */
29
+ export function extractStepPayloads(runLog, stepName) {
30
+ return extractStepPayloadsFromRuntimeLog(runLog, stepName);
31
+ }
32
+ function detectLane(runtimeStates, routing, resolvedExplicitTargets, continuityPayload, answerModule) {
33
+ const tracedLane = runtimeStates.map((entry) => entry.lane).find((lane) => lane && lane !== "coding");
34
+ if (tracedLane === "explicit-target" || tracedLane === "resume-continuity") {
35
+ return tracedLane;
36
+ }
37
+ if (answerModule === "continuityAnswerModule")
38
+ return "resume-continuity";
39
+ if (resolvedExplicitTargets > 0)
40
+ return "explicit-target";
41
+ if (typeof continuityPayload?.kind === "string" && String(continuityPayload.kind).startsWith("direct-")) {
42
+ return "resume-continuity";
43
+ }
44
+ const rationale = typeof routing?.rationale === "string" ? routing.rationale : "";
45
+ if (rationale.includes("route=explicit-target"))
46
+ return "explicit-target";
47
+ if (rationale.includes("route=resume-continuity"))
48
+ return "resume-continuity";
49
+ if (Boolean(routing?.allowSearch) || Boolean(routing?.allowResearch))
50
+ return "evidence";
51
+ if (Boolean(routing?.allowTransform))
52
+ return "coding";
53
+ if (answerModule !== "unknown")
54
+ return "direct-answer";
55
+ return "unknown";
56
+ }
57
+ export function parseRunLogInsightsFromText(runLog, routing) {
58
+ if (!runLog) {
59
+ return {
60
+ lane: "unknown",
61
+ answerModule: "unknown",
62
+ runtimeStates: [],
63
+ routeEvents: [],
64
+ nextActionDecisions: [],
65
+ resolvedExplicitTargets: 0,
66
+ enteredBroadFallback: false,
67
+ readinessDecision: null,
68
+ evidenceRelevantCount: 0,
69
+ };
70
+ }
71
+ const runtimeStates = extractStepPayloads(runLog, "runtimeState")
72
+ .filter((payload) => {
73
+ return typeof payload === "object" && payload !== null && "phase" in payload && "lane" in payload;
74
+ });
75
+ const resolvePayloads = extractStepPayloads(runLog, "resolveExplicitTargetsStep");
76
+ const resolvePayload = resolvePayloads[resolvePayloads.length - 1];
77
+ const resumeIntentPayloads = extractStepPayloads(runLog, "resumeContinuityStep");
78
+ const resumeIntentPayload = resumeIntentPayloads[resumeIntentPayloads.length - 1];
79
+ const continuityPayloads = extractStepPayloads(runLog, "continuityRoutingAnalysisStep");
80
+ const continuityPayload = continuityPayloads[continuityPayloads.length - 1];
81
+ const readinessPayloads = extractStepPayloads(runLog, "readinessGateStep");
82
+ const readinessPayload = readinessPayloads[readinessPayloads.length - 1];
83
+ const evidencePayloads = extractStepPayloads(runLog, "evidenceVerifier");
84
+ const evidencePayload = evidencePayloads[evidencePayloads.length - 1];
85
+ const nextActionPayloads = extractStepPayloads(runLog, "decideNextAction");
86
+ const answerModule = runLog.includes("📂 OUTPUT | continuityAnswerModule")
87
+ ? "continuityAnswerModule"
88
+ : runLog.includes("📂 OUTPUT | finalAnswerModule")
89
+ ? "finalAnswerModule"
90
+ : "unknown";
91
+ const nextActionDecisions = nextActionPayloads
92
+ .map((payload) => {
93
+ if (typeof payload !== "object" || payload === null || !("decision" in payload))
94
+ return null;
95
+ const decision = payload.decision;
96
+ if (!decision || typeof decision !== "object")
97
+ return null;
98
+ const trace = {
99
+ action: typeof decision.action === "string" ? decision.action : "unknown",
100
+ };
101
+ if (typeof decision.reason === "string")
102
+ trace.reason = decision.reason;
103
+ if (typeof decision.confidence === "number")
104
+ trace.confidence = decision.confidence;
105
+ if (typeof decision.targetFile === "string")
106
+ trace.targetFile = decision.targetFile;
107
+ if (typeof decision.source === "string")
108
+ trace.source = decision.source;
109
+ return trace;
110
+ })
111
+ .filter((decision) => decision !== null);
112
+ const resolvedExplicitTargets = Array.isArray(resolvePayload?.resolvedTargetFiles)
113
+ ? resolvePayload.resolvedTargetFiles.length
114
+ : 0;
115
+ const enteredBroadFallback = Boolean(resolvePayload?.enteredBroadFallback);
116
+ const evidenceRelevantCount = Array.isArray(evidencePayload)
117
+ ? evidencePayload.filter((row) => row && row.isRelevant === true).length
118
+ : 0;
119
+ const readinessDecision = typeof readinessPayload?.readiness?.decision === "string"
120
+ ? readinessPayload.readiness.decision
121
+ : null;
122
+ const routeEvents = [];
123
+ if (resolvePayload) {
124
+ routeEvents.push({
125
+ label: "explicit target resolution",
126
+ details: `resolved=${resolvedExplicitTargets}, broadFallback=${enteredBroadFallback}`,
127
+ });
128
+ }
129
+ if (resumeIntentPayload) {
130
+ routeEvents.push({
131
+ label: "resume continuity intent",
132
+ details: String(resumeIntentPayload.kind ?? "unknown"),
133
+ });
134
+ }
135
+ if (continuityPayload) {
136
+ routeEvents.push({
137
+ label: "continuity routing analysis",
138
+ details: `${String(continuityPayload.kind ?? "unknown")} (answerNow=${String(continuityPayload.answerNow ?? false)})`,
139
+ });
140
+ }
141
+ routeEvents.push({
142
+ label: "answer module",
143
+ details: answerModule,
144
+ });
145
+ const latestNextAction = nextActionDecisions[nextActionDecisions.length - 1];
146
+ if (latestNextAction) {
147
+ routeEvents.push({
148
+ label: "next action decision",
149
+ details: `${latestNextAction.action}${latestNextAction.reason ? ` (${latestNextAction.reason})` : ""}`,
150
+ });
151
+ }
152
+ return {
153
+ lane: detectLane(runtimeStates, routing, resolvedExplicitTargets, continuityPayload, answerModule),
154
+ answerModule,
155
+ runtimeStates,
156
+ routeEvents,
157
+ nextActionDecisions,
158
+ resolvedExplicitTargets,
159
+ enteredBroadFallback,
160
+ readinessDecision,
161
+ evidenceRelevantCount,
162
+ };
163
+ }
164
+ function collectAnswerAnchors(query) {
165
+ const anchors = new Set();
166
+ for (const match of query.matchAll(/\b([A-Za-z0-9_./-]+\.[A-Za-z0-9]+)\b/g)) {
167
+ const raw = match[1]?.trim();
168
+ if (!raw)
169
+ continue;
170
+ const parts = raw.split("/");
171
+ anchors.add(parts[parts.length - 1].toLowerCase());
172
+ }
173
+ return Array.from(anchors);
174
+ }
175
+ function hasDirectAnswerPath(insights, stepCount) {
176
+ return insights.answerModule === "continuityAnswerModule" ||
177
+ (insights.answerModule === "finalAnswerModule" && stepCount === 0);
178
+ }
179
+ function isStaleExactTargetEvalFailure(failure) {
180
+ return failure.includes("deterministicPreGroundingPrefilter") || failure.includes("domain-anchors:");
181
+ }
182
+ function createDiagnosis(category, confidence, symptoms, why, likelyOwner, suggestedNextCheck, supportingFacts) {
183
+ return {
184
+ primaryCategory: category,
185
+ confidence,
186
+ symptoms,
187
+ why,
188
+ likelyOwner,
189
+ suggestedNextCheck,
190
+ supportingFacts,
191
+ };
192
+ }
193
+ export function hasHighConfidenceIssue(diagnosis) {
194
+ return diagnosis.primaryCategory !== "unknown" && diagnosis.confidence >= 0.85;
195
+ }
196
+ export function diagnoseRun(input) {
197
+ const taskStatus = input.task?.status ?? null;
198
+ const stepCount = input.steps.length;
199
+ const completedStepCount = input.steps.filter((step) => step.status === "completed").length;
200
+ const hasFinalAnswer = (input.finalAnswerText?.trim().length ?? 0) > 0 ||
201
+ (typeof input.task?.summary === "string" && input.task.summary.trim().length > 0) ||
202
+ input.insights.answerModule !== "unknown";
203
+ const allowSearch = Boolean(input.routing?.allowSearch);
204
+ const allowResearch = Boolean(input.routing?.allowResearch);
205
+ const allowTransform = Boolean(input.routing?.allowTransform);
206
+ const supportingFacts = {
207
+ taskStatus,
208
+ stepCount,
209
+ completedStepCount,
210
+ lane: input.insights.lane,
211
+ answerModule: input.insights.answerModule,
212
+ hasFinalAnswer,
213
+ allowSearch,
214
+ allowResearch,
215
+ allowTransform,
216
+ };
217
+ const answerAnchors = collectAnswerAnchors(input.query);
218
+ const missingAnchors = answerAnchors.filter((anchor) => {
219
+ return !input.finalAnswerText?.toLowerCase().includes(anchor);
220
+ });
221
+ if (input.passed === true && hasFinalAnswer && taskStatus === "deferred") {
222
+ return createDiagnosis("reporting", 0.99, ["final answer present", "task status deferred", "run still marked as passed"], "The saved result looks healthy in the report or integration verdict, but persisted task state contradicts that outcome.", "Eval report and integration verdict logic", "Compare report pass conditions with task persistence invariants around finalize.", supportingFacts);
223
+ }
224
+ if (hasFinalAnswer && taskStatus === "deferred") {
225
+ return createDiagnosis("persistence", 0.97, ["final answer present", "task status deferred", stepCount === 0 ? "zero persisted steps" : "task did not complete"], "Finalize produced an answer, but persisted task state still reflects a blocked or deferred path.", "MainAgent persistence and completion semantics", "Inspect MainAgent readiness/finalize status handling and persistTaskData call sites.", supportingFacts);
226
+ }
227
+ if (input.insights.resolvedExplicitTargets > 0 && input.insights.enteredBroadFallback) {
228
+ return createDiagnosis("routing", 0.93, ["explicit target resolved", "broad fallback entered unexpectedly"], "Explicit target routing should stay narrow once a concrete file target resolves.", "Explicit target routing and scope shaping", "Inspect resolveExplicitTargetsStep and routingDecisionStep lane constraints.", supportingFacts);
229
+ }
230
+ if (hasFinalAnswer &&
231
+ input.insights.lane === "explicit-target" &&
232
+ input.insights.resolvedExplicitTargets > 0 &&
233
+ (input.failures?.length ?? 0) > 0 &&
234
+ input.failures.every(isStaleExactTargetEvalFailure)) {
235
+ return createDiagnosis("reporting", 0.91, ["exact target resolved", "final answer present", "only stale pre-refactor eval markers failed"], "The run shape matches the new exact-target contract, but the saved eval still expected older bootstrap-only retrieval markers.", "Eval assertions and report expectations", "Update exact-target eval checks to assert SearchOrchestrator and downstream focus derivation instead of old bootstrap tokens.", supportingFacts);
236
+ }
237
+ if (!hasFinalAnswer && input.insights.readinessDecision !== "ready" && input.insights.evidenceRelevantCount === 0) {
238
+ return createDiagnosis("evidence", 0.87, ["readiness not reached", "weak or missing evidence"], "The run did not gather enough relevant evidence to move safely into answering or execution.", "Search, verify, and readiness gating", "Inspect evidenceVerifier, preFileSearchCheckStep, and readinessGateStep outputs.", supportingFacts);
239
+ }
240
+ if (allowTransform && !hasDirectAnswerPath(input.insights, stepCount) && completedStepCount === 0) {
241
+ return createDiagnosis("execution", 0.9, ["transform or execution route allowed", "no completed execution steps"], "The run looked like it should perform executable work, but no execution step completed and no direct-answer path explains the stop.", "Work loop and step execution", "Inspect runPlan, runWorkLoop, and step status transitions for stalled execution.", supportingFacts);
242
+ }
243
+ if (hasFinalAnswer && missingAnchors.length > 0) {
244
+ return createDiagnosis("answer-quality", 0.86, [`answer missing explicit anchors: ${missingAnchors.join(", ")}`], "The answer did not ground itself on an explicit file or symbol named in the query.", "Final answer grounding and answer checks", "Inspect finalAnswerModule grounding inputs and answer-level eval assertions.", supportingFacts);
245
+ }
246
+ return createDiagnosis("unknown", 0.2, input.failures && input.failures.length > 0 ? input.failures : ["no deterministic contradiction detected"], "No high-confidence subsystem diagnosis was detected from the current task, steps, and run-log signals.", "Review run log and task snapshot manually", "Start with route timeline, then compare persisted task status and answer path.", supportingFacts);
247
+ }
248
+ //# sourceMappingURL=runDiagnosis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runDiagnosis.js","sourceRoot":"","sources":["../../src/testing/runDiagnosis.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Classifies saved runs into a likely subsystem issue using deterministic signals.\n *\n * Why this exists:\n * - raw logs show what happened, but they do not say where to look first\n * - eval reports and saved artifacts should agree on the likely failure category\n * - the rules stay deterministic so diagnosis does not depend on another model call\n *\n * Example diagnoses:\n * - final answer + deferred task + zero steps -> persistence\n * - explicit target resolved + broad fallback entered -> routing\n * - answer present but explicit file anchor missing -> answer-quality\n */\nimport { extractStepPayloadsFromRuntimeLog } from \"./runtimeLogReader.js\";\n\nexport type DiagnosisTaskRow = {\n status?: string | null;\n initial_query?: string | null;\n summary?: string | null;\n routing_decision_json?: string | null;\n};\n\nexport type DiagnosisTaskStepRow = {\n status?: string | null;\n file_path?: string | null;\n action?: string | null;\n};\n\nexport type RuntimeStateEntry = {\n phase: string;\n lane: string;\n status: string;\n rationale?: string;\n};\n\nexport type RouteTraceEvent = {\n label: string;\n details?: string;\n};\n\nexport type NextActionDecisionTrace = {\n action: string;\n reason?: string;\n confidence?: number;\n targetFile?: string;\n source?: string;\n};\n\nexport type RunLogInsights = {\n lane: \"explicit-target\" | \"resume-continuity\" | \"evidence\" | \"coding\" | \"direct-answer\" | \"unknown\";\n answerModule: \"continuityAnswerModule\" | \"finalAnswerModule\" | \"unknown\";\n runtimeStates: RuntimeStateEntry[];\n routeEvents: RouteTraceEvent[];\n nextActionDecisions: NextActionDecisionTrace[];\n resolvedExplicitTargets: number;\n enteredBroadFallback: boolean;\n readinessDecision: string | null;\n evidenceRelevantCount: number;\n};\n\nexport type RunDiagnosisCategory =\n | \"routing\"\n | \"evidence\"\n | \"execution\"\n | \"persistence\"\n | \"reporting\"\n | \"answer-quality\"\n | \"unknown\";\n\nexport type RunDiagnosis = {\n primaryCategory: RunDiagnosisCategory;\n confidence: number;\n symptoms: string[];\n why: string;\n likelyOwner: string;\n suggestedNextCheck: string;\n supportingFacts: {\n taskStatus: string | null;\n stepCount: number;\n completedStepCount: number;\n lane: RunLogInsights[\"lane\"];\n answerModule: RunLogInsights[\"answerModule\"];\n hasFinalAnswer: boolean;\n allowSearch: boolean;\n allowResearch: boolean;\n allowTransform: boolean;\n };\n};\n\nexport type DiagnoseRunInput = {\n task: DiagnosisTaskRow | null;\n steps: DiagnosisTaskStepRow[];\n routing: Record<string, unknown> | null;\n insights: RunLogInsights;\n query: string;\n finalAnswerText?: string;\n failures?: string[];\n passed?: boolean;\n};\n\ntype ExplicitTargetPayload = {\n resolvedTargetFiles?: unknown;\n enteredBroadFallback?: unknown;\n};\n\ntype ReadinessPayload = {\n readiness?: {\n decision?: unknown;\n };\n};\n\ntype EvidencePayload = Array<{\n isRelevant?: unknown;\n}> | unknown;\n\nexport function parseRoutingDecision(task: DiagnosisTaskRow | null): Record<string, unknown> | null {\n if (!task?.routing_decision_json) return null;\n try {\n return JSON.parse(task.routing_decision_json) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\n/**\n * Pulls one logged JSON block for a given step from the run log.\n * Example: `readinessGateStep` -> `{ readiness: { decision: \"ready\" } }`.\n */\nexport function extractStepPayloads(runLog: string, stepName: string): unknown[] {\n return extractStepPayloadsFromRuntimeLog(runLog, stepName);\n}\n\nfunction detectLane(\n runtimeStates: RuntimeStateEntry[],\n routing: Record<string, unknown> | null,\n resolvedExplicitTargets: number,\n continuityPayload: Record<string, unknown> | undefined,\n answerModule: RunLogInsights[\"answerModule\"]\n): RunLogInsights[\"lane\"] {\n const tracedLane = runtimeStates.map((entry) => entry.lane).find((lane) => lane && lane !== \"coding\");\n if (tracedLane === \"explicit-target\" || tracedLane === \"resume-continuity\") {\n return tracedLane;\n }\n if (answerModule === \"continuityAnswerModule\") return \"resume-continuity\";\n if (resolvedExplicitTargets > 0) return \"explicit-target\";\n if (typeof continuityPayload?.kind === \"string\" && String(continuityPayload.kind).startsWith(\"direct-\")) {\n return \"resume-continuity\";\n }\n const rationale = typeof routing?.rationale === \"string\" ? routing.rationale : \"\";\n if (rationale.includes(\"route=explicit-target\")) return \"explicit-target\";\n if (rationale.includes(\"route=resume-continuity\")) return \"resume-continuity\";\n if (Boolean(routing?.allowSearch) || Boolean(routing?.allowResearch)) return \"evidence\";\n if (Boolean(routing?.allowTransform)) return \"coding\";\n if (answerModule !== \"unknown\") return \"direct-answer\";\n return \"unknown\";\n}\n\nexport function parseRunLogInsightsFromText(\n runLog: string | undefined,\n routing: Record<string, unknown> | null\n): RunLogInsights {\n if (!runLog) {\n return {\n lane: \"unknown\",\n answerModule: \"unknown\",\n runtimeStates: [],\n routeEvents: [],\n nextActionDecisions: [],\n resolvedExplicitTargets: 0,\n enteredBroadFallback: false,\n readinessDecision: null,\n evidenceRelevantCount: 0,\n };\n }\n\n const runtimeStates = extractStepPayloads(runLog, \"runtimeState\")\n .filter((payload): payload is RuntimeStateEntry => {\n return typeof payload === \"object\" && payload !== null && \"phase\" in payload && \"lane\" in payload;\n });\n\n const resolvePayloads = extractStepPayloads(runLog, \"resolveExplicitTargetsStep\");\n const resolvePayload = resolvePayloads[resolvePayloads.length - 1] as ExplicitTargetPayload | undefined;\n const resumeIntentPayloads = extractStepPayloads(runLog, \"resumeContinuityStep\");\n const resumeIntentPayload =\n resumeIntentPayloads[resumeIntentPayloads.length - 1] as Record<string, unknown> | undefined;\n const continuityPayloads = extractStepPayloads(runLog, \"continuityRoutingAnalysisStep\");\n const continuityPayload =\n continuityPayloads[continuityPayloads.length - 1] as Record<string, unknown> | undefined;\n const readinessPayloads = extractStepPayloads(runLog, \"readinessGateStep\");\n const readinessPayload =\n readinessPayloads[readinessPayloads.length - 1] as ReadinessPayload | undefined;\n const evidencePayloads = extractStepPayloads(runLog, \"evidenceVerifier\");\n const evidencePayload =\n evidencePayloads[evidencePayloads.length - 1] as EvidencePayload | undefined;\n const nextActionPayloads = extractStepPayloads(runLog, \"decideNextAction\");\n const answerModule: RunLogInsights[\"answerModule\"] = runLog.includes(\"📂 OUTPUT | continuityAnswerModule\")\n ? \"continuityAnswerModule\"\n : runLog.includes(\"📂 OUTPUT | finalAnswerModule\")\n ? \"finalAnswerModule\"\n : \"unknown\";\n const nextActionDecisions = nextActionPayloads\n .map((payload) => {\n if (typeof payload !== \"object\" || payload === null || !(\"decision\" in payload)) return null;\n const decision = (payload as { decision?: Record<string, unknown> }).decision;\n if (!decision || typeof decision !== \"object\") return null;\n const trace: NextActionDecisionTrace = {\n action: typeof decision.action === \"string\" ? decision.action : \"unknown\",\n };\n if (typeof decision.reason === \"string\") trace.reason = decision.reason;\n if (typeof decision.confidence === \"number\") trace.confidence = decision.confidence;\n if (typeof decision.targetFile === \"string\") trace.targetFile = decision.targetFile;\n if (typeof decision.source === \"string\") trace.source = decision.source;\n return trace;\n })\n .filter((decision): decision is NextActionDecisionTrace => decision !== null);\n\n const resolvedExplicitTargets = Array.isArray(resolvePayload?.resolvedTargetFiles)\n ? resolvePayload.resolvedTargetFiles.length\n : 0;\n const enteredBroadFallback = Boolean(resolvePayload?.enteredBroadFallback);\n const evidenceRelevantCount = Array.isArray(evidencePayload)\n ? evidencePayload.filter((row) => row && row.isRelevant === true).length\n : 0;\n const readinessDecision =\n typeof readinessPayload?.readiness?.decision === \"string\"\n ? readinessPayload.readiness.decision\n : null;\n\n const routeEvents: RouteTraceEvent[] = [];\n if (resolvePayload) {\n routeEvents.push({\n label: \"explicit target resolution\",\n details: `resolved=${resolvedExplicitTargets}, broadFallback=${enteredBroadFallback}`,\n });\n }\n if (resumeIntentPayload) {\n routeEvents.push({\n label: \"resume continuity intent\",\n details: String(resumeIntentPayload.kind ?? \"unknown\"),\n });\n }\n if (continuityPayload) {\n routeEvents.push({\n label: \"continuity routing analysis\",\n details: `${String(continuityPayload.kind ?? \"unknown\")} (answerNow=${String(continuityPayload.answerNow ?? false)})`,\n });\n }\n routeEvents.push({\n label: \"answer module\",\n details: answerModule,\n });\n const latestNextAction = nextActionDecisions[nextActionDecisions.length - 1];\n if (latestNextAction) {\n routeEvents.push({\n label: \"next action decision\",\n details: `${latestNextAction.action}${latestNextAction.reason ? ` (${latestNextAction.reason})` : \"\"}`,\n });\n }\n\n return {\n lane: detectLane(runtimeStates, routing, resolvedExplicitTargets, continuityPayload, answerModule),\n answerModule,\n runtimeStates,\n routeEvents,\n nextActionDecisions,\n resolvedExplicitTargets,\n enteredBroadFallback,\n readinessDecision,\n evidenceRelevantCount,\n };\n}\n\nfunction collectAnswerAnchors(query: string): string[] {\n const anchors = new Set<string>();\n for (const match of query.matchAll(/\\b([A-Za-z0-9_./-]+\\.[A-Za-z0-9]+)\\b/g)) {\n const raw = match[1]?.trim();\n if (!raw) continue;\n const parts = raw.split(\"/\");\n anchors.add(parts[parts.length - 1].toLowerCase());\n }\n return Array.from(anchors);\n}\n\nfunction hasDirectAnswerPath(insights: RunLogInsights, stepCount: number): boolean {\n return insights.answerModule === \"continuityAnswerModule\" ||\n (insights.answerModule === \"finalAnswerModule\" && stepCount === 0);\n}\n\nfunction isStaleExactTargetEvalFailure(failure: string): boolean {\n return failure.includes(\"deterministicPreGroundingPrefilter\") || failure.includes(\"domain-anchors:\");\n}\n\nfunction createDiagnosis(\n category: RunDiagnosisCategory,\n confidence: number,\n symptoms: string[],\n why: string,\n likelyOwner: string,\n suggestedNextCheck: string,\n supportingFacts: RunDiagnosis[\"supportingFacts\"]\n): RunDiagnosis {\n return {\n primaryCategory: category,\n confidence,\n symptoms,\n why,\n likelyOwner,\n suggestedNextCheck,\n supportingFacts,\n };\n}\n\nexport function hasHighConfidenceIssue(diagnosis: RunDiagnosis): boolean {\n return diagnosis.primaryCategory !== \"unknown\" && diagnosis.confidence >= 0.85;\n}\n\nexport function diagnoseRun(input: DiagnoseRunInput): RunDiagnosis {\n const taskStatus = input.task?.status ?? null;\n const stepCount = input.steps.length;\n const completedStepCount = input.steps.filter((step) => step.status === \"completed\").length;\n const hasFinalAnswer =\n (input.finalAnswerText?.trim().length ?? 0) > 0 ||\n (typeof input.task?.summary === \"string\" && input.task.summary.trim().length > 0) ||\n input.insights.answerModule !== \"unknown\";\n const allowSearch = Boolean(input.routing?.allowSearch);\n const allowResearch = Boolean(input.routing?.allowResearch);\n const allowTransform = Boolean(input.routing?.allowTransform);\n const supportingFacts: RunDiagnosis[\"supportingFacts\"] = {\n taskStatus,\n stepCount,\n completedStepCount,\n lane: input.insights.lane,\n answerModule: input.insights.answerModule,\n hasFinalAnswer,\n allowSearch,\n allowResearch,\n allowTransform,\n };\n const answerAnchors = collectAnswerAnchors(input.query);\n const missingAnchors = answerAnchors.filter((anchor) => {\n return !input.finalAnswerText?.toLowerCase().includes(anchor);\n });\n\n if (input.passed === true && hasFinalAnswer && taskStatus === \"deferred\") {\n return createDiagnosis(\n \"reporting\",\n 0.99,\n [\"final answer present\", \"task status deferred\", \"run still marked as passed\"],\n \"The saved result looks healthy in the report or integration verdict, but persisted task state contradicts that outcome.\",\n \"Eval report and integration verdict logic\",\n \"Compare report pass conditions with task persistence invariants around finalize.\",\n supportingFacts\n );\n }\n\n if (hasFinalAnswer && taskStatus === \"deferred\") {\n return createDiagnosis(\n \"persistence\",\n 0.97,\n [\"final answer present\", \"task status deferred\", stepCount === 0 ? \"zero persisted steps\" : \"task did not complete\"],\n \"Finalize produced an answer, but persisted task state still reflects a blocked or deferred path.\",\n \"MainAgent persistence and completion semantics\",\n \"Inspect MainAgent readiness/finalize status handling and persistTaskData call sites.\",\n supportingFacts\n );\n }\n\n if (input.insights.resolvedExplicitTargets > 0 && input.insights.enteredBroadFallback) {\n return createDiagnosis(\n \"routing\",\n 0.93,\n [\"explicit target resolved\", \"broad fallback entered unexpectedly\"],\n \"Explicit target routing should stay narrow once a concrete file target resolves.\",\n \"Explicit target routing and scope shaping\",\n \"Inspect resolveExplicitTargetsStep and routingDecisionStep lane constraints.\",\n supportingFacts\n );\n }\n\n if (\n hasFinalAnswer &&\n input.insights.lane === \"explicit-target\" &&\n input.insights.resolvedExplicitTargets > 0 &&\n (input.failures?.length ?? 0) > 0 &&\n input.failures!.every(isStaleExactTargetEvalFailure)\n ) {\n return createDiagnosis(\n \"reporting\",\n 0.91,\n [\"exact target resolved\", \"final answer present\", \"only stale pre-refactor eval markers failed\"],\n \"The run shape matches the new exact-target contract, but the saved eval still expected older bootstrap-only retrieval markers.\",\n \"Eval assertions and report expectations\",\n \"Update exact-target eval checks to assert SearchOrchestrator and downstream focus derivation instead of old bootstrap tokens.\",\n supportingFacts\n );\n }\n\n if (!hasFinalAnswer && input.insights.readinessDecision !== \"ready\" && input.insights.evidenceRelevantCount === 0) {\n return createDiagnosis(\n \"evidence\",\n 0.87,\n [\"readiness not reached\", \"weak or missing evidence\"],\n \"The run did not gather enough relevant evidence to move safely into answering or execution.\",\n \"Search, verify, and readiness gating\",\n \"Inspect evidenceVerifier, preFileSearchCheckStep, and readinessGateStep outputs.\",\n supportingFacts\n );\n }\n\n if (allowTransform && !hasDirectAnswerPath(input.insights, stepCount) && completedStepCount === 0) {\n return createDiagnosis(\n \"execution\",\n 0.9,\n [\"transform or execution route allowed\", \"no completed execution steps\"],\n \"The run looked like it should perform executable work, but no execution step completed and no direct-answer path explains the stop.\",\n \"Work loop and step execution\",\n \"Inspect runPlan, runWorkLoop, and step status transitions for stalled execution.\",\n supportingFacts\n );\n }\n\n if (hasFinalAnswer && missingAnchors.length > 0) {\n return createDiagnosis(\n \"answer-quality\",\n 0.86,\n [`answer missing explicit anchors: ${missingAnchors.join(\", \")}`],\n \"The answer did not ground itself on an explicit file or symbol named in the query.\",\n \"Final answer grounding and answer checks\",\n \"Inspect finalAnswerModule grounding inputs and answer-level eval assertions.\",\n supportingFacts\n );\n }\n\n return createDiagnosis(\n \"unknown\",\n 0.2,\n input.failures && input.failures.length > 0 ? input.failures : [\"no deterministic contradiction detected\"],\n \"No high-confidence subsystem diagnosis was detected from the current task, steps, and run-log signals.\",\n \"Review run log and task snapshot manually\",\n \"Start with route timeline, then compare persisted task status and answer path.\",\n supportingFacts\n );\n}\n"]}