@dommaker/harness 1.1.1 → 1.2.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 (348) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +2 -4
  3. package/bin/harness.js +12 -37
  4. package/dist/cli/commands/check.d.ts +2 -2
  5. package/dist/cli/commands/check.d.ts.map +1 -1
  6. package/dist/cli/commands/check.js +7 -32
  7. package/dist/cli/commands/check.js.map +1 -1
  8. package/dist/cli/commands/definitions.d.ts +2 -0
  9. package/dist/cli/commands/definitions.d.ts.map +1 -1
  10. package/dist/cli/commands/definitions.js.map +1 -1
  11. package/dist/cli/commands/init.d.ts.map +1 -1
  12. package/dist/cli/commands/init.js +6 -37
  13. package/dist/cli/commands/init.js.map +1 -1
  14. package/dist/cli/commands/knowledge.d.ts.map +1 -1
  15. package/dist/cli/commands/knowledge.js +1 -12
  16. package/dist/cli/commands/knowledge.js.map +1 -1
  17. package/dist/cli/commands/report.d.ts.map +1 -1
  18. package/dist/cli/commands/report.js +0 -2
  19. package/dist/cli/commands/report.js.map +1 -1
  20. package/dist/cli/commands/status.js +2 -2
  21. package/dist/cli/commands/status.js.map +1 -1
  22. package/dist/context/index.d.ts +9 -6
  23. package/dist/context/index.d.ts.map +1 -1
  24. package/dist/context/index.js +18 -20
  25. package/dist/context/index.js.map +1 -1
  26. package/dist/core/constraints/capabilities-parser.d.ts +3 -2
  27. package/dist/core/constraints/capabilities-parser.d.ts.map +1 -1
  28. package/dist/core/constraints/capabilities-parser.js +25 -47
  29. package/dist/core/constraints/capabilities-parser.js.map +1 -1
  30. package/dist/core/constraints/checker.d.ts +29 -32
  31. package/dist/core/constraints/checker.d.ts.map +1 -1
  32. package/dist/core/constraints/checker.js +34 -126
  33. package/dist/core/constraints/checker.js.map +1 -1
  34. package/dist/core/constraints/checkers/index.d.ts +2 -1
  35. package/dist/core/constraints/checkers/index.d.ts.map +1 -1
  36. package/dist/core/constraints/checkers/index.js +3 -0
  37. package/dist/core/constraints/checkers/index.js.map +1 -1
  38. package/dist/core/constraints/checkers/types.d.ts +25 -0
  39. package/dist/core/constraints/checkers/types.d.ts.map +1 -1
  40. package/dist/core/constraints/checkers/types.js +24 -0
  41. package/dist/core/constraints/checkers/types.js.map +1 -1
  42. package/dist/core/constraints/definitions/guidelines.d.ts.map +1 -1
  43. package/dist/core/constraints/definitions/guidelines.js +0 -2
  44. package/dist/core/constraints/definitions/guidelines.js.map +1 -1
  45. package/dist/core/constraints/definitions/prompts.d.ts.map +1 -1
  46. package/dist/core/constraints/definitions/prompts.js +0 -5
  47. package/dist/core/constraints/definitions/prompts.js.map +1 -1
  48. package/dist/core/constraints/index.d.ts +1 -2
  49. package/dist/core/constraints/index.d.ts.map +1 -1
  50. package/dist/core/constraints/index.js +1 -7
  51. package/dist/core/constraints/index.js.map +1 -1
  52. package/dist/core/constraints/usage-report.d.ts +1 -2
  53. package/dist/core/constraints/usage-report.d.ts.map +1 -1
  54. package/dist/core/constraints/usage-report.js +2 -5
  55. package/dist/core/constraints/usage-report.js.map +1 -1
  56. package/dist/core/effective-constraints.d.ts +24 -4
  57. package/dist/core/effective-constraints.d.ts.map +1 -1
  58. package/dist/core/effective-constraints.js +28 -7
  59. package/dist/core/effective-constraints.js.map +1 -1
  60. package/dist/core/effective-set.d.ts +30 -0
  61. package/dist/core/effective-set.d.ts.map +1 -0
  62. package/dist/core/effective-set.js +35 -0
  63. package/dist/core/effective-set.js.map +1 -0
  64. package/dist/core/index.d.ts +13 -6
  65. package/dist/core/index.d.ts.map +1 -1
  66. package/dist/core/index.js +44 -21
  67. package/dist/core/index.js.map +1 -1
  68. package/dist/core/project-config-loader.d.ts +3 -6
  69. package/dist/core/project-config-loader.d.ts.map +1 -1
  70. package/dist/core/project-config-loader.js +47 -61
  71. package/dist/core/project-config-loader.js.map +1 -1
  72. package/dist/failure/constraint-handler.d.ts +1 -1
  73. package/dist/failure/constraint-handler.js +1 -1
  74. package/dist/gates/checker-gate.d.ts +1 -4
  75. package/dist/gates/checker-gate.d.ts.map +1 -1
  76. package/dist/gates/checker-gate.js +3 -11
  77. package/dist/gates/checker-gate.js.map +1 -1
  78. package/dist/gates/definitions.d.ts +9 -38
  79. package/dist/gates/definitions.d.ts.map +1 -1
  80. package/dist/gates/definitions.js +24 -13
  81. package/dist/gates/definitions.js.map +1 -1
  82. package/dist/gates/effective-gates.d.ts.map +1 -1
  83. package/dist/gates/effective-gates.js +14 -18
  84. package/dist/gates/effective-gates.js.map +1 -1
  85. package/dist/gates/index.d.ts +1 -1
  86. package/dist/gates/index.d.ts.map +1 -1
  87. package/dist/gates/index.js.map +1 -1
  88. package/dist/hooks/bootstrap.d.ts.map +1 -1
  89. package/dist/hooks/bootstrap.js +0 -3
  90. package/dist/hooks/bootstrap.js.map +1 -1
  91. package/dist/index.d.ts +43 -60
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +180 -143
  94. package/dist/index.js.map +1 -1
  95. package/dist/knowledge/query.d.ts +15 -0
  96. package/dist/knowledge/query.d.ts.map +1 -1
  97. package/dist/knowledge/query.js +23 -0
  98. package/dist/knowledge/query.js.map +1 -1
  99. package/dist/monitoring/analyzer-base.d.ts +0 -4
  100. package/dist/monitoring/analyzer-base.d.ts.map +1 -1
  101. package/dist/monitoring/analyzer-base.js +0 -21
  102. package/dist/monitoring/analyzer-base.js.map +1 -1
  103. package/dist/monitoring/index.d.ts +6 -12
  104. package/dist/monitoring/index.d.ts.map +1 -1
  105. package/dist/monitoring/index.js +13 -29
  106. package/dist/monitoring/index.js.map +1 -1
  107. package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
  108. package/dist/monitoring/trace-analyzer.js +2 -68
  109. package/dist/monitoring/trace-analyzer.js.map +1 -1
  110. package/dist/monitoring/traces.d.ts +0 -4
  111. package/dist/monitoring/traces.d.ts.map +1 -1
  112. package/dist/monitoring/traces.js +0 -14
  113. package/dist/monitoring/traces.js.map +1 -1
  114. package/dist/presets/index.d.ts +2 -2
  115. package/dist/presets/index.d.ts.map +1 -1
  116. package/dist/presets/index.js +3 -4
  117. package/dist/presets/index.js.map +1 -1
  118. package/dist/presets/standard.d.ts +10 -22
  119. package/dist/presets/standard.d.ts.map +1 -1
  120. package/dist/presets/standard.js +15 -75
  121. package/dist/presets/standard.js.map +1 -1
  122. package/dist/types/constraint.d.ts +1 -29
  123. package/dist/types/constraint.d.ts.map +1 -1
  124. package/dist/types/constraint.js +1 -1
  125. package/dist/types/constraint.js.map +1 -1
  126. package/dist/types/index.d.ts +0 -3
  127. package/dist/types/index.d.ts.map +1 -1
  128. package/dist/types/index.js +0 -4
  129. package/dist/types/index.js.map +1 -1
  130. package/dist/types/project-config.d.ts +4 -8
  131. package/dist/types/project-config.d.ts.map +1 -1
  132. package/dist/types/trace.d.ts +5 -18
  133. package/dist/types/trace.d.ts.map +1 -1
  134. package/package.json +2 -2
  135. package/src/CONTEXT.md +4 -5
  136. package/src/__tests__/checker-extra.test.ts +33 -139
  137. package/src/__tests__/checker.test.ts +0 -376
  138. package/src/__tests__/project-config-loader-extra.test.ts +42 -29
  139. package/src/__tests__/public-exports.test.ts +138 -0
  140. package/src/__tests__/trace-analyzer-extra.test.ts +6 -86
  141. package/src/__tests__/trace-analyzer.test.ts +4 -5
  142. package/src/__tests__/trace-collector.test.ts +0 -11
  143. package/src/__tests__/traces.test.ts +3 -22
  144. package/src/cli/commands/CONTEXT.md +2 -2
  145. package/src/cli/commands/__tests__/check-skip-output.test.ts +10 -7
  146. package/src/cli/commands/__tests__/check.test.ts +29 -69
  147. package/src/cli/commands/__tests__/constraints-report.test.ts +1 -1
  148. package/src/cli/commands/__tests__/knowledge.test.ts +90 -1
  149. package/src/cli/commands/__tests__/registry.test.ts +8 -6
  150. package/src/cli/commands/__tests__/status-extra.test.ts +6 -6
  151. package/src/cli/commands/__tests__/status.test.ts +6 -6
  152. package/src/cli/commands/check.ts +8 -34
  153. package/src/cli/commands/definitions.ts +2 -0
  154. package/src/cli/commands/init.ts +6 -37
  155. package/src/cli/commands/knowledge.ts +1 -16
  156. package/src/cli/commands/report.ts +0 -2
  157. package/src/cli/commands/status.ts +2 -2
  158. package/src/context/index.ts +29 -6
  159. package/src/core/CONTEXT.md +4 -3
  160. package/src/core/__tests__/effective-set.test.ts +80 -0
  161. package/src/core/constraints/capabilities-parser.ts +43 -49
  162. package/src/core/constraints/checker.ts +51 -145
  163. package/src/core/constraints/checkers/index.ts +2 -1
  164. package/src/core/constraints/checkers/types.ts +42 -0
  165. package/src/core/constraints/definitions/guidelines.ts +0 -2
  166. package/src/core/constraints/definitions/prompts.ts +0 -5
  167. package/src/core/constraints/index.ts +2 -17
  168. package/src/core/constraints/usage-report.ts +5 -8
  169. package/src/core/effective-constraints.ts +35 -7
  170. package/src/core/effective-set.ts +56 -0
  171. package/src/core/index.ts +80 -6
  172. package/src/core/project-config-loader.ts +53 -68
  173. package/src/failure/CONTEXT.md +1 -1
  174. package/src/failure/constraint-handler.ts +1 -1
  175. package/src/gates/CONTEXT.md +3 -3
  176. package/src/gates/checker-gate.ts +4 -12
  177. package/src/gates/definitions.ts +27 -50
  178. package/src/gates/effective-gates.ts +14 -21
  179. package/src/gates/index.ts +1 -1
  180. package/src/hooks/bootstrap.ts +0 -3
  181. package/src/index.ts +384 -148
  182. package/src/knowledge/CONTEXT.md +2 -2
  183. package/src/knowledge/__tests__/query.test.ts +64 -0
  184. package/src/knowledge/query.ts +28 -0
  185. package/src/monitoring/CONTEXT.md +7 -13
  186. package/src/monitoring/__tests__/traces.test.ts +0 -10
  187. package/src/monitoring/analyzer-base.ts +0 -22
  188. package/src/monitoring/index.ts +6 -12
  189. package/src/monitoring/trace-analyzer.ts +2 -73
  190. package/src/monitoring/traces.ts +0 -20
  191. package/src/presets/__tests__/standard.test.ts +48 -69
  192. package/src/presets/index.ts +3 -5
  193. package/src/presets/standard.ts +14 -79
  194. package/src/spec/CONTEXT.md +5 -13
  195. package/src/types/constraint.ts +1 -51
  196. package/src/types/index.ts +0 -12
  197. package/src/types/project-config.ts +4 -10
  198. package/src/types/trace.ts +5 -30
  199. package/dist/core/constraints/interceptor.d.ts +0 -39
  200. package/dist/core/constraints/interceptor.d.ts.map +0 -1
  201. package/dist/core/constraints/interceptor.js +0 -166
  202. package/dist/core/constraints/interceptor.js.map +0 -1
  203. package/dist/dashboard/data.d.ts +0 -31
  204. package/dist/dashboard/data.d.ts.map +0 -1
  205. package/dist/dashboard/data.js +0 -81
  206. package/dist/dashboard/data.js.map +0 -1
  207. package/dist/dashboard/index.d.ts +0 -4
  208. package/dist/dashboard/index.d.ts.map +0 -1
  209. package/dist/dashboard/index.js +0 -20
  210. package/dist/dashboard/index.js.map +0 -1
  211. package/dist/dashboard/stats.d.ts +0 -20
  212. package/dist/dashboard/stats.d.ts.map +0 -1
  213. package/dist/dashboard/stats.js +0 -115
  214. package/dist/dashboard/stats.js.map +0 -1
  215. package/dist/dashboard/types.d.ts +0 -110
  216. package/dist/dashboard/types.d.ts.map +0 -1
  217. package/dist/dashboard/types.js +0 -8
  218. package/dist/dashboard/types.js.map +0 -1
  219. package/dist/monitoring/constraint-doctor.d.ts +0 -76
  220. package/dist/monitoring/constraint-doctor.d.ts.map +0 -1
  221. package/dist/monitoring/constraint-doctor.js +0 -189
  222. package/dist/monitoring/constraint-doctor.js.map +0 -1
  223. package/dist/monitoring/diagnosis-rules.d.ts +0 -18
  224. package/dist/monitoring/diagnosis-rules.d.ts.map +0 -1
  225. package/dist/monitoring/diagnosis-rules.js +0 -119
  226. package/dist/monitoring/diagnosis-rules.js.map +0 -1
  227. package/dist/monitoring/knowledge-doctor.d.ts +0 -78
  228. package/dist/monitoring/knowledge-doctor.d.ts.map +0 -1
  229. package/dist/monitoring/knowledge-doctor.js +0 -266
  230. package/dist/monitoring/knowledge-doctor.js.map +0 -1
  231. package/dist/monitoring/knowledge-evolver.d.ts +0 -72
  232. package/dist/monitoring/knowledge-evolver.d.ts.map +0 -1
  233. package/dist/monitoring/knowledge-evolver.js +0 -205
  234. package/dist/monitoring/knowledge-evolver.js.map +0 -1
  235. package/dist/monitoring/performance-analyzer.d.ts +0 -92
  236. package/dist/monitoring/performance-analyzer.d.ts.map +0 -1
  237. package/dist/monitoring/performance-analyzer.js +0 -343
  238. package/dist/monitoring/performance-analyzer.js.map +0 -1
  239. package/dist/monitoring/performance-collector.d.ts +0 -103
  240. package/dist/monitoring/performance-collector.d.ts.map +0 -1
  241. package/dist/monitoring/performance-collector.js +0 -298
  242. package/dist/monitoring/performance-collector.js.map +0 -1
  243. package/dist/safety/index.d.ts +0 -6
  244. package/dist/safety/index.d.ts.map +0 -1
  245. package/dist/safety/index.js +0 -22
  246. package/dist/safety/index.js.map +0 -1
  247. package/dist/safety/input-guardrail.d.ts +0 -36
  248. package/dist/safety/input-guardrail.d.ts.map +0 -1
  249. package/dist/safety/input-guardrail.js +0 -118
  250. package/dist/safety/input-guardrail.js.map +0 -1
  251. package/dist/safety/output-guardrail.d.ts +0 -39
  252. package/dist/safety/output-guardrail.d.ts.map +0 -1
  253. package/dist/safety/output-guardrail.js +0 -147
  254. package/dist/safety/output-guardrail.js.map +0 -1
  255. package/dist/safety/sandbox.d.ts +0 -45
  256. package/dist/safety/sandbox.d.ts.map +0 -1
  257. package/dist/safety/sandbox.js +0 -134
  258. package/dist/safety/sandbox.js.map +0 -1
  259. package/dist/safety/tool-guardrail.d.ts +0 -51
  260. package/dist/safety/tool-guardrail.d.ts.map +0 -1
  261. package/dist/safety/tool-guardrail.js +0 -147
  262. package/dist/safety/tool-guardrail.js.map +0 -1
  263. package/dist/safety/types.d.ts +0 -104
  264. package/dist/safety/types.d.ts.map +0 -1
  265. package/dist/safety/types.js +0 -6
  266. package/dist/safety/types.js.map +0 -1
  267. package/dist/spec/annotation-checker.d.ts +0 -47
  268. package/dist/spec/annotation-checker.d.ts.map +0 -1
  269. package/dist/spec/annotation-checker.js +0 -279
  270. package/dist/spec/annotation-checker.js.map +0 -1
  271. package/dist/types/enforcement.d.ts +0 -42
  272. package/dist/types/enforcement.d.ts.map +0 -1
  273. package/dist/types/enforcement.js +0 -6
  274. package/dist/types/enforcement.js.map +0 -1
  275. package/dist/types/monitoring-types.d.ts +0 -53
  276. package/dist/types/monitoring-types.d.ts.map +0 -1
  277. package/dist/types/monitoring-types.js +0 -10
  278. package/dist/types/monitoring-types.js.map +0 -1
  279. package/dist/types/performance.d.ts +0 -204
  280. package/dist/types/performance.d.ts.map +0 -1
  281. package/dist/types/performance.js +0 -12
  282. package/dist/types/performance.js.map +0 -1
  283. package/dist/verification/index.d.ts +0 -4
  284. package/dist/verification/index.d.ts.map +0 -1
  285. package/dist/verification/index.js +0 -20
  286. package/dist/verification/index.js.map +0 -1
  287. package/dist/verification/loop.d.ts +0 -30
  288. package/dist/verification/loop.d.ts.map +0 -1
  289. package/dist/verification/loop.js +0 -114
  290. package/dist/verification/loop.js.map +0 -1
  291. package/dist/verification/rules-based.d.ts +0 -40
  292. package/dist/verification/rules-based.d.ts.map +0 -1
  293. package/dist/verification/rules-based.js +0 -130
  294. package/dist/verification/rules-based.js.map +0 -1
  295. package/dist/verification/types.d.ts +0 -69
  296. package/dist/verification/types.d.ts.map +0 -1
  297. package/dist/verification/types.js +0 -6
  298. package/dist/verification/types.js.map +0 -1
  299. package/src/__tests__/annotation-checker.test.ts +0 -183
  300. package/src/__tests__/constraint-doctor.test.ts +0 -271
  301. package/src/__tests__/doctor-extra.test.ts +0 -155
  302. package/src/__tests__/extend-exceptions.test.ts +0 -149
  303. package/src/__tests__/interceptor.test.ts +0 -89
  304. package/src/__tests__/performance-analyzer.test.ts +0 -499
  305. package/src/__tests__/performance-collector.test.ts +0 -276
  306. package/src/__tests__/presets.test.ts +0 -65
  307. package/src/core/constraints/__tests__/interceptor.test.ts +0 -267
  308. package/src/core/constraints/interceptor.ts +0 -217
  309. package/src/dashboard/CONTEXT.md +0 -21
  310. package/src/dashboard/__tests__/data.test.ts +0 -111
  311. package/src/dashboard/__tests__/stats.test.ts +0 -159
  312. package/src/dashboard/data.ts +0 -103
  313. package/src/dashboard/index.ts +0 -3
  314. package/src/dashboard/stats.ts +0 -127
  315. package/src/dashboard/types.ts +0 -130
  316. package/src/monitoring/__tests__/knowledge-doctor.test.ts +0 -278
  317. package/src/monitoring/__tests__/knowledge-evolver.test.ts +0 -368
  318. package/src/monitoring/__tests__/performance-analyzer.test.ts +0 -137
  319. package/src/monitoring/__tests__/performance-collector.test.ts +0 -331
  320. package/src/monitoring/constraint-doctor.ts +0 -228
  321. package/src/monitoring/diagnosis-rules.ts +0 -132
  322. package/src/monitoring/knowledge-doctor.ts +0 -322
  323. package/src/monitoring/knowledge-evolver.ts +0 -289
  324. package/src/monitoring/performance-analyzer.ts +0 -400
  325. package/src/monitoring/performance-collector.ts +0 -326
  326. package/src/safety/CONTEXT.md +0 -23
  327. package/src/safety/__tests__/input-guardrail.test.ts +0 -105
  328. package/src/safety/__tests__/output-guardrail.test.ts +0 -108
  329. package/src/safety/__tests__/sandbox.test.ts +0 -158
  330. package/src/safety/__tests__/tool-guardrail.test.ts +0 -127
  331. package/src/safety/index.ts +0 -5
  332. package/src/safety/input-guardrail.ts +0 -133
  333. package/src/safety/output-guardrail.ts +0 -170
  334. package/src/safety/sandbox.ts +0 -148
  335. package/src/safety/tool-guardrail.ts +0 -176
  336. package/src/safety/types.ts +0 -124
  337. package/src/spec/__tests__/annotation-checker.test.ts +0 -294
  338. package/src/spec/annotation-checker.ts +0 -320
  339. package/src/types/enforcement.ts +0 -48
  340. package/src/types/monitoring-types.ts +0 -68
  341. package/src/types/performance.ts +0 -295
  342. package/src/verification/CONTEXT.md +0 -23
  343. package/src/verification/__tests__/loop.test.ts +0 -303
  344. package/src/verification/__tests__/rules-based.test.ts +0 -240
  345. package/src/verification/index.ts +0 -3
  346. package/src/verification/loop.ts +0 -137
  347. package/src/verification/rules-based.ts +0 -152
  348. package/src/verification/types.ts +0 -81
