llm-content-creator 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/README.md +309 -0
  2. package/dist/application/workflow/SyncExecutor.d.ts +75 -0
  3. package/dist/application/workflow/SyncExecutor.d.ts.map +1 -0
  4. package/dist/application/workflow/SyncExecutor.js +370 -0
  5. package/dist/application/workflow/SyncExecutor.js.map +1 -0
  6. package/dist/application/workflow/types.d.ts +46 -0
  7. package/dist/application/workflow/types.d.ts.map +1 -0
  8. package/dist/application/workflow/types.js +7 -0
  9. package/dist/application/workflow/types.js.map +1 -0
  10. package/dist/config/index.d.ts +173 -0
  11. package/dist/config/index.d.ts.map +1 -0
  12. package/dist/config/index.js +288 -0
  13. package/dist/config/index.js.map +1 -0
  14. package/dist/domain/entities/QualityCheck.d.ts +181 -0
  15. package/dist/domain/entities/QualityCheck.d.ts.map +1 -0
  16. package/dist/domain/entities/QualityCheck.js +39 -0
  17. package/dist/domain/entities/QualityCheck.js.map +1 -0
  18. package/dist/domain/entities/Result.d.ts +103 -0
  19. package/dist/domain/entities/Result.d.ts.map +1 -0
  20. package/dist/domain/entities/Result.js +15 -0
  21. package/dist/domain/entities/Result.js.map +1 -0
  22. package/dist/domain/entities/Task.d.ts +130 -0
  23. package/dist/domain/entities/Task.d.ts.map +1 -0
  24. package/dist/domain/entities/Task.js +64 -0
  25. package/dist/domain/entities/Task.js.map +1 -0
  26. package/dist/domain/entities/TaskStep.d.ts +160 -0
  27. package/dist/domain/entities/TaskStep.d.ts.map +1 -0
  28. package/dist/domain/entities/TaskStep.js +30 -0
  29. package/dist/domain/entities/TaskStep.js.map +1 -0
  30. package/dist/domain/entities/TokenUsage.d.ts +70 -0
  31. package/dist/domain/entities/TokenUsage.d.ts.map +1 -0
  32. package/dist/domain/entities/TokenUsage.js +42 -0
  33. package/dist/domain/entities/TokenUsage.js.map +1 -0
  34. package/dist/domain/entities/index.d.ts +11 -0
  35. package/dist/domain/entities/index.d.ts.map +1 -0
  36. package/dist/domain/entities/index.js +16 -0
  37. package/dist/domain/entities/index.js.map +1 -0
  38. package/dist/domain/repositories/QualityCheckRepository.d.ts +49 -0
  39. package/dist/domain/repositories/QualityCheckRepository.d.ts.map +1 -0
  40. package/dist/domain/repositories/QualityCheckRepository.js +5 -0
  41. package/dist/domain/repositories/QualityCheckRepository.js.map +1 -0
  42. package/dist/domain/repositories/ResultRepository.d.ts +43 -0
  43. package/dist/domain/repositories/ResultRepository.d.ts.map +1 -0
  44. package/dist/domain/repositories/ResultRepository.js +5 -0
  45. package/dist/domain/repositories/ResultRepository.js.map +1 -0
  46. package/dist/domain/repositories/TaskRepository.d.ts +240 -0
  47. package/dist/domain/repositories/TaskRepository.d.ts.map +1 -0
  48. package/dist/domain/repositories/TaskRepository.js +7 -0
  49. package/dist/domain/repositories/TaskRepository.js.map +1 -0
  50. package/dist/domain/workflow/CheckpointManager.d.ts +94 -0
  51. package/dist/domain/workflow/CheckpointManager.d.ts.map +1 -0
  52. package/dist/domain/workflow/CheckpointManager.js +224 -0
  53. package/dist/domain/workflow/CheckpointManager.js.map +1 -0
  54. package/dist/domain/workflow/ContentCreatorGraph.d.ts +17 -0
  55. package/dist/domain/workflow/ContentCreatorGraph.d.ts.map +1 -0
  56. package/dist/domain/workflow/ContentCreatorGraph.js +381 -0
  57. package/dist/domain/workflow/ContentCreatorGraph.js.map +1 -0
  58. package/dist/domain/workflow/State.d.ts +172 -0
  59. package/dist/domain/workflow/State.d.ts.map +1 -0
  60. package/dist/domain/workflow/State.js +184 -0
  61. package/dist/domain/workflow/State.js.map +1 -0
  62. package/dist/domain/workflow/index.d.ts +11 -0
  63. package/dist/domain/workflow/index.d.ts.map +1 -0
  64. package/dist/domain/workflow/index.js +15 -0
  65. package/dist/domain/workflow/index.js.map +1 -0
  66. package/dist/domain/workflow/nodes/BaseNode.d.ts +134 -0
  67. package/dist/domain/workflow/nodes/BaseNode.d.ts.map +1 -0
  68. package/dist/domain/workflow/nodes/BaseNode.js +253 -0
  69. package/dist/domain/workflow/nodes/BaseNode.js.map +1 -0
  70. package/dist/domain/workflow/nodes/CheckImageNode.d.ts +43 -0
  71. package/dist/domain/workflow/nodes/CheckImageNode.d.ts.map +1 -0
  72. package/dist/domain/workflow/nodes/CheckImageNode.js +254 -0
  73. package/dist/domain/workflow/nodes/CheckImageNode.js.map +1 -0
  74. package/dist/domain/workflow/nodes/CheckTextNode.d.ts +66 -0
  75. package/dist/domain/workflow/nodes/CheckTextNode.d.ts.map +1 -0
  76. package/dist/domain/workflow/nodes/CheckTextNode.js +530 -0
  77. package/dist/domain/workflow/nodes/CheckTextNode.js.map +1 -0
  78. package/dist/domain/workflow/nodes/GenerateImageNode.d.ts +44 -0
  79. package/dist/domain/workflow/nodes/GenerateImageNode.d.ts.map +1 -0
  80. package/dist/domain/workflow/nodes/GenerateImageNode.js +272 -0
  81. package/dist/domain/workflow/nodes/GenerateImageNode.js.map +1 -0
  82. package/dist/domain/workflow/nodes/OrganizeNode.d.ts +49 -0
  83. package/dist/domain/workflow/nodes/OrganizeNode.d.ts.map +1 -0
  84. package/dist/domain/workflow/nodes/OrganizeNode.js +241 -0
  85. package/dist/domain/workflow/nodes/OrganizeNode.js.map +1 -0
  86. package/dist/domain/workflow/nodes/SearchNode.d.ts +48 -0
  87. package/dist/domain/workflow/nodes/SearchNode.d.ts.map +1 -0
  88. package/dist/domain/workflow/nodes/SearchNode.js +151 -0
  89. package/dist/domain/workflow/nodes/SearchNode.js.map +1 -0
  90. package/dist/domain/workflow/nodes/WriteNode.d.ts +68 -0
  91. package/dist/domain/workflow/nodes/WriteNode.d.ts.map +1 -0
  92. package/dist/domain/workflow/nodes/WriteNode.js +431 -0
  93. package/dist/domain/workflow/nodes/WriteNode.js.map +1 -0
  94. package/dist/domain/workflow/nodes/config/index.js +287 -0
  95. package/dist/domain/workflow/nodes/domain/entities/Task.js +68 -0
  96. package/dist/domain/workflow/nodes/domain/workflow/State.js +200 -0
  97. package/dist/domain/workflow/nodes/domain/workflow/nodes/BaseNode.js +328 -0
  98. package/dist/domain/workflow/nodes/domain/workflow/nodes/CheckTextNode.js +500 -0
  99. package/dist/domain/workflow/nodes/index.d.ts +13 -0
  100. package/dist/domain/workflow/nodes/index.d.ts.map +1 -0
  101. package/dist/domain/workflow/nodes/index.js +13 -0
  102. package/dist/domain/workflow/nodes/index.js.map +1 -0
  103. package/dist/domain/workflow/nodes/infrastructure/logging/logger.js +275 -0
  104. package/dist/domain/workflow/nodes/services/llm/EnhancedLLMService.js +559 -0
  105. package/dist/index.d.ts +24 -0
  106. package/dist/index.d.ts.map +1 -0
  107. package/dist/index.js +34 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/infrastructure/cache/CacheService.d.ts +139 -0
  110. package/dist/infrastructure/cache/CacheService.d.ts.map +1 -0
  111. package/dist/infrastructure/cache/CacheService.js +419 -0
  112. package/dist/infrastructure/cache/CacheService.js.map +1 -0
  113. package/dist/infrastructure/cache/index.d.ts +5 -0
  114. package/dist/infrastructure/cache/index.d.ts.map +1 -0
  115. package/dist/infrastructure/cache/index.js +6 -0
  116. package/dist/infrastructure/cache/index.js.map +1 -0
  117. package/dist/infrastructure/database/BaseRepository.d.ts +98 -0
  118. package/dist/infrastructure/database/BaseRepository.d.ts.map +1 -0
  119. package/dist/infrastructure/database/BaseRepository.js +178 -0
  120. package/dist/infrastructure/database/BaseRepository.js.map +1 -0
  121. package/dist/infrastructure/database/MemoryTaskRepository.d.ts +77 -0
  122. package/dist/infrastructure/database/MemoryTaskRepository.d.ts.map +1 -0
  123. package/dist/infrastructure/database/MemoryTaskRepository.js +309 -0
  124. package/dist/infrastructure/database/MemoryTaskRepository.js.map +1 -0
  125. package/dist/infrastructure/database/PostgresQualityCheckRepository.d.ts +36 -0
  126. package/dist/infrastructure/database/PostgresQualityCheckRepository.d.ts.map +1 -0
  127. package/dist/infrastructure/database/PostgresQualityCheckRepository.js +89 -0
  128. package/dist/infrastructure/database/PostgresQualityCheckRepository.js.map +1 -0
  129. package/dist/infrastructure/database/PostgresTaskRepository.d.ts +94 -0
  130. package/dist/infrastructure/database/PostgresTaskRepository.d.ts.map +1 -0
  131. package/dist/infrastructure/database/PostgresTaskRepository.js +364 -0
  132. package/dist/infrastructure/database/PostgresTaskRepository.js.map +1 -0
  133. package/dist/infrastructure/database/ResultRepository.d.ts +41 -0
  134. package/dist/infrastructure/database/ResultRepository.d.ts.map +1 -0
  135. package/dist/infrastructure/database/ResultRepository.js +86 -0
  136. package/dist/infrastructure/database/ResultRepository.js.map +1 -0
  137. package/dist/infrastructure/database/SQLiteTaskRepository.d.ts +101 -0
  138. package/dist/infrastructure/database/SQLiteTaskRepository.d.ts.map +1 -0
  139. package/dist/infrastructure/database/SQLiteTaskRepository.js +548 -0
  140. package/dist/infrastructure/database/SQLiteTaskRepository.js.map +1 -0
  141. package/dist/infrastructure/database/index.d.ts +32 -0
  142. package/dist/infrastructure/database/index.d.ts.map +1 -0
  143. package/dist/infrastructure/database/index.js +72 -0
  144. package/dist/infrastructure/database/index.js.map +1 -0
  145. package/dist/infrastructure/logging/logger.d.ts +69 -0
  146. package/dist/infrastructure/logging/logger.d.ts.map +1 -0
  147. package/dist/infrastructure/logging/logger.js +169 -0
  148. package/dist/infrastructure/logging/logger.js.map +1 -0
  149. package/dist/infrastructure/monitoring/LoggingService.d.ts +109 -0
  150. package/dist/infrastructure/monitoring/LoggingService.d.ts.map +1 -0
  151. package/dist/infrastructure/monitoring/LoggingService.js +198 -0
  152. package/dist/infrastructure/monitoring/LoggingService.js.map +1 -0
  153. package/dist/infrastructure/monitoring/MetricsService.d.ts +112 -0
  154. package/dist/infrastructure/monitoring/MetricsService.d.ts.map +1 -0
  155. package/dist/infrastructure/monitoring/MetricsService.js +362 -0
  156. package/dist/infrastructure/monitoring/MetricsService.js.map +1 -0
  157. package/dist/infrastructure/monitoring/SentryService.d.ts +108 -0
  158. package/dist/infrastructure/monitoring/SentryService.d.ts.map +1 -0
  159. package/dist/infrastructure/monitoring/SentryService.js +282 -0
  160. package/dist/infrastructure/monitoring/SentryService.js.map +1 -0
  161. package/dist/infrastructure/monitoring/index.d.ts +7 -0
  162. package/dist/infrastructure/monitoring/index.d.ts.map +1 -0
  163. package/dist/infrastructure/monitoring/index.js +10 -0
  164. package/dist/infrastructure/monitoring/index.js.map +1 -0
  165. package/dist/infrastructure/queue/TaskQueue.d.ts +110 -0
  166. package/dist/infrastructure/queue/TaskQueue.d.ts.map +1 -0
  167. package/dist/infrastructure/queue/TaskQueue.js +363 -0
  168. package/dist/infrastructure/queue/TaskQueue.js.map +1 -0
  169. package/dist/infrastructure/queue/index.d.ts +5 -0
  170. package/dist/infrastructure/queue/index.d.ts.map +1 -0
  171. package/dist/infrastructure/queue/index.js +5 -0
  172. package/dist/infrastructure/queue/index.js.map +1 -0
  173. package/dist/infrastructure/redis/connection.d.ts +61 -0
  174. package/dist/infrastructure/redis/connection.d.ts.map +1 -0
  175. package/dist/infrastructure/redis/connection.js +184 -0
  176. package/dist/infrastructure/redis/connection.js.map +1 -0
  177. package/dist/infrastructure/redis/index.d.ts +5 -0
  178. package/dist/infrastructure/redis/index.d.ts.map +1 -0
  179. package/dist/infrastructure/redis/index.js +5 -0
  180. package/dist/infrastructure/redis/index.js.map +1 -0
  181. package/dist/infrastructure/security/ApiKeyService.d.ts +103 -0
  182. package/dist/infrastructure/security/ApiKeyService.d.ts.map +1 -0
  183. package/dist/infrastructure/security/ApiKeyService.js +250 -0
  184. package/dist/infrastructure/security/ApiKeyService.js.map +1 -0
  185. package/dist/infrastructure/security/QuotaService.d.ts +87 -0
  186. package/dist/infrastructure/security/QuotaService.d.ts.map +1 -0
  187. package/dist/infrastructure/security/QuotaService.js +303 -0
  188. package/dist/infrastructure/security/QuotaService.js.map +1 -0
  189. package/dist/infrastructure/security/RateLimiter.d.ts +104 -0
  190. package/dist/infrastructure/security/RateLimiter.d.ts.map +1 -0
  191. package/dist/infrastructure/security/RateLimiter.js +331 -0
  192. package/dist/infrastructure/security/RateLimiter.js.map +1 -0
  193. package/dist/infrastructure/security/index.d.ts +7 -0
  194. package/dist/infrastructure/security/index.d.ts.map +1 -0
  195. package/dist/infrastructure/security/index.js +10 -0
  196. package/dist/infrastructure/security/index.js.map +1 -0
  197. package/dist/monitoring/index.d.ts +5 -0
  198. package/dist/monitoring/index.d.ts.map +1 -0
  199. package/dist/monitoring/index.js +5 -0
  200. package/dist/monitoring/index.js.map +1 -0
  201. package/dist/monitoring/server.d.ts +14 -0
  202. package/dist/monitoring/server.d.ts.map +1 -0
  203. package/dist/monitoring/server.js +99 -0
  204. package/dist/monitoring/server.js.map +1 -0
  205. package/dist/presentation/cli/commands/cancel.d.ts +8 -0
  206. package/dist/presentation/cli/commands/cancel.d.ts.map +1 -0
  207. package/dist/presentation/cli/commands/cancel.js +57 -0
  208. package/dist/presentation/cli/commands/cancel.js.map +1 -0
  209. package/dist/presentation/cli/commands/create.d.ts +8 -0
  210. package/dist/presentation/cli/commands/create.d.ts.map +1 -0
  211. package/dist/presentation/cli/commands/create.js +368 -0
  212. package/dist/presentation/cli/commands/create.js.map +1 -0
  213. package/dist/presentation/cli/commands/result.d.ts +8 -0
  214. package/dist/presentation/cli/commands/result.d.ts.map +1 -0
  215. package/dist/presentation/cli/commands/result.js +121 -0
  216. package/dist/presentation/cli/commands/result.js.map +1 -0
  217. package/dist/presentation/cli/commands/status.d.ts +8 -0
  218. package/dist/presentation/cli/commands/status.d.ts.map +1 -0
  219. package/dist/presentation/cli/commands/status.js +92 -0
  220. package/dist/presentation/cli/commands/status.js.map +1 -0
  221. package/dist/presentation/cli/index.d.ts +8 -0
  222. package/dist/presentation/cli/index.d.ts.map +1 -0
  223. package/dist/presentation/cli/index.js +32 -0
  224. package/dist/presentation/cli/index.js.map +1 -0
  225. package/dist/presentation/cli/utils/cleanup.d.ts +14 -0
  226. package/dist/presentation/cli/utils/cleanup.d.ts.map +1 -0
  227. package/dist/presentation/cli/utils/cleanup.js +62 -0
  228. package/dist/presentation/cli/utils/cleanup.js.map +1 -0
  229. package/dist/presentation/cli/utils/formatter.d.ts +28 -0
  230. package/dist/presentation/cli/utils/formatter.d.ts.map +1 -0
  231. package/dist/presentation/cli/utils/formatter.js +68 -0
  232. package/dist/presentation/cli/utils/formatter.js.map +1 -0
  233. package/dist/presentation/cli.d.ts +7 -0
  234. package/dist/presentation/cli.d.ts.map +1 -0
  235. package/dist/presentation/cli.js +8 -0
  236. package/dist/presentation/cli.js.map +1 -0
  237. package/dist/presentation/monitor-cli.d.ts +8 -0
  238. package/dist/presentation/monitor-cli.d.ts.map +1 -0
  239. package/dist/presentation/monitor-cli.js +44 -0
  240. package/dist/presentation/monitor-cli.js.map +1 -0
  241. package/dist/presentation/worker-cli.d.ts +8 -0
  242. package/dist/presentation/worker-cli.d.ts.map +1 -0
  243. package/dist/presentation/worker-cli.js +51 -0
  244. package/dist/presentation/worker-cli.js.map +1 -0
  245. package/dist/schedulers/TaskScheduler.d.ts +99 -0
  246. package/dist/schedulers/TaskScheduler.d.ts.map +1 -0
  247. package/dist/schedulers/TaskScheduler.js +233 -0
  248. package/dist/schedulers/TaskScheduler.js.map +1 -0
  249. package/dist/schedulers/index.d.ts +5 -0
  250. package/dist/schedulers/index.d.ts.map +1 -0
  251. package/dist/schedulers/index.js +5 -0
  252. package/dist/schedulers/index.js.map +1 -0
  253. package/dist/services/image/ImageService.d.ts +68 -0
  254. package/dist/services/image/ImageService.d.ts.map +1 -0
  255. package/dist/services/image/ImageService.js +166 -0
  256. package/dist/services/image/ImageService.js.map +1 -0
  257. package/dist/services/index.d.ts +8 -0
  258. package/dist/services/index.d.ts.map +1 -0
  259. package/dist/services/index.js +12 -0
  260. package/dist/services/index.js.map +1 -0
  261. package/dist/services/llm/EnhancedLLMService.d.ts +148 -0
  262. package/dist/services/llm/EnhancedLLMService.d.ts.map +1 -0
  263. package/dist/services/llm/EnhancedLLMService.js +425 -0
  264. package/dist/services/llm/EnhancedLLMService.js.map +1 -0
  265. package/dist/services/llm/LLMService.d.ts +103 -0
  266. package/dist/services/llm/LLMService.d.ts.map +1 -0
  267. package/dist/services/llm/LLMService.js +212 -0
  268. package/dist/services/llm/LLMService.js.map +1 -0
  269. package/dist/services/quality/HardRuleChecker.d.ts +143 -0
  270. package/dist/services/quality/HardRuleChecker.d.ts.map +1 -0
  271. package/dist/services/quality/HardRuleChecker.js +353 -0
  272. package/dist/services/quality/HardRuleChecker.js.map +1 -0
  273. package/dist/services/quality/LLMEvaluator.d.ts +105 -0
  274. package/dist/services/quality/LLMEvaluator.d.ts.map +1 -0
  275. package/dist/services/quality/LLMEvaluator.js +312 -0
  276. package/dist/services/quality/LLMEvaluator.js.map +1 -0
  277. package/dist/services/quality/QualityCheckService.d.ts +112 -0
  278. package/dist/services/quality/QualityCheckService.d.ts.map +1 -0
  279. package/dist/services/quality/QualityCheckService.js +342 -0
  280. package/dist/services/quality/QualityCheckService.js.map +1 -0
  281. package/dist/services/quality/QualityService.d.ts +75 -0
  282. package/dist/services/quality/QualityService.d.ts.map +1 -0
  283. package/dist/services/quality/QualityService.js +360 -0
  284. package/dist/services/quality/QualityService.js.map +1 -0
  285. package/dist/services/quality/index.d.ts +7 -0
  286. package/dist/services/quality/index.d.ts.map +1 -0
  287. package/dist/services/quality/index.js +10 -0
  288. package/dist/services/quality/index.js.map +1 -0
  289. package/dist/services/search/SearchService.d.ts +79 -0
  290. package/dist/services/search/SearchService.d.ts.map +1 -0
  291. package/dist/services/search/SearchService.js +193 -0
  292. package/dist/services/search/SearchService.js.map +1 -0
  293. package/dist/workers/TaskWorker.d.ts +61 -0
  294. package/dist/workers/TaskWorker.d.ts.map +1 -0
  295. package/dist/workers/TaskWorker.js +256 -0
  296. package/dist/workers/TaskWorker.js.map +1 -0
  297. package/dist/workers/index.d.ts +5 -0
  298. package/dist/workers/index.d.ts.map +1 -0
  299. package/dist/workers/index.js +5 -0
  300. package/dist/workers/index.js.map +1 -0
  301. package/docs/DOCUMENTATION-ANALYSIS.md +190 -0
  302. package/docs/README.md +145 -0
  303. package/docs/SOURCE-CODE-ANALYSIS.md +1107 -0
  304. package/docs/architecture-complete.md +5524 -0
  305. package/docs/archive/implementation/implementation-analysis/README.md +244 -0
  306. package/docs/archive/implementation/implementation-analysis/implementation-analysis-context.md +483 -0
  307. package/docs/archive/implementation/implementation-analysis/implementation-analysis-plan.md +1242 -0
  308. package/docs/archive/implementation/implementation-analysis/implementation-analysis-tasks.md +777 -0
  309. package/docs/archive/phases/phase-1/phase-1-completion-summary.md +284 -0
  310. package/docs/archive/phases/phase-1/phase-1-implementation-guide.md +1380 -0
  311. package/docs/archive/phases/phase-2/phase-2a/phase-2a-completion-summary.md +443 -0
  312. package/docs/archive/phases/phase-2/phase-2b/phase-2b-completion-report.md +430 -0
  313. package/docs/archive/phases/phase-2/phase-2b/phase-2b-completion-summary.md +592 -0
  314. package/docs/archive/phases/phase-2/phase-2b/phase-2b-final-summary.md +371 -0
  315. package/docs/archive/phases/phase-2/phase-2b/phase-2b-preparation-complete.md +343 -0
  316. package/docs/archive/phases/phase-2/phase-2b/phase-2b-preparation.md +945 -0
  317. package/docs/archive/phases/phase-2/phase-2b/phase-2b-progress-update.md +366 -0
  318. package/docs/archive/phases/phase-3/phase-3-completion-summary.md +354 -0
  319. package/docs/archive/phases/phase-3/phase-3-development-plan.md +878 -0
  320. package/docs/archive/phases/phase-3/phase-3-quick-start.md +324 -0
  321. package/docs/archive/phases/phase-4/phase-4-completion-summary.md +708 -0
  322. package/docs/archive/phases/phase-4/phase-4-development-plan.md +740 -0
  323. package/docs/archive/phases/phase-4/phase-4-quick-start.md +632 -0
  324. package/docs/archive/phases/phase-4/phase-4-session-3-security-testing.md +484 -0
  325. package/docs/archive/phases/phase-4/phase-4-session-4-unit-tests.md +550 -0
  326. package/docs/archive/phases/phase-4/phase-4-session-5-security-tests.md +564 -0
  327. package/docs/archive/phases/phase-4/phase-4-session-6-cache-integration.md +456 -0
  328. package/docs/archive/phases/phase-4/phase-4-session-7-test-fixes.md +348 -0
  329. package/docs/archive/phases/phase-4/phase-4-session-8-taskqueue-fixes.md +323 -0
  330. package/docs/archive/phases/phase-4/phase-4-session-summary-continued.md +373 -0
  331. package/docs/archive/phases/phase-4/phase-4-session-summary.md +595 -0
  332. package/docs/archive/reports/progress-reports/PHASE_0_PROGRESS.md +242 -0
  333. package/docs/archive/reports/progress-reports/PHASE_0_SUMMARY.md +262 -0
  334. package/docs/archive/reports/progress-reports/PHASE_1_2_ISSUES.md +399 -0
  335. package/docs/archive/reports/progress-reports/PHASE_1_PROGRESS.md +388 -0
  336. package/docs/archive/reports/progress-reports/PHASE_3_PREPARATION.md +574 -0
  337. package/docs/archive/reports/progress-reports/current-progress-update.md +294 -0
  338. package/docs/archive/reports/progress-reports/final-summary.md +215 -0
  339. package/docs/archive/reports/progress-reports/implementation-summary.md +287 -0
  340. package/docs/archive/reports/progress-reports/project-progress-report.md +440 -0
  341. package/docs/archive/reports/progress-reports/project-progress.md +386 -0
  342. package/docs/archive/reports/test-reports/TEST-COVERAGE-REPORT.md +441 -0
  343. package/docs/archive/reports/test-reports/e2e-test-report.md +293 -0
  344. package/docs/archive/reports/test-reports/final-test-report.md +367 -0
  345. package/docs/archive/reports/test-reports/real-env-test-report.md +391 -0
  346. package/docs/archive/reports/test-reports/test-completion-summary.md +356 -0
  347. package/docs/archive/reports/test-reports/test-report.md +371 -0
  348. package/docs/archive/sessions/session-2-summary.md +429 -0
  349. package/docs/archive/sessions/session-3-summary.md +395 -0
  350. package/docs/archive/sessions/session-summary.md +370 -0
  351. package/docs/config-system-update.md +239 -0
  352. package/docs/database-refactoring-PLAN.md +199 -0
  353. package/docs/database-refactoring-SUMMARY.md +384 -0
  354. package/docs/quality-check-architecture.md +1030 -0
  355. package/docs/quick-start.md +388 -0
  356. package/docs/references/bullmq-quick-reference.md +525 -0
  357. package/docs/references/monitoring-optimization-guide.md +871 -0
  358. package/docs/references/performance-optimization-guide.md +933 -0
  359. package/docs/storage-guide.md +612 -0
  360. package/docs/test-implementation-PLAN.md +223 -0
  361. package/docs/test-implementation-SUMMARY.md +194 -0
  362. package/docs/user-guide.md +719 -0
  363. package/docs/workflow-architecture.md +549 -0
  364. package/package.json +126 -0
  365. package/src/application/workflow/SyncExecutor.ts +444 -0
  366. package/src/application/workflow/types.ts +57 -0
  367. package/src/config/index.ts +352 -0
  368. package/src/domain/entities/QualityCheck.ts +202 -0
  369. package/src/domain/entities/Result.ts +130 -0
  370. package/src/domain/entities/Task.ts +178 -0
  371. package/src/domain/entities/TaskStep.ts +188 -0
  372. package/src/domain/entities/TokenUsage.ts +119 -0
  373. package/src/domain/entities/index.ts +20 -0
  374. package/src/domain/repositories/QualityCheckRepository.ts +52 -0
  375. package/src/domain/repositories/ResultRepository.ts +47 -0
  376. package/src/domain/repositories/TaskRepository.ts +271 -0
  377. package/src/domain/workflow/CheckpointManager.ts +283 -0
  378. package/src/domain/workflow/ContentCreatorGraph.ts +446 -0
  379. package/src/domain/workflow/State.ts +321 -0
  380. package/src/domain/workflow/index.ts +18 -0
  381. package/src/domain/workflow/nodes/BaseNode.ts +325 -0
  382. package/src/domain/workflow/nodes/CheckImageNode.ts +325 -0
  383. package/src/domain/workflow/nodes/CheckTextNode.ts +709 -0
  384. package/src/domain/workflow/nodes/GenerateImageNode.ts +342 -0
  385. package/src/domain/workflow/nodes/OrganizeNode.ts +304 -0
  386. package/src/domain/workflow/nodes/SearchNode.ts +192 -0
  387. package/src/domain/workflow/nodes/WriteNode.ts +505 -0
  388. package/src/domain/workflow/nodes/index.ts +13 -0
  389. package/src/index.ts +43 -0
  390. package/src/infrastructure/cache/CacheService.ts +483 -0
  391. package/src/infrastructure/cache/index.ts +6 -0
  392. package/src/infrastructure/database/BaseRepository.ts +214 -0
  393. package/src/infrastructure/database/MemoryTaskRepository.ts +377 -0
  394. package/src/infrastructure/database/PostgresQualityCheckRepository.ts +115 -0
  395. package/src/infrastructure/database/PostgresTaskRepository.ts +424 -0
  396. package/src/infrastructure/database/ResultRepository.ts +113 -0
  397. package/src/infrastructure/database/SQLiteTaskRepository.ts +651 -0
  398. package/src/infrastructure/database/index.ts +83 -0
  399. package/src/infrastructure/logging/logger.ts +231 -0
  400. package/src/infrastructure/monitoring/LoggingService.ts +292 -0
  401. package/src/infrastructure/monitoring/MetricsService.ts +468 -0
  402. package/src/infrastructure/monitoring/SentryService.ts +345 -0
  403. package/src/infrastructure/monitoring/index.ts +12 -0
  404. package/src/infrastructure/queue/TaskQueue.ts +429 -0
  405. package/src/infrastructure/queue/index.ts +5 -0
  406. package/src/infrastructure/redis/connection.ts +215 -0
  407. package/src/infrastructure/redis/index.ts +5 -0
  408. package/src/infrastructure/security/ApiKeyService.ts +340 -0
  409. package/src/infrastructure/security/QuotaService.ts +411 -0
  410. package/src/infrastructure/security/RateLimiter.ts +417 -0
  411. package/src/infrastructure/security/index.ts +12 -0
  412. package/src/monitoring/index.ts +5 -0
  413. package/src/monitoring/server.ts +109 -0
  414. package/src/presentation/cli/commands/cancel.ts +64 -0
  415. package/src/presentation/cli/commands/create.ts +400 -0
  416. package/src/presentation/cli/commands/result.ts +136 -0
  417. package/src/presentation/cli/commands/status.ts +102 -0
  418. package/src/presentation/cli/index.ts +39 -0
  419. package/src/presentation/cli/utils/cleanup.ts +65 -0
  420. package/src/presentation/cli/utils/formatter.ts +74 -0
  421. package/src/presentation/cli.ts +8 -0
  422. package/src/presentation/monitor-cli.ts +52 -0
  423. package/src/presentation/worker-cli.ts +62 -0
  424. package/src/schedulers/TaskScheduler.ts +314 -0
  425. package/src/schedulers/index.ts +11 -0
  426. package/src/services/image/ImageService.ts +221 -0
  427. package/src/services/index.ts +15 -0
  428. package/src/services/llm/EnhancedLLMService.ts +596 -0
  429. package/src/services/llm/LLMService.ts +310 -0
  430. package/src/services/quality/HardRuleChecker.ts +509 -0
  431. package/src/services/quality/LLMEvaluator.ts +400 -0
  432. package/src/services/quality/QualityCheckService.ts +473 -0
  433. package/src/services/quality/QualityService.ts +445 -0
  434. package/src/services/quality/index.ts +12 -0
  435. package/src/services/search/SearchService.ts +266 -0
  436. package/src/types/global.d.ts +17 -0
  437. package/src/workers/TaskWorker.ts +320 -0
  438. package/src/workers/index.ts +5 -0
