@gracker/smartperfetto 1.0.15 → 1.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/dist/agent/agents/base/baseAgent.d.ts.map +1 -1
  2. package/dist/agent/agents/base/baseAgent.js +5 -1
  3. package/dist/agent/agents/base/baseAgent.js.map +1 -1
  4. package/dist/agent/context/enhancedSessionContext.d.ts +5 -0
  5. package/dist/agent/context/enhancedSessionContext.d.ts.map +1 -1
  6. package/dist/agent/context/enhancedSessionContext.js +13 -0
  7. package/dist/agent/context/enhancedSessionContext.js.map +1 -1
  8. package/dist/agent/core/conclusionContract.d.ts +23 -1
  9. package/dist/agent/core/conclusionContract.d.ts.map +1 -1
  10. package/dist/agent/core/conclusionGenerator.d.ts.map +1 -1
  11. package/dist/agent/core/conclusionGenerator.js +223 -27
  12. package/dist/agent/core/conclusionGenerator.js.map +1 -1
  13. package/dist/agent/core/executors/directSkillExecutor.d.ts.map +1 -1
  14. package/dist/agent/core/executors/directSkillExecutor.js +6 -12
  15. package/dist/agent/core/executors/directSkillExecutor.js.map +1 -1
  16. package/dist/agent/core/orchestratorTypes.d.ts +6 -0
  17. package/dist/agent/core/orchestratorTypes.d.ts.map +1 -1
  18. package/dist/agent/core/orchestratorTypes.js.map +1 -1
  19. package/dist/agent/experts/crossDomain/moduleExpertInvoker.d.ts.map +1 -1
  20. package/dist/agent/experts/crossDomain/moduleExpertInvoker.js +4 -1
  21. package/dist/agent/experts/crossDomain/moduleExpertInvoker.js.map +1 -1
  22. package/dist/agent/scene/sceneStage1Runner.d.ts +1 -1
  23. package/dist/agent/scene/sceneStage1Runner.d.ts.map +1 -1
  24. package/dist/agent/scene/sceneStage1Runner.js +1 -1
  25. package/dist/agent/scene/sceneStage1Runner.js.map +1 -1
  26. package/dist/agent/scene/sceneStoryService.d.ts +1 -1
  27. package/dist/agent/scene/sceneStoryService.d.ts.map +1 -1
  28. package/dist/agent/scene/sceneStoryService.js +4 -1
  29. package/dist/agent/scene/sceneStoryService.js.map +1 -1
  30. package/dist/agent/types/agentProtocol.d.ts.map +1 -1
  31. package/dist/agent/types/agentProtocol.js +4 -1
  32. package/dist/agent/types/agentProtocol.js.map +1 -1
  33. package/dist/agent/types.d.ts +7 -0
  34. package/dist/agent/types.d.ts.map +1 -1
  35. package/dist/agent/types.js.map +1 -1
  36. package/dist/agentOpenAI/openAiConfig.d.ts +2 -0
  37. package/dist/agentOpenAI/openAiConfig.d.ts.map +1 -1
  38. package/dist/agentOpenAI/openAiConfig.js +3 -0
  39. package/dist/agentOpenAI/openAiConfig.js.map +1 -1
  40. package/dist/agentOpenAI/openAiRuntime.d.ts +8 -0
  41. package/dist/agentOpenAI/openAiRuntime.d.ts.map +1 -1
  42. package/dist/agentOpenAI/openAiRuntime.js +293 -58
  43. package/dist/agentOpenAI/openAiRuntime.js.map +1 -1
  44. package/dist/agentRuntime/runtimeHealth.d.ts +1 -0
  45. package/dist/agentRuntime/runtimeHealth.d.ts.map +1 -1
  46. package/dist/agentv3/artifactStore.d.ts +5 -0
  47. package/dist/agentv3/artifactStore.d.ts.map +1 -1
  48. package/dist/agentv3/artifactStore.js +3 -0
  49. package/dist/agentv3/artifactStore.js.map +1 -1
  50. package/dist/agentv3/claudeMcpServer.d.ts.map +1 -1
  51. package/dist/agentv3/claudeMcpServer.js +125 -86
  52. package/dist/agentv3/claudeMcpServer.js.map +1 -1
  53. package/dist/agentv3/claudeRuntime.d.ts.map +1 -1
  54. package/dist/agentv3/claudeRuntime.js +147 -65
  55. package/dist/agentv3/claudeRuntime.js.map +1 -1
  56. package/dist/agentv3/claudeSseBridge.d.ts +6 -0
  57. package/dist/agentv3/claudeSseBridge.d.ts.map +1 -1
  58. package/dist/agentv3/claudeSseBridge.js +1 -0
  59. package/dist/agentv3/claudeSseBridge.js.map +1 -1
  60. package/dist/agentv3/sessionStateSnapshot.d.ts +23 -0
  61. package/dist/agentv3/sessionStateSnapshot.d.ts.map +1 -1
  62. package/dist/assistant/application/agentAnalyzeSessionService.d.ts +6 -0
  63. package/dist/assistant/application/agentAnalyzeSessionService.d.ts.map +1 -1
  64. package/dist/assistant/application/agentAnalyzeSessionService.js +9 -3
  65. package/dist/assistant/application/agentAnalyzeSessionService.js.map +1 -1
  66. package/dist/assistant/application/assistantApplicationService.d.ts.map +1 -1
  67. package/dist/assistant/application/assistantApplicationService.js +3 -1
  68. package/dist/assistant/application/assistantApplicationService.js.map +1 -1
  69. package/dist/cli-user/commands/report.js +64 -0
  70. package/dist/cli-user/commands/report.js.map +1 -1
  71. package/dist/cli-user/io/paths.d.ts +3 -0
  72. package/dist/cli-user/io/paths.d.ts.map +1 -1
  73. package/dist/cli-user/io/paths.js +6 -0
  74. package/dist/cli-user/io/paths.js.map +1 -1
  75. package/dist/cli-user/io/sessionStore.d.ts +1 -0
  76. package/dist/cli-user/io/sessionStore.d.ts.map +1 -1
  77. package/dist/cli-user/io/sessionStore.js +5 -0
  78. package/dist/cli-user/io/sessionStore.js.map +1 -1
  79. package/dist/cli-user/repl/renderer.d.ts +8 -0
  80. package/dist/cli-user/repl/renderer.d.ts.map +1 -1
  81. package/dist/cli-user/repl/renderer.js.map +1 -1
  82. package/dist/cli-user/services/cliAnalyzeService.d.ts +3 -0
  83. package/dist/cli-user/services/cliAnalyzeService.d.ts.map +1 -1
  84. package/dist/cli-user/services/cliAnalyzeService.js +103 -1
  85. package/dist/cli-user/services/cliAnalyzeService.js.map +1 -1
  86. package/dist/cli-user/services/turnPersistence.d.ts +0 -10
  87. package/dist/cli-user/services/turnPersistence.d.ts.map +1 -1
  88. package/dist/cli-user/services/turnPersistence.js +62 -0
  89. package/dist/cli-user/services/turnPersistence.js.map +1 -1
  90. package/dist/routes/agentReportRoutes.d.ts +1 -0
  91. package/dist/routes/agentReportRoutes.d.ts.map +1 -1
  92. package/dist/routes/agentReportRoutes.js +13 -2
  93. package/dist/routes/agentReportRoutes.js.map +1 -1
  94. package/dist/routes/agentResumeRoutes.d.ts.map +1 -1
  95. package/dist/routes/agentResumeRoutes.js +51 -5
  96. package/dist/routes/agentResumeRoutes.js.map +1 -1
  97. package/dist/routes/agentRoutes.d.ts.map +1 -1
  98. package/dist/routes/agentRoutes.js +524 -130
  99. package/dist/routes/agentRoutes.js.map +1 -1
  100. package/dist/scripts/verifyAgentSseScrolling.js +142 -2
  101. package/dist/scripts/verifyAgentSseScrolling.js.map +1 -1
  102. package/dist/services/agentEventStore.d.ts.map +1 -1
  103. package/dist/services/agentEventStore.js +13 -3
  104. package/dist/services/agentEventStore.js.map +1 -1
  105. package/dist/services/agentReportData.d.ts +3 -0
  106. package/dist/services/agentReportData.d.ts.map +1 -1
  107. package/dist/services/agentReportData.js.map +1 -1
  108. package/dist/services/agentResultNormalizer.d.ts +15 -3
  109. package/dist/services/agentResultNormalizer.d.ts.map +1 -1
  110. package/dist/services/agentResultNormalizer.js +344 -6
  111. package/dist/services/agentResultNormalizer.js.map +1 -1
  112. package/dist/services/analysisResultSnapshotPipeline.d.ts +3 -0
  113. package/dist/services/analysisResultSnapshotPipeline.d.ts.map +1 -1
  114. package/dist/services/analysisResultSnapshotPipeline.js +3 -0
  115. package/dist/services/analysisResultSnapshotPipeline.js.map +1 -1
  116. package/dist/services/analysisResultSnapshotStore.d.ts.map +1 -1
  117. package/dist/services/analysisResultSnapshotStore.js +34 -2
  118. package/dist/services/analysisResultSnapshotStore.js.map +1 -1
  119. package/dist/services/enterpriseSchema.d.ts.map +1 -1
  120. package/dist/services/enterpriseSchema.js +11 -0
  121. package/dist/services/enterpriseSchema.js.map +1 -1
  122. package/dist/services/evidence/evidenceContractBuilder.d.ts +11 -0
  123. package/dist/services/evidence/evidenceContractBuilder.d.ts.map +1 -0
  124. package/dist/services/evidence/evidenceContractBuilder.js +546 -0
  125. package/dist/services/evidence/evidenceContractBuilder.js.map +1 -0
  126. package/dist/services/finalResultQualityGate.d.ts +18 -0
  127. package/dist/services/finalResultQualityGate.d.ts.map +1 -0
  128. package/dist/services/finalResultQualityGate.js +283 -0
  129. package/dist/services/finalResultQualityGate.js.map +1 -0
  130. package/dist/services/htmlReportGenerator.d.ts +8 -1
  131. package/dist/services/htmlReportGenerator.d.ts.map +1 -1
  132. package/dist/services/htmlReportGenerator.js +129 -42
  133. package/dist/services/htmlReportGenerator.js.map +1 -1
  134. package/dist/services/persistAgentSession.d.ts +2 -0
  135. package/dist/services/persistAgentSession.d.ts.map +1 -1
  136. package/dist/services/persistAgentSession.js +17 -1
  137. package/dist/services/persistAgentSession.js.map +1 -1
  138. package/dist/services/processIdentity/identityContractMapper.d.ts +14 -0
  139. package/dist/services/processIdentity/identityContractMapper.d.ts.map +1 -0
  140. package/dist/services/processIdentity/identityContractMapper.js +135 -0
  141. package/dist/services/processIdentity/identityContractMapper.js.map +1 -0
  142. package/dist/services/processIdentity/types.d.ts +5 -0
  143. package/dist/services/processIdentity/types.d.ts.map +1 -1
  144. package/dist/services/processIdentity/types.js.map +1 -1
  145. package/dist/services/skillEngine/skillExecutor.d.ts +14 -2
  146. package/dist/services/skillEngine/skillExecutor.d.ts.map +1 -1
  147. package/dist/services/skillEngine/skillExecutor.js +133 -13
  148. package/dist/services/skillEngine/skillExecutor.js.map +1 -1
  149. package/dist/services/skillEngine/types.d.ts +2 -0
  150. package/dist/services/skillEngine/types.d.ts.map +1 -1
  151. package/dist/services/verifier/claimVerificationRunner.d.ts +20 -0
  152. package/dist/services/verifier/claimVerificationRunner.d.ts.map +1 -0
  153. package/dist/services/verifier/claimVerificationRunner.js +88 -0
  154. package/dist/services/verifier/claimVerificationRunner.js.map +1 -0
  155. package/dist/services/verifier/deterministicClaimVerifier.d.ts +8 -0
  156. package/dist/services/verifier/deterministicClaimVerifier.d.ts.map +1 -0
  157. package/dist/services/verifier/deterministicClaimVerifier.js +178 -0
  158. package/dist/services/verifier/deterministicClaimVerifier.js.map +1 -0
  159. package/dist/types/claimVerification.d.ts +38 -0
  160. package/dist/types/claimVerification.d.ts.map +1 -0
  161. package/dist/types/claimVerification.js +6 -0
  162. package/dist/types/claimVerification.js.map +1 -0
  163. package/dist/types/dataContract.d.ts +32 -0
  164. package/dist/types/dataContract.d.ts.map +1 -1
  165. package/dist/types/dataContract.js +7 -0
  166. package/dist/types/dataContract.js.map +1 -1
  167. package/dist/types/evidenceContract.d.ts +100 -0
  168. package/dist/types/evidenceContract.d.ts.map +1 -0
  169. package/dist/types/evidenceContract.js +6 -0
  170. package/dist/types/evidenceContract.js.map +1 -0
  171. package/dist/types/identityContract.d.ts +57 -0
  172. package/dist/types/identityContract.d.ts.map +1 -0
  173. package/dist/types/identityContract.js +6 -0
  174. package/dist/types/identityContract.js.map +1 -0
  175. package/dist/types/multiTraceComparison.d.ts +3 -0
  176. package/dist/types/multiTraceComparison.d.ts.map +1 -1
  177. package/package.json +3 -2
  178. package/skills/atomic/process_identity_resolver.skill.yaml +130 -1
  179. package/skills/atomic/process_slice_cpu_hotspots.skill.yaml +321 -0
  180. package/skills/atomic/startup_slow_reasons.skill.yaml +102 -17
  181. package/skills/composite/startup_analysis.skill.yaml +16 -0
  182. package/strategies/anr.strategy.md +2 -2
  183. package/strategies/game.strategy.md +1 -1
  184. package/strategies/general.strategy.md +1 -1
  185. package/strategies/prompt-openai-final-report-continuation-en.template.md +12 -0
  186. package/strategies/prompt-openai-final-report-continuation-zh.template.md +12 -0
  187. package/strategies/prompt-output-format.template.md +1 -1
  188. package/strategies/scrolling.strategy.md +1 -0
  189. package/strategies/startup.strategy.md +4 -1
