agentic-flow 2.0.2 → 2.0.4

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 (324) hide show
  1. package/.claude/agents/test-neural.md +14 -0
  2. package/.claude/settings.json +9 -133
  3. package/README.md +622 -1862
  4. package/dist/.tsbuildinfo +1 -1
  5. package/dist/billing/mcp/tools.js +0 -1
  6. package/dist/billing/mcp/tools.js.map +1 -1
  7. package/dist/cli/commands/hooks.d.ts.map +1 -1
  8. package/dist/cli/commands/hooks.js +4 -79
  9. package/dist/cli/commands/hooks.js.map +1 -1
  10. package/dist/cli-proxy.js +1 -89
  11. package/dist/cli-proxy.js.map +1 -1
  12. package/dist/core/agentdb-fast.js +3 -3
  13. package/dist/core/agentdb-fast.js.map +1 -1
  14. package/dist/core/agentdb-wrapper-enhanced.d.ts.map +1 -1
  15. package/dist/core/agentdb-wrapper-enhanced.js +4 -20
  16. package/dist/core/agentdb-wrapper-enhanced.js.map +1 -1
  17. package/dist/core/agentdb-wrapper.d.ts +2 -3
  18. package/dist/core/agentdb-wrapper.d.ts.map +1 -1
  19. package/dist/core/agentdb-wrapper.js +1 -15
  20. package/dist/core/agentdb-wrapper.js.map +1 -1
  21. package/dist/core/attention-native.d.ts +0 -4
  22. package/dist/core/attention-native.d.ts.map +1 -1
  23. package/dist/core/attention-native.js +2 -14
  24. package/dist/core/attention-native.js.map +1 -1
  25. package/dist/federation/SecurityManager.d.ts +2 -11
  26. package/dist/federation/SecurityManager.d.ts.map +1 -1
  27. package/dist/federation/SecurityManager.js +17 -50
  28. package/dist/federation/SecurityManager.js.map +1 -1
  29. package/dist/federation/integrations/supabase-adapter-debug.js +3 -3
  30. package/dist/federation/integrations/supabase-adapter-debug.js.map +1 -1
  31. package/dist/hooks/swarm-learning-optimizer.js +5 -5
  32. package/dist/hooks/swarm-learning-optimizer.js.map +1 -1
  33. package/dist/intelligence/IntelligenceStore.d.ts +26 -35
  34. package/dist/intelligence/IntelligenceStore.d.ts.map +1 -1
  35. package/dist/intelligence/IntelligenceStore.js +123 -308
  36. package/dist/intelligence/IntelligenceStore.js.map +1 -1
  37. package/dist/intelligence/RuVectorIntelligence.d.ts +1 -26
  38. package/dist/intelligence/RuVectorIntelligence.d.ts.map +1 -1
  39. package/dist/intelligence/RuVectorIntelligence.js +10 -49
  40. package/dist/intelligence/RuVectorIntelligence.js.map +1 -1
  41. package/dist/intelligence/agent-booster-enhanced.d.ts +0 -1
  42. package/dist/intelligence/agent-booster-enhanced.d.ts.map +1 -1
  43. package/dist/intelligence/agent-booster-enhanced.js +3 -24
  44. package/dist/intelligence/agent-booster-enhanced.js.map +1 -1
  45. package/dist/intelligence/index.d.ts +3 -29
  46. package/dist/intelligence/index.d.ts.map +1 -1
  47. package/dist/intelligence/index.js +3 -13
  48. package/dist/intelligence/index.js.map +1 -1
  49. package/dist/mcp/claudeFlowSdkServer.d.ts.map +1 -1
  50. package/dist/mcp/claudeFlowSdkServer.js +3 -9
  51. package/dist/mcp/claudeFlowSdkServer.js.map +1 -1
  52. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js +5 -5
  53. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js.map +1 -1
  54. package/dist/mcp/fastmcp/tools/swarm/init.d.ts.map +1 -1
  55. package/dist/mcp/fastmcp/tools/swarm/init.js +7 -36
  56. package/dist/mcp/fastmcp/tools/swarm/init.js.map +1 -1
  57. package/dist/mcp/fastmcp/tools/swarm/spawn.d.ts.map +1 -1
  58. package/dist/mcp/fastmcp/tools/swarm/spawn.js +8 -47
  59. package/dist/mcp/fastmcp/tools/swarm/spawn.js.map +1 -1
  60. package/dist/mcp/tools/agent-booster-tools.d.ts +1 -1
  61. package/dist/mcp/tools/agent-booster-tools.d.ts.map +1 -1
  62. package/dist/mcp/tools/agent-booster-tools.js +4 -10
  63. package/dist/mcp/tools/agent-booster-tools.js.map +1 -1
  64. package/dist/mcp/tools/sona-tools.d.ts.map +1 -1
  65. package/dist/mcp/tools/sona-tools.js +0 -6
  66. package/dist/mcp/tools/sona-tools.js.map +1 -1
  67. package/dist/optimizations/agent-booster-migration.d.ts.map +1 -1
  68. package/dist/optimizations/agent-booster-migration.js +2 -5
  69. package/dist/optimizations/agent-booster-migration.js.map +1 -1
  70. package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
  71. package/dist/proxy/anthropic-to-requesty.js.map +1 -1
  72. package/dist/proxy/quic-proxy.d.ts +1 -0
  73. package/dist/proxy/quic-proxy.d.ts.map +1 -1
  74. package/dist/proxy/quic-proxy.js +2 -2
  75. package/dist/proxy/quic-proxy.js.map +1 -1
  76. package/dist/reasoningbank/AdvancedMemory.js +1 -1
  77. package/dist/reasoningbank/AdvancedMemory.js.map +1 -1
  78. package/dist/reasoningbank/HybridBackend.d.ts.map +1 -1
  79. package/dist/reasoningbank/HybridBackend.js +5 -2
  80. package/dist/reasoningbank/HybridBackend.js.map +1 -1
  81. package/dist/reasoningbank/backend-selector.d.ts +1 -11
  82. package/dist/reasoningbank/backend-selector.d.ts.map +1 -1
  83. package/dist/reasoningbank/backend-selector.js +5 -45
  84. package/dist/reasoningbank/backend-selector.js.map +1 -1
  85. package/dist/reasoningbank/core/consolidate.d.ts.map +1 -1
  86. package/dist/reasoningbank/core/consolidate.js +45 -113
  87. package/dist/reasoningbank/core/consolidate.js.map +1 -1
  88. package/dist/reasoningbank/index-new.d.ts +6 -1
  89. package/dist/reasoningbank/index-new.d.ts.map +1 -1
  90. package/dist/reasoningbank/index-new.js +6 -1
  91. package/dist/reasoningbank/index-new.js.map +1 -1
  92. package/dist/reasoningbank/index.d.ts +6 -2
  93. package/dist/reasoningbank/index.d.ts.map +1 -1
  94. package/dist/reasoningbank/index.js +6 -2
  95. package/dist/reasoningbank/index.js.map +1 -1
  96. package/dist/reasoningbank/utils/embeddings.d.ts +0 -1
  97. package/dist/reasoningbank/utils/embeddings.d.ts.map +1 -1
  98. package/dist/reasoningbank/utils/embeddings.js +26 -53
  99. package/dist/reasoningbank/utils/embeddings.js.map +1 -1
  100. package/dist/router/index.d.ts +17 -0
  101. package/dist/router/index.d.ts.map +1 -0
  102. package/dist/router/index.js +19 -0
  103. package/dist/router/index.js.map +1 -0
  104. package/dist/router/providers/onnx-local-optimized.d.ts +0 -2
  105. package/dist/router/providers/onnx-local-optimized.d.ts.map +1 -1
  106. package/dist/router/providers/onnx-local-optimized.js +0 -10
  107. package/dist/router/providers/onnx-local-optimized.js.map +1 -1
  108. package/dist/router/providers/onnx-local.d.ts +0 -1
  109. package/dist/router/providers/onnx-local.d.ts.map +1 -1
  110. package/dist/router/providers/onnx-local.js +5 -22
  111. package/dist/router/providers/onnx-local.js.map +1 -1
  112. package/dist/services/embedding-service.js.map +1 -1
  113. package/dist/services/sona-agent-training.d.ts +0 -1
  114. package/dist/services/sona-agent-training.d.ts.map +1 -1
  115. package/dist/services/sona-agent-training.js.map +1 -1
  116. package/dist/services/sona-agentdb-integration.d.ts.map +1 -1
  117. package/dist/services/sona-agentdb-integration.js +6 -9
  118. package/dist/services/sona-agentdb-integration.js.map +1 -1
  119. package/dist/services/sona-service.d.ts.map +1 -1
  120. package/dist/services/sona-service.js +5 -6
  121. package/dist/services/sona-service.js.map +1 -1
  122. package/dist/utils/cli.d.ts +1 -1
  123. package/dist/utils/cli.d.ts.map +1 -1
  124. package/dist/utils/cli.js +0 -21
  125. package/dist/utils/cli.js.map +1 -1
  126. package/package.json +7 -19
  127. package/scripts/postinstall.js +4 -45
  128. package/wasm/reasoningbank/reasoningbank_wasm_bg.js +2 -2
  129. package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm +0 -0
  130. package/.claude/agents/.claude-flow/metrics/agent-metrics.json +0 -1
  131. package/.claude/agents/.claude-flow/metrics/performance.json +0 -87
  132. package/.claude/agents/.claude-flow/metrics/task-metrics.json +0 -10
  133. package/.claude/skills/.claude-flow/metrics/agent-metrics.json +0 -1
  134. package/.claude/skills/.claude-flow/metrics/performance.json +0 -87
  135. package/.claude/skills/.claude-flow/metrics/task-metrics.json +0 -10
  136. package/.claude/skills/agentic-flow-quickstart/skill.md +0 -69
  137. package/.claude/skills/hooks-automation/skill.md +0 -155
  138. package/.claude/skills/memory-patterns/skill.md +0 -110
  139. package/.claude/skills/skill-builder/.claude-flow/metrics/agent-metrics.json +0 -1
  140. package/.claude/skills/skill-builder/.claude-flow/metrics/performance.json +0 -87
  141. package/.claude/skills/skill-builder/.claude-flow/metrics/task-metrics.json +0 -10
  142. package/.claude/skills/sparc-methodology/skill.md +0 -137
  143. package/.claude/skills/swarm-coordination/skill.md +0 -94
  144. package/.claude/skills/worker-benchmarks/skill.md +0 -135
  145. package/.claude/skills/worker-integration/skill.md +0 -154
  146. package/.claude/statusline.mjs +0 -109
  147. package/.claude/statusline.sh +0 -71
  148. package/dist/agentdb/benchmarks/comprehensive-benchmark.js +0 -664
  149. package/dist/agentdb/benchmarks/frontier-benchmark.js +0 -419
  150. package/dist/agentdb/benchmarks/reflexion-benchmark.js +0 -370
  151. package/dist/agentdb/cli/agentdb-cli.js +0 -717
  152. package/dist/agentdb/controllers/CausalMemoryGraph.js +0 -322
  153. package/dist/agentdb/controllers/CausalRecall.js +0 -281
  154. package/dist/agentdb/controllers/EmbeddingService.d.ts +0 -37
  155. package/dist/agentdb/controllers/EmbeddingService.d.ts.map +0 -1
  156. package/dist/agentdb/controllers/EmbeddingService.js +0 -119
  157. package/dist/agentdb/controllers/EmbeddingService.js.map +0 -1
  158. package/dist/agentdb/controllers/ExplainableRecall.js +0 -387
  159. package/dist/agentdb/controllers/NightlyLearner.js +0 -382
  160. package/dist/agentdb/controllers/ReflexionMemory.js +0 -239
  161. package/dist/agentdb/controllers/SkillLibrary.js +0 -276
  162. package/dist/agentdb/controllers/frontier-index.js +0 -9
  163. package/dist/agentdb/controllers/index.js +0 -8
  164. package/dist/agentdb/optimizations/BatchOperations.js +0 -198
  165. package/dist/agentdb/optimizations/QueryOptimizer.js +0 -225
  166. package/dist/agentdb/optimizations/index.js +0 -7
  167. package/dist/agentdb/tests/frontier-features.test.js +0 -665
  168. package/dist/benchmarks/embeddings-benchmark.d.ts +0 -38
  169. package/dist/benchmarks/embeddings-benchmark.d.ts.map +0 -1
  170. package/dist/benchmarks/embeddings-benchmark.js +0 -282
  171. package/dist/benchmarks/embeddings-benchmark.js.map +0 -1
  172. package/dist/cli/commands/embeddings.d.ts +0 -12
  173. package/dist/cli/commands/embeddings.d.ts.map +0 -1
  174. package/dist/cli/commands/embeddings.js +0 -386
  175. package/dist/cli/commands/embeddings.js.map +0 -1
  176. package/dist/cli/commands/init.d.ts +0 -8
  177. package/dist/cli/commands/init.d.ts.map +0 -1
  178. package/dist/cli/commands/init.js +0 -514
  179. package/dist/cli/commands/init.js.map +0 -1
  180. package/dist/cli/commands/workers.d.ts +0 -9
  181. package/dist/cli/commands/workers.d.ts.map +0 -1
  182. package/dist/cli/commands/workers.js +0 -991
  183. package/dist/cli/commands/workers.js.map +0 -1
  184. package/dist/cli/skills-manager.js +0 -1297
  185. package/dist/cli/update-message.js +0 -175
  186. package/dist/embeddings/index.d.ts +0 -17
  187. package/dist/embeddings/index.d.ts.map +0 -1
  188. package/dist/embeddings/index.js +0 -17
  189. package/dist/embeddings/index.js.map +0 -1
  190. package/dist/embeddings/neural-substrate.d.ts +0 -206
  191. package/dist/embeddings/neural-substrate.d.ts.map +0 -1
  192. package/dist/embeddings/neural-substrate.js +0 -629
  193. package/dist/embeddings/neural-substrate.js.map +0 -1
  194. package/dist/embeddings/optimized-embedder.d.ts +0 -103
  195. package/dist/embeddings/optimized-embedder.d.ts.map +0 -1
  196. package/dist/embeddings/optimized-embedder.js +0 -730
  197. package/dist/embeddings/optimized-embedder.js.map +0 -1
  198. package/dist/examples/embedding-geometry.d.ts +0 -105
  199. package/dist/examples/embedding-geometry.d.ts.map +0 -1
  200. package/dist/examples/embedding-geometry.js +0 -528
  201. package/dist/examples/embedding-geometry.js.map +0 -1
  202. package/dist/memory/SharedMemoryPool.d.ts +0 -129
  203. package/dist/memory/SharedMemoryPool.d.ts.map +0 -1
  204. package/dist/memory/SharedMemoryPool.js +0 -243
  205. package/dist/memory/SharedMemoryPool.js.map +0 -1
  206. package/dist/memory/index.d.ts +0 -8
  207. package/dist/memory/index.d.ts.map +0 -1
  208. package/dist/memory/index.js +0 -7
  209. package/dist/memory/index.js.map +0 -1
  210. package/dist/proxy/http3-proxy-old.js +0 -331
  211. package/dist/proxy/proxy/anthropic-to-gemini.js +0 -439
  212. package/dist/proxy/utils/logger.js +0 -59
  213. package/dist/reasoningbank/agentdb-adapter.js +0 -125
  214. package/dist/reasoningbank/core/database.js +0 -250
  215. package/dist/reasoningbank/core/memory-engine.js +0 -335
  216. package/dist/swarm/ipfs-swarm.d.ts +0 -265
  217. package/dist/swarm/ipfs-swarm.d.ts.map +0 -1
  218. package/dist/swarm/ipfs-swarm.js +0 -508
  219. package/dist/swarm/ipfs-swarm.js.map +0 -1
  220. package/dist/swarm/p2p-free-swarm.d.ts +0 -344
  221. package/dist/swarm/p2p-free-swarm.d.ts.map +0 -1
  222. package/dist/swarm/p2p-free-swarm.js +0 -603
  223. package/dist/swarm/p2p-free-swarm.js.map +0 -1
  224. package/dist/swarm/real-p2p-swarm.d.ts +0 -183
  225. package/dist/swarm/real-p2p-swarm.d.ts.map +0 -1
  226. package/dist/swarm/real-p2p-swarm.js +0 -469
  227. package/dist/swarm/real-p2p-swarm.js.map +0 -1
  228. package/dist/utils/adaptive-pool-sizing.js +0 -414
  229. package/dist/utils/agentdbCommands.js +0 -175
  230. package/dist/utils/circular-rate-limiter.js +0 -391
  231. package/dist/utils/dynamic-compression.js +0 -298
  232. package/dist/utils/http2-multiplexing.js +0 -319
  233. package/dist/utils/index.d.ts +0 -6
  234. package/dist/utils/index.d.ts.map +0 -1
  235. package/dist/utils/index.js +0 -6
  236. package/dist/utils/index.js.map +0 -1
  237. package/dist/utils/lazy-auth.js +0 -311
  238. package/dist/utils/model-cache.d.ts +0 -61
  239. package/dist/utils/model-cache.d.ts.map +0 -1
  240. package/dist/utils/model-cache.js +0 -176
  241. package/dist/utils/model-cache.js.map +0 -1
  242. package/dist/utils/server-push.js +0 -251
  243. package/dist/utils/suppress-warnings.d.ts +0 -19
  244. package/dist/utils/suppress-warnings.d.ts.map +0 -1
  245. package/dist/utils/suppress-warnings.js +0 -59
  246. package/dist/utils/suppress-warnings.js.map +0 -1
  247. package/dist/utils/zero-copy-buffer.js +0 -286
  248. package/dist/workers/consolidated-phases.d.ts +0 -40
  249. package/dist/workers/consolidated-phases.d.ts.map +0 -1
  250. package/dist/workers/consolidated-phases.js +0 -497
  251. package/dist/workers/consolidated-phases.js.map +0 -1
  252. package/dist/workers/custom-worker-config.d.ts +0 -133
  253. package/dist/workers/custom-worker-config.d.ts.map +0 -1
  254. package/dist/workers/custom-worker-config.js +0 -215
  255. package/dist/workers/custom-worker-config.js.map +0 -1
  256. package/dist/workers/custom-worker-factory.d.ts +0 -89
  257. package/dist/workers/custom-worker-factory.d.ts.map +0 -1
  258. package/dist/workers/custom-worker-factory.js +0 -404
  259. package/dist/workers/custom-worker-factory.js.map +0 -1
  260. package/dist/workers/dispatch-service.d.ts +0 -123
  261. package/dist/workers/dispatch-service.d.ts.map +0 -1
  262. package/dist/workers/dispatch-service.js +0 -1024
  263. package/dist/workers/dispatch-service.js.map +0 -1
  264. package/dist/workers/hooks-integration.d.ts +0 -79
  265. package/dist/workers/hooks-integration.d.ts.map +0 -1
  266. package/dist/workers/hooks-integration.js +0 -286
  267. package/dist/workers/hooks-integration.js.map +0 -1
  268. package/dist/workers/index.d.ts +0 -42
  269. package/dist/workers/index.d.ts.map +0 -1
  270. package/dist/workers/index.js +0 -52
  271. package/dist/workers/index.js.map +0 -1
  272. package/dist/workers/mcp-tools.d.ts +0 -56
  273. package/dist/workers/mcp-tools.d.ts.map +0 -1
  274. package/dist/workers/mcp-tools.js +0 -359
  275. package/dist/workers/mcp-tools.js.map +0 -1
  276. package/dist/workers/phase-executors.d.ts +0 -22
  277. package/dist/workers/phase-executors.d.ts.map +0 -1
  278. package/dist/workers/phase-executors.js +0 -445
  279. package/dist/workers/phase-executors.js.map +0 -1
  280. package/dist/workers/resource-governor.d.ts +0 -75
  281. package/dist/workers/resource-governor.d.ts.map +0 -1
  282. package/dist/workers/resource-governor.js +0 -187
  283. package/dist/workers/resource-governor.js.map +0 -1
  284. package/dist/workers/ruvector-integration.d.ts +0 -163
  285. package/dist/workers/ruvector-integration.d.ts.map +0 -1
  286. package/dist/workers/ruvector-integration.js +0 -543
  287. package/dist/workers/ruvector-integration.js.map +0 -1
  288. package/dist/workers/ruvector-native-integration.d.ts +0 -91
  289. package/dist/workers/ruvector-native-integration.d.ts.map +0 -1
  290. package/dist/workers/ruvector-native-integration.js +0 -254
  291. package/dist/workers/ruvector-native-integration.js.map +0 -1
  292. package/dist/workers/trigger-detector.d.ts +0 -68
  293. package/dist/workers/trigger-detector.d.ts.map +0 -1
  294. package/dist/workers/trigger-detector.js +0 -281
  295. package/dist/workers/trigger-detector.js.map +0 -1
  296. package/dist/workers/types.d.ts +0 -145
  297. package/dist/workers/types.d.ts.map +0 -1
  298. package/dist/workers/types.js +0 -6
  299. package/dist/workers/types.js.map +0 -1
  300. package/dist/workers/worker-agent-integration.d.ts +0 -140
  301. package/dist/workers/worker-agent-integration.d.ts.map +0 -1
  302. package/dist/workers/worker-agent-integration.js +0 -471
  303. package/dist/workers/worker-agent-integration.js.map +0 -1
  304. package/dist/workers/worker-benchmarks.d.ts +0 -88
  305. package/dist/workers/worker-benchmarks.d.ts.map +0 -1
  306. package/dist/workers/worker-benchmarks.js +0 -452
  307. package/dist/workers/worker-benchmarks.js.map +0 -1
  308. package/dist/workers/worker-registry.d.ts +0 -85
  309. package/dist/workers/worker-registry.d.ts.map +0 -1
  310. package/dist/workers/worker-registry.js +0 -547
  311. package/dist/workers/worker-registry.js.map +0 -1
  312. package/docs/.claude-flow/metrics/agent-metrics.json +0 -1
  313. package/docs/.claude-flow/metrics/performance.json +0 -87
  314. package/docs/.claude-flow/metrics/task-metrics.json +0 -10
  315. package/docs/embeddings/EMBEDDING_GEOMETRY.md +0 -935
  316. /package/.claude/agents/analysis/{analyze-code-quality.md → code-review/analyze-code-quality.md} +0 -0
  317. /package/.claude/agents/architecture/{arch-system-design.md → system-design/arch-system-design.md} +0 -0
  318. /package/.claude/agents/data/{data-ml-model.md → ml/data-ml-model.md} +0 -0
  319. /package/.claude/agents/development/{dev-backend-api.md → backend/dev-backend-api.md} +0 -0
  320. /package/.claude/agents/devops/{ops-cicd-github.md → ci-cd/ops-cicd-github.md} +0 -0
  321. /package/.claude/agents/documentation/{docs-api-openapi.md → api-docs/docs-api-openapi.md} +0 -0
  322. /package/.claude/agents/specialized/{spec-mobile-react-native.md → mobile/spec-mobile-react-native.md} +0 -0
  323. /package/.claude/agents/testing/{tdd-london-swarm.md → unit/tdd-london-swarm.md} +0 -0
  324. /package/.claude/agents/testing/{production-validator.md → validation/production-validator.md} +0 -0