@@ -0,0 +1,740 @@
1
+ # 阶段 4: 质量检查与监控优化 - 开发计划
2
+
3
+ **日期**: 2026-01-19
4
+ **阶段**: 阶段 4 - 质量检查与监控优化
5
+ **预计工期**: 5-7 天
6
+ **依赖**: 阶段 3 完成 ✅
7
+
8
+ ---
9
+
10
+ ## 📋 阶段目标
11
+
12
+ 完善系统的质量检查、监控、性能和安全性:
13
+ 1. ✅ 质量检查服务增强和完善
14
+ 2. ✅ 监控系统优化(Sentry + Prometheus + Grafana)
15
+ 3. ✅ 性能优化(缓存、数据库、LLM 调用)
16
+ 4. ✅ 安全加固(认证、授权、配额管理)
17
+
18
+ ---
19
+
20
+ ## 🏗️ 架构概览
21
+
22
+ ### 质量检查架构
23
+
24
+ ```
25
+ 文章内容
26
+
27
+ ┌──────────────────────────────────────┐
28
+ │ 硬规则检查(确定性) │
29
+ │ - 字数范围 │
30
+ │ - 关键词覆盖 │
31
+ │ - 结构要求 │
32
+ │ - 禁用词过滤 │
33
+ └──────────────────────────────────────┘
34
+ ↓ 通过?
35
+ ├─ ❌ → 失败(违反硬性约束)
36
+ └─ ✅ → 继续
37
+
38
+ ┌──────────────────────────────────────┐
39
+ │ 软评分检查(LLM 评审) │
40
+ │ - 相关性 (30%) │
41
+ │ - 连贯性 (30%) │
42
+ │ - 完整性 (20%) │
43
+ │ - 可读性 (20%) │
44
+ └──────────────────────────────────────┘
45
+ ↓ 分数 >= 7.0?
46
+ ├─ ❌ → 重试(最多 3 次)
47
+ └─ ✅ → 通过
48
+ ```
49
+
50
+ ### 监控架构
51
+
52
+ ```
53
+ ┌─────────────────────────────────────────┐
54
+ │ 应用层 │
55
+ │ - Winston Logger │
56
+ │ - Sentry Error Tracking │
57
+ │ - Custom Metrics │
58
+ └──────────────┬──────────────────────────┘
59
+
60
+ ┌─────────────────────────────────────────┐
61
+ │ 采集层 │
62
+ │ - Prometheus Exporter │
63
+ │ - StatsD Client │
64
+ │ - OpenTelemetry │
65
+ └──────────────┬──────────────────────────┘
66
+
67
+ ┌─────────────────────────────────────────┐
68
+ │ 存储层 │
69
+ │ - Prometheus TSDB │
70
+ │ - Sentry Cloud │
71
+ │ - Elasticsearch (Logs) │
72
+ └──────────────┬──────────────────────────┘
73
+
74
+ ┌─────────────────────────────────────────┐
75
+ │ 可视化层 │
76
+ │ - Grafana Dashboard │
77
+ │ - Sentry Dashboard │
78
+ │ - Kibana (Logs) │
79
+ └─────────────────────────────────────────┘
80
+ ```
81
+
82
+ ---
83
+
84
+ ## 📦 技术栈
85
+
86
+ ### 质量检查
87
+ ```json
88
+ {
89
+ "dependencies": {
90
+ "zod": "^4.3.5", // 规则验证
91
+ "chalk": "^5.6.2" // 终端输出
92
+ }
93
+ }
94
+ ```
95
+
96
+ ### 监控和日志
97
+ ```json
98
+ {
99
+ "dependencies": {
100
+ "winston": "^3.19.0", // 日志框架
101
+ "winston-daily-rotate-file": "^5.0.0", // 日志轮转
102
+ "@sentry/node": "^8.0.0", // Sentry SDK
103
+ "prom-client": "^15.0.0", // Prometheus 客户端
104
+ "opentelemetry": "^1.8.0", // OpenTelemetry
105
+ "@opentelemetry/api": "^1.7.0",
106
+ "@opentelemetry/sdk-node": "^0.45.0"
107
+ }
108
+ }
109
+ ```
110
+
111
+ ### 性能优化
112
+ ```json
113
+ {
114
+ "dependencies": {
115
+ "ioredis": "^5.9.2", // Redis 客户端
116
+ "cache-manager": "^5.2.0", // 缓存管理
117
+ "cache-manager-ioredis": "^2.1.0"
118
+ }
119
+ }
120
+ ```
121
+
122
+ ---
123
+
124
+ ## 🔧 组件设计
125
+
126
+ ### 1. 质量检查服务
127
+
128
+ **文件**: `src/services/quality/QualityCheckService.ts`
129
+
130
+ **职责**:
131
+ - 硬规则检查(字数、关键词、结构)
132
+ - LLM 软评分(相关性、连贯性、完整性、可读性)
133
+ - 智能反馈生成
134
+ - 重试机制管理
135
+
136
+ **接口设计**:
137
+ ```typescript
138
+ export interface QualityCheckOptions {
139
+ hardRules?: {
140
+ minWords?: number;
141
+ maxWords?: number;
142
+ keywords?: string[];
143
+ requireTitle?: boolean;
144
+ requireIntro?: boolean;
145
+ };
146
+ softScoring?: {
147
+ enabled: boolean;
148
+ passThreshold: number;
149
+ maxAttempts: number;
150
+ };
151
+ }
152
+
153
+ export interface QualityCheckResult {
154
+ passed: boolean;
155
+ score: number;
156
+ hardConstraintsPassed: boolean;
157
+ details: {
158
+ relevance?: number;
159
+ coherence?: number;
160
+ completeness?: number;
161
+ readability?: number;
162
+ };
163
+ fixSuggestions?: string[];
164
+ checkedAt: number;
165
+ }
166
+ ```
167
+
168
+ ---
169
+
170
+ ### 2. 监控服务
171
+
172
+ **文件**: `src/infrastructure/monitoring/MetricsService.ts`
173
+
174
+ **职责**:
175
+ - Prometheus 指标采集
176
+ - 自定义业务指标
177
+ - 性能指标收集
178
+
179
+ **关键指标**:
180
+ ```typescript
181
+ // 任务指标
182
+ - task_created_total
183
+ - task_completed_total
184
+ - task_failed_total
185
+ - task_duration_seconds
186
+
187
+ // LLM 指标
188
+ - llm_request_total
189
+ - llm_request_duration_seconds
190
+ - llm_token_usage_total
191
+ - llm_retry_total
192
+
193
+ // 队列指标
194
+ - queue_waiting_tasks
195
+ - queue_processing_tasks
196
+ - queue_job_duration_seconds
197
+
198
+ // 系统指标
199
+ - memory_usage_bytes
200
+ - cpu_usage_percent
201
+ - active_workers_total
202
+ ```
203
+
204
+ ---
205
+
206
+ ### 3. 性能优化服务
207
+
208
+ **文件**: `src/infrastructure/cache/CacheService.ts`
209
+
210
+ **职责**:
211
+ - Redis 缓存管理
212
+ - LLM 响应缓存
213
+ - 搜索结果缓存
214
+ - 缓存失效策略
215
+
216
+ **缓存策略**:
217
+ ```typescript
218
+ // LLM 响应缓存(7天)
219
+ key: llm:response:{prompt_hash}
220
+ ttl: 7 * 24 * 3600
221
+
222
+ // 搜索结果缓存(1天)
223
+ key: search:result:{query_hash}
224
+ ttl: 24 * 3600
225
+
226
+ // 质量检查缓存(3天)
227
+ key: quality:check:{content_hash}
228
+ ttl: 3 * 24 * 3600
229
+ ```
230
+
231
+ ---
232
+
233
+ ### 4. 安全服务
234
+
235
+ **文件**: `src/infrastructure/security/SecurityService.ts`
236
+
237
+ **职责**:
238
+ - API Key 验证
239
+ - 配额管理
240
+ - 速率限制
241
+ - 敏感数据加密
242
+
243
+ **安全机制**:
244
+ ```typescript
245
+ // API Key 认证
246
+ - API Key 生成和验证
247
+ - API Key 过期管理
248
+ - 使用日志记录
249
+
250
+ // 配额管理
251
+ - 每日配额检查
252
+ - 配额预留和退款
253
+ - 超限拒绝
254
+
255
+ // 速率限制
256
+ - 滑动窗口算法
257
+ - IP 限流
258
+ - 用户级限流
259
+
260
+ // 数据加密
261
+ - API Key 加密存储
262
+ - 敏感配置加密
263
+ - 传输层加密(HTTPS)
264
+ ```
265
+
266
+ ---
267
+
268
+ ## 📂 文件结构
269
+
270
+ ```
271
+ src/
272
+ ├── services/
273
+ │ └── quality/
274
+ │ ├── QualityCheckService.ts # 质量检查服务
275
+ │ ├── HardRuleChecker.ts # 硬规则检查器
276
+ │ ├── LLMEvaluator.ts # LLM 评估器
277
+ │ └── index.ts
278
+ ├── infrastructure/
279
+ │ ├── monitoring/
280
+ │ │ ├── MetricsService.ts # Prometheus 指标
281
+ │ │ ├── SentryService.ts # Sentry 集成
282
+ │ │ ├── LoggingService.ts # 日志服务
283
+ │ │ └── index.ts
284
+ │ ├── cache/
285
+ │ │ ├── CacheService.ts # 缓存服务
286
+ │ │ ├── CacheManager.ts # 缓存管理器
287
+ │ │ └── index.ts
288
+ │ └── security/
289
+ │ ├── ApiKeyService.ts # API Key 管理
290
+ │ ├── QuotaService.ts # 配额管理
291
+ │ ├── RateLimiter.ts # 速率限制
292
+ │ └── index.ts
293
+ └── middleware/
294
+ ├── auth.middleware.ts # 认证中间件
295
+ ├── quota.middleware.ts # 配额中间件
296
+ └── ratelimit.middleware.ts # 限流中间件
297
+ ```
298
+
299
+ ---
300
+
301
+ ## 🚀 实施步骤
302
+
303
+ ### Step 1: 质量检查服务(2 天)
304
+
305
+ #### 1.1 硬规则检查器
306
+ ```typescript
307
+ // 文件: src/services/quality/HardRuleChecker.ts
308
+
309
+ export class HardRuleChecker {
310
+ check(content: string, constraints: HardConstraints): CheckResult {
311
+ // 1. 字数检查
312
+ const wordCount = this.countWords(content);
313
+
314
+ // 2. 关键词检查
315
+ const keywordsFound = this.checkKeywords(content, constraints.keywords);
316
+
317
+ // 3. 结构检查
318
+ const structureValid = this.checkStructure(content);
319
+
320
+ return {
321
+ passed: this.allPassed(wordCount, keywordsFound, structureValid),
322
+ details: { wordCount, keywordsFound, structureValid }
323
+ };
324
+ }
325
+ }
326
+ ```
327
+
328
+ #### 1.2 LLM 评估器
329
+ ```typescript
330
+ // 文件: src/services/quality/LLMEvaluator.ts
331
+
332
+ export class LLMEvaluator {
333
+ async evaluate(content: string, requirements: string): Promise<EvaluationResult> {
334
+ const prompt = this.buildEvaluationPrompt(content, requirements);
335
+
336
+ const response = await this.llmService.generate(prompt);
337
+
338
+ return this.parseEvaluationResponse(response);
339
+ }
340
+ }
341
+ ```
342
+
343
+ #### 1.3 智能反馈生成
344
+ ```typescript
345
+ // 生成改进建议
346
+ fixSuggestions: [
347
+ "字数不足:当前 450 字,最少需要 500 字",
348
+ "缺少关键词:人工智能",
349
+ "缺少导语段落"
350
+ ]
351
+ ```
352
+
353
+ ---
354
+
355
+ ### Step 2: 监控系统优化(1-2 天)
356
+
357
+ #### 2.1 Prometheus 集成
358
+ ```typescript
359
+ // 文件: src/infrastructure/monitoring/MetricsService.ts
360
+
361
+ import { register, Counter, Histogram, Gauge } from 'prom-client';
362
+
363
+ export class MetricsService {
364
+ private taskCreated = new Counter({
365
+ name: 'task_created_total',
366
+ help: 'Total number of tasks created'
367
+ });
368
+
369
+ private taskDuration = new Histogram({
370
+ name: 'task_duration_seconds',
371
+ help: 'Task execution duration',
372
+ buckets: [10, 30, 60, 120, 300, 600]
373
+ });
374
+
375
+ // 记录指标
376
+ recordTaskCreation(taskId: string) {
377
+ this.taskCreated.inc();
378
+ }
379
+
380
+ recordTaskDuration(duration: number) {
381
+ this.taskDuration.observe(duration);
382
+ }
383
+ }
384
+ ```
385
+
386
+ #### 2.2 Sentry 集成
387
+ ```typescript
388
+ // 文件: src/infrastructure/monitoring/SentryService.ts
389
+
390
+ import * as Sentry from '@sentry/node';
391
+
392
+ export class SentryService {
393
+ initialize(dsn: string) {
394
+ Sentry.init({
395
+ dsn,
396
+ environment: process.env.NODE_ENV,
397
+ tracesSampleRate: 0.1,
398
+ beforeSend(event, hint) {
399
+ // 过滤敏感信息
400
+ return this.filterSensitiveData(event);
401
+ }
402
+ });
403
+ }
404
+
405
+ captureException(error: Error) {
406
+ Sentry.captureException(error);
407
+ }
408
+ }
409
+ ```
410
+
411
+ #### 2.3 结构化日志
412
+ ```typescript
413
+ // 文件: src/infrastructure/monitoring/LoggingService.ts
414
+
415
+ import winston from 'winston';
416
+
417
+ export class LoggingService {
418
+ private logger = winston.createLogger({
419
+ level: 'info',
420
+ format: winston.format.combine(
421
+ winston.format.timestamp(),
422
+ winston.format.json()
423
+ ),
424
+ transports: [
425
+ new winston.transports.File({
426
+ filename: 'logs/error.log',
427
+ level: 'error'
428
+ }),
429
+ new winston.transports.File({
430
+ filename: 'logs/combined.log'
431
+ })
432
+ ]
433
+ });
434
+
435
+ log(context: string, message: string, meta?: any) {
436
+ this.logger.info({ context, message, ...meta });
437
+ }
438
+ }
439
+ ```
440
+
441
+ ---
442
+
443
+ ### Step 3: 性能优化(1-2 天)
444
+
445
+ #### 3.1 缓存服务
446
+ ```typescript
447
+ // 文件: src/infrastructure/cache/CacheService.ts
448
+
449
+ import { CacheManager } from './CacheManager.js';
450
+
451
+ export class CacheService {
452
+ private cache: CacheManager;
453
+
454
+ async get<T>(key: string): Promise<T | null> {
455
+ return this.cache.get<T>(key);
456
+ }
457
+
458
+ async set(key: string, value: any, ttl: number): Promise<void> {
459
+ return this.cache.set(key, value, ttl);
460
+ }
461
+
462
+ async invalidate(pattern: string): Promise<void> {
463
+ return this.cache.invalidate(pattern);
464
+ }
465
+ }
466
+ ```
467
+
468
+ #### 3.2 缓存策略
469
+ ```typescript
470
+ // LLM 响应缓存
471
+ async getCachedLLMResponse(prompt: string): Promise<string | null> {
472
+ const key = this.hashPrompt(prompt);
473
+ return this.cache.get(`llm:response:${key}`);
474
+ }
475
+
476
+ // 搜索结果缓存
477
+ async getCachedSearchResults(query: string): Promise<SearchResult[] | null> {
478
+ const key = this.hashQuery(query);
479
+ return this.cache.get(`search:result:${key}`);
480
+ }
481
+ ```
482
+
483
+ #### 3.3 数据库优化
484
+ ```sql
485
+ -- 添加索引
486
+ CREATE INDEX idx_tasks_status_created ON tasks(status, created_at);
487
+ CREATE INDEX idx_task_steps_task_id_status ON task_steps(task_id, status);
488
+ CREATE INDEX idx_token_usage_task_id ON token_usage(task_id);
489
+
490
+ -- 分区表(可选)
491
+ CREATE TABLE tasks_2026_01 PARTITION OF tasks
492
+ FOR VALUES FROM ('2026-01-01') TO ('2026-02-01');
493
+ ```
494
+
495
+ ---
496
+
497
+ ### Step 4: 安全加固(1-2 天)
498
+
499
+ #### 4.1 API Key 服务
500
+ ```typescript
501
+ // 文件: src/infrastructure/security/ApiKeyService.ts
502
+
503
+ export class ApiKeyService {
504
+ generateApiKey(): string {
505
+ const timestamp = Date.now().toString(36);
506
+ const random = crypto.randomBytes(16).toString('hex');
507
+ return `ccak_${timestamp}_${random}`;
508
+ }
509
+
510
+ async createApiKey(userId: string, metadata?: any): Promise<string> {
511
+ const apiKey = this.generateApiKey();
512
+ const hashedKey = this.hashApiKey(apiKey);
513
+
514
+ await this.db.insert('api_keys', {
515
+ key_hash: hashedKey,
516
+ user_id: userId,
517
+ metadata
518
+ });
519
+
520
+ return apiKey;
521
+ }
522
+
523
+ async verifyApiKey(apiKey: string): Promise<User | null> {
524
+ const hashedKey = this.hashApiKey(apiKey);
525
+ const keyRecord = await this.db.findOne('api_keys', { key_hash: hashedKey });
526
+
527
+ if (!keyRecord || !keyRecord.is_active) {
528
+ return null;
529
+ }
530
+
531
+ return this.db.findOne('users', { user_id: keyRecord.user_id });
532
+ }
533
+ }
534
+ ```
535
+
536
+ #### 4.2 配额服务
537
+ ```typescript
538
+ // 文件: src/infrastructure/security/QuotaService.ts
539
+
540
+ export class QuotaService {
541
+ async checkQuota(userId: string): Promise<boolean> {
542
+ const user = await this.getUserQuota(userId);
543
+ return user.quota_used_today < user.quota_daily;
544
+ }
545
+
546
+ async consumeQuota(userId: string, amount: number): Promise<void> {
547
+ await this.db.increment('users',
548
+ { quota_used_today: amount },
549
+ { user_id: userId }
550
+ );
551
+ }
552
+
553
+ async reserveQuota(userId: string, amount: number): Promise<boolean> {
554
+ // 使用乐观锁
555
+ const result = await this.db.query(`
556
+ UPDATE users
557
+ SET quota_used_today = quota_used_today + $1,
558
+ version = version + 1
559
+ WHERE user_id = $2
560
+ AND quota_used_today + $1 <= quota_daily
561
+ RETURNING *
562
+ `, [amount, userId]);
563
+
564
+ return result.rows.length > 0;
565
+ }
566
+ }
567
+ ```
568
+
569
+ #### 4.3 速率限制
570
+ ```typescript
571
+ // 文件: src/infrastructure/security/RateLimiter.ts
572
+
573
+ export class RateLimiter {
574
+ private slidingWindows = new Map<string, number[]>();
575
+
576
+ async checkLimit(identifier: string, limit: number, window: number): Promise<boolean> {
577
+ const now = Date.now();
578
+ const windowStart = now - window;
579
+
580
+ let timestamps = this.slidingWindows.get(identifier) || [];
581
+
582
+ // 清除过期记录
583
+ timestamps = timestamps.filter(t => t > windowStart);
584
+
585
+ if (timestamps.length >= limit) {
586
+ return false; // 超限
587
+ }
588
+
589
+ timestamps.push(now);
590
+ this.slidingWindows.set(identifier, timestamps);
591
+
592
+ return true;
593
+ }
594
+ }
595
+ ```
596
+
597
+ ---
598
+
599
+ ## 🧪 测试计划
600
+
601
+ ### 单元测试
602
+ ```typescript
603
+ // 质量检查测试
604
+ describe('QualityCheckService', () => {
605
+ it('should check hard rules', async () => {});
606
+ it('should evaluate with LLM', async () => {});
607
+ it('should generate fix suggestions', async () => {});
608
+ });
609
+
610
+ // 监控测试
611
+ describe('MetricsService', () => {
612
+ it('should record task creation', () => {});
613
+ it('should record task duration', () => {});
614
+ });
615
+
616
+ // 缓存测试
617
+ describe('CacheService', () => {
618
+ it('should cache and retrieve values', async () => {});
619
+ it('should invalidate cache', async () => {});
620
+ });
621
+
622
+ // 安全测试
623
+ describe('ApiKeyService', () => {
624
+ it('should generate and verify API keys', async () => {});
625
+ it('should enforce quotas', async () => {});
626
+ });
627
+ ```
628
+
629
+ ### 集成测试
630
+ ```typescript
631
+ // 端到端质量检查流程
632
+ describe('Quality Check E2E', () => {
633
+ it('should pass quality check', async () => {});
634
+ it('should fail and retry on low score', async () => {});
635
+ });
636
+
637
+ // 监控集成测试
638
+ describe('Monitoring Integration', () => {
639
+ it('should send metrics to Prometheus', async () => {});
640
+ it('should capture errors in Sentry', async () => {});
641
+ });
642
+ ```
643
+
644
+ ---
645
+
646
+ ## 📊 性能目标
647
+
648
+ | 指标 | 目标 | 测量方法 |
649
+ |------|------|---------|
650
+ | 质量检查延迟 | < 30 秒 | 测试耗时 |
651
+ | 缓存命中率 | > 60% | Prometheus 指标 |
652
+ | LLM 缓存命中率 | > 40% | 缓存统计 |
653
+ | API 响应时间 | < 100ms | p95 延迟 |
654
+ | 错误捕获率 | > 95% | Sentry 错误统计 |
655
+
656
+ ---
657
+
658
+ ## 🔐 安全目标
659
+
660
+ | 指标 | 目标 | 验证方法 |
661
+ |------|------|---------|
662
+ | API Key 加密 | SHA-256 | 代码审查 |
663
+ | 配额强制执行 | 100% | 集成测试 |
664
+ | 速率限制 | 滑动窗口 | 压力测试 |
665
+ | 敏感数据脱敏 | 日志中无密码 | 日志检查 |
666
+
667
+ ---
668
+
669
+ ## 📝 配置示例
670
+
671
+ ### 质量检查配置
672
+ ```yaml
673
+ # config/quality-check.yaml
674
+ quality_check:
675
+ hard_rules:
676
+ word_count:
677
+ min: 500
678
+ max: 5000
679
+ keywords:
680
+ required: true
681
+ match_all: false
682
+ structure:
683
+ require_title: true
684
+ require_intro: true
685
+
686
+ soft_scoring:
687
+ enabled: true
688
+ pass_threshold: 7.0
689
+ max_attempts: 3
690
+ ```
691
+
692
+ ### 监控配置
693
+ ```yaml
694
+ # config/monitoring.yaml
695
+ monitoring:
696
+ prometheus:
697
+ port: 9090
698
+ path: /metrics
699
+
700
+ sentry:
701
+ dsn: ${SENTRY_DSN}
702
+ environment: production
703
+ traces_sample_rate: 0.1
704
+
705
+ logging:
706
+ level: info
707
+ format: json
708
+ file:
709
+ - path: ./logs/combined.log
710
+ level: info
711
+ - path: ./logs/error.log
712
+ level: error
713
+ ```
714
+
715
+ ---
716
+
717
+ ## 📚 参考资料
718
+
719
+ ### 质量检查
720
+ - [LLM 评估最佳实践](https://arxiv.org/abs/2310.12345)
721
+ - [自动化质量评估](https://github.com/microsoft/semantic-kernel)
722
+
723
+ ### 监控
724
+ - [Prometheus 最佳实践](https://prometheus.io/docs/practices/)
725
+ - [Sentry Node.js 文档](https://docs.sentry.io/platforms/node/)
726
+ - [OpenTelemetry 规范](https://opentelemetry.io/docs/reference/specification/)
727
+
728
+ ### 性能优化
729
+ - [Redis 缓存策略](https://redis.io/docs/manual/patterns/)
730
+ - [Node.js 性能优化](https://nodejs.org/en/docs/guides/simple-profiling/)
731
+
732
+ ### 安全
733
+ - [OWASP API Security](https://owasp.org/www-project-api-security/)
734
+ - [API Key 最佳实践](https://datatracker.ietf.org/doc/html/rfc8046)
735
+
736
+ ---
737
+
738
+ **文档生成时间**: 2026-01-19
739
+ **预计开始时间**: 阶段 3 完成后
740
+ **预计完成时间**: 5-7 天后