soloforge 1.2.8 → 1.2.10

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 (405) hide show
  1. package/README.md +105 -321
  2. package/dist/adapters/claude_code/claude_md.d.ts +5 -0
  3. package/dist/adapters/claude_code/claude_md.d.ts.map +1 -1
  4. package/dist/adapters/claude_code/claude_md.js +6 -0
  5. package/dist/adapters/claude_code/claude_md.js.map +1 -1
  6. package/dist/adapters/claude_code/hooks.d.ts +4 -0
  7. package/dist/adapters/claude_code/hooks.d.ts.map +1 -1
  8. package/dist/adapters/claude_code/hooks.js +5 -0
  9. package/dist/adapters/claude_code/hooks.js.map +1 -1
  10. package/dist/adapters/claude_code/server.d.ts.map +1 -1
  11. package/dist/adapters/claude_code/server.js +9 -21
  12. package/dist/adapters/claude_code/server.js.map +1 -1
  13. package/dist/adapters/claude_code/tools.d.ts +5 -0
  14. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  15. package/dist/adapters/claude_code/tools.js +619 -205
  16. package/dist/adapters/claude_code/tools.js.map +1 -1
  17. package/dist/adapters/codex/codex_config.d.ts +9 -0
  18. package/dist/adapters/codex/codex_config.d.ts.map +1 -1
  19. package/dist/adapters/codex/codex_config.js +11 -3
  20. package/dist/adapters/codex/codex_config.js.map +1 -1
  21. package/dist/adapters/codex/codex_rules.d.ts +5 -0
  22. package/dist/adapters/codex/codex_rules.d.ts.map +1 -1
  23. package/dist/adapters/codex/codex_rules.js +8 -1
  24. package/dist/adapters/codex/codex_rules.js.map +1 -1
  25. package/dist/adapters/shared/workflow_template.d.ts +5 -0
  26. package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
  27. package/dist/adapters/shared/workflow_template.js +32 -79
  28. package/dist/adapters/shared/workflow_template.js.map +1 -1
  29. package/dist/adapters/trae/trae_config.d.ts +4 -0
  30. package/dist/adapters/trae/trae_config.d.ts.map +1 -1
  31. package/dist/adapters/trae/trae_config.js +5 -7
  32. package/dist/adapters/trae/trae_config.js.map +1 -1
  33. package/dist/adapters/trae/trae_rules.d.ts +5 -0
  34. package/dist/adapters/trae/trae_rules.d.ts.map +1 -1
  35. package/dist/adapters/trae/trae_rules.js +7 -1
  36. package/dist/adapters/trae/trae_rules.js.map +1 -1
  37. package/dist/bin/config_commands.d.ts +33 -0
  38. package/dist/bin/config_commands.d.ts.map +1 -0
  39. package/dist/bin/config_commands.js +222 -0
  40. package/dist/bin/config_commands.js.map +1 -0
  41. package/dist/bin/soloforge.js +609 -119
  42. package/dist/bin/soloforge.js.map +1 -1
  43. package/dist/engine/artifact_contract_registry.d.ts +138 -0
  44. package/dist/engine/artifact_contract_registry.d.ts.map +1 -0
  45. package/dist/engine/artifact_contract_registry.js +427 -0
  46. package/dist/engine/artifact_contract_registry.js.map +1 -0
  47. package/dist/engine/audit_pool.d.ts +40 -0
  48. package/dist/engine/audit_pool.d.ts.map +1 -1
  49. package/dist/engine/audit_pool.js +37 -1
  50. package/dist/engine/audit_pool.js.map +1 -1
  51. package/dist/engine/audit_sampler.d.ts +5 -0
  52. package/dist/engine/audit_sampler.d.ts.map +1 -1
  53. package/dist/engine/audit_sampler.js +6 -0
  54. package/dist/engine/audit_sampler.js.map +1 -1
  55. package/dist/engine/audit_verifier.d.ts.map +1 -1
  56. package/dist/engine/audit_verifier.js +5 -1
  57. package/dist/engine/audit_verifier.js.map +1 -1
  58. package/dist/engine/batch1_manifest.d.ts +61 -0
  59. package/dist/engine/batch1_manifest.d.ts.map +1 -0
  60. package/dist/engine/batch1_manifest.js +220 -0
  61. package/dist/engine/batch1_manifest.js.map +1 -0
  62. package/dist/engine/batch1_reality_gate.d.ts +40 -0
  63. package/dist/engine/batch1_reality_gate.d.ts.map +1 -0
  64. package/dist/engine/batch1_reality_gate.js +290 -0
  65. package/dist/engine/batch1_reality_gate.js.map +1 -0
  66. package/dist/engine/batch1_scenario_registry.d.ts +62 -0
  67. package/dist/engine/batch1_scenario_registry.d.ts.map +1 -0
  68. package/dist/engine/batch1_scenario_registry.js +392 -0
  69. package/dist/engine/batch1_scenario_registry.js.map +1 -0
  70. package/dist/engine/batch1_scenario_runners.d.ts +42 -0
  71. package/dist/engine/batch1_scenario_runners.d.ts.map +1 -0
  72. package/dist/engine/batch1_scenario_runners.js +292 -0
  73. package/dist/engine/batch1_scenario_runners.js.map +1 -0
  74. package/dist/engine/capability_action_advisor.d.ts +3 -0
  75. package/dist/engine/capability_action_advisor.d.ts.map +1 -1
  76. package/dist/engine/capability_action_advisor.js +10 -0
  77. package/dist/engine/capability_action_advisor.js.map +1 -1
  78. package/dist/engine/capability_registry.d.ts +21 -0
  79. package/dist/engine/capability_registry.d.ts.map +1 -1
  80. package/dist/engine/capability_registry.js +113 -0
  81. package/dist/engine/capability_registry.js.map +1 -1
  82. package/dist/engine/capability_state_store.d.ts +63 -0
  83. package/dist/engine/capability_state_store.d.ts.map +1 -1
  84. package/dist/engine/capability_state_store.js +49 -1
  85. package/dist/engine/capability_state_store.js.map +1 -1
  86. package/dist/engine/change_coordinator.d.ts.map +1 -1
  87. package/dist/engine/change_coordinator.js +5 -4
  88. package/dist/engine/change_coordinator.js.map +1 -1
  89. package/dist/engine/classifier.d.ts +15 -5
  90. package/dist/engine/classifier.d.ts.map +1 -1
  91. package/dist/engine/classifier.js +70 -69
  92. package/dist/engine/classifier.js.map +1 -1
  93. package/dist/engine/code_reviewer.d.ts +14 -0
  94. package/dist/engine/code_reviewer.d.ts.map +1 -1
  95. package/dist/engine/code_reviewer.js +109 -10
  96. package/dist/engine/code_reviewer.js.map +1 -1
  97. package/dist/engine/cognitive_anchor.d.ts +14 -0
  98. package/dist/engine/cognitive_anchor.d.ts.map +1 -1
  99. package/dist/engine/cognitive_anchor.js +26 -2
  100. package/dist/engine/cognitive_anchor.js.map +1 -1
  101. package/dist/engine/command_execution_contract.d.ts +226 -0
  102. package/dist/engine/command_execution_contract.d.ts.map +1 -0
  103. package/dist/engine/command_execution_contract.js +571 -0
  104. package/dist/engine/command_execution_contract.js.map +1 -0
  105. package/dist/engine/confidence_scorer.d.ts.map +1 -1
  106. package/dist/engine/confidence_scorer.js +1 -0
  107. package/dist/engine/confidence_scorer.js.map +1 -1
  108. package/dist/engine/config_precedence_contract.d.ts +269 -0
  109. package/dist/engine/config_precedence_contract.d.ts.map +1 -0
  110. package/dist/engine/config_precedence_contract.js +948 -0
  111. package/dist/engine/config_precedence_contract.js.map +1 -0
  112. package/dist/engine/conflict_gate.d.ts +13 -0
  113. package/dist/engine/conflict_gate.d.ts.map +1 -1
  114. package/dist/engine/conflict_gate.js +20 -2
  115. package/dist/engine/conflict_gate.js.map +1 -1
  116. package/dist/engine/consumable_asset_registry.d.ts +46 -0
  117. package/dist/engine/consumable_asset_registry.d.ts.map +1 -0
  118. package/dist/engine/consumable_asset_registry.js +758 -0
  119. package/dist/engine/consumable_asset_registry.js.map +1 -0
  120. package/dist/engine/contract_guard.d.ts +4 -0
  121. package/dist/engine/contract_guard.d.ts.map +1 -1
  122. package/dist/engine/contract_guard.js +15 -7
  123. package/dist/engine/contract_guard.js.map +1 -1
  124. package/dist/engine/convention_detector.d.ts.map +1 -1
  125. package/dist/engine/convention_detector.js +5 -2
  126. package/dist/engine/convention_detector.js.map +1 -1
  127. package/dist/engine/core_engineering_principles.d.ts +155 -0
  128. package/dist/engine/core_engineering_principles.d.ts.map +1 -0
  129. package/dist/engine/core_engineering_principles.js +426 -0
  130. package/dist/engine/core_engineering_principles.js.map +1 -0
  131. package/dist/engine/debt_reporter.d.ts.map +1 -1
  132. package/dist/engine/debt_reporter.js +3 -1
  133. package/dist/engine/debt_reporter.js.map +1 -1
  134. package/dist/engine/debt_tracker.d.ts.map +1 -1
  135. package/dist/engine/debt_tracker.js +9 -3
  136. package/dist/engine/debt_tracker.js.map +1 -1
  137. package/dist/engine/debugger.d.ts.map +1 -1
  138. package/dist/engine/debugger.js +2 -0
  139. package/dist/engine/debugger.js.map +1 -1
  140. package/dist/engine/decision_contract.d.ts +11 -2
  141. package/dist/engine/decision_contract.d.ts.map +1 -1
  142. package/dist/engine/decision_contract.js +17 -2
  143. package/dist/engine/decision_contract.js.map +1 -1
  144. package/dist/engine/delivery.d.ts +7 -0
  145. package/dist/engine/delivery.d.ts.map +1 -1
  146. package/dist/engine/delivery.js +89 -36
  147. package/dist/engine/delivery.js.map +1 -1
  148. package/dist/engine/dependency_scanner.d.ts.map +1 -1
  149. package/dist/engine/dependency_scanner.js +14 -9
  150. package/dist/engine/dependency_scanner.js.map +1 -1
  151. package/dist/engine/developer_sovereignty.d.ts.map +1 -1
  152. package/dist/engine/developer_sovereignty.js +8 -2
  153. package/dist/engine/developer_sovereignty.js.map +1 -1
  154. package/dist/engine/diff_ownership.d.ts.map +1 -1
  155. package/dist/engine/diff_ownership.js +8 -0
  156. package/dist/engine/diff_ownership.js.map +1 -1
  157. package/dist/engine/diff_ownership_store.d.ts +26 -10
  158. package/dist/engine/diff_ownership_store.d.ts.map +1 -1
  159. package/dist/engine/diff_ownership_store.js +47 -20
  160. package/dist/engine/diff_ownership_store.js.map +1 -1
  161. package/dist/engine/dual_layer_mechanism_registry.d.ts +66 -0
  162. package/dist/engine/dual_layer_mechanism_registry.d.ts.map +1 -0
  163. package/dist/engine/dual_layer_mechanism_registry.js +1077 -0
  164. package/dist/engine/dual_layer_mechanism_registry.js.map +1 -0
  165. package/dist/engine/escape_report.d.ts +50 -0
  166. package/dist/engine/escape_report.d.ts.map +1 -1
  167. package/dist/engine/escape_report.js +38 -0
  168. package/dist/engine/escape_report.js.map +1 -1
  169. package/dist/engine/evolver.d.ts.map +1 -1
  170. package/dist/engine/evolver.js +12 -2
  171. package/dist/engine/evolver.js.map +1 -1
  172. package/dist/engine/exploration.d.ts.map +1 -1
  173. package/dist/engine/exploration.js +87 -0
  174. package/dist/engine/exploration.js.map +1 -1
  175. package/dist/engine/failure_classifier.d.ts.map +1 -1
  176. package/dist/engine/failure_classifier.js +8 -0
  177. package/dist/engine/failure_classifier.js.map +1 -1
  178. package/dist/engine/feasibility_checker.d.ts +8 -0
  179. package/dist/engine/feasibility_checker.d.ts.map +1 -1
  180. package/dist/engine/feasibility_checker.js +12 -0
  181. package/dist/engine/feasibility_checker.js.map +1 -1
  182. package/dist/engine/git_deps.d.ts +4 -1
  183. package/dist/engine/git_deps.d.ts.map +1 -1
  184. package/dist/engine/git_deps.js +5 -1
  185. package/dist/engine/git_deps.js.map +1 -1
  186. package/dist/engine/governance_report.d.ts +57 -1
  187. package/dist/engine/governance_report.d.ts.map +1 -1
  188. package/dist/engine/governance_report.js +91 -1
  189. package/dist/engine/governance_report.js.map +1 -1
  190. package/dist/engine/impact_analyzer.d.ts.map +1 -1
  191. package/dist/engine/impact_analyzer.js +5 -1
  192. package/dist/engine/impact_analyzer.js.map +1 -1
  193. package/dist/engine/implementation_roadmap_registry.d.ts +105 -0
  194. package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -0
  195. package/dist/engine/implementation_roadmap_registry.js +813 -0
  196. package/dist/engine/implementation_roadmap_registry.js.map +1 -0
  197. package/dist/engine/input_material_contract_registry.d.ts +185 -0
  198. package/dist/engine/input_material_contract_registry.d.ts.map +1 -0
  199. package/dist/engine/input_material_contract_registry.js +563 -0
  200. package/dist/engine/input_material_contract_registry.js.map +1 -0
  201. package/dist/engine/intent_expander.d.ts +8 -27
  202. package/dist/engine/intent_expander.d.ts.map +1 -1
  203. package/dist/engine/intent_expander.js +1170 -139
  204. package/dist/engine/intent_expander.js.map +1 -1
  205. package/dist/engine/intent_router.d.ts +82 -0
  206. package/dist/engine/intent_router.d.ts.map +1 -0
  207. package/dist/engine/intent_router.js +458 -0
  208. package/dist/engine/intent_router.js.map +1 -0
  209. package/dist/engine/io_controller.d.ts.map +1 -1
  210. package/dist/engine/io_controller.js +25 -13
  211. package/dist/engine/io_controller.js.map +1 -1
  212. package/dist/engine/java_quality_guard.d.ts.map +1 -1
  213. package/dist/engine/java_quality_guard.js +8 -4
  214. package/dist/engine/java_quality_guard.js.map +1 -1
  215. package/dist/engine/job_manager.d.ts +35 -0
  216. package/dist/engine/job_manager.d.ts.map +1 -1
  217. package/dist/engine/job_manager.js +53 -9
  218. package/dist/engine/job_manager.js.map +1 -1
  219. package/dist/engine/knowledge_config_loader.d.ts +12 -1
  220. package/dist/engine/knowledge_config_loader.d.ts.map +1 -1
  221. package/dist/engine/knowledge_config_loader.js +50 -10
  222. package/dist/engine/knowledge_config_loader.js.map +1 -1
  223. package/dist/engine/knowledge_injection_boundary.d.ts +56 -0
  224. package/dist/engine/knowledge_injection_boundary.d.ts.map +1 -0
  225. package/dist/engine/knowledge_injection_boundary.js +561 -0
  226. package/dist/engine/knowledge_injection_boundary.js.map +1 -0
  227. package/dist/engine/knowledge_manager.d.ts +73 -0
  228. package/dist/engine/knowledge_manager.d.ts.map +1 -1
  229. package/dist/engine/knowledge_manager.js +163 -21
  230. package/dist/engine/knowledge_manager.js.map +1 -1
  231. package/dist/engine/knowledge_sovereignty.d.ts +1 -0
  232. package/dist/engine/knowledge_sovereignty.d.ts.map +1 -1
  233. package/dist/engine/knowledge_sovereignty.js +8 -3
  234. package/dist/engine/knowledge_sovereignty.js.map +1 -1
  235. package/dist/engine/llm_gateway.d.ts +74 -3
  236. package/dist/engine/llm_gateway.d.ts.map +1 -1
  237. package/dist/engine/llm_gateway.js +75 -4
  238. package/dist/engine/llm_gateway.js.map +1 -1
  239. package/dist/engine/main_path_integration_contract.d.ts +383 -0
  240. package/dist/engine/main_path_integration_contract.d.ts.map +1 -0
  241. package/dist/engine/main_path_integration_contract.js +1581 -0
  242. package/dist/engine/main_path_integration_contract.js.map +1 -0
  243. package/dist/engine/mechanism_contract_registry.d.ts +59 -0
  244. package/dist/engine/mechanism_contract_registry.d.ts.map +1 -0
  245. package/dist/engine/mechanism_contract_registry.js +484 -0
  246. package/dist/engine/mechanism_contract_registry.js.map +1 -0
  247. package/dist/engine/migration_guard.d.ts.map +1 -1
  248. package/dist/engine/migration_guard.js +24 -15
  249. package/dist/engine/migration_guard.js.map +1 -1
  250. package/dist/engine/mutation_audit.d.ts +10 -0
  251. package/dist/engine/mutation_audit.d.ts.map +1 -1
  252. package/dist/engine/mutation_audit.js +19 -2
  253. package/dist/engine/mutation_audit.js.map +1 -1
  254. package/dist/engine/observability.d.ts.map +1 -1
  255. package/dist/engine/observability.js +17 -6
  256. package/dist/engine/observability.js.map +1 -1
  257. package/dist/engine/onboarding.d.ts.map +1 -1
  258. package/dist/engine/onboarding.js +20 -4
  259. package/dist/engine/onboarding.js.map +1 -1
  260. package/dist/engine/policy_drift_detector.d.ts +6 -0
  261. package/dist/engine/policy_drift_detector.d.ts.map +1 -1
  262. package/dist/engine/policy_drift_detector.js +16 -0
  263. package/dist/engine/policy_drift_detector.js.map +1 -1
  264. package/dist/engine/privacy_secret_contract.d.ts +320 -0
  265. package/dist/engine/privacy_secret_contract.d.ts.map +1 -0
  266. package/dist/engine/privacy_secret_contract.js +874 -0
  267. package/dist/engine/privacy_secret_contract.js.map +1 -0
  268. package/dist/engine/regression_matrix.d.ts +21 -8
  269. package/dist/engine/regression_matrix.d.ts.map +1 -1
  270. package/dist/engine/regression_matrix.js +37 -8
  271. package/dist/engine/regression_matrix.js.map +1 -1
  272. package/dist/engine/risk_sampler.d.ts +6 -0
  273. package/dist/engine/risk_sampler.d.ts.map +1 -1
  274. package/dist/engine/risk_sampler.js +9 -0
  275. package/dist/engine/risk_sampler.js.map +1 -1
  276. package/dist/engine/runtime_safety.d.ts.map +1 -1
  277. package/dist/engine/runtime_safety.js +7 -3
  278. package/dist/engine/runtime_safety.js.map +1 -1
  279. package/dist/engine/scaffolder.d.ts.map +1 -1
  280. package/dist/engine/scaffolder.js +7 -1
  281. package/dist/engine/scaffolder.js.map +1 -1
  282. package/dist/engine/scope_controller.d.ts.map +1 -1
  283. package/dist/engine/scope_controller.js +12 -1
  284. package/dist/engine/scope_controller.js.map +1 -1
  285. package/dist/engine/scope_lease.d.ts +43 -0
  286. package/dist/engine/scope_lease.d.ts.map +1 -1
  287. package/dist/engine/scope_lease.js +44 -0
  288. package/dist/engine/scope_lease.js.map +1 -1
  289. package/dist/engine/semantic_evidence.d.ts +6 -0
  290. package/dist/engine/semantic_evidence.d.ts.map +1 -1
  291. package/dist/engine/semantic_evidence.js +9 -0
  292. package/dist/engine/semantic_evidence.js.map +1 -1
  293. package/dist/engine/task_context.d.ts +36 -1
  294. package/dist/engine/task_context.d.ts.map +1 -1
  295. package/dist/engine/task_context.js +252 -13
  296. package/dist/engine/task_context.js.map +1 -1
  297. package/dist/engine/task_planner.d.ts.map +1 -1
  298. package/dist/engine/task_planner.js +13 -3
  299. package/dist/engine/task_planner.js.map +1 -1
  300. package/dist/engine/team_awareness.d.ts.map +1 -1
  301. package/dist/engine/team_awareness.js +8 -7
  302. package/dist/engine/team_awareness.js.map +1 -1
  303. package/dist/engine/template_mechanism_auditor.d.ts +93 -0
  304. package/dist/engine/template_mechanism_auditor.d.ts.map +1 -0
  305. package/dist/engine/template_mechanism_auditor.js +622 -0
  306. package/dist/engine/template_mechanism_auditor.js.map +1 -0
  307. package/dist/engine/test_generator.d.ts.map +1 -1
  308. package/dist/engine/test_generator.js +6 -0
  309. package/dist/engine/test_generator.js.map +1 -1
  310. package/dist/engine/test_quality.d.ts +6 -0
  311. package/dist/engine/test_quality.d.ts.map +1 -1
  312. package/dist/engine/test_quality.js +26 -10
  313. package/dist/engine/test_quality.js.map +1 -1
  314. package/dist/engine/tool_invocation_contract_registry.d.ts +136 -0
  315. package/dist/engine/tool_invocation_contract_registry.d.ts.map +1 -0
  316. package/dist/engine/tool_invocation_contract_registry.js +731 -0
  317. package/dist/engine/tool_invocation_contract_registry.js.map +1 -0
  318. package/dist/engine/traceability.d.ts +3 -0
  319. package/dist/engine/traceability.d.ts.map +1 -1
  320. package/dist/engine/traceability.js +12 -4
  321. package/dist/engine/traceability.js.map +1 -1
  322. package/dist/engine/user_feedback_contract.d.ts +162 -0
  323. package/dist/engine/user_feedback_contract.d.ts.map +1 -0
  324. package/dist/engine/user_feedback_contract.js +356 -0
  325. package/dist/engine/user_feedback_contract.js.map +1 -0
  326. package/dist/engine/verifier.d.ts +6 -1
  327. package/dist/engine/verifier.d.ts.map +1 -1
  328. package/dist/engine/verifier.js +114 -1
  329. package/dist/engine/verifier.js.map +1 -1
  330. package/dist/engine/workflow_contract_registry.d.ts +70 -0
  331. package/dist/engine/workflow_contract_registry.d.ts.map +1 -0
  332. package/dist/engine/workflow_contract_registry.js +501 -0
  333. package/dist/engine/workflow_contract_registry.js.map +1 -0
  334. package/dist/engine/workspace_resumer.d.ts.map +1 -1
  335. package/dist/engine/workspace_resumer.js +8 -0
  336. package/dist/engine/workspace_resumer.js.map +1 -1
  337. package/dist/engine/zero_config_init.d.ts +67 -2
  338. package/dist/engine/zero_config_init.d.ts.map +1 -1
  339. package/dist/engine/zero_config_init.js +410 -28
  340. package/dist/engine/zero_config_init.js.map +1 -1
  341. package/dist/git/operations.d.ts +101 -0
  342. package/dist/git/operations.d.ts.map +1 -1
  343. package/dist/git/operations.js +125 -9
  344. package/dist/git/operations.js.map +1 -1
  345. package/dist/index.d.ts +1 -1
  346. package/dist/index.js +16 -5
  347. package/dist/index.js.map +1 -1
  348. package/dist/knowledge/conflict_detector.d.ts +6 -0
  349. package/dist/knowledge/conflict_detector.d.ts.map +1 -1
  350. package/dist/knowledge/conflict_detector.js +7 -0
  351. package/dist/knowledge/conflict_detector.js.map +1 -1
  352. package/dist/knowledge/health_checker.d.ts +16 -0
  353. package/dist/knowledge/health_checker.d.ts.map +1 -1
  354. package/dist/knowledge/health_checker.js +24 -1
  355. package/dist/knowledge/health_checker.js.map +1 -1
  356. package/dist/knowledge/index_manager.d.ts +140 -2
  357. package/dist/knowledge/index_manager.d.ts.map +1 -1
  358. package/dist/knowledge/index_manager.js +186 -26
  359. package/dist/knowledge/index_manager.js.map +1 -1
  360. package/dist/knowledge/loader.d.ts +8 -1
  361. package/dist/knowledge/loader.d.ts.map +1 -1
  362. package/dist/knowledge/loader.js +56 -2
  363. package/dist/knowledge/loader.js.map +1 -1
  364. package/dist/knowledge/writer.d.ts +49 -1
  365. package/dist/knowledge/writer.d.ts.map +1 -1
  366. package/dist/knowledge/writer.js +55 -1
  367. package/dist/knowledge/writer.js.map +1 -1
  368. package/dist/types.d.ts +255 -1
  369. package/dist/types.d.ts.map +1 -1
  370. package/dist/utils/logger.d.ts +3 -0
  371. package/dist/utils/logger.d.ts.map +1 -0
  372. package/dist/utils/logger.js +29 -0
  373. package/dist/utils/logger.js.map +1 -0
  374. package/package.json +7 -7
  375. package/templates/knowledge/checklists//344/270/273/351/223/276/350/267/257/346/216/245/345/205/245/351/252/214/346/224/266/346/270/205/345/215/225.md +16 -0
  376. package/templates/knowledge/checklists//345/267/245/344/275/234/346/265/201/351/252/214/346/224/266/346/270/205/345/215/225.md +17 -0
  377. package/templates/knowledge/checklists//346/240/270/345/277/203/345/267/245/347/250/213/346/211/247/350/241/214/351/252/214/346/224/266/346/270/205/345/215/225.md +43 -0
  378. package/templates/knowledge/checklists//347/237/245/350/257/206/346/263/250/345/205/245/351/252/214/346/224/266/346/270/205/345/215/225.md +17 -0
  379. package/templates/knowledge/checklists//351/232/220/347/247/201/345/256/241/346/237/245/346/270/205/345/215/225.md +15 -0
  380. package/templates/knowledge/checklists//351/252/214/350/257/201/351/252/214/346/224/266/346/270/205/345/215/225.md +16 -0
  381. package/templates/knowledge/patterns/core//345/206/263/347/255/226/347/275/221/345/205/263.md +1 -0
  382. package/templates/knowledge/procedures//344/270/273/351/223/276/350/267/257/346/216/245/345/205/245/351/252/214/350/257/201/346/265/201/347/250/213.md +23 -0
  383. package/templates/knowledge/procedures//345/221/275/344/273/244/346/211/247/350/241/214/346/265/201/347/250/213.md +19 -0
  384. package/templates/knowledge/procedures//345/267/245/345/205/267/350/260/203/347/224/250/346/265/201/347/250/213.md +15 -0
  385. package/templates/knowledge/procedures//346/204/217/345/233/276/350/267/257/347/224/261/346/265/201/347/250/213.md +15 -0
  386. package/templates/knowledge/procedures//346/272/220/347/240/201/345/216/237/345/236/213/344/272/244/344/273/230/346/265/201/347/250/213.md +1 -1
  387. package/templates/knowledge/procedures//347/274/226/347/240/201/345/211/215/346/276/204/346/270/205/346/265/201/347/250/213.md +53 -0
  388. package/templates/knowledge/rules//344/272/247/347/211/251/345/245/221/347/272/246/350/247/204/345/210/231.md +21 -0
  389. package/templates/knowledge/rules//345/221/275/344/273/244/346/211/247/350/241/214/350/247/204/345/210/231.md +25 -0
  390. package/templates/knowledge/rules//345/267/245/344/275/234/346/265/201/345/245/221/347/272/246/350/247/204/345/210/231.md +20 -0
  391. package/templates/knowledge/rules//345/267/245/345/205/267/350/260/203/347/224/250/350/247/204/345/210/231.md +25 -0
  392. package/templates/knowledge/rules//346/204/217/345/233/276/350/267/257/347/224/261/350/247/204/345/210/231.md +26 -0
  393. package/templates/knowledge/rules//346/211/247/350/241/214/345/256/210/345/215/253/350/257/204/344/274/260/350/247/204/345/210/231.md +24 -0
  394. package/templates/knowledge/rules//346/225/217/346/204/237/344/277/241/346/201/257/345/244/204/347/220/206/350/247/204/345/210/231.md +20 -0
  395. package/templates/knowledge/rules//346/240/270/345/277/203/345/267/245/347/250/213/346/211/247/350/241/214/345/216/237/345/210/231.md +125 -0
  396. package/templates/knowledge/rules//346/263/250/345/206/214/350/241/250/345/237/272/347/241/200/350/256/276/346/226/275/350/247/204/345/210/231.md +26 -0
  397. package/templates/knowledge/rules//347/224/250/346/210/267/345/217/215/351/246/210/345/245/221/347/272/246/350/247/204/345/210/231.md +22 -0
  398. package/templates/knowledge/rules//347/237/245/350/257/206/346/263/250/345/205/245/350/276/271/347/225/214/350/247/204/345/210/231.md +25 -0
  399. package/templates/knowledge/rules//350/276/223/345/205/245/346/235/220/346/226/231/345/245/221/347/272/246/350/247/204/345/210/231.md +27 -0
  400. package/templates/knowledge/rules//351/205/215/347/275/256/344/274/230/345/205/210/347/272/247/350/247/204/345/210/231.md +22 -0
  401. package/templates/knowledge/rules//351/230/262/345/255/244/345/262/233/345/256/236/347/216/260/350/247/204/345/210/231.md +24 -0
  402. package/templates/knowledge/rules//351/233/266/351/205/215/347/275/256/345/210/235/345/247/213/345/214/226/350/247/204/345/210/231.md +28 -0
  403. package/templates/knowledge/rules//351/252/214/350/257/201/345/245/221/347/272/246/350/247/204/345/210/231.md +25 -0
  404. package/templates/knowledge/templates/{review_summary.md → /345/256/241/346/237/245/346/221/230/350/246/201.md} +1 -1
  405. package/templates/config.yaml +0 -53
