@gracker/smartperfetto 1.0.14 → 1.0.16

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 (307) hide show
  1. package/.env.example +16 -8
  2. package/dist/agent/agents/base/baseAgent.d.ts.map +1 -1
  3. package/dist/agent/agents/base/baseAgent.js +5 -1
  4. package/dist/agent/agents/base/baseAgent.js.map +1 -1
  5. package/dist/agent/context/enhancedSessionContext.d.ts +5 -0
  6. package/dist/agent/context/enhancedSessionContext.d.ts.map +1 -1
  7. package/dist/agent/context/enhancedSessionContext.js +13 -0
  8. package/dist/agent/context/enhancedSessionContext.js.map +1 -1
  9. package/dist/agent/core/conclusionContract.d.ts +16 -1
  10. package/dist/agent/core/conclusionContract.d.ts.map +1 -1
  11. package/dist/agent/core/conclusionGenerator.d.ts.map +1 -1
  12. package/dist/agent/core/conclusionGenerator.js +90 -7
  13. package/dist/agent/core/conclusionGenerator.js.map +1 -1
  14. package/dist/agent/core/executors/directSkillExecutor.d.ts.map +1 -1
  15. package/dist/agent/core/executors/directSkillExecutor.js +6 -12
  16. package/dist/agent/core/executors/directSkillExecutor.js.map +1 -1
  17. package/dist/agent/core/orchestratorTypes.d.ts +16 -0
  18. package/dist/agent/core/orchestratorTypes.d.ts.map +1 -1
  19. package/dist/agent/core/orchestratorTypes.js.map +1 -1
  20. package/dist/agent/experts/crossDomain/moduleExpertInvoker.d.ts.map +1 -1
  21. package/dist/agent/experts/crossDomain/moduleExpertInvoker.js +4 -1
  22. package/dist/agent/experts/crossDomain/moduleExpertInvoker.js.map +1 -1
  23. package/dist/agent/scene/sceneStage1Runner.d.ts +1 -1
  24. package/dist/agent/scene/sceneStage1Runner.d.ts.map +1 -1
  25. package/dist/agent/scene/sceneStage1Runner.js +1 -1
  26. package/dist/agent/scene/sceneStage1Runner.js.map +1 -1
  27. package/dist/agent/scene/sceneStoryService.d.ts +1 -1
  28. package/dist/agent/scene/sceneStoryService.d.ts.map +1 -1
  29. package/dist/agent/scene/sceneStoryService.js +4 -1
  30. package/dist/agent/scene/sceneStoryService.js.map +1 -1
  31. package/dist/agent/types/agentProtocol.d.ts.map +1 -1
  32. package/dist/agent/types/agentProtocol.js +4 -1
  33. package/dist/agent/types/agentProtocol.js.map +1 -1
  34. package/dist/agent/types.d.ts +7 -0
  35. package/dist/agent/types.d.ts.map +1 -1
  36. package/dist/agent/types.js.map +1 -1
  37. package/dist/agentOpenAI/openAiRuntime.d.ts.map +1 -1
  38. package/dist/agentOpenAI/openAiRuntime.js +11 -1
  39. package/dist/agentOpenAI/openAiRuntime.js.map +1 -1
  40. package/dist/agentOpenAI/openAiToolAdapter.d.ts.map +1 -1
  41. package/dist/agentOpenAI/openAiToolAdapter.js +27 -2
  42. package/dist/agentOpenAI/openAiToolAdapter.js.map +1 -1
  43. package/dist/agentv3/artifactStore.d.ts +5 -0
  44. package/dist/agentv3/artifactStore.d.ts.map +1 -1
  45. package/dist/agentv3/artifactStore.js +3 -0
  46. package/dist/agentv3/artifactStore.js.map +1 -1
  47. package/dist/agentv3/claudeMcpServer.d.ts +15 -1
  48. package/dist/agentv3/claudeMcpServer.d.ts.map +1 -1
  49. package/dist/agentv3/claudeMcpServer.js +436 -91
  50. package/dist/agentv3/claudeMcpServer.js.map +1 -1
  51. package/dist/agentv3/claudeRuntime.d.ts.map +1 -1
  52. package/dist/agentv3/claudeRuntime.js +17 -0
  53. package/dist/agentv3/claudeRuntime.js.map +1 -1
  54. package/dist/agentv3/claudeSystemPrompt.d.ts.map +1 -1
  55. package/dist/agentv3/claudeSystemPrompt.js +9 -0
  56. package/dist/agentv3/claudeSystemPrompt.js.map +1 -1
  57. package/dist/agentv3/mcpToolRegistry.d.ts +14 -2
  58. package/dist/agentv3/mcpToolRegistry.d.ts.map +1 -1
  59. package/dist/agentv3/mcpToolRegistry.js +25 -6
  60. package/dist/agentv3/mcpToolRegistry.js.map +1 -1
  61. package/dist/agentv3/sessionStateSnapshot.d.ts +41 -0
  62. package/dist/agentv3/sessionStateSnapshot.d.ts.map +1 -1
  63. package/dist/agentv3/types.d.ts +5 -0
  64. package/dist/agentv3/types.d.ts.map +1 -1
  65. package/dist/agentv3/types.js.map +1 -1
  66. package/dist/assistant/application/agentAnalyzeSessionService.d.ts +6 -0
  67. package/dist/assistant/application/agentAnalyzeSessionService.d.ts.map +1 -1
  68. package/dist/assistant/application/agentAnalyzeSessionService.js +9 -3
  69. package/dist/assistant/application/agentAnalyzeSessionService.js.map +1 -1
  70. package/dist/assistant/application/assistantApplicationService.d.ts.map +1 -1
  71. package/dist/assistant/application/assistantApplicationService.js +3 -1
  72. package/dist/assistant/application/assistantApplicationService.js.map +1 -1
  73. package/dist/cli-user/bin.js +99 -1
  74. package/dist/cli-user/bin.js.map +1 -1
  75. package/dist/cli-user/commands/analyze.d.ts +3 -0
  76. package/dist/cli-user/commands/analyze.d.ts.map +1 -1
  77. package/dist/cli-user/commands/analyze.js +2 -0
  78. package/dist/cli-user/commands/analyze.js.map +1 -1
  79. package/dist/cli-user/commands/codebase.d.ts +29 -0
  80. package/dist/cli-user/commands/codebase.d.ts.map +1 -0
  81. package/dist/cli-user/commands/codebase.js +152 -0
  82. package/dist/cli-user/commands/codebase.js.map +1 -0
  83. package/dist/cli-user/commands/config.d.ts.map +1 -1
  84. package/dist/cli-user/commands/config.js +4 -1
  85. package/dist/cli-user/commands/config.js.map +1 -1
  86. package/dist/cli-user/commands/report.js +64 -0
  87. package/dist/cli-user/commands/report.js.map +1 -1
  88. package/dist/cli-user/io/paths.d.ts +3 -0
  89. package/dist/cli-user/io/paths.d.ts.map +1 -1
  90. package/dist/cli-user/io/paths.js +6 -0
  91. package/dist/cli-user/io/paths.js.map +1 -1
  92. package/dist/cli-user/io/sessionStore.d.ts +1 -0
  93. package/dist/cli-user/io/sessionStore.d.ts.map +1 -1
  94. package/dist/cli-user/io/sessionStore.js +5 -0
  95. package/dist/cli-user/io/sessionStore.js.map +1 -1
  96. package/dist/cli-user/repl/renderer.d.ts +8 -0
  97. package/dist/cli-user/repl/renderer.d.ts.map +1 -1
  98. package/dist/cli-user/repl/renderer.js.map +1 -1
  99. package/dist/cli-user/services/cliAnalyzeService.d.ts +6 -0
  100. package/dist/cli-user/services/cliAnalyzeService.d.ts.map +1 -1
  101. package/dist/cli-user/services/cliAnalyzeService.js +183 -29
  102. package/dist/cli-user/services/cliAnalyzeService.js.map +1 -1
  103. package/dist/cli-user/services/turnPersistence.d.ts +0 -10
  104. package/dist/cli-user/services/turnPersistence.d.ts.map +1 -1
  105. package/dist/cli-user/services/turnPersistence.js +62 -0
  106. package/dist/cli-user/services/turnPersistence.js.map +1 -1
  107. package/dist/cli-user/services/turnRunner.d.ts +3 -0
  108. package/dist/cli-user/services/turnRunner.d.ts.map +1 -1
  109. package/dist/cli-user/services/turnRunner.js +6 -0
  110. package/dist/cli-user/services/turnRunner.js.map +1 -1
  111. package/dist/cli-user/types.d.ts +5 -0
  112. package/dist/cli-user/types.d.ts.map +1 -1
  113. package/dist/routes/agentReportRoutes.d.ts +1 -0
  114. package/dist/routes/agentReportRoutes.d.ts.map +1 -1
  115. package/dist/routes/agentReportRoutes.js +13 -2
  116. package/dist/routes/agentReportRoutes.js.map +1 -1
  117. package/dist/routes/agentResumeRoutes.d.ts.map +1 -1
  118. package/dist/routes/agentResumeRoutes.js +29 -5
  119. package/dist/routes/agentResumeRoutes.js.map +1 -1
  120. package/dist/routes/agentRoutes.d.ts.map +1 -1
  121. package/dist/routes/agentRoutes.js +297 -91
  122. package/dist/routes/agentRoutes.js.map +1 -1
  123. package/dist/routes/ragAdminRoutes.d.ts +13 -24
  124. package/dist/routes/ragAdminRoutes.d.ts.map +1 -1
  125. package/dist/routes/ragAdminRoutes.js +266 -11
  126. package/dist/routes/ragAdminRoutes.js.map +1 -1
  127. package/dist/scripts/verifyAgentSseScrolling.js +119 -3
  128. package/dist/scripts/verifyAgentSseScrolling.js.map +1 -1
  129. package/dist/services/agentEventStore.d.ts.map +1 -1
  130. package/dist/services/agentEventStore.js +13 -3
  131. package/dist/services/agentEventStore.js.map +1 -1
  132. package/dist/services/agentReportData.d.ts +3 -0
  133. package/dist/services/agentReportData.d.ts.map +1 -1
  134. package/dist/services/agentReportData.js.map +1 -1
  135. package/dist/services/analysisResultSnapshotPipeline.d.ts +3 -0
  136. package/dist/services/analysisResultSnapshotPipeline.d.ts.map +1 -1
  137. package/dist/services/analysisResultSnapshotPipeline.js +3 -0
  138. package/dist/services/analysisResultSnapshotPipeline.js.map +1 -1
  139. package/dist/services/analysisResultSnapshotStore.d.ts.map +1 -1
  140. package/dist/services/analysisResultSnapshotStore.js +34 -2
  141. package/dist/services/analysisResultSnapshotStore.js.map +1 -1
  142. package/dist/services/aospKnowledgeIngester.d.ts +7 -0
  143. package/dist/services/aospKnowledgeIngester.d.ts.map +1 -1
  144. package/dist/services/aospKnowledgeIngester.js +19 -7
  145. package/dist/services/aospKnowledgeIngester.js.map +1 -1
  146. package/dist/services/auth/codebaseScopes.d.ts +6 -0
  147. package/dist/services/auth/codebaseScopes.d.ts.map +1 -0
  148. package/dist/services/auth/codebaseScopes.js +23 -0
  149. package/dist/services/auth/codebaseScopes.js.map +1 -0
  150. package/dist/services/codebase/codeAwareFeature.d.ts +4 -0
  151. package/dist/services/codebase/codeAwareFeature.d.ts.map +1 -0
  152. package/dist/services/codebase/codeAwareFeature.js +18 -0
  153. package/dist/services/codebase/codeAwareFeature.js.map +1 -0
  154. package/dist/services/codebase/codeLookupLedger.d.ts +37 -0
  155. package/dist/services/codebase/codeLookupLedger.d.ts.map +1 -0
  156. package/dist/services/codebase/codeLookupLedger.js +126 -0
  157. package/dist/services/codebase/codeLookupLedger.js.map +1 -0
  158. package/dist/services/codebase/codebaseRegistry.d.ts +76 -0
  159. package/dist/services/codebase/codebaseRegistry.d.ts.map +1 -0
  160. package/dist/services/codebase/codebaseRegistry.js +164 -0
  161. package/dist/services/codebase/codebaseRegistry.js.map +1 -0
  162. package/dist/services/codebase/defaultCodebaseServices.d.ts +5 -0
  163. package/dist/services/codebase/defaultCodebaseServices.d.ts.map +1 -0
  164. package/dist/services/codebase/defaultCodebaseServices.js +21 -0
  165. package/dist/services/codebase/defaultCodebaseServices.js.map +1 -0
  166. package/dist/services/codebase/patchProposer.d.ts +44 -0
  167. package/dist/services/codebase/patchProposer.d.ts.map +1 -0
  168. package/dist/services/codebase/patchProposer.js +163 -0
  169. package/dist/services/codebase/patchProposer.js.map +1 -0
  170. package/dist/services/codebase/pathSecurityGate.d.ts +33 -0
  171. package/dist/services/codebase/pathSecurityGate.d.ts.map +1 -0
  172. package/dist/services/codebase/pathSecurityGate.js +214 -0
  173. package/dist/services/codebase/pathSecurityGate.js.map +1 -0
  174. package/dist/services/enterpriseSchema.d.ts.map +1 -1
  175. package/dist/services/enterpriseSchema.js +11 -0
  176. package/dist/services/enterpriseSchema.js.map +1 -1
  177. package/dist/services/evidence/evidenceContractBuilder.d.ts +11 -0
  178. package/dist/services/evidence/evidenceContractBuilder.d.ts.map +1 -0
  179. package/dist/services/evidence/evidenceContractBuilder.js +530 -0
  180. package/dist/services/evidence/evidenceContractBuilder.js.map +1 -0
  181. package/dist/services/htmlReportGenerator.d.ts +9 -0
  182. package/dist/services/htmlReportGenerator.d.ts.map +1 -1
  183. package/dist/services/htmlReportGenerator.js +133 -0
  184. package/dist/services/htmlReportGenerator.js.map +1 -1
  185. package/dist/services/persistAgentSession.d.ts.map +1 -1
  186. package/dist/services/persistAgentSession.js +24 -0
  187. package/dist/services/persistAgentSession.js.map +1 -1
  188. package/dist/services/processIdentity/identityContractMapper.d.ts +14 -0
  189. package/dist/services/processIdentity/identityContractMapper.d.ts.map +1 -0
  190. package/dist/services/processIdentity/identityContractMapper.js +135 -0
  191. package/dist/services/processIdentity/identityContractMapper.js.map +1 -0
  192. package/dist/services/processIdentity/types.d.ts +5 -0
  193. package/dist/services/processIdentity/types.d.ts.map +1 -1
  194. package/dist/services/processIdentity/types.js.map +1 -1
  195. package/dist/services/rag/aospSourceIngester.d.ts +26 -0
  196. package/dist/services/rag/aospSourceIngester.d.ts.map +1 -0
  197. package/dist/services/rag/aospSourceIngester.js +143 -0
  198. package/dist/services/rag/aospSourceIngester.js.map +1 -0
  199. package/dist/services/rag/appSourceIngester.d.ts +37 -0
  200. package/dist/services/rag/appSourceIngester.d.ts.map +1 -0
  201. package/dist/services/rag/appSourceIngester.js +165 -0
  202. package/dist/services/rag/appSourceIngester.js.map +1 -0
  203. package/dist/services/rag/baseIngester.d.ts +18 -0
  204. package/dist/services/rag/baseIngester.d.ts.map +1 -0
  205. package/dist/services/rag/baseIngester.js +197 -0
  206. package/dist/services/rag/baseIngester.js.map +1 -0
  207. package/dist/services/rag/kernelSourceIngester.d.ts +35 -0
  208. package/dist/services/rag/kernelSourceIngester.d.ts.map +1 -0
  209. package/dist/services/rag/kernelSourceIngester.js +170 -0
  210. package/dist/services/rag/kernelSourceIngester.js.map +1 -0
  211. package/dist/services/rag/lookupResponseFilter.d.ts +42 -0
  212. package/dist/services/rag/lookupResponseFilter.d.ts.map +1 -0
  213. package/dist/services/rag/lookupResponseFilter.js +192 -0
  214. package/dist/services/rag/lookupResponseFilter.js.map +1 -0
  215. package/dist/services/rag/sessionToolResultRegistry.d.ts +25 -0
  216. package/dist/services/rag/sessionToolResultRegistry.d.ts.map +1 -0
  217. package/dist/services/rag/sessionToolResultRegistry.js +57 -0
  218. package/dist/services/rag/sessionToolResultRegistry.js.map +1 -0
  219. package/dist/services/rag/toolResultProjectionFilter.d.ts +18 -0
  220. package/dist/services/rag/toolResultProjectionFilter.d.ts.map +1 -0
  221. package/dist/services/rag/toolResultProjectionFilter.js +33 -0
  222. package/dist/services/rag/toolResultProjectionFilter.js.map +1 -0
  223. package/dist/services/ragStore.d.ts +8 -0
  224. package/dist/services/ragStore.d.ts.map +1 -1
  225. package/dist/services/ragStore.js +77 -8
  226. package/dist/services/ragStore.js.map +1 -1
  227. package/dist/services/rbac.d.ts +1 -1
  228. package/dist/services/rbac.d.ts.map +1 -1
  229. package/dist/services/rbac.js +6 -0
  230. package/dist/services/rbac.js.map +1 -1
  231. package/dist/services/security/codeAwareOutputRegistry.d.ts +6 -0
  232. package/dist/services/security/codeAwareOutputRegistry.d.ts.map +1 -0
  233. package/dist/services/security/codeAwareOutputRegistry.js +55 -0
  234. package/dist/services/security/codeAwareOutputRegistry.js.map +1 -0
  235. package/dist/services/security/llmEchoOutputFilter.d.ts +49 -0
  236. package/dist/services/security/llmEchoOutputFilter.d.ts.map +1 -0
  237. package/dist/services/security/llmEchoOutputFilter.js +133 -0
  238. package/dist/services/security/llmEchoOutputFilter.js.map +1 -0
  239. package/dist/services/security/secretPatterns.d.ts +6 -0
  240. package/dist/services/security/secretPatterns.d.ts.map +1 -0
  241. package/dist/services/security/secretPatterns.js +23 -0
  242. package/dist/services/security/secretPatterns.js.map +1 -0
  243. package/dist/services/skillEngine/skillExecutor.d.ts +14 -2
  244. package/dist/services/skillEngine/skillExecutor.d.ts.map +1 -1
  245. package/dist/services/skillEngine/skillExecutor.js +133 -13
  246. package/dist/services/skillEngine/skillExecutor.js.map +1 -1
  247. package/dist/services/skillEngine/types.d.ts +2 -0
  248. package/dist/services/skillEngine/types.d.ts.map +1 -1
  249. package/dist/services/symbol/breakpadSymParser.d.ts +19 -0
  250. package/dist/services/symbol/breakpadSymParser.d.ts.map +1 -0
  251. package/dist/services/symbol/breakpadSymParser.js +40 -0
  252. package/dist/services/symbol/breakpadSymParser.js.map +1 -0
  253. package/dist/services/symbol/kallsymsParser.d.ts +12 -0
  254. package/dist/services/symbol/kallsymsParser.d.ts.map +1 -0
  255. package/dist/services/symbol/kallsymsParser.js +41 -0
  256. package/dist/services/symbol/kallsymsParser.js.map +1 -0
  257. package/dist/services/symbol/r8MappingParser.d.ts +40 -0
  258. package/dist/services/symbol/r8MappingParser.d.ts.map +1 -0
  259. package/dist/services/symbol/r8MappingParser.js +99 -0
  260. package/dist/services/symbol/r8MappingParser.js.map +1 -0
  261. package/dist/services/symbol/symbolResolver.d.ts +59 -0
  262. package/dist/services/symbol/symbolResolver.d.ts.map +1 -0
  263. package/dist/services/symbol/symbolResolver.js +147 -0
  264. package/dist/services/symbol/symbolResolver.js.map +1 -0
  265. package/dist/services/symbol/traceSymbolContext.d.ts +14 -0
  266. package/dist/services/symbol/traceSymbolContext.d.ts.map +1 -0
  267. package/dist/services/symbol/traceSymbolContext.js +45 -0
  268. package/dist/services/symbol/traceSymbolContext.js.map +1 -0
  269. package/dist/services/verifier/claimVerificationRunner.d.ts +20 -0
  270. package/dist/services/verifier/claimVerificationRunner.d.ts.map +1 -0
  271. package/dist/services/verifier/claimVerificationRunner.js +88 -0
  272. package/dist/services/verifier/claimVerificationRunner.js.map +1 -0
  273. package/dist/services/verifier/deterministicClaimVerifier.d.ts +8 -0
  274. package/dist/services/verifier/deterministicClaimVerifier.d.ts.map +1 -0
  275. package/dist/services/verifier/deterministicClaimVerifier.js +178 -0
  276. package/dist/services/verifier/deterministicClaimVerifier.js.map +1 -0
  277. package/dist/types/claimVerification.d.ts +38 -0
  278. package/dist/types/claimVerification.d.ts.map +1 -0
  279. package/dist/types/claimVerification.js +6 -0
  280. package/dist/types/claimVerification.js.map +1 -0
  281. package/dist/types/dataContract.d.ts +30 -0
  282. package/dist/types/dataContract.d.ts.map +1 -1
  283. package/dist/types/dataContract.js +7 -0
  284. package/dist/types/dataContract.js.map +1 -1
  285. package/dist/types/evidenceContract.d.ts +100 -0
  286. package/dist/types/evidenceContract.d.ts.map +1 -0
  287. package/dist/types/evidenceContract.js +6 -0
  288. package/dist/types/evidenceContract.js.map +1 -0
  289. package/dist/types/identityContract.d.ts +57 -0
  290. package/dist/types/identityContract.d.ts.map +1 -0
  291. package/dist/types/identityContract.js +6 -0
  292. package/dist/types/identityContract.js.map +1 -0
  293. package/dist/types/multiTraceComparison.d.ts +3 -0
  294. package/dist/types/multiTraceComparison.d.ts.map +1 -1
  295. package/dist/types/sparkContracts.d.ts +31 -3
  296. package/dist/types/sparkContracts.d.ts.map +1 -1
  297. package/dist/types/sparkContracts.js.map +1 -1
  298. package/package.json +8 -1
  299. package/skills/atomic/process_identity_resolver.skill.yaml +130 -1
  300. package/skills/atomic/process_slice_cpu_hotspots.skill.yaml +321 -0
  301. package/skills/composite/code_pinpoint.skill.yaml +111 -0
  302. package/strategies/anr.strategy.md +2 -2
  303. package/strategies/code-aware.template.md +37 -0
  304. package/strategies/game.strategy.md +1 -1
  305. package/strategies/general.strategy.md +1 -1
  306. package/strategies/prompt-methodology.template.md +2 -0
  307. package/strategies/scrolling.strategy.md +1 -0
