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,548 @@
1
+ /**
2
+ * SQLite Task Repository
3
+ *
4
+ * 使用 better-sqlite3 实现的轻量级数据库访问层
5
+ * 适合开发和测试环境
6
+ */
7
+ import Database from 'better-sqlite3';
8
+ import { createLogger } from '../../infrastructure/logging/logger.js';
9
+ import { TaskStatus } from '../../domain/entities/Task.js';
10
+ const logger = createLogger('SQLite:TaskRepository');
11
+ /**
12
+ * SQLite Task Repository 实现
13
+ */
14
+ export class SQLiteTaskRepository {
15
+ db;
16
+ dbPath;
17
+ constructor(dbPath) {
18
+ this.dbPath = dbPath || './data/content-creator.db';
19
+ this.db = new Database(this.dbPath);
20
+ // 启用 WAL 模式(更好的并发性能)
21
+ this.db.pragma('journal_mode = WAL');
22
+ // 初始化数据库表
23
+ this.initializeTables();
24
+ logger.info('SQLite database connected', { dbPath: this.dbPath });
25
+ }
26
+ /**
27
+ * 初始化数据库表
28
+ */
29
+ initializeTables() {
30
+ this.db.exec(`
31
+ CREATE TABLE IF NOT EXISTS tasks (
32
+ id TEXT PRIMARY KEY,
33
+ trace_id TEXT,
34
+ mode TEXT NOT NULL,
35
+ type TEXT NOT NULL,
36
+ topic TEXT NOT NULL,
37
+ requirements TEXT NOT NULL,
38
+ hard_constraints TEXT,
39
+ status TEXT NOT NULL DEFAULT 'pending',
40
+ current_step TEXT,
41
+ error_message TEXT,
42
+ retry_count INTEGER DEFAULT 0,
43
+ max_retries INTEGER DEFAULT 3,
44
+ priority INTEGER DEFAULT 0,
45
+ version INTEGER DEFAULT 1,
46
+ worker_id TEXT,
47
+ started_at TEXT,
48
+ completed_at TEXT,
49
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
50
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
51
+ );
52
+
53
+ CREATE TABLE IF NOT EXISTS task_steps (
54
+ id TEXT PRIMARY KEY,
55
+ task_id TEXT NOT NULL,
56
+ step_type TEXT NOT NULL,
57
+ status TEXT NOT NULL DEFAULT 'pending',
58
+ input_data TEXT,
59
+ output_data TEXT,
60
+ error_message TEXT,
61
+ started_at TEXT,
62
+ completed_at TEXT,
63
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
64
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
65
+ FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE
66
+ );
67
+
68
+ CREATE TABLE IF NOT EXISTS quality_checks (
69
+ id TEXT PRIMARY KEY,
70
+ task_id TEXT NOT NULL,
71
+ check_category TEXT NOT NULL,
72
+ score REAL,
73
+ passed BOOLEAN NOT NULL DEFAULT 0,
74
+ details TEXT,
75
+ fix_suggestions TEXT,
76
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
77
+ FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE
78
+ );
79
+
80
+ CREATE TABLE IF NOT EXISTS results (
81
+ id TEXT PRIMARY KEY,
82
+ task_id TEXT NOT NULL,
83
+ result_type TEXT NOT NULL,
84
+ content TEXT,
85
+ metadata TEXT,
86
+ quality_score REAL,
87
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
88
+ FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE
89
+ );
90
+
91
+ CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
92
+ CREATE INDEX IF NOT EXISTS idx_tasks_worker_id ON tasks(worker_id);
93
+ CREATE INDEX IF NOT EXISTS idx_task_steps_task_id ON task_steps(task_id);
94
+ CREATE INDEX IF NOT EXISTS idx_quality_checks_task_id ON quality_checks(task_id);
95
+ CREATE INDEX IF NOT EXISTS idx_results_task_id ON results(task_id);
96
+ `);
97
+ logger.debug('Database tables initialized');
98
+ }
99
+ /**
100
+ * 创建任务
101
+ */
102
+ async create(params) {
103
+ const now = new Date().toISOString();
104
+ const stmt = this.db.prepare(`
105
+ INSERT INTO tasks (
106
+ id, trace_id, mode, type, topic, requirements,
107
+ hard_constraints, status, priority, version,
108
+ created_at, updated_at
109
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
110
+ `);
111
+ const hardConstraints = params.hardConstraints
112
+ ? JSON.stringify(params.hardConstraints)
113
+ : null;
114
+ try {
115
+ stmt.run(params.id, params.traceId || null, params.mode, params.type, params.topic, params.requirements, hardConstraints, TaskStatus.PENDING, params.priority || 0, 1, now, now);
116
+ const task = await this.findById(params.id);
117
+ if (!task) {
118
+ throw new Error('Failed to create task');
119
+ }
120
+ logger.info('Task created', { taskId: params.id, topic: params.topic });
121
+ return task;
122
+ }
123
+ catch (error) {
124
+ logger.error('Failed to create task', { error: error, params });
125
+ throw error;
126
+ }
127
+ }
128
+ /**
129
+ * 根据 ID 查找任务
130
+ */
131
+ async findById(id) {
132
+ const stmt = this.db.prepare('SELECT * FROM tasks WHERE id = ?');
133
+ const row = stmt.get(id);
134
+ if (!row) {
135
+ return null;
136
+ }
137
+ return this.mapRowToTask(row);
138
+ }
139
+ /**
140
+ * 更新任务
141
+ */
142
+ async update(id, params) {
143
+ const now = new Date().toISOString();
144
+ const updates = [];
145
+ const values = [];
146
+ if (params.status !== undefined) {
147
+ updates.push('status = ?');
148
+ values.push(params.status);
149
+ }
150
+ if (params.currentStep !== undefined) {
151
+ updates.push('current_step = ?');
152
+ values.push(params.currentStep);
153
+ }
154
+ if (params.errorMessage !== undefined) {
155
+ updates.push('error_message = ?');
156
+ values.push(params.errorMessage);
157
+ }
158
+ if (params.retryCount !== undefined) {
159
+ updates.push('retry_count = ?');
160
+ values.push(params.retryCount);
161
+ }
162
+ if (params.workerId !== undefined) {
163
+ updates.push('worker_id = ?');
164
+ values.push(params.workerId);
165
+ }
166
+ if (params.startedAt !== undefined) {
167
+ updates.push('started_at = ?');
168
+ values.push(params.startedAt);
169
+ }
170
+ if (params.completedAt !== undefined) {
171
+ updates.push('completed_at = ?');
172
+ values.push(params.completedAt);
173
+ }
174
+ if (params.version !== undefined) {
175
+ updates.push('version = ?');
176
+ values.push(params.version);
177
+ }
178
+ updates.push('updated_at = ?');
179
+ values.push(now);
180
+ values.push(id);
181
+ const stmt = this.db.prepare(`
182
+ UPDATE tasks SET ${updates.join(', ')} WHERE id = ?
183
+ `);
184
+ try {
185
+ stmt.run(...values);
186
+ const task = await this.findById(id);
187
+ if (!task) {
188
+ throw new Error('Task not found after update');
189
+ }
190
+ logger.debug('Task updated', { taskId: id, updates: Object.keys(params) });
191
+ return task;
192
+ }
193
+ catch (error) {
194
+ logger.error('Failed to update task', { error: error, taskId: id, params });
195
+ throw error;
196
+ }
197
+ }
198
+ /**
199
+ * 抢占任务(Worker 抢占机制)
200
+ */
201
+ async claimForProcessing(workerId, limit = 1) {
202
+ const now = new Date().toISOString();
203
+ // 使用事务确保原子性
204
+ const claimStmt = this.db.prepare(`
205
+ UPDATE tasks
206
+ SET status = ?,
207
+ worker_id = ?,
208
+ started_at = ?,
209
+ updated_at = ?,
210
+ version = version + 1
211
+ WHERE id IN (
212
+ SELECT id FROM tasks
213
+ WHERE status = 'pending'
214
+ OR (status = 'waiting' AND datetime(updated_at) < datetime('now', '-5 minutes'))
215
+ ORDER BY priority DESC, created_at ASC
216
+ LIMIT ?
217
+ )
218
+ RETURNING *
219
+ `);
220
+ try {
221
+ const rows = claimStmt.all(TaskStatus.RUNNING, workerId, now, now, limit);
222
+ const tasks = rows.map((row) => this.mapRowToTask(row));
223
+ if (tasks.length > 0) {
224
+ logger.info('Tasks claimed for processing', {
225
+ workerId,
226
+ count: tasks.length,
227
+ taskIds: tasks.map((t) => t.id),
228
+ });
229
+ }
230
+ return tasks;
231
+ }
232
+ catch (error) {
233
+ logger.error('Failed to claim tasks', { error: error, workerId });
234
+ throw error;
235
+ }
236
+ }
237
+ /**
238
+ * 列出任务(带过滤和分页)
239
+ */
240
+ async list(filters = {}) {
241
+ const { status, workerId, type, limit = 50, offset = 0, sortBy = 'created_at', sortOrder = 'DESC', } = filters;
242
+ const conditions = [];
243
+ const values = [];
244
+ if (status) {
245
+ conditions.push('status = ?');
246
+ values.push(status);
247
+ }
248
+ if (workerId) {
249
+ conditions.push('worker_id = ?');
250
+ values.push(workerId);
251
+ }
252
+ if (type) {
253
+ conditions.push('type = ?');
254
+ values.push(type);
255
+ }
256
+ const whereClause = conditions.length > 0
257
+ ? 'WHERE ' + conditions.join(' AND ')
258
+ : '';
259
+ // 获取总数
260
+ const countStmt = this.db.prepare(`SELECT COUNT(*) as count FROM tasks ${whereClause}`);
261
+ const countResult = countStmt.get(...values);
262
+ const total = countResult.count;
263
+ // 获取分页数据
264
+ const dataStmt = this.db.prepare(`
265
+ SELECT * FROM tasks
266
+ ${whereClause}
267
+ ORDER BY ${sortBy} ${sortOrder}
268
+ LIMIT ? OFFSET ?
269
+ `);
270
+ const rows = dataStmt.all(...values, limit, offset);
271
+ const tasks = rows.map((row) => this.mapRowToTask(row));
272
+ return {
273
+ data: tasks,
274
+ total,
275
+ limit,
276
+ offset,
277
+ };
278
+ }
279
+ /**
280
+ * 更新任务状态(带乐观锁)
281
+ */
282
+ async updateStatus(taskId, status, version) {
283
+ const now = new Date().toISOString();
284
+ const stmt = this.db.prepare(`
285
+ UPDATE tasks
286
+ SET status = ?,
287
+ version = version + 1,
288
+ updated_at = ?
289
+ WHERE id = ? AND version = ?
290
+ `);
291
+ const result = stmt.run(status, now, taskId, version);
292
+ const updated = result.changes > 0;
293
+ if (updated) {
294
+ logger.debug('Task status updated', { taskId, status });
295
+ }
296
+ else {
297
+ logger.warn('Task status update failed (version mismatch)', { taskId, expectedVersion: version });
298
+ }
299
+ return updated;
300
+ }
301
+ /**
302
+ * 更新当前步骤(带乐观锁)
303
+ */
304
+ async updateCurrentStep(taskId, step, version) {
305
+ const now = new Date().toISOString();
306
+ const stmt = this.db.prepare(`
307
+ UPDATE tasks
308
+ SET current_step = ?,
309
+ version = version + 1,
310
+ updated_at = ?
311
+ WHERE id = ? AND version = ?
312
+ `);
313
+ const result = stmt.run(step, now, taskId, version);
314
+ const updated = result.changes > 0;
315
+ if (updated) {
316
+ logger.debug('Task current step updated', { taskId, step });
317
+ }
318
+ else {
319
+ logger.warn('Task current step update failed (version mismatch)', { taskId, expectedVersion: version });
320
+ }
321
+ return updated;
322
+ }
323
+ /**
324
+ * 抢占任务(Worker 抢占机制)
325
+ */
326
+ async claimTask(taskId, workerId, version) {
327
+ const now = new Date().toISOString();
328
+ const stmt = this.db.prepare(`
329
+ UPDATE tasks
330
+ SET status = ?,
331
+ worker_id = ?,
332
+ started_at = ?,
333
+ version = version + 1,
334
+ updated_at = ?
335
+ WHERE id = ? AND version = ? AND status = ?
336
+ `);
337
+ const result = stmt.run(TaskStatus.RUNNING, workerId, now, taskId, version, TaskStatus.PENDING);
338
+ const claimed = result.changes > 0;
339
+ if (claimed) {
340
+ logger.info('Task claimed', { taskId, workerId });
341
+ }
342
+ else {
343
+ logger.warn('Task claim failed (version mismatch or not pending)', { taskId, workerId, expectedVersion: version });
344
+ }
345
+ return claimed;
346
+ }
347
+ /**
348
+ * 增加重试计数(带乐观锁)
349
+ */
350
+ async incrementRetryCount(taskId, type, version) {
351
+ const now = new Date().toISOString();
352
+ const stmt = this.db.prepare(`
353
+ UPDATE tasks
354
+ SET retry_count = retry_count + 1,
355
+ version = version + 1,
356
+ updated_at = ?
357
+ WHERE id = ? AND version = ?
358
+ `);
359
+ const result = stmt.run(now, taskId, version);
360
+ const updated = result.changes > 0;
361
+ if (updated) {
362
+ logger.debug('Task retry count incremented', { taskId, type });
363
+ }
364
+ else {
365
+ logger.warn('Task retry count increment failed (version mismatch)', { taskId, type, expectedVersion: version });
366
+ }
367
+ return updated;
368
+ }
369
+ /**
370
+ * 保存状态快照(带乐观锁)
371
+ */
372
+ async saveStateSnapshot(taskId, snapshot, _version) {
373
+ const now = new Date().toISOString();
374
+ const stmt = this.db.prepare(`
375
+ INSERT OR REPLACE INTO task_steps (id, task_id, step_type, status, output_data, created_at, updated_at)
376
+ VALUES (?, ?, ?, 'completed', ?, ?, ?)
377
+ `);
378
+ try {
379
+ stmt.run(`${taskId}_${Date.now()}`, taskId, 'state', JSON.stringify(snapshot), now, now);
380
+ logger.debug('State snapshot saved', { taskId });
381
+ return true;
382
+ }
383
+ catch (error) {
384
+ logger.error('Failed to save state snapshot', { error: error, taskId });
385
+ return false;
386
+ }
387
+ }
388
+ /**
389
+ * 标记任务完成(带乐观锁)
390
+ */
391
+ async markAsCompleted(taskId, version) {
392
+ const now = new Date().toISOString();
393
+ const stmt = this.db.prepare(`
394
+ UPDATE tasks
395
+ SET status = ?,
396
+ completed_at = ?,
397
+ version = version + 1,
398
+ updated_at = ?
399
+ WHERE id = ? AND version = ?
400
+ `);
401
+ const result = stmt.run(TaskStatus.COMPLETED, now, now, taskId, version);
402
+ const updated = result.changes > 0;
403
+ if (updated) {
404
+ logger.info('Task marked as completed', { taskId });
405
+ }
406
+ else {
407
+ logger.warn('Task mark as completed failed (version mismatch)', { taskId, expectedVersion: version });
408
+ }
409
+ return updated;
410
+ }
411
+ /**
412
+ * 标记任务失败(带乐观锁)
413
+ */
414
+ async markAsFailed(taskId, errorMessage, version) {
415
+ const now = new Date().toISOString();
416
+ const stmt = this.db.prepare(`
417
+ UPDATE tasks
418
+ SET status = ?,
419
+ error_message = ?,
420
+ completed_at = ?,
421
+ version = version + 1,
422
+ updated_at = ?
423
+ WHERE id = ? AND version = ?
424
+ `);
425
+ const result = stmt.run(TaskStatus.FAILED, errorMessage, now, now, taskId, version);
426
+ const updated = result.changes > 0;
427
+ if (updated) {
428
+ logger.info('Task marked as failed', { taskId, errorMessage });
429
+ }
430
+ else {
431
+ logger.warn('Task mark as failed failed (version mismatch)', { taskId, expectedVersion: version });
432
+ }
433
+ return updated;
434
+ }
435
+ /**
436
+ * 释放 Worker 占用(用于任务崩溃时)
437
+ */
438
+ async releaseWorker(taskId, workerId, version) {
439
+ const now = new Date().toISOString();
440
+ const stmt = this.db.prepare(`
441
+ UPDATE tasks
442
+ SET status = ?,
443
+ worker_id = NULL,
444
+ version = version + 1,
445
+ updated_at = ?
446
+ WHERE id = ? AND version = ? AND worker_id = ?
447
+ `);
448
+ const result = stmt.run(TaskStatus.PENDING, now, taskId, version, workerId);
449
+ const released = result.changes > 0;
450
+ if (released) {
451
+ logger.info('Task worker released', { taskId, workerId });
452
+ }
453
+ else {
454
+ logger.warn('Task worker release failed', { taskId, workerId, expectedVersion: version });
455
+ }
456
+ return released;
457
+ }
458
+ /**
459
+ * 软删除任务
460
+ */
461
+ async softDelete(taskId) {
462
+ // SQLite 不支持软删除,直接删除
463
+ return this.delete(taskId);
464
+ }
465
+ /**
466
+ * 永久删除任务
467
+ */
468
+ async delete(taskId) {
469
+ const stmt = this.db.prepare('DELETE FROM tasks WHERE id = ?');
470
+ const result = stmt.run(taskId);
471
+ return result.changes > 0;
472
+ }
473
+ /**
474
+ * 获取待处理任务队列(用于 Worker 获取任务)
475
+ */
476
+ async getPendingTasks(limit = 10) {
477
+ const stmt = this.db.prepare(`
478
+ SELECT * FROM tasks
479
+ WHERE status = ?
480
+ ORDER BY priority DESC, created_at ASC
481
+ LIMIT ?
482
+ `);
483
+ const rows = stmt.all(TaskStatus.PENDING, limit);
484
+ return rows.map((row) => this.mapRowToTask(row));
485
+ }
486
+ /**
487
+ * 获取 Worker 的活跃任务
488
+ */
489
+ async getActiveTasksByWorker(workerId) {
490
+ const stmt = this.db.prepare(`
491
+ SELECT * FROM tasks
492
+ WHERE status = ? AND worker_id = ?
493
+ `);
494
+ const rows = stmt.all(TaskStatus.RUNNING, workerId);
495
+ return rows.map((row) => this.mapRowToTask(row));
496
+ }
497
+ /**
498
+ * 健康检查
499
+ */
500
+ async healthCheck() {
501
+ try {
502
+ const stmt = this.db.prepare('SELECT 1');
503
+ stmt.get();
504
+ return true;
505
+ }
506
+ catch (error) {
507
+ logger.error('Database health check failed', { error: error });
508
+ return false;
509
+ }
510
+ }
511
+ /**
512
+ * 关闭数据库连接
513
+ */
514
+ close() {
515
+ this.db.close();
516
+ logger.info('SQLite database connection closed');
517
+ }
518
+ /**
519
+ * 将数据库行映射为 Task 对象
520
+ */
521
+ mapRowToTask(row) {
522
+ return {
523
+ id: row.id,
524
+ taskId: row.id,
525
+ mode: row.mode,
526
+ type: row.type,
527
+ topic: row.topic,
528
+ requirements: row.requirements,
529
+ hardConstraints: row.hard_constraints
530
+ ? JSON.parse(row.hard_constraints)
531
+ : undefined,
532
+ status: row.status,
533
+ priority: row.priority || 2,
534
+ version: row.version || 1,
535
+ textRetryCount: row.retry_count || 0,
536
+ imageRetryCount: 0,
537
+ targetAudience: 'general',
538
+ currentStep: row.current_step,
539
+ errorMessage: row.error_message,
540
+ workerId: row.worker_id,
541
+ startedAt: row.started_at ? new Date(row.started_at) : undefined,
542
+ completedAt: row.completed_at ? new Date(row.completed_at) : undefined,
543
+ createdAt: new Date(row.created_at),
544
+ updatedAt: new Date(row.updated_at),
545
+ };
546
+ }
547
+ }
548
+ //# sourceMappingURL=SQLiteTaskRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLiteTaskRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/database/SQLiteTaskRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * 数据库层导出
3
+ *
4
+ * 根据环境自动选择合适的实现
5
+ */
6
+ export type { Task, TaskCreateParams, TaskUpdateParams, TaskListFilters, PaginatedResult } from '../../domain/repositories/TaskRepository.js';
7
+ /**
8
+ * 创建 Task Repository
9
+ *
10
+ * 根据配置自动选择合适的实现:
11
+ * - development: SQLite (默认,适合开发)
12
+ * - production: PostgreSQL (需要数据库,连接失败时 fallback 到 SQLite)
13
+ * - test: Memory (默认,适合测试)
14
+ *
15
+ * 支持三种类型:
16
+ * - 'memory': 内存存储,适合测试
17
+ * - 'sqlite': SQLite 文件数据库,适合开发
18
+ * - 'postgres': PostgreSQL 数据库,适合生产
19
+ *
20
+ * PostgreSQL Fallback 策略:
21
+ * - 如果配置了 DATABASE_TYPE=postgres 但连接失败,自动 fallback 到 SQLite
22
+ * - 如果未配置 DATABASE_TYPE,根据环境自动选择
23
+ *
24
+ * @param pool - 可选的 PostgreSQL 连接池(仅 postgres 模式使用)
25
+ * @param dbPath - 可选的 SQLite 数据库路径(仅 sqlite 模式使用)
26
+ */
27
+ export declare function createTaskRepository(pool?: any, dbPath?: string): any;
28
+ export { MemoryTaskRepository } from './MemoryTaskRepository.js';
29
+ export { PostgresTaskRepository } from './PostgresTaskRepository.js';
30
+ export { SQLiteTaskRepository } from './SQLiteTaskRepository.js';
31
+ export declare const taskRepository: any;
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/database/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,YAAY,EAAE,IAAI,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAE9I;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,OAsC/D;AAGD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGjE,eAAO,MAAM,cAAc,KAAyB,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * 数据库层导出
3
+ *
4
+ * 根据环境自动选择合适的实现
5
+ */
6
+ import { config } from '../../config/index.js';
7
+ import { MemoryTaskRepository } from './MemoryTaskRepository.js';
8
+ import { SQLiteTaskRepository } from './SQLiteTaskRepository.js';
9
+ import { createLogger } from '../logging/logger.js';
10
+ const logger = createLogger('Database:Factory');
11
+ /**
12
+ * 创建 Task Repository
13
+ *
14
+ * 根据配置自动选择合适的实现:
15
+ * - development: SQLite (默认,适合开发)
16
+ * - production: PostgreSQL (需要数据库,连接失败时 fallback 到 SQLite)
17
+ * - test: Memory (默认,适合测试)
18
+ *
19
+ * 支持三种类型:
20
+ * - 'memory': 内存存储,适合测试
21
+ * - 'sqlite': SQLite 文件数据库,适合开发
22
+ * - 'postgres': PostgreSQL 数据库,适合生产
23
+ *
24
+ * PostgreSQL Fallback 策略:
25
+ * - 如果配置了 DATABASE_TYPE=postgres 但连接失败,自动 fallback 到 SQLite
26
+ * - 如果未配置 DATABASE_TYPE,根据环境自动选择
27
+ *
28
+ * @param pool - 可选的 PostgreSQL 连接池(仅 postgres 模式使用)
29
+ * @param dbPath - 可选的 SQLite 数据库路径(仅 sqlite 模式使用)
30
+ */
31
+ export function createTaskRepository(pool, dbPath) {
32
+ const dbType = config.database.type;
33
+ logger.info('Creating Task Repository', { databaseType: dbType });
34
+ if (dbType === 'memory') {
35
+ // 内存版本(适合快速测试)
36
+ // 不创建任何数据库连接
37
+ logger.info('Using MemoryTaskRepository');
38
+ return new MemoryTaskRepository();
39
+ }
40
+ if (dbType === 'sqlite') {
41
+ // SQLite 版本(适合开发和本地开发)
42
+ logger.info('Using SQLiteTaskRepository', { dbPath: dbPath || './data/content-creator.db' });
43
+ return new SQLiteTaskRepository(dbPath);
44
+ }
45
+ if (dbType === 'postgres') {
46
+ // PostgreSQL 版本(需要数据库连接)
47
+ // 动态导入以避免在不需要时加载 pg
48
+ try {
49
+ const { PostgresTaskRepository } = require('./PostgresTaskRepository.js');
50
+ // 如果提供了 pool,使用提供的;否则由 BaseRepository 自动创建
51
+ logger.info('Using PostgresTaskRepository');
52
+ return new PostgresTaskRepository(pool);
53
+ }
54
+ catch (error) {
55
+ const errorMsg = error instanceof Error ? error.message : String(error);
56
+ logger.warn('PostgreSQL initialization failed, falling back to SQLite', { error: errorMsg });
57
+ console.warn('⚠️ PostgreSQL not available, falling back to SQLite repository');
58
+ logger.info('Fallback: Using SQLiteTaskRepository', { dbPath: dbPath || './data/content-creator.db' });
59
+ return new SQLiteTaskRepository(dbPath);
60
+ }
61
+ }
62
+ // 不应该到这里,但作为最后的 fallback,使用 SQLite
63
+ logger.warn(`Unknown database type: ${dbType}, falling back to SQLite`);
64
+ return new SQLiteTaskRepository(dbPath);
65
+ }
66
+ // 导出具体的 Repository 类(可选使用)
67
+ export { MemoryTaskRepository } from './MemoryTaskRepository.js';
68
+ export { PostgresTaskRepository } from './PostgresTaskRepository.js';
69
+ export { SQLiteTaskRepository } from './SQLiteTaskRepository.js';
70
+ // 导出单例(全局使用)
71
+ export const taskRepository = createTaskRepository();
72
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infrastructure/database/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,MAAM,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;AAKhD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAU,EAAE,MAAe;IAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;IAEpC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;IAElE,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,eAAe;QACf,aAAa;QACb,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,IAAI,oBAAoB,EAAE,CAAC;IACpC,CAAC;IAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,uBAAuB;QACvB,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,2BAA2B,EAAE,CAAC,CAAC;QAC7F,OAAO,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,yBAAyB;QACzB,oBAAoB;QACpB,IAAI,CAAC;YACH,MAAM,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;YAC1E,2CAA2C;YAC3C,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC,0DAA0D,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC7F,OAAO,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;YAChF,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,2BAA2B,EAAE,CAAC,CAAC;YACvG,OAAO,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,MAAM,CAAC,IAAI,CAAC,0BAA0B,MAAM,0BAA0B,CAAC,CAAC;IACxE,OAAO,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,2BAA2B;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,aAAa;AACb,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,EAAE,CAAC"}