@gracker/smartperfetto 1.0.13

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 (2287) hide show
  1. package/.env.example +586 -0
  2. package/LICENSE +685 -0
  3. package/data/perfettoSqlDocs.json +33478 -0
  4. package/data/perfettoSqlIndex.json +9458 -0
  5. package/data/perfettoSqlIndex.light.json +13129 -0
  6. package/data/perfettoStdlibSymbols.json +677 -0
  7. package/dist/agent/agents/base/baseAgent.d.ts +378 -0
  8. package/dist/agent/agents/base/baseAgent.d.ts.map +1 -0
  9. package/dist/agent/agents/base/baseAgent.js +1484 -0
  10. package/dist/agent/agents/base/baseAgent.js.map +1 -0
  11. package/dist/agent/agents/base/baseSubAgent.d.ts +135 -0
  12. package/dist/agent/agents/base/baseSubAgent.d.ts.map +1 -0
  13. package/dist/agent/agents/base/baseSubAgent.js +483 -0
  14. package/dist/agent/agents/base/baseSubAgent.js.map +1 -0
  15. package/dist/agent/agents/baseExpertAgent.d.ts +37 -0
  16. package/dist/agent/agents/baseExpertAgent.d.ts.map +1 -0
  17. package/dist/agent/agents/baseExpertAgent.js +322 -0
  18. package/dist/agent/agents/baseExpertAgent.js.map +1 -0
  19. package/dist/agent/agents/domain/additionalAgents.d.ts +54 -0
  20. package/dist/agent/agents/domain/additionalAgents.d.ts.map +1 -0
  21. package/dist/agent/agents/domain/additionalAgents.js +292 -0
  22. package/dist/agent/agents/domain/additionalAgents.js.map +1 -0
  23. package/dist/agent/agents/domain/binderAgent.d.ts +27 -0
  24. package/dist/agent/agents/domain/binderAgent.d.ts.map +1 -0
  25. package/dist/agent/agents/domain/binderAgent.js +100 -0
  26. package/dist/agent/agents/domain/binderAgent.js.map +1 -0
  27. package/dist/agent/agents/domain/cpuAgent.d.ts +35 -0
  28. package/dist/agent/agents/domain/cpuAgent.d.ts.map +1 -0
  29. package/dist/agent/agents/domain/cpuAgent.js +163 -0
  30. package/dist/agent/agents/domain/cpuAgent.js.map +1 -0
  31. package/dist/agent/agents/domain/frameAgent.d.ts +59 -0
  32. package/dist/agent/agents/domain/frameAgent.d.ts.map +1 -0
  33. package/dist/agent/agents/domain/frameAgent.js +511 -0
  34. package/dist/agent/agents/domain/frameAgent.js.map +1 -0
  35. package/dist/agent/agents/domain/index.d.ts +92 -0
  36. package/dist/agent/agents/domain/index.d.ts.map +1 -0
  37. package/dist/agent/agents/domain/index.js +250 -0
  38. package/dist/agent/agents/domain/index.js.map +1 -0
  39. package/dist/agent/agents/domain/memoryAgent.d.ts +26 -0
  40. package/dist/agent/agents/domain/memoryAgent.d.ts.map +1 -0
  41. package/dist/agent/agents/domain/memoryAgent.js +94 -0
  42. package/dist/agent/agents/domain/memoryAgent.js.map +1 -0
  43. package/dist/agent/agents/domain/skillCatalog.d.ts +10 -0
  44. package/dist/agent/agents/domain/skillCatalog.d.ts.map +1 -0
  45. package/dist/agent/agents/domain/skillCatalog.js +66 -0
  46. package/dist/agent/agents/domain/skillCatalog.js.map +1 -0
  47. package/dist/agent/agents/evaluatorAgent.d.ts +76 -0
  48. package/dist/agent/agents/evaluatorAgent.d.ts.map +1 -0
  49. package/dist/agent/agents/evaluatorAgent.js +517 -0
  50. package/dist/agent/agents/evaluatorAgent.js.map +1 -0
  51. package/dist/agent/agents/index.d.ts +13 -0
  52. package/dist/agent/agents/index.d.ts.map +1 -0
  53. package/dist/agent/agents/index.js +25 -0
  54. package/dist/agent/agents/index.js.map +1 -0
  55. package/dist/agent/agents/iterationStrategyPlanner.d.ts +140 -0
  56. package/dist/agent/agents/iterationStrategyPlanner.d.ts.map +1 -0
  57. package/dist/agent/agents/iterationStrategyPlanner.js +359 -0
  58. package/dist/agent/agents/iterationStrategyPlanner.js.map +1 -0
  59. package/dist/agent/agents/plannerAgent.d.ts +56 -0
  60. package/dist/agent/agents/plannerAgent.d.ts.map +1 -0
  61. package/dist/agent/agents/plannerAgent.js +379 -0
  62. package/dist/agent/agents/plannerAgent.js.map +1 -0
  63. package/dist/agent/agents/scrollingExpertAgent.d.ts +11 -0
  64. package/dist/agent/agents/scrollingExpertAgent.d.ts.map +1 -0
  65. package/dist/agent/agents/scrollingExpertAgent.js +132 -0
  66. package/dist/agent/agents/scrollingExpertAgent.js.map +1 -0
  67. package/dist/agent/agents/tools/adbTools.d.ts +5 -0
  68. package/dist/agent/agents/tools/adbTools.d.ts.map +1 -0
  69. package/dist/agent/agents/tools/adbTools.js +326 -0
  70. package/dist/agent/agents/tools/adbTools.js.map +1 -0
  71. package/dist/agent/communication/agentMessageBus.d.ts +138 -0
  72. package/dist/agent/communication/agentMessageBus.d.ts.map +1 -0
  73. package/dist/agent/communication/agentMessageBus.js +542 -0
  74. package/dist/agent/communication/agentMessageBus.js.map +1 -0
  75. package/dist/agent/communication/index.d.ts +7 -0
  76. package/dist/agent/communication/index.d.ts.map +1 -0
  77. package/dist/agent/communication/index.js +15 -0
  78. package/dist/agent/communication/index.js.map +1 -0
  79. package/dist/agent/compaction/compactionTypes.d.ts +163 -0
  80. package/dist/agent/compaction/compactionTypes.d.ts.map +1 -0
  81. package/dist/agent/compaction/compactionTypes.js +32 -0
  82. package/dist/agent/compaction/compactionTypes.js.map +1 -0
  83. package/dist/agent/compaction/contextCompactor.d.ts +109 -0
  84. package/dist/agent/compaction/contextCompactor.d.ts.map +1 -0
  85. package/dist/agent/compaction/contextCompactor.js +225 -0
  86. package/dist/agent/compaction/contextCompactor.js.map +1 -0
  87. package/dist/agent/compaction/index.d.ts +10 -0
  88. package/dist/agent/compaction/index.d.ts.map +1 -0
  89. package/dist/agent/compaction/index.js +43 -0
  90. package/dist/agent/compaction/index.js.map +1 -0
  91. package/dist/agent/compaction/strategies/index.d.ts +5 -0
  92. package/dist/agent/compaction/strategies/index.d.ts.map +1 -0
  93. package/dist/agent/compaction/strategies/index.js +13 -0
  94. package/dist/agent/compaction/strategies/index.js.map +1 -0
  95. package/dist/agent/compaction/strategies/slidingWindowStrategy.d.ts +53 -0
  96. package/dist/agent/compaction/strategies/slidingWindowStrategy.d.ts.map +1 -0
  97. package/dist/agent/compaction/strategies/slidingWindowStrategy.js +237 -0
  98. package/dist/agent/compaction/strategies/slidingWindowStrategy.js.map +1 -0
  99. package/dist/agent/compaction/tokenEstimator.d.ts +78 -0
  100. package/dist/agent/compaction/tokenEstimator.d.ts.map +1 -0
  101. package/dist/agent/compaction/tokenEstimator.js +203 -0
  102. package/dist/agent/compaction/tokenEstimator.js.map +1 -0
  103. package/dist/agent/config/decisionThresholdManifest.d.ts +72 -0
  104. package/dist/agent/config/decisionThresholdManifest.d.ts.map +1 -0
  105. package/dist/agent/config/decisionThresholdManifest.js +77 -0
  106. package/dist/agent/config/decisionThresholdManifest.js.map +1 -0
  107. package/dist/agent/config/domainManifest.d.ts +77 -0
  108. package/dist/agent/config/domainManifest.d.ts.map +1 -0
  109. package/dist/agent/config/domainManifest.js +269 -0
  110. package/dist/agent/config/domainManifest.js.map +1 -0
  111. package/dist/agent/config/drillDownRegistry.d.ts +19 -0
  112. package/dist/agent/config/drillDownRegistry.d.ts.map +1 -0
  113. package/dist/agent/config/drillDownRegistry.js +118 -0
  114. package/dist/agent/config/drillDownRegistry.js.map +1 -0
  115. package/dist/agent/context/contextBuilder.d.ts +79 -0
  116. package/dist/agent/context/contextBuilder.d.ts.map +1 -0
  117. package/dist/agent/context/contextBuilder.js +273 -0
  118. package/dist/agent/context/contextBuilder.js.map +1 -0
  119. package/dist/agent/context/contextTypes.d.ts +121 -0
  120. package/dist/agent/context/contextTypes.d.ts.map +1 -0
  121. package/dist/agent/context/contextTypes.js +14 -0
  122. package/dist/agent/context/contextTypes.js.map +1 -0
  123. package/dist/agent/context/enhancedSessionContext.d.ts +283 -0
  124. package/dist/agent/context/enhancedSessionContext.d.ts.map +1 -0
  125. package/dist/agent/context/enhancedSessionContext.js +1636 -0
  126. package/dist/agent/context/enhancedSessionContext.js.map +1 -0
  127. package/dist/agent/context/entityStore.d.ts +374 -0
  128. package/dist/agent/context/entityStore.d.ts.map +1 -0
  129. package/dist/agent/context/entityStore.js +621 -0
  130. package/dist/agent/context/entityStore.js.map +1 -0
  131. package/dist/agent/context/focusStore.d.ts +229 -0
  132. package/dist/agent/context/focusStore.d.ts.map +1 -0
  133. package/dist/agent/context/focusStore.js +528 -0
  134. package/dist/agent/context/focusStore.js.map +1 -0
  135. package/dist/agent/context/index.d.ts +10 -0
  136. package/dist/agent/context/index.d.ts.map +1 -0
  137. package/dist/agent/context/index.js +42 -0
  138. package/dist/agent/context/index.js.map +1 -0
  139. package/dist/agent/context/policies/evaluatorPolicy.d.ts +22 -0
  140. package/dist/agent/context/policies/evaluatorPolicy.d.ts.map +1 -0
  141. package/dist/agent/context/policies/evaluatorPolicy.js +82 -0
  142. package/dist/agent/context/policies/evaluatorPolicy.js.map +1 -0
  143. package/dist/agent/context/policies/index.d.ts +7 -0
  144. package/dist/agent/context/policies/index.d.ts.map +1 -0
  145. package/dist/agent/context/policies/index.js +18 -0
  146. package/dist/agent/context/policies/index.js.map +1 -0
  147. package/dist/agent/context/policies/plannerPolicy.d.ts +27 -0
  148. package/dist/agent/context/policies/plannerPolicy.d.ts.map +1 -0
  149. package/dist/agent/context/policies/plannerPolicy.js +67 -0
  150. package/dist/agent/context/policies/plannerPolicy.js.map +1 -0
  151. package/dist/agent/context/policies/workerPolicy.d.ts +29 -0
  152. package/dist/agent/context/policies/workerPolicy.d.ts.map +1 -0
  153. package/dist/agent/context/policies/workerPolicy.js +99 -0
  154. package/dist/agent/context/policies/workerPolicy.js.map +1 -0
  155. package/dist/agent/core/circuitBreaker.d.ts +150 -0
  156. package/dist/agent/core/circuitBreaker.d.ts.map +1 -0
  157. package/dist/agent/core/circuitBreaker.js +500 -0
  158. package/dist/agent/core/circuitBreaker.js.map +1 -0
  159. package/dist/agent/core/conclusionContract.d.ts +61 -0
  160. package/dist/agent/core/conclusionContract.d.ts.map +1 -0
  161. package/dist/agent/core/conclusionContract.js +6 -0
  162. package/dist/agent/core/conclusionContract.js.map +1 -0
  163. package/dist/agent/core/conclusionGenerator.d.ts +42 -0
  164. package/dist/agent/core/conclusionGenerator.d.ts.map +1 -0
  165. package/dist/agent/core/conclusionGenerator.js +4109 -0
  166. package/dist/agent/core/conclusionGenerator.js.map +1 -0
  167. package/dist/agent/core/conclusionSceneTemplates.d.ts +8 -0
  168. package/dist/agent/core/conclusionSceneTemplates.d.ts.map +1 -0
  169. package/dist/agent/core/conclusionSceneTemplates.js +31 -0
  170. package/dist/agent/core/conclusionSceneTemplates.js.map +1 -0
  171. package/dist/agent/core/drillDownResolver.d.ts +67 -0
  172. package/dist/agent/core/drillDownResolver.d.ts.map +1 -0
  173. package/dist/agent/core/drillDownResolver.js +583 -0
  174. package/dist/agent/core/drillDownResolver.js.map +1 -0
  175. package/dist/agent/core/emittedEnvelopeRegistry.d.ts +75 -0
  176. package/dist/agent/core/emittedEnvelopeRegistry.d.ts.map +1 -0
  177. package/dist/agent/core/emittedEnvelopeRegistry.js +164 -0
  178. package/dist/agent/core/emittedEnvelopeRegistry.js.map +1 -0
  179. package/dist/agent/core/entityCapture.d.ts +53 -0
  180. package/dist/agent/core/entityCapture.d.ts.map +1 -0
  181. package/dist/agent/core/entityCapture.js +522 -0
  182. package/dist/agent/core/entityCapture.js.map +1 -0
  183. package/dist/agent/core/entityRegistry.d.ts +19 -0
  184. package/dist/agent/core/entityRegistry.d.ts.map +1 -0
  185. package/dist/agent/core/entityRegistry.js +102 -0
  186. package/dist/agent/core/entityRegistry.js.map +1 -0
  187. package/dist/agent/core/executors/analysisExecutor.d.ts +21 -0
  188. package/dist/agent/core/executors/analysisExecutor.d.ts.map +1 -0
  189. package/dist/agent/core/executors/analysisExecutor.js +6 -0
  190. package/dist/agent/core/executors/analysisExecutor.js.map +1 -0
  191. package/dist/agent/core/executors/clarifyExecutor.d.ts +42 -0
  192. package/dist/agent/core/executors/clarifyExecutor.d.ts.map +1 -0
  193. package/dist/agent/core/executors/clarifyExecutor.js +316 -0
  194. package/dist/agent/core/executors/clarifyExecutor.js.map +1 -0
  195. package/dist/agent/core/executors/comparisonExecutor.d.ts +39 -0
  196. package/dist/agent/core/executors/comparisonExecutor.d.ts.map +1 -0
  197. package/dist/agent/core/executors/comparisonExecutor.js +404 -0
  198. package/dist/agent/core/executors/comparisonExecutor.js.map +1 -0
  199. package/dist/agent/core/executors/directDrillDownExecutor.d.ts +56 -0
  200. package/dist/agent/core/executors/directDrillDownExecutor.d.ts.map +1 -0
  201. package/dist/agent/core/executors/directDrillDownExecutor.js +665 -0
  202. package/dist/agent/core/executors/directDrillDownExecutor.js.map +1 -0
  203. package/dist/agent/core/executors/directSkillExecutor.d.ts +106 -0
  204. package/dist/agent/core/executors/directSkillExecutor.d.ts.map +1 -0
  205. package/dist/agent/core/executors/directSkillExecutor.js +633 -0
  206. package/dist/agent/core/executors/directSkillExecutor.js.map +1 -0
  207. package/dist/agent/core/executors/extendExecutor.d.ts +50 -0
  208. package/dist/agent/core/executors/extendExecutor.d.ts.map +1 -0
  209. package/dist/agent/core/executors/extendExecutor.js +402 -0
  210. package/dist/agent/core/executors/extendExecutor.js.map +1 -0
  211. package/dist/agent/core/executors/hypothesisExecutor.d.ts +52 -0
  212. package/dist/agent/core/executors/hypothesisExecutor.d.ts.map +1 -0
  213. package/dist/agent/core/executors/hypothesisExecutor.js +564 -0
  214. package/dist/agent/core/executors/hypothesisExecutor.js.map +1 -0
  215. package/dist/agent/core/executors/index.d.ts +9 -0
  216. package/dist/agent/core/executors/index.d.ts.map +1 -0
  217. package/dist/agent/core/executors/index.js +15 -0
  218. package/dist/agent/core/executors/index.js.map +1 -0
  219. package/dist/agent/core/executors/strategy/strategyFrameEnvelopeCoordinator.d.ts +12 -0
  220. package/dist/agent/core/executors/strategy/strategyFrameEnvelopeCoordinator.d.ts.map +1 -0
  221. package/dist/agent/core/executors/strategy/strategyFrameEnvelopeCoordinator.js +186 -0
  222. package/dist/agent/core/executors/strategy/strategyFrameEnvelopeCoordinator.js.map +1 -0
  223. package/dist/agent/core/executors/strategy/strategyFrameMechanismCollector.d.ts +9 -0
  224. package/dist/agent/core/executors/strategy/strategyFrameMechanismCollector.d.ts.map +1 -0
  225. package/dist/agent/core/executors/strategy/strategyFrameMechanismCollector.js +123 -0
  226. package/dist/agent/core/executors/strategy/strategyFrameMechanismCollector.js.map +1 -0
  227. package/dist/agent/core/executors/strategy/strategyStagePlanner.d.ts +18 -0
  228. package/dist/agent/core/executors/strategy/strategyStagePlanner.d.ts.map +1 -0
  229. package/dist/agent/core/executors/strategy/strategyStagePlanner.js +69 -0
  230. package/dist/agent/core/executors/strategy/strategyStagePlanner.js.map +1 -0
  231. package/dist/agent/core/executors/strategy/strategyStageTaskBuilder.d.ts +14 -0
  232. package/dist/agent/core/executors/strategy/strategyStageTaskBuilder.d.ts.map +1 -0
  233. package/dist/agent/core/executors/strategy/strategyStageTaskBuilder.js +129 -0
  234. package/dist/agent/core/executors/strategy/strategyStageTaskBuilder.js.map +1 -0
  235. package/dist/agent/core/executors/strategyExecutor.d.ts +16 -0
  236. package/dist/agent/core/executors/strategyExecutor.d.ts.map +1 -0
  237. package/dist/agent/core/executors/strategyExecutor.js +377 -0
  238. package/dist/agent/core/executors/strategyExecutor.js.map +1 -0
  239. package/dist/agent/core/executors/traceConfigDetector.d.ts +28 -0
  240. package/dist/agent/core/executors/traceConfigDetector.d.ts.map +1 -0
  241. package/dist/agent/core/executors/traceConfigDetector.js +156 -0
  242. package/dist/agent/core/executors/traceConfigDetector.js.map +1 -0
  243. package/dist/agent/core/feedbackSynthesizer.d.ts +28 -0
  244. package/dist/agent/core/feedbackSynthesizer.d.ts.map +1 -0
  245. package/dist/agent/core/feedbackSynthesizer.js +841 -0
  246. package/dist/agent/core/feedbackSynthesizer.js.map +1 -0
  247. package/dist/agent/core/followUpHandler.d.ts +36 -0
  248. package/dist/agent/core/followUpHandler.d.ts.map +1 -0
  249. package/dist/agent/core/followUpHandler.js +413 -0
  250. package/dist/agent/core/followUpHandler.js.map +1 -0
  251. package/dist/agent/core/hypothesisGenerator.d.ts +45 -0
  252. package/dist/agent/core/hypothesisGenerator.d.ts.map +1 -0
  253. package/dist/agent/core/hypothesisGenerator.js +257 -0
  254. package/dist/agent/core/hypothesisGenerator.js.map +1 -0
  255. package/dist/agent/core/incrementalAnalyzer.d.ts +164 -0
  256. package/dist/agent/core/incrementalAnalyzer.d.ts.map +1 -0
  257. package/dist/agent/core/incrementalAnalyzer.js +382 -0
  258. package/dist/agent/core/incrementalAnalyzer.js.map +1 -0
  259. package/dist/agent/core/index.d.ts +25 -0
  260. package/dist/agent/core/index.d.ts.map +1 -0
  261. package/dist/agent/core/index.js +61 -0
  262. package/dist/agent/core/index.js.map +1 -0
  263. package/dist/agent/core/intentUnderstanding.d.ts +28 -0
  264. package/dist/agent/core/intentUnderstanding.d.ts.map +1 -0
  265. package/dist/agent/core/intentUnderstanding.js +451 -0
  266. package/dist/agent/core/intentUnderstanding.js.map +1 -0
  267. package/dist/agent/core/interventionController.d.ts +211 -0
  268. package/dist/agent/core/interventionController.d.ts.map +1 -0
  269. package/dist/agent/core/interventionController.js +477 -0
  270. package/dist/agent/core/interventionController.js.map +1 -0
  271. package/dist/agent/core/jankCauseSummarizer.d.ts +87 -0
  272. package/dist/agent/core/jankCauseSummarizer.d.ts.map +1 -0
  273. package/dist/agent/core/jankCauseSummarizer.js +432 -0
  274. package/dist/agent/core/jankCauseSummarizer.js.map +1 -0
  275. package/dist/agent/core/modelRouter.d.ts +164 -0
  276. package/dist/agent/core/modelRouter.d.ts.map +1 -0
  277. package/dist/agent/core/modelRouter.js +1169 -0
  278. package/dist/agent/core/modelRouter.js.map +1 -0
  279. package/dist/agent/core/modelRouterSingleton.d.ts +4 -0
  280. package/dist/agent/core/modelRouterSingleton.d.ts.map +1 -0
  281. package/dist/agent/core/modelRouterSingleton.js +20 -0
  282. package/dist/agent/core/modelRouterSingleton.js.map +1 -0
  283. package/dist/agent/core/orchestratorTypes.d.ts +506 -0
  284. package/dist/agent/core/orchestratorTypes.d.ts.map +1 -0
  285. package/dist/agent/core/orchestratorTypes.js +91 -0
  286. package/dist/agent/core/orchestratorTypes.js.map +1 -0
  287. package/dist/agent/core/pipelineExecutor.d.ts +154 -0
  288. package/dist/agent/core/pipelineExecutor.d.ts.map +1 -0
  289. package/dist/agent/core/pipelineExecutor.js +677 -0
  290. package/dist/agent/core/pipelineExecutor.js.map +1 -0
  291. package/dist/agent/core/scenePolicy.d.ts +3 -0
  292. package/dist/agent/core/scenePolicy.d.ts.map +1 -0
  293. package/dist/agent/core/scenePolicy.js +49 -0
  294. package/dist/agent/core/scenePolicy.js.map +1 -0
  295. package/dist/agent/core/sceneRouter.d.ts +8 -0
  296. package/dist/agent/core/sceneRouter.d.ts.map +1 -0
  297. package/dist/agent/core/sceneRouter.js +122 -0
  298. package/dist/agent/core/sceneRouter.js.map +1 -0
  299. package/dist/agent/core/sceneTaxonomy.d.ts +6 -0
  300. package/dist/agent/core/sceneTaxonomy.d.ts.map +1 -0
  301. package/dist/agent/core/sceneTaxonomy.js +83 -0
  302. package/dist/agent/core/sceneTaxonomy.js.map +1 -0
  303. package/dist/agent/core/sceneTemplateStore.d.ts +10 -0
  304. package/dist/agent/core/sceneTemplateStore.d.ts.map +1 -0
  305. package/dist/agent/core/sceneTemplateStore.js +244 -0
  306. package/dist/agent/core/sceneTemplateStore.js.map +1 -0
  307. package/dist/agent/core/sceneTemplateValidator.d.ts +22 -0
  308. package/dist/agent/core/sceneTemplateValidator.d.ts.map +1 -0
  309. package/dist/agent/core/sceneTemplateValidator.js +226 -0
  310. package/dist/agent/core/sceneTemplateValidator.js.map +1 -0
  311. package/dist/agent/core/sceneTypes.d.ts +53 -0
  312. package/dist/agent/core/sceneTypes.d.ts.map +1 -0
  313. package/dist/agent/core/sceneTypes.js +6 -0
  314. package/dist/agent/core/sceneTypes.js.map +1 -0
  315. package/dist/agent/core/stateMachine.d.ts +135 -0
  316. package/dist/agent/core/stateMachine.d.ts.map +1 -0
  317. package/dist/agent/core/stateMachine.js +516 -0
  318. package/dist/agent/core/stateMachine.js.map +1 -0
  319. package/dist/agent/core/strategySelector.d.ts +121 -0
  320. package/dist/agent/core/strategySelector.d.ts.map +1 -0
  321. package/dist/agent/core/strategySelector.js +344 -0
  322. package/dist/agent/core/strategySelector.js.map +1 -0
  323. package/dist/agent/core/taskGraphExecutor.d.ts +30 -0
  324. package/dist/agent/core/taskGraphExecutor.d.ts.map +1 -0
  325. package/dist/agent/core/taskGraphExecutor.js +142 -0
  326. package/dist/agent/core/taskGraphExecutor.js.map +1 -0
  327. package/dist/agent/core/taskGraphPlanner.d.ts +33 -0
  328. package/dist/agent/core/taskGraphPlanner.d.ts.map +1 -0
  329. package/dist/agent/core/taskGraphPlanner.js +312 -0
  330. package/dist/agent/core/taskGraphPlanner.js.map +1 -0
  331. package/dist/agent/decision/decisionTreeExecutor.d.ts +55 -0
  332. package/dist/agent/decision/decisionTreeExecutor.d.ts.map +1 -0
  333. package/dist/agent/decision/decisionTreeExecutor.js +250 -0
  334. package/dist/agent/decision/decisionTreeExecutor.js.map +1 -0
  335. package/dist/agent/decision/decisionTreeStageExecutor.d.ts +65 -0
  336. package/dist/agent/decision/decisionTreeStageExecutor.d.ts.map +1 -0
  337. package/dist/agent/decision/decisionTreeStageExecutor.js +286 -0
  338. package/dist/agent/decision/decisionTreeStageExecutor.js.map +1 -0
  339. package/dist/agent/decision/index.d.ts +27 -0
  340. package/dist/agent/decision/index.d.ts.map +1 -0
  341. package/dist/agent/decision/index.js +70 -0
  342. package/dist/agent/decision/index.js.map +1 -0
  343. package/dist/agent/decision/skillExecutorAdapter.d.ts +89 -0
  344. package/dist/agent/decision/skillExecutorAdapter.d.ts.map +1 -0
  345. package/dist/agent/decision/skillExecutorAdapter.js +447 -0
  346. package/dist/agent/decision/skillExecutorAdapter.js.map +1 -0
  347. package/dist/agent/decision/trees/index.d.ts +8 -0
  348. package/dist/agent/decision/trees/index.d.ts.map +1 -0
  349. package/dist/agent/decision/trees/index.js +16 -0
  350. package/dist/agent/decision/trees/index.js.map +1 -0
  351. package/dist/agent/decision/trees/launchDecisionTree.d.ts +7 -0
  352. package/dist/agent/decision/trees/launchDecisionTree.d.ts.map +1 -0
  353. package/dist/agent/decision/trees/launchDecisionTree.js +670 -0
  354. package/dist/agent/decision/trees/launchDecisionTree.js.map +1 -0
  355. package/dist/agent/decision/trees/scrollingDecisionTree.d.ts +7 -0
  356. package/dist/agent/decision/trees/scrollingDecisionTree.d.ts.map +1 -0
  357. package/dist/agent/decision/trees/scrollingDecisionTree.js +698 -0
  358. package/dist/agent/decision/trees/scrollingDecisionTree.js.map +1 -0
  359. package/dist/agent/decision/types.d.ts +191 -0
  360. package/dist/agent/decision/types.d.ts.map +1 -0
  361. package/dist/agent/decision/types.js +6 -0
  362. package/dist/agent/decision/types.js.map +1 -0
  363. package/dist/agent/detectors/architectureDetector.d.ts +31 -0
  364. package/dist/agent/detectors/architectureDetector.d.ts.map +1 -0
  365. package/dist/agent/detectors/architectureDetector.js +190 -0
  366. package/dist/agent/detectors/architectureDetector.js.map +1 -0
  367. package/dist/agent/detectors/index.d.ts +11 -0
  368. package/dist/agent/detectors/index.d.ts.map +1 -0
  369. package/dist/agent/detectors/index.js +36 -0
  370. package/dist/agent/detectors/index.js.map +1 -0
  371. package/dist/agent/detectors/types.d.ts +113 -0
  372. package/dist/agent/detectors/types.d.ts.map +1 -0
  373. package/dist/agent/detectors/types.js +6 -0
  374. package/dist/agent/detectors/types.js.map +1 -0
  375. package/dist/agent/evalSystem.d.ts +61 -0
  376. package/dist/agent/evalSystem.d.ts.map +1 -0
  377. package/dist/agent/evalSystem.js +210 -0
  378. package/dist/agent/evalSystem.js.map +1 -0
  379. package/dist/agent/experts/base/baseExpert.d.ts +108 -0
  380. package/dist/agent/experts/base/baseExpert.d.ts.map +1 -0
  381. package/dist/agent/experts/base/baseExpert.js +359 -0
  382. package/dist/agent/experts/base/baseExpert.js.map +1 -0
  383. package/dist/agent/experts/base/index.d.ts +9 -0
  384. package/dist/agent/experts/base/index.d.ts.map +1 -0
  385. package/dist/agent/experts/base/index.js +15 -0
  386. package/dist/agent/experts/base/index.js.map +1 -0
  387. package/dist/agent/experts/base/types.d.ts +202 -0
  388. package/dist/agent/experts/base/types.d.ts.map +1 -0
  389. package/dist/agent/experts/base/types.js +6 -0
  390. package/dist/agent/experts/base/types.js.map +1 -0
  391. package/dist/agent/experts/crossDomain/baseCrossDomainExpert.d.ts +113 -0
  392. package/dist/agent/experts/crossDomain/baseCrossDomainExpert.d.ts.map +1 -0
  393. package/dist/agent/experts/crossDomain/baseCrossDomainExpert.js +412 -0
  394. package/dist/agent/experts/crossDomain/baseCrossDomainExpert.js.map +1 -0
  395. package/dist/agent/experts/crossDomain/dialogueProtocol.d.ts +164 -0
  396. package/dist/agent/experts/crossDomain/dialogueProtocol.d.ts.map +1 -0
  397. package/dist/agent/experts/crossDomain/dialogueProtocol.js +390 -0
  398. package/dist/agent/experts/crossDomain/dialogueProtocol.js.map +1 -0
  399. package/dist/agent/experts/crossDomain/experts/performanceExpert.d.ts +119 -0
  400. package/dist/agent/experts/crossDomain/experts/performanceExpert.d.ts.map +1 -0
  401. package/dist/agent/experts/crossDomain/experts/performanceExpert.js +736 -0
  402. package/dist/agent/experts/crossDomain/experts/performanceExpert.js.map +1 -0
  403. package/dist/agent/experts/crossDomain/hypothesisManager.d.ts +105 -0
  404. package/dist/agent/experts/crossDomain/hypothesisManager.d.ts.map +1 -0
  405. package/dist/agent/experts/crossDomain/hypothesisManager.js +283 -0
  406. package/dist/agent/experts/crossDomain/hypothesisManager.js.map +1 -0
  407. package/dist/agent/experts/crossDomain/index.d.ts +18 -0
  408. package/dist/agent/experts/crossDomain/index.d.ts.map +1 -0
  409. package/dist/agent/experts/crossDomain/index.js +28 -0
  410. package/dist/agent/experts/crossDomain/index.js.map +1 -0
  411. package/dist/agent/experts/crossDomain/moduleCatalog.d.ts +97 -0
  412. package/dist/agent/experts/crossDomain/moduleCatalog.d.ts.map +1 -0
  413. package/dist/agent/experts/crossDomain/moduleCatalog.js +453 -0
  414. package/dist/agent/experts/crossDomain/moduleCatalog.js.map +1 -0
  415. package/dist/agent/experts/crossDomain/moduleExpertInvoker.d.ts +149 -0
  416. package/dist/agent/experts/crossDomain/moduleExpertInvoker.d.ts.map +1 -0
  417. package/dist/agent/experts/crossDomain/moduleExpertInvoker.js +582 -0
  418. package/dist/agent/experts/crossDomain/moduleExpertInvoker.js.map +1 -0
  419. package/dist/agent/experts/crossDomain/types.d.ts +369 -0
  420. package/dist/agent/experts/crossDomain/types.d.ts.map +1 -0
  421. package/dist/agent/experts/crossDomain/types.js +6 -0
  422. package/dist/agent/experts/crossDomain/types.js.map +1 -0
  423. package/dist/agent/experts/index.d.ts +81 -0
  424. package/dist/agent/experts/index.d.ts.map +1 -0
  425. package/dist/agent/experts/index.js +222 -0
  426. package/dist/agent/experts/index.js.map +1 -0
  427. package/dist/agent/experts/interactionExpert.d.ts +66 -0
  428. package/dist/agent/experts/interactionExpert.d.ts.map +1 -0
  429. package/dist/agent/experts/interactionExpert.js +280 -0
  430. package/dist/agent/experts/interactionExpert.js.map +1 -0
  431. package/dist/agent/experts/launchExpert.d.ts +73 -0
  432. package/dist/agent/experts/launchExpert.d.ts.map +1 -0
  433. package/dist/agent/experts/launchExpert.js +411 -0
  434. package/dist/agent/experts/launchExpert.js.map +1 -0
  435. package/dist/agent/experts/systemExpert.d.ts +81 -0
  436. package/dist/agent/experts/systemExpert.d.ts.map +1 -0
  437. package/dist/agent/experts/systemExpert.js +507 -0
  438. package/dist/agent/experts/systemExpert.js.map +1 -0
  439. package/dist/agent/fork/forkManager.d.ts +161 -0
  440. package/dist/agent/fork/forkManager.d.ts.map +1 -0
  441. package/dist/agent/fork/forkManager.js +721 -0
  442. package/dist/agent/fork/forkManager.js.map +1 -0
  443. package/dist/agent/fork/forkTypes.d.ts +274 -0
  444. package/dist/agent/fork/forkTypes.d.ts.map +1 -0
  445. package/dist/agent/fork/forkTypes.js +18 -0
  446. package/dist/agent/fork/forkTypes.js.map +1 -0
  447. package/dist/agent/fork/index.d.ts +10 -0
  448. package/dist/agent/fork/index.d.ts.map +1 -0
  449. package/dist/agent/fork/index.js +47 -0
  450. package/dist/agent/fork/index.js.map +1 -0
  451. package/dist/agent/fork/mergeStrategies.d.ts +115 -0
  452. package/dist/agent/fork/mergeStrategies.d.ts.map +1 -0
  453. package/dist/agent/fork/mergeStrategies.js +404 -0
  454. package/dist/agent/fork/mergeStrategies.js.map +1 -0
  455. package/dist/agent/fork/sessionTree.d.ts +141 -0
  456. package/dist/agent/fork/sessionTree.d.ts.map +1 -0
  457. package/dist/agent/fork/sessionTree.js +443 -0
  458. package/dist/agent/fork/sessionTree.js.map +1 -0
  459. package/dist/agent/hooks/hookContext.d.ts +19 -0
  460. package/dist/agent/hooks/hookContext.d.ts.map +1 -0
  461. package/dist/agent/hooks/hookContext.js +67 -0
  462. package/dist/agent/hooks/hookContext.js.map +1 -0
  463. package/dist/agent/hooks/hookRegistry.d.ts +73 -0
  464. package/dist/agent/hooks/hookRegistry.d.ts.map +1 -0
  465. package/dist/agent/hooks/hookRegistry.js +271 -0
  466. package/dist/agent/hooks/hookRegistry.js.map +1 -0
  467. package/dist/agent/hooks/hookTypes.d.ts +186 -0
  468. package/dist/agent/hooks/hookTypes.d.ts.map +1 -0
  469. package/dist/agent/hooks/hookTypes.js +24 -0
  470. package/dist/agent/hooks/hookTypes.js.map +1 -0
  471. package/dist/agent/hooks/index.d.ts +10 -0
  472. package/dist/agent/hooks/index.d.ts.map +1 -0
  473. package/dist/agent/hooks/index.js +41 -0
  474. package/dist/agent/hooks/index.js.map +1 -0
  475. package/dist/agent/hooks/middleware/index.d.ts +6 -0
  476. package/dist/agent/hooks/middleware/index.d.ts.map +1 -0
  477. package/dist/agent/hooks/middleware/index.js +17 -0
  478. package/dist/agent/hooks/middleware/index.js.map +1 -0
  479. package/dist/agent/hooks/middleware/loggingMiddleware.d.ts +27 -0
  480. package/dist/agent/hooks/middleware/loggingMiddleware.d.ts.map +1 -0
  481. package/dist/agent/hooks/middleware/loggingMiddleware.js +104 -0
  482. package/dist/agent/hooks/middleware/loggingMiddleware.js.map +1 -0
  483. package/dist/agent/hooks/middleware/timingMiddleware.d.ts +56 -0
  484. package/dist/agent/hooks/middleware/timingMiddleware.d.ts.map +1 -0
  485. package/dist/agent/hooks/middleware/timingMiddleware.js +171 -0
  486. package/dist/agent/hooks/middleware/timingMiddleware.js.map +1 -0
  487. package/dist/agent/index.d.ts +15 -0
  488. package/dist/agent/index.d.ts.map +1 -0
  489. package/dist/agent/index.js +88 -0
  490. package/dist/agent/index.js.map +1 -0
  491. package/dist/agent/llmAdapter.d.ts +33 -0
  492. package/dist/agent/llmAdapter.d.ts.map +1 -0
  493. package/dist/agent/llmAdapter.js +257 -0
  494. package/dist/agent/llmAdapter.js.map +1 -0
  495. package/dist/agent/scene/sceneAnalysisJobRunner.d.ts +106 -0
  496. package/dist/agent/scene/sceneAnalysisJobRunner.d.ts.map +1 -0
  497. package/dist/agent/scene/sceneAnalysisJobRunner.js +201 -0
  498. package/dist/agent/scene/sceneAnalysisJobRunner.js.map +1 -0
  499. package/dist/agent/scene/sceneCostEstimator.d.ts +33 -0
  500. package/dist/agent/scene/sceneCostEstimator.d.ts.map +1 -0
  501. package/dist/agent/scene/sceneCostEstimator.js +42 -0
  502. package/dist/agent/scene/sceneCostEstimator.js.map +1 -0
  503. package/dist/agent/scene/sceneIntervalBuilder.d.ts +37 -0
  504. package/dist/agent/scene/sceneIntervalBuilder.d.ts.map +1 -0
  505. package/dist/agent/scene/sceneIntervalBuilder.js +748 -0
  506. package/dist/agent/scene/sceneIntervalBuilder.js.map +1 -0
  507. package/dist/agent/scene/sceneStage1Runner.d.ts +47 -0
  508. package/dist/agent/scene/sceneStage1Runner.d.ts.map +1 -0
  509. package/dist/agent/scene/sceneStage1Runner.js +49 -0
  510. package/dist/agent/scene/sceneStage1Runner.js.map +1 -0
  511. package/dist/agent/scene/sceneStage3Summarizer.d.ts +11 -0
  512. package/dist/agent/scene/sceneStage3Summarizer.d.ts.map +1 -0
  513. package/dist/agent/scene/sceneStage3Summarizer.js +155 -0
  514. package/dist/agent/scene/sceneStage3Summarizer.js.map +1 -0
  515. package/dist/agent/scene/sceneStoryService.d.ts +168 -0
  516. package/dist/agent/scene/sceneStoryService.d.ts.map +1 -0
  517. package/dist/agent/scene/sceneStoryService.js +623 -0
  518. package/dist/agent/scene/sceneStoryService.js.map +1 -0
  519. package/dist/agent/scene/sceneTraceDurationProbe.d.ts +16 -0
  520. package/dist/agent/scene/sceneTraceDurationProbe.d.ts.map +1 -0
  521. package/dist/agent/scene/sceneTraceDurationProbe.js +22 -0
  522. package/dist/agent/scene/sceneTraceDurationProbe.js.map +1 -0
  523. package/dist/agent/scene/traceHash.d.ts +23 -0
  524. package/dist/agent/scene/traceHash.d.ts.map +1 -0
  525. package/dist/agent/scene/traceHash.js +65 -0
  526. package/dist/agent/scene/traceHash.js.map +1 -0
  527. package/dist/agent/scene/types.d.ts +199 -0
  528. package/dist/agent/scene/types.d.ts.map +1 -0
  529. package/dist/agent/scene/types.js +6 -0
  530. package/dist/agent/scene/types.js.map +1 -0
  531. package/dist/agent/state/checkpointManager.d.ts +85 -0
  532. package/dist/agent/state/checkpointManager.d.ts.map +1 -0
  533. package/dist/agent/state/checkpointManager.js +339 -0
  534. package/dist/agent/state/checkpointManager.js.map +1 -0
  535. package/dist/agent/state/index.d.ts +11 -0
  536. package/dist/agent/state/index.d.ts.map +1 -0
  537. package/dist/agent/state/index.js +21 -0
  538. package/dist/agent/state/index.js.map +1 -0
  539. package/dist/agent/state/sessionStore.d.ts +126 -0
  540. package/dist/agent/state/sessionStore.d.ts.map +1 -0
  541. package/dist/agent/state/sessionStore.js +440 -0
  542. package/dist/agent/state/sessionStore.js.map +1 -0
  543. package/dist/agent/state/traceAgentState.d.ts +125 -0
  544. package/dist/agent/state/traceAgentState.d.ts.map +1 -0
  545. package/dist/agent/state/traceAgentState.js +173 -0
  546. package/dist/agent/state/traceAgentState.js.map +1 -0
  547. package/dist/agent/strategies/helpers.d.ts +44 -0
  548. package/dist/agent/strategies/helpers.d.ts.map +1 -0
  549. package/dist/agent/strategies/helpers.js +138 -0
  550. package/dist/agent/strategies/helpers.js.map +1 -0
  551. package/dist/agent/strategies/index.d.ts +15 -0
  552. package/dist/agent/strategies/index.d.ts.map +1 -0
  553. package/dist/agent/strategies/index.js +23 -0
  554. package/dist/agent/strategies/index.js.map +1 -0
  555. package/dist/agent/strategies/interactionStrategy.d.ts +3 -0
  556. package/dist/agent/strategies/interactionStrategy.d.ts.map +1 -0
  557. package/dist/agent/strategies/interactionStrategy.js +242 -0
  558. package/dist/agent/strategies/interactionStrategy.js.map +1 -0
  559. package/dist/agent/strategies/registry.d.ts +110 -0
  560. package/dist/agent/strategies/registry.d.ts.map +1 -0
  561. package/dist/agent/strategies/registry.js +264 -0
  562. package/dist/agent/strategies/registry.js.map +1 -0
  563. package/dist/agent/strategies/sceneReconstructionStrategy.d.ts +4 -0
  564. package/dist/agent/strategies/sceneReconstructionStrategy.d.ts.map +1 -0
  565. package/dist/agent/strategies/sceneReconstructionStrategy.js +593 -0
  566. package/dist/agent/strategies/sceneReconstructionStrategy.js.map +1 -0
  567. package/dist/agent/strategies/scrollingStrategy.d.ts +3 -0
  568. package/dist/agent/strategies/scrollingStrategy.d.ts.map +1 -0
  569. package/dist/agent/strategies/scrollingStrategy.js +414 -0
  570. package/dist/agent/strategies/scrollingStrategy.js.map +1 -0
  571. package/dist/agent/strategies/startupStrategy.d.ts +3 -0
  572. package/dist/agent/strategies/startupStrategy.d.ts.map +1 -0
  573. package/dist/agent/strategies/startupStrategy.js +495 -0
  574. package/dist/agent/strategies/startupStrategy.js.map +1 -0
  575. package/dist/agent/strategies/types.d.ts +156 -0
  576. package/dist/agent/strategies/types.d.ts.map +1 -0
  577. package/dist/agent/strategies/types.js +6 -0
  578. package/dist/agent/strategies/types.js.map +1 -0
  579. package/dist/agent/toolRegistry.d.ts +4 -0
  580. package/dist/agent/toolRegistry.d.ts.map +1 -0
  581. package/dist/agent/toolRegistry.js +45 -0
  582. package/dist/agent/toolRegistry.js.map +1 -0
  583. package/dist/agent/tools/dataStats.d.ts +23 -0
  584. package/dist/agent/tools/dataStats.d.ts.map +1 -0
  585. package/dist/agent/tools/dataStats.js +123 -0
  586. package/dist/agent/tools/dataStats.js.map +1 -0
  587. package/dist/agent/tools/frameAnalyzer.d.ts +45 -0
  588. package/dist/agent/tools/frameAnalyzer.d.ts.map +1 -0
  589. package/dist/agent/tools/frameAnalyzer.js +338 -0
  590. package/dist/agent/tools/frameAnalyzer.js.map +1 -0
  591. package/dist/agent/tools/index.d.ts +6 -0
  592. package/dist/agent/tools/index.d.ts.map +1 -0
  593. package/dist/agent/tools/index.js +31 -0
  594. package/dist/agent/tools/index.js.map +1 -0
  595. package/dist/agent/tools/skillInvoker.d.ts +50 -0
  596. package/dist/agent/tools/skillInvoker.d.ts.map +1 -0
  597. package/dist/agent/tools/skillInvoker.js +279 -0
  598. package/dist/agent/tools/skillInvoker.js.map +1 -0
  599. package/dist/agent/tools/sqlExecutor.d.ts +12 -0
  600. package/dist/agent/tools/sqlExecutor.d.ts.map +1 -0
  601. package/dist/agent/tools/sqlExecutor.js +193 -0
  602. package/dist/agent/tools/sqlExecutor.js.map +1 -0
  603. package/dist/agent/tools/sqlGenerator.d.ts +154 -0
  604. package/dist/agent/tools/sqlGenerator.d.ts.map +1 -0
  605. package/dist/agent/tools/sqlGenerator.js +449 -0
  606. package/dist/agent/tools/sqlGenerator.js.map +1 -0
  607. package/dist/agent/tools/sqlValidator.d.ts +149 -0
  608. package/dist/agent/tools/sqlValidator.d.ts.map +1 -0
  609. package/dist/agent/tools/sqlValidator.js +376 -0
  610. package/dist/agent/tools/sqlValidator.js.map +1 -0
  611. package/dist/agent/traceRecorder.d.ts +42 -0
  612. package/dist/agent/traceRecorder.d.ts.map +1 -0
  613. package/dist/agent/traceRecorder.js +122 -0
  614. package/dist/agent/traceRecorder.js.map +1 -0
  615. package/dist/agent/types/agentProtocol.d.ts +377 -0
  616. package/dist/agent/types/agentProtocol.d.ts.map +1 -0
  617. package/dist/agent/types/agentProtocol.js +102 -0
  618. package/dist/agent/types/agentProtocol.js.map +1 -0
  619. package/dist/agent/types/jankCause.d.ts +47 -0
  620. package/dist/agent/types/jankCause.d.ts.map +1 -0
  621. package/dist/agent/types/jankCause.js +6 -0
  622. package/dist/agent/types/jankCause.js.map +1 -0
  623. package/dist/agent/types.d.ts +725 -0
  624. package/dist/agent/types.d.ts.map +1 -0
  625. package/dist/agent/types.js +63 -0
  626. package/dist/agent/types.js.map +1 -0
  627. package/dist/agentOpenAI/index.d.ts +4 -0
  628. package/dist/agentOpenAI/index.d.ts.map +1 -0
  629. package/dist/agentOpenAI/index.js +17 -0
  630. package/dist/agentOpenAI/index.js.map +1 -0
  631. package/dist/agentOpenAI/mimoReasoningCompat.d.ts +9 -0
  632. package/dist/agentOpenAI/mimoReasoningCompat.d.ts.map +1 -0
  633. package/dist/agentOpenAI/mimoReasoningCompat.js +367 -0
  634. package/dist/agentOpenAI/mimoReasoningCompat.js.map +1 -0
  635. package/dist/agentOpenAI/openAiComplexityClassifier.d.ts +18 -0
  636. package/dist/agentOpenAI/openAiComplexityClassifier.d.ts.map +1 -0
  637. package/dist/agentOpenAI/openAiComplexityClassifier.js +102 -0
  638. package/dist/agentOpenAI/openAiComplexityClassifier.js.map +1 -0
  639. package/dist/agentOpenAI/openAiConfig.d.ts +38 -0
  640. package/dist/agentOpenAI/openAiConfig.d.ts.map +1 -0
  641. package/dist/agentOpenAI/openAiConfig.js +104 -0
  642. package/dist/agentOpenAI/openAiConfig.js.map +1 -0
  643. package/dist/agentOpenAI/openAiRuntime.d.ts +99 -0
  644. package/dist/agentOpenAI/openAiRuntime.d.ts.map +1 -0
  645. package/dist/agentOpenAI/openAiRuntime.js +1440 -0
  646. package/dist/agentOpenAI/openAiRuntime.js.map +1 -0
  647. package/dist/agentOpenAI/openAiToolAdapter.d.ts +9 -0
  648. package/dist/agentOpenAI/openAiToolAdapter.d.ts.map +1 -0
  649. package/dist/agentOpenAI/openAiToolAdapter.js +111 -0
  650. package/dist/agentOpenAI/openAiToolAdapter.js.map +1 -0
  651. package/dist/agentRuntime/envCredentialSources.d.ts +6 -0
  652. package/dist/agentRuntime/envCredentialSources.d.ts.map +1 -0
  653. package/dist/agentRuntime/envCredentialSources.js +104 -0
  654. package/dist/agentRuntime/envCredentialSources.js.map +1 -0
  655. package/dist/agentRuntime/index.d.ts +2 -0
  656. package/dist/agentRuntime/index.d.ts.map +1 -0
  657. package/dist/agentRuntime/index.js +10 -0
  658. package/dist/agentRuntime/index.js.map +1 -0
  659. package/dist/agentRuntime/runtimeHealth.d.ts +65 -0
  660. package/dist/agentRuntime/runtimeHealth.d.ts.map +1 -0
  661. package/dist/agentRuntime/runtimeHealth.js +58 -0
  662. package/dist/agentRuntime/runtimeHealth.js.map +1 -0
  663. package/dist/agentRuntime/runtimeSelection.d.ts +25 -0
  664. package/dist/agentRuntime/runtimeSelection.d.ts.map +1 -0
  665. package/dist/agentRuntime/runtimeSelection.js +66 -0
  666. package/dist/agentRuntime/runtimeSelection.js.map +1 -0
  667. package/dist/agentv3/__mocks__/claude-agent-sdk.d.ts +25 -0
  668. package/dist/agentv3/__mocks__/claude-agent-sdk.d.ts.map +1 -0
  669. package/dist/agentv3/__mocks__/claude-agent-sdk.js +48 -0
  670. package/dist/agentv3/__mocks__/claude-agent-sdk.js.map +1 -0
  671. package/dist/agentv3/activePhaseReminder.d.ts +12 -0
  672. package/dist/agentv3/activePhaseReminder.d.ts.map +1 -0
  673. package/dist/agentv3/activePhaseReminder.js +73 -0
  674. package/dist/agentv3/activePhaseReminder.js.map +1 -0
  675. package/dist/agentv3/agentMetrics.d.ts +114 -0
  676. package/dist/agentv3/agentMetrics.d.ts.map +1 -0
  677. package/dist/agentv3/agentMetrics.js +262 -0
  678. package/dist/agentv3/agentMetrics.js.map +1 -0
  679. package/dist/agentv3/analysisPatternMemory.d.ts +146 -0
  680. package/dist/agentv3/analysisPatternMemory.d.ts.map +1 -0
  681. package/dist/agentv3/analysisPatternMemory.js +860 -0
  682. package/dist/agentv3/analysisPatternMemory.js.map +1 -0
  683. package/dist/agentv3/analysisTermination.d.ts +21 -0
  684. package/dist/agentv3/analysisTermination.d.ts.map +1 -0
  685. package/dist/agentv3/analysisTermination.js +97 -0
  686. package/dist/agentv3/analysisTermination.js.map +1 -0
  687. package/dist/agentv3/artifactStore.d.ts +131 -0
  688. package/dist/agentv3/artifactStore.d.ts.map +1 -0
  689. package/dist/agentv3/artifactStore.js +208 -0
  690. package/dist/agentv3/artifactStore.js.map +1 -0
  691. package/dist/agentv3/claudeAgentDefinitions.d.ts +44 -0
  692. package/dist/agentv3/claudeAgentDefinitions.d.ts.map +1 -0
  693. package/dist/agentv3/claudeAgentDefinitions.js +209 -0
  694. package/dist/agentv3/claudeAgentDefinitions.js.map +1 -0
  695. package/dist/agentv3/claudeConfig.d.ts +156 -0
  696. package/dist/agentv3/claudeConfig.d.ts.map +1 -0
  697. package/dist/agentv3/claudeConfig.js +553 -0
  698. package/dist/agentv3/claudeConfig.js.map +1 -0
  699. package/dist/agentv3/claudeFindingExtractor.d.ts +15 -0
  700. package/dist/agentv3/claudeFindingExtractor.d.ts.map +1 -0
  701. package/dist/agentv3/claudeFindingExtractor.js +150 -0
  702. package/dist/agentv3/claudeFindingExtractor.js.map +1 -0
  703. package/dist/agentv3/claudeMcpServer.d.ts +89 -0
  704. package/dist/agentv3/claudeMcpServer.d.ts.map +1 -0
  705. package/dist/agentv3/claudeMcpServer.js +3785 -0
  706. package/dist/agentv3/claudeMcpServer.js.map +1 -0
  707. package/dist/agentv3/claudeRuntime.d.ts +137 -0
  708. package/dist/agentv3/claudeRuntime.d.ts.map +1 -0
  709. package/dist/agentv3/claudeRuntime.js +2541 -0
  710. package/dist/agentv3/claudeRuntime.js.map +1 -0
  711. package/dist/agentv3/claudeSseBridge.d.ts +23 -0
  712. package/dist/agentv3/claudeSseBridge.d.ts.map +1 -0
  713. package/dist/agentv3/claudeSseBridge.js +385 -0
  714. package/dist/agentv3/claudeSseBridge.js.map +1 -0
  715. package/dist/agentv3/claudeSystemPrompt.d.ts +65 -0
  716. package/dist/agentv3/claudeSystemPrompt.d.ts.map +1 -0
  717. package/dist/agentv3/claudeSystemPrompt.js +486 -0
  718. package/dist/agentv3/claudeSystemPrompt.js.map +1 -0
  719. package/dist/agentv3/claudeVerifier.d.ts +82 -0
  720. package/dist/agentv3/claudeVerifier.d.ts.map +1 -0
  721. package/dist/agentv3/claudeVerifier.js +1047 -0
  722. package/dist/agentv3/claudeVerifier.js.map +1 -0
  723. package/dist/agentv3/contextTokenMeter.d.ts +78 -0
  724. package/dist/agentv3/contextTokenMeter.d.ts.map +1 -0
  725. package/dist/agentv3/contextTokenMeter.js +88 -0
  726. package/dist/agentv3/contextTokenMeter.js.map +1 -0
  727. package/dist/agentv3/focusAppDetector.d.ts +22 -0
  728. package/dist/agentv3/focusAppDetector.d.ts.map +1 -0
  729. package/dist/agentv3/focusAppDetector.js +208 -0
  730. package/dist/agentv3/focusAppDetector.js.map +1 -0
  731. package/dist/agentv3/index.d.ts +6 -0
  732. package/dist/agentv3/index.d.ts.map +1 -0
  733. package/dist/agentv3/index.js +16 -0
  734. package/dist/agentv3/index.js.map +1 -0
  735. package/dist/agentv3/mcpToolRegistry.d.ts +90 -0
  736. package/dist/agentv3/mcpToolRegistry.d.ts.map +1 -0
  737. package/dist/agentv3/mcpToolRegistry.js +152 -0
  738. package/dist/agentv3/mcpToolRegistry.js.map +1 -0
  739. package/dist/agentv3/outputLanguage.d.ts +6 -0
  740. package/dist/agentv3/outputLanguage.d.ts.map +1 -0
  741. package/dist/agentv3/outputLanguage.js +37 -0
  742. package/dist/agentv3/outputLanguage.js.map +1 -0
  743. package/dist/agentv3/phaseHintMatcher.d.ts +36 -0
  744. package/dist/agentv3/phaseHintMatcher.d.ts.map +1 -0
  745. package/dist/agentv3/phaseHintMatcher.js +48 -0
  746. package/dist/agentv3/phaseHintMatcher.js.map +1 -0
  747. package/dist/agentv3/projectMemory.d.ts +80 -0
  748. package/dist/agentv3/projectMemory.d.ts.map +1 -0
  749. package/dist/agentv3/projectMemory.js +334 -0
  750. package/dist/agentv3/projectMemory.js.map +1 -0
  751. package/dist/agentv3/queryComplexityClassifier.d.ts +21 -0
  752. package/dist/agentv3/queryComplexityClassifier.d.ts.map +1 -0
  753. package/dist/agentv3/queryComplexityClassifier.js +196 -0
  754. package/dist/agentv3/queryComplexityClassifier.js.map +1 -0
  755. package/dist/agentv3/rawSqlNormalizer.d.ts +11 -0
  756. package/dist/agentv3/rawSqlNormalizer.d.ts.map +1 -0
  757. package/dist/agentv3/rawSqlNormalizer.js +649 -0
  758. package/dist/agentv3/rawSqlNormalizer.js.map +1 -0
  759. package/dist/agentv3/recoveryNoteBuilder.d.ts +51 -0
  760. package/dist/agentv3/recoveryNoteBuilder.d.ts.map +1 -0
  761. package/dist/agentv3/recoveryNoteBuilder.js +84 -0
  762. package/dist/agentv3/recoveryNoteBuilder.js.map +1 -0
  763. package/dist/agentv3/sceneClassifier.d.ts +11 -0
  764. package/dist/agentv3/sceneClassifier.d.ts.map +1 -0
  765. package/dist/agentv3/sceneClassifier.js +46 -0
  766. package/dist/agentv3/sceneClassifier.js.map +1 -0
  767. package/dist/agentv3/scenePlanTemplates.d.ts +80 -0
  768. package/dist/agentv3/scenePlanTemplates.d.ts.map +1 -0
  769. package/dist/agentv3/scenePlanTemplates.js +164 -0
  770. package/dist/agentv3/scenePlanTemplates.js.map +1 -0
  771. package/dist/agentv3/selfImprove/contentScanner.d.ts +44 -0
  772. package/dist/agentv3/selfImprove/contentScanner.d.ts.map +1 -0
  773. package/dist/agentv3/selfImprove/contentScanner.js +112 -0
  774. package/dist/agentv3/selfImprove/contentScanner.js.map +1 -0
  775. package/dist/agentv3/selfImprove/failureTaxonomy.d.ts +38 -0
  776. package/dist/agentv3/selfImprove/failureTaxonomy.d.ts.map +1 -0
  777. package/dist/agentv3/selfImprove/failureTaxonomy.js +102 -0
  778. package/dist/agentv3/selfImprove/failureTaxonomy.js.map +1 -0
  779. package/dist/agentv3/selfImprove/feedbackEnricher.d.ts +69 -0
  780. package/dist/agentv3/selfImprove/feedbackEnricher.d.ts.map +1 -0
  781. package/dist/agentv3/selfImprove/feedbackEnricher.js +135 -0
  782. package/dist/agentv3/selfImprove/feedbackEnricher.js.map +1 -0
  783. package/dist/agentv3/selfImprove/feedbackPipeline.d.ts +63 -0
  784. package/dist/agentv3/selfImprove/feedbackPipeline.d.ts.map +1 -0
  785. package/dist/agentv3/selfImprove/feedbackPipeline.js +239 -0
  786. package/dist/agentv3/selfImprove/feedbackPipeline.js.map +1 -0
  787. package/dist/agentv3/selfImprove/hintFingerprint.d.ts +14 -0
  788. package/dist/agentv3/selfImprove/hintFingerprint.d.ts.map +1 -0
  789. package/dist/agentv3/selfImprove/hintFingerprint.js +47 -0
  790. package/dist/agentv3/selfImprove/hintFingerprint.js.map +1 -0
  791. package/dist/agentv3/selfImprove/metricsAggregator.d.ts +46 -0
  792. package/dist/agentv3/selfImprove/metricsAggregator.d.ts.map +1 -0
  793. package/dist/agentv3/selfImprove/metricsAggregator.js +195 -0
  794. package/dist/agentv3/selfImprove/metricsAggregator.js.map +1 -0
  795. package/dist/agentv3/selfImprove/migrateFailureModeHash.d.ts +31 -0
  796. package/dist/agentv3/selfImprove/migrateFailureModeHash.d.ts.map +1 -0
  797. package/dist/agentv3/selfImprove/migrateFailureModeHash.js +220 -0
  798. package/dist/agentv3/selfImprove/migrateFailureModeHash.js.map +1 -0
  799. package/dist/agentv3/selfImprove/phaseHintsRenderer.d.ts +56 -0
  800. package/dist/agentv3/selfImprove/phaseHintsRenderer.d.ts.map +1 -0
  801. package/dist/agentv3/selfImprove/phaseHintsRenderer.js +202 -0
  802. package/dist/agentv3/selfImprove/phaseHintsRenderer.js.map +1 -0
  803. package/dist/agentv3/selfImprove/promoteSkillNote.d.ts +17 -0
  804. package/dist/agentv3/selfImprove/promoteSkillNote.d.ts.map +1 -0
  805. package/dist/agentv3/selfImprove/promoteSkillNote.js +146 -0
  806. package/dist/agentv3/selfImprove/promoteSkillNote.js.map +1 -0
  807. package/dist/agentv3/selfImprove/proposeStrategyPatch.d.ts +40 -0
  808. package/dist/agentv3/selfImprove/proposeStrategyPatch.d.ts.map +1 -0
  809. package/dist/agentv3/selfImprove/proposeStrategyPatch.js +115 -0
  810. package/dist/agentv3/selfImprove/proposeStrategyPatch.js.map +1 -0
  811. package/dist/agentv3/selfImprove/reviewAgentSdk.d.ts +32 -0
  812. package/dist/agentv3/selfImprove/reviewAgentSdk.d.ts.map +1 -0
  813. package/dist/agentv3/selfImprove/reviewAgentSdk.js +173 -0
  814. package/dist/agentv3/selfImprove/reviewAgentSdk.js.map +1 -0
  815. package/dist/agentv3/selfImprove/reviewOutbox.d.ts +128 -0
  816. package/dist/agentv3/selfImprove/reviewOutbox.d.ts.map +1 -0
  817. package/dist/agentv3/selfImprove/reviewOutbox.js +313 -0
  818. package/dist/agentv3/selfImprove/reviewOutbox.js.map +1 -0
  819. package/dist/agentv3/selfImprove/reviewWorker.d.ts +95 -0
  820. package/dist/agentv3/selfImprove/reviewWorker.d.ts.map +1 -0
  821. package/dist/agentv3/selfImprove/reviewWorker.js +172 -0
  822. package/dist/agentv3/selfImprove/reviewWorker.js.map +1 -0
  823. package/dist/agentv3/selfImprove/skillNotesInjector.d.ts +71 -0
  824. package/dist/agentv3/selfImprove/skillNotesInjector.d.ts.map +1 -0
  825. package/dist/agentv3/selfImprove/skillNotesInjector.js +214 -0
  826. package/dist/agentv3/selfImprove/skillNotesInjector.js.map +1 -0
  827. package/dist/agentv3/selfImprove/skillNotesWriter.d.ts +89 -0
  828. package/dist/agentv3/selfImprove/skillNotesWriter.d.ts.map +1 -0
  829. package/dist/agentv3/selfImprove/skillNotesWriter.js +274 -0
  830. package/dist/agentv3/selfImprove/skillNotesWriter.js.map +1 -0
  831. package/dist/agentv3/selfImprove/strategyFingerprint.d.ts +85 -0
  832. package/dist/agentv3/selfImprove/strategyFingerprint.d.ts.map +1 -0
  833. package/dist/agentv3/selfImprove/strategyFingerprint.js +189 -0
  834. package/dist/agentv3/selfImprove/strategyFingerprint.js.map +1 -0
  835. package/dist/agentv3/selfImprove/strategyPatchApplier.d.ts +15 -0
  836. package/dist/agentv3/selfImprove/strategyPatchApplier.d.ts.map +1 -0
  837. package/dist/agentv3/selfImprove/strategyPatchApplier.js +138 -0
  838. package/dist/agentv3/selfImprove/strategyPatchApplier.js.map +1 -0
  839. package/dist/agentv3/selfImprove/supersedeStore.d.ts +136 -0
  840. package/dist/agentv3/selfImprove/supersedeStore.d.ts.map +1 -0
  841. package/dist/agentv3/selfImprove/supersedeStore.js +386 -0
  842. package/dist/agentv3/selfImprove/supersedeStore.js.map +1 -0
  843. package/dist/agentv3/selfImprove/worktreeRunner.d.ts +49 -0
  844. package/dist/agentv3/selfImprove/worktreeRunner.d.ts.map +1 -0
  845. package/dist/agentv3/selfImprove/worktreeRunner.js +153 -0
  846. package/dist/agentv3/selfImprove/worktreeRunner.js.map +1 -0
  847. package/dist/agentv3/sessionStateSnapshot.d.ts +166 -0
  848. package/dist/agentv3/sessionStateSnapshot.d.ts.map +1 -0
  849. package/dist/agentv3/sessionStateSnapshot.js +6 -0
  850. package/dist/agentv3/sessionStateSnapshot.js.map +1 -0
  851. package/dist/agentv3/sqlIncludeInjector.d.ts +24 -0
  852. package/dist/agentv3/sqlIncludeInjector.d.ts.map +1 -0
  853. package/dist/agentv3/sqlIncludeInjector.js +78 -0
  854. package/dist/agentv3/sqlIncludeInjector.js.map +1 -0
  855. package/dist/agentv3/sqlSummarizer.d.ts +38 -0
  856. package/dist/agentv3/sqlSummarizer.d.ts.map +1 -0
  857. package/dist/agentv3/sqlSummarizer.js +101 -0
  858. package/dist/agentv3/sqlSummarizer.js.map +1 -0
  859. package/dist/agentv3/standaloneMcpServer.d.ts +96 -0
  860. package/dist/agentv3/standaloneMcpServer.d.ts.map +1 -0
  861. package/dist/agentv3/standaloneMcpServer.js +244 -0
  862. package/dist/agentv3/standaloneMcpServer.js.map +1 -0
  863. package/dist/agentv3/strategyLoader.d.ts +96 -0
  864. package/dist/agentv3/strategyLoader.d.ts.map +1 -0
  865. package/dist/agentv3/strategyLoader.js +204 -0
  866. package/dist/agentv3/strategyLoader.js.map +1 -0
  867. package/dist/agentv3/toolCallSummary.d.ts +15 -0
  868. package/dist/agentv3/toolCallSummary.d.ts.map +1 -0
  869. package/dist/agentv3/toolCallSummary.js +66 -0
  870. package/dist/agentv3/toolCallSummary.js.map +1 -0
  871. package/dist/agentv3/toolNarration.d.ts +4 -0
  872. package/dist/agentv3/toolNarration.d.ts.map +1 -0
  873. package/dist/agentv3/toolNarration.js +371 -0
  874. package/dist/agentv3/toolNarration.js.map +1 -0
  875. package/dist/agentv3/traceCompletenessProber.d.ts +56 -0
  876. package/dist/agentv3/traceCompletenessProber.d.ts.map +1 -0
  877. package/dist/agentv3/traceCompletenessProber.js +337 -0
  878. package/dist/agentv3/traceCompletenessProber.js.map +1 -0
  879. package/dist/agentv3/types.d.ts +443 -0
  880. package/dist/agentv3/types.d.ts.map +1 -0
  881. package/dist/agentv3/types.js +37 -0
  882. package/dist/agentv3/types.js.map +1 -0
  883. package/dist/assistant/application/agentAnalyzeSessionService.d.ts +130 -0
  884. package/dist/assistant/application/agentAnalyzeSessionService.d.ts.map +1 -0
  885. package/dist/assistant/application/agentAnalyzeSessionService.js +433 -0
  886. package/dist/assistant/application/agentAnalyzeSessionService.js.map +1 -0
  887. package/dist/assistant/application/assistantApplicationService.d.ts +39 -0
  888. package/dist/assistant/application/assistantApplicationService.d.ts.map +1 -0
  889. package/dist/assistant/application/assistantApplicationService.js +88 -0
  890. package/dist/assistant/application/assistantApplicationService.js.map +1 -0
  891. package/dist/assistant/contracts/assistantResultContract.d.ts +41 -0
  892. package/dist/assistant/contracts/assistantResultContract.d.ts.map +1 -0
  893. package/dist/assistant/contracts/assistantResultContract.js +145 -0
  894. package/dist/assistant/contracts/assistantResultContract.js.map +1 -0
  895. package/dist/assistant/stream/sessionSseReplay.d.ts +10 -0
  896. package/dist/assistant/stream/sessionSseReplay.d.ts.map +1 -0
  897. package/dist/assistant/stream/sessionSseReplay.js +42 -0
  898. package/dist/assistant/stream/sessionSseReplay.js.map +1 -0
  899. package/dist/assistant/stream/streamProjector.d.ts +53 -0
  900. package/dist/assistant/stream/streamProjector.d.ts.map +1 -0
  901. package/dist/assistant/stream/streamProjector.js +150 -0
  902. package/dist/assistant/stream/streamProjector.js.map +1 -0
  903. package/dist/cli/commands/coverage.d.ts +12 -0
  904. package/dist/cli/commands/coverage.d.ts.map +1 -0
  905. package/dist/cli/commands/coverage.js +106 -0
  906. package/dist/cli/commands/coverage.js.map +1 -0
  907. package/dist/cli/commands/list.d.ts +11 -0
  908. package/dist/cli/commands/list.d.ts.map +1 -0
  909. package/dist/cli/commands/list.js +169 -0
  910. package/dist/cli/commands/list.js.map +1 -0
  911. package/dist/cli/commands/smoke.d.ts +11 -0
  912. package/dist/cli/commands/smoke.d.ts.map +1 -0
  913. package/dist/cli/commands/smoke.js +215 -0
  914. package/dist/cli/commands/smoke.js.map +1 -0
  915. package/dist/cli/commands/test.d.ts +11 -0
  916. package/dist/cli/commands/test.d.ts.map +1 -0
  917. package/dist/cli/commands/test.js +183 -0
  918. package/dist/cli/commands/test.js.map +1 -0
  919. package/dist/cli/commands/validate.d.ts +26 -0
  920. package/dist/cli/commands/validate.d.ts.map +1 -0
  921. package/dist/cli/commands/validate.js +918 -0
  922. package/dist/cli/commands/validate.js.map +1 -0
  923. package/dist/cli/index.d.ts +3 -0
  924. package/dist/cli/index.d.ts.map +1 -0
  925. package/dist/cli/index.js +29 -0
  926. package/dist/cli/index.js.map +1 -0
  927. package/dist/cli-user/bin.d.ts +3 -0
  928. package/dist/cli-user/bin.d.ts.map +1 -0
  929. package/dist/cli-user/bin.js +490 -0
  930. package/dist/cli-user/bin.js.map +1 -0
  931. package/dist/cli-user/bootstrap.d.ts +12 -0
  932. package/dist/cli-user/bootstrap.d.ts.map +1 -0
  933. package/dist/cli-user/bootstrap.js +165 -0
  934. package/dist/cli-user/bootstrap.js.map +1 -0
  935. package/dist/cli-user/commands/analyze.d.ts +12 -0
  936. package/dist/cli-user/commands/analyze.d.ts.map +1 -0
  937. package/dist/cli-user/commands/analyze.js +83 -0
  938. package/dist/cli-user/commands/analyze.js.map +1 -0
  939. package/dist/cli-user/commands/capture.d.ts +12 -0
  940. package/dist/cli-user/commands/capture.d.ts.map +1 -0
  941. package/dist/cli-user/commands/capture.js +155 -0
  942. package/dist/cli-user/commands/capture.js.map +1 -0
  943. package/dist/cli-user/commands/compare.d.ts +13 -0
  944. package/dist/cli-user/commands/compare.d.ts.map +1 -0
  945. package/dist/cli-user/commands/compare.js +74 -0
  946. package/dist/cli-user/commands/compare.js.map +1 -0
  947. package/dist/cli-user/commands/config.d.ts +9 -0
  948. package/dist/cli-user/commands/config.d.ts.map +1 -0
  949. package/dist/cli-user/commands/config.js +109 -0
  950. package/dist/cli-user/commands/config.js.map +1 -0
  951. package/dist/cli-user/commands/doctor.d.ts +8 -0
  952. package/dist/cli-user/commands/doctor.d.ts.map +1 -0
  953. package/dist/cli-user/commands/doctor.js +37 -0
  954. package/dist/cli-user/commands/doctor.js.map +1 -0
  955. package/dist/cli-user/commands/list.d.ts +10 -0
  956. package/dist/cli-user/commands/list.d.ts.map +1 -0
  957. package/dist/cli-user/commands/list.js +79 -0
  958. package/dist/cli-user/commands/list.js.map +1 -0
  959. package/dist/cli-user/commands/provider.d.ts +12 -0
  960. package/dist/cli-user/commands/provider.d.ts.map +1 -0
  961. package/dist/cli-user/commands/provider.js +121 -0
  962. package/dist/cli-user/commands/provider.js.map +1 -0
  963. package/dist/cli-user/commands/query.d.ts +10 -0
  964. package/dist/cli-user/commands/query.d.ts.map +1 -0
  965. package/dist/cli-user/commands/query.js +128 -0
  966. package/dist/cli-user/commands/query.js.map +1 -0
  967. package/dist/cli-user/commands/report.d.ts +18 -0
  968. package/dist/cli-user/commands/report.d.ts.map +1 -0
  969. package/dist/cli-user/commands/report.js +225 -0
  970. package/dist/cli-user/commands/report.js.map +1 -0
  971. package/dist/cli-user/commands/resume.d.ts +12 -0
  972. package/dist/cli-user/commands/resume.d.ts.map +1 -0
  973. package/dist/cli-user/commands/resume.js +48 -0
  974. package/dist/cli-user/commands/resume.js.map +1 -0
  975. package/dist/cli-user/commands/rm.d.ts +8 -0
  976. package/dist/cli-user/commands/rm.d.ts.map +1 -0
  977. package/dist/cli-user/commands/rm.js +91 -0
  978. package/dist/cli-user/commands/rm.js.map +1 -0
  979. package/dist/cli-user/commands/show.d.ts +8 -0
  980. package/dist/cli-user/commands/show.d.ts.map +1 -0
  981. package/dist/cli-user/commands/show.js +84 -0
  982. package/dist/cli-user/commands/show.js.map +1 -0
  983. package/dist/cli-user/commands/skill.d.ts +11 -0
  984. package/dist/cli-user/commands/skill.d.ts.map +1 -0
  985. package/dist/cli-user/commands/skill.js +118 -0
  986. package/dist/cli-user/commands/skill.js.map +1 -0
  987. package/dist/cli-user/constants.d.ts +10 -0
  988. package/dist/cli-user/constants.d.ts.map +1 -0
  989. package/dist/cli-user/constants.js +16 -0
  990. package/dist/cli-user/constants.js.map +1 -0
  991. package/dist/cli-user/io/indexJson.d.ts +11 -0
  992. package/dist/cli-user/io/indexJson.d.ts.map +1 -0
  993. package/dist/cli-user/io/indexJson.js +79 -0
  994. package/dist/cli-user/io/indexJson.js.map +1 -0
  995. package/dist/cli-user/io/openFile.d.ts +8 -0
  996. package/dist/cli-user/io/openFile.d.ts.map +1 -0
  997. package/dist/cli-user/io/openFile.js +34 -0
  998. package/dist/cli-user/io/openFile.js.map +1 -0
  999. package/dist/cli-user/io/paths.d.ts +33 -0
  1000. package/dist/cli-user/io/paths.d.ts.map +1 -0
  1001. package/dist/cli-user/io/paths.js +149 -0
  1002. package/dist/cli-user/io/paths.js.map +1 -0
  1003. package/dist/cli-user/io/sessionStore.d.ts +17 -0
  1004. package/dist/cli-user/io/sessionStore.d.ts.map +1 -0
  1005. package/dist/cli-user/io/sessionStore.js +101 -0
  1006. package/dist/cli-user/io/sessionStore.js.map +1 -0
  1007. package/dist/cli-user/io/stdio.d.ts +8 -0
  1008. package/dist/cli-user/io/stdio.d.ts.map +1 -0
  1009. package/dist/cli-user/io/stdio.js +25 -0
  1010. package/dist/cli-user/io/stdio.js.map +1 -0
  1011. package/dist/cli-user/io/transcriptWriter.d.ts +5 -0
  1012. package/dist/cli-user/io/transcriptWriter.d.ts.map +1 -0
  1013. package/dist/cli-user/io/transcriptWriter.js +60 -0
  1014. package/dist/cli-user/io/transcriptWriter.js.map +1 -0
  1015. package/dist/cli-user/repl/index.d.ts +14 -0
  1016. package/dist/cli-user/repl/index.d.ts.map +1 -0
  1017. package/dist/cli-user/repl/index.js +301 -0
  1018. package/dist/cli-user/repl/index.js.map +1 -0
  1019. package/dist/cli-user/repl/renderer.d.ts +43 -0
  1020. package/dist/cli-user/repl/renderer.d.ts.map +1 -0
  1021. package/dist/cli-user/repl/renderer.js +210 -0
  1022. package/dist/cli-user/repl/renderer.js.map +1 -0
  1023. package/dist/cli-user/repl/slashCommands.d.ts +49 -0
  1024. package/dist/cli-user/repl/slashCommands.d.ts.map +1 -0
  1025. package/dist/cli-user/repl/slashCommands.js +65 -0
  1026. package/dist/cli-user/repl/slashCommands.js.map +1 -0
  1027. package/dist/cli-user/services/cliAnalyzeService.d.ts +73 -0
  1028. package/dist/cli-user/services/cliAnalyzeService.d.ts.map +1 -0
  1029. package/dist/cli-user/services/cliAnalyzeService.js +393 -0
  1030. package/dist/cli-user/services/cliAnalyzeService.js.map +1 -0
  1031. package/dist/cli-user/services/runtimeGuard.d.ts +46 -0
  1032. package/dist/cli-user/services/runtimeGuard.d.ts.map +1 -0
  1033. package/dist/cli-user/services/runtimeGuard.js +188 -0
  1034. package/dist/cli-user/services/runtimeGuard.js.map +1 -0
  1035. package/dist/cli-user/services/traceProcessorInstaller.d.ts +2 -0
  1036. package/dist/cli-user/services/traceProcessorInstaller.d.ts.map +1 -0
  1037. package/dist/cli-user/services/traceProcessorInstaller.js +241 -0
  1038. package/dist/cli-user/services/traceProcessorInstaller.js.map +1 -0
  1039. package/dist/cli-user/services/turnPersistence.d.ts +41 -0
  1040. package/dist/cli-user/services/turnPersistence.d.ts.map +1 -0
  1041. package/dist/cli-user/services/turnPersistence.js +55 -0
  1042. package/dist/cli-user/services/turnPersistence.js.map +1 -0
  1043. package/dist/cli-user/services/turnRunner.d.ts +49 -0
  1044. package/dist/cli-user/services/turnRunner.d.ts.map +1 -0
  1045. package/dist/cli-user/services/turnRunner.js +436 -0
  1046. package/dist/cli-user/services/turnRunner.js.map +1 -0
  1047. package/dist/cli-user/types.d.ts +62 -0
  1048. package/dist/cli-user/types.d.ts.map +1 -0
  1049. package/dist/cli-user/types.js +6 -0
  1050. package/dist/cli-user/types.js.map +1 -0
  1051. package/dist/config/index.d.ts +393 -0
  1052. package/dist/config/index.d.ts.map +1 -0
  1053. package/dist/config/index.js +334 -0
  1054. package/dist/config/index.js.map +1 -0
  1055. package/dist/config/prompts.d.ts +20 -0
  1056. package/dist/config/prompts.d.ts.map +1 -0
  1057. package/dist/config/prompts.js +74 -0
  1058. package/dist/config/prompts.js.map +1 -0
  1059. package/dist/config/teaching.config.d.ts +253 -0
  1060. package/dist/config/teaching.config.d.ts.map +1 -0
  1061. package/dist/config/teaching.config.js +203 -0
  1062. package/dist/config/teaching.config.js.map +1 -0
  1063. package/dist/config/thresholds.d.ts +300 -0
  1064. package/dist/config/thresholds.d.ts.map +1 -0
  1065. package/dist/config/thresholds.js +338 -0
  1066. package/dist/config/thresholds.js.map +1 -0
  1067. package/dist/controllers/skillAdminController.d.ts +62 -0
  1068. package/dist/controllers/skillAdminController.d.ts.map +1 -0
  1069. package/dist/controllers/skillAdminController.js +482 -0
  1070. package/dist/controllers/skillAdminController.js.map +1 -0
  1071. package/dist/controllers/skillController.d.ts +49 -0
  1072. package/dist/controllers/skillController.d.ts.map +1 -0
  1073. package/dist/controllers/skillController.js +246 -0
  1074. package/dist/controllers/skillController.js.map +1 -0
  1075. package/dist/controllers/sqlController.d.ts +9 -0
  1076. package/dist/controllers/sqlController.d.ts.map +1 -0
  1077. package/dist/controllers/sqlController.js +125 -0
  1078. package/dist/controllers/sqlController.js.map +1 -0
  1079. package/dist/controllers/traceController.d.ts +13 -0
  1080. package/dist/controllers/traceController.d.ts.map +1 -0
  1081. package/dist/controllers/traceController.js +209 -0
  1082. package/dist/controllers/traceController.js.map +1 -0
  1083. package/dist/controllers/traceProcessorController.d.ts +14 -0
  1084. package/dist/controllers/traceProcessorController.d.ts.map +1 -0
  1085. package/dist/controllers/traceProcessorController.js +222 -0
  1086. package/dist/controllers/traceProcessorController.js.map +1 -0
  1087. package/dist/data/perfettoSchema.d.ts +9 -0
  1088. package/dist/data/perfettoSchema.d.ts.map +1 -0
  1089. package/dist/data/perfettoSchema.js +286 -0
  1090. package/dist/data/perfettoSchema.js.map +1 -0
  1091. package/dist/index.d.ts +2 -0
  1092. package/dist/index.d.ts.map +1 -0
  1093. package/dist/index.js +251 -0
  1094. package/dist/index.js.map +1 -0
  1095. package/dist/middleware/auth.d.ts +37 -0
  1096. package/dist/middleware/auth.d.ts.map +1 -0
  1097. package/dist/middleware/auth.js +307 -0
  1098. package/dist/middleware/auth.js.map +1 -0
  1099. package/dist/middleware/legacyAgentApi.d.ts +8 -0
  1100. package/dist/middleware/legacyAgentApi.d.ts.map +1 -0
  1101. package/dist/middleware/legacyAgentApi.js +64 -0
  1102. package/dist/middleware/legacyAgentApi.js.map +1 -0
  1103. package/dist/middleware/workspaceRouteContext.d.ts +4 -0
  1104. package/dist/middleware/workspaceRouteContext.d.ts.map +1 -0
  1105. package/dist/middleware/workspaceRouteContext.js +44 -0
  1106. package/dist/middleware/workspaceRouteContext.js.map +1 -0
  1107. package/dist/models/sessionSchema.d.ts +106 -0
  1108. package/dist/models/sessionSchema.d.ts.map +1 -0
  1109. package/dist/models/sessionSchema.js +6 -0
  1110. package/dist/models/sessionSchema.js.map +1 -0
  1111. package/dist/routes/agentLogsRoutes.d.ts +3 -0
  1112. package/dist/routes/agentLogsRoutes.d.ts.map +1 -0
  1113. package/dist/routes/agentLogsRoutes.js +283 -0
  1114. package/dist/routes/agentLogsRoutes.js.map +1 -0
  1115. package/dist/routes/agentQuickSceneRoutes.d.ts +9 -0
  1116. package/dist/routes/agentQuickSceneRoutes.d.ts.map +1 -0
  1117. package/dist/routes/agentQuickSceneRoutes.js +51 -0
  1118. package/dist/routes/agentQuickSceneRoutes.js.map +1 -0
  1119. package/dist/routes/agentReportRoutes.d.ts +11 -0
  1120. package/dist/routes/agentReportRoutes.d.ts.map +1 -0
  1121. package/dist/routes/agentReportRoutes.js +100 -0
  1122. package/dist/routes/agentReportRoutes.js.map +1 -0
  1123. package/dist/routes/agentResumeRoutes.d.ts +14 -0
  1124. package/dist/routes/agentResumeRoutes.d.ts.map +1 -0
  1125. package/dist/routes/agentResumeRoutes.js +263 -0
  1126. package/dist/routes/agentResumeRoutes.js.map +1 -0
  1127. package/dist/routes/agentRoutes.d.ts +3 -0
  1128. package/dist/routes/agentRoutes.d.ts.map +1 -0
  1129. package/dist/routes/agentRoutes.js +4349 -0
  1130. package/dist/routes/agentRoutes.js.map +1 -0
  1131. package/dist/routes/agentSceneReconstructRoutes.d.ts +68 -0
  1132. package/dist/routes/agentSceneReconstructRoutes.d.ts.map +1 -0
  1133. package/dist/routes/agentSceneReconstructRoutes.js +448 -0
  1134. package/dist/routes/agentSceneReconstructRoutes.js.map +1 -0
  1135. package/dist/routes/agentSessionCatalogRoutes.d.ts +20 -0
  1136. package/dist/routes/agentSessionCatalogRoutes.d.ts.map +1 -0
  1137. package/dist/routes/agentSessionCatalogRoutes.js +90 -0
  1138. package/dist/routes/agentSessionCatalogRoutes.js.map +1 -0
  1139. package/dist/routes/agentTeachingRoutes.d.ts +3 -0
  1140. package/dist/routes/agentTeachingRoutes.d.ts.map +1 -0
  1141. package/dist/routes/agentTeachingRoutes.js +62 -0
  1142. package/dist/routes/agentTeachingRoutes.js.map +1 -0
  1143. package/dist/routes/analysisResultRoutes.d.ts +3 -0
  1144. package/dist/routes/analysisResultRoutes.d.ts.map +1 -0
  1145. package/dist/routes/analysisResultRoutes.js +216 -0
  1146. package/dist/routes/analysisResultRoutes.js.map +1 -0
  1147. package/dist/routes/baselineRoutes.d.ts +29 -0
  1148. package/dist/routes/baselineRoutes.d.ts.map +1 -0
  1149. package/dist/routes/baselineRoutes.js +123 -0
  1150. package/dist/routes/baselineRoutes.js.map +1 -0
  1151. package/dist/routes/caseRoutes.d.ts +29 -0
  1152. package/dist/routes/caseRoutes.d.ts.map +1 -0
  1153. package/dist/routes/caseRoutes.js +194 -0
  1154. package/dist/routes/caseRoutes.js.map +1 -0
  1155. package/dist/routes/ciGateRoutes.d.ts +11 -0
  1156. package/dist/routes/ciGateRoutes.d.ts.map +1 -0
  1157. package/dist/routes/ciGateRoutes.js +363 -0
  1158. package/dist/routes/ciGateRoutes.js.map +1 -0
  1159. package/dist/routes/comparisonRoutes.d.ts +3 -0
  1160. package/dist/routes/comparisonRoutes.d.ts.map +1 -0
  1161. package/dist/routes/comparisonRoutes.js +536 -0
  1162. package/dist/routes/comparisonRoutes.js.map +1 -0
  1163. package/dist/routes/criticalPathRoutes.d.ts +3 -0
  1164. package/dist/routes/criticalPathRoutes.d.ts.map +1 -0
  1165. package/dist/routes/criticalPathRoutes.js +88 -0
  1166. package/dist/routes/criticalPathRoutes.js.map +1 -0
  1167. package/dist/routes/enterpriseApiKeyRoutes.d.ts +9 -0
  1168. package/dist/routes/enterpriseApiKeyRoutes.d.ts.map +1 -0
  1169. package/dist/routes/enterpriseApiKeyRoutes.js +126 -0
  1170. package/dist/routes/enterpriseApiKeyRoutes.js.map +1 -0
  1171. package/dist/routes/enterpriseAuthRoutes.d.ts +18 -0
  1172. package/dist/routes/enterpriseAuthRoutes.d.ts.map +1 -0
  1173. package/dist/routes/enterpriseAuthRoutes.js +160 -0
  1174. package/dist/routes/enterpriseAuthRoutes.js.map +1 -0
  1175. package/dist/routes/enterpriseRuntimeDashboardRoutes.d.ts +6 -0
  1176. package/dist/routes/enterpriseRuntimeDashboardRoutes.d.ts.map +1 -0
  1177. package/dist/routes/enterpriseRuntimeDashboardRoutes.js +32 -0
  1178. package/dist/routes/enterpriseRuntimeDashboardRoutes.js.map +1 -0
  1179. package/dist/routes/enterpriseTenantRoutes.d.ts +4 -0
  1180. package/dist/routes/enterpriseTenantRoutes.d.ts.map +1 -0
  1181. package/dist/routes/enterpriseTenantRoutes.js +313 -0
  1182. package/dist/routes/enterpriseTenantRoutes.js.map +1 -0
  1183. package/dist/routes/exportRoutes.d.ts +3 -0
  1184. package/dist/routes/exportRoutes.d.ts.map +1 -0
  1185. package/dist/routes/exportRoutes.js +196 -0
  1186. package/dist/routes/exportRoutes.js.map +1 -0
  1187. package/dist/routes/flamegraphRoutes.d.ts +3 -0
  1188. package/dist/routes/flamegraphRoutes.d.ts.map +1 -0
  1189. package/dist/routes/flamegraphRoutes.js +99 -0
  1190. package/dist/routes/flamegraphRoutes.js.map +1 -0
  1191. package/dist/routes/memoryRoutes.d.ts +31 -0
  1192. package/dist/routes/memoryRoutes.d.ts.map +1 -0
  1193. package/dist/routes/memoryRoutes.js +150 -0
  1194. package/dist/routes/memoryRoutes.js.map +1 -0
  1195. package/dist/routes/narrativeSanitizer.d.ts +2 -0
  1196. package/dist/routes/narrativeSanitizer.d.ts.map +1 -0
  1197. package/dist/routes/narrativeSanitizer.js +167 -0
  1198. package/dist/routes/narrativeSanitizer.js.map +1 -0
  1199. package/dist/routes/perfettoLocalRoutes.d.ts +3 -0
  1200. package/dist/routes/perfettoLocalRoutes.d.ts.map +1 -0
  1201. package/dist/routes/perfettoLocalRoutes.js +222 -0
  1202. package/dist/routes/perfettoLocalRoutes.js.map +1 -0
  1203. package/dist/routes/perfettoSqlRoutes.d.ts +7 -0
  1204. package/dist/routes/perfettoSqlRoutes.d.ts.map +1 -0
  1205. package/dist/routes/perfettoSqlRoutes.js +738 -0
  1206. package/dist/routes/perfettoSqlRoutes.js.map +1 -0
  1207. package/dist/routes/providerRoutes.d.ts +3 -0
  1208. package/dist/routes/providerRoutes.d.ts.map +1 -0
  1209. package/dist/routes/providerRoutes.js +219 -0
  1210. package/dist/routes/providerRoutes.js.map +1 -0
  1211. package/dist/routes/ragAdminRoutes.d.ts +30 -0
  1212. package/dist/routes/ragAdminRoutes.d.ts.map +1 -0
  1213. package/dist/routes/ragAdminRoutes.js +93 -0
  1214. package/dist/routes/ragAdminRoutes.js.map +1 -0
  1215. package/dist/routes/reportRoutes.d.ts +17 -0
  1216. package/dist/routes/reportRoutes.d.ts.map +1 -0
  1217. package/dist/routes/reportRoutes.js +579 -0
  1218. package/dist/routes/reportRoutes.js.map +1 -0
  1219. package/dist/routes/sessionRoutes.d.ts +3 -0
  1220. package/dist/routes/sessionRoutes.d.ts.map +1 -0
  1221. package/dist/routes/sessionRoutes.js +144 -0
  1222. package/dist/routes/sessionRoutes.js.map +1 -0
  1223. package/dist/routes/simpleTraceRoutes.d.ts +3 -0
  1224. package/dist/routes/simpleTraceRoutes.d.ts.map +1 -0
  1225. package/dist/routes/simpleTraceRoutes.js +1131 -0
  1226. package/dist/routes/simpleTraceRoutes.js.map +1 -0
  1227. package/dist/routes/skillAdminRoutes.d.ts +3 -0
  1228. package/dist/routes/skillAdminRoutes.d.ts.map +1 -0
  1229. package/dist/routes/skillAdminRoutes.js +100 -0
  1230. package/dist/routes/skillAdminRoutes.js.map +1 -0
  1231. package/dist/routes/skillRoutes.d.ts +3 -0
  1232. package/dist/routes/skillRoutes.d.ts.map +1 -0
  1233. package/dist/routes/skillRoutes.js +88 -0
  1234. package/dist/routes/skillRoutes.js.map +1 -0
  1235. package/dist/routes/sql.d.ts +3 -0
  1236. package/dist/routes/sql.d.ts.map +1 -0
  1237. package/dist/routes/sql.js +19 -0
  1238. package/dist/routes/sql.js.map +1 -0
  1239. package/dist/routes/strategyAdminRoutes.d.ts +3 -0
  1240. package/dist/routes/strategyAdminRoutes.d.ts.map +1 -0
  1241. package/dist/routes/strategyAdminRoutes.js +65 -0
  1242. package/dist/routes/strategyAdminRoutes.js.map +1 -0
  1243. package/dist/routes/templateAnalysisRoutes.d.ts +3 -0
  1244. package/dist/routes/templateAnalysisRoutes.d.ts.map +1 -0
  1245. package/dist/routes/templateAnalysisRoutes.js +173 -0
  1246. package/dist/routes/templateAnalysisRoutes.js.map +1 -0
  1247. package/dist/routes/trace.d.ts +3 -0
  1248. package/dist/routes/trace.d.ts.map +1 -0
  1249. package/dist/routes/trace.js +48 -0
  1250. package/dist/routes/trace.js.map +1 -0
  1251. package/dist/routes/traceProcessorProxyRoutes.d.ts +6 -0
  1252. package/dist/routes/traceProcessorProxyRoutes.d.ts.map +1 -0
  1253. package/dist/routes/traceProcessorProxyRoutes.js +607 -0
  1254. package/dist/routes/traceProcessorProxyRoutes.js.map +1 -0
  1255. package/dist/routes/traceProcessorRoutes.d.ts +3 -0
  1256. package/dist/routes/traceProcessorRoutes.d.ts.map +1 -0
  1257. package/dist/routes/traceProcessorRoutes.js +40 -0
  1258. package/dist/routes/traceProcessorRoutes.js.map +1 -0
  1259. package/dist/routes/workspaceWindowRoutes.d.ts +3 -0
  1260. package/dist/routes/workspaceWindowRoutes.d.ts.map +1 -0
  1261. package/dist/routes/workspaceWindowRoutes.js +146 -0
  1262. package/dist/routes/workspaceWindowRoutes.js.map +1 -0
  1263. package/dist/runtimePaths.d.ts +3 -0
  1264. package/dist/runtimePaths.d.ts.map +1 -0
  1265. package/dist/runtimePaths.js +20 -0
  1266. package/dist/runtimePaths.js.map +1 -0
  1267. package/dist/scripts/analyzeComprehensiveTrace.d.ts +2 -0
  1268. package/dist/scripts/analyzeComprehensiveTrace.d.ts.map +1 -0
  1269. package/dist/scripts/analyzeComprehensiveTrace.js +210 -0
  1270. package/dist/scripts/analyzeComprehensiveTrace.js.map +1 -0
  1271. package/dist/scripts/analyzeUserTrace.d.ts +2 -0
  1272. package/dist/scripts/analyzeUserTrace.d.ts.map +1 -0
  1273. package/dist/scripts/analyzeUserTrace.js +170 -0
  1274. package/dist/scripts/analyzeUserTrace.js.map +1 -0
  1275. package/dist/scripts/auditTraceProcessorRssMatrix.d.ts +49 -0
  1276. package/dist/scripts/auditTraceProcessorRssMatrix.d.ts.map +1 -0
  1277. package/dist/scripts/auditTraceProcessorRssMatrix.js +390 -0
  1278. package/dist/scripts/auditTraceProcessorRssMatrix.js.map +1 -0
  1279. package/dist/scripts/benchmarkTraceProcessorRss.d.ts +96 -0
  1280. package/dist/scripts/benchmarkTraceProcessorRss.d.ts.map +1 -0
  1281. package/dist/scripts/benchmarkTraceProcessorRss.js +569 -0
  1282. package/dist/scripts/benchmarkTraceProcessorRss.js.map +1 -0
  1283. package/dist/scripts/captureContextEngineeringBaseline.d.ts +2 -0
  1284. package/dist/scripts/captureContextEngineeringBaseline.d.ts.map +1 -0
  1285. package/dist/scripts/captureContextEngineeringBaseline.js +271 -0
  1286. package/dist/scripts/captureContextEngineeringBaseline.js.map +1 -0
  1287. package/dist/scripts/checkTables.d.ts +2 -0
  1288. package/dist/scripts/checkTables.d.ts.map +1 -0
  1289. package/dist/scripts/checkTables.js +22 -0
  1290. package/dist/scripts/checkTables.js.map +1 -0
  1291. package/dist/scripts/diagnoseJankDetection.d.ts +2 -0
  1292. package/dist/scripts/diagnoseJankDetection.d.ts.map +1 -0
  1293. package/dist/scripts/diagnoseJankDetection.js +314 -0
  1294. package/dist/scripts/diagnoseJankDetection.js.map +1 -0
  1295. package/dist/scripts/diagnoseTrace.d.ts +2 -0
  1296. package/dist/scripts/diagnoseTrace.d.ts.map +1 -0
  1297. package/dist/scripts/diagnoseTrace.js +74 -0
  1298. package/dist/scripts/diagnoseTrace.js.map +1 -0
  1299. package/dist/scripts/enterpriseAcceptanceLoadTest.d.ts +193 -0
  1300. package/dist/scripts/enterpriseAcceptanceLoadTest.d.ts.map +1 -0
  1301. package/dist/scripts/enterpriseAcceptanceLoadTest.js +912 -0
  1302. package/dist/scripts/enterpriseAcceptanceLoadTest.js.map +1 -0
  1303. package/dist/scripts/enterpriseMigrationSnapshot.d.ts +3 -0
  1304. package/dist/scripts/enterpriseMigrationSnapshot.d.ts.map +1 -0
  1305. package/dist/scripts/enterpriseMigrationSnapshot.js +57 -0
  1306. package/dist/scripts/enterpriseMigrationSnapshot.js.map +1 -0
  1307. package/dist/scripts/enterpriseReadinessAudit.d.ts +30 -0
  1308. package/dist/scripts/enterpriseReadinessAudit.d.ts.map +1 -0
  1309. package/dist/scripts/enterpriseReadinessAudit.js +743 -0
  1310. package/dist/scripts/enterpriseReadinessAudit.js.map +1 -0
  1311. package/dist/scripts/enterpriseRssBenchmarkMatrix.d.ts +6 -0
  1312. package/dist/scripts/enterpriseRssBenchmarkMatrix.d.ts.map +1 -0
  1313. package/dist/scripts/enterpriseRssBenchmarkMatrix.js +20 -0
  1314. package/dist/scripts/enterpriseRssBenchmarkMatrix.js.map +1 -0
  1315. package/dist/scripts/enterpriseRuntimeIsolationChecklist.d.ts +22 -0
  1316. package/dist/scripts/enterpriseRuntimeIsolationChecklist.d.ts.map +1 -0
  1317. package/dist/scripts/enterpriseRuntimeIsolationChecklist.js +374 -0
  1318. package/dist/scripts/enterpriseRuntimeIsolationChecklist.js.map +1 -0
  1319. package/dist/scripts/enterpriseSecurityAuditChecklist.d.ts +20 -0
  1320. package/dist/scripts/enterpriseSecurityAuditChecklist.d.ts.map +1 -0
  1321. package/dist/scripts/enterpriseSecurityAuditChecklist.js +113 -0
  1322. package/dist/scripts/enterpriseSecurityAuditChecklist.js.map +1 -0
  1323. package/dist/scripts/probeStdlibSchema.d.ts +2 -0
  1324. package/dist/scripts/probeStdlibSchema.d.ts.map +1 -0
  1325. package/dist/scripts/probeStdlibSchema.js +209 -0
  1326. package/dist/scripts/probeStdlibSchema.js.map +1 -0
  1327. package/dist/scripts/runAgentTest.d.ts +2 -0
  1328. package/dist/scripts/runAgentTest.d.ts.map +1 -0
  1329. package/dist/scripts/runAgentTest.js +149 -0
  1330. package/dist/scripts/runAgentTest.js.map +1 -0
  1331. package/dist/scripts/runScrollingTest.d.ts +2 -0
  1332. package/dist/scripts/runScrollingTest.d.ts.map +1 -0
  1333. package/dist/scripts/runScrollingTest.js +199 -0
  1334. package/dist/scripts/runScrollingTest.js.map +1 -0
  1335. package/dist/scripts/runScrollingTestRealData.d.ts +2 -0
  1336. package/dist/scripts/runScrollingTestRealData.d.ts.map +1 -0
  1337. package/dist/scripts/runScrollingTestRealData.js +121 -0
  1338. package/dist/scripts/runScrollingTestRealData.js.map +1 -0
  1339. package/dist/scripts/testAndroidTrace.d.ts +2 -0
  1340. package/dist/scripts/testAndroidTrace.d.ts.map +1 -0
  1341. package/dist/scripts/testAndroidTrace.js +21 -0
  1342. package/dist/scripts/testAndroidTrace.js.map +1 -0
  1343. package/dist/scripts/testCrossDomainExpert.d.ts +2 -0
  1344. package/dist/scripts/testCrossDomainExpert.d.ts.map +1 -0
  1345. package/dist/scripts/testCrossDomainExpert.js +288 -0
  1346. package/dist/scripts/testCrossDomainExpert.js.map +1 -0
  1347. package/dist/scripts/testCrossDomainIntegration.d.ts +2 -0
  1348. package/dist/scripts/testCrossDomainIntegration.d.ts.map +1 -0
  1349. package/dist/scripts/testCrossDomainIntegration.js +282 -0
  1350. package/dist/scripts/testCrossDomainIntegration.js.map +1 -0
  1351. package/dist/scripts/testDeepLayerFix.d.ts +2 -0
  1352. package/dist/scripts/testDeepLayerFix.d.ts.map +1 -0
  1353. package/dist/scripts/testDeepLayerFix.js +137 -0
  1354. package/dist/scripts/testDeepLayerFix.js.map +1 -0
  1355. package/dist/scripts/testHtmlReportGen.d.ts +2 -0
  1356. package/dist/scripts/testHtmlReportGen.d.ts.map +1 -0
  1357. package/dist/scripts/testHtmlReportGen.js +148 -0
  1358. package/dist/scripts/testHtmlReportGen.js.map +1 -0
  1359. package/dist/scripts/verifyAgentSseScrolling.d.ts +2 -0
  1360. package/dist/scripts/verifyAgentSseScrolling.d.ts.map +1 -0
  1361. package/dist/scripts/verifyAgentSseScrolling.js +558 -0
  1362. package/dist/scripts/verifyAgentSseScrolling.js.map +1 -0
  1363. package/dist/scripts/verifyCriticalPathE2E.d.ts +2 -0
  1364. package/dist/scripts/verifyCriticalPathE2E.d.ts.map +1 -0
  1365. package/dist/scripts/verifyCriticalPathE2E.js +171 -0
  1366. package/dist/scripts/verifyCriticalPathE2E.js.map +1 -0
  1367. package/dist/scripts/verifyEnterpriseMultiTenantWindows.d.ts +24 -0
  1368. package/dist/scripts/verifyEnterpriseMultiTenantWindows.d.ts.map +1 -0
  1369. package/dist/scripts/verifyEnterpriseMultiTenantWindows.js +1363 -0
  1370. package/dist/scripts/verifyEnterpriseMultiTenantWindows.js.map +1 -0
  1371. package/dist/services/adb/adbContextDetector.d.ts +3 -0
  1372. package/dist/services/adb/adbContextDetector.d.ts.map +1 -0
  1373. package/dist/services/adb/adbContextDetector.js +151 -0
  1374. package/dist/services/adb/adbContextDetector.js.map +1 -0
  1375. package/dist/services/adb/adbService.d.ts +28 -0
  1376. package/dist/services/adb/adbService.d.ts.map +1 -0
  1377. package/dist/services/adb/adbService.js +238 -0
  1378. package/dist/services/adb/adbService.js.map +1 -0
  1379. package/dist/services/adb/index.d.ts +5 -0
  1380. package/dist/services/adb/index.d.ts.map +1 -0
  1381. package/dist/services/adb/index.js +24 -0
  1382. package/dist/services/adb/index.js.map +1 -0
  1383. package/dist/services/adb/traceDeviceMatcher.d.ts +12 -0
  1384. package/dist/services/adb/traceDeviceMatcher.d.ts.map +1 -0
  1385. package/dist/services/adb/traceDeviceMatcher.js +149 -0
  1386. package/dist/services/adb/traceDeviceMatcher.js.map +1 -0
  1387. package/dist/services/adb/types.d.ts +69 -0
  1388. package/dist/services/adb/types.d.ts.map +1 -0
  1389. package/dist/services/adb/types.js +6 -0
  1390. package/dist/services/adb/types.js.map +1 -0
  1391. package/dist/services/agentEventStore.d.ts +17 -0
  1392. package/dist/services/agentEventStore.d.ts.map +1 -0
  1393. package/dist/services/agentEventStore.js +139 -0
  1394. package/dist/services/agentEventStore.js.map +1 -0
  1395. package/dist/services/agentReportData.d.ts +42 -0
  1396. package/dist/services/agentReportData.d.ts.map +1 -0
  1397. package/dist/services/agentReportData.js +81 -0
  1398. package/dist/services/agentReportData.js.map +1 -0
  1399. package/dist/services/agentResultNormalizer.d.ts +33 -0
  1400. package/dist/services/agentResultNormalizer.d.ts.map +1 -0
  1401. package/dist/services/agentResultNormalizer.js +92 -0
  1402. package/dist/services/agentResultNormalizer.js.map +1 -0
  1403. package/dist/services/analysisResultSnapshotPipeline.d.ts +24 -0
  1404. package/dist/services/analysisResultSnapshotPipeline.d.ts.map +1 -0
  1405. package/dist/services/analysisResultSnapshotPipeline.js +466 -0
  1406. package/dist/services/analysisResultSnapshotPipeline.js.map +1 -0
  1407. package/dist/services/analysisResultSnapshotStore.d.ts +29 -0
  1408. package/dist/services/analysisResultSnapshotStore.d.ts.map +1 -0
  1409. package/dist/services/analysisResultSnapshotStore.js +457 -0
  1410. package/dist/services/analysisResultSnapshotStore.js.map +1 -0
  1411. package/dist/services/analysisResultWindowStateStore.d.ts +37 -0
  1412. package/dist/services/analysisResultWindowStateStore.d.ts.map +1 -0
  1413. package/dist/services/analysisResultWindowStateStore.js +190 -0
  1414. package/dist/services/analysisResultWindowStateStore.js.map +1 -0
  1415. package/dist/services/analysisRunStore.d.ts +38 -0
  1416. package/dist/services/analysisRunStore.d.ts.map +1 -0
  1417. package/dist/services/analysisRunStore.js +195 -0
  1418. package/dist/services/analysisRunStore.js.map +1 -0
  1419. package/dist/services/analysisTemplates/cpuCoreAnalysis.d.ts +70 -0
  1420. package/dist/services/analysisTemplates/cpuCoreAnalysis.d.ts.map +1 -0
  1421. package/dist/services/analysisTemplates/cpuCoreAnalysis.js +277 -0
  1422. package/dist/services/analysisTemplates/cpuCoreAnalysis.js.map +1 -0
  1423. package/dist/services/analysisTemplates/fourQuadrantAnalysis.d.ts +64 -0
  1424. package/dist/services/analysisTemplates/fourQuadrantAnalysis.d.ts.map +1 -0
  1425. package/dist/services/analysisTemplates/fourQuadrantAnalysis.js +288 -0
  1426. package/dist/services/analysisTemplates/fourQuadrantAnalysis.js.map +1 -0
  1427. package/dist/services/analysisTemplates/frameStatsAnalysis.d.ts +77 -0
  1428. package/dist/services/analysisTemplates/frameStatsAnalysis.d.ts.map +1 -0
  1429. package/dist/services/analysisTemplates/frameStatsAnalysis.js +232 -0
  1430. package/dist/services/analysisTemplates/frameStatsAnalysis.js.map +1 -0
  1431. package/dist/services/analysisTemplates/templateManager.d.ts +70 -0
  1432. package/dist/services/analysisTemplates/templateManager.d.ts.map +1 -0
  1433. package/dist/services/analysisTemplates/templateManager.js +293 -0
  1434. package/dist/services/analysisTemplates/templateManager.js.map +1 -0
  1435. package/dist/services/anonymizer.d.ts +61 -0
  1436. package/dist/services/anonymizer.d.ts.map +1 -0
  1437. package/dist/services/anonymizer.js +232 -0
  1438. package/dist/services/anonymizer.js.map +1 -0
  1439. package/dist/services/aospKnowledgeIngester.d.ts +67 -0
  1440. package/dist/services/aospKnowledgeIngester.d.ts.map +1 -0
  1441. package/dist/services/aospKnowledgeIngester.js +171 -0
  1442. package/dist/services/aospKnowledgeIngester.js.map +1 -0
  1443. package/dist/services/artifactCompression.d.ts +52 -0
  1444. package/dist/services/artifactCompression.d.ts.map +1 -0
  1445. package/dist/services/artifactCompression.js +215 -0
  1446. package/dist/services/artifactCompression.js.map +1 -0
  1447. package/dist/services/baselineDiffer.d.ts +85 -0
  1448. package/dist/services/baselineDiffer.d.ts.map +1 -0
  1449. package/dist/services/baselineDiffer.js +287 -0
  1450. package/dist/services/baselineDiffer.js.map +1 -0
  1451. package/dist/services/baselineStore.d.ts +52 -0
  1452. package/dist/services/baselineStore.d.ts.map +1 -0
  1453. package/dist/services/baselineStore.js +224 -0
  1454. package/dist/services/baselineStore.js.map +1 -0
  1455. package/dist/services/binderRootCauseChain.d.ts +38 -0
  1456. package/dist/services/binderRootCauseChain.d.ts.map +1 -0
  1457. package/dist/services/binderRootCauseChain.js +74 -0
  1458. package/dist/services/binderRootCauseChain.js.map +1 -0
  1459. package/dist/services/blogKnowledgeIngester.d.ts +89 -0
  1460. package/dist/services/blogKnowledgeIngester.d.ts.map +1 -0
  1461. package/dist/services/blogKnowledgeIngester.js +192 -0
  1462. package/dist/services/blogKnowledgeIngester.js.map +1 -0
  1463. package/dist/services/caseGraph.d.ts +55 -0
  1464. package/dist/services/caseGraph.d.ts.map +1 -0
  1465. package/dist/services/caseGraph.js +260 -0
  1466. package/dist/services/caseGraph.js.map +1 -0
  1467. package/dist/services/caseLibrary.d.ts +61 -0
  1468. package/dist/services/caseLibrary.d.ts.map +1 -0
  1469. package/dist/services/caseLibrary.js +269 -0
  1470. package/dist/services/caseLibrary.js.map +1 -0
  1471. package/dist/services/ciGateRunStore.d.ts +39 -0
  1472. package/dist/services/ciGateRunStore.d.ts.map +1 -0
  1473. package/dist/services/ciGateRunStore.js +208 -0
  1474. package/dist/services/ciGateRunStore.js.map +1 -0
  1475. package/dist/services/comparisonAiConclusionService.d.ts +23 -0
  1476. package/dist/services/comparisonAiConclusionService.d.ts.map +1 -0
  1477. package/dist/services/comparisonAiConclusionService.js +207 -0
  1478. package/dist/services/comparisonAiConclusionService.js.map +1 -0
  1479. package/dist/services/comparisonAppendixService.d.ts +50 -0
  1480. package/dist/services/comparisonAppendixService.d.ts.map +1 -0
  1481. package/dist/services/comparisonAppendixService.js +276 -0
  1482. package/dist/services/comparisonAppendixService.js.map +1 -0
  1483. package/dist/services/comparisonHtmlReportService.d.ts +20 -0
  1484. package/dist/services/comparisonHtmlReportService.d.ts.map +1 -0
  1485. package/dist/services/comparisonHtmlReportService.js +214 -0
  1486. package/dist/services/comparisonHtmlReportService.js.map +1 -0
  1487. package/dist/services/comparisonMatrixService.d.ts +7 -0
  1488. package/dist/services/comparisonMatrixService.d.ts.map +1 -0
  1489. package/dist/services/comparisonMatrixService.js +211 -0
  1490. package/dist/services/comparisonMatrixService.js.map +1 -0
  1491. package/dist/services/comparisonResultService.d.ts +13 -0
  1492. package/dist/services/comparisonResultService.d.ts.map +1 -0
  1493. package/dist/services/comparisonResultService.js +99 -0
  1494. package/dist/services/comparisonResultService.js.map +1 -0
  1495. package/dist/services/comparisonSignificance.d.ts +3 -0
  1496. package/dist/services/comparisonSignificance.d.ts.map +1 -0
  1497. package/dist/services/comparisonSignificance.js +42 -0
  1498. package/dist/services/comparisonSignificance.js.map +1 -0
  1499. package/dist/services/cpuThermalPmu.d.ts +38 -0
  1500. package/dist/services/cpuThermalPmu.d.ts.map +1 -0
  1501. package/dist/services/cpuThermalPmu.js +141 -0
  1502. package/dist/services/cpuThermalPmu.js.map +1 -0
  1503. package/dist/services/criticalPathAiSummary.d.ts +29 -0
  1504. package/dist/services/criticalPathAiSummary.d.ts.map +1 -0
  1505. package/dist/services/criticalPathAiSummary.js +310 -0
  1506. package/dist/services/criticalPathAiSummary.js.map +1 -0
  1507. package/dist/services/criticalPathAnalyzer.d.ts +108 -0
  1508. package/dist/services/criticalPathAnalyzer.d.ts.map +1 -0
  1509. package/dist/services/criticalPathAnalyzer.js +880 -0
  1510. package/dist/services/criticalPathAnalyzer.js.map +1 -0
  1511. package/dist/services/criticalPathQuantify.d.ts +70 -0
  1512. package/dist/services/criticalPathQuantify.d.ts.map +1 -0
  1513. package/dist/services/criticalPathQuantify.js +214 -0
  1514. package/dist/services/criticalPathQuantify.js.map +1 -0
  1515. package/dist/services/criticalPathSemantics.d.ts +95 -0
  1516. package/dist/services/criticalPathSemantics.d.ts.map +1 -0
  1517. package/dist/services/criticalPathSemantics.js +453 -0
  1518. package/dist/services/criticalPathSemantics.js.map +1 -0
  1519. package/dist/services/criticalPathWakerChain.d.ts +38 -0
  1520. package/dist/services/criticalPathWakerChain.d.ts.map +1 -0
  1521. package/dist/services/criticalPathWakerChain.js +144 -0
  1522. package/dist/services/criticalPathWakerChain.js.map +1 -0
  1523. package/dist/services/domainSkillEvalHarness.d.ts +51 -0
  1524. package/dist/services/domainSkillEvalHarness.d.ts.map +1 -0
  1525. package/dist/services/domainSkillEvalHarness.js +141 -0
  1526. package/dist/services/domainSkillEvalHarness.js.map +1 -0
  1527. package/dist/services/enhancedAIService.d.ts +81 -0
  1528. package/dist/services/enhancedAIService.d.ts.map +1 -0
  1529. package/dist/services/enhancedAIService.js +277 -0
  1530. package/dist/services/enhancedAIService.js.map +1 -0
  1531. package/dist/services/enterpriseAdminControlPlaneService.d.ts +124 -0
  1532. package/dist/services/enterpriseAdminControlPlaneService.d.ts.map +1 -0
  1533. package/dist/services/enterpriseAdminControlPlaneService.js +323 -0
  1534. package/dist/services/enterpriseAdminControlPlaneService.js.map +1 -0
  1535. package/dist/services/enterpriseApiKeyService.d.ts +56 -0
  1536. package/dist/services/enterpriseApiKeyService.d.ts.map +1 -0
  1537. package/dist/services/enterpriseApiKeyService.js +260 -0
  1538. package/dist/services/enterpriseApiKeyService.js.map +1 -0
  1539. package/dist/services/enterpriseAuditService.d.ts +30 -0
  1540. package/dist/services/enterpriseAuditService.d.ts.map +1 -0
  1541. package/dist/services/enterpriseAuditService.js +73 -0
  1542. package/dist/services/enterpriseAuditService.js.map +1 -0
  1543. package/dist/services/enterpriseDb.d.ts +5 -0
  1544. package/dist/services/enterpriseDb.d.ts.map +1 -0
  1545. package/dist/services/enterpriseDb.js +33 -0
  1546. package/dist/services/enterpriseDb.js.map +1 -0
  1547. package/dist/services/enterpriseMigration.d.ts +89 -0
  1548. package/dist/services/enterpriseMigration.d.ts.map +1 -0
  1549. package/dist/services/enterpriseMigration.js +506 -0
  1550. package/dist/services/enterpriseMigration.js.map +1 -0
  1551. package/dist/services/enterpriseOidcClient.d.ts +36 -0
  1552. package/dist/services/enterpriseOidcClient.d.ts.map +1 -0
  1553. package/dist/services/enterpriseOidcClient.js +124 -0
  1554. package/dist/services/enterpriseOidcClient.js.map +1 -0
  1555. package/dist/services/enterpriseQuotaPolicyService.d.ts +37 -0
  1556. package/dist/services/enterpriseQuotaPolicyService.d.ts.map +1 -0
  1557. package/dist/services/enterpriseQuotaPolicyService.js +198 -0
  1558. package/dist/services/enterpriseQuotaPolicyService.js.map +1 -0
  1559. package/dist/services/enterpriseRepository.d.ts +36 -0
  1560. package/dist/services/enterpriseRepository.d.ts.map +1 -0
  1561. package/dist/services/enterpriseRepository.js +208 -0
  1562. package/dist/services/enterpriseRepository.js.map +1 -0
  1563. package/dist/services/enterpriseRuntimeDashboardService.d.ts +114 -0
  1564. package/dist/services/enterpriseRuntimeDashboardService.d.ts.map +1 -0
  1565. package/dist/services/enterpriseRuntimeDashboardService.js +205 -0
  1566. package/dist/services/enterpriseRuntimeDashboardService.js.map +1 -0
  1567. package/dist/services/enterpriseSchema.d.ts +7 -0
  1568. package/dist/services/enterpriseSchema.d.ts.map +1 -0
  1569. package/dist/services/enterpriseSchema.js +688 -0
  1570. package/dist/services/enterpriseSchema.js.map +1 -0
  1571. package/dist/services/enterpriseSsoService.d.ts +99 -0
  1572. package/dist/services/enterpriseSsoService.d.ts.map +1 -0
  1573. package/dist/services/enterpriseSsoService.js +538 -0
  1574. package/dist/services/enterpriseSsoService.js.map +1 -0
  1575. package/dist/services/enterpriseTenantExportService.d.ts +58 -0
  1576. package/dist/services/enterpriseTenantExportService.d.ts.map +1 -0
  1577. package/dist/services/enterpriseTenantExportService.js +339 -0
  1578. package/dist/services/enterpriseTenantExportService.js.map +1 -0
  1579. package/dist/services/enterpriseTenantLifecycleService.d.ts +52 -0
  1580. package/dist/services/enterpriseTenantLifecycleService.d.ts.map +1 -0
  1581. package/dist/services/enterpriseTenantLifecycleService.js +323 -0
  1582. package/dist/services/enterpriseTenantLifecycleService.js.map +1 -0
  1583. package/dist/services/flamegraphAiSummary.d.ts +4 -0
  1584. package/dist/services/flamegraphAiSummary.d.ts.map +1 -0
  1585. package/dist/services/flamegraphAiSummary.js +172 -0
  1586. package/dist/services/flamegraphAiSummary.js.map +1 -0
  1587. package/dist/services/flamegraphAnalyzer.d.ts +14 -0
  1588. package/dist/services/flamegraphAnalyzer.d.ts.map +1 -0
  1589. package/dist/services/flamegraphAnalyzer.js +607 -0
  1590. package/dist/services/flamegraphAnalyzer.js.map +1 -0
  1591. package/dist/services/flamegraphTypes.d.ts +106 -0
  1592. package/dist/services/flamegraphTypes.d.ts.map +1 -0
  1593. package/dist/services/flamegraphTypes.js +6 -0
  1594. package/dist/services/flamegraphTypes.js.map +1 -0
  1595. package/dist/services/gpuSurfaceFlinger.d.ts +27 -0
  1596. package/dist/services/gpuSurfaceFlinger.d.ts.map +1 -0
  1597. package/dist/services/gpuSurfaceFlinger.js +68 -0
  1598. package/dist/services/gpuSurfaceFlinger.js.map +1 -0
  1599. package/dist/services/htmlReportGenerator.d.ts +425 -0
  1600. package/dist/services/htmlReportGenerator.d.ts.map +1 -0
  1601. package/dist/services/htmlReportGenerator.js +5110 -0
  1602. package/dist/services/htmlReportGenerator.js.map +1 -0
  1603. package/dist/services/ioNetworkWakeup.d.ts +27 -0
  1604. package/dist/services/ioNetworkWakeup.d.ts.map +1 -0
  1605. package/dist/services/ioNetworkWakeup.js +68 -0
  1606. package/dist/services/ioNetworkWakeup.js.map +1 -0
  1607. package/dist/services/jankDecisionTree.d.ts +39 -0
  1608. package/dist/services/jankDecisionTree.d.ts.map +1 -0
  1609. package/dist/services/jankDecisionTree.js +230 -0
  1610. package/dist/services/jankDecisionTree.js.map +1 -0
  1611. package/dist/services/legacyApiTelemetry.d.ts +28 -0
  1612. package/dist/services/legacyApiTelemetry.d.ts.map +1 -0
  1613. package/dist/services/legacyApiTelemetry.js +157 -0
  1614. package/dist/services/legacyApiTelemetry.js.map +1 -0
  1615. package/dist/services/memoryRootCause.d.ts +24 -0
  1616. package/dist/services/memoryRootCause.d.ts.map +1 -0
  1617. package/dist/services/memoryRootCause.js +70 -0
  1618. package/dist/services/memoryRootCause.js.map +1 -0
  1619. package/dist/services/multiTraceComparisonStore.d.ts +28 -0
  1620. package/dist/services/multiTraceComparisonStore.d.ts.map +1 -0
  1621. package/dist/services/multiTraceComparisonStore.js +220 -0
  1622. package/dist/services/multiTraceComparisonStore.js.map +1 -0
  1623. package/dist/services/oemSdkKnowledgeIngester.d.ts +62 -0
  1624. package/dist/services/oemSdkKnowledgeIngester.d.ts.map +1 -0
  1625. package/dist/services/oemSdkKnowledgeIngester.js +154 -0
  1626. package/dist/services/oemSdkKnowledgeIngester.js.map +1 -0
  1627. package/dist/services/perfettoLocalService.d.ts +25 -0
  1628. package/dist/services/perfettoLocalService.d.ts.map +1 -0
  1629. package/dist/services/perfettoLocalService.js +213 -0
  1630. package/dist/services/perfettoLocalService.js.map +1 -0
  1631. package/dist/services/perfettoService.d.ts +39 -0
  1632. package/dist/services/perfettoService.d.ts.map +1 -0
  1633. package/dist/services/perfettoService.js +330 -0
  1634. package/dist/services/perfettoService.js.map +1 -0
  1635. package/dist/services/perfettoSqlDocs.d.ts +94 -0
  1636. package/dist/services/perfettoSqlDocs.d.ts.map +1 -0
  1637. package/dist/services/perfettoSqlDocs.js +222 -0
  1638. package/dist/services/perfettoSqlDocs.js.map +1 -0
  1639. package/dist/services/perfettoSqlSkill.d.ts +263 -0
  1640. package/dist/services/perfettoSqlSkill.d.ts.map +1 -0
  1641. package/dist/services/perfettoSqlSkill.js +3731 -0
  1642. package/dist/services/perfettoSqlSkill.js.map +1 -0
  1643. package/dist/services/perfettoStdlibScanner.d.ts +66 -0
  1644. package/dist/services/perfettoStdlibScanner.d.ts.map +1 -0
  1645. package/dist/services/perfettoStdlibScanner.js +345 -0
  1646. package/dist/services/perfettoStdlibScanner.js.map +1 -0
  1647. package/dist/services/persistAgentSession.d.ts +43 -0
  1648. package/dist/services/persistAgentSession.d.ts.map +1 -0
  1649. package/dist/services/persistAgentSession.js +146 -0
  1650. package/dist/services/persistAgentSession.js.map +1 -0
  1651. package/dist/services/pipelineDocService.d.ts +83 -0
  1652. package/dist/services/pipelineDocService.d.ts.map +1 -0
  1653. package/dist/services/pipelineDocService.js +417 -0
  1654. package/dist/services/pipelineDocService.js.map +1 -0
  1655. package/dist/services/pipelineSkillLoader.d.ts +173 -0
  1656. package/dist/services/pipelineSkillLoader.d.ts.map +1 -0
  1657. package/dist/services/pipelineSkillLoader.js +301 -0
  1658. package/dist/services/pipelineSkillLoader.js.map +1 -0
  1659. package/dist/services/portPool.d.ts +85 -0
  1660. package/dist/services/portPool.d.ts.map +1 -0
  1661. package/dist/services/portPool.js +221 -0
  1662. package/dist/services/portPool.js.map +1 -0
  1663. package/dist/services/processIdentity/identityGate.d.ts +27 -0
  1664. package/dist/services/processIdentity/identityGate.d.ts.map +1 -0
  1665. package/dist/services/processIdentity/identityGate.js +284 -0
  1666. package/dist/services/processIdentity/identityGate.js.map +1 -0
  1667. package/dist/services/processIdentity/types.d.ts +49 -0
  1668. package/dist/services/processIdentity/types.d.ts.map +1 -0
  1669. package/dist/services/processIdentity/types.js +16 -0
  1670. package/dist/services/processIdentity/types.js.map +1 -0
  1671. package/dist/services/processRss.d.ts +10 -0
  1672. package/dist/services/processRss.d.ts.map +1 -0
  1673. package/dist/services/processRss.js +78 -0
  1674. package/dist/services/processRss.js.map +1 -0
  1675. package/dist/services/promptTemplateService.d.ts +68 -0
  1676. package/dist/services/promptTemplateService.d.ts.map +1 -0
  1677. package/dist/services/promptTemplateService.js +196 -0
  1678. package/dist/services/promptTemplateService.js.map +1 -0
  1679. package/dist/services/providerManager/connectionTester.d.ts +3 -0
  1680. package/dist/services/providerManager/connectionTester.d.ts.map +1 -0
  1681. package/dist/services/providerManager/connectionTester.js +479 -0
  1682. package/dist/services/providerManager/connectionTester.js.map +1 -0
  1683. package/dist/services/providerManager/envIsolation.d.ts +3 -0
  1684. package/dist/services/providerManager/envIsolation.d.ts.map +1 -0
  1685. package/dist/services/providerManager/envIsolation.js +31 -0
  1686. package/dist/services/providerManager/envIsolation.js.map +1 -0
  1687. package/dist/services/providerManager/index.d.ts +9 -0
  1688. package/dist/services/providerManager/index.d.ts.map +1 -0
  1689. package/dist/services/providerManager/index.js +40 -0
  1690. package/dist/services/providerManager/index.js.map +1 -0
  1691. package/dist/services/providerManager/localSecretStore.d.ts +32 -0
  1692. package/dist/services/providerManager/localSecretStore.d.ts.map +1 -0
  1693. package/dist/services/providerManager/localSecretStore.js +338 -0
  1694. package/dist/services/providerManager/localSecretStore.js.map +1 -0
  1695. package/dist/services/providerManager/providerService.d.ts +31 -0
  1696. package/dist/services/providerManager/providerService.d.ts.map +1 -0
  1697. package/dist/services/providerManager/providerService.js +460 -0
  1698. package/dist/services/providerManager/providerService.js.map +1 -0
  1699. package/dist/services/providerManager/providerSnapshot.d.ts +30 -0
  1700. package/dist/services/providerManager/providerSnapshot.d.ts.map +1 -0
  1701. package/dist/services/providerManager/providerSnapshot.js +224 -0
  1702. package/dist/services/providerManager/providerSnapshot.js.map +1 -0
  1703. package/dist/services/providerManager/providerStore.d.ts +31 -0
  1704. package/dist/services/providerManager/providerStore.d.ts.map +1 -0
  1705. package/dist/services/providerManager/providerStore.js +553 -0
  1706. package/dist/services/providerManager/providerStore.js.map +1 -0
  1707. package/dist/services/providerManager/templates.d.ts +3 -0
  1708. package/dist/services/providerManager/templates.d.ts.map +1 -0
  1709. package/dist/services/providerManager/templates.js +328 -0
  1710. package/dist/services/providerManager/templates.js.map +1 -0
  1711. package/dist/services/providerManager/types.d.ts +119 -0
  1712. package/dist/services/providerManager/types.d.ts.map +1 -0
  1713. package/dist/services/providerManager/types.js +5 -0
  1714. package/dist/services/providerManager/types.js.map +1 -0
  1715. package/dist/services/ragStore.d.ts +60 -0
  1716. package/dist/services/ragStore.d.ts.map +1 -0
  1717. package/dist/services/ragStore.js +297 -0
  1718. package/dist/services/ragStore.js.map +1 -0
  1719. package/dist/services/rbac.d.ts +19 -0
  1720. package/dist/services/rbac.d.ts.map +1 -0
  1721. package/dist/services/rbac.js +153 -0
  1722. package/dist/services/rbac.js.map +1 -0
  1723. package/dist/services/renderingPipelineDetectionSkillGenerator.d.ts +3 -0
  1724. package/dist/services/renderingPipelineDetectionSkillGenerator.d.ts.map +1 -0
  1725. package/dist/services/renderingPipelineDetectionSkillGenerator.js +1120 -0
  1726. package/dist/services/renderingPipelineDetectionSkillGenerator.js.map +1 -0
  1727. package/dist/services/renderingPipelineTeachingService.d.ts +33 -0
  1728. package/dist/services/renderingPipelineTeachingService.d.ts.map +1 -0
  1729. package/dist/services/renderingPipelineTeachingService.js +1312 -0
  1730. package/dist/services/renderingPipelineTeachingService.js.map +1 -0
  1731. package/dist/services/reportCausalMapAssets.d.ts +3 -0
  1732. package/dist/services/reportCausalMapAssets.d.ts.map +1 -0
  1733. package/dist/services/reportCausalMapAssets.js +898 -0
  1734. package/dist/services/reportCausalMapAssets.js.map +1 -0
  1735. package/dist/services/reportGenerator.d.ts +54 -0
  1736. package/dist/services/reportGenerator.d.ts.map +1 -0
  1737. package/dist/services/reportGenerator.js +241 -0
  1738. package/dist/services/reportGenerator.js.map +1 -0
  1739. package/dist/services/resourceOwnership.d.ts +21 -0
  1740. package/dist/services/resourceOwnership.d.ts.map +1 -0
  1741. package/dist/services/resourceOwnership.js +50 -0
  1742. package/dist/services/resourceOwnership.js.map +1 -0
  1743. package/dist/services/resultExportService.d.ts +66 -0
  1744. package/dist/services/resultExportService.d.ts.map +1 -0
  1745. package/dist/services/resultExportService.js +170 -0
  1746. package/dist/services/resultExportService.js.map +1 -0
  1747. package/dist/services/runtimeSnapshotStore.d.ts +19 -0
  1748. package/dist/services/runtimeSnapshotStore.d.ts.map +1 -0
  1749. package/dist/services/runtimeSnapshotStore.js +222 -0
  1750. package/dist/services/runtimeSnapshotStore.js.map +1 -0
  1751. package/dist/services/sceneReport/sceneReportMemoryCache.d.ts +38 -0
  1752. package/dist/services/sceneReport/sceneReportMemoryCache.d.ts.map +1 -0
  1753. package/dist/services/sceneReport/sceneReportMemoryCache.js +55 -0
  1754. package/dist/services/sceneReport/sceneReportMemoryCache.js.map +1 -0
  1755. package/dist/services/sceneReport/sceneReportStore.d.ts +41 -0
  1756. package/dist/services/sceneReport/sceneReportStore.d.ts.map +1 -0
  1757. package/dist/services/sceneReport/sceneReportStore.js +248 -0
  1758. package/dist/services/sceneReport/sceneReportStore.js.map +1 -0
  1759. package/dist/services/scopedKnowledgeStore.d.ts +45 -0
  1760. package/dist/services/scopedKnowledgeStore.d.ts.map +1 -0
  1761. package/dist/services/scopedKnowledgeStore.js +225 -0
  1762. package/dist/services/scopedKnowledgeStore.js.map +1 -0
  1763. package/dist/services/sessionLogger.d.ts +142 -0
  1764. package/dist/services/sessionLogger.d.ts.map +1 -0
  1765. package/dist/services/sessionLogger.js +566 -0
  1766. package/dist/services/sessionLogger.js.map +1 -0
  1767. package/dist/services/sessionPersistenceService.d.ts +190 -0
  1768. package/dist/services/sessionPersistenceService.d.ts.map +1 -0
  1769. package/dist/services/sessionPersistenceService.js +737 -0
  1770. package/dist/services/sessionPersistenceService.js.map +1 -0
  1771. package/dist/services/skillEngine/answerGenerator.d.ts +102 -0
  1772. package/dist/services/skillEngine/answerGenerator.d.ts.map +1 -0
  1773. package/dist/services/skillEngine/answerGenerator.js +508 -0
  1774. package/dist/services/skillEngine/answerGenerator.js.map +1 -0
  1775. package/dist/services/skillEngine/displayContractValidator.d.ts +26 -0
  1776. package/dist/services/skillEngine/displayContractValidator.d.ts.map +1 -0
  1777. package/dist/services/skillEngine/displayContractValidator.js +232 -0
  1778. package/dist/services/skillEngine/displayContractValidator.js.map +1 -0
  1779. package/dist/services/skillEngine/eventCollector.d.ts +96 -0
  1780. package/dist/services/skillEngine/eventCollector.d.ts.map +1 -0
  1781. package/dist/services/skillEngine/eventCollector.js +226 -0
  1782. package/dist/services/skillEngine/eventCollector.js.map +1 -0
  1783. package/dist/services/skillEngine/expressionUtils.d.ts +25 -0
  1784. package/dist/services/skillEngine/expressionUtils.d.ts.map +1 -0
  1785. package/dist/services/skillEngine/expressionUtils.js +66 -0
  1786. package/dist/services/skillEngine/expressionUtils.js.map +1 -0
  1787. package/dist/services/skillEngine/index.d.ts +25 -0
  1788. package/dist/services/skillEngine/index.d.ts.map +1 -0
  1789. package/dist/services/skillEngine/index.js +98 -0
  1790. package/dist/services/skillEngine/index.js.map +1 -0
  1791. package/dist/services/skillEngine/skillAnalysisAdapter.d.ts +149 -0
  1792. package/dist/services/skillEngine/skillAnalysisAdapter.d.ts.map +1 -0
  1793. package/dist/services/skillEngine/skillAnalysisAdapter.js +752 -0
  1794. package/dist/services/skillEngine/skillAnalysisAdapter.js.map +1 -0
  1795. package/dist/services/skillEngine/skillExecutor.d.ts +371 -0
  1796. package/dist/services/skillEngine/skillExecutor.d.ts.map +1 -0
  1797. package/dist/services/skillEngine/skillExecutor.js +4129 -0
  1798. package/dist/services/skillEngine/skillExecutor.js.map +1 -0
  1799. package/dist/services/skillEngine/skillLoader.d.ts +163 -0
  1800. package/dist/services/skillEngine/skillLoader.d.ts.map +1 -0
  1801. package/dist/services/skillEngine/skillLoader.js +840 -0
  1802. package/dist/services/skillEngine/skillLoader.js.map +1 -0
  1803. package/dist/services/skillEngine/skillValidator.d.ts +53 -0
  1804. package/dist/services/skillEngine/skillValidator.d.ts.map +1 -0
  1805. package/dist/services/skillEngine/skillValidator.js +274 -0
  1806. package/dist/services/skillEngine/skillValidator.js.map +1 -0
  1807. package/dist/services/skillEngine/smartSummaryGenerator.d.ts +70 -0
  1808. package/dist/services/skillEngine/smartSummaryGenerator.d.ts.map +1 -0
  1809. package/dist/services/skillEngine/smartSummaryGenerator.js +324 -0
  1810. package/dist/services/skillEngine/smartSummaryGenerator.js.map +1 -0
  1811. package/dist/services/skillEngine/types.d.ts +584 -0
  1812. package/dist/services/skillEngine/types.d.ts.map +1 -0
  1813. package/dist/services/skillEngine/types.js +6 -0
  1814. package/dist/services/skillEngine/types.js.map +1 -0
  1815. package/dist/services/smartperfettoSqlPackage.d.ts +11 -0
  1816. package/dist/services/smartperfettoSqlPackage.d.ts.map +1 -0
  1817. package/dist/services/smartperfettoSqlPackage.js +168 -0
  1818. package/dist/services/smartperfettoSqlPackage.js.map +1 -0
  1819. package/dist/services/sqlGuardrailAnalyzer.d.ts +24 -0
  1820. package/dist/services/sqlGuardrailAnalyzer.d.ts.map +1 -0
  1821. package/dist/services/sqlGuardrailAnalyzer.js +362 -0
  1822. package/dist/services/sqlGuardrailAnalyzer.js.map +1 -0
  1823. package/dist/services/sqlKnowledgeBase.d.ts +236 -0
  1824. package/dist/services/sqlKnowledgeBase.d.ts.map +1 -0
  1825. package/dist/services/sqlKnowledgeBase.js +1109 -0
  1826. package/dist/services/sqlKnowledgeBase.js.map +1 -0
  1827. package/dist/services/sqlStdlibDependencyAnalyzer.d.ts +26 -0
  1828. package/dist/services/sqlStdlibDependencyAnalyzer.d.ts.map +1 -0
  1829. package/dist/services/sqlStdlibDependencyAnalyzer.js +486 -0
  1830. package/dist/services/sqlStdlibDependencyAnalyzer.js.map +1 -0
  1831. package/dist/services/sqlTemplateEngine.d.ts +134 -0
  1832. package/dist/services/sqlTemplateEngine.d.ts.map +1 -0
  1833. package/dist/services/sqlTemplateEngine.js +430 -0
  1834. package/dist/services/sqlTemplateEngine.js.map +1 -0
  1835. package/dist/services/sqlValidator.d.ts +21 -0
  1836. package/dist/services/sqlValidator.d.ts.map +1 -0
  1837. package/dist/services/sqlValidator.js +175 -0
  1838. package/dist/services/sqlValidator.js.map +1 -0
  1839. package/dist/services/standardMetricBackfillService.d.ts +23 -0
  1840. package/dist/services/standardMetricBackfillService.d.ts.map +1 -0
  1841. package/dist/services/standardMetricBackfillService.js +196 -0
  1842. package/dist/services/standardMetricBackfillService.js.map +1 -0
  1843. package/dist/services/startupAnrMethodGraph.d.ts +20 -0
  1844. package/dist/services/startupAnrMethodGraph.d.ts.map +1 -0
  1845. package/dist/services/startupAnrMethodGraph.js +70 -0
  1846. package/dist/services/startupAnrMethodGraph.js.map +1 -0
  1847. package/dist/services/stdlibSkillCoverage.d.ts +23 -0
  1848. package/dist/services/stdlibSkillCoverage.d.ts.map +1 -0
  1849. package/dist/services/stdlibSkillCoverage.js +289 -0
  1850. package/dist/services/stdlibSkillCoverage.js.map +1 -0
  1851. package/dist/services/threadSchedContext.d.ts +49 -0
  1852. package/dist/services/threadSchedContext.d.ts.map +1 -0
  1853. package/dist/services/threadSchedContext.js +84 -0
  1854. package/dist/services/threadSchedContext.js.map +1 -0
  1855. package/dist/services/timelineBinning.d.ts +44 -0
  1856. package/dist/services/timelineBinning.d.ts.map +1 -0
  1857. package/dist/services/timelineBinning.js +150 -0
  1858. package/dist/services/timelineBinning.js.map +1 -0
  1859. package/dist/services/traceConfigGenerator.d.ts +36 -0
  1860. package/dist/services/traceConfigGenerator.d.ts.map +1 -0
  1861. package/dist/services/traceConfigGenerator.js +110 -0
  1862. package/dist/services/traceConfigGenerator.js.map +1 -0
  1863. package/dist/services/traceFormatDetector.d.ts +39 -0
  1864. package/dist/services/traceFormatDetector.d.ts.map +1 -0
  1865. package/dist/services/traceFormatDetector.js +287 -0
  1866. package/dist/services/traceFormatDetector.js.map +1 -0
  1867. package/dist/services/traceMetadataStore.d.ts +32 -0
  1868. package/dist/services/traceMetadataStore.d.ts.map +1 -0
  1869. package/dist/services/traceMetadataStore.js +375 -0
  1870. package/dist/services/traceMetadataStore.js.map +1 -0
  1871. package/dist/services/traceProcessorConnectionModel.d.ts +32 -0
  1872. package/dist/services/traceProcessorConnectionModel.d.ts.map +1 -0
  1873. package/dist/services/traceProcessorConnectionModel.js +38 -0
  1874. package/dist/services/traceProcessorConnectionModel.js.map +1 -0
  1875. package/dist/services/traceProcessorHttpRpcClient.d.ts +22 -0
  1876. package/dist/services/traceProcessorHttpRpcClient.d.ts.map +1 -0
  1877. package/dist/services/traceProcessorHttpRpcClient.js +89 -0
  1878. package/dist/services/traceProcessorHttpRpcClient.js.map +1 -0
  1879. package/dist/services/traceProcessorLeaseModeDecision.d.ts +52 -0
  1880. package/dist/services/traceProcessorLeaseModeDecision.d.ts.map +1 -0
  1881. package/dist/services/traceProcessorLeaseModeDecision.js +150 -0
  1882. package/dist/services/traceProcessorLeaseModeDecision.js.map +1 -0
  1883. package/dist/services/traceProcessorLeaseStore.d.ts +88 -0
  1884. package/dist/services/traceProcessorLeaseStore.d.ts.map +1 -0
  1885. package/dist/services/traceProcessorLeaseStore.js +463 -0
  1886. package/dist/services/traceProcessorLeaseStore.js.map +1 -0
  1887. package/dist/services/traceProcessorProtobuf.d.ts +56 -0
  1888. package/dist/services/traceProcessorProtobuf.d.ts.map +1 -0
  1889. package/dist/services/traceProcessorProtobuf.js +442 -0
  1890. package/dist/services/traceProcessorProtobuf.js.map +1 -0
  1891. package/dist/services/traceProcessorRamBudget.d.ts +55 -0
  1892. package/dist/services/traceProcessorRamBudget.d.ts.map +1 -0
  1893. package/dist/services/traceProcessorRamBudget.js +140 -0
  1894. package/dist/services/traceProcessorRamBudget.js.map +1 -0
  1895. package/dist/services/traceProcessorService.d.ts +223 -0
  1896. package/dist/services/traceProcessorService.d.ts.map +1 -0
  1897. package/dist/services/traceProcessorService.js +838 -0
  1898. package/dist/services/traceProcessorService.js.map +1 -0
  1899. package/dist/services/traceProcessorSqlWorker.d.ts +49 -0
  1900. package/dist/services/traceProcessorSqlWorker.d.ts.map +1 -0
  1901. package/dist/services/traceProcessorSqlWorker.js +218 -0
  1902. package/dist/services/traceProcessorSqlWorker.js.map +1 -0
  1903. package/dist/services/traceProcessorSqlWorkerThread.d.ts +2 -0
  1904. package/dist/services/traceProcessorSqlWorkerThread.d.ts.map +1 -0
  1905. package/dist/services/traceProcessorSqlWorkerThread.js +35 -0
  1906. package/dist/services/traceProcessorSqlWorkerThread.js.map +1 -0
  1907. package/dist/services/traceSummaryV2.d.ts +47 -0
  1908. package/dist/services/traceSummaryV2.d.ts.map +1 -0
  1909. package/dist/services/traceSummaryV2.js +241 -0
  1910. package/dist/services/traceSummaryV2.js.map +1 -0
  1911. package/dist/services/traceUploadLimit.d.ts +3 -0
  1912. package/dist/services/traceUploadLimit.d.ts.map +1 -0
  1913. package/dist/services/traceUploadLimit.js +24 -0
  1914. package/dist/services/traceUploadLimit.js.map +1 -0
  1915. package/dist/services/workingTraceProcessor.d.ts +226 -0
  1916. package/dist/services/workingTraceProcessor.d.ts.map +1 -0
  1917. package/dist/services/workingTraceProcessor.js +1093 -0
  1918. package/dist/services/workingTraceProcessor.js.map +1 -0
  1919. package/dist/trace-processor-pin.env +39 -0
  1920. package/dist/types/analysis.d.ts +511 -0
  1921. package/dist/types/analysis.d.ts.map +1 -0
  1922. package/dist/types/analysis.js +112 -0
  1923. package/dist/types/analysis.js.map +1 -0
  1924. package/dist/types/ciGateContracts.d.ts +63 -0
  1925. package/dist/types/ciGateContracts.d.ts.map +1 -0
  1926. package/dist/types/ciGateContracts.js +6 -0
  1927. package/dist/types/ciGateContracts.js.map +1 -0
  1928. package/dist/types/dataContract.d.ts +624 -0
  1929. package/dist/types/dataContract.d.ts.map +1 -0
  1930. package/dist/types/dataContract.js +775 -0
  1931. package/dist/types/dataContract.js.map +1 -0
  1932. package/dist/types/index.d.ts +40 -0
  1933. package/dist/types/index.d.ts.map +1 -0
  1934. package/dist/types/index.js +21 -0
  1935. package/dist/types/index.js.map +1 -0
  1936. package/dist/types/multiTraceComparison.d.ts +215 -0
  1937. package/dist/types/multiTraceComparison.d.ts.map +1 -0
  1938. package/dist/types/multiTraceComparison.js +33 -0
  1939. package/dist/types/multiTraceComparison.js.map +1 -0
  1940. package/dist/types/perfettoSql.d.ts +596 -0
  1941. package/dist/types/perfettoSql.d.ts.map +1 -0
  1942. package/dist/types/perfettoSql.js +28 -0
  1943. package/dist/types/perfettoSql.js.map +1 -0
  1944. package/dist/types/sparkContracts.d.ts +1642 -0
  1945. package/dist/types/sparkContracts.d.ts.map +1 -0
  1946. package/dist/types/sparkContracts.js +25 -0
  1947. package/dist/types/sparkContracts.js.map +1 -0
  1948. package/dist/types/teaching.types.d.ts +395 -0
  1949. package/dist/types/teaching.types.d.ts.map +1 -0
  1950. package/dist/types/teaching.types.js +300 -0
  1951. package/dist/types/teaching.types.js.map +1 -0
  1952. package/dist/utils/analysisNarrative.d.ts +24 -0
  1953. package/dist/utils/analysisNarrative.d.ts.map +1 -0
  1954. package/dist/utils/analysisNarrative.js +101 -0
  1955. package/dist/utils/analysisNarrative.js.map +1 -0
  1956. package/dist/utils/atomicFileWriter.d.ts +5 -0
  1957. package/dist/utils/atomicFileWriter.d.ts.map +1 -0
  1958. package/dist/utils/atomicFileWriter.js +90 -0
  1959. package/dist/utils/atomicFileWriter.js.map +1 -0
  1960. package/dist/utils/epipeGuard.d.ts +10 -0
  1961. package/dist/utils/epipeGuard.d.ts.map +1 -0
  1962. package/dist/utils/epipeGuard.js +40 -0
  1963. package/dist/utils/epipeGuard.js.map +1 -0
  1964. package/dist/utils/httpValue.d.ts +2 -0
  1965. package/dist/utils/httpValue.d.ts.map +1 -0
  1966. package/dist/utils/httpValue.js +24 -0
  1967. package/dist/utils/httpValue.js.map +1 -0
  1968. package/dist/utils/llmJson.d.ts +33 -0
  1969. package/dist/utils/llmJson.d.ts.map +1 -0
  1970. package/dist/utils/llmJson.js +148 -0
  1971. package/dist/utils/llmJson.js.map +1 -0
  1972. package/dist/utils/llmPrivacy.d.ts +15 -0
  1973. package/dist/utils/llmPrivacy.d.ts.map +1 -0
  1974. package/dist/utils/llmPrivacy.js +126 -0
  1975. package/dist/utils/llmPrivacy.js.map +1 -0
  1976. package/dist/utils/logger.d.ts +24 -0
  1977. package/dist/utils/logger.d.ts.map +1 -0
  1978. package/dist/utils/logger.js +68 -0
  1979. package/dist/utils/logger.js.map +1 -0
  1980. package/dist/utils/traceProcessorRowUtils.d.ts +11 -0
  1981. package/dist/utils/traceProcessorRowUtils.d.ts.map +1 -0
  1982. package/dist/utils/traceProcessorRowUtils.js +64 -0
  1983. package/dist/utils/traceProcessorRowUtils.js.map +1 -0
  1984. package/dist/utils/uuid.d.ts +3 -0
  1985. package/dist/utils/uuid.d.ts.map +1 -0
  1986. package/dist/utils/uuid.js +7 -0
  1987. package/dist/utils/uuid.js.map +1 -0
  1988. package/dist/version.d.ts +2 -0
  1989. package/dist/version.d.ts.map +1 -0
  1990. package/dist/version.js +53 -0
  1991. package/dist/version.js.map +1 -0
  1992. package/package.json +128 -0
  1993. package/prebuilts/trace_processor/README.md +20 -0
  1994. package/prebuilts/trace_processor/darwin-arm64/trace_processor_shell +0 -0
  1995. package/prebuilts/trace_processor/linux-x64/trace_processor_shell +0 -0
  1996. package/prebuilts/trace_processor/win32-x64/trace_processor_shell.exe +0 -0
  1997. package/skills/README.md +686 -0
  1998. package/skills/_template/README.md +43 -0
  1999. package/skills/_template/atomic_A_template.skill.yaml +79 -0
  2000. package/skills/_template/atomic_B_template.skill.yaml +61 -0
  2001. package/skills/_template/atomic_S_template.skill.yaml +92 -0
  2002. package/skills/_template/composite_S_template.skill.yaml +198 -0
  2003. package/skills/_template/vendor_override_template.yaml +72 -0
  2004. package/skills/atomic/android_bitmap_memory_per_process.skill.yaml +203 -0
  2005. package/skills/atomic/android_dvfs_counter_stats.skill.yaml +60 -0
  2006. package/skills/atomic/android_gpu_work_period_track.skill.yaml +55 -0
  2007. package/skills/atomic/android_heap_graph_summary.skill.yaml +232 -0
  2008. package/skills/atomic/android_job_scheduler_events.skill.yaml +58 -0
  2009. package/skills/atomic/android_kernel_wakelock_summary.skill.yaml +57 -0
  2010. package/skills/atomic/anr_context_in_range.skill.yaml +99 -0
  2011. package/skills/atomic/anr_main_thread_blocking.skill.yaml +513 -0
  2012. package/skills/atomic/app_frame_production.skill.yaml +147 -0
  2013. package/skills/atomic/app_lifecycle_in_range.skill.yaml +142 -0
  2014. package/skills/atomic/app_process_starts_summary.skill.yaml +75 -0
  2015. package/skills/atomic/battery_charge_timeline.skill.yaml +72 -0
  2016. package/skills/atomic/battery_doze_state_timeline.skill.yaml +83 -0
  2017. package/skills/atomic/binder_blocking_in_range.skill.yaml +99 -0
  2018. package/skills/atomic/binder_in_range.skill.yaml +86 -0
  2019. package/skills/atomic/binder_root_cause.skill.yaml +191 -0
  2020. package/skills/atomic/binder_storm_detection.skill.yaml +394 -0
  2021. package/skills/atomic/blocking_chain_analysis.skill.yaml +316 -0
  2022. package/skills/atomic/buffer_transaction_lifecycle.skill.yaml +256 -0
  2023. package/skills/atomic/cache_miss_impact.skill.yaml +115 -0
  2024. package/skills/atomic/chrome_scroll_jank_frame_timeline.skill.yaml +337 -0
  2025. package/skills/atomic/compose_recomposition_hotspot.skill.yaml +403 -0
  2026. package/skills/atomic/consumer_jank_detection.skill.yaml +556 -0
  2027. package/skills/atomic/cpu_cluster_load_in_range.skill.yaml +138 -0
  2028. package/skills/atomic/cpu_cluster_mapping_view.skill.yaml +47 -0
  2029. package/skills/atomic/cpu_freq_timeline.skill.yaml +143 -0
  2030. package/skills/atomic/cpu_idle_analysis.skill.yaml +101 -0
  2031. package/skills/atomic/cpu_idle_state_residency.skill.yaml +54 -0
  2032. package/skills/atomic/cpu_load_in_range.skill.yaml +145 -0
  2033. package/skills/atomic/cpu_process_utilization_period.skill.yaml +51 -0
  2034. package/skills/atomic/cpu_slice_analysis.skill.yaml +118 -0
  2035. package/skills/atomic/cpu_thread_utilization_period.skill.yaml +68 -0
  2036. package/skills/atomic/cpu_throttling_in_range.skill.yaml +131 -0
  2037. package/skills/atomic/cpu_time_per_frame.skill.yaml +59 -0
  2038. package/skills/atomic/cpu_topology_detection.skill.yaml +233 -0
  2039. package/skills/atomic/cpu_topology_view.skill.yaml +272 -0
  2040. package/skills/atomic/cpu_utilization_per_period.skill.yaml +55 -0
  2041. package/skills/atomic/device_state_snapshot.skill.yaml +171 -0
  2042. package/skills/atomic/device_state_timeline.skill.yaml +308 -0
  2043. package/skills/atomic/fence_wait_decomposition.skill.yaml +314 -0
  2044. package/skills/atomic/fpsgo_analysis.skill.yaml +80 -0
  2045. package/skills/atomic/frame_blocking_calls.skill.yaml +215 -0
  2046. package/skills/atomic/frame_overrun_summary.skill.yaml +68 -0
  2047. package/skills/atomic/frame_pipeline_variance.skill.yaml +124 -0
  2048. package/skills/atomic/frame_production_gap.skill.yaml +337 -0
  2049. package/skills/atomic/frame_ui_time_breakdown.skill.yaml +58 -0
  2050. package/skills/atomic/futex_wait_distribution.skill.yaml +117 -0
  2051. package/skills/atomic/game_fps_analysis.skill.yaml +385 -0
  2052. package/skills/atomic/game_main_loop_jank.skill.yaml +309 -0
  2053. package/skills/atomic/gc_events_in_range.skill.yaml +118 -0
  2054. package/skills/atomic/gl_standalone_swap_jank.skill.yaml +259 -0
  2055. package/skills/atomic/gpu_freq_in_range.skill.yaml +99 -0
  2056. package/skills/atomic/gpu_frequency_analysis.skill.yaml +94 -0
  2057. package/skills/atomic/gpu_metrics.skill.yaml +411 -0
  2058. package/skills/atomic/gpu_power_state_analysis.skill.yaml +117 -0
  2059. package/skills/atomic/gpu_render_in_range.skill.yaml +104 -0
  2060. package/skills/atomic/input_events_in_range.skill.yaml +130 -0
  2061. package/skills/atomic/input_to_frame_latency.skill.yaml +436 -0
  2062. package/skills/atomic/linux_irq_summary.skill.yaml +66 -0
  2063. package/skills/atomic/linux_perf_counter_hotspots.skill.yaml +108 -0
  2064. package/skills/atomic/linux_process_rss_swap_timeline.skill.yaml +96 -0
  2065. package/skills/atomic/linux_runqueue_depth_timeline.skill.yaml +132 -0
  2066. package/skills/atomic/linux_sched_latency_distribution.skill.yaml +130 -0
  2067. package/skills/atomic/lmk_kill_attribution.skill.yaml +72 -0
  2068. package/skills/atomic/lock_contention_in_range.skill.yaml +402 -0
  2069. package/skills/atomic/logcat_analysis.skill.yaml +85 -0
  2070. package/skills/atomic/main_thread_file_io_in_range.skill.yaml +116 -0
  2071. package/skills/atomic/main_thread_sched_latency_in_range.skill.yaml +91 -0
  2072. package/skills/atomic/main_thread_slices_in_range.skill.yaml +129 -0
  2073. package/skills/atomic/main_thread_states_in_range.skill.yaml +105 -0
  2074. package/skills/atomic/mali_gpu_power_state.skill.yaml +54 -0
  2075. package/skills/atomic/media_codec_activity.skill.yaml +236 -0
  2076. package/skills/atomic/memory_growth_detector.skill.yaml +146 -0
  2077. package/skills/atomic/memory_pressure_in_range.skill.yaml +382 -0
  2078. package/skills/atomic/memory_rss_high_watermark.skill.yaml +62 -0
  2079. package/skills/atomic/native_heap_breakdown.skill.yaml +80 -0
  2080. package/skills/atomic/oom_adjuster_score_timeline.skill.yaml +77 -0
  2081. package/skills/atomic/page_fault_in_range.skill.yaml +113 -0
  2082. package/skills/atomic/pipeline_4feature_scoring.skill.yaml +299 -0
  2083. package/skills/atomic/pipeline_key_slices_overlay.skill.yaml +108 -0
  2084. package/skills/atomic/present_fence_timing.skill.yaml +156 -0
  2085. package/skills/atomic/process_identity_resolver.skill.yaml +503 -0
  2086. package/skills/atomic/render_pipeline_latency.skill.yaml +120 -0
  2087. package/skills/atomic/render_thread_slices.skill.yaml +107 -0
  2088. package/skills/atomic/rendering_pipeline_detection.skill.yaml +770 -0
  2089. package/skills/atomic/rn_bridge_to_frame_jank.skill.yaml +209 -0
  2090. package/skills/atomic/rn_fabric_render_jank.skill.yaml +213 -0
  2091. package/skills/atomic/sched_latency_in_range.skill.yaml +94 -0
  2092. package/skills/atomic/scheduling_analysis.skill.yaml +103 -0
  2093. package/skills/atomic/scroll_response_latency.skill.yaml +131 -0
  2094. package/skills/atomic/sf_composition_in_range.skill.yaml +99 -0
  2095. package/skills/atomic/sf_frame_consumption.skill.yaml +133 -0
  2096. package/skills/atomic/sf_layer_count_in_range.skill.yaml +155 -0
  2097. package/skills/atomic/startup_binder_in_range.skill.yaml +106 -0
  2098. package/skills/atomic/startup_binder_pool_analysis.skill.yaml +115 -0
  2099. package/skills/atomic/startup_breakdown_in_range.skill.yaml +115 -0
  2100. package/skills/atomic/startup_class_loading_in_range.skill.yaml +93 -0
  2101. package/skills/atomic/startup_cpu_placement_timeline.skill.yaml +135 -0
  2102. package/skills/atomic/startup_critical_tasks.skill.yaml +247 -0
  2103. package/skills/atomic/startup_events_in_range.skill.yaml +251 -0
  2104. package/skills/atomic/startup_freq_rampup.skill.yaml +110 -0
  2105. package/skills/atomic/startup_gc_in_range.skill.yaml +97 -0
  2106. package/skills/atomic/startup_hot_slice_states.skill.yaml +116 -0
  2107. package/skills/atomic/startup_jit_analysis.skill.yaml +158 -0
  2108. package/skills/atomic/startup_main_thread_binder_blocking_in_range.skill.yaml +114 -0
  2109. package/skills/atomic/startup_main_thread_file_io_in_range.skill.yaml +117 -0
  2110. package/skills/atomic/startup_main_thread_slices_in_range.skill.yaml +138 -0
  2111. package/skills/atomic/startup_main_thread_states_in_range.skill.yaml +100 -0
  2112. package/skills/atomic/startup_main_thread_sync_binder_in_range.skill.yaml +103 -0
  2113. package/skills/atomic/startup_sched_latency_in_range.skill.yaml +93 -0
  2114. package/skills/atomic/startup_slow_reasons.skill.yaml +625 -0
  2115. package/skills/atomic/startup_thread_blocking_graph.skill.yaml +181 -0
  2116. package/skills/atomic/system_load_in_range.skill.yaml +95 -0
  2117. package/skills/atomic/task_migration_in_range.skill.yaml +115 -0
  2118. package/skills/atomic/textureview_producer_frame_timing.skill.yaml +302 -0
  2119. package/skills/atomic/thermal_predictor.skill.yaml +182 -0
  2120. package/skills/atomic/thread_affinity_violation.skill.yaml +139 -0
  2121. package/skills/atomic/touch_to_display_latency.skill.yaml +130 -0
  2122. package/skills/atomic/util_tracking_analysis.skill.yaml +89 -0
  2123. package/skills/atomic/vrr_detection.skill.yaml +301 -0
  2124. package/skills/atomic/vsync_alignment_in_range.skill.yaml +116 -0
  2125. package/skills/atomic/vsync_config.skill.yaml +147 -0
  2126. package/skills/atomic/vsync_period_detection.skill.yaml +178 -0
  2127. package/skills/atomic/vsync_phase_alignment.skill.yaml +255 -0
  2128. package/skills/atomic/wakelock_tracking.skill.yaml +276 -0
  2129. package/skills/atomic/wattson_app_startup_power.skill.yaml +66 -0
  2130. package/skills/atomic/wattson_rails_power_breakdown.skill.yaml +70 -0
  2131. package/skills/atomic/wattson_thread_power_attribution.skill.yaml +74 -0
  2132. package/skills/atomic/webview_v8_analysis.skill.yaml +297 -0
  2133. package/skills/comparison/multi_trace_result_comparison.skill.yaml +60 -0
  2134. package/skills/composite/anr_analysis.skill.yaml +889 -0
  2135. package/skills/composite/anr_detail.skill.yaml +796 -0
  2136. package/skills/composite/battery_drain_attribution.skill.yaml +134 -0
  2137. package/skills/composite/binder_analysis.skill.yaml +742 -0
  2138. package/skills/composite/binder_detail.skill.yaml +388 -0
  2139. package/skills/composite/block_io_analysis.skill.yaml +559 -0
  2140. package/skills/composite/click_response_analysis.skill.yaml +915 -0
  2141. package/skills/composite/click_response_detail.skill.yaml +800 -0
  2142. package/skills/composite/cpu_analysis.skill.yaml +960 -0
  2143. package/skills/composite/dmabuf_analysis.skill.yaml +622 -0
  2144. package/skills/composite/flutter_scrolling_analysis.skill.yaml +443 -0
  2145. package/skills/composite/gc_analysis.skill.yaml +744 -0
  2146. package/skills/composite/global_trace_sanity_check.skill.yaml +716 -0
  2147. package/skills/composite/gpu_analysis.skill.yaml +700 -0
  2148. package/skills/composite/io_pressure.skill.yaml +654 -0
  2149. package/skills/composite/irq_analysis.skill.yaml +696 -0
  2150. package/skills/composite/jank_frame_detail.skill.yaml +2065 -0
  2151. package/skills/composite/lmk_analysis.skill.yaml +626 -0
  2152. package/skills/composite/lock_binder_wait.skill.yaml +95 -0
  2153. package/skills/composite/lock_contention_analysis.skill.yaml +878 -0
  2154. package/skills/composite/memory_analysis.skill.yaml +718 -0
  2155. package/skills/composite/navigation_analysis.skill.yaml +901 -0
  2156. package/skills/composite/network_analysis.skill.yaml +760 -0
  2157. package/skills/composite/power_consumption_overview.skill.yaml +143 -0
  2158. package/skills/composite/scene_reconstruction.skill.yaml +2788 -0
  2159. package/skills/composite/scroll_session_analysis.skill.yaml +496 -0
  2160. package/skills/composite/scrolling_analysis.skill.yaml +3295 -0
  2161. package/skills/composite/startup_analysis.skill.yaml +1172 -0
  2162. package/skills/composite/startup_detail.skill.yaml +1339 -0
  2163. package/skills/composite/state_timeline.skill.yaml +1021 -0
  2164. package/skills/composite/surfaceflinger_analysis.skill.yaml +808 -0
  2165. package/skills/composite/suspend_wakeup_analysis.skill.yaml +698 -0
  2166. package/skills/composite/thermal_throttling.skill.yaml +964 -0
  2167. package/skills/composite/thermal_throttling_chain.skill.yaml +147 -0
  2168. package/skills/composite/webview_drawfunctor_jank_chain.skill.yaml +343 -0
  2169. package/skills/config/conclusion_scene_templates.base.yaml +181 -0
  2170. package/skills/config/conclusion_scene_templates.yaml +17 -0
  2171. package/skills/deep/callstack_analysis.skill.yaml +436 -0
  2172. package/skills/deep/cpu_profiling.skill.yaml +617 -0
  2173. package/skills/docs/scrolling.sop.md +312 -0
  2174. package/skills/docs/startup.sop.md +382 -0
  2175. package/skills/docs/upstream-perfetto-ai-skill-translation.sop.md +50 -0
  2176. package/skills/fragments/target_threads.sql +34 -0
  2177. package/skills/fragments/thread_states_quadrant.sql +26 -0
  2178. package/skills/fragments/vsync_config.sql +32 -0
  2179. package/skills/modules/app/launcher_module.skill.yaml +473 -0
  2180. package/skills/modules/app/systemui_module.skill.yaml +565 -0
  2181. package/skills/modules/app/third_party_module.skill.yaml +275 -0
  2182. package/skills/modules/framework/ams_module.skill.yaml +239 -0
  2183. package/skills/modules/framework/art_module.skill.yaml +266 -0
  2184. package/skills/modules/framework/choreographer_module.skill.yaml +419 -0
  2185. package/skills/modules/framework/input_module.skill.yaml +219 -0
  2186. package/skills/modules/framework/surfaceflinger_module.skill.yaml +343 -0
  2187. package/skills/modules/framework/wms_module.skill.yaml +356 -0
  2188. package/skills/modules/hardware/cpu_module.skill.yaml +300 -0
  2189. package/skills/modules/hardware/gpu_module.skill.yaml +229 -0
  2190. package/skills/modules/hardware/memory_module.skill.yaml +443 -0
  2191. package/skills/modules/hardware/power_module.skill.yaml +377 -0
  2192. package/skills/modules/hardware/thermal_module.skill.yaml +410 -0
  2193. package/skills/modules/kernel/binder_module.skill.yaml +223 -0
  2194. package/skills/modules/kernel/filesystem_module.skill.yaml +423 -0
  2195. package/skills/modules/kernel/lock_contention_module.skill.yaml +424 -0
  2196. package/skills/modules/kernel/scheduler_module.skill.yaml +247 -0
  2197. package/skills/pipelines/_base.skill.yaml +103 -0
  2198. package/skills/pipelines/android_pip_freeform.skill.yaml +224 -0
  2199. package/skills/pipelines/android_view_mixed.skill.yaml +305 -0
  2200. package/skills/pipelines/android_view_multi_window.skill.yaml +271 -0
  2201. package/skills/pipelines/android_view_software.skill.yaml +172 -0
  2202. package/skills/pipelines/android_view_standard_blast.skill.yaml +357 -0
  2203. package/skills/pipelines/android_view_standard_legacy.skill.yaml +233 -0
  2204. package/skills/pipelines/angle_gles_vulkan.skill.yaml +178 -0
  2205. package/skills/pipelines/camera_pipeline.skill.yaml +215 -0
  2206. package/skills/pipelines/chrome_browser_viz.skill.yaml +288 -0
  2207. package/skills/pipelines/compose_standard.skill.yaml +250 -0
  2208. package/skills/pipelines/flutter_surfaceview_impeller.skill.yaml +233 -0
  2209. package/skills/pipelines/flutter_surfaceview_skia.skill.yaml +194 -0
  2210. package/skills/pipelines/flutter_textureview.skill.yaml +219 -0
  2211. package/skills/pipelines/game_engine.skill.yaml +311 -0
  2212. package/skills/pipelines/hardware_buffer_renderer.skill.yaml +205 -0
  2213. package/skills/pipelines/imagereader_pipeline.skill.yaml +237 -0
  2214. package/skills/pipelines/index.yaml +122 -0
  2215. package/skills/pipelines/opengl_es.skill.yaml +185 -0
  2216. package/skills/pipelines/rn_new_arch.skill.yaml +126 -0
  2217. package/skills/pipelines/rn_old_arch.skill.yaml +137 -0
  2218. package/skills/pipelines/rn_skia.skill.yaml +115 -0
  2219. package/skills/pipelines/software_compositing.skill.yaml +203 -0
  2220. package/skills/pipelines/surface_control_api.skill.yaml +208 -0
  2221. package/skills/pipelines/surfaceview_blast.skill.yaml +210 -0
  2222. package/skills/pipelines/textureview_standard.skill.yaml +301 -0
  2223. package/skills/pipelines/variable_refresh_rate.skill.yaml +264 -0
  2224. package/skills/pipelines/video_overlay_hwc.skill.yaml +193 -0
  2225. package/skills/pipelines/vulkan_native.skill.yaml +215 -0
  2226. package/skills/pipelines/webview_gl_functor.skill.yaml +232 -0
  2227. package/skills/pipelines/webview_surface_control.skill.yaml +187 -0
  2228. package/skills/pipelines/webview_surfaceview_wrapper.skill.yaml +196 -0
  2229. package/skills/pipelines/webview_textureview_custom.skill.yaml +201 -0
  2230. package/skills/vendors/honor/startup.override.yaml +117 -0
  2231. package/skills/vendors/mtk/startup.override.yaml +133 -0
  2232. package/skills/vendors/oppo/startup.override.yaml +188 -0
  2233. package/skills/vendors/pixel/startup.override.yaml +163 -0
  2234. package/skills/vendors/qualcomm/startup.override.yaml +175 -0
  2235. package/skills/vendors/samsung/startup.override.yaml +161 -0
  2236. package/skills/vendors/vivo/startup.override.yaml +144 -0
  2237. package/skills/vendors/xiaomi/startup.override.yaml +120 -0
  2238. package/sql/smartperfetto/PACKAGE.json +24 -0
  2239. package/sql/smartperfetto/binder/victim_to_server.sql +36 -0
  2240. package/sql/smartperfetto/scrolling/jank_frames.sql +55 -0
  2241. package/strategies/anr.strategy.md +200 -0
  2242. package/strategies/arch-compose.template.md +10 -0
  2243. package/strategies/arch-flutter.template.md +17 -0
  2244. package/strategies/arch-standard.template.md +31 -0
  2245. package/strategies/arch-webview.template.md +9 -0
  2246. package/strategies/comparison-conclusion.template.md +36 -0
  2247. package/strategies/comparison-methodology.template.md +41 -0
  2248. package/strategies/comparison-result-methodology.template.md +35 -0
  2249. package/strategies/game.strategy.md +121 -0
  2250. package/strategies/general.strategy.md +48 -0
  2251. package/strategies/interaction.strategy.md +149 -0
  2252. package/strategies/knowledge-binder-ipc.template.md +59 -0
  2253. package/strategies/knowledge-cpu-scheduler.template.md +67 -0
  2254. package/strategies/knowledge-data-sources.template.md +738 -0
  2255. package/strategies/knowledge-gc-dynamics.template.md +65 -0
  2256. package/strategies/knowledge-harmonyos-rendering.template.md +54 -0
  2257. package/strategies/knowledge-harmonyos-tools.template.md +73 -0
  2258. package/strategies/knowledge-lock-contention.template.md +61 -0
  2259. package/strategies/knowledge-pipeline-anchors.template.md +136 -0
  2260. package/strategies/knowledge-pipeline-fences.template.md +158 -0
  2261. package/strategies/knowledge-rendering-pipeline.template.md +170 -0
  2262. package/strategies/knowledge-startup-root-causes.template.md +951 -0
  2263. package/strategies/knowledge-thermal-throttling.template.md +53 -0
  2264. package/strategies/linux.strategy.md +86 -0
  2265. package/strategies/media.strategy.md +75 -0
  2266. package/strategies/memory.strategy.md +94 -0
  2267. package/strategies/multi-trace-result-comparison.strategy.md +96 -0
  2268. package/strategies/network.strategy.md +80 -0
  2269. package/strategies/overview.strategy.md +139 -0
  2270. package/strategies/phase_hint_templates/misdiagnosis_vsync_vrr.template.yaml +37 -0
  2271. package/strategies/pipeline.strategy.md +208 -0
  2272. package/strategies/power.strategy.md +165 -0
  2273. package/strategies/prompt-complexity-classifier.template.md +26 -0
  2274. package/strategies/prompt-language-en.template.md +9 -0
  2275. package/strategies/prompt-language-zh.template.md +8 -0
  2276. package/strategies/prompt-methodology.template.md +183 -0
  2277. package/strategies/prompt-output-format.template.md +115 -0
  2278. package/strategies/prompt-quick.template.md +44 -0
  2279. package/strategies/prompt-role.template.md +13 -0
  2280. package/strategies/runtime-correctness.strategy.md +73 -0
  2281. package/strategies/scroll-response.strategy.md +236 -0
  2282. package/strategies/scrolling.strategy.md +467 -0
  2283. package/strategies/selection-area.template.md +46 -0
  2284. package/strategies/selection-slice.template.md +126 -0
  2285. package/strategies/startup.strategy.md +694 -0
  2286. package/strategies/teaching.strategy.md +176 -0
  2287. package/strategies/touch-tracking.strategy.md +213 -0
@@ -0,0 +1,3295 @@
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # Copyright (C) 2024-2026 Gracker (Chris)
3
+ # This file is part of SmartPerfetto. See LICENSE for details.
4
+
5
+ name: scrolling_analysis
6
+ version: "2.0" # v2.0: refactored to use shared _cpu_topology VIEW
7
+ type: composite
8
+ tier: S
9
+
10
+ meta:
11
+ display_name: "滑动性能分析"
12
+ description: "基于 Perfetto FrameTimeline 的滑动分析,分层展示:概览 → 区间 → 帧详情"
13
+ icon: "swipe"
14
+ tags: [scrolling, jank, fps, frames, layered]
15
+
16
+ triggers:
17
+ keywords:
18
+ zh: [滑动, 卡顿, 帧率, 掉帧, 丢帧, FPS, 流畅度, 列表滑动, fling]
19
+ en: [scroll, jank, fps, frame, fling, stutter, smoothness, list]
20
+ patterns:
21
+ - ".*滑动.*卡.*"
22
+ - ".*scroll.*jank.*"
23
+ - ".*帧率.*"
24
+
25
+ prerequisites:
26
+ modules:
27
+ - android.frames.timeline
28
+ - android.binder
29
+ - android.garbage_collection
30
+ - android.monitor_contention
31
+
32
+ inputs:
33
+ - name: package
34
+ type: string
35
+ required: false
36
+ description: "应用包名(可选,不填则分析所有应用)"
37
+ - name: start_ts
38
+ type: timestamp
39
+ required: false
40
+ description: "分析起始时间戳(纳秒,可选)"
41
+ - name: end_ts
42
+ type: timestamp
43
+ required: false
44
+ description: "分析结束时间戳(纳秒,可选)"
45
+ - name: enable_frame_details
46
+ type: boolean
47
+ required: false
48
+ description: "是否执行逐帧详情分析(L4,默认不执行)"
49
+ - name: max_frames_per_session
50
+ type: number
51
+ required: false
52
+ description: "每个滑动区间最多返回的掉帧帧数(默认 200,配合 batch_frame_root_cause 批量分类)"
53
+ - name: enable_expert_probes
54
+ type: boolean
55
+ required: false
56
+ default: true
57
+ description: "是否启用专家探针(帧方差等)"
58
+ - name: frame_variance_probe_min_janky_frames
59
+ type: number
60
+ required: false
61
+ default: 5
62
+ description: "触发帧方差探针的最小掉帧数"
63
+ - name: frame_variance_transition_threshold_ms
64
+ type: number
65
+ required: false
66
+ default: 8
67
+ description: "帧间高抖动阈值(ms)"
68
+
69
+ identity:
70
+ policy: verify_if_present
71
+ scope: process
72
+ aliases: [package, process_name]
73
+ rewriteTo: recommended_process_name_param
74
+
75
+ steps:
76
+ # ==========================================================================
77
+ # Step 0: 初始化共享 CPU 拓扑视图
78
+ # ==========================================================================
79
+ - id: init_cpu_topology
80
+ type: skill
81
+ name: "初始化 CPU 拓扑"
82
+ skill: cpu_topology_view
83
+ display:
84
+ level: hidden
85
+ optional: true
86
+
87
+ # ==========================================================================
88
+ # L0: 数据源检测 - FrameTimeline 是否可用
89
+ # ==========================================================================
90
+ - id: frame_timeline_check
91
+ type: atomic
92
+ name: "FrameTimeline 数据源检测"
93
+ display: false
94
+ sql: |
95
+ SELECT
96
+ CASE
97
+ WHEN EXISTS (
98
+ SELECT 1 FROM sqlite_master
99
+ WHERE type = 'table' AND name = 'actual_frame_timeline_slice'
100
+ ) THEN 1
101
+ ELSE 0
102
+ END as has_frame_timeline
103
+ save_as: frame_timeline
104
+
105
+ # ==========================================================================
106
+ # L1: 环境配置检测 - Vsync/刷新率
107
+ # ==========================================================================
108
+ - id: vsync_config
109
+ type: atomic
110
+ name: "Vsync 配置"
111
+ display:
112
+ level: summary
113
+ layer: overview
114
+ title: "显示配置"
115
+ columns:
116
+ - name: refresh_rate_hz
117
+ label: "刷新率"
118
+ type: number
119
+ format: compact
120
+ - name: vsync_period_ms
121
+ label: "VSync 周期"
122
+ type: duration
123
+ format: duration_ms
124
+ unit: ms
125
+ - name: vsync_source
126
+ label: "来源"
127
+ type: string
128
+ - name: total_frames
129
+ label: "总帧数"
130
+ type: number
131
+ format: compact
132
+ sql: |
133
+ WITH
134
+ -- VSync 周期:VSYNC-sf 中位数 + 标准刷新率吸附(30/60/90/120/144/165Hz)
135
+ sf_vsync_intervals AS (
136
+ SELECT c.ts - LAG(c.ts) OVER (ORDER BY c.ts) AS interval_ns
137
+ FROM counter c
138
+ JOIN counter_track t ON c.track_id = t.id
139
+ WHERE t.name = 'VSYNC-sf'
140
+ AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
141
+ AND (${end_ts} IS NULL OR c.ts < ${end_ts})
142
+ ),
143
+ vsync_median AS (
144
+ SELECT
145
+ CASE
146
+ WHEN raw_period BETWEEN 5500000 AND 6500000 THEN 6060606
147
+ WHEN raw_period BETWEEN 6500001 AND 7500000 THEN 6944444
148
+ WHEN raw_period BETWEEN 7500001 AND 9500000 THEN 8333333
149
+ WHEN raw_period BETWEEN 9500001 AND 12500000 THEN 11111111
150
+ WHEN raw_period BETWEEN 12500001 AND 20000000 THEN 16666667
151
+ WHEN raw_period BETWEEN 20000001 AND 35000000 THEN 33333333
152
+ ELSE raw_period
153
+ END AS vsync_period_ns,
154
+ source
155
+ FROM (
156
+ SELECT
157
+ COALESCE(
158
+ (SELECT CAST(PERCENTILE(interval_ns, 0.5) AS INTEGER)
159
+ FROM sf_vsync_intervals
160
+ WHERE interval_ns > 5500000 AND interval_ns < 50000000),
161
+ (SELECT CAST(PERCENTILE(dur, 0.5) AS INTEGER)
162
+ FROM expected_frame_timeline_slice
163
+ WHERE dur > 5000000 AND dur < 50000000
164
+ AND (${start_ts} IS NULL OR ts >= ${start_ts})
165
+ AND (${end_ts} IS NULL OR ts < ${end_ts})),
166
+ 16666667
167
+ ) AS raw_period,
168
+ CASE
169
+ WHEN (SELECT COUNT(*) FROM sf_vsync_intervals WHERE interval_ns > 5500000 AND interval_ns < 50000000) > 0 THEN 'sf_vsync_counter'
170
+ WHEN (SELECT COUNT(*) FROM expected_frame_timeline_slice WHERE dur > 5000000 AND dur < 50000000) > 0 THEN 'expected_frame'
171
+ ELSE 'default'
172
+ END AS source
173
+ )
174
+ ),
175
+ frame_count AS (
176
+ SELECT COUNT(*) as total_frames
177
+ FROM actual_frame_timeline_slice a
178
+ LEFT JOIN process p ON a.upid = p.upid
179
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
180
+ AND p.name NOT LIKE '/system/%'
181
+ AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
182
+ AND (${end_ts} IS NULL OR a.ts < ${end_ts})
183
+ AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
184
+ )
185
+ SELECT
186
+ vsync_period_ns,
187
+ CAST(ROUND(1e9 / vsync_period_ns) AS INTEGER) as refresh_rate_hz,
188
+ ROUND(vsync_period_ns / 1e6, 2) as vsync_period_ms,
189
+ source as vsync_source,
190
+ (SELECT total_frames FROM frame_count) as total_frames,
191
+ CASE WHEN (SELECT total_frames FROM frame_count) > 0 THEN 1 ELSE 0 END as has_data
192
+ FROM vsync_median
193
+ save_as: environment
194
+ condition: "frame_timeline.data[0]?.has_frame_timeline === 1"
195
+
196
+ # ==========================================================================
197
+ # L1: 帧性能汇总 (双信号混合检测掉帧)
198
+ # ==========================================================================
199
+ # 核心原理:
200
+ # - 非 BS 帧:present_type IN ('Late Present', 'Dropped Frame') 为权威信号
201
+ # - BS 帧:present_type 始终为 Late Present,需用 present_ts 间隔二次验证
202
+ # 间隔 > 1.5x vsync = 真实掉帧;否则 = 管线背压(非感知掉帧)
203
+ # - vsync_missed 用 present_ts 间隔估算严重度(辅助信号)
204
+ # - jank_type 用于判断责任归属(App vs SF)
205
+ - id: performance_summary
206
+ type: atomic
207
+ name: "帧性能汇总"
208
+ synthesize:
209
+ role: overview
210
+ fields:
211
+ - key: total_frames
212
+ label: 总帧数
213
+ - key: perceived_jank_frames
214
+ label: 感知掉帧
215
+ format: "{{value}} ({{jank_rate}}%)"
216
+ - key: buffer_stuffing_frames
217
+ label: Buffer Stuffing
218
+ format: "{{value}} ({{buffer_stuffing_rate}}%)"
219
+ - key: avg_fps
220
+ label: 平均 FPS
221
+ - key: app_jank
222
+ label: App 侧掉帧
223
+ - key: sf_jank
224
+ label: SF 侧掉帧
225
+ insights:
226
+ - condition: "jank_rate > 10"
227
+ template: "感知掉帧率 {{jank_rate}}% 较高,需要优化"
228
+ - condition: "buffer_stuffing_rate > 50"
229
+ template: "Buffer Stuffing 占比 {{buffer_stuffing_rate}}%,管线背压显著(非 App 问题)"
230
+ - condition: "app_jank > sf_jank"
231
+ template: "App 侧掉帧 ({{app_jank}}) 多于 SF 侧 ({{sf_jank}})"
232
+ display:
233
+ level: summary
234
+ layer: overview
235
+ title: "滑动性能概览"
236
+ columns:
237
+ - name: total_frames
238
+ label: "总帧数"
239
+ type: number
240
+ format: compact
241
+ - name: perceived_jank_frames
242
+ label: "感知掉帧"
243
+ type: number
244
+ format: compact
245
+ - name: jank_rate
246
+ label: "感知掉帧率"
247
+ type: percentage
248
+ format: percentage
249
+ - name: buffer_stuffing_frames
250
+ label: "Buffer Stuffing"
251
+ type: number
252
+ format: compact
253
+ - name: buffer_stuffing_rate
254
+ label: "BS 占比"
255
+ type: percentage
256
+ format: percentage
257
+ hidden: true
258
+ - name: app_janky_frames
259
+ label: "App 侧掉帧"
260
+ type: number
261
+ format: compact
262
+ - name: sf_jank_count
263
+ label: "SF 侧掉帧"
264
+ type: number
265
+ format: compact
266
+ - name: actual_fps
267
+ label: "实际 FPS"
268
+ type: number
269
+ - name: refresh_rate
270
+ label: "刷新率"
271
+ type: number
272
+ - name: avg_frame_dur
273
+ label: "平均呈现间隔"
274
+ type: duration
275
+ format: duration_ms
276
+ unit: ns
277
+ - name: p95_frame_dur
278
+ label: "P95 呈现间隔"
279
+ type: duration
280
+ format: duration_ms
281
+ unit: ns
282
+ - name: rating
283
+ label: "评级"
284
+ type: string
285
+ sql: |
286
+ WITH
287
+ -- 获取 VSync 周期(从 VSYNC-sf 信号计算,限定在分析区间内)
288
+ vsync_intervals AS (
289
+ SELECT
290
+ c.ts - LAG(c.ts) OVER (ORDER BY c.ts) as interval_ns
291
+ FROM counter c
292
+ JOIN counter_track t ON c.track_id = t.id
293
+ WHERE t.name = 'VSYNC-sf'
294
+ AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
295
+ AND (${end_ts} IS NULL OR c.ts < ${end_ts})
296
+ ),
297
+ timing_config AS (
298
+ SELECT CASE
299
+ WHEN raw_ns BETWEEN 5500000 AND 6500000 THEN 6060606
300
+ WHEN raw_ns BETWEEN 6500001 AND 7500000 THEN 6944444
301
+ WHEN raw_ns BETWEEN 7500001 AND 9500000 THEN 8333333
302
+ WHEN raw_ns BETWEEN 9500001 AND 12500000 THEN 11111111
303
+ WHEN raw_ns BETWEEN 12500001 AND 20000000 THEN 16666667
304
+ WHEN raw_ns BETWEEN 20000001 AND 35000000 THEN 33333333
305
+ ELSE raw_ns
306
+ END AS vsync_period_ns
307
+ FROM (
308
+ SELECT CAST(COALESCE(
309
+ (SELECT PERCENTILE(interval_ns, 0.5)
310
+ FROM vsync_intervals
311
+ WHERE interval_ns > 5500000 AND interval_ns < 50000000),
312
+ 16666667
313
+ ) AS INTEGER) AS raw_ns
314
+ )
315
+ ),
316
+ time_range AS (
317
+ SELECT
318
+ MIN(a.ts) as start_ts,
319
+ MAX(a.ts + a.dur) as end_ts,
320
+ MAX(a.ts + a.dur) - MIN(a.ts) as duration_ns
321
+ FROM actual_frame_timeline_slice a
322
+ LEFT JOIN process p ON a.upid = p.upid
323
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
324
+ AND p.name NOT LIKE '/system/%'
325
+ AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
326
+ AND (${end_ts} IS NULL OR a.ts < ${end_ts})
327
+ AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
328
+ ),
329
+ app_frame_intervals AS (
330
+ SELECT
331
+ a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END as present_ts,
332
+ LAG(a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END)
333
+ OVER (PARTITION BY a.layer_name ORDER BY a.ts, COALESCE(a.display_frame_token, a.surface_frame_token)) as prev_present_ts
334
+ FROM actual_frame_timeline_slice a
335
+ LEFT JOIN process p ON a.upid = p.upid
336
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
337
+ AND p.name NOT LIKE '/system/%'
338
+ AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
339
+ AND (${end_ts} IS NULL OR a.ts < ${end_ts})
340
+ AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
341
+ ),
342
+ valid_frame_intervals AS (
343
+ SELECT
344
+ present_ts - prev_present_ts as frame_interval_ns
345
+ FROM app_frame_intervals
346
+ WHERE prev_present_ts IS NOT NULL
347
+ AND present_ts > prev_present_ts
348
+ AND present_ts - prev_present_ts >= (SELECT vsync_period_ns FROM timing_config) * 0.5
349
+ AND present_ts - prev_present_ts <= (SELECT vsync_period_ns FROM timing_config) * 6
350
+ ),
351
+ -- App 报告的掉帧(旧逻辑,仅供参考)
352
+ app_stats AS (
353
+ SELECT
354
+ COUNT(*) as total,
355
+ SUM(CASE WHEN jank_type != 'None' THEN 1 ELSE 0 END) as app_janky_frames,
356
+ COALESCE(
357
+ (SELECT CAST(ROUND(AVG(frame_interval_ns)) AS INTEGER) FROM valid_frame_intervals),
358
+ CAST(ROUND(AVG(CASE WHEN dur > 0 THEN dur ELSE NULL END)) AS INTEGER),
359
+ 0
360
+ ) as avg_present_interval,
361
+ COALESCE(
362
+ (SELECT CAST(MAX(frame_interval_ns) AS INTEGER) FROM valid_frame_intervals),
363
+ MAX(CASE WHEN dur > 0 THEN dur ELSE NULL END),
364
+ 0
365
+ ) as max_present_interval,
366
+ COALESCE(
367
+ (SELECT CAST(ROUND(PERCENTILE(frame_interval_ns, 0.5)) AS INTEGER) FROM valid_frame_intervals),
368
+ CAST(ROUND(PERCENTILE(CASE WHEN dur > 0 THEN dur ELSE NULL END, 0.5)) AS INTEGER),
369
+ 0
370
+ ) as median_present_interval,
371
+ COALESCE(
372
+ (SELECT CAST(ROUND(PERCENTILE(frame_interval_ns, 0.95)) AS INTEGER) FROM valid_frame_intervals),
373
+ CAST(ROUND(PERCENTILE(CASE WHEN dur > 0 THEN dur ELSE NULL END, 0.95)) AS INTEGER),
374
+ 0
375
+ ) as p95_present_interval,
376
+ COALESCE(
377
+ (SELECT CAST(ROUND(PERCENTILE(frame_interval_ns, 0.99)) AS INTEGER) FROM valid_frame_intervals),
378
+ CAST(ROUND(PERCENTILE(CASE WHEN dur > 0 THEN dur ELSE NULL END, 0.99)) AS INTEGER),
379
+ 0
380
+ ) as p99_present_interval
381
+ FROM actual_frame_timeline_slice a
382
+ LEFT JOIN process p ON a.upid = p.upid
383
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
384
+ AND p.name NOT LIKE '/system/%'
385
+ AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
386
+ AND (${end_ts} IS NULL OR a.ts < ${end_ts})
387
+ AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
388
+ ),
389
+ -- Per-layer 帧序列:双信号混合检测基础数据
390
+ -- present_type = SurfaceFlinger 的消费状态(非 BS 帧的权威信号)
391
+ -- present_ts interval = BS 帧的二次验证信号(区分真实掉帧 vs 管线背压)
392
+ consumer_layer_frames AS (
393
+ SELECT
394
+ COALESCE(a.display_frame_token, a.surface_frame_token) as display_frame_token,
395
+ a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END as present_ts,
396
+ LAG(a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END)
397
+ OVER (PARTITION BY a.layer_name ORDER BY a.ts) as prev_present_ts,
398
+ COALESCE(a.jank_type, 'None') as jank_type,
399
+ COALESCE(a.present_type, 'Unknown Present') as present_type,
400
+ a.layer_name
401
+ FROM actual_frame_timeline_slice a
402
+ LEFT JOIN process p ON a.upid = p.upid
403
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
404
+ AND p.name NOT LIKE '/system/%'
405
+ AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
406
+ AND (${end_ts} IS NULL OR a.ts < ${end_ts})
407
+ AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
408
+ ),
409
+ -- 掉帧检测:双信号混合策略
410
+ -- 非 BS 帧:present_type IN ('Late Present', 'Dropped Frame') 为权威信号
411
+ -- BS 帧:present_type 始终为 Late Present,需用 present_ts 间隔作为二次验证
412
+ -- 间隔 > 1.5x vsync = 真实掉帧(被 BS 掩盖);否则 = 管线背压(非感知掉帧)
413
+ consumer_gap_stats AS (
414
+ SELECT
415
+ COUNT(*) as total_frames,
416
+ -- 感知掉帧:双信号混合检测
417
+ SUM(CASE
418
+ WHEN present_type IN ('Late Present', 'Dropped Frame')
419
+ AND jank_type != 'Buffer Stuffing' THEN 1
420
+ WHEN jank_type = 'Buffer Stuffing'
421
+ AND prev_present_ts IS NOT NULL
422
+ AND present_ts - prev_present_ts > (SELECT vsync_period_ns FROM timing_config) * 1.5
423
+ AND present_ts - prev_present_ts <= (SELECT vsync_period_ns FROM timing_config) * 6 THEN 1
424
+ ELSE 0
425
+ END) as consumer_jank_frames,
426
+ -- App 侧掉帧(BS 帧的 jank_type 不可能是 Self Jank/App Deadline Missed,无需双信号)
427
+ SUM(CASE WHEN present_type IN ('Late Present', 'Dropped Frame')
428
+ AND jank_type IN ('Self Jank', 'App Deadline Missed') THEN 1 ELSE 0 END) as app_jank_frames,
429
+ -- Buffer Stuffing 总帧数(管线背压,含正常 BS 和异常 BS)
430
+ SUM(CASE WHEN jank_type = 'Buffer Stuffing' THEN 1 ELSE 0 END) as buffer_stuffing_frames,
431
+ -- vsync missed:双信号门控
432
+ SUM(CASE
433
+ WHEN (
434
+ (present_type IN ('Late Present', 'Dropped Frame') AND jank_type != 'Buffer Stuffing')
435
+ OR (jank_type = 'Buffer Stuffing' AND prev_present_ts IS NOT NULL
436
+ AND present_ts - prev_present_ts > (SELECT vsync_period_ns FROM timing_config) * 1.5
437
+ AND present_ts - prev_present_ts <= (SELECT vsync_period_ns FROM timing_config) * 6)
438
+ ) AND prev_present_ts IS NOT NULL
439
+ AND present_ts - prev_present_ts > (SELECT vsync_period_ns FROM timing_config) * 1.5
440
+ THEN MAX(CAST(ROUND((present_ts - prev_present_ts) * 1.0 / (SELECT vsync_period_ns FROM timing_config) - 1, 0) AS INTEGER), 0)
441
+ ELSE 0
442
+ END) as total_vsync_missed,
443
+ MAX(CASE
444
+ WHEN (
445
+ (present_type IN ('Late Present', 'Dropped Frame') AND jank_type != 'Buffer Stuffing')
446
+ OR (jank_type = 'Buffer Stuffing' AND prev_present_ts IS NOT NULL
447
+ AND present_ts - prev_present_ts > (SELECT vsync_period_ns FROM timing_config) * 1.5
448
+ AND present_ts - prev_present_ts <= (SELECT vsync_period_ns FROM timing_config) * 6)
449
+ ) AND prev_present_ts IS NOT NULL
450
+ AND present_ts - prev_present_ts > (SELECT vsync_period_ns FROM timing_config) * 1.5
451
+ THEN MAX(CAST(ROUND((present_ts - prev_present_ts) * 1.0 / (SELECT vsync_period_ns FROM timing_config) - 1, 0) AS INTEGER), 0)
452
+ ELSE 0
453
+ END) as max_vsync_missed
454
+ FROM consumer_layer_frames
455
+ ),
456
+ resolved_jank AS (
457
+ SELECT
458
+ COALESCE((SELECT consumer_jank_frames FROM consumer_gap_stats), (SELECT app_janky_frames FROM app_stats), 0) as janky_frames,
459
+ COALESCE((SELECT app_jank_frames FROM consumer_gap_stats), (SELECT app_janky_frames FROM app_stats), 0) as app_janky_frames,
460
+ -- 感知掉帧 = consumer_jank_frames(双信号已过滤掉正常 BS 帧)
461
+ COALESCE((SELECT consumer_jank_frames FROM consumer_gap_stats), (SELECT app_janky_frames FROM app_stats), 0) as perceived_jank_frames,
462
+ COALESCE((SELECT buffer_stuffing_frames FROM consumer_gap_stats), 0) as buffer_stuffing_frames,
463
+ COALESCE((SELECT max_vsync_missed FROM consumer_gap_stats), 0) as max_vsync_missed,
464
+ COALESCE((SELECT total_vsync_missed FROM consumer_gap_stats), 0) as total_vsync_missed,
465
+ 'present_type' as fps_source
466
+ )
467
+ SELECT
468
+ (SELECT total FROM app_stats) as total_frames,
469
+ -- 感知掉帧(排除 Buffer Stuffing)— 用户真正能感知到的掉帧
470
+ (SELECT perceived_jank_frames FROM resolved_jank) as perceived_jank_frames,
471
+ -- 感知掉帧率(主指标,用于 rating)
472
+ ROUND(
473
+ 100.0 * (SELECT perceived_jank_frames FROM resolved_jank) / NULLIF((SELECT total FROM app_stats), 0),
474
+ 2
475
+ ) as jank_rate,
476
+ -- Buffer Stuffing 帧数(管线背压,非 App 逻辑问题)
477
+ (SELECT buffer_stuffing_frames FROM resolved_jank) as buffer_stuffing_frames,
478
+ -- 总掉帧数(含 Buffer Stuffing,用于完整性展示)
479
+ (SELECT janky_frames FROM resolved_jank) as janky_frames,
480
+ (SELECT app_janky_frames FROM resolved_jank) as app_janky_frames,
481
+ MAX(
482
+ (SELECT perceived_jank_frames FROM resolved_jank) -
483
+ (SELECT app_janky_frames FROM resolved_jank),
484
+ 0
485
+ ) as sf_jank_count,
486
+ -- App 侧掉帧率
487
+ ROUND(
488
+ 100.0 * (SELECT app_janky_frames FROM resolved_jank) / NULLIF((SELECT total FROM app_stats), 0),
489
+ 2
490
+ ) as app_jank_rate,
491
+ -- Buffer Stuffing 率
492
+ ROUND(
493
+ 100.0 * (SELECT buffer_stuffing_frames FROM resolved_jank) / NULLIF((SELECT total FROM app_stats), 0),
494
+ 2
495
+ ) as buffer_stuffing_rate,
496
+ (SELECT avg_present_interval FROM app_stats) as avg_frame_dur,
497
+ (SELECT max_present_interval FROM app_stats) as max_frame_dur,
498
+ (SELECT median_present_interval FROM app_stats) as median_frame_dur,
499
+ (SELECT p95_present_interval FROM app_stats) as p95_frame_dur,
500
+ (SELECT p99_present_interval FROM app_stats) as p99_frame_dur,
501
+ ROUND((SELECT duration_ns FROM time_range) / 1e9, 2) as duration_sec,
502
+ MIN(
503
+ ROUND(1e9 * (SELECT total FROM app_stats) / NULLIF((SELECT duration_ns FROM time_range), 0), 1),
504
+ CAST(ROUND(1e9 / (SELECT vsync_period_ns FROM timing_config)) AS INTEGER)
505
+ ) as actual_fps,
506
+ CAST(ROUND(1e9 / (SELECT vsync_period_ns FROM timing_config)) AS INTEGER) as refresh_rate,
507
+ -- 评级基于感知掉帧率(排除 Buffer Stuffing)
508
+ CASE
509
+ WHEN (SELECT perceived_jank_frames FROM resolved_jank) = 0 THEN '优秀'
510
+ WHEN 100.0 * (SELECT perceived_jank_frames FROM resolved_jank) / NULLIF((SELECT total FROM app_stats), 0) < 1 THEN '优秀'
511
+ WHEN 100.0 * (SELECT perceived_jank_frames FROM resolved_jank) / NULLIF((SELECT total FROM app_stats), 0) < 5 THEN '良好'
512
+ WHEN 100.0 * (SELECT perceived_jank_frames FROM resolved_jank) / NULLIF((SELECT total FROM app_stats), 0) < 15 THEN '一般'
513
+ ELSE '较差'
514
+ END as rating,
515
+ (SELECT fps_source FROM resolved_jank) as fps_source,
516
+ (SELECT max_vsync_missed FROM resolved_jank) as max_vsync_missed,
517
+ (SELECT total_vsync_missed FROM resolved_jank) as total_vsync_missed,
518
+ ROUND((SELECT vsync_period_ns FROM timing_config) / 1e6, 2) as vsync_period_ms
519
+ LIMIT 1
520
+ save_as: perf_summary
521
+ condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && environment.data[0]?.has_data === 1"
522
+
523
+ # ==========================================================================
524
+ # L1: 专家探针 - 时间窗与帧波动
525
+ # ==========================================================================
526
+ # 原则:
527
+ # 1) 用户显式给 start_ts/end_ts 时严格尊重用户窗口
528
+ # 2) 未给窗口时,自动使用目标包名的 FrameTimeline 边界作为分析窗口
529
+ # 3) 仅在已确认存在可见掉帧时才启用额外探针,避免无谓开销
530
+ - id: expert_analysis_window
531
+ type: atomic
532
+ name: "专家分析窗口"
533
+ display: false
534
+ sql: |
535
+ WITH frame_bounds AS (
536
+ SELECT
537
+ MIN(a.ts) as min_ts,
538
+ MAX(a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END) as max_ts
539
+ FROM actual_frame_timeline_slice a
540
+ LEFT JOIN process p ON a.upid = p.upid
541
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
542
+ AND p.name NOT LIKE '/system/%'
543
+ AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
544
+ AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
545
+ AND (${end_ts} IS NULL OR a.ts < ${end_ts})
546
+ )
547
+ SELECT
548
+ CASE
549
+ WHEN COALESCE(${start_ts}, min_ts) IS NOT NULL
550
+ THEN printf('%d', COALESCE(${start_ts}, min_ts))
551
+ ELSE NULL
552
+ END as window_start_ts,
553
+ CASE
554
+ WHEN COALESCE(${end_ts}, max_ts) IS NOT NULL
555
+ THEN printf('%d', COALESCE(${end_ts}, max_ts))
556
+ ELSE NULL
557
+ END as window_end_ts,
558
+ CASE
559
+ WHEN COALESCE(${start_ts}, min_ts) IS NOT NULL
560
+ AND COALESCE(${end_ts}, max_ts) IS NOT NULL
561
+ THEN ROUND((COALESCE(${end_ts}, max_ts) - COALESCE(${start_ts}, min_ts)) / 1e6, 2)
562
+ ELSE NULL
563
+ END as window_ms,
564
+ CASE
565
+ WHEN ${start_ts} IS NOT NULL OR ${end_ts} IS NOT NULL THEN 'user_selected'
566
+ WHEN min_ts IS NOT NULL AND max_ts IS NOT NULL THEN 'auto_frame_bounds'
567
+ ELSE 'unavailable'
568
+ END as window_source
569
+ FROM frame_bounds
570
+ save_as: expert_window
571
+ condition: "${enable_expert_probes|true} == true && frame_timeline.data[0]?.has_frame_timeline === 1 && environment.data[0]?.has_data === 1"
572
+ optional: true
573
+
574
+ - id: frame_variance_probe
575
+ type: skill
576
+ name: "帧方差探针"
577
+ skill: frame_pipeline_variance
578
+ params:
579
+ package: "${package}"
580
+ start_ts: "${expert_window.data?.[0]?.window_start_ts ?? start_ts ?? null}"
581
+ end_ts: "${expert_window.data?.[0]?.window_end_ts ?? end_ts ?? null}"
582
+ transition_threshold_ms: "${frame_variance_transition_threshold_ms|8}"
583
+ display:
584
+ level: summary
585
+ layer: overview
586
+ title: "帧稳定性方差(专家探针)"
587
+ columns:
588
+ - name: total_frames
589
+ label: "总帧数"
590
+ type: number
591
+ - name: avg_frame_ms
592
+ label: "平均帧耗时"
593
+ type: duration
594
+ format: duration_ms
595
+ unit: ms
596
+ - name: stddev_ms
597
+ label: "标准差"
598
+ type: duration
599
+ format: duration_ms
600
+ unit: ms
601
+ - name: avg_delta_ms
602
+ label: "帧间波动"
603
+ type: duration
604
+ format: duration_ms
605
+ unit: ms
606
+ - name: high_variance_transitions
607
+ label: "高抖动转折"
608
+ type: number
609
+ - name: variance_level
610
+ label: "波动等级"
611
+ type: string
612
+ save_as: frame_variance_probe
613
+ condition: "${enable_expert_probes|true} == true && frame_timeline.data[0]?.has_frame_timeline === 1 && (perf_summary?.data?.[0]?.janky_frames || 0) >= (frame_variance_probe_min_janky_frames || 5)"
614
+ optional: true
615
+
616
+ # ==========================================================================
617
+ # L1: 掉帧分析 - 消费端 vs App 报告对比
618
+ # ==========================================================================
619
+ # 展示 jank_type 与实际消费端掉帧的关系
620
+ # - 假阳性: jank_type 报告掉帧,但 gap=1 (用户看到流畅)
621
+ # - 假阴性: jank_type=None,但 gap>1 (用户看到卡顿)
622
+ - id: jank_type_stats
623
+ type: atomic
624
+ name: "掉帧类型统计"
625
+ display:
626
+ level: summary
627
+ layer: overview
628
+ title: "掉帧类型分布"
629
+ columns:
630
+ - name: jank_type
631
+ label: "掉帧类型"
632
+ type: string
633
+ - name: count
634
+ label: "帧数"
635
+ type: number
636
+ format: compact
637
+ - name: real_jank_count
638
+ label: "实际掉帧"
639
+ type: number
640
+ format: compact
641
+ - name: false_positive
642
+ label: "假阳性"
643
+ type: number
644
+ - name: total_dur
645
+ label: "总耗时"
646
+ type: duration
647
+ format: duration_ms
648
+ unit: ns
649
+ - name: avg_dur
650
+ label: "平均耗时"
651
+ type: duration
652
+ format: duration_ms
653
+ unit: ns
654
+ - name: responsibility
655
+ label: "类型标签"
656
+ type: string
657
+ sql: |
658
+ WITH
659
+ vsync_intervals AS (
660
+ SELECT
661
+ c.ts - LAG(c.ts) OVER (ORDER BY c.ts) as interval_ns
662
+ FROM counter c
663
+ JOIN counter_track t ON c.track_id = t.id
664
+ WHERE t.name = 'VSYNC-sf'
665
+ AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
666
+ AND (${end_ts} IS NULL OR c.ts < ${end_ts})
667
+ ),
668
+ vsync_config AS (
669
+ SELECT CASE
670
+ WHEN raw_ns BETWEEN 5500000 AND 6500000 THEN 6060606
671
+ WHEN raw_ns BETWEEN 6500001 AND 7500000 THEN 6944444
672
+ WHEN raw_ns BETWEEN 7500001 AND 9500000 THEN 8333333
673
+ WHEN raw_ns BETWEEN 9500001 AND 12500000 THEN 11111111
674
+ WHEN raw_ns BETWEEN 12500001 AND 20000000 THEN 16666667
675
+ WHEN raw_ns BETWEEN 20000001 AND 35000000 THEN 33333333
676
+ ELSE raw_ns
677
+ END AS vsync_period_ns
678
+ FROM (
679
+ SELECT CAST(COALESCE(
680
+ (SELECT PERCENTILE(interval_ns, 0.5)
681
+ FROM vsync_intervals
682
+ WHERE interval_ns > 5500000 AND interval_ns < 50000000),
683
+ 16666667
684
+ ) AS INTEGER) AS raw_ns
685
+ )
686
+ ),
687
+ app_frames AS (
688
+ SELECT
689
+ COALESCE(a.display_frame_token, a.surface_frame_token) as display_frame_token,
690
+ a.ts,
691
+ CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END as dur,
692
+ COALESCE(a.jank_type, 'Unknown') as jank_type,
693
+ COALESCE(a.present_type, 'Unknown Present') as present_type,
694
+ a.layer_name,
695
+ a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END as present_ts,
696
+ LAG(a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END)
697
+ OVER (PARTITION BY a.layer_name ORDER BY a.ts) as prev_present_ts
698
+ FROM actual_frame_timeline_slice a
699
+ LEFT JOIN process p ON a.upid = p.upid
700
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
701
+ AND p.name NOT LIKE '/system/%'
702
+ AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
703
+ AND (${end_ts} IS NULL OR a.ts < ${end_ts})
704
+ AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
705
+ ),
706
+ -- 掉帧检测:双信号混合策略
707
+ jank_analysis AS (
708
+ SELECT
709
+ jank_type,
710
+ dur,
711
+ -- is_consumer_jank: 双信号混合检测
712
+ CASE
713
+ WHEN present_type IN ('Late Present', 'Dropped Frame')
714
+ AND jank_type != 'Buffer Stuffing' THEN 1
715
+ WHEN jank_type = 'Buffer Stuffing'
716
+ AND prev_present_ts IS NOT NULL
717
+ AND present_ts - prev_present_ts > (SELECT vsync_period_ns FROM vsync_config) * 1.5
718
+ AND present_ts - prev_present_ts <= (SELECT vsync_period_ns FROM vsync_config) * 6 THEN 1
719
+ ELSE 0
720
+ END as is_consumer_jank
721
+ FROM app_frames
722
+ )
723
+ SELECT
724
+ jank_type,
725
+ COUNT(*) as count,
726
+ -- 实际用户感知掉帧数(present_type 为 Late/Dropped)
727
+ SUM(is_consumer_jank) as real_jank_count,
728
+ -- 假阳性数(jank_type 报告掉帧,但 present_type 未标记为 Late/Dropped)
729
+ SUM(CASE WHEN jank_type != 'None' AND is_consumer_jank = 0 THEN 1 ELSE 0 END) as false_positive,
730
+ CAST(SUM(CASE WHEN dur > 0 THEN dur ELSE 0 END) AS REAL) as total_dur,
731
+ CAST(ROUND(AVG(CASE WHEN dur > 0 THEN dur ELSE NULL END)) AS INTEGER) as avg_dur,
732
+ CASE
733
+ WHEN jank_type GLOB '*App*' OR jank_type = 'Self Jank' THEN '标签:App'
734
+ WHEN jank_type GLOB '*SurfaceFlinger*' THEN '标签:SurfaceFlinger'
735
+ WHEN jank_type = 'Buffer Stuffing' THEN '标签:Buffer Stuffing(需验证)'
736
+ WHEN jank_type = 'None' THEN '标签:None(可能漏检)'
737
+ ELSE '标签:Other'
738
+ END as responsibility
739
+ FROM jank_analysis
740
+ GROUP BY jank_type
741
+ ORDER BY real_jank_count DESC, count DESC
742
+ LIMIT 10
743
+ save_as: jank_stats
744
+ condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && environment.data[0]?.has_data === 1"
745
+
746
+ # ==========================================================================
747
+ # L2: 滑动区间列表
748
+ # ==========================================================================
749
+ - id: scroll_sessions
750
+ type: atomic
751
+ name: "滑动区间列表"
752
+ display:
753
+ level: detail
754
+ layer: list
755
+ title: "滑动区间"
756
+ expandable: true
757
+ expandableBindSource: session_stats # 绑定 session_stats_batch 的 save_as
758
+ columns:
759
+ - name: session_id
760
+ label: "区间"
761
+ type: number
762
+ - name: process_name
763
+ label: "进程"
764
+ type: string
765
+ - name: start_ts
766
+ label: "开始时间"
767
+ type: timestamp
768
+ clickAction: navigate_range
769
+ durationColumn: duration
770
+ - name: end_ts
771
+ label: "结束时间"
772
+ type: timestamp
773
+ clickAction: navigate_timeline
774
+ - name: frame_count
775
+ label: "帧数"
776
+ type: number
777
+ format: compact
778
+ - name: duration_ms
779
+ label: "持续时间"
780
+ type: duration
781
+ format: duration_ms
782
+ unit: ms
783
+ hidden: true
784
+ - name: duration
785
+ label: "持续时间"
786
+ type: duration
787
+ format: duration_ms
788
+ unit: ns
789
+ - name: avg_dur
790
+ label: "平均帧耗时"
791
+ type: duration
792
+ format: duration_ms
793
+ unit: ns
794
+ - name: max_dur
795
+ label: "最大帧耗时"
796
+ type: duration
797
+ format: duration_ms
798
+ unit: ns
799
+ - name: session_fps
800
+ label: "FPS"
801
+ type: number
802
+ sql: |
803
+ WITH
804
+ -- 动态 VSync 周期检测用于 session 切分(限定在分析区间内)
805
+ vsync_intervals AS (
806
+ SELECT c.ts - LAG(c.ts) OVER (ORDER BY c.ts) as interval_ns
807
+ FROM counter c
808
+ JOIN counter_track t ON c.track_id = t.id
809
+ WHERE t.name = 'VSYNC-sf'
810
+ AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
811
+ AND (${end_ts} IS NULL OR c.ts < ${end_ts})
812
+ ),
813
+ vsync_config AS (
814
+ SELECT CASE
815
+ WHEN raw_ns BETWEEN 5500000 AND 6500000 THEN 6060606
816
+ WHEN raw_ns BETWEEN 6500001 AND 7500000 THEN 6944444
817
+ WHEN raw_ns BETWEEN 7500001 AND 9500000 THEN 8333333
818
+ WHEN raw_ns BETWEEN 9500001 AND 12500000 THEN 11111111
819
+ WHEN raw_ns BETWEEN 12500001 AND 20000000 THEN 16666667
820
+ WHEN raw_ns BETWEEN 20000001 AND 35000000 THEN 33333333
821
+ ELSE raw_ns
822
+ END AS vsync_period_ns
823
+ FROM (
824
+ SELECT CAST(COALESCE(
825
+ (SELECT PERCENTILE(interval_ns, 0.5)
826
+ FROM vsync_intervals
827
+ WHERE interval_ns > 5500000 AND interval_ns < 50000000),
828
+ 16666667
829
+ ) AS INTEGER) AS raw_ns
830
+ )
831
+ ),
832
+ frame_gaps AS (
833
+ SELECT
834
+ COALESCE(a.display_frame_token, a.surface_frame_token) as frame_id,
835
+ a.ts,
836
+ a.dur,
837
+ a.upid,
838
+ p.name as process_name,
839
+ LAG(a.ts + a.dur) OVER (PARTITION BY a.upid ORDER BY a.ts) as prev_end,
840
+ a.ts - LAG(a.ts + a.dur) OVER (PARTITION BY a.upid ORDER BY a.ts) as gap_ns
841
+ FROM actual_frame_timeline_slice a
842
+ JOIN process p ON a.upid = p.upid
843
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
844
+ AND p.name NOT LIKE '/system/%'
845
+ AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
846
+ AND (${end_ts} IS NULL OR a.ts < ${end_ts})
847
+ AND a.dur > 0
848
+ AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
849
+ ),
850
+ session_markers AS (
851
+ SELECT *,
852
+ CASE WHEN gap_ns IS NULL OR gap_ns > (SELECT vsync_period_ns * 6 FROM vsync_config) THEN 1 ELSE 0 END as new_session
853
+ FROM frame_gaps
854
+ ),
855
+ sessions AS (
856
+ SELECT *,
857
+ SUM(new_session) OVER (PARTITION BY upid ORDER BY ts) as session_id
858
+ FROM session_markers
859
+ )
860
+ SELECT
861
+ session_id,
862
+ process_name,
863
+ printf('%d', MIN(ts)) as start_ts,
864
+ printf('%d', MAX(ts + dur)) as end_ts,
865
+ COUNT(*) as frame_count,
866
+ -- duration_ms is the primary display column (already in ms)
867
+ ROUND((MAX(ts + dur) - MIN(ts)) / 1e6, 1) as duration_ms,
868
+ -- duration in ns as string to avoid 32-bit integer overflow (for downstream consumers)
869
+ printf('%d', MAX(ts + dur) - MIN(ts)) as duration,
870
+ CAST(ROUND(AVG(dur)) AS INTEGER) as avg_dur,
871
+ MAX(dur) as max_dur,
872
+ ROUND(1e9 * COUNT(*) / NULLIF(MAX(ts + dur) - MIN(ts), 0), 1) as session_fps
873
+ FROM sessions
874
+ GROUP BY upid, session_id
875
+ HAVING COUNT(*) >= 10
876
+ AND (MAX(ts + dur) - MIN(ts)) > 200000000
877
+ ORDER BY MIN(ts)
878
+ save_as: sessions
879
+ condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && environment.data[0]?.has_data === 1"
880
+
881
+ # ==========================================================================
882
+ # L2: Per-Session Statistics Batch (expandable data for scroll_sessions)
883
+ # 每个滑动区间的四象限/CPU频率/大小核分布,作为展开行数据
884
+ # 一次扫描 thread_state,一次扫描 counter,避免 N 次重复查询
885
+ # ==========================================================================
886
+ - id: session_stats_batch
887
+ type: atomic
888
+ name: "滑动区间统计(批量)"
889
+ optional: true
890
+ display: false
891
+ save_as: session_stats
892
+ condition: "scroll_sessions.data?.length > 0"
893
+ sql: |
894
+ WITH
895
+ -- 1. VSync config (同 scroll_sessions)
896
+ vsync_intervals AS (
897
+ SELECT c.ts - LAG(c.ts) OVER (ORDER BY c.ts) as interval_ns
898
+ FROM counter c
899
+ JOIN counter_track t ON c.track_id = t.id
900
+ WHERE t.name = 'VSYNC-sf'
901
+ AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
902
+ AND (${end_ts} IS NULL OR c.ts < ${end_ts})
903
+ ),
904
+ vsync_config AS (
905
+ SELECT CASE
906
+ WHEN raw_ns BETWEEN 5500000 AND 6500000 THEN 6060606
907
+ WHEN raw_ns BETWEEN 6500001 AND 7500000 THEN 6944444
908
+ WHEN raw_ns BETWEEN 7500001 AND 9500000 THEN 8333333
909
+ WHEN raw_ns BETWEEN 9500001 AND 12500000 THEN 11111111
910
+ WHEN raw_ns BETWEEN 12500001 AND 20000000 THEN 16666667
911
+ WHEN raw_ns BETWEEN 20000001 AND 35000000 THEN 33333333
912
+ ELSE raw_ns
913
+ END AS vsync_period_ns
914
+ FROM (
915
+ SELECT CAST(COALESCE(
916
+ (SELECT PERCENTILE(interval_ns, 0.5)
917
+ FROM vsync_intervals
918
+ WHERE interval_ns > 5500000 AND interval_ns < 50000000),
919
+ 16666667
920
+ ) AS INTEGER) AS raw_ns
921
+ )
922
+ ),
923
+ -- 2. Session boundaries (同 scroll_sessions)
924
+ frame_gaps AS (
925
+ SELECT
926
+ a.ts, a.dur, a.upid,
927
+ p.name as process_name,
928
+ a.ts - LAG(a.ts + a.dur) OVER (PARTITION BY a.upid ORDER BY a.ts) as gap_ns
929
+ FROM actual_frame_timeline_slice a
930
+ JOIN process p ON a.upid = p.upid
931
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
932
+ AND p.name NOT LIKE '/system/%'
933
+ AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
934
+ AND (${end_ts} IS NULL OR a.ts < ${end_ts})
935
+ AND a.dur > 0
936
+ AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
937
+ ),
938
+ session_markers AS (
939
+ SELECT *,
940
+ CASE WHEN gap_ns IS NULL OR gap_ns > (SELECT vsync_period_ns * 6 FROM vsync_config) THEN 1 ELSE 0 END as new_session
941
+ FROM frame_gaps
942
+ ),
943
+ sessions_raw AS (
944
+ SELECT *,
945
+ SUM(new_session) OVER (PARTITION BY upid ORDER BY ts) as session_id
946
+ FROM session_markers
947
+ ),
948
+ session_bounds AS (
949
+ SELECT
950
+ upid, session_id, process_name,
951
+ MIN(ts) as start_ts,
952
+ MAX(ts + dur) as end_ts
953
+ FROM sessions_raw
954
+ GROUP BY upid, session_id
955
+ HAVING COUNT(*) >= 10
956
+ AND (MAX(ts + dur) - MIN(ts)) > 200000000
957
+ ),
958
+ -- 3. ONE scan of thread_state: 同时供四象限和大小核分布使用
959
+ thread_detail AS (
960
+ SELECT
961
+ sb.session_id,
962
+ sb.process_name,
963
+ CASE WHEN t.tid = p.pid THEN 'MainThread' ELSE t.name END as thread_name,
964
+ ts.state,
965
+ COALESCE(ct.core_type, 'unknown') as core_type,
966
+ ts.dur
967
+ FROM thread_state ts
968
+ JOIN thread t ON ts.utid = t.utid
969
+ JOIN process p ON t.upid = p.upid
970
+ LEFT JOIN _cpu_topology ct ON ts.cpu = ct.cpu_id
971
+ JOIN session_bounds sb ON p.upid = sb.upid
972
+ AND ts.ts >= sb.start_ts AND ts.ts < sb.end_ts
973
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
974
+ AND p.name NOT LIKE '/system/%'
975
+ AND (t.tid = p.pid OR t.name IN ('RenderThread', 'GPU completion', 'hwuiTask0', 'hwuiTask1'))
976
+ ),
977
+ -- 4. 四象限聚合 (MainThread + RenderThread)
978
+ quadrant_agg AS (
979
+ SELECT
980
+ session_id, process_name,
981
+ thread_name as thread,
982
+ SUM(CASE WHEN state = 'Running' AND core_type IN ('prime', 'big') THEN dur ELSE 0 END) as q1_ns,
983
+ SUM(CASE WHEN state = 'Running' AND core_type NOT IN ('prime', 'big') THEN dur ELSE 0 END) as q2_ns,
984
+ SUM(CASE WHEN state = 'R' THEN dur ELSE 0 END) as q3_ns,
985
+ SUM(CASE WHEN state IN ('D', 'DK') THEN dur ELSE 0 END) as q4a_ns,
986
+ SUM(CASE WHEN state IN ('S', 'I') THEN dur ELSE 0 END) as q4b_ns,
987
+ SUM(dur) as total_ns
988
+ FROM thread_detail
989
+ WHERE thread_name IN ('MainThread', 'RenderThread')
990
+ GROUP BY session_id, process_name, thread_name
991
+ ),
992
+ -- 5. 大小核分布聚合 (所有出图线程, Running 状态)
993
+ core_aff_raw AS (
994
+ SELECT
995
+ session_id, process_name, thread_name, core_type,
996
+ SUM(CASE WHEN state = 'Running' THEN dur ELSE 0 END) as run_dur_ns
997
+ FROM thread_detail
998
+ GROUP BY session_id, process_name, thread_name, core_type
999
+ HAVING SUM(CASE WHEN state = 'Running' THEN dur ELSE 0 END) > 0
1000
+ ),
1001
+ core_aff_with_pct AS (
1002
+ SELECT ca.*,
1003
+ ROUND(100.0 * ca.run_dur_ns / NULLIF(
1004
+ SUM(ca.run_dur_ns) OVER (PARTITION BY ca.session_id, ca.process_name, ca.thread_name), 0
1005
+ ), 1) as pct
1006
+ FROM core_aff_raw ca
1007
+ ),
1008
+ -- 6. CPU 频率聚合 (一次 counter 扫描)
1009
+ cpu_freq_agg AS (
1010
+ SELECT
1011
+ sb.session_id, sb.process_name,
1012
+ ct.core_type,
1013
+ COUNT(DISTINCT cct.cpu) as num_cores,
1014
+ ROUND(AVG(c.value) / 1000, 0) as avg_freq_mhz,
1015
+ ROUND(MAX(c.value) / 1000, 0) as max_freq_mhz,
1016
+ ROUND(MIN(c.value) / 1000, 0) as min_freq_mhz
1017
+ FROM counter c
1018
+ JOIN cpu_counter_track cct ON c.track_id = cct.id
1019
+ JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
1020
+ JOIN session_bounds sb ON c.ts >= sb.start_ts AND c.ts < sb.end_ts
1021
+ WHERE cct.name = 'cpufreq'
1022
+ GROUP BY sb.session_id, sb.process_name, ct.core_type
1023
+ )
1024
+ -- 最终输出: 每个 session 一行, 3 个 JSON 列 + 匹配键
1025
+ SELECT
1026
+ sb.session_id,
1027
+ sb.process_name,
1028
+ printf('%d', sb.start_ts) as start_ts,
1029
+ (SELECT json_group_array(json_object(
1030
+ 'thread', sub.thread,
1031
+ 'q1_big_pct', ROUND(100.0 * sub.q1_ns / NULLIF(sub.total_ns, 0), 1),
1032
+ 'q2_little_pct', ROUND(100.0 * sub.q2_ns / NULLIF(sub.total_ns, 0), 1),
1033
+ 'q3_runnable_pct', ROUND(100.0 * sub.q3_ns / NULLIF(sub.total_ns, 0), 1),
1034
+ 'q4a_io_pct', ROUND(100.0 * sub.q4a_ns / NULLIF(sub.total_ns, 0), 1),
1035
+ 'q4b_sleep_pct', ROUND(100.0 * sub.q4b_ns / NULLIF(sub.total_ns, 0), 1),
1036
+ 'total_ms', ROUND(sub.total_ns / 1e6, 1)
1037
+ )) FROM (
1038
+ SELECT * FROM quadrant_agg qa
1039
+ WHERE qa.session_id = sb.session_id AND qa.process_name = sb.process_name
1040
+ ORDER BY CASE qa.thread WHEN 'MainThread' THEN 1 ELSE 2 END
1041
+ ) sub) as quadrant_json,
1042
+ (SELECT json_group_array(json_object(
1043
+ 'core_type', sub.core_type,
1044
+ 'num_cores', sub.num_cores,
1045
+ 'avg_freq_mhz', sub.avg_freq_mhz,
1046
+ 'max_freq_mhz', sub.max_freq_mhz,
1047
+ 'min_freq_mhz', sub.min_freq_mhz
1048
+ )) FROM (
1049
+ SELECT * FROM cpu_freq_agg cf
1050
+ WHERE cf.session_id = sb.session_id AND cf.process_name = sb.process_name
1051
+ ORDER BY cf.max_freq_mhz DESC
1052
+ ) sub) as cpu_freq_json,
1053
+ (SELECT json_group_array(json_object(
1054
+ 'thread_name', sub.thread_name,
1055
+ 'core_type', sub.core_type,
1056
+ 'run_ms', ROUND(sub.run_dur_ns / 1e6, 2),
1057
+ 'pct', sub.pct
1058
+ )) FROM (
1059
+ SELECT * FROM core_aff_with_pct cap
1060
+ WHERE cap.session_id = sb.session_id AND cap.process_name = sb.process_name
1061
+ ORDER BY
1062
+ CASE cap.thread_name
1063
+ WHEN 'MainThread' THEN 1 WHEN 'RenderThread' THEN 2
1064
+ WHEN 'GPU completion' THEN 3 ELSE 4
1065
+ END, cap.run_dur_ns DESC
1066
+ ) sub) as core_affinity_json
1067
+ FROM session_bounds sb
1068
+ ORDER BY sb.start_ts
1069
+
1070
+ # ==========================================================================
1071
+ # L2: 区间掉帧统计 (基于 present_type 列检测掉帧)
1072
+ # ==========================================================================
1073
+ - id: session_jank
1074
+ type: atomic
1075
+ name: "区间掉帧统计"
1076
+ display:
1077
+ level: detail
1078
+ layer: list
1079
+ title: "区间掉帧"
1080
+ columns:
1081
+ - name: session_id
1082
+ label: "区间"
1083
+ type: number
1084
+ - name: frame_count
1085
+ label: "总帧数"
1086
+ type: number
1087
+ format: compact
1088
+ - name: janky_count
1089
+ label: "感知掉帧"
1090
+ type: number
1091
+ format: compact
1092
+ - name: jank_rate
1093
+ label: "感知掉帧率"
1094
+ type: percentage
1095
+ format: percentage
1096
+ - name: app_janky_count
1097
+ label: "App 掉帧"
1098
+ type: number
1099
+ format: compact
1100
+ - name: buffer_stuffing_count
1101
+ label: "Buffer Stuffing"
1102
+ type: number
1103
+ format: compact
1104
+ - name: max_vsync_missed
1105
+ label: "最大跳帧"
1106
+ type: number
1107
+ - name: jank_types
1108
+ label: "掉帧类型"
1109
+ type: string
1110
+ format: truncate
1111
+ sql: |
1112
+ WITH
1113
+ -- 动态 VSync 周期检测(限定在分析区间内,仅用于 session 切分)
1114
+ vsync_intervals_for_session AS (
1115
+ SELECT c.ts - LAG(c.ts) OVER (ORDER BY c.ts) as interval_ns
1116
+ FROM counter c
1117
+ JOIN counter_track t ON c.track_id = t.id
1118
+ WHERE t.name = 'VSYNC-sf'
1119
+ AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
1120
+ AND (${end_ts} IS NULL OR c.ts < ${end_ts})
1121
+ ),
1122
+ vsync_config_for_session AS (
1123
+ SELECT CASE
1124
+ WHEN raw_ns BETWEEN 5500000 AND 6500000 THEN 6060606
1125
+ WHEN raw_ns BETWEEN 6500001 AND 7500000 THEN 6944444
1126
+ WHEN raw_ns BETWEEN 7500001 AND 9500000 THEN 8333333
1127
+ WHEN raw_ns BETWEEN 9500001 AND 12500000 THEN 11111111
1128
+ WHEN raw_ns BETWEEN 12500001 AND 20000000 THEN 16666667
1129
+ WHEN raw_ns BETWEEN 20000001 AND 35000000 THEN 33333333
1130
+ ELSE raw_ns
1131
+ END AS vsync_period_ns
1132
+ FROM (
1133
+ SELECT CAST(COALESCE(
1134
+ (SELECT PERCENTILE(interval_ns, 0.5)
1135
+ FROM vsync_intervals_for_session
1136
+ WHERE interval_ns > 5500000 AND interval_ns < 50000000),
1137
+ 16666667
1138
+ ) AS INTEGER) AS raw_ns
1139
+ )
1140
+ ),
1141
+ frame_gaps AS (
1142
+ SELECT
1143
+ COALESCE(a.display_frame_token, a.surface_frame_token) as display_frame_token,
1144
+ a.ts, a.dur, a.upid,
1145
+ a.layer_name,
1146
+ a.jank_type,
1147
+ COALESCE(a.present_type, 'Unknown Present') as present_type,
1148
+ p.name as process_name,
1149
+ a.ts - LAG(a.ts + a.dur) OVER (PARTITION BY a.upid ORDER BY a.ts) as time_gap_ns,
1150
+ a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END as present_ts,
1151
+ LAG(a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END)
1152
+ OVER (PARTITION BY a.layer_name ORDER BY a.ts) as prev_present_ts
1153
+ FROM actual_frame_timeline_slice a
1154
+ JOIN process p ON a.upid = p.upid
1155
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
1156
+ AND p.name NOT LIKE '/system/%'
1157
+ AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
1158
+ AND (${end_ts} IS NULL OR a.ts < ${end_ts})
1159
+ AND a.dur > 0
1160
+ AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
1161
+ ),
1162
+ session_markers AS (
1163
+ SELECT *,
1164
+ CASE WHEN time_gap_ns IS NULL OR time_gap_ns > (SELECT vsync_period_ns * 6 FROM vsync_config_for_session) THEN 1 ELSE 0 END as new_session
1165
+ FROM frame_gaps
1166
+ ),
1167
+ sessions_raw AS (
1168
+ SELECT *,
1169
+ SUM(new_session) OVER (PARTITION BY upid ORDER BY ts) as session_id
1170
+ FROM session_markers
1171
+ ),
1172
+ sessions AS (
1173
+ SELECT
1174
+ session_id,
1175
+ process_name,
1176
+ MIN(ts) as start_ts,
1177
+ MAX(ts + dur) as end_ts,
1178
+ COUNT(*) as frame_count
1179
+ FROM sessions_raw
1180
+ GROUP BY upid, session_id
1181
+ HAVING COUNT(*) >= 10
1182
+ AND (MAX(ts + dur) - MIN(ts)) > 200000000
1183
+ ),
1184
+ -- 掉帧检测:双信号混合策略
1185
+ session_token_gap_jank AS (
1186
+ SELECT
1187
+ sr.session_id,
1188
+ -- 感知掉帧:双信号混合检测
1189
+ SUM(CASE
1190
+ WHEN sr.present_type IN ('Late Present', 'Dropped Frame')
1191
+ AND sr.jank_type != 'Buffer Stuffing' THEN 1
1192
+ WHEN sr.jank_type = 'Buffer Stuffing'
1193
+ AND sr.prev_present_ts IS NOT NULL
1194
+ AND sr.present_ts - sr.prev_present_ts > (SELECT vsync_period_ns FROM vsync_config_for_session) * 1.5
1195
+ AND sr.present_ts - sr.prev_present_ts <= (SELECT vsync_period_ns FROM vsync_config_for_session) * 6 THEN 1
1196
+ ELSE 0 END) as consumer_jank_count,
1197
+ SUM(CASE WHEN sr.present_type IN ('Late Present', 'Dropped Frame')
1198
+ AND sr.jank_type IN ('Self Jank', 'App Deadline Missed') THEN 1 ELSE 0 END) as app_jank_count,
1199
+ -- Buffer Stuffing 总帧数(管线背压,含正常 BS 和异常 BS)
1200
+ SUM(CASE WHEN sr.jank_type = 'Buffer Stuffing' THEN 1 ELSE 0 END) as buffer_stuffing_count,
1201
+ MAX(CASE
1202
+ WHEN (
1203
+ (sr.present_type IN ('Late Present', 'Dropped Frame') AND sr.jank_type != 'Buffer Stuffing')
1204
+ OR (sr.jank_type = 'Buffer Stuffing' AND sr.prev_present_ts IS NOT NULL
1205
+ AND sr.present_ts - sr.prev_present_ts > (SELECT vsync_period_ns FROM vsync_config_for_session) * 1.5
1206
+ AND sr.present_ts - sr.prev_present_ts <= (SELECT vsync_period_ns FROM vsync_config_for_session) * 6)
1207
+ ) AND sr.prev_present_ts IS NOT NULL
1208
+ AND sr.present_ts - sr.prev_present_ts > (SELECT vsync_period_ns FROM vsync_config_for_session) * 1.5
1209
+ THEN MAX(CAST(ROUND((sr.present_ts - sr.prev_present_ts) * 1.0 / (SELECT vsync_period_ns FROM vsync_config_for_session) - 1, 0) AS INTEGER), 0)
1210
+ ELSE 0 END) as max_vsync_missed,
1211
+ GROUP_CONCAT(DISTINCT CASE
1212
+ WHEN (sr.present_type IN ('Late Present', 'Dropped Frame') AND sr.jank_type != 'Buffer Stuffing')
1213
+ OR (sr.jank_type = 'Buffer Stuffing' AND sr.prev_present_ts IS NOT NULL
1214
+ AND sr.present_ts - sr.prev_present_ts > (SELECT vsync_period_ns FROM vsync_config_for_session) * 1.5)
1215
+ THEN COALESCE(sr.jank_type, 'None') END) as jank_types
1216
+ FROM sessions_raw sr
1217
+ GROUP BY sr.session_id
1218
+ )
1219
+ SELECT
1220
+ s.session_id,
1221
+ s.frame_count,
1222
+ -- 感知掉帧 = consumer_jank_count(双信号已过滤正常 BS)
1223
+ COALESCE(stj.consumer_jank_count, 0) as janky_count,
1224
+ ROUND(100.0 * COALESCE(stj.consumer_jank_count, 0) / NULLIF(s.frame_count, 0), 2) as jank_rate,
1225
+ COALESCE(stj.app_jank_count, 0) as app_janky_count,
1226
+ COALESCE(stj.buffer_stuffing_count, 0) as buffer_stuffing_count,
1227
+ COALESCE(stj.max_vsync_missed, 0) as max_vsync_missed,
1228
+ stj.jank_types
1229
+ FROM sessions s
1230
+ LEFT JOIN session_token_gap_jank stj ON s.session_id = stj.session_id
1231
+ ORDER BY s.session_id
1232
+ save_as: session_jank_data
1233
+ optional: true
1234
+ condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && environment.data[0]?.has_data === 1"
1235
+
1236
+ # ==========================================================================
1237
+ # 内部步骤:获取所有掉帧的帧列表 (双信号混合检测)
1238
+ # ==========================================================================
1239
+ # 核心原理:
1240
+ # - 非 BS 帧:present_type IN ('Late Present', 'Dropped Frame') 为权威信号
1241
+ # - BS 帧:间隔 > 1.5x vsync = 真实掉帧(被 BS 掩盖)
1242
+ # - vsync_missed 用 present_ts 间隔估算严重度(辅助信号)
1243
+ # - jank_type 用于标记责任归属(App 侧 vs SF 侧)
1244
+ - id: get_app_jank_frames
1245
+ type: atomic
1246
+ name: "获取真正掉帧帧"
1247
+ synthesize:
1248
+ role: list
1249
+ groupBy:
1250
+ - field: jank_responsibility
1251
+ title: 责任归属分布
1252
+ - field: jank_type
1253
+ title: 掉帧类型分布
1254
+ display: false # 隐藏独立显示 — 由 batch_frame_root_cause 统一展示掉帧列表。此 step 仍运行,数据通过 save_as 供下游引用。
1255
+ sql: |
1256
+ WITH
1257
+ -- VSync 周期(限定在分析区间内,避免 VRR 省电时段干扰)
1258
+ vsync_intervals AS (
1259
+ SELECT c.ts - LAG(c.ts) OVER (ORDER BY c.ts) as interval_ns
1260
+ FROM counter c
1261
+ JOIN counter_track t ON c.track_id = t.id
1262
+ WHERE t.name = 'VSYNC-sf'
1263
+ AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
1264
+ AND (${end_ts} IS NULL OR c.ts < ${end_ts})
1265
+ ),
1266
+ timing_config AS (
1267
+ SELECT CASE
1268
+ WHEN raw_ns BETWEEN 5500000 AND 6500000 THEN 6060606
1269
+ WHEN raw_ns BETWEEN 6500001 AND 7500000 THEN 6944444
1270
+ WHEN raw_ns BETWEEN 7500001 AND 9500000 THEN 8333333
1271
+ WHEN raw_ns BETWEEN 9500001 AND 12500000 THEN 11111111
1272
+ WHEN raw_ns BETWEEN 12500001 AND 20000000 THEN 16666667
1273
+ WHEN raw_ns BETWEEN 20000001 AND 35000000 THEN 33333333
1274
+ ELSE raw_ns
1275
+ END AS vsync_period_ns
1276
+ FROM (
1277
+ SELECT CAST(COALESCE(
1278
+ (SELECT PERCENTILE(interval_ns, 0.5)
1279
+ FROM vsync_intervals
1280
+ WHERE interval_ns > 5500000 AND interval_ns < 50000000),
1281
+ 16666667
1282
+ ) AS INTEGER) AS raw_ns
1283
+ )
1284
+ ),
1285
+ -- Per-layer 帧序列:按 layer_name 分组,计算 token gap + 时间 gap
1286
+ layer_frames AS (
1287
+ SELECT
1288
+ a.display_frame_token,
1289
+ COALESCE(a.display_frame_token, a.surface_frame_token) as frame_token,
1290
+ a.ts,
1291
+ a.dur,
1292
+ a.upid,
1293
+ a.layer_name,
1294
+ a.jank_type,
1295
+ a.jank_severity_type,
1296
+ COALESCE(a.present_type, 'Unknown Present') as present_type,
1297
+ -- Per-layer token gap:SF 跳过了多少个 DisplayFrame 没有消费该 layer 的 buffer
1298
+ a.display_frame_token - LAG(a.display_frame_token)
1299
+ OVER (PARTITION BY a.layer_name ORDER BY a.display_frame_token) AS token_gap,
1300
+ -- 时间 gap(会话切分用)
1301
+ a.ts - LAG(a.ts + a.dur)
1302
+ OVER (PARTITION BY a.layer_name ORDER BY a.ts) AS time_gap_ns,
1303
+ -- present_ts(vsync_missed 严重度估算 + 报告展示用)
1304
+ a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END AS present_ts,
1305
+ LAG(a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END)
1306
+ OVER (PARTITION BY a.layer_name ORDER BY a.ts) AS prev_present_ts
1307
+ FROM actual_frame_timeline_slice a
1308
+ LEFT JOIN process p ON a.upid = p.upid
1309
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
1310
+ AND p.name NOT LIKE '/system/%'
1311
+ AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
1312
+ AND (${end_ts} IS NULL OR a.ts < ${end_ts})
1313
+ AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
1314
+ ),
1315
+ session_markers AS (
1316
+ SELECT
1317
+ *,
1318
+ CASE WHEN time_gap_ns IS NULL OR time_gap_ns > (SELECT vsync_period_ns * 6 FROM timing_config) THEN 1 ELSE 0 END as new_session
1319
+ FROM layer_frames
1320
+ ),
1321
+ sessions_map AS (
1322
+ SELECT
1323
+ *,
1324
+ SUM(new_session) OVER (PARTITION BY layer_name ORDER BY ts) as session_id
1325
+ FROM session_markers
1326
+ ),
1327
+ -- Per-layer 掉帧检测:双信号混合策略
1328
+ -- 非 BS 帧:present_type IN ('Late Present', 'Dropped Frame')
1329
+ -- BS 帧:间隔 > 1.5x vsync = 真实掉帧(被 BS 掩盖的卡顿)
1330
+ jank_frames AS (
1331
+ SELECT
1332
+ sm.frame_token as frame_id,
1333
+ sm.display_frame_token,
1334
+ sm.upid,
1335
+ sm.ts as actual_start,
1336
+ sm.ts + sm.dur as actual_end,
1337
+ sm.dur as actual_dur,
1338
+ sm.jank_type,
1339
+ sm.jank_severity_type,
1340
+ sm.layer_name,
1341
+ sm.session_id,
1342
+ -- token_gap 保留用于信息展示
1343
+ sm.token_gap,
1344
+ -- vsync_missed:用 present_ts 间隔估算严重度(辅助信号)
1345
+ CASE
1346
+ WHEN sm.prev_present_ts IS NOT NULL AND sm.present_ts - sm.prev_present_ts > tc.vsync_period_ns * 1.5
1347
+ THEN MAX(CAST(ROUND((sm.present_ts - sm.prev_present_ts) * 1.0 / tc.vsync_period_ns - 1, 0) AS INTEGER), 0)
1348
+ ELSE 1 -- at least 1 vsync missed if present_type is Late/Dropped
1349
+ END as vsync_missed,
1350
+ -- 责任归属
1351
+ CASE
1352
+ WHEN sm.jank_type IN ('Self Jank', 'App Deadline Missed') THEN 'APP'
1353
+ WHEN sm.jank_type GLOB '*SurfaceFlinger*' THEN 'SF'
1354
+ WHEN sm.jank_type = 'Buffer Stuffing' THEN 'BUFFER_STUFFING'
1355
+ WHEN sm.jank_type = 'None' OR sm.jank_type IS NULL THEN 'HIDDEN'
1356
+ ELSE 'UNKNOWN'
1357
+ END as jank_responsibility,
1358
+ -- 消费端呈现间隔(毫秒)— 报告展示用
1359
+ ROUND((sm.present_ts - COALESCE(sm.prev_present_ts, sm.present_ts)) / 1e6, 2) as present_interval_ms,
1360
+ -- 隐形掉帧标记
1361
+ CASE WHEN sm.jank_type = 'None' OR sm.jank_type IS NULL THEN 1 ELSE 0 END as is_hidden_jank
1362
+ FROM sessions_map sm
1363
+ CROSS JOIN timing_config tc
1364
+ WHERE (
1365
+ -- 非 BS:present_type 为权威信号
1366
+ (sm.present_type IN ('Late Present', 'Dropped Frame') AND sm.jank_type != 'Buffer Stuffing')
1367
+ OR
1368
+ -- BS + 异常间隔:真实掉帧被 BS 掩盖
1369
+ (sm.jank_type = 'Buffer Stuffing'
1370
+ AND sm.prev_present_ts IS NOT NULL
1371
+ AND (sm.present_ts - sm.prev_present_ts) > tc.vsync_period_ns * 1.5
1372
+ AND (sm.present_ts - sm.prev_present_ts) <= tc.vsync_period_ns * 6)
1373
+ )
1374
+ -- 排除会话间断帧
1375
+ AND (sm.time_gap_ns IS NULL OR sm.time_gap_ns <= tc.vsync_period_ns * 6)
1376
+ ),
1377
+ -- Guilty frame 溯源:找到导致缓冲区枯竭的慢帧
1378
+ -- BlastBufferQueue 三缓冲下,可见卡顿发生在慢帧 2-3 帧之后
1379
+ guilty_frame_candidates AS (
1380
+ SELECT
1381
+ jf.frame_id AS starvation_frame_id,
1382
+ prev.display_frame_token AS candidate_id,
1383
+ prev.ts AS candidate_start,
1384
+ prev.dur AS candidate_dur,
1385
+ prev.jank_type AS candidate_jank_type,
1386
+ CASE WHEN prev.dur > tc.vsync_period_ns THEN 1 ELSE 0 END AS is_slow,
1387
+ ROUND((prev.dur - tc.vsync_period_ns) / 1e6, 2) AS over_budget_ms,
1388
+ ROW_NUMBER() OVER (
1389
+ PARTITION BY jf.frame_id
1390
+ ORDER BY prev.dur DESC
1391
+ ) AS guilt_rank
1392
+ FROM jank_frames jf
1393
+ CROSS JOIN timing_config tc
1394
+ JOIN sessions_map prev
1395
+ ON prev.layer_name = jf.layer_name
1396
+ AND prev.session_id = jf.session_id
1397
+ AND prev.display_frame_token IS NOT NULL
1398
+ AND prev.display_frame_token >= jf.display_frame_token - 5
1399
+ AND prev.display_frame_token < jf.display_frame_token
1400
+ AND prev.dur > 0
1401
+ WHERE jf.display_frame_token IS NOT NULL
1402
+ ),
1403
+ guilty_frames AS (
1404
+ SELECT
1405
+ starvation_frame_id,
1406
+ candidate_id AS guilty_frame_id,
1407
+ candidate_start AS guilty_start,
1408
+ candidate_dur AS guilty_dur,
1409
+ candidate_jank_type AS guilty_jank_type,
1410
+ over_budget_ms
1411
+ FROM guilty_frame_candidates
1412
+ WHERE guilt_rank = 1 AND is_slow = 1
1413
+ ),
1414
+ frame_thread_info AS (
1415
+ SELECT
1416
+ jf.frame_id,
1417
+ jf.upid,
1418
+ jf.actual_start,
1419
+ jf.actual_end,
1420
+ jf.actual_dur,
1421
+ jf.jank_type,
1422
+ jf.jank_severity_type,
1423
+ jf.layer_name,
1424
+ jf.session_id,
1425
+ jf.token_gap,
1426
+ jf.vsync_missed,
1427
+ jf.jank_responsibility,
1428
+ jf.present_interval_ms,
1429
+ jf.is_hidden_jank,
1430
+ -- Guilty frame 信息
1431
+ gf.guilty_frame_id,
1432
+ gf.guilty_dur,
1433
+ gf.over_budget_ms,
1434
+ -- 生产线程时间范围(动态检测,不依赖硬编码线程名)
1435
+ (SELECT MIN(s.ts) FROM slice s
1436
+ JOIN thread_track tt ON s.track_id = tt.id
1437
+ JOIN thread t ON tt.utid = t.utid
1438
+ WHERE t.upid = jf.upid
1439
+ AND t.name NOT LIKE 'Binder:%'
1440
+ AND s.ts >= jf.actual_start - 5000000
1441
+ AND s.ts <= jf.actual_end
1442
+ AND (s.name LIKE 'Choreographer#doFrame%' OR s.name LIKE 'Framework::BeginFrame%'
1443
+ OR s.name LIKE 'DrawFrame%' OR s.name LIKE 'PlayerLoop%'
1444
+ OR s.dur > 2000000)
1445
+ ) as main_start_ts,
1446
+ (SELECT MAX(s.ts + s.dur) FROM slice s
1447
+ JOIN thread_track tt ON s.track_id = tt.id
1448
+ JOIN thread t ON tt.utid = t.utid
1449
+ WHERE t.upid = jf.upid
1450
+ AND t.name NOT LIKE 'Binder:%'
1451
+ AND s.ts >= jf.actual_start - 5000000
1452
+ AND s.ts <= jf.actual_end
1453
+ ) as main_end_ts,
1454
+ (SELECT MIN(s.ts) FROM slice s
1455
+ JOIN thread_track tt ON s.track_id = tt.id
1456
+ JOIN thread t ON tt.utid = t.utid
1457
+ JOIN process p ON t.upid = p.upid
1458
+ WHERE t.upid = jf.upid
1459
+ AND t.tid != p.pid
1460
+ AND t.name NOT LIKE 'Binder:%'
1461
+ AND s.ts >= jf.actual_start
1462
+ AND s.ts <= jf.actual_end
1463
+ AND s.dur > 1000000
1464
+ ) as render_start_ts,
1465
+ (SELECT MAX(s.ts + s.dur) FROM slice s
1466
+ JOIN thread_track tt ON s.track_id = tt.id
1467
+ JOIN thread t ON tt.utid = t.utid
1468
+ JOIN process p ON t.upid = p.upid
1469
+ WHERE t.upid = jf.upid
1470
+ AND t.tid != p.pid
1471
+ AND t.name NOT LIKE 'Binder:%'
1472
+ AND s.ts >= jf.actual_start
1473
+ AND s.ts <= jf.actual_end
1474
+ ) as render_end_ts
1475
+ FROM jank_frames jf
1476
+ LEFT JOIN guilty_frames gf ON gf.starvation_frame_id = jf.frame_id
1477
+ )
1478
+ ,
1479
+ ranked_frames AS (
1480
+ SELECT
1481
+ fti.frame_id,
1482
+ fti.actual_start,
1483
+ fti.actual_end,
1484
+ fti.main_start_ts,
1485
+ fti.main_end_ts,
1486
+ fti.render_start_ts,
1487
+ fti.render_end_ts,
1488
+ fti.actual_dur,
1489
+ fti.jank_type,
1490
+ fti.jank_severity_type,
1491
+ fti.layer_name,
1492
+ fti.session_id,
1493
+ fti.token_gap,
1494
+ fti.vsync_missed,
1495
+ fti.jank_responsibility,
1496
+ fti.present_interval_ms,
1497
+ p.name as process_name,
1498
+ p.pid,
1499
+ p.upid,
1500
+ fti.is_hidden_jank,
1501
+ -- Guilty frame 信息
1502
+ fti.guilty_frame_id,
1503
+ fti.guilty_dur,
1504
+ fti.over_budget_ms,
1505
+ -- 前序帧信息(用于掉帧原因诊断)
1506
+ LAG(fti.actual_dur) OVER (PARTITION BY fti.session_id ORDER BY fti.actual_start) as prev_frame_dur,
1507
+ LAG(fti.jank_type) OVER (PARTITION BY fti.session_id ORDER BY fti.actual_start) as prev_frame_jank_type,
1508
+ -- 按 vsync_missed 排序(最严重的掉帧优先)
1509
+ ROW_NUMBER() OVER (PARTITION BY fti.session_id ORDER BY fti.vsync_missed DESC, fti.actual_dur DESC) as rank_in_session
1510
+ FROM frame_thread_info fti
1511
+ JOIN process p ON fti.upid = p.upid
1512
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
1513
+ AND p.name NOT LIKE '/system/%'
1514
+ )
1515
+ SELECT
1516
+ printf('%d', frame_id) as frame_id,
1517
+ printf('%d', actual_start) as start_ts,
1518
+ printf('%d', actual_end) as end_ts,
1519
+ printf('%d', COALESCE(main_start_ts, actual_start)) as main_start_ts,
1520
+ printf('%d', COALESCE(main_end_ts, actual_end)) as main_end_ts,
1521
+ COALESCE(main_end_ts - main_start_ts, 0) as main_dur,
1522
+ ROUND(COALESCE(main_end_ts - main_start_ts, 0) / 1e6, 2) as main_dur_ms,
1523
+ printf('%d', COALESCE(render_start_ts, actual_start)) as render_start_ts,
1524
+ printf('%d', COALESCE(render_end_ts, actual_end)) as render_end_ts,
1525
+ COALESCE(render_end_ts - render_start_ts, 0) as render_dur,
1526
+ ROUND(COALESCE(render_end_ts - render_start_ts, 0) / 1e6, 2) as render_dur_ms,
1527
+ printf('%d', actual_dur) as dur,
1528
+ ROUND(actual_dur / 1e6, 2) as dur_ms,
1529
+ jank_type,
1530
+ jank_severity_type,
1531
+ layer_name,
1532
+ process_name,
1533
+ pid,
1534
+ session_id,
1535
+ token_gap,
1536
+ vsync_missed,
1537
+ present_interval_ms,
1538
+ jank_responsibility,
1539
+ -- Guilty frame 信息
1540
+ CASE WHEN guilty_frame_id IS NOT NULL THEN printf('%d', guilty_frame_id) END as guilty_frame_id,
1541
+ CASE WHEN guilty_dur IS NOT NULL THEN ROUND(guilty_dur / 1e6, 2) END as guilty_dur_ms,
1542
+ over_budget_ms,
1543
+ -- 掉帧原因说明
1544
+ CASE
1545
+ -- 管线耗尽:guilty frame 导致缓冲区枯竭
1546
+ WHEN guilty_frame_id IS NOT NULL THEN
1547
+ '管线耗尽 — 帧 ' || guilty_frame_id || ' 耗时 '
1548
+ || ROUND(guilty_dur / 1e6, 2) || 'ms(超出预算 '
1549
+ || over_budget_ms || 'ms),导致后续 ' || vsync_missed || ' 帧缓冲区枯竭'
1550
+ -- 隐形掉帧:框架标记 None 但 token gap 检测到掉帧
1551
+ WHEN jank_responsibility = 'HIDDEN' THEN
1552
+ '缓冲区枯竭 — 框架未标记(Perfetto 时间线帧颜色为绿色),'
1553
+ || '但该 Layer 跳过 ' || vsync_missed || ' 个 DisplayFrame 无新 buffer'
1554
+ -- App Self Jank
1555
+ WHEN jank_type = 'Self Jank' THEN
1556
+ 'App 自身处理超时(' || ROUND(actual_dur / 1e6, 2) || 'ms),跳过 ' || vsync_missed || ' 帧'
1557
+ -- App Deadline Missed
1558
+ WHEN jank_type = 'App Deadline Missed' THEN
1559
+ 'App 未在 VSync deadline 前完成渲染(' || ROUND(actual_dur / 1e6, 2) || 'ms),跳过 ' || vsync_missed || ' 帧'
1560
+ -- SurfaceFlinger 问题
1561
+ WHEN jank_responsibility = 'SF' THEN
1562
+ 'SurfaceFlinger 合成延迟(' || jank_type || '),App 已按时交付 buffer'
1563
+ -- Buffer Stuffing
1564
+ WHEN jank_responsibility = 'BUFFER_STUFFING' THEN
1565
+ '帧耗时 ' || ROUND(actual_dur / 1e6, 2) || 'ms,BufferQueue 阻塞(Buffer Stuffing),延迟 ' || vsync_missed || ' 个 VSync'
1566
+ -- App side
1567
+ WHEN jank_responsibility = 'APP' THEN
1568
+ 'App 超时(' || ROUND(actual_dur / 1e6, 2) || 'ms),跳过 ' || vsync_missed || ' 帧'
1569
+ ELSE
1570
+ COALESCE(jank_type, '未知') || ',跳过 ' || vsync_missed || ' 帧'
1571
+ END as jank_cause,
1572
+ is_hidden_jank,
1573
+ ROW_NUMBER() OVER (ORDER BY session_id, actual_start) as frame_index
1574
+ FROM ranked_frames
1575
+ WHERE rank_in_session <= CASE
1576
+ WHEN ${max_frames_per_session} IS NULL THEN 200
1577
+ WHEN CAST(${max_frames_per_session} AS INTEGER) <= 0 THEN 200
1578
+ ELSE CAST(${max_frames_per_session} AS INTEGER)
1579
+ END
1580
+ ORDER BY session_id, actual_start
1581
+ save_as: app_jank_frames
1582
+ condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && environment?.data?.[0]?.has_data === 1 && ((perf_summary?.data?.[0]?.janky_frames || 0) > 0 || (jank_stats?.data?.[0]?.real_jank_count || 0) > 0)"
1583
+
1584
+ # ==========================================================================
1585
+ # L3-batch: 批量帧根因分类 (所有掉帧帧 → 单次 SQL 根因决策树)
1586
+ # 目的:一次性分析所有掉帧帧的完整指标和根因分类
1587
+ # 输出:四象限(MainThread+RenderThread) + CPU频率 + Binder/GC重叠 + 根因分类
1588
+ # jank_frame_detail 仅用于可选补充深钻(CPU freq timeline + top slices 详情)
1589
+ # ==========================================================================
1590
+ - id: batch_frame_root_cause
1591
+ type: atomic
1592
+ name: "掉帧列表(含根因分类)"
1593
+ optional: true
1594
+ synthesize:
1595
+ role: list
1596
+ groupBy:
1597
+ - field: jank_responsibility
1598
+ title: 责任归属分布
1599
+ - field: reason_code
1600
+ title: 根因分类分布
1601
+ display:
1602
+ level: detail
1603
+ layer: list
1604
+ title: "掉帧列表"
1605
+ expandable: true
1606
+ expandableBindSource: batch_root_cause # 自绑定:展开行显示 hidden 列的详细诊断数据
1607
+ collapsible: true
1608
+ defaultCollapsed: true
1609
+ metadataFields:
1610
+ - process_name
1611
+ - pid
1612
+ columns:
1613
+ - name: frame_id
1614
+ label: "帧 ID"
1615
+ type: string
1616
+ - name: frame_index
1617
+ label: "帧序号"
1618
+ type: number
1619
+ hidden: true
1620
+ - name: start_ts
1621
+ label: "开始时间"
1622
+ type: timestamp
1623
+ unit: ns
1624
+ clickAction: navigate_range
1625
+ durationColumn: dur
1626
+ - name: dur
1627
+ label: "帧耗时(ns)"
1628
+ type: duration
1629
+ unit: ns
1630
+ hidden: true
1631
+ - name: dur_ms
1632
+ label: "帧耗时"
1633
+ type: duration
1634
+ format: duration_ms
1635
+ - name: jank_type
1636
+ label: "掉帧类型"
1637
+ type: string
1638
+ - name: vsync_missed
1639
+ label: "跳帧数"
1640
+ type: number
1641
+ - name: present_interval_ms
1642
+ label: "呈现间隔(ms)"
1643
+ type: duration
1644
+ format: duration_ms
1645
+ unit: ms
1646
+ - name: jank_responsibility
1647
+ label: "责任归属"
1648
+ type: string
1649
+ - name: reason_code
1650
+ label: "根因分类"
1651
+ type: string
1652
+ - name: primary_cause
1653
+ label: "主要原因"
1654
+ type: string
1655
+ - name: confidence
1656
+ label: "置信度"
1657
+ type: string
1658
+ - name: top_slice_name
1659
+ label: "关键操作"
1660
+ type: string
1661
+ - name: top_slice_ms
1662
+ label: "操作耗时"
1663
+ type: duration
1664
+ format: duration_ms
1665
+ - name: main_q1_pct
1666
+ label: "Q1 大核运行%"
1667
+ type: percentage
1668
+ format: percentage
1669
+ hidden: true
1670
+ - name: main_q2_pct
1671
+ label: "Q2 小核运行%"
1672
+ type: percentage
1673
+ format: percentage
1674
+ hidden: true
1675
+ - name: main_q3_pct
1676
+ label: "Q3 调度等待%"
1677
+ type: percentage
1678
+ format: percentage
1679
+ hidden: true
1680
+ - name: main_q4a_pct
1681
+ label: "Q4a IO阻塞%"
1682
+ type: percentage
1683
+ format: percentage
1684
+ hidden: true
1685
+ - name: main_q4b_pct
1686
+ label: "Q4b 锁/等待%"
1687
+ type: percentage
1688
+ format: percentage
1689
+ hidden: true
1690
+ - name: render_q1_pct
1691
+ label: "RT Q1 大核%"
1692
+ type: percentage
1693
+ format: percentage
1694
+ hidden: true
1695
+ - name: render_q2_pct
1696
+ label: "RT Q2 小核%"
1697
+ type: percentage
1698
+ format: percentage
1699
+ hidden: true
1700
+ - name: render_q3_pct
1701
+ label: "RT Q3 调度%"
1702
+ type: percentage
1703
+ format: percentage
1704
+ hidden: true
1705
+ - name: render_q4a_pct
1706
+ label: "RT Q4a IO阻塞%"
1707
+ type: percentage
1708
+ format: percentage
1709
+ hidden: true
1710
+ - name: render_q4b_pct
1711
+ label: "RT Q4b 锁/等待%"
1712
+ type: percentage
1713
+ format: percentage
1714
+ hidden: true
1715
+ - name: big_avg_freq_mhz
1716
+ label: "大核均频"
1717
+ type: number
1718
+ hidden: true
1719
+ - name: big_max_freq_mhz
1720
+ label: "大核峰频"
1721
+ type: number
1722
+ hidden: true
1723
+ - name: ramp_ms
1724
+ label: "升频延迟"
1725
+ type: duration
1726
+ format: duration_ms
1727
+ hidden: true
1728
+ - name: top_slice_little_pct
1729
+ label: "小核占比%"
1730
+ type: percentage
1731
+ format: percentage
1732
+ hidden: true
1733
+ - name: top_slice_big_pct
1734
+ label: "大核占比%"
1735
+ type: percentage
1736
+ format: percentage
1737
+ hidden: true
1738
+ - name: top_slice_runnable_pct
1739
+ label: "Runnable占比%"
1740
+ type: percentage
1741
+ format: percentage
1742
+ hidden: true
1743
+ - name: gpu_fence_ms
1744
+ label: "GPU Fence最长"
1745
+ type: duration
1746
+ format: duration_ms
1747
+ hidden: true
1748
+ - name: gpu_fence_total_ms
1749
+ label: "GPU Fence总计"
1750
+ type: duration
1751
+ format: duration_ms
1752
+ hidden: true
1753
+ - name: shader_count
1754
+ label: "Shader编译次数"
1755
+ type: number
1756
+ hidden: true
1757
+ - name: shader_ms
1758
+ label: "Shader编译耗时"
1759
+ type: duration
1760
+ format: duration_ms
1761
+ hidden: true
1762
+ - name: binder_overlap_ms
1763
+ label: "Binder重叠"
1764
+ type: duration
1765
+ format: duration_ms
1766
+ hidden: true
1767
+ - name: gc_overlap_ms
1768
+ label: "GC重叠"
1769
+ type: duration
1770
+ format: duration_ms
1771
+ hidden: true
1772
+ - name: gc_count
1773
+ label: "GC次数"
1774
+ type: number
1775
+ hidden: true
1776
+ - name: frame_budget_ms
1777
+ label: "帧预算"
1778
+ type: duration
1779
+ format: duration_ms
1780
+ hidden: true
1781
+ - name: device_peak_freq_mhz
1782
+ label: "设备峰值频率"
1783
+ type: number
1784
+ hidden: true
1785
+ - name: file_io_overlap_ms
1786
+ label: "文件IO重叠"
1787
+ type: duration
1788
+ format: duration_ms
1789
+ hidden: true
1790
+ - name: cpu_freq_clusters_json
1791
+ label: "CPU频率详情"
1792
+ type: string
1793
+ hidden: true
1794
+ - name: freq_timeline_json
1795
+ label: "频率变化时间线"
1796
+ type: string
1797
+ hidden: true
1798
+ - name: main_slices_json
1799
+ label: "主线程耗时操作"
1800
+ type: string
1801
+ hidden: true
1802
+ - name: render_slices_json
1803
+ label: "渲染线程耗时操作"
1804
+ type: string
1805
+ hidden: true
1806
+ - name: binder_calls_json
1807
+ label: "Binder调用"
1808
+ type: string
1809
+ hidden: true
1810
+ - name: gc_events_json
1811
+ label: "GC事件"
1812
+ type: string
1813
+ hidden: true
1814
+ - name: lock_contention_json
1815
+ label: "锁竞争"
1816
+ type: string
1817
+ hidden: true
1818
+ sql: |
1819
+ -- 批量帧根因分类:对所有消费端真实掉帧执行简化版根因决策树
1820
+ -- 与 jank_frame_detail 的 root_cause_summary 使用相同优先级 CASE 树
1821
+ -- 区别:jank_frame_detail 是单帧深钻,此步骤是全帧一次性分类
1822
+ WITH
1823
+ -- ========== 1. VSync 配置 ==========
1824
+ vsync_intervals AS (
1825
+ SELECT c.ts - LAG(c.ts) OVER (ORDER BY c.ts) as interval_ns
1826
+ FROM counter c
1827
+ JOIN counter_track t ON c.track_id = t.id
1828
+ WHERE t.name = 'VSYNC-sf'
1829
+ AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
1830
+ AND (${end_ts} IS NULL OR c.ts < ${end_ts})
1831
+ ),
1832
+ timing_config AS (
1833
+ SELECT
1834
+ vsync_period_ns,
1835
+ ROUND(vsync_period_ns / 1e6, 2) as frame_budget_ms,
1836
+ ROUND(vsync_period_ns / 1e6 * 0.50, 2) as slice_critical_ms,
1837
+ ROUND(MAX(vsync_period_ns / 1e6 * 0.35, 2.0), 2) as freq_ramp_critical_ms,
1838
+ ROUND(MAX(vsync_period_ns / 1e6 * 0.18, 1.5), 2) as binder_overlap_critical_ms
1839
+ FROM (
1840
+ SELECT CASE
1841
+ WHEN raw_ns BETWEEN 5500000 AND 6500000 THEN 6060606
1842
+ WHEN raw_ns BETWEEN 6500001 AND 7500000 THEN 6944444
1843
+ WHEN raw_ns BETWEEN 7500001 AND 9500000 THEN 8333333
1844
+ WHEN raw_ns BETWEEN 9500001 AND 12500000 THEN 11111111
1845
+ WHEN raw_ns BETWEEN 12500001 AND 20000000 THEN 16666667
1846
+ WHEN raw_ns BETWEEN 20000001 AND 35000000 THEN 33333333
1847
+ ELSE raw_ns
1848
+ END AS vsync_period_ns
1849
+ FROM (
1850
+ SELECT CAST(COALESCE(
1851
+ (SELECT PERCENTILE(interval_ns, 0.5)
1852
+ FROM vsync_intervals
1853
+ WHERE interval_ns > 5500000 AND interval_ns < 50000000),
1854
+ 16666667
1855
+ ) AS INTEGER) AS raw_ns
1856
+ )
1857
+ )
1858
+ ),
1859
+ -- ========== 1b. 设备峰值频率(全 trace 大核最高频率,用于温控/限频检测)==========
1860
+ -- 不加 start_ts/end_ts 过滤 — 求设备硬件频率上限
1861
+ -- 用 MAX — P95 会被大量空闲低频样本主导(CPU 大部分时间低频运行)
1862
+ -- 优先级已从 P0.6 下调到 P4.5,配合 60% 阈值足以防止误判
1863
+ device_peak_freq AS (
1864
+ SELECT COALESCE(ROUND(MAX(c.value) / 1000, 0), 0) as device_peak_freq_mhz
1865
+ FROM counter c
1866
+ JOIN cpu_counter_track cct ON c.track_id = cct.id AND cct.name = 'cpufreq'
1867
+ LEFT JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
1868
+ WHERE ct.core_type IN ('prime', 'big')
1869
+ ),
1870
+ -- ========== 2. Per-layer 帧序列 + 双信号混合掉帧检测(与 get_app_jank_frames 一致)==========
1871
+ layer_frames AS (
1872
+ SELECT
1873
+ COALESCE(a.display_frame_token, a.surface_frame_token) as display_frame_token,
1874
+ a.ts as frame_start,
1875
+ a.ts + a.dur as frame_end,
1876
+ a.dur as frame_dur,
1877
+ a.jank_type,
1878
+ COALESCE(a.present_type, 'Unknown Present') as present_type,
1879
+ a.upid,
1880
+ a.layer_name,
1881
+ COALESCE(a.display_frame_token, a.surface_frame_token) - LAG(COALESCE(a.display_frame_token, a.surface_frame_token))
1882
+ OVER (PARTITION BY a.layer_name ORDER BY COALESCE(a.display_frame_token, a.surface_frame_token)) AS token_gap,
1883
+ a.ts - LAG(a.ts + a.dur)
1884
+ OVER (PARTITION BY a.layer_name ORDER BY a.ts) AS time_gap_ns,
1885
+ a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END AS present_ts,
1886
+ LAG(a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END)
1887
+ OVER (PARTITION BY a.layer_name ORDER BY a.ts) AS prev_present_ts
1888
+ FROM actual_frame_timeline_slice a
1889
+ LEFT JOIN process p ON a.upid = p.upid
1890
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
1891
+ AND p.name NOT LIKE '/system/%'
1892
+ AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
1893
+ AND (${end_ts} IS NULL OR a.ts < ${end_ts})
1894
+ AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
1895
+ ),
1896
+ session_markers AS (
1897
+ SELECT *,
1898
+ CASE WHEN time_gap_ns IS NULL OR time_gap_ns > (SELECT vsync_period_ns * 6 FROM timing_config) THEN 1 ELSE 0 END as new_session
1899
+ FROM layer_frames
1900
+ ),
1901
+ sessions_map AS (
1902
+ SELECT *,
1903
+ SUM(new_session) OVER (PARTITION BY layer_name ORDER BY frame_start) as session_id
1904
+ FROM session_markers
1905
+ ),
1906
+ -- 掉帧检测:双信号混合策略(与 jank_frames 保持一致)
1907
+ all_jank_frames AS (
1908
+ SELECT
1909
+ sm.display_frame_token,
1910
+ sm.frame_start,
1911
+ sm.frame_end,
1912
+ sm.frame_dur,
1913
+ sm.jank_type,
1914
+ sm.upid,
1915
+ sm.session_id,
1916
+ p.pid,
1917
+ p.name as process_name,
1918
+ ROUND(sm.frame_dur / 1e6, 2) as dur_ms,
1919
+ CASE
1920
+ WHEN sm.jank_type IN ('Self Jank', 'App Deadline Missed') THEN 'APP'
1921
+ WHEN sm.jank_type GLOB '*SurfaceFlinger*' THEN 'SF'
1922
+ WHEN sm.jank_type = 'Buffer Stuffing' THEN 'BUFFER_STUFFING'
1923
+ WHEN sm.jank_type = 'None' OR sm.jank_type IS NULL THEN 'HIDDEN'
1924
+ ELSE 'UNKNOWN'
1925
+ END as jank_responsibility,
1926
+ CASE
1927
+ WHEN sm.prev_present_ts IS NOT NULL AND sm.present_ts - sm.prev_present_ts > tc.vsync_period_ns * 1.5
1928
+ THEN MAX(CAST(ROUND((sm.present_ts - sm.prev_present_ts) * 1.0 / tc.vsync_period_ns - 1, 0) AS INTEGER), 0)
1929
+ ELSE 1 -- at least 1 vsync missed if present_type is Late/Dropped
1930
+ END as vsync_missed,
1931
+ CASE
1932
+ WHEN sm.prev_present_ts IS NOT NULL
1933
+ THEN ROUND((sm.present_ts - sm.prev_present_ts) / 1e6, 2)
1934
+ ELSE NULL
1935
+ END as present_interval_ms
1936
+ FROM sessions_map sm
1937
+ CROSS JOIN timing_config tc
1938
+ JOIN process p ON sm.upid = p.upid
1939
+ WHERE (
1940
+ -- 非 BS:present_type 为权威信号
1941
+ (sm.present_type IN ('Late Present', 'Dropped Frame') AND (sm.jank_type IS NULL OR sm.jank_type != 'Buffer Stuffing'))
1942
+ OR
1943
+ -- BS + 异常间隔:真实掉帧被 BS 掩盖
1944
+ (sm.jank_type = 'Buffer Stuffing'
1945
+ AND sm.prev_present_ts IS NOT NULL
1946
+ AND (sm.present_ts - sm.prev_present_ts) > tc.vsync_period_ns * 1.5
1947
+ AND (sm.present_ts - sm.prev_present_ts) <= tc.vsync_period_ns * 6)
1948
+ )
1949
+ -- 排除会话间断帧
1950
+ AND (sm.time_gap_ns IS NULL OR sm.time_gap_ns <= tc.vsync_period_ns * 6)
1951
+ ),
1952
+ -- 按严重度排序(与 get_app_jank_frames 完全一致的 rank_in_session 逻辑)
1953
+ ranked_jank_frames AS (
1954
+ SELECT *,
1955
+ ROW_NUMBER() OVER (PARTITION BY session_id ORDER BY vsync_missed DESC, frame_dur DESC) as rank_in_session
1956
+ FROM all_jank_frames
1957
+ ),
1958
+ -- 截断后重新编号(与 get_app_jank_frames 的 frame_index 完全对齐)
1959
+ jank_frame_list AS (
1960
+ SELECT
1961
+ display_frame_token, frame_start, frame_end, frame_dur, jank_type, upid, session_id,
1962
+ pid, process_name, dur_ms, jank_responsibility, vsync_missed, present_interval_ms,
1963
+ ROW_NUMBER() OVER (ORDER BY session_id, frame_start) as frame_index
1964
+ FROM ranked_jank_frames
1965
+ WHERE rank_in_session <= CASE
1966
+ WHEN ${max_frames_per_session} IS NULL THEN 200
1967
+ WHEN CAST(${max_frames_per_session} AS INTEGER) <= 0 THEN 200
1968
+ ELSE CAST(${max_frames_per_session} AS INTEGER)
1969
+ END
1970
+ ),
1971
+ -- ========== 3. Explicit role-based thread identification ==========
1972
+ -- Main thread: t.tid = p.pid (standard Android) OR t.name GLOB '*.ui' (Flutter)
1973
+ -- RenderThread: t.name = 'RenderThread' (standard Android) OR t.name GLOB '*.raster' (Flutter)
1974
+ -- Aligned with the jank_frame_detail.skill.yaml proven approach.
1975
+ per_frame_thread_roles AS (
1976
+ SELECT
1977
+ fl.frame_start,
1978
+ t.utid,
1979
+ t.tid,
1980
+ t.name as thread_name,
1981
+ CASE
1982
+ WHEN t.tid = p.pid THEN 'main'
1983
+ WHEN t.name GLOB '[0-9]*.ui' THEN 'main'
1984
+ WHEN t.name = 'RenderThread' THEN 'render'
1985
+ WHEN t.name GLOB '[0-9]*.raster' THEN 'render'
1986
+ END as role
1987
+ FROM jank_frame_list fl
1988
+ JOIN process p ON fl.upid = p.upid
1989
+ JOIN thread t ON t.upid = fl.upid
1990
+ WHERE t.tid = p.pid
1991
+ OR t.name = 'RenderThread'
1992
+ OR t.name GLOB '[0-9]*.ui'
1993
+ OR t.name GLOB '[0-9]*.raster'
1994
+ ),
1995
+ -- ========== 4. Per-frame: 最耗时 producer 线程 slice ==========
1996
+ frame_slices AS (
1997
+ SELECT
1998
+ fl.frame_start,
1999
+ s.name as slice_name,
2000
+ s.ts as slice_ts,
2001
+ s.dur as slice_dur_ns,
2002
+ ROUND(s.dur / 1e6, 2) as slice_dur_ms,
2003
+ ROUND((s.ts - fl.frame_start) / 1e6, 2) as slice_offset_ms,
2004
+ ROW_NUMBER() OVER (PARTITION BY fl.frame_start ORDER BY s.dur DESC) as rn
2005
+ FROM jank_frame_list fl
2006
+ JOIN per_frame_thread_roles ptr ON ptr.frame_start = fl.frame_start AND ptr.role = 'main'
2007
+ JOIN thread_track tt ON tt.utid = ptr.utid
2008
+ JOIN slice s ON s.track_id = tt.id
2009
+ AND s.ts >= fl.frame_start - 5000000
2010
+ AND s.ts < fl.frame_end
2011
+ AND s.dur >= 1000000
2012
+ ),
2013
+ top_slices AS (
2014
+ SELECT * FROM frame_slices WHERE rn = 1
2015
+ ),
2016
+ -- ========== 5. Per-frame top slice: 核心类型 + 调度分析 ==========
2017
+ top_slice_states AS (
2018
+ SELECT
2019
+ ts_top.frame_start,
2020
+ tst.state,
2021
+ COALESCE(ct.core_type, 'unknown') as core_type,
2022
+ (MIN(tst.ts + tst.dur, ts_top.slice_ts + ts_top.slice_dur_ns) - MAX(tst.ts, ts_top.slice_ts)) as overlap_ns
2023
+ FROM top_slices ts_top
2024
+ JOIN per_frame_thread_roles ptr ON ptr.frame_start = ts_top.frame_start AND ptr.role = 'main'
2025
+ JOIN thread_state tst ON tst.utid = ptr.utid
2026
+ AND tst.ts < ts_top.slice_ts + ts_top.slice_dur_ns
2027
+ AND tst.ts + tst.dur > ts_top.slice_ts
2028
+ LEFT JOIN _cpu_topology ct ON tst.cpu = ct.cpu_id
2029
+ ),
2030
+ per_frame_cpu_mix AS (
2031
+ SELECT
2032
+ frame_start,
2033
+ ROUND(100.0 * SUM(CASE WHEN state = 'Running' AND core_type IN ('medium', 'little') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
2034
+ / NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as little_run_pct,
2035
+ ROUND(100.0 * SUM(CASE WHEN state = 'Running' AND core_type IN ('prime', 'big') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
2036
+ / NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as big_run_pct,
2037
+ ROUND(100.0 * SUM(CASE WHEN state = 'R' AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
2038
+ / NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as runnable_pct
2039
+ FROM top_slice_states
2040
+ GROUP BY frame_start
2041
+ ),
2042
+ -- ========== 6. Per-frame: 主线程四象限 ==========
2043
+ frame_thread_states AS (
2044
+ SELECT
2045
+ fl.frame_start,
2046
+ tst.state,
2047
+ COALESCE(ct.core_type, 'unknown') as core_type,
2048
+ (MIN(tst.ts + tst.dur, fl.frame_end) - MAX(tst.ts, fl.frame_start)) as overlap_ns
2049
+ FROM jank_frame_list fl
2050
+ JOIN per_frame_thread_roles ptr ON ptr.frame_start = fl.frame_start AND ptr.role = 'main'
2051
+ JOIN thread_state tst ON tst.utid = ptr.utid
2052
+ AND tst.ts < fl.frame_end
2053
+ AND tst.ts + tst.dur > fl.frame_start
2054
+ LEFT JOIN _cpu_topology ct ON tst.cpu = ct.cpu_id
2055
+ ),
2056
+ per_frame_quadrants AS (
2057
+ SELECT
2058
+ frame_start,
2059
+ ROUND(100.0 * SUM(CASE WHEN state = 'Running' AND core_type IN ('prime', 'big') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
2060
+ / NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as q1_pct,
2061
+ ROUND(100.0 * SUM(CASE WHEN state = 'Running' AND core_type IN ('medium', 'little') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
2062
+ / NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as q2_pct,
2063
+ ROUND(100.0 * SUM(CASE WHEN state = 'R' AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
2064
+ / NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as q3_pct,
2065
+ ROUND(100.0 * SUM(CASE WHEN state IN ('D', 'DK') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
2066
+ / NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as q4a_pct,
2067
+ ROUND(100.0 * SUM(CASE WHEN state IN ('S', 'I') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
2068
+ / NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as q4b_pct
2069
+ FROM frame_thread_states
2070
+ GROUP BY frame_start
2071
+ ),
2072
+ -- ========== 6b. Per-frame: 渲染线程四象限 ==========
2073
+ render_thread_states AS (
2074
+ SELECT
2075
+ fl.frame_start,
2076
+ tst.state,
2077
+ COALESCE(ct.core_type, 'unknown') as core_type,
2078
+ (MIN(tst.ts + tst.dur, fl.frame_end) - MAX(tst.ts, fl.frame_start)) as overlap_ns
2079
+ FROM jank_frame_list fl
2080
+ JOIN per_frame_thread_roles ptr ON ptr.frame_start = fl.frame_start AND ptr.role = 'render'
2081
+ JOIN thread_state tst ON tst.utid = ptr.utid
2082
+ AND tst.ts < fl.frame_end
2083
+ AND tst.ts + tst.dur > fl.frame_start
2084
+ LEFT JOIN _cpu_topology ct ON tst.cpu = ct.cpu_id
2085
+ ),
2086
+ render_thread_quadrants AS (
2087
+ SELECT
2088
+ frame_start,
2089
+ ROUND(100.0 * SUM(CASE WHEN state = 'Running' AND core_type IN ('prime', 'big') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
2090
+ / NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as render_q1_pct,
2091
+ ROUND(100.0 * SUM(CASE WHEN state = 'Running' AND core_type IN ('medium', 'little') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
2092
+ / NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as render_q2_pct,
2093
+ ROUND(100.0 * SUM(CASE WHEN state = 'R' AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
2094
+ / NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as render_q3_pct,
2095
+ ROUND(100.0 * SUM(CASE WHEN state IN ('D', 'DK') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
2096
+ / NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as render_q4a_pct,
2097
+ ROUND(100.0 * SUM(CASE WHEN state IN ('S', 'I') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
2098
+ / NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as render_q4b_pct
2099
+ FROM render_thread_states
2100
+ GROUP BY frame_start
2101
+ ),
2102
+ -- ========== 7. Per-frame: 大核频率 ==========
2103
+ per_frame_freq AS (
2104
+ SELECT
2105
+ fl.frame_start,
2106
+ ROUND(AVG(c.value) / 1000, 0) as big_avg_freq_mhz,
2107
+ ROUND(MAX(c.value) / 1000, 0) as big_max_freq_mhz
2108
+ FROM jank_frame_list fl
2109
+ JOIN counter c ON c.ts >= fl.frame_start AND c.ts < fl.frame_end
2110
+ JOIN cpu_counter_track cct ON c.track_id = cct.id AND cct.name = 'cpufreq'
2111
+ LEFT JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
2112
+ WHERE ct.core_type IN ('prime', 'big')
2113
+ GROUP BY fl.frame_start
2114
+ ),
2115
+ -- ========== 8. Per-frame: 频率爬升延迟 ==========
2116
+ frame_peak_freq AS (
2117
+ SELECT fl.frame_start, MAX(c.value) as peak_khz
2118
+ FROM jank_frame_list fl
2119
+ JOIN counter c ON c.ts >= fl.frame_start AND c.ts < fl.frame_end
2120
+ JOIN cpu_counter_track cct ON c.track_id = cct.id AND cct.name = 'cpufreq'
2121
+ LEFT JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
2122
+ WHERE ct.core_type IN ('prime', 'big')
2123
+ GROUP BY fl.frame_start
2124
+ ),
2125
+ per_frame_ramp AS (
2126
+ SELECT
2127
+ fl.frame_start,
2128
+ ROUND(
2129
+ (COALESCE(
2130
+ MIN(CASE WHEN c.value >= CASE WHEN fpf.peak_khz * 0.70 > 1800000 THEN fpf.peak_khz * 0.70 ELSE 1800000 END THEN c.ts END),
2131
+ fl.frame_end
2132
+ ) - fl.frame_start) / 1e6, 2
2133
+ ) as ramp_to_high_ms
2134
+ FROM jank_frame_list fl
2135
+ JOIN frame_peak_freq fpf ON fpf.frame_start = fl.frame_start
2136
+ JOIN counter c ON c.ts >= fl.frame_start AND c.ts < fl.frame_end
2137
+ JOIN cpu_counter_track cct ON c.track_id = cct.id AND cct.name = 'cpufreq'
2138
+ LEFT JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
2139
+ WHERE ct.core_type IN ('prime', 'big')
2140
+ GROUP BY fl.frame_start
2141
+ ),
2142
+ -- ========== 9. Per-frame: Binder 同步与 top slice 重叠 ==========
2143
+ per_frame_binder AS (
2144
+ SELECT
2145
+ ts_top.frame_start,
2146
+ ROUND(COALESCE(SUM(
2147
+ CASE
2148
+ WHEN bt.client_ts < ts_top.slice_ts + ts_top.slice_dur_ns
2149
+ AND bt.client_ts + bt.client_dur > ts_top.slice_ts
2150
+ THEN (
2151
+ MIN(bt.client_ts + bt.client_dur, ts_top.slice_ts + ts_top.slice_dur_ns) -
2152
+ MAX(bt.client_ts, ts_top.slice_ts)
2153
+ )
2154
+ ELSE 0
2155
+ END
2156
+ ), 0) / 1e6, 2) as binder_overlap_ms
2157
+ FROM top_slices ts_top
2158
+ JOIN per_frame_thread_roles ptr ON ptr.frame_start = ts_top.frame_start AND ptr.role = 'main'
2159
+ LEFT JOIN android_binder_txns bt ON bt.client_tid = ptr.tid
2160
+ AND bt.is_sync = 1
2161
+ AND bt.client_ts < ts_top.slice_ts + ts_top.slice_dur_ns
2162
+ AND bt.client_ts + bt.client_dur > ts_top.slice_ts
2163
+ GROUP BY ts_top.frame_start
2164
+ ),
2165
+ -- ========== 9.5. Per-frame: GPU fence 等待检测 ==========
2166
+ gpu_fence_per_frame AS (
2167
+ SELECT
2168
+ fl.frame_start,
2169
+ MAX(CASE WHEN s.name GLOB '*Fence*' OR s.name GLOB '*fence*' OR s.name GLOB '*eglSwapBuffers*' OR s.name GLOB '*dequeueBuffer*'
2170
+ THEN s.dur ELSE 0 END) as max_fence_dur_ns,
2171
+ SUM(CASE WHEN s.name GLOB '*Fence*' OR s.name GLOB '*fence*' OR s.name GLOB '*eglSwapBuffers*' OR s.name GLOB '*dequeueBuffer*'
2172
+ THEN s.dur ELSE 0 END) as total_fence_dur_ns
2173
+ FROM jank_frame_list fl
2174
+ JOIN slice s ON s.ts >= fl.frame_start AND s.ts < fl.frame_end
2175
+ JOIN thread_track tk ON s.track_id = tk.id
2176
+ JOIN thread t ON tk.utid = t.utid
2177
+ WHERE t.upid = fl.upid -- same process only (no thread name filter needed)
2178
+ GROUP BY fl.frame_start
2179
+ ),
2180
+ -- ========== 9.6. Per-frame: Shader compilation 检测 ==========
2181
+ shader_per_frame AS (
2182
+ SELECT
2183
+ fl.frame_start,
2184
+ COUNT(*) as shader_count,
2185
+ SUM(s.dur) as total_shader_dur_ns
2186
+ FROM jank_frame_list fl
2187
+ JOIN slice s ON s.ts >= fl.frame_start AND s.ts < fl.frame_end
2188
+ JOIN thread_track tk ON s.track_id = tk.id
2189
+ JOIN thread t ON tk.utid = t.utid
2190
+ WHERE t.upid = fl.upid -- same process only (no thread name filter needed)
2191
+ AND (s.name GLOB '*shader*' OR s.name GLOB '*Shader*' OR s.name GLOB '*compile*' OR s.name GLOB '*Compile*')
2192
+ GROUP BY fl.frame_start
2193
+ ),
2194
+ -- ========== 9.7. Per-frame: GC 事件与帧窗口重叠 ==========
2195
+ per_frame_gc AS (
2196
+ SELECT
2197
+ fl.frame_start,
2198
+ ROUND(COALESCE(SUM(
2199
+ MIN(gc.gc_ts + gc.gc_dur, fl.frame_end) - MAX(gc.gc_ts, fl.frame_start)
2200
+ ), 0) / 1e6, 2) as gc_overlap_ms,
2201
+ COUNT(gc.gc_ts) as gc_count
2202
+ FROM jank_frame_list fl
2203
+ LEFT JOIN (
2204
+ SELECT gc.gc_ts, gc.gc_dur
2205
+ FROM android_garbage_collection_events gc
2206
+ JOIN thread t ON gc.tid = t.tid
2207
+ JOIN process p ON t.upid = p.upid
2208
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
2209
+ ) gc ON gc.gc_ts < fl.frame_end AND gc.gc_ts + gc.gc_dur > fl.frame_start
2210
+ GROUP BY fl.frame_start
2211
+ ),
2212
+ -- ========== 10. 批量详情 JSON 列(覆盖全部掉帧,避免 N+1 查询) ==========
2213
+ -- 10a. 全簇 CPU 频率 (prime/big/little)
2214
+ per_frame_cpu_clusters AS (
2215
+ SELECT frame_start,
2216
+ json_group_array(json_object(
2217
+ 'core_type', core_type,
2218
+ 'avg_mhz', avg_mhz,
2219
+ 'max_mhz', max_mhz,
2220
+ 'min_mhz', min_mhz
2221
+ )) as cpu_freq_clusters_json
2222
+ FROM (
2223
+ SELECT
2224
+ fl.frame_start,
2225
+ COALESCE(ct.core_type, 'unknown') as core_type,
2226
+ CAST(ROUND(AVG(c.value) / 1000, 0) AS INTEGER) as avg_mhz,
2227
+ CAST(ROUND(MAX(c.value) / 1000, 0) AS INTEGER) as max_mhz,
2228
+ CAST(ROUND(MIN(c.value) / 1000, 0) AS INTEGER) as min_mhz
2229
+ FROM jank_frame_list fl
2230
+ JOIN counter c ON c.ts >= fl.frame_start AND c.ts < fl.frame_end
2231
+ JOIN cpu_counter_track cct ON c.track_id = cct.id AND cct.name = 'cpufreq'
2232
+ LEFT JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
2233
+ GROUP BY fl.frame_start, COALESCE(ct.core_type, 'unknown')
2234
+ )
2235
+ GROUP BY frame_start
2236
+ ),
2237
+ -- 10b. 各 CPU 频率变化时间线(频率单位 GHz)
2238
+ per_frame_freq_changes AS (
2239
+ SELECT frame_start,
2240
+ json_group_array(json_object(
2241
+ 'relative_ms', relative_ms,
2242
+ 'cpu', cpu,
2243
+ 'core_type', core_type,
2244
+ 'freq_ghz', freq_ghz,
2245
+ 'change', change_dir
2246
+ )) as freq_timeline_json
2247
+ FROM (
2248
+ SELECT *,
2249
+ ROW_NUMBER() OVER (PARTITION BY frame_start ORDER BY relative_ms, cpu) as rn
2250
+ FROM (
2251
+ SELECT
2252
+ fl.frame_start,
2253
+ ROUND((c.ts - fl.frame_start) / 1e6, 2) as relative_ms,
2254
+ cct.cpu,
2255
+ COALESCE(ct.core_type, 'unknown') as core_type,
2256
+ ROUND(c.value / 1e6, 2) as freq_ghz,
2257
+ c.value as freq_khz,
2258
+ LAG(c.value) OVER (PARTITION BY fl.frame_start, cct.cpu ORDER BY c.ts) as prev_freq_khz,
2259
+ CASE
2260
+ WHEN c.value > COALESCE(LAG(c.value) OVER (PARTITION BY fl.frame_start, cct.cpu ORDER BY c.ts), c.value) THEN 'up'
2261
+ WHEN c.value < COALESCE(LAG(c.value) OVER (PARTITION BY fl.frame_start, cct.cpu ORDER BY c.ts), c.value) THEN 'down'
2262
+ ELSE 'stable'
2263
+ END as change_dir
2264
+ FROM jank_frame_list fl
2265
+ JOIN counter c ON c.ts >= fl.frame_start AND c.ts < fl.frame_end
2266
+ JOIN cpu_counter_track cct ON c.track_id = cct.id AND cct.name = 'cpufreq'
2267
+ LEFT JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
2268
+ )
2269
+ WHERE freq_khz != COALESCE(prev_freq_khz, 0)
2270
+ )
2271
+ WHERE rn <= 30
2272
+ GROUP BY frame_start
2273
+ ),
2274
+ -- 10c. 主线程 Top 8 耗时 Slice
2275
+ per_frame_main_top_slices AS (
2276
+ SELECT frame_start,
2277
+ json_group_array(json_object(
2278
+ 'name', slice_name,
2279
+ 'total_ms', dur_ms,
2280
+ 'count', cnt,
2281
+ 'max_ms', max_ms,
2282
+ 'ts', ts_str
2283
+ )) as main_slices_json
2284
+ FROM (
2285
+ SELECT
2286
+ fl.frame_start,
2287
+ s.name as slice_name,
2288
+ ROUND(SUM(s.dur) / 1e6, 2) as dur_ms,
2289
+ COUNT(*) as cnt,
2290
+ ROUND(MAX(s.dur) / 1e6, 2) as max_ms,
2291
+ printf('%d', MIN(s.ts)) as ts_str,
2292
+ ROW_NUMBER() OVER (PARTITION BY fl.frame_start ORDER BY SUM(s.dur) DESC) as rn
2293
+ FROM jank_frame_list fl
2294
+ JOIN per_frame_thread_roles ptr ON ptr.frame_start = fl.frame_start AND ptr.role = 'main'
2295
+ JOIN thread_track tt ON tt.utid = ptr.utid
2296
+ JOIN slice s ON s.track_id = tt.id
2297
+ AND s.ts >= fl.frame_start - 5000000
2298
+ AND s.ts < fl.frame_end
2299
+ AND s.dur >= 500000
2300
+ GROUP BY fl.frame_start, s.name
2301
+ HAVING dur_ms > 0.5
2302
+ )
2303
+ WHERE rn <= 8
2304
+ GROUP BY frame_start
2305
+ ),
2306
+ -- 10d. RenderThread Top 8 耗时 Slice
2307
+ per_frame_render_top_slices AS (
2308
+ SELECT frame_start,
2309
+ json_group_array(json_object(
2310
+ 'name', slice_name,
2311
+ 'total_ms', dur_ms,
2312
+ 'count', cnt,
2313
+ 'max_ms', max_ms,
2314
+ 'ts', ts_str
2315
+ )) as render_slices_json
2316
+ FROM (
2317
+ SELECT
2318
+ fl.frame_start,
2319
+ s.name as slice_name,
2320
+ ROUND(SUM(s.dur) / 1e6, 2) as dur_ms,
2321
+ COUNT(*) as cnt,
2322
+ ROUND(MAX(s.dur) / 1e6, 2) as max_ms,
2323
+ printf('%d', MIN(s.ts)) as ts_str,
2324
+ ROW_NUMBER() OVER (PARTITION BY fl.frame_start ORDER BY SUM(s.dur) DESC) as rn
2325
+ FROM jank_frame_list fl
2326
+ JOIN per_frame_thread_roles ptr ON ptr.frame_start = fl.frame_start AND ptr.role = 'render'
2327
+ JOIN thread_track tt ON tt.utid = ptr.utid
2328
+ JOIN slice s ON s.track_id = tt.id
2329
+ AND s.ts >= fl.frame_start - 5000000
2330
+ AND s.ts < fl.frame_end
2331
+ AND s.dur >= 500000
2332
+ GROUP BY fl.frame_start, s.name
2333
+ HAVING dur_ms > 0.5
2334
+ )
2335
+ WHERE rn <= 8
2336
+ GROUP BY frame_start
2337
+ ),
2338
+ -- 10e. Binder 调用详情(按 server_process 聚合,Top 5)
2339
+ per_frame_binder_detail AS (
2340
+ SELECT frame_start,
2341
+ json_group_array(json_object(
2342
+ 'server', server_process,
2343
+ 'count', cnt,
2344
+ 'dur_ms', dur_ms,
2345
+ 'max_ms', max_ms
2346
+ )) as binder_calls_json
2347
+ FROM (
2348
+ SELECT
2349
+ fl.frame_start,
2350
+ bt.server_process,
2351
+ COUNT(*) as cnt,
2352
+ ROUND(SUM(bt.client_dur) / 1e6, 2) as dur_ms,
2353
+ ROUND(MAX(bt.client_dur) / 1e6, 2) as max_ms,
2354
+ ROW_NUMBER() OVER (PARTITION BY fl.frame_start ORDER BY SUM(bt.client_dur) DESC) as rn
2355
+ FROM jank_frame_list fl
2356
+ JOIN per_frame_thread_roles ptr ON ptr.frame_start = fl.frame_start AND ptr.role = 'main'
2357
+ LEFT JOIN android_binder_txns bt ON bt.client_tid = ptr.tid
2358
+ AND bt.client_ts >= fl.frame_start
2359
+ AND bt.client_ts < fl.frame_end
2360
+ WHERE bt.server_process IS NOT NULL
2361
+ GROUP BY fl.frame_start, bt.server_process
2362
+ HAVING dur_ms > 0.1
2363
+ )
2364
+ WHERE rn <= 5
2365
+ GROUP BY frame_start
2366
+ ),
2367
+ -- 10f. GC 事件详情(按类型聚合)
2368
+ per_frame_gc_detail AS (
2369
+ SELECT frame_start,
2370
+ json_group_array(json_object(
2371
+ 'gc_type', gc_type,
2372
+ 'count', cnt,
2373
+ 'total_ms', total_dur_ms,
2374
+ 'overlap_ms', overlap_ms
2375
+ )) as gc_events_json
2376
+ FROM (
2377
+ SELECT
2378
+ fl.frame_start,
2379
+ COALESCE(gc.gc_type, 'unknown') as gc_type,
2380
+ COUNT(*) as cnt,
2381
+ ROUND(SUM(gc.gc_dur) / 1e6, 2) as total_dur_ms,
2382
+ ROUND(SUM(
2383
+ MAX(MIN(gc.gc_ts + gc.gc_dur, fl.frame_end) - MAX(gc.gc_ts, fl.frame_start), 0)
2384
+ ) / 1e6, 2) as overlap_ms
2385
+ FROM jank_frame_list fl
2386
+ LEFT JOIN (
2387
+ SELECT gc.gc_ts, gc.gc_dur, gc.gc_type, t.tid
2388
+ FROM android_garbage_collection_events gc
2389
+ JOIN thread t ON gc.tid = t.tid
2390
+ JOIN process p ON t.upid = p.upid
2391
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
2392
+ ) gc ON gc.gc_ts < fl.frame_end AND gc.gc_ts + gc.gc_dur > fl.frame_start
2393
+ WHERE gc.gc_ts IS NOT NULL
2394
+ GROUP BY fl.frame_start, COALESCE(gc.gc_type, 'unknown')
2395
+ HAVING overlap_ms > 0
2396
+ )
2397
+ GROUP BY frame_start
2398
+ ),
2399
+ -- 10g. 锁竞争详情(Top 5,需要 android_monitor_contention 表)
2400
+ per_frame_lock_detail AS (
2401
+ SELECT frame_start,
2402
+ json_group_array(json_object(
2403
+ 'method', blocking_method,
2404
+ 'blocker', blocking_thread_name,
2405
+ 'wait_ms', wait_ms,
2406
+ 'main_blocked', main_blocked
2407
+ )) as lock_contention_json
2408
+ FROM (
2409
+ SELECT
2410
+ fl.frame_start,
2411
+ amc.short_blocking_method as blocking_method,
2412
+ amc.blocking_thread_name,
2413
+ ROUND(amc.dur / 1e6, 2) as wait_ms,
2414
+ CASE WHEN amc.is_blocked_thread_main THEN 1 ELSE 0 END as main_blocked,
2415
+ ROW_NUMBER() OVER (PARTITION BY fl.frame_start ORDER BY amc.dur DESC) as rn
2416
+ FROM jank_frame_list fl
2417
+ JOIN android_monitor_contention amc ON amc.ts >= fl.frame_start AND amc.ts < fl.frame_end
2418
+ AND (amc.process_name GLOB '${package}*' OR '${package}' = '')
2419
+ AND amc.dur >= 200000
2420
+ )
2421
+ WHERE rn <= 5
2422
+ GROUP BY frame_start
2423
+ ),
2424
+ -- 10h. 主线程文件 IO 检测(SharedPreferences/sqlite/fsync 等 IO slice 与帧窗口重叠)
2425
+ per_frame_file_io AS (
2426
+ SELECT fl.frame_start,
2427
+ ROUND(SUM(
2428
+ MAX(MIN(s.ts + s.dur, fl.frame_end) - MAX(s.ts, fl.frame_start), 0)
2429
+ ) / 1e6, 2) as file_io_overlap_ms
2430
+ FROM jank_frame_list fl
2431
+ JOIN per_frame_thread_roles ptr ON ptr.frame_start = fl.frame_start AND ptr.role = 'main'
2432
+ JOIN thread_track tt ON tt.utid = ptr.utid
2433
+ JOIN slice s ON s.track_id = tt.id
2434
+ AND s.ts < fl.frame_end AND s.ts + s.dur > fl.frame_start
2435
+ AND s.dur > 500000
2436
+ WHERE s.name GLOB '*SharedPreferences*'
2437
+ OR s.name GLOB '*getSharedPreferences*'
2438
+ OR s.name GLOB '*commit*SharedPref*'
2439
+ OR s.name GLOB '*QueuedWork*'
2440
+ OR s.name GLOB '*waitToFinish*'
2441
+ OR s.name GLOB '*sqlite*'
2442
+ OR s.name GLOB '*SQLiteDatabase*'
2443
+ OR s.name GLOB '*openFile*'
2444
+ OR s.name GLOB '*fsync*'
2445
+ GROUP BY fl.frame_start
2446
+ ),
2447
+ -- ========== 11. 综合分析 ==========
2448
+ analysis AS (
2449
+ SELECT
2450
+ fl.display_frame_token,
2451
+ fl.frame_start,
2452
+ fl.frame_end,
2453
+ fl.dur_ms,
2454
+ fl.jank_type,
2455
+ fl.jank_responsibility,
2456
+ fl.session_id,
2457
+ fl.pid,
2458
+ fl.process_name,
2459
+ fl.frame_index,
2460
+ fl.vsync_missed,
2461
+ fl.present_interval_ms,
2462
+ COALESCE(ts.slice_name, '') as top_slice_name,
2463
+ COALESCE(ts.slice_dur_ms, 0) as top_slice_ms,
2464
+ COALESCE(ts.slice_offset_ms, 0) as top_slice_offset_ms,
2465
+ COALESCE(pcm.little_run_pct, 0) as little_run_pct,
2466
+ COALESCE(pcm.big_run_pct, 0) as big_run_pct,
2467
+ COALESCE(pcm.runnable_pct, 0) as runnable_pct,
2468
+ COALESCE(pfq.q1_pct, 0) as main_q1_pct,
2469
+ COALESCE(pfq.q2_pct, 0) as main_q2_pct,
2470
+ COALESCE(pfq.q3_pct, 0) as main_q3_pct,
2471
+ COALESCE(pfq.q4a_pct, 0) as main_q4a_pct,
2472
+ COALESCE(pfq.q4b_pct, 0) as main_q4b_pct,
2473
+ COALESCE(rtq.render_q1_pct, 0) as render_q1_pct,
2474
+ COALESCE(rtq.render_q2_pct, 0) as render_q2_pct,
2475
+ COALESCE(rtq.render_q3_pct, 0) as render_q3_pct,
2476
+ COALESCE(rtq.render_q4a_pct, 0) as render_q4a_pct,
2477
+ COALESCE(rtq.render_q4b_pct, 0) as render_q4b_pct,
2478
+ COALESCE(pff.big_avg_freq_mhz, 0) as big_avg_freq_mhz,
2479
+ COALESCE(pff.big_max_freq_mhz, 0) as big_max_freq_mhz,
2480
+ COALESCE(pfr.ramp_to_high_ms, 0) as ramp_to_high_ms,
2481
+ COALESCE(pfb.binder_overlap_ms, 0) as binder_overlap_ms,
2482
+ COALESCE(pfgc.gc_overlap_ms, 0) as gc_overlap_ms,
2483
+ COALESCE(pfgc.gc_count, 0) as gc_count,
2484
+ COALESCE(gf.max_fence_dur_ns, 0) as max_fence_dur_ns,
2485
+ COALESCE(gf.total_fence_dur_ns, 0) as total_fence_dur_ns,
2486
+ COALESCE(sp.shader_count, 0) as shader_count,
2487
+ COALESCE(sp.total_shader_dur_ns, 0) as total_shader_dur_ns,
2488
+ tc.vsync_period_ns,
2489
+ tc.frame_budget_ms,
2490
+ tc.slice_critical_ms,
2491
+ tc.freq_ramp_critical_ms,
2492
+ tc.binder_overlap_critical_ms,
2493
+ COALESCE(pfcc.cpu_freq_clusters_json, '[]') as cpu_freq_clusters_json,
2494
+ COALESCE(pffc.freq_timeline_json, '[]') as freq_timeline_json,
2495
+ COALESCE(pfmts.main_slices_json, '[]') as main_slices_json,
2496
+ COALESCE(pfrts.render_slices_json, '[]') as render_slices_json,
2497
+ COALESCE(pfbd.binder_calls_json, '[]') as binder_calls_json,
2498
+ COALESCE(pfgd.gc_events_json, '[]') as gc_events_json,
2499
+ COALESCE(pfld.lock_contention_json, '[]') as lock_contention_json,
2500
+ COALESCE(pfio.file_io_overlap_ms, 0) as file_io_overlap_ms,
2501
+ dpf.device_peak_freq_mhz
2502
+ FROM jank_frame_list fl
2503
+ CROSS JOIN timing_config tc
2504
+ CROSS JOIN device_peak_freq dpf
2505
+ LEFT JOIN top_slices ts ON ts.frame_start = fl.frame_start
2506
+ LEFT JOIN per_frame_cpu_mix pcm ON pcm.frame_start = fl.frame_start
2507
+ LEFT JOIN per_frame_quadrants pfq ON pfq.frame_start = fl.frame_start
2508
+ LEFT JOIN render_thread_quadrants rtq ON rtq.frame_start = fl.frame_start
2509
+ LEFT JOIN per_frame_freq pff ON pff.frame_start = fl.frame_start
2510
+ LEFT JOIN per_frame_ramp pfr ON pfr.frame_start = fl.frame_start
2511
+ LEFT JOIN per_frame_binder pfb ON pfb.frame_start = fl.frame_start
2512
+ LEFT JOIN per_frame_gc pfgc ON pfgc.frame_start = fl.frame_start
2513
+ LEFT JOIN gpu_fence_per_frame gf ON gf.frame_start = fl.frame_start
2514
+ LEFT JOIN shader_per_frame sp ON sp.frame_start = fl.frame_start
2515
+ LEFT JOIN per_frame_cpu_clusters pfcc ON pfcc.frame_start = fl.frame_start
2516
+ LEFT JOIN per_frame_freq_changes pffc ON pffc.frame_start = fl.frame_start
2517
+ LEFT JOIN per_frame_main_top_slices pfmts ON pfmts.frame_start = fl.frame_start
2518
+ LEFT JOIN per_frame_render_top_slices pfrts ON pfrts.frame_start = fl.frame_start
2519
+ LEFT JOIN per_frame_binder_detail pfbd ON pfbd.frame_start = fl.frame_start
2520
+ LEFT JOIN per_frame_gc_detail pfgd ON pfgd.frame_start = fl.frame_start
2521
+ LEFT JOIN per_frame_lock_detail pfld ON pfld.frame_start = fl.frame_start
2522
+ LEFT JOIN per_frame_file_io pfio ON pfio.frame_start = fl.frame_start
2523
+ ),
2524
+ -- ========== 11. 根因分类(与 jank_frame_detail 相同优先级 CASE 树) ==========
2525
+ classified AS (
2526
+ SELECT *,
2527
+ CASE
2528
+ -- P0: Buffer Stuffing 管线背压 — 短路跳过线程分析
2529
+ -- App 未错过 deadline,但 BufferQueue 积压导致 dequeueBuffer 背压
2530
+ -- 主线程 S 状态来自 syncFrameState 等待,非锁/Binder 问题
2531
+ WHEN jank_responsibility = 'BUFFER_STUFFING'
2532
+ THEN 'buffer_stuffing'
2533
+ -- P0.5: SF 合成超时 — 短路:jank_responsibility 指向 SF,跳过 App 侧分析
2534
+ -- Perfetto FrameTimeline 判定 SurfaceFlinger 为掉帧责任方
2535
+ WHEN jank_responsibility = 'SF'
2536
+ THEN 'sf_composition_slow'
2537
+ -- P1: Binder 同步阻塞(top slice 内有大量同步 Binder 重叠)
2538
+ WHEN top_slice_ms > slice_critical_ms AND binder_overlap_ms >= binder_overlap_critical_ms
2539
+ THEN 'binder_sync_blocking'
2540
+ -- P1.5: GC 暂停(帧窗口内 GC 重叠 > 1ms)
2541
+ WHEN gc_overlap_ms > 1.0
2542
+ THEN 'gc_jank'
2543
+ -- P1.6: GC 压力级联 — 帧窗口内多次 GC(>=3 次),内存压力高
2544
+ -- 即使单次 GC 重叠 <1ms,密集 GC 累积也会显著影响帧耗时
2545
+ WHEN gc_count >= 3 AND gc_overlap_ms > 0.5
2546
+ THEN 'gc_pressure_cascade'
2547
+ -- P2: 小核调度(top slice 多数时间在小核执行)
2548
+ WHEN top_slice_ms > slice_critical_ms AND little_run_pct >= 45
2549
+ THEN 'small_core_placement'
2550
+ -- P3: 关键操作中调度延迟(top slice 中 Runnable 等待占比高)
2551
+ WHEN top_slice_ms > slice_critical_ms AND runnable_pct >= 15
2552
+ THEN 'sched_delay_in_slice'
2553
+ -- P3.5: Shader 编译(RenderThread 有 shader compile 且耗时 > 30% 帧预算)
2554
+ WHEN shader_count > 0 AND total_shader_dur_ns > vsync_period_ns * 0.3
2555
+ THEN 'shader_compile'
2556
+ -- P3.6: GPU fence 等待(RenderThread 长时间等待 GPU fence > 50% 帧预算)
2557
+ WHEN max_fence_dur_ns > vsync_period_ns * 0.5
2558
+ THEN 'gpu_fence_wait'
2559
+ -- P3.7: RenderThread 负载过重 — RT 主动运行占比高(>70%),非 GPU/Shader 等待
2560
+ -- 到达此处说明 Shader/GPU fence 已排除;RT 自身计算密集是瓶颈
2561
+ WHEN (render_q1_pct + render_q2_pct) > 70 AND render_q4b_pct < 20
2562
+ THEN 'render_thread_heavy'
2563
+ -- P4: 重度业务负载(>2× 帧预算,即使满频也会超时)
2564
+ WHEN top_slice_ms > frame_budget_ms * 2.0
2565
+ THEN 'workload_heavy'
2566
+ -- P4.5: 温控降频 — 帧内大核最高频率显著低于设备 P95 峰值(<60%)
2567
+ -- 放在 workload_heavy 之后:如果帧有明确的 App 侧直接原因(Binder/GC/heavy workload),
2568
+ -- 优先归因到直接原因。温控降频是供给侧约束,仅在无更强直接原因时才作为主因
2569
+ WHEN device_peak_freq_mhz > 0 AND big_max_freq_mhz > 0
2570
+ AND big_max_freq_mhz < device_peak_freq_mhz * 0.60
2571
+ AND top_slice_ms > slice_critical_ms
2572
+ THEN 'thermal_throttling'
2573
+ -- P4.6: CPU 最大频率被限 — 中等程度限频(60%-75%)
2574
+ WHEN device_peak_freq_mhz > 0 AND big_max_freq_mhz > 0
2575
+ AND big_max_freq_mhz < device_peak_freq_mhz * 0.75
2576
+ AND top_slice_ms > slice_critical_ms
2577
+ THEN 'cpu_max_limited'
2578
+ -- P5: 大核低频(边际情况:slice 在 1x-2x 帧预算区间)
2579
+ WHEN top_slice_ms > slice_critical_ms AND big_run_pct >= 40
2580
+ AND big_avg_freq_mhz > 0 AND big_max_freq_mhz > 0
2581
+ AND big_avg_freq_mhz < big_max_freq_mhz * 0.55
2582
+ THEN 'big_core_low_freq'
2583
+ -- P6: 频率爬升慢(边际情况:slice 在 1x-2x 帧预算区间)
2584
+ WHEN top_slice_ms > slice_critical_ms
2585
+ AND ramp_to_high_ms > freq_ramp_critical_ms
2586
+ AND top_slice_offset_ms <= ramp_to_high_ms
2587
+ THEN 'freq_ramp_slow'
2588
+ -- ========== 四象限/IO/Binder 信号(不依赖 top_slice_ms 阈值)==========
2589
+ -- P7: CPU 全核饱和 — 双线程同时调度等待高
2590
+ WHEN main_q3_pct > 15 AND render_q3_pct > 15
2591
+ THEN 'cpu_saturation'
2592
+ -- P7.5: 调度延迟(仅主线程 Runnable 高)
2593
+ WHEN main_q3_pct > 20
2594
+ THEN 'scheduling_delay'
2595
+ -- P8: 主线程文件 IO — SharedPreferences/SQLite/fsync 等具体 IO slice
2596
+ WHEN file_io_overlap_ms > 1.0
2597
+ THEN 'main_thread_file_io'
2598
+ -- P8.5: IO 阻塞(D/DK 状态,无具体 IO slice 匹配)
2599
+ WHEN main_q4a_pct > 20
2600
+ THEN 'blocking_io'
2601
+ -- P9: Binder 超时 — 帧窗口内 Binder 累计 >500ms
2602
+ WHEN binder_overlap_ms > 500
2603
+ THEN 'binder_timeout'
2604
+ -- P9.5: 锁/Binder 等待(S/I 状态)
2605
+ WHEN main_q4b_pct > 30
2606
+ THEN 'lock_binder_wait'
2607
+ -- P10: 小核调度(按四象限判断)
2608
+ WHEN main_q2_pct > 50
2609
+ THEN 'small_core_placement'
2610
+ -- ========== 兜底分类 ==========
2611
+ -- P11: 工作负载超时兜底(top_slice > critical 但无特定供给侧/四象限因素)
2612
+ WHEN top_slice_ms > slice_critical_ms
2613
+ THEN 'workload_heavy'
2614
+ ELSE 'unknown'
2615
+ END as reason_code
2616
+ FROM analysis
2617
+ )
2618
+ SELECT
2619
+ CAST(display_frame_token AS TEXT) as frame_id,
2620
+ frame_index,
2621
+ printf('%d', frame_start) as start_ts,
2622
+ printf('%d', frame_end - frame_start) as dur,
2623
+ dur_ms,
2624
+ jank_type,
2625
+ vsync_missed,
2626
+ present_interval_ms,
2627
+ jank_responsibility,
2628
+ pid,
2629
+ process_name,
2630
+ reason_code,
2631
+ CASE
2632
+ WHEN reason_code = 'buffer_stuffing' THEN 'Buffer Stuffing: 管线背压,帧耗时 ' || dur_ms || 'ms,BufferQueue 积压导致跳帧(非 App 问题)'
2633
+ WHEN reason_code = 'sf_composition_slow' THEN 'SF合成超时: SurfaceFlinger 侧导致掉帧(非 App 问题),帧耗时 ' || dur_ms || 'ms'
2634
+ WHEN reason_code = 'thermal_throttling' THEN '温控降频: 大核最高 ' || big_max_freq_mhz || 'MHz (设备峰值 ' || device_peak_freq_mhz || 'MHz, 仅 ' || ROUND(100.0 * big_max_freq_mhz / NULLIF(device_peak_freq_mhz, 0), 0) || '%)'
2635
+ WHEN reason_code = 'binder_sync_blocking' THEN '同步Binder阻塞: "' || top_slice_name || '" 中 Binder 重叠 ' || binder_overlap_ms || 'ms'
2636
+ WHEN reason_code = 'gc_jank' THEN 'GC暂停: 帧窗口内 GC 重叠 ' || gc_overlap_ms || 'ms (' || gc_count || ' 次)'
2637
+ WHEN reason_code = 'gc_pressure_cascade' THEN 'GC压力级联: 帧窗口内 ' || gc_count || ' 次 GC,总重叠 ' || gc_overlap_ms || 'ms(内存压力高)'
2638
+ WHEN reason_code = 'small_core_placement' THEN '小核调度: "' || top_slice_name || '" 小核占比 ' || little_run_pct || '%'
2639
+ WHEN reason_code = 'sched_delay_in_slice' THEN '调度延迟: "' || top_slice_name || '" Runnable 占比 ' || runnable_pct || '%'
2640
+ WHEN reason_code = 'shader_compile' THEN 'Shader编译: ' || shader_count || ' 次编译,总计 ' || ROUND(total_shader_dur_ns / 1e6, 2) || 'ms'
2641
+ WHEN reason_code = 'gpu_fence_wait' THEN 'GPU Fence等待: 最长 ' || ROUND(max_fence_dur_ns / 1e6, 2) || 'ms'
2642
+ WHEN reason_code = 'render_thread_heavy' THEN 'RT负载过重: RenderThread 运行占比 ' || (render_q1_pct + render_q2_pct) || '%, 等待仅 ' || render_q4b_pct || '%'
2643
+ WHEN reason_code = 'workload_heavy' THEN '负载过重: "' || top_slice_name || '" 耗时 ' || top_slice_ms || 'ms (预算 ' || frame_budget_ms || 'ms)'
2644
+ WHEN reason_code = 'cpu_max_limited' THEN 'CPU限频: 大核最高 ' || big_max_freq_mhz || 'MHz (设备峰值 ' || device_peak_freq_mhz || 'MHz, ' || ROUND(100.0 * big_max_freq_mhz / NULLIF(device_peak_freq_mhz, 0), 0) || '%), "' || top_slice_name || '" 耗时 ' || top_slice_ms || 'ms'
2645
+ WHEN reason_code = 'big_core_low_freq' THEN '大核低频: 平均 ' || big_avg_freq_mhz || 'MHz (峰值 ' || big_max_freq_mhz || 'MHz)'
2646
+ WHEN reason_code = 'freq_ramp_slow' THEN '升频慢: ' || ramp_to_high_ms || 'ms 才达高频'
2647
+ WHEN reason_code = 'scheduling_delay' THEN '调度等待: Q3=' || main_q3_pct || '%'
2648
+ WHEN reason_code = 'cpu_saturation' THEN 'CPU全核饱和: 主线程 Q3=' || main_q3_pct || '%, RT Q3=' || render_q3_pct || '%(双线程同时调度等待)'
2649
+ WHEN reason_code = 'blocking_io' THEN 'IO阻塞: Q4a(D/DK)=' || main_q4a_pct || '%'
2650
+ WHEN reason_code = 'main_thread_file_io' THEN '主线程文件IO: 帧内 IO overlap ' || file_io_overlap_ms || 'ms (SharedPreferences/SQLite/fsync)'
2651
+ WHEN reason_code = 'lock_binder_wait' THEN '锁/Binder等待: Q4b(S/I)=' || main_q4b_pct || '%'
2652
+ WHEN reason_code = 'binder_timeout' THEN 'Binder超时: 帧内 Binder 累计 ' || binder_overlap_ms || 'ms (>500ms)'
2653
+ ELSE '未分类 (帧耗时 ' || dur_ms || 'ms)'
2654
+ END as primary_cause,
2655
+ CASE
2656
+ WHEN reason_code = 'buffer_stuffing' THEN '高'
2657
+ WHEN reason_code = 'sf_composition_slow' THEN '高'
2658
+ WHEN reason_code = 'thermal_throttling' THEN '高'
2659
+ WHEN reason_code = 'gc_pressure_cascade' THEN '高'
2660
+ WHEN reason_code = 'render_thread_heavy' THEN '中'
2661
+ WHEN reason_code = 'cpu_max_limited' THEN '中'
2662
+ WHEN reason_code = 'cpu_saturation' THEN '中'
2663
+ WHEN reason_code = 'main_thread_file_io' THEN '高'
2664
+ WHEN reason_code = 'binder_timeout' THEN '高'
2665
+ WHEN top_slice_ms > slice_critical_ms THEN '高'
2666
+ WHEN shader_count > 0 THEN '高'
2667
+ WHEN max_fence_dur_ns > vsync_period_ns * 0.5 THEN '中'
2668
+ WHEN gc_overlap_ms > 1.0 THEN '高'
2669
+ WHEN main_q3_pct > 20 OR main_q4a_pct > 20 OR main_q4b_pct > 30 THEN '中'
2670
+ ELSE '低'
2671
+ END as confidence,
2672
+ top_slice_name,
2673
+ top_slice_ms,
2674
+ -- MainThread 四象限完整输出
2675
+ main_q1_pct,
2676
+ main_q2_pct,
2677
+ main_q3_pct,
2678
+ main_q4a_pct,
2679
+ main_q4b_pct,
2680
+ -- RenderThread 四象限
2681
+ COALESCE(render_q1_pct, 0) as render_q1_pct,
2682
+ COALESCE(render_q2_pct, 0) as render_q2_pct,
2683
+ COALESCE(render_q3_pct, 0) as render_q3_pct,
2684
+ COALESCE(render_q4a_pct, 0) as render_q4a_pct,
2685
+ COALESCE(render_q4b_pct, 0) as render_q4b_pct,
2686
+ -- CPU 频率
2687
+ big_avg_freq_mhz,
2688
+ big_max_freq_mhz,
2689
+ ramp_to_high_ms as ramp_ms,
2690
+ -- Top Slice CPU 分布
2691
+ little_run_pct as top_slice_little_pct,
2692
+ big_run_pct as top_slice_big_pct,
2693
+ runnable_pct as top_slice_runnable_pct,
2694
+ -- GPU / Shader
2695
+ ROUND(max_fence_dur_ns / 1e6, 2) as gpu_fence_ms,
2696
+ ROUND(total_fence_dur_ns / 1e6, 2) as gpu_fence_total_ms,
2697
+ shader_count,
2698
+ ROUND(total_shader_dur_ns / 1e6, 2) as shader_ms,
2699
+ -- Binder/GC
2700
+ binder_overlap_ms,
2701
+ gc_overlap_ms,
2702
+ gc_count,
2703
+ -- 帧预算参考
2704
+ frame_budget_ms,
2705
+ -- 设备峰值频率(温控/限频参考)
2706
+ device_peak_freq_mhz,
2707
+ -- 文件 IO 重叠
2708
+ file_io_overlap_ms,
2709
+ -- 批量详情 JSON 列(供展开行使用)
2710
+ cpu_freq_clusters_json,
2711
+ freq_timeline_json,
2712
+ main_slices_json,
2713
+ render_slices_json,
2714
+ binder_calls_json,
2715
+ gc_events_json,
2716
+ lock_contention_json
2717
+ FROM classified
2718
+ ORDER BY session_id, frame_start
2719
+ save_as: batch_root_cause
2720
+ condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && environment?.data?.[0]?.has_data === 1 && ((perf_summary?.data?.[0]?.janky_frames || 0) > 0 || (jank_stats?.data?.[0]?.real_jank_count || 0) > 0)"
2721
+
2722
+ # ==========================================================================
2723
+ # L0: 全局上下文标志(非帧级根因,场景过滤器 / 干扰检测)
2724
+ # 用于 Agent 在 Phase 1.3 中修饰和过滤帧级结论
2725
+ # ==========================================================================
2726
+ - id: global_context_flags
2727
+ type: atomic
2728
+ name: "全局上下文标志"
2729
+ optional: true
2730
+ display:
2731
+ level: hidden
2732
+ sql: |
2733
+ WITH
2734
+ -- 1. 视频解码活动检测:滑动期间是否有 MediaCodec/视频线程活跃
2735
+ video_check AS (
2736
+ SELECT COUNT(*) as video_slice_count
2737
+ FROM slice s
2738
+ JOIN thread_track tt ON s.track_id = tt.id
2739
+ JOIN thread t ON tt.utid = t.utid
2740
+ WHERE (t.name GLOB '*MediaCodec*' OR t.name GLOB '*CodecLooper*'
2741
+ OR t.name GLOB '*VideoDecoder*' OR t.name GLOB '*NuPlayer*'
2742
+ OR s.name GLOB '*queueVideoBuffer*' OR s.name GLOB '*onOutputBufferAvailable*')
2743
+ AND (${start_ts} IS NULL OR s.ts >= ${start_ts})
2744
+ AND (${end_ts} IS NULL OR s.ts + s.dur < ${end_ts})
2745
+ AND s.dur > 100000
2746
+ ),
2747
+ -- 2. 插帧帧数检测:frame_id = -1 通常是 OEM 插帧功能
2748
+ interpolation_check AS (
2749
+ SELECT COUNT(*) as interpolation_frame_count
2750
+ FROM actual_frame_timeline_slice a
2751
+ LEFT JOIN process p ON a.upid = p.upid
2752
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
2753
+ AND p.name NOT LIKE '/system/%'
2754
+ AND COALESCE(a.display_frame_token, -999) = -1
2755
+ AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
2756
+ AND (${end_ts} IS NULL OR a.ts < ${end_ts})
2757
+ ),
2758
+ -- 3. 温控活跃检测:trace 中是否有明显的频率天花板下降
2759
+ -- 对比全程峰值 vs 尾部 2s 内最低值,检测持续降频趋势
2760
+ cpufreq_tail_threshold AS (
2761
+ SELECT MAX(c.ts) - 2000000000 AS threshold
2762
+ FROM counter c
2763
+ JOIN cpu_counter_track cct ON c.track_id = cct.id AND cct.name = 'cpufreq'
2764
+ LEFT JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
2765
+ WHERE ct.core_type IN ('prime', 'big')
2766
+ AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
2767
+ AND (${end_ts} IS NULL OR c.ts < ${end_ts})
2768
+ ),
2769
+ thermal_check AS (
2770
+ SELECT
2771
+ COALESCE(ROUND(MAX(c.value) / 1000, 0), 0) as trace_peak_freq_mhz,
2772
+ COALESCE(ROUND(MIN(
2773
+ CASE WHEN c.ts > (SELECT threshold FROM cpufreq_tail_threshold) THEN c.value END
2774
+ ) / 1000, 0), 0) as tail_min_freq_mhz
2775
+ FROM counter c
2776
+ JOIN cpu_counter_track cct ON c.track_id = cct.id AND cct.name = 'cpufreq'
2777
+ LEFT JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
2778
+ WHERE ct.core_type IN ('prime', 'big')
2779
+ AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
2780
+ AND (${end_ts} IS NULL OR c.ts < ${end_ts})
2781
+ ),
2782
+ -- 4. 非 App 大核 CPU 占用(后台干扰指标)
2783
+ background_cpu AS (
2784
+ SELECT
2785
+ ROUND(100.0 * SUM(CASE WHEN '${package}' != '' AND p.name NOT GLOB '${package}*' AND ts.state = 'Running' THEN ts.dur ELSE 0 END)
2786
+ / NULLIF(SUM(CASE WHEN ts.state = 'Running' THEN ts.dur ELSE 0 END), 0), 1) as non_app_big_core_pct
2787
+ FROM thread_state ts
2788
+ JOIN thread t ON ts.utid = t.utid
2789
+ JOIN process p ON t.upid = p.upid
2790
+ LEFT JOIN _cpu_topology ct ON ts.cpu = ct.cpu_id
2791
+ WHERE ct.core_type IN ('prime', 'big')
2792
+ AND (${start_ts} IS NULL OR ts.ts >= ${start_ts})
2793
+ AND (${end_ts} IS NULL OR ts.ts < ${end_ts})
2794
+ AND ts.dur > 0
2795
+ )
2796
+ SELECT
2797
+ CASE WHEN COALESCE(v.video_slice_count, 0) > 20 THEN 1 ELSE 0 END as video_during_scroll,
2798
+ COALESCE(v.video_slice_count, 0) as video_slice_count,
2799
+ COALESCE(i.interpolation_frame_count, 0) as interpolation_frame_count,
2800
+ CASE WHEN COALESCE(i.interpolation_frame_count, 0) > 10 THEN 1 ELSE 0 END as interpolation_active,
2801
+ th.trace_peak_freq_mhz,
2802
+ th.tail_min_freq_mhz,
2803
+ -- thermal_trending 仅在分析窗口 >5s 时有效(短 trace 正常 governor 波动会误报)
2804
+ CASE WHEN th.trace_peak_freq_mhz > 0 AND th.tail_min_freq_mhz > 0
2805
+ AND th.tail_min_freq_mhz < th.trace_peak_freq_mhz * 0.70
2806
+ AND (SELECT threshold FROM cpufreq_tail_threshold) > COALESCE(${start_ts}, 0)
2807
+ THEN 1 ELSE 0 END as thermal_trending,
2808
+ COALESCE(bg.non_app_big_core_pct, 0) as non_app_big_core_pct,
2809
+ CASE WHEN COALESCE(bg.non_app_big_core_pct, 0) > 60 THEN 1 ELSE 0 END as background_cpu_heavy
2810
+ FROM video_check v, interpolation_check i, thermal_check th, background_cpu bg
2811
+ save_as: global_context
2812
+
2813
+ # ==========================================================================
2814
+ # L2: Session-Level Quadrant Distribution (MainThread + RenderThread)
2815
+ # 滑动过程整体四象限,非逐帧
2816
+ # ==========================================================================
2817
+ - id: session_quadrant_summary
2818
+ type: atomic
2819
+ name: "滑动过程四象限分布"
2820
+ optional: true
2821
+ display: false # UI 已迁移到 scroll_sessions 展开行;此步骤保留供 Agent 引用 save_as 数据
2822
+ sql: |
2823
+ WITH main_quadrant AS (
2824
+ SELECT
2825
+ SUM(CASE WHEN ts.state = 'Running' AND COALESCE(ct.core_type, 'unknown') IN ('prime', 'big') THEN ts.dur ELSE 0 END) as q1_ns,
2826
+ SUM(CASE WHEN ts.state = 'Running' AND COALESCE(ct.core_type, 'unknown') IN ('medium', 'little') THEN ts.dur ELSE 0 END) as q2_ns,
2827
+ SUM(CASE WHEN ts.state = 'R' THEN ts.dur ELSE 0 END) as q3_ns,
2828
+ SUM(CASE WHEN ts.state IN ('D', 'DK') THEN ts.dur ELSE 0 END) as q4a_ns,
2829
+ SUM(CASE WHEN ts.state IN ('S', 'I') THEN ts.dur ELSE 0 END) as q4b_ns,
2830
+ SUM(ts.dur) as total_ns
2831
+ FROM thread_state ts
2832
+ JOIN thread t ON ts.utid = t.utid
2833
+ JOIN process p ON t.upid = p.upid
2834
+ LEFT JOIN _cpu_topology ct ON ts.cpu = ct.cpu_id
2835
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
2836
+ AND p.name NOT LIKE '/system/%'
2837
+ AND t.tid = p.pid
2838
+ AND (${start_ts} IS NULL OR ts.ts >= ${start_ts})
2839
+ AND (${end_ts} IS NULL OR ts.ts < ${end_ts})
2840
+ ),
2841
+ render_quadrant AS (
2842
+ SELECT
2843
+ SUM(CASE WHEN ts.state = 'Running' AND COALESCE(ct.core_type, 'unknown') IN ('prime', 'big') THEN ts.dur ELSE 0 END) as q1_ns,
2844
+ SUM(CASE WHEN ts.state = 'Running' AND COALESCE(ct.core_type, 'unknown') IN ('medium', 'little') THEN ts.dur ELSE 0 END) as q2_ns,
2845
+ SUM(CASE WHEN ts.state = 'R' THEN ts.dur ELSE 0 END) as q3_ns,
2846
+ SUM(CASE WHEN ts.state IN ('D', 'DK') THEN ts.dur ELSE 0 END) as q4a_ns,
2847
+ SUM(CASE WHEN ts.state IN ('S', 'I') THEN ts.dur ELSE 0 END) as q4b_ns,
2848
+ SUM(ts.dur) as total_ns
2849
+ FROM thread_state ts
2850
+ JOIN thread t ON ts.utid = t.utid
2851
+ JOIN process p ON t.upid = p.upid
2852
+ LEFT JOIN _cpu_topology ct ON ts.cpu = ct.cpu_id
2853
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
2854
+ AND p.name NOT LIKE '/system/%'
2855
+ AND t.name = 'RenderThread'
2856
+ AND (${start_ts} IS NULL OR ts.ts >= ${start_ts})
2857
+ AND (${end_ts} IS NULL OR ts.ts < ${end_ts})
2858
+ )
2859
+ SELECT 'MainThread' as thread,
2860
+ ROUND(100.0 * q1_ns / NULLIF(total_ns, 0), 1) as q1_big_pct,
2861
+ ROUND(100.0 * q2_ns / NULLIF(total_ns, 0), 1) as q2_little_pct,
2862
+ ROUND(100.0 * q3_ns / NULLIF(total_ns, 0), 1) as q3_runnable_pct,
2863
+ ROUND(100.0 * q4a_ns / NULLIF(total_ns, 0), 1) as q4a_io_pct,
2864
+ ROUND(100.0 * q4b_ns / NULLIF(total_ns, 0), 1) as q4b_sleep_pct,
2865
+ ROUND(total_ns / 1e6, 2) as total_ms
2866
+ FROM main_quadrant
2867
+ UNION ALL
2868
+ SELECT 'RenderThread' as thread,
2869
+ ROUND(100.0 * q1_ns / NULLIF(total_ns, 0), 1) as q1_big_pct,
2870
+ ROUND(100.0 * q2_ns / NULLIF(total_ns, 0), 1) as q2_little_pct,
2871
+ ROUND(100.0 * q3_ns / NULLIF(total_ns, 0), 1) as q3_runnable_pct,
2872
+ ROUND(100.0 * q4a_ns / NULLIF(total_ns, 0), 1) as q4a_io_pct,
2873
+ ROUND(100.0 * q4b_ns / NULLIF(total_ns, 0), 1) as q4b_sleep_pct,
2874
+ ROUND(total_ns / 1e6, 2) as total_ms
2875
+ FROM render_quadrant
2876
+ save_as: session_quadrant
2877
+ condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && (perf_summary?.data?.[0]?.total_frames || 0) > 0"
2878
+
2879
+ # ==========================================================================
2880
+ # L2: Session-Level CPU Frequency Distribution
2881
+ # 滑动过程整体 CPU 频率,按核心类型分组
2882
+ # ==========================================================================
2883
+ - id: session_cpu_freq
2884
+ type: atomic
2885
+ name: "滑动过程 CPU 频率"
2886
+ optional: true
2887
+ display: false # UI 已迁移到 scroll_sessions 展开行;此步骤保留供 Agent 引用 save_as 数据
2888
+ sql: |
2889
+ SELECT
2890
+ ct.core_type,
2891
+ COUNT(DISTINCT cct.cpu) as num_cores,
2892
+ ROUND(AVG(c.value) / 1000, 0) as avg_freq_mhz,
2893
+ ROUND(MAX(c.value) / 1000, 0) as max_freq_mhz,
2894
+ ROUND(MIN(c.value) / 1000, 0) as min_freq_mhz
2895
+ FROM counter c
2896
+ JOIN cpu_counter_track cct ON c.track_id = cct.id
2897
+ JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
2898
+ WHERE cct.name = 'cpufreq'
2899
+ AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
2900
+ AND (${end_ts} IS NULL OR c.ts < ${end_ts})
2901
+ GROUP BY ct.core_type
2902
+ ORDER BY max_freq_mhz DESC
2903
+ save_as: session_freq
2904
+ condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && (perf_summary?.data?.[0]?.total_frames || 0) > 0"
2905
+
2906
+ # ==========================================================================
2907
+ # L2: Session-Level Thread Core Affinity (Rendering-Related Threads)
2908
+ # 出图关键线程在各核心类型上的运行时间占比
2909
+ # ==========================================================================
2910
+ - id: session_thread_core_affinity
2911
+ type: atomic
2912
+ name: "关键线程大小核分布"
2913
+ optional: true
2914
+ display: false # UI 已迁移到 scroll_sessions 展开行;此步骤保留供 Agent 引用 save_as 数据
2915
+ sql: |
2916
+ WITH thread_runs AS (
2917
+ SELECT
2918
+ CASE WHEN t.tid = p.pid THEN 'MainThread' ELSE t.name END as thread_name,
2919
+ COALESCE(ct.core_type, 'unknown') as core_type,
2920
+ SUM(ts.dur) as run_dur_ns
2921
+ FROM thread_state ts
2922
+ JOIN thread t ON ts.utid = t.utid
2923
+ JOIN process p ON t.upid = p.upid
2924
+ LEFT JOIN _cpu_topology ct ON ts.cpu = ct.cpu_id
2925
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
2926
+ AND p.name NOT LIKE '/system/%'
2927
+ AND ts.state = 'Running'
2928
+ AND (${start_ts} IS NULL OR ts.ts >= ${start_ts})
2929
+ AND (${end_ts} IS NULL OR ts.ts < ${end_ts})
2930
+ AND (t.tid = p.pid OR t.name IN ('RenderThread', 'GPU completion', 'hwuiTask0', 'hwuiTask1'))
2931
+ GROUP BY thread_name, core_type
2932
+ )
2933
+ SELECT
2934
+ thread_name,
2935
+ core_type,
2936
+ ROUND(run_dur_ns / 1e6, 2) as run_ms,
2937
+ ROUND(100.0 * run_dur_ns / NULLIF(SUM(run_dur_ns) OVER (PARTITION BY thread_name), 0), 1) as pct
2938
+ FROM thread_runs
2939
+ ORDER BY
2940
+ CASE thread_name
2941
+ WHEN 'MainThread' THEN 1
2942
+ WHEN 'RenderThread' THEN 2
2943
+ WHEN 'GPU completion' THEN 3
2944
+ ELSE 4
2945
+ END,
2946
+ run_dur_ns DESC
2947
+ save_as: session_core_affinity
2948
+ condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && (perf_summary?.data?.[0]?.total_frames || 0) > 0"
2949
+
2950
+ # ==========================================================================
2951
+ # Root Cause Classification - Aggregate analysis for final conclusion
2952
+ # ==========================================================================
2953
+ # 综合所有分析数据,给出最终的根因分类和结论
2954
+ # 输出: problem_category, problem_component, confidence, evidence
2955
+ - id: root_cause_classification
2956
+ type: atomic
2957
+ name: "根因分类"
2958
+ optional: true
2959
+ synthesize:
2960
+ role: conclusion
2961
+ fields:
2962
+ - key: problem_category
2963
+ label: 问题类别
2964
+ - key: problem_component
2965
+ label: 问题组件
2966
+ - key: confidence
2967
+ label: 置信度
2968
+ format: "{{value}}%"
2969
+ insights:
2970
+ - template: "根因分类:{{problem_category}} - {{problem_component}}"
2971
+ display:
2972
+ level: summary
2973
+ layer: overview
2974
+ title: "🎯 分析结论"
2975
+ columns:
2976
+ - name: problem_category
2977
+ label: "问题类别"
2978
+ type: enum
2979
+ - name: problem_component
2980
+ label: "问题组件"
2981
+ type: string
2982
+ - name: confidence
2983
+ label: "置信度"
2984
+ type: percentage
2985
+ format: percentage
2986
+ - name: root_cause_summary
2987
+ label: "根因总结"
2988
+ type: string
2989
+ - name: suggestion
2990
+ label: "优化建议"
2991
+ type: string
2992
+ sql: |
2993
+ WITH
2994
+ -- 双信号混合掉帧检测(与 performance_summary/get_app_jank_frames 保持同口径)
2995
+ vsync_intervals AS (
2996
+ SELECT c.ts - LAG(c.ts) OVER (ORDER BY c.ts) as interval_ns
2997
+ FROM counter c
2998
+ JOIN counter_track t ON c.track_id = t.id
2999
+ WHERE t.name = 'VSYNC-sf'
3000
+ AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
3001
+ AND (${end_ts} IS NULL OR c.ts < ${end_ts})
3002
+ ),
3003
+ vsync_config AS (
3004
+ SELECT CASE
3005
+ WHEN raw_ns BETWEEN 5500000 AND 6500000 THEN 6060606
3006
+ WHEN raw_ns BETWEEN 6500001 AND 7500000 THEN 6944444
3007
+ WHEN raw_ns BETWEEN 7500001 AND 9500000 THEN 8333333
3008
+ WHEN raw_ns BETWEEN 9500001 AND 12500000 THEN 11111111
3009
+ WHEN raw_ns BETWEEN 12500001 AND 20000000 THEN 16666667
3010
+ WHEN raw_ns BETWEEN 20000001 AND 35000000 THEN 33333333
3011
+ ELSE raw_ns
3012
+ END AS vsync_period_ns
3013
+ FROM (
3014
+ SELECT CAST(COALESCE(
3015
+ (SELECT PERCENTILE(interval_ns, 0.5)
3016
+ FROM vsync_intervals
3017
+ WHERE interval_ns > 5500000 AND interval_ns < 50000000),
3018
+ 16666667
3019
+ ) AS INTEGER) AS raw_ns
3020
+ )
3021
+ ),
3022
+ -- 掉帧检测:双信号混合策略
3023
+ frame_jank_data AS (
3024
+ SELECT
3025
+ a.jank_type,
3026
+ COALESCE(a.present_type, 'Unknown Present') as present_type,
3027
+ a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END as present_ts,
3028
+ LAG(a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END)
3029
+ OVER (PARTITION BY a.layer_name ORDER BY a.ts) as prev_present_ts,
3030
+ a.ts - LAG(a.ts + a.dur)
3031
+ OVER (PARTITION BY a.layer_name ORDER BY a.ts) as time_gap_ns
3032
+ FROM actual_frame_timeline_slice a
3033
+ LEFT JOIN process p ON a.upid = p.upid
3034
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
3035
+ AND p.name NOT LIKE '/system/%'
3036
+ AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
3037
+ AND (${end_ts} IS NULL OR a.ts < ${end_ts})
3038
+ AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
3039
+ ),
3040
+ token_gap_jank AS (
3041
+ SELECT
3042
+ -- 感知掉帧总数:双信号混合检测
3043
+ SUM(CASE
3044
+ WHEN present_type IN ('Late Present', 'Dropped Frame')
3045
+ AND jank_type != 'Buffer Stuffing' THEN 1
3046
+ WHEN jank_type = 'Buffer Stuffing'
3047
+ AND prev_present_ts IS NOT NULL
3048
+ AND present_ts - prev_present_ts > (SELECT vsync_period_ns FROM vsync_config) * 1.5
3049
+ AND present_ts - prev_present_ts <= (SELECT vsync_period_ns FROM vsync_config) * 6
3050
+ AND (time_gap_ns IS NULL OR time_gap_ns <= (SELECT vsync_period_ns FROM vsync_config) * 6) THEN 1
3051
+ ELSE 0 END) as total_jank_count,
3052
+ -- App 侧掉帧(BS 帧的 jank_type 不可能是 Self Jank/App Deadline Missed)
3053
+ SUM(CASE WHEN present_type IN ('Late Present', 'Dropped Frame')
3054
+ AND jank_type IN ('Self Jank', 'App Deadline Missed') THEN 1 ELSE 0 END) as app_jank_count,
3055
+ SUM(CASE WHEN present_type IN ('Late Present', 'Dropped Frame')
3056
+ AND jank_type GLOB '*SurfaceFlinger*' THEN 1 ELSE 0 END) as sf_jank_count
3057
+ FROM frame_jank_data
3058
+ ),
3059
+ app_frames AS (
3060
+ SELECT
3061
+ COUNT(*) as total_frames,
3062
+ SUM(CASE WHEN jank_type != 'None' THEN 1 ELSE 0 END) as app_reported_jank,
3063
+ AVG(CASE WHEN dur > 0 THEN dur ELSE NULL END) / 1e6 as avg_dur_ms,
3064
+ MAX(CASE WHEN dur > 0 THEN dur ELSE NULL END) / 1e6 as max_dur_ms
3065
+ FROM actual_frame_timeline_slice a
3066
+ LEFT JOIN process p ON a.upid = p.upid
3067
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
3068
+ AND p.name NOT LIKE '/system/%'
3069
+ AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
3070
+ AND (${end_ts} IS NULL OR a.ts < ${end_ts})
3071
+ AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
3072
+ ),
3073
+ jank_stats AS (
3074
+ SELECT
3075
+ (SELECT total_frames FROM app_frames) as total_frames,
3076
+ (SELECT app_reported_jank FROM app_frames) as app_reported_jank,
3077
+ COALESCE((SELECT app_jank_count FROM token_gap_jank), 0) as app_jank,
3078
+ COALESCE((SELECT sf_jank_count FROM token_gap_jank), 0) as sf_jank,
3079
+ COALESCE((SELECT sf_jank_count FROM token_gap_jank), 0) as buffer_jank,
3080
+ (SELECT avg_dur_ms FROM app_frames) as avg_dur_ms,
3081
+ (SELECT max_dur_ms FROM app_frames) as max_dur_ms,
3082
+ ROUND((SELECT vsync_period_ns FROM vsync_config) / 1e6, 2) as frame_budget_ms
3083
+ ),
3084
+ -- 主线程四象限分析
3085
+ main_thread_analysis AS (
3086
+ SELECT
3087
+ SUM(CASE WHEN ts.state = 'Running' AND COALESCE(ct.core_type, 'unknown') IN ('prime', 'big') THEN ts.dur ELSE 0 END) as q1_big_core_ns,
3088
+ SUM(CASE WHEN ts.state = 'Running' AND COALESCE(ct.core_type, 'unknown') IN ('medium', 'little') THEN ts.dur ELSE 0 END) as q2_small_core_ns,
3089
+ SUM(CASE WHEN ts.state = 'R' THEN ts.dur ELSE 0 END) as q3_runnable_ns,
3090
+ SUM(CASE WHEN ts.state IN ('S', 'D', 'DK', 'I') THEN ts.dur ELSE 0 END) as q4_sleep_ns,
3091
+ SUM(ts.dur) as total_dur_ns
3092
+ FROM thread_state ts
3093
+ JOIN thread t ON ts.utid = t.utid
3094
+ JOIN process p ON t.upid = p.upid
3095
+ LEFT JOIN _cpu_topology ct ON ts.cpu = ct.cpu_id
3096
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
3097
+ AND p.name NOT LIKE '/system/%'
3098
+ AND t.tid = p.pid
3099
+ AND (${start_ts} IS NULL OR ts.ts >= ${start_ts})
3100
+ AND (${end_ts} IS NULL OR ts.ts < ${end_ts})
3101
+ ),
3102
+ -- RenderThread 分析
3103
+ render_thread_analysis AS (
3104
+ SELECT
3105
+ SUM(CASE WHEN ts.state = 'Running' AND COALESCE(ct.core_type, 'unknown') IN ('prime', 'big') THEN ts.dur ELSE 0 END) as q1_big_core_ns,
3106
+ SUM(CASE WHEN ts.state = 'Running' AND COALESCE(ct.core_type, 'unknown') IN ('medium', 'little') THEN ts.dur ELSE 0 END) as q2_small_core_ns,
3107
+ SUM(CASE WHEN ts.state = 'R' THEN ts.dur ELSE 0 END) as q3_runnable_ns,
3108
+ SUM(CASE WHEN ts.state IN ('S', 'D', 'DK', 'I') THEN ts.dur ELSE 0 END) as q4_sleep_ns,
3109
+ SUM(ts.dur) as total_dur_ns
3110
+ FROM thread_state ts
3111
+ JOIN thread t ON ts.utid = t.utid
3112
+ JOIN process p ON t.upid = p.upid
3113
+ LEFT JOIN _cpu_topology ct ON ts.cpu = ct.cpu_id
3114
+ WHERE (p.name GLOB '${package}*' OR '${package}' = '')
3115
+ AND p.name NOT LIKE '/system/%'
3116
+ AND t.name = 'RenderThread'
3117
+ AND (${start_ts} IS NULL OR ts.ts >= ${start_ts})
3118
+ AND (${end_ts} IS NULL OR ts.ts < ${end_ts})
3119
+ ),
3120
+ -- 计算主线程各象限百分比
3121
+ main_pct AS (
3122
+ SELECT
3123
+ ROUND(100.0 * q1_big_core_ns / NULLIF(total_dur_ns, 0), 1) as q1_pct,
3124
+ ROUND(100.0 * q2_small_core_ns / NULLIF(total_dur_ns, 0), 1) as q2_pct,
3125
+ ROUND(100.0 * q3_runnable_ns / NULLIF(total_dur_ns, 0), 1) as q3_pct,
3126
+ ROUND(100.0 * q4_sleep_ns / NULLIF(total_dur_ns, 0), 1) as q4_pct
3127
+ FROM main_thread_analysis
3128
+ ),
3129
+ -- 计算 RenderThread 各象限百分比
3130
+ render_pct AS (
3131
+ SELECT
3132
+ ROUND(100.0 * q1_big_core_ns / NULLIF(total_dur_ns, 0), 1) as q1_pct,
3133
+ ROUND(100.0 * q2_small_core_ns / NULLIF(total_dur_ns, 0), 1) as q2_pct,
3134
+ ROUND(100.0 * q3_runnable_ns / NULLIF(total_dur_ns, 0), 1) as q3_pct,
3135
+ ROUND(100.0 * q4_sleep_ns / NULLIF(total_dur_ns, 0), 1) as q4_pct
3136
+ FROM render_thread_analysis
3137
+ ),
3138
+ -- Binder 调用统计
3139
+ binder_stats AS (
3140
+ SELECT
3141
+ COUNT(*) as total_calls,
3142
+ SUM(client_dur) / 1e6 as total_dur_ms,
3143
+ MAX(client_dur) / 1e6 as max_dur_ms,
3144
+ AVG(client_dur) / 1e6 as avg_dur_ms
3145
+ FROM android_binder_txns
3146
+ WHERE (client_process GLOB '${package}*' OR '${package}' = '')
3147
+ AND (${start_ts} IS NULL OR client_ts >= ${start_ts})
3148
+ AND (${end_ts} IS NULL OR client_ts < ${end_ts})
3149
+ ),
3150
+ -- 综合分析
3151
+ analysis AS (
3152
+ SELECT
3153
+ (SELECT total_frames FROM jank_stats) as total_frames,
3154
+ (SELECT app_jank FROM jank_stats) as app_jank,
3155
+ (SELECT sf_jank FROM jank_stats) as sf_jank,
3156
+ (SELECT buffer_jank FROM jank_stats) as buffer_jank,
3157
+ (SELECT avg_dur_ms FROM jank_stats) as avg_dur_ms,
3158
+ (SELECT max_dur_ms FROM jank_stats) as max_dur_ms,
3159
+ (SELECT frame_budget_ms FROM jank_stats) as frame_budget_ms,
3160
+ (SELECT q3_pct FROM main_pct) as main_q3_pct,
3161
+ (SELECT q4_pct FROM main_pct) as main_q4_pct,
3162
+ (SELECT q2_pct FROM main_pct) as main_q2_pct,
3163
+ (SELECT q4_pct FROM render_pct) as render_q4_pct,
3164
+ (SELECT total_dur_ms FROM binder_stats) as binder_total_ms,
3165
+ (SELECT max_dur_ms FROM binder_stats) as binder_max_ms
3166
+ )
3167
+ SELECT
3168
+ -- 问题分类: APP / SYSTEM / MIXED
3169
+ CASE
3170
+ WHEN (SELECT sf_jank FROM analysis) > (SELECT app_jank FROM analysis) * 2 THEN 'SYSTEM'
3171
+ WHEN (SELECT app_jank FROM analysis) > (SELECT sf_jank FROM analysis) * 2 THEN 'APP'
3172
+ WHEN (SELECT main_q3_pct FROM analysis) > 15 THEN 'SYSTEM'
3173
+ WHEN (SELECT main_q4_pct FROM analysis) > 30 AND (SELECT binder_max_ms FROM analysis) > 5 THEN 'MIXED'
3174
+ WHEN (SELECT app_jank FROM analysis) > 0 THEN 'APP'
3175
+ ELSE 'UNKNOWN'
3176
+ END as problem_category,
3177
+ -- 问题组件
3178
+ -- 注意:MAIN_THREAD_BLOCKING (休眠/阻塞) 与 MAIN_THREAD (耗时操作) 是互斥的
3179
+ -- Q4 > 30% 表示主线程大部分时间在等待,问题是"阻塞"
3180
+ -- 只有 Q4 <= 30% 且 avg_dur 超过当前 VSync 预算,才判定为"主线程耗时操作"
3181
+ CASE
3182
+ WHEN (SELECT sf_jank FROM analysis) > (SELECT app_jank FROM analysis) * 2 THEN 'SURFACE_FLINGER'
3183
+ WHEN (SELECT main_q3_pct FROM analysis) > 15 THEN 'CPU_SCHEDULING'
3184
+ WHEN (SELECT main_q4_pct FROM analysis) > 30 AND (SELECT binder_max_ms FROM analysis) > 5 THEN 'BINDER'
3185
+ WHEN (SELECT main_q4_pct FROM analysis) > 30 THEN 'MAIN_THREAD_BLOCKING'
3186
+ WHEN (SELECT render_q4_pct FROM analysis) > 50 THEN 'RENDER_THREAD'
3187
+ WHEN (SELECT main_q2_pct FROM analysis) > 50 THEN 'CPU_AFFINITY'
3188
+ WHEN (SELECT avg_dur_ms FROM analysis) > COALESCE((SELECT frame_budget_ms FROM analysis), 8.33)
3189
+ AND COALESCE((SELECT main_q4_pct FROM analysis), 0) <= 30 THEN 'MAIN_THREAD'
3190
+ ELSE 'UNKNOWN'
3191
+ END as problem_component,
3192
+ -- 置信度 (0-1)
3193
+ CASE
3194
+ WHEN (SELECT total_frames FROM analysis) < 10 THEN 0.3
3195
+ WHEN (SELECT sf_jank FROM analysis) > (SELECT app_jank FROM analysis) * 2 THEN 0.9
3196
+ WHEN (SELECT app_jank FROM analysis) > (SELECT sf_jank FROM analysis) * 2 THEN 0.85
3197
+ WHEN (SELECT main_q3_pct FROM analysis) > 20 THEN 0.8
3198
+ WHEN (SELECT main_q4_pct FROM analysis) > 40 THEN 0.8
3199
+ ELSE 0.6
3200
+ END as confidence,
3201
+ -- 根因总结
3202
+ CASE
3203
+ WHEN (SELECT sf_jank FROM analysis) > (SELECT app_jank FROM analysis) * 2 THEN
3204
+ '系统级问题: SurfaceFlinger 处理异常,导致 ' || (SELECT sf_jank FROM analysis) || ' 帧掉帧'
3205
+ WHEN (SELECT main_q3_pct FROM analysis) > 15 THEN
3206
+ '系统级问题: CPU 调度拥堵,主线程 ' || (SELECT main_q3_pct FROM analysis) || '% 时间在等待调度'
3207
+ WHEN (SELECT main_q4_pct FROM analysis) > 30 AND (SELECT binder_max_ms FROM analysis) > 5 THEN
3208
+ '跨进程阻塞: Binder 调用最大耗时 ' || ROUND((SELECT binder_max_ms FROM analysis), 1) || 'ms'
3209
+ WHEN (SELECT main_q4_pct FROM analysis) > 30 THEN
3210
+ '主线程阻塞: ' || (SELECT main_q4_pct FROM analysis) || '% 时间在休眠/等待'
3211
+ WHEN (SELECT render_q4_pct FROM analysis) > 50 THEN
3212
+ 'RenderThread 等待: ' || (SELECT render_q4_pct FROM analysis) || '% 时间在休眠'
3213
+ WHEN (SELECT main_q2_pct FROM analysis) > 50 THEN
3214
+ 'CPU 亲和性问题: 主线程 ' || (SELECT main_q2_pct FROM analysis) || '% 时间运行在小核'
3215
+ WHEN (SELECT app_jank FROM analysis) > 0 THEN
3216
+ '应用级问题: ' || (SELECT app_jank FROM analysis) || ' 帧因应用原因掉帧,平均帧耗时 ' || ROUND((SELECT avg_dur_ms FROM analysis), 1) || 'ms'
3217
+ ELSE
3218
+ '分析数据不足,建议查看详细帧数据'
3219
+ END as root_cause_summary,
3220
+ -- 证据列表 (JSON 数组)
3221
+ '[' ||
3222
+ '"总帧数: ' || (SELECT total_frames FROM analysis) || '",' ||
3223
+ '"App 掉帧: ' || (SELECT app_jank FROM analysis) || '",' ||
3224
+ '"SF 掉帧: ' || (SELECT sf_jank FROM analysis) || '",' ||
3225
+ '"主线程 Q3 (等待调度): ' || COALESCE((SELECT main_q3_pct FROM analysis), 0) || '%",' ||
3226
+ '"主线程 Q4 (休眠阻塞): ' || COALESCE((SELECT main_q4_pct FROM analysis), 0) || '%",' ||
3227
+ '"Binder 最大耗时: ' || COALESCE(ROUND((SELECT binder_max_ms FROM analysis), 1), 0) || 'ms"' ||
3228
+ ']' as evidence,
3229
+ -- 优化建议
3230
+ CASE
3231
+ WHEN (SELECT sf_jank FROM analysis) > (SELECT app_jank FROM analysis) * 2 THEN
3232
+ '检查系统负载和 SurfaceFlinger 状态'
3233
+ WHEN (SELECT main_q3_pct FROM analysis) > 15 THEN
3234
+ '减少后台任务,考虑提高主线程优先级'
3235
+ WHEN (SELECT main_q4_pct FROM analysis) > 30 AND (SELECT binder_max_ms FROM analysis) > 5 THEN
3236
+ '优化 Binder 调用,考虑异步化或缓存'
3237
+ WHEN (SELECT main_q4_pct FROM analysis) > 30 THEN
3238
+ '检查主线程阻塞原因 (IO/锁/Binder)'
3239
+ WHEN (SELECT render_q4_pct FROM analysis) > 50 THEN
3240
+ '优化绘制流程,减少主线程耗时操作'
3241
+ WHEN (SELECT main_q2_pct FROM analysis) > 50 THEN
3242
+ '考虑使用 setThreadAffinity 或提高线程优先级'
3243
+ ELSE
3244
+ '查看详细帧分析,定位具体问题'
3245
+ END as suggestion
3246
+ save_as: conclusion
3247
+ condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && (perf_summary?.data?.[0]?.total_frames || 0) > 0 && enable_frame_details === true"
3248
+
3249
+ # ==========================================================================
3250
+ # Fallback: 当 FrameTimeline 数据不可用时提供基础信息
3251
+ # ==========================================================================
3252
+ - id: fallback_no_frame_timeline
3253
+ type: atomic
3254
+ name: "数据源不可用提示"
3255
+ condition: "frame_timeline.data[0]?.has_frame_timeline === 0"
3256
+ display:
3257
+ level: summary
3258
+ layer: overview
3259
+ title: "滑动分析 - 数据源缺失"
3260
+ columns:
3261
+ - name: status
3262
+ label: "状态"
3263
+ type: string
3264
+ - name: missing_table
3265
+ label: "缺失数据表"
3266
+ type: string
3267
+ - name: suggestion
3268
+ label: "建议"
3269
+ type: string
3270
+ sql: |
3271
+ SELECT
3272
+ '⚠️ 无法执行帧分析' as status,
3273
+ 'actual_frame_timeline_slice' as missing_table,
3274
+ '请确保 trace 采集时启用了 Frame Timeline (需要 Android 12+ 且开启 Choreographer tracing)' as suggestion
3275
+ UNION ALL
3276
+ SELECT
3277
+ 'ℹ️ 可用替代方案' as status,
3278
+ CASE
3279
+ WHEN EXISTS (SELECT 1 FROM sqlite_master WHERE type='table' AND name='frame_slice') THEN 'frame_slice (可用)'
3280
+ ELSE 'frame_slice (不可用)'
3281
+ END as missing_table,
3282
+ '可尝试使用 frame_slice 进行基础帧耗时分析' as suggestion
3283
+ save_as: fallback_info
3284
+
3285
+ output:
3286
+ format: layered
3287
+ default_expanded: [overview, list]
3288
+ # 结论输出映射
3289
+ conclusion:
3290
+ category: $conclusion.problem_category
3291
+ component: $conclusion.problem_component
3292
+ confidence: $conclusion.confidence
3293
+ summary: $conclusion.root_cause_summary
3294
+ evidence: $conclusion.evidence
3295
+ suggestion: $conclusion.suggestion