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.
- package/.claude/agents/test-neural.md +14 -0
- package/.claude/settings.json +9 -133
- package/README.md +622 -1862
- package/dist/.tsbuildinfo +1 -1
- package/dist/billing/mcp/tools.js +0 -1
- package/dist/billing/mcp/tools.js.map +1 -1
- package/dist/cli/commands/hooks.d.ts.map +1 -1
- package/dist/cli/commands/hooks.js +4 -79
- package/dist/cli/commands/hooks.js.map +1 -1
- package/dist/cli-proxy.js +1 -89
- package/dist/cli-proxy.js.map +1 -1
- package/dist/core/agentdb-fast.js +3 -3
- package/dist/core/agentdb-fast.js.map +1 -1
- package/dist/core/agentdb-wrapper-enhanced.d.ts.map +1 -1
- package/dist/core/agentdb-wrapper-enhanced.js +4 -20
- package/dist/core/agentdb-wrapper-enhanced.js.map +1 -1
- package/dist/core/agentdb-wrapper.d.ts +2 -3
- package/dist/core/agentdb-wrapper.d.ts.map +1 -1
- package/dist/core/agentdb-wrapper.js +1 -15
- package/dist/core/agentdb-wrapper.js.map +1 -1
- package/dist/core/attention-native.d.ts +0 -4
- package/dist/core/attention-native.d.ts.map +1 -1
- package/dist/core/attention-native.js +2 -14
- package/dist/core/attention-native.js.map +1 -1
- package/dist/federation/SecurityManager.d.ts +2 -11
- package/dist/federation/SecurityManager.d.ts.map +1 -1
- package/dist/federation/SecurityManager.js +17 -50
- package/dist/federation/SecurityManager.js.map +1 -1
- package/dist/federation/integrations/supabase-adapter-debug.js +3 -3
- package/dist/federation/integrations/supabase-adapter-debug.js.map +1 -1
- package/dist/hooks/swarm-learning-optimizer.js +5 -5
- package/dist/hooks/swarm-learning-optimizer.js.map +1 -1
- package/dist/intelligence/IntelligenceStore.d.ts +26 -35
- package/dist/intelligence/IntelligenceStore.d.ts.map +1 -1
- package/dist/intelligence/IntelligenceStore.js +123 -308
- package/dist/intelligence/IntelligenceStore.js.map +1 -1
- package/dist/intelligence/RuVectorIntelligence.d.ts +1 -26
- package/dist/intelligence/RuVectorIntelligence.d.ts.map +1 -1
- package/dist/intelligence/RuVectorIntelligence.js +10 -49
- package/dist/intelligence/RuVectorIntelligence.js.map +1 -1
- package/dist/intelligence/agent-booster-enhanced.d.ts +0 -1
- package/dist/intelligence/agent-booster-enhanced.d.ts.map +1 -1
- package/dist/intelligence/agent-booster-enhanced.js +3 -24
- package/dist/intelligence/agent-booster-enhanced.js.map +1 -1
- package/dist/intelligence/index.d.ts +3 -29
- package/dist/intelligence/index.d.ts.map +1 -1
- package/dist/intelligence/index.js +3 -13
- package/dist/intelligence/index.js.map +1 -1
- package/dist/mcp/claudeFlowSdkServer.d.ts.map +1 -1
- package/dist/mcp/claudeFlowSdkServer.js +3 -9
- package/dist/mcp/claudeFlowSdkServer.js.map +1 -1
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js +5 -5
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js.map +1 -1
- package/dist/mcp/fastmcp/tools/swarm/init.d.ts.map +1 -1
- package/dist/mcp/fastmcp/tools/swarm/init.js +7 -36
- package/dist/mcp/fastmcp/tools/swarm/init.js.map +1 -1
- package/dist/mcp/fastmcp/tools/swarm/spawn.d.ts.map +1 -1
- package/dist/mcp/fastmcp/tools/swarm/spawn.js +8 -47
- package/dist/mcp/fastmcp/tools/swarm/spawn.js.map +1 -1
- package/dist/mcp/tools/agent-booster-tools.d.ts +1 -1
- package/dist/mcp/tools/agent-booster-tools.d.ts.map +1 -1
- package/dist/mcp/tools/agent-booster-tools.js +4 -10
- package/dist/mcp/tools/agent-booster-tools.js.map +1 -1
- package/dist/mcp/tools/sona-tools.d.ts.map +1 -1
- package/dist/mcp/tools/sona-tools.js +0 -6
- package/dist/mcp/tools/sona-tools.js.map +1 -1
- package/dist/optimizations/agent-booster-migration.d.ts.map +1 -1
- package/dist/optimizations/agent-booster-migration.js +2 -5
- package/dist/optimizations/agent-booster-migration.js.map +1 -1
- package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
- package/dist/proxy/anthropic-to-requesty.js.map +1 -1
- package/dist/proxy/quic-proxy.d.ts +1 -0
- package/dist/proxy/quic-proxy.d.ts.map +1 -1
- package/dist/proxy/quic-proxy.js +2 -2
- package/dist/proxy/quic-proxy.js.map +1 -1
- package/dist/reasoningbank/AdvancedMemory.js +1 -1
- package/dist/reasoningbank/AdvancedMemory.js.map +1 -1
- package/dist/reasoningbank/HybridBackend.d.ts.map +1 -1
- package/dist/reasoningbank/HybridBackend.js +5 -2
- package/dist/reasoningbank/HybridBackend.js.map +1 -1
- package/dist/reasoningbank/backend-selector.d.ts +1 -11
- package/dist/reasoningbank/backend-selector.d.ts.map +1 -1
- package/dist/reasoningbank/backend-selector.js +5 -45
- package/dist/reasoningbank/backend-selector.js.map +1 -1
- package/dist/reasoningbank/core/consolidate.d.ts.map +1 -1
- package/dist/reasoningbank/core/consolidate.js +45 -113
- package/dist/reasoningbank/core/consolidate.js.map +1 -1
- package/dist/reasoningbank/index-new.d.ts +6 -1
- package/dist/reasoningbank/index-new.d.ts.map +1 -1
- package/dist/reasoningbank/index-new.js +6 -1
- package/dist/reasoningbank/index-new.js.map +1 -1
- package/dist/reasoningbank/index.d.ts +6 -2
- package/dist/reasoningbank/index.d.ts.map +1 -1
- package/dist/reasoningbank/index.js +6 -2
- package/dist/reasoningbank/index.js.map +1 -1
- package/dist/reasoningbank/utils/embeddings.d.ts +0 -1
- package/dist/reasoningbank/utils/embeddings.d.ts.map +1 -1
- package/dist/reasoningbank/utils/embeddings.js +26 -53
- package/dist/reasoningbank/utils/embeddings.js.map +1 -1
- package/dist/router/index.d.ts +17 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +19 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/providers/onnx-local-optimized.d.ts +0 -2
- package/dist/router/providers/onnx-local-optimized.d.ts.map +1 -1
- package/dist/router/providers/onnx-local-optimized.js +0 -10
- package/dist/router/providers/onnx-local-optimized.js.map +1 -1
- package/dist/router/providers/onnx-local.d.ts +0 -1
- package/dist/router/providers/onnx-local.d.ts.map +1 -1
- package/dist/router/providers/onnx-local.js +5 -22
- package/dist/router/providers/onnx-local.js.map +1 -1
- package/dist/services/embedding-service.js.map +1 -1
- package/dist/services/sona-agent-training.d.ts +0 -1
- package/dist/services/sona-agent-training.d.ts.map +1 -1
- package/dist/services/sona-agent-training.js.map +1 -1
- package/dist/services/sona-agentdb-integration.d.ts.map +1 -1
- package/dist/services/sona-agentdb-integration.js +6 -9
- package/dist/services/sona-agentdb-integration.js.map +1 -1
- package/dist/services/sona-service.d.ts.map +1 -1
- package/dist/services/sona-service.js +5 -6
- package/dist/services/sona-service.js.map +1 -1
- package/dist/utils/cli.d.ts +1 -1
- package/dist/utils/cli.d.ts.map +1 -1
- package/dist/utils/cli.js +0 -21
- package/dist/utils/cli.js.map +1 -1
- package/package.json +7 -19
- package/scripts/postinstall.js +4 -45
- package/wasm/reasoningbank/reasoningbank_wasm_bg.js +2 -2
- package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm +0 -0
- package/.claude/agents/.claude-flow/metrics/agent-metrics.json +0 -1
- package/.claude/agents/.claude-flow/metrics/performance.json +0 -87
- package/.claude/agents/.claude-flow/metrics/task-metrics.json +0 -10
- package/.claude/skills/.claude-flow/metrics/agent-metrics.json +0 -1
- package/.claude/skills/.claude-flow/metrics/performance.json +0 -87
- package/.claude/skills/.claude-flow/metrics/task-metrics.json +0 -10
- package/.claude/skills/agentic-flow-quickstart/skill.md +0 -69
- package/.claude/skills/hooks-automation/skill.md +0 -155
- package/.claude/skills/memory-patterns/skill.md +0 -110
- package/.claude/skills/skill-builder/.claude-flow/metrics/agent-metrics.json +0 -1
- package/.claude/skills/skill-builder/.claude-flow/metrics/performance.json +0 -87
- package/.claude/skills/skill-builder/.claude-flow/metrics/task-metrics.json +0 -10
- package/.claude/skills/sparc-methodology/skill.md +0 -137
- package/.claude/skills/swarm-coordination/skill.md +0 -94
- package/.claude/skills/worker-benchmarks/skill.md +0 -135
- package/.claude/skills/worker-integration/skill.md +0 -154
- package/.claude/statusline.mjs +0 -109
- package/.claude/statusline.sh +0 -71
- package/dist/agentdb/benchmarks/comprehensive-benchmark.js +0 -664
- package/dist/agentdb/benchmarks/frontier-benchmark.js +0 -419
- package/dist/agentdb/benchmarks/reflexion-benchmark.js +0 -370
- package/dist/agentdb/cli/agentdb-cli.js +0 -717
- package/dist/agentdb/controllers/CausalMemoryGraph.js +0 -322
- package/dist/agentdb/controllers/CausalRecall.js +0 -281
- package/dist/agentdb/controllers/EmbeddingService.d.ts +0 -37
- package/dist/agentdb/controllers/EmbeddingService.d.ts.map +0 -1
- package/dist/agentdb/controllers/EmbeddingService.js +0 -119
- package/dist/agentdb/controllers/EmbeddingService.js.map +0 -1
- package/dist/agentdb/controllers/ExplainableRecall.js +0 -387
- package/dist/agentdb/controllers/NightlyLearner.js +0 -382
- package/dist/agentdb/controllers/ReflexionMemory.js +0 -239
- package/dist/agentdb/controllers/SkillLibrary.js +0 -276
- package/dist/agentdb/controllers/frontier-index.js +0 -9
- package/dist/agentdb/controllers/index.js +0 -8
- package/dist/agentdb/optimizations/BatchOperations.js +0 -198
- package/dist/agentdb/optimizations/QueryOptimizer.js +0 -225
- package/dist/agentdb/optimizations/index.js +0 -7
- package/dist/agentdb/tests/frontier-features.test.js +0 -665
- package/dist/benchmarks/embeddings-benchmark.d.ts +0 -38
- package/dist/benchmarks/embeddings-benchmark.d.ts.map +0 -1
- package/dist/benchmarks/embeddings-benchmark.js +0 -282
- package/dist/benchmarks/embeddings-benchmark.js.map +0 -1
- package/dist/cli/commands/embeddings.d.ts +0 -12
- package/dist/cli/commands/embeddings.d.ts.map +0 -1
- package/dist/cli/commands/embeddings.js +0 -386
- package/dist/cli/commands/embeddings.js.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -8
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/init.js +0 -514
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/workers.d.ts +0 -9
- package/dist/cli/commands/workers.d.ts.map +0 -1
- package/dist/cli/commands/workers.js +0 -991
- package/dist/cli/commands/workers.js.map +0 -1
- package/dist/cli/skills-manager.js +0 -1297
- package/dist/cli/update-message.js +0 -175
- package/dist/embeddings/index.d.ts +0 -17
- package/dist/embeddings/index.d.ts.map +0 -1
- package/dist/embeddings/index.js +0 -17
- package/dist/embeddings/index.js.map +0 -1
- package/dist/embeddings/neural-substrate.d.ts +0 -206
- package/dist/embeddings/neural-substrate.d.ts.map +0 -1
- package/dist/embeddings/neural-substrate.js +0 -629
- package/dist/embeddings/neural-substrate.js.map +0 -1
- package/dist/embeddings/optimized-embedder.d.ts +0 -103
- package/dist/embeddings/optimized-embedder.d.ts.map +0 -1
- package/dist/embeddings/optimized-embedder.js +0 -730
- package/dist/embeddings/optimized-embedder.js.map +0 -1
- package/dist/examples/embedding-geometry.d.ts +0 -105
- package/dist/examples/embedding-geometry.d.ts.map +0 -1
- package/dist/examples/embedding-geometry.js +0 -528
- package/dist/examples/embedding-geometry.js.map +0 -1
- package/dist/memory/SharedMemoryPool.d.ts +0 -129
- package/dist/memory/SharedMemoryPool.d.ts.map +0 -1
- package/dist/memory/SharedMemoryPool.js +0 -243
- package/dist/memory/SharedMemoryPool.js.map +0 -1
- package/dist/memory/index.d.ts +0 -8
- package/dist/memory/index.d.ts.map +0 -1
- package/dist/memory/index.js +0 -7
- package/dist/memory/index.js.map +0 -1
- package/dist/proxy/http3-proxy-old.js +0 -331
- package/dist/proxy/proxy/anthropic-to-gemini.js +0 -439
- package/dist/proxy/utils/logger.js +0 -59
- package/dist/reasoningbank/agentdb-adapter.js +0 -125
- package/dist/reasoningbank/core/database.js +0 -250
- package/dist/reasoningbank/core/memory-engine.js +0 -335
- package/dist/swarm/ipfs-swarm.d.ts +0 -265
- package/dist/swarm/ipfs-swarm.d.ts.map +0 -1
- package/dist/swarm/ipfs-swarm.js +0 -508
- package/dist/swarm/ipfs-swarm.js.map +0 -1
- package/dist/swarm/p2p-free-swarm.d.ts +0 -344
- package/dist/swarm/p2p-free-swarm.d.ts.map +0 -1
- package/dist/swarm/p2p-free-swarm.js +0 -603
- package/dist/swarm/p2p-free-swarm.js.map +0 -1
- package/dist/swarm/real-p2p-swarm.d.ts +0 -183
- package/dist/swarm/real-p2p-swarm.d.ts.map +0 -1
- package/dist/swarm/real-p2p-swarm.js +0 -469
- package/dist/swarm/real-p2p-swarm.js.map +0 -1
- package/dist/utils/adaptive-pool-sizing.js +0 -414
- package/dist/utils/agentdbCommands.js +0 -175
- package/dist/utils/circular-rate-limiter.js +0 -391
- package/dist/utils/dynamic-compression.js +0 -298
- package/dist/utils/http2-multiplexing.js +0 -319
- package/dist/utils/index.d.ts +0 -6
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -6
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/lazy-auth.js +0 -311
- package/dist/utils/model-cache.d.ts +0 -61
- package/dist/utils/model-cache.d.ts.map +0 -1
- package/dist/utils/model-cache.js +0 -176
- package/dist/utils/model-cache.js.map +0 -1
- package/dist/utils/server-push.js +0 -251
- package/dist/utils/suppress-warnings.d.ts +0 -19
- package/dist/utils/suppress-warnings.d.ts.map +0 -1
- package/dist/utils/suppress-warnings.js +0 -59
- package/dist/utils/suppress-warnings.js.map +0 -1
- package/dist/utils/zero-copy-buffer.js +0 -286
- package/dist/workers/consolidated-phases.d.ts +0 -40
- package/dist/workers/consolidated-phases.d.ts.map +0 -1
- package/dist/workers/consolidated-phases.js +0 -497
- package/dist/workers/consolidated-phases.js.map +0 -1
- package/dist/workers/custom-worker-config.d.ts +0 -133
- package/dist/workers/custom-worker-config.d.ts.map +0 -1
- package/dist/workers/custom-worker-config.js +0 -215
- package/dist/workers/custom-worker-config.js.map +0 -1
- package/dist/workers/custom-worker-factory.d.ts +0 -89
- package/dist/workers/custom-worker-factory.d.ts.map +0 -1
- package/dist/workers/custom-worker-factory.js +0 -404
- package/dist/workers/custom-worker-factory.js.map +0 -1
- package/dist/workers/dispatch-service.d.ts +0 -123
- package/dist/workers/dispatch-service.d.ts.map +0 -1
- package/dist/workers/dispatch-service.js +0 -1024
- package/dist/workers/dispatch-service.js.map +0 -1
- package/dist/workers/hooks-integration.d.ts +0 -79
- package/dist/workers/hooks-integration.d.ts.map +0 -1
- package/dist/workers/hooks-integration.js +0 -286
- package/dist/workers/hooks-integration.js.map +0 -1
- package/dist/workers/index.d.ts +0 -42
- package/dist/workers/index.d.ts.map +0 -1
- package/dist/workers/index.js +0 -52
- package/dist/workers/index.js.map +0 -1
- package/dist/workers/mcp-tools.d.ts +0 -56
- package/dist/workers/mcp-tools.d.ts.map +0 -1
- package/dist/workers/mcp-tools.js +0 -359
- package/dist/workers/mcp-tools.js.map +0 -1
- package/dist/workers/phase-executors.d.ts +0 -22
- package/dist/workers/phase-executors.d.ts.map +0 -1
- package/dist/workers/phase-executors.js +0 -445
- package/dist/workers/phase-executors.js.map +0 -1
- package/dist/workers/resource-governor.d.ts +0 -75
- package/dist/workers/resource-governor.d.ts.map +0 -1
- package/dist/workers/resource-governor.js +0 -187
- package/dist/workers/resource-governor.js.map +0 -1
- package/dist/workers/ruvector-integration.d.ts +0 -163
- package/dist/workers/ruvector-integration.d.ts.map +0 -1
- package/dist/workers/ruvector-integration.js +0 -543
- package/dist/workers/ruvector-integration.js.map +0 -1
- package/dist/workers/ruvector-native-integration.d.ts +0 -91
- package/dist/workers/ruvector-native-integration.d.ts.map +0 -1
- package/dist/workers/ruvector-native-integration.js +0 -254
- package/dist/workers/ruvector-native-integration.js.map +0 -1
- package/dist/workers/trigger-detector.d.ts +0 -68
- package/dist/workers/trigger-detector.d.ts.map +0 -1
- package/dist/workers/trigger-detector.js +0 -281
- package/dist/workers/trigger-detector.js.map +0 -1
- package/dist/workers/types.d.ts +0 -145
- package/dist/workers/types.d.ts.map +0 -1
- package/dist/workers/types.js +0 -6
- package/dist/workers/types.js.map +0 -1
- package/dist/workers/worker-agent-integration.d.ts +0 -140
- package/dist/workers/worker-agent-integration.d.ts.map +0 -1
- package/dist/workers/worker-agent-integration.js +0 -471
- package/dist/workers/worker-agent-integration.js.map +0 -1
- package/dist/workers/worker-benchmarks.d.ts +0 -88
- package/dist/workers/worker-benchmarks.d.ts.map +0 -1
- package/dist/workers/worker-benchmarks.js +0 -452
- package/dist/workers/worker-benchmarks.js.map +0 -1
- package/dist/workers/worker-registry.d.ts +0 -85
- package/dist/workers/worker-registry.d.ts.map +0 -1
- package/dist/workers/worker-registry.js +0 -547
- package/dist/workers/worker-registry.js.map +0 -1
- package/docs/.claude-flow/metrics/agent-metrics.json +0 -1
- package/docs/.claude-flow/metrics/performance.json +0 -87
- package/docs/.claude-flow/metrics/task-metrics.json +0 -10
- package/docs/embeddings/EMBEDDING_GEOMETRY.md +0 -935
- /package/.claude/agents/analysis/{analyze-code-quality.md → code-review/analyze-code-quality.md} +0 -0
- /package/.claude/agents/architecture/{arch-system-design.md → system-design/arch-system-design.md} +0 -0
- /package/.claude/agents/data/{data-ml-model.md → ml/data-ml-model.md} +0 -0
- /package/.claude/agents/development/{dev-backend-api.md → backend/dev-backend-api.md} +0 -0
- /package/.claude/agents/devops/{ops-cicd-github.md → ci-cd/ops-cicd-github.md} +0 -0
- /package/.claude/agents/documentation/{docs-api-openapi.md → api-docs/docs-api-openapi.md} +0 -0
- /package/.claude/agents/specialized/{spec-mobile-react-native.md → mobile/spec-mobile-react-native.md} +0 -0
- /package/.claude/agents/testing/{tdd-london-swarm.md → unit/tdd-london-swarm.md} +0 -0
- /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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{}
|