@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.
- package/dist/agent/agents/base/baseAgent.d.ts.map +1 -1
- package/dist/agent/agents/base/baseAgent.js +5 -1
- package/dist/agent/agents/base/baseAgent.js.map +1 -1
- package/dist/agent/context/enhancedSessionContext.d.ts +5 -0
- package/dist/agent/context/enhancedSessionContext.d.ts.map +1 -1
- package/dist/agent/context/enhancedSessionContext.js +13 -0
- package/dist/agent/context/enhancedSessionContext.js.map +1 -1
- package/dist/agent/core/conclusionContract.d.ts +23 -1
- package/dist/agent/core/conclusionContract.d.ts.map +1 -1
- package/dist/agent/core/conclusionGenerator.d.ts.map +1 -1
- package/dist/agent/core/conclusionGenerator.js +223 -27
- package/dist/agent/core/conclusionGenerator.js.map +1 -1
- package/dist/agent/core/executors/directSkillExecutor.d.ts.map +1 -1
- package/dist/agent/core/executors/directSkillExecutor.js +6 -12
- package/dist/agent/core/executors/directSkillExecutor.js.map +1 -1
- package/dist/agent/core/orchestratorTypes.d.ts +6 -0
- package/dist/agent/core/orchestratorTypes.d.ts.map +1 -1
- package/dist/agent/core/orchestratorTypes.js.map +1 -1
- package/dist/agent/experts/crossDomain/moduleExpertInvoker.d.ts.map +1 -1
- package/dist/agent/experts/crossDomain/moduleExpertInvoker.js +4 -1
- package/dist/agent/experts/crossDomain/moduleExpertInvoker.js.map +1 -1
- package/dist/agent/scene/sceneStage1Runner.d.ts +1 -1
- package/dist/agent/scene/sceneStage1Runner.d.ts.map +1 -1
- package/dist/agent/scene/sceneStage1Runner.js +1 -1
- package/dist/agent/scene/sceneStage1Runner.js.map +1 -1
- package/dist/agent/scene/sceneStoryService.d.ts +1 -1
- package/dist/agent/scene/sceneStoryService.d.ts.map +1 -1
- package/dist/agent/scene/sceneStoryService.js +4 -1
- package/dist/agent/scene/sceneStoryService.js.map +1 -1
- package/dist/agent/types/agentProtocol.d.ts.map +1 -1
- package/dist/agent/types/agentProtocol.js +4 -1
- package/dist/agent/types/agentProtocol.js.map +1 -1
- package/dist/agent/types.d.ts +7 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/agentOpenAI/openAiConfig.d.ts +2 -0
- package/dist/agentOpenAI/openAiConfig.d.ts.map +1 -1
- package/dist/agentOpenAI/openAiConfig.js +3 -0
- package/dist/agentOpenAI/openAiConfig.js.map +1 -1
- package/dist/agentOpenAI/openAiRuntime.d.ts +8 -0
- package/dist/agentOpenAI/openAiRuntime.d.ts.map +1 -1
- package/dist/agentOpenAI/openAiRuntime.js +293 -58
- package/dist/agentOpenAI/openAiRuntime.js.map +1 -1
- package/dist/agentRuntime/runtimeHealth.d.ts +1 -0
- package/dist/agentRuntime/runtimeHealth.d.ts.map +1 -1
- package/dist/agentv3/artifactStore.d.ts +5 -0
- package/dist/agentv3/artifactStore.d.ts.map +1 -1
- package/dist/agentv3/artifactStore.js +3 -0
- package/dist/agentv3/artifactStore.js.map +1 -1
- package/dist/agentv3/claudeMcpServer.d.ts.map +1 -1
- package/dist/agentv3/claudeMcpServer.js +125 -86
- package/dist/agentv3/claudeMcpServer.js.map +1 -1
- package/dist/agentv3/claudeRuntime.d.ts.map +1 -1
- package/dist/agentv3/claudeRuntime.js +147 -65
- package/dist/agentv3/claudeRuntime.js.map +1 -1
- package/dist/agentv3/claudeSseBridge.d.ts +6 -0
- package/dist/agentv3/claudeSseBridge.d.ts.map +1 -1
- package/dist/agentv3/claudeSseBridge.js +1 -0
- package/dist/agentv3/claudeSseBridge.js.map +1 -1
- package/dist/agentv3/sessionStateSnapshot.d.ts +23 -0
- package/dist/agentv3/sessionStateSnapshot.d.ts.map +1 -1
- package/dist/assistant/application/agentAnalyzeSessionService.d.ts +6 -0
- package/dist/assistant/application/agentAnalyzeSessionService.d.ts.map +1 -1
- package/dist/assistant/application/agentAnalyzeSessionService.js +9 -3
- package/dist/assistant/application/agentAnalyzeSessionService.js.map +1 -1
- package/dist/assistant/application/assistantApplicationService.d.ts.map +1 -1
- package/dist/assistant/application/assistantApplicationService.js +3 -1
- package/dist/assistant/application/assistantApplicationService.js.map +1 -1
- package/dist/cli-user/commands/report.js +64 -0
- package/dist/cli-user/commands/report.js.map +1 -1
- package/dist/cli-user/io/paths.d.ts +3 -0
- package/dist/cli-user/io/paths.d.ts.map +1 -1
- package/dist/cli-user/io/paths.js +6 -0
- package/dist/cli-user/io/paths.js.map +1 -1
- package/dist/cli-user/io/sessionStore.d.ts +1 -0
- package/dist/cli-user/io/sessionStore.d.ts.map +1 -1
- package/dist/cli-user/io/sessionStore.js +5 -0
- package/dist/cli-user/io/sessionStore.js.map +1 -1
- package/dist/cli-user/repl/renderer.d.ts +8 -0
- package/dist/cli-user/repl/renderer.d.ts.map +1 -1
- package/dist/cli-user/repl/renderer.js.map +1 -1
- package/dist/cli-user/services/cliAnalyzeService.d.ts +3 -0
- package/dist/cli-user/services/cliAnalyzeService.d.ts.map +1 -1
- package/dist/cli-user/services/cliAnalyzeService.js +103 -1
- package/dist/cli-user/services/cliAnalyzeService.js.map +1 -1
- package/dist/cli-user/services/turnPersistence.d.ts +0 -10
- package/dist/cli-user/services/turnPersistence.d.ts.map +1 -1
- package/dist/cli-user/services/turnPersistence.js +62 -0
- package/dist/cli-user/services/turnPersistence.js.map +1 -1
- package/dist/routes/agentReportRoutes.d.ts +1 -0
- package/dist/routes/agentReportRoutes.d.ts.map +1 -1
- package/dist/routes/agentReportRoutes.js +13 -2
- package/dist/routes/agentReportRoutes.js.map +1 -1
- package/dist/routes/agentResumeRoutes.d.ts.map +1 -1
- package/dist/routes/agentResumeRoutes.js +51 -5
- package/dist/routes/agentResumeRoutes.js.map +1 -1
- package/dist/routes/agentRoutes.d.ts.map +1 -1
- package/dist/routes/agentRoutes.js +524 -130
- package/dist/routes/agentRoutes.js.map +1 -1
- package/dist/scripts/verifyAgentSseScrolling.js +142 -2
- package/dist/scripts/verifyAgentSseScrolling.js.map +1 -1
- package/dist/services/agentEventStore.d.ts.map +1 -1
- package/dist/services/agentEventStore.js +13 -3
- package/dist/services/agentEventStore.js.map +1 -1
- package/dist/services/agentReportData.d.ts +3 -0
- package/dist/services/agentReportData.d.ts.map +1 -1
- package/dist/services/agentReportData.js.map +1 -1
- package/dist/services/agentResultNormalizer.d.ts +15 -3
- package/dist/services/agentResultNormalizer.d.ts.map +1 -1
- package/dist/services/agentResultNormalizer.js +344 -6
- package/dist/services/agentResultNormalizer.js.map +1 -1
- package/dist/services/analysisResultSnapshotPipeline.d.ts +3 -0
- package/dist/services/analysisResultSnapshotPipeline.d.ts.map +1 -1
- package/dist/services/analysisResultSnapshotPipeline.js +3 -0
- package/dist/services/analysisResultSnapshotPipeline.js.map +1 -1
- package/dist/services/analysisResultSnapshotStore.d.ts.map +1 -1
- package/dist/services/analysisResultSnapshotStore.js +34 -2
- package/dist/services/analysisResultSnapshotStore.js.map +1 -1
- package/dist/services/enterpriseSchema.d.ts.map +1 -1
- package/dist/services/enterpriseSchema.js +11 -0
- package/dist/services/enterpriseSchema.js.map +1 -1
- package/dist/services/evidence/evidenceContractBuilder.d.ts +11 -0
- package/dist/services/evidence/evidenceContractBuilder.d.ts.map +1 -0
- package/dist/services/evidence/evidenceContractBuilder.js +546 -0
- package/dist/services/evidence/evidenceContractBuilder.js.map +1 -0
- package/dist/services/finalResultQualityGate.d.ts +18 -0
- package/dist/services/finalResultQualityGate.d.ts.map +1 -0
- package/dist/services/finalResultQualityGate.js +283 -0
- package/dist/services/finalResultQualityGate.js.map +1 -0
- package/dist/services/htmlReportGenerator.d.ts +8 -1
- package/dist/services/htmlReportGenerator.d.ts.map +1 -1
- package/dist/services/htmlReportGenerator.js +129 -42
- package/dist/services/htmlReportGenerator.js.map +1 -1
- package/dist/services/persistAgentSession.d.ts +2 -0
- package/dist/services/persistAgentSession.d.ts.map +1 -1
- package/dist/services/persistAgentSession.js +17 -1
- package/dist/services/persistAgentSession.js.map +1 -1
- package/dist/services/processIdentity/identityContractMapper.d.ts +14 -0
- package/dist/services/processIdentity/identityContractMapper.d.ts.map +1 -0
- package/dist/services/processIdentity/identityContractMapper.js +135 -0
- package/dist/services/processIdentity/identityContractMapper.js.map +1 -0
- package/dist/services/processIdentity/types.d.ts +5 -0
- package/dist/services/processIdentity/types.d.ts.map +1 -1
- package/dist/services/processIdentity/types.js.map +1 -1
- package/dist/services/skillEngine/skillExecutor.d.ts +14 -2
- package/dist/services/skillEngine/skillExecutor.d.ts.map +1 -1
- package/dist/services/skillEngine/skillExecutor.js +133 -13
- package/dist/services/skillEngine/skillExecutor.js.map +1 -1
- package/dist/services/skillEngine/types.d.ts +2 -0
- package/dist/services/skillEngine/types.d.ts.map +1 -1
- package/dist/services/verifier/claimVerificationRunner.d.ts +20 -0
- package/dist/services/verifier/claimVerificationRunner.d.ts.map +1 -0
- package/dist/services/verifier/claimVerificationRunner.js +88 -0
- package/dist/services/verifier/claimVerificationRunner.js.map +1 -0
- package/dist/services/verifier/deterministicClaimVerifier.d.ts +8 -0
- package/dist/services/verifier/deterministicClaimVerifier.d.ts.map +1 -0
- package/dist/services/verifier/deterministicClaimVerifier.js +178 -0
- package/dist/services/verifier/deterministicClaimVerifier.js.map +1 -0
- package/dist/types/claimVerification.d.ts +38 -0
- package/dist/types/claimVerification.d.ts.map +1 -0
- package/dist/types/claimVerification.js +6 -0
- package/dist/types/claimVerification.js.map +1 -0
- package/dist/types/dataContract.d.ts +32 -0
- package/dist/types/dataContract.d.ts.map +1 -1
- package/dist/types/dataContract.js +7 -0
- package/dist/types/dataContract.js.map +1 -1
- package/dist/types/evidenceContract.d.ts +100 -0
- package/dist/types/evidenceContract.d.ts.map +1 -0
- package/dist/types/evidenceContract.js +6 -0
- package/dist/types/evidenceContract.js.map +1 -0
- package/dist/types/identityContract.d.ts +57 -0
- package/dist/types/identityContract.d.ts.map +1 -0
- package/dist/types/identityContract.js +6 -0
- package/dist/types/identityContract.js.map +1 -0
- package/dist/types/multiTraceComparison.d.ts +3 -0
- package/dist/types/multiTraceComparison.d.ts.map +1 -1
- package/package.json +3 -2
- package/skills/atomic/process_identity_resolver.skill.yaml +130 -1
- package/skills/atomic/process_slice_cpu_hotspots.skill.yaml +321 -0
- package/skills/atomic/startup_slow_reasons.skill.yaml +102 -17
- package/skills/composite/startup_analysis.skill.yaml +16 -0
- package/strategies/anr.strategy.md +2 -2
- package/strategies/game.strategy.md +1 -1
- package/strategies/general.strategy.md +1 -1
- package/strategies/prompt-openai-final-report-continuation-en.template.md +12 -0
- package/strategies/prompt-openai-final-report-continuation-zh.template.md +12 -0
- package/strategies/prompt-output-format.template.md +1 -1
- package/strategies/scrolling.strategy.md +1 -0
- 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":"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"}
|
|
@@ -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
|
|
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":"AAiBA,OAAO,EACL,eAAe,EACf,eAAe,EAGhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,OAAO,EAAyC,MAAM,gBAAgB,CAAC;AAC9H,OAAO,EACL,YAAY,EAIb,MAAM,uBAAuB,CAAC;AAG/B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;
|
|
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
|
-
|
|
3986
|
-
|
|
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
|
-
|
|
3993
|
-
|
|
3994
|
-
|
|
3995
|
-
|
|
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
|
-
|
|
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
|
|
4400
|
-
const
|
|
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
|
-
<
|
|
4419
|
-
|
|
4420
|
-
|
|
4421
|
-
|
|
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, '
|
|
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,
|
|
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
|
-
|
|
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 ?
|
|
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,
|
|
4507
|
-
const
|
|
4508
|
-
|
|
4509
|
-
|
|
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
|
-
<
|
|
4513
|
-
<
|
|
4514
|
-
<
|
|
4515
|
-
|
|
4516
|
-
|
|
4517
|
-
|
|
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();
|