hydro-ai-helper 3.0.4 → 3.1.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 (69) hide show
  1. package/README.md +8 -0
  2. package/README_en.md +8 -0
  3. package/dist/benchmarks/testdataBenchmark.js +309 -0
  4. package/dist/benchmarks/testdataBenchmark.js.map +1 -0
  5. package/dist/benchmarks/testdataBenchmarkCases.js +204 -0
  6. package/dist/benchmarks/testdataBenchmarkCases.js.map +1 -0
  7. package/dist/benchmarks/testdataBenchmarkCli.js +312 -0
  8. package/dist/benchmarks/testdataBenchmarkCli.js.map +1 -0
  9. package/dist/constants/jailbreakRules.js +55 -39
  10. package/dist/constants/jailbreakRules.js.map +1 -1
  11. package/dist/handlers/adminConfigHandler.js +384 -32
  12. package/dist/handlers/adminConfigHandler.js.map +1 -1
  13. package/dist/handlers/adminHandler.js +10 -2
  14. package/dist/handlers/adminHandler.js.map +1 -1
  15. package/dist/handlers/studentHandler.js +319 -31
  16. package/dist/handlers/studentHandler.js.map +1 -1
  17. package/dist/handlers/teachingSummaryHandler.js +12 -1
  18. package/dist/handlers/teachingSummaryHandler.js.map +1 -1
  19. package/dist/handlers/testdataGenHandler.js +768 -37
  20. package/dist/handlers/testdataGenHandler.js.map +1 -1
  21. package/dist/index.js +47 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/models/featureStats.js +56 -2
  24. package/dist/models/featureStats.js.map +1 -1
  25. package/dist/models/jailbreakLog.js +481 -10
  26. package/dist/models/jailbreakLog.js.map +1 -1
  27. package/dist/models/testdataGenerationJob.js +280 -0
  28. package/dist/models/testdataGenerationJob.js.map +1 -0
  29. package/dist/services/effectivenessService.js +11 -1
  30. package/dist/services/effectivenessService.js.map +1 -1
  31. package/dist/services/goJudgeSandboxService.js +274 -15
  32. package/dist/services/goJudgeSandboxService.js.map +1 -1
  33. package/dist/services/migrationService.js +57 -15
  34. package/dist/services/migrationService.js.map +1 -1
  35. package/dist/services/openaiClient.js +56 -13
  36. package/dist/services/openaiClient.js.map +1 -1
  37. package/dist/services/outputSafetyService.js +38 -26
  38. package/dist/services/outputSafetyService.js.map +1 -1
  39. package/dist/services/promptService.js +160 -46
  40. package/dist/services/promptService.js.map +1 -1
  41. package/dist/services/safetyPenaltyService.js +84 -0
  42. package/dist/services/safetyPenaltyService.js.map +1 -0
  43. package/dist/services/teachingAnalysisService.js +3 -0
  44. package/dist/services/teachingAnalysisService.js.map +1 -1
  45. package/dist/services/telemetryService.js +10 -1
  46. package/dist/services/telemetryService.js.map +1 -1
  47. package/dist/services/testdataGenService.js +3436 -354
  48. package/dist/services/testdataGenService.js.map +1 -1
  49. package/dist/types/safety.js +3 -0
  50. package/dist/types/safety.js.map +1 -0
  51. package/frontend/admin/ConfigPanel.tsx +67 -160
  52. package/frontend/admin/JailbreakAnalyticsPanel.tsx +250 -0
  53. package/frontend/admin/JailbreakLogsViewer.tsx +605 -24
  54. package/frontend/admin/SafetyGovernancePanel.tsx +622 -0
  55. package/frontend/admin/configTypes.ts +81 -3
  56. package/frontend/components/AIHelperDashboard.tsx +32 -4
  57. package/frontend/components/ScoreboardTabContainer.tsx +13 -2
  58. package/frontend/generated/localeFallback.ts +483 -25
  59. package/frontend/student/AIAssistantPanel.tsx +50 -15
  60. package/frontend/student/hooks/useChatSession.ts +76 -6
  61. package/frontend/student/types.ts +49 -4
  62. package/frontend/teachingSummary/TeachingReviewPanel.tsx +295 -186
  63. package/frontend/teachingSummary/useTeachingReview.ts +11 -4
  64. package/frontend/teachingSummary/useTeachingSummary.ts +2 -0
  65. package/frontend/testdataGen/TestdataGenPanel.tsx +741 -84
  66. package/locales/en.yaml +242 -13
  67. package/locales/zh.yaml +241 -12
  68. package/package.json +3 -1
  69. package/frontend/test.page.ts +0 -91