@@ -37,6 +37,7 @@ var __importStar = (this && this.__importStar) || (function () {
37
37
  })();
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.MIN_PHASE_SUMMARY_CHARS = exports.MCP_NAME_PREFIX = void 0;
40
+ exports.normalizeOptionalToolString = normalizeOptionalToolString;
40
41
  exports.loadLearnedSqlFixPairs = loadLearnedSqlFixPairs;
41
42
  exports.createClaudeMcpServer = createClaudeMcpServer;
42
43
  const claude_agent_sdk_1 = require("@anthropic-ai/claude-agent-sdk");
@@ -73,6 +74,12 @@ const caseLibrary_1 = require("../services/caseLibrary");
73
74
  const scopedKnowledgeStore_1 = require("../services/scopedKnowledgeStore");
74
75
  const mcpToolRegistry_1 = require("./mcpToolRegistry");
75
76
  const runtimePaths_1 = require("../runtimePaths");
77
+ const defaultCodebaseServices_1 = require("../services/codebase/defaultCodebaseServices");
78
+ const codeLookupLedger_1 = require("../services/codebase/codeLookupLedger");
79
+ const patchProposer_1 = require("../services/codebase/patchProposer");
80
+ const codeAwareFeature_1 = require("../services/codebase/codeAwareFeature");
81
+ const lookupResponseFilter_1 = require("../services/rag/lookupResponseFilter");
82
+ const symbolResolver_1 = require("../services/symbol/symbolResolver");
76
83
  /**
77
84
  * Process-wide RagStore singleton, lazily initialized on first MCP tool
78
85
  * call. Backs the `lookup_blog_knowledge` tool (Plan 55) and will back
@@ -207,6 +214,18 @@ function parseOptionalToolArrayInput(value) {
207
214
  }
208
215
  return parseToolArrayInput(value);
209
216
  }
217
+ function normalizeOptionalToolString(value) {
218
+ if (typeof value !== 'string')
219
+ return undefined;
220
+ const trimmed = value.trim();
221
+ if (!trimmed)
222
+ return undefined;
223
+ const normalized = trimmed.toLowerCase();
224
+ if (normalized === 'null' || normalized === 'undefined' || normalized === 'none') {
225
+ return undefined;
226
+ }
227
+ return trimmed;
228
+ }
210
229
  function parseToolStringArrayInput(value) {
211
230
  if (Array.isArray(value)) {
212
231
  return value.filter((entry) => typeof entry === 'string' && entry.trim().length > 0);
@@ -618,6 +637,14 @@ function createClaudeMcpServer(options) {
618
637
  const skillNotesBudget = options.skillNotesBudget;
619
638
  const outputLanguage = options.outputLanguage ?? outputLanguage_1.DEFAULT_OUTPUT_LANGUAGE;
620
639
  const knowledgeScope = options.knowledgeScope;
640
+ const codeAwareMode = (0, codeAwareFeature_1.normalizeCodeAwareMode)(options.codeAwareMode);
641
+ const codebaseIds = Array.from(new Set(options.codebaseIds ?? [])).filter(Boolean);
642
+ const codebaseRegistry = options.codebaseRegistry ?? (0, defaultCodebaseServices_1.getDefaultCodebaseRegistry)();
643
+ const codeLookupLedger = options.codeLookupLedger ?? (options.sessionId ? codeLookupLedger_1.CodeLookupLedger.restore(options.sessionId, 12000, 2) : undefined);
644
+ const toolRequestScope = {
645
+ sessionId: options.sessionId ?? traceId,
646
+ hasCodebaseAccess: codeAwareMode !== 'off' && codebaseIds.length > 0,
647
+ };
621
648
  /** Normalize skill params: ensure process_name ↔ package are both set. */