@@ -1,170 +0,0 @@
1
- /**
2
- * 输出护栏
3
- *
4
- * 在最终输出前检查:
5
- * - 敏感信息审查(API keys, passwords, tokens)
6
- * - 代码质量检查
7
- * - 知识引用完整性
8
- */
9
-
10
- import type { OutputSafetyCheckResult, OutputViolation, OutputGuardrailConfig } from './types';
11
-
12
- const DEFAULT_SENSITIVE_PATTERNS: RegExp[] = [
13
- // API keys
14
- /(?:api[_-]?key|apikey)\s*[:=]\s*['"]?([a-zA-Z0-9_-]{20,})['"]?/gi,
15
- // AWS
16
- /(?:AKIA|ASIA)[A-Z0-9]{16}/g,
17
- // Generic secrets
18
- /(?:secret|password|passwd|token|auth)\s*[:=]\s*['"]?([^\s'"]{8,})['"]?/gi,
19
- // Private keys
20
- /-----BEGIN\s+(RSA\s+)?PRIVATE\s+KEY-----/g,
21
- // GitHub tokens
22
- /gh[ps]_[A-Za-z0-9_]{36,}/g,
23
- // Bearer tokens
24
- /Bearer\s+[A-Za-z0-9_\-.]{20,}/g,
25
- // Connection strings
26
- /(?:mongodb|postgres|mysql|redis):\/\/[^\s'"]+/gi,
27
- ];
28
-
29
- export class OutputGuardrail {
30
- private sensitivePatterns: RegExp[];
31
- private checkKnowledgeRefs: boolean;
32
-
33
- constructor(config?: OutputGuardrailConfig) {
34
- this.sensitivePatterns = config?.sensitivePatterns ?? DEFAULT_SENSITIVE_PATTERNS;
35
- this.checkKnowledgeRefs = config?.checkKnowledgeRefs ?? false;
36
- }
37
-
38
- /**
39
- * 检查输出安全性
40
- */
41
- check(content: string, knowledgeRefIds?: string[]): OutputSafetyCheckResult {
42
- const violations: OutputViolation[] = [];
43
-
44
- // 敏感信息检测
45
- violations.push(...this.checkSensitiveInfo(content));
46
-
47
- // 代码质量检查
48
- violations.push(...this.checkQuality(content));
49
-
50
- // 知识引用完整性
51
- if (this.checkKnowledgeRefs && knowledgeRefIds) {
52
- violations.push(...this.checkKnowledgeRefs_(
53
- content,
54
- knowledgeRefIds,
55
- ));
56
- }
57
-
58
- const sanitized = violations.length > 0
59
- ? this.sanitize(content, violations)
60
- : undefined;
61
-
62
- return {
63
- safe: violations.length === 0,
64
- violations,
65
- sanitizedContent: sanitized,
66
- };
67
- }
68
-
69
- /**
70
- * 检测敏感信息
71
- */
72
- private checkSensitiveInfo(content: string): OutputViolation[] {
73
- const violations: OutputViolation[] = [];
74
-
75
- for (const pattern of this.sensitivePatterns) {
76
- // Reset lastIndex for global patterns
77
- pattern.lastIndex = 0;
78
- let match: RegExpExecArray | null;
79
- while ((match = pattern.exec(content)) !== null) {
80
- const line = this.getLineNumber(content, match.index);
81
- violations.push({
82
- type: 'sensitive_info',
83
- severity: 'high',
84
- description: `检测到敏感信息: ${match[0].slice(0, 30)}...`,
85
- location: { line, column: match.index - content.lastIndexOf('\n', match.index) - 1 },
86
- matchedPattern: match[0],
87
- });
88
- }
89
- }
90
-
91
- return violations;
92
- }
93
-
94
- /**
95
- * 代码质量检查(简单启发式)
96
- */
97
- private checkQuality(content: string): OutputViolation[] {
98
- const violations: OutputViolation[] = [];
99
-
100
- // 检查 TODO/FIXME/HACK
101
- const todoPattern = /\b(TODO|FIXME|HACK|XXX)\b/gi;
102
- let match: RegExpExecArray | null;
103
- while ((match = todoPattern.exec(content)) !== null) {
104
- const line = this.getLineNumber(content, match.index);
105
- violations.push({
106
- type: 'quality',
107
- severity: 'low',
108
- description: `代码包含 ${match[1]} 标记`,
109
- location: { line, column: match.index - content.lastIndexOf('\n', match.index) - 1 },
110
- });
111
- }
112
-
113
- // 检查 console.log 残留
114
- const consolePattern = /console\.(log|debug|info)\(/g;
115
- while ((match = consolePattern.exec(content)) !== null) {
116
- const line = this.getLineNumber(content, match.index);
117
- violations.push({
118
- type: 'quality',
119
- severity: 'low',
120
- description: `代码包含 ${match[0].slice(0, -1)} 调用`,
121
- location: { line, column: match.index - content.lastIndexOf('\n', match.index) - 1 },
122
- });
123
- }
124
-
125
- return violations;
126
- }
127
-
128
- /**
129
- * 检查知识引用完整性
130
- */
131
- private checkKnowledgeRefs_(content: string, referencedIds: string[]): OutputViolation[] {
132
- const violations: OutputViolation[] = [];
133
-
134
- for (const id of referencedIds) {
135
- if (!content.includes(id)) {
136
- violations.push({
137
- type: 'knowledge_missing',
138
- severity: 'medium',
139
- description: `引用的知识条目 ${id} 未出现在输出中`,
140
- });
141
- }
142
- }
143
-
144
- return violations;
145
- }
146
-
147
- /**
148
- * 清理敏感信息
149
- */
150
- private sanitize(content: string, violations: OutputViolation[]): string {
151
- let sanitized = content;
152
-
153
- for (const violation of violations) {
154
- if (violation.type === 'sensitive_info' && violation.matchedPattern) {
155
- // Escape special regex characters in the matched string
156
- const escaped = violation.matchedPattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
157
- sanitized = sanitized.replace(new RegExp(escaped, 'g'), '[REDACTED]');
158
- }
159
- }
160
-
161
- return sanitized;
162
- }
163
-
164
- /**
165
- * 获取行号
166
- */
167
- private getLineNumber(content: string, index: number): number {
168
- return content.slice(0, index).split('\n').length;
169
- }
170
- }
@@ -1,148 +0,0 @@
1
- /**
2
- * Sandbox 安全级别管理
3
- *
4
- * 四级权限模型:
5
- * Level 1: 只读文件系统,无网络,无 shell
6
- * Level 2: 可写限定目录(.harness/),无网络
7
- * Level 3: 可写项目目录,受限网络(白名单)
8
- * Level 4: 完全权限,需用户确认
9
- */
10
-
11
- import type { SandboxLevel, SandboxConfig, SandboxCheckResult } from './types';
12
-
13
- const LEVEL_DESCRIPTIONS: Record<SandboxLevel, string> = {
14
- 1: '只读文件系统,无网络,无 shell',
15
- 2: '可写限定目录(.harness/),无网络',
16
- 3: '可写项目目录,受限网络(白名单)',
17
- 4: '完全权限,需用户确认',
18
- };
19
-
20
- const DEFAULT_WRITABLE_DIRS = ['.harness/'];
21
-
22
- export class Sandbox {
23
- private config: SandboxConfig;
24
-
25
- constructor(config?: Partial<SandboxConfig>) {
26
- this.config = {
27
- level: config?.level ?? 3,
28
- writableDirs: config?.writableDirs ?? DEFAULT_WRITABLE_DIRS,
29
- allowedHosts: config?.allowedHosts ?? [],
30
- requiresConfirmation: config?.requiresConfirmation ?? (config?.level === 4),
31
- };
32
- }
33
-
34
- getLevel(): SandboxLevel {
35
- return this.config.level;
36
- }
37
-
38
- getDescription(): string {
39
- return LEVEL_DESCRIPTIONS[this.config.level];
40
- }
41
-
42
- /**
43
- * 检查当前级别是否满足操作所需级别
44
- */
45
- check(requiredLevel: SandboxLevel): SandboxCheckResult {
46
- const allowed = this.config.level >= requiredLevel;
47
- return {
48
- allowed,
49
- reason: allowed ? undefined : `当前 Level ${this.config.level} 不满足操作所需的 Level ${requiredLevel}`,
50
- currentLevel: this.config.level,
51
- requiredLevel,
52
- };
53
- }
54
-
55
- /**
56
- * 检查文件写入是否允许
57
- */
58
- checkFileWrite(filePath: string): SandboxCheckResult {
59
- if (this.config.level >= 3) {
60
- return { allowed: true, currentLevel: this.config.level, requiredLevel: 3 };
61
- }
62
-
63
- if (this.config.level >= 2) {
64
- const inWritableDir = this.config.writableDirs?.some(dir => filePath.startsWith(dir));
65
- if (inWritableDir) {
66
- return { allowed: true, currentLevel: this.config.level, requiredLevel: 2 };
67
- }
68
- return {
69
- allowed: false,
70
- reason: `Level 2 只允许写入 ${this.config.writableDirs?.join(', ')}`,
71
- currentLevel: this.config.level,
72
- requiredLevel: 3,
73
- };
74
- }
75
-
76
- return {
77
- allowed: false,
78
- reason: 'Level 1 禁止写入任何文件',
79
- currentLevel: this.config.level,
80
- requiredLevel: 2,
81
- };
82
- }
83
-
84
- /**
85
- * 检查网络访问是否允许
86
- */
87
- checkNetworkAccess(host: string): SandboxCheckResult {
88
- if (this.config.level >= 4) {
89
- return { allowed: true, currentLevel: this.config.level, requiredLevel: 4 };
90
- }
91
-
92
- if (this.config.level >= 3) {
93
- const allowed = this.config.allowedHosts?.includes(host) ?? false;
94
- return {
95
- allowed,
96
- reason: allowed ? undefined : `Host ${host} 不在白名单中`,
97
- currentLevel: this.config.level,
98
- requiredLevel: 3,
99
- };
100
- }
101
-
102
- return {
103
- allowed: false,
104
- reason: `Level ${this.config.level} 禁止网络访问`,
105
- currentLevel: this.config.level,
106
- requiredLevel: 3,
107
- };
108
- }
109
-
110
- /**
111
- * 检查 shell 命令是否允许
112
- */
113
- checkShellAccess(): SandboxCheckResult {
114
- if (this.config.level >= 3) {
115
- return { allowed: true, currentLevel: this.config.level, requiredLevel: 3 };
116
- }
117
- return {
118
- allowed: false,
119
- reason: `Level ${this.config.level} 禁止 shell 访问`,
120
- currentLevel: this.config.level,
121
- requiredLevel: 3,
122
- };
123
- }
124
-
125
- /**
126
- * 检查是否需要用户确认
127
- */
128
- needsConfirmation(): boolean {
129
- return this.config.requiresConfirmation ?? false;
130
- }
131
-
132
- /**
133
- * 升级到指定级别
134
- */
135
- upgradeTo(level: SandboxLevel): void {
136
- this.config.level = level;
137
- if (level === 4) {
138
- this.config.requiresConfirmation = true;
139
- }
140
- }
141
-
142
- /**
143
- * 获取当前配置
144
- */
145
- getConfig(): SandboxConfig {
146
- return { ...this.config };
147
- }
148
- }
@@ -1,176 +0,0 @@
1
- /**
2
- * 工具护栏
3
- *
4
- * 每次工具调用前检查:
5
- * - 命令黑名单
6
- * - Sandbox 级别检查
7
- * - 速率限制
8
- */
9
-
10
- import type {
11
- ToolCheckResult,
12
- ToolViolation,
13
- ToolGuardrailConfig,
14
- RateLimitState,
15
- SandboxLevel,
16
- } from './types';
17
- import { Sandbox } from './sandbox';
18
-
19
- const DEFAULT_BLACKLISTED_COMMANDS = [
20
- 'rm -rf /',
21
- 'rm -rf /*',
22
- 'mkfs',
23
- 'dd if=',
24
- ':(){:|:&};:', // fork bomb
25
- 'chmod -R 777 /',
26
- '| sh',
27
- '| bash',
28
- 'eval(',
29
- 'exec(',
30
- ];
31
-
32
- const DEFAULT_RATE_LIMIT = 60; // per minute
33
-
34
- export class ToolGuardrail {
35
- private blacklistedCommands: string[];
36
- private rateLimit: number;
37
- private toolSandboxLevels: Record<string, SandboxLevel>;
38
- private rateLimitState: Map<string, RateLimitState>;
39
- private sandbox: Sandbox;
40
-
41
- constructor(sandbox: Sandbox, config?: ToolGuardrailConfig) {
42
- this.sandbox = sandbox;
43
- this.blacklistedCommands = config?.blacklistedCommands ?? DEFAULT_BLACKLISTED_COMMANDS;
44
- this.rateLimit = config?.rateLimit ?? DEFAULT_RATE_LIMIT;
45
- this.toolSandboxLevels = config?.toolSandboxLevels ?? {};
46
- this.rateLimitState = new Map();
47
- }
48
-
49
- /**
50
- * 检查工具调用是否允许
51
- */
52
- check(toolName: string, command?: string): ToolCheckResult {
53
- const violations: ToolViolation[] = [];
54
-
55
- // 命令黑名单检查
56
- if (command) {
57
- violations.push(...this.checkBlacklist(toolName, command));
58
- }
59
-
60
- // Sandbox 级别检查
61
- violations.push(...this.checkSandboxLevel(toolName));
62
-
63
- // 速率限制检查
64
- violations.push(...this.checkRateLimit(toolName));
65
-
66
- return {
67
- allowed: violations.length === 0,
68
- violations,
69
- };
70
- }
71
-
72
- /**
73
- * 检查命令黑名单
74
- */
75
- private checkBlacklist(toolName: string, command: string): ToolViolation[] {
76
- const violations: ToolViolation[] = [];
77
- const lower = command.toLowerCase();
78
-
79
- for (const blocked of this.blacklistedCommands) {
80
- if (lower.includes(blocked.toLowerCase())) {
81
- violations.push({
82
- type: 'blacklist',
83
- severity: 'high',
84
- description: `命令包含被阻止的模式: ${blocked}`,
85
- toolName,
86
- });
87
- }
88
- }
89
-
90
- return violations;
91
- }
92
-
93
- /**
94
- * 检查 sandbox 级别
95
- */
96
- private checkSandboxLevel(toolName: string): ToolViolation[] {
97
- const violations: ToolViolation[] = [];
98
- const requiredLevel = this.toolSandboxLevels[toolName];
99
-
100
- if (requiredLevel !== undefined) {
101
- const result = this.sandbox.check(requiredLevel);
102
- if (!result.allowed) {
103
- violations.push({
104
- type: 'sandbox',
105
- severity: 'high',
106
- description: result.reason ?? `工具 ${toolName} 需要 Level ${requiredLevel}`,
107
- toolName,
108
- });
109
- }
110
- }
111
-
112
- return violations;
113
- }
114
-
115
- /**
116
- * 检查速率限制
117
- */
118
- private checkRateLimit(toolName: string): ToolViolation[] {
119
- const violations: ToolViolation[] = [];
120
- const now = Date.now();
121
- const state = this.rateLimitState.get(toolName);
122
-
123
- if (!state) {
124
- this.rateLimitState.set(toolName, { count: 1, windowStart: now });
125
- return violations;
126
- }
127
-
128
- // 重置窗口(1 分钟)
129
- if (now - state.windowStart > 60000) {
130
- state.count = 1;
131
- state.windowStart = now;
132
- return violations;
133
- }
134
-
135
- state.count++;
136
-
137
- if (state.count > this.rateLimit) {
138
- violations.push({
139
- type: 'rate_limit',
140
- severity: 'medium',
141
- description: `工具 ${toolName} 超过速率限制 (${this.rateLimit}/min)`,
142
- toolName,
143
- });
144
- }
145
-
146
- return violations;
147
- }
148
-
149
- /**
150
- * 添加黑名单命令
151
- */
152
- addBlacklistedCommand(command: string): void {
153
- this.blacklistedCommands.push(command);
154
- }
155
-
156
- /**
157
- * 设置工具 sandbox 级别要求
158
- */
159
- setToolSandboxLevel(toolName: string, level: SandboxLevel): void {
160
- this.toolSandboxLevels[toolName] = level;
161
- }
162
-
163
- /**
164
- * 重置速率限制状态
165
- */
166
- resetRateLimits(): void {
167
- this.rateLimitState.clear();
168
- }
169
-
170
- /**
171
- * 获取 sandbox 实例
172
- */
173
- getSandbox(): Sandbox {
174
- return this.sandbox;
175
- }
176
- }
@@ -1,124 +0,0 @@
1
- /**
2
- * Safety Guardrails 类型定义
3
- */
4
-
5
- // ── Sandbox ──────────────────────────────────────────────
6
-
7
- /** Sandbox 安全级别 */
8
- export type SandboxLevel = 1 | 2 | 3 | 4;
9
-
10
- /** Sandbox 配置 */
11
- export interface SandboxConfig {
12
- level: SandboxLevel;
13
- /** 允许写入的目录(Level 2+) */
14
- writableDirs?: string[];
15
- /** 允许的网络白名单(Level 3) */
16
- allowedHosts?: string[];
17
- /** 需要用户确认的操作(Level 4) */
18
- requiresConfirmation?: boolean;
19
- }
20
-
21
- /** Sandbox 权限检查结果 */
22
- export interface SandboxCheckResult {
23
- allowed: boolean;
24
- reason?: string;
25
- currentLevel: SandboxLevel;
26
- requiredLevel: SandboxLevel;
27
- }
28
-
29
- // ── Input Guardrail ──────────────────────────────────────
30
-
31
- /** 输入检查结果 */
32
- export interface InputCheckResult {
33
- safe: boolean;
34
- violations: InputViolation[];
35
- }
36
-
37
- /** 输入违规 */
38
- export interface InputViolation {
39
- type: 'injection' | 'intent' | 'permission';
40
- severity: 'low' | 'medium' | 'high';
41
- description: string;
42
- matchedPattern?: string;
43
- }
44
-
45
- /** 输入护栏配置 */
46
- export interface InputGuardrailConfig {
47
- /** 注入检测模式 */
48
- injectionPatterns?: RegExp[];
49
- /** 禁止的意图关键词 */
50
- blockedIntents?: string[];
51
- /** 最大输入长度 */
52
- maxInputLength?: number;
53
- }
54
-
55
- // ── Output Guardrail ─────────────────────────────────────
56
-
57
- /** 输出检查结果 */
58
- export interface OutputSafetyCheckResult {
59
- safe: boolean;
60
- violations: OutputViolation[];
61
- sanitizedContent?: string;
62
- }
63
-
64
- /** 输出违规 */
65
- export interface OutputViolation {
66
- type: 'sensitive_info' | 'quality' | 'knowledge_missing';
67
- severity: 'low' | 'medium' | 'high';
68
- description: string;
69
- location?: { line: number; column: number };
70
- matchedPattern?: string;
71
- }
72
-
73
- /** 输出护栏配置 */
74
- export interface OutputGuardrailConfig {
75
- /** 敏感信息模式(API keys, passwords, etc.) */
76
- sensitivePatterns?: RegExp[];
77
- /** 代码质量最低分数 */
78
- minQualityScore?: number;
79
- /** 是否检查知识引用完整性 */
80
- checkKnowledgeRefs?: boolean;
81
- }
82
-
83
- // ── Tool Guardrail ───────────────────────────────────────
84
-
85
- /** 工具检查结果 */
86
- export interface ToolCheckResult {
87
- allowed: boolean;
88
- violations: ToolViolation[];
89
- }
90
-
91
- /** 工具违规 */
92
- export interface ToolViolation {
93
- type: 'blacklist' | 'sandbox' | 'rate_limit';
94
- severity: 'low' | 'medium' | 'high';
95
- description: string;
96
- toolName?: string;
97
- }
98
-
99
- /** 工具护栏配置 */
100
- export interface ToolGuardrailConfig {
101
- /** 命令黑名单 */
102
- blacklistedCommands?: string[];
103
- /** 每分钟最大调用次数 */
104
- rateLimit?: number;
105
- /** 各工具的 sandbox 级别要求 */
106
- toolSandboxLevels?: Record<string, SandboxLevel>;
107
- }
108
-
109
- /** 速率限制状态 */
110
- export interface RateLimitState {
111
- count: number;
112
- windowStart: number;
113
- }
114
-
115
- // ── Aggregate ────────────────────────────────────────────
116
-
117
- /** 安全检查汇总 */
118
- export interface SafetyCheckResult {
119
- safe: boolean;
120
- inputCheck: InputCheckResult;
121
- outputCheck: OutputSafetyCheckResult;
122
- toolCheck: ToolCheckResult;
123
- timestamp: string;
124
- }