package/README.md CHANGED
@@ -67,6 +67,7 @@
67
67
  - 支持传统题、LeetCode 风格函数题(自动生成 `template.py/java/cc` 与 `compile.sh`)与填空题(完善代码)
68
68
  - 可粘贴已有标准答案作为输出的唯一权威;`config.yaml` 评测配置确定性生成,写入后评测设置自动同步
69
69
  - 生成的每个代码文件(std.py、generator.py、validator.py 等)首行注明用途;全量预览、可编辑、勾选确认后才写入
70
+ - 使用统一的自适应生成流程,不按题目难度设置插件截止时间;任务会持续到完成、服务明确失败或用户主动取消。页面显示真实阶段、已用时间和后台心跳,可关闭或离开后再回来恢复进度或结果
70
71
  - ⚠️ 对模型能力非常敏感:请在场景模型中为「测试数据生成」配置最强模型;另有骨架模式(不调用 AI)兜底
71
72
  - **教学分析** — 从全班提交数据发现教学问题,生成可操作的教学建议
72
73
  - 8 维度规则引擎(常见错误 / 理解障碍 / 高危学生 / 进步趋势等)+ 错误签名聚类 + 时序行为模式分类
@@ -127,6 +128,11 @@ export ENCRYPTION_KEY="your-32-character-secret-key!!!" # 生成:openssl ran
127
128
  - `stable`(默认)— 只更新到正式发布版本(`vX.Y.Z` tag),经 GPG 签名校验。所有真实用户的服务器都应使用此通道。
128
129
  - `edge` — 跟踪 `main` 分支最新代码,**仅限维护者自己的测试服务器**。
129
130
 
131
+ `AI_HELPER_JAILBREAK_LOG_RETENTION_DAYS`(可选)— 安全策略拦截日志保留天数:
132
+
133
+ - 默认 `180` 天,可设置范围 `7`–`3650` 天
134
+ - 新日志从创建时起计算;历史日志从升级时起渐进过期,不会在部署时立即删除
135
+
130
136
  `AI_HELPER_TESTDATA_GENERATION_MODE`(可选)— 测试数据生成是否要求沙箱(`hydrojudge.sandbox_host`):
131
137
 
132
138
  - `auto`(默认)— 沙箱可达时实跑验证,不可达时降级直出并明确标注"未验证"
