@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.
- package/.env.example +586 -0
- package/LICENSE +685 -0
- package/data/perfettoSqlDocs.json +33478 -0
- package/data/perfettoSqlIndex.json +9458 -0
- package/data/perfettoSqlIndex.light.json +13129 -0
- package/data/perfettoStdlibSymbols.json +677 -0
- package/dist/agent/agents/base/baseAgent.d.ts +378 -0
- package/dist/agent/agents/base/baseAgent.d.ts.map +1 -0
- package/dist/agent/agents/base/baseAgent.js +1484 -0
- package/dist/agent/agents/base/baseAgent.js.map +1 -0
- package/dist/agent/agents/base/baseSubAgent.d.ts +135 -0
- package/dist/agent/agents/base/baseSubAgent.d.ts.map +1 -0
- package/dist/agent/agents/base/baseSubAgent.js +483 -0
- package/dist/agent/agents/base/baseSubAgent.js.map +1 -0
- package/dist/agent/agents/baseExpertAgent.d.ts +37 -0
- package/dist/agent/agents/baseExpertAgent.d.ts.map +1 -0
- package/dist/agent/agents/baseExpertAgent.js +322 -0
- package/dist/agent/agents/baseExpertAgent.js.map +1 -0
- package/dist/agent/agents/domain/additionalAgents.d.ts +54 -0
- package/dist/agent/agents/domain/additionalAgents.d.ts.map +1 -0
- package/dist/agent/agents/domain/additionalAgents.js +292 -0
- package/dist/agent/agents/domain/additionalAgents.js.map +1 -0
- package/dist/agent/agents/domain/binderAgent.d.ts +27 -0
- package/dist/agent/agents/domain/binderAgent.d.ts.map +1 -0
- package/dist/agent/agents/domain/binderAgent.js +100 -0
- package/dist/agent/agents/domain/binderAgent.js.map +1 -0
- package/dist/agent/agents/domain/cpuAgent.d.ts +35 -0
- package/dist/agent/agents/domain/cpuAgent.d.ts.map +1 -0
- package/dist/agent/agents/domain/cpuAgent.js +163 -0
- package/dist/agent/agents/domain/cpuAgent.js.map +1 -0
- package/dist/agent/agents/domain/frameAgent.d.ts +59 -0
- package/dist/agent/agents/domain/frameAgent.d.ts.map +1 -0
- package/dist/agent/agents/domain/frameAgent.js +511 -0
- package/dist/agent/agents/domain/frameAgent.js.map +1 -0
- package/dist/agent/agents/domain/index.d.ts +92 -0
- package/dist/agent/agents/domain/index.d.ts.map +1 -0
- package/dist/agent/agents/domain/index.js +250 -0
- package/dist/agent/agents/domain/index.js.map +1 -0
- package/dist/agent/agents/domain/memoryAgent.d.ts +26 -0
- package/dist/agent/agents/domain/memoryAgent.d.ts.map +1 -0
- package/dist/agent/agents/domain/memoryAgent.js +94 -0
- package/dist/agent/agents/domain/memoryAgent.js.map +1 -0
- package/dist/agent/agents/domain/skillCatalog.d.ts +10 -0
- package/dist/agent/agents/domain/skillCatalog.d.ts.map +1 -0
- package/dist/agent/agents/domain/skillCatalog.js +66 -0
- package/dist/agent/agents/domain/skillCatalog.js.map +1 -0
- package/dist/agent/agents/evaluatorAgent.d.ts +76 -0
- package/dist/agent/agents/evaluatorAgent.d.ts.map +1 -0
- package/dist/agent/agents/evaluatorAgent.js +517 -0
- package/dist/agent/agents/evaluatorAgent.js.map +1 -0
- package/dist/agent/agents/index.d.ts +13 -0
- package/dist/agent/agents/index.d.ts.map +1 -0
- package/dist/agent/agents/index.js +25 -0
- package/dist/agent/agents/index.js.map +1 -0
- package/dist/agent/agents/iterationStrategyPlanner.d.ts +140 -0
- package/dist/agent/agents/iterationStrategyPlanner.d.ts.map +1 -0
- package/dist/agent/agents/iterationStrategyPlanner.js +359 -0
- package/dist/agent/agents/iterationStrategyPlanner.js.map +1 -0
- package/dist/agent/agents/plannerAgent.d.ts +56 -0
- package/dist/agent/agents/plannerAgent.d.ts.map +1 -0
- package/dist/agent/agents/plannerAgent.js +379 -0
- package/dist/agent/agents/plannerAgent.js.map +1 -0
- package/dist/agent/agents/scrollingExpertAgent.d.ts +11 -0
- package/dist/agent/agents/scrollingExpertAgent.d.ts.map +1 -0
- package/dist/agent/agents/scrollingExpertAgent.js +132 -0
- package/dist/agent/agents/scrollingExpertAgent.js.map +1 -0
- package/dist/agent/agents/tools/adbTools.d.ts +5 -0
- package/dist/agent/agents/tools/adbTools.d.ts.map +1 -0
- package/dist/agent/agents/tools/adbTools.js +326 -0
- package/dist/agent/agents/tools/adbTools.js.map +1 -0
- package/dist/agent/communication/agentMessageBus.d.ts +138 -0
- package/dist/agent/communication/agentMessageBus.d.ts.map +1 -0
- package/dist/agent/communication/agentMessageBus.js +542 -0
- package/dist/agent/communication/agentMessageBus.js.map +1 -0
- package/dist/agent/communication/index.d.ts +7 -0
- package/dist/agent/communication/index.d.ts.map +1 -0
- package/dist/agent/communication/index.js +15 -0
- package/dist/agent/communication/index.js.map +1 -0
- package/dist/agent/compaction/compactionTypes.d.ts +163 -0
- package/dist/agent/compaction/compactionTypes.d.ts.map +1 -0
- package/dist/agent/compaction/compactionTypes.js +32 -0
- package/dist/agent/compaction/compactionTypes.js.map +1 -0
- package/dist/agent/compaction/contextCompactor.d.ts +109 -0
- package/dist/agent/compaction/contextCompactor.d.ts.map +1 -0
- package/dist/agent/compaction/contextCompactor.js +225 -0
- package/dist/agent/compaction/contextCompactor.js.map +1 -0
- package/dist/agent/compaction/index.d.ts +10 -0
- package/dist/agent/compaction/index.d.ts.map +1 -0
- package/dist/agent/compaction/index.js +43 -0
- package/dist/agent/compaction/index.js.map +1 -0
- package/dist/agent/compaction/strategies/index.d.ts +5 -0
- package/dist/agent/compaction/strategies/index.d.ts.map +1 -0
- package/dist/agent/compaction/strategies/index.js +13 -0
- package/dist/agent/compaction/strategies/index.js.map +1 -0
- package/dist/agent/compaction/strategies/slidingWindowStrategy.d.ts +53 -0
- package/dist/agent/compaction/strategies/slidingWindowStrategy.d.ts.map +1 -0
- package/dist/agent/compaction/strategies/slidingWindowStrategy.js +237 -0
- package/dist/agent/compaction/strategies/slidingWindowStrategy.js.map +1 -0
- package/dist/agent/compaction/tokenEstimator.d.ts +78 -0
- package/dist/agent/compaction/tokenEstimator.d.ts.map +1 -0
- package/dist/agent/compaction/tokenEstimator.js +203 -0
- package/dist/agent/compaction/tokenEstimator.js.map +1 -0
- package/dist/agent/config/decisionThresholdManifest.d.ts +72 -0
- package/dist/agent/config/decisionThresholdManifest.d.ts.map +1 -0
- package/dist/agent/config/decisionThresholdManifest.js +77 -0
- package/dist/agent/config/decisionThresholdManifest.js.map +1 -0
- package/dist/agent/config/domainManifest.d.ts +77 -0
- package/dist/agent/config/domainManifest.d.ts.map +1 -0
- package/dist/agent/config/domainManifest.js +269 -0
- package/dist/agent/config/domainManifest.js.map +1 -0
- package/dist/agent/config/drillDownRegistry.d.ts +19 -0
- package/dist/agent/config/drillDownRegistry.d.ts.map +1 -0
- package/dist/agent/config/drillDownRegistry.js +118 -0
- package/dist/agent/config/drillDownRegistry.js.map +1 -0
- package/dist/agent/context/contextBuilder.d.ts +79 -0
- package/dist/agent/context/contextBuilder.d.ts.map +1 -0
- package/dist/agent/context/contextBuilder.js +273 -0
- package/dist/agent/context/contextBuilder.js.map +1 -0
- package/dist/agent/context/contextTypes.d.ts +121 -0
- package/dist/agent/context/contextTypes.d.ts.map +1 -0
- package/dist/agent/context/contextTypes.js +14 -0
- package/dist/agent/context/contextTypes.js.map +1 -0
- package/dist/agent/context/enhancedSessionContext.d.ts +283 -0
- package/dist/agent/context/enhancedSessionContext.d.ts.map +1 -0
- package/dist/agent/context/enhancedSessionContext.js +1636 -0
- package/dist/agent/context/enhancedSessionContext.js.map +1 -0
- package/dist/agent/context/entityStore.d.ts +374 -0
- package/dist/agent/context/entityStore.d.ts.map +1 -0
- package/dist/agent/context/entityStore.js +621 -0
- package/dist/agent/context/entityStore.js.map +1 -0
- package/dist/agent/context/focusStore.d.ts +229 -0
- package/dist/agent/context/focusStore.d.ts.map +1 -0
- package/dist/agent/context/focusStore.js +528 -0
- package/dist/agent/context/focusStore.js.map +1 -0
- package/dist/agent/context/index.d.ts +10 -0
- package/dist/agent/context/index.d.ts.map +1 -0
- package/dist/agent/context/index.js +42 -0
- package/dist/agent/context/index.js.map +1 -0
- package/dist/agent/context/policies/evaluatorPolicy.d.ts +22 -0
- package/dist/agent/context/policies/evaluatorPolicy.d.ts.map +1 -0
- package/dist/agent/context/policies/evaluatorPolicy.js +82 -0
- package/dist/agent/context/policies/evaluatorPolicy.js.map +1 -0
- package/dist/agent/context/policies/index.d.ts +7 -0
- package/dist/agent/context/policies/index.d.ts.map +1 -0
- package/dist/agent/context/policies/index.js +18 -0
- package/dist/agent/context/policies/index.js.map +1 -0
- package/dist/agent/context/policies/plannerPolicy.d.ts +27 -0
- package/dist/agent/context/policies/plannerPolicy.d.ts.map +1 -0
- package/dist/agent/context/policies/plannerPolicy.js +67 -0
- package/dist/agent/context/policies/plannerPolicy.js.map +1 -0
- package/dist/agent/context/policies/workerPolicy.d.ts +29 -0
- package/dist/agent/context/policies/workerPolicy.d.ts.map +1 -0
- package/dist/agent/context/policies/workerPolicy.js +99 -0
- package/dist/agent/context/policies/workerPolicy.js.map +1 -0
- package/dist/agent/core/circuitBreaker.d.ts +150 -0
- package/dist/agent/core/circuitBreaker.d.ts.map +1 -0
- package/dist/agent/core/circuitBreaker.js +500 -0
- package/dist/agent/core/circuitBreaker.js.map +1 -0
- package/dist/agent/core/conclusionContract.d.ts +61 -0
- package/dist/agent/core/conclusionContract.d.ts.map +1 -0
- package/dist/agent/core/conclusionContract.js +6 -0
- package/dist/agent/core/conclusionContract.js.map +1 -0
- package/dist/agent/core/conclusionGenerator.d.ts +42 -0
- package/dist/agent/core/conclusionGenerator.d.ts.map +1 -0
- package/dist/agent/core/conclusionGenerator.js +4109 -0
- package/dist/agent/core/conclusionGenerator.js.map +1 -0
- package/dist/agent/core/conclusionSceneTemplates.d.ts +8 -0
- package/dist/agent/core/conclusionSceneTemplates.d.ts.map +1 -0
- package/dist/agent/core/conclusionSceneTemplates.js +31 -0
- package/dist/agent/core/conclusionSceneTemplates.js.map +1 -0
- package/dist/agent/core/drillDownResolver.d.ts +67 -0
- package/dist/agent/core/drillDownResolver.d.ts.map +1 -0
- package/dist/agent/core/drillDownResolver.js +583 -0
- package/dist/agent/core/drillDownResolver.js.map +1 -0
- package/dist/agent/core/emittedEnvelopeRegistry.d.ts +75 -0
- package/dist/agent/core/emittedEnvelopeRegistry.d.ts.map +1 -0
- package/dist/agent/core/emittedEnvelopeRegistry.js +164 -0
- package/dist/agent/core/emittedEnvelopeRegistry.js.map +1 -0
- package/dist/agent/core/entityCapture.d.ts +53 -0
- package/dist/agent/core/entityCapture.d.ts.map +1 -0
- package/dist/agent/core/entityCapture.js +522 -0
- package/dist/agent/core/entityCapture.js.map +1 -0
- package/dist/agent/core/entityRegistry.d.ts +19 -0
- package/dist/agent/core/entityRegistry.d.ts.map +1 -0
- package/dist/agent/core/entityRegistry.js +102 -0
- package/dist/agent/core/entityRegistry.js.map +1 -0
- package/dist/agent/core/executors/analysisExecutor.d.ts +21 -0
- package/dist/agent/core/executors/analysisExecutor.d.ts.map +1 -0
- package/dist/agent/core/executors/analysisExecutor.js +6 -0
- package/dist/agent/core/executors/analysisExecutor.js.map +1 -0
- package/dist/agent/core/executors/clarifyExecutor.d.ts +42 -0
- package/dist/agent/core/executors/clarifyExecutor.d.ts.map +1 -0
- package/dist/agent/core/executors/clarifyExecutor.js +316 -0
- package/dist/agent/core/executors/clarifyExecutor.js.map +1 -0
- package/dist/agent/core/executors/comparisonExecutor.d.ts +39 -0
- package/dist/agent/core/executors/comparisonExecutor.d.ts.map +1 -0
- package/dist/agent/core/executors/comparisonExecutor.js +404 -0
- package/dist/agent/core/executors/comparisonExecutor.js.map +1 -0
- package/dist/agent/core/executors/directDrillDownExecutor.d.ts +56 -0
- package/dist/agent/core/executors/directDrillDownExecutor.d.ts.map +1 -0
- package/dist/agent/core/executors/directDrillDownExecutor.js +665 -0
- package/dist/agent/core/executors/directDrillDownExecutor.js.map +1 -0
- package/dist/agent/core/executors/directSkillExecutor.d.ts +106 -0
- package/dist/agent/core/executors/directSkillExecutor.d.ts.map +1 -0
- package/dist/agent/core/executors/directSkillExecutor.js +633 -0
- package/dist/agent/core/executors/directSkillExecutor.js.map +1 -0
- package/dist/agent/core/executors/extendExecutor.d.ts +50 -0
- package/dist/agent/core/executors/extendExecutor.d.ts.map +1 -0
- package/dist/agent/core/executors/extendExecutor.js +402 -0
- package/dist/agent/core/executors/extendExecutor.js.map +1 -0
- package/dist/agent/core/executors/hypothesisExecutor.d.ts +52 -0
- package/dist/agent/core/executors/hypothesisExecutor.d.ts.map +1 -0
- package/dist/agent/core/executors/hypothesisExecutor.js +564 -0
- package/dist/agent/core/executors/hypothesisExecutor.js.map +1 -0
- package/dist/agent/core/executors/index.d.ts +9 -0
- package/dist/agent/core/executors/index.d.ts.map +1 -0
- package/dist/agent/core/executors/index.js +15 -0
- package/dist/agent/core/executors/index.js.map +1 -0
- package/dist/agent/core/executors/strategy/strategyFrameEnvelopeCoordinator.d.ts +12 -0
- package/dist/agent/core/executors/strategy/strategyFrameEnvelopeCoordinator.d.ts.map +1 -0
- package/dist/agent/core/executors/strategy/strategyFrameEnvelopeCoordinator.js +186 -0
- package/dist/agent/core/executors/strategy/strategyFrameEnvelopeCoordinator.js.map +1 -0
- package/dist/agent/core/executors/strategy/strategyFrameMechanismCollector.d.ts +9 -0
- package/dist/agent/core/executors/strategy/strategyFrameMechanismCollector.d.ts.map +1 -0
- package/dist/agent/core/executors/strategy/strategyFrameMechanismCollector.js +123 -0
- package/dist/agent/core/executors/strategy/strategyFrameMechanismCollector.js.map +1 -0
- package/dist/agent/core/executors/strategy/strategyStagePlanner.d.ts +18 -0
- package/dist/agent/core/executors/strategy/strategyStagePlanner.d.ts.map +1 -0
- package/dist/agent/core/executors/strategy/strategyStagePlanner.js +69 -0
- package/dist/agent/core/executors/strategy/strategyStagePlanner.js.map +1 -0
- package/dist/agent/core/executors/strategy/strategyStageTaskBuilder.d.ts +14 -0
- package/dist/agent/core/executors/strategy/strategyStageTaskBuilder.d.ts.map +1 -0
- package/dist/agent/core/executors/strategy/strategyStageTaskBuilder.js +129 -0
- package/dist/agent/core/executors/strategy/strategyStageTaskBuilder.js.map +1 -0
- package/dist/agent/core/executors/strategyExecutor.d.ts +16 -0
- package/dist/agent/core/executors/strategyExecutor.d.ts.map +1 -0
- package/dist/agent/core/executors/strategyExecutor.js +377 -0
- package/dist/agent/core/executors/strategyExecutor.js.map +1 -0
- package/dist/agent/core/executors/traceConfigDetector.d.ts +28 -0
- package/dist/agent/core/executors/traceConfigDetector.d.ts.map +1 -0
- package/dist/agent/core/executors/traceConfigDetector.js +156 -0
- package/dist/agent/core/executors/traceConfigDetector.js.map +1 -0
- package/dist/agent/core/feedbackSynthesizer.d.ts +28 -0
- package/dist/agent/core/feedbackSynthesizer.d.ts.map +1 -0
- package/dist/agent/core/feedbackSynthesizer.js +841 -0
- package/dist/agent/core/feedbackSynthesizer.js.map +1 -0
- package/dist/agent/core/followUpHandler.d.ts +36 -0
- package/dist/agent/core/followUpHandler.d.ts.map +1 -0
- package/dist/agent/core/followUpHandler.js +413 -0
- package/dist/agent/core/followUpHandler.js.map +1 -0
- package/dist/agent/core/hypothesisGenerator.d.ts +45 -0
- package/dist/agent/core/hypothesisGenerator.d.ts.map +1 -0
- package/dist/agent/core/hypothesisGenerator.js +257 -0
- package/dist/agent/core/hypothesisGenerator.js.map +1 -0
- package/dist/agent/core/incrementalAnalyzer.d.ts +164 -0
- package/dist/agent/core/incrementalAnalyzer.d.ts.map +1 -0
- package/dist/agent/core/incrementalAnalyzer.js +382 -0
- package/dist/agent/core/incrementalAnalyzer.js.map +1 -0
- package/dist/agent/core/index.d.ts +25 -0
- package/dist/agent/core/index.d.ts.map +1 -0
- package/dist/agent/core/index.js +61 -0
- package/dist/agent/core/index.js.map +1 -0
- package/dist/agent/core/intentUnderstanding.d.ts +28 -0
- package/dist/agent/core/intentUnderstanding.d.ts.map +1 -0
- package/dist/agent/core/intentUnderstanding.js +451 -0
- package/dist/agent/core/intentUnderstanding.js.map +1 -0
- package/dist/agent/core/interventionController.d.ts +211 -0
- package/dist/agent/core/interventionController.d.ts.map +1 -0
- package/dist/agent/core/interventionController.js +477 -0
- package/dist/agent/core/interventionController.js.map +1 -0
- package/dist/agent/core/jankCauseSummarizer.d.ts +87 -0
- package/dist/agent/core/jankCauseSummarizer.d.ts.map +1 -0
- package/dist/agent/core/jankCauseSummarizer.js +432 -0
- package/dist/agent/core/jankCauseSummarizer.js.map +1 -0
- package/dist/agent/core/modelRouter.d.ts +164 -0
- package/dist/agent/core/modelRouter.d.ts.map +1 -0
- package/dist/agent/core/modelRouter.js +1169 -0
- package/dist/agent/core/modelRouter.js.map +1 -0
- package/dist/agent/core/modelRouterSingleton.d.ts +4 -0
- package/dist/agent/core/modelRouterSingleton.d.ts.map +1 -0
- package/dist/agent/core/modelRouterSingleton.js +20 -0
- package/dist/agent/core/modelRouterSingleton.js.map +1 -0
- package/dist/agent/core/orchestratorTypes.d.ts +506 -0
- package/dist/agent/core/orchestratorTypes.d.ts.map +1 -0
- package/dist/agent/core/orchestratorTypes.js +91 -0
- package/dist/agent/core/orchestratorTypes.js.map +1 -0
- package/dist/agent/core/pipelineExecutor.d.ts +154 -0
- package/dist/agent/core/pipelineExecutor.d.ts.map +1 -0
- package/dist/agent/core/pipelineExecutor.js +677 -0
- package/dist/agent/core/pipelineExecutor.js.map +1 -0
- package/dist/agent/core/scenePolicy.d.ts +3 -0
- package/dist/agent/core/scenePolicy.d.ts.map +1 -0
- package/dist/agent/core/scenePolicy.js +49 -0
- package/dist/agent/core/scenePolicy.js.map +1 -0
- package/dist/agent/core/sceneRouter.d.ts +8 -0
- package/dist/agent/core/sceneRouter.d.ts.map +1 -0
- package/dist/agent/core/sceneRouter.js +122 -0
- package/dist/agent/core/sceneRouter.js.map +1 -0
- package/dist/agent/core/sceneTaxonomy.d.ts +6 -0
- package/dist/agent/core/sceneTaxonomy.d.ts.map +1 -0
- package/dist/agent/core/sceneTaxonomy.js +83 -0
- package/dist/agent/core/sceneTaxonomy.js.map +1 -0
- package/dist/agent/core/sceneTemplateStore.d.ts +10 -0
- package/dist/agent/core/sceneTemplateStore.d.ts.map +1 -0
- package/dist/agent/core/sceneTemplateStore.js +244 -0
- package/dist/agent/core/sceneTemplateStore.js.map +1 -0
- package/dist/agent/core/sceneTemplateValidator.d.ts +22 -0
- package/dist/agent/core/sceneTemplateValidator.d.ts.map +1 -0
- package/dist/agent/core/sceneTemplateValidator.js +226 -0
- package/dist/agent/core/sceneTemplateValidator.js.map +1 -0
- package/dist/agent/core/sceneTypes.d.ts +53 -0
- package/dist/agent/core/sceneTypes.d.ts.map +1 -0
- package/dist/agent/core/sceneTypes.js +6 -0
- package/dist/agent/core/sceneTypes.js.map +1 -0
- package/dist/agent/core/stateMachine.d.ts +135 -0
- package/dist/agent/core/stateMachine.d.ts.map +1 -0
- package/dist/agent/core/stateMachine.js +516 -0
- package/dist/agent/core/stateMachine.js.map +1 -0
- package/dist/agent/core/strategySelector.d.ts +121 -0
- package/dist/agent/core/strategySelector.d.ts.map +1 -0
- package/dist/agent/core/strategySelector.js +344 -0
- package/dist/agent/core/strategySelector.js.map +1 -0
- package/dist/agent/core/taskGraphExecutor.d.ts +30 -0
- package/dist/agent/core/taskGraphExecutor.d.ts.map +1 -0
- package/dist/agent/core/taskGraphExecutor.js +142 -0
- package/dist/agent/core/taskGraphExecutor.js.map +1 -0
- package/dist/agent/core/taskGraphPlanner.d.ts +33 -0
- package/dist/agent/core/taskGraphPlanner.d.ts.map +1 -0
- package/dist/agent/core/taskGraphPlanner.js +312 -0
- package/dist/agent/core/taskGraphPlanner.js.map +1 -0
- package/dist/agent/decision/decisionTreeExecutor.d.ts +55 -0
- package/dist/agent/decision/decisionTreeExecutor.d.ts.map +1 -0
- package/dist/agent/decision/decisionTreeExecutor.js +250 -0
- package/dist/agent/decision/decisionTreeExecutor.js.map +1 -0
- package/dist/agent/decision/decisionTreeStageExecutor.d.ts +65 -0
- package/dist/agent/decision/decisionTreeStageExecutor.d.ts.map +1 -0
- package/dist/agent/decision/decisionTreeStageExecutor.js +286 -0
- package/dist/agent/decision/decisionTreeStageExecutor.js.map +1 -0
- package/dist/agent/decision/index.d.ts +27 -0
- package/dist/agent/decision/index.d.ts.map +1 -0
- package/dist/agent/decision/index.js +70 -0
- package/dist/agent/decision/index.js.map +1 -0
- package/dist/agent/decision/skillExecutorAdapter.d.ts +89 -0
- package/dist/agent/decision/skillExecutorAdapter.d.ts.map +1 -0
- package/dist/agent/decision/skillExecutorAdapter.js +447 -0
- package/dist/agent/decision/skillExecutorAdapter.js.map +1 -0
- package/dist/agent/decision/trees/index.d.ts +8 -0
- package/dist/agent/decision/trees/index.d.ts.map +1 -0
- package/dist/agent/decision/trees/index.js +16 -0
- package/dist/agent/decision/trees/index.js.map +1 -0
- package/dist/agent/decision/trees/launchDecisionTree.d.ts +7 -0
- package/dist/agent/decision/trees/launchDecisionTree.d.ts.map +1 -0
- package/dist/agent/decision/trees/launchDecisionTree.js +670 -0
- package/dist/agent/decision/trees/launchDecisionTree.js.map +1 -0
- package/dist/agent/decision/trees/scrollingDecisionTree.d.ts +7 -0
- package/dist/agent/decision/trees/scrollingDecisionTree.d.ts.map +1 -0
- package/dist/agent/decision/trees/scrollingDecisionTree.js +698 -0
- package/dist/agent/decision/trees/scrollingDecisionTree.js.map +1 -0
- package/dist/agent/decision/types.d.ts +191 -0
- package/dist/agent/decision/types.d.ts.map +1 -0
- package/dist/agent/decision/types.js +6 -0
- package/dist/agent/decision/types.js.map +1 -0
- package/dist/agent/detectors/architectureDetector.d.ts +31 -0
- package/dist/agent/detectors/architectureDetector.d.ts.map +1 -0
- package/dist/agent/detectors/architectureDetector.js +190 -0
- package/dist/agent/detectors/architectureDetector.js.map +1 -0
- package/dist/agent/detectors/index.d.ts +11 -0
- package/dist/agent/detectors/index.d.ts.map +1 -0
- package/dist/agent/detectors/index.js +36 -0
- package/dist/agent/detectors/index.js.map +1 -0
- package/dist/agent/detectors/types.d.ts +113 -0
- package/dist/agent/detectors/types.d.ts.map +1 -0
- package/dist/agent/detectors/types.js +6 -0
- package/dist/agent/detectors/types.js.map +1 -0
- package/dist/agent/evalSystem.d.ts +61 -0
- package/dist/agent/evalSystem.d.ts.map +1 -0
- package/dist/agent/evalSystem.js +210 -0
- package/dist/agent/evalSystem.js.map +1 -0
- package/dist/agent/experts/base/baseExpert.d.ts +108 -0
- package/dist/agent/experts/base/baseExpert.d.ts.map +1 -0
- package/dist/agent/experts/base/baseExpert.js +359 -0
- package/dist/agent/experts/base/baseExpert.js.map +1 -0
- package/dist/agent/experts/base/index.d.ts +9 -0
- package/dist/agent/experts/base/index.d.ts.map +1 -0
- package/dist/agent/experts/base/index.js +15 -0
- package/dist/agent/experts/base/index.js.map +1 -0
- package/dist/agent/experts/base/types.d.ts +202 -0
- package/dist/agent/experts/base/types.d.ts.map +1 -0
- package/dist/agent/experts/base/types.js +6 -0
- package/dist/agent/experts/base/types.js.map +1 -0
- package/dist/agent/experts/crossDomain/baseCrossDomainExpert.d.ts +113 -0
- package/dist/agent/experts/crossDomain/baseCrossDomainExpert.d.ts.map +1 -0
- package/dist/agent/experts/crossDomain/baseCrossDomainExpert.js +412 -0
- package/dist/agent/experts/crossDomain/baseCrossDomainExpert.js.map +1 -0
- package/dist/agent/experts/crossDomain/dialogueProtocol.d.ts +164 -0
- package/dist/agent/experts/crossDomain/dialogueProtocol.d.ts.map +1 -0
- package/dist/agent/experts/crossDomain/dialogueProtocol.js +390 -0
- package/dist/agent/experts/crossDomain/dialogueProtocol.js.map +1 -0
- package/dist/agent/experts/crossDomain/experts/performanceExpert.d.ts +119 -0
- package/dist/agent/experts/crossDomain/experts/performanceExpert.d.ts.map +1 -0
- package/dist/agent/experts/crossDomain/experts/performanceExpert.js +736 -0
- package/dist/agent/experts/crossDomain/experts/performanceExpert.js.map +1 -0
- package/dist/agent/experts/crossDomain/hypothesisManager.d.ts +105 -0
- package/dist/agent/experts/crossDomain/hypothesisManager.d.ts.map +1 -0
- package/dist/agent/experts/crossDomain/hypothesisManager.js +283 -0
- package/dist/agent/experts/crossDomain/hypothesisManager.js.map +1 -0
- package/dist/agent/experts/crossDomain/index.d.ts +18 -0
- package/dist/agent/experts/crossDomain/index.d.ts.map +1 -0
- package/dist/agent/experts/crossDomain/index.js +28 -0
- package/dist/agent/experts/crossDomain/index.js.map +1 -0
- package/dist/agent/experts/crossDomain/moduleCatalog.d.ts +97 -0
- package/dist/agent/experts/crossDomain/moduleCatalog.d.ts.map +1 -0
- package/dist/agent/experts/crossDomain/moduleCatalog.js +453 -0
- package/dist/agent/experts/crossDomain/moduleCatalog.js.map +1 -0
- package/dist/agent/experts/crossDomain/moduleExpertInvoker.d.ts +149 -0
- package/dist/agent/experts/crossDomain/moduleExpertInvoker.d.ts.map +1 -0
- package/dist/agent/experts/crossDomain/moduleExpertInvoker.js +582 -0
- package/dist/agent/experts/crossDomain/moduleExpertInvoker.js.map +1 -0
- package/dist/agent/experts/crossDomain/types.d.ts +369 -0
- package/dist/agent/experts/crossDomain/types.d.ts.map +1 -0
- package/dist/agent/experts/crossDomain/types.js +6 -0
- package/dist/agent/experts/crossDomain/types.js.map +1 -0
- package/dist/agent/experts/index.d.ts +81 -0
- package/dist/agent/experts/index.d.ts.map +1 -0
- package/dist/agent/experts/index.js +222 -0
- package/dist/agent/experts/index.js.map +1 -0
- package/dist/agent/experts/interactionExpert.d.ts +66 -0
- package/dist/agent/experts/interactionExpert.d.ts.map +1 -0
- package/dist/agent/experts/interactionExpert.js +280 -0
- package/dist/agent/experts/interactionExpert.js.map +1 -0
- package/dist/agent/experts/launchExpert.d.ts +73 -0
- package/dist/agent/experts/launchExpert.d.ts.map +1 -0
- package/dist/agent/experts/launchExpert.js +411 -0
- package/dist/agent/experts/launchExpert.js.map +1 -0
- package/dist/agent/experts/systemExpert.d.ts +81 -0
- package/dist/agent/experts/systemExpert.d.ts.map +1 -0
- package/dist/agent/experts/systemExpert.js +507 -0
- package/dist/agent/experts/systemExpert.js.map +1 -0
- package/dist/agent/fork/forkManager.d.ts +161 -0
- package/dist/agent/fork/forkManager.d.ts.map +1 -0
- package/dist/agent/fork/forkManager.js +721 -0
- package/dist/agent/fork/forkManager.js.map +1 -0
- package/dist/agent/fork/forkTypes.d.ts +274 -0
- package/dist/agent/fork/forkTypes.d.ts.map +1 -0
- package/dist/agent/fork/forkTypes.js +18 -0
- package/dist/agent/fork/forkTypes.js.map +1 -0
- package/dist/agent/fork/index.d.ts +10 -0
- package/dist/agent/fork/index.d.ts.map +1 -0
- package/dist/agent/fork/index.js +47 -0
- package/dist/agent/fork/index.js.map +1 -0
- package/dist/agent/fork/mergeStrategies.d.ts +115 -0
- package/dist/agent/fork/mergeStrategies.d.ts.map +1 -0
- package/dist/agent/fork/mergeStrategies.js +404 -0
- package/dist/agent/fork/mergeStrategies.js.map +1 -0
- package/dist/agent/fork/sessionTree.d.ts +141 -0
- package/dist/agent/fork/sessionTree.d.ts.map +1 -0
- package/dist/agent/fork/sessionTree.js +443 -0
- package/dist/agent/fork/sessionTree.js.map +1 -0
- package/dist/agent/hooks/hookContext.d.ts +19 -0
- package/dist/agent/hooks/hookContext.d.ts.map +1 -0
- package/dist/agent/hooks/hookContext.js +67 -0
- package/dist/agent/hooks/hookContext.js.map +1 -0
- package/dist/agent/hooks/hookRegistry.d.ts +73 -0
- package/dist/agent/hooks/hookRegistry.d.ts.map +1 -0
- package/dist/agent/hooks/hookRegistry.js +271 -0
- package/dist/agent/hooks/hookRegistry.js.map +1 -0
- package/dist/agent/hooks/hookTypes.d.ts +186 -0
- package/dist/agent/hooks/hookTypes.d.ts.map +1 -0
- package/dist/agent/hooks/hookTypes.js +24 -0
- package/dist/agent/hooks/hookTypes.js.map +1 -0
- package/dist/agent/hooks/index.d.ts +10 -0
- package/dist/agent/hooks/index.d.ts.map +1 -0
- package/dist/agent/hooks/index.js +41 -0
- package/dist/agent/hooks/index.js.map +1 -0
- package/dist/agent/hooks/middleware/index.d.ts +6 -0
- package/dist/agent/hooks/middleware/index.d.ts.map +1 -0
- package/dist/agent/hooks/middleware/index.js +17 -0
- package/dist/agent/hooks/middleware/index.js.map +1 -0
- package/dist/agent/hooks/middleware/loggingMiddleware.d.ts +27 -0
- package/dist/agent/hooks/middleware/loggingMiddleware.d.ts.map +1 -0
- package/dist/agent/hooks/middleware/loggingMiddleware.js +104 -0
- package/dist/agent/hooks/middleware/loggingMiddleware.js.map +1 -0
- package/dist/agent/hooks/middleware/timingMiddleware.d.ts +56 -0
- package/dist/agent/hooks/middleware/timingMiddleware.d.ts.map +1 -0
- package/dist/agent/hooks/middleware/timingMiddleware.js +171 -0
- package/dist/agent/hooks/middleware/timingMiddleware.js.map +1 -0
- package/dist/agent/index.d.ts +15 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +88 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/llmAdapter.d.ts +33 -0
- package/dist/agent/llmAdapter.d.ts.map +1 -0
- package/dist/agent/llmAdapter.js +257 -0
- package/dist/agent/llmAdapter.js.map +1 -0
- package/dist/agent/scene/sceneAnalysisJobRunner.d.ts +106 -0
- package/dist/agent/scene/sceneAnalysisJobRunner.d.ts.map +1 -0
- package/dist/agent/scene/sceneAnalysisJobRunner.js +201 -0
- package/dist/agent/scene/sceneAnalysisJobRunner.js.map +1 -0
- package/dist/agent/scene/sceneCostEstimator.d.ts +33 -0
- package/dist/agent/scene/sceneCostEstimator.d.ts.map +1 -0
- package/dist/agent/scene/sceneCostEstimator.js +42 -0
- package/dist/agent/scene/sceneCostEstimator.js.map +1 -0
- package/dist/agent/scene/sceneIntervalBuilder.d.ts +37 -0
- package/dist/agent/scene/sceneIntervalBuilder.d.ts.map +1 -0
- package/dist/agent/scene/sceneIntervalBuilder.js +748 -0
- package/dist/agent/scene/sceneIntervalBuilder.js.map +1 -0
- package/dist/agent/scene/sceneStage1Runner.d.ts +47 -0
- package/dist/agent/scene/sceneStage1Runner.d.ts.map +1 -0
- package/dist/agent/scene/sceneStage1Runner.js +49 -0
- package/dist/agent/scene/sceneStage1Runner.js.map +1 -0
- package/dist/agent/scene/sceneStage3Summarizer.d.ts +11 -0
- package/dist/agent/scene/sceneStage3Summarizer.d.ts.map +1 -0
- package/dist/agent/scene/sceneStage3Summarizer.js +155 -0
- package/dist/agent/scene/sceneStage3Summarizer.js.map +1 -0
- package/dist/agent/scene/sceneStoryService.d.ts +168 -0
- package/dist/agent/scene/sceneStoryService.d.ts.map +1 -0
- package/dist/agent/scene/sceneStoryService.js +623 -0
- package/dist/agent/scene/sceneStoryService.js.map +1 -0
- package/dist/agent/scene/sceneTraceDurationProbe.d.ts +16 -0
- package/dist/agent/scene/sceneTraceDurationProbe.d.ts.map +1 -0
- package/dist/agent/scene/sceneTraceDurationProbe.js +22 -0
- package/dist/agent/scene/sceneTraceDurationProbe.js.map +1 -0
- package/dist/agent/scene/traceHash.d.ts +23 -0
- package/dist/agent/scene/traceHash.d.ts.map +1 -0
- package/dist/agent/scene/traceHash.js +65 -0
- package/dist/agent/scene/traceHash.js.map +1 -0
- package/dist/agent/scene/types.d.ts +199 -0
- package/dist/agent/scene/types.d.ts.map +1 -0
- package/dist/agent/scene/types.js +6 -0
- package/dist/agent/scene/types.js.map +1 -0
- package/dist/agent/state/checkpointManager.d.ts +85 -0
- package/dist/agent/state/checkpointManager.d.ts.map +1 -0
- package/dist/agent/state/checkpointManager.js +339 -0
- package/dist/agent/state/checkpointManager.js.map +1 -0
- package/dist/agent/state/index.d.ts +11 -0
- package/dist/agent/state/index.d.ts.map +1 -0
- package/dist/agent/state/index.js +21 -0
- package/dist/agent/state/index.js.map +1 -0
- package/dist/agent/state/sessionStore.d.ts +126 -0
- package/dist/agent/state/sessionStore.d.ts.map +1 -0
- package/dist/agent/state/sessionStore.js +440 -0
- package/dist/agent/state/sessionStore.js.map +1 -0
- package/dist/agent/state/traceAgentState.d.ts +125 -0
- package/dist/agent/state/traceAgentState.d.ts.map +1 -0
- package/dist/agent/state/traceAgentState.js +173 -0
- package/dist/agent/state/traceAgentState.js.map +1 -0
- package/dist/agent/strategies/helpers.d.ts +44 -0
- package/dist/agent/strategies/helpers.d.ts.map +1 -0
- package/dist/agent/strategies/helpers.js +138 -0
- package/dist/agent/strategies/helpers.js.map +1 -0
- package/dist/agent/strategies/index.d.ts +15 -0
- package/dist/agent/strategies/index.d.ts.map +1 -0
- package/dist/agent/strategies/index.js +23 -0
- package/dist/agent/strategies/index.js.map +1 -0
- package/dist/agent/strategies/interactionStrategy.d.ts +3 -0
- package/dist/agent/strategies/interactionStrategy.d.ts.map +1 -0
- package/dist/agent/strategies/interactionStrategy.js +242 -0
- package/dist/agent/strategies/interactionStrategy.js.map +1 -0
- package/dist/agent/strategies/registry.d.ts +110 -0
- package/dist/agent/strategies/registry.d.ts.map +1 -0
- package/dist/agent/strategies/registry.js +264 -0
- package/dist/agent/strategies/registry.js.map +1 -0
- package/dist/agent/strategies/sceneReconstructionStrategy.d.ts +4 -0
- package/dist/agent/strategies/sceneReconstructionStrategy.d.ts.map +1 -0
- package/dist/agent/strategies/sceneReconstructionStrategy.js +593 -0
- package/dist/agent/strategies/sceneReconstructionStrategy.js.map +1 -0
- package/dist/agent/strategies/scrollingStrategy.d.ts +3 -0
- package/dist/agent/strategies/scrollingStrategy.d.ts.map +1 -0
- package/dist/agent/strategies/scrollingStrategy.js +414 -0
- package/dist/agent/strategies/scrollingStrategy.js.map +1 -0
- package/dist/agent/strategies/startupStrategy.d.ts +3 -0
- package/dist/agent/strategies/startupStrategy.d.ts.map +1 -0
- package/dist/agent/strategies/startupStrategy.js +495 -0
- package/dist/agent/strategies/startupStrategy.js.map +1 -0
- package/dist/agent/strategies/types.d.ts +156 -0
- package/dist/agent/strategies/types.d.ts.map +1 -0
- package/dist/agent/strategies/types.js +6 -0
- package/dist/agent/strategies/types.js.map +1 -0
- package/dist/agent/toolRegistry.d.ts +4 -0
- package/dist/agent/toolRegistry.d.ts.map +1 -0
- package/dist/agent/toolRegistry.js +45 -0
- package/dist/agent/toolRegistry.js.map +1 -0
- package/dist/agent/tools/dataStats.d.ts +23 -0
- package/dist/agent/tools/dataStats.d.ts.map +1 -0
- package/dist/agent/tools/dataStats.js +123 -0
- package/dist/agent/tools/dataStats.js.map +1 -0
- package/dist/agent/tools/frameAnalyzer.d.ts +45 -0
- package/dist/agent/tools/frameAnalyzer.d.ts.map +1 -0
- package/dist/agent/tools/frameAnalyzer.js +338 -0
- package/dist/agent/tools/frameAnalyzer.js.map +1 -0
- package/dist/agent/tools/index.d.ts +6 -0
- package/dist/agent/tools/index.d.ts.map +1 -0
- package/dist/agent/tools/index.js +31 -0
- package/dist/agent/tools/index.js.map +1 -0
- package/dist/agent/tools/skillInvoker.d.ts +50 -0
- package/dist/agent/tools/skillInvoker.d.ts.map +1 -0
- package/dist/agent/tools/skillInvoker.js +279 -0
- package/dist/agent/tools/skillInvoker.js.map +1 -0
- package/dist/agent/tools/sqlExecutor.d.ts +12 -0
- package/dist/agent/tools/sqlExecutor.d.ts.map +1 -0
- package/dist/agent/tools/sqlExecutor.js +193 -0
- package/dist/agent/tools/sqlExecutor.js.map +1 -0
- package/dist/agent/tools/sqlGenerator.d.ts +154 -0
- package/dist/agent/tools/sqlGenerator.d.ts.map +1 -0
- package/dist/agent/tools/sqlGenerator.js +449 -0
- package/dist/agent/tools/sqlGenerator.js.map +1 -0
- package/dist/agent/tools/sqlValidator.d.ts +149 -0
- package/dist/agent/tools/sqlValidator.d.ts.map +1 -0
- package/dist/agent/tools/sqlValidator.js +376 -0
- package/dist/agent/tools/sqlValidator.js.map +1 -0
- package/dist/agent/traceRecorder.d.ts +42 -0
- package/dist/agent/traceRecorder.d.ts.map +1 -0
- package/dist/agent/traceRecorder.js +122 -0
- package/dist/agent/traceRecorder.js.map +1 -0
- package/dist/agent/types/agentProtocol.d.ts +377 -0
- package/dist/agent/types/agentProtocol.d.ts.map +1 -0
- package/dist/agent/types/agentProtocol.js +102 -0
- package/dist/agent/types/agentProtocol.js.map +1 -0
- package/dist/agent/types/jankCause.d.ts +47 -0
- package/dist/agent/types/jankCause.d.ts.map +1 -0
- package/dist/agent/types/jankCause.js +6 -0
- package/dist/agent/types/jankCause.js.map +1 -0
- package/dist/agent/types.d.ts +725 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +63 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agentOpenAI/index.d.ts +4 -0
- package/dist/agentOpenAI/index.d.ts.map +1 -0
- package/dist/agentOpenAI/index.js +17 -0
- package/dist/agentOpenAI/index.js.map +1 -0
- package/dist/agentOpenAI/mimoReasoningCompat.d.ts +9 -0
- package/dist/agentOpenAI/mimoReasoningCompat.d.ts.map +1 -0
- package/dist/agentOpenAI/mimoReasoningCompat.js +367 -0
- package/dist/agentOpenAI/mimoReasoningCompat.js.map +1 -0
- package/dist/agentOpenAI/openAiComplexityClassifier.d.ts +18 -0
- package/dist/agentOpenAI/openAiComplexityClassifier.d.ts.map +1 -0
- package/dist/agentOpenAI/openAiComplexityClassifier.js +102 -0
- package/dist/agentOpenAI/openAiComplexityClassifier.js.map +1 -0
- package/dist/agentOpenAI/openAiConfig.d.ts +38 -0
- package/dist/agentOpenAI/openAiConfig.d.ts.map +1 -0
- package/dist/agentOpenAI/openAiConfig.js +104 -0
- package/dist/agentOpenAI/openAiConfig.js.map +1 -0
- package/dist/agentOpenAI/openAiRuntime.d.ts +99 -0
- package/dist/agentOpenAI/openAiRuntime.d.ts.map +1 -0
- package/dist/agentOpenAI/openAiRuntime.js +1440 -0
- package/dist/agentOpenAI/openAiRuntime.js.map +1 -0
- package/dist/agentOpenAI/openAiToolAdapter.d.ts +9 -0
- package/dist/agentOpenAI/openAiToolAdapter.d.ts.map +1 -0
- package/dist/agentOpenAI/openAiToolAdapter.js +111 -0
- package/dist/agentOpenAI/openAiToolAdapter.js.map +1 -0
- package/dist/agentRuntime/envCredentialSources.d.ts +6 -0
- package/dist/agentRuntime/envCredentialSources.d.ts.map +1 -0
- package/dist/agentRuntime/envCredentialSources.js +104 -0
- package/dist/agentRuntime/envCredentialSources.js.map +1 -0
- package/dist/agentRuntime/index.d.ts +2 -0
- package/dist/agentRuntime/index.d.ts.map +1 -0
- package/dist/agentRuntime/index.js +10 -0
- package/dist/agentRuntime/index.js.map +1 -0
- package/dist/agentRuntime/runtimeHealth.d.ts +65 -0
- package/dist/agentRuntime/runtimeHealth.d.ts.map +1 -0
- package/dist/agentRuntime/runtimeHealth.js +58 -0
- package/dist/agentRuntime/runtimeHealth.js.map +1 -0
- package/dist/agentRuntime/runtimeSelection.d.ts +25 -0
- package/dist/agentRuntime/runtimeSelection.d.ts.map +1 -0
- package/dist/agentRuntime/runtimeSelection.js +66 -0
- package/dist/agentRuntime/runtimeSelection.js.map +1 -0
- package/dist/agentv3/__mocks__/claude-agent-sdk.d.ts +25 -0
- package/dist/agentv3/__mocks__/claude-agent-sdk.d.ts.map +1 -0
- package/dist/agentv3/__mocks__/claude-agent-sdk.js +48 -0
- package/dist/agentv3/__mocks__/claude-agent-sdk.js.map +1 -0
- package/dist/agentv3/activePhaseReminder.d.ts +12 -0
- package/dist/agentv3/activePhaseReminder.d.ts.map +1 -0
- package/dist/agentv3/activePhaseReminder.js +73 -0
- package/dist/agentv3/activePhaseReminder.js.map +1 -0
- package/dist/agentv3/agentMetrics.d.ts +114 -0
- package/dist/agentv3/agentMetrics.d.ts.map +1 -0
- package/dist/agentv3/agentMetrics.js +262 -0
- package/dist/agentv3/agentMetrics.js.map +1 -0
- package/dist/agentv3/analysisPatternMemory.d.ts +146 -0
- package/dist/agentv3/analysisPatternMemory.d.ts.map +1 -0
- package/dist/agentv3/analysisPatternMemory.js +860 -0
- package/dist/agentv3/analysisPatternMemory.js.map +1 -0
- package/dist/agentv3/analysisTermination.d.ts +21 -0
- package/dist/agentv3/analysisTermination.d.ts.map +1 -0
- package/dist/agentv3/analysisTermination.js +97 -0
- package/dist/agentv3/analysisTermination.js.map +1 -0
- package/dist/agentv3/artifactStore.d.ts +131 -0
- package/dist/agentv3/artifactStore.d.ts.map +1 -0
- package/dist/agentv3/artifactStore.js +208 -0
- package/dist/agentv3/artifactStore.js.map +1 -0
- package/dist/agentv3/claudeAgentDefinitions.d.ts +44 -0
- package/dist/agentv3/claudeAgentDefinitions.d.ts.map +1 -0
- package/dist/agentv3/claudeAgentDefinitions.js +209 -0
- package/dist/agentv3/claudeAgentDefinitions.js.map +1 -0
- package/dist/agentv3/claudeConfig.d.ts +156 -0
- package/dist/agentv3/claudeConfig.d.ts.map +1 -0
- package/dist/agentv3/claudeConfig.js +553 -0
- package/dist/agentv3/claudeConfig.js.map +1 -0
- package/dist/agentv3/claudeFindingExtractor.d.ts +15 -0
- package/dist/agentv3/claudeFindingExtractor.d.ts.map +1 -0
- package/dist/agentv3/claudeFindingExtractor.js +150 -0
- package/dist/agentv3/claudeFindingExtractor.js.map +1 -0
- package/dist/agentv3/claudeMcpServer.d.ts +89 -0
- package/dist/agentv3/claudeMcpServer.d.ts.map +1 -0
- package/dist/agentv3/claudeMcpServer.js +3785 -0
- package/dist/agentv3/claudeMcpServer.js.map +1 -0
- package/dist/agentv3/claudeRuntime.d.ts +137 -0
- package/dist/agentv3/claudeRuntime.d.ts.map +1 -0
- package/dist/agentv3/claudeRuntime.js +2541 -0
- package/dist/agentv3/claudeRuntime.js.map +1 -0
- package/dist/agentv3/claudeSseBridge.d.ts +23 -0
- package/dist/agentv3/claudeSseBridge.d.ts.map +1 -0
- package/dist/agentv3/claudeSseBridge.js +385 -0
- package/dist/agentv3/claudeSseBridge.js.map +1 -0
- package/dist/agentv3/claudeSystemPrompt.d.ts +65 -0
- package/dist/agentv3/claudeSystemPrompt.d.ts.map +1 -0
- package/dist/agentv3/claudeSystemPrompt.js +486 -0
- package/dist/agentv3/claudeSystemPrompt.js.map +1 -0
- package/dist/agentv3/claudeVerifier.d.ts +82 -0
- package/dist/agentv3/claudeVerifier.d.ts.map +1 -0
- package/dist/agentv3/claudeVerifier.js +1047 -0
- package/dist/agentv3/claudeVerifier.js.map +1 -0
- package/dist/agentv3/contextTokenMeter.d.ts +78 -0
- package/dist/agentv3/contextTokenMeter.d.ts.map +1 -0
- package/dist/agentv3/contextTokenMeter.js +88 -0
- package/dist/agentv3/contextTokenMeter.js.map +1 -0
- package/dist/agentv3/focusAppDetector.d.ts +22 -0
- package/dist/agentv3/focusAppDetector.d.ts.map +1 -0
- package/dist/agentv3/focusAppDetector.js +208 -0
- package/dist/agentv3/focusAppDetector.js.map +1 -0
- package/dist/agentv3/index.d.ts +6 -0
- package/dist/agentv3/index.d.ts.map +1 -0
- package/dist/agentv3/index.js +16 -0
- package/dist/agentv3/index.js.map +1 -0
- package/dist/agentv3/mcpToolRegistry.d.ts +90 -0
- package/dist/agentv3/mcpToolRegistry.d.ts.map +1 -0
- package/dist/agentv3/mcpToolRegistry.js +152 -0
- package/dist/agentv3/mcpToolRegistry.js.map +1 -0
- package/dist/agentv3/outputLanguage.d.ts +6 -0
- package/dist/agentv3/outputLanguage.d.ts.map +1 -0
- package/dist/agentv3/outputLanguage.js +37 -0
- package/dist/agentv3/outputLanguage.js.map +1 -0
- package/dist/agentv3/phaseHintMatcher.d.ts +36 -0
- package/dist/agentv3/phaseHintMatcher.d.ts.map +1 -0
- package/dist/agentv3/phaseHintMatcher.js +48 -0
- package/dist/agentv3/phaseHintMatcher.js.map +1 -0
- package/dist/agentv3/projectMemory.d.ts +80 -0
- package/dist/agentv3/projectMemory.d.ts.map +1 -0
- package/dist/agentv3/projectMemory.js +334 -0
- package/dist/agentv3/projectMemory.js.map +1 -0
- package/dist/agentv3/queryComplexityClassifier.d.ts +21 -0
- package/dist/agentv3/queryComplexityClassifier.d.ts.map +1 -0
- package/dist/agentv3/queryComplexityClassifier.js +196 -0
- package/dist/agentv3/queryComplexityClassifier.js.map +1 -0
- package/dist/agentv3/rawSqlNormalizer.d.ts +11 -0
- package/dist/agentv3/rawSqlNormalizer.d.ts.map +1 -0
- package/dist/agentv3/rawSqlNormalizer.js +649 -0
- package/dist/agentv3/rawSqlNormalizer.js.map +1 -0
- package/dist/agentv3/recoveryNoteBuilder.d.ts +51 -0
- package/dist/agentv3/recoveryNoteBuilder.d.ts.map +1 -0
- package/dist/agentv3/recoveryNoteBuilder.js +84 -0
- package/dist/agentv3/recoveryNoteBuilder.js.map +1 -0
- package/dist/agentv3/sceneClassifier.d.ts +11 -0
- package/dist/agentv3/sceneClassifier.d.ts.map +1 -0
- package/dist/agentv3/sceneClassifier.js +46 -0
- package/dist/agentv3/sceneClassifier.js.map +1 -0
- package/dist/agentv3/scenePlanTemplates.d.ts +80 -0
- package/dist/agentv3/scenePlanTemplates.d.ts.map +1 -0
- package/dist/agentv3/scenePlanTemplates.js +164 -0
- package/dist/agentv3/scenePlanTemplates.js.map +1 -0
- package/dist/agentv3/selfImprove/contentScanner.d.ts +44 -0
- package/dist/agentv3/selfImprove/contentScanner.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/contentScanner.js +112 -0
- package/dist/agentv3/selfImprove/contentScanner.js.map +1 -0
- package/dist/agentv3/selfImprove/failureTaxonomy.d.ts +38 -0
- package/dist/agentv3/selfImprove/failureTaxonomy.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/failureTaxonomy.js +102 -0
- package/dist/agentv3/selfImprove/failureTaxonomy.js.map +1 -0
- package/dist/agentv3/selfImprove/feedbackEnricher.d.ts +69 -0
- package/dist/agentv3/selfImprove/feedbackEnricher.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/feedbackEnricher.js +135 -0
- package/dist/agentv3/selfImprove/feedbackEnricher.js.map +1 -0
- package/dist/agentv3/selfImprove/feedbackPipeline.d.ts +63 -0
- package/dist/agentv3/selfImprove/feedbackPipeline.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/feedbackPipeline.js +239 -0
- package/dist/agentv3/selfImprove/feedbackPipeline.js.map +1 -0
- package/dist/agentv3/selfImprove/hintFingerprint.d.ts +14 -0
- package/dist/agentv3/selfImprove/hintFingerprint.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/hintFingerprint.js +47 -0
- package/dist/agentv3/selfImprove/hintFingerprint.js.map +1 -0
- package/dist/agentv3/selfImprove/metricsAggregator.d.ts +46 -0
- package/dist/agentv3/selfImprove/metricsAggregator.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/metricsAggregator.js +195 -0
- package/dist/agentv3/selfImprove/metricsAggregator.js.map +1 -0
- package/dist/agentv3/selfImprove/migrateFailureModeHash.d.ts +31 -0
- package/dist/agentv3/selfImprove/migrateFailureModeHash.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/migrateFailureModeHash.js +220 -0
- package/dist/agentv3/selfImprove/migrateFailureModeHash.js.map +1 -0
- package/dist/agentv3/selfImprove/phaseHintsRenderer.d.ts +56 -0
- package/dist/agentv3/selfImprove/phaseHintsRenderer.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/phaseHintsRenderer.js +202 -0
- package/dist/agentv3/selfImprove/phaseHintsRenderer.js.map +1 -0
- package/dist/agentv3/selfImprove/promoteSkillNote.d.ts +17 -0
- package/dist/agentv3/selfImprove/promoteSkillNote.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/promoteSkillNote.js +146 -0
- package/dist/agentv3/selfImprove/promoteSkillNote.js.map +1 -0
- package/dist/agentv3/selfImprove/proposeStrategyPatch.d.ts +40 -0
- package/dist/agentv3/selfImprove/proposeStrategyPatch.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/proposeStrategyPatch.js +115 -0
- package/dist/agentv3/selfImprove/proposeStrategyPatch.js.map +1 -0
- package/dist/agentv3/selfImprove/reviewAgentSdk.d.ts +32 -0
- package/dist/agentv3/selfImprove/reviewAgentSdk.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/reviewAgentSdk.js +173 -0
- package/dist/agentv3/selfImprove/reviewAgentSdk.js.map +1 -0
- package/dist/agentv3/selfImprove/reviewOutbox.d.ts +128 -0
- package/dist/agentv3/selfImprove/reviewOutbox.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/reviewOutbox.js +313 -0
- package/dist/agentv3/selfImprove/reviewOutbox.js.map +1 -0
- package/dist/agentv3/selfImprove/reviewWorker.d.ts +95 -0
- package/dist/agentv3/selfImprove/reviewWorker.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/reviewWorker.js +172 -0
- package/dist/agentv3/selfImprove/reviewWorker.js.map +1 -0
- package/dist/agentv3/selfImprove/skillNotesInjector.d.ts +71 -0
- package/dist/agentv3/selfImprove/skillNotesInjector.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/skillNotesInjector.js +214 -0
- package/dist/agentv3/selfImprove/skillNotesInjector.js.map +1 -0
- package/dist/agentv3/selfImprove/skillNotesWriter.d.ts +89 -0
- package/dist/agentv3/selfImprove/skillNotesWriter.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/skillNotesWriter.js +274 -0
- package/dist/agentv3/selfImprove/skillNotesWriter.js.map +1 -0
- package/dist/agentv3/selfImprove/strategyFingerprint.d.ts +85 -0
- package/dist/agentv3/selfImprove/strategyFingerprint.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/strategyFingerprint.js +189 -0
- package/dist/agentv3/selfImprove/strategyFingerprint.js.map +1 -0
- package/dist/agentv3/selfImprove/strategyPatchApplier.d.ts +15 -0
- package/dist/agentv3/selfImprove/strategyPatchApplier.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/strategyPatchApplier.js +138 -0
- package/dist/agentv3/selfImprove/strategyPatchApplier.js.map +1 -0
- package/dist/agentv3/selfImprove/supersedeStore.d.ts +136 -0
- package/dist/agentv3/selfImprove/supersedeStore.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/supersedeStore.js +386 -0
- package/dist/agentv3/selfImprove/supersedeStore.js.map +1 -0
- package/dist/agentv3/selfImprove/worktreeRunner.d.ts +49 -0
- package/dist/agentv3/selfImprove/worktreeRunner.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/worktreeRunner.js +153 -0
- package/dist/agentv3/selfImprove/worktreeRunner.js.map +1 -0
- package/dist/agentv3/sessionStateSnapshot.d.ts +166 -0
- package/dist/agentv3/sessionStateSnapshot.d.ts.map +1 -0
- package/dist/agentv3/sessionStateSnapshot.js +6 -0
- package/dist/agentv3/sessionStateSnapshot.js.map +1 -0
- package/dist/agentv3/sqlIncludeInjector.d.ts +24 -0
- package/dist/agentv3/sqlIncludeInjector.d.ts.map +1 -0
- package/dist/agentv3/sqlIncludeInjector.js +78 -0
- package/dist/agentv3/sqlIncludeInjector.js.map +1 -0
- package/dist/agentv3/sqlSummarizer.d.ts +38 -0
- package/dist/agentv3/sqlSummarizer.d.ts.map +1 -0
- package/dist/agentv3/sqlSummarizer.js +101 -0
- package/dist/agentv3/sqlSummarizer.js.map +1 -0
- package/dist/agentv3/standaloneMcpServer.d.ts +96 -0
- package/dist/agentv3/standaloneMcpServer.d.ts.map +1 -0
- package/dist/agentv3/standaloneMcpServer.js +244 -0
- package/dist/agentv3/standaloneMcpServer.js.map +1 -0
- package/dist/agentv3/strategyLoader.d.ts +96 -0
- package/dist/agentv3/strategyLoader.d.ts.map +1 -0
- package/dist/agentv3/strategyLoader.js +204 -0
- package/dist/agentv3/strategyLoader.js.map +1 -0
- package/dist/agentv3/toolCallSummary.d.ts +15 -0
- package/dist/agentv3/toolCallSummary.d.ts.map +1 -0
- package/dist/agentv3/toolCallSummary.js +66 -0
- package/dist/agentv3/toolCallSummary.js.map +1 -0
- package/dist/agentv3/toolNarration.d.ts +4 -0
- package/dist/agentv3/toolNarration.d.ts.map +1 -0
- package/dist/agentv3/toolNarration.js +371 -0
- package/dist/agentv3/toolNarration.js.map +1 -0
- package/dist/agentv3/traceCompletenessProber.d.ts +56 -0
- package/dist/agentv3/traceCompletenessProber.d.ts.map +1 -0
- package/dist/agentv3/traceCompletenessProber.js +337 -0
- package/dist/agentv3/traceCompletenessProber.js.map +1 -0
- package/dist/agentv3/types.d.ts +443 -0
- package/dist/agentv3/types.d.ts.map +1 -0
- package/dist/agentv3/types.js +37 -0
- package/dist/agentv3/types.js.map +1 -0
- package/dist/assistant/application/agentAnalyzeSessionService.d.ts +130 -0
- package/dist/assistant/application/agentAnalyzeSessionService.d.ts.map +1 -0
- package/dist/assistant/application/agentAnalyzeSessionService.js +433 -0
- package/dist/assistant/application/agentAnalyzeSessionService.js.map +1 -0
- package/dist/assistant/application/assistantApplicationService.d.ts +39 -0
- package/dist/assistant/application/assistantApplicationService.d.ts.map +1 -0
- package/dist/assistant/application/assistantApplicationService.js +88 -0
- package/dist/assistant/application/assistantApplicationService.js.map +1 -0
- package/dist/assistant/contracts/assistantResultContract.d.ts +41 -0
- package/dist/assistant/contracts/assistantResultContract.d.ts.map +1 -0
- package/dist/assistant/contracts/assistantResultContract.js +145 -0
- package/dist/assistant/contracts/assistantResultContract.js.map +1 -0
- package/dist/assistant/stream/sessionSseReplay.d.ts +10 -0
- package/dist/assistant/stream/sessionSseReplay.d.ts.map +1 -0
- package/dist/assistant/stream/sessionSseReplay.js +42 -0
- package/dist/assistant/stream/sessionSseReplay.js.map +1 -0
- package/dist/assistant/stream/streamProjector.d.ts +53 -0
- package/dist/assistant/stream/streamProjector.d.ts.map +1 -0
- package/dist/assistant/stream/streamProjector.js +150 -0
- package/dist/assistant/stream/streamProjector.js.map +1 -0
- package/dist/cli/commands/coverage.d.ts +12 -0
- package/dist/cli/commands/coverage.d.ts.map +1 -0
- package/dist/cli/commands/coverage.js +106 -0
- package/dist/cli/commands/coverage.js.map +1 -0
- package/dist/cli/commands/list.d.ts +11 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +169 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/smoke.d.ts +11 -0
- package/dist/cli/commands/smoke.d.ts.map +1 -0
- package/dist/cli/commands/smoke.js +215 -0
- package/dist/cli/commands/smoke.js.map +1 -0
- package/dist/cli/commands/test.d.ts +11 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/test.js +183 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +26 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +918 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +29 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli-user/bin.d.ts +3 -0
- package/dist/cli-user/bin.d.ts.map +1 -0
- package/dist/cli-user/bin.js +490 -0
- package/dist/cli-user/bin.js.map +1 -0
- package/dist/cli-user/bootstrap.d.ts +12 -0
- package/dist/cli-user/bootstrap.d.ts.map +1 -0
- package/dist/cli-user/bootstrap.js +165 -0
- package/dist/cli-user/bootstrap.js.map +1 -0
- package/dist/cli-user/commands/analyze.d.ts +12 -0
- package/dist/cli-user/commands/analyze.d.ts.map +1 -0
- package/dist/cli-user/commands/analyze.js +83 -0
- package/dist/cli-user/commands/analyze.js.map +1 -0
- package/dist/cli-user/commands/capture.d.ts +12 -0
- package/dist/cli-user/commands/capture.d.ts.map +1 -0
- package/dist/cli-user/commands/capture.js +155 -0
- package/dist/cli-user/commands/capture.js.map +1 -0
- package/dist/cli-user/commands/compare.d.ts +13 -0
- package/dist/cli-user/commands/compare.d.ts.map +1 -0
- package/dist/cli-user/commands/compare.js +74 -0
- package/dist/cli-user/commands/compare.js.map +1 -0
- package/dist/cli-user/commands/config.d.ts +9 -0
- package/dist/cli-user/commands/config.d.ts.map +1 -0
- package/dist/cli-user/commands/config.js +109 -0
- package/dist/cli-user/commands/config.js.map +1 -0
- package/dist/cli-user/commands/doctor.d.ts +8 -0
- package/dist/cli-user/commands/doctor.d.ts.map +1 -0
- package/dist/cli-user/commands/doctor.js +37 -0
- package/dist/cli-user/commands/doctor.js.map +1 -0
- package/dist/cli-user/commands/list.d.ts +10 -0
- package/dist/cli-user/commands/list.d.ts.map +1 -0
- package/dist/cli-user/commands/list.js +79 -0
- package/dist/cli-user/commands/list.js.map +1 -0
- package/dist/cli-user/commands/provider.d.ts +12 -0
- package/dist/cli-user/commands/provider.d.ts.map +1 -0
- package/dist/cli-user/commands/provider.js +121 -0
- package/dist/cli-user/commands/provider.js.map +1 -0
- package/dist/cli-user/commands/query.d.ts +10 -0
- package/dist/cli-user/commands/query.d.ts.map +1 -0
- package/dist/cli-user/commands/query.js +128 -0
- package/dist/cli-user/commands/query.js.map +1 -0
- package/dist/cli-user/commands/report.d.ts +18 -0
- package/dist/cli-user/commands/report.d.ts.map +1 -0
- package/dist/cli-user/commands/report.js +225 -0
- package/dist/cli-user/commands/report.js.map +1 -0
- package/dist/cli-user/commands/resume.d.ts +12 -0
- package/dist/cli-user/commands/resume.d.ts.map +1 -0
- package/dist/cli-user/commands/resume.js +48 -0
- package/dist/cli-user/commands/resume.js.map +1 -0
- package/dist/cli-user/commands/rm.d.ts +8 -0
- package/dist/cli-user/commands/rm.d.ts.map +1 -0
- package/dist/cli-user/commands/rm.js +91 -0
- package/dist/cli-user/commands/rm.js.map +1 -0
- package/dist/cli-user/commands/show.d.ts +8 -0
- package/dist/cli-user/commands/show.d.ts.map +1 -0
- package/dist/cli-user/commands/show.js +84 -0
- package/dist/cli-user/commands/show.js.map +1 -0
- package/dist/cli-user/commands/skill.d.ts +11 -0
- package/dist/cli-user/commands/skill.d.ts.map +1 -0
- package/dist/cli-user/commands/skill.js +118 -0
- package/dist/cli-user/commands/skill.js.map +1 -0
- package/dist/cli-user/constants.d.ts +10 -0
- package/dist/cli-user/constants.d.ts.map +1 -0
- package/dist/cli-user/constants.js +16 -0
- package/dist/cli-user/constants.js.map +1 -0
- package/dist/cli-user/io/indexJson.d.ts +11 -0
- package/dist/cli-user/io/indexJson.d.ts.map +1 -0
- package/dist/cli-user/io/indexJson.js +79 -0
- package/dist/cli-user/io/indexJson.js.map +1 -0
- package/dist/cli-user/io/openFile.d.ts +8 -0
- package/dist/cli-user/io/openFile.d.ts.map +1 -0
- package/dist/cli-user/io/openFile.js +34 -0
- package/dist/cli-user/io/openFile.js.map +1 -0
- package/dist/cli-user/io/paths.d.ts +33 -0
- package/dist/cli-user/io/paths.d.ts.map +1 -0
- package/dist/cli-user/io/paths.js +149 -0
- package/dist/cli-user/io/paths.js.map +1 -0
- package/dist/cli-user/io/sessionStore.d.ts +17 -0
- package/dist/cli-user/io/sessionStore.d.ts.map +1 -0
- package/dist/cli-user/io/sessionStore.js +101 -0
- package/dist/cli-user/io/sessionStore.js.map +1 -0
- package/dist/cli-user/io/stdio.d.ts +8 -0
- package/dist/cli-user/io/stdio.d.ts.map +1 -0
- package/dist/cli-user/io/stdio.js +25 -0
- package/dist/cli-user/io/stdio.js.map +1 -0
- package/dist/cli-user/io/transcriptWriter.d.ts +5 -0
- package/dist/cli-user/io/transcriptWriter.d.ts.map +1 -0
- package/dist/cli-user/io/transcriptWriter.js +60 -0
- package/dist/cli-user/io/transcriptWriter.js.map +1 -0
- package/dist/cli-user/repl/index.d.ts +14 -0
- package/dist/cli-user/repl/index.d.ts.map +1 -0
- package/dist/cli-user/repl/index.js +301 -0
- package/dist/cli-user/repl/index.js.map +1 -0
- package/dist/cli-user/repl/renderer.d.ts +43 -0
- package/dist/cli-user/repl/renderer.d.ts.map +1 -0
- package/dist/cli-user/repl/renderer.js +210 -0
- package/dist/cli-user/repl/renderer.js.map +1 -0
- package/dist/cli-user/repl/slashCommands.d.ts +49 -0
- package/dist/cli-user/repl/slashCommands.d.ts.map +1 -0
- package/dist/cli-user/repl/slashCommands.js +65 -0
- package/dist/cli-user/repl/slashCommands.js.map +1 -0
- package/dist/cli-user/services/cliAnalyzeService.d.ts +73 -0
- package/dist/cli-user/services/cliAnalyzeService.d.ts.map +1 -0
- package/dist/cli-user/services/cliAnalyzeService.js +393 -0
- package/dist/cli-user/services/cliAnalyzeService.js.map +1 -0
- package/dist/cli-user/services/runtimeGuard.d.ts +46 -0
- package/dist/cli-user/services/runtimeGuard.d.ts.map +1 -0
- package/dist/cli-user/services/runtimeGuard.js +188 -0
- package/dist/cli-user/services/runtimeGuard.js.map +1 -0
- package/dist/cli-user/services/traceProcessorInstaller.d.ts +2 -0
- package/dist/cli-user/services/traceProcessorInstaller.d.ts.map +1 -0
- package/dist/cli-user/services/traceProcessorInstaller.js +241 -0
- package/dist/cli-user/services/traceProcessorInstaller.js.map +1 -0
- package/dist/cli-user/services/turnPersistence.d.ts +41 -0
- package/dist/cli-user/services/turnPersistence.d.ts.map +1 -0
- package/dist/cli-user/services/turnPersistence.js +55 -0
- package/dist/cli-user/services/turnPersistence.js.map +1 -0
- package/dist/cli-user/services/turnRunner.d.ts +49 -0
- package/dist/cli-user/services/turnRunner.d.ts.map +1 -0
- package/dist/cli-user/services/turnRunner.js +436 -0
- package/dist/cli-user/services/turnRunner.js.map +1 -0
- package/dist/cli-user/types.d.ts +62 -0
- package/dist/cli-user/types.d.ts.map +1 -0
- package/dist/cli-user/types.js +6 -0
- package/dist/cli-user/types.js.map +1 -0
- package/dist/config/index.d.ts +393 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +334 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/prompts.d.ts +20 -0
- package/dist/config/prompts.d.ts.map +1 -0
- package/dist/config/prompts.js +74 -0
- package/dist/config/prompts.js.map +1 -0
- package/dist/config/teaching.config.d.ts +253 -0
- package/dist/config/teaching.config.d.ts.map +1 -0
- package/dist/config/teaching.config.js +203 -0
- package/dist/config/teaching.config.js.map +1 -0
- package/dist/config/thresholds.d.ts +300 -0
- package/dist/config/thresholds.d.ts.map +1 -0
- package/dist/config/thresholds.js +338 -0
- package/dist/config/thresholds.js.map +1 -0
- package/dist/controllers/skillAdminController.d.ts +62 -0
- package/dist/controllers/skillAdminController.d.ts.map +1 -0
- package/dist/controllers/skillAdminController.js +482 -0
- package/dist/controllers/skillAdminController.js.map +1 -0
- package/dist/controllers/skillController.d.ts +49 -0
- package/dist/controllers/skillController.d.ts.map +1 -0
- package/dist/controllers/skillController.js +246 -0
- package/dist/controllers/skillController.js.map +1 -0
- package/dist/controllers/sqlController.d.ts +9 -0
- package/dist/controllers/sqlController.d.ts.map +1 -0
- package/dist/controllers/sqlController.js +125 -0
- package/dist/controllers/sqlController.js.map +1 -0
- package/dist/controllers/traceController.d.ts +13 -0
- package/dist/controllers/traceController.d.ts.map +1 -0
- package/dist/controllers/traceController.js +209 -0
- package/dist/controllers/traceController.js.map +1 -0
- package/dist/controllers/traceProcessorController.d.ts +14 -0
- package/dist/controllers/traceProcessorController.d.ts.map +1 -0
- package/dist/controllers/traceProcessorController.js +222 -0
- package/dist/controllers/traceProcessorController.js.map +1 -0
- package/dist/data/perfettoSchema.d.ts +9 -0
- package/dist/data/perfettoSchema.d.ts.map +1 -0
- package/dist/data/perfettoSchema.js +286 -0
- package/dist/data/perfettoSchema.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +251 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +37 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +307 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/legacyAgentApi.d.ts +8 -0
- package/dist/middleware/legacyAgentApi.d.ts.map +1 -0
- package/dist/middleware/legacyAgentApi.js +64 -0
- package/dist/middleware/legacyAgentApi.js.map +1 -0
- package/dist/middleware/workspaceRouteContext.d.ts +4 -0
- package/dist/middleware/workspaceRouteContext.d.ts.map +1 -0
- package/dist/middleware/workspaceRouteContext.js +44 -0
- package/dist/middleware/workspaceRouteContext.js.map +1 -0
- package/dist/models/sessionSchema.d.ts +106 -0
- package/dist/models/sessionSchema.d.ts.map +1 -0
- package/dist/models/sessionSchema.js +6 -0
- package/dist/models/sessionSchema.js.map +1 -0
- package/dist/routes/agentLogsRoutes.d.ts +3 -0
- package/dist/routes/agentLogsRoutes.d.ts.map +1 -0
- package/dist/routes/agentLogsRoutes.js +283 -0
- package/dist/routes/agentLogsRoutes.js.map +1 -0
- package/dist/routes/agentQuickSceneRoutes.d.ts +9 -0
- package/dist/routes/agentQuickSceneRoutes.d.ts.map +1 -0
- package/dist/routes/agentQuickSceneRoutes.js +51 -0
- package/dist/routes/agentQuickSceneRoutes.js.map +1 -0
- package/dist/routes/agentReportRoutes.d.ts +11 -0
- package/dist/routes/agentReportRoutes.d.ts.map +1 -0
- package/dist/routes/agentReportRoutes.js +100 -0
- package/dist/routes/agentReportRoutes.js.map +1 -0
- package/dist/routes/agentResumeRoutes.d.ts +14 -0
- package/dist/routes/agentResumeRoutes.d.ts.map +1 -0
- package/dist/routes/agentResumeRoutes.js +263 -0
- package/dist/routes/agentResumeRoutes.js.map +1 -0
- package/dist/routes/agentRoutes.d.ts +3 -0
- package/dist/routes/agentRoutes.d.ts.map +1 -0
- package/dist/routes/agentRoutes.js +4349 -0
- package/dist/routes/agentRoutes.js.map +1 -0
- package/dist/routes/agentSceneReconstructRoutes.d.ts +68 -0
- package/dist/routes/agentSceneReconstructRoutes.d.ts.map +1 -0
- package/dist/routes/agentSceneReconstructRoutes.js +448 -0
- package/dist/routes/agentSceneReconstructRoutes.js.map +1 -0
- package/dist/routes/agentSessionCatalogRoutes.d.ts +20 -0
- package/dist/routes/agentSessionCatalogRoutes.d.ts.map +1 -0
- package/dist/routes/agentSessionCatalogRoutes.js +90 -0
- package/dist/routes/agentSessionCatalogRoutes.js.map +1 -0
- package/dist/routes/agentTeachingRoutes.d.ts +3 -0
- package/dist/routes/agentTeachingRoutes.d.ts.map +1 -0
- package/dist/routes/agentTeachingRoutes.js +62 -0
- package/dist/routes/agentTeachingRoutes.js.map +1 -0
- package/dist/routes/analysisResultRoutes.d.ts +3 -0
- package/dist/routes/analysisResultRoutes.d.ts.map +1 -0
- package/dist/routes/analysisResultRoutes.js +216 -0
- package/dist/routes/analysisResultRoutes.js.map +1 -0
- package/dist/routes/baselineRoutes.d.ts +29 -0
- package/dist/routes/baselineRoutes.d.ts.map +1 -0
- package/dist/routes/baselineRoutes.js +123 -0
- package/dist/routes/baselineRoutes.js.map +1 -0
- package/dist/routes/caseRoutes.d.ts +29 -0
- package/dist/routes/caseRoutes.d.ts.map +1 -0
- package/dist/routes/caseRoutes.js +194 -0
- package/dist/routes/caseRoutes.js.map +1 -0
- package/dist/routes/ciGateRoutes.d.ts +11 -0
- package/dist/routes/ciGateRoutes.d.ts.map +1 -0
- package/dist/routes/ciGateRoutes.js +363 -0
- package/dist/routes/ciGateRoutes.js.map +1 -0
- package/dist/routes/comparisonRoutes.d.ts +3 -0
- package/dist/routes/comparisonRoutes.d.ts.map +1 -0
- package/dist/routes/comparisonRoutes.js +536 -0
- package/dist/routes/comparisonRoutes.js.map +1 -0
- package/dist/routes/criticalPathRoutes.d.ts +3 -0
- package/dist/routes/criticalPathRoutes.d.ts.map +1 -0
- package/dist/routes/criticalPathRoutes.js +88 -0
- package/dist/routes/criticalPathRoutes.js.map +1 -0
- package/dist/routes/enterpriseApiKeyRoutes.d.ts +9 -0
- package/dist/routes/enterpriseApiKeyRoutes.d.ts.map +1 -0
- package/dist/routes/enterpriseApiKeyRoutes.js +126 -0
- package/dist/routes/enterpriseApiKeyRoutes.js.map +1 -0
- package/dist/routes/enterpriseAuthRoutes.d.ts +18 -0
- package/dist/routes/enterpriseAuthRoutes.d.ts.map +1 -0
- package/dist/routes/enterpriseAuthRoutes.js +160 -0
- package/dist/routes/enterpriseAuthRoutes.js.map +1 -0
- package/dist/routes/enterpriseRuntimeDashboardRoutes.d.ts +6 -0
- package/dist/routes/enterpriseRuntimeDashboardRoutes.d.ts.map +1 -0
- package/dist/routes/enterpriseRuntimeDashboardRoutes.js +32 -0
- package/dist/routes/enterpriseRuntimeDashboardRoutes.js.map +1 -0
- package/dist/routes/enterpriseTenantRoutes.d.ts +4 -0
- package/dist/routes/enterpriseTenantRoutes.d.ts.map +1 -0
- package/dist/routes/enterpriseTenantRoutes.js +313 -0
- package/dist/routes/enterpriseTenantRoutes.js.map +1 -0
- package/dist/routes/exportRoutes.d.ts +3 -0
- package/dist/routes/exportRoutes.d.ts.map +1 -0
- package/dist/routes/exportRoutes.js +196 -0
- package/dist/routes/exportRoutes.js.map +1 -0
- package/dist/routes/flamegraphRoutes.d.ts +3 -0
- package/dist/routes/flamegraphRoutes.d.ts.map +1 -0
- package/dist/routes/flamegraphRoutes.js +99 -0
- package/dist/routes/flamegraphRoutes.js.map +1 -0
- package/dist/routes/memoryRoutes.d.ts +31 -0
- package/dist/routes/memoryRoutes.d.ts.map +1 -0
- package/dist/routes/memoryRoutes.js +150 -0
- package/dist/routes/memoryRoutes.js.map +1 -0
- package/dist/routes/narrativeSanitizer.d.ts +2 -0
- package/dist/routes/narrativeSanitizer.d.ts.map +1 -0
- package/dist/routes/narrativeSanitizer.js +167 -0
- package/dist/routes/narrativeSanitizer.js.map +1 -0
- package/dist/routes/perfettoLocalRoutes.d.ts +3 -0
- package/dist/routes/perfettoLocalRoutes.d.ts.map +1 -0
- package/dist/routes/perfettoLocalRoutes.js +222 -0
- package/dist/routes/perfettoLocalRoutes.js.map +1 -0
- package/dist/routes/perfettoSqlRoutes.d.ts +7 -0
- package/dist/routes/perfettoSqlRoutes.d.ts.map +1 -0
- package/dist/routes/perfettoSqlRoutes.js +738 -0
- package/dist/routes/perfettoSqlRoutes.js.map +1 -0
- package/dist/routes/providerRoutes.d.ts +3 -0
- package/dist/routes/providerRoutes.d.ts.map +1 -0
- package/dist/routes/providerRoutes.js +219 -0
- package/dist/routes/providerRoutes.js.map +1 -0
- package/dist/routes/ragAdminRoutes.d.ts +30 -0
- package/dist/routes/ragAdminRoutes.d.ts.map +1 -0
- package/dist/routes/ragAdminRoutes.js +93 -0
- package/dist/routes/ragAdminRoutes.js.map +1 -0
- package/dist/routes/reportRoutes.d.ts +17 -0
- package/dist/routes/reportRoutes.d.ts.map +1 -0
- package/dist/routes/reportRoutes.js +579 -0
- package/dist/routes/reportRoutes.js.map +1 -0
- package/dist/routes/sessionRoutes.d.ts +3 -0
- package/dist/routes/sessionRoutes.d.ts.map +1 -0
- package/dist/routes/sessionRoutes.js +144 -0
- package/dist/routes/sessionRoutes.js.map +1 -0
- package/dist/routes/simpleTraceRoutes.d.ts +3 -0
- package/dist/routes/simpleTraceRoutes.d.ts.map +1 -0
- package/dist/routes/simpleTraceRoutes.js +1131 -0
- package/dist/routes/simpleTraceRoutes.js.map +1 -0
- package/dist/routes/skillAdminRoutes.d.ts +3 -0
- package/dist/routes/skillAdminRoutes.d.ts.map +1 -0
- package/dist/routes/skillAdminRoutes.js +100 -0
- package/dist/routes/skillAdminRoutes.js.map +1 -0
- package/dist/routes/skillRoutes.d.ts +3 -0
- package/dist/routes/skillRoutes.d.ts.map +1 -0
- package/dist/routes/skillRoutes.js +88 -0
- package/dist/routes/skillRoutes.js.map +1 -0
- package/dist/routes/sql.d.ts +3 -0
- package/dist/routes/sql.d.ts.map +1 -0
- package/dist/routes/sql.js +19 -0
- package/dist/routes/sql.js.map +1 -0
- package/dist/routes/strategyAdminRoutes.d.ts +3 -0
- package/dist/routes/strategyAdminRoutes.d.ts.map +1 -0
- package/dist/routes/strategyAdminRoutes.js +65 -0
- package/dist/routes/strategyAdminRoutes.js.map +1 -0
- package/dist/routes/templateAnalysisRoutes.d.ts +3 -0
- package/dist/routes/templateAnalysisRoutes.d.ts.map +1 -0
- package/dist/routes/templateAnalysisRoutes.js +173 -0
- package/dist/routes/templateAnalysisRoutes.js.map +1 -0
- package/dist/routes/trace.d.ts +3 -0
- package/dist/routes/trace.d.ts.map +1 -0
- package/dist/routes/trace.js +48 -0
- package/dist/routes/trace.js.map +1 -0
- package/dist/routes/traceProcessorProxyRoutes.d.ts +6 -0
- package/dist/routes/traceProcessorProxyRoutes.d.ts.map +1 -0
- package/dist/routes/traceProcessorProxyRoutes.js +607 -0
- package/dist/routes/traceProcessorProxyRoutes.js.map +1 -0
- package/dist/routes/traceProcessorRoutes.d.ts +3 -0
- package/dist/routes/traceProcessorRoutes.d.ts.map +1 -0
- package/dist/routes/traceProcessorRoutes.js +40 -0
- package/dist/routes/traceProcessorRoutes.js.map +1 -0
- package/dist/routes/workspaceWindowRoutes.d.ts +3 -0
- package/dist/routes/workspaceWindowRoutes.d.ts.map +1 -0
- package/dist/routes/workspaceWindowRoutes.js +146 -0
- package/dist/routes/workspaceWindowRoutes.js.map +1 -0
- package/dist/runtimePaths.d.ts +3 -0
- package/dist/runtimePaths.d.ts.map +1 -0
- package/dist/runtimePaths.js +20 -0
- package/dist/runtimePaths.js.map +1 -0
- package/dist/scripts/analyzeComprehensiveTrace.d.ts +2 -0
- package/dist/scripts/analyzeComprehensiveTrace.d.ts.map +1 -0
- package/dist/scripts/analyzeComprehensiveTrace.js +210 -0
- package/dist/scripts/analyzeComprehensiveTrace.js.map +1 -0
- package/dist/scripts/analyzeUserTrace.d.ts +2 -0
- package/dist/scripts/analyzeUserTrace.d.ts.map +1 -0
- package/dist/scripts/analyzeUserTrace.js +170 -0
- package/dist/scripts/analyzeUserTrace.js.map +1 -0
- package/dist/scripts/auditTraceProcessorRssMatrix.d.ts +49 -0
- package/dist/scripts/auditTraceProcessorRssMatrix.d.ts.map +1 -0
- package/dist/scripts/auditTraceProcessorRssMatrix.js +390 -0
- package/dist/scripts/auditTraceProcessorRssMatrix.js.map +1 -0
- package/dist/scripts/benchmarkTraceProcessorRss.d.ts +96 -0
- package/dist/scripts/benchmarkTraceProcessorRss.d.ts.map +1 -0
- package/dist/scripts/benchmarkTraceProcessorRss.js +569 -0
- package/dist/scripts/benchmarkTraceProcessorRss.js.map +1 -0
- package/dist/scripts/captureContextEngineeringBaseline.d.ts +2 -0
- package/dist/scripts/captureContextEngineeringBaseline.d.ts.map +1 -0
- package/dist/scripts/captureContextEngineeringBaseline.js +271 -0
- package/dist/scripts/captureContextEngineeringBaseline.js.map +1 -0
- package/dist/scripts/checkTables.d.ts +2 -0
- package/dist/scripts/checkTables.d.ts.map +1 -0
- package/dist/scripts/checkTables.js +22 -0
- package/dist/scripts/checkTables.js.map +1 -0
- package/dist/scripts/diagnoseJankDetection.d.ts +2 -0
- package/dist/scripts/diagnoseJankDetection.d.ts.map +1 -0
- package/dist/scripts/diagnoseJankDetection.js +314 -0
- package/dist/scripts/diagnoseJankDetection.js.map +1 -0
- package/dist/scripts/diagnoseTrace.d.ts +2 -0
- package/dist/scripts/diagnoseTrace.d.ts.map +1 -0
- package/dist/scripts/diagnoseTrace.js +74 -0
- package/dist/scripts/diagnoseTrace.js.map +1 -0
- package/dist/scripts/enterpriseAcceptanceLoadTest.d.ts +193 -0
- package/dist/scripts/enterpriseAcceptanceLoadTest.d.ts.map +1 -0
- package/dist/scripts/enterpriseAcceptanceLoadTest.js +912 -0
- package/dist/scripts/enterpriseAcceptanceLoadTest.js.map +1 -0
- package/dist/scripts/enterpriseMigrationSnapshot.d.ts +3 -0
- package/dist/scripts/enterpriseMigrationSnapshot.d.ts.map +1 -0
- package/dist/scripts/enterpriseMigrationSnapshot.js +57 -0
- package/dist/scripts/enterpriseMigrationSnapshot.js.map +1 -0
- package/dist/scripts/enterpriseReadinessAudit.d.ts +30 -0
- package/dist/scripts/enterpriseReadinessAudit.d.ts.map +1 -0
- package/dist/scripts/enterpriseReadinessAudit.js +743 -0
- package/dist/scripts/enterpriseReadinessAudit.js.map +1 -0
- package/dist/scripts/enterpriseRssBenchmarkMatrix.d.ts +6 -0
- package/dist/scripts/enterpriseRssBenchmarkMatrix.d.ts.map +1 -0
- package/dist/scripts/enterpriseRssBenchmarkMatrix.js +20 -0
- package/dist/scripts/enterpriseRssBenchmarkMatrix.js.map +1 -0
- package/dist/scripts/enterpriseRuntimeIsolationChecklist.d.ts +22 -0
- package/dist/scripts/enterpriseRuntimeIsolationChecklist.d.ts.map +1 -0
- package/dist/scripts/enterpriseRuntimeIsolationChecklist.js +374 -0
- package/dist/scripts/enterpriseRuntimeIsolationChecklist.js.map +1 -0
- package/dist/scripts/enterpriseSecurityAuditChecklist.d.ts +20 -0
- package/dist/scripts/enterpriseSecurityAuditChecklist.d.ts.map +1 -0
- package/dist/scripts/enterpriseSecurityAuditChecklist.js +113 -0
- package/dist/scripts/enterpriseSecurityAuditChecklist.js.map +1 -0
- package/dist/scripts/probeStdlibSchema.d.ts +2 -0
- package/dist/scripts/probeStdlibSchema.d.ts.map +1 -0
- package/dist/scripts/probeStdlibSchema.js +209 -0
- package/dist/scripts/probeStdlibSchema.js.map +1 -0
- package/dist/scripts/runAgentTest.d.ts +2 -0
- package/dist/scripts/runAgentTest.d.ts.map +1 -0
- package/dist/scripts/runAgentTest.js +149 -0
- package/dist/scripts/runAgentTest.js.map +1 -0
- package/dist/scripts/runScrollingTest.d.ts +2 -0
- package/dist/scripts/runScrollingTest.d.ts.map +1 -0
- package/dist/scripts/runScrollingTest.js +199 -0
- package/dist/scripts/runScrollingTest.js.map +1 -0
- package/dist/scripts/runScrollingTestRealData.d.ts +2 -0
- package/dist/scripts/runScrollingTestRealData.d.ts.map +1 -0
- package/dist/scripts/runScrollingTestRealData.js +121 -0
- package/dist/scripts/runScrollingTestRealData.js.map +1 -0
- package/dist/scripts/testAndroidTrace.d.ts +2 -0
- package/dist/scripts/testAndroidTrace.d.ts.map +1 -0
- package/dist/scripts/testAndroidTrace.js +21 -0
- package/dist/scripts/testAndroidTrace.js.map +1 -0
- package/dist/scripts/testCrossDomainExpert.d.ts +2 -0
- package/dist/scripts/testCrossDomainExpert.d.ts.map +1 -0
- package/dist/scripts/testCrossDomainExpert.js +288 -0
- package/dist/scripts/testCrossDomainExpert.js.map +1 -0
- package/dist/scripts/testCrossDomainIntegration.d.ts +2 -0
- package/dist/scripts/testCrossDomainIntegration.d.ts.map +1 -0
- package/dist/scripts/testCrossDomainIntegration.js +282 -0
- package/dist/scripts/testCrossDomainIntegration.js.map +1 -0
- package/dist/scripts/testDeepLayerFix.d.ts +2 -0
- package/dist/scripts/testDeepLayerFix.d.ts.map +1 -0
- package/dist/scripts/testDeepLayerFix.js +137 -0
- package/dist/scripts/testDeepLayerFix.js.map +1 -0
- package/dist/scripts/testHtmlReportGen.d.ts +2 -0
- package/dist/scripts/testHtmlReportGen.d.ts.map +1 -0
- package/dist/scripts/testHtmlReportGen.js +148 -0
- package/dist/scripts/testHtmlReportGen.js.map +1 -0
- package/dist/scripts/verifyAgentSseScrolling.d.ts +2 -0
- package/dist/scripts/verifyAgentSseScrolling.d.ts.map +1 -0
- package/dist/scripts/verifyAgentSseScrolling.js +558 -0
- package/dist/scripts/verifyAgentSseScrolling.js.map +1 -0
- package/dist/scripts/verifyCriticalPathE2E.d.ts +2 -0
- package/dist/scripts/verifyCriticalPathE2E.d.ts.map +1 -0
- package/dist/scripts/verifyCriticalPathE2E.js +171 -0
- package/dist/scripts/verifyCriticalPathE2E.js.map +1 -0
- package/dist/scripts/verifyEnterpriseMultiTenantWindows.d.ts +24 -0
- package/dist/scripts/verifyEnterpriseMultiTenantWindows.d.ts.map +1 -0
- package/dist/scripts/verifyEnterpriseMultiTenantWindows.js +1363 -0
- package/dist/scripts/verifyEnterpriseMultiTenantWindows.js.map +1 -0
- package/dist/services/adb/adbContextDetector.d.ts +3 -0
- package/dist/services/adb/adbContextDetector.d.ts.map +1 -0
- package/dist/services/adb/adbContextDetector.js +151 -0
- package/dist/services/adb/adbContextDetector.js.map +1 -0
- package/dist/services/adb/adbService.d.ts +28 -0
- package/dist/services/adb/adbService.d.ts.map +1 -0
- package/dist/services/adb/adbService.js +238 -0
- package/dist/services/adb/adbService.js.map +1 -0
- package/dist/services/adb/index.d.ts +5 -0
- package/dist/services/adb/index.d.ts.map +1 -0
- package/dist/services/adb/index.js +24 -0
- package/dist/services/adb/index.js.map +1 -0
- package/dist/services/adb/traceDeviceMatcher.d.ts +12 -0
- package/dist/services/adb/traceDeviceMatcher.d.ts.map +1 -0
- package/dist/services/adb/traceDeviceMatcher.js +149 -0
- package/dist/services/adb/traceDeviceMatcher.js.map +1 -0
- package/dist/services/adb/types.d.ts +69 -0
- package/dist/services/adb/types.d.ts.map +1 -0
- package/dist/services/adb/types.js +6 -0
- package/dist/services/adb/types.js.map +1 -0
- package/dist/services/agentEventStore.d.ts +17 -0
- package/dist/services/agentEventStore.d.ts.map +1 -0
- package/dist/services/agentEventStore.js +139 -0
- package/dist/services/agentEventStore.js.map +1 -0
- package/dist/services/agentReportData.d.ts +42 -0
- package/dist/services/agentReportData.d.ts.map +1 -0
- package/dist/services/agentReportData.js +81 -0
- package/dist/services/agentReportData.js.map +1 -0
- package/dist/services/agentResultNormalizer.d.ts +33 -0
- package/dist/services/agentResultNormalizer.d.ts.map +1 -0
- package/dist/services/agentResultNormalizer.js +92 -0
- package/dist/services/agentResultNormalizer.js.map +1 -0
- package/dist/services/analysisResultSnapshotPipeline.d.ts +24 -0
- package/dist/services/analysisResultSnapshotPipeline.d.ts.map +1 -0
- package/dist/services/analysisResultSnapshotPipeline.js +466 -0
- package/dist/services/analysisResultSnapshotPipeline.js.map +1 -0
- package/dist/services/analysisResultSnapshotStore.d.ts +29 -0
- package/dist/services/analysisResultSnapshotStore.d.ts.map +1 -0
- package/dist/services/analysisResultSnapshotStore.js +457 -0
- package/dist/services/analysisResultSnapshotStore.js.map +1 -0
- package/dist/services/analysisResultWindowStateStore.d.ts +37 -0
- package/dist/services/analysisResultWindowStateStore.d.ts.map +1 -0
- package/dist/services/analysisResultWindowStateStore.js +190 -0
- package/dist/services/analysisResultWindowStateStore.js.map +1 -0
- package/dist/services/analysisRunStore.d.ts +38 -0
- package/dist/services/analysisRunStore.d.ts.map +1 -0
- package/dist/services/analysisRunStore.js +195 -0
- package/dist/services/analysisRunStore.js.map +1 -0
- package/dist/services/analysisTemplates/cpuCoreAnalysis.d.ts +70 -0
- package/dist/services/analysisTemplates/cpuCoreAnalysis.d.ts.map +1 -0
- package/dist/services/analysisTemplates/cpuCoreAnalysis.js +277 -0
- package/dist/services/analysisTemplates/cpuCoreAnalysis.js.map +1 -0
- package/dist/services/analysisTemplates/fourQuadrantAnalysis.d.ts +64 -0
- package/dist/services/analysisTemplates/fourQuadrantAnalysis.d.ts.map +1 -0
- package/dist/services/analysisTemplates/fourQuadrantAnalysis.js +288 -0
- package/dist/services/analysisTemplates/fourQuadrantAnalysis.js.map +1 -0
- package/dist/services/analysisTemplates/frameStatsAnalysis.d.ts +77 -0
- package/dist/services/analysisTemplates/frameStatsAnalysis.d.ts.map +1 -0
- package/dist/services/analysisTemplates/frameStatsAnalysis.js +232 -0
- package/dist/services/analysisTemplates/frameStatsAnalysis.js.map +1 -0
- package/dist/services/analysisTemplates/templateManager.d.ts +70 -0
- package/dist/services/analysisTemplates/templateManager.d.ts.map +1 -0
- package/dist/services/analysisTemplates/templateManager.js +293 -0
- package/dist/services/analysisTemplates/templateManager.js.map +1 -0
- package/dist/services/anonymizer.d.ts +61 -0
- package/dist/services/anonymizer.d.ts.map +1 -0
- package/dist/services/anonymizer.js +232 -0
- package/dist/services/anonymizer.js.map +1 -0
- package/dist/services/aospKnowledgeIngester.d.ts +67 -0
- package/dist/services/aospKnowledgeIngester.d.ts.map +1 -0
- package/dist/services/aospKnowledgeIngester.js +171 -0
- package/dist/services/aospKnowledgeIngester.js.map +1 -0
- package/dist/services/artifactCompression.d.ts +52 -0
- package/dist/services/artifactCompression.d.ts.map +1 -0
- package/dist/services/artifactCompression.js +215 -0
- package/dist/services/artifactCompression.js.map +1 -0
- package/dist/services/baselineDiffer.d.ts +85 -0
- package/dist/services/baselineDiffer.d.ts.map +1 -0
- package/dist/services/baselineDiffer.js +287 -0
- package/dist/services/baselineDiffer.js.map +1 -0
- package/dist/services/baselineStore.d.ts +52 -0
- package/dist/services/baselineStore.d.ts.map +1 -0
- package/dist/services/baselineStore.js +224 -0
- package/dist/services/baselineStore.js.map +1 -0
- package/dist/services/binderRootCauseChain.d.ts +38 -0
- package/dist/services/binderRootCauseChain.d.ts.map +1 -0
- package/dist/services/binderRootCauseChain.js +74 -0
- package/dist/services/binderRootCauseChain.js.map +1 -0
- package/dist/services/blogKnowledgeIngester.d.ts +89 -0
- package/dist/services/blogKnowledgeIngester.d.ts.map +1 -0
- package/dist/services/blogKnowledgeIngester.js +192 -0
- package/dist/services/blogKnowledgeIngester.js.map +1 -0
- package/dist/services/caseGraph.d.ts +55 -0
- package/dist/services/caseGraph.d.ts.map +1 -0
- package/dist/services/caseGraph.js +260 -0
- package/dist/services/caseGraph.js.map +1 -0
- package/dist/services/caseLibrary.d.ts +61 -0
- package/dist/services/caseLibrary.d.ts.map +1 -0
- package/dist/services/caseLibrary.js +269 -0
- package/dist/services/caseLibrary.js.map +1 -0
- package/dist/services/ciGateRunStore.d.ts +39 -0
- package/dist/services/ciGateRunStore.d.ts.map +1 -0
- package/dist/services/ciGateRunStore.js +208 -0
- package/dist/services/ciGateRunStore.js.map +1 -0
- package/dist/services/comparisonAiConclusionService.d.ts +23 -0
- package/dist/services/comparisonAiConclusionService.d.ts.map +1 -0
- package/dist/services/comparisonAiConclusionService.js +207 -0
- package/dist/services/comparisonAiConclusionService.js.map +1 -0
- package/dist/services/comparisonAppendixService.d.ts +50 -0
- package/dist/services/comparisonAppendixService.d.ts.map +1 -0
- package/dist/services/comparisonAppendixService.js +276 -0
- package/dist/services/comparisonAppendixService.js.map +1 -0
- package/dist/services/comparisonHtmlReportService.d.ts +20 -0
- package/dist/services/comparisonHtmlReportService.d.ts.map +1 -0
- package/dist/services/comparisonHtmlReportService.js +214 -0
- package/dist/services/comparisonHtmlReportService.js.map +1 -0
- package/dist/services/comparisonMatrixService.d.ts +7 -0
- package/dist/services/comparisonMatrixService.d.ts.map +1 -0
- package/dist/services/comparisonMatrixService.js +211 -0
- package/dist/services/comparisonMatrixService.js.map +1 -0
- package/dist/services/comparisonResultService.d.ts +13 -0
- package/dist/services/comparisonResultService.d.ts.map +1 -0
- package/dist/services/comparisonResultService.js +99 -0
- package/dist/services/comparisonResultService.js.map +1 -0
- package/dist/services/comparisonSignificance.d.ts +3 -0
- package/dist/services/comparisonSignificance.d.ts.map +1 -0
- package/dist/services/comparisonSignificance.js +42 -0
- package/dist/services/comparisonSignificance.js.map +1 -0
- package/dist/services/cpuThermalPmu.d.ts +38 -0
- package/dist/services/cpuThermalPmu.d.ts.map +1 -0
- package/dist/services/cpuThermalPmu.js +141 -0
- package/dist/services/cpuThermalPmu.js.map +1 -0
- package/dist/services/criticalPathAiSummary.d.ts +29 -0
- package/dist/services/criticalPathAiSummary.d.ts.map +1 -0
- package/dist/services/criticalPathAiSummary.js +310 -0
- package/dist/services/criticalPathAiSummary.js.map +1 -0
- package/dist/services/criticalPathAnalyzer.d.ts +108 -0
- package/dist/services/criticalPathAnalyzer.d.ts.map +1 -0
- package/dist/services/criticalPathAnalyzer.js +880 -0
- package/dist/services/criticalPathAnalyzer.js.map +1 -0
- package/dist/services/criticalPathQuantify.d.ts +70 -0
- package/dist/services/criticalPathQuantify.d.ts.map +1 -0
- package/dist/services/criticalPathQuantify.js +214 -0
- package/dist/services/criticalPathQuantify.js.map +1 -0
- package/dist/services/criticalPathSemantics.d.ts +95 -0
- package/dist/services/criticalPathSemantics.d.ts.map +1 -0
- package/dist/services/criticalPathSemantics.js +453 -0
- package/dist/services/criticalPathSemantics.js.map +1 -0
- package/dist/services/criticalPathWakerChain.d.ts +38 -0
- package/dist/services/criticalPathWakerChain.d.ts.map +1 -0
- package/dist/services/criticalPathWakerChain.js +144 -0
- package/dist/services/criticalPathWakerChain.js.map +1 -0
- package/dist/services/domainSkillEvalHarness.d.ts +51 -0
- package/dist/services/domainSkillEvalHarness.d.ts.map +1 -0
- package/dist/services/domainSkillEvalHarness.js +141 -0
- package/dist/services/domainSkillEvalHarness.js.map +1 -0
- package/dist/services/enhancedAIService.d.ts +81 -0
- package/dist/services/enhancedAIService.d.ts.map +1 -0
- package/dist/services/enhancedAIService.js +277 -0
- package/dist/services/enhancedAIService.js.map +1 -0
- package/dist/services/enterpriseAdminControlPlaneService.d.ts +124 -0
- package/dist/services/enterpriseAdminControlPlaneService.d.ts.map +1 -0
- package/dist/services/enterpriseAdminControlPlaneService.js +323 -0
- package/dist/services/enterpriseAdminControlPlaneService.js.map +1 -0
- package/dist/services/enterpriseApiKeyService.d.ts +56 -0
- package/dist/services/enterpriseApiKeyService.d.ts.map +1 -0
- package/dist/services/enterpriseApiKeyService.js +260 -0
- package/dist/services/enterpriseApiKeyService.js.map +1 -0
- package/dist/services/enterpriseAuditService.d.ts +30 -0
- package/dist/services/enterpriseAuditService.d.ts.map +1 -0
- package/dist/services/enterpriseAuditService.js +73 -0
- package/dist/services/enterpriseAuditService.js.map +1 -0
- package/dist/services/enterpriseDb.d.ts +5 -0
- package/dist/services/enterpriseDb.d.ts.map +1 -0
- package/dist/services/enterpriseDb.js +33 -0
- package/dist/services/enterpriseDb.js.map +1 -0
- package/dist/services/enterpriseMigration.d.ts +89 -0
- package/dist/services/enterpriseMigration.d.ts.map +1 -0
- package/dist/services/enterpriseMigration.js +506 -0
- package/dist/services/enterpriseMigration.js.map +1 -0
- package/dist/services/enterpriseOidcClient.d.ts +36 -0
- package/dist/services/enterpriseOidcClient.d.ts.map +1 -0
- package/dist/services/enterpriseOidcClient.js +124 -0
- package/dist/services/enterpriseOidcClient.js.map +1 -0
- package/dist/services/enterpriseQuotaPolicyService.d.ts +37 -0
- package/dist/services/enterpriseQuotaPolicyService.d.ts.map +1 -0
- package/dist/services/enterpriseQuotaPolicyService.js +198 -0
- package/dist/services/enterpriseQuotaPolicyService.js.map +1 -0
- package/dist/services/enterpriseRepository.d.ts +36 -0
- package/dist/services/enterpriseRepository.d.ts.map +1 -0
- package/dist/services/enterpriseRepository.js +208 -0
- package/dist/services/enterpriseRepository.js.map +1 -0
- package/dist/services/enterpriseRuntimeDashboardService.d.ts +114 -0
- package/dist/services/enterpriseRuntimeDashboardService.d.ts.map +1 -0
- package/dist/services/enterpriseRuntimeDashboardService.js +205 -0
- package/dist/services/enterpriseRuntimeDashboardService.js.map +1 -0
- package/dist/services/enterpriseSchema.d.ts +7 -0
- package/dist/services/enterpriseSchema.d.ts.map +1 -0
- package/dist/services/enterpriseSchema.js +688 -0
- package/dist/services/enterpriseSchema.js.map +1 -0
- package/dist/services/enterpriseSsoService.d.ts +99 -0
- package/dist/services/enterpriseSsoService.d.ts.map +1 -0
- package/dist/services/enterpriseSsoService.js +538 -0
- package/dist/services/enterpriseSsoService.js.map +1 -0
- package/dist/services/enterpriseTenantExportService.d.ts +58 -0
- package/dist/services/enterpriseTenantExportService.d.ts.map +1 -0
- package/dist/services/enterpriseTenantExportService.js +339 -0
- package/dist/services/enterpriseTenantExportService.js.map +1 -0
- package/dist/services/enterpriseTenantLifecycleService.d.ts +52 -0
- package/dist/services/enterpriseTenantLifecycleService.d.ts.map +1 -0
- package/dist/services/enterpriseTenantLifecycleService.js +323 -0
- package/dist/services/enterpriseTenantLifecycleService.js.map +1 -0
- package/dist/services/flamegraphAiSummary.d.ts +4 -0
- package/dist/services/flamegraphAiSummary.d.ts.map +1 -0
- package/dist/services/flamegraphAiSummary.js +172 -0
- package/dist/services/flamegraphAiSummary.js.map +1 -0
- package/dist/services/flamegraphAnalyzer.d.ts +14 -0
- package/dist/services/flamegraphAnalyzer.d.ts.map +1 -0
- package/dist/services/flamegraphAnalyzer.js +607 -0
- package/dist/services/flamegraphAnalyzer.js.map +1 -0
- package/dist/services/flamegraphTypes.d.ts +106 -0
- package/dist/services/flamegraphTypes.d.ts.map +1 -0
- package/dist/services/flamegraphTypes.js +6 -0
- package/dist/services/flamegraphTypes.js.map +1 -0
- package/dist/services/gpuSurfaceFlinger.d.ts +27 -0
- package/dist/services/gpuSurfaceFlinger.d.ts.map +1 -0
- package/dist/services/gpuSurfaceFlinger.js +68 -0
- package/dist/services/gpuSurfaceFlinger.js.map +1 -0
- package/dist/services/htmlReportGenerator.d.ts +425 -0
- package/dist/services/htmlReportGenerator.d.ts.map +1 -0
- package/dist/services/htmlReportGenerator.js +5110 -0
- package/dist/services/htmlReportGenerator.js.map +1 -0
- package/dist/services/ioNetworkWakeup.d.ts +27 -0
- package/dist/services/ioNetworkWakeup.d.ts.map +1 -0
- package/dist/services/ioNetworkWakeup.js +68 -0
- package/dist/services/ioNetworkWakeup.js.map +1 -0
- package/dist/services/jankDecisionTree.d.ts +39 -0
- package/dist/services/jankDecisionTree.d.ts.map +1 -0
- package/dist/services/jankDecisionTree.js +230 -0
- package/dist/services/jankDecisionTree.js.map +1 -0
- package/dist/services/legacyApiTelemetry.d.ts +28 -0
- package/dist/services/legacyApiTelemetry.d.ts.map +1 -0
- package/dist/services/legacyApiTelemetry.js +157 -0
- package/dist/services/legacyApiTelemetry.js.map +1 -0
- package/dist/services/memoryRootCause.d.ts +24 -0
- package/dist/services/memoryRootCause.d.ts.map +1 -0
- package/dist/services/memoryRootCause.js +70 -0
- package/dist/services/memoryRootCause.js.map +1 -0
- package/dist/services/multiTraceComparisonStore.d.ts +28 -0
- package/dist/services/multiTraceComparisonStore.d.ts.map +1 -0
- package/dist/services/multiTraceComparisonStore.js +220 -0
- package/dist/services/multiTraceComparisonStore.js.map +1 -0
- package/dist/services/oemSdkKnowledgeIngester.d.ts +62 -0
- package/dist/services/oemSdkKnowledgeIngester.d.ts.map +1 -0
- package/dist/services/oemSdkKnowledgeIngester.js +154 -0
- package/dist/services/oemSdkKnowledgeIngester.js.map +1 -0
- package/dist/services/perfettoLocalService.d.ts +25 -0
- package/dist/services/perfettoLocalService.d.ts.map +1 -0
- package/dist/services/perfettoLocalService.js +213 -0
- package/dist/services/perfettoLocalService.js.map +1 -0
- package/dist/services/perfettoService.d.ts +39 -0
- package/dist/services/perfettoService.d.ts.map +1 -0
- package/dist/services/perfettoService.js +330 -0
- package/dist/services/perfettoService.js.map +1 -0
- package/dist/services/perfettoSqlDocs.d.ts +94 -0
- package/dist/services/perfettoSqlDocs.d.ts.map +1 -0
- package/dist/services/perfettoSqlDocs.js +222 -0
- package/dist/services/perfettoSqlDocs.js.map +1 -0
- package/dist/services/perfettoSqlSkill.d.ts +263 -0
- package/dist/services/perfettoSqlSkill.d.ts.map +1 -0
- package/dist/services/perfettoSqlSkill.js +3731 -0
- package/dist/services/perfettoSqlSkill.js.map +1 -0
- package/dist/services/perfettoStdlibScanner.d.ts +66 -0
- package/dist/services/perfettoStdlibScanner.d.ts.map +1 -0
- package/dist/services/perfettoStdlibScanner.js +345 -0
- package/dist/services/perfettoStdlibScanner.js.map +1 -0
- package/dist/services/persistAgentSession.d.ts +43 -0
- package/dist/services/persistAgentSession.d.ts.map +1 -0
- package/dist/services/persistAgentSession.js +146 -0
- package/dist/services/persistAgentSession.js.map +1 -0
- package/dist/services/pipelineDocService.d.ts +83 -0
- package/dist/services/pipelineDocService.d.ts.map +1 -0
- package/dist/services/pipelineDocService.js +417 -0
- package/dist/services/pipelineDocService.js.map +1 -0
- package/dist/services/pipelineSkillLoader.d.ts +173 -0
- package/dist/services/pipelineSkillLoader.d.ts.map +1 -0
- package/dist/services/pipelineSkillLoader.js +301 -0
- package/dist/services/pipelineSkillLoader.js.map +1 -0
- package/dist/services/portPool.d.ts +85 -0
- package/dist/services/portPool.d.ts.map +1 -0
- package/dist/services/portPool.js +221 -0
- package/dist/services/portPool.js.map +1 -0
- package/dist/services/processIdentity/identityGate.d.ts +27 -0
- package/dist/services/processIdentity/identityGate.d.ts.map +1 -0
- package/dist/services/processIdentity/identityGate.js +284 -0
- package/dist/services/processIdentity/identityGate.js.map +1 -0
- package/dist/services/processIdentity/types.d.ts +49 -0
- package/dist/services/processIdentity/types.d.ts.map +1 -0
- package/dist/services/processIdentity/types.js +16 -0
- package/dist/services/processIdentity/types.js.map +1 -0
- package/dist/services/processRss.d.ts +10 -0
- package/dist/services/processRss.d.ts.map +1 -0
- package/dist/services/processRss.js +78 -0
- package/dist/services/processRss.js.map +1 -0
- package/dist/services/promptTemplateService.d.ts +68 -0
- package/dist/services/promptTemplateService.d.ts.map +1 -0
- package/dist/services/promptTemplateService.js +196 -0
- package/dist/services/promptTemplateService.js.map +1 -0
- package/dist/services/providerManager/connectionTester.d.ts +3 -0
- package/dist/services/providerManager/connectionTester.d.ts.map +1 -0
- package/dist/services/providerManager/connectionTester.js +479 -0
- package/dist/services/providerManager/connectionTester.js.map +1 -0
- package/dist/services/providerManager/envIsolation.d.ts +3 -0
- package/dist/services/providerManager/envIsolation.d.ts.map +1 -0
- package/dist/services/providerManager/envIsolation.js +31 -0
- package/dist/services/providerManager/envIsolation.js.map +1 -0
- package/dist/services/providerManager/index.d.ts +9 -0
- package/dist/services/providerManager/index.d.ts.map +1 -0
- package/dist/services/providerManager/index.js +40 -0
- package/dist/services/providerManager/index.js.map +1 -0
- package/dist/services/providerManager/localSecretStore.d.ts +32 -0
- package/dist/services/providerManager/localSecretStore.d.ts.map +1 -0
- package/dist/services/providerManager/localSecretStore.js +338 -0
- package/dist/services/providerManager/localSecretStore.js.map +1 -0
- package/dist/services/providerManager/providerService.d.ts +31 -0
- package/dist/services/providerManager/providerService.d.ts.map +1 -0
- package/dist/services/providerManager/providerService.js +460 -0
- package/dist/services/providerManager/providerService.js.map +1 -0
- package/dist/services/providerManager/providerSnapshot.d.ts +30 -0
- package/dist/services/providerManager/providerSnapshot.d.ts.map +1 -0
- package/dist/services/providerManager/providerSnapshot.js +224 -0
- package/dist/services/providerManager/providerSnapshot.js.map +1 -0
- package/dist/services/providerManager/providerStore.d.ts +31 -0
- package/dist/services/providerManager/providerStore.d.ts.map +1 -0
- package/dist/services/providerManager/providerStore.js +553 -0
- package/dist/services/providerManager/providerStore.js.map +1 -0
- package/dist/services/providerManager/templates.d.ts +3 -0
- package/dist/services/providerManager/templates.d.ts.map +1 -0
- package/dist/services/providerManager/templates.js +328 -0
- package/dist/services/providerManager/templates.js.map +1 -0
- package/dist/services/providerManager/types.d.ts +119 -0
- package/dist/services/providerManager/types.d.ts.map +1 -0
- package/dist/services/providerManager/types.js +5 -0
- package/dist/services/providerManager/types.js.map +1 -0
- package/dist/services/ragStore.d.ts +60 -0
- package/dist/services/ragStore.d.ts.map +1 -0
- package/dist/services/ragStore.js +297 -0
- package/dist/services/ragStore.js.map +1 -0
- package/dist/services/rbac.d.ts +19 -0
- package/dist/services/rbac.d.ts.map +1 -0
- package/dist/services/rbac.js +153 -0
- package/dist/services/rbac.js.map +1 -0
- package/dist/services/renderingPipelineDetectionSkillGenerator.d.ts +3 -0
- package/dist/services/renderingPipelineDetectionSkillGenerator.d.ts.map +1 -0
- package/dist/services/renderingPipelineDetectionSkillGenerator.js +1120 -0
- package/dist/services/renderingPipelineDetectionSkillGenerator.js.map +1 -0
- package/dist/services/renderingPipelineTeachingService.d.ts +33 -0
- package/dist/services/renderingPipelineTeachingService.d.ts.map +1 -0
- package/dist/services/renderingPipelineTeachingService.js +1312 -0
- package/dist/services/renderingPipelineTeachingService.js.map +1 -0
- package/dist/services/reportCausalMapAssets.d.ts +3 -0
- package/dist/services/reportCausalMapAssets.d.ts.map +1 -0
- package/dist/services/reportCausalMapAssets.js +898 -0
- package/dist/services/reportCausalMapAssets.js.map +1 -0
- package/dist/services/reportGenerator.d.ts +54 -0
- package/dist/services/reportGenerator.d.ts.map +1 -0
- package/dist/services/reportGenerator.js +241 -0
- package/dist/services/reportGenerator.js.map +1 -0
- package/dist/services/resourceOwnership.d.ts +21 -0
- package/dist/services/resourceOwnership.d.ts.map +1 -0
- package/dist/services/resourceOwnership.js +50 -0
- package/dist/services/resourceOwnership.js.map +1 -0
- package/dist/services/resultExportService.d.ts +66 -0
- package/dist/services/resultExportService.d.ts.map +1 -0
- package/dist/services/resultExportService.js +170 -0
- package/dist/services/resultExportService.js.map +1 -0
- package/dist/services/runtimeSnapshotStore.d.ts +19 -0
- package/dist/services/runtimeSnapshotStore.d.ts.map +1 -0
- package/dist/services/runtimeSnapshotStore.js +222 -0
- package/dist/services/runtimeSnapshotStore.js.map +1 -0
- package/dist/services/sceneReport/sceneReportMemoryCache.d.ts +38 -0
- package/dist/services/sceneReport/sceneReportMemoryCache.d.ts.map +1 -0
- package/dist/services/sceneReport/sceneReportMemoryCache.js +55 -0
- package/dist/services/sceneReport/sceneReportMemoryCache.js.map +1 -0
- package/dist/services/sceneReport/sceneReportStore.d.ts +41 -0
- package/dist/services/sceneReport/sceneReportStore.d.ts.map +1 -0
- package/dist/services/sceneReport/sceneReportStore.js +248 -0
- package/dist/services/sceneReport/sceneReportStore.js.map +1 -0
- package/dist/services/scopedKnowledgeStore.d.ts +45 -0
- package/dist/services/scopedKnowledgeStore.d.ts.map +1 -0
- package/dist/services/scopedKnowledgeStore.js +225 -0
- package/dist/services/scopedKnowledgeStore.js.map +1 -0
- package/dist/services/sessionLogger.d.ts +142 -0
- package/dist/services/sessionLogger.d.ts.map +1 -0
- package/dist/services/sessionLogger.js +566 -0
- package/dist/services/sessionLogger.js.map +1 -0
- package/dist/services/sessionPersistenceService.d.ts +190 -0
- package/dist/services/sessionPersistenceService.d.ts.map +1 -0
- package/dist/services/sessionPersistenceService.js +737 -0
- package/dist/services/sessionPersistenceService.js.map +1 -0
- package/dist/services/skillEngine/answerGenerator.d.ts +102 -0
- package/dist/services/skillEngine/answerGenerator.d.ts.map +1 -0
- package/dist/services/skillEngine/answerGenerator.js +508 -0
- package/dist/services/skillEngine/answerGenerator.js.map +1 -0
- package/dist/services/skillEngine/displayContractValidator.d.ts +26 -0
- package/dist/services/skillEngine/displayContractValidator.d.ts.map +1 -0
- package/dist/services/skillEngine/displayContractValidator.js +232 -0
- package/dist/services/skillEngine/displayContractValidator.js.map +1 -0
- package/dist/services/skillEngine/eventCollector.d.ts +96 -0
- package/dist/services/skillEngine/eventCollector.d.ts.map +1 -0
- package/dist/services/skillEngine/eventCollector.js +226 -0
- package/dist/services/skillEngine/eventCollector.js.map +1 -0
- package/dist/services/skillEngine/expressionUtils.d.ts +25 -0
- package/dist/services/skillEngine/expressionUtils.d.ts.map +1 -0
- package/dist/services/skillEngine/expressionUtils.js +66 -0
- package/dist/services/skillEngine/expressionUtils.js.map +1 -0
- package/dist/services/skillEngine/index.d.ts +25 -0
- package/dist/services/skillEngine/index.d.ts.map +1 -0
- package/dist/services/skillEngine/index.js +98 -0
- package/dist/services/skillEngine/index.js.map +1 -0
- package/dist/services/skillEngine/skillAnalysisAdapter.d.ts +149 -0
- package/dist/services/skillEngine/skillAnalysisAdapter.d.ts.map +1 -0
- package/dist/services/skillEngine/skillAnalysisAdapter.js +752 -0
- package/dist/services/skillEngine/skillAnalysisAdapter.js.map +1 -0
- package/dist/services/skillEngine/skillExecutor.d.ts +371 -0
- package/dist/services/skillEngine/skillExecutor.d.ts.map +1 -0
- package/dist/services/skillEngine/skillExecutor.js +4129 -0
- package/dist/services/skillEngine/skillExecutor.js.map +1 -0
- package/dist/services/skillEngine/skillLoader.d.ts +163 -0
- package/dist/services/skillEngine/skillLoader.d.ts.map +1 -0
- package/dist/services/skillEngine/skillLoader.js +840 -0
- package/dist/services/skillEngine/skillLoader.js.map +1 -0
- package/dist/services/skillEngine/skillValidator.d.ts +53 -0
- package/dist/services/skillEngine/skillValidator.d.ts.map +1 -0
- package/dist/services/skillEngine/skillValidator.js +274 -0
- package/dist/services/skillEngine/skillValidator.js.map +1 -0
- package/dist/services/skillEngine/smartSummaryGenerator.d.ts +70 -0
- package/dist/services/skillEngine/smartSummaryGenerator.d.ts.map +1 -0
- package/dist/services/skillEngine/smartSummaryGenerator.js +324 -0
- package/dist/services/skillEngine/smartSummaryGenerator.js.map +1 -0
- package/dist/services/skillEngine/types.d.ts +584 -0
- package/dist/services/skillEngine/types.d.ts.map +1 -0
- package/dist/services/skillEngine/types.js +6 -0
- package/dist/services/skillEngine/types.js.map +1 -0
- package/dist/services/smartperfettoSqlPackage.d.ts +11 -0
- package/dist/services/smartperfettoSqlPackage.d.ts.map +1 -0
- package/dist/services/smartperfettoSqlPackage.js +168 -0
- package/dist/services/smartperfettoSqlPackage.js.map +1 -0
- package/dist/services/sqlGuardrailAnalyzer.d.ts +24 -0
- package/dist/services/sqlGuardrailAnalyzer.d.ts.map +1 -0
- package/dist/services/sqlGuardrailAnalyzer.js +362 -0
- package/dist/services/sqlGuardrailAnalyzer.js.map +1 -0
- package/dist/services/sqlKnowledgeBase.d.ts +236 -0
- package/dist/services/sqlKnowledgeBase.d.ts.map +1 -0
- package/dist/services/sqlKnowledgeBase.js +1109 -0
- package/dist/services/sqlKnowledgeBase.js.map +1 -0
- package/dist/services/sqlStdlibDependencyAnalyzer.d.ts +26 -0
- package/dist/services/sqlStdlibDependencyAnalyzer.d.ts.map +1 -0
- package/dist/services/sqlStdlibDependencyAnalyzer.js +486 -0
- package/dist/services/sqlStdlibDependencyAnalyzer.js.map +1 -0
- package/dist/services/sqlTemplateEngine.d.ts +134 -0
- package/dist/services/sqlTemplateEngine.d.ts.map +1 -0
- package/dist/services/sqlTemplateEngine.js +430 -0
- package/dist/services/sqlTemplateEngine.js.map +1 -0
- package/dist/services/sqlValidator.d.ts +21 -0
- package/dist/services/sqlValidator.d.ts.map +1 -0
- package/dist/services/sqlValidator.js +175 -0
- package/dist/services/sqlValidator.js.map +1 -0
- package/dist/services/standardMetricBackfillService.d.ts +23 -0
- package/dist/services/standardMetricBackfillService.d.ts.map +1 -0
- package/dist/services/standardMetricBackfillService.js +196 -0
- package/dist/services/standardMetricBackfillService.js.map +1 -0
- package/dist/services/startupAnrMethodGraph.d.ts +20 -0
- package/dist/services/startupAnrMethodGraph.d.ts.map +1 -0
- package/dist/services/startupAnrMethodGraph.js +70 -0
- package/dist/services/startupAnrMethodGraph.js.map +1 -0
- package/dist/services/stdlibSkillCoverage.d.ts +23 -0
- package/dist/services/stdlibSkillCoverage.d.ts.map +1 -0
- package/dist/services/stdlibSkillCoverage.js +289 -0
- package/dist/services/stdlibSkillCoverage.js.map +1 -0
- package/dist/services/threadSchedContext.d.ts +49 -0
- package/dist/services/threadSchedContext.d.ts.map +1 -0
- package/dist/services/threadSchedContext.js +84 -0
- package/dist/services/threadSchedContext.js.map +1 -0
- package/dist/services/timelineBinning.d.ts +44 -0
- package/dist/services/timelineBinning.d.ts.map +1 -0
- package/dist/services/timelineBinning.js +150 -0
- package/dist/services/timelineBinning.js.map +1 -0
- package/dist/services/traceConfigGenerator.d.ts +36 -0
- package/dist/services/traceConfigGenerator.d.ts.map +1 -0
- package/dist/services/traceConfigGenerator.js +110 -0
- package/dist/services/traceConfigGenerator.js.map +1 -0
- package/dist/services/traceFormatDetector.d.ts +39 -0
- package/dist/services/traceFormatDetector.d.ts.map +1 -0
- package/dist/services/traceFormatDetector.js +287 -0
- package/dist/services/traceFormatDetector.js.map +1 -0
- package/dist/services/traceMetadataStore.d.ts +32 -0
- package/dist/services/traceMetadataStore.d.ts.map +1 -0
- package/dist/services/traceMetadataStore.js +375 -0
- package/dist/services/traceMetadataStore.js.map +1 -0
- package/dist/services/traceProcessorConnectionModel.d.ts +32 -0
- package/dist/services/traceProcessorConnectionModel.d.ts.map +1 -0
- package/dist/services/traceProcessorConnectionModel.js +38 -0
- package/dist/services/traceProcessorConnectionModel.js.map +1 -0
- package/dist/services/traceProcessorHttpRpcClient.d.ts +22 -0
- package/dist/services/traceProcessorHttpRpcClient.d.ts.map +1 -0
- package/dist/services/traceProcessorHttpRpcClient.js +89 -0
- package/dist/services/traceProcessorHttpRpcClient.js.map +1 -0
- package/dist/services/traceProcessorLeaseModeDecision.d.ts +52 -0
- package/dist/services/traceProcessorLeaseModeDecision.d.ts.map +1 -0
- package/dist/services/traceProcessorLeaseModeDecision.js +150 -0
- package/dist/services/traceProcessorLeaseModeDecision.js.map +1 -0
- package/dist/services/traceProcessorLeaseStore.d.ts +88 -0
- package/dist/services/traceProcessorLeaseStore.d.ts.map +1 -0
- package/dist/services/traceProcessorLeaseStore.js +463 -0
- package/dist/services/traceProcessorLeaseStore.js.map +1 -0
- package/dist/services/traceProcessorProtobuf.d.ts +56 -0
- package/dist/services/traceProcessorProtobuf.d.ts.map +1 -0
- package/dist/services/traceProcessorProtobuf.js +442 -0
- package/dist/services/traceProcessorProtobuf.js.map +1 -0
- package/dist/services/traceProcessorRamBudget.d.ts +55 -0
- package/dist/services/traceProcessorRamBudget.d.ts.map +1 -0
- package/dist/services/traceProcessorRamBudget.js +140 -0
- package/dist/services/traceProcessorRamBudget.js.map +1 -0
- package/dist/services/traceProcessorService.d.ts +223 -0
- package/dist/services/traceProcessorService.d.ts.map +1 -0
- package/dist/services/traceProcessorService.js +838 -0
- package/dist/services/traceProcessorService.js.map +1 -0
- package/dist/services/traceProcessorSqlWorker.d.ts +49 -0
- package/dist/services/traceProcessorSqlWorker.d.ts.map +1 -0
- package/dist/services/traceProcessorSqlWorker.js +218 -0
- package/dist/services/traceProcessorSqlWorker.js.map +1 -0
- package/dist/services/traceProcessorSqlWorkerThread.d.ts +2 -0
- package/dist/services/traceProcessorSqlWorkerThread.d.ts.map +1 -0
- package/dist/services/traceProcessorSqlWorkerThread.js +35 -0
- package/dist/services/traceProcessorSqlWorkerThread.js.map +1 -0
- package/dist/services/traceSummaryV2.d.ts +47 -0
- package/dist/services/traceSummaryV2.d.ts.map +1 -0
- package/dist/services/traceSummaryV2.js +241 -0
- package/dist/services/traceSummaryV2.js.map +1 -0
- package/dist/services/traceUploadLimit.d.ts +3 -0
- package/dist/services/traceUploadLimit.d.ts.map +1 -0
- package/dist/services/traceUploadLimit.js +24 -0
- package/dist/services/traceUploadLimit.js.map +1 -0
- package/dist/services/workingTraceProcessor.d.ts +226 -0
- package/dist/services/workingTraceProcessor.d.ts.map +1 -0
- package/dist/services/workingTraceProcessor.js +1093 -0
- package/dist/services/workingTraceProcessor.js.map +1 -0
- package/dist/trace-processor-pin.env +39 -0
- package/dist/types/analysis.d.ts +511 -0
- package/dist/types/analysis.d.ts.map +1 -0
- package/dist/types/analysis.js +112 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/ciGateContracts.d.ts +63 -0
- package/dist/types/ciGateContracts.d.ts.map +1 -0
- package/dist/types/ciGateContracts.js +6 -0
- package/dist/types/ciGateContracts.js.map +1 -0
- package/dist/types/dataContract.d.ts +624 -0
- package/dist/types/dataContract.d.ts.map +1 -0
- package/dist/types/dataContract.js +775 -0
- package/dist/types/dataContract.js.map +1 -0
- package/dist/types/index.d.ts +40 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/multiTraceComparison.d.ts +215 -0
- package/dist/types/multiTraceComparison.d.ts.map +1 -0
- package/dist/types/multiTraceComparison.js +33 -0
- package/dist/types/multiTraceComparison.js.map +1 -0
- package/dist/types/perfettoSql.d.ts +596 -0
- package/dist/types/perfettoSql.d.ts.map +1 -0
- package/dist/types/perfettoSql.js +28 -0
- package/dist/types/perfettoSql.js.map +1 -0
- package/dist/types/sparkContracts.d.ts +1642 -0
- package/dist/types/sparkContracts.d.ts.map +1 -0
- package/dist/types/sparkContracts.js +25 -0
- package/dist/types/sparkContracts.js.map +1 -0
- package/dist/types/teaching.types.d.ts +395 -0
- package/dist/types/teaching.types.d.ts.map +1 -0
- package/dist/types/teaching.types.js +300 -0
- package/dist/types/teaching.types.js.map +1 -0
- package/dist/utils/analysisNarrative.d.ts +24 -0
- package/dist/utils/analysisNarrative.d.ts.map +1 -0
- package/dist/utils/analysisNarrative.js +101 -0
- package/dist/utils/analysisNarrative.js.map +1 -0
- package/dist/utils/atomicFileWriter.d.ts +5 -0
- package/dist/utils/atomicFileWriter.d.ts.map +1 -0
- package/dist/utils/atomicFileWriter.js +90 -0
- package/dist/utils/atomicFileWriter.js.map +1 -0
- package/dist/utils/epipeGuard.d.ts +10 -0
- package/dist/utils/epipeGuard.d.ts.map +1 -0
- package/dist/utils/epipeGuard.js +40 -0
- package/dist/utils/epipeGuard.js.map +1 -0
- package/dist/utils/httpValue.d.ts +2 -0
- package/dist/utils/httpValue.d.ts.map +1 -0
- package/dist/utils/httpValue.js +24 -0
- package/dist/utils/httpValue.js.map +1 -0
- package/dist/utils/llmJson.d.ts +33 -0
- package/dist/utils/llmJson.d.ts.map +1 -0
- package/dist/utils/llmJson.js +148 -0
- package/dist/utils/llmJson.js.map +1 -0
- package/dist/utils/llmPrivacy.d.ts +15 -0
- package/dist/utils/llmPrivacy.d.ts.map +1 -0
- package/dist/utils/llmPrivacy.js +126 -0
- package/dist/utils/llmPrivacy.js.map +1 -0
- package/dist/utils/logger.d.ts +24 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +68 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/traceProcessorRowUtils.d.ts +11 -0
- package/dist/utils/traceProcessorRowUtils.d.ts.map +1 -0
- package/dist/utils/traceProcessorRowUtils.js +64 -0
- package/dist/utils/traceProcessorRowUtils.js.map +1 -0
- package/dist/utils/uuid.d.ts +3 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/dist/utils/uuid.js +7 -0
- package/dist/utils/uuid.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +53 -0
- package/dist/version.js.map +1 -0
- package/package.json +128 -0
- package/prebuilts/trace_processor/README.md +20 -0
- package/prebuilts/trace_processor/darwin-arm64/trace_processor_shell +0 -0
- package/prebuilts/trace_processor/linux-x64/trace_processor_shell +0 -0
- package/prebuilts/trace_processor/win32-x64/trace_processor_shell.exe +0 -0
- package/skills/README.md +686 -0
- package/skills/_template/README.md +43 -0
- package/skills/_template/atomic_A_template.skill.yaml +79 -0
- package/skills/_template/atomic_B_template.skill.yaml +61 -0
- package/skills/_template/atomic_S_template.skill.yaml +92 -0
- package/skills/_template/composite_S_template.skill.yaml +198 -0
- package/skills/_template/vendor_override_template.yaml +72 -0
- package/skills/atomic/android_bitmap_memory_per_process.skill.yaml +203 -0
- package/skills/atomic/android_dvfs_counter_stats.skill.yaml +60 -0
- package/skills/atomic/android_gpu_work_period_track.skill.yaml +55 -0
- package/skills/atomic/android_heap_graph_summary.skill.yaml +232 -0
- package/skills/atomic/android_job_scheduler_events.skill.yaml +58 -0
- package/skills/atomic/android_kernel_wakelock_summary.skill.yaml +57 -0
- package/skills/atomic/anr_context_in_range.skill.yaml +99 -0
- package/skills/atomic/anr_main_thread_blocking.skill.yaml +513 -0
- package/skills/atomic/app_frame_production.skill.yaml +147 -0
- package/skills/atomic/app_lifecycle_in_range.skill.yaml +142 -0
- package/skills/atomic/app_process_starts_summary.skill.yaml +75 -0
- package/skills/atomic/battery_charge_timeline.skill.yaml +72 -0
- package/skills/atomic/battery_doze_state_timeline.skill.yaml +83 -0
- package/skills/atomic/binder_blocking_in_range.skill.yaml +99 -0
- package/skills/atomic/binder_in_range.skill.yaml +86 -0
- package/skills/atomic/binder_root_cause.skill.yaml +191 -0
- package/skills/atomic/binder_storm_detection.skill.yaml +394 -0
- package/skills/atomic/blocking_chain_analysis.skill.yaml +316 -0
- package/skills/atomic/buffer_transaction_lifecycle.skill.yaml +256 -0
- package/skills/atomic/cache_miss_impact.skill.yaml +115 -0
- package/skills/atomic/chrome_scroll_jank_frame_timeline.skill.yaml +337 -0
- package/skills/atomic/compose_recomposition_hotspot.skill.yaml +403 -0
- package/skills/atomic/consumer_jank_detection.skill.yaml +556 -0
- package/skills/atomic/cpu_cluster_load_in_range.skill.yaml +138 -0
- package/skills/atomic/cpu_cluster_mapping_view.skill.yaml +47 -0
- package/skills/atomic/cpu_freq_timeline.skill.yaml +143 -0
- package/skills/atomic/cpu_idle_analysis.skill.yaml +101 -0
- package/skills/atomic/cpu_idle_state_residency.skill.yaml +54 -0
- package/skills/atomic/cpu_load_in_range.skill.yaml +145 -0
- package/skills/atomic/cpu_process_utilization_period.skill.yaml +51 -0
- package/skills/atomic/cpu_slice_analysis.skill.yaml +118 -0
- package/skills/atomic/cpu_thread_utilization_period.skill.yaml +68 -0
- package/skills/atomic/cpu_throttling_in_range.skill.yaml +131 -0
- package/skills/atomic/cpu_time_per_frame.skill.yaml +59 -0
- package/skills/atomic/cpu_topology_detection.skill.yaml +233 -0
- package/skills/atomic/cpu_topology_view.skill.yaml +272 -0
- package/skills/atomic/cpu_utilization_per_period.skill.yaml +55 -0
- package/skills/atomic/device_state_snapshot.skill.yaml +171 -0
- package/skills/atomic/device_state_timeline.skill.yaml +308 -0
- package/skills/atomic/fence_wait_decomposition.skill.yaml +314 -0
- package/skills/atomic/fpsgo_analysis.skill.yaml +80 -0
- package/skills/atomic/frame_blocking_calls.skill.yaml +215 -0
- package/skills/atomic/frame_overrun_summary.skill.yaml +68 -0
- package/skills/atomic/frame_pipeline_variance.skill.yaml +124 -0
- package/skills/atomic/frame_production_gap.skill.yaml +337 -0
- package/skills/atomic/frame_ui_time_breakdown.skill.yaml +58 -0
- package/skills/atomic/futex_wait_distribution.skill.yaml +117 -0
- package/skills/atomic/game_fps_analysis.skill.yaml +385 -0
- package/skills/atomic/game_main_loop_jank.skill.yaml +309 -0
- package/skills/atomic/gc_events_in_range.skill.yaml +118 -0
- package/skills/atomic/gl_standalone_swap_jank.skill.yaml +259 -0
- package/skills/atomic/gpu_freq_in_range.skill.yaml +99 -0
- package/skills/atomic/gpu_frequency_analysis.skill.yaml +94 -0
- package/skills/atomic/gpu_metrics.skill.yaml +411 -0
- package/skills/atomic/gpu_power_state_analysis.skill.yaml +117 -0
- package/skills/atomic/gpu_render_in_range.skill.yaml +104 -0
- package/skills/atomic/input_events_in_range.skill.yaml +130 -0
- package/skills/atomic/input_to_frame_latency.skill.yaml +436 -0
- package/skills/atomic/linux_irq_summary.skill.yaml +66 -0
- package/skills/atomic/linux_perf_counter_hotspots.skill.yaml +108 -0
- package/skills/atomic/linux_process_rss_swap_timeline.skill.yaml +96 -0
- package/skills/atomic/linux_runqueue_depth_timeline.skill.yaml +132 -0
- package/skills/atomic/linux_sched_latency_distribution.skill.yaml +130 -0
- package/skills/atomic/lmk_kill_attribution.skill.yaml +72 -0
- package/skills/atomic/lock_contention_in_range.skill.yaml +402 -0
- package/skills/atomic/logcat_analysis.skill.yaml +85 -0
- package/skills/atomic/main_thread_file_io_in_range.skill.yaml +116 -0
- package/skills/atomic/main_thread_sched_latency_in_range.skill.yaml +91 -0
- package/skills/atomic/main_thread_slices_in_range.skill.yaml +129 -0
- package/skills/atomic/main_thread_states_in_range.skill.yaml +105 -0
- package/skills/atomic/mali_gpu_power_state.skill.yaml +54 -0
- package/skills/atomic/media_codec_activity.skill.yaml +236 -0
- package/skills/atomic/memory_growth_detector.skill.yaml +146 -0
- package/skills/atomic/memory_pressure_in_range.skill.yaml +382 -0
- package/skills/atomic/memory_rss_high_watermark.skill.yaml +62 -0
- package/skills/atomic/native_heap_breakdown.skill.yaml +80 -0
- package/skills/atomic/oom_adjuster_score_timeline.skill.yaml +77 -0
- package/skills/atomic/page_fault_in_range.skill.yaml +113 -0
- package/skills/atomic/pipeline_4feature_scoring.skill.yaml +299 -0
- package/skills/atomic/pipeline_key_slices_overlay.skill.yaml +108 -0
- package/skills/atomic/present_fence_timing.skill.yaml +156 -0
- package/skills/atomic/process_identity_resolver.skill.yaml +503 -0
- package/skills/atomic/render_pipeline_latency.skill.yaml +120 -0
- package/skills/atomic/render_thread_slices.skill.yaml +107 -0
- package/skills/atomic/rendering_pipeline_detection.skill.yaml +770 -0
- package/skills/atomic/rn_bridge_to_frame_jank.skill.yaml +209 -0
- package/skills/atomic/rn_fabric_render_jank.skill.yaml +213 -0
- package/skills/atomic/sched_latency_in_range.skill.yaml +94 -0
- package/skills/atomic/scheduling_analysis.skill.yaml +103 -0
- package/skills/atomic/scroll_response_latency.skill.yaml +131 -0
- package/skills/atomic/sf_composition_in_range.skill.yaml +99 -0
- package/skills/atomic/sf_frame_consumption.skill.yaml +133 -0
- package/skills/atomic/sf_layer_count_in_range.skill.yaml +155 -0
- package/skills/atomic/startup_binder_in_range.skill.yaml +106 -0
- package/skills/atomic/startup_binder_pool_analysis.skill.yaml +115 -0
- package/skills/atomic/startup_breakdown_in_range.skill.yaml +115 -0
- package/skills/atomic/startup_class_loading_in_range.skill.yaml +93 -0
- package/skills/atomic/startup_cpu_placement_timeline.skill.yaml +135 -0
- package/skills/atomic/startup_critical_tasks.skill.yaml +247 -0
- package/skills/atomic/startup_events_in_range.skill.yaml +251 -0
- package/skills/atomic/startup_freq_rampup.skill.yaml +110 -0
- package/skills/atomic/startup_gc_in_range.skill.yaml +97 -0
- package/skills/atomic/startup_hot_slice_states.skill.yaml +116 -0
- package/skills/atomic/startup_jit_analysis.skill.yaml +158 -0
- package/skills/atomic/startup_main_thread_binder_blocking_in_range.skill.yaml +114 -0
- package/skills/atomic/startup_main_thread_file_io_in_range.skill.yaml +117 -0
- package/skills/atomic/startup_main_thread_slices_in_range.skill.yaml +138 -0
- package/skills/atomic/startup_main_thread_states_in_range.skill.yaml +100 -0
- package/skills/atomic/startup_main_thread_sync_binder_in_range.skill.yaml +103 -0
- package/skills/atomic/startup_sched_latency_in_range.skill.yaml +93 -0
- package/skills/atomic/startup_slow_reasons.skill.yaml +625 -0
- package/skills/atomic/startup_thread_blocking_graph.skill.yaml +181 -0
- package/skills/atomic/system_load_in_range.skill.yaml +95 -0
- package/skills/atomic/task_migration_in_range.skill.yaml +115 -0
- package/skills/atomic/textureview_producer_frame_timing.skill.yaml +302 -0
- package/skills/atomic/thermal_predictor.skill.yaml +182 -0
- package/skills/atomic/thread_affinity_violation.skill.yaml +139 -0
- package/skills/atomic/touch_to_display_latency.skill.yaml +130 -0
- package/skills/atomic/util_tracking_analysis.skill.yaml +89 -0
- package/skills/atomic/vrr_detection.skill.yaml +301 -0
- package/skills/atomic/vsync_alignment_in_range.skill.yaml +116 -0
- package/skills/atomic/vsync_config.skill.yaml +147 -0
- package/skills/atomic/vsync_period_detection.skill.yaml +178 -0
- package/skills/atomic/vsync_phase_alignment.skill.yaml +255 -0
- package/skills/atomic/wakelock_tracking.skill.yaml +276 -0
- package/skills/atomic/wattson_app_startup_power.skill.yaml +66 -0
- package/skills/atomic/wattson_rails_power_breakdown.skill.yaml +70 -0
- package/skills/atomic/wattson_thread_power_attribution.skill.yaml +74 -0
- package/skills/atomic/webview_v8_analysis.skill.yaml +297 -0
- package/skills/comparison/multi_trace_result_comparison.skill.yaml +60 -0
- package/skills/composite/anr_analysis.skill.yaml +889 -0
- package/skills/composite/anr_detail.skill.yaml +796 -0
- package/skills/composite/battery_drain_attribution.skill.yaml +134 -0
- package/skills/composite/binder_analysis.skill.yaml +742 -0
- package/skills/composite/binder_detail.skill.yaml +388 -0
- package/skills/composite/block_io_analysis.skill.yaml +559 -0
- package/skills/composite/click_response_analysis.skill.yaml +915 -0
- package/skills/composite/click_response_detail.skill.yaml +800 -0
- package/skills/composite/cpu_analysis.skill.yaml +960 -0
- package/skills/composite/dmabuf_analysis.skill.yaml +622 -0
- package/skills/composite/flutter_scrolling_analysis.skill.yaml +443 -0
- package/skills/composite/gc_analysis.skill.yaml +744 -0
- package/skills/composite/global_trace_sanity_check.skill.yaml +716 -0
- package/skills/composite/gpu_analysis.skill.yaml +700 -0
- package/skills/composite/io_pressure.skill.yaml +654 -0
- package/skills/composite/irq_analysis.skill.yaml +696 -0
- package/skills/composite/jank_frame_detail.skill.yaml +2065 -0
- package/skills/composite/lmk_analysis.skill.yaml +626 -0
- package/skills/composite/lock_binder_wait.skill.yaml +95 -0
- package/skills/composite/lock_contention_analysis.skill.yaml +878 -0
- package/skills/composite/memory_analysis.skill.yaml +718 -0
- package/skills/composite/navigation_analysis.skill.yaml +901 -0
- package/skills/composite/network_analysis.skill.yaml +760 -0
- package/skills/composite/power_consumption_overview.skill.yaml +143 -0
- package/skills/composite/scene_reconstruction.skill.yaml +2788 -0
- package/skills/composite/scroll_session_analysis.skill.yaml +496 -0
- package/skills/composite/scrolling_analysis.skill.yaml +3295 -0
- package/skills/composite/startup_analysis.skill.yaml +1172 -0
- package/skills/composite/startup_detail.skill.yaml +1339 -0
- package/skills/composite/state_timeline.skill.yaml +1021 -0
- package/skills/composite/surfaceflinger_analysis.skill.yaml +808 -0
- package/skills/composite/suspend_wakeup_analysis.skill.yaml +698 -0
- package/skills/composite/thermal_throttling.skill.yaml +964 -0
- package/skills/composite/thermal_throttling_chain.skill.yaml +147 -0
- package/skills/composite/webview_drawfunctor_jank_chain.skill.yaml +343 -0
- package/skills/config/conclusion_scene_templates.base.yaml +181 -0
- package/skills/config/conclusion_scene_templates.yaml +17 -0
- package/skills/deep/callstack_analysis.skill.yaml +436 -0
- package/skills/deep/cpu_profiling.skill.yaml +617 -0
- package/skills/docs/scrolling.sop.md +312 -0
- package/skills/docs/startup.sop.md +382 -0
- package/skills/docs/upstream-perfetto-ai-skill-translation.sop.md +50 -0
- package/skills/fragments/target_threads.sql +34 -0
- package/skills/fragments/thread_states_quadrant.sql +26 -0
- package/skills/fragments/vsync_config.sql +32 -0
- package/skills/modules/app/launcher_module.skill.yaml +473 -0
- package/skills/modules/app/systemui_module.skill.yaml +565 -0
- package/skills/modules/app/third_party_module.skill.yaml +275 -0
- package/skills/modules/framework/ams_module.skill.yaml +239 -0
- package/skills/modules/framework/art_module.skill.yaml +266 -0
- package/skills/modules/framework/choreographer_module.skill.yaml +419 -0
- package/skills/modules/framework/input_module.skill.yaml +219 -0
- package/skills/modules/framework/surfaceflinger_module.skill.yaml +343 -0
- package/skills/modules/framework/wms_module.skill.yaml +356 -0
- package/skills/modules/hardware/cpu_module.skill.yaml +300 -0
- package/skills/modules/hardware/gpu_module.skill.yaml +229 -0
- package/skills/modules/hardware/memory_module.skill.yaml +443 -0
- package/skills/modules/hardware/power_module.skill.yaml +377 -0
- package/skills/modules/hardware/thermal_module.skill.yaml +410 -0
- package/skills/modules/kernel/binder_module.skill.yaml +223 -0
- package/skills/modules/kernel/filesystem_module.skill.yaml +423 -0
- package/skills/modules/kernel/lock_contention_module.skill.yaml +424 -0
- package/skills/modules/kernel/scheduler_module.skill.yaml +247 -0
- package/skills/pipelines/_base.skill.yaml +103 -0
- package/skills/pipelines/android_pip_freeform.skill.yaml +224 -0
- package/skills/pipelines/android_view_mixed.skill.yaml +305 -0
- package/skills/pipelines/android_view_multi_window.skill.yaml +271 -0
- package/skills/pipelines/android_view_software.skill.yaml +172 -0
- package/skills/pipelines/android_view_standard_blast.skill.yaml +357 -0
- package/skills/pipelines/android_view_standard_legacy.skill.yaml +233 -0
- package/skills/pipelines/angle_gles_vulkan.skill.yaml +178 -0
- package/skills/pipelines/camera_pipeline.skill.yaml +215 -0
- package/skills/pipelines/chrome_browser_viz.skill.yaml +288 -0
- package/skills/pipelines/compose_standard.skill.yaml +250 -0
- package/skills/pipelines/flutter_surfaceview_impeller.skill.yaml +233 -0
- package/skills/pipelines/flutter_surfaceview_skia.skill.yaml +194 -0
- package/skills/pipelines/flutter_textureview.skill.yaml +219 -0
- package/skills/pipelines/game_engine.skill.yaml +311 -0
- package/skills/pipelines/hardware_buffer_renderer.skill.yaml +205 -0
- package/skills/pipelines/imagereader_pipeline.skill.yaml +237 -0
- package/skills/pipelines/index.yaml +122 -0
- package/skills/pipelines/opengl_es.skill.yaml +185 -0
- package/skills/pipelines/rn_new_arch.skill.yaml +126 -0
- package/skills/pipelines/rn_old_arch.skill.yaml +137 -0
- package/skills/pipelines/rn_skia.skill.yaml +115 -0
- package/skills/pipelines/software_compositing.skill.yaml +203 -0
- package/skills/pipelines/surface_control_api.skill.yaml +208 -0
- package/skills/pipelines/surfaceview_blast.skill.yaml +210 -0
- package/skills/pipelines/textureview_standard.skill.yaml +301 -0
- package/skills/pipelines/variable_refresh_rate.skill.yaml +264 -0
- package/skills/pipelines/video_overlay_hwc.skill.yaml +193 -0
- package/skills/pipelines/vulkan_native.skill.yaml +215 -0
- package/skills/pipelines/webview_gl_functor.skill.yaml +232 -0
- package/skills/pipelines/webview_surface_control.skill.yaml +187 -0
- package/skills/pipelines/webview_surfaceview_wrapper.skill.yaml +196 -0
- package/skills/pipelines/webview_textureview_custom.skill.yaml +201 -0
- package/skills/vendors/honor/startup.override.yaml +117 -0
- package/skills/vendors/mtk/startup.override.yaml +133 -0
- package/skills/vendors/oppo/startup.override.yaml +188 -0
- package/skills/vendors/pixel/startup.override.yaml +163 -0
- package/skills/vendors/qualcomm/startup.override.yaml +175 -0
- package/skills/vendors/samsung/startup.override.yaml +161 -0
- package/skills/vendors/vivo/startup.override.yaml +144 -0
- package/skills/vendors/xiaomi/startup.override.yaml +120 -0
- package/sql/smartperfetto/PACKAGE.json +24 -0
- package/sql/smartperfetto/binder/victim_to_server.sql +36 -0
- package/sql/smartperfetto/scrolling/jank_frames.sql +55 -0
- package/strategies/anr.strategy.md +200 -0
- package/strategies/arch-compose.template.md +10 -0
- package/strategies/arch-flutter.template.md +17 -0
- package/strategies/arch-standard.template.md +31 -0
- package/strategies/arch-webview.template.md +9 -0
- package/strategies/comparison-conclusion.template.md +36 -0
- package/strategies/comparison-methodology.template.md +41 -0
- package/strategies/comparison-result-methodology.template.md +35 -0
- package/strategies/game.strategy.md +121 -0
- package/strategies/general.strategy.md +48 -0
- package/strategies/interaction.strategy.md +149 -0
- package/strategies/knowledge-binder-ipc.template.md +59 -0
- package/strategies/knowledge-cpu-scheduler.template.md +67 -0
- package/strategies/knowledge-data-sources.template.md +738 -0
- package/strategies/knowledge-gc-dynamics.template.md +65 -0
- package/strategies/knowledge-harmonyos-rendering.template.md +54 -0
- package/strategies/knowledge-harmonyos-tools.template.md +73 -0
- package/strategies/knowledge-lock-contention.template.md +61 -0
- package/strategies/knowledge-pipeline-anchors.template.md +136 -0
- package/strategies/knowledge-pipeline-fences.template.md +158 -0
- package/strategies/knowledge-rendering-pipeline.template.md +170 -0
- package/strategies/knowledge-startup-root-causes.template.md +951 -0
- package/strategies/knowledge-thermal-throttling.template.md +53 -0
- package/strategies/linux.strategy.md +86 -0
- package/strategies/media.strategy.md +75 -0
- package/strategies/memory.strategy.md +94 -0
- package/strategies/multi-trace-result-comparison.strategy.md +96 -0
- package/strategies/network.strategy.md +80 -0
- package/strategies/overview.strategy.md +139 -0
- package/strategies/phase_hint_templates/misdiagnosis_vsync_vrr.template.yaml +37 -0
- package/strategies/pipeline.strategy.md +208 -0
- package/strategies/power.strategy.md +165 -0
- package/strategies/prompt-complexity-classifier.template.md +26 -0
- package/strategies/prompt-language-en.template.md +9 -0
- package/strategies/prompt-language-zh.template.md +8 -0
- package/strategies/prompt-methodology.template.md +183 -0
- package/strategies/prompt-output-format.template.md +115 -0
- package/strategies/prompt-quick.template.md +44 -0
- package/strategies/prompt-role.template.md +13 -0
- package/strategies/runtime-correctness.strategy.md +73 -0
- package/strategies/scroll-response.strategy.md +236 -0
- package/strategies/scrolling.strategy.md +467 -0
- package/strategies/selection-area.template.md +46 -0
- package/strategies/selection-slice.template.md +126 -0
- package/strategies/startup.strategy.md +694 -0
- package/strategies/teaching.strategy.md +176 -0
- package/strategies/touch-tracking.strategy.md +213 -0
|
@@ -0,0 +1,3731 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
3
|
+
// Copyright (C) 2024-2026 Gracker (Chris)
|
|
4
|
+
// This file is part of SmartPerfetto. See LICENSE for details.
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PerfettoSqlSkill = void 0;
|
|
7
|
+
const sqlKnowledgeBase_1 = require("./sqlKnowledgeBase");
|
|
8
|
+
const sqlTemplateEngine_1 = require("./sqlTemplateEngine");
|
|
9
|
+
const perfettoSql_1 = require("../types/perfettoSql");
|
|
10
|
+
const CPU_TOPOLOGY_CTE = `
|
|
11
|
+
observed_sched_cpus AS (
|
|
12
|
+
SELECT cpu as cpu_id FROM sched_slice WHERE cpu IS NOT NULL
|
|
13
|
+
UNION
|
|
14
|
+
SELECT cpu as cpu_id
|
|
15
|
+
FROM thread_state
|
|
16
|
+
WHERE cpu IS NOT NULL AND state = 'Running'
|
|
17
|
+
),
|
|
18
|
+
observed_counter_cpus AS (
|
|
19
|
+
SELECT t.cpu as cpu_id
|
|
20
|
+
FROM cpu_counter_track t
|
|
21
|
+
JOIN counter c ON c.track_id = t.id
|
|
22
|
+
WHERE t.name = 'cpufreq'
|
|
23
|
+
AND t.cpu IS NOT NULL
|
|
24
|
+
AND c.value > 0
|
|
25
|
+
GROUP BY t.cpu
|
|
26
|
+
),
|
|
27
|
+
cpu_universe AS (
|
|
28
|
+
SELECT cpu_id, 'sched_observed' as universe_source
|
|
29
|
+
FROM observed_sched_cpus
|
|
30
|
+
UNION
|
|
31
|
+
SELECT cpu_id, 'cpufreq_observed_fallback' as universe_source
|
|
32
|
+
FROM observed_counter_cpus
|
|
33
|
+
WHERE NOT EXISTS (SELECT 1 FROM observed_sched_cpus)
|
|
34
|
+
UNION
|
|
35
|
+
SELECT id as cpu_id, 'cpu_table_fallback_no_observed' as universe_source
|
|
36
|
+
FROM cpu
|
|
37
|
+
WHERE NOT EXISTS (SELECT 1 FROM observed_sched_cpus)
|
|
38
|
+
AND NOT EXISTS (SELECT 1 FROM observed_counter_cpus)
|
|
39
|
+
),
|
|
40
|
+
cpu_capacity AS (
|
|
41
|
+
SELECT
|
|
42
|
+
cu.cpu_id,
|
|
43
|
+
cu.universe_source,
|
|
44
|
+
COALESCE(c.capacity, 0) as capacity
|
|
45
|
+
FROM cpu_universe cu
|
|
46
|
+
LEFT JOIN cpu c ON c.id = cu.cpu_id
|
|
47
|
+
),
|
|
48
|
+
cpu_max_freq AS (
|
|
49
|
+
SELECT t.cpu as cpu_id, MAX(c.value) as max_freq
|
|
50
|
+
FROM counter c
|
|
51
|
+
JOIN cpu_counter_track t ON c.track_id = t.id
|
|
52
|
+
WHERE t.name = 'cpufreq'
|
|
53
|
+
AND t.cpu IN (SELECT cpu_id FROM cpu_universe)
|
|
54
|
+
GROUP BY t.cpu
|
|
55
|
+
),
|
|
56
|
+
selected_scale_source AS (
|
|
57
|
+
SELECT
|
|
58
|
+
CASE
|
|
59
|
+
WHEN (SELECT COUNT(*) FROM cpu_capacity) > 0
|
|
60
|
+
AND (SELECT COUNT(*) FROM cpu_capacity WHERE universe_source = 'cpu_table_fallback_no_observed') = 0
|
|
61
|
+
AND (SELECT COUNT(*) FROM cpu_capacity WHERE capacity > 0) = (SELECT COUNT(*) FROM cpu_capacity)
|
|
62
|
+
THEN 'capacity_scale'
|
|
63
|
+
WHEN (SELECT COUNT(*) FROM cpu_capacity) > 0
|
|
64
|
+
AND (SELECT COUNT(*) FROM cpu_capacity WHERE universe_source = 'cpu_table_fallback_no_observed') = 0
|
|
65
|
+
AND (SELECT COUNT(*) FROM cpu_max_freq WHERE max_freq > 0) = (SELECT COUNT(*) FROM cpu_capacity)
|
|
66
|
+
THEN 'freq_rank'
|
|
67
|
+
ELSE 'observed_no_scale'
|
|
68
|
+
END as source
|
|
69
|
+
),
|
|
70
|
+
raw_cpu_scale AS (
|
|
71
|
+
SELECT
|
|
72
|
+
cc.cpu_id,
|
|
73
|
+
cc.universe_source,
|
|
74
|
+
CASE
|
|
75
|
+
WHEN s.source = 'capacity_scale' THEN cc.capacity
|
|
76
|
+
WHEN s.source = 'freq_rank' THEN cf.max_freq
|
|
77
|
+
ELSE NULL
|
|
78
|
+
END as scale_value
|
|
79
|
+
FROM cpu_capacity cc
|
|
80
|
+
LEFT JOIN cpu_max_freq cf ON cc.cpu_id = cf.cpu_id
|
|
81
|
+
CROSS JOIN selected_scale_source s
|
|
82
|
+
),
|
|
83
|
+
scale_bounds AS (
|
|
84
|
+
SELECT MAX(scale_value) as max_scale
|
|
85
|
+
FROM raw_cpu_scale
|
|
86
|
+
WHERE scale_value > 0
|
|
87
|
+
),
|
|
88
|
+
cpu_scale AS (
|
|
89
|
+
SELECT
|
|
90
|
+
rs.*,
|
|
91
|
+
CASE
|
|
92
|
+
WHEN rs.scale_value > 0 AND (SELECT max_scale FROM scale_bounds) > 0
|
|
93
|
+
THEN CAST(ROUND(rs.scale_value * 20.0 / (SELECT max_scale FROM scale_bounds)) AS INTEGER)
|
|
94
|
+
ELSE NULL
|
|
95
|
+
END as scale_bucket
|
|
96
|
+
FROM raw_cpu_scale rs
|
|
97
|
+
),
|
|
98
|
+
distinct_scales AS (
|
|
99
|
+
SELECT
|
|
100
|
+
scale_bucket,
|
|
101
|
+
avg_scale_value,
|
|
102
|
+
ROW_NUMBER() OVER (ORDER BY scale_bucket ASC) as cluster_rank,
|
|
103
|
+
COUNT(*) OVER () as cluster_count
|
|
104
|
+
FROM (
|
|
105
|
+
SELECT scale_bucket, AVG(scale_value) as avg_scale_value
|
|
106
|
+
FROM cpu_scale
|
|
107
|
+
WHERE scale_bucket IS NOT NULL AND scale_bucket > 0
|
|
108
|
+
GROUP BY scale_bucket
|
|
109
|
+
)
|
|
110
|
+
),
|
|
111
|
+
scale_clusters AS (
|
|
112
|
+
SELECT
|
|
113
|
+
ds.scale_bucket,
|
|
114
|
+
ds.avg_scale_value,
|
|
115
|
+
ds.cluster_rank,
|
|
116
|
+
ds.cluster_count,
|
|
117
|
+
COUNT(cs.cpu_id) as cores_in_cluster
|
|
118
|
+
FROM distinct_scales ds
|
|
119
|
+
JOIN cpu_scale cs ON cs.scale_bucket = ds.scale_bucket
|
|
120
|
+
GROUP BY ds.scale_bucket, ds.avg_scale_value, ds.cluster_rank, ds.cluster_count
|
|
121
|
+
),
|
|
122
|
+
cpu_topology AS (
|
|
123
|
+
SELECT
|
|
124
|
+
cs.cpu_id,
|
|
125
|
+
CASE
|
|
126
|
+
WHEN cs.scale_bucket IS NULL OR cs.scale_bucket <= 0 THEN 'unknown'
|
|
127
|
+
WHEN sc.cluster_count <= 1 THEN 'unknown'
|
|
128
|
+
WHEN sc.cluster_count = 2 AND sc.cluster_rank = sc.cluster_count THEN 'big'
|
|
129
|
+
WHEN sc.cluster_rank = 1 THEN 'little'
|
|
130
|
+
WHEN sc.cluster_rank = sc.cluster_count AND sc.cores_in_cluster = 1 THEN 'prime'
|
|
131
|
+
WHEN sc.cluster_rank = sc.cluster_count THEN 'big'
|
|
132
|
+
WHEN sc.cluster_rank = sc.cluster_count - 1
|
|
133
|
+
AND (SELECT cores_in_cluster FROM scale_clusters WHERE cluster_rank = sc.cluster_count) = 1 THEN 'big'
|
|
134
|
+
ELSE 'medium'
|
|
135
|
+
END as core_type
|
|
136
|
+
FROM cpu_scale cs
|
|
137
|
+
LEFT JOIN scale_clusters sc ON cs.scale_bucket = sc.scale_bucket
|
|
138
|
+
)
|
|
139
|
+
`;
|
|
140
|
+
const SKILL_PATTERNS = [
|
|
141
|
+
{
|
|
142
|
+
skillType: perfettoSql_1.PerfettoSkillType.STARTUP,
|
|
143
|
+
keywords: ['startup', 'launch', '启动', '启动时间', '冷启动', '热启动', '温启动'],
|
|
144
|
+
patterns: [
|
|
145
|
+
/startup|launch/i,
|
|
146
|
+
/启动|启动速度|启动时间/i,
|
|
147
|
+
/cold.*start|warm.*start|hot.*start/i,
|
|
148
|
+
],
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
skillType: perfettoSql_1.PerfettoSkillType.SCROLLING,
|
|
152
|
+
keywords: ['scroll', 'jank', 'fps', 'frame', '滑动', '卡顿', '帧率'],
|
|
153
|
+
patterns: [
|
|
154
|
+
/scroll|jank|fps/i,
|
|
155
|
+
/滑动|卡顿|帧率|掉帧/i,
|
|
156
|
+
/frame.*miss/i,
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
skillType: perfettoSql_1.PerfettoSkillType.NAVIGATION,
|
|
161
|
+
keywords: ['navigation', 'activity', 'switch', '切换', '界面切换', '页面跳转'],
|
|
162
|
+
patterns: [
|
|
163
|
+
/navigation|activity.*switch/i,
|
|
164
|
+
/界面切换|页面跳转|activity.*切换/i,
|
|
165
|
+
],
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
skillType: perfettoSql_1.PerfettoSkillType.CLICK_RESPONSE,
|
|
169
|
+
keywords: ['click', 'tap', 'response', 'latency', '点击', '响应', '点击响应'],
|
|
170
|
+
patterns: [
|
|
171
|
+
/click.*response|input.*latency/i,
|
|
172
|
+
/点击响应|点击延迟|输入响应/i,
|
|
173
|
+
],
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
skillType: perfettoSql_1.PerfettoSkillType.MEMORY,
|
|
177
|
+
keywords: ['memory', 'heap', 'oom', 'leak', 'gc', '内存', '内存泄漏', 'OOM'],
|
|
178
|
+
patterns: [
|
|
179
|
+
/memory|heap|oom|leak|gc/i,
|
|
180
|
+
/内存|内存泄漏|OOM|GC/i,
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
skillType: perfettoSql_1.PerfettoSkillType.CPU,
|
|
185
|
+
keywords: ['cpu', 'utilization', 'core', 'frequency', 'CPU利用率', 'CPU频率'],
|
|
186
|
+
patterns: [
|
|
187
|
+
/cpu.*util|cpu.*freq|core/i,
|
|
188
|
+
/CPU利用率|CPU频率|核心/i,
|
|
189
|
+
],
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
skillType: perfettoSql_1.PerfettoSkillType.SURFACE_FLINGER,
|
|
193
|
+
keywords: ['surfaceflinger', 'sf', 'composition', 'gpu', 'fence'],
|
|
194
|
+
patterns: [
|
|
195
|
+
/surfaceflinger|composition|gpu.*fence/i,
|
|
196
|
+
],
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
skillType: perfettoSql_1.PerfettoSkillType.SYSTEM_SERVER,
|
|
200
|
+
keywords: ['systemserver', 'system.*service', 'anr'],
|
|
201
|
+
patterns: [
|
|
202
|
+
/system.*server|system.*service|anr/i,
|
|
203
|
+
],
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
skillType: perfettoSql_1.PerfettoSkillType.INPUT,
|
|
207
|
+
keywords: ['input', 'touch', 'gesture', '输入', '触摸', '手势'],
|
|
208
|
+
patterns: [
|
|
209
|
+
/input.*latency|touch.*event/i,
|
|
210
|
+
/输入延迟|触摸事件|手势/i,
|
|
211
|
+
],
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
skillType: perfettoSql_1.PerfettoSkillType.BINDER,
|
|
215
|
+
keywords: ['binder', 'ipc', 'transaction', 'binder调用'],
|
|
216
|
+
patterns: [
|
|
217
|
+
/binder|ipc|transaction/i,
|
|
218
|
+
],
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
skillType: perfettoSql_1.PerfettoSkillType.BUFFER_FLOW,
|
|
222
|
+
keywords: ['buffer', 'queue', 'fence', 'bufferqueue', '流转'],
|
|
223
|
+
patterns: [
|
|
224
|
+
/buffer.*queue|buffer.*flow/i,
|
|
225
|
+
],
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
skillType: perfettoSql_1.PerfettoSkillType.SLOW_FUNCTIONS,
|
|
229
|
+
keywords: ['slow', 'function', 'method', 'latency', '耗时', '慢函数', '函数耗时'],
|
|
230
|
+
patterns: [
|
|
231
|
+
/slow.*function|method.*latency/i,
|
|
232
|
+
/慢函数|函数耗时|耗时.*函数/i,
|
|
233
|
+
],
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
skillType: perfettoSql_1.PerfettoSkillType.NETWORK,
|
|
237
|
+
keywords: ['network', 'http', 'request', 'socket', '网络', '请求', 'HTTP'],
|
|
238
|
+
patterns: [
|
|
239
|
+
/network|http.*request|socket/i,
|
|
240
|
+
/网络|网络请求|HTTP/i,
|
|
241
|
+
],
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
skillType: perfettoSql_1.PerfettoSkillType.DATABASE,
|
|
245
|
+
keywords: ['database', 'sqlite', 'room', 'db', '数据库', 'SQL'],
|
|
246
|
+
patterns: [
|
|
247
|
+
/database|sqlite|room.*query|db.*query/i,
|
|
248
|
+
/数据库|sqlite|room/i,
|
|
249
|
+
],
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
skillType: perfettoSql_1.PerfettoSkillType.FILE_IO,
|
|
253
|
+
keywords: ['file', 'io', 'read', 'write', '文件', '读写'],
|
|
254
|
+
patterns: [
|
|
255
|
+
/file.*io|file.*read|file.*write|storage/i,
|
|
256
|
+
/文件|读写|文件读写|磁盘/i,
|
|
257
|
+
],
|
|
258
|
+
},
|
|
259
|
+
];
|
|
260
|
+
// ============================================================================
|
|
261
|
+
// Helper Functions
|
|
262
|
+
// ============================================================================
|
|
263
|
+
/**
|
|
264
|
+
* Convert row arrays to row objects for easier access
|
|
265
|
+
* TraceProcessor returns rows as arrays, this converts them to keyed objects
|
|
266
|
+
*/
|
|
267
|
+
function rowsToObjects(columns, rows) {
|
|
268
|
+
return rows.map(row => {
|
|
269
|
+
const obj = {};
|
|
270
|
+
columns.forEach((col, idx) => {
|
|
271
|
+
obj[col] = row[idx];
|
|
272
|
+
});
|
|
273
|
+
return obj;
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Format a row for summary display (handles both array and object formats)
|
|
278
|
+
*/
|
|
279
|
+
function formatRowForSummary(row, columns, formatSpec) {
|
|
280
|
+
// If row is an array, convert to object first
|
|
281
|
+
let obj;
|
|
282
|
+
if (Array.isArray(row)) {
|
|
283
|
+
obj = {};
|
|
284
|
+
columns.forEach((col, idx) => {
|
|
285
|
+
obj[col] = row[idx];
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
obj = row;
|
|
290
|
+
}
|
|
291
|
+
const name = obj[formatSpec.nameCol] ?? 'unknown';
|
|
292
|
+
const value = obj[formatSpec.valueCol];
|
|
293
|
+
const valueStr = typeof value === 'number' ? value.toFixed(2) : String(value ?? 'N/A');
|
|
294
|
+
const extra = formatSpec.extraCol ? ` (${obj[formatSpec.extraCol] ?? ''})` : '';
|
|
295
|
+
return `- ${name}: ${valueStr}ms${extra}`;
|
|
296
|
+
}
|
|
297
|
+
// ============================================================================
|
|
298
|
+
// Main Perfetto SQL Skill Service
|
|
299
|
+
// ============================================================================
|
|
300
|
+
class PerfettoSqlSkill {
|
|
301
|
+
constructor(traceProcessor, knowledgeBase) {
|
|
302
|
+
this.enhancedEngine = null;
|
|
303
|
+
this.enhancedEngineInitializing = null;
|
|
304
|
+
this.traceProcessor = traceProcessor;
|
|
305
|
+
this.knowledgeBase = knowledgeBase || (0, sqlKnowledgeBase_1.createKnowledgeBase)();
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Get the enhanced SQL template engine (lazy initialization)
|
|
309
|
+
* Provides access to 527 official Perfetto SQL templates
|
|
310
|
+
*/
|
|
311
|
+
async getEnhancedEngine() {
|
|
312
|
+
if (this.enhancedEngine) {
|
|
313
|
+
return this.enhancedEngine;
|
|
314
|
+
}
|
|
315
|
+
// Prevent multiple concurrent initializations
|
|
316
|
+
if (!this.enhancedEngineInitializing) {
|
|
317
|
+
this.enhancedEngineInitializing = (0, sqlTemplateEngine_1.getEnhancedSQLTemplateEngine)().then(engine => {
|
|
318
|
+
this.enhancedEngine = engine;
|
|
319
|
+
return engine;
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
return this.enhancedEngineInitializing;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Get AI context enriched with official Perfetto SQL patterns
|
|
326
|
+
* This provides the AI with relevant official templates for generating SQL
|
|
327
|
+
*/
|
|
328
|
+
async getEnrichedAIContext(question) {
|
|
329
|
+
try {
|
|
330
|
+
const engine = await this.getEnhancedEngine();
|
|
331
|
+
return await engine.getAIContext(question);
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
console.error('[PerfettoSqlSkill] Failed to get enriched AI context:', error);
|
|
335
|
+
return '';
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Get recommended SQL queries for a given category
|
|
340
|
+
*/
|
|
341
|
+
async getRecommendedSQLForCategory(category) {
|
|
342
|
+
try {
|
|
343
|
+
const engine = await this.getEnhancedEngine();
|
|
344
|
+
return await engine.getRecommendedSQL(category);
|
|
345
|
+
}
|
|
346
|
+
catch (error) {
|
|
347
|
+
console.error('[PerfettoSqlSkill] Failed to get recommended SQL:', error);
|
|
348
|
+
return [];
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Get matching official templates for a user query
|
|
353
|
+
*/
|
|
354
|
+
async findOfficialTemplates(query) {
|
|
355
|
+
try {
|
|
356
|
+
const engine = await this.getEnhancedEngine();
|
|
357
|
+
return await engine.smartMatchWithOfficial(query);
|
|
358
|
+
}
|
|
359
|
+
catch (error) {
|
|
360
|
+
console.error('[PerfettoSqlSkill] Failed to find official templates:', error);
|
|
361
|
+
return { builtinTemplate: null, officialTemplates: [], recommendedSQL: [] };
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
// ========================================================================
|
|
365
|
+
// Main Entry Point
|
|
366
|
+
// ========================================================================
|
|
367
|
+
/**
|
|
368
|
+
* Analyze a trace based on a natural language question
|
|
369
|
+
*/
|
|
370
|
+
async analyze(request) {
|
|
371
|
+
const { traceId, question, packageName, timeRange } = request;
|
|
372
|
+
// Check if trace exists (for WASM traces, it won't exist in backend)
|
|
373
|
+
const trace = this.traceProcessor.getTrace(traceId);
|
|
374
|
+
const isWasmTrace = !trace;
|
|
375
|
+
if (isWasmTrace) {
|
|
376
|
+
// For WASM traces (Perfetto UI browser engine), generate SQL-only response
|
|
377
|
+
// The UI will execute the SQL locally
|
|
378
|
+
return this.generateSqlOnlyResponse(question, packageName, traceId);
|
|
379
|
+
}
|
|
380
|
+
// Detect the appropriate skill
|
|
381
|
+
const intent = this.detectIntent(question);
|
|
382
|
+
// Route to appropriate skill method
|
|
383
|
+
let result;
|
|
384
|
+
switch (intent.skillType) {
|
|
385
|
+
case perfettoSql_1.PerfettoSkillType.STARTUP:
|
|
386
|
+
result = await this.analyzeStartup(traceId, intent.params.packageName || packageName);
|
|
387
|
+
break;
|
|
388
|
+
case perfettoSql_1.PerfettoSkillType.SCROLLING:
|
|
389
|
+
result = await this.analyzeScrolling(traceId, packageName);
|
|
390
|
+
break;
|
|
391
|
+
case perfettoSql_1.PerfettoSkillType.NAVIGATION:
|
|
392
|
+
result = await this.analyzeNavigation(traceId, packageName);
|
|
393
|
+
break;
|
|
394
|
+
case perfettoSql_1.PerfettoSkillType.CLICK_RESPONSE:
|
|
395
|
+
result = await this.analyzeClickResponse(traceId, packageName);
|
|
396
|
+
break;
|
|
397
|
+
case perfettoSql_1.PerfettoSkillType.MEMORY:
|
|
398
|
+
result = await this.analyzeMemory(traceId, packageName);
|
|
399
|
+
break;
|
|
400
|
+
case perfettoSql_1.PerfettoSkillType.CPU:
|
|
401
|
+
result = await this.analyzeCpu(traceId, packageName);
|
|
402
|
+
break;
|
|
403
|
+
case perfettoSql_1.PerfettoSkillType.SURFACE_FLINGER:
|
|
404
|
+
result = await this.analyzeSurfaceFlinger(traceId);
|
|
405
|
+
break;
|
|
406
|
+
case perfettoSql_1.PerfettoSkillType.SYSTEM_SERVER:
|
|
407
|
+
result = await this.analyzeSystemServer(traceId);
|
|
408
|
+
break;
|
|
409
|
+
case perfettoSql_1.PerfettoSkillType.INPUT:
|
|
410
|
+
result = await this.analyzeInput(traceId, packageName);
|
|
411
|
+
break;
|
|
412
|
+
case perfettoSql_1.PerfettoSkillType.BINDER:
|
|
413
|
+
result = await this.analyzeBinder(traceId, packageName);
|
|
414
|
+
break;
|
|
415
|
+
case perfettoSql_1.PerfettoSkillType.BUFFER_FLOW:
|
|
416
|
+
result = await this.analyzeBufferFlow(traceId);
|
|
417
|
+
break;
|
|
418
|
+
case perfettoSql_1.PerfettoSkillType.SLOW_FUNCTIONS:
|
|
419
|
+
result = await this.analyzeSlowFunctions(traceId, packageName);
|
|
420
|
+
break;
|
|
421
|
+
case perfettoSql_1.PerfettoSkillType.NETWORK:
|
|
422
|
+
result = await this.analyzeNetwork(traceId, packageName);
|
|
423
|
+
break;
|
|
424
|
+
case perfettoSql_1.PerfettoSkillType.DATABASE:
|
|
425
|
+
result = await this.analyzeDatabase(traceId, packageName);
|
|
426
|
+
break;
|
|
427
|
+
case perfettoSql_1.PerfettoSkillType.FILE_IO:
|
|
428
|
+
result = await this.analyzeFileIO(traceId, packageName);
|
|
429
|
+
break;
|
|
430
|
+
default:
|
|
431
|
+
// Fallback to generic SQL generation
|
|
432
|
+
result = await this.analyzeGeneric(traceId, question, packageName);
|
|
433
|
+
}
|
|
434
|
+
return result;
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Detect the appropriate analysis skill from the question
|
|
438
|
+
*/
|
|
439
|
+
detectIntent(question) {
|
|
440
|
+
const lowerQuestion = question.toLowerCase();
|
|
441
|
+
for (const pattern of SKILL_PATTERNS) {
|
|
442
|
+
// Check keyword matches
|
|
443
|
+
for (const keyword of pattern.keywords) {
|
|
444
|
+
if (lowerQuestion.includes(keyword.toLowerCase())) {
|
|
445
|
+
return {
|
|
446
|
+
skillType: pattern.skillType,
|
|
447
|
+
confidence: 0.8,
|
|
448
|
+
params: this.extractParams(question, pattern.skillType),
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
// Check regex patterns
|
|
453
|
+
for (const regex of pattern.patterns) {
|
|
454
|
+
if (regex.test(question)) {
|
|
455
|
+
return {
|
|
456
|
+
skillType: pattern.skillType,
|
|
457
|
+
confidence: 0.75,
|
|
458
|
+
params: this.extractParams(question, pattern.skillType),
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
// Default to generic analysis
|
|
464
|
+
return {
|
|
465
|
+
skillType: perfettoSql_1.PerfettoSkillType.STARTUP, // Default fallback
|
|
466
|
+
confidence: 0.3,
|
|
467
|
+
params: {},
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Extract parameters from the question
|
|
472
|
+
*/
|
|
473
|
+
extractParams(question, skillType) {
|
|
474
|
+
const params = {};
|
|
475
|
+
// Extract package name (common pattern: com.example.app)
|
|
476
|
+
const packageMatch = question.match(/([a-z][a-z0-9_]*(\.[a-z0-9_]+)+)/i);
|
|
477
|
+
if (packageMatch) {
|
|
478
|
+
params.packageName = packageMatch[1];
|
|
479
|
+
}
|
|
480
|
+
// Extract numbers (time limits, counts, etc.)
|
|
481
|
+
const numberMatches = question.match(/\b(\d+)\b/g);
|
|
482
|
+
if (numberMatches) {
|
|
483
|
+
params.limit = parseInt(numberMatches[0], 10);
|
|
484
|
+
}
|
|
485
|
+
return params;
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Generate SQL-only response for WASM traces (where trace is in browser)
|
|
489
|
+
* The UI will execute this SQL locally
|
|
490
|
+
*/
|
|
491
|
+
async generateSqlOnlyResponse(question, packageName, traceId) {
|
|
492
|
+
// Detect the appropriate skill
|
|
493
|
+
const intent = this.detectIntent(question);
|
|
494
|
+
// Build SQL based on the detected skill type
|
|
495
|
+
let sql = '';
|
|
496
|
+
let analysisType = intent.skillType;
|
|
497
|
+
let summary = '';
|
|
498
|
+
switch (intent.skillType) {
|
|
499
|
+
case perfettoSql_1.PerfettoSkillType.STARTUP:
|
|
500
|
+
sql = this.getStartupSql(packageName);
|
|
501
|
+
summary = `Execute this SQL to analyze app startup performance. Look for startup_type (cold/warm/hot), dur (duration), and ttid/ttfd metrics.`;
|
|
502
|
+
break;
|
|
503
|
+
case perfettoSql_1.PerfettoSkillType.SCROLLING:
|
|
504
|
+
sql = this.getScrollingSql(packageName);
|
|
505
|
+
summary = `Execute this SQL to analyze scrolling performance and jank. Look for frame durations, jank_type, and on_time_finish flags.`;
|
|
506
|
+
break;
|
|
507
|
+
case perfettoSql_1.PerfettoSkillType.NAVIGATION:
|
|
508
|
+
sql = this.getNavigationSql(packageName);
|
|
509
|
+
summary = `Execute this SQL to analyze activity navigation performance. Look for activity transitions and their durations.`;
|
|
510
|
+
break;
|
|
511
|
+
case perfettoSql_1.PerfettoSkillType.CLICK_RESPONSE:
|
|
512
|
+
sql = this.getClickResponseSql(packageName);
|
|
513
|
+
summary = `Execute this SQL to analyze click/tap response latency. Look for time from input event to UI response.`;
|
|
514
|
+
break;
|
|
515
|
+
case perfettoSql_1.PerfettoSkillType.MEMORY:
|
|
516
|
+
sql = this.getMemorySql(packageName);
|
|
517
|
+
summary = `Execute this SQL to analyze memory usage. Look for heap size, GC events, and allocation counts.`;
|
|
518
|
+
break;
|
|
519
|
+
case perfettoSql_1.PerfettoSkillType.CPU:
|
|
520
|
+
sql = this.getCpuSql(packageName);
|
|
521
|
+
summary = `Execute this SQL to analyze CPU usage. Look for thread CPU time, utilization, and frequency.`;
|
|
522
|
+
break;
|
|
523
|
+
case perfettoSql_1.PerfettoSkillType.SURFACE_FLINGER:
|
|
524
|
+
sql = this.getSurfaceFlingerSql();
|
|
525
|
+
summary = `Execute this SQL to analyze SurfaceFlinger performance. Look for frame misses, GPU composition, and buffer latency.`;
|
|
526
|
+
break;
|
|
527
|
+
case perfettoSql_1.PerfettoSkillType.INPUT:
|
|
528
|
+
sql = this.getInputSql(packageName);
|
|
529
|
+
summary = `Execute this SQL to analyze input events. Look for event types and their timestamps.`;
|
|
530
|
+
break;
|
|
531
|
+
case perfettoSql_1.PerfettoSkillType.BINDER:
|
|
532
|
+
sql = this.getBinderSql(packageName);
|
|
533
|
+
summary = `Execute this SQL to analyze Binder transactions. Look for transaction durations and AIDL interface names.`;
|
|
534
|
+
break;
|
|
535
|
+
case perfettoSql_1.PerfettoSkillType.BUFFER_FLOW:
|
|
536
|
+
sql = this.getBufferFlowSql();
|
|
537
|
+
summary = `Execute this SQL to analyze buffer queue flow. Look for queue depth and fence wait times.`;
|
|
538
|
+
break;
|
|
539
|
+
case perfettoSql_1.PerfettoSkillType.SYSTEM_SERVER:
|
|
540
|
+
sql = this.getSystemServerSql();
|
|
541
|
+
summary = `Execute this SQL to analyze SystemServer performance. Look for system service call latencies.`;
|
|
542
|
+
break;
|
|
543
|
+
case perfettoSql_1.PerfettoSkillType.SLOW_FUNCTIONS:
|
|
544
|
+
sql = this.getSlowFunctionsSql(packageName);
|
|
545
|
+
summary = `Execute this SQL to analyze long-running main-thread slices (>16ms). Correlate these slices with jank evidence before claiming dropped frames.`;
|
|
546
|
+
break;
|
|
547
|
+
case perfettoSql_1.PerfettoSkillType.NETWORK:
|
|
548
|
+
sql = this.getNetworkSql(packageName);
|
|
549
|
+
summary = `Execute this SQL to analyze network traffic. Look for request/response durations and URLs.`;
|
|
550
|
+
break;
|
|
551
|
+
case perfettoSql_1.PerfettoSkillType.DATABASE:
|
|
552
|
+
sql = this.getDatabaseSql(packageName);
|
|
553
|
+
summary = `Execute this SQL to analyze database queries. Look for SQLite/Room operations and their durations.`;
|
|
554
|
+
break;
|
|
555
|
+
case perfettoSql_1.PerfettoSkillType.FILE_IO:
|
|
556
|
+
sql = this.getFileIOSql(packageName);
|
|
557
|
+
summary = `Execute this SQL to analyze file I/O operations. Look for read/write operations and their durations.`;
|
|
558
|
+
break;
|
|
559
|
+
default:
|
|
560
|
+
// Generic query - suggest exploring tables
|
|
561
|
+
sql = `
|
|
562
|
+
-- General trace exploration
|
|
563
|
+
-- List all available tables
|
|
564
|
+
SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;
|
|
565
|
+
|
|
566
|
+
-- Get process list
|
|
567
|
+
SELECT pid, name, uid FROM process ORDER BY name;
|
|
568
|
+
|
|
569
|
+
-- Get thread list with process info
|
|
570
|
+
SELECT
|
|
571
|
+
t.tid,
|
|
572
|
+
t.name as thread_name,
|
|
573
|
+
p.name as process_name,
|
|
574
|
+
p.pid
|
|
575
|
+
FROM thread t
|
|
576
|
+
LEFT JOIN process p ON t.upid = p.upid
|
|
577
|
+
ORDER BY p.name, t.name;
|
|
578
|
+
`;
|
|
579
|
+
analysisType = perfettoSql_1.PerfettoSkillType.STARTUP; // Use startup as default
|
|
580
|
+
summary = 'Explore the trace structure using these queries.';
|
|
581
|
+
}
|
|
582
|
+
// Get official template recommendations for enriched context
|
|
583
|
+
let officialTemplates = [];
|
|
584
|
+
let recommendedSQL = [];
|
|
585
|
+
let aiContext = '';
|
|
586
|
+
try {
|
|
587
|
+
const matchResult = await this.findOfficialTemplates(question);
|
|
588
|
+
officialTemplates = matchResult.officialTemplates.slice(0, 5); // Top 5 matches
|
|
589
|
+
recommendedSQL = matchResult.recommendedSQL.slice(0, 3); // Top 3 recommendations
|
|
590
|
+
aiContext = await this.getEnrichedAIContext(question);
|
|
591
|
+
}
|
|
592
|
+
catch (error) {
|
|
593
|
+
console.log('[PerfettoSqlSkill] Could not load official templates (optional enhancement)');
|
|
594
|
+
}
|
|
595
|
+
return {
|
|
596
|
+
analysisType,
|
|
597
|
+
sql,
|
|
598
|
+
rows: [],
|
|
599
|
+
rowCount: 0,
|
|
600
|
+
summary,
|
|
601
|
+
details: {
|
|
602
|
+
note: 'For WASM traces: Execute this SQL in Perfetto UI to see results',
|
|
603
|
+
question,
|
|
604
|
+
packageName: packageName || null,
|
|
605
|
+
// Enhanced with official Perfetto SQL library
|
|
606
|
+
officialTemplates: officialTemplates.map(t => ({
|
|
607
|
+
id: t.id,
|
|
608
|
+
name: t.name,
|
|
609
|
+
category: t.category,
|
|
610
|
+
type: t.type,
|
|
611
|
+
description: t.description,
|
|
612
|
+
})),
|
|
613
|
+
recommendedSQL,
|
|
614
|
+
hasOfficialLibrary: officialTemplates.length > 0,
|
|
615
|
+
},
|
|
616
|
+
// Provide AI context for downstream processing
|
|
617
|
+
aiContext,
|
|
618
|
+
};
|
|
619
|
+
}
|
|
620
|
+
// SQL template generators for WASM trace mode
|
|
621
|
+
getStartupSql(packageName) {
|
|
622
|
+
const whereClause = packageName ? `WHERE package GLOB '${packageName}*'` : '';
|
|
623
|
+
return `
|
|
624
|
+
-- App Startup Analysis
|
|
625
|
+
SELECT
|
|
626
|
+
startup_id,
|
|
627
|
+
ts / 1e6 as ts_ms,
|
|
628
|
+
dur / 1e6 as dur_ms,
|
|
629
|
+
package,
|
|
630
|
+
process_name,
|
|
631
|
+
startup_type,
|
|
632
|
+
ttid,
|
|
633
|
+
ttfd
|
|
634
|
+
FROM android_startups
|
|
635
|
+
${whereClause}
|
|
636
|
+
ORDER BY ts ASC;
|
|
637
|
+
`;
|
|
638
|
+
}
|
|
639
|
+
getScrollingSql(packageName) {
|
|
640
|
+
const processFilter = packageName ? `WHERE p.name GLOB '${packageName}*'` : '';
|
|
641
|
+
return `
|
|
642
|
+
-- Scrolling Performance Analysis (FrameTimeline)
|
|
643
|
+
SELECT
|
|
644
|
+
afs.id,
|
|
645
|
+
afs.ts / 1e6 as ts_ms,
|
|
646
|
+
afs.dur / 1e6 as dur_ms,
|
|
647
|
+
p.name as process,
|
|
648
|
+
afs.name,
|
|
649
|
+
afs.on_time_finish,
|
|
650
|
+
afs.gpu_composition,
|
|
651
|
+
afs.jank_type
|
|
652
|
+
FROM actual_frame_timeline_slice afs
|
|
653
|
+
LEFT JOIN process p ON afs.upid = p.upid
|
|
654
|
+
${processFilter}
|
|
655
|
+
ORDER BY afs.ts ASC;
|
|
656
|
+
`;
|
|
657
|
+
}
|
|
658
|
+
getNavigationSql(packageName) {
|
|
659
|
+
const whereClause = packageName ? `WHERE package GLOB '${packageName}*'` : '';
|
|
660
|
+
return `
|
|
661
|
+
-- Activity Navigation Analysis
|
|
662
|
+
SELECT
|
|
663
|
+
ts / 1e6 as ts_ms,
|
|
664
|
+
dur / 1e6 as dur_ms,
|
|
665
|
+
package,
|
|
666
|
+
activity,
|
|
667
|
+
reason
|
|
668
|
+
FROM activity_manager_transitions
|
|
669
|
+
${whereClause}
|
|
670
|
+
ORDER BY ts ASC;
|
|
671
|
+
`;
|
|
672
|
+
}
|
|
673
|
+
getClickResponseSql(packageName) {
|
|
674
|
+
const whereClause = packageName ? `WHERE p.name GLOB '${packageName}*'` : '';
|
|
675
|
+
return `
|
|
676
|
+
-- Click Response Analysis
|
|
677
|
+
SELECT
|
|
678
|
+
e.ts / 1e6 as ts_ms,
|
|
679
|
+
e.name as event_type,
|
|
680
|
+
e.arg_set_id
|
|
681
|
+
FROM slice e
|
|
682
|
+
JOIN track t ON e.track_id = t.id
|
|
683
|
+
JOIN process_track pt ON t.id = pt.id
|
|
684
|
+
JOIN process p ON pt.upid = p.upid
|
|
685
|
+
${whereClause.replace('WHERE', 'AND')} AND e.name LIKE '%Click%'
|
|
686
|
+
ORDER BY e.ts ASC;
|
|
687
|
+
`;
|
|
688
|
+
}
|
|
689
|
+
getMemorySql(packageName) {
|
|
690
|
+
const whereClause = packageName ? `WHERE p.name GLOB '${packageName}*'` : '';
|
|
691
|
+
return `
|
|
692
|
+
-- Memory Analysis (Heap Profile)
|
|
693
|
+
SELECT
|
|
694
|
+
ts / 1e6 as ts_ms,
|
|
695
|
+
upid,
|
|
696
|
+
heap_size,
|
|
697
|
+
anon_rss,
|
|
698
|
+
file_rss,
|
|
699
|
+
swap_rss
|
|
700
|
+
FROM heap_profile_summary
|
|
701
|
+
ORDER BY ts ASC;
|
|
702
|
+
`;
|
|
703
|
+
}
|
|
704
|
+
getCpuSql(packageName) {
|
|
705
|
+
const whereClause = packageName ? `WHERE p.name GLOB '${packageName}*'` : '';
|
|
706
|
+
return `
|
|
707
|
+
-- CPU Usage Analysis
|
|
708
|
+
SELECT
|
|
709
|
+
t.tid,
|
|
710
|
+
t.name as thread_name,
|
|
711
|
+
p.name as process_name,
|
|
712
|
+
SUM(s.dur) / 1e9 as total_cpu_sec
|
|
713
|
+
FROM sched s
|
|
714
|
+
JOIN thread t ON s.utid = t.utid
|
|
715
|
+
LEFT JOIN process p ON t.upid = p.upid
|
|
716
|
+
${whereClause.replace('WHERE', 'AND')}
|
|
717
|
+
GROUP BY t.tid, t.name, p.name
|
|
718
|
+
ORDER BY total_cpu_sec DESC;
|
|
719
|
+
`;
|
|
720
|
+
}
|
|
721
|
+
getSurfaceFlingerSql() {
|
|
722
|
+
return `
|
|
723
|
+
-- SurfaceFlinger Analysis
|
|
724
|
+
SELECT
|
|
725
|
+
ts / 1e6 as ts_ms,
|
|
726
|
+
dur / 1e6 as dur_ms,
|
|
727
|
+
display_id,
|
|
728
|
+
present_type,
|
|
729
|
+
gpu_composition,
|
|
730
|
+
sf_jank_type
|
|
731
|
+
FROM gfx_composition
|
|
732
|
+
ORDER BY ts ASC;
|
|
733
|
+
`;
|
|
734
|
+
}
|
|
735
|
+
getInputSql(packageName) {
|
|
736
|
+
const whereClause = packageName ? `WHERE p.name GLOB '${packageName}*'` : '';
|
|
737
|
+
return `
|
|
738
|
+
-- Input Events Analysis
|
|
739
|
+
SELECT
|
|
740
|
+
e.ts / 1e6 as ts_ms,
|
|
741
|
+
e.name as event_name,
|
|
742
|
+
p.name as process_name
|
|
743
|
+
FROM slice e
|
|
744
|
+
JOIN track t ON e.track_id = t.id
|
|
745
|
+
JOIN process_track pt ON t.id = pt.id
|
|
746
|
+
JOIN process p ON pt.upid = p.upid
|
|
747
|
+
${whereClause.replace('WHERE', 'AND')} AND (e.name GLOB '*Input*' OR e.name GLOB '*Touch*' OR e.name GLOB '*Key*')
|
|
748
|
+
ORDER BY e.ts ASC;
|
|
749
|
+
`;
|
|
750
|
+
}
|
|
751
|
+
getBinderSql(packageName) {
|
|
752
|
+
const whereClause = packageName ? `WHERE p.name GLOB '${packageName}*'` : '';
|
|
753
|
+
return `
|
|
754
|
+
-- Binder Transactions Analysis
|
|
755
|
+
SELECT
|
|
756
|
+
ts / 1e6 as ts_ms,
|
|
757
|
+
dur / 1e6 as dur_ms,
|
|
758
|
+
aidl_name,
|
|
759
|
+
is_sync,
|
|
760
|
+
thread_name
|
|
761
|
+
FROM binder_txn
|
|
762
|
+
${whereClause.replace('WHERE', 'AND')}
|
|
763
|
+
ORDER BY ts ASC;
|
|
764
|
+
`;
|
|
765
|
+
}
|
|
766
|
+
getBufferFlowSql() {
|
|
767
|
+
return `
|
|
768
|
+
-- Buffer Queue Flow Analysis
|
|
769
|
+
SELECT
|
|
770
|
+
ts / 1e6 as ts_ms,
|
|
771
|
+
queue_depth,
|
|
772
|
+
fence_wait_time_ns / 1e6 as fence_wait_ms,
|
|
773
|
+
buffer_id
|
|
774
|
+
FROM buffer_queue_state
|
|
775
|
+
ORDER BY ts ASC;
|
|
776
|
+
`;
|
|
777
|
+
}
|
|
778
|
+
getSystemServerSql() {
|
|
779
|
+
return `
|
|
780
|
+
-- SystemServer Performance
|
|
781
|
+
SELECT
|
|
782
|
+
ts / 1e6 as ts_ms,
|
|
783
|
+
dur / 1e6 as dur_ms,
|
|
784
|
+
service_name,
|
|
785
|
+
interface_name
|
|
786
|
+
FROM system_server_calls
|
|
787
|
+
ORDER BY ts ASC;
|
|
788
|
+
`;
|
|
789
|
+
}
|
|
790
|
+
getSlowFunctionsSql(packageName) {
|
|
791
|
+
const processFilter = packageName ? `WHERE p.name GLOB '${packageName}*'` : '';
|
|
792
|
+
return `
|
|
793
|
+
-- Slow Main-Thread Functions Analysis (>16ms)
|
|
794
|
+
SELECT
|
|
795
|
+
s.name as function_name,
|
|
796
|
+
COUNT(*) as count,
|
|
797
|
+
AVG(s.dur) / 1e6 as avg_dur_ms,
|
|
798
|
+
MAX(s.dur) / 1e6 as max_dur_ms,
|
|
799
|
+
SUM(s.dur) / 1e6 as total_dur_ms,
|
|
800
|
+
p.name as process_name
|
|
801
|
+
FROM slice s
|
|
802
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
803
|
+
JOIN thread t ON tt.utid = t.utid
|
|
804
|
+
JOIN process p ON t.upid = p.upid
|
|
805
|
+
${processFilter.replace('WHERE', 'AND')}
|
|
806
|
+
AND s.dur > 16000000
|
|
807
|
+
AND (COALESCE(t.is_main_thread, 0) = 1 OR t.tid = p.pid OR LOWER(COALESCE(t.name, '')) = 'main')
|
|
808
|
+
GROUP BY s.name, p.name
|
|
809
|
+
ORDER BY total_dur_ms DESC;
|
|
810
|
+
`;
|
|
811
|
+
}
|
|
812
|
+
getNetworkSql(packageName) {
|
|
813
|
+
const processFilter = packageName ? `AND p.name GLOB '${packageName}*'` : '';
|
|
814
|
+
return `
|
|
815
|
+
-- Network Traffic Analysis
|
|
816
|
+
SELECT
|
|
817
|
+
net.name,
|
|
818
|
+
net.slice_id,
|
|
819
|
+
net.ts / 1e6 as ts_ms,
|
|
820
|
+
net.dur / 1e6 as dur_ms,
|
|
821
|
+
t.name as thread_name,
|
|
822
|
+
p.name as process_name
|
|
823
|
+
FROM network_traffic_slice net
|
|
824
|
+
JOIN thread_track tt ON net.track_id = tt.id
|
|
825
|
+
JOIN thread t ON tt.utid = t.utid
|
|
826
|
+
JOIN process p ON t.upid = p.upid
|
|
827
|
+
WHERE 1=1
|
|
828
|
+
${processFilter}
|
|
829
|
+
ORDER BY net.ts ASC;
|
|
830
|
+
`;
|
|
831
|
+
}
|
|
832
|
+
getDatabaseSql(packageName) {
|
|
833
|
+
const processFilter = packageName ? `AND p.name GLOB '${packageName}*'` : '';
|
|
834
|
+
return `
|
|
835
|
+
-- Database Query Analysis (SQLite/Room)
|
|
836
|
+
SELECT
|
|
837
|
+
s.name,
|
|
838
|
+
s.ts / 1e6 as ts_ms,
|
|
839
|
+
s.dur / 1e6 as dur_ms,
|
|
840
|
+
t.name as thread_name,
|
|
841
|
+
p.name as process_name
|
|
842
|
+
FROM slice s
|
|
843
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
844
|
+
JOIN thread t ON tt.utid = t.utid
|
|
845
|
+
JOIN process p ON t.upid = p.upid
|
|
846
|
+
WHERE s.name GLOB '*sqlite*%' OR s.name GLOB '*room*%'
|
|
847
|
+
${processFilter}
|
|
848
|
+
ORDER BY s.ts ASC;
|
|
849
|
+
`;
|
|
850
|
+
}
|
|
851
|
+
getFileIOSql(packageName) {
|
|
852
|
+
const processFilter = packageName ? `AND p.name GLOB '${packageName}*'` : '';
|
|
853
|
+
return `
|
|
854
|
+
-- File I/O Analysis
|
|
855
|
+
SELECT
|
|
856
|
+
s.name,
|
|
857
|
+
s.ts / 1e6 as ts_ms,
|
|
858
|
+
s.dur / 1e6 as dur_ms,
|
|
859
|
+
t.name as thread_name,
|
|
860
|
+
p.name as process_name
|
|
861
|
+
FROM slice s
|
|
862
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
863
|
+
JOIN thread t ON tt.utid = t.utid
|
|
864
|
+
JOIN process p ON t.upid = p.upid
|
|
865
|
+
WHERE s.name GLOB '*read*%' OR s.name GLOB '*write*%' OR s.name GLOB '*fs_*%'
|
|
866
|
+
${processFilter}
|
|
867
|
+
ORDER BY s.ts ASC;
|
|
868
|
+
`;
|
|
869
|
+
}
|
|
870
|
+
// ========================================================================
|
|
871
|
+
// Skill-Specific Analysis Methods
|
|
872
|
+
// ========================================================================
|
|
873
|
+
/**
|
|
874
|
+
* Analyze app startup performance
|
|
875
|
+
* Based on: perfetto_sql/stdlib/android/startup/startups_minsdk33.sql
|
|
876
|
+
*/
|
|
877
|
+
async analyzeStartup(traceId, packageName) {
|
|
878
|
+
// 尝试多种方法获取启动数据
|
|
879
|
+
console.log('[PerfettoSqlSkill] analyzeStartup called for package:', packageName);
|
|
880
|
+
// 方法1: 尝试使用 android_startup_processes 表(更可靠)
|
|
881
|
+
try {
|
|
882
|
+
await this.traceProcessor.query(traceId, 'INCLUDE PERFETTO MODULE android.startup.startup_events;');
|
|
883
|
+
console.log('[PerfettoSqlSkill] android.startup.startup_events module included');
|
|
884
|
+
}
|
|
885
|
+
catch (e) {
|
|
886
|
+
console.log('[PerfettoSqlSkill] startup_events module not available');
|
|
887
|
+
}
|
|
888
|
+
// 方法2: 尝试 android.startup.startups 模块
|
|
889
|
+
try {
|
|
890
|
+
await this.traceProcessor.query(traceId, 'INCLUDE PERFETTO MODULE android.startup.startups;');
|
|
891
|
+
console.log('[PerfettoSqlSkill] android.startup.startups module included');
|
|
892
|
+
}
|
|
893
|
+
catch (e) {
|
|
894
|
+
console.log('[PerfettoSqlSkill] startups module not available');
|
|
895
|
+
}
|
|
896
|
+
// 诊断:检查可用的启动相关表
|
|
897
|
+
const availableTables = [];
|
|
898
|
+
const tablesToCheck = ['android_startups', 'android_startup_processes', '_startup_events'];
|
|
899
|
+
for (const table of tablesToCheck) {
|
|
900
|
+
try {
|
|
901
|
+
const checkResult = await this.traceProcessor.query(traceId, `SELECT COUNT(*) as cnt FROM ${table}`);
|
|
902
|
+
const count = checkResult.rows?.[0]?.[0] ?? 0;
|
|
903
|
+
console.log(`[PerfettoSqlSkill] Table ${table}: ${count} rows`);
|
|
904
|
+
if (count > 0)
|
|
905
|
+
availableTables.push(table);
|
|
906
|
+
}
|
|
907
|
+
catch (e) {
|
|
908
|
+
console.log(`[PerfettoSqlSkill] Table ${table} not available`);
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
// 如果 android_startups 有数据,使用它
|
|
912
|
+
if (availableTables.includes('android_startups')) {
|
|
913
|
+
let whereClause = '';
|
|
914
|
+
if (packageName) {
|
|
915
|
+
whereClause = `WHERE (
|
|
916
|
+
package GLOB '${packageName}*'
|
|
917
|
+
OR package GLOB '*${packageName.split('.').pop()}*'
|
|
918
|
+
)`;
|
|
919
|
+
}
|
|
920
|
+
const sql = `
|
|
921
|
+
SELECT
|
|
922
|
+
startup_id,
|
|
923
|
+
ts / 1e6 as ts_ms,
|
|
924
|
+
dur / 1e6 as dur_ms,
|
|
925
|
+
package,
|
|
926
|
+
startup_type
|
|
927
|
+
FROM android_startups
|
|
928
|
+
${whereClause}
|
|
929
|
+
ORDER BY ts ASC
|
|
930
|
+
`;
|
|
931
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
932
|
+
if (!queryResult.error && queryResult.rows.length > 0) {
|
|
933
|
+
console.log('[PerfettoSqlSkill] Got data from android_startups:', queryResult.rows.length, 'rows');
|
|
934
|
+
const startupObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
935
|
+
return {
|
|
936
|
+
analysisType: 'startup',
|
|
937
|
+
sql,
|
|
938
|
+
rows: queryResult.rows,
|
|
939
|
+
rowCount: queryResult.rows.length,
|
|
940
|
+
summary: this.formatStartupSummary(startupObjects),
|
|
941
|
+
metrics: {
|
|
942
|
+
totalStartups: queryResult.rows.length,
|
|
943
|
+
coldStarts: startupObjects.filter((s) => s.startup_type === 'cold').length,
|
|
944
|
+
warmStarts: startupObjects.filter((s) => s.startup_type === 'warm').length,
|
|
945
|
+
hotStarts: startupObjects.filter((s) => s.startup_type === 'hot').length,
|
|
946
|
+
},
|
|
947
|
+
};
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
// 如果 android_startup_processes 有数据,使用它
|
|
951
|
+
if (availableTables.includes('android_startup_processes')) {
|
|
952
|
+
let whereClause = '';
|
|
953
|
+
if (packageName) {
|
|
954
|
+
whereClause = `WHERE (
|
|
955
|
+
package GLOB '${packageName}*'
|
|
956
|
+
OR package GLOB '*${packageName.split('.').pop()}*'
|
|
957
|
+
OR name GLOB '${packageName}*'
|
|
958
|
+
)`;
|
|
959
|
+
}
|
|
960
|
+
const sql = `
|
|
961
|
+
SELECT
|
|
962
|
+
startup_id,
|
|
963
|
+
startup_type,
|
|
964
|
+
package,
|
|
965
|
+
name as process_name,
|
|
966
|
+
ts / 1e6 as ts_ms,
|
|
967
|
+
dur / 1e6 as dur_ms
|
|
968
|
+
FROM android_startup_processes
|
|
969
|
+
${whereClause}
|
|
970
|
+
ORDER BY ts ASC
|
|
971
|
+
`;
|
|
972
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
973
|
+
if (!queryResult.error && queryResult.rows.length > 0) {
|
|
974
|
+
console.log('[PerfettoSqlSkill] Got data from android_startup_processes:', queryResult.rows.length, 'rows');
|
|
975
|
+
const startupObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
976
|
+
return {
|
|
977
|
+
analysisType: 'startup',
|
|
978
|
+
sql,
|
|
979
|
+
rows: queryResult.rows,
|
|
980
|
+
rowCount: queryResult.rows.length,
|
|
981
|
+
summary: this.formatStartupProcessesSummary(startupObjects),
|
|
982
|
+
metrics: {
|
|
983
|
+
totalStartups: queryResult.rows.length,
|
|
984
|
+
coldStarts: startupObjects.filter((s) => s.startup_type === 'cold').length,
|
|
985
|
+
warmStarts: startupObjects.filter((s) => s.startup_type === 'warm').length,
|
|
986
|
+
hotStarts: startupObjects.filter((s) => s.startup_type === 'hot').length,
|
|
987
|
+
},
|
|
988
|
+
};
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
// 方法3: 直接从 slice 表查询启动生命周期事件
|
|
992
|
+
console.log('[PerfettoSqlSkill] Falling back to slice-based startup analysis');
|
|
993
|
+
return this.analyzeStartupFromSlices(traceId, packageName);
|
|
994
|
+
}
|
|
995
|
+
/**
|
|
996
|
+
* 从 slice 表直接分析启动事件
|
|
997
|
+
* 查询完整的 Activity 生命周期和启动相关事件
|
|
998
|
+
*/
|
|
999
|
+
async analyzeStartupFromSlices(traceId, packageName) {
|
|
1000
|
+
// 构建进程过滤条件 - 支持包名和进程名的多种匹配方式
|
|
1001
|
+
let processFilter = '';
|
|
1002
|
+
if (packageName) {
|
|
1003
|
+
// Android 进程名可能被截断,所以使用多种匹配方式
|
|
1004
|
+
const lastPart = packageName.split('.').pop() || packageName;
|
|
1005
|
+
processFilter = `AND (
|
|
1006
|
+
p.name GLOB '${packageName}*'
|
|
1007
|
+
OR p.name GLOB '*${lastPart}*'
|
|
1008
|
+
OR p.name LIKE '%${packageName}%'
|
|
1009
|
+
OR p.cmdline GLOB '*${packageName}*'
|
|
1010
|
+
)`;
|
|
1011
|
+
}
|
|
1012
|
+
// 查询完整的启动生命周期事件
|
|
1013
|
+
const sql = `
|
|
1014
|
+
SELECT
|
|
1015
|
+
s.name as event_name,
|
|
1016
|
+
s.ts / 1e6 as ts_ms,
|
|
1017
|
+
s.dur / 1e6 as dur_ms,
|
|
1018
|
+
p.name as process_name,
|
|
1019
|
+
t.name as thread_name,
|
|
1020
|
+
p.pid,
|
|
1021
|
+
CASE
|
|
1022
|
+
WHEN s.name GLOB '*bindApplication*' THEN 1
|
|
1023
|
+
WHEN s.name GLOB '*activityStart*' THEN 2
|
|
1024
|
+
WHEN s.name GLOB '*performCreate*' OR s.name GLOB '*onCreate*' THEN 3
|
|
1025
|
+
WHEN s.name GLOB '*performResume*' OR s.name GLOB '*onResume*' THEN 4
|
|
1026
|
+
WHEN s.name GLOB '*inflate*' THEN 5
|
|
1027
|
+
WHEN s.name GLOB '*traversal*' OR s.name GLOB '*measure*' OR s.name GLOB '*layout*' THEN 6
|
|
1028
|
+
WHEN s.name GLOB '*draw*' OR s.name GLOB '*Choreographer*doFrame*' THEN 7
|
|
1029
|
+
WHEN s.name GLOB '*reportFullyDrawn*' THEN 8
|
|
1030
|
+
ELSE 99
|
|
1031
|
+
END as phase_order
|
|
1032
|
+
FROM slice s
|
|
1033
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
1034
|
+
JOIN thread t ON tt.utid = t.utid
|
|
1035
|
+
JOIN process p ON t.upid = p.upid
|
|
1036
|
+
WHERE (
|
|
1037
|
+
s.name GLOB '*bindApplication*'
|
|
1038
|
+
OR s.name GLOB '*activityStart*'
|
|
1039
|
+
OR s.name GLOB '*ActivityThread*main*'
|
|
1040
|
+
OR s.name GLOB '*performCreate*'
|
|
1041
|
+
OR s.name GLOB '*onCreate*'
|
|
1042
|
+
OR s.name GLOB '*performResume*'
|
|
1043
|
+
OR s.name GLOB '*onResume*'
|
|
1044
|
+
OR s.name GLOB '*inflate*'
|
|
1045
|
+
OR s.name GLOB '*traversal*'
|
|
1046
|
+
OR s.name GLOB '*measure*'
|
|
1047
|
+
OR s.name GLOB '*layout*'
|
|
1048
|
+
OR s.name GLOB '*draw*'
|
|
1049
|
+
OR s.name GLOB '*Choreographer*doFrame*'
|
|
1050
|
+
OR s.name GLOB '*reportFullyDrawn*'
|
|
1051
|
+
OR s.name GLOB '*launching*'
|
|
1052
|
+
OR s.name GLOB '*ResourcesImpl*'
|
|
1053
|
+
OR s.name GLOB '*Lock*contention*'
|
|
1054
|
+
OR s.name GLOB '*Choreographer*'
|
|
1055
|
+
)
|
|
1056
|
+
${processFilter}
|
|
1057
|
+
ORDER BY s.ts ASC
|
|
1058
|
+
`;
|
|
1059
|
+
console.log('[PerfettoSqlSkill] analyzeStartupFromSlices SQL (truncated):', sql.substring(0, 400));
|
|
1060
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
1061
|
+
if (queryResult.error) {
|
|
1062
|
+
console.log('[PerfettoSqlSkill] analyzeStartupFromSlices error:', queryResult.error);
|
|
1063
|
+
return this.analyzeStartupFallback(traceId, packageName);
|
|
1064
|
+
}
|
|
1065
|
+
if (queryResult.rows.length === 0) {
|
|
1066
|
+
console.log('[PerfettoSqlSkill] analyzeStartupFromSlices: no results, trying broader fallback');
|
|
1067
|
+
return this.analyzeStartupFallback(traceId, packageName);
|
|
1068
|
+
}
|
|
1069
|
+
console.log('[PerfettoSqlSkill] analyzeStartupFromSlices found', queryResult.rows.length, 'events');
|
|
1070
|
+
// 转换为对象并生成摘要
|
|
1071
|
+
const events = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
1072
|
+
const summary = this.formatStartupEventsSummary(events);
|
|
1073
|
+
return {
|
|
1074
|
+
analysisType: 'startup',
|
|
1075
|
+
sql,
|
|
1076
|
+
rows: queryResult.rows,
|
|
1077
|
+
rowCount: queryResult.rows.length,
|
|
1078
|
+
summary,
|
|
1079
|
+
details: {
|
|
1080
|
+
method: 'slice_based_analysis',
|
|
1081
|
+
events: events.slice(0, 20), // 前 20 个事件
|
|
1082
|
+
},
|
|
1083
|
+
};
|
|
1084
|
+
}
|
|
1085
|
+
/**
|
|
1086
|
+
* Analyze app startup with detailed breakdown
|
|
1087
|
+
* Includes: slice durations, CPU core distribution, frequency, thread blocking
|
|
1088
|
+
*/
|
|
1089
|
+
async analyzeStartupDetailed(traceId, packageName) {
|
|
1090
|
+
console.log('[PerfettoSqlSkill] analyzeStartupDetailed called for package:', packageName);
|
|
1091
|
+
// Include startup modules
|
|
1092
|
+
try {
|
|
1093
|
+
await this.traceProcessor.query(traceId, 'INCLUDE PERFETTO MODULE android.startup.startups;');
|
|
1094
|
+
}
|
|
1095
|
+
catch (e) {
|
|
1096
|
+
console.log('[PerfettoSqlSkill] startups module not available');
|
|
1097
|
+
}
|
|
1098
|
+
// 1. First, get all startups from android_startups table
|
|
1099
|
+
let whereClause = '';
|
|
1100
|
+
if (packageName) {
|
|
1101
|
+
whereClause = `WHERE (package GLOB '${packageName}*' OR package GLOB '*${packageName.split('.').pop()}*')`;
|
|
1102
|
+
}
|
|
1103
|
+
const startupsSql = `
|
|
1104
|
+
SELECT
|
|
1105
|
+
startup_id,
|
|
1106
|
+
ts,
|
|
1107
|
+
ts + dur as ts_end,
|
|
1108
|
+
ts / 1e6 as ts_ms,
|
|
1109
|
+
dur / 1e6 as dur_ms,
|
|
1110
|
+
package,
|
|
1111
|
+
startup_type
|
|
1112
|
+
FROM android_startups
|
|
1113
|
+
${whereClause}
|
|
1114
|
+
ORDER BY ts ASC
|
|
1115
|
+
`;
|
|
1116
|
+
const startupsResult = await this.traceProcessor.query(traceId, startupsSql);
|
|
1117
|
+
if (startupsResult.error || startupsResult.rows.length === 0) {
|
|
1118
|
+
console.log('[PerfettoSqlSkill] No startups found in android_startups table');
|
|
1119
|
+
return {
|
|
1120
|
+
analysisType: 'startup_detailed',
|
|
1121
|
+
sql: startupsSql,
|
|
1122
|
+
rows: [],
|
|
1123
|
+
rowCount: 0,
|
|
1124
|
+
summary: '未找到启动事件。请确保 Trace 包含应用启动数据。',
|
|
1125
|
+
error: startupsResult.error || 'No startup events found',
|
|
1126
|
+
};
|
|
1127
|
+
}
|
|
1128
|
+
const startups = rowsToObjects(startupsResult.columns, startupsResult.rows);
|
|
1129
|
+
console.log(`[PerfettoSqlSkill] Found ${startups.length} startup(s) to analyze`);
|
|
1130
|
+
// Analyze each startup separately
|
|
1131
|
+
const startupAnalyses = [];
|
|
1132
|
+
for (let i = 0; i < startups.length; i++) {
|
|
1133
|
+
const startup = startups[i];
|
|
1134
|
+
const startupStart = startup.ts;
|
|
1135
|
+
const startupEnd = startup.ts_end;
|
|
1136
|
+
const startupPackage = startup.package;
|
|
1137
|
+
const startupType = startup.startup_type;
|
|
1138
|
+
const startupDurMs = startup.dur_ms;
|
|
1139
|
+
console.log(`[PerfettoSqlSkill] Analyzing startup ${i + 1}/${startups.length}: ${startupPackage} (${startupType}), ${startupDurMs.toFixed(2)}ms`);
|
|
1140
|
+
// Get main thread utid for this startup
|
|
1141
|
+
let mainThreadUtid = 0;
|
|
1142
|
+
try {
|
|
1143
|
+
const utidSql = `
|
|
1144
|
+
SELECT t.utid
|
|
1145
|
+
FROM thread t
|
|
1146
|
+
JOIN process p ON t.upid = p.upid
|
|
1147
|
+
WHERE t.name = 'main' AND p.name GLOB '${startupPackage}*'
|
|
1148
|
+
LIMIT 1
|
|
1149
|
+
`;
|
|
1150
|
+
const utidResult = await this.traceProcessor.query(traceId, utidSql);
|
|
1151
|
+
if (utidResult.rows.length > 0) {
|
|
1152
|
+
mainThreadUtid = utidResult.rows[0][0];
|
|
1153
|
+
}
|
|
1154
|
+
}
|
|
1155
|
+
catch (e) {
|
|
1156
|
+
console.log('[PerfettoSqlSkill] Could not find main thread utid');
|
|
1157
|
+
}
|
|
1158
|
+
const analysis = await this.analyzeOneStartup(traceId, startupStart, startupEnd, startupPackage, startupType, startupDurMs, mainThreadUtid, i + 1);
|
|
1159
|
+
startupAnalyses.push(analysis);
|
|
1160
|
+
}
|
|
1161
|
+
// Build final result
|
|
1162
|
+
const results = {
|
|
1163
|
+
analysisType: 'startup_detailed',
|
|
1164
|
+
packageName: packageName || 'all',
|
|
1165
|
+
totalStartups: startups.length,
|
|
1166
|
+
startupAnalyses,
|
|
1167
|
+
sql: startupsSql,
|
|
1168
|
+
rowCount: startups.length,
|
|
1169
|
+
};
|
|
1170
|
+
results.summary = this.formatMultiStartupSummary(startupAnalyses);
|
|
1171
|
+
return results;
|
|
1172
|
+
}
|
|
1173
|
+
/**
|
|
1174
|
+
* Analyze a single startup event with all detailed metrics
|
|
1175
|
+
*/
|
|
1176
|
+
async analyzeOneStartup(traceId, startupStart, startupEnd, packageName, startupType, durationMs, mainThreadUtid, startupIndex) {
|
|
1177
|
+
const sections = {};
|
|
1178
|
+
// Basic info
|
|
1179
|
+
sections.basicInfo = {
|
|
1180
|
+
title: `启动 #${startupIndex} 基本信息`,
|
|
1181
|
+
data: {
|
|
1182
|
+
packageName,
|
|
1183
|
+
startupType,
|
|
1184
|
+
durationMs: durationMs.toFixed(2),
|
|
1185
|
+
startTimeNs: startupStart,
|
|
1186
|
+
endTimeNs: startupEnd,
|
|
1187
|
+
}
|
|
1188
|
+
};
|
|
1189
|
+
// 2. Get top slices by duration during startup
|
|
1190
|
+
try {
|
|
1191
|
+
const topSlicesSql = `
|
|
1192
|
+
SELECT
|
|
1193
|
+
s.name as slice_name,
|
|
1194
|
+
s.dur / 1e6 as dur_ms,
|
|
1195
|
+
(s.ts - ${startupStart}) / 1e6 as relative_ts_ms,
|
|
1196
|
+
t.name as thread_name,
|
|
1197
|
+
s.depth
|
|
1198
|
+
FROM slice s
|
|
1199
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
1200
|
+
JOIN thread t ON tt.utid = t.utid
|
|
1201
|
+
JOIN process p ON t.upid = p.upid
|
|
1202
|
+
WHERE s.dur > 0
|
|
1203
|
+
AND p.name GLOB '${packageName}*'
|
|
1204
|
+
AND s.ts >= ${startupStart} AND s.ts <= ${startupEnd}
|
|
1205
|
+
ORDER BY s.dur DESC
|
|
1206
|
+
LIMIT 50
|
|
1207
|
+
`;
|
|
1208
|
+
const topSlicesResult = await this.traceProcessor.query(traceId, topSlicesSql);
|
|
1209
|
+
if (!topSlicesResult.error && topSlicesResult.rows.length > 0) {
|
|
1210
|
+
sections.topSlices = {
|
|
1211
|
+
title: '启动期间耗时最长的 Slice',
|
|
1212
|
+
columns: topSlicesResult.columns,
|
|
1213
|
+
data: rowsToObjects(topSlicesResult.columns, topSlicesResult.rows),
|
|
1214
|
+
sql: topSlicesSql,
|
|
1215
|
+
};
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
catch (e) {
|
|
1219
|
+
console.log('[PerfettoSqlSkill] topSlices query failed:', e);
|
|
1220
|
+
}
|
|
1221
|
+
// 3. CPU Core Distribution (Big vs Little cores) for main thread
|
|
1222
|
+
try {
|
|
1223
|
+
const utidFilter = mainThreadUtid > 0 ? `sched.utid = ${mainThreadUtid}` :
|
|
1224
|
+
`t.name = 'main' AND p.name GLOB '${packageName}*'`;
|
|
1225
|
+
const cpuCoreSql = `
|
|
1226
|
+
WITH ${CPU_TOPOLOGY_CTE}
|
|
1227
|
+
SELECT
|
|
1228
|
+
sched.cpu,
|
|
1229
|
+
COALESCE(ct.core_type, 'unknown') as core_type,
|
|
1230
|
+
SUM(sched.dur) / 1e6 as total_dur_ms,
|
|
1231
|
+
COUNT(*) as slice_count,
|
|
1232
|
+
AVG(sched.dur) / 1e6 as avg_dur_ms
|
|
1233
|
+
FROM sched_slice sched
|
|
1234
|
+
JOIN thread t ON sched.utid = t.utid
|
|
1235
|
+
JOIN process p ON t.upid = p.upid
|
|
1236
|
+
LEFT JOIN cpu_topology ct ON sched.cpu = ct.cpu_id
|
|
1237
|
+
WHERE sched.dur > 0
|
|
1238
|
+
AND ${utidFilter}
|
|
1239
|
+
AND sched.ts >= ${startupStart} AND sched.ts <= ${startupEnd}
|
|
1240
|
+
GROUP BY sched.cpu
|
|
1241
|
+
ORDER BY total_dur_ms DESC
|
|
1242
|
+
`;
|
|
1243
|
+
const cpuCoreResult = await this.traceProcessor.query(traceId, cpuCoreSql);
|
|
1244
|
+
if (!cpuCoreResult.error && cpuCoreResult.rows.length > 0) {
|
|
1245
|
+
const coreData = rowsToObjects(cpuCoreResult.columns, cpuCoreResult.rows);
|
|
1246
|
+
// Calculate big vs little ratio
|
|
1247
|
+
let bigCoreTime = 0;
|
|
1248
|
+
let littleCoreTime = 0;
|
|
1249
|
+
coreData.forEach((row) => {
|
|
1250
|
+
if (['prime', 'big', 'medium'].includes(row.core_type))
|
|
1251
|
+
bigCoreTime += row.total_dur_ms || 0;
|
|
1252
|
+
else if (row.core_type === 'little')
|
|
1253
|
+
littleCoreTime += row.total_dur_ms || 0;
|
|
1254
|
+
});
|
|
1255
|
+
const totalCoreTime = bigCoreTime + littleCoreTime;
|
|
1256
|
+
sections.cpuCoreDistribution = {
|
|
1257
|
+
title: 'CPU 大小核分布',
|
|
1258
|
+
data: coreData,
|
|
1259
|
+
summary: {
|
|
1260
|
+
bigCoreTime: bigCoreTime.toFixed(2),
|
|
1261
|
+
littleCoreTime: littleCoreTime.toFixed(2),
|
|
1262
|
+
bigCorePercent: totalCoreTime > 0 ? ((bigCoreTime / totalCoreTime) * 100).toFixed(1) : '0',
|
|
1263
|
+
littleCorePercent: totalCoreTime > 0 ? ((littleCoreTime / totalCoreTime) * 100).toFixed(1) : '0',
|
|
1264
|
+
},
|
|
1265
|
+
sql: cpuCoreSql,
|
|
1266
|
+
};
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
catch (e) {
|
|
1270
|
+
console.log('[PerfettoSqlSkill] cpuCore query failed:', e);
|
|
1271
|
+
}
|
|
1272
|
+
// 4. CPU Frequency during startup
|
|
1273
|
+
try {
|
|
1274
|
+
const cpuFreqSql = `
|
|
1275
|
+
WITH ${CPU_TOPOLOGY_CTE}
|
|
1276
|
+
SELECT
|
|
1277
|
+
cct.cpu,
|
|
1278
|
+
COALESCE(ct.core_type, 'unknown') as core_type,
|
|
1279
|
+
CAST(AVG(value) AS INTEGER) / 1000 as avg_freq_mhz,
|
|
1280
|
+
CAST(MAX(value) AS INTEGER) / 1000 as max_freq_mhz,
|
|
1281
|
+
CAST(MIN(value) AS INTEGER) / 1000 as min_freq_mhz
|
|
1282
|
+
FROM counter c
|
|
1283
|
+
JOIN cpu_counter_track cct ON c.track_id = cct.id
|
|
1284
|
+
LEFT JOIN cpu_topology ct ON cct.cpu = ct.cpu_id
|
|
1285
|
+
WHERE cct.name = 'cpufreq'
|
|
1286
|
+
AND c.ts >= ${startupStart} AND c.ts <= ${startupEnd}
|
|
1287
|
+
GROUP BY cct.cpu, core_type
|
|
1288
|
+
ORDER BY cct.cpu
|
|
1289
|
+
`;
|
|
1290
|
+
const cpuFreqResult = await this.traceProcessor.query(traceId, cpuFreqSql);
|
|
1291
|
+
if (!cpuFreqResult.error && cpuFreqResult.rows.length > 0) {
|
|
1292
|
+
const freqData = rowsToObjects(cpuFreqResult.columns, cpuFreqResult.rows);
|
|
1293
|
+
// Calculate average across big and little cores
|
|
1294
|
+
let bigCoreAvgFreq = 0;
|
|
1295
|
+
let littleCoreAvgFreq = 0;
|
|
1296
|
+
let bigCount = 0;
|
|
1297
|
+
let littleCount = 0;
|
|
1298
|
+
freqData.forEach((row) => {
|
|
1299
|
+
const coreType = row.core_type;
|
|
1300
|
+
const avgFreq = row.avg_freq_mhz || 0;
|
|
1301
|
+
if (['prime', 'big', 'medium'].includes(coreType)) {
|
|
1302
|
+
bigCoreAvgFreq += avgFreq;
|
|
1303
|
+
bigCount++;
|
|
1304
|
+
}
|
|
1305
|
+
else if (coreType === 'little') {
|
|
1306
|
+
littleCoreAvgFreq += avgFreq;
|
|
1307
|
+
littleCount++;
|
|
1308
|
+
}
|
|
1309
|
+
});
|
|
1310
|
+
sections.cpuFrequency = {
|
|
1311
|
+
title: 'CPU 频率信息',
|
|
1312
|
+
data: freqData,
|
|
1313
|
+
summary: {
|
|
1314
|
+
bigCoreAvgFreq: bigCount > 0 ? (bigCoreAvgFreq / bigCount).toFixed(0) : 'N/A',
|
|
1315
|
+
littleCoreAvgFreq: littleCount > 0 ? (littleCoreAvgFreq / littleCount).toFixed(0) : 'N/A',
|
|
1316
|
+
},
|
|
1317
|
+
sql: cpuFreqSql,
|
|
1318
|
+
};
|
|
1319
|
+
}
|
|
1320
|
+
}
|
|
1321
|
+
catch (e) {
|
|
1322
|
+
console.log('[PerfettoSqlSkill] cpuFreq query failed:', e);
|
|
1323
|
+
}
|
|
1324
|
+
// 5. Main Thread State Analysis (Running/Runnable/Sleeping breakdown)
|
|
1325
|
+
try {
|
|
1326
|
+
const utidFilter = mainThreadUtid > 0 ? `ts.utid = ${mainThreadUtid}` :
|
|
1327
|
+
`t.name = 'main' AND p.name GLOB '${packageName}*'`;
|
|
1328
|
+
const threadStateSql = `
|
|
1329
|
+
SELECT
|
|
1330
|
+
ts.state,
|
|
1331
|
+
CASE ts.state
|
|
1332
|
+
WHEN 'Running' THEN 'Running (执行中)'
|
|
1333
|
+
WHEN 'R' THEN 'Runnable (可运行)'
|
|
1334
|
+
WHEN 'R+' THEN 'Runnable (可运行,抢占)'
|
|
1335
|
+
WHEN 'S' THEN 'Sleeping (睡眠)'
|
|
1336
|
+
WHEN 'D' THEN 'Uninterruptible Sleep (不可中断睡眠)'
|
|
1337
|
+
WHEN 'I' THEN 'Idle (空闲)'
|
|
1338
|
+
ELSE ts.state
|
|
1339
|
+
END as state_desc,
|
|
1340
|
+
SUM(ts.dur) / 1e6 as total_dur_ms,
|
|
1341
|
+
COUNT(*) as count,
|
|
1342
|
+
(SUM(ts.dur) * 100.0) / ${startupEnd - startupStart} as percent
|
|
1343
|
+
FROM thread_state ts
|
|
1344
|
+
JOIN thread t ON ts.utid = t.utid
|
|
1345
|
+
JOIN process p ON t.upid = p.upid
|
|
1346
|
+
WHERE ${utidFilter}
|
|
1347
|
+
AND ts.ts >= ${startupStart} AND ts.ts <= ${startupEnd}
|
|
1348
|
+
GROUP BY ts.state
|
|
1349
|
+
ORDER BY total_dur_ms DESC
|
|
1350
|
+
`;
|
|
1351
|
+
const threadStateResult = await this.traceProcessor.query(traceId, threadStateSql);
|
|
1352
|
+
if (!threadStateResult.error && threadStateResult.rows.length > 0) {
|
|
1353
|
+
sections.threadStateDistribution = {
|
|
1354
|
+
title: '主线程状态分布',
|
|
1355
|
+
data: rowsToObjects(threadStateResult.columns, threadStateResult.rows),
|
|
1356
|
+
sql: threadStateSql,
|
|
1357
|
+
};
|
|
1358
|
+
}
|
|
1359
|
+
}
|
|
1360
|
+
catch (e) {
|
|
1361
|
+
console.log('[PerfettoSqlSkill] threadState query failed:', e);
|
|
1362
|
+
}
|
|
1363
|
+
// 6. Thread Blocking Analysis (detailed)
|
|
1364
|
+
try {
|
|
1365
|
+
const utidFilter = mainThreadUtid > 0 ? `ts.utid = ${mainThreadUtid}` : '';
|
|
1366
|
+
const blockingSql = `
|
|
1367
|
+
SELECT
|
|
1368
|
+
ts.state,
|
|
1369
|
+
ts.blocked_function,
|
|
1370
|
+
ts.dur / 1e6 as dur_ms,
|
|
1371
|
+
(ts.ts - ${startupStart}) / 1e6 as relative_ts_ms,
|
|
1372
|
+
CASE
|
|
1373
|
+
WHEN ts.blocked_function GLOB '*binder*' THEN 'binder'
|
|
1374
|
+
WHEN ts.blocked_function GLOB '*futex*' OR ts.blocked_function GLOB '*mutex*' THEN 'lock_contention'
|
|
1375
|
+
WHEN ts.blocked_function GLOB '*epoll*' OR ts.blocked_function GLOB '*poll*' THEN 'io_wait'
|
|
1376
|
+
WHEN ts.blocked_function GLOB '*sleep*' THEN 'sleep'
|
|
1377
|
+
WHEN ts.blocked_function GLOB '*SurfaceFlinger*' OR ts.blocked_function GLOB '*dequeue*' THEN 'surfaceflinger'
|
|
1378
|
+
WHEN ts.blocked_function GLOB '*GC*' OR ts.blocked_function GLOB '*art::gc*' THEN 'gc'
|
|
1379
|
+
ELSE 'other'
|
|
1380
|
+
END as block_type
|
|
1381
|
+
FROM thread_state ts
|
|
1382
|
+
JOIN thread t ON ts.utid = t.utid
|
|
1383
|
+
JOIN process p ON t.upid = p.upid
|
|
1384
|
+
WHERE ts.state IN ('S', 'D', 'I')
|
|
1385
|
+
AND ts.dur > 1000000
|
|
1386
|
+
${utidFilter ? `AND ${utidFilter}` : `AND t.name = 'main' AND p.name GLOB '${packageName}*'`}
|
|
1387
|
+
AND ts.ts >= ${startupStart} AND ts.ts <= ${startupEnd}
|
|
1388
|
+
ORDER BY ts.dur DESC
|
|
1389
|
+
LIMIT 50
|
|
1390
|
+
`;
|
|
1391
|
+
const blockingResult = await this.traceProcessor.query(traceId, blockingSql);
|
|
1392
|
+
if (!blockingResult.error && blockingResult.rows.length > 0) {
|
|
1393
|
+
const blockData = rowsToObjects(blockingResult.columns, blockingResult.rows);
|
|
1394
|
+
// Summarize by block type
|
|
1395
|
+
const blockSummary = {};
|
|
1396
|
+
blockData.forEach((row) => {
|
|
1397
|
+
const type = row.block_type || 'other';
|
|
1398
|
+
if (!blockSummary[type]) {
|
|
1399
|
+
blockSummary[type] = { count: 0, totalMs: 0 };
|
|
1400
|
+
}
|
|
1401
|
+
blockSummary[type].count++;
|
|
1402
|
+
blockSummary[type].totalMs += row.dur_ms || 0;
|
|
1403
|
+
});
|
|
1404
|
+
sections.threadBlocking = {
|
|
1405
|
+
title: '主线程阻塞分析',
|
|
1406
|
+
data: blockData,
|
|
1407
|
+
summary: blockSummary,
|
|
1408
|
+
sql: blockingSql,
|
|
1409
|
+
};
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1412
|
+
catch (e) {
|
|
1413
|
+
console.log('[PerfettoSqlSkill] blocking query failed:', e);
|
|
1414
|
+
}
|
|
1415
|
+
// 7. Binder transactions during startup
|
|
1416
|
+
try {
|
|
1417
|
+
const binderTxnSql = `
|
|
1418
|
+
SELECT
|
|
1419
|
+
client_process,
|
|
1420
|
+
server_process,
|
|
1421
|
+
client_dur / 1e6 as client_dur_ms,
|
|
1422
|
+
server_dur / 1e6 as server_dur_ms,
|
|
1423
|
+
(client_ts - ${startupStart}) / 1e6 as relative_ts_ms
|
|
1424
|
+
FROM android_binder_txns
|
|
1425
|
+
WHERE client_dur > 1000000
|
|
1426
|
+
AND (client_process GLOB '${packageName}*' OR server_process GLOB '${packageName}*')
|
|
1427
|
+
AND client_ts >= ${startupStart} AND client_ts <= ${startupEnd}
|
|
1428
|
+
ORDER BY client_dur DESC
|
|
1429
|
+
LIMIT 30
|
|
1430
|
+
`;
|
|
1431
|
+
const binderResult = await this.traceProcessor.query(traceId, binderTxnSql);
|
|
1432
|
+
if (!binderResult.error && binderResult.rows.length > 0) {
|
|
1433
|
+
sections.binderTransactions = {
|
|
1434
|
+
title: 'Binder 事务分析',
|
|
1435
|
+
data: rowsToObjects(binderResult.columns, binderResult.rows),
|
|
1436
|
+
sql: binderTxnSql,
|
|
1437
|
+
};
|
|
1438
|
+
}
|
|
1439
|
+
}
|
|
1440
|
+
catch (e) {
|
|
1441
|
+
console.log('[PerfettoSqlSkill] binder query failed (table may not exist):', e);
|
|
1442
|
+
}
|
|
1443
|
+
// 8. Main thread CPU utilization
|
|
1444
|
+
try {
|
|
1445
|
+
const utidFilter = mainThreadUtid > 0 ? `sched.utid = ${mainThreadUtid}` :
|
|
1446
|
+
`t.name = 'main' AND p.name GLOB '${packageName}*'`;
|
|
1447
|
+
const cpuUtilSql = `
|
|
1448
|
+
SELECT
|
|
1449
|
+
SUM(sched.dur) / 1e6 as running_time_ms,
|
|
1450
|
+
${durationMs.toFixed(2)} as total_time_ms,
|
|
1451
|
+
(SUM(sched.dur) * 100.0) / ${startupEnd - startupStart} as cpu_utilization_percent
|
|
1452
|
+
FROM sched_slice sched
|
|
1453
|
+
JOIN thread t ON sched.utid = t.utid
|
|
1454
|
+
JOIN process p ON t.upid = p.upid
|
|
1455
|
+
WHERE ${utidFilter}
|
|
1456
|
+
AND sched.ts >= ${startupStart} AND sched.ts <= ${startupEnd}
|
|
1457
|
+
`;
|
|
1458
|
+
const cpuUtilResult = await this.traceProcessor.query(traceId, cpuUtilSql);
|
|
1459
|
+
if (!cpuUtilResult.error && cpuUtilResult.rows.length > 0) {
|
|
1460
|
+
const utilData = rowsToObjects(cpuUtilResult.columns, cpuUtilResult.rows);
|
|
1461
|
+
sections.cpuUtilization = {
|
|
1462
|
+
title: '主线程 CPU 利用率',
|
|
1463
|
+
data: utilData[0],
|
|
1464
|
+
sql: cpuUtilSql,
|
|
1465
|
+
};
|
|
1466
|
+
}
|
|
1467
|
+
}
|
|
1468
|
+
catch (e) {
|
|
1469
|
+
console.log('[PerfettoSqlSkill] cpuUtil query failed:', e);
|
|
1470
|
+
}
|
|
1471
|
+
// 9. GC Events during startup
|
|
1472
|
+
try {
|
|
1473
|
+
const gcSql = `
|
|
1474
|
+
SELECT
|
|
1475
|
+
s.name as gc_type,
|
|
1476
|
+
s.dur / 1e6 as dur_ms,
|
|
1477
|
+
(s.ts - ${startupStart}) / 1e6 as relative_ts_ms
|
|
1478
|
+
FROM slice s
|
|
1479
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
1480
|
+
JOIN thread t ON tt.utid = t.utid
|
|
1481
|
+
JOIN process p ON t.upid = p.upid
|
|
1482
|
+
WHERE p.name GLOB '${packageName}*'
|
|
1483
|
+
AND (s.name GLOB '*GC*' OR s.name GLOB '*garbage*' OR s.name GLOB '*art::gc*')
|
|
1484
|
+
AND s.ts >= ${startupStart} AND s.ts <= ${startupEnd}
|
|
1485
|
+
ORDER BY s.dur DESC
|
|
1486
|
+
`;
|
|
1487
|
+
const gcResult = await this.traceProcessor.query(traceId, gcSql);
|
|
1488
|
+
if (!gcResult.error && gcResult.rows.length > 0) {
|
|
1489
|
+
const gcData = rowsToObjects(gcResult.columns, gcResult.rows);
|
|
1490
|
+
const totalGcTime = gcData.reduce((sum, row) => sum + (row.dur_ms || 0), 0);
|
|
1491
|
+
sections.gcEvents = {
|
|
1492
|
+
title: 'GC 事件',
|
|
1493
|
+
data: gcData,
|
|
1494
|
+
summary: {
|
|
1495
|
+
count: gcData.length,
|
|
1496
|
+
totalTimeMs: totalGcTime.toFixed(2),
|
|
1497
|
+
percentOfStartup: ((totalGcTime / durationMs) * 100).toFixed(1),
|
|
1498
|
+
},
|
|
1499
|
+
sql: gcSql,
|
|
1500
|
+
};
|
|
1501
|
+
}
|
|
1502
|
+
}
|
|
1503
|
+
catch (e) {
|
|
1504
|
+
console.log('[PerfettoSqlSkill] GC query failed:', e);
|
|
1505
|
+
}
|
|
1506
|
+
// 10. Key startup phases breakdown
|
|
1507
|
+
try {
|
|
1508
|
+
const phasesSql = `
|
|
1509
|
+
SELECT
|
|
1510
|
+
s.name as phase_name,
|
|
1511
|
+
s.dur / 1e6 as dur_ms,
|
|
1512
|
+
(s.ts - ${startupStart}) / 1e6 as relative_start_ms,
|
|
1513
|
+
((s.ts + s.dur) - ${startupStart}) / 1e6 as relative_end_ms
|
|
1514
|
+
FROM slice s
|
|
1515
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
1516
|
+
JOIN thread t ON tt.utid = t.utid
|
|
1517
|
+
JOIN process p ON t.upid = p.upid
|
|
1518
|
+
WHERE p.name GLOB '${packageName}*'
|
|
1519
|
+
AND t.name = 'main'
|
|
1520
|
+
AND (s.name GLOB '*bindApplication*'
|
|
1521
|
+
OR s.name GLOB '*activityStart*'
|
|
1522
|
+
OR s.name GLOB '*performCreate*'
|
|
1523
|
+
OR s.name GLOB '*onCreate*'
|
|
1524
|
+
OR s.name GLOB '*performResume*'
|
|
1525
|
+
OR s.name GLOB '*onResume*'
|
|
1526
|
+
OR s.name GLOB '*Choreographer#doFrame*'
|
|
1527
|
+
OR s.name GLOB '*reportFullyDrawn*'
|
|
1528
|
+
OR s.name GLOB '*contentProviderCreate*'
|
|
1529
|
+
OR s.name GLOB '*Application.onCreate*')
|
|
1530
|
+
AND s.ts >= ${startupStart} AND s.ts <= ${startupEnd}
|
|
1531
|
+
ORDER BY s.ts ASC
|
|
1532
|
+
`;
|
|
1533
|
+
const phasesResult = await this.traceProcessor.query(traceId, phasesSql);
|
|
1534
|
+
if (!phasesResult.error && phasesResult.rows.length > 0) {
|
|
1535
|
+
sections.startupPhases = {
|
|
1536
|
+
title: '关键启动阶段',
|
|
1537
|
+
data: rowsToObjects(phasesResult.columns, phasesResult.rows),
|
|
1538
|
+
sql: phasesSql,
|
|
1539
|
+
};
|
|
1540
|
+
}
|
|
1541
|
+
}
|
|
1542
|
+
catch (e) {
|
|
1543
|
+
console.log('[PerfettoSqlSkill] phases query failed:', e);
|
|
1544
|
+
}
|
|
1545
|
+
// Return the complete analysis for this startup
|
|
1546
|
+
return {
|
|
1547
|
+
startupIndex,
|
|
1548
|
+
packageName,
|
|
1549
|
+
startupType,
|
|
1550
|
+
durationMs: durationMs.toFixed(2),
|
|
1551
|
+
sections,
|
|
1552
|
+
summary: this.formatSingleStartupSummary(sections, packageName, startupType, durationMs, startupIndex),
|
|
1553
|
+
};
|
|
1554
|
+
}
|
|
1555
|
+
/**
|
|
1556
|
+
* Format summary for a single startup event
|
|
1557
|
+
*/
|
|
1558
|
+
formatSingleStartupSummary(sections, packageName, startupType, durationMs, startupIndex) {
|
|
1559
|
+
const lines = [`\n========== 启动 #${startupIndex} 详细分析 ==========\n`];
|
|
1560
|
+
// Basic info
|
|
1561
|
+
lines.push('【基础信息】');
|
|
1562
|
+
lines.push(` 包名: ${packageName}`);
|
|
1563
|
+
lines.push(` 启动类型: ${startupType}`);
|
|
1564
|
+
lines.push(` 总耗时: ${durationMs.toFixed(2)}ms`);
|
|
1565
|
+
lines.push('');
|
|
1566
|
+
// Key startup phases
|
|
1567
|
+
if (sections.startupPhases?.data?.length > 0) {
|
|
1568
|
+
lines.push('【关键启动阶段】');
|
|
1569
|
+
sections.startupPhases.data.forEach((row) => {
|
|
1570
|
+
lines.push(` ${row.phase_name}: ${row.dur_ms?.toFixed(2) ?? 'N/A'}ms (@ ${row.relative_start_ms?.toFixed(1) ?? 'N/A'}ms)`);
|
|
1571
|
+
});
|
|
1572
|
+
lines.push('');
|
|
1573
|
+
}
|
|
1574
|
+
// Top Slices
|
|
1575
|
+
if (sections.topSlices?.data?.length > 0) {
|
|
1576
|
+
lines.push('【耗时最长的操作 (Top 10)】');
|
|
1577
|
+
sections.topSlices.data.slice(0, 10).forEach((row, idx) => {
|
|
1578
|
+
lines.push(` ${idx + 1}. ${row.slice_name}: ${row.dur_ms?.toFixed(2) ?? 'N/A'}ms (${row.thread_name})`);
|
|
1579
|
+
});
|
|
1580
|
+
lines.push('');
|
|
1581
|
+
}
|
|
1582
|
+
// Thread State Distribution
|
|
1583
|
+
if (sections.threadStateDistribution?.data?.length > 0) {
|
|
1584
|
+
lines.push('【主线程状态分布】');
|
|
1585
|
+
sections.threadStateDistribution.data.forEach((row) => {
|
|
1586
|
+
lines.push(` ${row.state_desc || row.state}: ${row.total_dur_ms?.toFixed(2) ?? 'N/A'}ms (${row.percent?.toFixed(1) ?? 'N/A'}%)`);
|
|
1587
|
+
});
|
|
1588
|
+
lines.push('');
|
|
1589
|
+
}
|
|
1590
|
+
// CPU Core Distribution
|
|
1591
|
+
if (sections.cpuCoreDistribution?.summary) {
|
|
1592
|
+
const s = sections.cpuCoreDistribution.summary;
|
|
1593
|
+
lines.push('【CPU 大小核分布】');
|
|
1594
|
+
lines.push(` 大核运行时间: ${s.bigCoreTime}ms (${s.bigCorePercent}%)`);
|
|
1595
|
+
lines.push(` 小核运行时间: ${s.littleCoreTime}ms (${s.littleCorePercent}%)`);
|
|
1596
|
+
lines.push('');
|
|
1597
|
+
}
|
|
1598
|
+
// CPU Frequency
|
|
1599
|
+
if (sections.cpuFrequency?.summary) {
|
|
1600
|
+
const s = sections.cpuFrequency.summary;
|
|
1601
|
+
lines.push('【CPU 平均频率】');
|
|
1602
|
+
lines.push(` 大核平均频率: ${s.bigCoreAvgFreq} MHz`);
|
|
1603
|
+
lines.push(` 小核平均频率: ${s.littleCoreAvgFreq} MHz`);
|
|
1604
|
+
lines.push('');
|
|
1605
|
+
}
|
|
1606
|
+
// CPU Utilization
|
|
1607
|
+
if (sections.cpuUtilization?.data) {
|
|
1608
|
+
const d = sections.cpuUtilization.data;
|
|
1609
|
+
lines.push('【主线程 CPU 利用率】');
|
|
1610
|
+
lines.push(` 运行时间: ${d.running_time_ms?.toFixed(2) ?? 'N/A'}ms`);
|
|
1611
|
+
lines.push(` CPU 利用率: ${d.cpu_utilization_percent?.toFixed(1) ?? 'N/A'}%`);
|
|
1612
|
+
lines.push('');
|
|
1613
|
+
}
|
|
1614
|
+
// GC Events
|
|
1615
|
+
if (sections.gcEvents?.summary) {
|
|
1616
|
+
const s = sections.gcEvents.summary;
|
|
1617
|
+
lines.push('【GC 事件】');
|
|
1618
|
+
lines.push(` GC 次数: ${s.count}`);
|
|
1619
|
+
lines.push(` GC 总耗时: ${s.totalTimeMs}ms (占启动 ${s.percentOfStartup}%)`);
|
|
1620
|
+
lines.push('');
|
|
1621
|
+
}
|
|
1622
|
+
// Thread Blocking Summary
|
|
1623
|
+
if (sections.threadBlocking?.summary) {
|
|
1624
|
+
const s = sections.threadBlocking.summary;
|
|
1625
|
+
lines.push('【主线程阻塞分析】');
|
|
1626
|
+
Object.entries(s).forEach(([type, info]) => {
|
|
1627
|
+
lines.push(` ${type}: ${info.count}次, 总计 ${info.totalMs.toFixed(2)}ms`);
|
|
1628
|
+
});
|
|
1629
|
+
lines.push('');
|
|
1630
|
+
// Top blocking events
|
|
1631
|
+
if (sections.threadBlocking.data?.length > 0) {
|
|
1632
|
+
lines.push(' Top 5 阻塞事件:');
|
|
1633
|
+
sections.threadBlocking.data.slice(0, 5).forEach((row, idx) => {
|
|
1634
|
+
const func = row.blocked_function || 'unknown';
|
|
1635
|
+
const shortFunc = func.length > 50 ? func.substring(0, 50) + '...' : func;
|
|
1636
|
+
lines.push(` ${idx + 1}. [${row.block_type}] ${shortFunc}: ${row.dur_ms?.toFixed(2) ?? 'N/A'}ms (@ ${row.relative_ts_ms?.toFixed(1)}ms)`);
|
|
1637
|
+
});
|
|
1638
|
+
}
|
|
1639
|
+
lines.push('');
|
|
1640
|
+
}
|
|
1641
|
+
// Binder transactions
|
|
1642
|
+
if (sections.binderTransactions?.data?.length > 0) {
|
|
1643
|
+
lines.push('【Binder 事务 (耗时最长)】');
|
|
1644
|
+
sections.binderTransactions.data.slice(0, 5).forEach((row, idx) => {
|
|
1645
|
+
lines.push(` ${idx + 1}. ${row.client_process} -> ${row.server_process}: ${row.client_dur_ms?.toFixed(2) ?? 'N/A'}ms`);
|
|
1646
|
+
});
|
|
1647
|
+
lines.push('');
|
|
1648
|
+
}
|
|
1649
|
+
return lines.join('\n');
|
|
1650
|
+
}
|
|
1651
|
+
/**
|
|
1652
|
+
* Format summary for multiple startup events
|
|
1653
|
+
*/
|
|
1654
|
+
formatMultiStartupSummary(startupAnalyses) {
|
|
1655
|
+
if (startupAnalyses.length === 0) {
|
|
1656
|
+
return '未找到启动事件';
|
|
1657
|
+
}
|
|
1658
|
+
const lines = ['╔══════════════════════════════════════════════════════════════╗'];
|
|
1659
|
+
lines.push(`║ 详细启动分析报告 (共 ${startupAnalyses.length} 个启动事件) ║`);
|
|
1660
|
+
lines.push('╚══════════════════════════════════════════════════════════════╝\n');
|
|
1661
|
+
// Quick overview
|
|
1662
|
+
lines.push('【启动事件概览】');
|
|
1663
|
+
startupAnalyses.forEach((analysis) => {
|
|
1664
|
+
const typeLabel = analysis.startupType === 'cold' ? '冷启动' :
|
|
1665
|
+
analysis.startupType === 'warm' ? '温启动' :
|
|
1666
|
+
analysis.startupType === 'hot' ? '热启动' : analysis.startupType;
|
|
1667
|
+
lines.push(` #${analysis.startupIndex}: ${analysis.packageName} (${typeLabel}) - ${analysis.durationMs}ms`);
|
|
1668
|
+
});
|
|
1669
|
+
lines.push('');
|
|
1670
|
+
// Detailed analysis for each startup
|
|
1671
|
+
startupAnalyses.forEach((analysis) => {
|
|
1672
|
+
lines.push(analysis.summary);
|
|
1673
|
+
});
|
|
1674
|
+
return lines.join('\n');
|
|
1675
|
+
}
|
|
1676
|
+
/**
|
|
1677
|
+
* 格式化 android_startup_processes 查询结果
|
|
1678
|
+
*/
|
|
1679
|
+
formatStartupProcessesSummary(startups) {
|
|
1680
|
+
if (startups.length === 0)
|
|
1681
|
+
return '未找到启动数据';
|
|
1682
|
+
const lines = ['=== 应用启动分析 ===\n'];
|
|
1683
|
+
startups.forEach((s, idx) => {
|
|
1684
|
+
lines.push(`启动 #${idx + 1}:`);
|
|
1685
|
+
lines.push(` 包名: ${s.package || s.process_name || 'unknown'}`);
|
|
1686
|
+
lines.push(` 类型: ${s.startup_type || 'unknown'}`);
|
|
1687
|
+
lines.push(` 耗时: ${s.dur_ms?.toFixed?.(2) ?? s.dur_ms ?? 'N/A'} ms`);
|
|
1688
|
+
lines.push(` 开始时间: ${s.ts_ms?.toFixed?.(2) ?? s.ts_ms ?? 'N/A'} ms\n`);
|
|
1689
|
+
});
|
|
1690
|
+
return lines.join('\n');
|
|
1691
|
+
}
|
|
1692
|
+
/**
|
|
1693
|
+
* 格式化启动事件摘要(从 slice 表查询的数据)
|
|
1694
|
+
*/
|
|
1695
|
+
formatStartupEventsSummary(events) {
|
|
1696
|
+
if (events.length === 0)
|
|
1697
|
+
return '未找到启动事件';
|
|
1698
|
+
const lines = ['=== 应用启动事件分析 ===\n'];
|
|
1699
|
+
// 按进程分组
|
|
1700
|
+
const byProcess = new Map();
|
|
1701
|
+
events.forEach(e => {
|
|
1702
|
+
const proc = e.process_name || 'unknown';
|
|
1703
|
+
if (!byProcess.has(proc))
|
|
1704
|
+
byProcess.set(proc, []);
|
|
1705
|
+
byProcess.get(proc).push(e);
|
|
1706
|
+
});
|
|
1707
|
+
byProcess.forEach((procEvents, procName) => {
|
|
1708
|
+
lines.push(`进程: ${procName}`);
|
|
1709
|
+
lines.push(` 事件数: ${procEvents.length}`);
|
|
1710
|
+
// 找关键生命周期事件
|
|
1711
|
+
const bindApp = procEvents.find(e => e.event_name?.includes('bindApplication'));
|
|
1712
|
+
const actStart = procEvents.find(e => e.event_name?.includes('activityStart'));
|
|
1713
|
+
const onCreate = procEvents.find(e => e.event_name?.includes('performCreate') || e.event_name?.includes('onCreate'));
|
|
1714
|
+
const onResume = procEvents.find(e => e.event_name?.includes('performResume') || e.event_name?.includes('onResume'));
|
|
1715
|
+
const firstFrame = procEvents.find(e => e.event_name?.includes('Choreographer') && e.event_name?.includes('doFrame'));
|
|
1716
|
+
if (bindApp)
|
|
1717
|
+
lines.push(` bindApplication: ${bindApp.dur_ms?.toFixed?.(2) ?? 'N/A'} ms`);
|
|
1718
|
+
if (actStart)
|
|
1719
|
+
lines.push(` activityStart: ${actStart.dur_ms?.toFixed?.(2) ?? 'N/A'} ms`);
|
|
1720
|
+
if (onCreate)
|
|
1721
|
+
lines.push(` onCreate/performCreate: ${onCreate.dur_ms?.toFixed?.(2) ?? 'N/A'} ms`);
|
|
1722
|
+
if (onResume)
|
|
1723
|
+
lines.push(` onResume/performResume: ${onResume.dur_ms?.toFixed?.(2) ?? 'N/A'} ms`);
|
|
1724
|
+
if (firstFrame)
|
|
1725
|
+
lines.push(` 首帧 (Choreographer): ${firstFrame.dur_ms?.toFixed?.(2) ?? 'N/A'} ms`);
|
|
1726
|
+
// 计算总耗时(从最早到最晚事件)
|
|
1727
|
+
if (procEvents.length > 1) {
|
|
1728
|
+
const sorted = [...procEvents].sort((a, b) => (a.ts_ms || 0) - (b.ts_ms || 0));
|
|
1729
|
+
const first = sorted[0];
|
|
1730
|
+
const last = sorted[sorted.length - 1];
|
|
1731
|
+
const totalDur = (last.ts_ms || 0) + (last.dur_ms || 0) - (first.ts_ms || 0);
|
|
1732
|
+
lines.push(` 总耗时(估算): ${totalDur.toFixed(2)} ms`);
|
|
1733
|
+
}
|
|
1734
|
+
lines.push('');
|
|
1735
|
+
});
|
|
1736
|
+
// 添加关键事件列表
|
|
1737
|
+
lines.push('关键启动事件:');
|
|
1738
|
+
const keyEvents = events.filter(e => e.event_name?.includes('bindApplication') ||
|
|
1739
|
+
e.event_name?.includes('activityStart') ||
|
|
1740
|
+
e.event_name?.includes('performCreate') ||
|
|
1741
|
+
e.event_name?.includes('performResume') ||
|
|
1742
|
+
e.event_name?.includes('inflate')).slice(0, 10);
|
|
1743
|
+
keyEvents.forEach(e => {
|
|
1744
|
+
lines.push(` - ${e.event_name}: ${e.dur_ms?.toFixed?.(2) ?? 'N/A'} ms @ ${e.ts_ms?.toFixed?.(2) ?? 'N/A'} ms`);
|
|
1745
|
+
});
|
|
1746
|
+
return lines.join('\n');
|
|
1747
|
+
}
|
|
1748
|
+
// 保留原有的 android_startups 查询逻辑(作为备用)
|
|
1749
|
+
async analyzeStartupLegacy(traceId, packageName) {
|
|
1750
|
+
let whereClause = '';
|
|
1751
|
+
if (packageName) {
|
|
1752
|
+
whereClause = `WHERE package GLOB '${packageName}*'`;
|
|
1753
|
+
}
|
|
1754
|
+
const sql = `
|
|
1755
|
+
SELECT
|
|
1756
|
+
startup_id,
|
|
1757
|
+
ts / 1e6 as ts_ms,
|
|
1758
|
+
dur / 1e6 as dur_ms,
|
|
1759
|
+
package,
|
|
1760
|
+
startup_type
|
|
1761
|
+
FROM android_startups
|
|
1762
|
+
${whereClause}
|
|
1763
|
+
ORDER BY ts ASC
|
|
1764
|
+
`;
|
|
1765
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
1766
|
+
if (queryResult.error) {
|
|
1767
|
+
// android_startups table might not exist, try fallback
|
|
1768
|
+
console.log('[PerfettoSqlSkill] android_startups query failed, trying fallback...');
|
|
1769
|
+
return this.analyzeStartupFallback(traceId, packageName);
|
|
1770
|
+
}
|
|
1771
|
+
// If no results from android_startups, try fallback approach
|
|
1772
|
+
if (queryResult.rows.length === 0) {
|
|
1773
|
+
console.log('[PerfettoSqlSkill] android_startups returned 0 rows, trying fallback...');
|
|
1774
|
+
return this.analyzeStartupFallback(traceId, packageName);
|
|
1775
|
+
}
|
|
1776
|
+
// Convert rows (arrays) to objects for easier property access
|
|
1777
|
+
const startupObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
1778
|
+
const summary = this.formatStartupSummary(startupObjects);
|
|
1779
|
+
return {
|
|
1780
|
+
analysisType: 'startup',
|
|
1781
|
+
sql,
|
|
1782
|
+
rows: queryResult.rows,
|
|
1783
|
+
rowCount: queryResult.rows.length,
|
|
1784
|
+
summary,
|
|
1785
|
+
metrics: {
|
|
1786
|
+
totalStartups: queryResult.rows.length,
|
|
1787
|
+
coldStarts: startupObjects.filter((s) => s.startup_type === 'cold').length,
|
|
1788
|
+
warmStarts: startupObjects.filter((s) => s.startup_type === 'warm').length,
|
|
1789
|
+
hotStarts: startupObjects.filter((s) => s.startup_type === 'hot').length,
|
|
1790
|
+
},
|
|
1791
|
+
};
|
|
1792
|
+
}
|
|
1793
|
+
/**
|
|
1794
|
+
* Fallback startup analysis when android_startups is not available
|
|
1795
|
+
* Uses slice table to find activity lifecycle events
|
|
1796
|
+
*/
|
|
1797
|
+
async analyzeStartupFallback(traceId, packageName) {
|
|
1798
|
+
// Try to find activity launch slices
|
|
1799
|
+
let processFilter = '';
|
|
1800
|
+
if (packageName) {
|
|
1801
|
+
processFilter = `AND process.name GLOB '${packageName}*'`;
|
|
1802
|
+
}
|
|
1803
|
+
// Look for common activity launch patterns
|
|
1804
|
+
// IMPORTANT: Use ASC to get earliest (startup) events first, not latest!
|
|
1805
|
+
const fallbackSql = `
|
|
1806
|
+
SELECT
|
|
1807
|
+
slice.name,
|
|
1808
|
+
slice.ts / 1e6 as ts_ms,
|
|
1809
|
+
slice.dur / 1e6 as dur_ms,
|
|
1810
|
+
process.name as process_name,
|
|
1811
|
+
thread.name as thread_name
|
|
1812
|
+
FROM slice
|
|
1813
|
+
JOIN thread_track ON slice.track_id = thread_track.id
|
|
1814
|
+
JOIN thread USING (utid)
|
|
1815
|
+
JOIN process USING (upid)
|
|
1816
|
+
WHERE (
|
|
1817
|
+
slice.name GLOB '*launching*'
|
|
1818
|
+
OR slice.name GLOB '*activityStart*'
|
|
1819
|
+
OR slice.name GLOB '*ActivityThread*'
|
|
1820
|
+
OR slice.name GLOB '*bindApplication*'
|
|
1821
|
+
OR slice.name GLOB '*Choreographer#doFrame*'
|
|
1822
|
+
OR slice.name = 'inflate'
|
|
1823
|
+
OR slice.name GLOB '*onCreate*'
|
|
1824
|
+
OR slice.name GLOB '*onStart*'
|
|
1825
|
+
OR slice.name GLOB '*onResume*'
|
|
1826
|
+
OR slice.name GLOB '*reportFullyDrawn*'
|
|
1827
|
+
OR slice.name GLOB '*performCreate*'
|
|
1828
|
+
OR slice.name GLOB '*traversal*'
|
|
1829
|
+
OR slice.name GLOB '*measure*'
|
|
1830
|
+
OR slice.name GLOB '*layout*'
|
|
1831
|
+
OR slice.name GLOB '*draw*'
|
|
1832
|
+
)
|
|
1833
|
+
${processFilter}
|
|
1834
|
+
ORDER BY slice.ts ASC
|
|
1835
|
+
`;
|
|
1836
|
+
const fallbackResult = await this.traceProcessor.query(traceId, fallbackSql);
|
|
1837
|
+
if (fallbackResult.error || fallbackResult.rows.length === 0) {
|
|
1838
|
+
// Try even more generic approach - look for any slow slices on main thread
|
|
1839
|
+
const genericSql = `
|
|
1840
|
+
SELECT
|
|
1841
|
+
slice.name,
|
|
1842
|
+
slice.ts / 1e6 as ts_ms,
|
|
1843
|
+
slice.dur / 1e6 as dur_ms,
|
|
1844
|
+
process.name as process_name,
|
|
1845
|
+
thread.name as thread_name
|
|
1846
|
+
FROM slice
|
|
1847
|
+
JOIN thread_track ON slice.track_id = thread_track.id
|
|
1848
|
+
JOIN thread USING (utid)
|
|
1849
|
+
JOIN process USING (upid)
|
|
1850
|
+
WHERE slice.dur > 10000000 -- > 10ms
|
|
1851
|
+
AND thread.is_main_thread = 1
|
|
1852
|
+
${processFilter}
|
|
1853
|
+
ORDER BY slice.ts ASC
|
|
1854
|
+
`;
|
|
1855
|
+
const genericResult = await this.traceProcessor.query(traceId, genericSql);
|
|
1856
|
+
if (genericResult.error) {
|
|
1857
|
+
return {
|
|
1858
|
+
analysisType: 'startup',
|
|
1859
|
+
sql: genericSql,
|
|
1860
|
+
rows: [],
|
|
1861
|
+
rowCount: 0,
|
|
1862
|
+
summary: `无法分析启动性能。此 trace 可能不包含 Android 应用启动数据。\n\n错误: ${genericResult.error}\n\n建议:\n- 确保 trace 包含应用启动过程\n- 尝试使用 "分析慢函数" 或 "分析主线程" 等其他分析方式`,
|
|
1863
|
+
};
|
|
1864
|
+
}
|
|
1865
|
+
if (genericResult.rows.length === 0) {
|
|
1866
|
+
return {
|
|
1867
|
+
analysisType: 'startup',
|
|
1868
|
+
sql: genericSql,
|
|
1869
|
+
rows: [],
|
|
1870
|
+
rowCount: 0,
|
|
1871
|
+
summary: `此 trace 中未找到启动相关数据。\n\n可能的原因:\n1. Trace 未捕获应用启动过程\n2. Trace 来自非 Android 平台\n3. 应用已经在后台运行\n\n建议:\n- 尝试其他分析类型,如 "分析慢函数" 或 "分析 CPU 使用"`,
|
|
1872
|
+
};
|
|
1873
|
+
}
|
|
1874
|
+
// Found some slow slices - convert to objects for easier access
|
|
1875
|
+
const columns = genericResult.columns;
|
|
1876
|
+
const sliceObjects = rowsToObjects(columns, genericResult.rows);
|
|
1877
|
+
return {
|
|
1878
|
+
analysisType: 'startup',
|
|
1879
|
+
sql: genericSql,
|
|
1880
|
+
rows: genericResult.rows,
|
|
1881
|
+
rowCount: genericResult.rows.length,
|
|
1882
|
+
summary: `未找到标准启动事件,但发现 ${genericResult.rows.length} 个主线程慢操作。\n\n最慢的操作:\n${sliceObjects.slice(0, 5).map((s) => `- ${s.name}: ${s.dur_ms?.toFixed?.(2) ?? s.dur_ms ?? 'N/A'}ms`).join('\n')}`,
|
|
1883
|
+
details: {
|
|
1884
|
+
method: 'fallback_slow_slices',
|
|
1885
|
+
note: 'android_startups 表为空,使用慢操作分析替代',
|
|
1886
|
+
},
|
|
1887
|
+
};
|
|
1888
|
+
}
|
|
1889
|
+
// Found activity launch related slices - convert to objects for easier access
|
|
1890
|
+
const columns = fallbackResult.columns;
|
|
1891
|
+
const sliceObjects = rowsToObjects(columns, fallbackResult.rows);
|
|
1892
|
+
return {
|
|
1893
|
+
analysisType: 'startup',
|
|
1894
|
+
sql: fallbackSql,
|
|
1895
|
+
rows: fallbackResult.rows,
|
|
1896
|
+
rowCount: fallbackResult.rows.length,
|
|
1897
|
+
summary: `找到 ${fallbackResult.rows.length} 个启动相关事件。\n\n主要事件:\n${sliceObjects.slice(0, 5).map((s) => `- ${s.name}: ${s.dur_ms?.toFixed?.(2) ?? s.dur_ms ?? 'N/A'}ms (${s.process_name})`).join('\n')}`,
|
|
1898
|
+
details: {
|
|
1899
|
+
method: 'fallback_activity_slices',
|
|
1900
|
+
note: 'android_startups 表为空,使用 Activity 生命周期事件分析',
|
|
1901
|
+
},
|
|
1902
|
+
};
|
|
1903
|
+
}
|
|
1904
|
+
/**
|
|
1905
|
+
* Analyze scrolling performance with multi-dimensional jank detection
|
|
1906
|
+
*
|
|
1907
|
+
* For Android 12+: Uses FrameTimeline tables (expected_frame_timeline_slice, actual_frame_timeline_slice)
|
|
1908
|
+
* For Android < 12: Falls back to combining Choreographer, RenderThread, SF, and Vsync analysis
|
|
1909
|
+
*
|
|
1910
|
+
* Based on:
|
|
1911
|
+
* - https://perfetto.dev/docs/data-sources/frametimeline
|
|
1912
|
+
* - android_performance.com systrace analysis series
|
|
1913
|
+
*/
|
|
1914
|
+
async analyzeScrolling(traceId, packageName) {
|
|
1915
|
+
// First, check if FrameTimeline tables are available (Android 12+)
|
|
1916
|
+
const frameTimelineCheck = await this.traceProcessor.query(traceId, `
|
|
1917
|
+
SELECT COUNT(*) as count FROM sqlite_master
|
|
1918
|
+
WHERE name IN ('actual_frame_timeline_slice', 'expected_frame_timeline_slice')
|
|
1919
|
+
`);
|
|
1920
|
+
const hasFrameTimeline = frameTimelineCheck.rows &&
|
|
1921
|
+
frameTimelineCheck.rows.length > 0 &&
|
|
1922
|
+
frameTimelineCheck.rows[0][0] >= 2;
|
|
1923
|
+
if (hasFrameTimeline) {
|
|
1924
|
+
return this.analyzeScrollingWithFrameTimeline(traceId, packageName);
|
|
1925
|
+
}
|
|
1926
|
+
else {
|
|
1927
|
+
return this.analyzeScrollingLegacy(traceId, packageName);
|
|
1928
|
+
}
|
|
1929
|
+
}
|
|
1930
|
+
/**
|
|
1931
|
+
* Modern jank detection using FrameTimeline (Android 12+)
|
|
1932
|
+
* Uses actual_frame_timeline_slice and expected_frame_timeline_slice tables
|
|
1933
|
+
*/
|
|
1934
|
+
async analyzeScrollingWithFrameTimeline(traceId, packageName) {
|
|
1935
|
+
let processFilter = '';
|
|
1936
|
+
if (packageName) {
|
|
1937
|
+
processFilter = `AND p.name GLOB '${packageName}*'`;
|
|
1938
|
+
}
|
|
1939
|
+
// FrameTimeline-based jank analysis
|
|
1940
|
+
// This is the official way to detect jank on Android 12+
|
|
1941
|
+
const sql = `
|
|
1942
|
+
WITH frame_timeline AS (
|
|
1943
|
+
SELECT
|
|
1944
|
+
a.id,
|
|
1945
|
+
a.ts,
|
|
1946
|
+
a.dur,
|
|
1947
|
+
a.upid,
|
|
1948
|
+
a.name,
|
|
1949
|
+
a.present_type,
|
|
1950
|
+
a.on_time_finish,
|
|
1951
|
+
a.gpu_composition,
|
|
1952
|
+
a.jank_type,
|
|
1953
|
+
p.name as process_name
|
|
1954
|
+
FROM actual_frame_timeline_slice a
|
|
1955
|
+
JOIN process p ON a.upid = p.upid
|
|
1956
|
+
WHERE 1=1
|
|
1957
|
+
${processFilter}
|
|
1958
|
+
),
|
|
1959
|
+
jank_analysis AS (
|
|
1960
|
+
SELECT
|
|
1961
|
+
*,
|
|
1962
|
+
dur > 16666666 as is_long_frame,
|
|
1963
|
+
CASE
|
|
1964
|
+
WHEN jank_type IS NOT NULL AND jank_type != 'None' THEN 1
|
|
1965
|
+
ELSE 0
|
|
1966
|
+
END as is_jank
|
|
1967
|
+
FROM frame_timeline
|
|
1968
|
+
)
|
|
1969
|
+
SELECT
|
|
1970
|
+
COUNT(*) as total_frames,
|
|
1971
|
+
SUM(is_jank) as jank_frames,
|
|
1972
|
+
SUM(is_long_frame) as long_frames,
|
|
1973
|
+
AVG(dur) / 1e6 as avg_frame_dur_ms,
|
|
1974
|
+
MIN(dur) / 1e6 as min_frame_dur_ms,
|
|
1975
|
+
MAX(dur) / 1e6 as max_frame_dur_ms,
|
|
1976
|
+
SUM(CASE WHEN on_time_finish = 0 THEN 1 ELSE 0 END) as missed_deadline_frames,
|
|
1977
|
+
SUM(CASE WHEN gpu_composition = 1 THEN 1 ELSE 0 END) as gpu_composition_frames,
|
|
1978
|
+
process_name
|
|
1979
|
+
FROM jank_analysis
|
|
1980
|
+
GROUP BY process_name
|
|
1981
|
+
`;
|
|
1982
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
1983
|
+
if (queryResult.error) {
|
|
1984
|
+
return {
|
|
1985
|
+
analysisType: 'scrolling_frametimeline',
|
|
1986
|
+
sql,
|
|
1987
|
+
rows: [],
|
|
1988
|
+
rowCount: 0,
|
|
1989
|
+
summary: `Error analyzing scrolling (FrameTimeline): ${queryResult.error}`,
|
|
1990
|
+
};
|
|
1991
|
+
}
|
|
1992
|
+
// Convert rows to objects for easier access
|
|
1993
|
+
const rowObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
1994
|
+
// Get jank type breakdown for more detailed analysis
|
|
1995
|
+
const jankTypeSql = `
|
|
1996
|
+
SELECT
|
|
1997
|
+
a.jank_type,
|
|
1998
|
+
COUNT(*) as count,
|
|
1999
|
+
AVG(a.dur) / 1e6 as avg_dur_ms,
|
|
2000
|
+
p.name as process_name
|
|
2001
|
+
FROM actual_frame_timeline_slice a
|
|
2002
|
+
JOIN process p ON a.upid = p.upid
|
|
2003
|
+
WHERE a.jank_type IS NOT NULL AND a.jank_type != 'None'
|
|
2004
|
+
${processFilter}
|
|
2005
|
+
GROUP BY a.jank_type, p.name
|
|
2006
|
+
ORDER BY count DESC
|
|
2007
|
+
`;
|
|
2008
|
+
const jankTypeResult = await this.traceProcessor.query(traceId, jankTypeSql);
|
|
2009
|
+
const jankTypeRowObjects = rowsToObjects(jankTypeResult.columns, jankTypeResult.rows || []);
|
|
2010
|
+
// Add enhanced analysis for consecutive jank and frozen frames
|
|
2011
|
+
const enhancedAnalysis = await this.analyzeJankySessions(traceId, packageName);
|
|
2012
|
+
// Add frame stability analysis
|
|
2013
|
+
const stabilityAnalysis = await this.analyzeFrameStability(traceId, packageName);
|
|
2014
|
+
// Add root cause analysis for janky frames
|
|
2015
|
+
const rootCauseAnalysis = await this.analyzeJankRootCauses(traceId, packageName);
|
|
2016
|
+
const summary = this.formatFrameTimelineScrollingSummary(rowObjects, jankTypeRowObjects, enhancedAnalysis, stabilityAnalysis, rootCauseAnalysis);
|
|
2017
|
+
return {
|
|
2018
|
+
analysisType: 'scrolling_frametimeline',
|
|
2019
|
+
sql,
|
|
2020
|
+
rows: queryResult.rows,
|
|
2021
|
+
rowCount: queryResult.rows.length,
|
|
2022
|
+
summary,
|
|
2023
|
+
metrics: rowObjects.length > 0 ? rowObjects[0] : {},
|
|
2024
|
+
details: {
|
|
2025
|
+
jankBreakdown: jankTypeRowObjects,
|
|
2026
|
+
method: 'FrameTimeline (Android 12+)',
|
|
2027
|
+
enhancedAnalysis,
|
|
2028
|
+
stabilityAnalysis,
|
|
2029
|
+
rootCauseAnalysis,
|
|
2030
|
+
},
|
|
2031
|
+
};
|
|
2032
|
+
}
|
|
2033
|
+
/**
|
|
2034
|
+
* Analyze janky sessions (consecutive janky frames) and frozen frames
|
|
2035
|
+
* Helps identify patterns of continuous jank that are more noticeable to users
|
|
2036
|
+
*/
|
|
2037
|
+
async analyzeJankySessions(traceId, packageName) {
|
|
2038
|
+
let processFilter = '';
|
|
2039
|
+
if (packageName) {
|
|
2040
|
+
processFilter = `AND p.name GLOB '${packageName}*'`;
|
|
2041
|
+
}
|
|
2042
|
+
// Analyze consecutive janky frames and frozen frames
|
|
2043
|
+
const sql = `
|
|
2044
|
+
WITH numbered_frames AS (
|
|
2045
|
+
SELECT
|
|
2046
|
+
a.id,
|
|
2047
|
+
a.ts,
|
|
2048
|
+
a.dur,
|
|
2049
|
+
a.jank_type,
|
|
2050
|
+
a.on_time_finish,
|
|
2051
|
+
p.name as process_name,
|
|
2052
|
+
ROW_NUMBER() OVER (PARTITION BY p.upid ORDER BY a.ts) as frame_num
|
|
2053
|
+
FROM actual_frame_timeline_slice a
|
|
2054
|
+
JOIN process p ON a.upid = p.upid
|
|
2055
|
+
WHERE 1=1
|
|
2056
|
+
${processFilter}
|
|
2057
|
+
),
|
|
2058
|
+
jank_groups AS (
|
|
2059
|
+
SELECT
|
|
2060
|
+
frame_num,
|
|
2061
|
+
dur,
|
|
2062
|
+
ts,
|
|
2063
|
+
process_name,
|
|
2064
|
+
jank_type,
|
|
2065
|
+
-- Identify start of jank group (previous frame was not janky)
|
|
2066
|
+
CASE
|
|
2067
|
+
WHEN jank_type IS NOT NULL AND jank_type != 'None'
|
|
2068
|
+
AND LAG(jank_type) OVER (ORDER BY frame_num) IS NULL
|
|
2069
|
+
OR (jank_type IS NOT NULL AND jank_type != 'None'
|
|
2070
|
+
AND LAG(jank_type) OVER (ORDER BY frame_num) = 'None')
|
|
2071
|
+
THEN 1
|
|
2072
|
+
ELSE 0
|
|
2073
|
+
END as is_jank_start
|
|
2074
|
+
FROM numbered_frames
|
|
2075
|
+
),
|
|
2076
|
+
jank_sessions AS (
|
|
2077
|
+
SELECT
|
|
2078
|
+
frame_num,
|
|
2079
|
+
dur,
|
|
2080
|
+
ts,
|
|
2081
|
+
process_name,
|
|
2082
|
+
jank_type,
|
|
2083
|
+
SUM(is_jank_start) OVER (ORDER BY frame_num) as session_id
|
|
2084
|
+
FROM jank_groups
|
|
2085
|
+
WHERE jank_type IS NOT NULL AND jank_type != 'None'
|
|
2086
|
+
)
|
|
2087
|
+
SELECT
|
|
2088
|
+
MIN(frame_num) as start_frame,
|
|
2089
|
+
COUNT(*) as session_length,
|
|
2090
|
+
SUM(dur) / 1e6 as total_dur_ms,
|
|
2091
|
+
process_name,
|
|
2092
|
+
-- Determine severity based on length and duration
|
|
2093
|
+
CASE
|
|
2094
|
+
WHEN COUNT(*) >= 5 THEN 'severe'
|
|
2095
|
+
WHEN COUNT(*) >= 3 THEN 'moderate'
|
|
2096
|
+
ELSE 'mild'
|
|
2097
|
+
END as severity
|
|
2098
|
+
FROM jank_sessions
|
|
2099
|
+
GROUP BY session_id, process_name
|
|
2100
|
+
ORDER BY session_length DESC
|
|
2101
|
+
`;
|
|
2102
|
+
const jankSessionsResult = await this.traceProcessor.query(traceId, sql);
|
|
2103
|
+
const jankSessionsObjects = rowsToObjects(jankSessionsResult.columns || [], jankSessionsResult.rows || []);
|
|
2104
|
+
// Detect frozen frames (> 700ms - very long frames that freeze UI)
|
|
2105
|
+
const frozenFrameSql = `
|
|
2106
|
+
SELECT
|
|
2107
|
+
a.ts,
|
|
2108
|
+
a.dur / 1e6 as dur_ms,
|
|
2109
|
+
p.name as process_name,
|
|
2110
|
+
a.jank_type
|
|
2111
|
+
FROM actual_frame_timeline_slice a
|
|
2112
|
+
JOIN process p ON a.upid = p.upid
|
|
2113
|
+
WHERE a.dur > 700000000
|
|
2114
|
+
${processFilter}
|
|
2115
|
+
ORDER BY a.ts ASC
|
|
2116
|
+
`;
|
|
2117
|
+
const frozenFrameResult = await this.traceProcessor.query(traceId, frozenFrameSql);
|
|
2118
|
+
const frozenFrameObjects = rowsToObjects(frozenFrameResult.columns || [], frozenFrameResult.rows || []);
|
|
2119
|
+
// Get consecutive jank statistics
|
|
2120
|
+
const consecutiveJankSql = `
|
|
2121
|
+
WITH janky_frames AS (
|
|
2122
|
+
SELECT
|
|
2123
|
+
a.ts,
|
|
2124
|
+
a.dur,
|
|
2125
|
+
p.name as process_name,
|
|
2126
|
+
CASE
|
|
2127
|
+
WHEN a.jank_type IS NOT NULL AND a.jank_type != 'None' THEN 1
|
|
2128
|
+
ELSE 0
|
|
2129
|
+
END as is_janky
|
|
2130
|
+
FROM actual_frame_timeline_slice a
|
|
2131
|
+
JOIN process p ON a.upid = p.upid
|
|
2132
|
+
WHERE 1=1
|
|
2133
|
+
${processFilter}
|
|
2134
|
+
ORDER BY a.ts
|
|
2135
|
+
),
|
|
2136
|
+
consecutive_groups AS (
|
|
2137
|
+
SELECT
|
|
2138
|
+
is_janky,
|
|
2139
|
+
SUM(CASE WHEN is_janky = 0 THEN 1 ELSE 0 END) OVER (ORDER BY ts) as group_id
|
|
2140
|
+
FROM janky_frames
|
|
2141
|
+
)
|
|
2142
|
+
SELECT
|
|
2143
|
+
COUNT(*) as total_janky_frames,
|
|
2144
|
+
MAX(cnt) as max_consecutive_jank
|
|
2145
|
+
FROM (
|
|
2146
|
+
SELECT COUNT(*) as cnt
|
|
2147
|
+
FROM consecutive_groups
|
|
2148
|
+
WHERE is_janky = 1
|
|
2149
|
+
GROUP BY group_id
|
|
2150
|
+
)
|
|
2151
|
+
`;
|
|
2152
|
+
const consecutiveResult = await this.traceProcessor.query(traceId, consecutiveJankSql);
|
|
2153
|
+
const consecutiveObjects = rowsToObjects(consecutiveResult.columns || [], consecutiveResult.rows || []);
|
|
2154
|
+
return {
|
|
2155
|
+
jankySessions: jankSessionsObjects.map((r) => ({
|
|
2156
|
+
startIdx: r.start_frame,
|
|
2157
|
+
length: r.session_length,
|
|
2158
|
+
severity: r.severity,
|
|
2159
|
+
totalDurMs: r.total_dur_ms,
|
|
2160
|
+
process: r.process_name,
|
|
2161
|
+
})),
|
|
2162
|
+
frozenFrames: frozenFrameObjects.map((r) => ({
|
|
2163
|
+
ts: r.ts,
|
|
2164
|
+
dur: r.dur_ms,
|
|
2165
|
+
process: r.process_name,
|
|
2166
|
+
jankType: r.jank_type,
|
|
2167
|
+
})),
|
|
2168
|
+
consecutiveJankCount: consecutiveObjects.length > 0
|
|
2169
|
+
? consecutiveObjects[0].max_consecutive_jank || 0
|
|
2170
|
+
: 0,
|
|
2171
|
+
};
|
|
2172
|
+
}
|
|
2173
|
+
/**
|
|
2174
|
+
* Analyze frame rate stability and calculate smoothness metrics
|
|
2175
|
+
* Returns statistical analysis of frame timing consistency
|
|
2176
|
+
*/
|
|
2177
|
+
async analyzeFrameStability(traceId, packageName) {
|
|
2178
|
+
let processFilter = '';
|
|
2179
|
+
if (packageName) {
|
|
2180
|
+
processFilter = `AND p.name GLOB '${packageName}*'`;
|
|
2181
|
+
}
|
|
2182
|
+
// Calculate frame time statistics with exact percentiles from ordered samples.
|
|
2183
|
+
const sql = `
|
|
2184
|
+
WITH frame_stats AS (
|
|
2185
|
+
SELECT
|
|
2186
|
+
a.dur / 1e6 as frame_time_ms,
|
|
2187
|
+
p.name as process_name
|
|
2188
|
+
FROM actual_frame_timeline_slice a
|
|
2189
|
+
JOIN process p ON a.upid = p.upid
|
|
2190
|
+
WHERE 1=1
|
|
2191
|
+
${processFilter}
|
|
2192
|
+
),
|
|
2193
|
+
ordered AS (
|
|
2194
|
+
SELECT
|
|
2195
|
+
frame_time_ms,
|
|
2196
|
+
ROW_NUMBER() OVER (ORDER BY frame_time_ms) as rn,
|
|
2197
|
+
COUNT(*) OVER () as total_count
|
|
2198
|
+
FROM frame_stats
|
|
2199
|
+
),
|
|
2200
|
+
stats AS (
|
|
2201
|
+
SELECT
|
|
2202
|
+
AVG(frame_time_ms) as avg_ms,
|
|
2203
|
+
SUM(frame_time_ms * frame_time_ms) / COUNT(*) as avg_sq_ms,
|
|
2204
|
+
COUNT(*) as frame_count
|
|
2205
|
+
FROM frame_stats
|
|
2206
|
+
),
|
|
2207
|
+
percentiles AS (
|
|
2208
|
+
SELECT
|
|
2209
|
+
MAX(CASE
|
|
2210
|
+
WHEN rn = CAST(ROUND((total_count - 1) * 0.50) AS INT) + 1 THEN frame_time_ms
|
|
2211
|
+
END) as p50_ms,
|
|
2212
|
+
MAX(CASE
|
|
2213
|
+
WHEN rn = CAST(ROUND((total_count - 1) * 0.95) AS INT) + 1 THEN frame_time_ms
|
|
2214
|
+
END) as p95_ms,
|
|
2215
|
+
MAX(CASE
|
|
2216
|
+
WHEN rn = CAST(ROUND((total_count - 1) * 0.99) AS INT) + 1 THEN frame_time_ms
|
|
2217
|
+
END) as p99_ms
|
|
2218
|
+
FROM ordered
|
|
2219
|
+
)
|
|
2220
|
+
SELECT
|
|
2221
|
+
s.avg_ms,
|
|
2222
|
+
CASE
|
|
2223
|
+
WHEN s.frame_count <= 1 THEN 0
|
|
2224
|
+
ELSE SQRT(MAX(s.avg_sq_ms - s.avg_ms * s.avg_ms, 0))
|
|
2225
|
+
END as std_dev_ms,
|
|
2226
|
+
s.frame_count,
|
|
2227
|
+
p.p50_ms,
|
|
2228
|
+
p.p95_ms,
|
|
2229
|
+
p.p99_ms
|
|
2230
|
+
FROM stats s
|
|
2231
|
+
CROSS JOIN percentiles p
|
|
2232
|
+
`;
|
|
2233
|
+
const result = await this.traceProcessor.query(traceId, sql);
|
|
2234
|
+
if (result.error || !result.rows || result.rows.length === 0) {
|
|
2235
|
+
return null;
|
|
2236
|
+
}
|
|
2237
|
+
const rowObjects = rowsToObjects(result.columns || [], result.rows);
|
|
2238
|
+
const r = rowObjects[0];
|
|
2239
|
+
const frameCount = Number(r.frame_count || 0);
|
|
2240
|
+
const avgMs = Number(r.avg_ms || 0);
|
|
2241
|
+
const stdDevMs = Number(r.std_dev_ms || 0);
|
|
2242
|
+
if (!Number.isFinite(avgMs) || frameCount <= 0 || avgMs <= 0) {
|
|
2243
|
+
return null;
|
|
2244
|
+
}
|
|
2245
|
+
const p50 = Number.isFinite(Number(r.p50_ms)) ? Number(r.p50_ms) : avgMs;
|
|
2246
|
+
const p95 = Number.isFinite(Number(r.p95_ms)) ? Number(r.p95_ms) : avgMs;
|
|
2247
|
+
const p99 = Number.isFinite(Number(r.p99_ms)) ? Number(r.p99_ms) : avgMs;
|
|
2248
|
+
// Calculate coefficient of variation (CV = std/mean)
|
|
2249
|
+
// Lower CV means more stable frame rate.
|
|
2250
|
+
const cv = avgMs > 0 ? (stdDevMs / avgMs) * 100 : 0;
|
|
2251
|
+
// Calculate stability score (0-100):
|
|
2252
|
+
// - penalize high variation
|
|
2253
|
+
// - penalize high-tail latency (p95)
|
|
2254
|
+
// - penalize mean frame time drifting above the 60fps budget
|
|
2255
|
+
let stabilityScore = 100;
|
|
2256
|
+
stabilityScore -= Math.min(cv * 1.8, 45);
|
|
2257
|
+
stabilityScore -= Math.min(Math.max(p95 - 16.6, 0) * 1.5, 35);
|
|
2258
|
+
stabilityScore -= Math.min(Math.max(avgMs - 16.6, 0) * 1.2, 20);
|
|
2259
|
+
stabilityScore = Math.max(0, Math.min(100, stabilityScore));
|
|
2260
|
+
return {
|
|
2261
|
+
avgFrameTimeMs: avgMs,
|
|
2262
|
+
stdDevMs: stdDevMs,
|
|
2263
|
+
coefficientOfVariation: cv,
|
|
2264
|
+
framePercentiles: {
|
|
2265
|
+
p50,
|
|
2266
|
+
p95,
|
|
2267
|
+
p99,
|
|
2268
|
+
},
|
|
2269
|
+
stabilityScore: Math.round(stabilityScore),
|
|
2270
|
+
};
|
|
2271
|
+
}
|
|
2272
|
+
/**
|
|
2273
|
+
* Analyze root cause for each janky frame
|
|
2274
|
+
* Identifies whether jank is caused by main thread, GPU, or system issues
|
|
2275
|
+
*/
|
|
2276
|
+
async analyzeJankRootCauses(traceId, packageName) {
|
|
2277
|
+
let processFilter = '';
|
|
2278
|
+
if (packageName) {
|
|
2279
|
+
processFilter = `AND p.name GLOB '${packageName}*'`;
|
|
2280
|
+
}
|
|
2281
|
+
// Analyze janky frames with stricter root-cause attribution:
|
|
2282
|
+
// - Main-thread cause requires >=8ms overlap with frame window
|
|
2283
|
+
// - GPU cause relies on gpu_composition flag
|
|
2284
|
+
// - BufferQueue cause uses present_type/jank_type late indicators
|
|
2285
|
+
// - Otherwise fallback to system pipeline
|
|
2286
|
+
const sql = `
|
|
2287
|
+
WITH janky_frames AS (
|
|
2288
|
+
SELECT
|
|
2289
|
+
a.id,
|
|
2290
|
+
a.ts,
|
|
2291
|
+
a.dur,
|
|
2292
|
+
a.jank_type,
|
|
2293
|
+
a.gpu_composition,
|
|
2294
|
+
a.present_type,
|
|
2295
|
+
p.name as process_name,
|
|
2296
|
+
p.upid,
|
|
2297
|
+
p.pid,
|
|
2298
|
+
a.ts as frame_start_ns,
|
|
2299
|
+
a.ts + a.dur as frame_end_ns
|
|
2300
|
+
FROM actual_frame_timeline_slice a
|
|
2301
|
+
JOIN process p ON a.upid = p.upid
|
|
2302
|
+
WHERE a.jank_type IS NOT NULL AND a.jank_type != 'None'
|
|
2303
|
+
${processFilter}
|
|
2304
|
+
ORDER BY a.ts
|
|
2305
|
+
),
|
|
2306
|
+
main_thread_overlap AS (
|
|
2307
|
+
SELECT
|
|
2308
|
+
jf.id,
|
|
2309
|
+
COUNT(*) as overlapping_main_slice_count,
|
|
2310
|
+
SUM(
|
|
2311
|
+
CASE
|
|
2312
|
+
WHEN MIN(s.ts + s.dur, jf.frame_end_ns) > MAX(s.ts, jf.frame_start_ns)
|
|
2313
|
+
THEN MIN(s.ts + s.dur, jf.frame_end_ns) - MAX(s.ts, jf.frame_start_ns)
|
|
2314
|
+
ELSE 0
|
|
2315
|
+
END
|
|
2316
|
+
) / 1e6 as main_overlap_ms,
|
|
2317
|
+
MAX(s.dur) / 1e6 as max_main_slice_ms
|
|
2318
|
+
FROM janky_frames jf
|
|
2319
|
+
JOIN thread t ON t.upid = jf.upid
|
|
2320
|
+
JOIN thread_track tt ON tt.utid = t.utid
|
|
2321
|
+
JOIN slice s ON s.track_id = tt.id
|
|
2322
|
+
WHERE s.dur > 0
|
|
2323
|
+
AND (COALESCE(t.is_main_thread, 0) = 1 OR t.tid = jf.pid OR LOWER(COALESCE(t.name, '')) = 'main')
|
|
2324
|
+
AND s.ts < jf.frame_end_ns
|
|
2325
|
+
AND s.ts + s.dur > jf.frame_start_ns
|
|
2326
|
+
GROUP BY jf.id
|
|
2327
|
+
),
|
|
2328
|
+
classified AS (
|
|
2329
|
+
SELECT
|
|
2330
|
+
jf.ts,
|
|
2331
|
+
jf.jank_type,
|
|
2332
|
+
jf.gpu_composition,
|
|
2333
|
+
jf.present_type,
|
|
2334
|
+
COALESCE(mto.overlapping_main_slice_count, 0) as overlapping_main_slice_count,
|
|
2335
|
+
COALESCE(mto.main_overlap_ms, 0) as main_overlap_ms,
|
|
2336
|
+
COALESCE(mto.max_main_slice_ms, 0) as max_main_slice_ms,
|
|
2337
|
+
CASE
|
|
2338
|
+
WHEN COALESCE(mto.main_overlap_ms, 0) >= 8.0 THEN 'MainThread'
|
|
2339
|
+
WHEN jf.gpu_composition = 1 THEN 'GPU'
|
|
2340
|
+
WHEN LOWER(COALESCE(jf.present_type, '')) LIKE '%late%'
|
|
2341
|
+
OR LOWER(COALESCE(jf.present_type, '')) LIKE '%miss%'
|
|
2342
|
+
OR LOWER(COALESCE(jf.jank_type, '')) LIKE '%buffer%'
|
|
2343
|
+
THEN 'BufferQueue'
|
|
2344
|
+
ELSE 'System'
|
|
2345
|
+
END as root_cause,
|
|
2346
|
+
CASE
|
|
2347
|
+
WHEN COALESCE(mto.main_overlap_ms, 0) >= 8.0 THEN 'high'
|
|
2348
|
+
WHEN jf.gpu_composition = 1 THEN 'medium'
|
|
2349
|
+
WHEN LOWER(COALESCE(jf.present_type, '')) LIKE '%late%'
|
|
2350
|
+
OR LOWER(COALESCE(jf.present_type, '')) LIKE '%miss%'
|
|
2351
|
+
OR LOWER(COALESCE(jf.jank_type, '')) LIKE '%buffer%'
|
|
2352
|
+
THEN 'medium'
|
|
2353
|
+
ELSE 'low'
|
|
2354
|
+
END as confidence
|
|
2355
|
+
FROM janky_frames jf
|
|
2356
|
+
LEFT JOIN main_thread_overlap mto ON mto.id = jf.id
|
|
2357
|
+
)
|
|
2358
|
+
SELECT
|
|
2359
|
+
ts,
|
|
2360
|
+
jank_type,
|
|
2361
|
+
gpu_composition,
|
|
2362
|
+
present_type,
|
|
2363
|
+
overlapping_main_slice_count,
|
|
2364
|
+
main_overlap_ms,
|
|
2365
|
+
max_main_slice_ms,
|
|
2366
|
+
root_cause,
|
|
2367
|
+
confidence
|
|
2368
|
+
FROM classified
|
|
2369
|
+
ORDER BY ts ASC
|
|
2370
|
+
`;
|
|
2371
|
+
const result = await this.traceProcessor.query(traceId, sql);
|
|
2372
|
+
if (result.error || !result.rows || result.rows.length === 0) {
|
|
2373
|
+
return null;
|
|
2374
|
+
}
|
|
2375
|
+
// Convert rows to objects for easier access
|
|
2376
|
+
const rowObjects = rowsToObjects(result.columns, result.rows);
|
|
2377
|
+
// Count by root cause
|
|
2378
|
+
let mainThreadJank = 0;
|
|
2379
|
+
let gpuJank = 0;
|
|
2380
|
+
let sfJank = 0;
|
|
2381
|
+
let bufferJank = 0;
|
|
2382
|
+
const details = rowObjects.map((r) => {
|
|
2383
|
+
if (r.root_cause === 'MainThread')
|
|
2384
|
+
mainThreadJank++;
|
|
2385
|
+
else if (r.root_cause === 'GPU')
|
|
2386
|
+
gpuJank++;
|
|
2387
|
+
else if (r.root_cause === 'BufferQueue')
|
|
2388
|
+
bufferJank++;
|
|
2389
|
+
else
|
|
2390
|
+
sfJank++;
|
|
2391
|
+
return {
|
|
2392
|
+
frameTs: r.ts,
|
|
2393
|
+
jankType: r.jank_type,
|
|
2394
|
+
rootCause: r.root_cause,
|
|
2395
|
+
description: this.getRootCauseDescription(r.root_cause, r.jank_type),
|
|
2396
|
+
confidence: r.confidence || 'low',
|
|
2397
|
+
evidence: {
|
|
2398
|
+
mainOverlapMs: Number(r.main_overlap_ms || 0),
|
|
2399
|
+
maxMainSliceMs: Number(r.max_main_slice_ms || 0),
|
|
2400
|
+
presentType: String(r.present_type || ''),
|
|
2401
|
+
},
|
|
2402
|
+
};
|
|
2403
|
+
});
|
|
2404
|
+
return {
|
|
2405
|
+
mainThreadJank,
|
|
2406
|
+
gpuJank,
|
|
2407
|
+
sfJank,
|
|
2408
|
+
bufferJank,
|
|
2409
|
+
details,
|
|
2410
|
+
};
|
|
2411
|
+
}
|
|
2412
|
+
/**
|
|
2413
|
+
* Get human-readable description for root cause
|
|
2414
|
+
*/
|
|
2415
|
+
getRootCauseDescription(rootCause, jankType) {
|
|
2416
|
+
const descriptions = {
|
|
2417
|
+
MainThread: 'Main thread blocked - too much work on UI thread',
|
|
2418
|
+
GPU: 'GPU composition fallback - too complex to draw with hardware overlay',
|
|
2419
|
+
BufferQueue: 'Buffer queue starvation - no buffer ready for composition',
|
|
2420
|
+
System: 'System-level delay - SurfaceFlinger or display pipeline issue',
|
|
2421
|
+
};
|
|
2422
|
+
const base = descriptions[rootCause] || 'Unknown cause';
|
|
2423
|
+
return `${base} (JankType: ${jankType})`;
|
|
2424
|
+
}
|
|
2425
|
+
/**
|
|
2426
|
+
* Legacy jank detection for Android < 12
|
|
2427
|
+
* Combines multiple data sources to detect real jank
|
|
2428
|
+
*/
|
|
2429
|
+
async analyzeScrollingLegacy(traceId, packageName) {
|
|
2430
|
+
let processFilter = '';
|
|
2431
|
+
if (packageName) {
|
|
2432
|
+
processFilter = `AND p.name GLOB '${packageName}*'`;
|
|
2433
|
+
}
|
|
2434
|
+
// Multi-dimensional analysis combining:
|
|
2435
|
+
// 1. Choreographer doFrame (main thread frame timing)
|
|
2436
|
+
// 2. RenderThread execution
|
|
2437
|
+
// 3. SurfaceFlinger composition status
|
|
2438
|
+
// 4. BufferQueue buffer availability
|
|
2439
|
+
// 5. Vsync timing correlation
|
|
2440
|
+
const sql = `
|
|
2441
|
+
WITH choreographer_frames AS (
|
|
2442
|
+
-- Get all doFrame calls from Choreographer
|
|
2443
|
+
SELECT
|
|
2444
|
+
s.id,
|
|
2445
|
+
s.ts,
|
|
2446
|
+
s.dur,
|
|
2447
|
+
t.utid,
|
|
2448
|
+
p.name as process_name,
|
|
2449
|
+
p.upid
|
|
2450
|
+
FROM slice s
|
|
2451
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
2452
|
+
JOIN thread t ON tt.utid = t.utid
|
|
2453
|
+
JOIN process p ON t.upid = p.upid
|
|
2454
|
+
WHERE s.name = 'doFrame'
|
|
2455
|
+
${processFilter}
|
|
2456
|
+
),
|
|
2457
|
+
render_thread_frames AS (
|
|
2458
|
+
-- Get RenderThread frame work
|
|
2459
|
+
SELECT
|
|
2460
|
+
s.ts,
|
|
2461
|
+
s.dur,
|
|
2462
|
+
s.name,
|
|
2463
|
+
p.upid
|
|
2464
|
+
FROM slice s
|
|
2465
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
2466
|
+
JOIN thread t ON tt.utid = t.utid
|
|
2467
|
+
JOIN process p ON t.upid = p.upid
|
|
2468
|
+
WHERE s.name GLOB '*Draw*' OR s.name GLOB '*frame*'
|
|
2469
|
+
${processFilter}
|
|
2470
|
+
),
|
|
2471
|
+
sf_composition AS (
|
|
2472
|
+
-- SurfaceFlinger composition events
|
|
2473
|
+
SELECT
|
|
2474
|
+
s.ts,
|
|
2475
|
+
s.dur,
|
|
2476
|
+
s.name
|
|
2477
|
+
FROM slice s
|
|
2478
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
2479
|
+
JOIN thread t ON tt.utid = t.utid
|
|
2480
|
+
JOIN process p ON t.upid = p.upid
|
|
2481
|
+
WHERE p.name = '/system/bin/surfaceflinger'
|
|
2482
|
+
AND (s.name GLOB '*composition*' OR s.name GLOB '*present*')
|
|
2483
|
+
),
|
|
2484
|
+
frame_analysis AS (
|
|
2485
|
+
SELECT
|
|
2486
|
+
c.id,
|
|
2487
|
+
c.ts,
|
|
2488
|
+
c.dur as doframe_dur,
|
|
2489
|
+
c.process_name,
|
|
2490
|
+
c.upid,
|
|
2491
|
+
-- Frame is considered janky if:
|
|
2492
|
+
-- 1. doFrame duration > 16.6ms (missed vsync)
|
|
2493
|
+
-- 2. There's no corresponding SF composition within reasonable time
|
|
2494
|
+
CASE
|
|
2495
|
+
WHEN c.dur > 16666666 THEN 1
|
|
2496
|
+
ELSE 0
|
|
2497
|
+
END as doframe_missed,
|
|
2498
|
+
-- Check if SF composition happened for this frame window
|
|
2499
|
+
EXISTS(
|
|
2500
|
+
SELECT 1 FROM sf_composition sf
|
|
2501
|
+
WHERE sf.ts >= c.ts AND sf.ts <= c.ts + c.dur + 16000000
|
|
2502
|
+
) as has_sf_composition
|
|
2503
|
+
FROM choreographer_frames c
|
|
2504
|
+
)
|
|
2505
|
+
SELECT
|
|
2506
|
+
COUNT(*) as total_frames,
|
|
2507
|
+
SUM(doframe_missed) as jank_frames,
|
|
2508
|
+
SUM(CASE WHEN has_sf_composition = 0 THEN 1 ELSE 0 END) as no_sf_composition_frames,
|
|
2509
|
+
AVG(doframe_dur) / 1e6 as avg_frame_dur_ms,
|
|
2510
|
+
MIN(doframe_dur) / 1e6 as min_frame_dur_ms,
|
|
2511
|
+
MAX(doframe_dur) / 1e6 as max_frame_dur_ms,
|
|
2512
|
+
process_name
|
|
2513
|
+
FROM frame_analysis
|
|
2514
|
+
GROUP BY process_name
|
|
2515
|
+
`;
|
|
2516
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
2517
|
+
if (queryResult.error) {
|
|
2518
|
+
return {
|
|
2519
|
+
analysisType: 'scrolling_legacy',
|
|
2520
|
+
sql,
|
|
2521
|
+
rows: [],
|
|
2522
|
+
rowCount: 0,
|
|
2523
|
+
summary: `Error analyzing scrolling (Legacy): ${queryResult.error}`,
|
|
2524
|
+
};
|
|
2525
|
+
}
|
|
2526
|
+
// Convert rows to objects for easier access
|
|
2527
|
+
const rowObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
2528
|
+
const summary = this.formatLegacyScrollingSummary(rowObjects);
|
|
2529
|
+
return {
|
|
2530
|
+
analysisType: 'scrolling_legacy',
|
|
2531
|
+
sql,
|
|
2532
|
+
rows: queryResult.rows,
|
|
2533
|
+
rowCount: queryResult.rows.length,
|
|
2534
|
+
summary,
|
|
2535
|
+
metrics: rowObjects.length > 0 ? rowObjects[0] : {},
|
|
2536
|
+
details: {
|
|
2537
|
+
method: 'Legacy multi-dimensional (Android < 12)',
|
|
2538
|
+
note: 'For accurate jank detection, use Android 12+ with FrameTimeline',
|
|
2539
|
+
},
|
|
2540
|
+
};
|
|
2541
|
+
}
|
|
2542
|
+
/**
|
|
2543
|
+
* Analyze memory usage
|
|
2544
|
+
* Based on: linux/memory/*.sql patterns
|
|
2545
|
+
*/
|
|
2546
|
+
async analyzeMemory(traceId, packageName) {
|
|
2547
|
+
let processFilter = '';
|
|
2548
|
+
if (packageName) {
|
|
2549
|
+
processFilter = `AND p.name GLOB '${packageName}*'`;
|
|
2550
|
+
}
|
|
2551
|
+
// Find GC events and memory-related slices
|
|
2552
|
+
const sql = `
|
|
2553
|
+
SELECT
|
|
2554
|
+
s.name,
|
|
2555
|
+
COUNT(*) as count,
|
|
2556
|
+
AVG(s.dur) / 1e6 as avg_dur_ms,
|
|
2557
|
+
SUM(s.dur) / 1e6 as total_dur_ms,
|
|
2558
|
+
p.name as process_name
|
|
2559
|
+
FROM slice s
|
|
2560
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
2561
|
+
JOIN thread t ON tt.utid = t.utid
|
|
2562
|
+
JOIN process p ON t.upid = p.upid
|
|
2563
|
+
WHERE s.name GLOB '*GC*' OR s.name GLOB '*allocation*' OR s.name GLOB '*Allocation*'
|
|
2564
|
+
${processFilter}
|
|
2565
|
+
GROUP BY s.name, p.name
|
|
2566
|
+
ORDER BY count DESC
|
|
2567
|
+
`;
|
|
2568
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
2569
|
+
if (queryResult.error) {
|
|
2570
|
+
return {
|
|
2571
|
+
analysisType: 'memory',
|
|
2572
|
+
sql,
|
|
2573
|
+
rows: [],
|
|
2574
|
+
rowCount: 0,
|
|
2575
|
+
summary: `Error analyzing memory: ${queryResult.error}`,
|
|
2576
|
+
};
|
|
2577
|
+
}
|
|
2578
|
+
// Convert rows to objects for easier access
|
|
2579
|
+
const rowObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
2580
|
+
const summary = this.formatMemorySummary(rowObjects);
|
|
2581
|
+
return {
|
|
2582
|
+
analysisType: 'memory',
|
|
2583
|
+
sql,
|
|
2584
|
+
rows: queryResult.rows,
|
|
2585
|
+
rowCount: queryResult.rows.length,
|
|
2586
|
+
summary,
|
|
2587
|
+
};
|
|
2588
|
+
}
|
|
2589
|
+
/**
|
|
2590
|
+
* Analyze CPU utilization
|
|
2591
|
+
* Based on: linux/cpu/utilization/*.sql patterns
|
|
2592
|
+
*/
|
|
2593
|
+
async analyzeCpu(traceId, packageName) {
|
|
2594
|
+
let processFilter = '';
|
|
2595
|
+
if (packageName) {
|
|
2596
|
+
processFilter = `AND p.name GLOB '${packageName}*'`;
|
|
2597
|
+
}
|
|
2598
|
+
// Thread state analysis for CPU time
|
|
2599
|
+
const sql = `
|
|
2600
|
+
SELECT
|
|
2601
|
+
t.name as thread_name,
|
|
2602
|
+
p.name as process_name,
|
|
2603
|
+
SUM(ts.dur) / 1e6 as total_dur_ms,
|
|
2604
|
+
SUM(CASE WHEN ts.state = 'R' THEN ts.dur ELSE 0 END) / 1e6 as running_dur_ms,
|
|
2605
|
+
SUM(CASE WHEN ts.state = 'S' THEN ts.dur ELSE 0 END) / 1e6 as sleeping_dur_ms,
|
|
2606
|
+
COUNT(*) as state_changes
|
|
2607
|
+
FROM thread_state ts
|
|
2608
|
+
JOIN thread t ON ts.utid = t.utid
|
|
2609
|
+
JOIN process p ON t.upid = p.upid
|
|
2610
|
+
WHERE 1=1
|
|
2611
|
+
${processFilter}
|
|
2612
|
+
GROUP BY t.name, p.name
|
|
2613
|
+
ORDER BY total_dur_ms DESC
|
|
2614
|
+
`;
|
|
2615
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
2616
|
+
if (queryResult.error) {
|
|
2617
|
+
return {
|
|
2618
|
+
analysisType: 'cpu',
|
|
2619
|
+
sql,
|
|
2620
|
+
rows: [],
|
|
2621
|
+
rowCount: 0,
|
|
2622
|
+
summary: `Error analyzing CPU: ${queryResult.error}`,
|
|
2623
|
+
};
|
|
2624
|
+
}
|
|
2625
|
+
// Convert rows to objects for easier access
|
|
2626
|
+
const rowObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
2627
|
+
const summary = this.formatCpuSummary(rowObjects);
|
|
2628
|
+
return {
|
|
2629
|
+
analysisType: 'cpu',
|
|
2630
|
+
sql,
|
|
2631
|
+
rows: queryResult.rows,
|
|
2632
|
+
rowCount: queryResult.rows.length,
|
|
2633
|
+
summary,
|
|
2634
|
+
};
|
|
2635
|
+
}
|
|
2636
|
+
/**
|
|
2637
|
+
* Analyze SurfaceFlinger performance
|
|
2638
|
+
* Based on: android/surfaceflinger.sql, android_surfaceflinger.sql
|
|
2639
|
+
*/
|
|
2640
|
+
async analyzeSurfaceFlinger(traceId) {
|
|
2641
|
+
// SurfaceFlinger frame analysis
|
|
2642
|
+
const sql = `
|
|
2643
|
+
SELECT
|
|
2644
|
+
COUNT(*) as total_frames,
|
|
2645
|
+
SUM(CAST(s.dur > 16666666 AS INT)) as missed_frames,
|
|
2646
|
+
AVG(s.dur) / 1e6 as avg_frame_dur_ms,
|
|
2647
|
+
p.name as process_name
|
|
2648
|
+
FROM slice s
|
|
2649
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
2650
|
+
JOIN thread t ON tt.utid = t.utid
|
|
2651
|
+
JOIN process p ON t.upid = p.upid
|
|
2652
|
+
WHERE p.name = '/system/bin/surfaceflinger'
|
|
2653
|
+
AND (s.name GLOB '*frame*' OR s.name GLOB '*Frame*')
|
|
2654
|
+
`;
|
|
2655
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
2656
|
+
if (queryResult.error) {
|
|
2657
|
+
return {
|
|
2658
|
+
analysisType: 'surfaceflinger',
|
|
2659
|
+
sql,
|
|
2660
|
+
rows: [],
|
|
2661
|
+
rowCount: 0,
|
|
2662
|
+
summary: `Error analyzing SurfaceFlinger: ${queryResult.error}`,
|
|
2663
|
+
};
|
|
2664
|
+
}
|
|
2665
|
+
// Convert rows to objects for easier access
|
|
2666
|
+
const rowObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
2667
|
+
const summary = this.formatSurfaceFlingerSummary(rowObjects);
|
|
2668
|
+
return {
|
|
2669
|
+
analysisType: 'surfaceflinger',
|
|
2670
|
+
sql,
|
|
2671
|
+
rows: queryResult.rows,
|
|
2672
|
+
rowCount: queryResult.rows.length,
|
|
2673
|
+
summary,
|
|
2674
|
+
metrics: rowObjects.length > 0 ? rowObjects[0] : {},
|
|
2675
|
+
};
|
|
2676
|
+
}
|
|
2677
|
+
/**
|
|
2678
|
+
* Analyze Binder transactions
|
|
2679
|
+
* Based on: android/android_binder.sql
|
|
2680
|
+
*/
|
|
2681
|
+
async analyzeBinder(traceId, packageName) {
|
|
2682
|
+
let processFilter = '';
|
|
2683
|
+
if (packageName) {
|
|
2684
|
+
processFilter = `AND p.name GLOB '${packageName}*'`;
|
|
2685
|
+
}
|
|
2686
|
+
const sql = `
|
|
2687
|
+
SELECT
|
|
2688
|
+
s.name,
|
|
2689
|
+
COUNT(*) as count,
|
|
2690
|
+
AVG(s.dur) / 1e6 as avg_dur_ms,
|
|
2691
|
+
MAX(s.dur) / 1e6 as max_dur_ms,
|
|
2692
|
+
SUM(s.dur) / 1e6 as total_dur_ms,
|
|
2693
|
+
p.name as process_name
|
|
2694
|
+
FROM slice s
|
|
2695
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
2696
|
+
JOIN thread t ON tt.utid = t.utid
|
|
2697
|
+
JOIN process p ON t.upid = p.upid
|
|
2698
|
+
WHERE s.name GLOB '*Binder*'
|
|
2699
|
+
${processFilter}
|
|
2700
|
+
GROUP BY s.name, p.name
|
|
2701
|
+
ORDER BY count DESC
|
|
2702
|
+
`;
|
|
2703
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
2704
|
+
if (queryResult.error) {
|
|
2705
|
+
return {
|
|
2706
|
+
analysisType: 'binder',
|
|
2707
|
+
sql,
|
|
2708
|
+
rows: [],
|
|
2709
|
+
rowCount: 0,
|
|
2710
|
+
summary: `Error analyzing Binder: ${queryResult.error}`,
|
|
2711
|
+
};
|
|
2712
|
+
}
|
|
2713
|
+
// Convert rows to objects for easier access
|
|
2714
|
+
const rowObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
2715
|
+
const summary = this.formatBinderSummary(rowObjects);
|
|
2716
|
+
return {
|
|
2717
|
+
analysisType: 'binder',
|
|
2718
|
+
sql,
|
|
2719
|
+
rows: queryResult.rows,
|
|
2720
|
+
rowCount: queryResult.rows.length,
|
|
2721
|
+
summary,
|
|
2722
|
+
};
|
|
2723
|
+
}
|
|
2724
|
+
/**
|
|
2725
|
+
* Generic analysis with template-based SQL generation
|
|
2726
|
+
*/
|
|
2727
|
+
async analyzeGeneric(traceId, question, packageName) {
|
|
2728
|
+
// This would use AI to generate SQL from templates
|
|
2729
|
+
// For now, return a basic slice query
|
|
2730
|
+
const sql = `
|
|
2731
|
+
SELECT
|
|
2732
|
+
s.name,
|
|
2733
|
+
COUNT(*) as count,
|
|
2734
|
+
AVG(s.dur) / 1e6 as avg_dur_ms
|
|
2735
|
+
FROM slice s
|
|
2736
|
+
GROUP BY s.name
|
|
2737
|
+
ORDER BY count DESC
|
|
2738
|
+
`;
|
|
2739
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
2740
|
+
if (queryResult.error) {
|
|
2741
|
+
return {
|
|
2742
|
+
analysisType: 'generic',
|
|
2743
|
+
sql,
|
|
2744
|
+
rows: [],
|
|
2745
|
+
rowCount: 0,
|
|
2746
|
+
summary: `Error: ${queryResult.error}`,
|
|
2747
|
+
};
|
|
2748
|
+
}
|
|
2749
|
+
return {
|
|
2750
|
+
analysisType: 'generic',
|
|
2751
|
+
sql,
|
|
2752
|
+
rows: queryResult.rows,
|
|
2753
|
+
rowCount: queryResult.rows.length,
|
|
2754
|
+
summary: `Found ${queryResult.rows.length} slice types in trace`,
|
|
2755
|
+
};
|
|
2756
|
+
}
|
|
2757
|
+
/**
|
|
2758
|
+
* Analyze navigation/activity switching performance
|
|
2759
|
+
* Based on activity transition slice patterns
|
|
2760
|
+
*/
|
|
2761
|
+
async analyzeNavigation(traceId, packageName) {
|
|
2762
|
+
let processFilter = '';
|
|
2763
|
+
if (packageName) {
|
|
2764
|
+
processFilter = `AND p.name GLOB '${packageName}*'`;
|
|
2765
|
+
}
|
|
2766
|
+
const sql = `
|
|
2767
|
+
SELECT
|
|
2768
|
+
s.name,
|
|
2769
|
+
COUNT(*) as count,
|
|
2770
|
+
AVG(s.dur) / 1e6 as avg_dur_ms,
|
|
2771
|
+
MIN(s.dur) / 1e6 as min_dur_ms,
|
|
2772
|
+
MAX(s.dur) / 1e6 as max_dur_ms,
|
|
2773
|
+
p.name as process_name
|
|
2774
|
+
FROM slice s
|
|
2775
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
2776
|
+
JOIN thread t ON tt.utid = t.utid
|
|
2777
|
+
JOIN process p ON t.upid = p.upid
|
|
2778
|
+
WHERE s.name GLOB 'perform*' OR s.name GLOB '*Activity*'
|
|
2779
|
+
${processFilter}
|
|
2780
|
+
GROUP BY s.name, p.name
|
|
2781
|
+
ORDER BY count DESC
|
|
2782
|
+
`;
|
|
2783
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
2784
|
+
if (queryResult.error) {
|
|
2785
|
+
return {
|
|
2786
|
+
analysisType: 'navigation',
|
|
2787
|
+
sql,
|
|
2788
|
+
rows: [],
|
|
2789
|
+
rowCount: 0,
|
|
2790
|
+
summary: `Error analyzing navigation: ${queryResult.error}`,
|
|
2791
|
+
};
|
|
2792
|
+
}
|
|
2793
|
+
const rowObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
2794
|
+
const summary = this.formatNavigationSummary(rowObjects);
|
|
2795
|
+
return {
|
|
2796
|
+
analysisType: 'navigation',
|
|
2797
|
+
sql,
|
|
2798
|
+
rows: rowObjects,
|
|
2799
|
+
rowCount: rowObjects.length,
|
|
2800
|
+
summary,
|
|
2801
|
+
};
|
|
2802
|
+
}
|
|
2803
|
+
/**
|
|
2804
|
+
* Analyze click/tap response performance
|
|
2805
|
+
* Based on input event latency patterns
|
|
2806
|
+
*/
|
|
2807
|
+
async analyzeClickResponse(traceId, packageName) {
|
|
2808
|
+
let processFilter = '';
|
|
2809
|
+
if (packageName) {
|
|
2810
|
+
processFilter = `AND p.name GLOB '${packageName}*'`;
|
|
2811
|
+
}
|
|
2812
|
+
const sql = `
|
|
2813
|
+
SELECT
|
|
2814
|
+
s.name,
|
|
2815
|
+
COUNT(*) as count,
|
|
2816
|
+
AVG(s.dur) / 1e6 as avg_dur_ms,
|
|
2817
|
+
MIN(s.dur) / 1e6 as min_dur_ms,
|
|
2818
|
+
MAX(s.dur) / 1e6 as max_dur_ms,
|
|
2819
|
+
p.name as process_name
|
|
2820
|
+
FROM slice s
|
|
2821
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
2822
|
+
JOIN thread t ON tt.utid = t.utid
|
|
2823
|
+
JOIN process p ON t.upid = p.upid
|
|
2824
|
+
WHERE s.name GLOB '*Input*' OR s.name GLOB '*Click*' OR s.name GLOB '*Touch*'
|
|
2825
|
+
${processFilter}
|
|
2826
|
+
GROUP BY s.name, p.name
|
|
2827
|
+
ORDER BY avg_dur_ms DESC
|
|
2828
|
+
`;
|
|
2829
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
2830
|
+
if (queryResult.error) {
|
|
2831
|
+
return {
|
|
2832
|
+
analysisType: 'click_response',
|
|
2833
|
+
sql,
|
|
2834
|
+
rows: [],
|
|
2835
|
+
rowCount: 0,
|
|
2836
|
+
summary: `Error analyzing click response: ${queryResult.error}`,
|
|
2837
|
+
};
|
|
2838
|
+
}
|
|
2839
|
+
const rowObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
2840
|
+
const summary = this.formatClickResponseSummary(rowObjects);
|
|
2841
|
+
return {
|
|
2842
|
+
analysisType: 'click_response',
|
|
2843
|
+
sql,
|
|
2844
|
+
rows: rowObjects,
|
|
2845
|
+
rowCount: rowObjects.length,
|
|
2846
|
+
summary,
|
|
2847
|
+
};
|
|
2848
|
+
}
|
|
2849
|
+
/**
|
|
2850
|
+
* Analyze input events and latency
|
|
2851
|
+
* Based on input system tracking
|
|
2852
|
+
*/
|
|
2853
|
+
async analyzeInput(traceId, packageName) {
|
|
2854
|
+
let processFilter = '';
|
|
2855
|
+
if (packageName) {
|
|
2856
|
+
processFilter = `AND p.name GLOB '${packageName}*'`;
|
|
2857
|
+
}
|
|
2858
|
+
const sql = `
|
|
2859
|
+
SELECT
|
|
2860
|
+
s.name,
|
|
2861
|
+
COUNT(*) as count,
|
|
2862
|
+
AVG(s.dur) / 1e6 as avg_dur_ms,
|
|
2863
|
+
SUM(s.dur) / 1e6 as total_dur_ms,
|
|
2864
|
+
p.name as process_name
|
|
2865
|
+
FROM slice s
|
|
2866
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
2867
|
+
JOIN thread t ON tt.utid = t.utid
|
|
2868
|
+
JOIN process p ON t.upid = p.upid
|
|
2869
|
+
WHERE s.name GLOB '*input*' OR s.name GLOB '*Input*' OR s.name GLOB '*gesture*'
|
|
2870
|
+
${processFilter}
|
|
2871
|
+
GROUP BY s.name, p.name
|
|
2872
|
+
ORDER BY count DESC
|
|
2873
|
+
`;
|
|
2874
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
2875
|
+
if (queryResult.error) {
|
|
2876
|
+
return {
|
|
2877
|
+
analysisType: 'input',
|
|
2878
|
+
sql,
|
|
2879
|
+
rows: [],
|
|
2880
|
+
rowCount: 0,
|
|
2881
|
+
summary: `Error analyzing input: ${queryResult.error}`,
|
|
2882
|
+
};
|
|
2883
|
+
}
|
|
2884
|
+
const rowObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
2885
|
+
const summary = this.formatInputSummary(rowObjects);
|
|
2886
|
+
return {
|
|
2887
|
+
analysisType: 'input',
|
|
2888
|
+
sql,
|
|
2889
|
+
rows: rowObjects,
|
|
2890
|
+
rowCount: rowObjects.length,
|
|
2891
|
+
summary,
|
|
2892
|
+
};
|
|
2893
|
+
}
|
|
2894
|
+
/**
|
|
2895
|
+
* Analyze buffer flow and queue
|
|
2896
|
+
* Based on GPU fence and buffer queue patterns
|
|
2897
|
+
*/
|
|
2898
|
+
async analyzeBufferFlow(traceId) {
|
|
2899
|
+
const sql = `
|
|
2900
|
+
SELECT
|
|
2901
|
+
s.name,
|
|
2902
|
+
COUNT(*) as count,
|
|
2903
|
+
AVG(s.dur) / 1e6 as avg_dur_ms,
|
|
2904
|
+
SUM(s.dur) / 1e6 as total_dur_ms
|
|
2905
|
+
FROM slice s
|
|
2906
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
2907
|
+
JOIN thread t ON tt.utid = t.utid
|
|
2908
|
+
JOIN process p ON t.upid = p.upid
|
|
2909
|
+
WHERE p.name = '/system/bin/surfaceflinger'
|
|
2910
|
+
AND (s.name GLOB '*fence*' OR s.name GLOB '*GPU*')
|
|
2911
|
+
GROUP BY s.name
|
|
2912
|
+
ORDER BY total_dur_ms DESC
|
|
2913
|
+
`;
|
|
2914
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
2915
|
+
if (queryResult.error) {
|
|
2916
|
+
return {
|
|
2917
|
+
analysisType: 'bufferflow',
|
|
2918
|
+
sql,
|
|
2919
|
+
rows: [],
|
|
2920
|
+
rowCount: 0,
|
|
2921
|
+
summary: `Error analyzing buffer flow: ${queryResult.error}`,
|
|
2922
|
+
};
|
|
2923
|
+
}
|
|
2924
|
+
const rowObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
2925
|
+
const summary = this.formatBufferFlowSummary(rowObjects);
|
|
2926
|
+
return {
|
|
2927
|
+
analysisType: 'bufferflow',
|
|
2928
|
+
sql,
|
|
2929
|
+
rows: rowObjects,
|
|
2930
|
+
rowCount: rowObjects.length,
|
|
2931
|
+
summary,
|
|
2932
|
+
};
|
|
2933
|
+
}
|
|
2934
|
+
/**
|
|
2935
|
+
* Analyze SystemServer performance
|
|
2936
|
+
* Based on system_server process patterns
|
|
2937
|
+
*/
|
|
2938
|
+
async analyzeSystemServer(traceId) {
|
|
2939
|
+
const sql = `
|
|
2940
|
+
SELECT
|
|
2941
|
+
s.name,
|
|
2942
|
+
COUNT(*) as count,
|
|
2943
|
+
AVG(s.dur) / 1e6 as avg_dur_ms,
|
|
2944
|
+
MAX(s.dur) / 1e6 as max_dur_ms,
|
|
2945
|
+
SUM(s.dur) / 1e6 as total_dur_ms
|
|
2946
|
+
FROM slice s
|
|
2947
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
2948
|
+
JOIN thread t ON tt.utid = t.utid
|
|
2949
|
+
JOIN process p ON t.upid = p.upid
|
|
2950
|
+
WHERE p.name = 'system_server'
|
|
2951
|
+
AND s.dur > 10000000
|
|
2952
|
+
GROUP BY s.name
|
|
2953
|
+
ORDER BY total_dur_ms DESC
|
|
2954
|
+
`;
|
|
2955
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
2956
|
+
if (queryResult.error) {
|
|
2957
|
+
return {
|
|
2958
|
+
analysisType: 'systemserver',
|
|
2959
|
+
sql,
|
|
2960
|
+
rows: [],
|
|
2961
|
+
rowCount: 0,
|
|
2962
|
+
summary: `Error analyzing SystemServer: ${queryResult.error}`,
|
|
2963
|
+
};
|
|
2964
|
+
}
|
|
2965
|
+
const rowObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
2966
|
+
const summary = this.formatSystemServerSummary(rowObjects);
|
|
2967
|
+
return {
|
|
2968
|
+
analysisType: 'systemserver',
|
|
2969
|
+
sql,
|
|
2970
|
+
rows: rowObjects,
|
|
2971
|
+
rowCount: rowObjects.length,
|
|
2972
|
+
summary,
|
|
2973
|
+
};
|
|
2974
|
+
}
|
|
2975
|
+
/**
|
|
2976
|
+
* Analyze slow functions (>16ms)
|
|
2977
|
+
* Detects functions that exceed the 16.6ms frame budget
|
|
2978
|
+
*/
|
|
2979
|
+
async analyzeSlowFunctions(traceId, packageName) {
|
|
2980
|
+
let processFilter = '';
|
|
2981
|
+
if (packageName) {
|
|
2982
|
+
processFilter = `AND p.name GLOB '${packageName}*'`;
|
|
2983
|
+
}
|
|
2984
|
+
const frameTimelineCheck = await this.traceProcessor.query(traceId, `
|
|
2985
|
+
SELECT COUNT(*) as count FROM sqlite_master
|
|
2986
|
+
WHERE name = 'actual_frame_timeline_slice'
|
|
2987
|
+
`);
|
|
2988
|
+
const hasFrameTimeline = frameTimelineCheck.rows &&
|
|
2989
|
+
frameTimelineCheck.rows.length > 0 &&
|
|
2990
|
+
Number(frameTimelineCheck.rows[0][0] || 0) > 0;
|
|
2991
|
+
// Find long-running slices on app main thread only.
|
|
2992
|
+
// If FrameTimeline exists, also compute overlap with janky frames.
|
|
2993
|
+
const sql = hasFrameTimeline
|
|
2994
|
+
? `
|
|
2995
|
+
WITH main_thread_slices AS (
|
|
2996
|
+
SELECT
|
|
2997
|
+
s.name as function_name,
|
|
2998
|
+
s.dur / 1e6 as dur_ms,
|
|
2999
|
+
s.ts / 1e6 as ts_ms,
|
|
3000
|
+
s.ts as slice_start_ns,
|
|
3001
|
+
s.ts + s.dur as slice_end_ns,
|
|
3002
|
+
t.name as thread_name,
|
|
3003
|
+
p.name as process_name,
|
|
3004
|
+
p.upid
|
|
3005
|
+
FROM slice s
|
|
3006
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
3007
|
+
JOIN thread t ON tt.utid = t.utid
|
|
3008
|
+
JOIN process p ON t.upid = p.upid
|
|
3009
|
+
WHERE s.dur > 16000000
|
|
3010
|
+
${processFilter}
|
|
3011
|
+
AND (COALESCE(t.is_main_thread, 0) = 1 OR t.tid = p.pid OR LOWER(COALESCE(t.name, '')) = 'main')
|
|
3012
|
+
),
|
|
3013
|
+
janky_frames AS (
|
|
3014
|
+
SELECT
|
|
3015
|
+
a.upid,
|
|
3016
|
+
a.ts as frame_start_ns,
|
|
3017
|
+
a.ts + a.dur as frame_end_ns
|
|
3018
|
+
FROM actual_frame_timeline_slice a
|
|
3019
|
+
WHERE a.jank_type IS NOT NULL
|
|
3020
|
+
AND a.jank_type != 'None'
|
|
3021
|
+
),
|
|
3022
|
+
overlap_annotated AS (
|
|
3023
|
+
SELECT
|
|
3024
|
+
mts.*,
|
|
3025
|
+
CASE
|
|
3026
|
+
WHEN EXISTS (
|
|
3027
|
+
SELECT 1
|
|
3028
|
+
FROM janky_frames jf
|
|
3029
|
+
WHERE jf.upid = mts.upid
|
|
3030
|
+
AND jf.frame_start_ns < mts.slice_end_ns
|
|
3031
|
+
AND jf.frame_end_ns > mts.slice_start_ns
|
|
3032
|
+
) THEN 1
|
|
3033
|
+
ELSE 0
|
|
3034
|
+
END as overlaps_jank_frame,
|
|
3035
|
+
COALESCE((
|
|
3036
|
+
SELECT SUM(
|
|
3037
|
+
CASE
|
|
3038
|
+
WHEN MIN(mts.slice_end_ns, jf.frame_end_ns) > MAX(mts.slice_start_ns, jf.frame_start_ns)
|
|
3039
|
+
THEN MIN(mts.slice_end_ns, jf.frame_end_ns) - MAX(mts.slice_start_ns, jf.frame_start_ns)
|
|
3040
|
+
ELSE 0
|
|
3041
|
+
END
|
|
3042
|
+
)
|
|
3043
|
+
FROM janky_frames jf
|
|
3044
|
+
WHERE jf.upid = mts.upid
|
|
3045
|
+
AND jf.frame_start_ns < mts.slice_end_ns
|
|
3046
|
+
AND jf.frame_end_ns > mts.slice_start_ns
|
|
3047
|
+
), 0) / 1e6 as overlap_jank_ms
|
|
3048
|
+
FROM main_thread_slices mts
|
|
3049
|
+
),
|
|
3050
|
+
aggregated AS (
|
|
3051
|
+
SELECT
|
|
3052
|
+
function_name,
|
|
3053
|
+
process_name,
|
|
3054
|
+
COUNT(*) as count,
|
|
3055
|
+
AVG(dur_ms) as avg_dur_ms,
|
|
3056
|
+
MAX(dur_ms) as max_dur_ms,
|
|
3057
|
+
SUM(dur_ms) as total_dur_ms,
|
|
3058
|
+
SUM(overlaps_jank_frame) as jank_overlap_count,
|
|
3059
|
+
SUM(overlap_jank_ms) as total_jank_overlap_ms
|
|
3060
|
+
FROM overlap_annotated
|
|
3061
|
+
GROUP BY function_name, process_name
|
|
3062
|
+
)
|
|
3063
|
+
SELECT
|
|
3064
|
+
function_name,
|
|
3065
|
+
process_name,
|
|
3066
|
+
count,
|
|
3067
|
+
avg_dur_ms,
|
|
3068
|
+
max_dur_ms,
|
|
3069
|
+
total_dur_ms,
|
|
3070
|
+
jank_overlap_count,
|
|
3071
|
+
total_jank_overlap_ms
|
|
3072
|
+
FROM aggregated
|
|
3073
|
+
ORDER BY total_dur_ms DESC
|
|
3074
|
+
`
|
|
3075
|
+
: `
|
|
3076
|
+
WITH slow_functions AS (
|
|
3077
|
+
SELECT
|
|
3078
|
+
s.name as function_name,
|
|
3079
|
+
s.dur / 1e6 as dur_ms,
|
|
3080
|
+
s.ts / 1e6 as ts_ms,
|
|
3081
|
+
t.name as thread_name,
|
|
3082
|
+
p.name as process_name
|
|
3083
|
+
FROM slice s
|
|
3084
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
3085
|
+
JOIN thread t ON tt.utid = t.utid
|
|
3086
|
+
JOIN process p ON t.upid = p.upid
|
|
3087
|
+
WHERE s.dur > 16000000
|
|
3088
|
+
${processFilter}
|
|
3089
|
+
AND (COALESCE(t.is_main_thread, 0) = 1 OR t.tid = p.pid OR LOWER(COALESCE(t.name, '')) = 'main')
|
|
3090
|
+
),
|
|
3091
|
+
aggregated AS (
|
|
3092
|
+
SELECT
|
|
3093
|
+
function_name,
|
|
3094
|
+
process_name,
|
|
3095
|
+
COUNT(*) as count,
|
|
3096
|
+
AVG(dur_ms) as avg_dur_ms,
|
|
3097
|
+
MAX(dur_ms) as max_dur_ms,
|
|
3098
|
+
SUM(dur_ms) as total_dur_ms,
|
|
3099
|
+
0 as jank_overlap_count,
|
|
3100
|
+
0 as total_jank_overlap_ms
|
|
3101
|
+
FROM slow_functions
|
|
3102
|
+
GROUP BY function_name, process_name
|
|
3103
|
+
)
|
|
3104
|
+
SELECT
|
|
3105
|
+
function_name,
|
|
3106
|
+
process_name,
|
|
3107
|
+
count,
|
|
3108
|
+
avg_dur_ms,
|
|
3109
|
+
max_dur_ms,
|
|
3110
|
+
total_dur_ms,
|
|
3111
|
+
jank_overlap_count,
|
|
3112
|
+
total_jank_overlap_ms
|
|
3113
|
+
FROM aggregated
|
|
3114
|
+
ORDER BY total_dur_ms DESC
|
|
3115
|
+
`;
|
|
3116
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
3117
|
+
if (queryResult.error) {
|
|
3118
|
+
return {
|
|
3119
|
+
analysisType: 'slow_functions',
|
|
3120
|
+
sql,
|
|
3121
|
+
rows: [],
|
|
3122
|
+
rowCount: 0,
|
|
3123
|
+
summary: `Error analyzing slow functions: ${queryResult.error}`,
|
|
3124
|
+
};
|
|
3125
|
+
}
|
|
3126
|
+
const rowObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
3127
|
+
// Get top slowest individual instances from main thread.
|
|
3128
|
+
const topSlowestSql = hasFrameTimeline
|
|
3129
|
+
? `
|
|
3130
|
+
WITH janky_frames AS (
|
|
3131
|
+
SELECT
|
|
3132
|
+
a.upid,
|
|
3133
|
+
a.ts as frame_start_ns,
|
|
3134
|
+
a.ts + a.dur as frame_end_ns
|
|
3135
|
+
FROM actual_frame_timeline_slice a
|
|
3136
|
+
WHERE a.jank_type IS NOT NULL AND a.jank_type != 'None'
|
|
3137
|
+
)
|
|
3138
|
+
SELECT
|
|
3139
|
+
s.name as function_name,
|
|
3140
|
+
s.dur / 1e6 as dur_ms,
|
|
3141
|
+
s.ts / 1e6 as ts_ms,
|
|
3142
|
+
t.name as thread_name,
|
|
3143
|
+
p.name as process_name,
|
|
3144
|
+
CASE
|
|
3145
|
+
WHEN EXISTS (
|
|
3146
|
+
SELECT 1
|
|
3147
|
+
FROM janky_frames jf
|
|
3148
|
+
WHERE jf.upid = p.upid
|
|
3149
|
+
AND jf.frame_start_ns < s.ts + s.dur
|
|
3150
|
+
AND jf.frame_end_ns > s.ts
|
|
3151
|
+
) THEN 1
|
|
3152
|
+
ELSE 0
|
|
3153
|
+
END as overlaps_jank_frame
|
|
3154
|
+
FROM slice s
|
|
3155
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
3156
|
+
JOIN thread t ON tt.utid = t.utid
|
|
3157
|
+
JOIN process p ON t.upid = p.upid
|
|
3158
|
+
WHERE s.dur > 16000000
|
|
3159
|
+
${processFilter}
|
|
3160
|
+
AND (COALESCE(t.is_main_thread, 0) = 1 OR t.tid = p.pid OR LOWER(COALESCE(t.name, '')) = 'main')
|
|
3161
|
+
ORDER BY s.ts ASC
|
|
3162
|
+
`
|
|
3163
|
+
: `
|
|
3164
|
+
SELECT
|
|
3165
|
+
s.name as function_name,
|
|
3166
|
+
s.dur / 1e6 as dur_ms,
|
|
3167
|
+
s.ts / 1e6 as ts_ms,
|
|
3168
|
+
t.name as thread_name,
|
|
3169
|
+
p.name as process_name,
|
|
3170
|
+
0 as overlaps_jank_frame
|
|
3171
|
+
FROM slice s
|
|
3172
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
3173
|
+
JOIN thread t ON tt.utid = t.utid
|
|
3174
|
+
JOIN process p ON t.upid = p.upid
|
|
3175
|
+
WHERE s.dur > 16000000
|
|
3176
|
+
${processFilter}
|
|
3177
|
+
AND (COALESCE(t.is_main_thread, 0) = 1 OR t.tid = p.pid OR LOWER(COALESCE(t.name, '')) = 'main')
|
|
3178
|
+
ORDER BY s.ts ASC
|
|
3179
|
+
`;
|
|
3180
|
+
const topSlowestResult = await this.traceProcessor.query(traceId, topSlowestSql);
|
|
3181
|
+
const topSlowestObjects = rowsToObjects(topSlowestResult.columns || [], topSlowestResult.rows || []);
|
|
3182
|
+
const summary = this.formatSlowFunctionsSummary(rowObjects, topSlowestObjects);
|
|
3183
|
+
return {
|
|
3184
|
+
analysisType: 'slow_functions',
|
|
3185
|
+
sql,
|
|
3186
|
+
rows: rowObjects,
|
|
3187
|
+
rowCount: rowObjects.length,
|
|
3188
|
+
summary,
|
|
3189
|
+
metrics: {
|
|
3190
|
+
totalSlowFunctions: rowObjects.length,
|
|
3191
|
+
threshold: '16ms (long main-thread slice)',
|
|
3192
|
+
hasFrameTimeline: hasFrameTimeline ? 1 : 0,
|
|
3193
|
+
},
|
|
3194
|
+
details: {
|
|
3195
|
+
topSlowest: topSlowestObjects,
|
|
3196
|
+
},
|
|
3197
|
+
};
|
|
3198
|
+
}
|
|
3199
|
+
/**
|
|
3200
|
+
* Analyze network request performance
|
|
3201
|
+
* Uses network_traffic_slice table to track HTTP requests
|
|
3202
|
+
*/
|
|
3203
|
+
async analyzeNetwork(traceId, packageName) {
|
|
3204
|
+
let processFilter = '';
|
|
3205
|
+
if (packageName) {
|
|
3206
|
+
processFilter = `AND p.name GLOB '${packageName}*'`;
|
|
3207
|
+
}
|
|
3208
|
+
const sql = `
|
|
3209
|
+
SELECT
|
|
3210
|
+
net.name,
|
|
3211
|
+
net.slice_id,
|
|
3212
|
+
net.ts / 1e6 as ts_ms,
|
|
3213
|
+
net.dur / 1e6 as dur_ms,
|
|
3214
|
+
t.name as thread_name,
|
|
3215
|
+
p.name as process_name
|
|
3216
|
+
FROM network_traffic_slice net
|
|
3217
|
+
JOIN thread_track tt ON net.track_id = tt.id
|
|
3218
|
+
JOIN thread t ON tt.utid = t.utid
|
|
3219
|
+
JOIN process p ON t.upid = p.upid
|
|
3220
|
+
WHERE 1=1
|
|
3221
|
+
${processFilter}
|
|
3222
|
+
ORDER BY net.ts ASC
|
|
3223
|
+
`;
|
|
3224
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
3225
|
+
if (queryResult.error) {
|
|
3226
|
+
return {
|
|
3227
|
+
analysisType: 'network',
|
|
3228
|
+
sql,
|
|
3229
|
+
rows: [],
|
|
3230
|
+
rowCount: 0,
|
|
3231
|
+
summary: `Error analyzing network traffic: ${queryResult.error}`,
|
|
3232
|
+
};
|
|
3233
|
+
}
|
|
3234
|
+
const rowObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
3235
|
+
// Get aggregate statistics
|
|
3236
|
+
const statsSql = `
|
|
3237
|
+
SELECT
|
|
3238
|
+
COUNT(*) as total_requests,
|
|
3239
|
+
AVG(net.dur) / 1e6 as avg_dur_ms,
|
|
3240
|
+
MAX(net.dur) / 1e6 as max_dur_ms,
|
|
3241
|
+
MIN(net.dur) / 1e6 as min_dur_ms,
|
|
3242
|
+
SUM(CASE WHEN net.dur > 1000000000 THEN 1 ELSE 0 END) as slow_requests
|
|
3243
|
+
FROM network_traffic_slice net
|
|
3244
|
+
JOIN thread_track tt ON net.track_id = tt.id
|
|
3245
|
+
JOIN thread t ON tt.utid = t.utid
|
|
3246
|
+
JOIN process p ON t.upid = p.upid
|
|
3247
|
+
WHERE 1=1
|
|
3248
|
+
${processFilter}
|
|
3249
|
+
`;
|
|
3250
|
+
const statsResult = await this.traceProcessor.query(traceId, statsSql);
|
|
3251
|
+
const statsObjects = rowsToObjects(statsResult.columns || [], statsResult.rows || []);
|
|
3252
|
+
const stats = statsObjects.length > 0 ? statsObjects[0] : null;
|
|
3253
|
+
const summary = this.formatNetworkSummary(rowObjects, stats);
|
|
3254
|
+
return {
|
|
3255
|
+
analysisType: 'network',
|
|
3256
|
+
sql,
|
|
3257
|
+
rows: rowObjects,
|
|
3258
|
+
rowCount: rowObjects.length,
|
|
3259
|
+
summary,
|
|
3260
|
+
metrics: stats ? {
|
|
3261
|
+
totalRequests: stats.total_requests,
|
|
3262
|
+
avgDurationMs: stats.avg_dur_ms,
|
|
3263
|
+
maxDurationMs: stats.max_dur_ms,
|
|
3264
|
+
slowRequests: stats.slow_requests,
|
|
3265
|
+
} : undefined,
|
|
3266
|
+
};
|
|
3267
|
+
}
|
|
3268
|
+
/**
|
|
3269
|
+
* Analyze database query performance
|
|
3270
|
+
* Uses slice table to find SQLite/Room operations
|
|
3271
|
+
*/
|
|
3272
|
+
async analyzeDatabase(traceId, packageName) {
|
|
3273
|
+
let processFilter = '';
|
|
3274
|
+
if (packageName) {
|
|
3275
|
+
processFilter = `AND p.name GLOB '${packageName}*'`;
|
|
3276
|
+
}
|
|
3277
|
+
const sql = `
|
|
3278
|
+
SELECT
|
|
3279
|
+
s.name,
|
|
3280
|
+
s.ts / 1e6 as ts_ms,
|
|
3281
|
+
s.dur / 1e6 as dur_ms,
|
|
3282
|
+
t.name as thread_name,
|
|
3283
|
+
p.name as process_name
|
|
3284
|
+
FROM slice s
|
|
3285
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
3286
|
+
JOIN thread t ON tt.utid = t.utid
|
|
3287
|
+
JOIN process p ON t.upid = p.upid
|
|
3288
|
+
WHERE s.name GLOB '*sqlite*%' OR s.name GLOB '*room*%'
|
|
3289
|
+
${processFilter}
|
|
3290
|
+
ORDER BY s.ts ASC
|
|
3291
|
+
`;
|
|
3292
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
3293
|
+
if (queryResult.error) {
|
|
3294
|
+
return {
|
|
3295
|
+
analysisType: 'database',
|
|
3296
|
+
sql,
|
|
3297
|
+
rows: [],
|
|
3298
|
+
rowCount: 0,
|
|
3299
|
+
summary: `Error analyzing database queries: ${queryResult.error}`,
|
|
3300
|
+
};
|
|
3301
|
+
}
|
|
3302
|
+
const rowObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
3303
|
+
// Get aggregate statistics by query type
|
|
3304
|
+
const statsSql = `
|
|
3305
|
+
SELECT
|
|
3306
|
+
COUNT(*) as total_queries,
|
|
3307
|
+
AVG(s.dur) / 1e6 as avg_dur_ms,
|
|
3308
|
+
MAX(s.dur) / 1e6 as max_dur_ms,
|
|
3309
|
+
SUM(CASE WHEN s.dur > 16000000 THEN 1 ELSE 0 END) as slow_queries
|
|
3310
|
+
FROM slice s
|
|
3311
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
3312
|
+
JOIN thread t ON tt.utid = t.utid
|
|
3313
|
+
JOIN process p ON t.upid = p.upid
|
|
3314
|
+
WHERE s.name GLOB '*sqlite*%' OR s.name GLOB '*room*%'
|
|
3315
|
+
${processFilter}
|
|
3316
|
+
`;
|
|
3317
|
+
const statsResult = await this.traceProcessor.query(traceId, statsSql);
|
|
3318
|
+
const statsObjects = rowsToObjects(statsResult.columns || [], statsResult.rows || []);
|
|
3319
|
+
const stats = statsObjects.length > 0 ? statsObjects[0] : null;
|
|
3320
|
+
const summary = this.formatDatabaseSummary(rowObjects, stats);
|
|
3321
|
+
return {
|
|
3322
|
+
analysisType: 'database',
|
|
3323
|
+
sql,
|
|
3324
|
+
rows: rowObjects,
|
|
3325
|
+
rowCount: rowObjects.length,
|
|
3326
|
+
summary,
|
|
3327
|
+
metrics: stats ? {
|
|
3328
|
+
totalQueries: stats.total_queries,
|
|
3329
|
+
avgDurationMs: stats.avg_dur_ms,
|
|
3330
|
+
maxDurationMs: stats.max_dur_ms,
|
|
3331
|
+
slowQueries: stats.slow_queries,
|
|
3332
|
+
} : undefined,
|
|
3333
|
+
};
|
|
3334
|
+
}
|
|
3335
|
+
/**
|
|
3336
|
+
* Analyze file I/O performance
|
|
3337
|
+
* Uses slice table to find read/write operations
|
|
3338
|
+
*/
|
|
3339
|
+
async analyzeFileIO(traceId, packageName) {
|
|
3340
|
+
let processFilter = '';
|
|
3341
|
+
if (packageName) {
|
|
3342
|
+
processFilter = `AND p.name GLOB '${packageName}*'`;
|
|
3343
|
+
}
|
|
3344
|
+
const sql = `
|
|
3345
|
+
SELECT
|
|
3346
|
+
s.name,
|
|
3347
|
+
s.ts / 1e6 as ts_ms,
|
|
3348
|
+
s.dur / 1e6 as dur_ms,
|
|
3349
|
+
t.name as thread_name,
|
|
3350
|
+
p.name as process_name
|
|
3351
|
+
FROM slice s
|
|
3352
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
3353
|
+
JOIN thread t ON tt.utid = t.utid
|
|
3354
|
+
JOIN process p ON t.upid = p.upid
|
|
3355
|
+
WHERE s.name GLOB '*read*%' OR s.name GLOB '*write*%' OR s.name GLOB '*fs_*%'
|
|
3356
|
+
${processFilter}
|
|
3357
|
+
ORDER BY s.ts ASC
|
|
3358
|
+
`;
|
|
3359
|
+
const queryResult = await this.traceProcessor.query(traceId, sql);
|
|
3360
|
+
if (queryResult.error) {
|
|
3361
|
+
return {
|
|
3362
|
+
analysisType: 'file_io',
|
|
3363
|
+
sql,
|
|
3364
|
+
rows: [],
|
|
3365
|
+
rowCount: 0,
|
|
3366
|
+
summary: `Error analyzing file I/O: ${queryResult.error}`,
|
|
3367
|
+
};
|
|
3368
|
+
}
|
|
3369
|
+
const rowObjects = rowsToObjects(queryResult.columns, queryResult.rows);
|
|
3370
|
+
// Get aggregate statistics
|
|
3371
|
+
const statsSql = `
|
|
3372
|
+
SELECT
|
|
3373
|
+
COUNT(*) as total_operations,
|
|
3374
|
+
AVG(s.dur) / 1e6 as avg_dur_ms,
|
|
3375
|
+
MAX(s.dur) / 1e6 as max_dur_ms,
|
|
3376
|
+
SUM(CASE WHEN s.name GLOB '*read*' THEN 1 ELSE 0 END) as read_ops,
|
|
3377
|
+
SUM(CASE WHEN s.name GLOB '*write*' THEN 1 ELSE 0 END) as write_ops
|
|
3378
|
+
FROM slice s
|
|
3379
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
3380
|
+
JOIN thread t ON tt.utid = t.utid
|
|
3381
|
+
JOIN process p ON t.upid = p.upid
|
|
3382
|
+
WHERE s.name GLOB '*read*%' OR s.name GLOB '*write*%' OR s.name GLOB '*fs_*%'
|
|
3383
|
+
${processFilter}
|
|
3384
|
+
`;
|
|
3385
|
+
const statsResult = await this.traceProcessor.query(traceId, statsSql);
|
|
3386
|
+
const statsObjects = rowsToObjects(statsResult.columns || [], statsResult.rows || []);
|
|
3387
|
+
const stats = statsObjects.length > 0 ? statsObjects[0] : null;
|
|
3388
|
+
const summary = this.formatFileIOSummary(rowObjects, stats);
|
|
3389
|
+
return {
|
|
3390
|
+
analysisType: 'file_io',
|
|
3391
|
+
sql,
|
|
3392
|
+
rows: rowObjects,
|
|
3393
|
+
rowCount: rowObjects.length,
|
|
3394
|
+
summary,
|
|
3395
|
+
metrics: stats ? {
|
|
3396
|
+
totalOperations: stats.total_operations,
|
|
3397
|
+
avgDurationMs: stats.avg_dur_ms,
|
|
3398
|
+
maxDurationMs: stats.max_dur_ms,
|
|
3399
|
+
readOps: stats.read_ops,
|
|
3400
|
+
writeOps: stats.write_ops,
|
|
3401
|
+
} : undefined,
|
|
3402
|
+
};
|
|
3403
|
+
}
|
|
3404
|
+
// ========================================================================
|
|
3405
|
+
// Summary Formatting Methods
|
|
3406
|
+
// ========================================================================
|
|
3407
|
+
formatStartupSummary(startups) {
|
|
3408
|
+
if (startups.length === 0) {
|
|
3409
|
+
return 'No startup events found in trace.';
|
|
3410
|
+
}
|
|
3411
|
+
const byType = {};
|
|
3412
|
+
let totalDur = 0;
|
|
3413
|
+
for (const startup of startups) {
|
|
3414
|
+
byType[startup.startup_type] = (byType[startup.startup_type] || 0) + 1;
|
|
3415
|
+
totalDur += startup.dur_ms;
|
|
3416
|
+
}
|
|
3417
|
+
const avgDur = totalDur / startups.length;
|
|
3418
|
+
let summary = `Found ${startups.length} startup events. `;
|
|
3419
|
+
if (byType.cold)
|
|
3420
|
+
summary += `${byType.cold} cold, `;
|
|
3421
|
+
if (byType.warm)
|
|
3422
|
+
summary += `${byType.warm} warm, `;
|
|
3423
|
+
if (byType.hot)
|
|
3424
|
+
summary += `${byType.hot} hot. `;
|
|
3425
|
+
summary += `Average duration: ${avgDur.toFixed(2)}ms.`;
|
|
3426
|
+
return summary;
|
|
3427
|
+
}
|
|
3428
|
+
formatScrollingSummary(rows) {
|
|
3429
|
+
if (rows.length === 0) {
|
|
3430
|
+
return 'No frame data found in trace.';
|
|
3431
|
+
}
|
|
3432
|
+
const r = rows[0];
|
|
3433
|
+
const jankPercent = r.total_frames > 0 ? ((r.jank_frames / r.total_frames) * 100).toFixed(1) : '0';
|
|
3434
|
+
const fps = r.avg_frame_dur_ms > 0 ? (1000 / r.avg_frame_dur_ms).toFixed(1) : 'N/A';
|
|
3435
|
+
return `Analyzed ${r.total_frames} frames. ` +
|
|
3436
|
+
`Jank frames: ${r.jank_frames} (${jankPercent}%). ` +
|
|
3437
|
+
`Average FPS: ${fps}. ` +
|
|
3438
|
+
`Frame duration: ${r.avg_frame_dur_ms?.toFixed(2)}ms avg, ` +
|
|
3439
|
+
`${r.min_frame_dur_ms?.toFixed(2)}ms min, ` +
|
|
3440
|
+
`${r.max_frame_dur_ms?.toFixed(2)}ms max.`;
|
|
3441
|
+
}
|
|
3442
|
+
/**
|
|
3443
|
+
* Format summary for FrameTimeline-based scrolling analysis (Android 12+)
|
|
3444
|
+
*/
|
|
3445
|
+
formatFrameTimelineScrollingSummary(rows, jankTypeRows, enhancedAnalysis, stabilityAnalysis, rootCauseAnalysis) {
|
|
3446
|
+
if (rows.length === 0) {
|
|
3447
|
+
return 'No FrameTimeline data found in trace. Make sure FrameTimeline is enabled (Android 12+).';
|
|
3448
|
+
}
|
|
3449
|
+
const r = rows[0];
|
|
3450
|
+
const jankPercent = r.total_frames > 0 ? ((r.jank_frames / r.total_frames) * 100).toFixed(1) : '0';
|
|
3451
|
+
const fps = r.avg_frame_dur_ms > 0 ? (1000 / r.avg_frame_dur_ms).toFixed(1) : 'N/A';
|
|
3452
|
+
let summary = `[FrameTimeline Analysis - Android 12+] `;
|
|
3453
|
+
summary += `Analyzed ${r.total_frames} frames for ${r.process_name || 'app'}. `;
|
|
3454
|
+
summary += `Jank frames: ${r.jank_frames} (${jankPercent}%). `;
|
|
3455
|
+
if (r.missed_deadline_frames > 0) {
|
|
3456
|
+
summary += `Missed deadline: ${r.missed_deadline_frames} frames. `;
|
|
3457
|
+
}
|
|
3458
|
+
if (r.gpu_composition_frames > 0) {
|
|
3459
|
+
const gpuPercent = ((r.gpu_composition_frames / r.total_frames) * 100).toFixed(1);
|
|
3460
|
+
summary += `GPU composition: ${r.gpu_composition_frames} frames (${gpuPercent}% - indicates potential jank). `;
|
|
3461
|
+
}
|
|
3462
|
+
summary += `Average FPS: ${fps}. `;
|
|
3463
|
+
// Add stability score if available
|
|
3464
|
+
if (stabilityAnalysis) {
|
|
3465
|
+
summary += `\n\n[Stability Analysis] `;
|
|
3466
|
+
summary += `Score: ${stabilityAnalysis.stabilityScore}/100. `;
|
|
3467
|
+
summary += `Frame time: ${stabilityAnalysis.avgFrameTimeMs.toFixed(2)}ms avg, `;
|
|
3468
|
+
summary += `±${stabilityAnalysis.stdDevMs.toFixed(2)}ms (CV: ${stabilityAnalysis.coefficientOfVariation.toFixed(1)}%). `;
|
|
3469
|
+
summary += `P95: ${stabilityAnalysis.framePercentiles.p95.toFixed(1)}ms, P99: ${stabilityAnalysis.framePercentiles.p99.toFixed(1)}ms.`;
|
|
3470
|
+
}
|
|
3471
|
+
// Add jank type breakdown if available
|
|
3472
|
+
if (jankTypeRows.length > 0) {
|
|
3473
|
+
summary += `\n\n[Jank Type Breakdown] `;
|
|
3474
|
+
const jankTypes = jankTypeRows.map((jt) => {
|
|
3475
|
+
const typeName = jt.jank_type || 'Unknown';
|
|
3476
|
+
return `${typeName} (${jt.count})`;
|
|
3477
|
+
}).join(', ');
|
|
3478
|
+
summary += jankTypes;
|
|
3479
|
+
}
|
|
3480
|
+
// Add root cause analysis if available
|
|
3481
|
+
if (rootCauseAnalysis) {
|
|
3482
|
+
summary += `\n\n[Root Cause Analysis] `;
|
|
3483
|
+
const causes = [];
|
|
3484
|
+
if (rootCauseAnalysis.mainThreadJank > 0) {
|
|
3485
|
+
causes.push(`MainThread: ${rootCauseAnalysis.mainThreadJank}`);
|
|
3486
|
+
}
|
|
3487
|
+
if (rootCauseAnalysis.gpuJank > 0) {
|
|
3488
|
+
causes.push(`GPU: ${rootCauseAnalysis.gpuJank}`);
|
|
3489
|
+
}
|
|
3490
|
+
if (rootCauseAnalysis.bufferJank > 0) {
|
|
3491
|
+
causes.push(`BufferQueue: ${rootCauseAnalysis.bufferJank}`);
|
|
3492
|
+
}
|
|
3493
|
+
if (rootCauseAnalysis.sfJank > 0) {
|
|
3494
|
+
causes.push(`System: ${rootCauseAnalysis.sfJank}`);
|
|
3495
|
+
}
|
|
3496
|
+
if (causes.length > 0) {
|
|
3497
|
+
summary += causes.join(', ');
|
|
3498
|
+
}
|
|
3499
|
+
}
|
|
3500
|
+
// Add enhanced analysis if available
|
|
3501
|
+
if (enhancedAnalysis) {
|
|
3502
|
+
summary += `\n\n[Enhanced Analysis] `;
|
|
3503
|
+
if (enhancedAnalysis.consecutiveJankCount > 0) {
|
|
3504
|
+
summary += `Max consecutive janky frames: ${enhancedAnalysis.consecutiveJankCount}. `;
|
|
3505
|
+
}
|
|
3506
|
+
if (enhancedAnalysis.jankySessions && enhancedAnalysis.jankySessions.length > 0) {
|
|
3507
|
+
summary += `Janky sessions: ${enhancedAnalysis.jankySessions.length}`;
|
|
3508
|
+
const severeSessions = enhancedAnalysis.jankySessions.filter(s => s.severity === 'severe');
|
|
3509
|
+
if (severeSessions.length > 0) {
|
|
3510
|
+
summary += ` (Severe: ${severeSessions.length}, Max length: ${Math.max(...enhancedAnalysis.jankySessions.map(s => s.length))} frames). `;
|
|
3511
|
+
}
|
|
3512
|
+
}
|
|
3513
|
+
if (enhancedAnalysis.frozenFrames && enhancedAnalysis.frozenFrames.length > 0) {
|
|
3514
|
+
summary += `Frozen frames (>700ms): ${enhancedAnalysis.frozenFrames.length}`;
|
|
3515
|
+
summary += `, Longest: ${Math.max(...enhancedAnalysis.frozenFrames.map(f => f.dur)).toFixed(0)}ms.`;
|
|
3516
|
+
}
|
|
3517
|
+
}
|
|
3518
|
+
return summary;
|
|
3519
|
+
}
|
|
3520
|
+
/**
|
|
3521
|
+
* Format summary for legacy scrolling analysis (Android < 12)
|
|
3522
|
+
*/
|
|
3523
|
+
formatLegacyScrollingSummary(rows) {
|
|
3524
|
+
if (rows.length === 0) {
|
|
3525
|
+
return 'No frame data found in trace. Ensure Choreographer doFrame events are present.';
|
|
3526
|
+
}
|
|
3527
|
+
const r = rows[0];
|
|
3528
|
+
const jankPercent = r.total_frames > 0 ? ((r.jank_frames / r.total_frames) * 100).toFixed(1) : '0';
|
|
3529
|
+
const fps = r.avg_frame_dur_ms > 0 ? (1000 / r.avg_frame_dur_ms).toFixed(1) : 'N/A';
|
|
3530
|
+
let summary = `[Legacy Multi-dimensional Analysis - Android < 12] `;
|
|
3531
|
+
summary += `Analyzed ${r.total_frames} frames for ${r.process_name || 'app'}. `;
|
|
3532
|
+
summary += `Frames with missed doFrame: ${r.jank_frames} (${jankPercent}%). `;
|
|
3533
|
+
if (r.no_sf_composition_frames > 0) {
|
|
3534
|
+
summary += `Frames without SF composition: ${r.no_sf_composition_frames} (indicates buffer queue issues). `;
|
|
3535
|
+
}
|
|
3536
|
+
summary += `Average FPS: ${fps}. `;
|
|
3537
|
+
summary += `Frame duration: ${r.avg_frame_dur_ms?.toFixed(2)}ms avg, ` +
|
|
3538
|
+
`${r.min_frame_dur_ms?.toFixed(2)}ms min, ` +
|
|
3539
|
+
`${r.max_frame_dur_ms?.toFixed(2)}ms max.`;
|
|
3540
|
+
summary += `\n\nNote: For accurate jank detection with FrameTimeline, use Android 12+. ` +
|
|
3541
|
+
`This legacy analysis combines doFrame timing and SurfaceFlinger composition status.`;
|
|
3542
|
+
return summary;
|
|
3543
|
+
}
|
|
3544
|
+
formatMemorySummary(rows) {
|
|
3545
|
+
if (rows.length === 0) {
|
|
3546
|
+
return 'No memory events found in trace.';
|
|
3547
|
+
}
|
|
3548
|
+
let totalGcTime = 0;
|
|
3549
|
+
let gcCount = 0;
|
|
3550
|
+
for (const row of rows) {
|
|
3551
|
+
if (row.name?.toLowerCase().includes('gc')) {
|
|
3552
|
+
gcCount += row.count;
|
|
3553
|
+
totalGcTime += row.total_dur_ms;
|
|
3554
|
+
}
|
|
3555
|
+
}
|
|
3556
|
+
return `Found ${rows.length} memory-related event types. ` +
|
|
3557
|
+
`GC events: ${gcCount}, total GC time: ${totalGcTime.toFixed(2)}ms.`;
|
|
3558
|
+
}
|
|
3559
|
+
formatCpuSummary(rows) {
|
|
3560
|
+
if (rows.length === 0) {
|
|
3561
|
+
return 'No CPU data found in trace.';
|
|
3562
|
+
}
|
|
3563
|
+
const topThread = rows[0];
|
|
3564
|
+
const cpuPercent = topThread.total_dur_ms > 0
|
|
3565
|
+
? ((topThread.running_dur_ms / topThread.total_dur_ms) * 100).toFixed(1)
|
|
3566
|
+
: '0';
|
|
3567
|
+
return `Analyzed ${rows.length} threads. ` +
|
|
3568
|
+
`Top thread: ${topThread.thread_name} (${topThread.process_name}). ` +
|
|
3569
|
+
`CPU utilization: ${cpuPercent}%.`;
|
|
3570
|
+
}
|
|
3571
|
+
formatSurfaceFlingerSummary(rows) {
|
|
3572
|
+
if (rows.length === 0) {
|
|
3573
|
+
return 'No SurfaceFlinger data found in trace.';
|
|
3574
|
+
}
|
|
3575
|
+
const r = rows[0];
|
|
3576
|
+
const jankPercent = r.total_frames > 0 ? ((r.missed_frames / r.total_frames) * 100).toFixed(1) : '0';
|
|
3577
|
+
return `SurfaceFlinger: ${r.total_frames} frames, ` +
|
|
3578
|
+
`${r.missed_frames} missed (${jankPercent}% jank). ` +
|
|
3579
|
+
`Average frame duration: ${r.avg_frame_dur_ms?.toFixed(2)}ms.`;
|
|
3580
|
+
}
|
|
3581
|
+
formatBinderSummary(rows) {
|
|
3582
|
+
if (rows.length === 0) {
|
|
3583
|
+
return 'No Binder transactions found in trace.';
|
|
3584
|
+
}
|
|
3585
|
+
const totalTxns = rows.reduce((sum, r) => sum + r.count, 0);
|
|
3586
|
+
const avgDur = rows.reduce((sum, r) => sum + r.avg_dur_ms * r.count, 0) / totalTxns;
|
|
3587
|
+
return `Found ${totalTxns} Binder transactions across ${rows.length} types. ` +
|
|
3588
|
+
`Average duration: ${avgDur?.toFixed(2)}ms.`;
|
|
3589
|
+
}
|
|
3590
|
+
formatNavigationSummary(rows) {
|
|
3591
|
+
if (rows.length === 0) {
|
|
3592
|
+
return 'No navigation events found in trace.';
|
|
3593
|
+
}
|
|
3594
|
+
const totalNavs = rows.reduce((sum, r) => sum + r.count, 0);
|
|
3595
|
+
const avgDur = rows.reduce((sum, r) => sum + r.avg_dur_ms * r.count, 0) / totalNavs;
|
|
3596
|
+
return `Found ${totalNavs} navigation/transition events across ${rows.length} types. ` +
|
|
3597
|
+
`Average duration: ${avgDur?.toFixed(2)}ms.`;
|
|
3598
|
+
}
|
|
3599
|
+
formatClickResponseSummary(rows) {
|
|
3600
|
+
if (rows.length === 0) {
|
|
3601
|
+
return 'No click/touch events found in trace.';
|
|
3602
|
+
}
|
|
3603
|
+
const totalClicks = rows.reduce((sum, r) => sum + r.count, 0);
|
|
3604
|
+
const avgDur = rows.reduce((sum, r) => sum + r.avg_dur_ms * r.count, 0) / totalClicks;
|
|
3605
|
+
return `Found ${totalClicks} click/touch events across ${rows.length} types. ` +
|
|
3606
|
+
`Average response time: ${avgDur?.toFixed(2)}ms.`;
|
|
3607
|
+
}
|
|
3608
|
+
formatInputSummary(rows) {
|
|
3609
|
+
if (rows.length === 0) {
|
|
3610
|
+
return 'No input events found in trace.';
|
|
3611
|
+
}
|
|
3612
|
+
const totalInputs = rows.reduce((sum, r) => sum + r.count, 0);
|
|
3613
|
+
const avgDur = rows.reduce((sum, r) => sum + r.avg_dur_ms * r.count, 0) / totalInputs;
|
|
3614
|
+
return `Found ${totalInputs} input events across ${rows.length} types. ` +
|
|
3615
|
+
`Average duration: ${avgDur?.toFixed(2)}ms.`;
|
|
3616
|
+
}
|
|
3617
|
+
formatBufferFlowSummary(rows) {
|
|
3618
|
+
if (rows.length === 0) {
|
|
3619
|
+
return 'No buffer flow events found in trace.';
|
|
3620
|
+
}
|
|
3621
|
+
const totalDur = rows.reduce((sum, r) => sum + r.total_dur_ms, 0);
|
|
3622
|
+
const avgDur = rows.reduce((sum, r) => sum + r.avg_dur_ms * r.count, 0) / rows.length;
|
|
3623
|
+
return `Found ${rows.length} buffer flow event types. ` +
|
|
3624
|
+
`Total GPU/buffer wait time: ${totalDur.toFixed(2)}ms, average: ${avgDur.toFixed(2)}ms.`;
|
|
3625
|
+
}
|
|
3626
|
+
formatSystemServerSummary(rows) {
|
|
3627
|
+
if (rows.length === 0) {
|
|
3628
|
+
return 'No SystemServer operations found in trace.';
|
|
3629
|
+
}
|
|
3630
|
+
const totalOps = rows.reduce((sum, r) => sum + r.count, 0);
|
|
3631
|
+
const totalDur = rows.reduce((sum, r) => sum + r.total_dur_ms, 0);
|
|
3632
|
+
const avgDur = rows.reduce((sum, r) => sum + r.avg_dur_ms * r.count, 0) / totalOps;
|
|
3633
|
+
return `Found ${totalOps} SystemServer operations (>10ms). ` +
|
|
3634
|
+
`Total time: ${totalDur.toFixed(2)}ms, average: ${avgDur.toFixed(2)}ms.`;
|
|
3635
|
+
}
|
|
3636
|
+
formatSlowFunctionsSummary(rows, topSlowest) {
|
|
3637
|
+
if (rows.length === 0) {
|
|
3638
|
+
return 'No long main-thread slices (>16ms) were found.';
|
|
3639
|
+
}
|
|
3640
|
+
const totalCount = rows.reduce((sum, r) => sum + r.count, 0);
|
|
3641
|
+
const totalDur = rows.reduce((sum, r) => sum + r.total_dur_ms, 0);
|
|
3642
|
+
const avgDur = rows.reduce((sum, r) => sum + r.avg_dur_ms * r.count, 0) / totalCount;
|
|
3643
|
+
const jankOverlapCount = rows.reduce((sum, r) => sum + Number(r.jank_overlap_count || 0), 0);
|
|
3644
|
+
const overlapRatio = totalCount > 0 ? (jankOverlapCount / totalCount) * 100 : 0;
|
|
3645
|
+
let summary = `Found ${rows.length} types of long main-thread slices (>16ms). `;
|
|
3646
|
+
summary += `Total occurrences: ${totalCount}. `;
|
|
3647
|
+
summary += `Total time: ${totalDur.toFixed(2)}ms, average: ${avgDur.toFixed(2)}ms.`;
|
|
3648
|
+
if (jankOverlapCount > 0) {
|
|
3649
|
+
summary += ` Overlap with janky frames: ${jankOverlapCount}/${totalCount} (${overlapRatio.toFixed(1)}%).`;
|
|
3650
|
+
}
|
|
3651
|
+
else {
|
|
3652
|
+
summary += ' No overlap with detected janky frames in this trace.';
|
|
3653
|
+
}
|
|
3654
|
+
if (topSlowest.length > 0) {
|
|
3655
|
+
const slowest = topSlowest[0];
|
|
3656
|
+
const overlapTag = Number(slowest.overlaps_jank_frame || 0) > 0 ? ' [overlaps jank frame]' : '';
|
|
3657
|
+
summary += ` Slowest instance: ${slowest.function_name} at ${slowest.dur_ms.toFixed(2)}ms ` +
|
|
3658
|
+
`in ${slowest.thread_name} thread (${slowest.process_name}).${overlapTag}`;
|
|
3659
|
+
}
|
|
3660
|
+
return summary;
|
|
3661
|
+
}
|
|
3662
|
+
formatNetworkSummary(rows, stats) {
|
|
3663
|
+
if (rows.length === 0) {
|
|
3664
|
+
return 'No network traffic found in trace.';
|
|
3665
|
+
}
|
|
3666
|
+
let summary = `Found ${rows.length} network requests.`;
|
|
3667
|
+
if (stats) {
|
|
3668
|
+
const avgDur = stats.avg_dur_ms;
|
|
3669
|
+
const minDur = stats.min_dur_ms;
|
|
3670
|
+
const maxDur = stats.max_dur_ms;
|
|
3671
|
+
const slowRequests = stats.slow_requests;
|
|
3672
|
+
summary += ` Average duration: ${avgDur?.toFixed(2)}ms. `;
|
|
3673
|
+
summary += `Min: ${minDur?.toFixed(2)}ms, Max: ${maxDur?.toFixed(2)}ms.`;
|
|
3674
|
+
if (slowRequests > 0) {
|
|
3675
|
+
summary += ` Slow requests (>1s): ${slowRequests}.`;
|
|
3676
|
+
}
|
|
3677
|
+
}
|
|
3678
|
+
return summary;
|
|
3679
|
+
}
|
|
3680
|
+
formatDatabaseSummary(rows, stats) {
|
|
3681
|
+
if (rows.length === 0) {
|
|
3682
|
+
return 'No database queries found in trace.';
|
|
3683
|
+
}
|
|
3684
|
+
let summary = `Found ${rows.length} database queries (SQLite/Room).`;
|
|
3685
|
+
if (stats) {
|
|
3686
|
+
const avgDur = stats.avg_dur_ms;
|
|
3687
|
+
const maxDur = stats.max_dur_ms;
|
|
3688
|
+
const slowQueries = stats.slow_queries;
|
|
3689
|
+
summary += ` Average duration: ${avgDur?.toFixed(2)}ms. `;
|
|
3690
|
+
summary += `Max: ${maxDur?.toFixed(2)}ms.`;
|
|
3691
|
+
if (slowQueries > 0) {
|
|
3692
|
+
summary += ` Slow queries (>16ms): ${slowQueries}.`;
|
|
3693
|
+
}
|
|
3694
|
+
}
|
|
3695
|
+
return summary;
|
|
3696
|
+
}
|
|
3697
|
+
formatFileIOSummary(rows, stats) {
|
|
3698
|
+
if (rows.length === 0) {
|
|
3699
|
+
return 'No file I/O operations found in trace.';
|
|
3700
|
+
}
|
|
3701
|
+
let summary = `Found ${rows.length} file I/O operations.`;
|
|
3702
|
+
if (stats) {
|
|
3703
|
+
const avgDur = stats.avg_dur_ms;
|
|
3704
|
+
const maxDur = stats.max_dur_ms;
|
|
3705
|
+
const readOps = stats.read_ops;
|
|
3706
|
+
const writeOps = stats.write_ops;
|
|
3707
|
+
summary += ` Average duration: ${avgDur?.toFixed(2)}ms. `;
|
|
3708
|
+
summary += `Max: ${maxDur?.toFixed(2)}ms. `;
|
|
3709
|
+
summary += `Read ops: ${readOps}, Write ops: ${writeOps}.`;
|
|
3710
|
+
}
|
|
3711
|
+
return summary;
|
|
3712
|
+
}
|
|
3713
|
+
// ========================================================================
|
|
3714
|
+
// Utility Methods
|
|
3715
|
+
// ========================================================================
|
|
3716
|
+
/**
|
|
3717
|
+
* Get available analysis types
|
|
3718
|
+
*/
|
|
3719
|
+
getAvailableSkills() {
|
|
3720
|
+
return Object.values(perfettoSql_1.PerfettoSkillType);
|
|
3721
|
+
}
|
|
3722
|
+
/**
|
|
3723
|
+
* Get knowledge base reference
|
|
3724
|
+
*/
|
|
3725
|
+
getKnowledgeBase() {
|
|
3726
|
+
return this.knowledgeBase;
|
|
3727
|
+
}
|
|
3728
|
+
}
|
|
3729
|
+
exports.PerfettoSqlSkill = PerfettoSqlSkill;
|
|
3730
|
+
exports.default = PerfettoSqlSkill;
|
|
3731
|
+
//# sourceMappingURL=perfettoSqlSkill.js.map
|