@@ -0,0 +1,283 @@
1
+ "use strict";
2
+ // SPDX-License-Identifier: AGPL-3.0-or-later
3
+ // Copyright (C) 2024-2026 Gracker (Chris)
4
+ // This file is part of SmartPerfetto. See LICENSE for details.
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.hasDeliverableFinalReportHeading = hasDeliverableFinalReportHeading;
7
+ exports.looksLikeProcessNarrationConclusion = looksLikeProcessNarrationConclusion;
8
+ exports.looksLikePhaseSummaryFallback = looksLikePhaseSummaryFallback;
9
+ exports.assessFinalResultQuality = assessFinalResultQuality;
10
+ exports.applyFinalResultQualityGate = applyFinalResultQualityGate;
11
+ const FINAL_RESULT_QUALITY_GATE_MESSAGE = '最终结果质量闸门发现 provider 没有产出可独立交付的完整结论;本次结果已标记为 partial,避免把降级文本当作正常完成。';
12
+ const ANALYSIS_QUERY_MARKERS = [
13
+ '分析',
14
+ '诊断',
15
+ '为什么',
16
+ '原因',
17
+ '根因',
18
+ '卡顿',
19
+ '掉帧',
20
+ '慢',
21
+ '耗时高',
22
+ '瓶颈',
23
+ '性能问题',
24
+ 'analyze',
25
+ 'diagnose',
26
+ 'why',
27
+ 'root cause',
28
+ 'performance issue',
29
+ 'slow',
30
+ 'bottleneck',
31
+ 'jank',
32
+ 'anr',
33
+ ];
34
+ const DEEP_ANALYSIS_QUERY_MARKERS = [
35
+ '分析',
36
+ '诊断',
37
+ '为什么',
38
+ '原因',
39
+ '根因',
40
+ '性能问题',
41
+ 'analyze',
42
+ 'diagnose',
43
+ 'why',
44
+ 'root cause',
45
+ 'performance issue',
46
+ ];
47
+ const FACTUAL_QUERY_MARKERS = [
48
+ '哪个',
49
+ '哪一',
50
+ '是什么',
51
+ '多少',
52
+ '列出',
53
+ 'package',
54
+ 'pid',
55
+ 'tid',
56
+ 'what',
57
+ 'which',
58
+ 'how many',
59
+ ];
60
+ function normalizeTextForQualityCheck(text) {
61
+ return text.trim().replace(/\s+/g, ' ');
62
+ }
63
+ function countMatches(text, pattern) {
64
+ return text.match(pattern)?.length || 0;
65
+ }
66
+ function collectMarkdownSections(text) {
67
+ const headingPattern = /(^|\n)\s*#{1,3}\s+([^\n]+)/g;
68
+ const matches = [...text.matchAll(headingPattern)];
69
+ return matches.map((match, index) => {
70
+ const headingStart = (match.index || 0) + match[1].length;
71
+ const bodyStart = headingStart + match[0].slice(match[1].length).length;
72
+ const nextStart = matches[index + 1]?.index ?? text.length;
73
+ return {
74
+ heading: match[2].trim(),
75
+ body: text.slice(bodyStart, nextStart).trim(),
76
+ };
77
+ });
78
+ }
79
+ function isFallbackSummaryHeading(heading) {
80
+ const normalized = heading.trim().replace(/[::]\s*$/, '').toLowerCase();
81
+ return normalized === '综合结论' ||
82
+ normalized === '分阶段证据摘要' ||
83
+ normalized === 'final conclusion' ||
84
+ normalized === 'evidence summary by phase';
85
+ }
86
+ function isHeadingLine(line, labelPattern) {
87
+ return new RegExp(`^\\s*(?:#{1,3}\\s*)?(?:${labelPattern})(?:\\s*[::])?\\s*$`, 'i').test(line);
88
+ }
89
+ function matchHeadingWithTail(line, labelPattern) {
90
+ const match = line.match(new RegExp(`^\\s*(?:#{1,6}\\s*)?(?:${labelPattern})(?:\\s*[::])?\\s*(.*)$`, 'i'));
91
+ return match ? match[1].trim() : undefined;
92
+ }
93
+ function looksLikePhaseSummaryEntry(line) {
94
+ return /^\s*(?:[-*]\s*|\d+[.)、]\s*)?[^::\n]{1,80}[::]\s+\S/.test(line);
95
+ }
96
+ function countPhaseSummaryEntries(text) {
97
+ const lines = text.split(/\r?\n/);
98
+ let inPhaseSummary = false;
99
+ let count = 0;
100
+ for (const line of lines) {
101
+ const phaseSummaryTail = matchHeadingWithTail(line, '分阶段证据摘要|Evidence Summary By Phase');
102
+ if (phaseSummaryTail !== undefined) {
103
+ inPhaseSummary = true;
104
+ if (looksLikePhaseSummaryEntry(phaseSummaryTail))
105
+ count++;
106
+ continue;
107
+ }
108
+ if (!inPhaseSummary)
109
+ continue;
110
+ if (/^\s*#{1,6}\s+\S/.test(line))
111
+ break;
112
+ if (looksLikePhaseSummaryEntry(line)) {
113
+ count++;
114
+ }
115
+ }
116
+ return count;
117
+ }
118
+ function hasEvidenceReferenceText(text) {
119
+ return countMatches(text, /(?:\bart-\d+\b|\bdata:[a-z0-9_:-]+\b|\bevidence[_-]?ref\b|\bsource_tool_call_id\b|证据\s*ID)/gi) > 0;
120
+ }
121
+ function hasConcreteEvidenceText(text) {
122
+ if (hasEvidenceReferenceText(text))
123
+ return true;
124
+ const metricCount = countMatches(text, /\b(?:TTID|dur(?:ation)?|self_ms|total_ms|Running|Runnable|blocked|binder|GC|CPU|Q[1-4][ab]?)\b|(?:\d+(?:\.\d+)?\s*(?:ms|s|%|fps|MB|GHz|MHz))/gi);
125
+ return metricCount >= 3;
126
+ }
127
+ function hasReportStructureMarker(text) {
128
+ return /(^|\n)\s{0,3}#{1,6}\s+\S/.test(text) ||
129
+ /(^|\n)\s{0,3}\*\*[^*\n]{2,80}\*\*/.test(text) ||
130
+ /(^|\n)\s{0,3}\|/.test(text);
131
+ }
132
+ function hasDeliverableFinalReportHeading(text) {
133
+ return /(^|\n)\s{0,3}(?:#{1,3}\s*)?(?:(?:[^\n#]{0,40})?分析报告|综合结论|关键结论|最终结论|最终报告|根因分析|Final Conclusion|Final Report|Analysis Report|Root Cause)(?=\s|[::。.!!?\n]|$)/i.test(text);
134
+ }
135
+ function looksLikeProcessNarrationConclusion(conclusion) {
136
+ const text = normalizeTextForQualityCheck(conclusion);
137
+ if (!text)
138
+ return false;
139
+ return /^(?:我来|我需要|我将|我会|现在|接下来|下一步|让我|为了完成|I need\b|I will\b|Now I\b|Next\b|Let me\b)/i.test(text) ||
140
+ /(?:现在|接下来|下一步).{0,40}(?:完成|进入|继续).{0,20}Phase\s*\d+(?:\.\d+)?/i.test(text) ||
141
+ /(?:现在完成|现在进入|进入|继续执行).{0,20}Phase\s*\d+(?:\.\d+)?/i.test(text) ||
142
+ /(?:update_plan_phase|submit_plan|resolve_hypothesis|阶段状态更新|执行剩余阶段|继续执行剩余阶段|OpenAI plan|provider 未主动结束 stream|plan 未完成|plan 已完成)/i.test(text);
143
+ }
144
+ function collectIndependentEvidenceSectionText(text) {
145
+ const lines = text.split(/\r?\n/);
146
+ const sections = [];
147
+ let collecting = false;
148
+ const independentHeadingPattern = '关键证据链|证据链|关键证据|根因拆解|优化建议|风险与不确定性|Evidence Chain|Key Evidence|Root Cause|Recommendations|Risks';
149
+ for (const line of lines) {
150
+ if (matchHeadingWithTail(line, '综合结论|Final Conclusion') !== undefined ||
151
+ matchHeadingWithTail(line, '分阶段证据摘要|Evidence Summary By Phase') !== undefined) {
152
+ collecting = false;
153
+ continue;
154
+ }
155
+ const independentTail = matchHeadingWithTail(line, independentHeadingPattern);
156
+ if (independentTail !== undefined) {
157
+ collecting = true;
158
+ if (independentTail)
159
+ sections.push(independentTail);
160
+ continue;
161
+ }
162
+ if (collecting && (/^\s*#{1,6}\s+\S/.test(line) ||
163
+ /^\s*\S.{0,60}[::]\s*$/.test(line))) {
164
+ collecting = false;
165
+ continue;
166
+ }
167
+ if (collecting)
168
+ sections.push(line);
169
+ }
170
+ return sections.join('\n').trim();
171
+ }
172
+ function looksLikePhaseSummaryFallback(conclusion) {
173
+ const text = conclusion.trim();
174
+ if (!text)
175
+ return false;
176
+ const hasConclusionHeading = /(^|\n)\s*(?:#{1,3}\s*)?(综合结论|Final Conclusion)(?:\s*[::])?/i.test(text);
177
+ const hasPhaseSummaryHeading = /(^|\n)\s*(?:#{1,3}\s*)?(分阶段证据摘要|Evidence Summary By Phase)(?:\s*[::])?/i.test(text);
178
+ if (!hasConclusionHeading || !hasPhaseSummaryHeading)
179
+ return false;
180
+ if (countPhaseSummaryEntries(text) < 1)
181
+ return false;
182
+ const nonFallbackSections = collectMarkdownSections(text)
183
+ .filter(section => !isFallbackSummaryHeading(section.heading));
184
+ const independentEvidenceText = collectIndependentEvidenceSectionText(text);
185
+ if (independentEvidenceText && hasConcreteEvidenceText(independentEvidenceText)) {
186
+ return false;
187
+ }
188
+ if (nonFallbackSections.length === 0)
189
+ return true;
190
+ return !hasConcreteEvidenceText(nonFallbackSections.map(section => `${section.heading}\n${section.body}`).join('\n\n'));
191
+ }
192
+ function looksLikeAnalysisQuery(query) {
193
+ const normalized = normalizeTextForQualityCheck(String(query || '')).toLowerCase();
194
+ if (!normalized)
195
+ return true;
196
+ const asksFactualQuestion = FACTUAL_QUERY_MARKERS.some(marker => normalized.includes(marker));
197
+ const asksDeepAnalysis = DEEP_ANALYSIS_QUERY_MARKERS.some(marker => normalized.includes(marker));
198
+ if (asksFactualQuestion && !asksDeepAnalysis)
199
+ return false;
200
+ return ANALYSIS_QUERY_MARKERS.some(marker => normalized.includes(marker));
201
+ }
202
+ function hasSupportedClaimVerification(result) {
203
+ const status = result.claimVerificationResult?.status;
204
+ if (status === 'passed')
205
+ return true;
206
+ if (status !== 'partial')
207
+ return false;
208
+ return result.claimVerificationResult?.claimResults?.some(claim => claim.status === 'verified' || claim.status === 'partial' || claim.status === 'inference') === true;
209
+ }
210
+ function conclusionContractHasEvidence(result) {
211
+ const contract = result.conclusionContract;
212
+ if (!contract)
213
+ return false;
214
+ if (Array.isArray(contract.evidenceChain) && contract.evidenceChain.length > 0)
215
+ return true;
216
+ return Array.isArray(contract.claims) &&
217
+ contract.claims.some(claim => (Array.isArray(claim.references) && claim.references.length > 0) ||
218
+ (Array.isArray(claim.artifactRefs) && claim.artifactRefs.length > 0) ||
219
+ (Array.isArray(claim.relationRefs) && claim.relationRefs.length > 0));
220
+ }
221
+ function hasEvidenceBackedArtifacts(result) {
222
+ return Boolean(conclusionContractHasEvidence(result) ||
223
+ (Array.isArray(result.claimSupport) && result.claimSupport.some(claim => claim.supportLevel === 'verified' ||
224
+ claim.supportLevel === 'partial' ||
225
+ claim.supportLevel === 'inference')) ||
226
+ hasSupportedClaimVerification(result));
227
+ }
228
+ function assessFinalResultQuality(input) {
229
+ const { result, query } = input;
230
+ if (!result.success || result.partial === true)
231
+ return undefined;
232
+ const conclusion = result.conclusion.trim();
233
+ if (!conclusion) {
234
+ return {
235
+ code: 'empty_conclusion',
236
+ message: FINAL_RESULT_QUALITY_GATE_MESSAGE,
237
+ };
238
+ }
239
+ if (looksLikePhaseSummaryFallback(conclusion)) {
240
+ return {
241
+ code: 'plan_summary_fallback',
242
+ message: FINAL_RESULT_QUALITY_GATE_MESSAGE,
243
+ };
244
+ }
245
+ if (looksLikeProcessNarrationConclusion(conclusion)) {
246
+ return {
247
+ code: 'process_narration_conclusion',
248
+ message: FINAL_RESULT_QUALITY_GATE_MESSAGE,
249
+ };
250
+ }
251
+ if (looksLikeAnalysisQuery(query) &&
252
+ hasReportStructureMarker(conclusion) &&
253
+ !hasDeliverableFinalReportHeading(conclusion)) {
254
+ return {
255
+ code: 'missing_final_report_heading',
256
+ message: FINAL_RESULT_QUALITY_GATE_MESSAGE,
257
+ };
258
+ }
259
+ const hasFindings = Array.isArray(result.findings) && result.findings.length > 0;
260
+ if (looksLikeAnalysisQuery(query) &&
261
+ conclusion.length < 280 &&
262
+ !hasFindings &&
263
+ !hasEvidenceBackedArtifacts(result) &&
264
+ !hasEvidenceReferenceText(conclusion)) {
265
+ return {
266
+ code: 'sparse_unverified_conclusion',
267
+ message: FINAL_RESULT_QUALITY_GATE_MESSAGE,
268
+ };
269
+ }
270
+ return undefined;
271
+ }
272
+ function applyFinalResultQualityGate(input) {
273
+ const issue = assessFinalResultQuality(input);
274
+ if (!issue)
275
+ return undefined;
276
+ input.result.partial = true;
277
+ input.result.confidence = Math.min(input.result.confidence || 0, 0.55);
278
+ input.result.terminationMessage = input.result.terminationMessage
279
+ ? `${input.result.terminationMessage}\n\n${issue.message}`
280
+ : issue.message;
281
+ return issue;
282
+ }
283
+ //# sourceMappingURL=finalResultQualityGate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finalResultQualityGate.js","sourceRoot":"","sources":["../../src/services/finalResultQualityGate.ts"],"names":[],"mappings":";AAAA,6CAA6C;AAC7C,0CAA0C;AAC1C,+DAA+D;;AAkK/D,4EAEC;AAED,kFAQC;AAqCD,sEAqBC;AA4CD,4DAuDC;AAED,kEAaC;AA1UD,MAAM,iCAAiC,GACrC,oEAAoE,CAAC;AAEvE,MAAM,sBAAsB,GAAG;IAC7B,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,KAAK;IACL,IAAI;IACJ,MAAM;IACN,SAAS;IACT,UAAU;IACV,KAAK;IACL,YAAY;IACZ,mBAAmB;IACnB,MAAM;IACN,YAAY;IACZ,MAAM;IACN,KAAK;CACN,CAAC;AAEF,MAAM,2BAA2B,GAAG;IAClC,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,SAAS;IACT,UAAU;IACV,KAAK;IACL,YAAY;IACZ,mBAAmB;CACpB,CAAC;AAEF,MAAM,qBAAqB,GAAG;IAC5B,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,SAAS;IACT,KAAK;IACL,KAAK;IACL,MAAM;IACN,OAAO;IACP,UAAU;CACX,CAAC;AAEF,SAAS,4BAA4B,CAAC,IAAY;IAChD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,OAAe;IACjD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY;IAC3C,MAAM,cAAc,GAAG,6BAA6B,CAAC;IACrD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;IACnD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAClC,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1D,MAAM,SAAS,GAAG,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;QACxE,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC;QAC3D,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YACxB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE;SAC9C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAe;IAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACxE,OAAO,UAAU,KAAK,MAAM;QAC1B,UAAU,KAAK,SAAS;QACxB,UAAU,KAAK,kBAAkB;QACjC,UAAU,KAAK,2BAA2B,CAAC;AAC/C,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,YAAoB;IACvD,OAAO,IAAI,MAAM,CACf,0BAA0B,YAAY,qBAAqB,EAC3D,GAAG,CACJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY,EAAE,YAAoB;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CACjC,0BAA0B,YAAY,yBAAyB,EAC/D,GAAG,CACJ,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7C,CAAC;AAED,SAAS,0BAA0B,CAAC,IAAY;IAC9C,OAAO,oDAAoD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAY;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,IAAI,EAAE,mCAAmC,CAAC,CAAC;QACzF,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,cAAc,GAAG,IAAI,CAAC;YACtB,IAAI,0BAA0B,CAAC,gBAAgB,CAAC;gBAAE,KAAK,EAAE,CAAC;YAC1D,SAAS;QACX,CAAC;QACD,IAAI,CAAC,cAAc;YAAE,SAAS;QAC9B,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM;QACxC,IAAI,0BAA0B,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAY;IAC5C,OAAO,YAAY,CACjB,IAAI,EACJ,8FAA8F,CAC/F,GAAG,CAAC,CAAC;AACR,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY;IAC3C,IAAI,wBAAwB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEhD,MAAM,WAAW,GAAG,YAAY,CAC9B,IAAI,EACJ,gJAAgJ,CACjJ,CAAC;IACF,OAAO,WAAW,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAY;IAC5C,OAAO,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1C,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9C,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,SAAgB,gCAAgC,CAAC,IAAY;IAC3D,OAAO,6JAA6J,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClL,CAAC;AAED,SAAgB,mCAAmC,CAAC,UAAkB;IACpE,MAAM,IAAI,GAAG,4BAA4B,CAAC,UAAU,CAAC,CAAC;IACtD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,OAAO,iFAAiF,CAAC,IAAI,CAAC,IAAI,CAAC;QACjG,gEAAgE,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3E,oDAAoD,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/D,kIAAkI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClJ,CAAC;AAED,SAAS,qCAAqC,CAAC,IAAY;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,MAAM,yBAAyB,GAC7B,+FAA+F,CAAC;IAElG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,oBAAoB,CAAC,IAAI,EAAE,uBAAuB,CAAC,KAAK,SAAS;YACjE,oBAAoB,CAAC,IAAI,EAAE,mCAAmC,CAAC,KAAK,SAAS,EAAE,CAAC;YAClF,UAAU,GAAG,KAAK,CAAC;YACnB,SAAS;QACX,CAAC;QAED,MAAM,eAAe,GAAG,oBAAoB,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;QAC9E,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,UAAU,GAAG,IAAI,CAAC;YAClB,IAAI,eAAe;gBAAE,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACpD,SAAS;QACX,CAAC;QAED,IAAI,UAAU,IAAI,CAChB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5B,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CACnC,EAAE,CAAC;YACF,UAAU,GAAG,KAAK,CAAC;YACnB,SAAS;QACX,CAAC;QAED,IAAI,UAAU;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,SAAgB,6BAA6B,CAAC,UAAkB;IAC9D,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,MAAM,oBAAoB,GAAG,6DAA6D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtG,MAAM,sBAAsB,GAAG,yEAAyE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpH,IAAI,CAAC,oBAAoB,IAAI,CAAC,sBAAsB;QAAE,OAAO,KAAK,CAAC;IAEnE,IAAI,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAErD,MAAM,mBAAmB,GAAG,uBAAuB,CAAC,IAAI,CAAC;SACtD,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,wBAAwB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,MAAM,uBAAuB,GAAG,qCAAqC,CAAC,IAAI,CAAC,CAAC;IAC5E,IAAI,uBAAuB,IAAI,uBAAuB,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAChF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAElD,OAAO,CAAC,uBAAuB,CAC7B,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CACvF,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAyB;IACvD,MAAM,UAAU,GAAG,4BAA4B,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACnF,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,mBAAmB,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9F,MAAM,gBAAgB,GAAG,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACjG,IAAI,mBAAmB,IAAI,CAAC,gBAAgB;QAAE,OAAO,KAAK,CAAC;IAC3D,OAAO,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,6BAA6B,CAAC,MAAkC;IACvE,MAAM,MAAM,GAAG,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACtD,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACvC,OAAO,MAAM,CAAC,uBAAuB,EAAE,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAChE,KAAK,CAAC,MAAM,KAAK,UAAU,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,CAC1F,KAAK,IAAI,CAAC;AACb,CAAC;AAED,SAAS,6BAA6B,CAAC,MAAkC;IACvE,MAAM,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CAAC;IAC3C,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5F,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAC3B,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;YAChE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;YACpE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CACrE,CAAC;AACN,CAAC;AAED,SAAS,0BAA0B,CAAC,MAAkC;IACpE,OAAO,OAAO,CACZ,6BAA6B,CAAC,MAAM,CAAC;QACrC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CACtE,KAAK,CAAC,YAAY,KAAK,UAAU;YACjC,KAAK,CAAC,YAAY,KAAK,SAAS;YAChC,KAAK,CAAC,YAAY,KAAK,WAAW,CACnC,CAAC;QACF,6BAA6B,CAAC,MAAM,CAAC,CACtC,CAAC;AACJ,CAAC;AAED,SAAgB,wBAAwB,CAAC,KAGxC;IACC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAEjE,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,iCAAiC;SAC3C,CAAC;IACJ,CAAC;IAED,IAAI,6BAA6B,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9C,OAAO;YACL,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,iCAAiC;SAC3C,CAAC;IACJ,CAAC;IAED,IAAI,mCAAmC,CAAC,UAAU,CAAC,EAAE,CAAC;QACpD,OAAO;YACL,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,iCAAiC;SAC3C,CAAC;IACJ,CAAC;IAED,IACE,sBAAsB,CAAC,KAAK,CAAC;QAC7B,wBAAwB,CAAC,UAAU,CAAC;QACpC,CAAC,gCAAgC,CAAC,UAAU,CAAC,EAC7C,CAAC;QACD,OAAO;YACL,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,iCAAiC;SAC3C,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACjF,IACE,sBAAsB,CAAC,KAAK,CAAC;QAC7B,UAAU,CAAC,MAAM,GAAG,GAAG;QACvB,CAAC,WAAW;QACZ,CAAC,0BAA0B,CAAC,MAAM,CAAC;QACnC,CAAC,wBAAwB,CAAC,UAAU,CAAC,EACrC,CAAC;QACD,OAAO;YACL,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,iCAAiC;SAC3C,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,2BAA2B,CAAC,KAG3C;IACC,MAAM,KAAK,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IACvE,KAAK,CAAC,MAAM,CAAC,kBAAkB,GAAG,KAAK,CAAC,MAAM,CAAC,kBAAkB;QAC/D,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,kBAAkB,OAAO,KAAK,CAAC,OAAO,EAAE;QAC1D,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAClB,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -2,6 +2,9 @@ import { AnalysisSession, CollectedResult } from '../types/analysis';
2
2
  import { OrchestratorResult, MasterOrchestratorResult, Finding } from '../agent/types';
3
3
  import { DataEnvelope } from '../types/dataContract';
4
4
  import type { ComparisonReportSection } from '../agentv3/sessionStateSnapshot';
5
+ import type { ClaimVerificationResult } from '../types/claimVerification';
6
+ import type { ClaimSupportV1 } from '../types/evidenceContract';
7
+ import type { IdentityResolutionV1 } from '../types/identityContract';
5
8
  export interface ReportData {
6
9
  sessionId: string;
7
10
  traceId: string;
@@ -59,6 +62,9 @@ export interface AgentDrivenReportData {
59
62
  }>;
60
63
  conclusion: string;
61
64
  conclusionContract?: unknown;
65
+ claimSupport?: ClaimSupportV1[];
66
+ claimVerificationResult?: ClaimVerificationResult;
67
+ identityResolutions?: IdentityResolutionV1[];
62
68
  confidence: number;
63
69
  rounds: number;
64
70
  totalDurationMs: number;
@@ -355,7 +361,8 @@ export declare class HTMLReportGenerator {
355
361
  private renderCodeAwareReferencesSection;
356
362
  private formatLineRange;
357
363
  private renderConclusionClaimSourcesSection;
358
- private renderClaimReferenceRow;
364
+ private renderClaimVerificationSection;
365
+ private renderClaimReferenceSummaryItem;
359
366
  private buildClaimSourceLookup;
360
367
  private claimSourceCombinedKey;
361
368
  private normalizeClaimSourceRef;
@@ -1 +1 @@
1
- {"version":3,"file":"htmlReportGenerator.d.ts","sourceRoot":"","sources":["../../src/services/htmlReportGenerator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"htmlReportGenerator.d.ts","sourceRoot":"","sources":["../../src/services/htmlReportGenerator.ts"],"names":[],"mappings":"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"}
@@ -3710,6 +3710,18 @@ class HTMLReportGenerator {
3710
3710
  const agentResponses = data.agentResponses || [];
3711
3711
  const traceStartNs = data.traceStartNs ? this.parseNs(data.traceStartNs) : null;
3712
3712
  const normalizedConversationTimeline = this.normalizeConversationTimeline(conversationTimeline || [], dialogue || []);
3713
+ const partialWarningHtml = result.partial
3714
+ ? `
3715
+ <div class="section partial-warning">
3716
+ <h2 class="section-title">${(0, outputLanguage_1.localize)(outputLanguage, '结果完整性提示', 'Result Completeness Notice')}</h2>
3717
+ <div class="warning-card">
3718
+ <div class="warning-title">${(0, outputLanguage_1.localize)(outputLanguage, '本次分析结果已标记为部分完成', 'This analysis result is marked partial')}</div>
3719
+ <div class="warning-body">${this.escapeHtml(result.terminationMessage ||
3720
+ result.terminationReason ||
3721
+ (0, outputLanguage_1.localize)(outputLanguage, '分析已降级,结果可能不完整。', 'The analysis was degraded and may be incomplete.'))}</div>
3722
+ </div>
3723
+ </div>`
3724
+ : '';
3713
3725
  return `<!DOCTYPE html>
3714
3726
  <html lang="${htmlLang}">
3715
3727
  <head>
@@ -3843,6 +3855,14 @@ class HTMLReportGenerator {
3843
3855
  font-size: 11px; color: #475569; background: #e2e8f0; border-radius: 999px; padding: 2px 8px;
3844
3856
  }
3845
3857
  .claim-source-text { color: #1f2937; line-height: 1.5; }
3858
+ .claim-source-compact {
3859
+ list-style: none; margin: 0; padding: 0 12px 12px; display: grid; gap: 8px;
3860
+ }
3861
+ .claim-source-ref {
3862
+ display: flex; gap: 8px; align-items: flex-start; font-size: 12px; color: #334155; line-height: 1.45;
3863
+ }
3864
+ .claim-source-ref-text { min-width: 0; }
3865
+ .claim-source-ref-detail { color: #64748b; margin-top: 2px; word-break: break-word; }
3846
3866
  .claim-source-table { width: 100%; border-collapse: collapse; font-size: 12px; }
3847
3867
  .claim-source-table th {
3848
3868
  padding: 7px 9px; background: #f1f5f9; border-bottom: 1px solid #e2e8f0;
@@ -3982,17 +4002,21 @@ class HTMLReportGenerator {
3982
4002
  .answer-box h3, .finding-description h3 { margin: 10px 0 3px; font-size: 14px; color: #1f2937; }
3983
4003
  .answer-box h4, .finding-description h4 { margin: 8px 0 2px; font-size: 13.5px; color: #374151; }
3984
4004
  .answer-box h5, .finding-description h5 { margin: 6px 0 2px; font-size: 13px; color: #374151; font-weight: 600; }
3985
- .answer-box table, .finding-description table {
3986
- width: 100%; border-collapse: collapse; margin: 6px 0; font-size: 13px;
3987
- }
4005
+ .answer-box table, .finding-description table {
4006
+ width: 100%; border-collapse: collapse; margin: 6px 0; font-size: 13px;
4007
+ }
3988
4008
  .answer-box th, .finding-description th {
3989
4009
  padding: 6px 10px; border: 1px solid #e2e8f0; text-align: left;
3990
4010
  font-weight: 600; color: #374151; background: #f8fafc;
3991
4011
  }
3992
- .answer-box td, .finding-description td {
3993
- padding: 5px 10px; border: 1px solid #e2e8f0;
3994
- }
3995
- </style>
4012
+ .answer-box td, .finding-description td {
4013
+ padding: 5px 10px; border: 1px solid #e2e8f0;
4014
+ }
4015
+ .partial-warning { border-left: 4px solid #f59e0b; }
4016
+ .warning-card { background: #fffbeb; border: 1px solid #fde68a; border-radius: 8px; padding: 14px 16px; color: #78350f; }
4017
+ .warning-title { font-weight: 700; margin-bottom: 6px; }
4018
+ .warning-body { font-size: 14px; line-height: 1.5; white-space: pre-wrap; }
4019
+ </style>
3996
4020
  </head>
3997
4021
  <body>
3998
4022
  <div class="container">
@@ -4008,8 +4032,9 @@ class HTMLReportGenerator {
4008
4032
  <span class="report-save-status" id="report-save-status"></span>
4009
4033
  </div>
4010
4034
  </div>
4035
+ ${partialWarningHtml}
4011
4036
 
4012
- <div class="section">
4037
+ <div class="section">
4013
4038
  <h2 class="section-title">${(0, outputLanguage_1.localize)(outputLanguage, '执行概览', 'Execution Overview')}</h2>
4014
4039
  <div class="metrics">
4015
4040
  <div class="metric-card">
@@ -4089,6 +4114,8 @@ class HTMLReportGenerator {
4089
4114
 
4090
4115
  ${this.renderConclusionClaimSourcesSection(result.conclusionContract, dataEnvelopes, outputLanguage)}
4091
4116
 
4117
+ ${this.renderClaimVerificationSection(result.claimSupport, result.claimVerificationResult, result.identityResolutions, outputLanguage)}
4118
+
4092
4119
  <div class="footer">
4093
4120
  <p>${(0, outputLanguage_1.localize)(outputLanguage, '由 SmartPerfetto Agent-Driven Orchestrator 生成', 'Generated by SmartPerfetto Agent-Driven Orchestrator')}</p>
4094
4121
  <p style="margin-top: 5px; font-size: 12px;">Powered by Claude Agent SDK + MCP Tools</p>
@@ -4396,8 +4423,12 @@ class HTMLReportGenerator {
4396
4423
  if (claims.length === 0)
4397
4424
  return '';
4398
4425
  const sourceLookup = this.buildClaimSourceLookup(envelopes, outputLanguage);
4399
- const maxClaims = 30;
4400
- const maxReferencesPerClaim = 6;
4426
+ const metadata = this.asReportRecord(contractRecord.metadata);
4427
+ const derivedFromNarrativeEvidenceMatch = metadata?.derivedFromNarrativeEvidenceMatch === true ||
4428
+ metadata?.claimDerivation === 'narrative_evidence_match' ||
4429
+ metadata?.claimVerificationScope === 'sampled_narrative_evidence';
4430
+ const maxClaims = 3;
4431
+ const maxReferencesPerClaim = 1;
4401
4432
  const visibleClaims = claims.slice(0, maxClaims);
4402
4433
  const omittedClaims = claims.length - visibleClaims.length;
4403
4434
  const claimCards = visibleClaims.map((claim, index) => {
@@ -4415,23 +4446,10 @@ class HTMLReportGenerator {
4415
4446
  const idLabel = [claimId, conclusionId].filter(Boolean).join(' / ');
4416
4447
  const referencesHtml = visibleReferences.length
4417
4448
  ? `
4418
- <table class="claim-source-table">
4419
- <thead>
4420
- <tr>
4421
- <th>${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '来源', 'Source'))}</th>
4422
- <th>${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '定位', 'Locator'))}</th>
4423
- <th>${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '列和值', 'Column / Value'))}</th>
4424
- <th>${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '状态', 'Status'))}</th>
4425
- </tr>
4426
- </thead>
4427
- <tbody>
4428
- ${visibleReferences.map(ref => this.renderClaimReferenceRow(ref, sourceLookup, outputLanguage)).join('')}
4429
- ${omittedReferences > 0 ? `
4430
- <tr>
4431
- <td colspan="4">${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, `还有 ${omittedReferences} 条引用未展开`, `${omittedReferences} more references omitted`))}</td>
4432
- </tr>` : ''}
4433
- </tbody>
4434
- </table>`
4449
+ <ul class="claim-source-compact">
4450
+ ${visibleReferences.map(ref => this.renderClaimReferenceSummaryItem(ref, sourceLookup, outputLanguage)).join('')}
4451
+ ${omittedReferences > 0 ? `<li class="claim-source-ref"><span class="claim-source-ref-detail">${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, `还有 ${omittedReferences} 条引用未展开`, `${omittedReferences} more references omitted`))}</span></li>` : ''}
4452
+ </ul>`
4435
4453
  : `<div class="empty-state">${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '该断言没有结构化数据引用', 'This claim has no structured data references'))}</div>`;