@@ -161,6 +167,8 @@ db.ai_plugin_install.updateOne(
161
167
 
162
168
  ## 更新日志
163
169
 
170
+ 完整版本记录见 [CHANGELOG.md](CHANGELOG.md),GitHub Release 仅展示对应版本的更新内容。
171
+
164
172
  <details open>
165
173
  <summary><b>v3.0.0</b> — 测试数据生成:沙箱实跑 + 双重验证</summary>
166
174
 
package/README_en.md CHANGED
@@ -67,6 +67,7 @@ A teaching-first AI tutoring plugin for [HydroOJ](https://github.com/hydro-dev/H
67
67
  - Supports traditional problems, LeetCode-style function problems (auto-generates `template.py/java/cc` and `compile.sh`) and fill-in-the-blank problems
68
68
  - Paste an existing reference solution as the single source of truth; `config.yaml` is built deterministically and judge settings sync automatically
69
69
  - Every generated code file (std.py, generator.py, validator.py, …) starts with a purpose comment; everything is previewed, editable and opt-in before writing
70
+ - Uses one adaptive generation pipeline with no plugin-imposed deadline based on problem difficulty. A task runs until completion, an explicit service failure, or user cancellation; the page shows real stages, elapsed time, and a background heartbeat, and restores progress or results when revisited
70
71
  - ⚠️ Highly sensitive to model capability: assign your strongest model to the Test Data Generation scenario; a skeleton mode (no AI) is available as fallback
71
72
  - **Teaching Analysis** — class-level insights from collective submission data
72
73
  - 8-dimension rule engine (common errors / comprehension gaps / at-risk students / progress trends, …) + error-signature clustering + temporal behavior patterns
@@ -127,6 +128,11 @@ export ENCRYPTION_KEY="your-32-character-secret-key!!!" # generate: openssl ra
127
128
  - `stable` (default) — updates only to official releases (`vX.Y.Z` tags), GPG-verified. Use on all real-user servers.
128
129
  - `edge` — tracks the latest `main` branch code; for the maintainer's own test server only.
129
130
 
131
+ `AI_HELPER_JAILBREAK_LOG_RETENTION_DAYS` (optional) — safety-interception log retention:
132
+
133
+ - Defaults to `180` days; accepted range is `7`–`3650` days
134
+ - New logs expire from creation time; legacy logs expire gradually from upgrade time instead of being deleted immediately during deployment
135
+
130
136
  `AI_HELPER_TESTDATA_GENERATION_MODE` (optional) — whether test data generation requires the sandbox (`hydrojudge.sandbox_host`):
131
137
 
132
138
  - `auto` (default) — verify in the sandbox when reachable; otherwise fall back to direct output clearly marked "unverified"
@@ -161,6 +167,8 @@ db.ai_plugin_install.updateOne(
161
167
 
162
168
  ## Changelog
163
169
 
170
+ See [CHANGELOG.md](CHANGELOG.md) for the complete version history. Each GitHub Release contains notes for that version only.
171
+
164
172
  <details open>
165
173
  <summary><b>v3.0.0</b> — Test data generation: sandbox execution + double verification</summary>
166
174
 
@@ -0,0 +1,309 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.evaluateTestdataBenchmarkPlan = evaluateTestdataBenchmarkPlan;
4
+ exports.runTestdataBenchmarkCase = runTestdataBenchmarkCase;
5
+ exports.runTestdataBenchmark = runTestdataBenchmark;
6
+ exports.summarizeTestdataBenchmark = summarizeTestdataBenchmark;
7
+ exports.formatTestdataBenchmarkSummary = formatTestdataBenchmarkSummary;
8
+ exports.createTestdataBenchmarkAggregateSnapshot = createTestdataBenchmarkAggregateSnapshot;
9
+ exports.parseTestdataBenchmarkReport = parseTestdataBenchmarkReport;
10
+ exports.compareTestdataBenchmarkReports = compareTestdataBenchmarkReports;
11
+ exports.formatTestdataBenchmarkComparison = formatTestdataBenchmarkComparison;
12
+ const testdataGenService_1 = require("../services/testdataGenService");
13
+ const HIDDEN_PROBE_BUDGET_MS = 120000;
14
+ function comparableOutput(value) {
15
+ return value.replace(/\r\n?/g, '\n').trimEnd();
16
+ }
17
+ function collectQualityGateFailures(benchmarkCase, plan) {
18
+ const failures = [];
19
+ if (plan.problemType !== 'traditional')
20
+ failures.push('模型把传统题误判为函数题');
21
+ if (plan.caseCount !== benchmarkCase.options.caseCount) {
22
+ failures.push(`正式测试点数量为 ${plan.caseCount},期望 ${benchmarkCase.options.caseCount}`);
23
+ }
24
+ const verification = plan.verification;
25
+ if (verification?.mode !== 'sandbox')
26
+ failures.push('未经过沙箱验证');
27
+ if (!verification?.sampleCheck
28
+ || verification.sampleCheck.total < 1
29
+ || verification.sampleCheck.passed !== verification.sampleCheck.total) {
30
+ failures.push('题面样例未全部通过');
31
+ }
32
+ if (!verification?.validator?.ran)
33
+ failures.push('VALIDATOR 未实际执行');
34
+ const stress = verification?.stressCheck;
35
+ if (!stress
36
+ || stress.skippedReason
37
+ || stress.compared !== stress.generated
38
+ || stress.agreed !== stress.compared) {
39
+ failures.push('独立小数据压力对拍未全部一致');
40
+ }
41
+ if (stress && stress.uniqueInputs < Math.ceil(stress.generated * 0.8)) {
42
+ failures.push(`压力数据唯一输入不足:${stress.uniqueInputs}/${stress.generated}`);
43
+ }
44
+ const caseInputs = plan.files.filter(file => file.kind === 'case-in');
45
+ const uniqueFormalInputs = new Set(caseInputs.map(file => comparableOutput(file.content))).size;
46
+ if (caseInputs.length > 1 && uniqueFormalInputs < Math.ceil(caseInputs.length * 0.75)) {
47
+ failures.push(`正式测试点多样性不足:${uniqueFormalInputs}/${caseInputs.length}`);
48
+ }
49
+ const machineCheckedKinds = new Set(['case-in', 'case-out', 'std', 'generator', 'brute', 'validator']);
50
+ const aiOnlyMachineFiles = plan.files.filter(file => machineCheckedKinds.has(file.kind) && file.origin === 'ai-only');
51
+ if (aiOnlyMachineFiles.length > 0) {
52
+ failures.push(`存在未经执行的关键文件:${aiOnlyMachineFiles.map(file => file.name).join('、')}`);
53
+ }
54
+ return failures;
55
+ }
56
+ async function evaluateTestdataBenchmarkPlan(benchmarkCase, plan, runner, signal) {
57
+ const qualityGateFailures = collectQualityGateFailures(benchmarkCase, plan);
58
+ const std = plan.files.find(file => file.name === 'std.py' && file.kind === 'std');
59
+ if (!std) {
60
+ qualityGateFailures.push('生成计划缺少可执行 std.py');
61
+ return { qualityGateFailures, probes: [] };
62
+ }
63
+ const inputs = benchmarkCase.hiddenProbes.map(probe => probe.input);
64
+ let details;
65
+ try {
66
+ details = await runner.runPythonBatchDetailed(std.content, inputs, {
67
+ cpuSeconds: 5,
68
+ deadlineAt: Date.now() + HIDDEN_PROBE_BUDGET_MS,
69
+ signal,
70
+ });
71
+ }
72
+ catch (err) {
73
+ if ((0, testdataGenService_1.isCancellation)(err))
74
+ throw err;
75
+ qualityGateFailures.push(`隐藏探针执行失败:${err instanceof Error ? err.message : String(err)}`);
76
+ return { qualityGateFailures, probes: [] };
77
+ }
78
+ if (details.length !== inputs.length) {
79
+ qualityGateFailures.push(`隐藏探针返回 ${details.length} 个结果,期望 ${inputs.length} 个`);
80
+ }
81
+ const probes = benchmarkCase.hiddenProbes.map((probe, index) => {
82
+ const detail = details[index];
83
+ const actual = detail?.stdout || '';
84
+ const passed = !!detail?.accepted
85
+ && comparableOutput(actual) === comparableOutput(probe.output);
86
+ return {
87
+ name: probe.name,
88
+ passed,
89
+ status: detail?.status || 'Missing Result',
90
+ expected: probe.output,
91
+ actual,
92
+ ...(!detail?.accepted && (detail?.stderr || detail?.error)
93
+ ? { error: detail.stderr || detail.error }
94
+ : {}),
95
+ };
96
+ });
97
+ const failedProbes = probes.filter(probe => !probe.passed);
98
+ if (failedProbes.length > 0) {
99
+ qualityGateFailures.push(`隐藏正确性探针失败:${failedProbes.map(probe => probe.name).join('、')}`);
100
+ }
101
+ return { qualityGateFailures, probes };
102
+ }
103
+ async function runTestdataBenchmarkCase(benchmarkCase, aiClient, runner, onProgress, signal) {
104
+ const startedAt = Date.now();
105
+ try {
106
+ const service = new testdataGenService_1.TestdataGenService(aiClient, {
107
+ sandboxRunner: runner,
108
+ mode: 'sandbox',
109
+ });
110
+ const plan = await service.generate({
111
+ problemTitle: benchmarkCase.title,
112
+ statementMarkdown: benchmarkCase.statementMarkdown,
113
+ options: { ...benchmarkCase.options, languages: [...benchmarkCase.options.languages] },
114
+ onProgress,
115
+ signal,
116
+ });
117
+ const evaluated = await evaluateTestdataBenchmarkPlan(benchmarkCase, plan, runner, signal);
118
+ return {
119
+ id: benchmarkCase.id,
120
+ title: benchmarkCase.title,
121
+ tags: [...benchmarkCase.tags],
122
+ passed: evaluated.qualityGateFailures.length === 0,
123
+ durationMs: Date.now() - startedAt,
124
+ usedModel: plan.usedModel,
125
+ tokenUsage: plan.tokenUsage,
126
+ qualityGateFailures: evaluated.qualityGateFailures,
127
+ probes: evaluated.probes,
128
+ verification: plan.verification,
129
+ };
130
+ }
131
+ catch (err) {
132
+ if ((0, testdataGenService_1.isCancellation)(err))
133
+ throw err;
134
+ const metadata = (0, testdataGenService_1.extractTestdataErrorMetadata)(err);
135
+ return {
136
+ id: benchmarkCase.id,
137
+ title: benchmarkCase.title,
138
+ tags: [...benchmarkCase.tags],
139
+ passed: false,
140
+ durationMs: Date.now() - startedAt,
141
+ failureStage: typeof metadata?.failureStage === 'string'
142
+ ? metadata.failureStage
143
+ : 'unclassified',
144
+ error: err instanceof Error ? err.message : String(err),
145
+ qualityGateFailures: [],
146
+ probes: [],
147
+ };
148
+ }
149
+ }
150
+ async function runTestdataBenchmark(cases, aiClient, runner, options = {}) {
151
+ const results = [];
152
+ for (let index = 0; index < cases.length; index++) {
153
+ const benchmarkCase = cases[index];
154
+ options.onCaseStart?.(benchmarkCase, index, cases.length);
155
+ const result = await runTestdataBenchmarkCase(benchmarkCase, aiClient, runner, event => options.onProgress?.(benchmarkCase, event), options.signal);
156
+ results.push(result);
157
+ options.onCaseComplete?.(result, index, cases.length);
158
+ }
159
+ return results;
160
+ }
161
+ function summarizeTestdataBenchmark(results) {
162
+ const passed = results.filter(result => result.passed).length;
163
+ const failureStages = {};
164
+ for (const result of results) {
165
+ if (result.passed)
166
+ continue;
167
+ const stage = result.failureStage
168
+ || (result.qualityGateFailures.some(item => item.includes('隐藏正确性探针'))
169
+ ? 'hidden_probe'
170
+ : 'quality_gate');
171
+ failureStages[stage] = (failureStages[stage] || 0) + 1;
172
+ }
173
+ return {
174
+ total: results.length,
175
+ passed,
176
+ failed: results.length - passed,
177
+ passRate: results.length > 0 ? passed / results.length : 0,
178
+ durationMs: results.reduce((sum, result) => sum + result.durationMs, 0),
179
+ totalTokens: results.reduce((sum, result) => sum + (result.tokenUsage?.totalTokens || 0), 0),
180
+ failureStages,
181
+ };
182
+ }
183
+ function formatTestdataBenchmarkSummary(results) {
184
+ const summary = summarizeTestdataBenchmark(results);
185
+ const lines = results.map(result => {
186
+ const seconds = (result.durationMs / 1000).toFixed(1);
187
+ const reason = result.passed
188
+ ? `hidden ${result.probes.filter(probe => probe.passed).length}/${result.probes.length}`
189
+ : result.error || result.qualityGateFailures.join(';') || result.failureStage || 'unknown';
190
+ return `${result.passed ? 'PASS' : 'FAIL'} ${result.id} ${seconds}s ${reason}`;
191
+ });
192
+ lines.push('', `Summary: ${summary.passed}/${summary.total} passed (${(summary.passRate * 100).toFixed(1)}%)`, `Duration: ${(summary.durationMs / 1000).toFixed(1)}s, tokens: ${summary.totalTokens}`);
193
+ if (Object.keys(summary.failureStages).length > 0) {
194
+ lines.push(`Failure stages: ${Object.entries(summary.failureStages).map(([key, value]) => `${key}=${value}`).join(', ')}`);
195
+ }
196
+ return lines.join('\n');
197
+ }
198
+ function createTestdataBenchmarkAggregateSnapshot(report) {
199
+ return {
200
+ schemaVersion: 1,
201
+ runId: report.runId,
202
+ completedAt: report.completedAt,
203
+ pluginVersion: report.pluginVersion,
204
+ ...(report.revision ? { revision: report.revision } : {}),
205
+ models: [...report.models],
206
+ summary: { ...report.summary, failureStages: { ...report.summary.failureStages } },
207
+ cases: report.results.map(result => ({
208
+ id: result.id,
209
+ passed: result.passed,
210
+ durationMs: result.durationMs,
211
+ totalTokens: result.tokenUsage?.totalTokens || 0,
212
+ ...(result.failureStage ? { failureStage: result.failureStage } : {}),
213
+ qualityGateFailureCount: result.qualityGateFailures.length,
214
+ hiddenProbesPassed: result.probes.filter(probe => probe.passed).length,
215
+ hiddenProbesTotal: result.probes.length,
216
+ })),
217
+ };
218
+ }
219
+ function parseTestdataBenchmarkReport(value) {
220
+ if (!value || typeof value !== 'object')
221
+ throw new Error('基准报告不是对象');
222
+ const report = value;
223
+ if (report.schemaVersion !== 1)
224
+ throw new Error(`不支持的基准报告版本:${String(report.schemaVersion)}`);
225
+ if (typeof report.runId !== 'string' || !report.runId)
226
+ throw new Error('基准报告缺少 runId');
227
+ if (typeof report.startedAt !== 'string' || typeof report.completedAt !== 'string') {
228
+ throw new Error('基准报告缺少运行时间');
229
+ }
230
+ if (typeof report.pluginVersion !== 'string' || !Array.isArray(report.models)) {
231
+ throw new Error('基准报告缺少插件版本或模型链');
232
+ }
233
+ if (!report.summary || typeof report.summary.passRate !== 'number' || !Array.isArray(report.results)) {
234
+ throw new Error('基准报告缺少汇总或题目结果');
235
+ }
236
+ for (const result of report.results) {
237
+ if (!result || typeof result.id !== 'string' || typeof result.passed !== 'boolean') {
238
+ throw new Error('基准报告包含非法题目结果');
239
+ }
240
+ }
241
+ return report;
242
+ }
243
+ function compareTestdataBenchmarkReports(baseline, current) {
244
+ const baselineById = new Map(baseline.results.map(result => [result.id, result]));
245
+ const currentById = new Map(current.results.map(result => [result.id, result]));
246
+ const ids = [...new Set([...baselineById.keys(), ...currentById.keys()])].sort();
247
+ const cases = ids.map(id => {
248
+ const before = baselineById.get(id);
249
+ const after = currentById.get(id);
250
+ if (!before)
251
+ return { id, change: 'added', currentPassed: after?.passed };
252
+ if (!after)
253
+ return { id, change: 'removed', baselinePassed: before.passed };
254
+ const change = !before.passed && after.passed ? 'improved'
255
+ : before.passed && !after.passed ? 'regressed'
256
+ : after.passed ? 'unchanged-pass' : 'unchanged-fail';
257
+ return {
258
+ id,
259
+ change,
260
+ baselinePassed: before.passed,
261
+ currentPassed: after.passed,
262
+ durationDeltaMs: after.durationMs - before.durationMs,
263
+ tokenDelta: (after.tokenUsage?.totalTokens || 0) - (before.tokenUsage?.totalTokens || 0),
264
+ };
265
+ });
266
+ const stages = new Set([
267
+ ...Object.keys(baseline.summary.failureStages),
268
+ ...Object.keys(current.summary.failureStages),
269
+ ]);
270
+ const failureStageDeltas = {};
271
+ for (const stage of [...stages].sort()) {
272
+ const delta = (current.summary.failureStages[stage] || 0)
273
+ - (baseline.summary.failureStages[stage] || 0);
274
+ if (delta !== 0)
275
+ failureStageDeltas[stage] = delta;
276
+ }
277
+ return {
278
+ baselineRunId: baseline.runId,
279
+ currentRunId: current.runId,
280
+ passRateDelta: current.summary.passRate - baseline.summary.passRate,
281
+ durationDeltaMs: current.summary.durationMs - baseline.summary.durationMs,
282
+ tokenDelta: current.summary.totalTokens - baseline.summary.totalTokens,
283
+ regressions: cases.filter(item => item.change === 'regressed').length,
284
+ improvements: cases.filter(item => item.change === 'improved').length,
285
+ failureStageDeltas,
286
+ cases,
287
+ };
288
+ }
289
+ function signed(value, suffix = '') {
290
+ return `${value >= 0 ? '+' : ''}${value}${suffix}`;
291
+ }
292
+ function formatTestdataBenchmarkComparison(comparison) {
293
+ const lines = [
294
+ `Compare: ${comparison.baselineRunId} -> ${comparison.currentRunId}`,
295
+ `Pass rate: ${signed(Number((comparison.passRateDelta * 100).toFixed(1)), 'pp')}`,
296
+ `Duration: ${signed(Number((comparison.durationDeltaMs / 1000).toFixed(1)), 's')}`,
297
+ `Tokens: ${signed(comparison.tokenDelta)}`,
298
+ `Cases: improvements=${comparison.improvements}, regressions=${comparison.regressions}`,
299
+ ];
300
+ for (const item of comparison.cases.filter(entry => entry.change === 'improved' || entry.change === 'regressed' || entry.change === 'added' || entry.change === 'removed')) {
301
+ lines.push(`${item.change.toUpperCase()} ${item.id}`);
302
+ }
303
+ if (Object.keys(comparison.failureStageDeltas).length > 0) {
304
+ lines.push(`Failure stage delta: ${Object.entries(comparison.failureStageDeltas)
305
+ .map(([stage, delta]) => `${stage}=${signed(delta)}`).join(', ')}`);
306
+ }
307
+ return lines.join('\n');
308
+ }
309
+ //# sourceMappingURL=testdataBenchmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testdataBenchmark.js","sourceRoot":"","sources":["../../src/benchmarks/testdataBenchmark.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TESTDATA_HARD_BENCHMARK_CASES = void 0;
4
+ exports.selectTestdataBenchmarkCases = selectTestdataBenchmarkCases;
5
+ const DEFAULT_OPTIONS = {
6
+ problemKind: 'traditional',
7
+ fillInMode: 'no',
8
+ caseCount: 8,
9
+ dataScale: 'auto',
10
+ languages: [],
11
+ };
12
+ /**
13
+ * 固定难题集:隐藏探针不放进题面,专门检测“ORACLE 与 BRUTE 一致但共同误读题意”。
14
+ * 题目均为传统题,确保基准可以直接执行生成计划中的 std.py。
15
+ */
16
+ exports.TESTDATA_HARD_BENCHMARK_CASES = [
17
+ {
18
+ id: 'xor-subarrays-less-than-k',
19
+ title: '子数组异或小于 K',
20
+ difficulty: 'hard',
21
+ tags: ['binary-trie', 'prefix-xor', 'counting'],
22
+ options: { ...DEFAULT_OPTIONS },
23
+ statementMarkdown: `# 子数组异或小于 K
24
+
25
+ 给定长度为 n 的非负整数数组 a 和非负整数 K。计算有多少个非空连续子数组,其所有元素的按位异或结果严格小于 K。
26
+
27
+ ## 输入格式
28
+
29
+ 第一行两个整数 n、K。第二行 n 个整数 a_1...a_n。
30
+
31
+ ## 输出格式
32
+
33
+ 输出满足条件的连续子数组数量。答案可能超过 32 位有符号整数范围。
34
+
35
+ ## 数据范围
36
+
37
+ - 1 <= n <= 200000
38
+ - 0 <= K < 2^31
39
+ - 0 <= a_i < 2^31
40
+
41
+ ## 样例
42
+
43
+ \`\`\`input1
44
+ 5 4
45
+ 1 2 3 4 5
46
+ \`\`\`
47
+
48
+ \`\`\`output1
49
+ 10
50
+ \`\`\`
51
+ `,
52
+ hiddenProbes: [
53
+ { name: 'K 为 0', input: '1 0\n0\n', output: '0\n' },
54
+ { name: '重复前缀异或', input: '4 8\n7 7 7 7\n', output: '10\n' },
55
+ { name: '严格小于边界', input: '6 3\n0 1 2 3 4 5\n', output: '12\n' },
56
+ { name: '高位混合', input: '8 16\n15 1 7 8 3 12 4 6\n', output: '36\n' },
57
+ ],
58
+ },
59
+ {
60
+ id: 'dynamic-connectivity-offline',
61
+ title: '带删除的动态连通性',
62
+ difficulty: 'hard',
63
+ tags: ['rollback-dsu', 'segment-tree-over-time', 'offline'],
64
+ options: { ...DEFAULT_OPTIONS },
65
+ statementMarkdown: `# 带删除的动态连通性
66
+
67
+ 有 n 个点,初始没有边。依次执行 q 个操作:
68
+
69
+ - ADD u v:加入无向边 (u,v),保证加入前该边不存在;
70
+ - DEL u v:删除无向边 (u,v),保证删除前该边存在;
71
+ - ASK u v:询问当前图中 u 与 v 是否连通。
72
+
73
+ ## 输入格式
74
+
75
+ 第一行两个整数 n、q。随后 q 行,每行是上述一种操作。
76
+
77
+ ## 输出格式
78
+
79
+ 对每个 ASK 输出一行:连通输出 Yes,否则输出 No。大小写必须完全一致。
80
+
81
+ ## 数据范围
82
+
83
+ - 1 <= n,q <= 200000
84
+ - 1 <= u,v <= n,u != v
85
+ - 图中同一时刻不存在重边
86
+
87
+ ## 样例
88
+
89
+ \`\`\`input1
90
+ 5 9
91
+ ADD 1 2
92
+ ADD 2 3
93
+ ASK 1 3
94
+ DEL 2 3
95
+ ASK 1 3
96
+ ADD 3 4
97
+ ADD 4 5
98
+ ASK 3 5
99
+ ASK 1 5
100
+ \`\`\`
101
+
102
+ \`\`\`output1
103
+ Yes
104
+ No
105
+ Yes
106
+ No
107
+ \`\`\`
108
+ `,
109
+ hiddenProbes: [
110
+ {
111
+ name: '单边反复加入删除',
112
+ input: '2 5\nASK 1 2\nADD 1 2\nASK 1 2\nDEL 1 2\nASK 1 2\n',
113
+ output: 'No\nYes\nNo\n',
114
+ },
115
+ {
116
+ name: '删除桥后由另一条链恢复',
117
+ input: '6 13\nADD 1 2\nADD 2 3\nADD 4 5\nASK 1 5\nADD 3 4\nASK 1 5\nDEL 2 3\nASK 1 5\nADD 2 6\nADD 6 5\nASK 1 4\nDEL 3 4\nASK 3 4\n',
118
+ output: 'No\nYes\nNo\nYes\nNo\n',
119
+ },
120
+ {
121
+ name: '路径与替代边交错',
122
+ input: '4 10\nADD 1 2\nADD 2 3\nADD 3 4\nASK 1 4\nDEL 2 3\nASK 1 4\nADD 1 4\nASK 2 3\nDEL 1 2\nASK 2 4\n',
123
+ output: 'Yes\nNo\nYes\nNo\n',
124
+ },
125
+ ],
126
+ },
127
+ {
128
+ id: 'range-flip-longest-ones',
129
+ title: '区间翻转与最长连续 1',
130
+ difficulty: 'hard',
131
+ tags: ['lazy-segment-tree', 'range-flip', 'range-query'],
132
+ options: { ...DEFAULT_OPTIONS },
133
+ statementMarkdown: `# 区间翻转与最长连续 1
134
+
135
+ 给定一个长度为 n 的 01 字符串,执行 q 个操作:
136
+
137
+ - FLIP l r:把闭区间 [l,r] 内所有位取反;
138
+ - QUERY l r:输出当前闭区间 [l,r] 内最长连续 1 的长度。
139
+
140
+ 下标从 1 开始,所有操作按输入顺序生效。
141
+
142
+ ## 输入格式
143
+
144
+ 第一行 n、q;第二行一个长度为 n 的 01 字符串;随后 q 行为操作。
145
+
146
+ ## 输出格式
147
+
148
+ 对每个 QUERY 输出一行整数。
149
+
150
+ ## 数据范围
151
+
152
+ - 1 <= n,q <= 200000
153
+ - 1 <= l <= r <= n
154
+
155
+ ## 样例
156
+
157
+ \`\`\`input1
158
+ 8 6
159
+ 00111001
160
+ QUERY 1 8
161
+ FLIP 2 7
162
+ QUERY 1 8
163
+ QUERY 3 6
164
+ FLIP 1 8
165
+ QUERY 1 8
166
+ \`\`\`
167
+
168
+ \`\`\`output1
169
+ 3
170
+ 3
171
+ 1
172
+ 3
173
+ \`\`\`
174
+ `,
175
+ hiddenProbes: [
176
+ {
177
+ name: '单点反复翻转',
178
+ input: '1 5\n0\nQUERY 1 1\nFLIP 1 1\nQUERY 1 1\nFLIP 1 1\nQUERY 1 1\n',
179
+ output: '0\n1\n0\n',
180
+ },
181
+ {
182
+ name: '跨段合并与局部查询',
183
+ input: '10 7\n1111100000\nQUERY 1 10\nFLIP 3 8\nQUERY 1 10\nQUERY 3 8\nFLIP 5 5\nQUERY 4 6\nQUERY 5 10\n',
184
+ output: '5\n3\n3\n2\n4\n',
185
+ },
186
+ {
187
+ name: '全区间与嵌套翻转',
188
+ input: '6 6\n010101\nFLIP 1 6\nQUERY 1 6\nFLIP 2 5\nQUERY 1 6\nFLIP 3 4\nQUERY 2 5\n',
189
+ output: '1\n2\n2\n',
190
+ },
191
+ ],
192
+ },
193
+ ];
194
+ function selectTestdataBenchmarkCases(ids = []) {
195
+ if (ids.length === 0)
196
+ return [...exports.TESTDATA_HARD_BENCHMARK_CASES];
197
+ const requested = new Set(ids);
198
+ const selected = exports.TESTDATA_HARD_BENCHMARK_CASES.filter(item => requested.has(item.id));
199
+ const missing = ids.filter(id => !selected.some(item => item.id === id));
200
+ if (missing.length > 0)
201
+ throw new Error(`未知基准题目:${missing.join('、')}`);
202
+ return [...selected];
203
+ }
204
+ //# sourceMappingURL=testdataBenchmarkCases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testdataBenchmarkCases.js","sourceRoot":"","sources":["../../src/benchmarks/testdataBenchmarkCases.ts"],"names":[],"mappings":"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"}