@@ -1,547 +0,0 @@
1
- /**
2
- * WorkerRegistry - SQLite-backed persistence for background workers
3
- *
4
- * Supports both better-sqlite3 (native) and sql.js (WASM) backends.
5
- * Automatically falls back to sql.js on Windows or when native fails.
6
- */
7
- import * as path from 'path';
8
- import * as fs from 'fs';
9
- import { ulid } from 'ulid';
10
- const DB_DIR = '.agentic-flow';
11
- const DB_FILE = 'workers.db';
12
- // Create wrapper for better-sqlite3
13
- function createBetterSqliteWrapper(db) {
14
- return {
15
- run: (sql, params) => db.prepare(sql).run(...(params || [])),
16
- get: (sql, params) => db.prepare(sql).get(...(params || [])),
17
- all: (sql, params) => db.prepare(sql).all(...(params || [])),
18
- exec: (sql) => db.exec(sql),
19
- pragma: (directive) => db.pragma(directive),
20
- prepare: (sql) => db.prepare(sql),
21
- close: () => db.close()
22
- };
23
- }
24
- // Create wrapper for sql.js
25
- function createSqlJsWrapper(db, dbPath) {
26
- // sql.js needs manual save
27
- const saveDb = () => {
28
- try {
29
- const data = db.export();
30
- const buffer = Buffer.from(data);
31
- fs.writeFileSync(dbPath, buffer);
32
- }
33
- catch { /* ignore save errors */ }
34
- };
35
- return {
36
- run: (sql, params) => {
37
- db.run(sql, params);
38
- saveDb();
39
- },
40
- get: (sql, params) => {
41
- const stmt = db.prepare(sql);
42
- stmt.bind(params);
43
- if (stmt.step()) {
44
- const row = stmt.getAsObject();
45
- stmt.free();
46
- return row;
47
- }
48
- stmt.free();
49
- return undefined;
50
- },
51
- all: (sql, params) => {
52
- const results = [];
53
- const stmt = db.prepare(sql);
54
- if (params)
55
- stmt.bind(params);
56
- while (stmt.step()) {
57
- results.push(stmt.getAsObject());
58
- }
59
- stmt.free();
60
- return results;
61
- },
62
- exec: (sql) => {
63
- db.exec(sql);
64
- saveDb();
65
- },
66
- pragma: () => { },
67
- prepare: (sql) => {
68
- const stmt = db.prepare(sql);
69
- return {
70
- run: (...params) => {
71
- stmt.bind(params);
72
- stmt.step();
73
- stmt.reset();
74
- saveDb();
75
- return { changes: db.getRowsModified() };
76
- },
77
- get: (...params) => {
78
- stmt.bind(params);
79
- if (stmt.step()) {
80
- const row = stmt.getAsObject();
81
- stmt.reset();
82
- return row;
83
- }
84
- stmt.reset();
85
- return undefined;
86
- },
87
- all: (...params) => {
88
- const results = [];
89
- stmt.bind(params);
90
- while (stmt.step()) {
91
- results.push(stmt.getAsObject());
92
- }
93
- stmt.reset();
94
- return results;
95
- }
96
- };
97
- },
98
- close: () => {
99
- saveDb();
100
- db.close();
101
- }
102
- };
103
- }
104
- export class WorkerRegistry {
105
- db;
106
- initialized = false;
107
- dbBackend = 'memory';
108
- dbPath;
109
- constructor(dbPath) {
110
- const dir = path.join(process.cwd(), DB_DIR);
111
- if (!fs.existsSync(dir)) {
112
- fs.mkdirSync(dir, { recursive: true });
113
- }
114
- this.dbPath = dbPath || path.join(dir, DB_FILE);
115
- this.initializeSync();
116
- }
117
- initializeSync() {
118
- // Try better-sqlite3 first (fastest, native)
119
- try {
120
- const Database = require('better-sqlite3');
121
- this.db = createBetterSqliteWrapper(new Database(this.dbPath));
122
- this.dbBackend = 'better-sqlite3';
123
- this.initialize();
124
- return;
125
- }
126
- catch {
127
- // better-sqlite3 not available (Windows without build tools, etc.)
128
- }
129
- // Try sql.js (WASM, cross-platform)
130
- try {
131
- const initSqlJs = require('sql.js');
132
- // sql.js init is async, but we need sync for constructor
133
- // Use a synchronous workaround by loading existing data
134
- const sqlPromise = initSqlJs().then((SQL) => {
135
- let db;
136
- try {
137
- const fileBuffer = fs.readFileSync(this.dbPath);
138
- db = new SQL.Database(fileBuffer);
139
- }
140
- catch {
141
- db = new SQL.Database();
142
- }
143
- this.db = createSqlJsWrapper(db, this.dbPath);
144
- this.dbBackend = 'sql.js';
145
- this.initialize();
146
- });
147
- // For now, use memory fallback until sql.js loads
148
- this.useMemoryFallback();
149
- // Replace with sql.js when ready
150
- sqlPromise.catch(() => {
151
- // Keep memory fallback
152
- });
153
- return;
154
- }
155
- catch {
156
- // sql.js not available
157
- }
158
- // Final fallback: in-memory Map (no persistence)
159
- this.useMemoryFallback();
160
- }
161
- useMemoryFallback() {
162
- const memory = new Map();
163
- this.db = {
164
- run: () => { },
165
- get: (sql, params) => memory.get(params?.[0]),
166
- all: () => Array.from(memory.values()),
167
- exec: () => { },
168
- pragma: () => { },
169
- prepare: (sql) => ({
170
- run: (...params) => {
171
- if (sql.includes('INSERT')) {
172
- memory.set(params[0], {
173
- id: params[0],
174
- session_id: params[1],
175
- trigger: params[2],
176
- topic: params[3],
177
- status: 'queued',
178
- progress: 0,
179
- created_at: Date.now()
180
- });
181
- }
182
- return { changes: 1 };
183
- },
184
- get: (...params) => memory.get(params[0]),
185
- all: () => Array.from(memory.values())
186
- }),
187
- close: () => memory.clear()
188
- };
189
- this.dbBackend = 'memory';
190
- this.initialized = true;
191
- }
192
- initialize() {
193
- if (this.initialized)
194
- return;
195
- // Enable WAL mode for better concurrent performance
196
- this.db.pragma('journal_mode = WAL');
197
- this.db.pragma('synchronous = NORMAL');
198
- // Create tables
199
- this.db.exec(`
200
- CREATE TABLE IF NOT EXISTS background_workers (
201
- id TEXT PRIMARY KEY,
202
- session_id TEXT NOT NULL,
203
- trigger TEXT NOT NULL,
204
- topic TEXT,
205
- status TEXT DEFAULT 'queued',
206
- progress INTEGER DEFAULT 0,
207
- current_phase TEXT,
208
- started_at INTEGER,
209
- completed_at INTEGER,
210
- error_message TEXT,
211
- memory_deposits INTEGER DEFAULT 0,
212
- result_keys TEXT DEFAULT '[]',
213
- results_data TEXT DEFAULT '{}',
214
- created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)
215
- );
216
-
217
- CREATE INDEX IF NOT EXISTS idx_workers_session ON background_workers(session_id);
218
- CREATE INDEX IF NOT EXISTS idx_workers_status ON background_workers(status);
219
- CREATE INDEX IF NOT EXISTS idx_workers_trigger ON background_workers(trigger);
220
- CREATE INDEX IF NOT EXISTS idx_workers_created ON background_workers(created_at);
221
-
222
- CREATE TABLE IF NOT EXISTS worker_metrics (
223
- worker_id TEXT PRIMARY KEY,
224
- files_analyzed INTEGER DEFAULT 0,
225
- patterns_found INTEGER DEFAULT 0,
226
- memory_bytes_written INTEGER DEFAULT 0,
227
- cpu_time_ms INTEGER DEFAULT 0,
228
- peak_memory_mb REAL DEFAULT 0,
229
- error_count INTEGER DEFAULT 0,
230
- FOREIGN KEY (worker_id) REFERENCES background_workers(id)
231
- );
232
- `);
233
- this.initialized = true;
234
- }
235
- /**
236
- * Create a new worker entry
237
- */
238
- create(trigger, sessionId, topic) {
239
- const id = `worker-${ulid().slice(0, 8)}`;
240
- const now = Date.now();
241
- const stmt = this.db.prepare(`
242
- INSERT INTO background_workers (id, session_id, trigger, topic, created_at)
243
- VALUES (?, ?, ?, ?, ?)
244
- `);
245
- stmt.run(id, sessionId, trigger, topic || null, now);
246
- // Create metrics entry
247
- const metricsStmt = this.db.prepare(`
248
- INSERT INTO worker_metrics (worker_id) VALUES (?)
249
- `);
250
- metricsStmt.run(id);
251
- return id;
252
- }
253
- /**
254
- * Get worker by ID
255
- */
256
- get(workerId) {
257
- const stmt = this.db.prepare(`
258
- SELECT * FROM background_workers WHERE id = ?
259
- `);
260
- const row = stmt.get(workerId);
261
- if (!row)
262
- return null;
263
- return this.rowToWorkerInfo(row);
264
- }
265
- /**
266
- * Update worker status
267
- */
268
- updateStatus(workerId, status, extra) {
269
- const updates = ['status = ?'];
270
- const params = [status];
271
- if (status === 'running' && !extra?.progress) {
272
- updates.push('started_at = ?');
273
- params.push(Date.now());
274
- }
275
- if (status === 'complete' || status === 'failed' || status === 'cancelled') {
276
- updates.push('completed_at = ?');
277
- params.push(Date.now());
278
- }
279
- if (extra?.progress !== undefined) {
280
- updates.push('progress = ?');
281
- params.push(extra.progress);
282
- }
283
- if (extra?.currentPhase !== undefined) {
284
- updates.push('current_phase = ?');
285
- params.push(extra.currentPhase);
286
- }
287
- if (extra?.error !== undefined) {
288
- updates.push('error_message = ?');
289
- params.push(extra.error);
290
- }
291
- if (extra?.results !== undefined) {
292
- updates.push('results_data = ?');
293
- params.push(JSON.stringify(extra.results));
294
- }
295
- params.push(workerId);
296
- const stmt = this.db.prepare(`
297
- UPDATE background_workers
298
- SET ${updates.join(', ')}
299
- WHERE id = ?
300
- `);
301
- stmt.run(...params);
302
- }
303
- /**
304
- * Increment memory deposits counter
305
- */
306
- incrementMemoryDeposits(workerId, key) {
307
- const stmt = this.db.prepare(`
308
- UPDATE background_workers
309
- SET memory_deposits = memory_deposits + 1,
310
- result_keys = json_insert(result_keys, '$[#]', ?)
311
- WHERE id = ?
312
- `);
313
- stmt.run(key || '', workerId);
314
- }
315
- /**
316
- * Update worker metrics
317
- */
318
- updateMetrics(workerId, metrics) {
319
- const updates = [];
320
- const params = [];
321
- if (metrics.filesAnalyzed !== undefined) {
322
- updates.push('files_analyzed = ?');
323
- params.push(metrics.filesAnalyzed);
324
- }
325
- if (metrics.patternsFound !== undefined) {
326
- updates.push('patterns_found = ?');
327
- params.push(metrics.patternsFound);
328
- }
329
- if (metrics.memoryBytesWritten !== undefined) {
330
- updates.push('memory_bytes_written = ?');
331
- params.push(metrics.memoryBytesWritten);
332
- }
333
- if (metrics.cpuTimeMs !== undefined) {
334
- updates.push('cpu_time_ms = ?');
335
- params.push(metrics.cpuTimeMs);
336
- }
337
- if (metrics.peakMemoryMB !== undefined) {
338
- updates.push('peak_memory_mb = ?');
339
- params.push(metrics.peakMemoryMB);
340
- }
341
- if (metrics.errorCount !== undefined) {
342
- updates.push('error_count = ?');
343
- params.push(metrics.errorCount);
344
- }
345
- if (updates.length === 0)
346
- return;
347
- params.push(workerId);
348
- const stmt = this.db.prepare(`
349
- UPDATE worker_metrics
350
- SET ${updates.join(', ')}
351
- WHERE worker_id = ?
352
- `);
353
- stmt.run(...params);
354
- }
355
- /**
356
- * Get all workers, optionally filtered
357
- */
358
- getAll(options) {
359
- const conditions = [];
360
- const params = [];
361
- if (options?.sessionId) {
362
- conditions.push('session_id = ?');
363
- params.push(options.sessionId);
364
- }
365
- if (options?.status) {
366
- if (Array.isArray(options.status)) {
367
- conditions.push(`status IN (${options.status.map(() => '?').join(', ')})`);
368
- params.push(...options.status);
369
- }
370
- else {
371
- conditions.push('status = ?');
372
- params.push(options.status);
373
- }
374
- }
375
- if (options?.trigger) {
376
- conditions.push('trigger = ?');
377
- params.push(options.trigger);
378
- }
379
- if (options?.since) {
380
- conditions.push('created_at >= ?');
381
- params.push(options.since);
382
- }
383
- let sql = 'SELECT * FROM background_workers';
384
- if (conditions.length > 0) {
385
- sql += ' WHERE ' + conditions.join(' AND ');
386
- }
387
- sql += ' ORDER BY created_at DESC';
388
- if (options?.limit) {
389
- sql += ' LIMIT ?';
390
- params.push(options.limit);
391
- }
392
- const stmt = this.db.prepare(sql);
393
- const rows = stmt.all(...params);
394
- return rows.map(row => this.rowToWorkerInfo(row));
395
- }
396
- /**
397
- * Get active workers (queued or running)
398
- */
399
- getActive(sessionId) {
400
- return this.getAll({
401
- sessionId,
402
- status: ['queued', 'running']
403
- });
404
- }
405
- /**
406
- * Count workers by status
407
- */
408
- countByStatus(sessionId) {
409
- let sql = `
410
- SELECT status, COUNT(*) as count
411
- FROM background_workers
412
- `;
413
- const params = [];
414
- if (sessionId) {
415
- sql += ' WHERE session_id = ?';
416
- params.push(sessionId);
417
- }
418
- sql += ' GROUP BY status';
419
- const stmt = this.db.prepare(sql);
420
- const rows = stmt.all(...params);
421
- const counts = {
422
- queued: 0,
423
- running: 0,
424
- complete: 0,
425
- failed: 0,
426
- cancelled: 0,
427
- timeout: 0
428
- };
429
- for (const row of rows) {
430
- counts[row.status] = row.count;
431
- }
432
- return counts;
433
- }
434
- /**
435
- * Get worker metrics
436
- */
437
- getMetrics(workerId) {
438
- const stmt = this.db.prepare(`
439
- SELECT * FROM worker_metrics WHERE worker_id = ?
440
- `);
441
- const row = stmt.get(workerId);
442
- if (!row)
443
- return null;
444
- return {
445
- workerId: row.worker_id,
446
- filesAnalyzed: row.files_analyzed,
447
- patternsFound: row.patterns_found,
448
- memoryBytesWritten: row.memory_bytes_written,
449
- cpuTimeMs: row.cpu_time_ms,
450
- peakMemoryMB: row.peak_memory_mb,
451
- errorCount: row.error_count
452
- };
453
- }
454
- /**
455
- * Delete old workers
456
- */
457
- cleanup(maxAge = 24 * 60 * 60 * 1000) {
458
- const cutoff = Date.now() - maxAge;
459
- const stmt = this.db.prepare(`
460
- DELETE FROM background_workers
461
- WHERE created_at < ? AND status IN ('complete', 'failed', 'cancelled', 'timeout')
462
- `);
463
- const result = stmt.run(cutoff);
464
- return result.changes;
465
- }
466
- /**
467
- * Get aggregated stats for dashboard
468
- */
469
- getStats(timeframe = '24h') {
470
- const since = {
471
- '1h': Date.now() - 60 * 60 * 1000,
472
- '24h': Date.now() - 24 * 60 * 60 * 1000,
473
- '7d': Date.now() - 7 * 24 * 60 * 60 * 1000
474
- }[timeframe];
475
- const stmt = this.db.prepare(`
476
- SELECT
477
- COUNT(*) as total,
478
- AVG(CASE WHEN completed_at IS NOT NULL THEN completed_at - started_at ELSE NULL END) as avg_duration
479
- FROM background_workers
480
- WHERE created_at >= ?
481
- `);
482
- const row = stmt.get(since);
483
- return {
484
- total: row.total,
485
- byStatus: this.countByStatus(),
486
- byTrigger: this.countByTrigger(since),
487
- avgDuration: row.avg_duration || 0
488
- };
489
- }
490
- countByTrigger(since) {
491
- const stmt = this.db.prepare(`
492
- SELECT trigger, COUNT(*) as count
493
- FROM background_workers
494
- WHERE created_at >= ?
495
- GROUP BY trigger
496
- `);
497
- const rows = stmt.all(since);
498
- const counts = {};
499
- for (const row of rows) {
500
- counts[row.trigger] = row.count;
501
- }
502
- return counts;
503
- }
504
- rowToWorkerInfo(row) {
505
- let results = undefined;
506
- try {
507
- const parsed = JSON.parse(row.results_data || '{}');
508
- if (Object.keys(parsed).length > 0) {
509
- results = parsed;
510
- }
511
- }
512
- catch {
513
- // Invalid JSON, ignore
514
- }
515
- return {
516
- id: row.id,
517
- trigger: row.trigger,
518
- topic: row.topic,
519
- sessionId: row.session_id,
520
- status: row.status,
521
- progress: row.progress,
522
- currentPhase: row.current_phase,
523
- startedAt: row.started_at,
524
- completedAt: row.completed_at,
525
- error: row.error_message,
526
- memoryDeposits: row.memory_deposits,
527
- resultKeys: JSON.parse(row.result_keys || '[]'),
528
- createdAt: row.created_at,
529
- results
530
- };
531
- }
532
- /**
533
- * Close database connection
534
- */
535
- close() {
536
- this.db.close();
537
- }
538
- }
539
- // Singleton instance
540
- let instance = null;
541
- export function getWorkerRegistry() {
542
- if (!instance) {
543
- instance = new WorkerRegistry();
544
- }
545
- return instance;
546
- }
547
- //# sourceMappingURL=worker-registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worker-registry.js","sourceRoot":"","sources":["../../src/workers/worker-registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * WorkerRegistry - SQLite-backed persistence for background workers\n *\n * Supports both better-sqlite3 (native) and sql.js (WASM) backends.\n * Automatically falls back to sql.js on Windows or when native fails.\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { ulid } from 'ulid';\nimport {\n WorkerId,\n WorkerTrigger,\n WorkerStatus,\n WorkerInfo,\n WorkerMetrics\n} from './types.js';\n\nconst DB_DIR = '.agentic-flow';\nconst DB_FILE = 'workers.db';\n\n// Database interface for both backends\ninterface DbWrapper {\n run(sql: string, params?: any[]): void;\n get<T>(sql: string, params?: any[]): T | undefined;\n all<T>(sql: string, params?: any[]): T[];\n exec(sql: string): void;\n pragma(directive: string): void;\n prepare(sql: string): {\n run(...params: any[]): any;\n get(...params: any[]): any;\n all(...params: any[]): any[];\n };\n close(): void;\n}\n\n// Create wrapper for better-sqlite3\nfunction createBetterSqliteWrapper(db: any): DbWrapper {\n return {\n run: (sql, params) => db.prepare(sql).run(...(params || [])),\n get: (sql, params) => db.prepare(sql).get(...(params || [])),\n all: (sql, params) => db.prepare(sql).all(...(params || [])),\n exec: (sql) => db.exec(sql),\n pragma: (directive) => db.pragma(directive),\n prepare: (sql) => db.prepare(sql),\n close: () => db.close()\n };\n}\n\n// Create wrapper for sql.js\nfunction createSqlJsWrapper(db: any, dbPath: string): DbWrapper {\n // sql.js needs manual save\n const saveDb = () => {\n try {\n const data = db.export();\n const buffer = Buffer.from(data);\n fs.writeFileSync(dbPath, buffer);\n } catch { /* ignore save errors */ }\n };\n\n return {\n run: (sql, params) => {\n db.run(sql, params);\n saveDb();\n },\n get: (sql, params) => {\n const stmt = db.prepare(sql);\n stmt.bind(params);\n if (stmt.step()) {\n const row = stmt.getAsObject();\n stmt.free();\n return row;\n }\n stmt.free();\n return undefined;\n },\n all: (sql, params) => {\n const results: any[] = [];\n const stmt = db.prepare(sql);\n if (params) stmt.bind(params);\n while (stmt.step()) {\n results.push(stmt.getAsObject());\n }\n stmt.free();\n return results;\n },\n exec: (sql) => {\n db.exec(sql);\n saveDb();\n },\n pragma: () => { /* sql.js doesn't support all pragmas */ },\n prepare: (sql) => {\n const stmt = db.prepare(sql);\n return {\n run: (...params: any[]) => {\n stmt.bind(params);\n stmt.step();\n stmt.reset();\n saveDb();\n return { changes: db.getRowsModified() };\n },\n get: (...params: any[]) => {\n stmt.bind(params);\n if (stmt.step()) {\n const row = stmt.getAsObject();\n stmt.reset();\n return row;\n }\n stmt.reset();\n return undefined;\n },\n all: (...params: any[]) => {\n const results: any[] = [];\n stmt.bind(params);\n while (stmt.step()) {\n results.push(stmt.getAsObject());\n }\n stmt.reset();\n return results;\n }\n };\n },\n close: () => {\n saveDb();\n db.close();\n }\n };\n}\n\nexport class WorkerRegistry {\n private db!: DbWrapper;\n private initialized = false;\n private dbBackend: 'better-sqlite3' | 'sql.js' | 'memory' = 'memory';\n private dbPath: string;\n\n constructor(dbPath?: string) {\n const dir = path.join(process.cwd(), DB_DIR);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n this.dbPath = dbPath || path.join(dir, DB_FILE);\n this.initializeSync();\n }\n\n private initializeSync(): void {\n // Try better-sqlite3 first (fastest, native)\n try {\n const Database = require('better-sqlite3');\n this.db = createBetterSqliteWrapper(new Database(this.dbPath));\n this.dbBackend = 'better-sqlite3';\n this.initialize();\n return;\n } catch {\n // better-sqlite3 not available (Windows without build tools, etc.)\n }\n\n // Try sql.js (WASM, cross-platform)\n try {\n const initSqlJs = require('sql.js');\n // sql.js init is async, but we need sync for constructor\n // Use a synchronous workaround by loading existing data\n const sqlPromise = initSqlJs().then((SQL: any) => {\n let db;\n try {\n const fileBuffer = fs.readFileSync(this.dbPath);\n db = new SQL.Database(fileBuffer);\n } catch {\n db = new SQL.Database();\n }\n this.db = createSqlJsWrapper(db, this.dbPath);\n this.dbBackend = 'sql.js';\n this.initialize();\n });\n\n // For now, use memory fallback until sql.js loads\n this.useMemoryFallback();\n\n // Replace with sql.js when ready\n sqlPromise.catch(() => {\n // Keep memory fallback\n });\n return;\n } catch {\n // sql.js not available\n }\n\n // Final fallback: in-memory Map (no persistence)\n this.useMemoryFallback();\n }\n\n private useMemoryFallback(): void {\n const memory = new Map<string, any>();\n this.db = {\n run: () => {},\n get: (sql, params) => memory.get(params?.[0]),\n all: () => Array.from(memory.values()),\n exec: () => {},\n pragma: () => {},\n prepare: (sql) => ({\n run: (...params: any[]) => {\n if (sql.includes('INSERT')) {\n memory.set(params[0], {\n id: params[0],\n session_id: params[1],\n trigger: params[2],\n topic: params[3],\n status: 'queued',\n progress: 0,\n created_at: Date.now()\n });\n }\n return { changes: 1 };\n },\n get: (...params: any[]) => memory.get(params[0]),\n all: () => Array.from(memory.values())\n }),\n close: () => memory.clear()\n };\n this.dbBackend = 'memory';\n this.initialized = true;\n }\n\n private initialize(): void {\n if (this.initialized) return;\n\n // Enable WAL mode for better concurrent performance\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('synchronous = NORMAL');\n\n // Create tables\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS background_workers (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n trigger TEXT NOT NULL,\n topic TEXT,\n status TEXT DEFAULT 'queued',\n progress INTEGER DEFAULT 0,\n current_phase TEXT,\n started_at INTEGER,\n completed_at INTEGER,\n error_message TEXT,\n memory_deposits INTEGER DEFAULT 0,\n result_keys TEXT DEFAULT '[]',\n results_data TEXT DEFAULT '{}',\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n );\n\n CREATE INDEX IF NOT EXISTS idx_workers_session ON background_workers(session_id);\n CREATE INDEX IF NOT EXISTS idx_workers_status ON background_workers(status);\n CREATE INDEX IF NOT EXISTS idx_workers_trigger ON background_workers(trigger);\n CREATE INDEX IF NOT EXISTS idx_workers_created ON background_workers(created_at);\n\n CREATE TABLE IF NOT EXISTS worker_metrics (\n worker_id TEXT PRIMARY KEY,\n files_analyzed INTEGER DEFAULT 0,\n patterns_found INTEGER DEFAULT 0,\n memory_bytes_written INTEGER DEFAULT 0,\n cpu_time_ms INTEGER DEFAULT 0,\n peak_memory_mb REAL DEFAULT 0,\n error_count INTEGER DEFAULT 0,\n FOREIGN KEY (worker_id) REFERENCES background_workers(id)\n );\n `);\n\n this.initialized = true;\n }\n\n /**\n * Create a new worker entry\n */\n create(\n trigger: WorkerTrigger,\n sessionId: string,\n topic?: string | null\n ): WorkerId {\n const id = `worker-${ulid().slice(0, 8)}`;\n const now = Date.now();\n\n const stmt = this.db.prepare(`\n INSERT INTO background_workers (id, session_id, trigger, topic, created_at)\n VALUES (?, ?, ?, ?, ?)\n `);\n\n stmt.run(id, sessionId, trigger, topic || null, now);\n\n // Create metrics entry\n const metricsStmt = this.db.prepare(`\n INSERT INTO worker_metrics (worker_id) VALUES (?)\n `);\n metricsStmt.run(id);\n\n return id;\n }\n\n /**\n * Get worker by ID\n */\n get(workerId: WorkerId): WorkerInfo | null {\n const stmt = this.db.prepare(`\n SELECT * FROM background_workers WHERE id = ?\n `);\n\n const row = stmt.get(workerId) as any;\n if (!row) return null;\n\n return this.rowToWorkerInfo(row);\n }\n\n /**\n * Update worker status\n */\n updateStatus(\n workerId: WorkerId,\n status: WorkerStatus,\n extra?: {\n progress?: number;\n currentPhase?: string;\n error?: string;\n results?: Record<string, unknown>;\n }\n ): void {\n const updates: string[] = ['status = ?'];\n const params: any[] = [status];\n\n if (status === 'running' && !extra?.progress) {\n updates.push('started_at = ?');\n params.push(Date.now());\n }\n\n if (status === 'complete' || status === 'failed' || status === 'cancelled') {\n updates.push('completed_at = ?');\n params.push(Date.now());\n }\n\n if (extra?.progress !== undefined) {\n updates.push('progress = ?');\n params.push(extra.progress);\n }\n\n if (extra?.currentPhase !== undefined) {\n updates.push('current_phase = ?');\n params.push(extra.currentPhase);\n }\n\n if (extra?.error !== undefined) {\n updates.push('error_message = ?');\n params.push(extra.error);\n }\n\n if (extra?.results !== undefined) {\n updates.push('results_data = ?');\n params.push(JSON.stringify(extra.results));\n }\n\n params.push(workerId);\n\n const stmt = this.db.prepare(`\n UPDATE background_workers\n SET ${updates.join(', ')}\n WHERE id = ?\n `);\n\n stmt.run(...params);\n }\n\n /**\n * Increment memory deposits counter\n */\n incrementMemoryDeposits(workerId: WorkerId, key?: string): void {\n const stmt = this.db.prepare(`\n UPDATE background_workers\n SET memory_deposits = memory_deposits + 1,\n result_keys = json_insert(result_keys, '$[#]', ?)\n WHERE id = ?\n `);\n\n stmt.run(key || '', workerId);\n }\n\n /**\n * Update worker metrics\n */\n updateMetrics(workerId: WorkerId, metrics: Partial<WorkerMetrics>): void {\n const updates: string[] = [];\n const params: any[] = [];\n\n if (metrics.filesAnalyzed !== undefined) {\n updates.push('files_analyzed = ?');\n params.push(metrics.filesAnalyzed);\n }\n if (metrics.patternsFound !== undefined) {\n updates.push('patterns_found = ?');\n params.push(metrics.patternsFound);\n }\n if (metrics.memoryBytesWritten !== undefined) {\n updates.push('memory_bytes_written = ?');\n params.push(metrics.memoryBytesWritten);\n }\n if (metrics.cpuTimeMs !== undefined) {\n updates.push('cpu_time_ms = ?');\n params.push(metrics.cpuTimeMs);\n }\n if (metrics.peakMemoryMB !== undefined) {\n updates.push('peak_memory_mb = ?');\n params.push(metrics.peakMemoryMB);\n }\n if (metrics.errorCount !== undefined) {\n updates.push('error_count = ?');\n params.push(metrics.errorCount);\n }\n\n if (updates.length === 0) return;\n\n params.push(workerId);\n\n const stmt = this.db.prepare(`\n UPDATE worker_metrics\n SET ${updates.join(', ')}\n WHERE worker_id = ?\n `);\n\n stmt.run(...params);\n }\n\n /**\n * Get all workers, optionally filtered\n */\n getAll(options?: {\n sessionId?: string;\n status?: WorkerStatus | WorkerStatus[];\n trigger?: WorkerTrigger;\n limit?: number;\n since?: number;\n }): WorkerInfo[] {\n const conditions: string[] = [];\n const params: any[] = [];\n\n if (options?.sessionId) {\n conditions.push('session_id = ?');\n params.push(options.sessionId);\n }\n\n if (options?.status) {\n if (Array.isArray(options.status)) {\n conditions.push(`status IN (${options.status.map(() => '?').join(', ')})`);\n params.push(...options.status);\n } else {\n conditions.push('status = ?');\n params.push(options.status);\n }\n }\n\n if (options?.trigger) {\n conditions.push('trigger = ?');\n params.push(options.trigger);\n }\n\n if (options?.since) {\n conditions.push('created_at >= ?');\n params.push(options.since);\n }\n\n let sql = 'SELECT * FROM background_workers';\n if (conditions.length > 0) {\n sql += ' WHERE ' + conditions.join(' AND ');\n }\n sql += ' ORDER BY created_at DESC';\n\n if (options?.limit) {\n sql += ' LIMIT ?';\n params.push(options.limit);\n }\n\n const stmt = this.db.prepare(sql);\n const rows = stmt.all(...params) as any[];\n\n return rows.map(row => this.rowToWorkerInfo(row));\n }\n\n /**\n * Get active workers (queued or running)\n */\n getActive(sessionId?: string): WorkerInfo[] {\n return this.getAll({\n sessionId,\n status: ['queued', 'running']\n });\n }\n\n /**\n * Count workers by status\n */\n countByStatus(sessionId?: string): Record<WorkerStatus, number> {\n let sql = `\n SELECT status, COUNT(*) as count\n FROM background_workers\n `;\n const params: any[] = [];\n\n if (sessionId) {\n sql += ' WHERE session_id = ?';\n params.push(sessionId);\n }\n\n sql += ' GROUP BY status';\n\n const stmt = this.db.prepare(sql);\n const rows = stmt.all(...params) as any[];\n\n const counts: Record<string, number> = {\n queued: 0,\n running: 0,\n complete: 0,\n failed: 0,\n cancelled: 0,\n timeout: 0\n };\n\n for (const row of rows) {\n counts[row.status] = row.count;\n }\n\n return counts as Record<WorkerStatus, number>;\n }\n\n /**\n * Get worker metrics\n */\n getMetrics(workerId: WorkerId): WorkerMetrics | null {\n const stmt = this.db.prepare(`\n SELECT * FROM worker_metrics WHERE worker_id = ?\n `);\n\n const row = stmt.get(workerId) as any;\n if (!row) return null;\n\n return {\n workerId: row.worker_id,\n filesAnalyzed: row.files_analyzed,\n patternsFound: row.patterns_found,\n memoryBytesWritten: row.memory_bytes_written,\n cpuTimeMs: row.cpu_time_ms,\n peakMemoryMB: row.peak_memory_mb,\n errorCount: row.error_count\n };\n }\n\n /**\n * Delete old workers\n */\n cleanup(maxAge: number = 24 * 60 * 60 * 1000): number {\n const cutoff = Date.now() - maxAge;\n\n const stmt = this.db.prepare(`\n DELETE FROM background_workers\n WHERE created_at < ? AND status IN ('complete', 'failed', 'cancelled', 'timeout')\n `);\n\n const result = stmt.run(cutoff);\n return result.changes;\n }\n\n /**\n * Get aggregated stats for dashboard\n */\n getStats(timeframe: '1h' | '24h' | '7d' = '24h'): {\n total: number;\n byStatus: Record<WorkerStatus, number>;\n byTrigger: Record<string, number>;\n avgDuration: number;\n } {\n const since = {\n '1h': Date.now() - 60 * 60 * 1000,\n '24h': Date.now() - 24 * 60 * 60 * 1000,\n '7d': Date.now() - 7 * 24 * 60 * 60 * 1000\n }[timeframe];\n\n const stmt = this.db.prepare(`\n SELECT\n COUNT(*) as total,\n AVG(CASE WHEN completed_at IS NOT NULL THEN completed_at - started_at ELSE NULL END) as avg_duration\n FROM background_workers\n WHERE created_at >= ?\n `);\n\n const row = stmt.get(since) as any;\n\n return {\n total: row.total,\n byStatus: this.countByStatus(),\n byTrigger: this.countByTrigger(since),\n avgDuration: row.avg_duration || 0\n };\n }\n\n private countByTrigger(since: number): Record<string, number> {\n const stmt = this.db.prepare(`\n SELECT trigger, COUNT(*) as count\n FROM background_workers\n WHERE created_at >= ?\n GROUP BY trigger\n `);\n\n const rows = stmt.all(since) as any[];\n const counts: Record<string, number> = {};\n\n for (const row of rows) {\n counts[row.trigger] = row.count;\n }\n\n return counts;\n }\n\n private rowToWorkerInfo(row: any): WorkerInfo {\n let results: WorkerInfo['results'] = undefined;\n try {\n const parsed = JSON.parse(row.results_data || '{}');\n if (Object.keys(parsed).length > 0) {\n results = parsed;\n }\n } catch {\n // Invalid JSON, ignore\n }\n\n return {\n id: row.id,\n trigger: row.trigger as WorkerTrigger,\n topic: row.topic,\n sessionId: row.session_id,\n status: row.status as WorkerStatus,\n progress: row.progress,\n currentPhase: row.current_phase,\n startedAt: row.started_at,\n completedAt: row.completed_at,\n error: row.error_message,\n memoryDeposits: row.memory_deposits,\n resultKeys: JSON.parse(row.result_keys || '[]'),\n createdAt: row.created_at,\n results\n };\n }\n\n /**\n * Close database connection\n */\n close(): void {\n this.db.close();\n }\n}\n\n// Singleton instance\nlet instance: WorkerRegistry | null = null;\n\nexport function getWorkerRegistry(): WorkerRegistry {\n if (!instance) {\n instance = new WorkerRegistry();\n }\n return instance;\n}\n"]}