@@ -0,0 +1,874 @@
1
+ import crypto from "node:crypto";
2
+ // ── Default handling by sensitivity label ──
3
+ const DEFAULT_HANDLING = {
4
+ public: "allow",
5
+ internal: "allow",
6
+ confidential: "require_human",
7
+ secret: "forbidden",
8
+ credential: "forbidden",
9
+ pii: "require_human",
10
+ customer_data: "require_human",
11
+ production_data: "require_human",
12
+ unknown: "require_human",
13
+ };
14
+ // ── Context-specific handling ──
15
+ const CONTEXT_HANDLING = {
16
+ public: {
17
+ prompt_injection: "allow",
18
+ task_context_store: "allow",
19
+ artifact_store: "allow",
20
+ evidence_store: "allow",
21
+ external_send: "allow",
22
+ read_operation: "allow",
23
+ },
24
+ internal: {
25
+ prompt_injection: "allow",
26
+ task_context_store: "allow",
27
+ artifact_store: "allow",
28
+ evidence_store: "allow",
29
+ external_send: "forbidden",
30
+ read_operation: "allow",
31
+ },
32
+ confidential: {
33
+ prompt_injection: "summarize_only",
34
+ task_context_store: "redact",
35
+ artifact_store: "redact",
36
+ evidence_store: "redact",
37
+ external_send: "require_human",
38
+ read_operation: "require_human",
39
+ },
40
+ secret: {
41
+ prompt_injection: "forbidden",
42
+ task_context_store: "forbidden",
43
+ artifact_store: "forbidden",
44
+ evidence_store: "forbidden",
45
+ external_send: "forbidden",
46
+ read_operation: "forbidden",
47
+ },
48
+ credential: {
49
+ prompt_injection: "forbidden",
50
+ task_context_store: "forbidden",
51
+ artifact_store: "forbidden",
52
+ evidence_store: "forbidden",
53
+ external_send: "forbidden",
54
+ read_operation: "forbidden",
55
+ },
56
+ pii: {
57
+ prompt_injection: "redact",
58
+ task_context_store: "redact",
59
+ artifact_store: "redact",
60
+ evidence_store: "redact",
61
+ external_send: "require_human",
62
+ read_operation: "require_human",
63
+ },
64
+ customer_data: {
65
+ prompt_injection: "summarize_only",
66
+ task_context_store: "summarize_only",
67
+ artifact_store: "summarize_only",
68
+ evidence_store: "summarize_only",
69
+ external_send: "require_human",
70
+ read_operation: "require_human",
71
+ },
72
+ production_data: {
73
+ prompt_injection: "summarize_only",
74
+ task_context_store: "summarize_only",
75
+ artifact_store: "summarize_only",
76
+ evidence_store: "summarize_only",
77
+ external_send: "require_human",
78
+ read_operation: "require_human",
79
+ },
80
+ unknown: {
81
+ prompt_injection: "summarize_only",
82
+ task_context_store: "summarize_only",
83
+ artifact_store: "summarize_only",
84
+ evidence_store: "summarize_only",
85
+ external_send: "require_human",
86
+ read_operation: "require_human",
87
+ },
88
+ };
89
+ // ── Forbidden read patterns (content reading forbidden, existence check only) ──
90
+ export const FORBIDDEN_READ_PATTERNS = [
91
+ { pattern: /\.env($|\.)/, label: "credential", reason: ".env 文件默认禁止读取内容" },
92
+ { pattern: /id_rsa/, label: "secret", reason: "SSH 私钥默认禁止读取" },
93
+ { pattern: /\.pem$/, label: "secret", reason: "PEM 私钥默认禁止读取" },
94
+ { pattern: /\.key$/, label: "secret", reason: "密钥文件默认禁止读取" },
95
+ { pattern: /\.aws[\\/]credentials/, label: "credential", reason: "AWS 凭证默认禁止读取" },
96
+ { pattern: /\.npmrc$/, label: "credential", reason: "npmrc 可能包含 token" },
97
+ { pattern: /\.pypirc$/, label: "credential", reason: "PyPI 配置可能包含凭证" },
98
+ { pattern: /kubeconfig/, label: "credential", reason: "kubeconfig 可能包含集群凭证" },
99
+ { pattern: /\.docker[\\/]config\.json/, label: "credential", reason: "Docker 配置可能包含 registry 凭证" },
100
+ { pattern: /tokens\.json|token_store|\.token/, label: "credential", reason: "token store 文件默认禁止读取" },
101
+ { pattern: /cookies\.sqlite|cookies\.db|\.cookie[\\/]/, label: "secret", reason: "浏览器 cookie/session 默认禁止读取" },
102
+ { pattern: /login\.keychain|\.keychain|\.keystore/, label: "secret", reason: "系统钥匙串默认禁止读取" },
103
+ { pattern: /ssh[\\/]config$/i, label: "secret", reason: "SSH config 可能包含敏感主机/代理配置" },
104
+ ];
105
+ // ── Requires confirmation patterns ──
106
+ export const CONFIRMATION_READ_PATTERNS = [
107
+ { pattern: /\.log$/, label: "production_data", reason: "日志文件可能包含敏感信息" },
108
+ { pattern: /\.sql$/, label: "production_data", reason: "SQL 文件可能是数据库 dump" },
109
+ { pattern: /\.csv$/, label: "customer_data", reason: "CSV 可能包含客户数据" },
110
+ { pattern: /dump/, label: "production_data", reason: "dump 文件可能包含生产数据" },
111
+ { pattern: /[\\/]export[\\/]/, label: "customer_data", reason: "export 目录可能包含客户导出数据" },
112
+ { pattern: /figma[\\/]|notion[\\/]|drive[\\/]|slack[\\/]|github[\\/]private/, label: "confidential", reason: "私有云文档/协作平台数据需确认" },
113
+ { pattern: /api[_-]?response|_response\.json|_result\.json/, label: "confidential", reason: "外部系统返回数据需确认" },
114
+ { pattern: new RegExp('\\b(Users|home)\\/[\\w.-]+\\/(Desktop|Documents|Downloads|Pictures)', 's'), label: "confidential", reason: "用户 home 大范围目录需确认" },
115
+ { pattern: /sample.*\.json|fixture.*\.json/, label: "confidential", reason: "真实 API 响应样本需确认" },
116
+ { pattern: /\.vcf$|\. contacts$/, label: "pii", reason: "包含联系方式/PII 的文件需确认" },
117
+ ];
118
+ // ── Detection helpers ──
119
+ /**
120
+ * 检测来源的敏感等级。
121
+ * @param sourceRef - 来源引用路径
122
+ * @param contentHints - 内容提示关键词(可选)
123
+ * @returns 数据敏感标签
124
+ */
125
+ export function detectSensitivity(sourceRef, contentHints) {
126
+ console.error(`[soloForge] 隐私契约: 检测敏感等级 — ${sourceRef}`);
127
+ // 优先检查禁止模式
128
+ for (const { pattern, label, reason } of FORBIDDEN_READ_PATTERNS) {
129
+ if (pattern.test(sourceRef)) {
130
+ return {
131
+ label,
132
+ source_ref: sourceRef,
133
+ detected_by: [`pattern: ${pattern.source}`],
134
+ confidence: 0.9,
135
+ handling: "forbidden",
136
+ };
137
+ }
138
+ }
139
+ // 检查确认模式
140
+ for (const { pattern, label, reason } of CONFIRMATION_READ_PATTERNS) {
141
+ if (pattern.test(sourceRef)) {
142
+ return {
143
+ label,
144
+ source_ref: sourceRef,
145
+ detected_by: [`pattern: ${pattern.source}`],
146
+ confidence: 0.7,
147
+ handling: "require_human",
148
+ };
149
+ }
150
+ }
151
+ // 基于内容的检测
152
+ if (contentHints && contentHints.length > 0) {
153
+ const joined = contentHints.join(" ");
154
+ if (/token|api[_-]?key|secret[_-]?key|private[_-]?key/i.test(joined)) {
155
+ return {
156
+ label: "secret",
157
+ source_ref: sourceRef,
158
+ detected_by: ["content_keyword"],
159
+ confidence: 0.6,
160
+ handling: "forbidden",
161
+ };
162
+ }
163
+ if (/\bpassword\b|\bpasswd\b/i.test(joined)) {
164
+ return {
165
+ label: "credential",
166
+ source_ref: sourceRef,
167
+ detected_by: ["content_keyword"],
168
+ confidence: 0.6,
169
+ handling: "forbidden",
170
+ };
171
+ }
172
+ if (/\b\d{11}\b/.test(joined) || /\b[\w.+-]+@[\w-]+\.[\w.]+\b/.test(joined)) {
173
+ return {
174
+ label: "pii",
175
+ source_ref: sourceRef,
176
+ detected_by: ["content_pattern"],
177
+ confidence: 0.5,
178
+ handling: "require_human",
179
+ };
180
+ }
181
+ }
182
+ // 常规代码文件 (.ts, .js, .py, .go, .rs, .java, .tsx, .jsx) 默认为 internal
183
+ const codeExtensions = /\.(ts|tsx|js|jsx|py|go|rs|java|c|cpp|h|rb|php|swift|kt)$/i;
184
+ if (codeExtensions.test(sourceRef)) {
185
+ return {
186
+ label: "internal",
187
+ source_ref: sourceRef,
188
+ detected_by: ["file_extension"],
189
+ confidence: 0.7,
190
+ handling: "allow",
191
+ };
192
+ }
193
+ return {
194
+ label: "unknown",
195
+ source_ref: sourceRef,
196
+ detected_by: ["no_match"],
197
+ confidence: 0.3,
198
+ handling: DEFAULT_HANDLING["unknown"],
199
+ };
200
+ }
201
+ // ── Check functions ──
202
+ /**
203
+ * 获取指定敏感标签的默认处理方式。
204
+ * @param label - 敏感标签
205
+ * @returns 处理方式
206
+ */
207
+ export function getDefaultHandling(label) {
208
+ console.error(`[soloForge] 隐私契约: 获取默认处理方式 — ${label}`);
209
+ return DEFAULT_HANDLING[label];
210
+ }
211
+ /**
212
+ * 获取指定敏感标签在特定上下文中的处理方式。
213
+ * @param label - 敏感标签
214
+ * @param context - 检查上下文
215
+ * @returns 处理方式
216
+ */
217
+ export function getContextHandling(label, context) {
218
+ console.error(`[soloForge] 隐私契约: 获取上下文处理方式 — ${label}/${context}`);
219
+ return CONTEXT_HANDLING[label][context];
220
+ }
221
+ /**
222
+ * 判断数据是否可以注入 prompt。
223
+ * @param label - 敏感标签
224
+ * @returns 是否允许
225
+ */
226
+ export function canInjectInPrompt(label) {
227
+ console.error(`[soloForge] 隐私契约: 检查 prompt 注入许可 — ${label}`);
228
+ const handling = CONTEXT_HANDLING[label].prompt_injection;
229
+ return handling === "allow";
230
+ }
231
+ /**
232
+ * 判断数据是否可以存入任务上下文。
233
+ * @param label - 敏感标签
234
+ * @returns 是否允许
235
+ */
236
+ export function canStoreInTaskContext(label) {
237
+ console.error(`[soloForge] 隐私契约: 检查 TaskContext 存储许可 — ${label}`);
238
+ const handling = CONTEXT_HANDLING[label].task_context_store;
239
+ return handling === "allow" || handling === "redact" || handling === "summarize_only";
240
+ }
241
+ /**
242
+ * 判断数据是否可以存入产物。
243
+ * @param label - 敏感标签
244
+ * @returns 是否允许
245
+ */
246
+ export function canStoreInArtifact(label) {
247
+ console.error(`[soloForge] 隐私契约: 检查 artifact 存储许可 — ${label}`);
248
+ const handling = CONTEXT_HANDLING[label].artifact_store;
249
+ return handling === "allow" || handling === "redact" || handling === "summarize_only";
250
+ }
251
+ /**
252
+ * 判断数据是否可以外部发送。
253
+ * @param label - 敏感标签
254
+ * @returns 是否允许
255
+ */
256
+ export function canSendExternally(label) {
257
+ console.error(`[soloForge] 隐私契约: 检查外发许可 — ${label}`);
258
+ return CONTEXT_HANDLING[label].external_send === "allow";
259
+ }
260
+ /**
261
+ * 判断来源的内容是否可以读取。
262
+ * @param sourceRef - 来源引用路径
263
+ * @returns 读取许可结果
264
+ */
265
+ export function canReadContent(sourceRef) {
266
+ console.error(`[soloForge] 隐私契约: 检查内容读取许可 — ${sourceRef}`);
267
+ for (const { pattern, label, reason } of FORBIDDEN_READ_PATTERNS) {
268
+ if (pattern.test(sourceRef)) {
269
+ return { allowed: false, reason, label, requires_confirmation: false };
270
+ }
271
+ }
272
+ for (const { pattern, label, reason } of CONFIRMATION_READ_PATTERNS) {
273
+ if (pattern.test(sourceRef)) {
274
+ return { allowed: false, reason, label, requires_confirmation: true };
275
+ }
276
+ }
277
+ return { allowed: true, reason: "", label: "public" };
278
+ }
279
+ /**
280
+ * 判断来源是否禁止读取。
281
+ * @param sourceRef - 来源引用路径
282
+ * @returns 是否禁止
283
+ */
284
+ export function isReadForbidden(sourceRef) {
285
+ console.error(`[soloForge] 隐私契约: 检查是否禁止读取 — ${sourceRef}`);
286
+ return FORBIDDEN_READ_PATTERNS.some(({ pattern }) => pattern.test(sourceRef));
287
+ }
288
+ /**
289
+ * 判断来源是否需要确认后才能读取。
290
+ * @param sourceRef - 来源引用路径
291
+ * @returns 是否需要确认
292
+ */
293
+ export function isReadRequiresConfirmation(sourceRef) {
294
+ console.error(`[soloForge] 隐私契约: 检查是否需要确认读取 — ${sourceRef}`);
295
+ return CONFIRMATION_READ_PATTERNS.some(({ pattern }) => pattern.test(sourceRef));
296
+ }
297
+ // ── Grant management ──
298
+ /**
299
+ * 创建数据访问授权。
300
+ * @param options.granted_by - 授权人
301
+ * @param options.scope_refs - 授权范围引用
302
+ * @param options.sensitivity_allowed - 允许的敏感标签
303
+ * @param options.allowed_operations - 允许的操作
304
+ * @param options.purpose - 用途
305
+ * @param options.duration_hours - 有效时长(小时)
306
+ * @returns 数据访问授权
307
+ */
308
+ export function createDataAccessGrant(options) {
309
+ console.error(`[soloForge] 隐私契约: 创建数据访问授权 — 授权人: ${options.granted_by}, 范围: ${options.scope_refs.length} 个引用`);
310
+ const expiresAt = new Date(Date.now() + options.duration_hours * 3600_000);
311
+ return {
312
+ grant_id: `grant-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
313
+ granted_by: options.granted_by,
314
+ scope_refs: options.scope_refs,
315
+ sensitivity_allowed: options.sensitivity_allowed,
316
+ allowed_operations: options.allowed_operations,
317
+ purpose: options.purpose,
318
+ expires_at: expiresAt.toISOString(),
319
+ revocable: true,
320
+ };
321
+ }
322
+ /**
323
+ * 判断授权是否有效。
324
+ * @param grant - 数据访问授权
325
+ * @returns 是否有效
326
+ */
327
+ export function isGrantValid(grant) {
328
+ console.error(`[soloForge] 隐私契约: 检查授权有效性 — ${grant.grant_id}`);
329
+ return new Date(grant.expires_at) > new Date();
330
+ }
331
+ /**
332
+ * 判断授权是否已过期。
333
+ * @param grant - 数据访问授权
334
+ * @returns 是否已过期
335
+ */
336
+ export function isGrantExpired(grant) {
337
+ console.error(`[soloForge] 隐私契约: 检查授权是否过期 — ${grant.grant_id}`);
338
+ return new Date(grant.expires_at) <= new Date();
339
+ }
340
+ /**
341
+ * 检查授权是否允许指定操作。
342
+ * @param grant - 数据访问授权
343
+ * @param operation - 请求的操作
344
+ * @param sensitivity - 敏感标签
345
+ * @returns 权限检查结果
346
+ */
347
+ export function checkGrantPermission(grant, operation, sensitivity) {
348
+ console.error(`[soloForge] 隐私契约: 检查授权权限 — ${grant.grant_id}, 操作: ${operation}, 等级: ${sensitivity}`);
349
+ if (isGrantExpired(grant)) {
350
+ console.error(`[soloForge] 隐私契约: 授权权限拒绝 — 授权已过期`);
351
+ return { allowed: false, reason: `授权 ${grant.grant_id} 已过期` };
352
+ }
353
+ if (!grant.allowed_operations.includes(operation)) {
354
+ console.error(`[soloForge] 隐私契约: 授权权限拒绝 — 不允许操作 ${operation}`);
355
+ return { allowed: false, reason: `授权 ${grant.grant_id} 不允许操作 ${operation}` };
356
+ }
357
+ if (!grant.sensitivity_allowed.includes(sensitivity)) {
358
+ console.error(`[soloForge] 隐私契约: 授权权限拒绝 — 不允许敏感等级 ${sensitivity}`);
359
+ return { allowed: false, reason: `授权 ${grant.grant_id} 不允许敏感等级 ${sensitivity}` };
360
+ }
361
+ console.error(`[soloForge] 隐私契约: 授权权限通过`);
362
+ return { allowed: true, reason: "" };
363
+ }
364
+ // ── Redaction ──
365
+ /**
366
+ * 对内容进行脱敏处理。
367
+ * @param content - 原始内容
368
+ * @param label - 敏感标签
369
+ * @param sourceRef - 来源引用(可选)
370
+ * @returns 脱敏结果和脱敏记录
371
+ */
372
+ export function redactContent(content, label, sourceRef) {
373
+ console.error(`[soloForge] 隐私契约: 开始内容脱敏 — 等级: ${label}, 来源: ${sourceRef ?? "未知"}`);
374
+ let redacted = content;
375
+ const fieldsRedacted = [];
376
+ if (label === "secret" || label === "credential") {
377
+ redacted = "***REDACTED***";
378
+ fieldsRedacted.push("all");
379
+ }
380
+ else if (label === "pii") {
381
+ redacted = redactPII(content);
382
+ fieldsRedacted.push("phone", "email", "id_number", "address");
383
+ }
384
+ else if (label === "customer_data" || label === "production_data") {
385
+ redacted = summarizeOnly(content);
386
+ fieldsRedacted.push("raw_data");
387
+ }
388
+ else if (label === "confidential") {
389
+ redacted = summarizeOnly(content);
390
+ fieldsRedacted.push("details");
391
+ }
392
+ return {
393
+ redacted,
394
+ record: {
395
+ source_ref: sourceRef ?? "",
396
+ redaction_type: labelToRedactionType(label),
397
+ after_hash: simpleHash(redacted),
398
+ fields_redacted: fieldsRedacted,
399
+ },
400
+ };
401
+ }
402
+ function redactPII(text) {
403
+ let result = text;
404
+ // 手机号: 138****1234
405
+ result = result.replace(/1[3-9]\d(\d{4})\d{4}/g, (m, last) => m.slice(0, 3) + "****" + last);
406
+ // 邮箱: a***@domain.com
407
+ result = result.replace(/([\w.+-])[\w.+-]*@([\w-]+\.[\w.]+)/g, (_, first, domain) => first + "***@" + domain);
408
+ // 身份证号: 保留后 4 位
409
+ result = result.replace(/\b\d{14}(\d{4})\b/g, "**************$1");
410
+ // Address: keep city-level (省/市 + following district, redact detail)
411
+ result = result.replace(/([\u4e00-\u9fa5]{2,6}(?:省|市|自治区|特别行政区))([\u4e00-\u9fa5]{2,6}(?:市|区|县|镇))([\u4e00-\u9fa5\d]+路?[\u4e00-\u9fa5\d]+)/g, "$1$2***");
412
+ return result;
413
+ }
414
+ function summarizeOnly(text) {
415
+ if (text.length <= 100)
416
+ return `[摘要] ${text.slice(0, 50)}...`;
417
+ return `[摘要] ${text.slice(0, 80)}... (共 ${text.length} 字符)`;
418
+ }
419
+ function labelToRedactionType(label) {
420
+ const map = {
421
+ secret: "secret_mask",
422
+ credential: "credential_removed",
423
+ pii: "pii_mask",
424
+ customer_data: "customer_data_summary",
425
+ production_data: "production_data_summary",
426
+ confidential: "path_only",
427
+ };
428
+ return map[label] ?? "hash_only";
429
+ }
430
+ function simpleHash(text) {
431
+ return crypto.createHash("sha256").update(text).digest("hex").slice(0, 16);
432
+ }
433
+ // ── External send check ──
434
+ /**
435
+ * 检查内容是否可以外部发送。
436
+ * @param content - 待发送内容
437
+ * @param sensitivity - 敏感标签
438
+ * @param grants - 授权列表
439
+ * @returns 外发检查结果
440
+ */
441
+ export function checkExternalSend(content, sensitivity, grants) {
442
+ console.error(`[soloForge] 隐私契约: 检查外发许可 — 等级: ${sensitivity.label}`);
443
+ const handling = CONTEXT_HANDLING[sensitivity.label].external_send;
444
+ if (handling === "forbidden") {
445
+ console.error(`[soloForge] 隐私契约: 外发拒绝 — 等级 ${sensitivity.label} 禁止外发`);
446
+ return { allowed: false, reason: `敏感等级 ${sensitivity.label} 禁止外发`, requiresRedaction: false };
447
+ }
448
+ if (handling === "allow") {
449
+ return { allowed: true, reason: "", requiresRedaction: false };
450
+ }
451
+ // require_human — 检查授权
452
+ for (const grant of grants) {
453
+ const perm = checkGrantPermission(grant, "external_send", sensitivity.label);
454
+ if (perm.allowed) {
455
+ console.error(`[soloForge] 隐私契约: 外发通过 — 授权 ${grant.grant_id} 允许(已脱敏)`);
456
+ const { redacted, record } = redactContent(content, sensitivity.label);
457
+ return { allowed: true, reason: `授权 ${grant.grant_id} 允许外发(已脱敏)`, requiresRedaction: true, redactedContent: redacted };
458
+ }
459
+ }
460
+ console.error(`[soloForge] 隐私契约: 外发拒绝 — 等级 ${sensitivity.label} 需要人工授权`);
461
+ return {
462
+ allowed: false,
463
+ reason: `敏感等级 ${sensitivity.label} 需要人工授权才能外发`,
464
+ requiresRedaction: true,
465
+ };
466
+ }
467
+ // ── Prompt injection check ──
468
+ /**
469
+ * 检查数据是否可以注入 prompt。
470
+ * @param sensitivity - 敏感标签
471
+ * @param grants - 授权列表
472
+ * @returns 注入检查结果
473
+ */
474
+ export function checkPromptInjection(sensitivity, grants) {
475
+ console.error(`[soloForge] 隐私契约: 检查 prompt 注入许可 — 等级: ${sensitivity.label}`);
476
+ const handling = CONTEXT_HANDLING[sensitivity.label].prompt_injection;
477
+ if (handling === "forbidden") {
478
+ console.error(`[soloForge] 隐私契约: 注入拒绝 — 等级 ${sensitivity.label} 禁止注入 prompt`);
479
+ return { allowed: false, reason: `敏感等级 ${sensitivity.label} 禁止注入 prompt`, handling };
480
+ }
481
+ if (handling === "allow") {
482
+ return { allowed: true, reason: "", handling };
483
+ }
484
+ // 检查 prompt_inject 授权
485
+ for (const grant of grants) {
486
+ const perm = checkGrantPermission(grant, "prompt_inject", sensitivity.label);
487
+ if (perm.allowed) {
488
+ return { allowed: true, reason: `授权 ${grant.grant_id} 允许注入(${handling})`, handling };
489
+ }
490
+ }
491
+ console.error(`[soloForge] 隐私契约: 注入拒绝 — 等级 ${sensitivity.label} 需要 ${handling} 处理`);
492
+ return { allowed: false, reason: `敏感等级 ${sensitivity.label} 需要 ${handling} 处理`, handling };
493
+ }
494
+ // ── Chinese feedback ──
495
+ /**
496
+ * 构建隐私处理反馈信息。
497
+ * @param options - 反馈选项
498
+ * @returns 格式化的反馈文本
499
+ */
500
+ export function buildPrivacyFeedback(options) {
501
+ console.error(`[soloForge] 隐私契约: 构建隐私反馈 — 未读: ${options.notRead.length}, 脱敏: ${options.redacted.length}, 需授权: ${options.requiresAuth.length}`);
502
+ const lines = [];
503
+ if (options.notRead.length > 0) {
504
+ lines.push(`未读取的内容: ${options.notRead.join(", ")}`);
505
+ }
506
+ if (options.redacted.length > 0) {
507
+ lines.push(`已脱敏的内容: ${options.redacted.join(", ")}`);
508
+ }
509
+ if (options.requiresAuth.length > 0) {
510
+ lines.push(`需要授权的内容: ${options.requiresAuth.join(", ")}`);
511
+ }
512
+ if (options.notInPrompt.length > 0) {
513
+ lines.push(`未进入 prompt 的内容: ${options.notInPrompt.join(", ")}`);
514
+ }
515
+ if (options.blocked) {
516
+ lines.push(`⚠️ 存在敏感信息阻断`);
517
+ }
518
+ if (options.externalRedaction) {
519
+ lines.push(`外发前已完成 redaction check`);
520
+ }
521
+ return lines.join("\n");
522
+ }
523
+ // ── Governance validation ──
524
+ /**
525
+ * 验证隐私契约合规性。
526
+ * @param options.sensitivities - 敏感标签列表
527
+ * @param options.grants - 授权列表
528
+ * @param options.redactionRecords - 脱敏记录列表
529
+ * @param options.promptInjections - prompt 注入列表
530
+ * @param options.taskContextStores - 任务上下文存储列表
531
+ * @param options.artifactStores - 产物存储列表
532
+ * @param options.externalSends - 外部发送列表
533
+ * @returns 治理发现列表
534
+ */
535
+ /**
536
+ * 验证隐私契约合规性。
537
+ * @param options - 验证选项
538
+ * @returns 验证结果,包含合规检查项和发现的问题
539
+ */
540
+ export function validatePrivacyContract(options) {
541
+ const findings = [];
542
+ console.error(`[soloForge] 隐私契约: 开始治理验证 — 检查 ${options.sensitivities.length} 个敏感来源`);
543
+ // 规则 1: secret 不得进入 prompt
544
+ for (const inj of options.promptInjections) {
545
+ if (inj.label === "secret" || inj.label === "credential") {
546
+ findings.push({
547
+ severity: "hard_fail",
548
+ rule: "gc-secret-no-prompt",
549
+ source_ref: inj.source_ref,
550
+ message: `secret/credential (${inj.label}) 不得注入 prompt — ${inj.source_ref}`,
551
+ });
552
+ }
553
+ }
554
+ // 规则 2: secret 不得写入 TaskContext
555
+ for (const store of options.taskContextStores) {
556
+ if (store.label === "secret" || store.label === "credential") {
557
+ findings.push({
558
+ severity: "hard_fail",
559
+ rule: "gc-secret-no-taskcontext",
560
+ source_ref: store.source_ref,
561
+ message: `secret/credential (${store.label}) 不得写入 TaskContext — ${store.source_ref}`,
562
+ });
563
+ }
564
+ }
565
+ // 规则 3: secret 不得写入 artifact/report
566
+ for (const art of options.artifactStores) {
567
+ if (art.label === "secret" || art.label === "credential") {
568
+ findings.push({
569
+ severity: "hard_fail",
570
+ rule: "gc-secret-no-artifact",
571
+ source_ref: art.source_ref,
572
+ message: `secret/credential (${art.label}) 不得写入 artifact — ${art.source_ref}`,
573
+ });
574
+ }
575
+ }
576
+ // 规则 4: PII 未脱敏外发
577
+ for (const ext of options.externalSends) {
578
+ if (ext.label === "pii" || ext.label === "customer_data" || ext.label === "production_data") {
579
+ const hasRedaction = options.redactionRecords.some((r) => r.source_ref === ext.source_ref);
580
+ if (!hasRedaction) {
581
+ findings.push({
582
+ severity: "hard_fail",
583
+ rule: "gc-pii-no-unredacted-external",
584
+ source_ref: ext.source_ref,
585
+ message: `${ext.label} 未脱敏不得外发 — ${ext.source_ref}`,
586
+ });
587
+ }
588
+ }
589
+ }
590
+ // 规则 5: secret 外发 hard fail
591
+ for (const ext of options.externalSends) {
592
+ if (ext.label === "secret" || ext.label === "credential") {
593
+ findings.push({
594
+ severity: "hard_fail",
595
+ rule: "gc-secret-no-external",
596
+ source_ref: ext.source_ref,
597
+ message: `secret/credential (${ext.label}) 外发 hard fail — ${ext.source_ref}`,
598
+ });
599
+ }
600
+ }
601
+ // 规则 6: DataAccessGrant 过期后不得使用
602
+ for (const grant of options.grants) {
603
+ if (isGrantExpired(grant)) {
604
+ findings.push({
605
+ severity: "hard_fail",
606
+ rule: "gc-grant-expired",
607
+ source_ref: grant.grant_id,
608
+ message: `授权 ${grant.grant_id} 已过期,不得继续使用`,
609
+ });
610
+ }
611
+ }
612
+ // 规则 7: unknown sensitivity 不能当 public
613
+ for (const s of options.sensitivities) {
614
+ if (s.label === "unknown" && s.handling === "allow") {
615
+ findings.push({
616
+ severity: "hard_fail",
617
+ rule: "gc-unknown-not-public",
618
+ source_ref: s.source_ref,
619
+ message: `unknown sensitivity 不能当做 public 处理 — ${s.source_ref}`,
620
+ });
621
+ }
622
+ }
623
+ // 规则 8: private evidence 不得注入 prompt
624
+ for (const s of options.sensitivities) {
625
+ if (s.label === "secret" || s.label === "credential") {
626
+ const injected = options.promptInjections.some((i) => i.source_ref === s.source_ref);
627
+ if (injected) {
628
+ findings.push({
629
+ severity: "hard_fail",
630
+ rule: "gc-private-no-prompt",
631
+ source_ref: s.source_ref,
632
+ message: `private evidence (${s.label}) 不得注入 prompt — ${s.source_ref}`,
633
+ });
634
+ }
635
+ }
636
+ }
637
+ // 规则 9: 每次脱敏必须有 RedactionRecord
638
+ const redactedSources = new Set(options.redactionRecords.map((r) => r.source_ref));
639
+ for (const s of options.sensitivities) {
640
+ if (s.handling === "redact" && !redactedSources.has(s.source_ref)) {
641
+ findings.push({
642
+ severity: "advisory",
643
+ rule: "gc-redaction-record-missing",
644
+ source_ref: s.source_ref,
645
+ message: `敏感来源 ${s.source_ref} 标记为脱敏但缺少 RedactionRecord`,
646
+ });
647
+ }
648
+ }
649
+ return findings;
650
+ }
651
+ // ── Unified Privacy Gate (硬门) ──
652
+ const TEXT_SECRET_PATTERNS = [
653
+ { pattern: /sk-[a-zA-Z0-9]{32,}/, label: "secret", fields: ["api_key"] },
654
+ { pattern: /AKIA[0-9A-Z]{16}/, label: "credential", fields: ["aws_access_key"] },
655
+ { pattern: /aws_secret_access_key\s*=\s*['"][^'"]+['"]/, label: "credential", fields: ["aws_secret"] },
656
+ { pattern: /password\s*=\s*['"][^'"]{4,}['"]/, label: "credential", fields: ["password"] },
657
+ { pattern: /secret_key\s*=\s*['"][^'"]+['"]/, label: "secret", fields: ["secret_key"] },
658
+ { pattern: /jwt_secret\s*=\s*['"][^'"]+['"]/, label: "secret", fields: ["jwt_secret"] },
659
+ { pattern: /1[3-9]\d{9}/, label: "pii", fields: ["phone"] },
660
+ { pattern: /[\w.+-]+@[\w-]+\.[\w.]+/, label: "pii", fields: ["email"] },
661
+ { pattern: /\b\d{17}[\dXx]\b/, label: "pii", fields: ["id_number"] },
662
+ // 生产数据模式
663
+ { pattern: /production\.log|prod-\w+\.\w+|\bproduction\s+data\b/i, label: "production_data", fields: ["production_log"] },
664
+ { pattern: /SELECT\s+.{1,}?\s+FROM\s+/is, label: "production_data", fields: ["sql_query"] },
665
+ { pattern: /database\s+dump|db\s+dump|\bdb_dump\b/i, label: "production_data", fields: ["database_dump"] },
666
+ { pattern: /API\s+Response:\s*\{/i, label: "production_data", fields: ["api_response"] },
667
+ // 客户数据模式
668
+ { pattern: /email,\s*phone,\s*name|name,\s*email,\s*phone/i, label: "customer_data", fields: ["customer_csv"] },
669
+ { pattern: /user_id["']?\s*:\s*\d+.*["']?email["']?\s*:/i, label: "customer_data", fields: ["user_export"] },
670
+ { pattern: /customer.*export|export.*customer/i, label: "customer_data", fields: ["customer_export"] },
671
+ ];
672
+ /**
673
+ * 扫描文本中的敏感信息。
674
+ * @param text - 待扫描文本
675
+ * @param sourceRef - 来源引用
676
+ * @returns 检测到的敏感标签列表
677
+ */
678
+ export function scanTextSensitivity(text, sourceRef) {
679
+ console.error(`[soloForge] 隐私契约: 扫描文本敏感信息 — 来源: ${sourceRef}`);
680
+ const labels = [];
681
+ for (const { pattern, label, fields } of TEXT_SECRET_PATTERNS) {
682
+ if (pattern.test(text)) {
683
+ labels.push({
684
+ label,
685
+ source_ref: sourceRef,
686
+ detected_by: [`text_pattern:${fields.join(",")}`],
687
+ confidence: 0.85,
688
+ handling: (label === "pii" || label === "production_data" || label === "customer_data") ? "require_human" : "forbidden",
689
+ });
690
+ }
691
+ }
692
+ return labels;
693
+ }
694
+ /**
695
+ * 扫描来源引用的敏感等级。
696
+ * @param sourceRef - 来源引用路径
697
+ * @returns 数据敏感标签
698
+ */
699
+ export function scanSourceRefSensitivity(sourceRef) {
700
+ console.error(`[soloForge] 隐私契约: 扫描来源敏感等级 — ${sourceRef}`);
701
+ return detectSensitivity(sourceRef);
702
+ }
703
+ /**
704
+ * 对文本中的敏感信息进行脱敏处理。
705
+ * @param text - 原始文本
706
+ * @param sourceRef - 来源引用(可选)
707
+ * @returns 脱敏结果和脱敏记录
708
+ */
709
+ export function redactSensitiveText(text, sourceRef) {
710
+ let result = text;
711
+ const records = [];
712
+ const fieldsRedacted = [];
713
+ console.error(`[soloForge] 隐私契约: 开始文本脱敏 — 来源: ${sourceRef ?? '未知'}`);
714
+ // API 密钥 / 令牌
715
+ if (/sk-[a-zA-Z0-9]{32,}/.test(result)) {
716
+ result = result.replace(/sk-[a-zA-Z0-9]{32,}/g, "sk-****REDACTED****");
717
+ fieldsRedacted.push("api_key");
718
+ }
719
+ // AWS 访问密钥
720
+ if (/AKIA[0-9A-Z]{16}/.test(result)) {
721
+ result = result.replace(/AKIA[0-9A-Z]{16}/g, "AKIA****REDACTED****");
722
+ fieldsRedacted.push("aws_access_key");
723
+ }
724
+ // AWS 秘密访问密钥值
725
+ result = result.replace(/(aws_secret_access_key\s*=\s*['"])[^'"]+(['"])/g, "$1****REDACTED****$2");
726
+ // 密码值
727
+ result = result.replace(/(password\s*=\s*['"])[^'"]{4,}(['"])/gi, "$1****REDACTED****$2");
728
+ // 密钥值
729
+ result = result.replace(/(secret_key\s*=\s*['"])[^'"]+(['"])/gi, "$1****REDACTED****$2");
730
+ // JWT 密钥值
731
+ result = result.replace(/(jwt_secret\s*=\s*['"])[^'"]+(['"])/gi, "$1****REDACTED****$2");
732
+ // 个人身份信息
733
+ const piiResult = redactPII(result);
734
+ if (piiResult !== result) {
735
+ result = piiResult;
736
+ fieldsRedacted.push("phone", "email", "id_number", "address");
737
+ }
738
+ if (fieldsRedacted.length > 0) {
739
+ console.error(`[soloForge] 隐私契约: 文本脱敏完成 — 脱敏字段: ${fieldsRedacted.join(", ")}`);
740
+ records.push({
741
+ source_ref: sourceRef ?? "",
742
+ redaction_type: "secret_mask",
743
+ after_hash: simpleHash(result),
744
+ fields_redacted: [...new Set(fieldsRedacted)],
745
+ });
746
+ }
747
+ return { redacted: result, records };
748
+ }
749
+ /**
750
+ * 评估统一隐私门禁。
751
+ * @param params.intent - 用户意图文本(可选)
752
+ * @param params.input_materials - 输入材料(可选)
753
+ * @param params.prompt_sources - prompt 来源(可选)
754
+ * @param params.task_context_stores - 任务上下文存储(可选)
755
+ * @param params.artifact_stores - 产物存储(可选)
756
+ * @param params.external_sends - 外部发送列表(可选)
757
+ * @param params.grants - 授权列表(可选)
758
+ * @returns 隐私门禁结果
759
+ */
760
+ /**
761
+ * 评估隐私门禁,决定是否阻断操作。
762
+ * @param options - 门禁评估选项
763
+ * @returns 门禁结果,包含是否通过、阻断源和警告
764
+ */
765
+ export function evaluatePrivacyGate(params) {
766
+ const findings = [];
767
+ const blockedSources = [];
768
+ console.error(`[soloForge] 隐私契约: 开始隐私门禁评估`);
769
+ const allLabels = [];
770
+ const redactionRecords = [];
771
+ let hardFail = false;
772
+ // 扫描意图文本
773
+ if (params.intent) {
774
+ const intentLabels = scanTextSensitivity(params.intent, "intent");
775
+ for (const l of intentLabels) {
776
+ allLabels.push(l);
777
+ if (l.label === "secret" || l.label === "credential") {
778
+ hardFail = true;
779
+ blockedSources.push("intent");
780
+ findings.push({ severity: "hard_fail", rule: "gc-intent-secret", source_ref: "intent", message: `用户意图包含 ${l.label}(${l.detected_by.join(", ")}),禁止执行` });
781
+ }
782
+ }
783
+ }
784
+ // 按来源引用扫描输入材料
785
+ if (params.input_materials) {
786
+ for (const m of params.input_materials) {
787
+ const refLabel = scanSourceRefSensitivity(m.path_or_ref);
788
+ allLabels.push(refLabel);
789
+ if (refLabel.handling === "forbidden") {
790
+ hardFail = true;
791
+ blockedSources.push(m.path_or_ref);
792
+ findings.push({ severity: "hard_fail", rule: "gc-material-forbidden", source_ref: m.path_or_ref, message: `输入材料 ${m.path_or_ref} 匹配禁止模式(${refLabel.label}),禁止读取` });
793
+ }
794
+ else if (refLabel.handling === "require_human") {
795
+ const hasGrant = (params.grants ?? []).some(g => isGrantValid(g) && g.sensitivity_allowed.includes(refLabel.label) && g.allowed_operations.includes("read"));
796
+ if (!hasGrant) {
797
+ blockedSources.push(m.path_or_ref);
798
+ findings.push({ severity: "advisory", rule: "gc-material-requires-confirmation", source_ref: m.path_or_ref, message: `输入材料 ${m.path_or_ref} 标记为 ${refLabel.label},需人工确认后读取` });
799
+ }
800
+ }
801
+ // 如果提供了内容也进行扫描
802
+ if (m.content) {
803
+ const contentLabels = scanTextSensitivity(m.content, m.path_or_ref);
804
+ for (const cl of contentLabels) {
805
+ if (cl.label === "secret" || cl.label === "credential") {
806
+ hardFail = true;
807
+ blockedSources.push(m.path_or_ref);
808
+ findings.push({ severity: "hard_fail", rule: "gc-content-secret", source_ref: m.path_or_ref, message: `输入材料内容包含 ${cl.label}(${cl.detected_by.join(", ")}),禁止执行` });
809
+ }
810
+ allLabels.push(cl);
811
+ }
812
+ }
813
+ }
814
+ }
815
+ // 检查 task_context_stores 是否包含敏感内容
816
+ if (params.task_context_stores) {
817
+ for (const s of params.task_context_stores) {
818
+ if (s.content) {
819
+ const labels = scanTextSensitivity(s.content, s.source_ref);
820
+ for (const l of labels) {
821
+ if (l.label === "secret" || l.label === "credential") {
822
+ hardFail = true;
823
+ findings.push({ severity: "hard_fail", rule: "gc-taskcontext-secret", source_ref: s.source_ref, message: `TaskContext 写入内容包含 ${l.label},禁止保存` });
824
+ }
825
+ }
826
+ }
827
+ }
828
+ }
829
+ // 检查外发内容
830
+ if (params.external_sends) {
831
+ for (const e of params.external_sends) {
832
+ const labels = e.content ? scanTextSensitivity(e.content, e.source_ref) : [];
833
+ const refLabel = scanSourceRefSensitivity(e.source_ref);
834
+ if (refLabel.label === "secret" || refLabel.label === "credential") {
835
+ hardFail = true;
836
+ findings.push({ severity: "hard_fail", rule: "gc-external-secret", source_ref: e.source_ref, message: `外发来源 ${e.source_ref} 标记为 ${refLabel.label},禁止外发` });
837
+ }
838
+ for (const l of labels) {
839
+ if (l.label === "secret" || l.label === "credential") {
840
+ hardFail = true;
841
+ findings.push({ severity: "hard_fail", rule: "gc-external-content-secret", source_ref: e.source_ref, message: `外发内容包含 ${l.label},禁止外发` });
842
+ }
843
+ }
844
+ }
845
+ }
846
+ // 如有需要,脱敏意图文本
847
+ let redactedText;
848
+ if (params.intent) {
849
+ const { redacted, records } = redactSensitiveText(params.intent, "intent");
850
+ if (records.length > 0) {
851
+ redactedText = redacted;
852
+ redactionRecords.push(...records);
853
+ }
854
+ }
855
+ if (hardFail) {
856
+ console.error(`[soloForge] 隐私契约: 隐私门禁阻断 — 发现 ${blockedSources.length} 个阻断源`);
857
+ }
858
+ else if (findings.length > 0) {
859
+ console.error(`[soloForge] 隐私契约: 隐私门禁通过 — 但有 ${findings.length} 个警告`);
860
+ }
861
+ else {
862
+ console.error(`[soloForge] 隐私契约: 隐私门禁通过`);
863
+ }
864
+ return {
865
+ allowed: !hardFail,
866
+ hard_fail: hardFail,
867
+ blocked_sources: [...new Set(blockedSources)],
868
+ findings,
869
+ redacted_text: redactedText,
870
+ redaction_records: redactionRecords,
871
+ labels: allLabels,
872
+ };
873
+ }
874
+ //# sourceMappingURL=privacy_secret_contract.js.map