agentic-flow 2.0.3 → 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 (322) hide show
  1. package/.claude/agents/test-neural.md +14 -0
  2. package/.claude/settings.json +9 -133
  3. package/README.md +624 -1776
  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/.claude/agents/.claude-flow/metrics/agent-metrics.json +0 -1
  129. package/.claude/agents/.claude-flow/metrics/performance.json +0 -87
  130. package/.claude/agents/.claude-flow/metrics/task-metrics.json +0 -10
  131. package/.claude/skills/.claude-flow/metrics/agent-metrics.json +0 -1
  132. package/.claude/skills/.claude-flow/metrics/performance.json +0 -87
  133. package/.claude/skills/.claude-flow/metrics/task-metrics.json +0 -10
  134. package/.claude/skills/agentic-flow-quickstart/skill.md +0 -69
  135. package/.claude/skills/hooks-automation/skill.md +0 -155
  136. package/.claude/skills/memory-patterns/skill.md +0 -110
  137. package/.claude/skills/skill-builder/.claude-flow/metrics/agent-metrics.json +0 -1
  138. package/.claude/skills/skill-builder/.claude-flow/metrics/performance.json +0 -87
  139. package/.claude/skills/skill-builder/.claude-flow/metrics/task-metrics.json +0 -10
  140. package/.claude/skills/sparc-methodology/skill.md +0 -137
  141. package/.claude/skills/swarm-coordination/skill.md +0 -94
  142. package/.claude/skills/worker-benchmarks/skill.md +0 -135
  143. package/.claude/skills/worker-integration/skill.md +0 -154
  144. package/.claude/statusline.mjs +0 -109
  145. package/.claude/statusline.sh +0 -71
  146. package/dist/agentdb/benchmarks/comprehensive-benchmark.js +0 -664
  147. package/dist/agentdb/benchmarks/frontier-benchmark.js +0 -419
  148. package/dist/agentdb/benchmarks/reflexion-benchmark.js +0 -370
  149. package/dist/agentdb/cli/agentdb-cli.js +0 -717
  150. package/dist/agentdb/controllers/CausalMemoryGraph.js +0 -322
  151. package/dist/agentdb/controllers/CausalRecall.js +0 -281
  152. package/dist/agentdb/controllers/EmbeddingService.d.ts +0 -37
  153. package/dist/agentdb/controllers/EmbeddingService.d.ts.map +0 -1
  154. package/dist/agentdb/controllers/EmbeddingService.js +0 -119
  155. package/dist/agentdb/controllers/EmbeddingService.js.map +0 -1
  156. package/dist/agentdb/controllers/ExplainableRecall.js +0 -387
  157. package/dist/agentdb/controllers/NightlyLearner.js +0 -382
  158. package/dist/agentdb/controllers/ReflexionMemory.js +0 -239
  159. package/dist/agentdb/controllers/SkillLibrary.js +0 -276
  160. package/dist/agentdb/controllers/frontier-index.js +0 -9
  161. package/dist/agentdb/controllers/index.js +0 -8
  162. package/dist/agentdb/optimizations/BatchOperations.js +0 -198
  163. package/dist/agentdb/optimizations/QueryOptimizer.js +0 -225
  164. package/dist/agentdb/optimizations/index.js +0 -7
  165. package/dist/agentdb/tests/frontier-features.test.js +0 -665
  166. package/dist/benchmarks/embeddings-benchmark.d.ts +0 -38
  167. package/dist/benchmarks/embeddings-benchmark.d.ts.map +0 -1
  168. package/dist/benchmarks/embeddings-benchmark.js +0 -282
  169. package/dist/benchmarks/embeddings-benchmark.js.map +0 -1
  170. package/dist/cli/commands/embeddings.d.ts +0 -12
  171. package/dist/cli/commands/embeddings.d.ts.map +0 -1
  172. package/dist/cli/commands/embeddings.js +0 -386
  173. package/dist/cli/commands/embeddings.js.map +0 -1
  174. package/dist/cli/commands/init.d.ts +0 -8
  175. package/dist/cli/commands/init.d.ts.map +0 -1
  176. package/dist/cli/commands/init.js +0 -514
  177. package/dist/cli/commands/init.js.map +0 -1
  178. package/dist/cli/commands/workers.d.ts +0 -9
  179. package/dist/cli/commands/workers.d.ts.map +0 -1
  180. package/dist/cli/commands/workers.js +0 -991
  181. package/dist/cli/commands/workers.js.map +0 -1
  182. package/dist/cli/skills-manager.js +0 -1297
  183. package/dist/cli/update-message.js +0 -175
  184. package/dist/embeddings/index.d.ts +0 -17
  185. package/dist/embeddings/index.d.ts.map +0 -1
  186. package/dist/embeddings/index.js +0 -17
  187. package/dist/embeddings/index.js.map +0 -1
  188. package/dist/embeddings/neural-substrate.d.ts +0 -206
  189. package/dist/embeddings/neural-substrate.d.ts.map +0 -1
  190. package/dist/embeddings/neural-substrate.js +0 -629
  191. package/dist/embeddings/neural-substrate.js.map +0 -1
  192. package/dist/embeddings/optimized-embedder.d.ts +0 -103
  193. package/dist/embeddings/optimized-embedder.d.ts.map +0 -1
  194. package/dist/embeddings/optimized-embedder.js +0 -730
  195. package/dist/embeddings/optimized-embedder.js.map +0 -1
  196. package/dist/examples/embedding-geometry.d.ts +0 -105
  197. package/dist/examples/embedding-geometry.d.ts.map +0 -1
  198. package/dist/examples/embedding-geometry.js +0 -528
  199. package/dist/examples/embedding-geometry.js.map +0 -1
  200. package/dist/memory/SharedMemoryPool.d.ts +0 -129
  201. package/dist/memory/SharedMemoryPool.d.ts.map +0 -1
  202. package/dist/memory/SharedMemoryPool.js +0 -243
  203. package/dist/memory/SharedMemoryPool.js.map +0 -1
  204. package/dist/memory/index.d.ts +0 -8
  205. package/dist/memory/index.d.ts.map +0 -1
  206. package/dist/memory/index.js +0 -7
  207. package/dist/memory/index.js.map +0 -1
  208. package/dist/proxy/http3-proxy-old.js +0 -331
  209. package/dist/proxy/proxy/anthropic-to-gemini.js +0 -439
  210. package/dist/proxy/utils/logger.js +0 -59
  211. package/dist/reasoningbank/agentdb-adapter.js +0 -125
  212. package/dist/reasoningbank/core/database.js +0 -250
  213. package/dist/reasoningbank/core/memory-engine.js +0 -335
  214. package/dist/swarm/ipfs-swarm.d.ts +0 -265
  215. package/dist/swarm/ipfs-swarm.d.ts.map +0 -1
  216. package/dist/swarm/ipfs-swarm.js +0 -508
  217. package/dist/swarm/ipfs-swarm.js.map +0 -1
  218. package/dist/swarm/p2p-free-swarm.d.ts +0 -344
  219. package/dist/swarm/p2p-free-swarm.d.ts.map +0 -1
  220. package/dist/swarm/p2p-free-swarm.js +0 -603
  221. package/dist/swarm/p2p-free-swarm.js.map +0 -1
  222. package/dist/swarm/real-p2p-swarm.d.ts +0 -183
  223. package/dist/swarm/real-p2p-swarm.d.ts.map +0 -1
  224. package/dist/swarm/real-p2p-swarm.js +0 -469
  225. package/dist/swarm/real-p2p-swarm.js.map +0 -1
  226. package/dist/utils/adaptive-pool-sizing.js +0 -414
  227. package/dist/utils/agentdbCommands.js +0 -175
  228. package/dist/utils/circular-rate-limiter.js +0 -391
  229. package/dist/utils/dynamic-compression.js +0 -298
  230. package/dist/utils/http2-multiplexing.js +0 -319
  231. package/dist/utils/index.d.ts +0 -6
  232. package/dist/utils/index.d.ts.map +0 -1
  233. package/dist/utils/index.js +0 -6
  234. package/dist/utils/index.js.map +0 -1
  235. package/dist/utils/lazy-auth.js +0 -311
  236. package/dist/utils/model-cache.d.ts +0 -61
  237. package/dist/utils/model-cache.d.ts.map +0 -1
  238. package/dist/utils/model-cache.js +0 -176
  239. package/dist/utils/model-cache.js.map +0 -1
  240. package/dist/utils/server-push.js +0 -251
  241. package/dist/utils/suppress-warnings.d.ts +0 -19
  242. package/dist/utils/suppress-warnings.d.ts.map +0 -1
  243. package/dist/utils/suppress-warnings.js +0 -59
  244. package/dist/utils/suppress-warnings.js.map +0 -1
  245. package/dist/utils/zero-copy-buffer.js +0 -286
  246. package/dist/workers/consolidated-phases.d.ts +0 -40
  247. package/dist/workers/consolidated-phases.d.ts.map +0 -1
  248. package/dist/workers/consolidated-phases.js +0 -497
  249. package/dist/workers/consolidated-phases.js.map +0 -1
  250. package/dist/workers/custom-worker-config.d.ts +0 -133
  251. package/dist/workers/custom-worker-config.d.ts.map +0 -1
  252. package/dist/workers/custom-worker-config.js +0 -215
  253. package/dist/workers/custom-worker-config.js.map +0 -1
  254. package/dist/workers/custom-worker-factory.d.ts +0 -89
  255. package/dist/workers/custom-worker-factory.d.ts.map +0 -1
  256. package/dist/workers/custom-worker-factory.js +0 -404
  257. package/dist/workers/custom-worker-factory.js.map +0 -1
  258. package/dist/workers/dispatch-service.d.ts +0 -123
  259. package/dist/workers/dispatch-service.d.ts.map +0 -1
  260. package/dist/workers/dispatch-service.js +0 -1024
  261. package/dist/workers/dispatch-service.js.map +0 -1
  262. package/dist/workers/hooks-integration.d.ts +0 -79
  263. package/dist/workers/hooks-integration.d.ts.map +0 -1
  264. package/dist/workers/hooks-integration.js +0 -286
  265. package/dist/workers/hooks-integration.js.map +0 -1
  266. package/dist/workers/index.d.ts +0 -42
  267. package/dist/workers/index.d.ts.map +0 -1
  268. package/dist/workers/index.js +0 -52
  269. package/dist/workers/index.js.map +0 -1
  270. package/dist/workers/mcp-tools.d.ts +0 -56
  271. package/dist/workers/mcp-tools.d.ts.map +0 -1
  272. package/dist/workers/mcp-tools.js +0 -359
  273. package/dist/workers/mcp-tools.js.map +0 -1
  274. package/dist/workers/phase-executors.d.ts +0 -22
  275. package/dist/workers/phase-executors.d.ts.map +0 -1
  276. package/dist/workers/phase-executors.js +0 -445
  277. package/dist/workers/phase-executors.js.map +0 -1
  278. package/dist/workers/resource-governor.d.ts +0 -75
  279. package/dist/workers/resource-governor.d.ts.map +0 -1
  280. package/dist/workers/resource-governor.js +0 -187
  281. package/dist/workers/resource-governor.js.map +0 -1
  282. package/dist/workers/ruvector-integration.d.ts +0 -163
  283. package/dist/workers/ruvector-integration.d.ts.map +0 -1
  284. package/dist/workers/ruvector-integration.js +0 -543
  285. package/dist/workers/ruvector-integration.js.map +0 -1
  286. package/dist/workers/ruvector-native-integration.d.ts +0 -91
  287. package/dist/workers/ruvector-native-integration.d.ts.map +0 -1
  288. package/dist/workers/ruvector-native-integration.js +0 -254
  289. package/dist/workers/ruvector-native-integration.js.map +0 -1
  290. package/dist/workers/trigger-detector.d.ts +0 -68
  291. package/dist/workers/trigger-detector.d.ts.map +0 -1
  292. package/dist/workers/trigger-detector.js +0 -281
  293. package/dist/workers/trigger-detector.js.map +0 -1
  294. package/dist/workers/types.d.ts +0 -145
  295. package/dist/workers/types.d.ts.map +0 -1
  296. package/dist/workers/types.js +0 -6
  297. package/dist/workers/types.js.map +0 -1
  298. package/dist/workers/worker-agent-integration.d.ts +0 -140
  299. package/dist/workers/worker-agent-integration.d.ts.map +0 -1
  300. package/dist/workers/worker-agent-integration.js +0 -471
  301. package/dist/workers/worker-agent-integration.js.map +0 -1
  302. package/dist/workers/worker-benchmarks.d.ts +0 -88
  303. package/dist/workers/worker-benchmarks.d.ts.map +0 -1
  304. package/dist/workers/worker-benchmarks.js +0 -452
  305. package/dist/workers/worker-benchmarks.js.map +0 -1
  306. package/dist/workers/worker-registry.d.ts +0 -85
  307. package/dist/workers/worker-registry.d.ts.map +0 -1
  308. package/dist/workers/worker-registry.js +0 -547
  309. package/dist/workers/worker-registry.js.map +0 -1
  310. package/docs/.claude-flow/metrics/agent-metrics.json +0 -1
  311. package/docs/.claude-flow/metrics/performance.json +0 -87
  312. package/docs/.claude-flow/metrics/task-metrics.json +0 -10
  313. package/docs/embeddings/EMBEDDING_GEOMETRY.md +0 -935
  314. /package/.claude/agents/analysis/{analyze-code-quality.md → code-review/analyze-code-quality.md} +0 -0
  315. /package/.claude/agents/architecture/{arch-system-design.md → system-design/arch-system-design.md} +0 -0
  316. /package/.claude/agents/data/{data-ml-model.md → ml/data-ml-model.md} +0 -0
  317. /package/.claude/agents/development/{dev-backend-api.md → backend/dev-backend-api.md} +0 -0
  318. /package/.claude/agents/devops/{ops-cicd-github.md → ci-cd/ops-cicd-github.md} +0 -0
  319. /package/.claude/agents/documentation/{docs-api-openapi.md → api-docs/docs-api-openapi.md} +0 -0
  320. /package/.claude/agents/specialized/{spec-mobile-react-native.md → mobile/spec-mobile-react-native.md} +0 -0
  321. /package/.claude/agents/testing/{tdd-london-swarm.md → unit/tdd-london-swarm.md} +0 -0
  322. /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"]}