oh-my-knowledge 0.0.1 → 0.18.0

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 (215) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +537 -332
  3. package/dist/src/analysis/coverage-analyzer.d.ts +57 -0
  4. package/dist/src/analysis/coverage-analyzer.d.ts.map +1 -0
  5. package/dist/src/analysis/coverage-analyzer.js +262 -0
  6. package/dist/src/analysis/coverage-analyzer.js.map +1 -0
  7. package/dist/src/analysis/gap-analyzer.d.ts +114 -0
  8. package/dist/src/analysis/gap-analyzer.d.ts.map +1 -0
  9. package/dist/src/analysis/gap-analyzer.js +439 -0
  10. package/dist/src/analysis/gap-analyzer.js.map +1 -0
  11. package/dist/src/analysis/hedging-classifier.d.ts +34 -0
  12. package/dist/src/analysis/hedging-classifier.d.ts.map +1 -0
  13. package/dist/src/analysis/hedging-classifier.js +144 -0
  14. package/dist/src/analysis/hedging-classifier.js.map +1 -0
  15. package/dist/src/analysis/report-diagnostics.d.ts +9 -0
  16. package/dist/src/analysis/report-diagnostics.d.ts.map +1 -0
  17. package/dist/src/analysis/report-diagnostics.js +631 -0
  18. package/dist/src/analysis/report-diagnostics.js.map +1 -0
  19. package/dist/src/authoring/evolver.d.ts +64 -0
  20. package/dist/src/authoring/evolver.d.ts.map +1 -0
  21. package/dist/src/authoring/evolver.js +275 -0
  22. package/dist/src/authoring/evolver.js.map +1 -0
  23. package/dist/src/authoring/generator.d.ts +13 -0
  24. package/dist/src/authoring/generator.d.ts.map +1 -0
  25. package/dist/src/authoring/generator.js +60 -0
  26. package/dist/src/authoring/generator.js.map +1 -0
  27. package/dist/src/cli.d.ts +3 -0
  28. package/dist/src/cli.d.ts.map +1 -0
  29. package/dist/src/cli.js +1004 -0
  30. package/dist/src/cli.js.map +1 -0
  31. package/dist/src/eval-core/cache.d.ts +11 -0
  32. package/dist/src/eval-core/cache.d.ts.map +1 -0
  33. package/dist/src/eval-core/cache.js +53 -0
  34. package/dist/src/eval-core/cache.js.map +1 -0
  35. package/dist/src/eval-core/ci-gates.d.ts +17 -0
  36. package/dist/src/eval-core/ci-gates.d.ts.map +1 -0
  37. package/dist/src/eval-core/ci-gates.js +42 -0
  38. package/dist/src/eval-core/ci-gates.js.map +1 -0
  39. package/dist/src/eval-core/dependency-checker.d.ts +37 -0
  40. package/dist/src/eval-core/dependency-checker.d.ts.map +1 -0
  41. package/dist/src/eval-core/dependency-checker.js +280 -0
  42. package/dist/src/eval-core/dependency-checker.js.map +1 -0
  43. package/dist/src/eval-core/evaluation-execution.d.ts +26 -0
  44. package/dist/src/eval-core/evaluation-execution.d.ts.map +1 -0
  45. package/dist/src/eval-core/evaluation-execution.js +196 -0
  46. package/dist/src/eval-core/evaluation-execution.js.map +1 -0
  47. package/dist/src/eval-core/evaluation-job.d.ts +48 -0
  48. package/dist/src/eval-core/evaluation-job.d.ts.map +1 -0
  49. package/dist/src/eval-core/evaluation-job.js +112 -0
  50. package/dist/src/eval-core/evaluation-job.js.map +1 -0
  51. package/dist/src/eval-core/evaluation-reporting.d.ts +28 -0
  52. package/dist/src/eval-core/evaluation-reporting.d.ts.map +1 -0
  53. package/dist/src/eval-core/evaluation-reporting.js +123 -0
  54. package/dist/src/eval-core/evaluation-reporting.js.map +1 -0
  55. package/dist/src/eval-core/execution-strategy.d.ts +11 -0
  56. package/dist/src/eval-core/execution-strategy.d.ts.map +1 -0
  57. package/dist/src/eval-core/execution-strategy.js +121 -0
  58. package/dist/src/eval-core/execution-strategy.js.map +1 -0
  59. package/dist/src/eval-core/fact-checker.d.ts +25 -0
  60. package/dist/src/eval-core/fact-checker.d.ts.map +1 -0
  61. package/dist/src/eval-core/fact-checker.js +66 -0
  62. package/dist/src/eval-core/fact-checker.js.map +1 -0
  63. package/dist/src/eval-core/schema.d.ts +30 -0
  64. package/dist/src/eval-core/schema.d.ts.map +1 -0
  65. package/dist/src/eval-core/schema.js +195 -0
  66. package/dist/src/eval-core/schema.js.map +1 -0
  67. package/dist/src/eval-core/statistics.d.ts +86 -0
  68. package/dist/src/eval-core/statistics.d.ts.map +1 -0
  69. package/dist/src/eval-core/statistics.js +210 -0
  70. package/dist/src/eval-core/statistics.js.map +1 -0
  71. package/dist/src/eval-core/task-planner.d.ts +4 -0
  72. package/dist/src/eval-core/task-planner.d.ts.map +1 -0
  73. package/dist/src/eval-core/task-planner.js +33 -0
  74. package/dist/src/eval-core/task-planner.js.map +1 -0
  75. package/dist/src/eval-workflows/each-evaluation-workflow.d.ts +133 -0
  76. package/dist/src/eval-workflows/each-evaluation-workflow.d.ts.map +1 -0
  77. package/dist/src/eval-workflows/each-evaluation-workflow.js +169 -0
  78. package/dist/src/eval-workflows/each-evaluation-workflow.js.map +1 -0
  79. package/dist/src/eval-workflows/evaluation-pipeline.d.ts +38 -0
  80. package/dist/src/eval-workflows/evaluation-pipeline.d.ts.map +1 -0
  81. package/dist/src/eval-workflows/evaluation-pipeline.js +214 -0
  82. package/dist/src/eval-workflows/evaluation-pipeline.js.map +1 -0
  83. package/dist/src/eval-workflows/evaluation-preparation.d.ts +64 -0
  84. package/dist/src/eval-workflows/evaluation-preparation.d.ts.map +1 -0
  85. package/dist/src/eval-workflows/evaluation-preparation.js +90 -0
  86. package/dist/src/eval-workflows/evaluation-preparation.js.map +1 -0
  87. package/dist/src/eval-workflows/run-evaluation.d.ts +105 -0
  88. package/dist/src/eval-workflows/run-evaluation.d.ts.map +1 -0
  89. package/dist/src/eval-workflows/run-evaluation.js +264 -0
  90. package/dist/src/eval-workflows/run-evaluation.js.map +1 -0
  91. package/dist/src/executors/anthropic-api.d.ts +3 -0
  92. package/dist/src/executors/anthropic-api.d.ts.map +1 -0
  93. package/dist/src/executors/anthropic-api.js +43 -0
  94. package/dist/src/executors/anthropic-api.js.map +1 -0
  95. package/dist/src/executors/claude-cli.d.ts +3 -0
  96. package/dist/src/executors/claude-cli.d.ts.map +1 -0
  97. package/dist/src/executors/claude-cli.js +103 -0
  98. package/dist/src/executors/claude-cli.js.map +1 -0
  99. package/dist/src/executors/claude-sdk-trace.d.ts +10 -0
  100. package/dist/src/executors/claude-sdk-trace.d.ts.map +1 -0
  101. package/dist/src/executors/claude-sdk-trace.js +100 -0
  102. package/dist/src/executors/claude-sdk-trace.js.map +1 -0
  103. package/dist/src/executors/claude-sdk.d.ts +3 -0
  104. package/dist/src/executors/claude-sdk.d.ts.map +1 -0
  105. package/dist/src/executors/claude-sdk.js +160 -0
  106. package/dist/src/executors/claude-sdk.js.map +1 -0
  107. package/dist/src/executors/gemini.d.ts +3 -0
  108. package/dist/src/executors/gemini.d.ts.map +1 -0
  109. package/dist/src/executors/gemini.js +78 -0
  110. package/dist/src/executors/gemini.js.map +1 -0
  111. package/dist/src/executors/index.d.ts +7 -0
  112. package/dist/src/executors/index.d.ts.map +1 -0
  113. package/dist/src/executors/index.js +22 -0
  114. package/dist/src/executors/index.js.map +1 -0
  115. package/dist/src/executors/openai-api.d.ts +3 -0
  116. package/dist/src/executors/openai-api.d.ts.map +1 -0
  117. package/dist/src/executors/openai-api.js +40 -0
  118. package/dist/src/executors/openai-api.js.map +1 -0
  119. package/dist/src/executors/openai-cli.d.ts +3 -0
  120. package/dist/src/executors/openai-cli.d.ts.map +1 -0
  121. package/dist/src/executors/openai-cli.js +60 -0
  122. package/dist/src/executors/openai-cli.js.map +1 -0
  123. package/dist/src/executors/script.d.ts +3 -0
  124. package/dist/src/executors/script.d.ts.map +1 -0
  125. package/dist/src/executors/script.js +63 -0
  126. package/dist/src/executors/script.js.map +1 -0
  127. package/dist/src/executors/shared.d.ts +117 -0
  128. package/dist/src/executors/shared.d.ts.map +1 -0
  129. package/dist/src/executors/shared.js +49 -0
  130. package/dist/src/executors/shared.js.map +1 -0
  131. package/dist/src/grading/assertions.d.ts +18 -0
  132. package/dist/src/grading/assertions.d.ts.map +1 -0
  133. package/dist/src/grading/assertions.js +239 -0
  134. package/dist/src/grading/assertions.js.map +1 -0
  135. package/dist/src/grading/index.d.ts +26 -0
  136. package/dist/src/grading/index.d.ts.map +1 -0
  137. package/dist/src/grading/index.js +98 -0
  138. package/dist/src/grading/index.js.map +1 -0
  139. package/dist/src/grading/judge.d.ts +13 -0
  140. package/dist/src/grading/judge.d.ts.map +1 -0
  141. package/dist/src/grading/judge.js +98 -0
  142. package/dist/src/grading/judge.js.map +1 -0
  143. package/dist/src/grading/layered-scores.d.ts +13 -0
  144. package/dist/src/grading/layered-scores.d.ts.map +1 -0
  145. package/dist/src/grading/layered-scores.js +62 -0
  146. package/dist/src/grading/layered-scores.js.map +1 -0
  147. package/dist/src/inputs/eval-config.d.ts +13 -0
  148. package/dist/src/inputs/eval-config.d.ts.map +1 -0
  149. package/dist/src/inputs/eval-config.js +136 -0
  150. package/dist/src/inputs/eval-config.js.map +1 -0
  151. package/dist/src/inputs/load-samples.d.ts +16 -0
  152. package/dist/src/inputs/load-samples.d.ts.map +1 -0
  153. package/dist/src/inputs/load-samples.js +51 -0
  154. package/dist/src/inputs/load-samples.js.map +1 -0
  155. package/dist/src/inputs/mcp-resolver.d.ts +50 -0
  156. package/dist/src/inputs/mcp-resolver.d.ts.map +1 -0
  157. package/dist/src/inputs/mcp-resolver.js +307 -0
  158. package/dist/src/inputs/mcp-resolver.js.map +1 -0
  159. package/dist/src/inputs/skill-loader.d.ts +18 -0
  160. package/dist/src/inputs/skill-loader.d.ts.map +1 -0
  161. package/dist/src/inputs/skill-loader.js +222 -0
  162. package/dist/src/inputs/skill-loader.js.map +1 -0
  163. package/dist/src/inputs/url-fetcher.d.ts +19 -0
  164. package/dist/src/inputs/url-fetcher.d.ts.map +1 -0
  165. package/dist/src/inputs/url-fetcher.js +241 -0
  166. package/dist/src/inputs/url-fetcher.js.map +1 -0
  167. package/dist/src/observability/production-analyzer.d.ts +61 -0
  168. package/dist/src/observability/production-analyzer.d.ts.map +1 -0
  169. package/dist/src/observability/production-analyzer.js +183 -0
  170. package/dist/src/observability/production-analyzer.js.map +1 -0
  171. package/dist/src/observability/trace-adapter.d.ts +75 -0
  172. package/dist/src/observability/trace-adapter.d.ts.map +1 -0
  173. package/dist/src/observability/trace-adapter.js +341 -0
  174. package/dist/src/observability/trace-adapter.js.map +1 -0
  175. package/dist/src/renderer/html-renderer.d.ts +9 -0
  176. package/dist/src/renderer/html-renderer.d.ts.map +1 -0
  177. package/dist/src/renderer/html-renderer.js +338 -0
  178. package/dist/src/renderer/html-renderer.js.map +1 -0
  179. package/dist/src/renderer/layout.d.ts +13 -0
  180. package/dist/src/renderer/layout.d.ts.map +1 -0
  181. package/dist/src/renderer/layout.js +476 -0
  182. package/dist/src/renderer/layout.js.map +1 -0
  183. package/dist/src/renderer/skill-health-renderer.d.ts +20 -0
  184. package/dist/src/renderer/skill-health-renderer.d.ts.map +1 -0
  185. package/dist/src/renderer/skill-health-renderer.js +218 -0
  186. package/dist/src/renderer/skill-health-renderer.js.map +1 -0
  187. package/dist/src/renderer/summary.d.ts +21 -0
  188. package/dist/src/renderer/summary.d.ts.map +1 -0
  189. package/dist/src/renderer/summary.js +1072 -0
  190. package/dist/src/renderer/summary.js.map +1 -0
  191. package/dist/src/renderer/table.d.ts +3 -0
  192. package/dist/src/renderer/table.d.ts.map +1 -0
  193. package/dist/src/renderer/table.js +134 -0
  194. package/dist/src/renderer/table.js.map +1 -0
  195. package/dist/src/renderer/trends.d.ts +6 -0
  196. package/dist/src/renderer/trends.d.ts.map +1 -0
  197. package/dist/src/renderer/trends.js +127 -0
  198. package/dist/src/renderer/trends.js.map +1 -0
  199. package/dist/src/server/job-store.d.ts +4 -0
  200. package/dist/src/server/job-store.d.ts.map +1 -0
  201. package/dist/src/server/job-store.js +68 -0
  202. package/dist/src/server/job-store.js.map +1 -0
  203. package/dist/src/server/report-server.d.ts +16 -0
  204. package/dist/src/server/report-server.d.ts.map +1 -0
  205. package/dist/src/server/report-server.js +196 -0
  206. package/dist/src/server/report-server.js.map +1 -0
  207. package/dist/src/server/report-store.d.ts +44 -0
  208. package/dist/src/server/report-store.d.ts.map +1 -0
  209. package/dist/src/server/report-store.js +190 -0
  210. package/dist/src/server/report-store.js.map +1 -0
  211. package/dist/src/types.d.ts +553 -0
  212. package/dist/src/types.d.ts.map +1 -0
  213. package/dist/src/types.js +2 -0
  214. package/dist/src/types.js.map +1 -0
  215. package/package.json +44 -3
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Skill 健康度日报 renderer (v0.18).
3
+ *
4
+ * 输入: SkillHealthReport (from production-analyzer)
5
+ * 输出: 完整 HTML 文档, 包含:
6
+ * - 顶部摘要 (trace 源水印 + overall 健康度色带)
7
+ * - 每 skill 一张 card, 复用 v0.17 A 的 ki-card 左右栏 (coverage + gap)
8
+ * - 死代码 KB section (所有 skill 都没访问过的 KB 文件)
9
+ *
10
+ * 设计复用:
11
+ * - layout.ts 的整体 HTML skeleton + CSS (ki-card / ki-col / ki-bar 全部现成)
12
+ * - 报告视觉和 bench HTML 保持一致, 读者无学习成本切换
13
+ */
14
+ import { COLORS, e, layout } from './layout.js';
15
+ const HEALTH_BAND_COLOR = {
16
+ green: 'var(--green)',
17
+ yellow: 'var(--yellow)',
18
+ red: 'var(--red)',
19
+ };
20
+ const HEALTH_BAND_LABEL = {
21
+ green: { zh: '健康', en: 'Healthy' },
22
+ yellow: { zh: '待观察', en: 'Watch' },
23
+ red: { zh: '需关注', en: 'Attention needed' },
24
+ };
25
+ function fmtPct(rate, digits = 0) {
26
+ return `${(rate * 100).toFixed(digits)}%`;
27
+ }
28
+ function fmtTimeRange(from, to) {
29
+ if (!from || !to)
30
+ return '—';
31
+ const fromDate = new Date(from).toISOString().split('T')[0];
32
+ const toDate = new Date(to).toISOString().split('T')[0];
33
+ return fromDate === toDate ? fromDate : `${fromDate} → ${toDate}`;
34
+ }
35
+ /**
36
+ * 顶部摘要 + 水印 (spec §六 强制要求)。
37
+ */
38
+ function renderHeader(report, lang) {
39
+ const { meta, overall } = report;
40
+ const bandColor = HEALTH_BAND_COLOR[overall.healthBand];
41
+ const bandLabel = HEALTH_BAND_LABEL[overall.healthBand][lang === 'zh' ? 'zh' : 'en'];
42
+ const tracePath = e(meta.tracePath);
43
+ const kbPath = meta.kbPath ? e(meta.kbPath) : '—';
44
+ const timeRange = fmtTimeRange(meta.timeRange.from, meta.timeRange.to);
45
+ const warning = lang === 'zh'
46
+ ? '本报告仅反映指定时间窗内观察到的 skill 使用情况,不代表 skill 的绝对质量,也不能替代 offline eval 的对照验证。'
47
+ : 'Report reflects only observed skill usage in the given window. Does not imply absolute skill quality, does not replace offline eval.';
48
+ return `
49
+ <h1>${lang === 'zh' ? 'Skill 健康度日报' : 'Skill Health Daily'}</h1>
50
+ <p class="subtitle">${lang === 'zh' ? 'omk · 生产观察' : 'omk · Production Observability'}</p>
51
+
52
+ <div class="cards" style="margin-bottom:20px">
53
+ <div class="card" style="flex:0 0 auto;min-width:160px;border-left:4px solid ${bandColor}">
54
+ <div class="card-label">${lang === 'zh' ? '整体健康度' : 'Overall health'}</div>
55
+ <div class="card-value" style="color:${bandColor}">${bandLabel}</div>
56
+ <div class="card-sub">${lang === 'zh' ? '加权盲区' : 'weighted gap'} ${fmtPct(overall.weightedGapRate, 1)} · ${lang === 'zh' ? '原始盲区' : 'raw gap'} ${fmtPct(overall.gapRate, 1)}</div>
57
+ </div>
58
+ <div class="card">
59
+ <div class="card-label">${lang === 'zh' ? '会话 / 段 / 工具调用' : 'Sessions / Segments / Tool calls'}</div>
60
+ <div class="card-value" style="font-size:18px">${meta.sessionCount} / ${meta.segmentCount} / ${meta.toolCallCount}</div>
61
+ <div class="card-sub">${lang === 'zh' ? '工具失败率' : 'tool fail rate'} ${fmtPct(meta.toolFailureRate, 1)} · ${meta.messageCount.toLocaleString()} ${lang === 'zh' ? '条消息' : 'messages'}</div>
62
+ </div>
63
+ <div class="card">
64
+ <div class="card-label">${lang === 'zh' ? '时间窗' : 'Time window'}</div>
65
+ <div class="card-value" style="font-size:18px">${timeRange}</div>
66
+ <div class="card-sub">${lang === 'zh' ? '生成于' : 'generated'} ${new Date(meta.generatedAt).toISOString().split('T')[0]}</div>
67
+ </div>
68
+ </div>
69
+
70
+ <div style="padding:10px 14px;background:var(--info-bg);border-left:3px solid var(--accent);border-radius:var(--radius);margin-bottom:20px;font-size:12px;line-height:1.6">
71
+ <div style="color:var(--text-secondary);margin-bottom:4px"><strong>${lang === 'zh' ? '水印' : 'Watermark'}</strong> (spec §六)</div>
72
+ <div style="color:var(--text-muted);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px">
73
+ trace: ${tracePath}<br>
74
+ kb: ${kbPath}
75
+ </div>
76
+ <div style="color:var(--text-muted);margin-top:6px;font-style:italic">${warning}</div>
77
+ </div>
78
+ `.trim();
79
+ }
80
+ /**
81
+ * 每 skill 一张 card (复用 v0.17 A 的 ki-card 结构)。
82
+ */
83
+ function renderSkillCard(skill, variantColor, lang) {
84
+ const gap = skill.gap;
85
+ const cov = skill.coverage;
86
+ const gapPct = Math.round(gap.gapRate * 100);
87
+ const weightedPct = Math.round(gap.weightedGapRate * 100);
88
+ const gapColor = gapPct >= 30 ? 'var(--red)' : gapPct >= 10 ? 'var(--yellow)' : 'var(--green)';
89
+ const covPct = cov ? Math.round(cov.fileCoverageRate * 100) : 0;
90
+ const covColor = covPct >= 80 ? 'var(--green)' : covPct >= 50 ? 'var(--yellow)' : 'var(--red)';
91
+ // ─── 左栏: 使用量 + coverage ─────────────────────
92
+ const covInner = cov
93
+ ? `
94
+ <div class="ki-col-header">
95
+ <span class="ki-col-title">${lang === 'zh' ? '知识使用' : 'Knowledge used'}</span>
96
+ <span class="ki-col-value" style="color:${covColor}">${covPct}%</span>
97
+ </div>
98
+ <div class="ki-bar" role="progressbar" aria-valuenow="${covPct}" aria-valuemin="0" aria-valuemax="100" aria-label="${lang === 'zh' ? '知识使用' : 'Knowledge used'}">
99
+ <div class="ki-bar-fill" style="width:${Math.max(2, covPct)}%;background:${covColor}"></div>
100
+ </div>
101
+ <div style="font-size:11px;color:var(--text-muted)">
102
+ ${cov.filesCovered} ${lang === 'zh' ? '命中' : 'hit'} · ${cov.filesTotal - cov.filesCovered} ${lang === 'zh' ? '未命中' : 'miss'} · ${cov.grepPatternsUsed} ${lang === 'zh' ? '次搜索' : 'searches'}
103
+ </div>
104
+ `
105
+ : `<div style="color:var(--text-muted);font-size:12px">${lang === 'zh' ? '(未提供 KB, 跳过 coverage)' : '(KB not provided, coverage skipped)'}</div>`;
106
+ // ─── 右栏: gap signals ────────────────────────
107
+ const softShare = gapPct - weightedPct;
108
+ const weightedHint = softShare >= 10
109
+ ? `<strong>${lang === 'zh' ? '加权盲区' : 'weighted gap'} ${weightedPct}%</strong> · ${softShare}% ${lang === 'zh' ? '为软信号(建议复核)' : 'soft signals (review)'}`
110
+ : `<strong>${lang === 'zh' ? '加权盲区' : 'weighted gap'} ${weightedPct}%</strong> · ${lang === 'zh' ? '以硬证据为主' : 'mostly hard evidence'}`;
111
+ const signalBadges = Object.entries(gap.byType)
112
+ .filter(([, n]) => n > 0)
113
+ .map(([k, n]) => {
114
+ const label = {
115
+ failed_search: lang === 'zh' ? '搜索未命中' : 'Search miss',
116
+ explicit_marker: lang === 'zh' ? '模型标记缺口' : 'Model-flagged gap',
117
+ hedging: lang === 'zh' ? '表达不确定' : 'Hedging',
118
+ repeated_failure: lang === 'zh' ? '反复未命中' : 'Repeated miss',
119
+ }[k] ?? k;
120
+ return `<span style="display:inline-block;padding:2px 8px;border-radius:var(--radius);background:var(--bg-card);font-size:var(--fs-micro);color:var(--text-secondary);margin:2px 4px 2px 0">${e(label)} × ${n}</span>`;
121
+ })
122
+ .join('');
123
+ const gapInner = `
124
+ <div class="ki-col-header">
125
+ <span class="ki-col-title">${lang === 'zh' ? '知识盲区' : 'Knowledge gaps'}</span>
126
+ <span class="ki-col-value" style="color:${gapColor}">${gapPct}%</span>
127
+ </div>
128
+ <div class="ki-bar" role="progressbar" aria-valuenow="${gapPct}" aria-valuemin="0" aria-valuemax="100" aria-label="${lang === 'zh' ? '知识盲区' : 'Knowledge gaps'}">
129
+ <div class="ki-bar-fill" style="width:${Math.max(2, gapPct)}%;background:${gapColor}"></div>
130
+ </div>
131
+ <div style="font-size:11px;color:var(--text-muted);margin-bottom:4px">${gap.samplesWithGap}/${gap.sampleCount} ${lang === 'zh' ? '段触发信号' : 'segments with signals'}</div>
132
+ <div style="font-size:var(--fs-detail);color:var(--text-secondary);margin-bottom:8px">${weightedHint}</div>
133
+ ${signalBadges ? `<div>${signalBadges}</div>` : ''}
134
+ `;
135
+ // ─── Card 结构 ───────────────────────────────
136
+ return `
137
+ <div class="ki-card" style="border-left:3px solid ${variantColor}">
138
+ <div class="ki-card-header">
139
+ <span class="ki-card-title">${e(skill.skillName)}</span>
140
+ <div class="ki-card-meta">
141
+ ${skill.segmentCount} ${lang === 'zh' ? '段' : 'segments'} · ${skill.toolCallCount} ${lang === 'zh' ? '次工具调用' : 'tool calls'} · ${skill.toolFailureCount} ${lang === 'zh' ? '失败' : 'failed'}
142
+ </div>
143
+ </div>
144
+ <div class="ki-columns">
145
+ <div class="ki-col">${covInner}</div>
146
+ <div class="ki-col">${gapInner}</div>
147
+ </div>
148
+ </div>
149
+ `.trim();
150
+ }
151
+ /**
152
+ * 死代码 KB section (所有 skill 都没访问过的 KB 文件)。
153
+ * 这是 skill-health 的独家洞察——告诉 KB 维护者哪些文件在生产中是死代码。
154
+ */
155
+ function renderDeadKbSection(report, lang) {
156
+ const skills = Object.values(report.bySkill);
157
+ if (skills.length === 0)
158
+ return '';
159
+ const coverages = skills.map((s) => s.coverage).filter((c) => c !== null);
160
+ if (coverages.length === 0)
161
+ return '';
162
+ // 所有 skill 的 accessed 集合取并集
163
+ const accessedSet = new Set();
164
+ for (const cov of coverages) {
165
+ for (const entry of cov.entries) {
166
+ if (entry.accessed)
167
+ accessedSet.add(entry.path);
168
+ }
169
+ }
170
+ const allEntries = coverages[0]?.entries ?? [];
171
+ const dead = allEntries.filter((entry) => !accessedSet.has(entry.path));
172
+ if (dead.length === 0)
173
+ return '';
174
+ const title = lang === 'zh' ? '死代码 KB (零访问)' : 'Dead KB (never accessed)';
175
+ const desc = lang === 'zh'
176
+ ? `本期共 ${allEntries.length} 个 KB 文件,其中 <strong>${dead.length}</strong> 个在所有 skill 里都没被访问过。建议审视这些文件是否仍有存在价值,或者测评集 / 生产使用场景是否还没覆盖到它们。`
177
+ : `Of ${allEntries.length} KB files this window, <strong>${dead.length}</strong> were never accessed by any skill. Review these for relevance or extend coverage.`;
178
+ const rows = dead.slice(0, 30).map((entry) => {
179
+ const typeTag = `<span style="font-size:10px;padding:1px 4px;border-radius:2px;background:var(--bg-card);color:var(--text-muted);margin-left:4px">${e(entry.type)}</span>`;
180
+ const lines = entry.lineCount ? `<span style="font-size:10px;color:var(--text-muted);margin-left:4px">${entry.lineCount}L</span>` : '';
181
+ return `<div style="padding:4px 0;font-size:12px;color:var(--text-muted);text-decoration:line-through;opacity:0.7">✗ <span style="word-break:break-all">${e(entry.path)}</span>${typeTag}${lines}</div>`;
182
+ }).join('');
183
+ const overflow = dead.length > 30
184
+ ? `<div style="font-size:var(--fs-micro);color:var(--text-muted);margin-top:6px">${lang === 'zh' ? '另' : '+'} ${dead.length - 30} ${lang === 'zh' ? '条未展示' : 'more'}</div>`
185
+ : '';
186
+ return `
187
+ <section style="margin-top:28px;padding-top:20px;border-top:1px solid var(--border)">
188
+ <h2>${title}</h2>
189
+ <p class="ki-desc">${desc}</p>
190
+ <div class="ki-card">
191
+ ${rows}
192
+ ${overflow}
193
+ </div>
194
+ </section>
195
+ `.trim();
196
+ }
197
+ /**
198
+ * 主入口: 生成完整 HTML。
199
+ */
200
+ export function renderSkillHealthReport(report, lang = 'zh') {
201
+ const title = lang === 'zh' ? 'Skill 健康度日报' : 'Skill Health Daily';
202
+ // 按 segmentCount 降序排(使用量大的 skill 在前)
203
+ const skillsSorted = Object.values(report.bySkill).sort((a, b) => b.segmentCount - a.segmentCount);
204
+ const cards = skillsSorted
205
+ .map((skill, i) => renderSkillCard(skill, COLORS[i % COLORS.length], lang))
206
+ .join('\n');
207
+ const body = [
208
+ renderHeader(report, lang),
209
+ `<section style="margin-top:28px">
210
+ <h2>${lang === 'zh' ? '各 skill 健康度' : 'Per-skill health'}</h2>
211
+ <p class="ki-desc">${lang === 'zh' ? '按使用量降序。每个 skill 的 coverage 和 gap 独立统计。' : 'Sorted by usage. Coverage and gap are independently computed per skill.'}</p>
212
+ ${cards}
213
+ </section>`,
214
+ renderDeadKbSection(report, lang),
215
+ ].filter(Boolean).join('\n');
216
+ return layout(title, body, lang);
217
+ }
218
+ //# sourceMappingURL=skill-health-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-health-renderer.js","sourceRoot":"","sources":["../../../src/renderer/skill-health-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,iBAAiB,GAA+C;IACpE,KAAK,EAAE,cAAc;IACrB,MAAM,EAAE,eAAe;IACvB,GAAG,EAAE,YAAY;CAClB,CAAC;AAEF,MAAM,iBAAiB,GAAmE;IACxF,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE;IAClC,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE;IAClC,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,kBAAkB,EAAE;CAC3C,CAAC;AAEF,SAAS,MAAM,CAAC,IAAY,EAAE,MAAM,GAAG,CAAC;IACtC,OAAO,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;AAC5C,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,EAAU;IAC5C,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;QAAE,OAAO,GAAG,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,MAAM,MAAM,EAAE,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,MAAyB,EAAE,IAAU;IACzD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IACjC,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrF,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAClD,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,IAAI,KAAK,IAAI;QAC3B,CAAC,CAAC,uEAAuE;QACzE,CAAC,CAAC,sIAAsI,CAAC;IAE3I,OAAO;QACD,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,oBAAoB;wBACpC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,gCAAgC;;;mFAGJ,SAAS;gCAC5D,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB;6CAC7B,SAAS,KAAK,SAAS;8BACtC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;;;gCAGjJ,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,kCAAkC;uDAC7C,IAAI,CAAC,YAAY,MAAM,IAAI,CAAC,YAAY,MAAM,IAAI,CAAC,aAAa;8BACzF,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU;;;gCAGzJ,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa;uDACd,SAAS;8BAClC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;;;;yEAKlD,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW;;eAE5F,SAAS;YACZ,MAAM;;4EAE0D,OAAO;;GAEhF,CAAC,IAAI,EAAE,CAAC;AACX,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,KAAkB,EAAE,YAAoB,EAAE,IAAU;IAC3E,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtB,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC;IAC/F,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC;IAE/F,+CAA+C;IAC/C,MAAM,QAAQ,GAAG,GAAG;QAClB,CAAC,CAAC;;mCAE6B,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB;gDAC5B,QAAQ,KAAK,MAAM;;4DAEP,MAAM,uDAAuD,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB;8CACpH,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,gBAAgB,QAAQ;;;QAGjF,GAAG,CAAC,YAAY,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,MAAM,GAAG,CAAC,gBAAgB,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU;;KAE5L;QACD,CAAC,CAAC,uDAAuD,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,qCAAqC,QAAQ,CAAC;IAEnJ,+CAA+C;IAC/C,MAAM,SAAS,GAAG,MAAM,GAAG,WAAW,CAAC;IACvC,MAAM,YAAY,GAAG,SAAS,IAAI,EAAE;QAClC,CAAC,CAAC,WAAW,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,IAAI,WAAW,gBAAgB,SAAS,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,uBAAuB,EAAE;QACzJ,CAAC,CAAC,WAAW,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,IAAI,WAAW,gBAAgB,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC;IACzI,MAAM,YAAY,GAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAA6B;SACzE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;SACxB,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;QACd,MAAM,KAAK,GAAG;YACZ,aAAa,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa;YACtD,eAAe,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB;YAC/D,OAAO,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;YAC5C,gBAAgB,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAC5D,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACV,OAAO,uLAAuL,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC;IACzN,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,MAAM,QAAQ,GAAG;;mCAEgB,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB;gDAC5B,QAAQ,KAAK,MAAM;;4DAEP,MAAM,uDAAuD,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB;8CACpH,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,gBAAgB,QAAQ;;4EAEb,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,WAAW,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB;4FAC1E,YAAY;MAClG,YAAY,CAAC,CAAC,CAAC,QAAQ,YAAY,QAAQ,CAAC,CAAC,CAAC,EAAE;GACnD,CAAC;IAEF,8CAA8C;IAC9C,OAAO;sDAC6C,YAAY;;oCAE9B,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;;UAE5C,KAAK,CAAC,YAAY,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,MAAM,KAAK,CAAC,aAAa,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,MAAM,KAAK,CAAC,gBAAgB,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ;;;;4BAItK,QAAQ;4BACR,QAAQ;;;GAGjC,CAAC,IAAI,EAAE,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,MAAyB,EAAE,IAAU;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACtG,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtC,4BAA4B;IAC5B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,KAAK,CAAC,QAAQ;gBAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IACD,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,0BAA0B,CAAC;IAC1E,MAAM,IAAI,GAAG,IAAI,KAAK,IAAI;QACxB,CAAC,CAAC,OAAO,UAAU,CAAC,MAAM,uBAAuB,IAAI,CAAC,MAAM,wEAAwE;QACpI,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,kCAAkC,IAAI,CAAC,MAAM,4FAA4F,CAAC;IACrK,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,oIAAoI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;QAC3K,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,wEAAwE,KAAK,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACvI,OAAO,mJAAmJ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,GAAG,KAAK,QAAQ,CAAC;IAC3M,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE;QAC/B,CAAC,CAAC,iFAAiF,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,QAAQ;QAC3K,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;UAEC,KAAK;yBACU,IAAI;;QAErB,IAAI;QACJ,QAAQ;;;GAGb,CAAC,IAAI,EAAE,CAAC;AACX,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAyB,EAAE,OAAa,IAAI;IAClF,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,oBAAoB,CAAC;IACnE,qCAAqC;IACrC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;IACnG,MAAM,KAAK,GAAG,YAAY;SACvB,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;SAC1E,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,IAAI,GAAG;QACX,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC;QAC1B;YACQ,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB;2BACnC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,yEAAyE;QACvJ,KAAK;eACE;QACX,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC;KAClC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7B,OAAO,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { AnalysisResult, GapReport, KnowledgeCoverage, Lang, VarianceData, VariantSummary } from '../types.js';
2
+ export declare function renderSummaryCards(variants: string[], summary: Record<string, VariantSummary>, lang: Lang, variance?: VarianceData): string;
3
+ export declare function renderVarianceComparisons(variance: VarianceData | undefined, lang: Lang, layeredStatsOpen?: boolean): string;
4
+ export declare function renderAnalysis(analysis: AnalysisResult | undefined, lang: Lang): string;
5
+ export declare function renderAgentOverview(variants: string[], summary: Record<string, VariantSummary>, lang: Lang): string;
6
+ export declare function renderCoverageSection(coverage: Record<string, KnowledgeCoverage> | undefined, lang: Lang): string;
7
+ /**
8
+ * Render the knowledge gap section: per-variant gap rate + mandatory test set
9
+ * watermark + signal classification + inventory of individual signals.
10
+ * See docs/knowledge-gap-signal-spec.md for the semantics.
11
+ */
12
+ /**
13
+ * Combined knowledge-interaction section: coverage + gap side-by-side per variant.
14
+ *
15
+ * v0.17 起替代原独立的 renderCoverageSection + renderGapSection。两者都是"测评集
16
+ * × 知识库交互"的产物(spec §二),分开展示会让读者只看一个指标得出误判结论。合并后
17
+ * 每个 variant 一张 card,左右两栏并排展示"用了多少"vs"撞了多少",形成完整诊断画像。
18
+ */
19
+ export declare function renderKnowledgeInteractionSection(coverage: Record<string, KnowledgeCoverage> | undefined, gapReports: Record<string, GapReport> | undefined, lang: Lang): string;
20
+ export declare function renderGapSection(gapReports: Record<string, GapReport> | undefined, lang: Lang): string;
21
+ //# sourceMappingURL=summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../../src/renderer/summary.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAyB,iBAAiB,EAAE,IAAI,EAAgD,YAAY,EAAoB,cAAc,EAAE,MAAM,aAAa,CAAC;AAE3M,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,MAAM,CA+L3I;AAiLD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,UAAQ,GAAG,MAAM,CAqR1H;AAkDD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAqDvF;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAwDnH;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,SAAS,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CA2EjH;AAED;;;;GAIG;AACH;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,SAAS,EACvD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,EACjD,IAAI,EAAE,IAAI,GACT,MAAM,CAoMR;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAqGtG"}