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,878 @@
1
+ # 阶段 3: 异步任务系统 - 开发计划
2
+
3
+ **日期**: 2026-01-19
4
+ **阶段**: 阶段 3 - BullMQ 异步任务系统
5
+ **预计工期**: 7-10 天
6
+ **依赖**: 阶段 2b 完成 ✅
7
+
8
+ ---
9
+
10
+ ## 📋 阶段目标
11
+
12
+ 构建基于 BullMQ 的异步任务处理系统,实现:
13
+ 1. ✅ 任务队列管理(创建、调度、监控)
14
+ 2. ✅ Worker 进程池(多任务并发处理)
15
+ 3. ✅ 任务优先级和延迟执行
16
+ 4. ✅ 失败重试和错误恢复
17
+ 5. ✅ 实时监控和统计面板
18
+
19
+ ---
20
+
21
+ ## 🏗️ 架构设计
22
+
23
+ ### 系统架构图
24
+
25
+ ```
26
+ ┌─────────────────────────────────────────────────────────────┐
27
+ │ API Server │
28
+ │ (Express/Fastify) │
29
+ └─────────────────────┬───────────────────────────────────────┘
30
+
31
+
32
+ ┌─────────────────────────────────────────────────────────────┐
33
+ │ Task Scheduler │
34
+ │ (任务创建和调度器) │
35
+ └─────────────────────┬───────────────────────────────────────┘
36
+
37
+
38
+ ┌────────────────────────┐
39
+ │ Redis (BullMQ) │
40
+ │ - 任务队列 │
41
+ │ - 任务状态 │
42
+ │ - 重试策略 │
43
+ └────────────────────────┘
44
+
45
+ ┌───────────┴───────────┐
46
+ ↓ ↓
47
+ ┌──────────────────┐ ┌──────────────────┐
48
+ │ Worker 1 │ │ Worker 2 │
49
+ │ (Process 1) │ │ (Process 2) │
50
+ │ │ │ │
51
+ │ - Claim Task │ │ - Claim Task │
52
+ │ - Execute │ │ - Execute │
53
+ │ - Update Status │ │ - Update Status │
54
+ └──────────────────┘ └──────────────────┘
55
+ │ │
56
+ └───────────┬───────────┘
57
+
58
+ ┌────────────────────────┐
59
+ │ PostgreSQL Database │
60
+ │ - 任务持久化 │
61
+ │ - 状态快照 │
62
+ │ - 执行历史 │
63
+ └────────────────────────┘
64
+ ```
65
+
66
+ ---
67
+
68
+ ## 📦 技术栈
69
+
70
+ ### 核心依赖
71
+
72
+ ```json
73
+ {
74
+ "dependencies": {
75
+ "bullmq": "^5.0.0", // 任务队列
76
+ "ioredis": "^5.0.0", // Redis 客户端
77
+ "@bull-board/api": "^5.0.0", // 监控面板 API
78
+ "@bull-board/express": "^5.0.0", // Express 集成
79
+ "express": "^4.18.0" // Web 框架(用于监控面板)
80
+ },
81
+ "devDependencies": {
82
+ "@types/bullmq": "^4.0.0", // TypeScript 类型
83
+ "@types/express": "^4.17.0" // Express 类型
84
+ }
85
+ }
86
+ ```
87
+
88
+ ### Redis 配置
89
+
90
+ ```typescript
91
+ // src/infrastructure/queue/redis.ts
92
+ import Redis from 'ioredis';
93
+
94
+ export const redisConfig = {
95
+ host: process.env.REDIS_HOST || 'localhost',
96
+ port: parseInt(process.env.REDIS_PORT || '6379'),
97
+ password: process.env.REDIS_PASSWORD,
98
+ db: parseInt(process.env.REDIS_DB || '0'),
99
+ maxRetriesPerRequest: 3,
100
+ };
101
+
102
+ // 创建连接
103
+ export const createRedisConnection = () => {
104
+ return new Redis(redisConfig.host, {
105
+ port: redisConfig.port,
106
+ password: redisConfig.password,
107
+ db: redisConfig.db,
108
+ maxRetriesPerRequest: redisConfig.maxRetriesPerRequest,
109
+ });
110
+ };
111
+ ```
112
+
113
+ ---
114
+
115
+ ## 🔧 组件设计
116
+
117
+ ### 1. Task Queue (任务队列)
118
+
119
+ **文件**: `src/infrastructure/queue/TaskQueue.ts`
120
+
121
+ **职责**:
122
+ - 创建和管理任务队列
123
+ - 添加任务到队列
124
+ - 配置任务选项(优先级、重试、延迟)
125
+
126
+ **接口设计**:
127
+
128
+ ```typescript
129
+ import { Queue, JobsOptions } from 'bullmq';
130
+
131
+ export interface TaskJobData {
132
+ taskId: string;
133
+ mode: 'sync' | 'async';
134
+ topic: string;
135
+ requirements: string;
136
+ hardConstraints?: {
137
+ minWords?: number;
138
+ maxWords?: number;
139
+ keywords?: string[];
140
+ };
141
+ }
142
+
143
+ export class TaskQueue {
144
+ private queue: Queue<TaskJobData>;
145
+
146
+ constructor(connection: Redis) {
147
+ this.queue = new Queue<TaskJobData>('content-creator-tasks', {
148
+ connection,
149
+ defaultJobOptions: {
150
+ attempts: 3, // 默认重试 3 次
151
+ backoff: {
152
+ type: 'exponential',
153
+ delay: 2000, // 指数退避,初始 2 秒
154
+ },
155
+ removeOnComplete: {
156
+ count: 1000, // 保留最近 1000 个完成的任务
157
+ age: 24 * 3600, // 或保留 24 小时
158
+ },
159
+ removeOnFail: {
160
+ count: 5000, // 保留最近 5000 个失败的任务
161
+ age: 7 * 24 * 3600, // 或保留 7 天
162
+ },
163
+ },
164
+ });
165
+ }
166
+
167
+ /**
168
+ * 添加任务到队列
169
+ */
170
+ async addTask(
171
+ data: TaskJobData,
172
+ options?: JobsOptions
173
+ ): Promise<void> {
174
+ await this.queue.add('process-content', data, {
175
+ priority: this.calculatePriority(data),
176
+ ...options,
177
+ });
178
+ }
179
+
180
+ /**
181
+ * 添加延迟任务
182
+ */
183
+ async addDelayedTask(
184
+ data: TaskJobData,
185
+ delayMs: number
186
+ ): Promise<void> {
187
+ await this.queue.add('process-content', data, {
188
+ delay: delayMs,
189
+ priority: this.calculatePriority(data),
190
+ });
191
+ }
192
+
193
+ /**
194
+ * 计算任务优先级(1-10,数字越小优先级越高)
195
+ */
196
+ private calculatePriority(data: TaskJobData): number {
197
+ // 根据 mode 和其他因素计算优先级
198
+ if (data.mode === 'sync') {
199
+ return 1; // 同步任务优先级最高
200
+ }
201
+ return 5; // 默认优先级
202
+ }
203
+
204
+ /**
205
+ * 暂停队列
206
+ */
207
+ async pause(): Promise<void> {
208
+ await this.queue.pause();
209
+ }
210
+
211
+ /**
212
+ * 恢复队列
213
+ */
214
+ async resume(): Promise<void> {
215
+ await this.queue.resume();
216
+ }
217
+
218
+ /**
219
+ * 清空队列
220
+ */
221
+ async drain(): Promise<void> {
222
+ await this.queue.drain();
223
+ }
224
+
225
+ /**
226
+ * 获取队列统计信息
227
+ */
228
+ async getStats() {
229
+ return {
230
+ waiting: await this.queue.getWaitingCount(),
231
+ active: await this.queue.getActiveCount(),
232
+ completed: await this.queue.getCompletedCount(),
233
+ failed: await this.queue.getFailedCount(),
234
+ delayed: await this.queue.getDelayedCount(),
235
+ };
236
+ }
237
+ }
238
+ ```
239
+
240
+ ### 2. Task Worker (任务处理器)
241
+
242
+ **文件**: `src/workers/TaskWorker.ts`
243
+
244
+ **职责**:
245
+ - 从队列获取任务
246
+ - 执行工作流逻辑
247
+ - 更新任务状态
248
+ - 处理失败和重试
249
+
250
+ **接口设计**:
251
+
252
+ ```typescript
253
+ import { Worker, Job } from 'bullmq';
254
+ import { createRedisConnection } from '../infrastructure/queue/redis.js';
255
+ import { createTaskRepository } from '../infrastructure/database/index.js';
256
+ import { createSimpleContentCreatorGraph } from '../domain/workflow/index.js';
257
+
258
+ export class TaskWorker {
259
+ private worker: Worker<TaskJobData>;
260
+ private repo = createTaskRepository();
261
+
262
+ constructor(workerId: string, concurrency: number = 2) {
263
+ const connection = createRedisConnection();
264
+
265
+ this.worker = new Worker<TaskJobData>(
266
+ 'content-creator-tasks',
267
+ async (job: Job<TaskJobData>) => {
268
+ return await this.processJob(job);
269
+ },
270
+ {
271
+ connection,
272
+ concurrency, // 并发处理任务数
273
+ limiter: {
274
+ max: 10, // 每秒最多处理 10 个任务
275
+ duration: 1000,
276
+ },
277
+ }
278
+ );
279
+
280
+ // 事件监听
281
+ this.setupEventListeners(workerId);
282
+ }
283
+
284
+ /**
285
+ * 处理单个任务
286
+ */
287
+ private async processJob(job: Job<TaskJobData>) {
288
+ const { data } = job;
289
+ const logger = createLogger('TaskWorker');
290
+
291
+ logger.info('Processing job', {
292
+ jobId: job.id,
293
+ taskId: data.taskId,
294
+ topic: data.topic,
295
+ });
296
+
297
+ try {
298
+ // 1. 抢占任务(使用乐观锁)
299
+ const claimed = await this.repo.claimForProcessing(
300
+ data.taskId,
301
+ process.env.WORKER_ID || 'worker-1'
302
+ );
303
+
304
+ if (!claimed) {
305
+ throw new Error('Failed to claim task');
306
+ }
307
+
308
+ // 2. 创建工作流图
309
+ const graph = createSimpleContentCreatorGraph();
310
+
311
+ // 3. 创建初始状态
312
+ const initialState = createInitialState({
313
+ taskId: data.taskId,
314
+ mode: data.mode,
315
+ topic: data.topic,
316
+ requirements: data.requirements,
317
+ hardConstraints: data.hardConstraints,
318
+ });
319
+
320
+ // 4. 执行工作流
321
+ const result = await graph.invoke(initialState);
322
+
323
+ // 5. 保存结果
324
+ await this.repo.update(data.taskId, {
325
+ status: 'completed',
326
+ completedAt: new Date().toISOString(),
327
+ result: {
328
+ articleContent: result.articleContent,
329
+ searchResults: result.searchResults,
330
+ organizedInfo: result.organizedInfo,
331
+ },
332
+ });
333
+
334
+ logger.info('Job completed successfully', {
335
+ jobId: job.id,
336
+ taskId: data.taskId,
337
+ });
338
+
339
+ return {
340
+ success: true,
341
+ taskId: data.taskId,
342
+ };
343
+
344
+ } catch (error) {
345
+ logger.error('Job failed', {
346
+ jobId: job.id,
347
+ taskId: data.taskId,
348
+ error: error instanceof Error ? error.message : String(error),
349
+ });
350
+
351
+ // 保存错误信息
352
+ await this.repo.update(data.taskId, {
353
+ status: 'failed',
354
+ error: error instanceof Error ? error.message : String(error),
355
+ });
356
+
357
+ throw error; // 抛出错误以触发 BullMQ 重试
358
+ }
359
+ }
360
+
361
+ /**
362
+ * 设置事件监听器
363
+ */
364
+ private setupEventListeners(workerId: string) {
365
+ this.worker.on('completed', (job: Job, result) => {
366
+ console.log(`[${workerId}] Job ${job.id} completed`);
367
+ });
368
+
369
+ this.worker.on('failed', (job: Job | undefined, error: Error) => {
370
+ console.error(`[${workerId}] Job ${job?.id} failed:`, error.message);
371
+ });
372
+
373
+ this.worker.on('progress', (job: Job, progress) => {
374
+ console.log(`[${workerId}] Job ${job.id} progress:`, progress);
375
+ });
376
+ }
377
+
378
+ /**
379
+ * 启动 Worker
380
+ */
381
+ async start(): Promise<void> {
382
+ await this.worker.waitUntilReady();
383
+ console.log('Worker started');
384
+ }
385
+
386
+ /**
387
+ * 停止 Worker
388
+ */
389
+ async close(): Promise<void> {
390
+ await this.worker.close();
391
+ console.log('Worker closed');
392
+ }
393
+ }
394
+ ```
395
+
396
+ ### 3. Task Scheduler (任务调度器)
397
+
398
+ **文件**: `src/schedulers/TaskScheduler.ts`
399
+
400
+ **职责**:
401
+ - 接收 API 请求创建任务
402
+ - 将任务添加到队列
403
+ - 返回任务 ID 给客户端
404
+
405
+ **接口设计**:
406
+
407
+ ```typescript
408
+ import { TaskQueue } from '../infrastructure/queue/TaskQueue.js';
409
+ import { createTaskRepository } from '../infrastructure/database/index.js';
410
+ import { v4 as uuidv4 } from 'uuid';
411
+
412
+ export interface CreateTaskRequest {
413
+ userId?: string;
414
+ mode: 'sync' | 'async';
415
+ topic: string;
416
+ requirements: string;
417
+ hardConstraints?: {
418
+ minWords?: number;
419
+ maxWords?: number;
420
+ keywords?: string[];
421
+ };
422
+ scheduleAt?: Date; // 可选:延迟执行
423
+ }
424
+
425
+ export class TaskScheduler {
426
+ private queue: TaskQueue;
427
+ private repo = createTaskRepository();
428
+
429
+ constructor(connection: Redis) {
430
+ this.queue = new TaskQueue(connection);
431
+ }
432
+
433
+ /**
434
+ * 创建并调度任务
435
+ */
436
+ async scheduleTask(request: CreateTaskRequest): Promise<string> {
437
+ // 1. 生成任务 ID
438
+ const taskId = uuidv4();
439
+
440
+ // 2. 保存到数据库
441
+ const task = await this.repo.create({
442
+ id: taskId,
443
+ mode: request.mode,
444
+ type: 'article',
445
+ topic: request.topic,
446
+ requirements: request.requirements,
447
+ hardConstraints: request.hardConstraints,
448
+ status: 'pending',
449
+ });
450
+
451
+ // 3. 添加到队列
452
+ const jobData: TaskJobData = {
453
+ taskId: task.id,
454
+ mode: task.mode,
455
+ topic: task.topic,
456
+ requirements: task.requirements,
457
+ hardConstraints: task.hardConstraints,
458
+ };
459
+
460
+ if (request.scheduleAt) {
461
+ // 延迟任务
462
+ const delay = request.scheduleAt.getTime() - Date.now();
463
+ if (delay > 0) {
464
+ await this.queue.addDelayedTask(jobData, delay);
465
+ } else {
466
+ await this.queue.addTask(jobData);
467
+ }
468
+ } else {
469
+ // 立即执行
470
+ await this.queue.addTask(jobData);
471
+ }
472
+
473
+ console.log(`Task ${taskId} scheduled successfully`);
474
+
475
+ return taskId;
476
+ }
477
+
478
+ /**
479
+ * 批量创建任务
480
+ */
481
+ async scheduleBatchTasks(
482
+ requests: CreateTaskRequest[]
483
+ ): Promise<string[]> {
484
+ const taskIds: string[] = [];
485
+
486
+ for (const request of requests) {
487
+ const taskId = await this.scheduleTask(request);
488
+ taskIds.push(taskId);
489
+ }
490
+
491
+ return taskIds;
492
+ }
493
+ }
494
+ ```
495
+
496
+ ### 4. Monitor (监控面板)
497
+
498
+ **文件**: `src/monitoring/server.ts`
499
+
500
+ **职责**:
501
+ - 提供任务队列可视化
502
+ - 显示任务统计信息
503
+ - 支持任务操作(重试、删除、暂停)
504
+
505
+ **实现**:
506
+
507
+ ```typescript
508
+ import express from 'express';
509
+ import { createBullBoard } from '@bull-board/api';
510
+ import { BullMQAdapter } from '@bull-board/api/bullMQAdapter.js';
511
+ import { ExpressAdapter } from '@bull-board/express';
512
+ import { TaskQueue } from '../infrastructure/queue/TaskQueue.js';
513
+ import { createRedisConnection } from '../infrastructure/queue/redis.js';
514
+
515
+ export function createMonitorServer(port: number = 3000) {
516
+ const app = express();
517
+
518
+ // 创建 Bull Board
519
+ const serverAdapter = new ExpressAdapter();
520
+ serverAdapter.setBasePath('/admin/queues');
521
+
522
+ const connection = createRedisConnection();
523
+ const taskQueue = new TaskQueue(connection);
524
+
525
+ createBullBoard({
526
+ queues: [new BullMQAdapter(taskQueue.getQueue())],
527
+ serverAdapter,
528
+ });
529
+
530
+ // 挂载 Bull Board
531
+ app.use('/admin/queues', serverAdapter.getRouter());
532
+
533
+ // 自定义统计 API
534
+ app.get('/api/stats', async (req, res) => {
535
+ const stats = await taskQueue.getStats();
536
+ res.json(stats);
537
+ });
538
+
539
+ // 启动服务器
540
+ app.listen(port, () => {
541
+ console.log(`Monitor server running on http://localhost:${port}`);
542
+ console.log(`Bull Board: http://localhost:${port}/admin/queues`);
543
+ });
544
+
545
+ return app;
546
+ }
547
+ ```
548
+
549
+ ---
550
+
551
+ ## 📂 文件结构
552
+
553
+ ```
554
+ src/
555
+ ├── infrastructure/
556
+ │ └── queue/
557
+ │ ├── redis.ts # Redis 连接配置
558
+ │ ├── TaskQueue.ts # 任务队列
559
+ │ └── index.ts # 导出
560
+ ├── workers/
561
+ │ ├── TaskWorker.ts # 任务处理器
562
+ │ ├── WorkerPool.ts # Worker 进程池(可选)
563
+ │ └── index.ts
564
+ ├── schedulers/
565
+ │ ├── TaskScheduler.ts # 任务调度器
566
+ │ └── index.ts
567
+ ├── monitoring/
568
+ │ ├── server.ts # 监控面板服务器
569
+ │ └── index.ts
570
+ ├── api/
571
+ │ ├── routes/
572
+ │ │ ├── tasks.ts # 任务相关 API
573
+ │ │ └── index.ts
574
+ │ └── server.ts # API 服务器
575
+ └── cli/
576
+ ├── start-worker.ts # 启动 Worker CLI
577
+ ├── start-monitor.ts # 启动监控面板 CLI
578
+ └── index.ts
579
+ ```
580
+
581
+ ---
582
+
583
+ ## 🚀 实施步骤
584
+
585
+ ### Step 1: 环境准备(1 天)
586
+
587
+ 1. ✅ 安装依赖
588
+ ```bash
589
+ pnpm add bullmq ioredis @bull-board/api @bull-board/express express
590
+ pnpm add -D @types/bullmq @types/express
591
+ ```
592
+
593
+ 2. ✅ 配置 Redis
594
+ - 更新 `.env` 添加 Redis 配置
595
+ - 验证 Redis 连接
596
+
597
+ 3. ✅ 创建基础文件结构
598
+ - 创建 `infrastructure/queue` 目录
599
+ - 创建 `workers` 目录
600
+ - 创建 `schedulers` 目录
601
+
602
+ ### Step 2: 任务队列实现(2 天)
603
+
604
+ 1. ✅ 实现 Redis 连接
605
+ - `src/infrastructure/queue/redis.ts`
606
+
607
+ 2. ✅ 实现 TaskQueue 类
608
+ - `src/infrastructure/queue/TaskQueue.ts`
609
+ - 支持添加任务
610
+ - 支持延迟任务
611
+ - 支持优先级
612
+ - 支持队列统计
613
+
614
+ 3. ✅ 单元测试
615
+ - 测试队列创建
616
+ - 测试任务添加
617
+ - 测试延迟任务
618
+ - 测试优先级
619
+
620
+ ### Step 3: Worker 实现(2-3 天)
621
+
622
+ 1. ✅ 实现 TaskWorker 类
623
+ - `src/workers/TaskWorker.ts`
624
+ - 集成工作流执行逻辑
625
+ - 实现任务抢占
626
+ - 实现状态更新
627
+ - 实现错误处理
628
+
629
+ 2. ✅ 实现 Worker CLI
630
+ - `src/cli/start-worker.ts`
631
+ - 支持启动单个 Worker
632
+ - 支持配置并发数
633
+
634
+ 3. ✅ 集成测试
635
+ - 测试 Worker 启动
636
+ - 测试任务处理
637
+ - 测试错误重试
638
+ - 测试并发处理
639
+
640
+ ### Step 4: 调度器实现(1-2 天)
641
+
642
+ 1. ✅ 实现 TaskScheduler 类
643
+ - `src/schedulers/TaskScheduler.ts`
644
+ - 支持创建任务
645
+ - 支持批量创建
646
+ - 支持延迟调度
647
+
648
+ 2. ✅ 实现 API 服务器
649
+ - `src/api/server.ts`
650
+ - POST /api/tasks - 创建任务
651
+ - GET /api/tasks/:id - 查询任务
652
+ - GET /api/tasks - 列出任务
653
+ - DELETE /api/tasks/:id - 取消任务
654
+
655
+ 3. ✅ API 测试
656
+ - 测试任务创建
657
+ - 测试任务查询
658
+ - 测试任务取消
659
+
660
+ ### Step 5: 监控面板实现(1 天)
661
+
662
+ 1. ✅ 实现 Bull Board 集成
663
+ - `src/monitoring/server.ts`
664
+ - 配置队列监控
665
+ - 配置任务操作
666
+
667
+ 2. ✅ 实现统计 API
668
+ - GET /api/stats - 队列统计
669
+ - GET /api/workers - Worker 状态
670
+
671
+ 3. ✅ 测试监控面板
672
+ - 验证 Bull Board 显示
673
+ - 验证任务操作
674
+ - 验证统计信息
675
+
676
+ ### Step 6: 集成测试和文档(1 天)
677
+
678
+ 1. ✅ 端到端测试
679
+ - 创建任务 → Worker 处理 → 查询结果
680
+ - 测试失败重试
681
+ - 测试并发处理
682
+
683
+ 2. ✅ 编写文档
684
+ - API 文档
685
+ - 部署文档
686
+ - 使用指南
687
+
688
+ ---
689
+
690
+ ## 🧪 测试计划
691
+
692
+ ### 单元测试
693
+
694
+ ```typescript
695
+ // tests/queue/TaskQueue.test.ts
696
+ describe('TaskQueue', () => {
697
+ it('should add task to queue', async () => {
698
+ const queue = new TaskQueue(mockConnection);
699
+ await queue.addTask({
700
+ taskId: 'test-1',
701
+ mode: 'async',
702
+ topic: 'Test',
703
+ requirements: 'Test',
704
+ });
705
+
706
+ const stats = await queue.getStats();
707
+ expect(stats.waiting).toBe(1);
708
+ });
709
+
710
+ it('should add delayed task', async () => {
711
+ const queue = new TaskQueue(mockConnection);
712
+ await queue.addDelayedTask({
713
+ taskId: 'test-1',
714
+ mode: 'async',
715
+ topic: 'Test',
716
+ requirements: 'Test',
717
+ }, 5000);
718
+
719
+ const stats = await queue.getStats();
720
+ expect(stats.delayed).toBe(1);
721
+ });
722
+ });
723
+ ```
724
+
725
+ ### 集成测试
726
+
727
+ ```typescript
728
+ // tests/integration/workflow.test.ts
729
+ describe('Workflow Integration', () => {
730
+ it('should process task end-to-end', async () => {
731
+ // 1. 创建任务
732
+ const taskId = await scheduler.scheduleTask({
733
+ mode: 'async',
734
+ topic: 'Test',
735
+ requirements: 'Test',
736
+ });
737
+
738
+ // 2. 启动 Worker
739
+ const worker = new TaskWorker('test-worker');
740
+ await worker.start();
741
+
742
+ // 3. 等待处理
743
+ await new Promise(resolve => setTimeout(resolve, 5000));
744
+
745
+ // 4. 验证结果
746
+ const task = await repo.findById(taskId);
747
+ expect(task?.status).toBe('completed');
748
+
749
+ await worker.close();
750
+ });
751
+ });
752
+ ```
753
+
754
+ ---
755
+
756
+ ## 📊 性能目标
757
+
758
+ | 指标 | 目标 | 说明 |
759
+ |------|------|------|
760
+ | 任务吞吐量 | 10+ 任务/秒/Worker | 单个 Worker 处理能力 |
761
+ | 并发数 | 2-5 个/Worker | 可配置并发数 |
762
+ | 内存占用 | <500MB/Worker | 单个 Worker 进程 |
763
+ | 延迟 | <100ms | 任务从队列到开始处理的延迟 |
764
+ | 可用性 | 99.9% | 系统可用性 |
765
+
766
+ ---
767
+
768
+ ## 🔐 安全考虑
769
+
770
+ 1. **Redis 认证**
771
+ - 使用密码保护 Redis
772
+ - 使用独立的 Redis DB
773
+
774
+ 2. **任务验证**
775
+ - 验证任务输入参数
776
+ - 限制任务大小
777
+ - 防止恶意任务
778
+
779
+ 3. **资源限制**
780
+ - 限制并发数
781
+ - 限制任务执行时间
782
+ - 限制内存使用
783
+
784
+ ---
785
+
786
+ ## 📝 配置示例
787
+
788
+ ### .env 配置
789
+
790
+ ```bash
791
+ # Redis 配置
792
+ REDIS_HOST=localhost
793
+ REDIS_PORT=6379
794
+ REDIS_PASSWORD=your_password
795
+ REDIS_DB=0
796
+
797
+ # Worker 配置
798
+ WORKER_ID=worker-1
799
+ WORKER_CONCURRENCY=2
800
+
801
+ # API 配置
802
+ API_PORT=3000
803
+ API_HOST=0.0.0.0
804
+
805
+ # 监控配置
806
+ MONITOR_PORT=3001
807
+ ```
808
+
809
+ ### Worker 启动脚本
810
+
811
+ ```json
812
+ {
813
+ "scripts": {
814
+ "worker": "tsx src/cli/start-worker.ts",
815
+ "worker:dev": "tsx watch src/cli/start-worker.ts",
816
+ "monitor": "tsx src/cli/start-monitor.ts",
817
+ "api": "tsx src/api/server.ts"
818
+ }
819
+ }
820
+ ```
821
+
822
+ ---
823
+
824
+ ## 🎯 验收标准
825
+
826
+ ### 功能验收
827
+
828
+ - [ ] 可以创建异步任务
829
+ - [ ] Worker 可以从队列获取并处理任务
830
+ - [ ] 任务失败自动重试
831
+ - [ ] 支持延迟任务
832
+ - [ ] 支持任务优先级
833
+ - [ ] 可以查询任务状态
834
+ - [ ] 监控面板正常显示
835
+ - [ ] 支持任务操作(重试、删除)
836
+
837
+ ### 性能验收
838
+
839
+ - [ ] 单 Worker 可以并发处理 2+ 任务
840
+ - [ ] 任务处理时间与阶段 2b 基本一致(~2-3 分钟)
841
+ - [ ] 系统内存占用合理(<2GB 总计)
842
+ - [ ] 任务延迟 <100ms
843
+
844
+ ### 质量验收
845
+
846
+ - [ ] 所有单元测试通过
847
+ - [ ] 集成测试通过
848
+ - [ ] 代码覆盖率 >80%
849
+ - [ ] 无 TypeScript 错误
850
+ - [ ] 无 ESLint 错误
851
+ - [ ] 文档完整
852
+
853
+ ---
854
+
855
+ ## 📚 参考资料
856
+
857
+ ### BullMQ 官方文档
858
+ - 官方网站: https://docs.bullmq.io/
859
+ - GitHub: https://github.com/taskforcesh/bullmq
860
+ - API 参考: https://docs.bullmq.io/guide/introduction
861
+
862
+ ### Bull Board(监控面板)
863
+ - GitHub: https://github.com/felixmosh/bull-board
864
+ - 示例: https://github.com/felixmosh/bull-board/tree/master/examples
865
+
866
+ ### Redis
867
+ - 官方文档: https://redis.io/docs/
868
+ - 命令参考: https://redis.io/commands/
869
+
870
+ ### 相关文章
871
+ - BullMQ vs Bull: https://blog.taskforce.sh/announcing-bullmq-3/
872
+ - TypeScript Best Practices: https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html
873
+
874
+ ---
875
+
876
+ **文档生成时间**: 2026-01-19
877
+ **预计开始时间**: 阶段 2b 完成后
878
+ **预计完成时间**: 7-10 天后