4436
4454
  return `
4437
4455
  <div class="claim-source-card">
@@ -4444,15 +4462,83 @@ class HTMLReportGenerator {
4444
4462
  }).join('');
4445
4463
  return `
4446
4464
  <div class="section">
4447
- <h2 class="section-title">${(0, outputLanguage_1.localize)(outputLanguage, '逐句数据引用', 'Claim Data References')}</h2>
4465
+ <h2 class="section-title">${(0, outputLanguage_1.localize)(outputLanguage, '证据引用摘要', 'Evidence Reference Summary')}</h2>
4448
4466
  <div class="claim-source-note">
4449
- ${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '以下内容来自已生成的结构化结论契约,用于把结论断言对齐到报告中的数据表、摘要或工具输出;不会再次调用模型。', 'The entries below come from the generated structured conclusion contract and map each claim to report tables, summaries, or tool outputs; no additional model call is made.'))}
4467
+ ${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, derivedFromNarrativeEvidenceMatch
4468
+ ? `以下为抽样证据摘要:展示 ${visibleClaims.length}/${claims.length} 条自动匹配断言,每条最多 ${maxReferencesPerClaim} 个来源;完整机器可读契约保留在报告数据中。`
4469
+ : `以下为证据摘要:展示 ${visibleClaims.length}/${claims.length} 条结构化断言,每条最多 ${maxReferencesPerClaim} 个来源;完整机器可读契约保留在报告数据中。`, derivedFromNarrativeEvidenceMatch
4470
+ ? `Sampled evidence summary: showing ${visibleClaims.length}/${claims.length} automatically matched claims with at most ${maxReferencesPerClaim} sources each; the full machine-readable contract remains in the report data.`
4471
+ : `Evidence summary: showing ${visibleClaims.length}/${claims.length} structured claims with at most ${maxReferencesPerClaim} sources each; the full machine-readable contract remains in the report data.`))}
4450
4472
  </div>