622
649
  function normalizeSkillParams(params, defaultPackage) {
623
650
  const p = { ...params };
@@ -1410,7 +1437,7 @@ function createClaudeMcpServer(options) {
1410
1437
  if (summary && success && rows.length > 0) {
1411
1438
  const summaryResult = (0, sqlSummarizer_1.summarizeSqlResult)(result.columns, result.rows);
1412
1439
  if (emitUpdate) {
1413
- emittedEvidence = emitSqlSummaryDataEnvelope(emitUpdate, summaryResult, finalSql, injected, traceProvenance, producer);
1440
+ emittedEvidence = emitSqlSummaryDataEnvelope(emitUpdate, summaryResult, finalSql, injected, traceProvenance, producer, processIdentityWarning);
1414
1441
  }
1415
1442
  return {
1416
1443
  content: [{
@@ -1439,10 +1466,10 @@ function createClaudeMcpServer(options) {
1439
1466
  };
1440
1467
  }
1441
1468
  if (emitUpdate && success && result.columns.length > 0) {
1442
- emittedEvidence = emitSqlDataEnvelope(emitUpdate, result.columns, rows, finalSql, injected, traceProvenance, producer);
1469
+ emittedEvidence = emitSqlDataEnvelope(emitUpdate, result.columns, rows, finalSql, injected, traceProvenance, producer, processIdentityWarning);
1443
1470
  }
1444
1471
  else if (emitUpdate && !success) {
1445
- emittedEvidence = emitSqlDiagnosticDataEnvelope(emitUpdate, result.error || (0, outputLanguage_1.localize)(outputLanguage, 'SQL 执行失败', 'SQL execution failed'), finalSql, injected, traceProvenance, producer, outputLanguage);
1472
+ emittedEvidence = emitSqlDiagnosticDataEnvelope(emitUpdate, result.error || (0, outputLanguage_1.localize)(outputLanguage, 'SQL 执行失败', 'SQL execution failed'), finalSql, injected, traceProvenance, producer, processIdentityWarning, outputLanguage);
1446
1473
  }
1447
1474
  return {
1448
1475
  content: [{
@@ -1476,7 +1503,7 @@ function createClaudeMcpServer(options) {
1476
1503
  traceId,
1477
1504
  traceSide: 'current',
1478
1505
  });
1479
- const emittedEvidence = emitUpdate ? emitSqlDiagnosticDataEnvelope(emitUpdate, errMsg, sql, undefined, traceProvenance, producer, outputLanguage) : undefined;
1506
+ const emittedEvidence = emitUpdate ? emitSqlDiagnosticDataEnvelope(emitUpdate, errMsg, sql, undefined, traceProvenance, producer, undefined, outputLanguage) : undefined;
1480
1507
  emitUpdate?.({
1481
1508
  type: 'progress',
1482
1509
  content: {
@@ -1588,6 +1615,10 @@ function createClaudeMcpServer(options) {
1588
1615
  try {
1589
1616
  const effectiveParams = normalizeSkillParams(params, packageName);
1590
1617
  const producer = createEvidenceProducerContext('invoke_skill', { skillId, params: effectiveParams }, (0, outputLanguage_1.localize)(outputLanguage, `调用 Skill ${skillId},收集本阶段结构化证据。`, `Run Skill ${skillId} to collect structured evidence for this phase.`));
1618
+ const skillTraceProvenance = (0, traceProcessorConnectionModel_1.buildTraceProcessorQueryProvenance)({
1619
+ traceId,
1620
+ traceSide: 'current',
1621
+ });
1591
1622
  emitUpdate?.({
1592
1623
  type: 'progress',
1593
1624
  content: {
@@ -1622,8 +1653,82 @@ function createClaudeMcpServer(options) {
1622
1653
  // Persist to disk (fire-and-forget) for cross-session learning
1623
1654
  logSqlErrorFixPair(errorPair, knowledgeScope).catch(() => { });
1624
1655
  }
1656
+ // Artifact mode stores displayResults before emitting DataEnvelopes so
1657
+ // evidence meta can carry the same artifact ids that the model sees.
1658
+ let artifacts;
1659
+ let diagnosticsArtifactId;
1660
+ let synthesizeArtifacts;
1661
+ const artifactIdsByStepId = new Map();
1662
+ if (artifactStore && result.displayResults?.length) {
1663
+ artifacts = result.displayResults.map(dr => {
1664
+ const artId = artifactStore.store({
1665
+ skillId: result.skillId || skillId,
1666
+ stepId: dr.stepId,
1667
+ layer: dr.layer,
1668
+ title: dr.title,
1669
+ data: dr.data,
1670
+ diagnostics: undefined,
1671
+ planPhaseId: producer.planPhaseId,
1672
+ planPhaseTitle: producer.planPhaseTitle,
1673
+ planPhaseGoal: producer.planPhaseGoal,
1674
+ sourceToolCallId: producer.sourceToolCallId,
1675
+ paramsHash: producer.paramsHash,
1676
+ identityResolution: result.identityResolution,
1677
+ });
1678
+ if (dr.stepId)
1679
+ artifactIdsByStepId.set(dr.stepId, artId);
1680
+ const summary = artifactStore.generateCompactSummary(artId);
1681
+ return summary;
1682
+ }).filter((summary) => Boolean(summary));
1683
+ }
1684
+ // Store diagnostics as a separate artifact if present, even for
1685
+ // diagnostics-only skill results that do not emit displayResults.
1686
+ if (artifactStore && result.diagnostics && Array.isArray(result.diagnostics) && result.diagnostics.length > 0) {
1687
+ diagnosticsArtifactId = artifactStore.store({
1688
+ skillId: result.skillId || skillId,
1689
+ stepId: '_diagnostics',
1690
+ layer: 'diagnosis',
1691
+ title: `${skillId} diagnostics`,
1692
+ data: { columns: ['diagnostic'], rows: result.diagnostics.map((d) => [d]) },
1693
+ diagnostics: result.diagnostics,
1694
+ planPhaseId: producer.planPhaseId,
1695
+ planPhaseTitle: producer.planPhaseTitle,
1696
+ planPhaseGoal: producer.planPhaseGoal,
1697
+ sourceToolCallId: producer.sourceToolCallId,
1698
+ paramsHash: producer.paramsHash,
1699
+ identityResolution: result.identityResolution,
1700
+ });
1701
+ }
1702
+ // Store synthesizeData entries as artifacts too — these contain the
1703
+ // raw step data that would otherwise overflow token limits.
1704
+ if (artifactStore && result.synthesizeData && Array.isArray(result.synthesizeData) && result.synthesizeData.length > 0) {
1705
+ synthesizeArtifacts = result.synthesizeData
1706
+ .filter((sd) => sd.data && sd.success !== false)
1707
+ .map((sd) => {
1708
+ const normalizedData = normalizeSynthesizeDataForStorage(sd.data);
1709
+ const artId = artifactStore.store({
1710
+ skillId: result.skillId || skillId,
1711
+ stepId: sd.stepId,
1712
+ layer: sd.layer || 'synthesize',
1713
+ title: sd.stepName || sd.stepId,
1714
+ data: normalizedData,
1715
+ planPhaseId: producer.planPhaseId,
1716
+ planPhaseTitle: producer.planPhaseTitle,
1717
+ planPhaseGoal: producer.planPhaseGoal,
1718
+ sourceToolCallId: producer.sourceToolCallId,
1719
+ paramsHash: producer.paramsHash,
1720
+ identityResolution: result.identityResolution,
1721
+ });
1722
+ return {
1723
+ artifactId: artId,
1724
+ stepId: sd.stepId,
1725
+ rowCount: normalizedData.rows?.length ?? 0,
1726
+ columns: normalizedData.columns ?? [],
1727
+ };
1728
+ });
1729
+ }
1625
1730
  if (emitUpdate && result.displayResults?.length) {
1626
- emitSkillDataEnvelopes(result.displayResults, result.skillId || skillId, emitUpdate, undefined, producer);
1731
+ emitSkillDataEnvelopes(result.displayResults, result.skillId || skillId, emitUpdate, skillTraceProvenance, producer, result.identityResolution, artifactIdsByStepId);
1627
1732
  }
1628
1733
  if (onSkillResult && result.success && result.displayResults?.length) {
1629
1734
  onSkillResult({ skillId: result.skillId || skillId, displayResults: result.displayResults });
@@ -1661,72 +1766,9 @@ function createClaudeMcpServer(options) {
1661
1766
  };
1662
1767
  }
1663
1768
  }
1664
- // Artifact mode: store displayResults AND synthesizeData as artifacts, return compact references
1665
- if (artifactStore && result.displayResults?.length) {
1666
- const artifacts = result.displayResults.map(dr => {
1667
- const artId = artifactStore.store({
1668
- skillId: result.skillId || skillId,
1669
- stepId: dr.stepId,
1670
- layer: dr.layer,
1671
- title: dr.title,
1672
- data: dr.data,
1673
- diagnostics: undefined,
1674
- planPhaseId: producer.planPhaseId,
1675
- planPhaseTitle: producer.planPhaseTitle,
1676
- planPhaseGoal: producer.planPhaseGoal,
1677
- sourceToolCallId: producer.sourceToolCallId,
1678
- paramsHash: producer.paramsHash,
1679
- });
1680
- const summary = artifactStore.generateCompactSummary(artId);
1681
- return summary;
1682
- });
1683
- // Store diagnostics as a separate artifact if present
1684
- let diagnosticsArtifactId;
1685
- if (result.diagnostics && Array.isArray(result.diagnostics) && result.diagnostics.length > 0) {
1686
- diagnosticsArtifactId = artifactStore.store({
1687
- skillId: result.skillId || skillId,
1688
- stepId: '_diagnostics',
1689
- layer: 'diagnosis',
1690
- title: `${skillId} diagnostics`,
1691
- data: { columns: ['diagnostic'], rows: result.diagnostics.map((d) => [d]) },
1692
- diagnostics: result.diagnostics,
1693
- planPhaseId: producer.planPhaseId,
1694
- planPhaseTitle: producer.planPhaseTitle,
1695
- planPhaseGoal: producer.planPhaseGoal,
1696
- sourceToolCallId: producer.sourceToolCallId,
1697
- paramsHash: producer.paramsHash,
1698
- });
1699
- }
1700
- // Store synthesizeData entries as artifacts too — these contain the raw step data
1701
- // (e.g. batch_frame_root_cause with 487 rows) that would otherwise overflow token limits.
1702
- // Claude can fetch them on demand via fetch_artifact with pagination.
1703
- let synthesizeArtifacts;
1704
- if (result.synthesizeData && Array.isArray(result.synthesizeData) && result.synthesizeData.length > 0) {
1705
- synthesizeArtifacts = result.synthesizeData
1706
- .filter((sd) => sd.data && sd.success !== false)
1707
- .map((sd) => {
1708
- // synthesizeData entries have data as array-of-objects or { columns, rows }
1709
- const normalizedData = normalizeSynthesizeDataForStorage(sd.data);
1710
- const artId = artifactStore.store({
1711
- skillId: result.skillId || skillId,
1712
- stepId: sd.stepId,
1713
- layer: sd.layer || 'synthesize',
1714
- title: sd.stepName || sd.stepId,
1715
- data: normalizedData,
1716
- planPhaseId: producer.planPhaseId,
1717
- planPhaseTitle: producer.planPhaseTitle,
1718
- planPhaseGoal: producer.planPhaseGoal,
1719
- sourceToolCallId: producer.sourceToolCallId,
1720
- paramsHash: producer.paramsHash,
1721
- });
1722
- return {
1723
- artifactId: artId,
1724
- stepId: sd.stepId,
1725
- rowCount: normalizedData.rows?.length ?? 0,
1726
- columns: normalizedData.columns ?? [],
1727
- };
1728
- });
1729
- }
1769
+ // Artifact mode: return compact references whenever any fetchable
1770
+ // artifact was created.
1771
+ if (artifactStore && (artifacts?.length || diagnosticsArtifactId || synthesizeArtifacts?.length)) {
1730
1772
  return {
1731
1773
  content: [{
1732
1774
  type: 'text',
@@ -1735,6 +1777,7 @@ function createClaudeMcpServer(options) {
1735
1777
  skillId: result.skillId,
1736
1778
  skillName: result.skillName,
1737
1779
  ...(result.error ? { error: result.error } : {}),
1780
+ ...(result.identityResolution ? { identityResolution: result.identityResolution } : {}),
1738
1781
  artifacts,
1739
1782
  ...(diagnosticsArtifactId ? { diagnosticsArtifactId } : {}),
1740
1783
  ...(synthesizeArtifacts && synthesizeArtifacts.length > 0
@@ -1755,6 +1798,7 @@ function createClaudeMcpServer(options) {
1755
1798
  skillId: result.skillId,
1756
1799
  skillName: result.skillName,
1757
1800
  ...(result.error ? { error: result.error } : {}),
1801
+ ...(result.identityResolution ? { identityResolution: result.identityResolution } : {}),
1758
1802
  ...(vendorOverrideHint ? { vendorOverride: vendorOverrideHint } : {}),
1759
1803
  displayResults: result.displayResults?.map(dr => ({
1760
1804
  stepId: dr.stepId,
@@ -2045,7 +2089,8 @@ function createClaudeMcpServer(options) {
2045
2089
  success: true,
2046
2090
  detail: effectiveDetail,
2047
2091
  ...result,
2048
- sourceToolCallId: producer.sourceToolCallId,
2092
+ sourceToolCallId: result?.sourceToolCallId || producer.sourceToolCallId,
2093
+ fetchedByToolCallId: producer.sourceToolCallId,
2049
2094
  paramsHash: producer.paramsHash,
2050
2095
  planPhaseId: producer.planPhaseId,
2051
2096
  planPhaseTitle: producer.planPhaseTitle,
@@ -2295,13 +2340,50 @@ function createClaudeMcpServer(options) {
2295
2340
  'When the result carries `unsupportedReason` (license_blocked, index empty), the agent must say the source is unavailable and must NOT summarize, paraphrase, or invent content.', {
2296
2341
  query: zod_1.z.string().describe('Search query — typically a function or class name, or a behavior description.'),
2297
2342
  top_k: zod_1.z.number().int().min(1).max(20).optional().describe('Maximum hits returned (1-20, default 5).'),
2298
- }, async ({ query, top_k }) => {
2343
+ codebase_id: zod_1.z.string().optional().describe('Optional whitelisted registered AOSP codebase id.'),
2344
+ build_id: zod_1.z.string().optional().describe('Optional native build id filter.'),
2345
+ symbol: zod_1.z.string().optional().describe('Exact symbol filter when known.'),
2346
+ path_prefix: zod_1.z.string().optional().describe('Optional relative source path prefix.'),
2347
+ }, async ({ query, top_k, codebase_id, build_id, symbol, path_prefix }) => {
2348
+ const codebaseId = normalizeOptionalToolString(codebase_id);
2349
+ const buildId = normalizeOptionalToolString(build_id);
2350
+ const symbolExact = normalizeOptionalToolString(symbol);
2351
+ const pathPrefix = normalizeOptionalToolString(path_prefix);
2352
+ if (codebaseId && !codebaseIds.includes(codebaseId)) {
2353
+ return {
2354
+ content: [{ type: 'text', text: JSON.stringify({ success: false, error: 'Requested codebase is not whitelisted for this session' }) }],
2355
+ isError: true,
2356
+ };
2357
+ }
2299
2358
  const store = getRagStore();
2300
2359
  const result = store.search(query, {
2301
2360
  topK: top_k ?? 5,
2302
2361
  kinds: ['aosp'],
2362
+ ...(codebaseId ? { codebaseIds: [codebaseId] } : {}),
2363
+ ...(buildId ? { buildId } : {}),
2364
+ ...(symbolExact ? { symbolExact } : {}),
2365
+ ...(pathPrefix ? { pathPrefix } : {}),
2303
2366
  scope: knowledgeScope,
2304
2367
  });
2368
+ if (result.results.some(hit => hit.chunk?.registryOrigin === 'codebase_registry')) {
2369
+ const scopedResult = {
2370
+ ...result,
2371
+ results: result.results.filter(hit => hit.chunk?.registryOrigin !== 'codebase_registry' ||
2372
+ (hit.chunk.codebaseId && codebaseIds.includes(hit.chunk.codebaseId))),
2373
+ };
2374
+ const filtered = await (0, lookupResponseFilter_1.filterRagLookup)(scopedResult, {
2375
+ toolName: 'lookup_aosp_source',
2376
+ turn: 0,
2377
+ codebaseRegistry,
2378
+ ledger: codeLookupLedger,
2379
+ allowProviderSend: codeAwareMode === 'provider_send',
2380
+ sessionId: options.sessionId,
2381
+ });
2382
+ await codeLookupLedger?.flush();
2383
+ return {
2384
+ content: [{ type: 'text', text: JSON.stringify({ success: true, result: filtered }) }],
2385
+ };
2386
+ }
2305
2387
  return {
2306
2388
  content: [{ type: 'text', text: JSON.stringify(result) }],
2307
2389
  };
@@ -2314,17 +2396,254 @@ function createClaudeMcpServer(options) {
2314
2396
  'Read-only over the RagStore. When the result carries `unsupportedReason` (license_blocked, index empty), the agent must say the source is unavailable and must NOT summarize or invent.', {
2315
2397
  query: zod_1.z.string().describe('Search query — typically a tuning concept or vendor-specific knob.'),
2316
2398
  top_k: zod_1.z.number().int().min(1).max(20).optional().describe('Maximum hits returned (1-20, default 5).'),
2317
- }, async ({ query, top_k }) => {
2399
+ codebase_id: zod_1.z.string().optional().describe('Optional whitelisted registered OEM codebase id.'),
2400
+ vendor: zod_1.z.string().optional().describe('Optional vendor filter.'),
2401
+ }, async ({ query, top_k, codebase_id, vendor }) => {
2402
+ const codebaseId = normalizeOptionalToolString(codebase_id);
2403
+ const vendorId = normalizeOptionalToolString(vendor);
2404
+ if (codebaseId && !codebaseIds.includes(codebaseId)) {
2405
+ return {
2406
+ content: [{ type: 'text', text: JSON.stringify({ success: false, error: 'Requested codebase is not whitelisted for this session' }) }],
2407
+ isError: true,
2408
+ };
2409
+ }
2318
2410
  const store = getRagStore();
2319
2411
  const result = store.search(query, {
2320
2412
  topK: top_k ?? 5,
2321
2413
  kinds: ['oem_sdk'],
2414
+ ...(codebaseId ? { codebaseIds: [codebaseId] } : {}),
2415
+ ...(vendorId ? { vendor: vendorId } : {}),
2322
2416
  scope: knowledgeScope,
2323
2417
  });
2418
+ if (result.results.some(hit => hit.chunk?.registryOrigin === 'codebase_registry')) {
2419
+ const scopedResult = {
2420
+ ...result,
2421
+ results: result.results.filter(hit => hit.chunk?.registryOrigin !== 'codebase_registry' ||
2422
+ (hit.chunk.codebaseId && codebaseIds.includes(hit.chunk.codebaseId))),
2423
+ };
2424
+ const filtered = await (0, lookupResponseFilter_1.filterRagLookup)(scopedResult, {
2425
+ toolName: 'lookup_oem_sdk',
2426
+ turn: 0,
2427
+ codebaseRegistry,
2428
+ ledger: codeLookupLedger,
2429
+ allowProviderSend: codeAwareMode === 'provider_send',
2430
+ sessionId: options.sessionId,
2431
+ });
2432
+ await codeLookupLedger?.flush();
2433
+ return {
2434
+ content: [{ type: 'text', text: JSON.stringify({ success: true, result: filtered }) }],
2435
+ };
2436
+ }
2324
2437
  return {
2325
2438
  content: [{ type: 'text', text: JSON.stringify(result) }],
2326
2439
  };
2327
2440
  }, { annotations: { readOnlyHint: true } });
2441
+ const listCodebases = (0, claude_agent_sdk_1.tool)('list_codebases', 'List the app/AOSP/kernel/OEM codebases explicitly whitelisted for this analysis session. ' +
2442
+ 'Returns metadata only; it never exposes local root paths.', {}, async () => {
2443
+ const allowed = new Set(codebaseIds);
2444
+ const codebases = codebaseRegistry.list()
2445
+ .filter(ref => allowed.has(ref.codebaseId))
2446
+ .map(ref => ({
2447
+ codebaseId: ref.codebaseId,
2448
+ kind: ref.kind,
2449
+ displayName: ref.displayName,
2450
+ indexGeneration: ref.indexGeneration,
2451
+ chunkCount: ref.chunkCount,
2452
+ eligibleForSendToProvider: ref.eligibleForSendToProvider,
2453
+ }));
2454
+ return {
2455
+ content: [{ type: 'text', text: JSON.stringify({ success: true, codebases }) }],
2456
+ };
2457
+ }, { annotations: { readOnlyHint: true } });
2458
+ const lookupAppSource = (0, claude_agent_sdk_1.tool)('lookup_app_source', 'Look up registered app source chunks for this analysis session. ' +
2459
+ 'Only whitelisted codebase IDs are accepted. In metadata_only mode the result carries file/symbol references without snippets.', {
2460
+ query: zod_1.z.string().describe('Natural-language query, symbol, class, method, or file term.'),
2461
+ top_k: zod_1.z.number().int().min(1).max(20).optional().describe('Maximum hits returned (1-20, default 5).'),
2462
+ codebase_id: zod_1.z.string().optional().describe('Restrict to one whitelisted codebase id. Defaults to all session codebases.'),
2463
+ symbol: zod_1.z.string().optional().describe('Exact symbol filter when known.'),
2464
+ file_path: zod_1.z.string().optional().describe('Exact source file path relative to the registered root.'),
2465
+ path_prefix: zod_1.z.string().optional().describe('Restrict lookup to a relative path prefix.'),
2466
+ }, async ({ query, top_k, codebase_id, symbol, file_path, path_prefix }) => {
2467
+ const codebaseId = normalizeOptionalToolString(codebase_id);
2468
+ const symbolExact = normalizeOptionalToolString(symbol);
2469
+ const filePath = normalizeOptionalToolString(file_path);
2470
+ const pathPrefix = normalizeOptionalToolString(path_prefix);
2471
+ const requestedIds = codebaseId ? [codebaseId] : codebaseIds;
2472
+ const allowed = requestedIds.filter(id => codebaseIds.includes(id));
2473
+ if (allowed.length === 0) {
2474
+ return {
2475
+ content: [{
2476
+ type: 'text',
2477
+ text: JSON.stringify({ success: false, error: 'No requested codebase is whitelisted for this session' }),
2478
+ }],
2479
+ isError: true,
2480
+ };
2481
+ }
2482
+ const raw = getRagStore().search(query, {
2483
+ topK: top_k ?? 5,
2484
+ kinds: ['app_source'],
2485
+ codebaseIds: allowed,
2486
+ ...(symbolExact ? { symbolExact } : {}),
2487
+ ...(filePath ? { filePathExact: filePath } : {}),
2488
+ ...(pathPrefix ? { pathPrefix } : {}),
2489
+ scope: knowledgeScope,
2490
+ });
2491
+ const filtered = await (0, lookupResponseFilter_1.filterRagLookup)(raw, {
2492
+ toolName: 'lookup_app_source',
2493
+ turn: 0,
2494
+ codebaseRegistry,
2495
+ ledger: codeLookupLedger,
2496
+ allowProviderSend: codeAwareMode === 'provider_send',
2497
+ sessionId: options.sessionId,
2498
+ });
2499
+ await codeLookupLedger?.flush();
2500
+ return {
2501
+ content: [{ type: 'text', text: JSON.stringify({ success: true, result: filtered }) }],
2502
+ };
2503
+ }, { annotations: { readOnlyHint: true } });
2504
+ const lookupKernelSource = (0, claude_agent_sdk_1.tool)('lookup_kernel_source', 'Use when kernel/vendor source evidence is needed after trace evidence points at binder, scheduler, mm, io, or a kernel symbol. ' +
2505
+ 'Do NOT use for app or AOSP framework code. Prerequisites: a whitelisted kernel_source codebase, vendor or codebase_id, and a path_prefix/subsys. ' +
2506
+ 'Budget: top_k is capped at 20 and metadata_only sessions return CodeRef metadata without snippets. Outcomes: source hits, metadata-only hits, or an explicit unsupportedReason.', {
2507
+ query: zod_1.z.string().describe('Kernel symbol, subsystem, or behavior query.'),
2508
+ top_k: zod_1.z.number().int().min(1).max(20).optional().describe('Maximum hits returned (1-20, default 5).'),
2509
+ codebase_id: zod_1.z.string().optional().describe('Restrict to one whitelisted kernel codebase id.'),
2510
+ vendor: zod_1.z.string().optional().describe('Vendor id. Required when multiple kernel codebases are available and codebase_id is omitted.'),
2511
+ symbol: zod_1.z.string().optional().describe('Exact symbol filter when known.'),
2512
+ path_prefix: zod_1.z.string().optional().describe('Required subsystem path prefix, for example drivers/android/binder.'),
2513
+ }, async ({ query, top_k, codebase_id, vendor, symbol, path_prefix }) => {
2514
+ const codebaseId = normalizeOptionalToolString(codebase_id);
2515
+ const vendorId = normalizeOptionalToolString(vendor);
2516
+ const symbolExact = normalizeOptionalToolString(symbol);
2517
+ const pathPrefix = normalizeOptionalToolString(path_prefix);
2518
+ const requestedIds = codebaseId ? [codebaseId] : codebaseIds;
2519
+ const allowed = requestedIds.filter(id => codebaseIds.includes(id));
2520
+ if (allowed.length === 0) {
2521
+ return {
2522
+ content: [{
2523
+ type: 'text',
2524
+ text: JSON.stringify({ success: false, error: 'No requested codebase is whitelisted for this session' }),
2525
+ }],
2526
+ isError: true,
2527
+ };
2528
+ }
2529
+ const kernelRefs = allowed
2530
+ .map(id => codebaseRegistry.get(id))
2531
+ .filter(ref => ref?.kind === 'kernel_source');
2532
+ const vendors = new Set(kernelRefs.map(ref => ref.vendor).filter(Boolean));
2533
+ if (!codebaseId && !vendorId && vendors.size > 1) {
2534
+ return {
2535
+ content: [{ type: 'text', text: JSON.stringify({
2536
+ success: false,
2537
+ unsupportedReason: 'vendor_required_for_multi_vendor_kernel_lookup',
2538
+ vendors: Array.from(vendors).sort(),
2539
+ }) }],
2540
+ isError: true,
2541
+ };
2542
+ }
2543
+ const raw = getRagStore().search(query, {
2544
+ topK: top_k ?? 5,
2545
+ kinds: ['kernel_source'],
2546
+ codebaseIds: kernelRefs.map(ref => ref.codebaseId),
2547
+ ...(vendorId ? { vendor: vendorId } : {}),
2548
+ ...(symbolExact ? { symbolExact } : {}),
2549
+ ...(pathPrefix ? { pathPrefix } : {}),
2550
+ scope: knowledgeScope,
2551
+ });
2552
+ const filtered = await (0, lookupResponseFilter_1.filterRagLookup)(raw, {
2553
+ toolName: 'lookup_kernel_source',
2554
+ turn: 0,
2555
+ codebaseRegistry,
2556
+ ledger: codeLookupLedger,
2557
+ allowProviderSend: codeAwareMode === 'provider_send',
2558
+ sessionId: options.sessionId,
2559
+ });
2560
+ await codeLookupLedger?.flush();
2561
+ return {
2562
+ content: [{ type: 'text', text: JSON.stringify({ success: true, result: filtered }) }],
2563
+ };
2564
+ }, { annotations: { readOnlyHint: true } });
2565
+ const resolveSymbol = (0, claude_agent_sdk_1.tool)('resolve_symbol', 'Use when trace frames or obfuscated names must be resolved to CodeRef metadata before source lookup. ' +
2566
+ 'Do NOT use to guess file:line when build_id is missing; return the degraded result instead. ' +
2567
+ 'Prerequisites: whitelisted codebase ids and indexed source/symbol metadata. Budget: top_k capped at 20. Outcomes: app, native/AOSP, or kernel candidates with degradation reasons.', {
2568
+ symbol: zod_1.z.string().describe('Class, function, or method name to resolve.'),
2569
+ kind: zod_1.z.enum(['app', 'native', 'kernel']).optional().describe('Resolution domain; default app.'),
2570
+ codebase_id: zod_1.z.string().optional().describe('Restrict to one whitelisted codebase id. Defaults to all session codebases.'),
2571
+ file_path: zod_1.z.string().optional().describe('Optional relative source file path for fallback matching.'),
2572
+ build_id: zod_1.z.string().optional().describe('Optional build id. Missing build id returns a degraded result.'),
2573
+ vendor: zod_1.z.string().optional().describe('Vendor id for kernel lookup.'),
2574
+ top_k: zod_1.z.number().int().min(1).max(20).optional().describe('Maximum candidates returned.'),
2575
+ }, async ({ symbol, kind, codebase_id, file_path, build_id, vendor, top_k }) => {
2576
+ const codebaseId = normalizeOptionalToolString(codebase_id);
2577
+ const filePath = normalizeOptionalToolString(file_path);
2578
+ const buildId = normalizeOptionalToolString(build_id);
2579
+ const vendorId = normalizeOptionalToolString(vendor);
2580
+ const requestedIds = codebaseId ? [codebaseId] : codebaseIds;
2581
+ const allowed = requestedIds.filter(id => codebaseIds.includes(id));
2582
+ if (allowed.length === 0) {
2583
+ return {
2584
+ content: [{
2585
+ type: 'text',
2586
+ text: JSON.stringify({ success: false, error: 'No requested codebase is whitelisted for this session' }),
2587
+ }],
2588
+ isError: true,
2589
+ };
2590
+ }
2591
+ const resolver = new symbolResolver_1.SymbolResolver(getRagStore());
2592
+ const results = allowed.map(id => {
2593
+ const ref = codebaseRegistry.get(id);
2594
+ if (kind === 'kernel' || ref?.kind === 'kernel_source') {
2595
+ return resolver.resolveKernel({
2596
+ symbol,
2597
+ codebaseId: id,
2598
+ vendor: vendorId ?? ref?.vendor,
2599
+ ...(buildId ? { buildId } : {}),
2600
+ topK: top_k ?? 5,
2601
+ });
2602
+ }
2603
+ if (kind === 'native' || ref?.kind === 'aosp') {
2604
+ return resolver.resolveNative({
2605
+ symbol,
2606
+ codebaseId: id,
2607
+ ...(buildId ? { buildId } : {}),
2608
+ topK: top_k ?? 5,
2609
+ });
2610
+ }
2611
+ return resolver.resolveApp({
2612
+ symbol,
2613
+ codebaseId: id,
2614
+ ...(filePath ? { filePath } : {}),
2615
+ ...(buildId ? { buildId } : {}),
2616
+ topK: top_k ?? 5,
2617
+ });
2618
+ });
2619
+ return {
2620
+ content: [{ type: 'text', text: JSON.stringify({
2621
+ success: results.some(result => result.success),
2622
+ results,
2623
+ }) }],
2624
+ };
2625
+ }, { annotations: { readOnlyHint: true } });
2626
+ const proposePatch = (0, claude_agent_sdk_1.tool)('propose_patch', 'Use when the user asks for a concrete fix after successful code lookup. Do NOT use before lookup_app_source/lookup_kernel_source/lookup_aosp_source has returned prior contextChunkIds. ' +
2627
+ 'Prerequisites: all contextChunkIds must belong to one whitelisted codebase and provider_send consent must be enabled. Budget: patch attempts are capped by the session ledger. Outcomes: verified diff, non-copyable sketch, or unverified rejection.', {
2628
+ context_chunk_ids: zod_1.z.array(zod_1.z.string()).min(1).describe('Chunk ids previously returned by a successful source lookup in this session.'),
2629
+ problem: zod_1.z.string().describe('Performance problem the patch should address.'),
2630
+ proposed_diff: zod_1.z.string().optional().describe('Optional unified diff to validate. Only returned to the user if git apply --check passes.'),
2631
+ patch_sketch: zod_1.z.string().optional().describe('Optional high-level sketch when no verified diff is available.'),
2632
+ }, async ({ context_chunk_ids, problem, proposed_diff, patch_sketch }) => {
2633
+ const proposer = new patchProposer_1.PatchProposer(getRagStore(), codebaseRegistry, codeLookupLedger);
2634
+ const result = proposer.propose({
2635
+ contextChunkIds: context_chunk_ids,
2636
+ problem,
2637
+ ...(proposed_diff ? { proposedDiff: proposed_diff } : {}),
2638
+ ...(patch_sketch ? { patchSketch: patch_sketch } : {}),
2639
+ turn: 0,
2640
+ });
2641
+ await codeLookupLedger?.flush();
2642
+ return {
2643
+ content: [{ type: 'text', text: JSON.stringify({ success: result.patchStatus !== 'unverified', result }) }],
2644
+ ...(result.patchStatus === 'unverified' ? { isError: true } : {}),
2645
+ };
2646
+ }, { annotations: { readOnlyHint: false } });
2328
2647
  // recall_project_memory (Plan 44): pure-read recall over project +
2329
2648
  // world memory entries. Strict invariant: handler MUST NOT cause any
2330
2649
  // disk writes; ProjectMemory.recallProjectMemory() is enforced via
@@ -3251,7 +3570,7 @@ function createClaudeMcpServer(options) {
3251
3570
  const summaryResult = (0, sqlSummarizer_1.summarizeSqlResult)(result.columns, result.rows);
3252
3571
  const durationMs = Date.now() - sqlStart;
3253
3572
  if (emitUpdate) {
3254
- emittedEvidence = emitSqlSummaryDataEnvelope(emitUpdate, summaryResult, finalSql, injected, traceProvenance, producer);
3573
+ emittedEvidence = emitSqlSummaryDataEnvelope(emitUpdate, summaryResult, finalSql, injected, traceProvenance, producer, processIdentityWarning);
3255
3574
  }
3256
3575
  const text = JSON.stringify({
3257
3576
  success: true,
@@ -3275,10 +3594,10 @@ function createClaudeMcpServer(options) {
3275
3594
  }
3276
3595
  const durationMs = Date.now() - sqlStart;
3277
3596
  if (emitUpdate && success && result.columns.length > 0) {
3278
- emittedEvidence = emitSqlDataEnvelope(emitUpdate, result.columns, rows, finalSql, injected, traceProvenance, producer);
3597
+ emittedEvidence = emitSqlDataEnvelope(emitUpdate, result.columns, rows, finalSql, injected, traceProvenance, producer, processIdentityWarning);
3279
3598
  }
3280
3599
  else if (emitUpdate && !success) {
3281
- emittedEvidence = emitSqlDiagnosticDataEnvelope(emitUpdate, result.error || (0, outputLanguage_1.localize)(outputLanguage, 'SQL 执行失败', 'SQL execution failed'), finalSql, injected, traceProvenance, producer);
3600
+ emittedEvidence = emitSqlDiagnosticDataEnvelope(emitUpdate, result.error || (0, outputLanguage_1.localize)(outputLanguage, 'SQL 执行失败', 'SQL execution failed'), finalSql, injected, traceProvenance, producer, processIdentityWarning);
3282
3601
  }
3283
3602
  const text = JSON.stringify({
3284
3603
  success,
@@ -3308,7 +3627,7 @@ function createClaudeMcpServer(options) {
3308
3627
  traceId: targetTraceId,
3309
3628
  traceSide: trace,
3310
3629
  });
3311
- const emittedEvidence = emitUpdate ? emitSqlDiagnosticDataEnvelope(emitUpdate, e.message, sql, undefined, traceProvenance, producer, outputLanguage) : undefined;
3630
+ const emittedEvidence = emitUpdate ? emitSqlDiagnosticDataEnvelope(emitUpdate, e.message, sql, undefined, traceProvenance, producer, undefined, outputLanguage) : undefined;
3312
3631
  return {
3313
3632
  content: [{
3314
3633
  type: 'text',
@@ -3367,8 +3686,8 @@ function createClaudeMcpServer(options) {
3367
3686
  traceSide: 'reference',
3368
3687
  });
3369
3688
  const [currentResult, refResult] = await Promise.all([
3370
- skillExecutor.execute(skillId, traceId, effectiveParams),
3371
- skillExecutor.execute(skillId, referenceTraceId, refParams),
3689
+ skillExecutor.execute(skillId, traceId, effectiveParams, { __traceSide: 'current' }),
3690
+ skillExecutor.execute(skillId, referenceTraceId, refParams, { __traceSide: 'reference' }),
3372
3691
  ]);
3373
3692
  const compareDuration = Date.now() - compareStart;
3374
3693
  // Schema alignment: check which steps are comparable
@@ -3389,14 +3708,14 @@ function createClaudeMcpServer(options) {
3389
3708
  ...baseProducer,
3390
3709
  sourceToolCallId: `${baseProducer.sourceToolCallId}:current`,
3391
3710
  producerReason: (0, outputLanguage_1.localize)(outputLanguage, `当前 Trace 对比 Skill ${skillId} 结果。`, `Current trace result for comparison Skill ${skillId}.`),
3392
- });
3711
+ }, currentResult.identityResolution);
3393
3712
  }
3394
3713
  if (emitUpdate && refResult.displayResults?.length) {
3395
3714
  emitSkillDataEnvelopes(refResult.displayResults, skillId, emitUpdate, referenceTraceProvenance, {
3396
3715
  ...baseProducer,
3397
3716
  sourceToolCallId: `${baseProducer.sourceToolCallId}:reference`,
3398
3717
  producerReason: (0, outputLanguage_1.localize)(outputLanguage, `参考 Trace 对比 Skill ${skillId} 结果。`, `Reference trace result for comparison Skill ${skillId}.`),
3399
- });
3718
+ }, refResult.identityResolution);
3400
3719
  }
3401
3720
  // Build compact comparison summary for Claude
3402
3721
  const buildStepSummary = (results) => results.map(r => ({
@@ -3416,6 +3735,7 @@ function createClaudeMcpServer(options) {
3416
3735
  stepCount: currentResult.displayResults?.length || 0,
3417
3736
  steps: buildStepSummary(currentResult.displayResults || []),
3418
3737
  diagnosticCount: currentResult.diagnostics?.length || 0,
3738
+ identityResolution: currentResult.identityResolution,
3419
3739
  error: currentResult.error,
3420
3740
  },
3421
3741
  reference: {
@@ -3426,6 +3746,7 @@ function createClaudeMcpServer(options) {
3426
3746
  stepCount: refResult.displayResults?.length || 0,
3427
3747
  steps: buildStepSummary(refResult.displayResults || []),
3428
3748
  diagnosticCount: refResult.diagnostics?.length || 0,
3749
+ identityResolution: refResult.identityResolution,
3429
3750
  error: refResult.error,
3430
3751
  },
3431
3752
  alignment: {
@@ -3498,6 +3819,11 @@ function createClaudeMcpServer(options) {
3498
3819
  registry.registerSdk(lookupBlogKnowledge, 'lookup_blog_knowledge', 'public');
3499
3820
  registry.registerSdk(lookupAospSource, 'lookup_aosp_source', 'public');
3500
3821
  registry.registerSdk(lookupOemSdk, 'lookup_oem_sdk', 'public');
3822
+ registry.registerSdk(listCodebases, 'list_codebases', 'requires_codebase_permission');
3823
+ registry.registerSdk(lookupAppSource, 'lookup_app_source', 'requires_codebase_permission');
3824
+ registry.registerSdk(lookupKernelSource, 'lookup_kernel_source', 'requires_codebase_permission');
3825
+ registry.registerSdk(resolveSymbol, 'resolve_symbol', 'requires_codebase_permission');
3826
+ registry.registerSdk(proposePatch, 'propose_patch', 'requires_codebase_permission');
3501
3827
  registry.registerSdk(lookupBaseline, 'lookup_baseline', 'public');
3502
3828
  registry.registerSdk(compareBaselines, 'compare_baselines', 'public');
3503
3829
  registry.registerSdk(recallProjectMemory, 'recall_project_memory', 'public');
@@ -3534,9 +3860,9 @@ function createClaudeMcpServer(options) {
3534
3860
  registry.registerSdk(getComparisonContext, 'get_comparison_context', 'internal');
3535
3861
  }
3536
3862
  return {
3537
- server: registry.buildSdkServer(),
3538
- allowedTools: registry.buildAllowedTools(),
3539
- toolDefinitions: registry.list(),
3863
+ server: registry.buildSdkServer({ scope: toolRequestScope }),
3864
+ allowedTools: registry.buildAllowedTools(toolRequestScope),
3865
+ toolDefinitions: registry.listForRequest(toolRequestScope),
3540
3866
  };
3541
3867
  }
3542
3868
  function evidenceHash(input) {
@@ -3626,7 +3952,7 @@ function producerEnvelopeOptions(producer) {
3626
3952
  };
3627
3953
  }
3628
3954
  /** Emit a DataEnvelope for SQL query results. */
3629
- function emitSqlDataEnvelope(emit, columns, rows, sql, stdlibInjectedModules, traceProvenance, producer) {
3955
+ function emitSqlDataEnvelope(emit, columns, rows, sql, stdlibInjectedModules, traceProvenance, producer, processIdentityWarning) {
3630
3956
  const { evidenceRefId, queryHash } = stableSqlEvidenceRefId(sql, columns, rows, traceProvenance, producer);
3631
3957
  const envelope = (0, dataContract_1.createDataEnvelope)({ columns, rows }, {
3632
3958
  type: 'sql_result',
@@ -3643,6 +3969,7 @@ function emitSqlDataEnvelope(emit, columns, rows, sql, stdlibInjectedModules, tr
3643
3969
  traceId: traceProvenance?.traceId,
3644
3970
  queryHash,
3645
3971
  ...producerEnvelopeOptions(producer),
3972
+ processIdentityWarning,
3646
3973
  intent: 'ad_hoc_sql_verification',
3647
3974
  });
3648
3975
  emit({
@@ -3662,7 +3989,7 @@ function emitSqlDataEnvelope(emit, columns, rows, sql, stdlibInjectedModules, tr
3662
3989
  return { evidenceRefId, queryHash };
3663
3990
  }
3664
3991
  /** Emit a DataEnvelope for SQL summary-mode results. */
3665
- function emitSqlSummaryDataEnvelope(emit, summary, sql, stdlibInjectedModules, traceProvenance, producer) {
3992
+ function emitSqlSummaryDataEnvelope(emit, summary, sql, stdlibInjectedModules, traceProvenance, producer, processIdentityWarning) {
3666
3993
  const { evidenceRefId, queryHash } = stableSqlEvidenceRefId(sql, summary.columns, summary.sampleRows, traceProvenance, producer, 'summary');
3667
3994
  const envelope = (0, dataContract_1.createDataEnvelope)({
3668
3995
  summary: {
@@ -3681,6 +4008,7 @@ function emitSqlSummaryDataEnvelope(emit, summary, sql, stdlibInjectedModules, t
3681
4008
  traceId: traceProvenance?.traceId,
3682
4009
  queryHash,
3683
4010
  ...producerEnvelopeOptions(producer),
4011
+ processIdentityWarning,
3684
4012
  intent: 'ad_hoc_sql_summary',
3685
4013
  });
3686
4014
  emit({
@@ -3700,7 +4028,7 @@ function emitSqlSummaryDataEnvelope(emit, summary, sql, stdlibInjectedModules, t
3700
4028
  return { evidenceRefId, queryHash };
3701
4029
  }
3702
4030
  /** Emit a diagnostic DataEnvelope for failed SQL so missing tables remain explainable. */
3703
- function emitSqlDiagnosticDataEnvelope(emit, error, sql, stdlibInjectedModules, traceProvenance, producer, outputLanguage = outputLanguage_1.DEFAULT_OUTPUT_LANGUAGE) {
4031
+ function emitSqlDiagnosticDataEnvelope(emit, error, sql, stdlibInjectedModules, traceProvenance, producer, processIdentityWarning, outputLanguage = outputLanguage_1.DEFAULT_OUTPUT_LANGUAGE) {
3704
4032
  const { evidenceRefId, queryHash } = stableSqlEvidenceRefId(sql, [], [[error]], traceProvenance, producer, 'diagnostic');
3705
4033
  const envelope = (0, dataContract_1.createDataEnvelope)({
3706
4034
  text: [
@@ -3720,6 +4048,7 @@ function emitSqlDiagnosticDataEnvelope(emit, error, sql, stdlibInjectedModules,
3720
4048
  traceId: traceProvenance?.traceId,
3721
4049
  queryHash,
3722
4050
  ...producerEnvelopeOptions(producer),
4051
+ processIdentityWarning,
3723
4052
  intent: 'ad_hoc_sql_diagnostic',
3724
4053
  });
3725
4054
  emit({
@@ -3751,13 +4080,22 @@ function inferSqlColumnType(col) {
3751
4080
  * Convert skill DisplayResults to DataEnvelopes and emit as SSE 'data' events.
3752
4081
  * This enables interactive tables (clickable timestamps, expandable rows) in the frontend.
3753
4082
  */
3754
- function emitSkillDataEnvelopes(displayResults, skillId, emit, traceProvenance, producer) {
4083
+ function emitSkillDataEnvelopes(displayResults, skillId, emit, traceProvenance, producer, identityResolution, artifactIdsByStepId) {
3755
4084
  const envelopes = displayResults
3756
- .filter(dr => Array.isArray(dr.data?.rows))
4085
+ .filter(dr => Boolean(dr.data))
3757
4086
  .map(dr => {
3758
4087
  const explicitColumns = dr.columnDefinitions;
3759
- const envelope = (0, dataContract_1.displayResultToEnvelope)(dr, skillId, explicitColumns);
4088
+ const drForEnvelope = {
4089
+ ...dr,
4090
+ metadataConfig: dr.metadataConfig || (Array.isArray(dr.metadataFields)
4091
+ ? { fields: dr.metadataFields }
4092
+ : undefined),
4093
+ };
4094
+ const envelope = (0, dataContract_1.displayResultToEnvelope)(drForEnvelope, skillId, explicitColumns);
3760
4095
  const evidenceRefId = stableSkillEvidenceRefId(skillId, envelope.meta.stepId, envelope.display.title, envelope.data, traceProvenance, producer);
4096
+ const artifactId = envelope.meta.stepId
4097
+ ? artifactIdsByStepId?.get(envelope.meta.stepId)
4098
+ : undefined;
3761
4099
  const withEvidence = {
3762
4100
  ...envelope,
3763
4101
  meta: {
@@ -3765,6 +4103,13 @@ function emitSkillDataEnvelopes(displayResults, skillId, emit, traceProvenance,
3765
4103
  evidenceRefId,
3766
4104
  traceSide: traceProvenance?.traceSide,
3767
4105
  traceId: traceProvenance?.traceId,
4106
+ ...(artifactId ? { artifactId, sourceArtifactId: artifactId } : {}),
4107
+ ...(identityResolution ? {
4108
+ identityRefId: identityResolution.identityRefId,
4109
+ identityStatus: identityResolution.status,
4110
+ identityWarnings: identityResolution.warnings,
4111
+ identityResolution,
4112
+ } : {}),
3768
4113
  ...producerEnvelopeOptions(producer),
3769
4114
  intent: 'skill_structured_result',
3770
4115
  },