@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,4349 @@
|
|
|
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
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
/**
|
|
43
|
+
* Agent Analysis Routes
|
|
44
|
+
*
|
|
45
|
+
* API endpoints for Agent-based trace analysis using the agent-driven architecture
|
|
46
|
+
*/
|
|
47
|
+
const express_1 = __importDefault(require("express"));
|
|
48
|
+
const fs = __importStar(require("fs"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const traceProcessorService_1 = require("../services/traceProcessorService");
|
|
51
|
+
const sessionLogger_1 = require("../services/sessionLogger");
|
|
52
|
+
const htmlReportGenerator_1 = require("../services/htmlReportGenerator");
|
|
53
|
+
const agentReportData_1 = require("../services/agentReportData");
|
|
54
|
+
const persistAgentSession_1 = require("../services/persistAgentSession");
|
|
55
|
+
const comparisonAppendixService_1 = require("../services/comparisonAppendixService");
|
|
56
|
+
const agentResultNormalizer_1 = require("../services/agentResultNormalizer");
|
|
57
|
+
const reportRoutes_1 = require("./reportRoutes");
|
|
58
|
+
const sessionPersistenceService_1 = require("../services/sessionPersistenceService");
|
|
59
|
+
const auth_1 = require("../middleware/auth");
|
|
60
|
+
const resourceOwnership_1 = require("../services/resourceOwnership");
|
|
61
|
+
const rbac_1 = require("../services/rbac");
|
|
62
|
+
const traceMetadataStore_1 = require("../services/traceMetadataStore");
|
|
63
|
+
const enhancedSessionContext_1 = require("../agent/context/enhancedSessionContext");
|
|
64
|
+
const agent_1 = require("../agent");
|
|
65
|
+
const modelRouterSingleton_1 = require("../agent/core/modelRouterSingleton");
|
|
66
|
+
const conclusionSceneTemplates_1 = require("../agent/core/conclusionSceneTemplates");
|
|
67
|
+
const analysisNarrative_1 = require("../utils/analysisNarrative");
|
|
68
|
+
const agentSceneReconstructRoutes_1 = require("./agentSceneReconstructRoutes");
|
|
69
|
+
const sceneStoryService_1 = require("../agent/scene/sceneStoryService");
|
|
70
|
+
const sceneReportStore_1 = require("../services/sceneReport/sceneReportStore");
|
|
71
|
+
const sceneReportMemoryCache_1 = require("../services/sceneReport/sceneReportMemoryCache");
|
|
72
|
+
const traceHash_1 = require("../agent/scene/traceHash");
|
|
73
|
+
const sceneTraceDurationProbe_1 = require("../agent/scene/sceneTraceDurationProbe");
|
|
74
|
+
const config_1 = require("../config");
|
|
75
|
+
const traceProcessorLeaseStore_1 = require("../services/traceProcessorLeaseStore");
|
|
76
|
+
const traceProcessorLeaseModeDecision_1 = require("../services/traceProcessorLeaseModeDecision");
|
|
77
|
+
const enterpriseQuotaPolicyService_1 = require("../services/enterpriseQuotaPolicyService");
|
|
78
|
+
const enterpriseTenantLifecycleService_1 = require("../services/enterpriseTenantLifecycleService");
|
|
79
|
+
const traceProcessorRamBudget_1 = require("../services/traceProcessorRamBudget");
|
|
80
|
+
const workingTraceProcessor_1 = require("../services/workingTraceProcessor");
|
|
81
|
+
const agentLogsRoutes_1 = require("./agentLogsRoutes");
|
|
82
|
+
const agentQuickSceneRoutes_1 = require("./agentQuickSceneRoutes");
|
|
83
|
+
const agentReportRoutes_1 = require("./agentReportRoutes");
|
|
84
|
+
const agentResumeRoutes_1 = require("./agentResumeRoutes");
|
|
85
|
+
const agentSessionCatalogRoutes_1 = require("./agentSessionCatalogRoutes");
|
|
86
|
+
const agentTeachingRoutes_1 = require("./agentTeachingRoutes");
|
|
87
|
+
const assistantApplicationService_1 = require("../assistant/application/assistantApplicationService");
|
|
88
|
+
const streamProjector_1 = require("../assistant/stream/streamProjector");
|
|
89
|
+
const sessionSseReplay_1 = require("../assistant/stream/sessionSseReplay");
|
|
90
|
+
const agentEventStore_1 = require("../services/agentEventStore");
|
|
91
|
+
const analysisRunStore_1 = require("../services/analysisRunStore");
|
|
92
|
+
const agentAnalyzeSessionService_1 = require("../assistant/application/agentAnalyzeSessionService");
|
|
93
|
+
const assistantResultContract_1 = require("../assistant/contracts/assistantResultContract");
|
|
94
|
+
const analysisResultSnapshotPipeline_1 = require("../services/analysisResultSnapshotPipeline");
|
|
95
|
+
// DataEnvelope types for v2.0 data contract
|
|
96
|
+
const dataContract_1 = require("../types/dataContract");
|
|
97
|
+
const skillExecutor_1 = require("../services/skillEngine/skillExecutor");
|
|
98
|
+
const skillLoader_1 = require("../services/skillEngine/skillLoader");
|
|
99
|
+
const feedbackEnricher_1 = require("../agentv3/selfImprove/feedbackEnricher");
|
|
100
|
+
const toolNarration_1 = require("../agentv3/toolNarration");
|
|
101
|
+
const analysisPatternMemory_1 = require("../agentv3/analysisPatternMemory");
|
|
102
|
+
const runtimePaths_1 = require("../runtimePaths");
|
|
103
|
+
const router = express_1.default.Router();
|
|
104
|
+
const REQUEST_ID_HEADER = 'x-request-id';
|
|
105
|
+
const MAX_REQUEST_ID_LENGTH = 128;
|
|
106
|
+
function sanitizeRequestId(raw) {
|
|
107
|
+
const text = String(raw || '').trim();
|
|
108
|
+
if (!text)
|
|
109
|
+
return '';
|
|
110
|
+
const normalized = text.replace(/[^a-zA-Z0-9._:-]/g, '').slice(0, MAX_REQUEST_ID_LENGTH);
|
|
111
|
+
return normalized;
|
|
112
|
+
}
|
|
113
|
+
function generateRequestId() {
|
|
114
|
+
return `req-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
|
|
115
|
+
}
|
|
116
|
+
function resolveRequestIdFromRequest(req) {
|
|
117
|
+
const headerId = req.header(REQUEST_ID_HEADER) ||
|
|
118
|
+
req.header('x-correlation-id') ||
|
|
119
|
+
req.header('x-amzn-trace-id');
|
|
120
|
+
const bodyId = req.body && typeof req.body === 'object' && !Array.isArray(req.body)
|
|
121
|
+
? req.body.requestId
|
|
122
|
+
: undefined;
|
|
123
|
+
return sanitizeRequestId(headerId) || sanitizeRequestId(bodyId) || generateRequestId();
|
|
124
|
+
}
|
|
125
|
+
function getRequestId(req) {
|
|
126
|
+
return req.assistantRequestId || resolveRequestIdFromRequest(req);
|
|
127
|
+
}
|
|
128
|
+
function normalizeRunSequence(value) {
|
|
129
|
+
if (!Number.isFinite(value))
|
|
130
|
+
return 0;
|
|
131
|
+
return Math.max(0, Math.floor(Number(value)));
|
|
132
|
+
}
|
|
133
|
+
function buildRunId(sessionId, sequence) {
|
|
134
|
+
return `run-${sessionId}-${sequence}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
135
|
+
}
|
|
136
|
+
function sendAgentQuotaDenied(res, decision) {
|
|
137
|
+
return res.status(decision.httpStatus).json({
|
|
138
|
+
success: false,
|
|
139
|
+
code: decision.code,
|
|
140
|
+
status: decision.status,
|
|
141
|
+
error: decision.message,
|
|
142
|
+
details: decision.details,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
function terminalRunStatusForResult(result) {
|
|
146
|
+
if (result.terminationReason === 'max_budget_usd')
|
|
147
|
+
return 'quota_exceeded';
|
|
148
|
+
return result.success ? 'completed' : 'failed';
|
|
149
|
+
}
|
|
150
|
+
function enterpriseLeasesEnabled() {
|
|
151
|
+
return (0, config_1.resolveFeatureConfig)().enterprise;
|
|
152
|
+
}
|
|
153
|
+
function leaseScopeFromRequestContext(context) {
|
|
154
|
+
return {
|
|
155
|
+
tenantId: context.tenantId,
|
|
156
|
+
workspaceId: context.workspaceId,
|
|
157
|
+
userId: context.userId,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function leaseScopeFromSession(session) {
|
|
161
|
+
if (!session.tenantId || !session.workspaceId)
|
|
162
|
+
return null;
|
|
163
|
+
return {
|
|
164
|
+
tenantId: session.tenantId,
|
|
165
|
+
workspaceId: session.workspaceId,
|
|
166
|
+
userId: session.userId,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
function markLeaseReadyIfNew(lease, scope) {
|
|
170
|
+
if (lease.state !== 'pending')
|
|
171
|
+
return lease;
|
|
172
|
+
const store = (0, traceProcessorLeaseStore_1.getTraceProcessorLeaseStore)();
|
|
173
|
+
const starting = store.markStarting(scope, lease.id);
|
|
174
|
+
return store.markReady(scope, starting.id);
|
|
175
|
+
}
|
|
176
|
+
function buildLeaseModeDecisionForTrace(scope, traceId, holderType, options = {}) {
|
|
177
|
+
const store = (0, traceProcessorLeaseStore_1.getTraceProcessorLeaseStore)();
|
|
178
|
+
const processorStats = workingTraceProcessor_1.TraceProcessorFactory.getStats();
|
|
179
|
+
return (0, traceProcessorLeaseModeDecision_1.buildTraceProcessorLeaseModeDecision)({
|
|
180
|
+
traceId,
|
|
181
|
+
holderType,
|
|
182
|
+
analysisMode: options.analysisMode,
|
|
183
|
+
estimatedSqlMs: options.estimatedSqlMs,
|
|
184
|
+
heavySkill: options.heavySkill,
|
|
185
|
+
longTask: options.longTask,
|
|
186
|
+
estimatedNewLeaseRssBytes: typeof options.traceSizeBytes === 'number'
|
|
187
|
+
? (0, traceProcessorRamBudget_1.estimateTraceProcessorRssBytes)(options.traceSizeBytes)
|
|
188
|
+
: undefined,
|
|
189
|
+
leases: store.listLeases(scope, { traceId }),
|
|
190
|
+
processors: processorStats.processors,
|
|
191
|
+
ramBudget: processorStats.ramBudget,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
function buildSessionObservability(session) {
|
|
195
|
+
const run = session.activeRun || session.lastRun;
|
|
196
|
+
if (!run)
|
|
197
|
+
return undefined;
|
|
198
|
+
return {
|
|
199
|
+
runId: run.runId,
|
|
200
|
+
requestId: run.requestId,
|
|
201
|
+
runSequence: normalizeRunSequence(run.sequence),
|
|
202
|
+
status: run.status,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
function buildStreamObservability(session) {
|
|
206
|
+
const run = session.activeRun || session.lastRun;
|
|
207
|
+
if (!run)
|
|
208
|
+
return {};
|
|
209
|
+
return {
|
|
210
|
+
runId: run.runId,
|
|
211
|
+
requestId: run.requestId,
|
|
212
|
+
runSequence: normalizeRunSequence(run.sequence),
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function startSessionRun(session, query, requestId) {
|
|
216
|
+
const nextSequence = normalizeRunSequence(session.runSequence) + 1;
|
|
217
|
+
session.runSequence = nextSequence;
|
|
218
|
+
const run = {
|
|
219
|
+
runId: buildRunId(session.sessionId, nextSequence),
|
|
220
|
+
requestId: sanitizeRequestId(requestId) || generateRequestId(),
|
|
221
|
+
sequence: nextSequence,
|
|
222
|
+
query,
|
|
223
|
+
startedAt: Date.now(),
|
|
224
|
+
status: 'pending',
|
|
225
|
+
};
|
|
226
|
+
session.activeRun = run;
|
|
227
|
+
session.lastRun = run;
|
|
228
|
+
// Record query in cross-turn history (append-only, never overwritten)
|
|
229
|
+
if (!session.queryHistory)
|
|
230
|
+
session.queryHistory = [];
|
|
231
|
+
session.queryHistory.push({ turn: nextSequence, query, timestamp: Date.now() });
|
|
232
|
+
// Inject turn boundary marker for multi-turn conversations
|
|
233
|
+
if (nextSequence > 1) {
|
|
234
|
+
session.conversationOrdinal = (Number.isFinite(session.conversationOrdinal) ? session.conversationOrdinal : 0) + 1;
|
|
235
|
+
const boundaryOrdinal = session.conversationOrdinal;
|
|
236
|
+
session.conversationSteps.push({
|
|
237
|
+
eventId: `turn-boundary-${session.sessionId}-${nextSequence}`,
|
|
238
|
+
ordinal: boundaryOrdinal,
|
|
239
|
+
phase: 'progress',
|
|
240
|
+
role: 'system',
|
|
241
|
+
text: `── 第 ${nextSequence} 轮对话开始 ──`,
|
|
242
|
+
timestamp: Date.now(),
|
|
243
|
+
sourceEventType: 'turn_boundary',
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
persistSessionRunState(session, 'pending');
|
|
247
|
+
return run;
|
|
248
|
+
}
|
|
249
|
+
function markSessionRunStatus(session, status, error) {
|
|
250
|
+
if (!session.activeRun)
|
|
251
|
+
return;
|
|
252
|
+
session.activeRun.status = status;
|
|
253
|
+
if (status === 'completed' || status === 'failed' || status === 'quota_exceeded') {
|
|
254
|
+
session.activeRun.completedAt = Date.now();
|
|
255
|
+
}
|
|
256
|
+
session.activeRun.error = error;
|
|
257
|
+
session.lastRun = { ...session.activeRun };
|
|
258
|
+
persistSessionRunState(session, status, error);
|
|
259
|
+
}
|
|
260
|
+
// Attach/echo requestId for all agent endpoints.
|
|
261
|
+
router.use((req, res, next) => {
|
|
262
|
+
const requestId = resolveRequestIdFromRequest(req);
|
|
263
|
+
req.assistantRequestId = requestId;
|
|
264
|
+
res.setHeader(REQUEST_ID_HEADER, requestId);
|
|
265
|
+
next();
|
|
266
|
+
});
|
|
267
|
+
// Apply API-key auth and RequestContext to all Agent endpoints (dev fallback still applies when key is not configured).
|
|
268
|
+
router.use(auth_1.authenticate);
|
|
269
|
+
const assistantAppService = new assistantApplicationService_1.AssistantApplicationService();
|
|
270
|
+
const streamProjector = new streamProjector_1.StreamProjector();
|
|
271
|
+
function agentEventScopeFromSession(session) {
|
|
272
|
+
const run = session.activeRun || session.lastRun;
|
|
273
|
+
if (!(0, config_1.resolveFeatureConfig)().enterprise ||
|
|
274
|
+
!session.tenantId ||
|
|
275
|
+
!session.workspaceId ||
|
|
276
|
+
!run?.runId) {
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
tenantId: session.tenantId,
|
|
281
|
+
workspaceId: session.workspaceId,
|
|
282
|
+
userId: session.userId,
|
|
283
|
+
sessionId: session.sessionId,
|
|
284
|
+
runId: run.runId,
|
|
285
|
+
traceId: session.traceId,
|
|
286
|
+
query: run.query || session.query,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
function analysisRunScopeFromSession(session) {
|
|
290
|
+
return agentEventScopeFromSession(session);
|
|
291
|
+
}
|
|
292
|
+
function persistSessionRunState(session, status, error) {
|
|
293
|
+
const scope = analysisRunScopeFromSession(session);
|
|
294
|
+
if (!scope)
|
|
295
|
+
return;
|
|
296
|
+
try {
|
|
297
|
+
(0, analysisRunStore_1.persistAnalysisRunState)(scope, status, { error });
|
|
298
|
+
}
|
|
299
|
+
catch (persistError) {
|
|
300
|
+
const message = persistError instanceof Error ? persistError.message : String(persistError);
|
|
301
|
+
session.logger.warn('AnalysisRun', 'Failed to persist run state', {
|
|
302
|
+
sessionId: session.sessionId,
|
|
303
|
+
runId: scope.runId,
|
|
304
|
+
status,
|
|
305
|
+
error: message,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
function heartbeatSessionRun(session) {
|
|
310
|
+
const scope = analysisRunScopeFromSession(session);
|
|
311
|
+
if (!scope)
|
|
312
|
+
return;
|
|
313
|
+
try {
|
|
314
|
+
(0, analysisRunStore_1.heartbeatAnalysisRun)(scope);
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
318
|
+
session.logger.warn('AnalysisRun', 'Failed to persist run heartbeat', {
|
|
319
|
+
sessionId: session.sessionId,
|
|
320
|
+
runId: scope.runId,
|
|
321
|
+
error: message,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
function startSessionRunHeartbeat(session) {
|
|
326
|
+
if (!analysisRunScopeFromSession(session))
|
|
327
|
+
return undefined;
|
|
328
|
+
heartbeatSessionRun(session);
|
|
329
|
+
return setInterval(() => heartbeatSessionRun(session), AGENT_RUN_HEARTBEAT_INTERVAL_MS);
|
|
330
|
+
}
|
|
331
|
+
function isPersistedSessionRunFresh(session, now) {
|
|
332
|
+
const scope = analysisRunScopeFromSession(session);
|
|
333
|
+
if (!scope)
|
|
334
|
+
return false;
|
|
335
|
+
try {
|
|
336
|
+
return (0, analysisRunStore_1.isAnalysisRunHeartbeatFresh)(scope, scope.runId, now, AGENT_RUN_HEARTBEAT_MAX_STALE_MS);
|
|
337
|
+
}
|
|
338
|
+
catch (error) {
|
|
339
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
340
|
+
session.logger.warn('AnalysisRun', 'Failed to inspect persisted run heartbeat', {
|
|
341
|
+
sessionId: session.sessionId,
|
|
342
|
+
runId: scope.runId,
|
|
343
|
+
error: message,
|
|
344
|
+
});
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
function persistBufferedAgentEvent(session, event) {
|
|
349
|
+
const scope = agentEventScopeFromSession(session);
|
|
350
|
+
if (!scope)
|
|
351
|
+
return;
|
|
352
|
+
try {
|
|
353
|
+
(0, agentEventStore_1.persistSerializedAgentEvent)(scope, event);
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
357
|
+
session.logger.warn('AgentEvents', 'Failed to persist SSE event', {
|
|
358
|
+
sessionId: session.sessionId,
|
|
359
|
+
runId: scope.runId,
|
|
360
|
+
eventType: event.eventType,
|
|
361
|
+
cursor: event.cursor,
|
|
362
|
+
error: message,
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
function replayPersistedAgentEvents(session, res, lastEventId) {
|
|
367
|
+
const scope = agentEventScopeFromSession(session);
|
|
368
|
+
if (!scope)
|
|
369
|
+
return { replayed: 0, includesTerminal: false, lastCursor: lastEventId };
|
|
370
|
+
let events = [];
|
|
371
|
+
try {
|
|
372
|
+
events = (0, agentEventStore_1.listSerializedAgentEventsAfter)(scope, scope.runId, lastEventId);
|
|
373
|
+
}
|
|
374
|
+
catch (error) {
|
|
375
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
376
|
+
session.logger.warn('AgentEvents', 'Failed to load persisted SSE replay events', {
|
|
377
|
+
sessionId: session.sessionId,
|
|
378
|
+
runId: scope.runId,
|
|
379
|
+
lastEventId,
|
|
380
|
+
error: message,
|
|
381
|
+
});
|
|
382
|
+
return { replayed: 0, includesTerminal: false, lastCursor: lastEventId };
|
|
383
|
+
}
|
|
384
|
+
let replayed = 0;
|
|
385
|
+
let includesTerminal = false;
|
|
386
|
+
let lastCursor = lastEventId;
|
|
387
|
+
for (const event of events) {
|
|
388
|
+
try {
|
|
389
|
+
res.write(`id: ${event.cursor}\n`);
|
|
390
|
+
res.write(`event: ${event.eventType}\n`);
|
|
391
|
+
res.write(`data: ${event.eventData}\n\n`);
|
|
392
|
+
replayed++;
|
|
393
|
+
lastCursor = event.cursor;
|
|
394
|
+
if (sessionSseReplay_1.TERMINAL_SSE_EVENT_TYPES.has(event.eventType)) {
|
|
395
|
+
includesTerminal = true;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
catch {
|
|
399
|
+
break;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
return { replayed, includesTerminal, lastCursor };
|
|
403
|
+
}
|
|
404
|
+
function sendReplayableSessionEvent(session, res, eventType, payload) {
|
|
405
|
+
const event = (0, sessionSseReplay_1.appendReplayableSseEvent)(session, eventType, payload);
|
|
406
|
+
persistBufferedAgentEvent(session, {
|
|
407
|
+
cursor: event.seqId,
|
|
408
|
+
eventType: event.eventType,
|
|
409
|
+
eventData: event.eventData,
|
|
410
|
+
createdAt: Date.now(),
|
|
411
|
+
});
|
|
412
|
+
streamProjector.sendEvent(res, eventType, payload, event.seqId);
|
|
413
|
+
return event.seqId;
|
|
414
|
+
}
|
|
415
|
+
function resolveSessionContextForReview(sessionId) {
|
|
416
|
+
const activeSession = assistantAppService.getSession(sessionId);
|
|
417
|
+
if (activeSession) {
|
|
418
|
+
const activeContext = enhancedSessionContext_1.sessionContextManager.get(sessionId, activeSession.traceId) ||
|
|
419
|
+
enhancedSessionContext_1.sessionContextManager.get(sessionId);
|
|
420
|
+
if (activeContext) {
|
|
421
|
+
return {
|
|
422
|
+
context: activeContext,
|
|
423
|
+
source: 'memory',
|
|
424
|
+
traceId: activeSession.traceId,
|
|
425
|
+
query: activeSession.query,
|
|
426
|
+
createdAt: activeSession.createdAt,
|
|
427
|
+
tenantId: activeSession.tenantId,
|
|
428
|
+
workspaceId: activeSession.workspaceId,
|
|
429
|
+
userId: activeSession.userId,
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
const memoryContext = enhancedSessionContext_1.sessionContextManager.get(sessionId);
|
|
434
|
+
if (memoryContext) {
|
|
435
|
+
return {
|
|
436
|
+
context: memoryContext,
|
|
437
|
+
source: 'memory',
|
|
438
|
+
traceId: memoryContext.getTraceId(),
|
|
439
|
+
query: activeSession?.query,
|
|
440
|
+
createdAt: activeSession?.createdAt,
|
|
441
|
+
tenantId: activeSession?.tenantId,
|
|
442
|
+
workspaceId: activeSession?.workspaceId,
|
|
443
|
+
userId: activeSession?.userId,
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
const persistenceService = sessionPersistenceService_1.SessionPersistenceService.getInstance();
|
|
447
|
+
const persistedSession = persistenceService.getSession(sessionId);
|
|
448
|
+
if (!persistedSession) {
|
|
449
|
+
return null;
|
|
450
|
+
}
|
|
451
|
+
const persistedContext = persistenceService.loadSessionContext(sessionId);
|
|
452
|
+
if (!persistedContext) {
|
|
453
|
+
return null;
|
|
454
|
+
}
|
|
455
|
+
return {
|
|
456
|
+
context: persistedContext,
|
|
457
|
+
source: 'persistence',
|
|
458
|
+
traceId: persistedSession.traceId,
|
|
459
|
+
query: persistedSession.question,
|
|
460
|
+
createdAt: persistedSession.createdAt,
|
|
461
|
+
tenantId: persistedSession.metadata?.tenantId,
|
|
462
|
+
workspaceId: persistedSession.metadata?.workspaceId,
|
|
463
|
+
userId: persistedSession.metadata?.userId,
|
|
464
|
+
ownerUserId: persistedSession.metadata?.ownerUserId,
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
function assignSessionOwner(session, context) {
|
|
468
|
+
Object.assign(session, (0, resourceOwnership_1.ownerFieldsFromContext)(context));
|
|
469
|
+
}
|
|
470
|
+
function getAuthorizedSession(req, res, sessionId) {
|
|
471
|
+
const context = (0, auth_1.requireRequestContext)(req);
|
|
472
|
+
const session = assistantAppService.getSession(sessionId);
|
|
473
|
+
if (!session || !(0, resourceOwnership_1.isOwnedByContext)(session, context)) {
|
|
474
|
+
(0, resourceOwnership_1.sendResourceNotFound)(res, 'Session not found');
|
|
475
|
+
return null;
|
|
476
|
+
}
|
|
477
|
+
return session;
|
|
478
|
+
}
|
|
479
|
+
function getAuthorizedSessionByRunId(req, res, runId) {
|
|
480
|
+
const context = (0, auth_1.requireRequestContext)(req);
|
|
481
|
+
for (const [, session] of assistantAppService.entries()) {
|
|
482
|
+
const isRequestedRun = session.activeRun?.runId === runId || session.lastRun?.runId === runId;
|
|
483
|
+
if (isRequestedRun && (0, resourceOwnership_1.isOwnedByContext)(session, context)) {
|
|
484
|
+
return session;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
(0, resourceOwnership_1.sendResourceNotFound)(res, 'Run not found');
|
|
488
|
+
return null;
|
|
489
|
+
}
|
|
490
|
+
function isResolvedSessionAccessible(req, resolved) {
|
|
491
|
+
return (0, resourceOwnership_1.isOwnedByContext)(resolved, (0, auth_1.requireRequestContext)(req));
|
|
492
|
+
}
|
|
493
|
+
async function ensureTraceAccessible(req, res, traceId) {
|
|
494
|
+
const context = (0, auth_1.requireRequestContext)(req);
|
|
495
|
+
const metadata = await (0, traceMetadataStore_1.readTraceMetadataForContext)(traceId, context);
|
|
496
|
+
if (!metadata) {
|
|
497
|
+
(0, resourceOwnership_1.sendResourceNotFound)(res, 'Trace not found in backend');
|
|
498
|
+
return false;
|
|
499
|
+
}
|
|
500
|
+
return true;
|
|
501
|
+
}
|
|
502
|
+
function requestedSessionIsVisible(sessionId, context) {
|
|
503
|
+
const activeSession = assistantAppService.getSession(sessionId);
|
|
504
|
+
if (activeSession) {
|
|
505
|
+
return (0, resourceOwnership_1.isOwnedByContext)(activeSession, context);
|
|
506
|
+
}
|
|
507
|
+
const persistedSession = sessionPersistenceService_1.SessionPersistenceService.getInstance().getSession(sessionId);
|
|
508
|
+
return !persistedSession || (0, resourceOwnership_1.isOwnedByContext)(persistedSession.metadata, context);
|
|
509
|
+
}
|
|
510
|
+
function buildTurnSeverityCounts(turn) {
|
|
511
|
+
const counts = {
|
|
512
|
+
critical: 0,
|
|
513
|
+
high: 0,
|
|
514
|
+
warning: 0,
|
|
515
|
+
medium: 0,
|
|
516
|
+
low: 0,
|
|
517
|
+
info: 0,
|
|
518
|
+
};
|
|
519
|
+
for (const finding of turn.findings || []) {
|
|
520
|
+
const severity = String(finding?.severity || '').toLowerCase();
|
|
521
|
+
if (severity in counts) {
|
|
522
|
+
counts[severity] += 1;
|
|
523
|
+
}
|
|
524
|
+
else {
|
|
525
|
+
counts.info += 1;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
return counts;
|
|
529
|
+
}
|
|
530
|
+
function toJsonSafe(value) {
|
|
531
|
+
return JSON.parse(JSON.stringify(value, (_key, v) => (typeof v === 'bigint' ? v.toString() : v)));
|
|
532
|
+
}
|
|
533
|
+
function buildTurnSummary(turn) {
|
|
534
|
+
const confidence = typeof turn.result?.confidence === 'number'
|
|
535
|
+
? turn.result.confidence
|
|
536
|
+
: undefined;
|
|
537
|
+
const sanitizedConclusion = typeof turn.result?.message === 'string'
|
|
538
|
+
? normalizeNarrativeForClient(turn.result.message)
|
|
539
|
+
: '';
|
|
540
|
+
const conclusionPreview = sanitizedConclusion
|
|
541
|
+
? sanitizedConclusion.replace(/\s+/g, ' ').slice(0, 240)
|
|
542
|
+
: undefined;
|
|
543
|
+
return {
|
|
544
|
+
turnId: turn.id,
|
|
545
|
+
turnIndex: turn.turnIndex,
|
|
546
|
+
timestamp: turn.timestamp,
|
|
547
|
+
query: turn.query,
|
|
548
|
+
intent: {
|
|
549
|
+
primaryGoal: turn.intent?.primaryGoal || '',
|
|
550
|
+
followUpType: turn.intent?.followUpType || 'initial',
|
|
551
|
+
aspects: Array.isArray(turn.intent?.aspects) ? turn.intent.aspects : [],
|
|
552
|
+
},
|
|
553
|
+
completed: !!turn.completed,
|
|
554
|
+
success: typeof turn.result?.success === 'boolean' ? turn.result.success : null,
|
|
555
|
+
confidence,
|
|
556
|
+
findingCount: Array.isArray(turn.findings) ? turn.findings.length : 0,
|
|
557
|
+
severityCounts: buildTurnSeverityCounts(turn),
|
|
558
|
+
conclusionPreview,
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
function buildTurnDetail(turn) {
|
|
562
|
+
const summary = buildTurnSummary(turn);
|
|
563
|
+
return {
|
|
564
|
+
...summary,
|
|
565
|
+
intent: toJsonSafe(turn.intent),
|
|
566
|
+
result: turn.result
|
|
567
|
+
? toJsonSafe({
|
|
568
|
+
...turn.result,
|
|
569
|
+
message: typeof turn.result.message === 'string'
|
|
570
|
+
? normalizeNarrativeForClient(turn.result.message)
|
|
571
|
+
: turn.result.message,
|
|
572
|
+
})
|
|
573
|
+
: null,
|
|
574
|
+
findings: toJsonSafe(turn.findings || []),
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
function getLastCompletedTurn(context) {
|
|
578
|
+
const turns = context.getAllTurns();
|
|
579
|
+
for (let i = turns.length - 1; i >= 0; i--) {
|
|
580
|
+
const turn = turns[i];
|
|
581
|
+
if (turn.completed && turn.result) {
|
|
582
|
+
return turn;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
return null;
|
|
586
|
+
}
|
|
587
|
+
function buildRecoveredResultFromContext(sessionId, context) {
|
|
588
|
+
const turn = getLastCompletedTurn(context);
|
|
589
|
+
if (!turn || !turn.result) {
|
|
590
|
+
return null;
|
|
591
|
+
}
|
|
592
|
+
const conclusion = typeof turn.result.message === 'string' && turn.result.message.trim().length > 0
|
|
593
|
+
? turn.result.message
|
|
594
|
+
: `已恢复会话历史。可通过 /api/agent/v1/${sessionId}/turns 查看历史轮次。`;
|
|
595
|
+
const confidence = typeof turn.result.confidence === 'number'
|
|
596
|
+
? turn.result.confidence
|
|
597
|
+
: 0.5;
|
|
598
|
+
return {
|
|
599
|
+
sessionId,
|
|
600
|
+
success: turn.result.success !== false,
|
|
601
|
+
findings: Array.isArray(turn.findings) ? turn.findings : [],
|
|
602
|
+
hypotheses: [],
|
|
603
|
+
conclusion,
|
|
604
|
+
confidence,
|
|
605
|
+
rounds: 1,
|
|
606
|
+
totalDurationMs: 0,
|
|
607
|
+
partial: turn.result.partial,
|
|
608
|
+
terminationReason: turn.result.terminationReason,
|
|
609
|
+
terminationMessage: turn.result.terminationMessage,
|
|
610
|
+
};
|
|
611
|
+
}
|
|
612
|
+
function recoverResultForSessionIfNeeded(sessionId, session) {
|
|
613
|
+
if (session.result) {
|
|
614
|
+
return session.result;
|
|
615
|
+
}
|
|
616
|
+
const resolved = resolveSessionContextForReview(sessionId);
|
|
617
|
+
if (!resolved) {
|
|
618
|
+
return null;
|
|
619
|
+
}
|
|
620
|
+
const recovered = buildRecoveredResultFromContext(sessionId, resolved.context);
|
|
621
|
+
if (!recovered) {
|
|
622
|
+
return null;
|
|
623
|
+
}
|
|
624
|
+
session.result = recovered;
|
|
625
|
+
const turns = resolved.context.getAllTurns();
|
|
626
|
+
const latestTurn = turns.length > 0 ? turns[turns.length - 1] : null;
|
|
627
|
+
if (latestTurn?.query) {
|
|
628
|
+
session.query = latestTurn.query;
|
|
629
|
+
}
|
|
630
|
+
return recovered;
|
|
631
|
+
}
|
|
632
|
+
function buildFallbackIntentFromQuery(query) {
|
|
633
|
+
const primaryGoal = String(query || '').trim();
|
|
634
|
+
if (!primaryGoal)
|
|
635
|
+
return null;
|
|
636
|
+
return {
|
|
637
|
+
primaryGoal,
|
|
638
|
+
aspects: [],
|
|
639
|
+
expectedOutputType: 'summary',
|
|
640
|
+
complexity: 'simple',
|
|
641
|
+
followUpType: 'initial',
|
|
642
|
+
};
|
|
643
|
+
}
|
|
644
|
+
function resolveConclusionSceneIdHint(params) {
|
|
645
|
+
const findings = Array.isArray(params.findings) ? params.findings : [];
|
|
646
|
+
let intent = params.intent;
|
|
647
|
+
if (!intent) {
|
|
648
|
+
const resolved = resolveSessionContextForReview(params.sessionId);
|
|
649
|
+
const turn = resolved ? getLastCompletedTurn(resolved.context) : null;
|
|
650
|
+
if (turn?.intent) {
|
|
651
|
+
intent = turn.intent;
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
if (!intent) {
|
|
655
|
+
intent = buildFallbackIntentFromQuery(params.query) || undefined;
|
|
656
|
+
}
|
|
657
|
+
if (!intent)
|
|
658
|
+
return undefined;
|
|
659
|
+
try {
|
|
660
|
+
return (0, conclusionSceneTemplates_1.resolveConclusionScene)({
|
|
661
|
+
intent,
|
|
662
|
+
findings,
|
|
663
|
+
deepReasonLabel: analysisNarrative_1.DEEP_REASON_LABEL,
|
|
664
|
+
}).selectedTemplate.id;
|
|
665
|
+
}
|
|
666
|
+
catch {
|
|
667
|
+
return undefined;
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
// Initialize Agent tools once
|
|
671
|
+
let toolsRegistered = false;
|
|
672
|
+
const SCENE_STRATEGY_IDS = ['scene_reconstruction', 'scene_reconstruction_quick'];
|
|
673
|
+
const MAX_SESSION_DATA_ENVELOPES = 1200;
|
|
674
|
+
const MAX_SESSION_AGENT_DIALOGUE = 800;
|
|
675
|
+
const MAX_SESSION_AGENT_RESPONSES = 400;
|
|
676
|
+
const TERMINAL_SESSION_MAX_IDLE_MS = 30 * 60 * 1000;
|
|
677
|
+
const NON_TERMINAL_SESSION_MAX_IDLE_MS = 2 * 60 * 60 * 1000;
|
|
678
|
+
const AGENT_RUN_HEARTBEAT_INTERVAL_MS = 30 * 1000;
|
|
679
|
+
const AGENT_RUN_HEARTBEAT_MAX_STALE_MS = NON_TERMINAL_SESSION_MAX_IDLE_MS;
|
|
680
|
+
function trimSessionArray(items, maxEntries) {
|
|
681
|
+
if (items.length > maxEntries) {
|
|
682
|
+
items.splice(0, items.length - maxEntries);
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
function pushWithSessionCap(items, value, maxEntries) {
|
|
686
|
+
items.push(value);
|
|
687
|
+
trimSessionArray(items, maxEntries);
|
|
688
|
+
}
|
|
689
|
+
function ensureToolsRegistered() {
|
|
690
|
+
if (!toolsRegistered) {
|
|
691
|
+
(0, agent_1.registerCoreTools)();
|
|
692
|
+
toolsRegistered = true;
|
|
693
|
+
console.log('[AgentRoutes] Core tools registered');
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
function isDedicatedSceneReplayRequest(query) {
|
|
697
|
+
const q = String(query || '').trim().toLowerCase();
|
|
698
|
+
if (!q)
|
|
699
|
+
return false;
|
|
700
|
+
return (q === '/scene' ||
|
|
701
|
+
q.includes('场景还原') ||
|
|
702
|
+
q.includes('scene reconstruction') ||
|
|
703
|
+
q.includes('scene replay'));
|
|
704
|
+
}
|
|
705
|
+
// ============================================================================
|
|
706
|
+
// Main Analysis Endpoints
|
|
707
|
+
// ============================================================================
|
|
708
|
+
/**
|
|
709
|
+
* POST /api/agent/v1/analyze
|
|
710
|
+
*
|
|
711
|
+
* Start analysis using AgentRuntime
|
|
712
|
+
*
|
|
713
|
+
* Features:
|
|
714
|
+
* - Agent-driven task graph planning
|
|
715
|
+
* - Domain agent evidence collection
|
|
716
|
+
* - Multi-round analysis with strategy planning
|
|
717
|
+
* - DataEnvelope streaming
|
|
718
|
+
*
|
|
719
|
+
* Body:
|
|
720
|
+
* {
|
|
721
|
+
* "traceId": "uuid-of-trace",
|
|
722
|
+
* "query": "分析这个 trace 的滑动性能",
|
|
723
|
+
* "options": {
|
|
724
|
+
* "maxRounds": 5,
|
|
725
|
+
* "confidenceThreshold": 0.7,
|
|
726
|
+
* "maxNoProgressRounds": 2,
|
|
727
|
+
* "maxFailureRounds": 2,
|
|
728
|
+
* "maxConcurrentTasks": 3
|
|
729
|
+
* }
|
|
730
|
+
* }
|
|
731
|
+
*/
|
|
732
|
+
async function handleAnalyzeRequest(req, res, requestedSessionIdOverride) {
|
|
733
|
+
try {
|
|
734
|
+
const requestId = getRequestId(req);
|
|
735
|
+
const requestContext = (0, auth_1.requireRequestContext)(req);
|
|
736
|
+
const { traceId, query, sessionId: bodyRequestedSessionId, options = {}, selectionContext: rawSelectionContext, referenceTraceId, traceContext: rawTraceContext, providerId, } = req.body;
|
|
737
|
+
const requestedSessionId = requestedSessionIdOverride || bodyRequestedSessionId;
|
|
738
|
+
if (!(0, rbac_1.hasRbacPermission)(requestContext, 'agent:run')) {
|
|
739
|
+
(0, rbac_1.sendForbidden)(res, 'Starting analysis requires agent:run permission');
|
|
740
|
+
return;
|
|
741
|
+
}
|
|
742
|
+
const tenantDecision = (0, enterpriseTenantLifecycleService_1.evaluateTenantMutationPolicy)(requestContext);
|
|
743
|
+
if (!tenantDecision.allowed) {
|
|
744
|
+
res.status(tenantDecision.httpStatus).json((0, enterpriseTenantLifecycleService_1.sendTenantMutationDeniedPayload)(tenantDecision));
|
|
745
|
+
return;
|
|
746
|
+
}
|
|
747
|
+
if (!traceId) {
|
|
748
|
+
res.status(400).json({
|
|
749
|
+
success: false,
|
|
750
|
+
error: 'traceId is required',
|
|
751
|
+
});
|
|
752
|
+
return;
|
|
753
|
+
}
|
|
754
|
+
if (!query) {
|
|
755
|
+
res.status(400).json({
|
|
756
|
+
success: false,
|
|
757
|
+
error: 'query is required',
|
|
758
|
+
});
|
|
759
|
+
return;
|
|
760
|
+
}
|
|
761
|
+
if (isDedicatedSceneReplayRequest(query)) {
|
|
762
|
+
res.status(400).json({
|
|
763
|
+
success: false,
|
|
764
|
+
code: 'SCENE_REPLAY_SEPARATED',
|
|
765
|
+
error: '场景还原已独立为专用功能',
|
|
766
|
+
hint: '请使用 /scene 命令(前端)或 POST /api/agent/v1/scene-reconstruct(后端)',
|
|
767
|
+
});
|
|
768
|
+
return;
|
|
769
|
+
}
|
|
770
|
+
if (requestedSessionId && !requestedSessionIsVisible(requestedSessionId, requestContext)) {
|
|
771
|
+
(0, resourceOwnership_1.sendResourceNotFound)(res, 'Session not found');
|
|
772
|
+
return;
|
|
773
|
+
}
|
|
774
|
+
// Validate selectionContext — strip invalid payloads silently instead of rejecting
|
|
775
|
+
let selectionContext;
|
|
776
|
+
if (rawSelectionContext && typeof rawSelectionContext === 'object') {
|
|
777
|
+
const sc = rawSelectionContext;
|
|
778
|
+
if (sc.kind === 'area' && typeof sc.startNs === 'number' && typeof sc.endNs === 'number') {
|
|
779
|
+
selectionContext = sc;
|
|
780
|
+
}
|
|
781
|
+
else if (sc.kind === 'track_event' && typeof sc.eventId === 'number' && typeof sc.ts === 'number') {
|
|
782
|
+
selectionContext = sc;
|
|
783
|
+
}
|
|
784
|
+
// Otherwise: invalid kind or missing required fields — selectionContext stays undefined
|
|
785
|
+
}
|
|
786
|
+
// Verify trace exists
|
|
787
|
+
const traceProcessorService = (0, traceProcessorService_1.getTraceProcessorService)();
|
|
788
|
+
if (!await ensureTraceAccessible(req, res, traceId)) {
|
|
789
|
+
return;
|
|
790
|
+
}
|
|
791
|
+
const trace = await traceProcessorService.getOrLoadTrace(traceId);
|
|
792
|
+
if (!trace) {
|
|
793
|
+
res.status(404).json({
|
|
794
|
+
success: false,
|
|
795
|
+
error: 'Trace not found in backend',
|
|
796
|
+
hint: 'Please upload the trace to the backend first',
|
|
797
|
+
code: 'TRACE_NOT_UPLOADED',
|
|
798
|
+
});
|
|
799
|
+
return;
|
|
800
|
+
}
|
|
801
|
+
const validateReferenceTraceForRun = async (candidateReferenceTraceId) => {
|
|
802
|
+
if (candidateReferenceTraceId === traceId) {
|
|
803
|
+
res.status(400).json({
|
|
804
|
+
success: false,
|
|
805
|
+
error: 'referenceTraceId must be different from traceId',
|
|
806
|
+
code: 'SAME_TRACE_COMPARISON',
|
|
807
|
+
});
|
|
808
|
+
return null;
|
|
809
|
+
}
|
|
810
|
+
if (!await ensureTraceAccessible(req, res, candidateReferenceTraceId)) {
|
|
811
|
+
return null;
|
|
812
|
+
}
|
|
813
|
+
const refTrace = await traceProcessorService.getOrLoadTrace(candidateReferenceTraceId);
|
|
814
|
+
if (!refTrace) {
|
|
815
|
+
res.status(404).json({
|
|
816
|
+
success: false,
|
|
817
|
+
error: 'Reference trace not found in backend',
|
|
818
|
+
hint: 'Please upload the reference trace to the backend first',
|
|
819
|
+
code: 'REFERENCE_TRACE_NOT_UPLOADED',
|
|
820
|
+
});
|
|
821
|
+
return null;
|
|
822
|
+
}
|
|
823
|
+
return refTrace;
|
|
824
|
+
};
|
|
825
|
+
// Comparison mode: validate reference trace if provided
|
|
826
|
+
let requestedReferenceTrace = null;
|
|
827
|
+
if (referenceTraceId) {
|
|
828
|
+
requestedReferenceTrace = await validateReferenceTraceForRun(referenceTraceId);
|
|
829
|
+
if (!requestedReferenceTrace)
|
|
830
|
+
return;
|
|
831
|
+
console.log(`[AgentRoutes] Comparison mode: current=${traceId}, reference=${referenceTraceId}`);
|
|
832
|
+
}
|
|
833
|
+
const quotaDecision = (0, enterpriseQuotaPolicyService_1.evaluateAnalysisRunQuota)(requestContext);
|
|
834
|
+
if (!quotaDecision.allowed) {
|
|
835
|
+
sendAgentQuotaDenied(res, quotaDecision);
|
|
836
|
+
return;
|
|
837
|
+
}
|
|
838
|
+
// Initialize tools
|
|
839
|
+
ensureToolsRegistered();
|
|
840
|
+
const analyzeSessionService = new agentAnalyzeSessionService_1.AgentAnalyzeSessionService({
|
|
841
|
+
assistantAppService,
|
|
842
|
+
createSessionLogger: sessionLogger_1.createSessionLogger,
|
|
843
|
+
sessionPersistenceService: sessionPersistenceService_1.SessionPersistenceService.getInstance(),
|
|
844
|
+
buildRecoveredResultFromContext,
|
|
845
|
+
});
|
|
846
|
+
let sessionId;
|
|
847
|
+
let preparedSession;
|
|
848
|
+
let isNewSession = true;
|
|
849
|
+
try {
|
|
850
|
+
const prepared = analyzeSessionService.prepareSession({
|
|
851
|
+
traceId,
|
|
852
|
+
query,
|
|
853
|
+
requestedSessionId,
|
|
854
|
+
referenceTraceId,
|
|
855
|
+
providerId,
|
|
856
|
+
providerScope: {
|
|
857
|
+
tenantId: requestContext.tenantId,
|
|
858
|
+
workspaceId: requestContext.workspaceId,
|
|
859
|
+
userId: requestContext.userId,
|
|
860
|
+
},
|
|
861
|
+
options,
|
|
862
|
+
});
|
|
863
|
+
sessionId = prepared.sessionId;
|
|
864
|
+
preparedSession = prepared.session;
|
|
865
|
+
isNewSession = prepared.isNewSession;
|
|
866
|
+
if (isNewSession) {
|
|
867
|
+
assignSessionOwner(preparedSession, requestContext);
|
|
868
|
+
}
|
|
869
|
+
else if (!(0, resourceOwnership_1.isOwnedByContext)(preparedSession, requestContext)) {
|
|
870
|
+
(0, resourceOwnership_1.sendResourceNotFound)(res, 'Session not found');
|
|
871
|
+
return;
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
catch (error) {
|
|
875
|
+
if (error instanceof agentAnalyzeSessionService_1.AnalyzeSessionPreparationError) {
|
|
876
|
+
res.status(error.httpStatus).json({
|
|
877
|
+
success: false,
|
|
878
|
+
error: error.message,
|
|
879
|
+
code: error.code,
|
|
880
|
+
...(error.hint ? { hint: error.hint } : {}),
|
|
881
|
+
});
|
|
882
|
+
return;
|
|
883
|
+
}
|
|
884
|
+
throw error;
|
|
885
|
+
}
|
|
886
|
+
const blockedStrategyIds = Array.from(new Set([
|
|
887
|
+
...SCENE_STRATEGY_IDS,
|
|
888
|
+
...(Array.isArray(options.blockedStrategyIds) ? options.blockedStrategyIds : []),
|
|
889
|
+
]));
|
|
890
|
+
const sessionForRun = preparedSession || assistantAppService.getSession(sessionId);
|
|
891
|
+
if (!sessionForRun) {
|
|
892
|
+
throw new Error(`Session ${sessionId} not found after preparation`);
|
|
893
|
+
}
|
|
894
|
+
const effectiveReferenceTraceId = referenceTraceId || sessionForRun.referenceTraceId;
|
|
895
|
+
let effectiveReferenceTrace = requestedReferenceTrace;
|
|
896
|
+
if (effectiveReferenceTraceId) {
|
|
897
|
+
if (!effectiveReferenceTrace || effectiveReferenceTraceId !== referenceTraceId) {
|
|
898
|
+
effectiveReferenceTrace = await validateReferenceTraceForRun(effectiveReferenceTraceId);
|
|
899
|
+
if (!effectiveReferenceTrace)
|
|
900
|
+
return;
|
|
901
|
+
}
|
|
902
|
+
sessionForRun.referenceTraceId = effectiveReferenceTraceId;
|
|
903
|
+
sessionForRun.comparisonSource = 'raw_trace_pair';
|
|
904
|
+
}
|
|
905
|
+
const runContext = startSessionRun(sessionForRun, query, requestId);
|
|
906
|
+
sessionForRun.logger.setMetadata({
|
|
907
|
+
requestId: runContext.requestId,
|
|
908
|
+
runId: runContext.runId,
|
|
909
|
+
runSequence: runContext.sequence,
|
|
910
|
+
});
|
|
911
|
+
let agentRunLease = null;
|
|
912
|
+
let referenceAgentRunLease = null;
|
|
913
|
+
let agentRunLeaseDecision = null;
|
|
914
|
+
let referenceAgentRunLeaseDecision = null;
|
|
915
|
+
if (enterpriseLeasesEnabled()) {
|
|
916
|
+
try {
|
|
917
|
+
const scope = leaseScopeFromRequestContext(requestContext);
|
|
918
|
+
agentRunLeaseDecision = buildLeaseModeDecisionForTrace(scope, traceId, 'agent_run', {
|
|
919
|
+
analysisMode: options.analysisMode,
|
|
920
|
+
traceSizeBytes: trace.size,
|
|
921
|
+
});
|
|
922
|
+
agentRunLease = (0, traceProcessorLeaseStore_1.getTraceProcessorLeaseStore)().acquireHolder(scope, traceId, {
|
|
923
|
+
holderType: 'agent_run',
|
|
924
|
+
holderRef: runContext.runId,
|
|
925
|
+
runId: runContext.runId,
|
|
926
|
+
sessionId,
|
|
927
|
+
metadata: {
|
|
928
|
+
requestId: runContext.requestId,
|
|
929
|
+
runSequence: runContext.sequence,
|
|
930
|
+
leaseModeReason: agentRunLeaseDecision.reason,
|
|
931
|
+
leaseModeSignals: agentRunLeaseDecision.signals,
|
|
932
|
+
},
|
|
933
|
+
}, { mode: agentRunLeaseDecision.mode });
|
|
934
|
+
agentRunLease = markLeaseReadyIfNew(agentRunLease, scope);
|
|
935
|
+
await traceProcessorService.ensureProcessorForLease(traceId, agentRunLease.id, agentRunLease.mode, scope);
|
|
936
|
+
}
|
|
937
|
+
catch (leaseError) {
|
|
938
|
+
if (agentRunLease) {
|
|
939
|
+
try {
|
|
940
|
+
(0, traceProcessorLeaseStore_1.getTraceProcessorLeaseStore)().markFailed(leaseScopeFromRequestContext(requestContext), agentRunLease.id);
|
|
941
|
+
}
|
|
942
|
+
catch (markFailedError) {
|
|
943
|
+
console.warn(`[AgentRoutes] Failed to mark agent_run lease ${agentRunLease.id} failed: ${markFailedError.message}`);
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
sessionForRun.status = 'failed';
|
|
947
|
+
sessionForRun.error = leaseError.message;
|
|
948
|
+
markSessionRunStatus(sessionForRun, 'failed', leaseError.message);
|
|
949
|
+
res.status(409).json({
|
|
950
|
+
success: false,
|
|
951
|
+
code: 'TRACE_PROCESSOR_LEASE_UNAVAILABLE',
|
|
952
|
+
error: leaseError.message,
|
|
953
|
+
});
|
|
954
|
+
return;
|
|
955
|
+
}
|
|
956
|
+
if (effectiveReferenceTraceId) {
|
|
957
|
+
try {
|
|
958
|
+
const scope = leaseScopeFromRequestContext(requestContext);
|
|
959
|
+
referenceAgentRunLeaseDecision = buildLeaseModeDecisionForTrace(scope, effectiveReferenceTraceId, 'agent_run', {
|
|
960
|
+
analysisMode: options.analysisMode,
|
|
961
|
+
traceSizeBytes: effectiveReferenceTrace?.size,
|
|
962
|
+
});
|
|
963
|
+
referenceAgentRunLease = (0, traceProcessorLeaseStore_1.getTraceProcessorLeaseStore)().acquireHolder(scope, effectiveReferenceTraceId, {
|
|
964
|
+
holderType: 'agent_run',
|
|
965
|
+
holderRef: `${runContext.runId}:reference`,
|
|
966
|
+
runId: runContext.runId,
|
|
967
|
+
sessionId,
|
|
968
|
+
metadata: {
|
|
969
|
+
requestId: runContext.requestId,
|
|
970
|
+
runSequence: runContext.sequence,
|
|
971
|
+
traceSide: 'reference',
|
|
972
|
+
leaseModeReason: referenceAgentRunLeaseDecision.reason,
|
|
973
|
+
leaseModeSignals: referenceAgentRunLeaseDecision.signals,
|
|
974
|
+
},
|
|
975
|
+
}, { mode: referenceAgentRunLeaseDecision.mode });
|
|
976
|
+
referenceAgentRunLease = markLeaseReadyIfNew(referenceAgentRunLease, scope);
|
|
977
|
+
await traceProcessorService.ensureProcessorForLease(effectiveReferenceTraceId, referenceAgentRunLease.id, referenceAgentRunLease.mode, scope);
|
|
978
|
+
}
|
|
979
|
+
catch (leaseError) {
|
|
980
|
+
if (referenceAgentRunLease) {
|
|
981
|
+
try {
|
|
982
|
+
(0, traceProcessorLeaseStore_1.getTraceProcessorLeaseStore)().markFailed(leaseScopeFromRequestContext(requestContext), referenceAgentRunLease.id);
|
|
983
|
+
}
|
|
984
|
+
catch (markFailedError) {
|
|
985
|
+
console.warn(`[AgentRoutes] Failed to mark reference agent_run lease ${referenceAgentRunLease.id} failed: ${markFailedError.message}`);
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
if (agentRunLease) {
|
|
989
|
+
try {
|
|
990
|
+
(0, traceProcessorLeaseStore_1.getTraceProcessorLeaseStore)().releaseHolder(leaseScopeFromRequestContext(requestContext), agentRunLease.id, 'agent_run', runContext.runId);
|
|
991
|
+
}
|
|
992
|
+
catch (releaseError) {
|
|
993
|
+
console.warn(`[AgentRoutes] Failed to release current agent_run lease after reference lease failure ${agentRunLease.id}: ${releaseError.message}`);
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
sessionForRun.status = 'failed';
|
|
997
|
+
sessionForRun.error = leaseError.message;
|
|
998
|
+
markSessionRunStatus(sessionForRun, 'failed', leaseError.message);
|
|
999
|
+
res.status(409).json({
|
|
1000
|
+
success: false,
|
|
1001
|
+
code: 'REFERENCE_TRACE_PROCESSOR_LEASE_UNAVAILABLE',
|
|
1002
|
+
error: leaseError.message,
|
|
1003
|
+
});
|
|
1004
|
+
return;
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
// Validate traceContext — must be array of objects with columns/rows
|
|
1009
|
+
const traceContext = Array.isArray(rawTraceContext)
|
|
1010
|
+
? rawTraceContext.filter((d) => d && typeof d === 'object' && Array.isArray(d.columns) && Array.isArray(d.rows))
|
|
1011
|
+
: undefined;
|
|
1012
|
+
runAgentDrivenAnalysis(sessionId, query, traceId, {
|
|
1013
|
+
...options,
|
|
1014
|
+
selectionContext,
|
|
1015
|
+
blockedStrategyIds,
|
|
1016
|
+
traceProcessorService,
|
|
1017
|
+
runContext,
|
|
1018
|
+
referenceTraceId: effectiveReferenceTraceId,
|
|
1019
|
+
traceContext: traceContext && traceContext.length > 0 ? traceContext : undefined,
|
|
1020
|
+
providerId: sessionForRun.providerId !== undefined ? sessionForRun.providerId : providerId,
|
|
1021
|
+
traceProcessorLease: agentRunLease
|
|
1022
|
+
? {
|
|
1023
|
+
traceId,
|
|
1024
|
+
leaseId: agentRunLease.id,
|
|
1025
|
+
mode: agentRunLease.mode,
|
|
1026
|
+
leaseScope: leaseScopeFromRequestContext(requestContext),
|
|
1027
|
+
}
|
|
1028
|
+
: undefined,
|
|
1029
|
+
referenceTraceProcessorLease: referenceAgentRunLease && effectiveReferenceTraceId
|
|
1030
|
+
? {
|
|
1031
|
+
traceId: effectiveReferenceTraceId,
|
|
1032
|
+
leaseId: referenceAgentRunLease.id,
|
|
1033
|
+
mode: referenceAgentRunLease.mode,
|
|
1034
|
+
leaseScope: leaseScopeFromRequestContext(requestContext),
|
|
1035
|
+
}
|
|
1036
|
+
: undefined,
|
|
1037
|
+
}).catch((error) => {
|
|
1038
|
+
const session = assistantAppService.getSession(sessionId);
|
|
1039
|
+
if (session) {
|
|
1040
|
+
session.logger.error('AgentRoutes', 'Agent-driven analysis failed', error);
|
|
1041
|
+
session.status = 'failed';
|
|
1042
|
+
session.error = error.message;
|
|
1043
|
+
markSessionRunStatus(session, 'failed', error.message);
|
|
1044
|
+
broadcastToAgentDrivenClients(sessionId, {
|
|
1045
|
+
type: 'error',
|
|
1046
|
+
content: { message: error.message, error: error.message },
|
|
1047
|
+
timestamp: Date.now(),
|
|
1048
|
+
});
|
|
1049
|
+
}
|
|
1050
|
+
}).finally(() => {
|
|
1051
|
+
if (agentRunLease) {
|
|
1052
|
+
try {
|
|
1053
|
+
(0, traceProcessorLeaseStore_1.getTraceProcessorLeaseStore)().releaseHolder(leaseScopeFromRequestContext(requestContext), agentRunLease.id, 'agent_run', runContext.runId);
|
|
1054
|
+
}
|
|
1055
|
+
catch (releaseError) {
|
|
1056
|
+
console.warn(`[AgentRoutes] Failed to release agent_run lease ${agentRunLease.id}: ${releaseError.message}`);
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
if (referenceAgentRunLease) {
|
|
1060
|
+
try {
|
|
1061
|
+
(0, traceProcessorLeaseStore_1.getTraceProcessorLeaseStore)().releaseHolder(leaseScopeFromRequestContext(requestContext), referenceAgentRunLease.id, 'agent_run', `${runContext.runId}:reference`);
|
|
1062
|
+
}
|
|
1063
|
+
catch (releaseError) {
|
|
1064
|
+
console.warn(`[AgentRoutes] Failed to release reference agent_run lease ${referenceAgentRunLease.id}: ${releaseError.message}`);
|
|
1065
|
+
}
|
|
1066
|
+
}
|
|
1067
|
+
});
|
|
1068
|
+
res.json({
|
|
1069
|
+
success: true,
|
|
1070
|
+
sessionId,
|
|
1071
|
+
message: preparedSession?.providerSnapshotChanged
|
|
1072
|
+
? 'Provider configuration changed; continuing with a fresh SDK session'
|
|
1073
|
+
: isNewSession
|
|
1074
|
+
? 'Analysis started'
|
|
1075
|
+
: 'Continuing analysis (multi-turn)',
|
|
1076
|
+
isNewSession,
|
|
1077
|
+
providerSnapshotChanged: preparedSession?.providerSnapshotChanged || undefined,
|
|
1078
|
+
architecture: 'agent-driven',
|
|
1079
|
+
runId: runContext.runId,
|
|
1080
|
+
leaseId: agentRunLease?.id,
|
|
1081
|
+
leaseState: agentRunLease?.state,
|
|
1082
|
+
leaseMode: agentRunLease?.mode,
|
|
1083
|
+
leaseModeReason: agentRunLeaseDecision?.reason,
|
|
1084
|
+
leaseQueueLength: agentRunLeaseDecision?.signals.sharedQueueLength,
|
|
1085
|
+
referenceLeaseId: referenceAgentRunLease?.id,
|
|
1086
|
+
referenceLeaseState: referenceAgentRunLease?.state,
|
|
1087
|
+
referenceLeaseMode: referenceAgentRunLease?.mode,
|
|
1088
|
+
referenceLeaseModeReason: referenceAgentRunLeaseDecision?.reason,
|
|
1089
|
+
requestId: runContext.requestId,
|
|
1090
|
+
runSequence: runContext.sequence,
|
|
1091
|
+
observability: {
|
|
1092
|
+
runId: runContext.runId,
|
|
1093
|
+
requestId: runContext.requestId,
|
|
1094
|
+
runSequence: runContext.sequence,
|
|
1095
|
+
},
|
|
1096
|
+
});
|
|
1097
|
+
}
|
|
1098
|
+
catch (error) {
|
|
1099
|
+
console.error('[AgentRoutes] Analyze error:', error);
|
|
1100
|
+
res.status(500).json({
|
|
1101
|
+
success: false,
|
|
1102
|
+
error: error.message || 'Agent analysis failed',
|
|
1103
|
+
});
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1106
|
+
router.post('/analyze', async (req, res) => {
|
|
1107
|
+
await handleAnalyzeRequest(req, res);
|
|
1108
|
+
});
|
|
1109
|
+
router.post('/sessions/:sessionId/runs', async (req, res) => {
|
|
1110
|
+
await handleAnalyzeRequest(req, res, req.params.sessionId);
|
|
1111
|
+
});
|
|
1112
|
+
/**
|
|
1113
|
+
* GET /api/agent/v1/:sessionId/stream
|
|
1114
|
+
*
|
|
1115
|
+
* SSE endpoint for real-time analysis updates
|
|
1116
|
+
*
|
|
1117
|
+
* Events:
|
|
1118
|
+
* - connected: SSE connection established
|
|
1119
|
+
* - conversation_step: Ordered conversational timeline step
|
|
1120
|
+
* - progress: Progress updates (task graph, rounds, strategy)
|
|
1121
|
+
* - data: DataEnvelope(s) from skill execution
|
|
1122
|
+
* - agent_task_dispatched: Task sent to domain agent
|
|
1123
|
+
* - agent_response: Agent completed task
|
|
1124
|
+
* - synthesis_complete: Feedback synthesis complete
|
|
1125
|
+
* - strategy_decision: Next iteration strategy decided
|
|
1126
|
+
* - analysis_completed: Final analysis result
|
|
1127
|
+
* - error: Error occurred
|
|
1128
|
+
* - end: Stream ended
|
|
1129
|
+
*/
|
|
1130
|
+
function handleSessionStream(req, res, sessionId) {
|
|
1131
|
+
const session = getAuthorizedSession(req, res, sessionId);
|
|
1132
|
+
if (!session)
|
|
1133
|
+
return;
|
|
1134
|
+
// Check for Last-Event-ID (reconnect replay support). The header is the
|
|
1135
|
+
// canonical fetch-stream path; the query param is kept for older clients.
|
|
1136
|
+
const lastEventId = (0, sessionSseReplay_1.parseLastEventId)(req.headers['last-event-id'], req.query.lastEventId);
|
|
1137
|
+
streamProjector.setSseHeaders(res);
|
|
1138
|
+
streamProjector.sendConnected(res, {
|
|
1139
|
+
sessionId,
|
|
1140
|
+
status: session.status,
|
|
1141
|
+
traceId: session.traceId,
|
|
1142
|
+
query: session.query,
|
|
1143
|
+
architecture: 'agent-driven',
|
|
1144
|
+
timestamp: Date.now(),
|
|
1145
|
+
...buildStreamObservability(session),
|
|
1146
|
+
});
|
|
1147
|
+
let ringReplayAfter = lastEventId;
|
|
1148
|
+
if (lastEventId !== null) {
|
|
1149
|
+
const persistedReplay = replayPersistedAgentEvents(session, res, lastEventId);
|
|
1150
|
+
ringReplayAfter = persistedReplay.lastCursor;
|
|
1151
|
+
if (persistedReplay.replayed > 0) {
|
|
1152
|
+
console.log(`[AgentRoutes] Replayed ${persistedReplay.replayed} persisted SSE events for ${sessionId} ` +
|
|
1153
|
+
`(after seqId ${lastEventId})`);
|
|
1154
|
+
}
|
|
1155
|
+
if (persistedReplay.includesTerminal) {
|
|
1156
|
+
res.end();
|
|
1157
|
+
return;
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
// Replay missed events from the ring buffer if reconnecting.
|
|
1161
|
+
if (ringReplayAfter !== null && session.sseEventBuffer.length > 0) {
|
|
1162
|
+
const replayIncludesTerminal = (0, sessionSseReplay_1.hasTerminalReplayAfter)(session, ringReplayAfter);
|
|
1163
|
+
const replayed = streamProjector.replayBufferedEvents(res, session.sseEventBuffer, ringReplayAfter);
|
|
1164
|
+
if (replayed > 0) {
|
|
1165
|
+
console.log(`[AgentRoutes] Replayed ${replayed} missed SSE events for ${sessionId} (after seqId ${ringReplayAfter})`);
|
|
1166
|
+
}
|
|
1167
|
+
if (replayIncludesTerminal) {
|
|
1168
|
+
res.end();
|
|
1169
|
+
return;
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
// Add client to session
|
|
1173
|
+
assistantAppService.addSseClient(sessionId, res);
|
|
1174
|
+
console.log(`[AgentRoutes] SSE client connected for ${sessionId}`);
|
|
1175
|
+
// If analysis is already completed, send the result.
|
|
1176
|
+
// Resumed sessions may not have session.result in memory; recover from persisted turn context.
|
|
1177
|
+
if (session.status === 'completed' || session.status === 'quota_exceeded') {
|
|
1178
|
+
recoverResultForSessionIfNeeded(sessionId, session);
|
|
1179
|
+
if (session.result) {
|
|
1180
|
+
sendAgentDrivenResult(res, session);
|
|
1181
|
+
sendReplayableSessionEvent(session, res, 'end', {
|
|
1182
|
+
timestamp: Date.now(),
|
|
1183
|
+
...buildStreamObservability(session),
|
|
1184
|
+
});
|
|
1185
|
+
res.end();
|
|
1186
|
+
return;
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
// If analysis failed, send error
|
|
1190
|
+
if (session.status === 'failed') {
|
|
1191
|
+
sendReplayableSessionEvent(session, res, 'error', {
|
|
1192
|
+
error: session.error,
|
|
1193
|
+
message: session.error,
|
|
1194
|
+
timestamp: Date.now(),
|
|
1195
|
+
...buildStreamObservability(session),
|
|
1196
|
+
});
|
|
1197
|
+
sendReplayableSessionEvent(session, res, 'end', {
|
|
1198
|
+
timestamp: Date.now(),
|
|
1199
|
+
...buildStreamObservability(session),
|
|
1200
|
+
});
|
|
1201
|
+
res.end();
|
|
1202
|
+
return;
|
|
1203
|
+
}
|
|
1204
|
+
// Handle client disconnect
|
|
1205
|
+
req.on('close', () => {
|
|
1206
|
+
console.log(`[AgentRoutes] SSE client disconnected for ${sessionId}`);
|
|
1207
|
+
assistantAppService.removeSseClient(sessionId, res);
|
|
1208
|
+
});
|
|
1209
|
+
// Handle write errors (EPIPE when client disconnects mid-write).
|
|
1210
|
+
// Without this handler, EPIPE propagates as uncaughtException and can crash
|
|
1211
|
+
// the SDK subprocess (which inherits the process's pipe state).
|
|
1212
|
+
res.on('error', (err) => {
|
|
1213
|
+
if (err.code === 'EPIPE' || err.code === 'ERR_STREAM_DESTROYED') {
|
|
1214
|
+
// Expected when SSE client disconnects (e.g., curl timeout, browser navigation)
|
|
1215
|
+
assistantAppService.removeSseClient(sessionId, res);
|
|
1216
|
+
return;
|
|
1217
|
+
}
|
|
1218
|
+
console.error(`[AgentRoutes] SSE response error for ${sessionId}:`, err.message);
|
|
1219
|
+
});
|
|
1220
|
+
streamProjector.bindKeepAlive(req, res);
|
|
1221
|
+
}
|
|
1222
|
+
router.get('/:sessionId/stream', (req, res) => {
|
|
1223
|
+
handleSessionStream(req, res, req.params.sessionId);
|
|
1224
|
+
});
|
|
1225
|
+
router.get('/runs/:runId/stream', (req, res) => {
|
|
1226
|
+
const session = getAuthorizedSessionByRunId(req, res, req.params.runId);
|
|
1227
|
+
if (!session)
|
|
1228
|
+
return;
|
|
1229
|
+
handleSessionStream(req, res, session.sessionId);
|
|
1230
|
+
});
|
|
1231
|
+
/**
|
|
1232
|
+
* GET /api/agent/v1/:sessionId/status
|
|
1233
|
+
*
|
|
1234
|
+
* Get analysis status (for polling)
|
|
1235
|
+
*/
|
|
1236
|
+
router.get('/:sessionId/status', (req, res) => {
|
|
1237
|
+
const { sessionId } = req.params;
|
|
1238
|
+
const session = getAuthorizedSession(req, res, sessionId);
|
|
1239
|
+
if (!session)
|
|
1240
|
+
return;
|
|
1241
|
+
const response = {
|
|
1242
|
+
success: true,
|
|
1243
|
+
sessionId,
|
|
1244
|
+
status: session.status,
|
|
1245
|
+
traceId: session.traceId,
|
|
1246
|
+
query: session.query,
|
|
1247
|
+
createdAt: session.createdAt,
|
|
1248
|
+
observability: buildSessionObservability(session),
|
|
1249
|
+
};
|
|
1250
|
+
if (session.status === 'completed' || session.status === 'quota_exceeded') {
|
|
1251
|
+
const recoveredResult = recoverResultForSessionIfNeeded(sessionId, session);
|
|
1252
|
+
if (recoveredResult) {
|
|
1253
|
+
const conclusion = normalizeNarrativeForClient(recoveredResult.conclusion);
|
|
1254
|
+
const clientFindings = buildClientFindings(recoveredResult.findings, session.scenes || []);
|
|
1255
|
+
const resultContract = buildSessionResultContract(session, clientFindings);
|
|
1256
|
+
const sceneIdHint = resolveConclusionSceneIdHint({
|
|
1257
|
+
sessionId,
|
|
1258
|
+
query: session.query,
|
|
1259
|
+
findings: recoveredResult.findings,
|
|
1260
|
+
});
|
|
1261
|
+
const conclusionContract = recoveredResult.conclusionContract ||
|
|
1262
|
+
(0, agentResultNormalizer_1.deriveConclusionContractForNarrative)(recoveredResult.conclusion, {
|
|
1263
|
+
mode: recoveredResult.rounds > 1 ? 'focused_answer' : 'initial_report',
|
|
1264
|
+
sceneId: sceneIdHint,
|
|
1265
|
+
}) ||
|
|
1266
|
+
undefined;
|
|
1267
|
+
response.result = {
|
|
1268
|
+
answer: conclusion,
|
|
1269
|
+
conclusion,
|
|
1270
|
+
conclusionContract,
|
|
1271
|
+
confidence: recoveredResult.confidence,
|
|
1272
|
+
totalDurationMs: recoveredResult.totalDurationMs,
|
|
1273
|
+
rounds: recoveredResult.rounds,
|
|
1274
|
+
partial: recoveredResult.partial,
|
|
1275
|
+
terminationReason: recoveredResult.terminationReason,
|
|
1276
|
+
terminationMessage: recoveredResult.terminationMessage,
|
|
1277
|
+
findings: recoveredResult.findings,
|
|
1278
|
+
findingsCount: recoveredResult.findings.length,
|
|
1279
|
+
resultContract,
|
|
1280
|
+
};
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
1283
|
+
if (session.status === 'failed') {
|
|
1284
|
+
response.error = session.error;
|
|
1285
|
+
}
|
|
1286
|
+
res.json(response);
|
|
1287
|
+
});
|
|
1288
|
+
/**
|
|
1289
|
+
* GET /api/agent/v1/:sessionId/turns
|
|
1290
|
+
*
|
|
1291
|
+
* List persisted turns for a session.
|
|
1292
|
+
* Supports in-memory sessions and persisted (recoverable) sessions.
|
|
1293
|
+
*
|
|
1294
|
+
* Query params:
|
|
1295
|
+
* - limit: default 20, max 200
|
|
1296
|
+
* - offset: default 0
|
|
1297
|
+
* - order: asc | desc (default desc)
|
|
1298
|
+
*/
|
|
1299
|
+
router.get('/:sessionId/turns', (req, res) => {
|
|
1300
|
+
const { sessionId } = req.params;
|
|
1301
|
+
const rawLimit = parseInt(String(req.query.limit || '20'), 10);
|
|
1302
|
+
const rawOffset = parseInt(String(req.query.offset || '0'), 10);
|
|
1303
|
+
const order = String(req.query.order || 'desc').toLowerCase() === 'asc' ? 'asc' : 'desc';
|
|
1304
|
+
const limit = Number.isFinite(rawLimit) ? Math.max(1, Math.min(200, rawLimit)) : 20;
|
|
1305
|
+
const offset = Number.isFinite(rawOffset) ? Math.max(0, rawOffset) : 0;
|
|
1306
|
+
const resolved = resolveSessionContextForReview(sessionId);
|
|
1307
|
+
if (!resolved) {
|
|
1308
|
+
return res.status(404).json({
|
|
1309
|
+
success: false,
|
|
1310
|
+
error: 'Session context not found',
|
|
1311
|
+
hint: 'Session may not exist or was not persisted with context snapshots',
|
|
1312
|
+
});
|
|
1313
|
+
}
|
|
1314
|
+
if (!isResolvedSessionAccessible(req, resolved)) {
|
|
1315
|
+
return (0, resourceOwnership_1.sendResourceNotFound)(res, 'Session context not found');
|
|
1316
|
+
}
|
|
1317
|
+
const allTurns = resolved.context.getAllTurns();
|
|
1318
|
+
const ordered = order === 'desc' ? [...allTurns].reverse() : [...allTurns];
|
|
1319
|
+
const paged = ordered.slice(offset, offset + limit);
|
|
1320
|
+
const latestTurn = allTurns.length > 0 ? allTurns[allTurns.length - 1] : null;
|
|
1321
|
+
return res.json({
|
|
1322
|
+
success: true,
|
|
1323
|
+
sessionId,
|
|
1324
|
+
traceId: resolved.traceId,
|
|
1325
|
+
source: resolved.source,
|
|
1326
|
+
query: resolved.query,
|
|
1327
|
+
createdAt: resolved.createdAt,
|
|
1328
|
+
totalTurns: allTurns.length,
|
|
1329
|
+
turns: paged.map(buildTurnSummary),
|
|
1330
|
+
latestTurn: latestTurn ? buildTurnSummary(latestTurn) : null,
|
|
1331
|
+
pagination: {
|
|
1332
|
+
limit,
|
|
1333
|
+
offset,
|
|
1334
|
+
order,
|
|
1335
|
+
hasMore: offset + limit < ordered.length,
|
|
1336
|
+
},
|
|
1337
|
+
});
|
|
1338
|
+
});
|
|
1339
|
+
/**
|
|
1340
|
+
* GET /api/agent/v1/:sessionId/turns/:turnId
|
|
1341
|
+
*
|
|
1342
|
+
* Get details for a specific turn.
|
|
1343
|
+
* `turnId` supports:
|
|
1344
|
+
* - UUID turn ID
|
|
1345
|
+
* - numeric turn index (0-based or 1-based)
|
|
1346
|
+
* - literal `latest`
|
|
1347
|
+
*/
|
|
1348
|
+
router.get('/:sessionId/turns/:turnId', (req, res) => {
|
|
1349
|
+
const { sessionId, turnId } = req.params;
|
|
1350
|
+
const resolved = resolveSessionContextForReview(sessionId);
|
|
1351
|
+
if (!resolved) {
|
|
1352
|
+
return res.status(404).json({
|
|
1353
|
+
success: false,
|
|
1354
|
+
error: 'Session context not found',
|
|
1355
|
+
hint: 'Session may not exist or was not persisted with context snapshots',
|
|
1356
|
+
});
|
|
1357
|
+
}
|
|
1358
|
+
if (!isResolvedSessionAccessible(req, resolved)) {
|
|
1359
|
+
return (0, resourceOwnership_1.sendResourceNotFound)(res, 'Session context not found');
|
|
1360
|
+
}
|
|
1361
|
+
const turns = resolved.context.getAllTurns();
|
|
1362
|
+
if (turns.length === 0) {
|
|
1363
|
+
return res.status(404).json({
|
|
1364
|
+
success: false,
|
|
1365
|
+
error: 'No turns recorded for this session',
|
|
1366
|
+
});
|
|
1367
|
+
}
|
|
1368
|
+
let turn;
|
|
1369
|
+
if (turnId === 'latest') {
|
|
1370
|
+
turn = turns[turns.length - 1];
|
|
1371
|
+
}
|
|
1372
|
+
else {
|
|
1373
|
+
turn = turns.find(t => t.id === turnId);
|
|
1374
|
+
if (!turn && /^\d+$/.test(turnId)) {
|
|
1375
|
+
const parsed = parseInt(turnId, 10);
|
|
1376
|
+
turn = turns.find(t => t.turnIndex === parsed) || turns.find(t => t.turnIndex === parsed - 1);
|
|
1377
|
+
}
|
|
1378
|
+
}
|
|
1379
|
+
if (!turn) {
|
|
1380
|
+
return res.status(404).json({
|
|
1381
|
+
success: false,
|
|
1382
|
+
error: `Turn not found: ${turnId}`,
|
|
1383
|
+
hint: 'Use /api/agent/v1/:sessionId/turns to inspect available turn IDs',
|
|
1384
|
+
});
|
|
1385
|
+
}
|
|
1386
|
+
const previousTurn = turns.find(t => t.turnIndex === turn.turnIndex - 1) || null;
|
|
1387
|
+
const nextTurn = turns.find(t => t.turnIndex === turn.turnIndex + 1) || null;
|
|
1388
|
+
return res.json({
|
|
1389
|
+
success: true,
|
|
1390
|
+
sessionId,
|
|
1391
|
+
traceId: resolved.traceId,
|
|
1392
|
+
source: resolved.source,
|
|
1393
|
+
turn: buildTurnDetail(turn),
|
|
1394
|
+
navigation: {
|
|
1395
|
+
previousTurnId: previousTurn?.id || null,
|
|
1396
|
+
nextTurnId: nextTurn?.id || null,
|
|
1397
|
+
previousTurnIndex: previousTurn?.turnIndex ?? null,
|
|
1398
|
+
nextTurnIndex: nextTurn?.turnIndex ?? null,
|
|
1399
|
+
},
|
|
1400
|
+
});
|
|
1401
|
+
});
|
|
1402
|
+
/**
|
|
1403
|
+
* DELETE /api/agent/v1/:sessionId
|
|
1404
|
+
*
|
|
1405
|
+
* Clean up an analysis session
|
|
1406
|
+
*/
|
|
1407
|
+
router.delete('/:sessionId', (req, res) => {
|
|
1408
|
+
const { sessionId } = req.params;
|
|
1409
|
+
const session = getAuthorizedSession(req, res, sessionId);
|
|
1410
|
+
if (!session)
|
|
1411
|
+
return;
|
|
1412
|
+
// Close all SSE connections
|
|
1413
|
+
session.sseClients.forEach((client) => {
|
|
1414
|
+
try {
|
|
1415
|
+
client.end();
|
|
1416
|
+
}
|
|
1417
|
+
catch { }
|
|
1418
|
+
});
|
|
1419
|
+
// Clean up session-scoped state only — do NOT call reset() which clears
|
|
1420
|
+
// global caches (architectureCache) shared across all active sessions.
|
|
1421
|
+
if (typeof session.orchestrator.cleanupSession === 'function') {
|
|
1422
|
+
session.orchestrator.cleanupSession(sessionId);
|
|
1423
|
+
}
|
|
1424
|
+
// Also clean up the EnhancedSessionContext (EntityStore, turns, working memory)
|
|
1425
|
+
enhancedSessionContext_1.sessionContextManager.remove(sessionId);
|
|
1426
|
+
assistantAppService.deleteSession(sessionId);
|
|
1427
|
+
res.json({ success: true });
|
|
1428
|
+
});
|
|
1429
|
+
const FEEDBACK_DIR = (0, runtimePaths_1.backendLogPath)('feedback');
|
|
1430
|
+
const FEEDBACK_FILE = path.join(FEEDBACK_DIR, 'feedback.jsonl');
|
|
1431
|
+
/**
|
|
1432
|
+
* POST /api/agent/v1/:sessionId/feedback
|
|
1433
|
+
*
|
|
1434
|
+
* Submit user feedback on analysis quality (thumbs up/down + optional comment).
|
|
1435
|
+
* Stored as append-only JSONL in logs/feedback/ with versioned schema
|
|
1436
|
+
* (see backend/src/agentv3/selfImprove/feedbackEnricher.ts).
|
|
1437
|
+
*/
|
|
1438
|
+
router.post('/:sessionId/feedback', async (req, res) => {
|
|
1439
|
+
const { sessionId } = req.params;
|
|
1440
|
+
const validated = (0, feedbackEnricher_1.validateFeedbackInput)(req.body);
|
|
1441
|
+
if (!validated.ok) {
|
|
1442
|
+
return res.status(400).json({ success: false, error: validated.error });
|
|
1443
|
+
}
|
|
1444
|
+
const session = getAuthorizedSession(req, res, sessionId);
|
|
1445
|
+
if (!session)
|
|
1446
|
+
return;
|
|
1447
|
+
const lookup = session
|
|
1448
|
+
? { traceId: session.traceId, referenceTraceId: session.referenceTraceId }
|
|
1449
|
+
: null;
|
|
1450
|
+
const entry = (0, feedbackEnricher_1.enrichFeedbackEntry)(sessionId, validated.value, lookup);
|
|
1451
|
+
try {
|
|
1452
|
+
fs.mkdirSync(FEEDBACK_DIR, { recursive: true });
|
|
1453
|
+
fs.appendFileSync(FEEDBACK_FILE, JSON.stringify(entry) + '\n');
|
|
1454
|
+
}
|
|
1455
|
+
catch (err) {
|
|
1456
|
+
console.error('[Feedback] Failed to save feedback:', err.message);
|
|
1457
|
+
return res.status(500).json({ success: false, error: 'Failed to save feedback' });
|
|
1458
|
+
}
|
|
1459
|
+
// Feed the rating into the pattern state machine when the client
|
|
1460
|
+
// identified the pattern. Best-effort: log and continue if it fails so
|
|
1461
|
+
// the JSONL audit trail is the canonical record either way.
|
|
1462
|
+
let patternStatusAfter = null;
|
|
1463
|
+
if (validated.value.patternId) {
|
|
1464
|
+
try {
|
|
1465
|
+
patternStatusAfter = await (0, analysisPatternMemory_1.applyFeedbackToPattern)(validated.value.patternId, validated.value.rating);
|
|
1466
|
+
}
|
|
1467
|
+
catch (err) {
|
|
1468
|
+
console.warn('[Feedback] Pattern state update failed:', err.message);
|
|
1469
|
+
}
|
|
1470
|
+
}
|
|
1471
|
+
res.json({
|
|
1472
|
+
success: true,
|
|
1473
|
+
schemaVersion: entry.schemaVersion,
|
|
1474
|
+
patternStatus: patternStatusAfter,
|
|
1475
|
+
});
|
|
1476
|
+
});
|
|
1477
|
+
/**
|
|
1478
|
+
* POST /api/agent/v1/:sessionId/respond
|
|
1479
|
+
*
|
|
1480
|
+
* Respond to an interactive session (e.g. continue/abort).
|
|
1481
|
+
*
|
|
1482
|
+
* Note: AgentRuntime currently does not pause for user input in v2;
|
|
1483
|
+
* this endpoint mainly exists for API compatibility and future multi-turn UX.
|
|
1484
|
+
*/
|
|
1485
|
+
function handleSessionRespond(req, res, sessionId) {
|
|
1486
|
+
const session = getAuthorizedSession(req, res, sessionId);
|
|
1487
|
+
if (!session)
|
|
1488
|
+
return;
|
|
1489
|
+
const action = req.body?.action;
|
|
1490
|
+
const allowedActions = new Set(['continue', 'abort']);
|
|
1491
|
+
if (!action || typeof action !== 'string' || !allowedActions.has(action)) {
|
|
1492
|
+
res.status(400).json({
|
|
1493
|
+
success: false,
|
|
1494
|
+
error: `Invalid action: ${String(action)}. Allowed: continue, abort`,
|
|
1495
|
+
});
|
|
1496
|
+
return;
|
|
1497
|
+
}
|
|
1498
|
+
if (action === 'abort') {
|
|
1499
|
+
session.status = 'failed';
|
|
1500
|
+
session.error = 'Aborted by user';
|
|
1501
|
+
res.json({ success: true, sessionId, status: session.status });
|
|
1502
|
+
return;
|
|
1503
|
+
}
|
|
1504
|
+
// continue
|
|
1505
|
+
if (session.status !== 'awaiting_user') {
|
|
1506
|
+
res.status(400).json({
|
|
1507
|
+
success: false,
|
|
1508
|
+
error: `Session is not awaiting user input (current status: ${session.status})`,
|
|
1509
|
+
});
|
|
1510
|
+
return;
|
|
1511
|
+
}
|
|
1512
|
+
session.status = 'running';
|
|
1513
|
+
res.json({ success: true, sessionId, status: session.status });
|
|
1514
|
+
}
|
|
1515
|
+
router.post('/:sessionId/respond', (req, res) => {
|
|
1516
|
+
handleSessionRespond(req, res, req.params.sessionId);
|
|
1517
|
+
});
|
|
1518
|
+
router.post('/sessions/:sessionId/respond', (req, res) => {
|
|
1519
|
+
handleSessionRespond(req, res, req.params.sessionId);
|
|
1520
|
+
});
|
|
1521
|
+
// =============================================================================
|
|
1522
|
+
// Agent-Driven Architecture v2.0 - Intervention & Focus Endpoints
|
|
1523
|
+
// =============================================================================
|
|
1524
|
+
/**
|
|
1525
|
+
* POST /api/agent/v1/:sessionId/intervene
|
|
1526
|
+
*
|
|
1527
|
+
* Handle user intervention response during analysis.
|
|
1528
|
+
* Called when the frontend receives an 'intervention_required' event and
|
|
1529
|
+
* the user selects an option.
|
|
1530
|
+
*
|
|
1531
|
+
* Request body:
|
|
1532
|
+
* {
|
|
1533
|
+
* interventionId: string, // ID from intervention_required event
|
|
1534
|
+
* action: 'continue' | 'focus' | 'abort' | 'custom' | 'select_option',
|
|
1535
|
+
* selectedOptionId?: string, // ID of selected option
|
|
1536
|
+
* customInput?: string, // User's custom input (for action='custom')
|
|
1537
|
+
* params?: Record<string, any> // Additional parameters
|
|
1538
|
+
* }
|
|
1539
|
+
*
|
|
1540
|
+
* Response:
|
|
1541
|
+
* {
|
|
1542
|
+
* success: boolean,
|
|
1543
|
+
* sessionId: string,
|
|
1544
|
+
* directive?: AnalysisDirective // How analysis should proceed
|
|
1545
|
+
* }
|
|
1546
|
+
*/
|
|
1547
|
+
router.post('/:sessionId/intervene', async (req, res) => {
|
|
1548
|
+
const { sessionId } = req.params;
|
|
1549
|
+
const session = getAuthorizedSession(req, res, sessionId);
|
|
1550
|
+
if (!session)
|
|
1551
|
+
return;
|
|
1552
|
+
const { interventionId, action, selectedOptionId, customInput, params } = req.body;
|
|
1553
|
+
// Validate required fields
|
|
1554
|
+
if (!interventionId || typeof interventionId !== 'string') {
|
|
1555
|
+
return res.status(400).json({
|
|
1556
|
+
success: false,
|
|
1557
|
+
error: 'interventionId is required',
|
|
1558
|
+
});
|
|
1559
|
+
}
|
|
1560
|
+
const allowedActions = new Set(['continue', 'focus', 'abort', 'custom', 'select_option']);
|
|
1561
|
+
if (!action || !allowedActions.has(action)) {
|
|
1562
|
+
return res.status(400).json({
|
|
1563
|
+
success: false,
|
|
1564
|
+
error: `Invalid action: ${String(action)}. Allowed: ${Array.from(allowedActions).join(', ')}`,
|
|
1565
|
+
});
|
|
1566
|
+
}
|
|
1567
|
+
try {
|
|
1568
|
+
// ClaudeRuntime (agentv3) doesn't implement getInterventionController — reject gracefully.
|
|
1569
|
+
if (typeof session.orchestrator.getInterventionController !== 'function') {
|
|
1570
|
+
return res.status(400).json({ success: false, error: 'Intervention not supported in this runtime mode' });
|
|
1571
|
+
}
|
|
1572
|
+
const interventionController = session.orchestrator.getInterventionController();
|
|
1573
|
+
// Check if there's a pending intervention
|
|
1574
|
+
if (!interventionController.hasPendingIntervention(sessionId)) {
|
|
1575
|
+
return res.status(400).json({
|
|
1576
|
+
success: false,
|
|
1577
|
+
error: 'No pending intervention for this session',
|
|
1578
|
+
});
|
|
1579
|
+
}
|
|
1580
|
+
// Build user decision
|
|
1581
|
+
const decision = {
|
|
1582
|
+
interventionId,
|
|
1583
|
+
action,
|
|
1584
|
+
selectedOptionId,
|
|
1585
|
+
customInput,
|
|
1586
|
+
params,
|
|
1587
|
+
};
|
|
1588
|
+
// Process the decision (interventionId is used internally to find the session)
|
|
1589
|
+
const directive = interventionController.handleUserDecision(decision);
|
|
1590
|
+
// Update session status if needed
|
|
1591
|
+
if (directive.action === 'abort') {
|
|
1592
|
+
session.status = 'failed';
|
|
1593
|
+
session.error = 'Aborted by user intervention';
|
|
1594
|
+
}
|
|
1595
|
+
else if (session.status === 'awaiting_user') {
|
|
1596
|
+
session.status = 'running';
|
|
1597
|
+
}
|
|
1598
|
+
return res.json({
|
|
1599
|
+
success: true,
|
|
1600
|
+
sessionId,
|
|
1601
|
+
directive,
|
|
1602
|
+
});
|
|
1603
|
+
}
|
|
1604
|
+
catch (error) {
|
|
1605
|
+
console.error(`[Intervene] Error processing intervention for session ${sessionId}:`, error);
|
|
1606
|
+
return res.status(500).json({
|
|
1607
|
+
success: false,
|
|
1608
|
+
error: error.message || 'Failed to process intervention',
|
|
1609
|
+
});
|
|
1610
|
+
}
|
|
1611
|
+
});
|
|
1612
|
+
/**
|
|
1613
|
+
* POST /api/agent/v1/:sessionId/interaction
|
|
1614
|
+
*
|
|
1615
|
+
* Record user interaction from the frontend.
|
|
1616
|
+
* Used to update the FocusStore for incremental analysis support.
|
|
1617
|
+
*
|
|
1618
|
+
* Request body:
|
|
1619
|
+
* {
|
|
1620
|
+
* type: 'click' | 'query' | 'drill_down' | 'compare' | 'extend' | 'explicit',
|
|
1621
|
+
* target: {
|
|
1622
|
+
* entityType?: 'frame' | 'process' | 'thread' | 'session',
|
|
1623
|
+
* entityId?: string,
|
|
1624
|
+
* timeRange?: { start: string, end: string }, // ns as string
|
|
1625
|
+
* metricName?: string,
|
|
1626
|
+
* question?: string
|
|
1627
|
+
* },
|
|
1628
|
+
* context?: Record<string, any> // Additional context
|
|
1629
|
+
* }
|
|
1630
|
+
*
|
|
1631
|
+
* Response:
|
|
1632
|
+
* {
|
|
1633
|
+
* success: boolean,
|
|
1634
|
+
* sessionId: string,
|
|
1635
|
+
* focusCount: number // Current number of tracked focuses
|
|
1636
|
+
* }
|
|
1637
|
+
*/
|
|
1638
|
+
// P1-4: Cancel endpoint — allows frontend to signal the backend to stop analysis
|
|
1639
|
+
router.post('/:sessionId/cancel', (req, res) => {
|
|
1640
|
+
const { sessionId } = req.params;
|
|
1641
|
+
const session = getAuthorizedSession(req, res, sessionId);
|
|
1642
|
+
if (!session)
|
|
1643
|
+
return;
|
|
1644
|
+
// Mark session as failed/cancelled
|
|
1645
|
+
if (session.status === 'running' || session.status === 'pending') {
|
|
1646
|
+
session.status = 'failed';
|
|
1647
|
+
session.error = 'Cancelled by user';
|
|
1648
|
+
markSessionRunStatus(session, 'failed', 'Cancelled by user');
|
|
1649
|
+
// Close SSE connections to signal the frontend
|
|
1650
|
+
for (const client of session.sseClients) {
|
|
1651
|
+
try {
|
|
1652
|
+
sendReplayableSessionEvent(session, client, 'error', {
|
|
1653
|
+
error: 'Analysis cancelled by user',
|
|
1654
|
+
message: 'Analysis cancelled by user',
|
|
1655
|
+
timestamp: Date.now(),
|
|
1656
|
+
...buildStreamObservability(session),
|
|
1657
|
+
});
|
|
1658
|
+
client.end();
|
|
1659
|
+
}
|
|
1660
|
+
catch { /* client may already be closed */ }
|
|
1661
|
+
}
|
|
1662
|
+
session.sseClients = [];
|
|
1663
|
+
session.logger.info('AgentRoutes', 'Session cancelled by user', { sessionId });
|
|
1664
|
+
}
|
|
1665
|
+
return res.json({ success: true, sessionId, status: session.status });
|
|
1666
|
+
});
|
|
1667
|
+
router.post('/:sessionId/interaction', async (req, res) => {
|
|
1668
|
+
const { sessionId } = req.params;
|
|
1669
|
+
const session = getAuthorizedSession(req, res, sessionId);
|
|
1670
|
+
if (!session)
|
|
1671
|
+
return;
|
|
1672
|
+
const { type, target, context } = req.body;
|
|
1673
|
+
// Validate type
|
|
1674
|
+
const allowedTypes = new Set(['click', 'query', 'drill_down', 'compare', 'extend', 'explicit']);
|
|
1675
|
+
if (!type || !allowedTypes.has(type)) {
|
|
1676
|
+
return res.status(400).json({
|
|
1677
|
+
success: false,
|
|
1678
|
+
error: `Invalid interaction type: ${String(type)}. Allowed: ${Array.from(allowedTypes).join(', ')}`,
|
|
1679
|
+
});
|
|
1680
|
+
}
|
|
1681
|
+
// Validate target
|
|
1682
|
+
if (!target || typeof target !== 'object') {
|
|
1683
|
+
return res.status(400).json({
|
|
1684
|
+
success: false,
|
|
1685
|
+
error: 'target is required and must be an object',
|
|
1686
|
+
});
|
|
1687
|
+
}
|
|
1688
|
+
try {
|
|
1689
|
+
// Convert timeRange strings to BigInt if present
|
|
1690
|
+
const processedTarget = { ...target };
|
|
1691
|
+
if (target.timeRange) {
|
|
1692
|
+
processedTarget.timeRange = {
|
|
1693
|
+
start: BigInt(target.timeRange.start),
|
|
1694
|
+
end: BigInt(target.timeRange.end),
|
|
1695
|
+
};
|
|
1696
|
+
}
|
|
1697
|
+
// Build interaction
|
|
1698
|
+
const interaction = {
|
|
1699
|
+
type,
|
|
1700
|
+
target: processedTarget,
|
|
1701
|
+
source: 'ui',
|
|
1702
|
+
timestamp: Date.now(),
|
|
1703
|
+
context,
|
|
1704
|
+
};
|
|
1705
|
+
// Record the interaction — ClaudeRuntime (agentv3) doesn't implement these methods.
|
|
1706
|
+
if (typeof session.orchestrator.recordUserInteraction === 'function') {
|
|
1707
|
+
session.orchestrator.recordUserInteraction(interaction);
|
|
1708
|
+
const focusStore = typeof session.orchestrator.getFocusStore === 'function'
|
|
1709
|
+
? session.orchestrator.getFocusStore()
|
|
1710
|
+
: null;
|
|
1711
|
+
const focusCount = focusStore ? focusStore.getTopFocuses(100).length : 0;
|
|
1712
|
+
return res.json({ success: true, sessionId, focusCount });
|
|
1713
|
+
}
|
|
1714
|
+
return res.json({ success: true, sessionId, focusCount: 0 });
|
|
1715
|
+
}
|
|
1716
|
+
catch (error) {
|
|
1717
|
+
console.error(`[Interaction] Error recording interaction for session ${sessionId}:`, error);
|
|
1718
|
+
return res.status(500).json({
|
|
1719
|
+
success: false,
|
|
1720
|
+
error: error.message || 'Failed to record interaction',
|
|
1721
|
+
});
|
|
1722
|
+
}
|
|
1723
|
+
});
|
|
1724
|
+
/**
|
|
1725
|
+
* GET /api/agent/v1/:sessionId/focus
|
|
1726
|
+
*
|
|
1727
|
+
* Get current user focus state for a session.
|
|
1728
|
+
* Useful for debugging and displaying focus indicators in the UI.
|
|
1729
|
+
*
|
|
1730
|
+
* Query params:
|
|
1731
|
+
* - limit: Max number of focuses to return (default: 10)
|
|
1732
|
+
*
|
|
1733
|
+
* Response:
|
|
1734
|
+
* {
|
|
1735
|
+
* success: boolean,
|
|
1736
|
+
* sessionId: string,
|
|
1737
|
+
* focuses: UserFocus[],
|
|
1738
|
+
* context: string // LLM-ready focus context summary
|
|
1739
|
+
* }
|
|
1740
|
+
*/
|
|
1741
|
+
router.get('/:sessionId/focus', (req, res) => {
|
|
1742
|
+
const { sessionId } = req.params;
|
|
1743
|
+
const session = getAuthorizedSession(req, res, sessionId);
|
|
1744
|
+
if (!session)
|
|
1745
|
+
return;
|
|
1746
|
+
try {
|
|
1747
|
+
// ClaudeRuntime (agentv3) doesn't implement getFocusStore — return empty.
|
|
1748
|
+
if (typeof session.orchestrator.getFocusStore !== 'function') {
|
|
1749
|
+
return res.json({ success: true, sessionId, focuses: [], context: '' });
|
|
1750
|
+
}
|
|
1751
|
+
const limit = req.query.limit ? parseInt(req.query.limit, 10) : 10;
|
|
1752
|
+
const focusStore = session.orchestrator.getFocusStore();
|
|
1753
|
+
// Get top focuses
|
|
1754
|
+
const focuses = focusStore.getTopFocuses(limit).map((f) => ({
|
|
1755
|
+
id: f.id,
|
|
1756
|
+
type: f.type,
|
|
1757
|
+
target: {
|
|
1758
|
+
...f.target,
|
|
1759
|
+
// Convert BigInt to string for JSON serialization
|
|
1760
|
+
...(f.target.timeRange && {
|
|
1761
|
+
timeRange: {
|
|
1762
|
+
start: String(f.target.timeRange.start),
|
|
1763
|
+
end: String(f.target.timeRange.end),
|
|
1764
|
+
},
|
|
1765
|
+
}),
|
|
1766
|
+
},
|
|
1767
|
+
weight: f.weight,
|
|
1768
|
+
lastInteractionTime: f.lastInteractionTime,
|
|
1769
|
+
interactionCount: f.interactionHistory.length,
|
|
1770
|
+
}));
|
|
1771
|
+
// Get LLM-ready context
|
|
1772
|
+
const context = focusStore.buildFocusContext();
|
|
1773
|
+
return res.json({
|
|
1774
|
+
success: true,
|
|
1775
|
+
sessionId,
|
|
1776
|
+
focuses,
|
|
1777
|
+
context,
|
|
1778
|
+
});
|
|
1779
|
+
}
|
|
1780
|
+
catch (error) {
|
|
1781
|
+
console.error(`[Focus] Error getting focus for session ${sessionId}:`, error);
|
|
1782
|
+
return res.status(500).json({
|
|
1783
|
+
success: false,
|
|
1784
|
+
error: error.message || 'Failed to get focus state',
|
|
1785
|
+
});
|
|
1786
|
+
}
|
|
1787
|
+
});
|
|
1788
|
+
(0, agentSessionCatalogRoutes_1.registerAgentSessionCatalogRoutes)(router, {
|
|
1789
|
+
sessionStore: assistantAppService,
|
|
1790
|
+
buildSessionObservability,
|
|
1791
|
+
});
|
|
1792
|
+
(0, agentResumeRoutes_1.registerAgentResumeRoutes)(router, {
|
|
1793
|
+
sessionStore: assistantAppService,
|
|
1794
|
+
buildSessionObservability,
|
|
1795
|
+
buildRecoveredResultFromContext,
|
|
1796
|
+
buildTurnSummary,
|
|
1797
|
+
});
|
|
1798
|
+
// ============================================================================
|
|
1799
|
+
// Scene Reconstruction Endpoints
|
|
1800
|
+
// ============================================================================
|
|
1801
|
+
// Scene-report cache layer singletons. The disk store backs file-backed
|
|
1802
|
+
// traces with a 7-day TTL; the memory LRU is the fallback for external RPC
|
|
1803
|
+
// traces (no content hash, so they live for the lifetime of the backend).
|
|
1804
|
+
const sceneReportStore = new sceneReportStore_1.FileSystemSceneReportStore(config_1.sceneStoryConfig.reportDir);
|
|
1805
|
+
const sceneReportMemoryCache = new sceneReportMemoryCache_1.SceneReportMemoryCache(config_1.sceneStoryConfig.memoryCacheMaxSize);
|
|
1806
|
+
// Singleton — sceneStoryService holds per-session JobRunner state for cancel
|
|
1807
|
+
// lookup, so it must outlive a single request. SkillExecutor is still created
|
|
1808
|
+
// per-request inside the route handler.
|
|
1809
|
+
const sceneStoryService = new sceneStoryService_1.SceneStoryService({
|
|
1810
|
+
broadcast: broadcastToAgentDrivenClients,
|
|
1811
|
+
getSession: (id) => assistantAppService.getSession(id),
|
|
1812
|
+
reportStore: sceneReportStore,
|
|
1813
|
+
memoryCache: sceneReportMemoryCache,
|
|
1814
|
+
computeHash: (traceId) => (0, traceHash_1.computeTraceContentHash)((0, traceProcessorService_1.getTraceProcessorService)(), traceId),
|
|
1815
|
+
probeDuration: (traceId) => (0, sceneTraceDurationProbe_1.probeTraceDuration)((0, traceProcessorService_1.getTraceProcessorService)(), traceId),
|
|
1816
|
+
});
|
|
1817
|
+
(0, agentSceneReconstructRoutes_1.registerSceneReconstructRoutes)(router, {
|
|
1818
|
+
assistantAppService,
|
|
1819
|
+
streamProjector,
|
|
1820
|
+
ensureToolsRegistered,
|
|
1821
|
+
runAgentDrivenAnalysis,
|
|
1822
|
+
broadcastToAgentDrivenClients,
|
|
1823
|
+
sendAgentDrivenResult,
|
|
1824
|
+
isSceneReplayOnlyQuery,
|
|
1825
|
+
buildSceneReplayNarrative,
|
|
1826
|
+
normalizeNarrativeForClient,
|
|
1827
|
+
sceneStoryService,
|
|
1828
|
+
});
|
|
1829
|
+
(0, agentQuickSceneRoutes_1.registerAgentQuickSceneRoutes)(router, {
|
|
1830
|
+
detectScenesQuick,
|
|
1831
|
+
});
|
|
1832
|
+
// ============================================================================
|
|
1833
|
+
// Scene Detection Cache + Parallel Helpers
|
|
1834
|
+
// ============================================================================
|
|
1835
|
+
const sceneCache = new Map();
|
|
1836
|
+
const SCENE_CACHE_TTL = 10 * 60 * 1000; // 10 minutes
|
|
1837
|
+
const SCENE_EXTRACTION_STEP_IDS = new Set([
|
|
1838
|
+
'screen_state_changes',
|
|
1839
|
+
'app_launches',
|
|
1840
|
+
'user_gestures',
|
|
1841
|
+
'scroll_initiation',
|
|
1842
|
+
'inertial_scrolls',
|
|
1843
|
+
'idle_periods',
|
|
1844
|
+
'top_app_changes',
|
|
1845
|
+
'system_events',
|
|
1846
|
+
'jank_events',
|
|
1847
|
+
'clean_timeline',
|
|
1848
|
+
]);
|
|
1849
|
+
function objectRowsToEnvelopePayload(rows) {
|
|
1850
|
+
if (!Array.isArray(rows) || rows.length === 0) {
|
|
1851
|
+
return { columns: [], rows: [] };
|
|
1852
|
+
}
|
|
1853
|
+
const columns = [];
|
|
1854
|
+
const seen = new Set();
|
|
1855
|
+
for (const row of rows) {
|
|
1856
|
+
if (!row || typeof row !== 'object')
|
|
1857
|
+
continue;
|
|
1858
|
+
for (const key of Object.keys(row)) {
|
|
1859
|
+
if (!seen.has(key)) {
|
|
1860
|
+
seen.add(key);
|
|
1861
|
+
columns.push(key);
|
|
1862
|
+
}
|
|
1863
|
+
}
|
|
1864
|
+
}
|
|
1865
|
+
return {
|
|
1866
|
+
columns,
|
|
1867
|
+
rows: rows.map((row) => columns.map((col) => (row ? row[col] : null))),
|
|
1868
|
+
};
|
|
1869
|
+
}
|
|
1870
|
+
function buildSceneExtractionEnvelopesFromRawResults(rawResults) {
|
|
1871
|
+
const envelopes = [];
|
|
1872
|
+
if (!rawResults || typeof rawResults !== 'object')
|
|
1873
|
+
return envelopes;
|
|
1874
|
+
for (const [stepId, stepResult] of Object.entries(rawResults)) {
|
|
1875
|
+
if (!SCENE_EXTRACTION_STEP_IDS.has(stepId))
|
|
1876
|
+
continue;
|
|
1877
|
+
const rows = Array.isArray(stepResult?.data)
|
|
1878
|
+
? stepResult.data
|
|
1879
|
+
: [];
|
|
1880
|
+
if (rows.length === 0)
|
|
1881
|
+
continue;
|
|
1882
|
+
const payload = objectRowsToEnvelopePayload(rows);
|
|
1883
|
+
if (payload.columns.length === 0)
|
|
1884
|
+
continue;
|
|
1885
|
+
envelopes.push((0, dataContract_1.createDataEnvelope)(payload, {
|
|
1886
|
+
type: 'skill_result',
|
|
1887
|
+
source: `scene_reconstruction.${stepId}`,
|
|
1888
|
+
skillId: 'scene_reconstruction',
|
|
1889
|
+
stepId,
|
|
1890
|
+
title: stepId,
|
|
1891
|
+
layer: 'list',
|
|
1892
|
+
format: 'table',
|
|
1893
|
+
}));
|
|
1894
|
+
}
|
|
1895
|
+
return envelopes;
|
|
1896
|
+
}
|
|
1897
|
+
/**
|
|
1898
|
+
* Execute the state_timeline skill directly (bypasses Agent decision-making).
|
|
1899
|
+
* Returns DataEnvelopes suitable for SSE broadcast and track overlay rendering.
|
|
1900
|
+
* agentv3's ClaudeRuntime doesn't auto-execute strategy tasks, so this must be
|
|
1901
|
+
* called explicitly from the scene reconstruction flow.
|
|
1902
|
+
*/
|
|
1903
|
+
async function executeStateTimelineSkill(traceProcessorService, traceId) {
|
|
1904
|
+
await (0, skillLoader_1.ensureSkillRegistryInitialized)();
|
|
1905
|
+
const skillExecutor = new skillExecutor_1.SkillExecutor(traceProcessorService);
|
|
1906
|
+
skillExecutor.registerSkills(skillLoader_1.skillRegistry.getAllSkills());
|
|
1907
|
+
const skillResult = await skillExecutor.execute('state_timeline', traceId, {
|
|
1908
|
+
trace_id: traceId,
|
|
1909
|
+
});
|
|
1910
|
+
if (!skillResult.success) {
|
|
1911
|
+
console.warn('[StateTimeline] state_timeline skill failed:', skillResult.error);
|
|
1912
|
+
return [];
|
|
1913
|
+
}
|
|
1914
|
+
// Convert rawResults to DataEnvelopes (same pattern as scene_reconstruction)
|
|
1915
|
+
const envelopes = [];
|
|
1916
|
+
if (!skillResult.rawResults || typeof skillResult.rawResults !== 'object')
|
|
1917
|
+
return envelopes;
|
|
1918
|
+
for (const [stepId, stepResult] of Object.entries(skillResult.rawResults)) {
|
|
1919
|
+
const rows = Array.isArray(stepResult?.data)
|
|
1920
|
+
? stepResult.data
|
|
1921
|
+
: [];
|
|
1922
|
+
if (rows.length === 0)
|
|
1923
|
+
continue;
|
|
1924
|
+
const payload = objectRowsToEnvelopePayload(rows);
|
|
1925
|
+
if (payload.columns.length === 0)
|
|
1926
|
+
continue;
|
|
1927
|
+
envelopes.push((0, dataContract_1.createDataEnvelope)(payload, {
|
|
1928
|
+
type: 'skill_result',
|
|
1929
|
+
source: `state_timeline:${stepId}`,
|
|
1930
|
+
skillId: 'state_timeline',
|
|
1931
|
+
stepId,
|
|
1932
|
+
title: stepId,
|
|
1933
|
+
layer: 'list',
|
|
1934
|
+
format: 'table',
|
|
1935
|
+
}));
|
|
1936
|
+
}
|
|
1937
|
+
return envelopes;
|
|
1938
|
+
}
|
|
1939
|
+
async function detectScenesQuickViaSkill(traceProcessorService, traceId) {
|
|
1940
|
+
await (0, skillLoader_1.ensureSkillRegistryInitialized)();
|
|
1941
|
+
const skillExecutor = new skillExecutor_1.SkillExecutor(traceProcessorService);
|
|
1942
|
+
skillExecutor.registerSkills(skillLoader_1.skillRegistry.getAllSkills());
|
|
1943
|
+
const skillResult = await skillExecutor.execute('scene_reconstruction', traceId, {
|
|
1944
|
+
trace_id: traceId,
|
|
1945
|
+
});
|
|
1946
|
+
if (!skillResult.success) {
|
|
1947
|
+
throw new Error(skillResult.error || 'scene_reconstruction execution failed');
|
|
1948
|
+
}
|
|
1949
|
+
const envelopes = buildSceneExtractionEnvelopesFromRawResults(skillResult.rawResults);
|
|
1950
|
+
return extractDetectedScenesFromEnvelopes(envelopes);
|
|
1951
|
+
}
|
|
1952
|
+
/** Detect app startups from android_startups stdlib view */
|
|
1953
|
+
async function detectStartups(tps, traceId) {
|
|
1954
|
+
// Reclassify startup_type: platform may report 'warm' even when
|
|
1955
|
+
// bindApplication exists (process killed + ActivityRecord survives).
|
|
1956
|
+
const result = await tps.query(traceId, `
|
|
1957
|
+
SELECT
|
|
1958
|
+
s.ts,
|
|
1959
|
+
s.dur,
|
|
1960
|
+
s.package,
|
|
1961
|
+
CASE
|
|
1962
|
+
WHEN EXISTS (
|
|
1963
|
+
SELECT 1 FROM android_startup_threads st
|
|
1964
|
+
JOIN thread_track tt ON tt.utid = st.utid
|
|
1965
|
+
JOIN slice sl ON sl.track_id = tt.id
|
|
1966
|
+
WHERE st.startup_id = s.startup_id
|
|
1967
|
+
AND st.is_main_thread = 1
|
|
1968
|
+
AND sl.name = 'bindApplication'
|
|
1969
|
+
AND sl.ts + sl.dur > st.ts AND sl.ts < st.ts + st.dur
|
|
1970
|
+
) THEN 'cold'
|
|
1971
|
+
ELSE s.startup_type
|
|
1972
|
+
END AS startup_type,
|
|
1973
|
+
CAST(s.dur / 1000000 AS INT) AS dur_ms
|
|
1974
|
+
FROM android_startups s
|
|
1975
|
+
WHERE s.dur > 0
|
|
1976
|
+
ORDER BY s.ts
|
|
1977
|
+
`);
|
|
1978
|
+
const scenes = [];
|
|
1979
|
+
if (result.rows) {
|
|
1980
|
+
for (const row of result.rows) {
|
|
1981
|
+
const [ts, dur, pkg, startupType, durMs] = row;
|
|
1982
|
+
let sceneType = 'cold_start';
|
|
1983
|
+
if (startupType === 'warm')
|
|
1984
|
+
sceneType = 'warm_start';
|
|
1985
|
+
else if (startupType === 'hot')
|
|
1986
|
+
sceneType = 'hot_start';
|
|
1987
|
+
scenes.push({
|
|
1988
|
+
type: sceneType,
|
|
1989
|
+
startTs: String(ts),
|
|
1990
|
+
endTs: String(BigInt(ts) + BigInt(dur)),
|
|
1991
|
+
durationMs: Number(durMs),
|
|
1992
|
+
confidence: 0.95,
|
|
1993
|
+
appPackage: pkg,
|
|
1994
|
+
metadata: { startupType },
|
|
1995
|
+
});
|
|
1996
|
+
}
|
|
1997
|
+
}
|
|
1998
|
+
return scenes;
|
|
1999
|
+
}
|
|
2000
|
+
/** Detect scroll sessions from input events + frame timeline */
|
|
2001
|
+
async function detectScrollSessions(tps, traceId) {
|
|
2002
|
+
const scrollResult = await tps.query(traceId, `
|
|
2003
|
+
WITH
|
|
2004
|
+
input_exists AS (
|
|
2005
|
+
SELECT 1 AS ok WHERE EXISTS (
|
|
2006
|
+
SELECT 1 FROM sqlite_master WHERE type IN ('table','view') AND name = 'android_input_events'
|
|
2007
|
+
)
|
|
2008
|
+
),
|
|
2009
|
+
motion_events AS (
|
|
2010
|
+
SELECT
|
|
2011
|
+
read_time AS ts,
|
|
2012
|
+
event_action
|
|
2013
|
+
FROM android_input_events
|
|
2014
|
+
WHERE event_type = 'MOTION'
|
|
2015
|
+
AND EXISTS (SELECT ok FROM input_exists)
|
|
2016
|
+
),
|
|
2017
|
+
gesture_markers AS (
|
|
2018
|
+
SELECT
|
|
2019
|
+
ts,
|
|
2020
|
+
event_action,
|
|
2021
|
+
SUM(CASE WHEN event_action = 'DOWN' THEN 1 ELSE 0 END) OVER (ORDER BY ts) AS gesture_id
|
|
2022
|
+
FROM motion_events
|
|
2023
|
+
),
|
|
2024
|
+
gestures AS (
|
|
2025
|
+
SELECT
|
|
2026
|
+
gesture_id,
|
|
2027
|
+
MIN(ts) AS down_ts,
|
|
2028
|
+
MAX(CASE WHEN event_action = 'UP' THEN ts ELSE NULL END) AS up_ts,
|
|
2029
|
+
COUNT(*) AS event_count
|
|
2030
|
+
FROM gesture_markers
|
|
2031
|
+
WHERE gesture_id > 0
|
|
2032
|
+
GROUP BY gesture_id
|
|
2033
|
+
HAVING COUNT(*) >= 4
|
|
2034
|
+
),
|
|
2035
|
+
frame_with_stats AS (
|
|
2036
|
+
SELECT
|
|
2037
|
+
ts,
|
|
2038
|
+
dur,
|
|
2039
|
+
ts + dur AS frame_end,
|
|
2040
|
+
jank_type,
|
|
2041
|
+
COALESCE(LEAD(ts) OVER (ORDER BY ts) - (ts + dur), 999999999) AS gap_to_next
|
|
2042
|
+
FROM actual_frame_timeline_slice
|
|
2043
|
+
WHERE surface_frame_token IS NOT NULL AND dur > 0
|
|
2044
|
+
),
|
|
2045
|
+
scroll_sessions AS (
|
|
2046
|
+
SELECT
|
|
2047
|
+
g.gesture_id,
|
|
2048
|
+
g.down_ts AS start_ts,
|
|
2049
|
+
COALESCE(
|
|
2050
|
+
(SELECT MIN(f.frame_end)
|
|
2051
|
+
FROM frame_with_stats f
|
|
2052
|
+
WHERE f.ts >= g.up_ts AND f.gap_to_next > 100000000),
|
|
2053
|
+
g.up_ts + 500000000
|
|
2054
|
+
) AS end_ts
|
|
2055
|
+
FROM gestures g
|
|
2056
|
+
WHERE g.up_ts IS NOT NULL
|
|
2057
|
+
)
|
|
2058
|
+
SELECT
|
|
2059
|
+
s.start_ts,
|
|
2060
|
+
s.end_ts,
|
|
2061
|
+
CAST((s.end_ts - s.start_ts) / 1000000 AS INT) AS dur_ms,
|
|
2062
|
+
(SELECT COUNT(*) FROM frame_with_stats f WHERE f.ts >= s.start_ts AND f.frame_end <= s.end_ts) AS frame_count
|
|
2063
|
+
FROM scroll_sessions s
|
|
2064
|
+
WHERE s.end_ts > s.start_ts + 100000000
|
|
2065
|
+
ORDER BY s.start_ts
|
|
2066
|
+
`);
|
|
2067
|
+
const scenes = [];
|
|
2068
|
+
if (scrollResult.rows) {
|
|
2069
|
+
for (const row of scrollResult.rows) {
|
|
2070
|
+
const [startTs, endTs, durMs, frameCount] = row;
|
|
2071
|
+
if (Number(frameCount) >= 3) {
|
|
2072
|
+
const fps = (Number(frameCount) * 1000) / Math.max(Number(durMs), 1);
|
|
2073
|
+
scenes.push({
|
|
2074
|
+
type: 'scroll',
|
|
2075
|
+
startTs: String(startTs),
|
|
2076
|
+
endTs: String(endTs),
|
|
2077
|
+
durationMs: Number(durMs),
|
|
2078
|
+
confidence: 0.85,
|
|
2079
|
+
metadata: {
|
|
2080
|
+
frameCount: Number(frameCount),
|
|
2081
|
+
averageFps: Math.round(fps * 10) / 10,
|
|
2082
|
+
},
|
|
2083
|
+
});
|
|
2084
|
+
}
|
|
2085
|
+
}
|
|
2086
|
+
}
|
|
2087
|
+
return scenes;
|
|
2088
|
+
}
|
|
2089
|
+
/** Detect tap/click events from input events */
|
|
2090
|
+
async function detectTapEvents(tps, traceId) {
|
|
2091
|
+
const tapResult = await tps.query(traceId, `
|
|
2092
|
+
WITH
|
|
2093
|
+
input_exists AS (
|
|
2094
|
+
SELECT 1 AS ok WHERE EXISTS (
|
|
2095
|
+
SELECT 1 FROM sqlite_master WHERE type IN ('table','view') AND name = 'android_input_events'
|
|
2096
|
+
)
|
|
2097
|
+
),
|
|
2098
|
+
motion_events AS (
|
|
2099
|
+
SELECT
|
|
2100
|
+
read_time AS ts,
|
|
2101
|
+
event_action
|
|
2102
|
+
FROM android_input_events
|
|
2103
|
+
WHERE event_type = 'MOTION'
|
|
2104
|
+
AND EXISTS (SELECT ok FROM input_exists)
|
|
2105
|
+
),
|
|
2106
|
+
tap_events AS (
|
|
2107
|
+
SELECT
|
|
2108
|
+
ts AS down_ts,
|
|
2109
|
+
LEAD(ts) OVER (ORDER BY ts) AS up_ts,
|
|
2110
|
+
event_action
|
|
2111
|
+
FROM motion_events
|
|
2112
|
+
WHERE event_action IN ('DOWN', 'UP')
|
|
2113
|
+
)
|
|
2114
|
+
SELECT
|
|
2115
|
+
down_ts AS start_ts,
|
|
2116
|
+
up_ts AS end_ts,
|
|
2117
|
+
CAST((up_ts - down_ts) / 1000000 AS INT) AS dur_ms
|
|
2118
|
+
FROM tap_events
|
|
2119
|
+
WHERE event_action = 'DOWN'
|
|
2120
|
+
AND up_ts IS NOT NULL
|
|
2121
|
+
AND (up_ts - down_ts) < 300000000
|
|
2122
|
+
ORDER BY down_ts
|
|
2123
|
+
LIMIT 50
|
|
2124
|
+
`);
|
|
2125
|
+
const scenes = [];
|
|
2126
|
+
if (tapResult.rows) {
|
|
2127
|
+
for (const row of tapResult.rows) {
|
|
2128
|
+
const [startTs, endTs, durMs] = row;
|
|
2129
|
+
scenes.push({
|
|
2130
|
+
type: 'tap',
|
|
2131
|
+
startTs: String(startTs),
|
|
2132
|
+
endTs: String(endTs),
|
|
2133
|
+
durationMs: Number(durMs),
|
|
2134
|
+
confidence: 0.75,
|
|
2135
|
+
});
|
|
2136
|
+
}
|
|
2137
|
+
}
|
|
2138
|
+
return scenes;
|
|
2139
|
+
}
|
|
2140
|
+
/**
|
|
2141
|
+
* Legacy quick scene detection path.
|
|
2142
|
+
* Kept as fallback when skill-based extraction is unavailable.
|
|
2143
|
+
*/
|
|
2144
|
+
async function detectScenesQuickLegacy(traceProcessorService, traceId) {
|
|
2145
|
+
// =========================================================================
|
|
2146
|
+
// Pre-load Perfetto stdlib modules (parallel)
|
|
2147
|
+
// =========================================================================
|
|
2148
|
+
// `android_input_events` and `android_startups` are stdlib VIEWS, not
|
|
2149
|
+
// intrinsic tables. They only exist after loading the corresponding modules.
|
|
2150
|
+
const REQUIRED_MODULES = [
|
|
2151
|
+
'android.input', // Creates android_input_events, android_key_events
|
|
2152
|
+
'android.startup.startups', // Creates android_startups
|
|
2153
|
+
];
|
|
2154
|
+
await Promise.all(REQUIRED_MODULES.map(module => traceProcessorService.query(traceId, `INCLUDE PERFETTO MODULE ${module};`)
|
|
2155
|
+
.catch(e => console.warn(`[QuickSceneDetect] Module not available: ${module}`, e))));
|
|
2156
|
+
// =========================================================================
|
|
2157
|
+
// Run all 3 detection queries in parallel
|
|
2158
|
+
// =========================================================================
|
|
2159
|
+
const [startupResult, scrollResult, tapResult] = await Promise.allSettled([
|
|
2160
|
+
detectStartups(traceProcessorService, traceId),
|
|
2161
|
+
detectScrollSessions(traceProcessorService, traceId),
|
|
2162
|
+
detectTapEvents(traceProcessorService, traceId),
|
|
2163
|
+
]);
|
|
2164
|
+
// Merge results from fulfilled promises
|
|
2165
|
+
const scenes = [];
|
|
2166
|
+
if (startupResult.status === 'fulfilled') {
|
|
2167
|
+
scenes.push(...startupResult.value);
|
|
2168
|
+
}
|
|
2169
|
+
else {
|
|
2170
|
+
console.warn('[QuickSceneDetect] Startup detection failed:', startupResult.reason);
|
|
2171
|
+
}
|
|
2172
|
+
if (scrollResult.status === 'fulfilled') {
|
|
2173
|
+
scenes.push(...scrollResult.value);
|
|
2174
|
+
}
|
|
2175
|
+
else {
|
|
2176
|
+
console.warn('[QuickSceneDetect] Scroll detection failed:', scrollResult.reason);
|
|
2177
|
+
}
|
|
2178
|
+
if (tapResult.status === 'fulfilled') {
|
|
2179
|
+
scenes.push(...tapResult.value);
|
|
2180
|
+
}
|
|
2181
|
+
else {
|
|
2182
|
+
console.warn('[QuickSceneDetect] Tap detection failed:', tapResult.reason);
|
|
2183
|
+
}
|
|
2184
|
+
// Sort scenes by start timestamp
|
|
2185
|
+
scenes.sort((a, b) => {
|
|
2186
|
+
const aTs = BigInt(a.startTs);
|
|
2187
|
+
const bTs = BigInt(b.startTs);
|
|
2188
|
+
return aTs < bTs ? -1 : aTs > bTs ? 1 : 0;
|
|
2189
|
+
});
|
|
2190
|
+
return scenes;
|
|
2191
|
+
}
|
|
2192
|
+
async function detectScenesQuick(traceProcessorService, traceId) {
|
|
2193
|
+
const cached = sceneCache.get(traceId);
|
|
2194
|
+
if (cached && Date.now() - cached.timestamp < SCENE_CACHE_TTL) {
|
|
2195
|
+
console.log('[QuickSceneDetect] Cache hit for traceId:', traceId);
|
|
2196
|
+
return cached.scenes;
|
|
2197
|
+
}
|
|
2198
|
+
const t0 = Date.now();
|
|
2199
|
+
let scenes = [];
|
|
2200
|
+
try {
|
|
2201
|
+
scenes = await detectScenesQuickViaSkill(traceProcessorService, traceId);
|
|
2202
|
+
console.log(`[QuickSceneDetect] Skill extraction path returned ${scenes.length} scenes`);
|
|
2203
|
+
if (scenes.length === 0) {
|
|
2204
|
+
const legacyScenes = await detectScenesQuickLegacy(traceProcessorService, traceId);
|
|
2205
|
+
if (legacyScenes.length > 0) {
|
|
2206
|
+
console.log(`[QuickSceneDetect] Legacy fallback provided ${legacyScenes.length} scenes after empty skill extraction`);
|
|
2207
|
+
scenes = legacyScenes;
|
|
2208
|
+
}
|
|
2209
|
+
}
|
|
2210
|
+
}
|
|
2211
|
+
catch (error) {
|
|
2212
|
+
console.warn('[QuickSceneDetect] Skill extraction failed, falling back to legacy SQL path:', error?.message || error);
|
|
2213
|
+
scenes = await detectScenesQuickLegacy(traceProcessorService, traceId);
|
|
2214
|
+
}
|
|
2215
|
+
scenes.sort((a, b) => {
|
|
2216
|
+
const aTs = BigInt(a.startTs);
|
|
2217
|
+
const bTs = BigInt(b.startTs);
|
|
2218
|
+
return aTs < bTs ? -1 : aTs > bTs ? 1 : 0;
|
|
2219
|
+
});
|
|
2220
|
+
console.log(`[QuickSceneDetect] Completed in ${Date.now() - t0}ms, ${scenes.length} scenes`);
|
|
2221
|
+
sceneCache.set(traceId, { scenes, timestamp: Date.now() });
|
|
2222
|
+
return scenes;
|
|
2223
|
+
}
|
|
2224
|
+
// ============================================================================
|
|
2225
|
+
// Teaching Pipeline Endpoints
|
|
2226
|
+
// ============================================================================
|
|
2227
|
+
(0, agentTeachingRoutes_1.registerTeachingRoutes)(router);
|
|
2228
|
+
(0, agentReportRoutes_1.registerAgentReportRoutes)(router, {
|
|
2229
|
+
getSession: (sessionId) => assistantAppService.getSession(sessionId),
|
|
2230
|
+
recoverResultForSessionIfNeeded,
|
|
2231
|
+
normalizeNarrativeForClient,
|
|
2232
|
+
buildClientFindings,
|
|
2233
|
+
buildSessionResultContract,
|
|
2234
|
+
});
|
|
2235
|
+
// ============================================================================
|
|
2236
|
+
// Agent-Driven Analysis Helper Functions (Phase 2-4)
|
|
2237
|
+
// ============================================================================
|
|
2238
|
+
async function runAgentDrivenAnalysis(sessionId, query, traceId, options = {}) {
|
|
2239
|
+
const session = assistantAppService.getSession(sessionId);
|
|
2240
|
+
if (!session)
|
|
2241
|
+
return;
|
|
2242
|
+
const inputRun = options.runContext;
|
|
2243
|
+
if (inputRun) {
|
|
2244
|
+
session.activeRun = {
|
|
2245
|
+
...inputRun,
|
|
2246
|
+
query,
|
|
2247
|
+
status: 'running',
|
|
2248
|
+
startedAt: inputRun.startedAt || Date.now(),
|
|
2249
|
+
};
|
|
2250
|
+
session.lastRun = { ...session.activeRun };
|
|
2251
|
+
session.runSequence = Math.max(normalizeRunSequence(session.runSequence), normalizeRunSequence(inputRun.sequence));
|
|
2252
|
+
}
|
|
2253
|
+
else if (!session.activeRun) {
|
|
2254
|
+
const fallback = startSessionRun(session, query, generateRequestId());
|
|
2255
|
+
session.activeRun = {
|
|
2256
|
+
...fallback,
|
|
2257
|
+
status: 'running',
|
|
2258
|
+
};
|
|
2259
|
+
session.lastRun = { ...session.activeRun };
|
|
2260
|
+
}
|
|
2261
|
+
else {
|
|
2262
|
+
session.activeRun.query = query;
|
|
2263
|
+
session.activeRun.status = 'running';
|
|
2264
|
+
if (!session.activeRun.startedAt) {
|
|
2265
|
+
session.activeRun.startedAt = Date.now();
|
|
2266
|
+
}
|
|
2267
|
+
session.lastRun = { ...session.activeRun };
|
|
2268
|
+
}
|
|
2269
|
+
const { logger } = session;
|
|
2270
|
+
session.status = 'running';
|
|
2271
|
+
session.lastActivityAt = Date.now();
|
|
2272
|
+
persistSessionRunState(session, 'running');
|
|
2273
|
+
const runHeartbeatInterval = startSessionRunHeartbeat(session);
|
|
2274
|
+
logger.info('AgentDrivenAnalysis', 'Starting agent-driven analysis', {
|
|
2275
|
+
query,
|
|
2276
|
+
traceId,
|
|
2277
|
+
runId: session.activeRun?.runId,
|
|
2278
|
+
requestId: session.activeRun?.requestId,
|
|
2279
|
+
runSequence: session.activeRun?.sequence,
|
|
2280
|
+
});
|
|
2281
|
+
// Track generation is a lightweight derivation step from DataEnvelopes.
|
|
2282
|
+
// Enable by default (unless explicitly disabled) so `/api/agent/v1/analyze` can
|
|
2283
|
+
// also produce TrackEvent(s) when the scene reconstruction skill runs.
|
|
2284
|
+
const shouldGenerateTracks = options.generateTracks !== false;
|
|
2285
|
+
// Capture LLM call telemetry into session logs (privacy-safe: hashes + params only)
|
|
2286
|
+
const modelRouter = (0, modelRouterSingleton_1.getSharedModelRouter)();
|
|
2287
|
+
const onLlmTelemetry = (event) => {
|
|
2288
|
+
if (!event || event.sessionId !== sessionId)
|
|
2289
|
+
return;
|
|
2290
|
+
logger.debug('LLM', 'llmTelemetry', event);
|
|
2291
|
+
};
|
|
2292
|
+
modelRouter.on('llmTelemetry', onLlmTelemetry);
|
|
2293
|
+
const runWithTraceProcessorLease = (fn) => {
|
|
2294
|
+
const leaseContexts = [
|
|
2295
|
+
options.traceProcessorLease,
|
|
2296
|
+
options.referenceTraceProcessorLease,
|
|
2297
|
+
].filter(Boolean);
|
|
2298
|
+
if (leaseContexts.length > 1 && options.traceProcessorService?.runWithLeases) {
|
|
2299
|
+
return options.traceProcessorService.runWithLeases(leaseContexts, fn);
|
|
2300
|
+
}
|
|
2301
|
+
if (leaseContexts.length === 1 && options.traceProcessorService?.runWithLease) {
|
|
2302
|
+
return options.traceProcessorService.runWithLease(leaseContexts[0], fn);
|
|
2303
|
+
}
|
|
2304
|
+
return fn();
|
|
2305
|
+
};
|
|
2306
|
+
// Set up streaming via event listener on orchestrator
|
|
2307
|
+
const handleUpdate = (update) => {
|
|
2308
|
+
session.lastActivityAt = Date.now();
|
|
2309
|
+
console.log(`[AgentRoutes.AgentDriven] Received event: ${update.type}`, update.content?.phase);
|
|
2310
|
+
logger.debug('Stream', `Update: ${update.type}`, update.content);
|
|
2311
|
+
const normalizedUpdate = augmentConclusionUpdateWithEvidenceIndex(session, normalizeAgentDrivenUpdate(update));
|
|
2312
|
+
// Broadcast the original event so the frontend receives raw events
|
|
2313
|
+
// (answer_token, thought, agent_response, conclusion, etc.) for rendering.
|
|
2314
|
+
broadcastToAgentDrivenClients(sessionId, normalizedUpdate);
|
|
2315
|
+
// Also derive a conversation_step for the timeline/observability layer.
|
|
2316
|
+
const conversationStep = buildConversationStepUpdate(session, normalizedUpdate);
|
|
2317
|
+
if (conversationStep) {
|
|
2318
|
+
appendConversationStep(session, conversationStep);
|
|
2319
|
+
broadcastToAgentDrivenClients(sessionId, conversationStep);
|
|
2320
|
+
}
|
|
2321
|
+
// Derive TrackEvent(s) for scene reconstruction sessions from emitted DataEnvelopes.
|
|
2322
|
+
// This keeps the TrackEvent feature while unifying on the agent-driven architecture.
|
|
2323
|
+
if (shouldGenerateTracks && normalizedUpdate.type === 'data') {
|
|
2324
|
+
const envelopes = (Array.isArray(normalizedUpdate.content) ? normalizedUpdate.content : [normalizedUpdate.content])
|
|
2325
|
+
.filter((e) => !!e && typeof e === 'object');
|
|
2326
|
+
const changed = updateSceneReconstructionArtifactsFromEnvelopes(session, envelopes);
|
|
2327
|
+
if (changed) {
|
|
2328
|
+
broadcastToAgentDrivenClients(sessionId, {
|
|
2329
|
+
type: 'track_data',
|
|
2330
|
+
content: {
|
|
2331
|
+
tracks: session.trackEvents || [],
|
|
2332
|
+
scenes: session.scenes || [],
|
|
2333
|
+
},
|
|
2334
|
+
timestamp: update.timestamp,
|
|
2335
|
+
id: (0, dataContract_1.generateEventId)('track_data', sessionId),
|
|
2336
|
+
});
|
|
2337
|
+
}
|
|
2338
|
+
}
|
|
2339
|
+
// Track agent dialogue events
|
|
2340
|
+
if (normalizedUpdate.content?.phase === 'task_dispatched' || normalizedUpdate.content?.phase === 'task_completed') {
|
|
2341
|
+
pushWithSessionCap(session.agentDialogue, {
|
|
2342
|
+
agentId: normalizedUpdate.content.agentId || 'master',
|
|
2343
|
+
type: normalizedUpdate.content.phase === 'task_dispatched' ? 'task' : 'response',
|
|
2344
|
+
content: normalizedUpdate.content,
|
|
2345
|
+
timestamp: normalizedUpdate.timestamp,
|
|
2346
|
+
}, MAX_SESSION_AGENT_DIALOGUE);
|
|
2347
|
+
// Collect full agent responses for HTML report enrichment
|
|
2348
|
+
if (normalizedUpdate.content.phase === 'task_completed') {
|
|
2349
|
+
pushWithSessionCap(session.agentResponses, {
|
|
2350
|
+
taskId: normalizedUpdate.content.taskId || '',
|
|
2351
|
+
agentId: normalizedUpdate.content.agentId || 'unknown',
|
|
2352
|
+
response: normalizedUpdate.content.response || normalizedUpdate.content,
|
|
2353
|
+
timestamp: normalizedUpdate.timestamp,
|
|
2354
|
+
}, MAX_SESSION_AGENT_RESPONSES);
|
|
2355
|
+
}
|
|
2356
|
+
}
|
|
2357
|
+
// Broadcast specialized events for frontend visualization.
|
|
2358
|
+
// Skip if the mapped type is the same as the original — agentv3 events
|
|
2359
|
+
// (answer_token, thought, conclusion, etc.) are already broadcast above
|
|
2360
|
+
// and remapping would cause duplicate delivery to the frontend.
|
|
2361
|
+
const eventType = mapToAgentDrivenEventType(normalizedUpdate);
|
|
2362
|
+
if (eventType !== normalizedUpdate.type) {
|
|
2363
|
+
broadcastToAgentDrivenClients(sessionId, {
|
|
2364
|
+
type: eventType,
|
|
2365
|
+
content: normalizedUpdate.content,
|
|
2366
|
+
timestamp: normalizedUpdate.timestamp,
|
|
2367
|
+
id: normalizedUpdate.id,
|
|
2368
|
+
});
|
|
2369
|
+
}
|
|
2370
|
+
};
|
|
2371
|
+
// Listen to orchestrator events
|
|
2372
|
+
if (session.orchestratorUpdateHandler) {
|
|
2373
|
+
session.orchestrator.off('update', session.orchestratorUpdateHandler);
|
|
2374
|
+
}
|
|
2375
|
+
session.orchestratorUpdateHandler = handleUpdate;
|
|
2376
|
+
session.orchestrator.on('update', handleUpdate);
|
|
2377
|
+
// Run state_timeline skill in parallel with Agent analysis (fire-and-forget).
|
|
2378
|
+
// Only execute when explicitly requested (e.g. scene reconstruction flow),
|
|
2379
|
+
// NOT on every analyze call — raw state lane data needs LLM reasoning before display.
|
|
2380
|
+
if (options.executeStateTimeline && options.traceProcessorService) {
|
|
2381
|
+
runWithTraceProcessorLease(() => executeStateTimelineSkill(options.traceProcessorService, traceId))
|
|
2382
|
+
.then((envelopes) => {
|
|
2383
|
+
if (envelopes.length === 0)
|
|
2384
|
+
return;
|
|
2385
|
+
// Process envelopes through the same pipeline as Agent-produced data
|
|
2386
|
+
const changed = updateSceneReconstructionArtifactsFromEnvelopes(session, envelopes);
|
|
2387
|
+
// Broadcast each envelope as a 'data' event so frontend track_overlay picks it up
|
|
2388
|
+
for (const env of envelopes) {
|
|
2389
|
+
broadcastToAgentDrivenClients(sessionId, {
|
|
2390
|
+
type: 'data',
|
|
2391
|
+
content: env,
|
|
2392
|
+
timestamp: Date.now(),
|
|
2393
|
+
id: (0, dataContract_1.generateEventId)('data', sessionId),
|
|
2394
|
+
});
|
|
2395
|
+
}
|
|
2396
|
+
if (changed) {
|
|
2397
|
+
broadcastToAgentDrivenClients(sessionId, {
|
|
2398
|
+
type: 'track_data',
|
|
2399
|
+
content: { tracks: session.trackEvents || [], scenes: session.scenes || [] },
|
|
2400
|
+
timestamp: Date.now(),
|
|
2401
|
+
id: (0, dataContract_1.generateEventId)('track_data', sessionId),
|
|
2402
|
+
});
|
|
2403
|
+
}
|
|
2404
|
+
logger.info('StateTimeline', 'State timeline lanes broadcast', {
|
|
2405
|
+
laneCount: Object.keys(session.stateTimeline || {}).length,
|
|
2406
|
+
envelopeCount: envelopes.length,
|
|
2407
|
+
});
|
|
2408
|
+
})
|
|
2409
|
+
.catch((err) => {
|
|
2410
|
+
logger.warn('StateTimeline', 'state_timeline skill failed (non-fatal)', {
|
|
2411
|
+
error: String(err?.message || err),
|
|
2412
|
+
});
|
|
2413
|
+
});
|
|
2414
|
+
}
|
|
2415
|
+
try {
|
|
2416
|
+
console.log('[AgentRoutes.AgentDriven] Starting orchestrator.analyze...');
|
|
2417
|
+
const result = await logger.timed('AgentDrivenAnalysis', 'analyze', async () => {
|
|
2418
|
+
const analyze = () => session.orchestrator.analyze(query, sessionId, traceId, {
|
|
2419
|
+
traceProcessorService: options.traceProcessorService,
|
|
2420
|
+
packageName: options.packageName,
|
|
2421
|
+
timeRange: options.timeRange,
|
|
2422
|
+
taskTimeoutMs: options.taskTimeoutMs,
|
|
2423
|
+
blockedStrategyIds: options.blockedStrategyIds,
|
|
2424
|
+
adb: options.adb,
|
|
2425
|
+
selectionContext: options.selectionContext,
|
|
2426
|
+
analysisMode: options.analysisMode,
|
|
2427
|
+
traceContext: options.traceContext,
|
|
2428
|
+
referenceTraceId: options.referenceTraceId,
|
|
2429
|
+
providerId: options.providerId,
|
|
2430
|
+
tenantId: session.tenantId,
|
|
2431
|
+
workspaceId: session.workspaceId,
|
|
2432
|
+
userId: session.userId,
|
|
2433
|
+
runId: session.activeRun?.runId,
|
|
2434
|
+
});
|
|
2435
|
+
return runWithTraceProcessorLease(analyze);
|
|
2436
|
+
});
|
|
2437
|
+
console.log('[AgentRoutes.AgentDriven] analyze completed, success:', result.success);
|
|
2438
|
+
session.result = result;
|
|
2439
|
+
// Accumulate hypotheses across turns (deduplicate by id)
|
|
2440
|
+
const existingIds = new Set(session.hypotheses.map(h => h.id));
|
|
2441
|
+
for (const h of result.hypotheses) {
|
|
2442
|
+
if (!existingIds.has(h.id)) {
|
|
2443
|
+
session.hypotheses.push(h);
|
|
2444
|
+
}
|
|
2445
|
+
else {
|
|
2446
|
+
// Update existing hypothesis with latest status
|
|
2447
|
+
const idx = session.hypotheses.findIndex(eh => eh.id === h.id);
|
|
2448
|
+
if (idx >= 0)
|
|
2449
|
+
session.hypotheses[idx] = h;
|
|
2450
|
+
}
|
|
2451
|
+
}
|
|
2452
|
+
const terminalRunStatus = terminalRunStatusForResult(result);
|
|
2453
|
+
session.status = terminalRunStatus === 'quota_exceeded'
|
|
2454
|
+
? 'quota_exceeded'
|
|
2455
|
+
: result.success ? 'completed' : 'failed';
|
|
2456
|
+
markSessionRunStatus(session, terminalRunStatus);
|
|
2457
|
+
// Record conclusion in cross-turn history
|
|
2458
|
+
if (!session.conclusionHistory)
|
|
2459
|
+
session.conclusionHistory = [];
|
|
2460
|
+
if (result.conclusion) {
|
|
2461
|
+
session.conclusionHistory.push({
|
|
2462
|
+
turn: session.runSequence || 1,
|
|
2463
|
+
conclusion: result.conclusion,
|
|
2464
|
+
confidence: result.confidence ?? 0,
|
|
2465
|
+
timestamp: Date.now(),
|
|
2466
|
+
});
|
|
2467
|
+
}
|
|
2468
|
+
// Ensure trackEvents/scenes are computed for completed sessions (even without SSE clients)
|
|
2469
|
+
if (shouldGenerateTracks) {
|
|
2470
|
+
updateSceneReconstructionArtifactsFromEnvelopes(session, session.dataEnvelopes);
|
|
2471
|
+
}
|
|
2472
|
+
if (session.referenceTraceId && options.traceProcessorService) {
|
|
2473
|
+
session.comparisonSource = 'raw_trace_pair';
|
|
2474
|
+
try {
|
|
2475
|
+
session.comparisonReportSection = await runWithTraceProcessorLease(() => (0, comparisonAppendixService_1.buildRawTraceComparisonReportSection)(options.traceProcessorService, {
|
|
2476
|
+
currentTraceId: traceId,
|
|
2477
|
+
referenceTraceId: session.referenceTraceId,
|
|
2478
|
+
}));
|
|
2479
|
+
}
|
|
2480
|
+
catch (comparisonSectionError) {
|
|
2481
|
+
session.comparisonReportSection = {
|
|
2482
|
+
source: 'raw_trace_pair',
|
|
2483
|
+
title: 'SmartPerfetto 确定性对比附录',
|
|
2484
|
+
markdown: [
|
|
2485
|
+
'## SmartPerfetto 确定性对比附录',
|
|
2486
|
+
'',
|
|
2487
|
+
`- 固定 SQL 附录生成失败:${comparisonSectionError?.message || String(comparisonSectionError)}`,
|
|
2488
|
+
'',
|
|
2489
|
+
].join('\n'),
|
|
2490
|
+
html: `<section class="smartperfetto-comparison-appendix"><h2>SmartPerfetto 确定性对比附录</h2><p>固定 SQL 附录生成失败:${escapeHtmlForInlineHtml(comparisonSectionError?.message || String(comparisonSectionError))}</p></section>`,
|
|
2491
|
+
limitations: [`固定 SQL 附录生成失败:${comparisonSectionError?.message || String(comparisonSectionError)}`],
|
|
2492
|
+
};
|
|
2493
|
+
}
|
|
2494
|
+
}
|
|
2495
|
+
// Log completion details
|
|
2496
|
+
logger.info('AgentDrivenAnalysis', 'Agent-driven analysis completed', {
|
|
2497
|
+
confidence: result.confidence,
|
|
2498
|
+
rounds: result.rounds,
|
|
2499
|
+
findingsCount: result.findings.length,
|
|
2500
|
+
hypothesesCount: result.hypotheses.length,
|
|
2501
|
+
partial: result.partial,
|
|
2502
|
+
terminationReason: result.terminationReason,
|
|
2503
|
+
runId: session.activeRun?.runId,
|
|
2504
|
+
requestId: session.activeRun?.requestId,
|
|
2505
|
+
runSequence: session.activeRun?.sequence,
|
|
2506
|
+
});
|
|
2507
|
+
// Persist session state via shared helper — see services/persistAgentSession.ts.
|
|
2508
|
+
// CLI's cliAnalyzeService routes through the same function.
|
|
2509
|
+
(0, persistAgentSession_1.persistAgentTurn)({
|
|
2510
|
+
session,
|
|
2511
|
+
sessionId,
|
|
2512
|
+
traceId,
|
|
2513
|
+
query,
|
|
2514
|
+
result: { conclusion: result.conclusion, totalDurationMs: result.totalDurationMs },
|
|
2515
|
+
logger,
|
|
2516
|
+
// Preserve the legacy component label so any log filters / alerts keyed
|
|
2517
|
+
// on 'AgentDrivenAnalysis' keep matching persist-related events.
|
|
2518
|
+
logComponent: 'AgentDrivenAnalysis',
|
|
2519
|
+
});
|
|
2520
|
+
// Send final result
|
|
2521
|
+
const clientCount = session.sseClients.length;
|
|
2522
|
+
logger.info('AgentRoutes', 'Sending agent-driven result', { clientCount });
|
|
2523
|
+
session.sseClients.forEach((client, index) => {
|
|
2524
|
+
try {
|
|
2525
|
+
logger.info('AgentRoutes', `Sending agent-driven result to client ${index + 1}/${clientCount}`);
|
|
2526
|
+
sendAgentDrivenResult(client, session);
|
|
2527
|
+
sendReplayableSessionEvent(session, client, 'end', {
|
|
2528
|
+
timestamp: Date.now(),
|
|
2529
|
+
...buildStreamObservability(session),
|
|
2530
|
+
});
|
|
2531
|
+
}
|
|
2532
|
+
catch (e) {
|
|
2533
|
+
logger.error('AgentRoutes', `Error sending agent-driven result to client ${index + 1}`, e);
|
|
2534
|
+
}
|
|
2535
|
+
});
|
|
2536
|
+
logger.close();
|
|
2537
|
+
}
|
|
2538
|
+
catch (error) {
|
|
2539
|
+
session.status = 'failed';
|
|
2540
|
+
session.error = error.message;
|
|
2541
|
+
markSessionRunStatus(session, 'failed', error.message);
|
|
2542
|
+
logger.error('AgentDrivenAnalysis', 'Agent-driven analysis failed', error);
|
|
2543
|
+
broadcastToAgentDrivenClients(sessionId, {
|
|
2544
|
+
type: 'error',
|
|
2545
|
+
content: { message: error.message, error: error.message },
|
|
2546
|
+
timestamp: Date.now(),
|
|
2547
|
+
});
|
|
2548
|
+
logger.close();
|
|
2549
|
+
throw error;
|
|
2550
|
+
}
|
|
2551
|
+
finally {
|
|
2552
|
+
if (runHeartbeatInterval) {
|
|
2553
|
+
clearInterval(runHeartbeatInterval);
|
|
2554
|
+
}
|
|
2555
|
+
// Prevent listener accumulation across multi-turn requests in the same session.
|
|
2556
|
+
if (session.orchestratorUpdateHandler) {
|
|
2557
|
+
session.orchestrator.off('update', session.orchestratorUpdateHandler);
|
|
2558
|
+
if (session.orchestratorUpdateHandler === handleUpdate) {
|
|
2559
|
+
session.orchestratorUpdateHandler = undefined;
|
|
2560
|
+
}
|
|
2561
|
+
}
|
|
2562
|
+
modelRouter.off('llmTelemetry', onLlmTelemetry);
|
|
2563
|
+
}
|
|
2564
|
+
}
|
|
2565
|
+
function sanitizeConversationText(value, maxLen = 240) {
|
|
2566
|
+
return String(value ?? '')
|
|
2567
|
+
.replace(/\s+/g, ' ')
|
|
2568
|
+
.trim()
|
|
2569
|
+
.slice(0, maxLen);
|
|
2570
|
+
}
|
|
2571
|
+
function escapeHtmlForInlineHtml(value) {
|
|
2572
|
+
return String(value ?? '')
|
|
2573
|
+
.replace(/&/g, '&')
|
|
2574
|
+
.replace(/</g, '<')
|
|
2575
|
+
.replace(/>/g, '>')
|
|
2576
|
+
.replace(/"/g, '"');
|
|
2577
|
+
}
|
|
2578
|
+
function appendConversationStep(session, update) {
|
|
2579
|
+
if (update.type !== 'conversation_step')
|
|
2580
|
+
return;
|
|
2581
|
+
const payload = update.content && typeof update.content === 'object' && !Array.isArray(update.content)
|
|
2582
|
+
? update.content
|
|
2583
|
+
: {};
|
|
2584
|
+
const contentRecord = payload.content && typeof payload.content === 'object' && !Array.isArray(payload.content)
|
|
2585
|
+
? payload.content
|
|
2586
|
+
: {};
|
|
2587
|
+
const text = sanitizeConversationText(contentRecord.text);
|
|
2588
|
+
const ordinal = Number(payload.ordinal);
|
|
2589
|
+
if (!text || !Number.isFinite(ordinal) || ordinal <= 0)
|
|
2590
|
+
return;
|
|
2591
|
+
const phaseRaw = sanitizeConversationText(payload.phase, 24);
|
|
2592
|
+
const phase = ((phaseRaw === 'thinking' ||
|
|
2593
|
+
phaseRaw === 'tool' ||
|
|
2594
|
+
phaseRaw === 'result' ||
|
|
2595
|
+
phaseRaw === 'error') ? phaseRaw : 'progress');
|
|
2596
|
+
const roleRaw = sanitizeConversationText(payload.role, 16);
|
|
2597
|
+
const role = roleRaw === 'system' ? 'system' : 'agent';
|
|
2598
|
+
const eventId = sanitizeConversationText(payload.eventId, 128) ||
|
|
2599
|
+
sanitizeConversationText(update.id, 128) ||
|
|
2600
|
+
`conversation-step-${session.sessionId}-${ordinal}`;
|
|
2601
|
+
if (session.conversationSteps.some((step) => step.eventId === eventId || step.ordinal === ordinal)) {
|
|
2602
|
+
return;
|
|
2603
|
+
}
|
|
2604
|
+
session.conversationSteps.push({
|
|
2605
|
+
eventId,
|
|
2606
|
+
ordinal,
|
|
2607
|
+
phase,
|
|
2608
|
+
role,
|
|
2609
|
+
text,
|
|
2610
|
+
timestamp: typeof update.timestamp === 'number' && Number.isFinite(update.timestamp)
|
|
2611
|
+
? update.timestamp
|
|
2612
|
+
: Date.now(),
|
|
2613
|
+
sourceEventType: sanitizeConversationText(payload?.source?.eventType, 48) || undefined,
|
|
2614
|
+
});
|
|
2615
|
+
session.conversationSteps.sort((a, b) => a.ordinal - b.ordinal);
|
|
2616
|
+
if (session.conversationSteps.length > 400) {
|
|
2617
|
+
session.conversationSteps.splice(0, session.conversationSteps.length - 400);
|
|
2618
|
+
}
|
|
2619
|
+
}
|
|
2620
|
+
function summarizeTimelineToolCall(content) {
|
|
2621
|
+
const toolName = typeof content.toolName === 'string' ? content.toolName : '';
|
|
2622
|
+
if (!toolName)
|
|
2623
|
+
return '';
|
|
2624
|
+
const generated = (0, toolNarration_1.formatToolCallNarration)(toolName, content.args);
|
|
2625
|
+
const message = sanitizeConversationText(content.message);
|
|
2626
|
+
if (!message || (0, toolNarration_1.looksLikeGenericToolMessage)(message)) {
|
|
2627
|
+
return generated;
|
|
2628
|
+
}
|
|
2629
|
+
return message;
|
|
2630
|
+
}
|
|
2631
|
+
function summarizeTimelineResult(content) {
|
|
2632
|
+
const candidates = [
|
|
2633
|
+
content.summary,
|
|
2634
|
+
content.message,
|
|
2635
|
+
content.result,
|
|
2636
|
+
content.output,
|
|
2637
|
+
];
|
|
2638
|
+
for (const candidate of candidates) {
|
|
2639
|
+
const text = sanitizeConversationText(candidate);
|
|
2640
|
+
if (text)
|
|
2641
|
+
return text;
|
|
2642
|
+
}
|
|
2643
|
+
return '';
|
|
2644
|
+
}
|
|
2645
|
+
function summarizeDataEnvelopeForTimeline(update) {
|
|
2646
|
+
const envelopes = (Array.isArray(update.content) ? update.content : [update.content])
|
|
2647
|
+
.filter((entry) => entry && typeof entry === 'object');
|
|
2648
|
+
if (envelopes.length === 0)
|
|
2649
|
+
return '';
|
|
2650
|
+
const allTitles = envelopes
|
|
2651
|
+
.map((env) => sanitizeConversationText(env?.display?.title || env?.meta?.stepId || env?.meta?.source))
|
|
2652
|
+
.filter(Boolean);
|
|
2653
|
+
const titles = allTitles.slice(0, 4);
|
|
2654
|
+
const omittedTitleCount = Math.max(0, allTitles.length - titles.length);
|
|
2655
|
+
const rows = envelopes
|
|
2656
|
+
.map((env) => {
|
|
2657
|
+
const data = env?.data;
|
|
2658
|
+
return Array.isArray(data?.rows) ? data.rows.length : undefined;
|
|
2659
|
+
})
|
|
2660
|
+
.filter((rowCount) => typeof rowCount === 'number');
|
|
2661
|
+
const rowText = rows.length > 0
|
|
2662
|
+
? `,共 ${rows.reduce((sum, rowCount) => sum + rowCount, 0)} 行`
|
|
2663
|
+
: '';
|
|
2664
|
+
const traceSides = [...new Set(envelopes
|
|
2665
|
+
.map((env) => env?.meta?.traceSide || env?.traceSide || env?.traceProvenance?.traceSide)
|
|
2666
|
+
.filter((side) => side === 'current' || side === 'reference'))];
|
|
2667
|
+
const traceText = traceSides.length > 0
|
|
2668
|
+
? `,Trace: ${traceSides.map(side => side === 'reference' ? '参考' : '当前').join('/')}`
|
|
2669
|
+
: '';
|
|
2670
|
+
const evidenceRefs = envelopes
|
|
2671
|
+
.map((env) => sanitizeConversationText(env?.meta?.evidenceRefId))
|
|
2672
|
+
.filter(Boolean);
|
|
2673
|
+
const evidenceText = evidenceRefs.length > 0
|
|
2674
|
+
? `,已登记 ${evidenceRefs.length} 个证据 ID`
|
|
2675
|
+
: '';
|
|
2676
|
+
const formats = [...new Set(envelopes
|
|
2677
|
+
.map((env) => sanitizeConversationText(env?.display?.format, 24))
|
|
2678
|
+
.filter(Boolean))];
|
|
2679
|
+
const kindText = formats.length === 1
|
|
2680
|
+
? {
|
|
2681
|
+
table: '数据表',
|
|
2682
|
+
summary: '摘要数据',
|
|
2683
|
+
metric: '指标数据',
|
|
2684
|
+
chart: '图表数据',
|
|
2685
|
+
text: '文本数据',
|
|
2686
|
+
timeline: '时间线数据',
|
|
2687
|
+
}[formats[0]] || '数据输出'
|
|
2688
|
+
: '数据输出';
|
|
2689
|
+
const planPhases = [...new Set(envelopes
|
|
2690
|
+
.map((env) => sanitizeConversationText(env?.meta?.planPhaseTitle || env?.meta?.planPhaseId, 80))
|
|
2691
|
+
.filter(Boolean))];
|
|
2692
|
+
const phaseText = planPhases.length > 0
|
|
2693
|
+
? `,阶段: ${planPhases.slice(0, 2).join('/')}`
|
|
2694
|
+
: '';
|
|
2695
|
+
const phaseWarnings = [...new Set(envelopes
|
|
2696
|
+
.map((env) => sanitizeConversationText(env?.meta?.planPhaseWarning, 120))
|
|
2697
|
+
.filter(Boolean))];
|
|
2698
|
+
const phaseWarningText = phaseWarnings.length > 0
|
|
2699
|
+
? `,阶段归因需核对: ${phaseWarnings.slice(0, 2).join(';')}`
|
|
2700
|
+
: '';
|
|
2701
|
+
const reasons = envelopes
|
|
2702
|
+
.map((env) => sanitizeConversationText(env?.meta?.producerReason || env?.meta?.toolNarration, 180))
|
|
2703
|
+
.filter(Boolean);
|
|
2704
|
+
const uniqueReasons = [...new Set(reasons)].slice(0, 3);
|
|
2705
|
+
const omittedReasonCount = Math.max(0, reasons.length - uniqueReasons.length);
|
|
2706
|
+
const reasonText = uniqueReasons.length > 0
|
|
2707
|
+
? `:${uniqueReasons.join(';')}${omittedReasonCount > 0 ? `;另有 ${omittedReasonCount} 条原因` : ''}`
|
|
2708
|
+
: '';
|
|
2709
|
+
const titleText = titles.length > 0
|
|
2710
|
+
? `:${titles.join(' / ')}${omittedTitleCount > 0 ? ` / 另有 ${omittedTitleCount} 份` : ''}`
|
|
2711
|
+
: '';
|
|
2712
|
+
return `收到 ${envelopes.length} 份${kindText}${titleText}${rowText}${traceText}${phaseText}${phaseWarningText}${evidenceText}${reasonText || ',用于支撑后续诊断'}`;
|
|
2713
|
+
}
|
|
2714
|
+
function buildConversationStepUpdate(session, update) {
|
|
2715
|
+
if (update.type === 'conversation_step')
|
|
2716
|
+
return null;
|
|
2717
|
+
const contentRecord = update.content && typeof update.content === 'object' && !Array.isArray(update.content)
|
|
2718
|
+
? update.content
|
|
2719
|
+
: {};
|
|
2720
|
+
let phase = 'progress';
|
|
2721
|
+
let role = 'agent';
|
|
2722
|
+
let text = '';
|
|
2723
|
+
switch (update.type) {
|
|
2724
|
+
case 'progress':
|
|
2725
|
+
case 'degraded':
|
|
2726
|
+
case 'stage_transition':
|
|
2727
|
+
case 'round_start':
|
|
2728
|
+
case 'strategy_decision':
|
|
2729
|
+
case 'synthesis_complete':
|
|
2730
|
+
case 'hypothesis_generated':
|
|
2731
|
+
phase = 'progress';
|
|
2732
|
+
role = 'system';
|
|
2733
|
+
text =
|
|
2734
|
+
sanitizeConversationText(contentRecord.message) ||
|
|
2735
|
+
sanitizeConversationText(contentRecord.fallback && `降级处理: ${contentRecord.fallback}`) ||
|
|
2736
|
+
sanitizeConversationText(contentRecord.reasoning) ||
|
|
2737
|
+
sanitizeConversationText(contentRecord.phase && `阶段: ${contentRecord.phase}`);
|
|
2738
|
+
if (!text && update.type === 'hypothesis_generated' && Array.isArray(contentRecord.hypotheses)) {
|
|
2739
|
+
text = `形成 ${contentRecord.hypotheses.length} 个待验证假设`;
|
|
2740
|
+
}
|
|
2741
|
+
break;
|
|
2742
|
+
case 'thought':
|
|
2743
|
+
case 'worker_thought':
|
|
2744
|
+
phase = 'thinking';
|
|
2745
|
+
role = update.type === 'worker_thought' ? 'system' : 'agent';
|
|
2746
|
+
text =
|
|
2747
|
+
sanitizeConversationText(contentRecord.thought) ||
|
|
2748
|
+
sanitizeConversationText(contentRecord.content) ||
|
|
2749
|
+
sanitizeConversationText(contentRecord.message);
|
|
2750
|
+
break;
|
|
2751
|
+
case 'tool_call':
|
|
2752
|
+
case 'agent_task_dispatched':
|
|
2753
|
+
case 'agent_dialogue':
|
|
2754
|
+
phase = 'tool';
|
|
2755
|
+
role = 'agent';
|
|
2756
|
+
text =
|
|
2757
|
+
summarizeTimelineToolCall(contentRecord) ||
|
|
2758
|
+
sanitizeConversationText(contentRecord.message) ||
|
|
2759
|
+
sanitizeConversationText(contentRecord.summary) ||
|
|
2760
|
+
sanitizeConversationText(contentRecord.taskTitle) ||
|
|
2761
|
+
sanitizeConversationText(contentRecord.toolName);
|
|
2762
|
+
break;
|
|
2763
|
+
case 'agent_response':
|
|
2764
|
+
case 'finding':
|
|
2765
|
+
phase = 'result';
|
|
2766
|
+
role = 'agent';
|
|
2767
|
+
if (update.type === 'finding' && Array.isArray(contentRecord.findings)) {
|
|
2768
|
+
const firstFinding = contentRecord.findings.find((entry) => entry && typeof entry === 'object');
|
|
2769
|
+
const firstTitle = sanitizeConversationText(firstFinding?.title || firstFinding?.description);
|
|
2770
|
+
text = firstTitle
|
|
2771
|
+
? `新增发现 ${contentRecord.findings.length} 条: ${firstTitle}`
|
|
2772
|
+
: `新增发现 ${contentRecord.findings.length} 条`;
|
|
2773
|
+
}
|
|
2774
|
+
else {
|
|
2775
|
+
text =
|
|
2776
|
+
summarizeTimelineResult(contentRecord) ||
|
|
2777
|
+
(contentRecord.taskId ? `工具调用完成 (#${String(contentRecord.taskId).slice(-6)})` : '');
|
|
2778
|
+
}
|
|
2779
|
+
break;
|
|
2780
|
+
case 'data': {
|
|
2781
|
+
phase = 'result';
|
|
2782
|
+
role = 'system';
|
|
2783
|
+
text = summarizeDataEnvelopeForTimeline(update);
|
|
2784
|
+
break;
|
|
2785
|
+
}
|
|
2786
|
+
case 'conclusion':
|
|
2787
|
+
phase = 'result';
|
|
2788
|
+
role = 'agent';
|
|
2789
|
+
text =
|
|
2790
|
+
sanitizeConversationText(contentRecord.summary) ||
|
|
2791
|
+
sanitizeConversationText(contentRecord.message) ||
|
|
2792
|
+
'最终结论已生成';
|
|
2793
|
+
break;
|
|
2794
|
+
case 'answer_token':
|
|
2795
|
+
if (contentRecord.done === true) {
|
|
2796
|
+
phase = 'result';
|
|
2797
|
+
role = 'agent';
|
|
2798
|
+
text = '最终回答生成完成';
|
|
2799
|
+
}
|
|
2800
|
+
break;
|
|
2801
|
+
case 'error':
|
|
2802
|
+
phase = 'error';
|
|
2803
|
+
role = 'system';
|
|
2804
|
+
text =
|
|
2805
|
+
sanitizeConversationText(contentRecord.message) ||
|
|
2806
|
+
sanitizeConversationText(contentRecord.error) ||
|
|
2807
|
+
'分析过程中发生错误';
|
|
2808
|
+
break;
|
|
2809
|
+
default:
|
|
2810
|
+
return null;
|
|
2811
|
+
}
|
|
2812
|
+
if (!text)
|
|
2813
|
+
return null;
|
|
2814
|
+
session.conversationOrdinal = (Number.isFinite(session.conversationOrdinal) ? session.conversationOrdinal : 0) + 1;
|
|
2815
|
+
const ordinal = session.conversationOrdinal;
|
|
2816
|
+
const eventId = (0, dataContract_1.generateEventId)('conversation_step', session.sessionId);
|
|
2817
|
+
const metadata = {};
|
|
2818
|
+
if (typeof contentRecord.round === 'number' && Number.isFinite(contentRecord.round)) {
|
|
2819
|
+
metadata.round = contentRecord.round;
|
|
2820
|
+
}
|
|
2821
|
+
if (typeof contentRecord.strategyId === 'string' && contentRecord.strategyId.trim()) {
|
|
2822
|
+
metadata.strategyId = contentRecord.strategyId.trim();
|
|
2823
|
+
}
|
|
2824
|
+
if (contentRecord.partial === true) {
|
|
2825
|
+
metadata.partial = true;
|
|
2826
|
+
}
|
|
2827
|
+
if (typeof contentRecord.terminationReason === 'string' && contentRecord.terminationReason.trim()) {
|
|
2828
|
+
metadata.terminationReason = contentRecord.terminationReason.trim();
|
|
2829
|
+
}
|
|
2830
|
+
if (session.activeRun?.runId) {
|
|
2831
|
+
metadata.runId = session.activeRun.runId;
|
|
2832
|
+
}
|
|
2833
|
+
if (session.activeRun?.requestId) {
|
|
2834
|
+
metadata.requestId = session.activeRun.requestId;
|
|
2835
|
+
}
|
|
2836
|
+
if (typeof session.activeRun?.sequence === 'number' && Number.isFinite(session.activeRun.sequence)) {
|
|
2837
|
+
metadata.runSequence = session.activeRun.sequence;
|
|
2838
|
+
}
|
|
2839
|
+
return {
|
|
2840
|
+
type: 'conversation_step',
|
|
2841
|
+
id: eventId,
|
|
2842
|
+
timestamp: update.timestamp || Date.now(),
|
|
2843
|
+
content: {
|
|
2844
|
+
eventId,
|
|
2845
|
+
sessionId: session.sessionId,
|
|
2846
|
+
traceId: session.traceId,
|
|
2847
|
+
phase,
|
|
2848
|
+
role,
|
|
2849
|
+
ordinal,
|
|
2850
|
+
content: {
|
|
2851
|
+
text,
|
|
2852
|
+
},
|
|
2853
|
+
metadata: Object.keys(metadata).length > 0 ? metadata : undefined,
|
|
2854
|
+
source: {
|
|
2855
|
+
eventType: update.type,
|
|
2856
|
+
phase: typeof contentRecord.phase === 'string' ? contentRecord.phase : undefined,
|
|
2857
|
+
},
|
|
2858
|
+
},
|
|
2859
|
+
};
|
|
2860
|
+
}
|
|
2861
|
+
/**
|
|
2862
|
+
* Normalize orchestrator updates before mapping/broadcasting
|
|
2863
|
+
*/
|
|
2864
|
+
function normalizeAgentDrivenUpdate(update) {
|
|
2865
|
+
const rawContent = update.content;
|
|
2866
|
+
if (!rawContent || typeof rawContent !== 'object' || Array.isArray(rawContent)) {
|
|
2867
|
+
return update;
|
|
2868
|
+
}
|
|
2869
|
+
const content = { ...rawContent };
|
|
2870
|
+
if (update.type === 'stage_transition') {
|
|
2871
|
+
const stageName = typeof content.stageName === 'string' ? content.stageName : 'unknown';
|
|
2872
|
+
const hasStageIndex = typeof content.stageIndex === 'number' && Number.isFinite(content.stageIndex);
|
|
2873
|
+
const hasTotalStages = typeof content.totalStages === 'number' && Number.isFinite(content.totalStages) && content.totalStages > 0;
|
|
2874
|
+
const skipped = content.skipped === true;
|
|
2875
|
+
const skipReason = typeof content.skipReason === 'string' ? content.skipReason.trim() : '';
|
|
2876
|
+
const stageSeq = hasStageIndex && hasTotalStages
|
|
2877
|
+
? ` (${content.stageIndex + 1}/${content.totalStages})`
|
|
2878
|
+
: '';
|
|
2879
|
+
if (typeof content.phase !== 'string' || !content.phase.trim()) {
|
|
2880
|
+
content.phase = 'stage_transition';
|
|
2881
|
+
}
|
|
2882
|
+
if (typeof content.message !== 'string' || !content.message.trim()) {
|
|
2883
|
+
const prefix = skipped ? '跳过阶段' : '进入阶段';
|
|
2884
|
+
const reason = skipped && skipReason ? `: ${skipReason}` : '';
|
|
2885
|
+
content.message = `${prefix} ${stageName}${stageSeq}${reason}`;
|
|
2886
|
+
}
|
|
2887
|
+
}
|
|
2888
|
+
if (update.type === 'tool_call') {
|
|
2889
|
+
const phase = typeof content.phase === 'string' ? content.phase : '';
|
|
2890
|
+
const phaseLower = phase.toLowerCase();
|
|
2891
|
+
const isDone = phaseLower.includes('completed') || phaseLower.includes('done') || phaseLower.includes('finished');
|
|
2892
|
+
if (typeof content.phase !== 'string' || !content.phase.trim()) {
|
|
2893
|
+
content.phase = isDone ? 'task_completed' : 'task_dispatched';
|
|
2894
|
+
}
|
|
2895
|
+
if (typeof content.message !== 'string' || !content.message.trim()) {
|
|
2896
|
+
const taskTitle = typeof content.taskTitle === 'string' ? content.taskTitle : '';
|
|
2897
|
+
const toolName = typeof content.toolName === 'string' ? content.toolName : '';
|
|
2898
|
+
const displayName = taskTitle || toolName || '工具任务';
|
|
2899
|
+
content.message = isDone ? `完成 ${displayName}` : `调用 ${displayName}`;
|
|
2900
|
+
}
|
|
2901
|
+
}
|
|
2902
|
+
return {
|
|
2903
|
+
...update,
|
|
2904
|
+
content,
|
|
2905
|
+
};
|
|
2906
|
+
}
|
|
2907
|
+
function mapToAgentDrivenEventType(update) {
|
|
2908
|
+
const phase = update.content?.phase;
|
|
2909
|
+
if (update.type === 'conversation_step') {
|
|
2910
|
+
return 'conversation_step';
|
|
2911
|
+
}
|
|
2912
|
+
if (update.type === 'stage_transition') {
|
|
2913
|
+
return 'progress';
|
|
2914
|
+
}
|
|
2915
|
+
if (update.type === 'tool_call') {
|
|
2916
|
+
const phaseText = typeof phase === 'string' ? phase.toLowerCase() : '';
|
|
2917
|
+
const isComplete = phaseText.includes('completed') || phaseText.includes('done') || phaseText.includes('finished');
|
|
2918
|
+
return isComplete ? 'agent_response' : 'agent_dialogue';
|
|
2919
|
+
}
|
|
2920
|
+
switch (phase) {
|
|
2921
|
+
case 'starting':
|
|
2922
|
+
case 'understanding':
|
|
2923
|
+
return 'progress';
|
|
2924
|
+
case 'hypotheses_generated':
|
|
2925
|
+
return 'hypothesis_generated';
|
|
2926
|
+
case 'round_start':
|
|
2927
|
+
return 'round_start';
|
|
2928
|
+
case 'tasks_dispatched':
|
|
2929
|
+
return 'agent_task_dispatched';
|
|
2930
|
+
case 'task_dispatched':
|
|
2931
|
+
return 'agent_dialogue';
|
|
2932
|
+
case 'task_completed':
|
|
2933
|
+
return 'agent_response';
|
|
2934
|
+
case 'synthesis_complete':
|
|
2935
|
+
return 'synthesis_complete';
|
|
2936
|
+
case 'strategy_decision':
|
|
2937
|
+
return 'strategy_decision';
|
|
2938
|
+
case 'concluding':
|
|
2939
|
+
return 'progress';
|
|
2940
|
+
default:
|
|
2941
|
+
return update.type;
|
|
2942
|
+
}
|
|
2943
|
+
}
|
|
2944
|
+
/**
|
|
2945
|
+
* Broadcast update to all SSE clients for an agent-driven session
|
|
2946
|
+
*/
|
|
2947
|
+
function broadcastToAgentDrivenClients(sessionId, update) {
|
|
2948
|
+
const session = assistantAppService.getSession(sessionId);
|
|
2949
|
+
if (!session)
|
|
2950
|
+
return;
|
|
2951
|
+
session.lastActivityAt = Date.now();
|
|
2952
|
+
// F3: Assign monotonic sequence ID for replay on reconnect
|
|
2953
|
+
const seqId = ++session.sseEventSeq;
|
|
2954
|
+
streamProjector.broadcastStreamingUpdate(sessionId, session.sseClients, update, {
|
|
2955
|
+
observability: buildStreamObservability(session),
|
|
2956
|
+
seqId,
|
|
2957
|
+
onBufferedEvent: (event) => {
|
|
2958
|
+
session.sseEventBuffer.push(event);
|
|
2959
|
+
persistBufferedAgentEvent(session, {
|
|
2960
|
+
cursor: event.seqId,
|
|
2961
|
+
eventType: event.eventType,
|
|
2962
|
+
eventData: event.eventData,
|
|
2963
|
+
createdAt: Date.now(),
|
|
2964
|
+
});
|
|
2965
|
+
// Trim ring buffer to cap
|
|
2966
|
+
if (session.sseEventBuffer.length > streamProjector_1.SSE_RING_BUFFER_SIZE) {
|
|
2967
|
+
session.sseEventBuffer.splice(0, session.sseEventBuffer.length - streamProjector_1.SSE_RING_BUFFER_SIZE);
|
|
2968
|
+
}
|
|
2969
|
+
},
|
|
2970
|
+
onDataEnvelopeValidationWarning: (payload) => {
|
|
2971
|
+
console.warn(`[AgentRoutes.broadcastToAgentDrivenClients] DataEnvelope validation warning (envelope ${payload.envelopeIndex}):`, {
|
|
2972
|
+
sessionId: payload.sessionId,
|
|
2973
|
+
errors: payload.errors.slice(0, 5),
|
|
2974
|
+
totalErrors: payload.errors.length,
|
|
2975
|
+
envelope: payload.envelope,
|
|
2976
|
+
});
|
|
2977
|
+
},
|
|
2978
|
+
onValidDataEnvelopes: (validEnvelopes) => {
|
|
2979
|
+
if (validEnvelopes.length > 0) {
|
|
2980
|
+
console.log(`[AgentRoutes.broadcastToAgentDrivenClients] Sending ${validEnvelopes.length} DataEnvelope(s) for session ${sessionId}`);
|
|
2981
|
+
// P2-4: Tag envelopes with current turn number for multi-turn attribution
|
|
2982
|
+
const turnNumber = session.runSequence || 1;
|
|
2983
|
+
for (const env of validEnvelopes) {
|
|
2984
|
+
if (env.meta)
|
|
2985
|
+
env.meta.turn = turnNumber;
|
|
2986
|
+
}
|
|
2987
|
+
session.dataEnvelopes.push(...validEnvelopes);
|
|
2988
|
+
trimSessionArray(session.dataEnvelopes, MAX_SESSION_DATA_ENVELOPES);
|
|
2989
|
+
}
|
|
2990
|
+
},
|
|
2991
|
+
});
|
|
2992
|
+
}
|
|
2993
|
+
// =============================================================================
|
|
2994
|
+
// Scene Reconstruction: Derive scenes + TrackEvent(s) from DataEnvelopes
|
|
2995
|
+
// =============================================================================
|
|
2996
|
+
const SCENE_DISPLAY_NAMES = {
|
|
2997
|
+
cold_start: '冷启动',
|
|
2998
|
+
warm_start: '温启动',
|
|
2999
|
+
hot_start: '热启动',
|
|
3000
|
+
scroll_start: '滑动启动',
|
|
3001
|
+
scroll: '滑动',
|
|
3002
|
+
inertial_scroll: '惯性滑动',
|
|
3003
|
+
navigation: '跳转',
|
|
3004
|
+
app_switch: '应用切换',
|
|
3005
|
+
home_screen: '桌面',
|
|
3006
|
+
app_foreground: '应用内',
|
|
3007
|
+
screen_on: '屏幕点亮',
|
|
3008
|
+
screen_off: '屏幕熄灭',
|
|
3009
|
+
screen_sleep: '屏幕休眠',
|
|
3010
|
+
screen_unlock: '解锁屏幕',
|
|
3011
|
+
notification: '通知操作',
|
|
3012
|
+
split_screen: '分屏操作',
|
|
3013
|
+
tap: '点击',
|
|
3014
|
+
long_press: '长按',
|
|
3015
|
+
idle: '空闲',
|
|
3016
|
+
jank_region: '性能问题区间',
|
|
3017
|
+
back_key: '返回键',
|
|
3018
|
+
home_key: 'Home键',
|
|
3019
|
+
recents_key: '最近任务键',
|
|
3020
|
+
anr: 'ANR',
|
|
3021
|
+
ime_show: '键盘弹出',
|
|
3022
|
+
ime_hide: '键盘收起',
|
|
3023
|
+
window_transition: '窗口转场',
|
|
3024
|
+
};
|
|
3025
|
+
const SCENE_COLOR_SCHEMES = {
|
|
3026
|
+
cold_start: 'launch',
|
|
3027
|
+
warm_start: 'launch',
|
|
3028
|
+
hot_start: 'launch',
|
|
3029
|
+
scroll_start: 'scroll',
|
|
3030
|
+
scroll: 'scroll',
|
|
3031
|
+
inertial_scroll: 'scroll',
|
|
3032
|
+
navigation: 'navigation',
|
|
3033
|
+
app_switch: 'system',
|
|
3034
|
+
home_screen: 'system',
|
|
3035
|
+
app_foreground: 'system',
|
|
3036
|
+
screen_on: 'system',
|
|
3037
|
+
screen_off: 'system',
|
|
3038
|
+
screen_sleep: 'system',
|
|
3039
|
+
screen_unlock: 'system',
|
|
3040
|
+
notification: 'system',
|
|
3041
|
+
split_screen: 'system',
|
|
3042
|
+
tap: 'tap',
|
|
3043
|
+
long_press: 'tap',
|
|
3044
|
+
idle: 'system',
|
|
3045
|
+
jank_region: 'jank', // Use jank color to highlight performance issues
|
|
3046
|
+
back_key: 'system',
|
|
3047
|
+
home_key: 'system',
|
|
3048
|
+
recents_key: 'system',
|
|
3049
|
+
anr: 'jank',
|
|
3050
|
+
ime_show: 'system',
|
|
3051
|
+
ime_hide: 'system',
|
|
3052
|
+
window_transition: 'navigation',
|
|
3053
|
+
};
|
|
3054
|
+
/** Lane step IDs from state_timeline skill */
|
|
3055
|
+
const STATE_LANE_STEP_IDS = new Set([
|
|
3056
|
+
'device_state_lane',
|
|
3057
|
+
'device_state_lane_fallback',
|
|
3058
|
+
'input_state_lane_frames',
|
|
3059
|
+
'input_state_lane_fallback',
|
|
3060
|
+
'app_state_lane',
|
|
3061
|
+
'app_state_lane_fallback',
|
|
3062
|
+
'system_state_lane',
|
|
3063
|
+
]);
|
|
3064
|
+
/** Map stepId → lane name */
|
|
3065
|
+
const STEP_TO_LANE = {
|
|
3066
|
+
device_state_lane: 'device',
|
|
3067
|
+
device_state_lane_fallback: 'device',
|
|
3068
|
+
input_state_lane_frames: 'input',
|
|
3069
|
+
input_state_lane_fallback: 'input',
|
|
3070
|
+
app_state_lane: 'app',
|
|
3071
|
+
app_state_lane_fallback: 'app',
|
|
3072
|
+
system_state_lane: 'system',
|
|
3073
|
+
};
|
|
3074
|
+
const VALID_LANE_STATUSES = new Set(['available', 'available_frame_based', 'available_heuristic', 'table_missing', 'no_data']);
|
|
3075
|
+
/** Statuses indicating data is expected (table exists, may have rows). */
|
|
3076
|
+
const DATA_PRESENT_STATUSES = new Set(['available', 'available_frame_based', 'available_heuristic']);
|
|
3077
|
+
/**
|
|
3078
|
+
* Single-pass extraction of state timeline lanes + lane availability from DataEnvelopes.
|
|
3079
|
+
* Combines what would otherwise be two separate iterations over the same envelope array.
|
|
3080
|
+
*/
|
|
3081
|
+
function extractStateTimelineData(envelopes) {
|
|
3082
|
+
const timeline = {};
|
|
3083
|
+
const availability = {};
|
|
3084
|
+
for (const env of envelopes) {
|
|
3085
|
+
if (!env || env.meta?.skillId !== 'state_timeline')
|
|
3086
|
+
continue;
|
|
3087
|
+
const stepId = env.meta.stepId || '';
|
|
3088
|
+
// Lane summary → extract availability
|
|
3089
|
+
if (stepId === 'lane_summary') {
|
|
3090
|
+
const rows = payloadToObjectRowsLocal(env.data);
|
|
3091
|
+
for (const row of rows) {
|
|
3092
|
+
const lane = String(row.lane || '');
|
|
3093
|
+
const status = String(row.source_status || 'available');
|
|
3094
|
+
if (lane) {
|
|
3095
|
+
availability[lane] = VALID_LANE_STATUSES.has(status) ? status : 'available';
|
|
3096
|
+
}
|
|
3097
|
+
}
|
|
3098
|
+
continue;
|
|
3099
|
+
}
|
|
3100
|
+
// Lane data steps → extract segments
|
|
3101
|
+
if (!STATE_LANE_STEP_IDS.has(stepId))
|
|
3102
|
+
continue;
|
|
3103
|
+
const laneName = STEP_TO_LANE[stepId] || stepId;
|
|
3104
|
+
// Real data over fallback: conditions are mutually exclusive, but be safe.
|
|
3105
|
+
const isFallbackStep = stepId.endsWith('_fallback');
|
|
3106
|
+
if (isFallbackStep && timeline[laneName]?.length > 0) {
|
|
3107
|
+
continue;
|
|
3108
|
+
}
|
|
3109
|
+
const rows = payloadToObjectRowsLocal(env.data);
|
|
3110
|
+
if (rows.length === 0)
|
|
3111
|
+
continue;
|
|
3112
|
+
const segments = [];
|
|
3113
|
+
for (const row of rows) {
|
|
3114
|
+
const startTs = String(row.start_ts || '');
|
|
3115
|
+
const endTs = String(row.end_ts || '');
|
|
3116
|
+
const durMs = Number(row.dur_ms || 0);
|
|
3117
|
+
if (!startTs || !endTs || durMs <= 0)
|
|
3118
|
+
continue;
|
|
3119
|
+
segments.push({
|
|
3120
|
+
lane: laneName,
|
|
3121
|
+
state: String(row.state || 'UNKNOWN'),
|
|
3122
|
+
stateLabel: String(row.state_label || ''),
|
|
3123
|
+
startTs,
|
|
3124
|
+
endTs,
|
|
3125
|
+
durMs,
|
|
3126
|
+
sourceStatus: String(row.source_status || 'available'),
|
|
3127
|
+
confidence: row.confidence ? String(row.confidence) : undefined,
|
|
3128
|
+
});
|
|
3129
|
+
}
|
|
3130
|
+
if (segments.length > 0) {
|
|
3131
|
+
timeline[laneName] = segments;
|
|
3132
|
+
}
|
|
3133
|
+
}
|
|
3134
|
+
// Reconcile: if a lane has segments, it's available; if lane_summary said
|
|
3135
|
+
// 'available' but we got no segments, it's really 'no_data'.
|
|
3136
|
+
for (const lane of [...new Set(Object.values(STEP_TO_LANE))]) {
|
|
3137
|
+
if (timeline[lane] && timeline[lane].length > 0) {
|
|
3138
|
+
// Has real data — check if it's all UNKNOWN (empty-source fallback)
|
|
3139
|
+
const allUnknown = timeline[lane].every(s => s.state === 'UNKNOWN' || s.state === 'IDLE');
|
|
3140
|
+
if (!availability[lane]) {
|
|
3141
|
+
availability[lane] = allUnknown ? 'no_data' : 'available';
|
|
3142
|
+
}
|
|
3143
|
+
}
|
|
3144
|
+
else if (DATA_PRESENT_STATUSES.has(availability[lane])) {
|
|
3145
|
+
// lane_summary said available, but no segments arrived → no_data
|
|
3146
|
+
availability[lane] = 'no_data';
|
|
3147
|
+
}
|
|
3148
|
+
}
|
|
3149
|
+
return { timeline, availability };
|
|
3150
|
+
}
|
|
3151
|
+
function updateSceneReconstructionArtifactsFromEnvelopes(session, envelopes) {
|
|
3152
|
+
if (!Array.isArray(envelopes) || envelopes.length === 0)
|
|
3153
|
+
return false;
|
|
3154
|
+
// Extract scene events (from scene_reconstruction skill)
|
|
3155
|
+
const extractedScenes = extractDetectedScenesFromEnvelopes(envelopes);
|
|
3156
|
+
// Extract state timeline + lane availability in a single pass
|
|
3157
|
+
const { timeline, availability } = extractStateTimelineData(envelopes);
|
|
3158
|
+
let hasTimelineUpdate = false;
|
|
3159
|
+
if (Object.keys(timeline).length > 0) {
|
|
3160
|
+
session.stateTimeline = Object.assign(session.stateTimeline || {}, timeline);
|
|
3161
|
+
hasTimelineUpdate = true;
|
|
3162
|
+
}
|
|
3163
|
+
if (Object.keys(availability).length > 0) {
|
|
3164
|
+
session.laneAvailability = Object.assign(session.laneAvailability || {}, availability);
|
|
3165
|
+
}
|
|
3166
|
+
if (extractedScenes.length === 0)
|
|
3167
|
+
return hasTimelineUpdate;
|
|
3168
|
+
const mergedScenes = mergeDetectedScenes(session.scenes || [], extractedScenes);
|
|
3169
|
+
const mergedTracks = buildTrackEventsFromScenes(mergedScenes);
|
|
3170
|
+
const prevFingerprint = fingerprintTrackEvents(session.trackEvents || []);
|
|
3171
|
+
const nextFingerprint = fingerprintTrackEvents(mergedTracks);
|
|
3172
|
+
session.scenes = mergedScenes;
|
|
3173
|
+
session.trackEvents = mergedTracks;
|
|
3174
|
+
return prevFingerprint !== nextFingerprint;
|
|
3175
|
+
}
|
|
3176
|
+
function extractDetectedScenesFromEnvelopes(envelopes) {
|
|
3177
|
+
const scenes = [];
|
|
3178
|
+
const jankRowsForFallback = [];
|
|
3179
|
+
for (const env of envelopes) {
|
|
3180
|
+
if (!env || env.meta?.skillId !== 'scene_reconstruction')
|
|
3181
|
+
continue;
|
|
3182
|
+
const stepId = env.meta.stepId || '';
|
|
3183
|
+
const rows = payloadToObjectRowsLocal(env.data);
|
|
3184
|
+
if (rows.length === 0)
|
|
3185
|
+
continue;
|
|
3186
|
+
// Step: screen_state_changes (screen on/off/sleep)
|
|
3187
|
+
if (stepId === 'screen_state_changes') {
|
|
3188
|
+
for (const row of rows) {
|
|
3189
|
+
const startTs = normalizeNs(row.ts);
|
|
3190
|
+
const durNs = toBigInt(row.dur);
|
|
3191
|
+
if (!startTs || durNs === null)
|
|
3192
|
+
continue;
|
|
3193
|
+
const eventText = String(row.event || '');
|
|
3194
|
+
const type = mapScreenStateEventToSceneType(eventText);
|
|
3195
|
+
if (!type)
|
|
3196
|
+
continue;
|
|
3197
|
+
const startNs = BigInt(startTs);
|
|
3198
|
+
const endNs = startNs + durNs;
|
|
3199
|
+
const durationMs = Number(durNs / 1000000n);
|
|
3200
|
+
scenes.push({
|
|
3201
|
+
type,
|
|
3202
|
+
startTs,
|
|
3203
|
+
endTs: endNs.toString(),
|
|
3204
|
+
durationMs,
|
|
3205
|
+
confidence: 0.9,
|
|
3206
|
+
metadata: {
|
|
3207
|
+
source: 'scene_reconstruction:screen_state_changes',
|
|
3208
|
+
event: eventText,
|
|
3209
|
+
},
|
|
3210
|
+
});
|
|
3211
|
+
}
|
|
3212
|
+
continue;
|
|
3213
|
+
}
|
|
3214
|
+
// Step: app_launches (startup events)
|
|
3215
|
+
if (stepId === 'app_launches') {
|
|
3216
|
+
for (const row of rows) {
|
|
3217
|
+
const startTs = normalizeNs(row.ts);
|
|
3218
|
+
const durNs = toBigInt(row.dur);
|
|
3219
|
+
if (!startTs || durNs === null)
|
|
3220
|
+
continue;
|
|
3221
|
+
const startupType = String(row.startup_type || '').toLowerCase();
|
|
3222
|
+
const type = startupType === 'warm' ? 'warm_start'
|
|
3223
|
+
: startupType === 'hot' ? 'hot_start'
|
|
3224
|
+
: 'cold_start';
|
|
3225
|
+
const startNs = BigInt(startTs);
|
|
3226
|
+
const endNs = startNs + durNs;
|
|
3227
|
+
const durationMs = Number(durNs / 1000000n);
|
|
3228
|
+
scenes.push({
|
|
3229
|
+
type,
|
|
3230
|
+
startTs: startTs,
|
|
3231
|
+
endTs: endNs.toString(),
|
|
3232
|
+
durationMs,
|
|
3233
|
+
confidence: 0.95,
|
|
3234
|
+
appPackage: extractRowAppPackage(row, ['package']),
|
|
3235
|
+
metadata: {
|
|
3236
|
+
source: 'scene_reconstruction:app_launches',
|
|
3237
|
+
startupType: startupType || undefined,
|
|
3238
|
+
event: row.event,
|
|
3239
|
+
},
|
|
3240
|
+
});
|
|
3241
|
+
}
|
|
3242
|
+
continue;
|
|
3243
|
+
}
|
|
3244
|
+
// Step: user_gestures (tap/scroll/long_press)
|
|
3245
|
+
if (stepId === 'user_gestures') {
|
|
3246
|
+
for (const row of rows) {
|
|
3247
|
+
const startTs = normalizeNs(row.ts);
|
|
3248
|
+
const durNs = toBigInt(row.dur);
|
|
3249
|
+
if (!startTs || durNs === null)
|
|
3250
|
+
continue;
|
|
3251
|
+
const gestureType = String(row.gesture_type || '').toLowerCase();
|
|
3252
|
+
const type = gestureType === 'scroll' ? 'scroll'
|
|
3253
|
+
: gestureType === 'long_press' ? 'long_press'
|
|
3254
|
+
: 'tap';
|
|
3255
|
+
const startNs = BigInt(startTs);
|
|
3256
|
+
const endNs = startNs + durNs;
|
|
3257
|
+
const durationMs = Number(durNs / 1000000n);
|
|
3258
|
+
scenes.push({
|
|
3259
|
+
type,
|
|
3260
|
+
startTs: startTs,
|
|
3261
|
+
endTs: endNs.toString(),
|
|
3262
|
+
durationMs,
|
|
3263
|
+
confidence: confidenceToScore(row.confidence),
|
|
3264
|
+
appPackage: extractRowAppPackage(row),
|
|
3265
|
+
metadata: {
|
|
3266
|
+
source: 'scene_reconstruction:user_gestures',
|
|
3267
|
+
moveCount: row.move_count,
|
|
3268
|
+
event: row.event,
|
|
3269
|
+
},
|
|
3270
|
+
});
|
|
3271
|
+
}
|
|
3272
|
+
continue;
|
|
3273
|
+
}
|
|
3274
|
+
// Step: scroll_initiation (precise scroll start marker)
|
|
3275
|
+
if (stepId === 'scroll_initiation') {
|
|
3276
|
+
for (const row of rows) {
|
|
3277
|
+
const startTs = normalizeNs(row.ts);
|
|
3278
|
+
const durNs = toBigInt(row.dur);
|
|
3279
|
+
if (!startTs || durNs === null)
|
|
3280
|
+
continue;
|
|
3281
|
+
const startNs = BigInt(startTs);
|
|
3282
|
+
const endNs = startNs + durNs;
|
|
3283
|
+
const durationMs = Number(durNs / 1000000n);
|
|
3284
|
+
scenes.push({
|
|
3285
|
+
type: 'scroll_start',
|
|
3286
|
+
startTs,
|
|
3287
|
+
endTs: endNs.toString(),
|
|
3288
|
+
durationMs,
|
|
3289
|
+
confidence: 0.9,
|
|
3290
|
+
appPackage: extractRowAppPackage(row, ['app']),
|
|
3291
|
+
metadata: {
|
|
3292
|
+
source: 'scene_reconstruction:scroll_initiation',
|
|
3293
|
+
gestureId: row.gesture_id,
|
|
3294
|
+
event: row.event,
|
|
3295
|
+
explanation: row.explanation,
|
|
3296
|
+
},
|
|
3297
|
+
});
|
|
3298
|
+
}
|
|
3299
|
+
continue;
|
|
3300
|
+
}
|
|
3301
|
+
// Step: inertial_scrolls (fling inertia region after finger up)
|
|
3302
|
+
if (stepId === 'inertial_scrolls') {
|
|
3303
|
+
for (const row of rows) {
|
|
3304
|
+
const startTs = normalizeNs(row.ts);
|
|
3305
|
+
const durNs = toBigInt(row.dur);
|
|
3306
|
+
if (!startTs || durNs === null)
|
|
3307
|
+
continue;
|
|
3308
|
+
const startNs = BigInt(startTs);
|
|
3309
|
+
const endNs = startNs + durNs;
|
|
3310
|
+
const durationMs = Number(durNs / 1000000n);
|
|
3311
|
+
const frameCount = Number(row.frame_count || 0);
|
|
3312
|
+
scenes.push({
|
|
3313
|
+
type: 'inertial_scroll',
|
|
3314
|
+
startTs: startTs,
|
|
3315
|
+
endTs: endNs.toString(),
|
|
3316
|
+
durationMs,
|
|
3317
|
+
confidence: frameCount >= 12 ? 0.9 : frameCount >= 8 ? 0.8 : 0.7,
|
|
3318
|
+
appPackage: extractRowAppPackage(row),
|
|
3319
|
+
metadata: {
|
|
3320
|
+
source: 'scene_reconstruction:inertial_scrolls',
|
|
3321
|
+
frameCount,
|
|
3322
|
+
jankFrames: Number(row.jank_frames || 0),
|
|
3323
|
+
event: row.event,
|
|
3324
|
+
},
|
|
3325
|
+
});
|
|
3326
|
+
}
|
|
3327
|
+
continue;
|
|
3328
|
+
}
|
|
3329
|
+
// Step: idle_periods (no obvious operation gap)
|
|
3330
|
+
if (stepId === 'idle_periods') {
|
|
3331
|
+
for (const row of rows) {
|
|
3332
|
+
const startTs = normalizeNs(row.ts);
|
|
3333
|
+
const durNs = toBigInt(row.dur);
|
|
3334
|
+
if (!startTs || durNs === null)
|
|
3335
|
+
continue;
|
|
3336
|
+
const startNs = BigInt(startTs);
|
|
3337
|
+
const endNs = startNs + durNs;
|
|
3338
|
+
const durationMs = Number(durNs / 1000000n);
|
|
3339
|
+
scenes.push({
|
|
3340
|
+
type: 'idle',
|
|
3341
|
+
startTs: startTs,
|
|
3342
|
+
endTs: endNs.toString(),
|
|
3343
|
+
durationMs,
|
|
3344
|
+
confidence: confidenceToScore(row.confidence),
|
|
3345
|
+
metadata: {
|
|
3346
|
+
source: 'scene_reconstruction:idle_periods',
|
|
3347
|
+
event: row.event,
|
|
3348
|
+
},
|
|
3349
|
+
});
|
|
3350
|
+
}
|
|
3351
|
+
continue;
|
|
3352
|
+
}
|
|
3353
|
+
// Step: top_app_changes (app switches)
|
|
3354
|
+
if (stepId === 'top_app_changes') {
|
|
3355
|
+
for (const row of rows) {
|
|
3356
|
+
const startTs = normalizeNs(row.ts);
|
|
3357
|
+
const durNs = toBigInt(row.dur);
|
|
3358
|
+
if (!startTs || durNs === null)
|
|
3359
|
+
continue;
|
|
3360
|
+
const startNs = BigInt(startTs);
|
|
3361
|
+
const endNs = startNs + durNs;
|
|
3362
|
+
const durationMs = Number(durNs / 1000000n);
|
|
3363
|
+
scenes.push({
|
|
3364
|
+
type: 'app_switch',
|
|
3365
|
+
startTs: startTs,
|
|
3366
|
+
endTs: endNs.toString(),
|
|
3367
|
+
durationMs,
|
|
3368
|
+
confidence: 0.9,
|
|
3369
|
+
appPackage: extractRowAppPackage(row),
|
|
3370
|
+
metadata: {
|
|
3371
|
+
source: 'scene_reconstruction:top_app_changes',
|
|
3372
|
+
event: row.event,
|
|
3373
|
+
},
|
|
3374
|
+
});
|
|
3375
|
+
}
|
|
3376
|
+
continue;
|
|
3377
|
+
}
|
|
3378
|
+
// Step: system_events (unlock/notification/split screen)
|
|
3379
|
+
if (stepId === 'system_events') {
|
|
3380
|
+
for (const row of rows) {
|
|
3381
|
+
const startTs = normalizeNs(row.ts);
|
|
3382
|
+
const durNs = toBigInt(row.dur);
|
|
3383
|
+
if (!startTs || durNs === null)
|
|
3384
|
+
continue;
|
|
3385
|
+
const eventText = String(row.event || '');
|
|
3386
|
+
const type = mapSystemEventToSceneType(eventText);
|
|
3387
|
+
if (!type)
|
|
3388
|
+
continue;
|
|
3389
|
+
// Guardrail: ignore very short unlock slices (usually render/mutex noise).
|
|
3390
|
+
if (type === 'screen_unlock' && durNs < 100000000n)
|
|
3391
|
+
continue;
|
|
3392
|
+
const startNs = BigInt(startTs);
|
|
3393
|
+
const endNs = startNs + durNs;
|
|
3394
|
+
const durationMs = Number(durNs / 1000000n);
|
|
3395
|
+
scenes.push({
|
|
3396
|
+
type,
|
|
3397
|
+
startTs: startTs,
|
|
3398
|
+
endTs: endNs.toString(),
|
|
3399
|
+
durationMs,
|
|
3400
|
+
confidence: 0.85,
|
|
3401
|
+
metadata: {
|
|
3402
|
+
source: 'scene_reconstruction:system_events',
|
|
3403
|
+
event: eventText,
|
|
3404
|
+
},
|
|
3405
|
+
});
|
|
3406
|
+
}
|
|
3407
|
+
continue;
|
|
3408
|
+
}
|
|
3409
|
+
// Step: clean_timeline (quality-gated unified timeline)
|
|
3410
|
+
if (stepId === 'clean_timeline') {
|
|
3411
|
+
const cleanTimelineTypeMapping = {
|
|
3412
|
+
'cold_start': 'cold_start',
|
|
3413
|
+
'warm_start': 'warm_start',
|
|
3414
|
+
'hot_start': 'hot_start',
|
|
3415
|
+
'scroll': 'scroll',
|
|
3416
|
+
'tap': 'tap',
|
|
3417
|
+
'long_press': 'long_press',
|
|
3418
|
+
'screen_on': 'screen_on',
|
|
3419
|
+
'screen_off': 'screen_off',
|
|
3420
|
+
'screen_sleep': 'screen_sleep',
|
|
3421
|
+
'screen_unlock': 'screen_unlock',
|
|
3422
|
+
'notification': 'notification',
|
|
3423
|
+
'split_screen': 'split_screen',
|
|
3424
|
+
'pip': 'navigation',
|
|
3425
|
+
'app_switch': 'app_switch',
|
|
3426
|
+
'home_screen': 'home_screen',
|
|
3427
|
+
'app_foreground': 'app_foreground',
|
|
3428
|
+
'back_key': 'back_key',
|
|
3429
|
+
'home_key': 'home_key',
|
|
3430
|
+
'recents_key': 'recents_key',
|
|
3431
|
+
'anr': 'anr',
|
|
3432
|
+
'ime_show': 'ime_show',
|
|
3433
|
+
'ime_hide': 'ime_hide',
|
|
3434
|
+
'window_transition': 'window_transition',
|
|
3435
|
+
'idle': 'idle',
|
|
3436
|
+
};
|
|
3437
|
+
for (const row of rows) {
|
|
3438
|
+
const eventType = String(row.event_type || '');
|
|
3439
|
+
const sceneType = cleanTimelineTypeMapping[eventType];
|
|
3440
|
+
if (!sceneType)
|
|
3441
|
+
continue;
|
|
3442
|
+
const startTs = normalizeNs(row.ts);
|
|
3443
|
+
const durNs = toBigInt(row.dur);
|
|
3444
|
+
if (!startTs || durNs === null)
|
|
3445
|
+
continue;
|
|
3446
|
+
const startNs = BigInt(startTs);
|
|
3447
|
+
const endNs = startNs + durNs;
|
|
3448
|
+
const durationMs = Number(durNs / 1000000n);
|
|
3449
|
+
scenes.push({
|
|
3450
|
+
type: sceneType,
|
|
3451
|
+
startTs,
|
|
3452
|
+
endTs: endNs.toString(),
|
|
3453
|
+
durationMs,
|
|
3454
|
+
confidence: 0.9,
|
|
3455
|
+
appPackage: extractRowAppPackage(row),
|
|
3456
|
+
metadata: {
|
|
3457
|
+
source: 'scene_reconstruction:clean_timeline',
|
|
3458
|
+
eventId: row.event_id,
|
|
3459
|
+
timeOffset: row.time_offset,
|
|
3460
|
+
rating: row.rating,
|
|
3461
|
+
event: row.event,
|
|
3462
|
+
},
|
|
3463
|
+
});
|
|
3464
|
+
}
|
|
3465
|
+
continue;
|
|
3466
|
+
}
|
|
3467
|
+
// Step: jank_events (performance issue regions) - FALLBACK
|
|
3468
|
+
// Collected first; only used if no gesture-like scenes are found.
|
|
3469
|
+
if (stepId === 'jank_events') {
|
|
3470
|
+
jankRowsForFallback.push(...rows);
|
|
3471
|
+
continue;
|
|
3472
|
+
}
|
|
3473
|
+
}
|
|
3474
|
+
const hasGestureLikeScene = scenes.some((scene) => (scene.type === 'tap' ||
|
|
3475
|
+
scene.type === 'scroll' ||
|
|
3476
|
+
scene.type === 'long_press' ||
|
|
3477
|
+
scene.type === 'inertial_scroll'));
|
|
3478
|
+
if (!hasGestureLikeScene && jankRowsForFallback.length > 0) {
|
|
3479
|
+
const jankIntervals = aggregateJankFramesToIntervals(jankRowsForFallback);
|
|
3480
|
+
for (const interval of jankIntervals) {
|
|
3481
|
+
if (interval.jankCount < 3)
|
|
3482
|
+
continue;
|
|
3483
|
+
scenes.push({
|
|
3484
|
+
type: 'jank_region',
|
|
3485
|
+
startTs: interval.startTs,
|
|
3486
|
+
endTs: interval.endTs,
|
|
3487
|
+
durationMs: interval.durationMs,
|
|
3488
|
+
confidence: 0.8,
|
|
3489
|
+
metadata: {
|
|
3490
|
+
source: 'scene_reconstruction:jank_events',
|
|
3491
|
+
jankCount: interval.jankCount,
|
|
3492
|
+
severity: interval.severity,
|
|
3493
|
+
},
|
|
3494
|
+
});
|
|
3495
|
+
}
|
|
3496
|
+
}
|
|
3497
|
+
scenes.sort((a, b) => (BigInt(a.startTs) > BigInt(b.startTs) ? 1 : -1));
|
|
3498
|
+
return scenes;
|
|
3499
|
+
}
|
|
3500
|
+
/**
|
|
3501
|
+
* Aggregates consecutive jank frames into intervals.
|
|
3502
|
+
* Adjacent jank frames within 500ms gap are merged into one interval.
|
|
3503
|
+
* This creates meaningful analysis targets from scattered jank events.
|
|
3504
|
+
*/
|
|
3505
|
+
function aggregateJankFramesToIntervals(rows) {
|
|
3506
|
+
if (!rows.length)
|
|
3507
|
+
return [];
|
|
3508
|
+
const MERGE_GAP_NS = 500000000n; // 500ms
|
|
3509
|
+
const intervals = [];
|
|
3510
|
+
// Sort by timestamp first
|
|
3511
|
+
const sortedRows = [...rows].sort((a, b) => {
|
|
3512
|
+
const aTs = toBigInt(a.ts);
|
|
3513
|
+
const bTs = toBigInt(b.ts);
|
|
3514
|
+
if (aTs === null || bTs === null)
|
|
3515
|
+
return 0;
|
|
3516
|
+
return aTs < bTs ? -1 : aTs > bTs ? 1 : 0;
|
|
3517
|
+
});
|
|
3518
|
+
let currentStart = toBigInt(sortedRows[0].ts);
|
|
3519
|
+
let currentEnd = currentStart !== null
|
|
3520
|
+
? currentStart + (toBigInt(sortedRows[0].dur) || 0n)
|
|
3521
|
+
: null;
|
|
3522
|
+
let jankCount = 1;
|
|
3523
|
+
let severities = [String(sortedRows[0].jank_severity_type || '')];
|
|
3524
|
+
if (currentStart === null || currentEnd === null) {
|
|
3525
|
+
return []; // Invalid first row
|
|
3526
|
+
}
|
|
3527
|
+
for (let i = 1; i < sortedRows.length; i++) {
|
|
3528
|
+
const rowTs = toBigInt(sortedRows[i].ts);
|
|
3529
|
+
const rowDur = toBigInt(sortedRows[i].dur) || 0n;
|
|
3530
|
+
if (rowTs === null)
|
|
3531
|
+
continue;
|
|
3532
|
+
if (rowTs - currentEnd < MERGE_GAP_NS) {
|
|
3533
|
+
// Merge into current interval
|
|
3534
|
+
const rowEnd = rowTs + rowDur;
|
|
3535
|
+
if (rowEnd > currentEnd) {
|
|
3536
|
+
currentEnd = rowEnd;
|
|
3537
|
+
}
|
|
3538
|
+
jankCount++;
|
|
3539
|
+
severities.push(String(sortedRows[i].jank_severity_type || ''));
|
|
3540
|
+
}
|
|
3541
|
+
else {
|
|
3542
|
+
// Save current interval and start a new one
|
|
3543
|
+
intervals.push({
|
|
3544
|
+
startTs: currentStart.toString(),
|
|
3545
|
+
endTs: currentEnd.toString(),
|
|
3546
|
+
durationMs: Number((currentEnd - currentStart) / 1000000n),
|
|
3547
|
+
jankCount,
|
|
3548
|
+
severity: severities.includes('Full') ? 'severe' : 'mild',
|
|
3549
|
+
});
|
|
3550
|
+
currentStart = rowTs;
|
|
3551
|
+
currentEnd = rowTs + rowDur;
|
|
3552
|
+
jankCount = 1;
|
|
3553
|
+
severities = [String(sortedRows[i].jank_severity_type || '')];
|
|
3554
|
+
}
|
|
3555
|
+
}
|
|
3556
|
+
// Save the last interval
|
|
3557
|
+
intervals.push({
|
|
3558
|
+
startTs: currentStart.toString(),
|
|
3559
|
+
endTs: currentEnd.toString(),
|
|
3560
|
+
durationMs: Number((currentEnd - currentStart) / 1000000n),
|
|
3561
|
+
jankCount,
|
|
3562
|
+
severity: severities.includes('Full') ? 'severe' : 'mild',
|
|
3563
|
+
});
|
|
3564
|
+
return intervals;
|
|
3565
|
+
}
|
|
3566
|
+
function mergeDetectedScenes(existing, incoming) {
|
|
3567
|
+
const merged = new Map();
|
|
3568
|
+
for (const s of existing)
|
|
3569
|
+
merged.set(sceneKey(s), s);
|
|
3570
|
+
for (const s of incoming)
|
|
3571
|
+
merged.set(sceneKey(s), s);
|
|
3572
|
+
const out = Array.from(merged.values());
|
|
3573
|
+
out.sort((a, b) => (BigInt(a.startTs) > BigInt(b.startTs) ? 1 : -1));
|
|
3574
|
+
return out;
|
|
3575
|
+
}
|
|
3576
|
+
function sceneKey(scene) {
|
|
3577
|
+
return `${scene.type}:${scene.startTs}:${scene.endTs}:${scene.appPackage || ''}`;
|
|
3578
|
+
}
|
|
3579
|
+
function buildTrackEventsFromScenes(scenes) {
|
|
3580
|
+
return scenes.map((scene) => {
|
|
3581
|
+
const displayName = SCENE_DISPLAY_NAMES[scene.type] || scene.type;
|
|
3582
|
+
const colorScheme = SCENE_COLOR_SCHEMES[scene.type] || 'system';
|
|
3583
|
+
const appName = scene.appPackage
|
|
3584
|
+
? scene.appPackage.replace('com.', '').replace('android.', '')
|
|
3585
|
+
: '';
|
|
3586
|
+
let name = displayName;
|
|
3587
|
+
if (appName)
|
|
3588
|
+
name += ` [${appName}]`;
|
|
3589
|
+
if (Number.isFinite(scene.durationMs) && scene.durationMs > 0)
|
|
3590
|
+
name += ` ${scene.durationMs}ms`;
|
|
3591
|
+
let dur = '0';
|
|
3592
|
+
try {
|
|
3593
|
+
dur = (BigInt(scene.endTs) - BigInt(scene.startTs)).toString();
|
|
3594
|
+
}
|
|
3595
|
+
catch { }
|
|
3596
|
+
return {
|
|
3597
|
+
ts: scene.startTs,
|
|
3598
|
+
dur,
|
|
3599
|
+
name,
|
|
3600
|
+
category: 'scene',
|
|
3601
|
+
colorScheme,
|
|
3602
|
+
details: {
|
|
3603
|
+
sceneType: scene.type,
|
|
3604
|
+
appPackage: scene.appPackage,
|
|
3605
|
+
durationMs: scene.durationMs,
|
|
3606
|
+
confidence: scene.confidence,
|
|
3607
|
+
...scene.metadata,
|
|
3608
|
+
},
|
|
3609
|
+
};
|
|
3610
|
+
});
|
|
3611
|
+
}
|
|
3612
|
+
function fingerprintTrackEvents(events) {
|
|
3613
|
+
return events.map(e => `${e.ts}:${e.dur}:${e.name}:${e.colorScheme}`).join('|');
|
|
3614
|
+
}
|
|
3615
|
+
function payloadToObjectRowsLocal(payload) {
|
|
3616
|
+
if (!payload || typeof payload !== 'object')
|
|
3617
|
+
return [];
|
|
3618
|
+
const cols = payload.columns;
|
|
3619
|
+
const rows = payload.rows;
|
|
3620
|
+
if (!Array.isArray(cols) || !Array.isArray(rows))
|
|
3621
|
+
return [];
|
|
3622
|
+
const out = [];
|
|
3623
|
+
for (const row of rows) {
|
|
3624
|
+
if (!Array.isArray(row))
|
|
3625
|
+
continue;
|
|
3626
|
+
const obj = {};
|
|
3627
|
+
for (let i = 0; i < cols.length; i++) {
|
|
3628
|
+
obj[String(cols[i])] = row[i];
|
|
3629
|
+
}
|
|
3630
|
+
out.push(obj);
|
|
3631
|
+
}
|
|
3632
|
+
return out;
|
|
3633
|
+
}
|
|
3634
|
+
function normalizeNs(value) {
|
|
3635
|
+
const n = toBigInt(value);
|
|
3636
|
+
return n === null ? null : n.toString();
|
|
3637
|
+
}
|
|
3638
|
+
function toBigInt(value) {
|
|
3639
|
+
if (typeof value === 'bigint')
|
|
3640
|
+
return value;
|
|
3641
|
+
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
3642
|
+
try {
|
|
3643
|
+
return BigInt(Math.trunc(value));
|
|
3644
|
+
}
|
|
3645
|
+
catch {
|
|
3646
|
+
return null;
|
|
3647
|
+
}
|
|
3648
|
+
}
|
|
3649
|
+
if (typeof value === 'string') {
|
|
3650
|
+
const s = value.trim();
|
|
3651
|
+
if (!s)
|
|
3652
|
+
return null;
|
|
3653
|
+
if (!/^-?\d+$/.test(s))
|
|
3654
|
+
return null;
|
|
3655
|
+
try {
|
|
3656
|
+
return BigInt(s);
|
|
3657
|
+
}
|
|
3658
|
+
catch {
|
|
3659
|
+
return null;
|
|
3660
|
+
}
|
|
3661
|
+
}
|
|
3662
|
+
return null;
|
|
3663
|
+
}
|
|
3664
|
+
function confidenceToScore(value) {
|
|
3665
|
+
if (typeof value === 'number' && Number.isFinite(value))
|
|
3666
|
+
return Math.max(0, Math.min(1, value));
|
|
3667
|
+
const s = String(value || '').trim();
|
|
3668
|
+
if (!s)
|
|
3669
|
+
return 0.85;
|
|
3670
|
+
if (s === '高')
|
|
3671
|
+
return 0.9;
|
|
3672
|
+
if (s === '中')
|
|
3673
|
+
return 0.7;
|
|
3674
|
+
if (s === '低')
|
|
3675
|
+
return 0.5;
|
|
3676
|
+
return 0.8;
|
|
3677
|
+
}
|
|
3678
|
+
function extractRowAppPackage(row, extraFields = []) {
|
|
3679
|
+
const candidateFields = ['app_package', 'appPackage', ...extraFields];
|
|
3680
|
+
for (const field of candidateFields) {
|
|
3681
|
+
const value = row[field];
|
|
3682
|
+
if (typeof value === 'string' && value.trim()) {
|
|
3683
|
+
return value.trim();
|
|
3684
|
+
}
|
|
3685
|
+
}
|
|
3686
|
+
const eventApp = extractBracketContent(String(row.event || ''));
|
|
3687
|
+
if (eventApp)
|
|
3688
|
+
return eventApp;
|
|
3689
|
+
return undefined;
|
|
3690
|
+
}
|
|
3691
|
+
function extractBracketContent(text) {
|
|
3692
|
+
const m = text.match(/\[([^\]]+)\]\s*$/);
|
|
3693
|
+
return m ? m[1] : null;
|
|
3694
|
+
}
|
|
3695
|
+
function mapSystemEventToSceneType(eventText) {
|
|
3696
|
+
const e = eventText.trim();
|
|
3697
|
+
if (!e)
|
|
3698
|
+
return null;
|
|
3699
|
+
// Keep unlock mapping strict; broad substring matching causes false positives.
|
|
3700
|
+
if (e === '解锁屏幕' || e.includes('锁屏解锁'))
|
|
3701
|
+
return 'screen_unlock';
|
|
3702
|
+
if (e.includes('画中画'))
|
|
3703
|
+
return 'navigation';
|
|
3704
|
+
if (e.includes('通知栏') || e.includes('通知'))
|
|
3705
|
+
return 'notification';
|
|
3706
|
+
if (e.includes('分屏'))
|
|
3707
|
+
return 'split_screen';
|
|
3708
|
+
if (e.includes('Activity'))
|
|
3709
|
+
return 'navigation';
|
|
3710
|
+
return null;
|
|
3711
|
+
}
|
|
3712
|
+
function mapScreenStateEventToSceneType(eventText) {
|
|
3713
|
+
const e = eventText.trim();
|
|
3714
|
+
if (!e)
|
|
3715
|
+
return null;
|
|
3716
|
+
if (e.includes('点亮'))
|
|
3717
|
+
return 'screen_on';
|
|
3718
|
+
if (e.includes('熄灭'))
|
|
3719
|
+
return 'screen_off';
|
|
3720
|
+
if (e.includes('休眠'))
|
|
3721
|
+
return 'screen_sleep';
|
|
3722
|
+
return null;
|
|
3723
|
+
}
|
|
3724
|
+
function buildClientFindings(findings, scenes) {
|
|
3725
|
+
const base = (findings || []).map((f) => ({
|
|
3726
|
+
id: String(f?.id || `finding_${Date.now()}`),
|
|
3727
|
+
category: f?.category,
|
|
3728
|
+
severity: f?.severity,
|
|
3729
|
+
title: f?.title,
|
|
3730
|
+
description: f?.description,
|
|
3731
|
+
timestampsNs: f?.timestampsNs,
|
|
3732
|
+
evidence: f?.evidence,
|
|
3733
|
+
details: f?.details,
|
|
3734
|
+
recommendations: f?.recommendations,
|
|
3735
|
+
confidence: f?.confidence,
|
|
3736
|
+
}));
|
|
3737
|
+
const hasIssueLikeFinding = base.some((f) => {
|
|
3738
|
+
const severity = String(f.severity || '').toLowerCase();
|
|
3739
|
+
if (severity === 'critical' || severity === 'high' || severity === 'warning')
|
|
3740
|
+
return true;
|
|
3741
|
+
return hasIssueSignalText(`${f.title || ''} ${f.description || ''}`);
|
|
3742
|
+
});
|
|
3743
|
+
const filtered = hasIssueLikeFinding
|
|
3744
|
+
? base.filter((f) => !isNoIssueText(`${f.title || ''} ${f.description || ''}`))
|
|
3745
|
+
: base;
|
|
3746
|
+
const derived = deriveSceneIssueFindings(scenes);
|
|
3747
|
+
const merged = [...filtered, ...derived];
|
|
3748
|
+
const dedup = new Map();
|
|
3749
|
+
for (const f of merged) {
|
|
3750
|
+
const key = `${String(f.title || '').trim()}::${String(f.description || '').trim()}`;
|
|
3751
|
+
if (!key || key === '::') {
|
|
3752
|
+
dedup.set(f.id, f);
|
|
3753
|
+
continue;
|
|
3754
|
+
}
|
|
3755
|
+
if (!dedup.has(key))
|
|
3756
|
+
dedup.set(key, f);
|
|
3757
|
+
}
|
|
3758
|
+
return Array.from(dedup.values());
|
|
3759
|
+
}
|
|
3760
|
+
function buildSessionResultContract(session, findings) {
|
|
3761
|
+
return (0, assistantResultContract_1.buildAssistantResultContract)({
|
|
3762
|
+
dataEnvelopes: session.dataEnvelopes,
|
|
3763
|
+
findings,
|
|
3764
|
+
});
|
|
3765
|
+
}
|
|
3766
|
+
function deriveSceneIssueFindings(scenes) {
|
|
3767
|
+
if (!Array.isArray(scenes) || scenes.length === 0)
|
|
3768
|
+
return [];
|
|
3769
|
+
const scrollScenes = scenes.filter((s) => s.type === 'scroll');
|
|
3770
|
+
const inertialCandidates = scenes
|
|
3771
|
+
.filter((s) => s.type === 'inertial_scroll')
|
|
3772
|
+
.map((s) => ({
|
|
3773
|
+
scene: s,
|
|
3774
|
+
jankFrames: Number(s.metadata?.jankFrames || 0),
|
|
3775
|
+
}))
|
|
3776
|
+
.filter((item) => item.jankFrames > 0)
|
|
3777
|
+
.sort((a, b) => b.jankFrames - a.jankFrames)
|
|
3778
|
+
.slice(0, 3);
|
|
3779
|
+
const derived = [];
|
|
3780
|
+
for (const item of inertialCandidates) {
|
|
3781
|
+
const s = item.scene;
|
|
3782
|
+
const severity = item.jankFrames >= 100 ? 'critical'
|
|
3783
|
+
: item.jankFrames >= 40 ? 'warning'
|
|
3784
|
+
: 'info';
|
|
3785
|
+
const app = s.appPackage || 'unknown';
|
|
3786
|
+
const inertialStartNs = toBigInt(s.startTs);
|
|
3787
|
+
const inertialEndNs = toBigInt(s.endTs);
|
|
3788
|
+
let totalScrollDurationMs = s.durationMs;
|
|
3789
|
+
if (inertialStartNs !== null && inertialEndNs !== null) {
|
|
3790
|
+
let parentScroll = null;
|
|
3791
|
+
let parentStartNs = null;
|
|
3792
|
+
for (const scroll of scrollScenes) {
|
|
3793
|
+
const startNs = toBigInt(scroll.startTs);
|
|
3794
|
+
const endNs = toBigInt(scroll.endTs);
|
|
3795
|
+
if (startNs === null || endNs === null)
|
|
3796
|
+
continue;
|
|
3797
|
+
if (startNs <= inertialStartNs && endNs >= inertialStartNs) {
|
|
3798
|
+
if (!parentScroll || (parentStartNs !== null && startNs > parentStartNs)) {
|
|
3799
|
+
parentScroll = scroll;
|
|
3800
|
+
parentStartNs = startNs;
|
|
3801
|
+
}
|
|
3802
|
+
}
|
|
3803
|
+
}
|
|
3804
|
+
if (parentStartNs !== null && inertialEndNs > parentStartNs) {
|
|
3805
|
+
totalScrollDurationMs = Number((inertialEndNs - parentStartNs) / 1000000n);
|
|
3806
|
+
}
|
|
3807
|
+
}
|
|
3808
|
+
derived.push({
|
|
3809
|
+
id: `scene_inertial_${s.startTs}`,
|
|
3810
|
+
category: 'scroll',
|
|
3811
|
+
severity,
|
|
3812
|
+
title: `惯性滑动卡顿:${item.jankFrames} 帧异常`,
|
|
3813
|
+
description: `惯性 ${s.durationMs}ms,总滑动约 ${totalScrollDurationMs}ms,应用 ${app},建议重点排查滑动后渲染路径`,
|
|
3814
|
+
details: {
|
|
3815
|
+
sceneType: s.type,
|
|
3816
|
+
startTs: s.startTs,
|
|
3817
|
+
endTs: s.endTs,
|
|
3818
|
+
durationMs: s.durationMs,
|
|
3819
|
+
totalScrollDurationMs,
|
|
3820
|
+
jankFrames: item.jankFrames,
|
|
3821
|
+
source: 'scene_reconstruction:derived',
|
|
3822
|
+
},
|
|
3823
|
+
confidence: 0.85,
|
|
3824
|
+
});
|
|
3825
|
+
}
|
|
3826
|
+
return derived;
|
|
3827
|
+
}
|
|
3828
|
+
function isNoIssueText(text) {
|
|
3829
|
+
const t = String(text || '').toLowerCase();
|
|
3830
|
+
return (t.includes('未发现明显性能问题') ||
|
|
3831
|
+
t.includes('整体流畅度良好') ||
|
|
3832
|
+
t.includes('分析未发现明显问题'));
|
|
3833
|
+
}
|
|
3834
|
+
function hasIssueSignalText(text) {
|
|
3835
|
+
const t = String(text || '').toLowerCase();
|
|
3836
|
+
return (t.includes('卡顿') ||
|
|
3837
|
+
t.includes('掉帧') ||
|
|
3838
|
+
t.includes('缓冲区积压') ||
|
|
3839
|
+
t.includes('jank') ||
|
|
3840
|
+
t.includes('stutter') ||
|
|
3841
|
+
t.includes('deadline missed') ||
|
|
3842
|
+
t.includes('renderthread') ||
|
|
3843
|
+
t.includes('主线程阻塞'));
|
|
3844
|
+
}
|
|
3845
|
+
function isSceneReplayOnlyQuery(query) {
|
|
3846
|
+
const q = String(query || '').toLowerCase();
|
|
3847
|
+
const isSceneQuery = q.includes('场景还原') || q.includes('scene reconstruction');
|
|
3848
|
+
if (!isSceneQuery)
|
|
3849
|
+
return false;
|
|
3850
|
+
// Scene reconstruction in this product is replay-first; quick/replay variants are explicit.
|
|
3851
|
+
return q.includes('仅检测') || q.includes('只检测') || q.includes('quick') || q.includes('replay');
|
|
3852
|
+
}
|
|
3853
|
+
const SCENE_RESPONSE_THRESHOLDS = {
|
|
3854
|
+
cold_start: { good: 500, acceptable: 1000 },
|
|
3855
|
+
warm_start: { good: 300, acceptable: 600 },
|
|
3856
|
+
hot_start: { good: 100, acceptable: 200 },
|
|
3857
|
+
inertial_scroll: { good: 500, acceptable: 1000 },
|
|
3858
|
+
tap: { good: 100, acceptable: 200 },
|
|
3859
|
+
navigation: { good: 300, acceptable: 500 },
|
|
3860
|
+
app_switch: { good: 500, acceptable: 1000 },
|
|
3861
|
+
};
|
|
3862
|
+
function classifySceneResponse(scene) {
|
|
3863
|
+
const metadata = scene.metadata;
|
|
3864
|
+
if ((scene.type === 'scroll' || scene.type === 'inertial_scroll') && Number.isFinite(Number(metadata?.averageFps))) {
|
|
3865
|
+
const fps = Number(metadata?.averageFps);
|
|
3866
|
+
if (fps >= 55)
|
|
3867
|
+
return '流畅';
|
|
3868
|
+
if (fps >= 45)
|
|
3869
|
+
return '轻微波动';
|
|
3870
|
+
return '明显波动';
|
|
3871
|
+
}
|
|
3872
|
+
const thresholds = SCENE_RESPONSE_THRESHOLDS[scene.type];
|
|
3873
|
+
if (!thresholds)
|
|
3874
|
+
return '未知';
|
|
3875
|
+
if (scene.durationMs <= thresholds.good)
|
|
3876
|
+
return '流畅';
|
|
3877
|
+
if (scene.durationMs <= thresholds.acceptable)
|
|
3878
|
+
return '轻微波动';
|
|
3879
|
+
return '明显波动';
|
|
3880
|
+
}
|
|
3881
|
+
function formatSceneDurationMs(durationMs) {
|
|
3882
|
+
if (!Number.isFinite(durationMs) || durationMs <= 0)
|
|
3883
|
+
return '-';
|
|
3884
|
+
if (durationMs >= 1000)
|
|
3885
|
+
return `${(durationMs / 1000).toFixed(2)}s`;
|
|
3886
|
+
return `${Math.round(durationMs)}ms`;
|
|
3887
|
+
}
|
|
3888
|
+
function formatSceneStartTsForNarrative(tsNs) {
|
|
3889
|
+
const ns = toBigInt(tsNs);
|
|
3890
|
+
if (ns === null)
|
|
3891
|
+
return tsNs;
|
|
3892
|
+
const totalMs = Number(ns / 1000000n);
|
|
3893
|
+
const seconds = totalMs / 1000;
|
|
3894
|
+
if (!Number.isFinite(seconds))
|
|
3895
|
+
return tsNs;
|
|
3896
|
+
if (seconds < 60)
|
|
3897
|
+
return `${seconds.toFixed(3)}s`;
|
|
3898
|
+
const minutes = Math.floor(seconds / 60);
|
|
3899
|
+
const remainingSeconds = seconds % 60;
|
|
3900
|
+
return `${minutes}m ${remainingSeconds.toFixed(3)}s`;
|
|
3901
|
+
}
|
|
3902
|
+
function buildSceneReplayNarrative(scenes) {
|
|
3903
|
+
if (!Array.isArray(scenes) || scenes.length === 0) {
|
|
3904
|
+
return '未检测到可回放的用户操作场景。';
|
|
3905
|
+
}
|
|
3906
|
+
const sorted = [...scenes].sort((a, b) => {
|
|
3907
|
+
const aTs = toBigInt(a.startTs);
|
|
3908
|
+
const bTs = toBigInt(b.startTs);
|
|
3909
|
+
if (aTs === null || bTs === null)
|
|
3910
|
+
return 0;
|
|
3911
|
+
if (aTs > bTs)
|
|
3912
|
+
return 1;
|
|
3913
|
+
if (aTs < bTs)
|
|
3914
|
+
return -1;
|
|
3915
|
+
return 0;
|
|
3916
|
+
});
|
|
3917
|
+
const maxItems = 12;
|
|
3918
|
+
const sequenceLines = sorted.slice(0, maxItems).map((scene, idx) => {
|
|
3919
|
+
const displayName = SCENE_DISPLAY_NAMES[scene.type] || scene.type;
|
|
3920
|
+
const startTs = formatSceneStartTsForNarrative(scene.startTs);
|
|
3921
|
+
const duration = formatSceneDurationMs(scene.durationMs);
|
|
3922
|
+
const response = classifySceneResponse(scene);
|
|
3923
|
+
const appText = scene.appPackage ? `,应用 ${scene.appPackage}` : '';
|
|
3924
|
+
return `${idx + 1}. [${startTs}] ${displayName},持续 ${duration}${appText},响应状态:${response}`;
|
|
3925
|
+
});
|
|
3926
|
+
const extraLine = sorted.length > maxItems
|
|
3927
|
+
? `- 其余 ${sorted.length - maxItems} 个场景可在表格中继续查看。`
|
|
3928
|
+
: '';
|
|
3929
|
+
return [
|
|
3930
|
+
`共还原 ${sorted.length} 个操作场景。以下为操作与设备响应事实回放(不含根因推断):`,
|
|
3931
|
+
'',
|
|
3932
|
+
...sequenceLines.map((line) => `- ${line}`),
|
|
3933
|
+
extraLine,
|
|
3934
|
+
].filter(Boolean).join('\n');
|
|
3935
|
+
}
|
|
3936
|
+
// Delegates to the shared normalizer so CLI's buildReportHtml gets identical
|
|
3937
|
+
// conclusion text for the same run. The HTTP-specific pieces (scene replay,
|
|
3938
|
+
// sceneIdHint) stay inline in sendAgentDrivenResult.
|
|
3939
|
+
function normalizeNarrativeForClient(narrative) {
|
|
3940
|
+
return (0, agentResultNormalizer_1.normalizeNarrativeForClient)(narrative);
|
|
3941
|
+
}
|
|
3942
|
+
function conclusionHasEvidenceIndex(conclusion) {
|
|
3943
|
+
const text = conclusion || '';
|
|
3944
|
+
return /(^|\n)\s*##\s*证据表索引\b/.test(text);
|
|
3945
|
+
}
|
|
3946
|
+
function markdownCell(value, maxLen = 80) {
|
|
3947
|
+
return String(value ?? '')
|
|
3948
|
+
.replace(/\s+/g, ' ')
|
|
3949
|
+
.replace(/\|/g, '/')
|
|
3950
|
+
.trim()
|
|
3951
|
+
.slice(0, maxLen) || '-';
|
|
3952
|
+
}
|
|
3953
|
+
function envelopeRowCount(env) {
|
|
3954
|
+
const rows = env?.data?.rows;
|
|
3955
|
+
if (Array.isArray(rows))
|
|
3956
|
+
return String(rows.length);
|
|
3957
|
+
const summaryContent = env?.data?.summary?.content;
|
|
3958
|
+
if (typeof summaryContent === 'string') {
|
|
3959
|
+
const matched = summaryContent.match(/Total rows:\s*(\d+)/i);
|
|
3960
|
+
if (matched)
|
|
3961
|
+
return matched[1];
|
|
3962
|
+
}
|
|
3963
|
+
return '-';
|
|
3964
|
+
}
|
|
3965
|
+
function buildConclusionEvidenceIndex(envelopes, maxItems = 8) {
|
|
3966
|
+
if (!Array.isArray(envelopes) || envelopes.length === 0)
|
|
3967
|
+
return '';
|
|
3968
|
+
const seen = new Set();
|
|
3969
|
+
const candidates = [];
|
|
3970
|
+
for (const env of envelopes) {
|
|
3971
|
+
const meta = env?.meta || {};
|
|
3972
|
+
const display = env?.display || {};
|
|
3973
|
+
if (display.level === 'hidden')
|
|
3974
|
+
continue;
|
|
3975
|
+
const title = markdownCell(display.title || meta.stepId || meta.source);
|
|
3976
|
+
if (title === '-')
|
|
3977
|
+
continue;
|
|
3978
|
+
const key = String(meta.evidenceRefId || `${meta.source || ''}:${meta.stepId || ''}:${title}`);
|
|
3979
|
+
if (seen.has(key))
|
|
3980
|
+
continue;
|
|
3981
|
+
seen.add(key);
|
|
3982
|
+
const phase = markdownCell(meta.planPhaseTitle || meta.planPhaseId || '-');
|
|
3983
|
+
const source = markdownCell(meta.source || meta.skillId || 'execute_sql');
|
|
3984
|
+
const evidence = markdownCell(meta.evidenceRefId || meta.sourceToolCallId || '-', 48);
|
|
3985
|
+
candidates.push(`| ${phase} | ${title} | ${source} | ${envelopeRowCount(env)} | ${evidence} |`);
|
|
3986
|
+
}
|
|
3987
|
+
if (candidates.length === 0)
|
|
3988
|
+
return '';
|
|
3989
|
+
const rows = candidates.slice(0, maxItems);
|
|
3990
|
+
const omitted = Math.max(0, candidates.length - rows.length);
|
|
3991
|
+
return [
|
|
3992
|
+
'## 证据表索引',
|
|
3993
|
+
'',
|
|
3994
|
+
'| 阶段 | 表/摘要 | 来源 | 行数 | 证据 ID |',
|
|
3995
|
+
'|---|---|---|---:|---|',
|
|
3996
|
+
...rows,
|
|
3997
|
+
omitted > 0 ? `| - | 其余 ${omitted} 份证据 | - | - | - |` : '',
|
|
3998
|
+
].filter(Boolean).join('\n');
|
|
3999
|
+
}
|
|
4000
|
+
function appendEvidenceIndexIfMissing(conclusion, envelopes) {
|
|
4001
|
+
const normalized = conclusion || '';
|
|
4002
|
+
if (conclusionHasEvidenceIndex(normalized))
|
|
4003
|
+
return normalized;
|
|
4004
|
+
const evidenceIndex = buildConclusionEvidenceIndex(envelopes);
|
|
4005
|
+
if (!evidenceIndex)
|
|
4006
|
+
return normalized;
|
|
4007
|
+
return `${normalized.trim()}\n\n${evidenceIndex}`;
|
|
4008
|
+
}
|
|
4009
|
+
function augmentConclusionUpdateWithEvidenceIndex(session, update) {
|
|
4010
|
+
if (update.type !== 'conclusion')
|
|
4011
|
+
return update;
|
|
4012
|
+
const content = update.content;
|
|
4013
|
+
if (!content || typeof content !== 'object' || Array.isArray(content))
|
|
4014
|
+
return update;
|
|
4015
|
+
const conclusion = content.conclusion;
|
|
4016
|
+
if (typeof conclusion !== 'string')
|
|
4017
|
+
return update;
|
|
4018
|
+
const augmented = appendEvidenceIndexIfMissing(conclusion, session.dataEnvelopes || []);
|
|
4019
|
+
if (augmented === conclusion)
|
|
4020
|
+
return update;
|
|
4021
|
+
return {
|
|
4022
|
+
...update,
|
|
4023
|
+
content: {
|
|
4024
|
+
...content,
|
|
4025
|
+
conclusion: augmented,
|
|
4026
|
+
},
|
|
4027
|
+
};
|
|
4028
|
+
}
|
|
4029
|
+
/**
|
|
4030
|
+
* Send agent-driven analysis result to SSE client
|
|
4031
|
+
*/
|
|
4032
|
+
function sendAgentDrivenResult(res, session) {
|
|
4033
|
+
const result = session.result;
|
|
4034
|
+
if (!result)
|
|
4035
|
+
return;
|
|
4036
|
+
const observability = buildStreamObservability(session);
|
|
4037
|
+
const replayOnlyScene = isSceneReplayOnlyQuery(session.query);
|
|
4038
|
+
const hasEvidenceBackedConclusion = result.success || result.partial === true;
|
|
4039
|
+
const normalizedConclusion = replayOnlyScene
|
|
4040
|
+
? buildSceneReplayNarrative(session.scenes || [])
|
|
4041
|
+
: hasEvidenceBackedConclusion ? appendEvidenceIndexIfMissing(normalizeNarrativeForClient(result.conclusion), session.dataEnvelopes || []) : normalizeNarrativeForClient(result.conclusion);
|
|
4042
|
+
const sceneIdHint = replayOnlyScene
|
|
4043
|
+
? undefined
|
|
4044
|
+
: resolveConclusionSceneIdHint({
|
|
4045
|
+
sessionId: session.sessionId,
|
|
4046
|
+
query: session.query,
|
|
4047
|
+
findings: result.findings,
|
|
4048
|
+
});
|
|
4049
|
+
// Fallback: re-derive contract if the orchestrator didn't populate it.
|
|
4050
|
+
// Note: mode heuristic uses rounds (available here) as proxy for turnCount
|
|
4051
|
+
// (which only the orchestrator knows). Both signal "multi-interaction" analysis.
|
|
4052
|
+
const normalizedConclusionContract = replayOnlyScene
|
|
4053
|
+
? undefined
|
|
4054
|
+
: hasEvidenceBackedConclusion ? (result.conclusionContract ||
|
|
4055
|
+
(0, agentResultNormalizer_1.deriveConclusionContractForNarrative)(result.conclusion, {
|
|
4056
|
+
mode: result.rounds > 1 ? 'focused_answer' : 'initial_report',
|
|
4057
|
+
sceneId: sceneIdHint,
|
|
4058
|
+
}) ||
|
|
4059
|
+
undefined) : undefined;
|
|
4060
|
+
const resultForClient = normalizedConclusion === result.conclusion && normalizedConclusionContract === result.conclusionContract
|
|
4061
|
+
? result
|
|
4062
|
+
: { ...result, conclusion: normalizedConclusion, conclusionContract: normalizedConclusionContract };
|
|
4063
|
+
const clientFindings = replayOnlyScene ? [] : buildClientFindings(result.findings, session.scenes || []);
|
|
4064
|
+
const resultContract = buildSessionResultContract(session, clientFindings);
|
|
4065
|
+
// Generate HTML report
|
|
4066
|
+
let reportUrl;
|
|
4067
|
+
let reportError;
|
|
4068
|
+
const reportId = `agent-report-${session.sessionId}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
4069
|
+
let resultSnapshotId;
|
|
4070
|
+
let resultSnapshotEventData;
|
|
4071
|
+
let reportLease = null;
|
|
4072
|
+
if (!hasEvidenceBackedConclusion) {
|
|
4073
|
+
reportError = `analysis did not complete successfully (${result.terminationReason || 'failed'})`;
|
|
4074
|
+
}
|
|
4075
|
+
else {
|
|
4076
|
+
try {
|
|
4077
|
+
if (enterpriseLeasesEnabled()) {
|
|
4078
|
+
const scope = leaseScopeFromSession(session);
|
|
4079
|
+
if (scope) {
|
|
4080
|
+
const traceInfo = (0, traceProcessorService_1.getTraceProcessorService)().getTrace(session.traceId);
|
|
4081
|
+
const reportLeaseDecision = buildLeaseModeDecisionForTrace(scope, session.traceId, 'report_generation', {
|
|
4082
|
+
traceSizeBytes: traceInfo?.size,
|
|
4083
|
+
});
|
|
4084
|
+
reportLease = (0, traceProcessorLeaseStore_1.getTraceProcessorLeaseStore)().acquireHolder(scope, session.traceId, {
|
|
4085
|
+
holderType: 'report_generation',
|
|
4086
|
+
holderRef: reportId,
|
|
4087
|
+
reportId,
|
|
4088
|
+
sessionId: session.sessionId,
|
|
4089
|
+
runId: session.lastRun?.runId || session.activeRun?.runId,
|
|
4090
|
+
metadata: {
|
|
4091
|
+
leaseModeReason: reportLeaseDecision.reason,
|
|
4092
|
+
leaseModeSignals: reportLeaseDecision.signals,
|
|
4093
|
+
},
|
|
4094
|
+
}, { mode: reportLeaseDecision.mode });
|
|
4095
|
+
reportLease = markLeaseReadyIfNew(reportLease, scope);
|
|
4096
|
+
}
|
|
4097
|
+
}
|
|
4098
|
+
const generator = (0, htmlReportGenerator_1.getHTMLReportGenerator)();
|
|
4099
|
+
// Report assembly (cumulative findings dedup, empty-conclusion fallback,
|
|
4100
|
+
// snapshot-first analysisNotes/Plan/Flags) lives in the shared builder so
|
|
4101
|
+
// the CLI path produces identical output.
|
|
4102
|
+
const reportData = (0, agentReportData_1.buildAgentDrivenReportData)({
|
|
4103
|
+
session,
|
|
4104
|
+
result: resultForClient,
|
|
4105
|
+
});
|
|
4106
|
+
console.log(`[AgentRoutes] Generating HTML report, data keys:`, {
|
|
4107
|
+
hasResult: !!result,
|
|
4108
|
+
conclusionLength: normalizedConclusion?.length || 0,
|
|
4109
|
+
conclusionPreview: (normalizedConclusion || '').substring(0, 100),
|
|
4110
|
+
hasConclusionContract: !!normalizedConclusionContract,
|
|
4111
|
+
findingsCount: result.findings?.length || 0,
|
|
4112
|
+
hypothesesCount: session.hypotheses?.length || 0,
|
|
4113
|
+
dialogueCount: session.agentDialogue?.length || 0,
|
|
4114
|
+
conversationStepCount: session.conversationSteps?.length || 0,
|
|
4115
|
+
dataEnvelopesCount: session.dataEnvelopes?.length || 0,
|
|
4116
|
+
agentResponsesCount: session.agentResponses?.length || 0,
|
|
4117
|
+
conclusionHistoryCount: session.conclusionHistory?.length || 0,
|
|
4118
|
+
hasSnapshot: !!session._lastSnapshot,
|
|
4119
|
+
snapshotNotes: session._lastSnapshot?.analysisNotes?.length ?? 'n/a',
|
|
4120
|
+
snapshotPlan: !!session._lastSnapshot?.analysisPlan,
|
|
4121
|
+
snapshotFlags: session._lastSnapshot?.uncertaintyFlags?.length ?? 'n/a',
|
|
4122
|
+
});
|
|
4123
|
+
const html = generator.generateAgentDrivenHTML(reportData);
|
|
4124
|
+
// Store report
|
|
4125
|
+
(0, reportRoutes_1.persistReport)(reportId, {
|
|
4126
|
+
html,
|
|
4127
|
+
generatedAt: Date.now(),
|
|
4128
|
+
sessionId: session.sessionId,
|
|
4129
|
+
runId: session.lastRun?.runId || session.activeRun?.runId,
|
|
4130
|
+
traceId: session.traceId,
|
|
4131
|
+
tenantId: session.tenantId,
|
|
4132
|
+
workspaceId: session.workspaceId,
|
|
4133
|
+
userId: session.userId,
|
|
4134
|
+
visibility: 'private',
|
|
4135
|
+
});
|
|
4136
|
+
reportUrl = `/api/reports/${reportId}`;
|
|
4137
|
+
console.log(`[AgentRoutes] Generated agent-driven HTML report: ${reportId} (${html.length} bytes)`);
|
|
4138
|
+
}
|
|
4139
|
+
catch (error) {
|
|
4140
|
+
reportError = error.message || 'Unknown error';
|
|
4141
|
+
console.error('[AgentRoutes] Failed to generate agent-driven HTML report:', {
|
|
4142
|
+
error: reportError,
|
|
4143
|
+
stack: error.stack?.split('\n').slice(0, 5).join('\n'),
|
|
4144
|
+
resultConclusion: result?.conclusion ? `${result.conclusion.length} chars` : 'EMPTY/NULL',
|
|
4145
|
+
resultConfidence: result?.confidence,
|
|
4146
|
+
resultRounds: result?.rounds,
|
|
4147
|
+
});
|
|
4148
|
+
}
|
|
4149
|
+
finally {
|
|
4150
|
+
if (reportLease) {
|
|
4151
|
+
const scope = leaseScopeFromSession(session);
|
|
4152
|
+
if (scope) {
|
|
4153
|
+
try {
|
|
4154
|
+
(0, traceProcessorLeaseStore_1.getTraceProcessorLeaseStore)().releaseHolder(scope, reportLease.id, 'report_generation', reportId);
|
|
4155
|
+
}
|
|
4156
|
+
catch (releaseError) {
|
|
4157
|
+
console.warn(`[AgentRoutes] Failed to release report_generation lease ${reportLease.id}: ${releaseError.message}`);
|
|
4158
|
+
}
|
|
4159
|
+
}
|
|
4160
|
+
}
|
|
4161
|
+
}
|
|
4162
|
+
}
|
|
4163
|
+
if (hasEvidenceBackedConclusion) {
|
|
4164
|
+
try {
|
|
4165
|
+
const resultSnapshot = (0, analysisResultSnapshotPipeline_1.persistCompletedAnalysisResultSnapshot)({
|
|
4166
|
+
tenantId: session.tenantId,
|
|
4167
|
+
workspaceId: session.workspaceId,
|
|
4168
|
+
userId: session.userId,
|
|
4169
|
+
traceId: session.traceId,
|
|
4170
|
+
sessionId: session.sessionId,
|
|
4171
|
+
runId: session.lastRun?.runId || session.activeRun?.runId,
|
|
4172
|
+
reportId: reportUrl ? reportId : undefined,
|
|
4173
|
+
query: session.query,
|
|
4174
|
+
traceLabel: session.traceId,
|
|
4175
|
+
conclusion: normalizedConclusion,
|
|
4176
|
+
conclusionContract: normalizedConclusionContract,
|
|
4177
|
+
confidence: result.confidence,
|
|
4178
|
+
partial: result.partial,
|
|
4179
|
+
terminationReason: result.terminationReason,
|
|
4180
|
+
terminationMessage: result.terminationMessage,
|
|
4181
|
+
dataEnvelopes: session.dataEnvelopes,
|
|
4182
|
+
});
|
|
4183
|
+
resultSnapshotId = resultSnapshot?.id;
|
|
4184
|
+
if (resultSnapshot) {
|
|
4185
|
+
resultSnapshotEventData = {
|
|
4186
|
+
snapshotId: resultSnapshot.id,
|
|
4187
|
+
status: resultSnapshot.status,
|
|
4188
|
+
sceneType: resultSnapshot.sceneType,
|
|
4189
|
+
metricCount: resultSnapshot.metrics.length,
|
|
4190
|
+
evidenceRefCount: resultSnapshot.evidenceRefs.length,
|
|
4191
|
+
traceId: resultSnapshot.traceId,
|
|
4192
|
+
sessionId: resultSnapshot.sessionId,
|
|
4193
|
+
runId: resultSnapshot.runId,
|
|
4194
|
+
reportId: resultSnapshot.reportId,
|
|
4195
|
+
visibility: resultSnapshot.visibility,
|
|
4196
|
+
createdAt: resultSnapshot.createdAt,
|
|
4197
|
+
};
|
|
4198
|
+
}
|
|
4199
|
+
}
|
|
4200
|
+
catch (snapshotError) {
|
|
4201
|
+
console.warn('[AgentRoutes] Failed to persist analysis result snapshot:', {
|
|
4202
|
+
sessionId: session.sessionId,
|
|
4203
|
+
runId: session.lastRun?.runId || session.activeRun?.runId,
|
|
4204
|
+
error: snapshotError?.message || String(snapshotError),
|
|
4205
|
+
});
|
|
4206
|
+
}
|
|
4207
|
+
}
|
|
4208
|
+
if (resultSnapshotEventData) {
|
|
4209
|
+
sendReplayableSessionEvent(session, res, 'snapshot_created', {
|
|
4210
|
+
type: 'snapshot_created',
|
|
4211
|
+
architecture: 'agent-driven',
|
|
4212
|
+
...observability,
|
|
4213
|
+
data: resultSnapshotEventData,
|
|
4214
|
+
timestamp: Date.now(),
|
|
4215
|
+
});
|
|
4216
|
+
}
|
|
4217
|
+
// Send analysis_completed event with full result. Keep it replayable so a
|
|
4218
|
+
// reconnect between conclusion and report generation can recover reportUrl.
|
|
4219
|
+
sendReplayableSessionEvent(session, res, 'analysis_completed', {
|
|
4220
|
+
type: 'analysis_completed',
|
|
4221
|
+
architecture: 'agent-driven',
|
|
4222
|
+
...observability,
|
|
4223
|
+
data: {
|
|
4224
|
+
conclusion: normalizedConclusion,
|
|
4225
|
+
conclusionContract: normalizedConclusionContract,
|
|
4226
|
+
confidence: result.confidence,
|
|
4227
|
+
rounds: result.rounds,
|
|
4228
|
+
totalDurationMs: result.totalDurationMs,
|
|
4229
|
+
partial: result.partial,
|
|
4230
|
+
terminationReason: result.terminationReason,
|
|
4231
|
+
terminationMessage: result.terminationMessage,
|
|
4232
|
+
findings: clientFindings,
|
|
4233
|
+
resultContract,
|
|
4234
|
+
hypotheses: result.hypotheses.map((h) => ({
|
|
4235
|
+
id: h.id,
|
|
4236
|
+
description: h.description,
|
|
4237
|
+
status: h.status,
|
|
4238
|
+
confidence: h.confidence,
|
|
4239
|
+
supportingEvidence: h.supportingEvidence,
|
|
4240
|
+
contradictingEvidence: h.contradictingEvidence,
|
|
4241
|
+
})),
|
|
4242
|
+
agentDialogueCount: session.agentDialogue.length,
|
|
4243
|
+
conversationTimelineCount: session.conversationSteps.length,
|
|
4244
|
+
conversationTimeline: session.conversationSteps,
|
|
4245
|
+
reportUrl,
|
|
4246
|
+
reportError,
|
|
4247
|
+
comparisonReportSection: session.comparisonReportSection
|
|
4248
|
+
? {
|
|
4249
|
+
source: session.comparisonReportSection.source,
|
|
4250
|
+
title: session.comparisonReportSection.title,
|
|
4251
|
+
markdown: session.comparisonReportSection.markdown,
|
|
4252
|
+
limitations: session.comparisonReportSection.limitations,
|
|
4253
|
+
evidencePack: session.comparisonReportSection.evidencePack,
|
|
4254
|
+
}
|
|
4255
|
+
: undefined,
|
|
4256
|
+
resultSnapshotId,
|
|
4257
|
+
observability,
|
|
4258
|
+
},
|
|
4259
|
+
timestamp: Date.now(),
|
|
4260
|
+
});
|
|
4261
|
+
// Backward-compatible scene reconstruction payload (used by the legacy /scene-reconstruct clients).
|
|
4262
|
+
if ((session.scenes?.length || 0) > 0 || (session.trackEvents?.length || 0) > 0) {
|
|
4263
|
+
sendReplayableSessionEvent(session, res, 'scene_reconstruction_completed', {
|
|
4264
|
+
type: 'scene_reconstruction_completed',
|
|
4265
|
+
...observability,
|
|
4266
|
+
data: {
|
|
4267
|
+
narrative: normalizedConclusion,
|
|
4268
|
+
confidence: result.confidence,
|
|
4269
|
+
executionTimeMs: result.totalDurationMs,
|
|
4270
|
+
scenes: (session.scenes || []).map((s) => ({
|
|
4271
|
+
type: s.type,
|
|
4272
|
+
startTs: s.startTs,
|
|
4273
|
+
endTs: s.endTs,
|
|
4274
|
+
durationMs: s.durationMs,
|
|
4275
|
+
confidence: s.confidence,
|
|
4276
|
+
appPackage: s.appPackage,
|
|
4277
|
+
})),
|
|
4278
|
+
trackEvents: session.trackEvents || [],
|
|
4279
|
+
findings: clientFindings.map((f) => ({
|
|
4280
|
+
id: f.id,
|
|
4281
|
+
category: f.category,
|
|
4282
|
+
severity: f.severity,
|
|
4283
|
+
title: f.title,
|
|
4284
|
+
description: f.description,
|
|
4285
|
+
timestampsNs: f.timestampsNs,
|
|
4286
|
+
})),
|
|
4287
|
+
suggestions: [],
|
|
4288
|
+
observability,
|
|
4289
|
+
},
|
|
4290
|
+
timestamp: Date.now(),
|
|
4291
|
+
});
|
|
4292
|
+
}
|
|
4293
|
+
}
|
|
4294
|
+
(0, agentLogsRoutes_1.registerAgentLogsRoutes)(router);
|
|
4295
|
+
// ============================================================================
|
|
4296
|
+
// Cleanup
|
|
4297
|
+
// ============================================================================
|
|
4298
|
+
// Cleanup old sessions every 30 minutes
|
|
4299
|
+
const sessionCleanupInterval = setInterval(() => {
|
|
4300
|
+
assistantAppService.cleanupIdleSessions({
|
|
4301
|
+
terminalMaxIdleMs: TERMINAL_SESSION_MAX_IDLE_MS,
|
|
4302
|
+
nonTerminalMaxIdleMs: NON_TERMINAL_SESSION_MAX_IDLE_MS,
|
|
4303
|
+
shouldCleanup: (_sessionId, session, context) => {
|
|
4304
|
+
if (!(0, config_1.resolveFeatureConfig)().enterprise || !context.isAbandonedNonTerminal) {
|
|
4305
|
+
return true;
|
|
4306
|
+
}
|
|
4307
|
+
if (isPersistedSessionRunFresh(session, context.now)) {
|
|
4308
|
+
session.lastActivityAt = context.now;
|
|
4309
|
+
return false;
|
|
4310
|
+
}
|
|
4311
|
+
return true;
|
|
4312
|
+
},
|
|
4313
|
+
onCleanup: (sessionId, session) => {
|
|
4314
|
+
console.log(`[AgentRoutes] Cleaning up stale session: ${sessionId}`);
|
|
4315
|
+
session.sseClients.forEach((client) => {
|
|
4316
|
+
try {
|
|
4317
|
+
client.end();
|
|
4318
|
+
}
|
|
4319
|
+
catch {
|
|
4320
|
+
// Ignore closed sockets during cleanup.
|
|
4321
|
+
}
|
|
4322
|
+
});
|
|
4323
|
+
// Clean up session-scoped state only — do NOT call reset() which clears
|
|
4324
|
+
// global caches (architectureCache) shared across all active sessions.
|
|
4325
|
+
if (typeof session.orchestrator.cleanupSession === 'function') {
|
|
4326
|
+
session.orchestrator.cleanupSession(sessionId);
|
|
4327
|
+
}
|
|
4328
|
+
// Also clean up the EnhancedSessionContext (EntityStore, turns, working memory)
|
|
4329
|
+
enhancedSessionContext_1.sessionContextManager.remove(sessionId);
|
|
4330
|
+
},
|
|
4331
|
+
});
|
|
4332
|
+
// Piggyback the Scene Story disk cache cleanup on the same 30-min cadence.
|
|
4333
|
+
// It's idempotent and self-contained, so a failed sweep here only delays
|
|
4334
|
+
// expired-report removal by another 30 minutes — never blocks session
|
|
4335
|
+
// cleanup or throws into the interval.
|
|
4336
|
+
void sceneReportStore
|
|
4337
|
+
.cleanupExpired(Date.now())
|
|
4338
|
+
.then((removed) => {
|
|
4339
|
+
if (removed > 0) {
|
|
4340
|
+
console.log(`[AgentRoutes] SceneReportStore expired ${removed} report(s)`);
|
|
4341
|
+
}
|
|
4342
|
+
})
|
|
4343
|
+
.catch((err) => {
|
|
4344
|
+
console.warn('[AgentRoutes] SceneReportStore cleanupExpired failed:', err?.message ?? err);
|
|
4345
|
+
});
|
|
4346
|
+
}, 30 * 60 * 1000);
|
|
4347
|
+
sessionCleanupInterval.unref?.();
|
|
4348
|
+
exports.default = router;
|
|
4349
|
+
//# sourceMappingURL=agentRoutes.js.map
|