4451
4473
  ${claimCards}
4452
4474
  ${omittedClaims > 0 ? `<div class="claim-source-note">${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, `还有 ${omittedClaims} 条断言未展开`, `${omittedClaims} more claims omitted`))}</div>` : ''}
4453
4475
  </div>`;
4454
4476
  }
4455
- renderClaimReferenceRow(ref, sourceLookup, outputLanguage) {
4477
+ renderClaimVerificationSection(claimSupport, verification, identityResolutions, outputLanguage = outputLanguage_1.DEFAULT_OUTPUT_LANGUAGE) {
4478
+ if (!verification && (!claimSupport || claimSupport.length === 0) && (!identityResolutions || identityResolutions.length === 0)) {
4479
+ return '';
4480
+ }
4481
+ const supportCounts = new Map();
4482
+ const supportStatuses = verification?.claimResults?.length
4483
+ ? verification.claimResults.map(claim => claim.status)
4484
+ : (claimSupport || []).map(claim => claim.supportLevel);
4485
+ for (const status of supportStatuses) {
4486
+ supportCounts.set(status, (supportCounts.get(status) || 0) + 1);
4487
+ }
4488
+ const supportSummary = Array.from(supportCounts.entries())
4489
+ .map(([key, count]) => `${this.escapeHtml(key)}: ${count}`)
4490
+ .join(' · ');
4491
+ const status = verification?.status || 'not_checked';
4492
+ const issueRows = (verification?.issues || []).slice(0, 12).map(issue => `
4493
+ <tr>
4494
+ <td>${this.escapeHtml(issue.severity)}</td>
4495
+ <td>${this.escapeHtml(issue.claimId)}</td>
4496
+ <td><code>${this.escapeHtml(issue.code)}</code></td>
4497
+ <td>${this.escapeHtml(issue.message)}</td>
4498
+ </tr>
4499
+ `).join('');
4500
+ const identitySummary = (identityResolutions || []).slice(0, 8).map(item => `
4501
+ <tr>
4502
+ <td><code>${this.escapeHtml(item.identityRefId)}</code></td>
4503
+ <td>${this.escapeHtml(item.status)}</td>
4504
+ <td>${this.escapeHtml(item.target.processName || item.target.packageName || '-')}</td>
4505
+ <td>${this.escapeHtml(item.target.threadName || item.target.role || '-')}</td>
4506
+ </tr>
4507
+ `).join('');
4508
+ return `
4509
+ <div class="section">
4510
+ <h2 class="section-title">${(0, outputLanguage_1.localize)(outputLanguage, '断言验证结果', 'Claim Verification')}</h2>
4511
+ <div class="claim-source-note">
4512
+ ${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, `Verifier 状态: ${status};检查断言 ${verification?.checkedClaimCount ?? 0} 条;不支持 ${verification?.unsupportedClaimCount ?? 0} 条${supportSummary ? `;支持级别 ${supportSummary}` : ''}`, `Verifier status: ${status}; checked ${verification?.checkedClaimCount ?? 0} claims; unsupported ${verification?.unsupportedClaimCount ?? 0}${supportSummary ? `; support levels ${supportSummary}` : ''}`))}
4513
+ </div>
4514
+ ${issueRows ? `
4515
+ <table class="claim-source-table">
4516
+ <thead>
4517
+ <tr>
4518
+ <th>${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '级别', 'Severity'))}</th>
4519
+ <th>${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '断言', 'Claim'))}</th>
4520
+ <th>${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '代码', 'Code'))}</th>
4521
+ <th>${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '说明', 'Message'))}</th>
4522
+ </tr>
4523
+ </thead>
4524
+ <tbody>${issueRows}</tbody>
4525
+ </table>` : ''}
4526
+ ${identitySummary ? `
4527
+ <div class="claim-source-note">${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '身份解析 Sidecar', 'Identity Resolution Sidecars'))}</div>
4528
+ <table class="claim-source-table">
4529
+ <thead>
4530
+ <tr>
4531
+ <th>${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, 'ID', 'ID'))}</th>
4532
+ <th>${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '状态', 'Status'))}</th>
4533
+ <th>${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '进程', 'Process'))}</th>
4534
+ <th>${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '线程', 'Thread'))}</th>
4535
+ </tr>
4536
+ </thead>
4537
+ <tbody>${identitySummary}</tbody>
4538
+ </table>` : ''}
4539
+ </div>`;
4540
+ }
4541
+ renderClaimReferenceSummaryItem(ref, sourceLookup, outputLanguage) {
4456
4542
  const evidenceRefId = this.readReportAliasedString(ref, [
4457
4543
  'evidenceRefId',
4458
4544
  'evidence_ref_id',
@@ -4496,25 +4582,26 @@ class HTMLReportGenerator {
4496
4582
  sourceRef ? `${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '模型标签', 'Model label'))}: <code>${this.escapeHtml(sourceRef)}</code>` : '',
4497
4583
  matchedSource && !isAmbiguousSource ? `${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '报告来源', 'Report source'))}: ${this.escapeHtml(matchedSource.label)}` : '',
4498
4584
  matchedSource && isAmbiguousSource ? `${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '报告来源', 'Report source'))}: ${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, `匹配到 ${matchedSource.count} 个来源,需补充更精确的工具调用 ID`, `${matchedSource.count} sources matched; add a more specific tool call ID`))}` : '',
4499
- evidenceRefId ? `${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '证据 ID', 'Evidence ID'))}: <code>${this.escapeHtml(evidenceRefId)}</code>` : '',
4500
- sourceToolCallId ? `${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '工具调用', 'Tool call'))}: <code>${this.escapeHtml(sourceToolCallId)}</code>` : '',
4585
+ !sourceRef && !matchedSource && (evidenceRefId || sourceToolCallId) ? this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '机器 ID 已记录,完整 ID 见报告数据', 'Machine IDs recorded in report data')) : '',
4501
4586
  ].filter(Boolean);
4502
4587
  const column = this.readReportAliasedString(ref, ['column', 'col']);
4503
4588
  const value = this.readReportAliasedValue(ref, ['value']);
4504
4589
  const valueText = value === undefined
4505
4590
  ? ''
4506
- : this.stringifyValueForDisplay(value, 160);
4507
- const columnValueParts = [
4508
- column ? `${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '列', 'Column'))}: <code>${this.escapeHtml(column)}</code>` : '',
4509
- valueText ? `${this.escapeHtml((0, outputLanguage_1.localize)(outputLanguage, '', 'Value'))}: <code>${this.escapeHtml(valueText)}</code>` : '',
4591
+ : this.stringifyValueForDisplay(value, 80);
4592
+ const locator = this.formatClaimReferenceLocator(ref, outputLanguage);
4593
+ const detailParts = [
4594
+ locator && locator !== '-' ? this.escapeHtml(locator) : '',
4595
+ column ? `<code>${this.escapeHtml(column)}</code>${valueText ? `=${this.escapeHtml(valueText)}` : ''}` : '',
4510
4596
  ].filter(Boolean);
4511
4597
  return `
4512
- <tr>
4513
- <td>${sourceParts.length ? sourceParts.map(part => `<div>${part}</div>`).join('') : '-'}</td>
4514
- <td>${this.escapeHtml(this.formatClaimReferenceLocator(ref, outputLanguage))}</td>
4515
- <td>${columnValueParts.length ? columnValueParts.map(part => `<div>${part}</div>`).join('') : '-'}</td>
4516
- <td><span class="claim-source-status ${statusClass}">${this.escapeHtml(statusLabel)}</span></td>
4517
- </tr>`;
4598
+ <li class="claim-source-ref">
4599
+ <span class="claim-source-status ${statusClass}">${this.escapeHtml(statusLabel)}</span>
4600
+ <span class="claim-source-ref-text">
4601
+ ${sourceParts.length ? sourceParts.map(part => `<span>${part}</span>`).join(' · ') : '-'}
4602
+ ${detailParts.length ? `<div class="claim-source-ref-detail">${detailParts.join(' · ')}</div>` : ''}
4603
+ </span>
4604
+ </li>`;
4518
4605
  }
4519
4606
  buildClaimSourceLookup(envelopes, outputLanguage) {
4520
4607
  const byEvidenceAndTool = new Map();