@stackmemoryai/stackmemory 0.5.58 → 0.5.59
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/dist/cli/commands/search.js +20 -3
- package/dist/cli/commands/search.js.map +2 -2
- package/dist/core/database/sqlite-adapter.js +13 -3
- package/dist/core/database/sqlite-adapter.js.map +2 -2
- package/dist/core/errors/error-utils.js +208 -0
- package/dist/core/errors/error-utils.js.map +7 -0
- package/dist/core/errors/index.js +13 -4
- package/dist/core/errors/index.js.map +2 -2
- package/dist/core/merge/unified-merge-resolver.js +303 -0
- package/dist/core/merge/unified-merge-resolver.js.map +7 -0
- package/dist/core/monitoring/logger.js +61 -9
- package/dist/core/monitoring/logger.js.map +2 -2
- package/dist/core/security/index.js +35 -0
- package/dist/core/security/index.js.map +7 -0
- package/dist/core/security/input-sanitizer.js +321 -0
- package/dist/core/security/input-sanitizer.js.map +7 -0
- package/dist/integrations/linear/client.js +5 -1
- package/dist/integrations/linear/client.js.map +2 -2
- package/dist/integrations/mcp/remote-server.js +27 -36
- package/dist/integrations/mcp/remote-server.js.map +2 -2
- package/dist/integrations/mcp/server.js +44 -29
- package/dist/integrations/mcp/server.js.map +3 -3
- package/dist/scripts/benchmark-performance.js +48 -0
- package/dist/scripts/benchmark-performance.js.map +7 -0
- package/dist/scripts/check-redis.js +42 -0
- package/dist/scripts/check-redis.js.map +7 -0
- package/dist/scripts/initialize.js +116 -0
- package/dist/scripts/initialize.js.map +7 -0
- package/dist/scripts/list-linear-tasks.js +124 -0
- package/dist/scripts/list-linear-tasks.js.map +7 -0
- package/dist/scripts/measure-handoff-impact.js +340 -0
- package/dist/scripts/measure-handoff-impact.js.map +7 -0
- package/dist/scripts/query-chromadb.js +160 -0
- package/dist/scripts/query-chromadb.js.map +7 -0
- package/dist/scripts/show-linear-summary.js +119 -0
- package/dist/scripts/show-linear-summary.js.map +7 -0
- package/dist/scripts/simple-swarm-demo.js +90 -0
- package/dist/scripts/simple-swarm-demo.js.map +7 -0
- package/dist/scripts/status.js +155 -0
- package/dist/scripts/status.js.map +7 -0
- package/dist/scripts/test-chromadb-sync.js +192 -0
- package/dist/scripts/test-chromadb-sync.js.map +7 -0
- package/dist/scripts/test-ralph-iteration-fix.js +86 -0
- package/dist/scripts/test-ralph-iteration-fix.js.map +7 -0
- package/dist/scripts/test-ralph-iterations.js +121 -0
- package/dist/scripts/test-ralph-iterations.js.map +7 -0
- package/dist/scripts/test-redis-storage.js +389 -0
- package/dist/scripts/test-redis-storage.js.map +7 -0
- package/dist/scripts/test-simple-ralph-state-sync.js +115 -0
- package/dist/scripts/test-simple-ralph-state-sync.js.map +7 -0
- package/dist/scripts/test-swarm-fixes.js +125 -0
- package/dist/scripts/test-swarm-fixes.js.map +7 -0
- package/dist/scripts/test-swarm-tui.js +23 -0
- package/dist/scripts/test-swarm-tui.js.map +7 -0
- package/dist/scripts/test-tui-shortcuts.js +52 -0
- package/dist/scripts/test-tui-shortcuts.js.map +7 -0
- package/dist/scripts/validate-tui-shortcuts.js +60 -0
- package/dist/scripts/validate-tui-shortcuts.js.map +7 -0
- package/dist/src/agents/core/agent-task-manager.js +527 -0
- package/dist/src/agents/core/agent-task-manager.js.map +7 -0
- package/dist/src/agents/verifiers/base-verifier.js +133 -0
- package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/formatter-verifier.js +130 -0
- package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/llm-judge.js +252 -0
- package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
- package/dist/src/cli/auto-detect.js +321 -0
- package/dist/src/cli/auto-detect.js.map +7 -0
- package/dist/src/cli/claude-sm-danger.js +21 -0
- package/dist/src/cli/claude-sm-danger.js.map +7 -0
- package/dist/src/cli/claude-sm.js +1156 -0
- package/dist/src/cli/claude-sm.js.map +7 -0
- package/dist/src/cli/codex-sm-danger.js +21 -0
- package/dist/src/cli/codex-sm-danger.js.map +7 -0
- package/dist/src/cli/codex-sm.js +349 -0
- package/dist/src/cli/codex-sm.js.map +7 -0
- package/dist/src/cli/commands/api.js +232 -0
- package/dist/src/cli/commands/api.js.map +7 -0
- package/dist/src/cli/commands/auto-background.js +180 -0
- package/dist/src/cli/commands/auto-background.js.map +7 -0
- package/dist/src/cli/commands/cleanup-processes.js +68 -0
- package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
- package/dist/src/cli/commands/clear.js +202 -0
- package/dist/src/cli/commands/clear.js.map +7 -0
- package/dist/src/cli/commands/config.js +445 -0
- package/dist/src/cli/commands/config.js.map +7 -0
- package/dist/src/cli/commands/context-rehydrate.js +751 -0
- package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
- package/dist/src/cli/commands/context.js +343 -0
- package/dist/src/cli/commands/context.js.map +7 -0
- package/dist/src/cli/commands/daemon.js +392 -0
- package/dist/src/cli/commands/daemon.js.map +7 -0
- package/dist/src/cli/commands/dashboard.js +210 -0
- package/dist/src/cli/commands/dashboard.js.map +7 -0
- package/dist/src/cli/commands/db.js +147 -0
- package/dist/src/cli/commands/db.js.map +7 -0
- package/dist/src/cli/commands/decision.js +266 -0
- package/dist/src/cli/commands/decision.js.map +7 -0
- package/dist/src/cli/commands/discovery.js +279 -0
- package/dist/src/cli/commands/discovery.js.map +7 -0
- package/dist/src/cli/commands/handoff.js +624 -0
- package/dist/src/cli/commands/handoff.js.map +7 -0
- package/dist/src/cli/commands/hooks.js +298 -0
- package/dist/src/cli/commands/hooks.js.map +7 -0
- package/dist/src/cli/commands/linear.js +529 -0
- package/dist/src/cli/commands/linear.js.map +7 -0
- package/dist/src/cli/commands/log.js +169 -0
- package/dist/src/cli/commands/log.js.map +7 -0
- package/dist/src/cli/commands/login.js +172 -0
- package/dist/src/cli/commands/login.js.map +7 -0
- package/dist/src/cli/commands/migrate.js +240 -0
- package/dist/src/cli/commands/migrate.js.map +7 -0
- package/dist/src/cli/commands/model.js +533 -0
- package/dist/src/cli/commands/model.js.map +7 -0
- package/dist/src/cli/commands/onboard.js +536 -0
- package/dist/src/cli/commands/onboard.js.map +7 -0
- package/dist/src/cli/commands/projects.js +199 -0
- package/dist/src/cli/commands/projects.js.map +7 -0
- package/dist/src/cli/commands/ralph.js +909 -0
- package/dist/src/cli/commands/ralph.js.map +7 -0
- package/dist/src/cli/commands/retrieval.js +248 -0
- package/dist/src/cli/commands/retrieval.js.map +7 -0
- package/dist/src/cli/commands/search.js +173 -0
- package/dist/src/cli/commands/search.js.map +7 -0
- package/dist/src/cli/commands/service.js +749 -0
- package/dist/src/cli/commands/service.js.map +7 -0
- package/dist/src/cli/commands/session.js +200 -0
- package/dist/src/cli/commands/session.js.map +7 -0
- package/dist/src/cli/commands/settings.js +306 -0
- package/dist/src/cli/commands/settings.js.map +7 -0
- package/dist/src/cli/commands/setup.js +701 -0
- package/dist/src/cli/commands/setup.js.map +7 -0
- package/dist/src/cli/commands/shell.js +249 -0
- package/dist/src/cli/commands/shell.js.map +7 -0
- package/dist/src/cli/commands/signup.js +50 -0
- package/dist/src/cli/commands/signup.js.map +7 -0
- package/dist/src/cli/commands/skills.js +470 -0
- package/dist/src/cli/commands/skills.js.map +7 -0
- package/dist/src/cli/commands/sms-notify.js +795 -0
- package/dist/src/cli/commands/sms-notify.js.map +7 -0
- package/dist/src/cli/commands/storage-tier.js +183 -0
- package/dist/src/cli/commands/storage-tier.js.map +7 -0
- package/dist/src/cli/commands/sweep.js +249 -0
- package/dist/src/cli/commands/sweep.js.map +7 -0
- package/dist/src/cli/commands/tasks.js +213 -0
- package/dist/src/cli/commands/tasks.js.map +7 -0
- package/dist/src/cli/commands/worktree.js +319 -0
- package/dist/src/cli/commands/worktree.js.map +7 -0
- package/dist/src/cli/index.js +594 -0
- package/dist/src/cli/index.js.map +7 -0
- package/dist/src/cli/opencode-sm.js +448 -0
- package/dist/src/cli/opencode-sm.js.map +7 -0
- package/dist/src/cli/utils/viewer.js +96 -0
- package/dist/src/cli/utils/viewer.js.map +7 -0
- package/dist/src/core/config/config-manager.js +398 -0
- package/dist/src/core/config/config-manager.js.map +7 -0
- package/dist/src/core/config/feature-flags.js +76 -0
- package/dist/src/core/config/feature-flags.js.map +7 -0
- package/dist/src/core/config/storage-config.js +115 -0
- package/dist/src/core/config/storage-config.js.map +7 -0
- package/dist/src/core/config/types.js +144 -0
- package/dist/src/core/config/types.js.map +7 -0
- package/dist/src/core/context/auto-context.js +80 -0
- package/dist/src/core/context/auto-context.js.map +7 -0
- package/dist/src/core/context/dual-stack-manager.js +870 -0
- package/dist/src/core/context/dual-stack-manager.js.map +7 -0
- package/dist/src/core/context/enhanced-rehydration.js +994 -0
- package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
- package/dist/src/core/context/frame-database.js +479 -0
- package/dist/src/core/context/frame-database.js.map +7 -0
- package/dist/src/core/context/frame-digest.js +250 -0
- package/dist/src/core/context/frame-digest.js.map +7 -0
- package/dist/src/core/context/frame-handoff-manager.js +778 -0
- package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
- package/dist/src/core/context/frame-lifecycle-hooks.js +119 -0
- package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
- package/dist/src/core/context/frame-recovery.js +302 -0
- package/dist/src/core/context/frame-recovery.js.map +7 -0
- package/dist/src/core/context/frame-stack.js +314 -0
- package/dist/src/core/context/frame-stack.js.map +7 -0
- package/dist/src/core/context/frame-types.js +5 -0
- package/dist/src/core/context/frame-types.js.map +7 -0
- package/dist/src/core/context/index.js +25 -0
- package/dist/src/core/context/index.js.map +7 -0
- package/dist/src/core/context/permission-manager.js +185 -0
- package/dist/src/core/context/permission-manager.js.map +7 -0
- package/dist/src/core/context/recursive-context-manager.js +592 -0
- package/dist/src/core/context/recursive-context-manager.js.map +7 -0
- package/dist/src/core/context/refactored-frame-manager.js +754 -0
- package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
- package/dist/src/core/context/shared-context-layer.js +621 -0
- package/dist/src/core/context/shared-context-layer.js.map +7 -0
- package/dist/src/core/context/stack-merge-resolver.js +749 -0
- package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
- package/dist/src/core/context/validation.js +130 -0
- package/dist/src/core/context/validation.js.map +7 -0
- package/dist/src/core/database/batch-operations.js +384 -0
- package/dist/src/core/database/batch-operations.js.map +7 -0
- package/dist/src/core/database/connection-pool.js +330 -0
- package/dist/src/core/database/connection-pool.js.map +7 -0
- package/dist/src/core/database/database-adapter.js +60 -0
- package/dist/src/core/database/database-adapter.js.map +7 -0
- package/dist/src/core/database/migration-manager.js +614 -0
- package/dist/src/core/database/migration-manager.js.map +7 -0
- package/dist/src/core/database/query-cache.js +298 -0
- package/dist/src/core/database/query-cache.js.map +7 -0
- package/dist/src/core/database/query-router.js +430 -0
- package/dist/src/core/database/query-router.js.map +7 -0
- package/dist/src/core/database/sqlite-adapter.js +738 -0
- package/dist/src/core/database/sqlite-adapter.js.map +7 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js +277 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
- package/dist/src/core/digest/frame-digest-integration.js +176 -0
- package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
- package/dist/src/core/digest/hybrid-digest-generator.js +553 -0
- package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
- package/dist/src/core/digest/index.js +9 -0
- package/dist/src/core/digest/index.js.map +7 -0
- package/dist/src/core/digest/types.js +25 -0
- package/dist/src/core/digest/types.js.map +7 -0
- package/dist/src/core/errors/error-utils.js +208 -0
- package/dist/src/core/errors/error-utils.js.map +7 -0
- package/dist/src/core/errors/index.js +521 -0
- package/dist/src/core/errors/index.js.map +7 -0
- package/dist/src/core/errors/recovery.js +269 -0
- package/dist/src/core/errors/recovery.js.map +7 -0
- package/dist/src/core/execution/parallel-executor.js +258 -0
- package/dist/src/core/execution/parallel-executor.js.map +7 -0
- package/dist/src/core/frame/workflow-templates.js +319 -0
- package/dist/src/core/frame/workflow-templates.js.map +7 -0
- package/dist/src/core/merge/conflict-detector.js +431 -0
- package/dist/src/core/merge/conflict-detector.js.map +7 -0
- package/dist/src/core/merge/index.js +9 -0
- package/dist/src/core/merge/index.js.map +7 -0
- package/dist/src/core/merge/resolution-engine.js +558 -0
- package/dist/src/core/merge/resolution-engine.js.map +7 -0
- package/dist/src/core/merge/stack-diff.js +532 -0
- package/dist/src/core/merge/stack-diff.js.map +7 -0
- package/dist/src/core/merge/types.js +5 -0
- package/dist/src/core/merge/types.js.map +7 -0
- package/dist/src/core/merge/unified-merge-resolver.js +303 -0
- package/dist/src/core/merge/unified-merge-resolver.js.map +7 -0
- package/dist/src/core/models/fallback-monitor.js +232 -0
- package/dist/src/core/models/fallback-monitor.js.map +7 -0
- package/dist/src/core/models/model-router.js +340 -0
- package/dist/src/core/models/model-router.js.map +7 -0
- package/dist/src/core/monitoring/error-handler.js +49 -0
- package/dist/src/core/monitoring/error-handler.js.map +7 -0
- package/dist/src/core/monitoring/logger.js +202 -0
- package/dist/src/core/monitoring/logger.js.map +7 -0
- package/dist/src/core/monitoring/metrics.js +172 -0
- package/dist/src/core/monitoring/metrics.js.map +7 -0
- package/dist/src/core/monitoring/progress-tracker.js +189 -0
- package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
- package/dist/src/core/monitoring/session-monitor.js +300 -0
- package/dist/src/core/monitoring/session-monitor.js.map +7 -0
- package/dist/src/core/performance/context-cache.js +273 -0
- package/dist/src/core/performance/context-cache.js.map +7 -0
- package/dist/src/core/performance/index.js +11 -0
- package/dist/src/core/performance/index.js.map +7 -0
- package/dist/src/core/performance/lazy-context-loader.js +327 -0
- package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
- package/dist/src/core/performance/monitor.js +221 -0
- package/dist/src/core/performance/monitor.js.map +7 -0
- package/dist/src/core/performance/optimized-frame-context.js +345 -0
- package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
- package/dist/src/core/performance/performance-benchmark.js +277 -0
- package/dist/src/core/performance/performance-benchmark.js.map +7 -0
- package/dist/src/core/performance/performance-profiler.js +370 -0
- package/dist/src/core/performance/performance-profiler.js.map +7 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js +195 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
- package/dist/src/core/persistence/postgres-adapter.js +349 -0
- package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
- package/dist/src/core/projects/project-isolation.js +201 -0
- package/dist/src/core/projects/project-isolation.js.map +7 -0
- package/dist/src/core/projects/project-manager.js +697 -0
- package/dist/src/core/projects/project-manager.js.map +7 -0
- package/dist/src/core/query/query-parser.js +370 -0
- package/dist/src/core/query/query-parser.js.map +7 -0
- package/dist/src/core/query/query-templates.js +321 -0
- package/dist/src/core/query/query-templates.js.map +7 -0
- package/dist/src/core/retrieval/context-retriever.js +479 -0
- package/dist/src/core/retrieval/context-retriever.js.map +7 -0
- package/dist/src/core/retrieval/index.js +8 -0
- package/dist/src/core/retrieval/index.js.map +7 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js +613 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
- package/dist/src/core/retrieval/llm-provider.js +151 -0
- package/dist/src/core/retrieval/llm-provider.js.map +7 -0
- package/dist/src/core/retrieval/retrieval-audit.js +236 -0
- package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
- package/dist/src/core/retrieval/summary-generator.js +589 -0
- package/dist/src/core/retrieval/summary-generator.js.map +7 -0
- package/dist/src/core/retrieval/types.js +21 -0
- package/dist/src/core/retrieval/types.js.map +7 -0
- package/dist/src/core/security/index.js +35 -0
- package/dist/src/core/security/index.js.map +7 -0
- package/dist/src/core/security/input-sanitizer.js +321 -0
- package/dist/src/core/security/input-sanitizer.js.map +7 -0
- package/dist/src/core/session/clear-survival.js +465 -0
- package/dist/src/core/session/clear-survival.js.map +7 -0
- package/dist/src/core/session/enhanced-handoff.js +792 -0
- package/dist/src/core/session/enhanced-handoff.js.map +7 -0
- package/dist/src/core/session/handoff-generator.js +343 -0
- package/dist/src/core/session/handoff-generator.js.map +7 -0
- package/dist/src/core/session/index.js +15 -0
- package/dist/src/core/session/index.js.map +7 -0
- package/dist/src/core/session/session-manager.js +347 -0
- package/dist/src/core/session/session-manager.js.map +7 -0
- package/dist/src/core/skills/index.js +7 -0
- package/dist/src/core/skills/index.js.map +7 -0
- package/dist/src/core/skills/skill-storage.js +764 -0
- package/dist/src/core/skills/skill-storage.js.map +7 -0
- package/dist/src/core/skills/types.js +193 -0
- package/dist/src/core/skills/types.js.map +7 -0
- package/dist/src/core/storage/chromadb-adapter.js +354 -0
- package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
- package/dist/src/core/storage/infinite-storage.js +510 -0
- package/dist/src/core/storage/infinite-storage.js.map +7 -0
- package/dist/src/core/storage/remote-storage.js +489 -0
- package/dist/src/core/storage/remote-storage.js.map +7 -0
- package/dist/src/core/storage/two-tier-storage.js +766 -0
- package/dist/src/core/storage/two-tier-storage.js.map +7 -0
- package/dist/src/core/trace/cli-trace-wrapper.js +132 -0
- package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/db-trace-wrapper.js +247 -0
- package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/debug-trace.js +417 -0
- package/dist/src/core/trace/debug-trace.js.map +7 -0
- package/dist/src/core/trace/index.js +109 -0
- package/dist/src/core/trace/index.js.map +7 -0
- package/dist/src/core/trace/linear-api-wrapper.js +178 -0
- package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
- package/dist/src/core/trace/trace-detector.js +528 -0
- package/dist/src/core/trace/trace-detector.js.map +7 -0
- package/dist/src/core/trace/trace-store.js +345 -0
- package/dist/src/core/trace/trace-store.js.map +7 -0
- package/dist/src/core/trace/types.js +77 -0
- package/dist/src/core/trace/types.js.map +7 -0
- package/dist/src/core/types.js +5 -0
- package/dist/src/core/types.js.map +7 -0
- package/dist/src/core/utils/async-mutex.js +114 -0
- package/dist/src/core/utils/async-mutex.js.map +7 -0
- package/dist/src/core/utils/compression.js +83 -0
- package/dist/src/core/utils/compression.js.map +7 -0
- package/dist/src/core/utils/update-checker.js +218 -0
- package/dist/src/core/utils/update-checker.js.map +7 -0
- package/dist/src/core/worktree/worktree-manager.js +465 -0
- package/dist/src/core/worktree/worktree-manager.js.map +7 -0
- package/dist/src/daemon/daemon-config.js +149 -0
- package/dist/src/daemon/daemon-config.js.map +7 -0
- package/dist/src/daemon/services/context-service.js +122 -0
- package/dist/src/daemon/services/context-service.js.map +7 -0
- package/dist/src/daemon/services/linear-service.js +136 -0
- package/dist/src/daemon/services/linear-service.js.map +7 -0
- package/dist/src/daemon/session-daemon.js +312 -0
- package/dist/src/daemon/session-daemon.js.map +7 -0
- package/dist/src/daemon/unified-daemon.js +276 -0
- package/dist/src/daemon/unified-daemon.js.map +7 -0
- package/dist/src/features/analytics/api/analytics-api.js +287 -0
- package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
- package/dist/src/features/analytics/core/analytics-service.js +282 -0
- package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
- package/dist/src/features/analytics/index.js +18 -0
- package/dist/src/features/analytics/index.js.map +7 -0
- package/dist/src/features/analytics/queries/metrics-queries.js +277 -0
- package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
- package/dist/src/features/analytics/types/metrics.js +5 -0
- package/dist/src/features/analytics/types/metrics.js.map +7 -0
- package/dist/src/features/browser/browser-mcp.js +492 -0
- package/dist/src/features/browser/browser-mcp.js.map +7 -0
- package/dist/src/features/sweep/index.js +20 -0
- package/dist/src/features/sweep/index.js.map +7 -0
- package/dist/src/features/sweep/prediction-client.js +155 -0
- package/dist/src/features/sweep/prediction-client.js.map +7 -0
- package/dist/src/features/sweep/prompt-builder.js +85 -0
- package/dist/src/features/sweep/prompt-builder.js.map +7 -0
- package/dist/src/features/sweep/pty-wrapper.js +171 -0
- package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
- package/dist/src/features/sweep/state-watcher.js +87 -0
- package/dist/src/features/sweep/state-watcher.js.map +7 -0
- package/dist/src/features/sweep/status-bar.js +88 -0
- package/dist/src/features/sweep/status-bar.js.map +7 -0
- package/dist/src/features/sweep/sweep-server-manager.js +226 -0
- package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
- package/dist/src/features/sweep/tab-interceptor.js +38 -0
- package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
- package/dist/src/features/sweep/types.js +18 -0
- package/dist/src/features/sweep/types.js.map +7 -0
- package/dist/src/features/tasks/linear-task-manager.js +487 -0
- package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
- package/dist/src/features/tasks/task-aware-context.js +410 -0
- package/dist/src/features/tasks/task-aware-context.js.map +7 -0
- package/dist/src/features/tui/simple-monitor.js +116 -0
- package/dist/src/features/tui/simple-monitor.js.map +7 -0
- package/dist/src/features/tui/swarm-monitor.js +648 -0
- package/dist/src/features/tui/swarm-monitor.js.map +7 -0
- package/dist/src/features/web/client/stores/task-store.js +26 -0
- package/dist/src/features/web/client/stores/task-store.js.map +7 -0
- package/dist/src/features/web/server/index.js +194 -0
- package/dist/src/features/web/server/index.js.map +7 -0
- package/dist/src/hooks/auto-background.js +151 -0
- package/dist/src/hooks/auto-background.js.map +7 -0
- package/dist/src/hooks/claude-code-whatsapp-hook.js +197 -0
- package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
- package/dist/src/hooks/config.js +150 -0
- package/dist/src/hooks/config.js.map +7 -0
- package/dist/src/hooks/daemon.js +364 -0
- package/dist/src/hooks/daemon.js.map +7 -0
- package/dist/src/hooks/events.js +58 -0
- package/dist/src/hooks/events.js.map +7 -0
- package/dist/src/hooks/index.js +12 -0
- package/dist/src/hooks/index.js.map +7 -0
- package/dist/src/hooks/linear-task-picker.js +186 -0
- package/dist/src/hooks/linear-task-picker.js.map +7 -0
- package/dist/src/hooks/schemas.js +197 -0
- package/dist/src/hooks/schemas.js.map +7 -0
- package/dist/src/hooks/secure-fs.js +49 -0
- package/dist/src/hooks/secure-fs.js.map +7 -0
- package/dist/src/hooks/security-logger.js +155 -0
- package/dist/src/hooks/security-logger.js.map +7 -0
- package/dist/src/hooks/session-summary.js +222 -0
- package/dist/src/hooks/session-summary.js.map +7 -0
- package/dist/src/hooks/sms-action-runner.js +371 -0
- package/dist/src/hooks/sms-action-runner.js.map +7 -0
- package/dist/src/hooks/sms-notify.js +506 -0
- package/dist/src/hooks/sms-notify.js.map +7 -0
- package/dist/src/hooks/sms-watcher.js +93 -0
- package/dist/src/hooks/sms-watcher.js.map +7 -0
- package/dist/src/hooks/sms-webhook.js +555 -0
- package/dist/src/hooks/sms-webhook.js.map +7 -0
- package/dist/src/hooks/whatsapp-commands.js +479 -0
- package/dist/src/hooks/whatsapp-commands.js.map +7 -0
- package/dist/src/hooks/whatsapp-scheduler.js +317 -0
- package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
- package/dist/src/hooks/whatsapp-sync.js +409 -0
- package/dist/src/hooks/whatsapp-sync.js.map +7 -0
- package/dist/src/index.js +25 -0
- package/dist/src/index.js.map +7 -0
- package/dist/src/integrations/anthropic/client.js +263 -0
- package/dist/src/integrations/anthropic/client.js.map +7 -0
- package/dist/src/integrations/claude-code/agent-bridge.js +768 -0
- package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +459 -0
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/lifecycle-hooks.js +254 -0
- package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/post-task-hooks.js +545 -0
- package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client-stub.js +20 -0
- package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client.js +511 -0
- package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
- package/dist/src/integrations/claude-code/task-coordinator.js +360 -0
- package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
- package/dist/src/integrations/linear/auth.js +337 -0
- package/dist/src/integrations/linear/auth.js.map +7 -0
- package/dist/src/integrations/linear/auto-sync.js +258 -0
- package/dist/src/integrations/linear/auto-sync.js.map +7 -0
- package/dist/src/integrations/linear/client.js +634 -0
- package/dist/src/integrations/linear/client.js.map +7 -0
- package/dist/src/integrations/linear/config.js +130 -0
- package/dist/src/integrations/linear/config.js.map +7 -0
- package/dist/src/integrations/linear/migration.js +361 -0
- package/dist/src/integrations/linear/migration.js.map +7 -0
- package/dist/src/integrations/linear/oauth-server.js +454 -0
- package/dist/src/integrations/linear/oauth-server.js.map +7 -0
- package/dist/src/integrations/linear/rest-client.js +213 -0
- package/dist/src/integrations/linear/rest-client.js.map +7 -0
- package/dist/src/integrations/linear/sync-manager.js +236 -0
- package/dist/src/integrations/linear/sync-manager.js.map +7 -0
- package/dist/src/integrations/linear/sync-service.js +231 -0
- package/dist/src/integrations/linear/sync-service.js.map +7 -0
- package/dist/src/integrations/linear/sync.js +782 -0
- package/dist/src/integrations/linear/sync.js.map +7 -0
- package/dist/src/integrations/linear/types.js +5 -0
- package/dist/src/integrations/linear/types.js.map +7 -0
- package/dist/src/integrations/linear/unified-sync.js +589 -0
- package/dist/src/integrations/linear/unified-sync.js.map +7 -0
- package/dist/src/integrations/linear/webhook-handler.js +219 -0
- package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
- package/dist/src/integrations/linear/webhook-server.js +218 -0
- package/dist/src/integrations/linear/webhook-server.js.map +7 -0
- package/dist/src/integrations/linear/webhook.js +291 -0
- package/dist/src/integrations/linear/webhook.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +266 -0
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js +257 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js +497 -0
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/index.js +166 -0
- package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js +247 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/skill-handlers.js +529 -0
- package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js +239 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js +308 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/index.js +23 -0
- package/dist/src/integrations/mcp/index.js.map +7 -0
- package/dist/src/integrations/mcp/middleware/tool-scoring.js +356 -0
- package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
- package/dist/src/integrations/mcp/refactored-server.js +374 -0
- package/dist/src/integrations/mcp/refactored-server.js.map +7 -0
- package/dist/src/integrations/mcp/remote-server.js +682 -0
- package/dist/src/integrations/mcp/remote-server.js.map +7 -0
- package/dist/src/integrations/mcp/schemas.js +147 -0
- package/dist/src/integrations/mcp/schemas.js.map +7 -0
- package/dist/src/integrations/mcp/server.js +1975 -0
- package/dist/src/integrations/mcp/server.js.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions-code.js +125 -0
- package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions.js +702 -0
- package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +860 -0
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
- package/dist/src/integrations/ralph/context/context-budget-manager.js +301 -0
- package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +360 -0
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +410 -0
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
- package/dist/src/integrations/ralph/index.js +18 -0
- package/dist/src/integrations/ralph/index.js.map +7 -0
- package/dist/src/integrations/ralph/learning/pattern-learner.js +401 -0
- package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +448 -0
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +294 -0
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js +108 -0
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +463 -0
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +400 -0
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +473 -0
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +388 -0
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/performance/performance-optimizer.js +358 -0
- package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
- package/dist/src/integrations/ralph/recovery/crash-recovery.js +462 -0
- package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
- package/dist/src/integrations/ralph/state/state-reconciler.js +404 -0
- package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +428 -0
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +996 -0
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
- package/dist/src/integrations/ralph/types.js +5 -0
- package/dist/src/integrations/ralph/types.js.map +7 -0
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js +585 -0
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
- package/dist/src/mcp/stackmemory-mcp-server.js +554 -0
- package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
- package/dist/src/middleware/exponential-rate-limiter.js +289 -0
- package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
- package/dist/src/models/user.model.js +358 -0
- package/dist/src/models/user.model.js.map +7 -0
- package/dist/src/servers/production/auth-middleware.js +528 -0
- package/dist/src/servers/production/auth-middleware.js.map +7 -0
- package/dist/src/services/config-service.js +65 -0
- package/dist/src/services/config-service.js.map +7 -0
- package/dist/src/services/context-service.js +194 -0
- package/dist/src/services/context-service.js.map +7 -0
- package/dist/src/skills/api-discovery.js +354 -0
- package/dist/src/skills/api-discovery.js.map +7 -0
- package/dist/src/skills/api-skill.js +475 -0
- package/dist/src/skills/api-skill.js.map +7 -0
- package/dist/src/skills/claude-skills.js +1061 -0
- package/dist/src/skills/claude-skills.js.map +7 -0
- package/dist/src/skills/dashboard-launcher.js +216 -0
- package/dist/src/skills/dashboard-launcher.js.map +7 -0
- package/dist/src/skills/recursive-agent-orchestrator.js +575 -0
- package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
- package/dist/src/skills/repo-ingestion-skill.js +609 -0
- package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
- package/dist/src/skills/unified-rlm-orchestrator.js +404 -0
- package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
- package/dist/src/types/task.js +5 -0
- package/dist/src/types/task.js.map +7 -0
- package/dist/src/utils/env.js +50 -0
- package/dist/src/utils/env.js.map +7 -0
- package/dist/src/utils/formatting.js +62 -0
- package/dist/src/utils/formatting.js.map +7 -0
- package/dist/src/utils/process-cleanup.js +136 -0
- package/dist/src/utils/process-cleanup.js.map +7 -0
- package/package.json +3 -3
- package/scripts/initialize.ts +16 -7
- package/scripts/install.sh +14 -62
- package/scripts/status.ts +111 -46
|
@@ -0,0 +1,738 @@
|
|
|
1
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
+
import { dirname as __pathDirname } from 'path';
|
|
3
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __pathDirname(__filename);
|
|
5
|
+
import Database from "better-sqlite3";
|
|
6
|
+
import {
|
|
7
|
+
FeatureAwareDatabaseAdapter
|
|
8
|
+
} from "./database-adapter.js";
|
|
9
|
+
import { logger } from "../monitoring/logger.js";
|
|
10
|
+
import { DatabaseError, ErrorCode, ValidationError } from "../errors/index.js";
|
|
11
|
+
import * as fs from "fs/promises";
|
|
12
|
+
import * as path from "path";
|
|
13
|
+
class SQLiteAdapter extends FeatureAwareDatabaseAdapter {
|
|
14
|
+
db = null;
|
|
15
|
+
dbPath;
|
|
16
|
+
inTransactionFlag = false;
|
|
17
|
+
constructor(projectId, config) {
|
|
18
|
+
super(projectId, config);
|
|
19
|
+
this.dbPath = config.dbPath;
|
|
20
|
+
}
|
|
21
|
+
getFeatures() {
|
|
22
|
+
return {
|
|
23
|
+
supportsFullTextSearch: false,
|
|
24
|
+
// Could enable with FTS5
|
|
25
|
+
supportsVectorSearch: false,
|
|
26
|
+
supportsPartitioning: false,
|
|
27
|
+
supportsAnalytics: false,
|
|
28
|
+
supportsCompression: false,
|
|
29
|
+
supportsMaterializedViews: false,
|
|
30
|
+
supportsParallelQueries: false
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
async connect() {
|
|
34
|
+
if (this.db) return;
|
|
35
|
+
const config = this.config;
|
|
36
|
+
const dir = path.dirname(this.dbPath);
|
|
37
|
+
await fs.mkdir(dir, { recursive: true });
|
|
38
|
+
this.db = new Database(this.dbPath);
|
|
39
|
+
this.db.pragma("foreign_keys = ON");
|
|
40
|
+
if (config.walMode !== false) {
|
|
41
|
+
this.db.pragma("journal_mode = WAL");
|
|
42
|
+
}
|
|
43
|
+
if (config.busyTimeout) {
|
|
44
|
+
this.db.pragma(`busy_timeout = ${config.busyTimeout}`);
|
|
45
|
+
}
|
|
46
|
+
if (config.cacheSize) {
|
|
47
|
+
this.db.pragma(`cache_size = ${config.cacheSize}`);
|
|
48
|
+
}
|
|
49
|
+
if (config.synchronous) {
|
|
50
|
+
this.db.pragma(`synchronous = ${config.synchronous}`);
|
|
51
|
+
}
|
|
52
|
+
logger.info("SQLite database connected", { dbPath: this.dbPath });
|
|
53
|
+
}
|
|
54
|
+
async disconnect() {
|
|
55
|
+
if (!this.db) return;
|
|
56
|
+
this.db.close();
|
|
57
|
+
this.db = null;
|
|
58
|
+
logger.info("SQLite database disconnected");
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get raw database handle for testing purposes
|
|
62
|
+
* @internal
|
|
63
|
+
*/
|
|
64
|
+
getRawDatabase() {
|
|
65
|
+
return this.db;
|
|
66
|
+
}
|
|
67
|
+
isConnected() {
|
|
68
|
+
return this.db !== null && this.db.open;
|
|
69
|
+
}
|
|
70
|
+
async ping() {
|
|
71
|
+
if (!this.db) return false;
|
|
72
|
+
try {
|
|
73
|
+
this.db.prepare("SELECT 1").get();
|
|
74
|
+
return true;
|
|
75
|
+
} catch (error) {
|
|
76
|
+
logger.debug("Database ping failed", {
|
|
77
|
+
error: error instanceof Error ? error.message : String(error)
|
|
78
|
+
});
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async initializeSchema() {
|
|
83
|
+
if (!this.db)
|
|
84
|
+
throw new DatabaseError(
|
|
85
|
+
"Database not connected",
|
|
86
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
87
|
+
);
|
|
88
|
+
this.db.exec(`
|
|
89
|
+
CREATE TABLE IF NOT EXISTS frames (
|
|
90
|
+
frame_id TEXT PRIMARY KEY,
|
|
91
|
+
run_id TEXT NOT NULL,
|
|
92
|
+
project_id TEXT NOT NULL,
|
|
93
|
+
parent_frame_id TEXT REFERENCES frames(frame_id),
|
|
94
|
+
depth INTEGER NOT NULL DEFAULT 0,
|
|
95
|
+
type TEXT NOT NULL,
|
|
96
|
+
name TEXT NOT NULL,
|
|
97
|
+
state TEXT DEFAULT 'active',
|
|
98
|
+
inputs TEXT DEFAULT '{}',
|
|
99
|
+
outputs TEXT DEFAULT '{}',
|
|
100
|
+
digest_text TEXT,
|
|
101
|
+
digest_json TEXT DEFAULT '{}',
|
|
102
|
+
created_at INTEGER DEFAULT (unixepoch()),
|
|
103
|
+
closed_at INTEGER
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
107
|
+
event_id TEXT PRIMARY KEY,
|
|
108
|
+
run_id TEXT NOT NULL,
|
|
109
|
+
frame_id TEXT NOT NULL,
|
|
110
|
+
seq INTEGER NOT NULL,
|
|
111
|
+
event_type TEXT NOT NULL,
|
|
112
|
+
payload TEXT NOT NULL,
|
|
113
|
+
ts INTEGER DEFAULT (unixepoch()),
|
|
114
|
+
FOREIGN KEY(frame_id) REFERENCES frames(frame_id) ON DELETE CASCADE
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
CREATE TABLE IF NOT EXISTS anchors (
|
|
118
|
+
anchor_id TEXT PRIMARY KEY,
|
|
119
|
+
frame_id TEXT NOT NULL,
|
|
120
|
+
project_id TEXT NOT NULL,
|
|
121
|
+
type TEXT NOT NULL,
|
|
122
|
+
text TEXT NOT NULL,
|
|
123
|
+
priority INTEGER DEFAULT 0,
|
|
124
|
+
created_at INTEGER DEFAULT (unixepoch()),
|
|
125
|
+
metadata TEXT DEFAULT '{}',
|
|
126
|
+
FOREIGN KEY(frame_id) REFERENCES frames(frame_id) ON DELETE CASCADE
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
CREATE TABLE IF NOT EXISTS schema_version (
|
|
130
|
+
version INTEGER PRIMARY KEY,
|
|
131
|
+
applied_at INTEGER DEFAULT (unixepoch())
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
-- Indexes for performance
|
|
135
|
+
CREATE INDEX IF NOT EXISTS idx_frames_run ON frames(run_id);
|
|
136
|
+
CREATE INDEX IF NOT EXISTS idx_frames_project ON frames(project_id);
|
|
137
|
+
CREATE INDEX IF NOT EXISTS idx_frames_parent ON frames(parent_frame_id);
|
|
138
|
+
CREATE INDEX IF NOT EXISTS idx_frames_state ON frames(state);
|
|
139
|
+
CREATE INDEX IF NOT EXISTS idx_frames_created ON frames(created_at DESC);
|
|
140
|
+
CREATE INDEX IF NOT EXISTS idx_events_frame ON events(frame_id);
|
|
141
|
+
CREATE INDEX IF NOT EXISTS idx_events_seq ON events(frame_id, seq);
|
|
142
|
+
CREATE INDEX IF NOT EXISTS idx_anchors_frame ON anchors(frame_id);
|
|
143
|
+
|
|
144
|
+
-- Set initial schema version if not exists
|
|
145
|
+
INSERT OR IGNORE INTO schema_version (version) VALUES (1);
|
|
146
|
+
`);
|
|
147
|
+
try {
|
|
148
|
+
this.ensureCascadeConstraints();
|
|
149
|
+
} catch (e) {
|
|
150
|
+
logger.warn("Failed to ensure cascade constraints", e);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Ensure ON DELETE CASCADE exists for events/anchors referencing frames
|
|
155
|
+
* Migrates existing tables in-place if needed without data loss.
|
|
156
|
+
*/
|
|
157
|
+
ensureCascadeConstraints() {
|
|
158
|
+
if (!this.db) return;
|
|
159
|
+
const needsCascade = (table) => {
|
|
160
|
+
const rows = this.db.prepare(
|
|
161
|
+
`PRAGMA foreign_key_list(${table})`
|
|
162
|
+
).all();
|
|
163
|
+
return rows.some(
|
|
164
|
+
(r) => r.table === "frames" && String(r.on_delete).toUpperCase() !== "CASCADE"
|
|
165
|
+
);
|
|
166
|
+
};
|
|
167
|
+
const migrateTable = (table) => {
|
|
168
|
+
const createSql = table === "events" ? `CREATE TABLE events_new (
|
|
169
|
+
event_id TEXT PRIMARY KEY,
|
|
170
|
+
run_id TEXT NOT NULL,
|
|
171
|
+
frame_id TEXT NOT NULL,
|
|
172
|
+
seq INTEGER NOT NULL,
|
|
173
|
+
event_type TEXT NOT NULL,
|
|
174
|
+
payload TEXT NOT NULL,
|
|
175
|
+
ts INTEGER DEFAULT (unixepoch()),
|
|
176
|
+
FOREIGN KEY(frame_id) REFERENCES frames(frame_id) ON DELETE CASCADE
|
|
177
|
+
);` : `CREATE TABLE anchors_new (
|
|
178
|
+
anchor_id TEXT PRIMARY KEY,
|
|
179
|
+
frame_id TEXT NOT NULL,
|
|
180
|
+
project_id TEXT NOT NULL,
|
|
181
|
+
type TEXT NOT NULL,
|
|
182
|
+
text TEXT NOT NULL,
|
|
183
|
+
priority INTEGER DEFAULT 0,
|
|
184
|
+
created_at INTEGER DEFAULT (unixepoch()),
|
|
185
|
+
metadata TEXT DEFAULT '{}',
|
|
186
|
+
FOREIGN KEY(frame_id) REFERENCES frames(frame_id) ON DELETE CASCADE
|
|
187
|
+
);`;
|
|
188
|
+
const cols = table === "events" ? "event_id, run_id, frame_id, seq, event_type, payload, ts" : "anchor_id, frame_id, project_id, type, text, priority, created_at, metadata";
|
|
189
|
+
const idxSql = table === "events" ? [
|
|
190
|
+
"CREATE INDEX IF NOT EXISTS idx_events_frame ON events(frame_id);",
|
|
191
|
+
"CREATE INDEX IF NOT EXISTS idx_events_seq ON events(frame_id, seq);"
|
|
192
|
+
] : [
|
|
193
|
+
"CREATE INDEX IF NOT EXISTS idx_anchors_frame ON anchors(frame_id);"
|
|
194
|
+
];
|
|
195
|
+
this.db.exec("PRAGMA foreign_keys = OFF;");
|
|
196
|
+
this.db.exec("BEGIN;");
|
|
197
|
+
this.db.exec(createSql);
|
|
198
|
+
this.db.prepare(
|
|
199
|
+
`INSERT INTO ${table === "events" ? "events_new" : "anchors_new"} (${cols}) SELECT ${cols} FROM ${table}`
|
|
200
|
+
).run();
|
|
201
|
+
this.db.exec(`DROP TABLE ${table};`);
|
|
202
|
+
this.db.exec(`ALTER TABLE ${table}_new RENAME TO ${table};`);
|
|
203
|
+
for (const stmt of idxSql) this.db.exec(stmt);
|
|
204
|
+
this.db.exec("COMMIT;");
|
|
205
|
+
this.db.exec("PRAGMA foreign_keys = ON;");
|
|
206
|
+
logger.info(`Migrated ${table} to include ON DELETE CASCADE`);
|
|
207
|
+
};
|
|
208
|
+
if (needsCascade("events")) migrateTable("events");
|
|
209
|
+
if (needsCascade("anchors")) migrateTable("anchors");
|
|
210
|
+
}
|
|
211
|
+
async migrateSchema(targetVersion) {
|
|
212
|
+
if (!this.db)
|
|
213
|
+
throw new DatabaseError(
|
|
214
|
+
"Database not connected",
|
|
215
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
216
|
+
);
|
|
217
|
+
const currentVersion = await this.getSchemaVersion();
|
|
218
|
+
if (currentVersion >= targetVersion) {
|
|
219
|
+
logger.info("Schema already at target version", {
|
|
220
|
+
currentVersion,
|
|
221
|
+
targetVersion
|
|
222
|
+
});
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
for (let v = currentVersion + 1; v <= targetVersion; v++) {
|
|
226
|
+
logger.info(`Applying migration to version ${v}`);
|
|
227
|
+
this.db.prepare("UPDATE schema_version SET version = ?").run(v);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
async getSchemaVersion() {
|
|
231
|
+
if (!this.db)
|
|
232
|
+
throw new DatabaseError(
|
|
233
|
+
"Database not connected",
|
|
234
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
235
|
+
);
|
|
236
|
+
try {
|
|
237
|
+
const result = this.db.prepare("SELECT MAX(version) as version FROM schema_version").get();
|
|
238
|
+
return result?.version || 0;
|
|
239
|
+
} catch (error) {
|
|
240
|
+
logger.debug("Schema version table not found, returning 0", {
|
|
241
|
+
error: error instanceof Error ? error.message : String(error)
|
|
242
|
+
});
|
|
243
|
+
return 0;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// Frame operations
|
|
247
|
+
async createFrame(frame) {
|
|
248
|
+
if (!this.db)
|
|
249
|
+
throw new DatabaseError(
|
|
250
|
+
"Database not connected",
|
|
251
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
252
|
+
);
|
|
253
|
+
const frameId = frame.frame_id || this.generateId();
|
|
254
|
+
this.db.prepare(
|
|
255
|
+
`
|
|
256
|
+
INSERT INTO frames (
|
|
257
|
+
frame_id, run_id, project_id, parent_frame_id, depth,
|
|
258
|
+
type, name, state, inputs, outputs, digest_text, digest_json
|
|
259
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
260
|
+
`
|
|
261
|
+
).run(
|
|
262
|
+
frameId,
|
|
263
|
+
frame.run_id,
|
|
264
|
+
frame.project_id || this.projectId,
|
|
265
|
+
frame.parent_frame_id || null,
|
|
266
|
+
frame.depth || 0,
|
|
267
|
+
frame.type,
|
|
268
|
+
frame.name,
|
|
269
|
+
frame.state || "active",
|
|
270
|
+
JSON.stringify(frame.inputs || {}),
|
|
271
|
+
JSON.stringify(frame.outputs || {}),
|
|
272
|
+
frame.digest_text || null,
|
|
273
|
+
JSON.stringify(frame.digest_json || {})
|
|
274
|
+
);
|
|
275
|
+
return frameId;
|
|
276
|
+
}
|
|
277
|
+
async getFrame(frameId) {
|
|
278
|
+
if (!this.db)
|
|
279
|
+
throw new DatabaseError(
|
|
280
|
+
"Database not connected",
|
|
281
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
282
|
+
);
|
|
283
|
+
const row = this.db.prepare("SELECT * FROM frames WHERE frame_id = ?").get(frameId);
|
|
284
|
+
if (!row) return null;
|
|
285
|
+
return {
|
|
286
|
+
...row,
|
|
287
|
+
inputs: JSON.parse(row.inputs || "{}"),
|
|
288
|
+
outputs: JSON.parse(row.outputs || "{}"),
|
|
289
|
+
digest_json: JSON.parse(row.digest_json || "{}")
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
async updateFrame(frameId, updates) {
|
|
293
|
+
if (!this.db)
|
|
294
|
+
throw new DatabaseError(
|
|
295
|
+
"Database not connected",
|
|
296
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
297
|
+
);
|
|
298
|
+
const fields = [];
|
|
299
|
+
const values = [];
|
|
300
|
+
if (updates.state !== void 0) {
|
|
301
|
+
fields.push("state = ?");
|
|
302
|
+
values.push(updates.state);
|
|
303
|
+
}
|
|
304
|
+
if (updates.outputs !== void 0) {
|
|
305
|
+
fields.push("outputs = ?");
|
|
306
|
+
values.push(JSON.stringify(updates.outputs));
|
|
307
|
+
}
|
|
308
|
+
if (updates.digest_text !== void 0) {
|
|
309
|
+
fields.push("digest_text = ?");
|
|
310
|
+
values.push(updates.digest_text);
|
|
311
|
+
}
|
|
312
|
+
if (updates.digest_json !== void 0) {
|
|
313
|
+
fields.push("digest_json = ?");
|
|
314
|
+
values.push(JSON.stringify(updates.digest_json));
|
|
315
|
+
}
|
|
316
|
+
if (updates.closed_at !== void 0) {
|
|
317
|
+
fields.push("closed_at = ?");
|
|
318
|
+
values.push(updates.closed_at);
|
|
319
|
+
}
|
|
320
|
+
if (fields.length === 0) return;
|
|
321
|
+
values.push(frameId);
|
|
322
|
+
this.db.prepare(
|
|
323
|
+
`
|
|
324
|
+
UPDATE frames SET ${fields.join(", ")} WHERE frame_id = ?
|
|
325
|
+
`
|
|
326
|
+
).run(...values);
|
|
327
|
+
}
|
|
328
|
+
async deleteFrame(frameId) {
|
|
329
|
+
if (!this.db)
|
|
330
|
+
throw new DatabaseError(
|
|
331
|
+
"Database not connected",
|
|
332
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
333
|
+
);
|
|
334
|
+
await this.deleteFrameAnchors(frameId);
|
|
335
|
+
await this.deleteFrameEvents(frameId);
|
|
336
|
+
this.db.prepare("DELETE FROM frames WHERE frame_id = ?").run(frameId);
|
|
337
|
+
}
|
|
338
|
+
async getActiveFrames(runId) {
|
|
339
|
+
if (!this.db)
|
|
340
|
+
throw new DatabaseError(
|
|
341
|
+
"Database not connected",
|
|
342
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
343
|
+
);
|
|
344
|
+
let query = "SELECT * FROM frames WHERE state = 'active'";
|
|
345
|
+
const params = [];
|
|
346
|
+
if (runId) {
|
|
347
|
+
query += " AND run_id = ?";
|
|
348
|
+
params.push(runId);
|
|
349
|
+
}
|
|
350
|
+
query += " ORDER BY depth ASC, created_at ASC";
|
|
351
|
+
const rows = this.db.prepare(query).all(...params);
|
|
352
|
+
return rows.map((row) => ({
|
|
353
|
+
...row,
|
|
354
|
+
inputs: JSON.parse(row.inputs || "{}"),
|
|
355
|
+
outputs: JSON.parse(row.outputs || "{}"),
|
|
356
|
+
digest_json: JSON.parse(row.digest_json || "{}")
|
|
357
|
+
}));
|
|
358
|
+
}
|
|
359
|
+
async closeFrame(frameId, outputs) {
|
|
360
|
+
await this.updateFrame(frameId, {
|
|
361
|
+
state: "closed",
|
|
362
|
+
outputs,
|
|
363
|
+
closed_at: Date.now()
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
// Event operations
|
|
367
|
+
async createEvent(event) {
|
|
368
|
+
if (!this.db)
|
|
369
|
+
throw new DatabaseError(
|
|
370
|
+
"Database not connected",
|
|
371
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
372
|
+
);
|
|
373
|
+
const eventId = event.event_id || this.generateId();
|
|
374
|
+
this.db.prepare(
|
|
375
|
+
`
|
|
376
|
+
INSERT INTO events (event_id, run_id, frame_id, seq, event_type, payload, ts)
|
|
377
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
378
|
+
`
|
|
379
|
+
).run(
|
|
380
|
+
eventId,
|
|
381
|
+
event.run_id,
|
|
382
|
+
event.frame_id,
|
|
383
|
+
event.seq || 0,
|
|
384
|
+
event.event_type,
|
|
385
|
+
JSON.stringify(event.payload || {}),
|
|
386
|
+
event.ts || Date.now()
|
|
387
|
+
);
|
|
388
|
+
return eventId;
|
|
389
|
+
}
|
|
390
|
+
async getFrameEvents(frameId, options) {
|
|
391
|
+
if (!this.db)
|
|
392
|
+
throw new DatabaseError(
|
|
393
|
+
"Database not connected",
|
|
394
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
395
|
+
);
|
|
396
|
+
let query = "SELECT * FROM events WHERE frame_id = ?";
|
|
397
|
+
query += this.buildOrderByClause(
|
|
398
|
+
options?.orderBy || "seq",
|
|
399
|
+
options?.orderDirection
|
|
400
|
+
);
|
|
401
|
+
query += this.buildLimitClause(options?.limit, options?.offset);
|
|
402
|
+
const rows = this.db.prepare(query).all(frameId);
|
|
403
|
+
return rows.map((row) => ({
|
|
404
|
+
...row,
|
|
405
|
+
payload: JSON.parse(row.payload || "{}")
|
|
406
|
+
}));
|
|
407
|
+
}
|
|
408
|
+
async deleteFrameEvents(frameId) {
|
|
409
|
+
if (!this.db)
|
|
410
|
+
throw new DatabaseError(
|
|
411
|
+
"Database not connected",
|
|
412
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
413
|
+
);
|
|
414
|
+
this.db.prepare("DELETE FROM events WHERE frame_id = ?").run(frameId);
|
|
415
|
+
}
|
|
416
|
+
// Anchor operations
|
|
417
|
+
async createAnchor(anchor) {
|
|
418
|
+
if (!this.db)
|
|
419
|
+
throw new DatabaseError(
|
|
420
|
+
"Database not connected",
|
|
421
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
422
|
+
);
|
|
423
|
+
const anchorId = anchor.anchor_id || this.generateId();
|
|
424
|
+
this.db.prepare(
|
|
425
|
+
`
|
|
426
|
+
INSERT INTO anchors (anchor_id, frame_id, project_id, type, text, priority, metadata)
|
|
427
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
428
|
+
`
|
|
429
|
+
).run(
|
|
430
|
+
anchorId,
|
|
431
|
+
anchor.frame_id,
|
|
432
|
+
anchor.project_id || this.projectId,
|
|
433
|
+
anchor.type,
|
|
434
|
+
anchor.text,
|
|
435
|
+
anchor.priority || 0,
|
|
436
|
+
JSON.stringify(anchor.metadata || {})
|
|
437
|
+
);
|
|
438
|
+
return anchorId;
|
|
439
|
+
}
|
|
440
|
+
async getFrameAnchors(frameId) {
|
|
441
|
+
if (!this.db)
|
|
442
|
+
throw new DatabaseError(
|
|
443
|
+
"Database not connected",
|
|
444
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
445
|
+
);
|
|
446
|
+
const rows = this.db.prepare(
|
|
447
|
+
`
|
|
448
|
+
SELECT * FROM anchors WHERE frame_id = ?
|
|
449
|
+
ORDER BY priority DESC, created_at ASC
|
|
450
|
+
`
|
|
451
|
+
).all(frameId);
|
|
452
|
+
return rows.map((row) => ({
|
|
453
|
+
...row,
|
|
454
|
+
metadata: JSON.parse(row.metadata || "{}")
|
|
455
|
+
}));
|
|
456
|
+
}
|
|
457
|
+
async deleteFrameAnchors(frameId) {
|
|
458
|
+
if (!this.db)
|
|
459
|
+
throw new DatabaseError(
|
|
460
|
+
"Database not connected",
|
|
461
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
462
|
+
);
|
|
463
|
+
this.db.prepare("DELETE FROM anchors WHERE frame_id = ?").run(frameId);
|
|
464
|
+
}
|
|
465
|
+
// Limited search (basic LIKE queries)
|
|
466
|
+
async search(options) {
|
|
467
|
+
if (!this.db)
|
|
468
|
+
throw new DatabaseError(
|
|
469
|
+
"Database not connected",
|
|
470
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
471
|
+
);
|
|
472
|
+
const sql = `
|
|
473
|
+
SELECT *,
|
|
474
|
+
CASE
|
|
475
|
+
WHEN name LIKE ? THEN 1.0
|
|
476
|
+
WHEN digest_text LIKE ? THEN 0.8
|
|
477
|
+
WHEN inputs LIKE ? THEN 0.6
|
|
478
|
+
ELSE 0.5
|
|
479
|
+
END as score
|
|
480
|
+
FROM frames
|
|
481
|
+
WHERE name LIKE ? OR digest_text LIKE ? OR inputs LIKE ?
|
|
482
|
+
ORDER BY score DESC
|
|
483
|
+
`;
|
|
484
|
+
const params = Array(6).fill(`%${options.query}%`);
|
|
485
|
+
let rows = this.db.prepare(sql).all(...params);
|
|
486
|
+
if (options.scoreThreshold) {
|
|
487
|
+
rows = rows.filter((row) => row.score >= options.scoreThreshold);
|
|
488
|
+
}
|
|
489
|
+
if (options.limit || options.offset) {
|
|
490
|
+
const start = options.offset || 0;
|
|
491
|
+
const end = options.limit ? start + options.limit : rows.length;
|
|
492
|
+
rows = rows.slice(start, end);
|
|
493
|
+
}
|
|
494
|
+
return rows.map((row) => ({
|
|
495
|
+
...row,
|
|
496
|
+
inputs: JSON.parse(row.inputs || "{}"),
|
|
497
|
+
outputs: JSON.parse(row.outputs || "{}"),
|
|
498
|
+
digest_json: JSON.parse(row.digest_json || "{}")
|
|
499
|
+
}));
|
|
500
|
+
}
|
|
501
|
+
async searchByVector(_embedding, _options) {
|
|
502
|
+
logger.warn("Vector search not supported in SQLite adapter");
|
|
503
|
+
return [];
|
|
504
|
+
}
|
|
505
|
+
async searchHybrid(textQuery, _embedding, weights) {
|
|
506
|
+
return this.search({ query: textQuery, ...weights });
|
|
507
|
+
}
|
|
508
|
+
// Basic aggregation
|
|
509
|
+
async aggregate(table, options) {
|
|
510
|
+
if (!this.db)
|
|
511
|
+
throw new DatabaseError(
|
|
512
|
+
"Database not connected",
|
|
513
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
514
|
+
);
|
|
515
|
+
const metrics = options.metrics.map(
|
|
516
|
+
(m) => `${m.operation}(${m.field}) AS ${m.alias || `${m.operation}_${m.field}`}`
|
|
517
|
+
).join(", ");
|
|
518
|
+
let sql = `SELECT ${options.groupBy.join(", ")}, ${metrics} FROM ${table}`;
|
|
519
|
+
sql += ` GROUP BY ${options.groupBy.join(", ")}`;
|
|
520
|
+
if (options.having) {
|
|
521
|
+
const havingClauses = Object.entries(options.having).map(
|
|
522
|
+
([key, value]) => `${key} ${typeof value === "object" ? value.op : "="} ?`
|
|
523
|
+
);
|
|
524
|
+
sql += ` HAVING ${havingClauses.join(" AND ")}`;
|
|
525
|
+
}
|
|
526
|
+
return this.db.prepare(sql).all(...Object.values(options.having || {}));
|
|
527
|
+
}
|
|
528
|
+
// Pattern detection (basic)
|
|
529
|
+
async detectPatterns(timeRange) {
|
|
530
|
+
if (!this.db)
|
|
531
|
+
throw new DatabaseError(
|
|
532
|
+
"Database not connected",
|
|
533
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
534
|
+
);
|
|
535
|
+
let sql = `
|
|
536
|
+
SELECT type as pattern, type, COUNT(*) as frequency, MAX(created_at) as last_seen
|
|
537
|
+
FROM frames
|
|
538
|
+
`;
|
|
539
|
+
const params = [];
|
|
540
|
+
if (timeRange) {
|
|
541
|
+
sql += " WHERE created_at >= ? AND created_at <= ?";
|
|
542
|
+
params.push(
|
|
543
|
+
Math.floor(timeRange.start.getTime() / 1e3),
|
|
544
|
+
Math.floor(timeRange.end.getTime() / 1e3)
|
|
545
|
+
);
|
|
546
|
+
}
|
|
547
|
+
sql += " GROUP BY type HAVING COUNT(*) > 1 ORDER BY frequency DESC";
|
|
548
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
549
|
+
return rows.map((row) => ({
|
|
550
|
+
pattern: row.pattern,
|
|
551
|
+
type: row.type,
|
|
552
|
+
frequency: row.frequency,
|
|
553
|
+
lastSeen: new Date(row.last_seen * 1e3)
|
|
554
|
+
}));
|
|
555
|
+
}
|
|
556
|
+
// Bulk operations
|
|
557
|
+
async executeBulk(operations) {
|
|
558
|
+
if (!this.db)
|
|
559
|
+
throw new DatabaseError(
|
|
560
|
+
"Database not connected",
|
|
561
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
562
|
+
);
|
|
563
|
+
await this.inTransaction(async () => {
|
|
564
|
+
for (const op of operations) {
|
|
565
|
+
switch (op.type) {
|
|
566
|
+
case "insert":
|
|
567
|
+
const insertCols = Object.keys(op.data);
|
|
568
|
+
const insertPlaceholders = insertCols.map(() => "?").join(",");
|
|
569
|
+
this.db.prepare(
|
|
570
|
+
`INSERT INTO ${op.table} (${insertCols.join(",")}) VALUES (${insertPlaceholders})`
|
|
571
|
+
).run(...Object.values(op.data));
|
|
572
|
+
break;
|
|
573
|
+
case "update":
|
|
574
|
+
const updateSets = Object.keys(op.data).map((k) => `${k} = ?`).join(",");
|
|
575
|
+
const whereClause = this.buildWhereClause(op.where || {});
|
|
576
|
+
this.db.prepare(
|
|
577
|
+
`UPDATE ${op.table} SET ${updateSets} ${whereClause}`
|
|
578
|
+
).run(...Object.values(op.data), ...Object.values(op.where || {}));
|
|
579
|
+
break;
|
|
580
|
+
case "delete":
|
|
581
|
+
const deleteWhere = this.buildWhereClause(op.where || {});
|
|
582
|
+
this.db.prepare(`DELETE FROM ${op.table} ${deleteWhere}`).run(
|
|
583
|
+
...Object.values(op.where || {})
|
|
584
|
+
);
|
|
585
|
+
break;
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
async vacuum() {
|
|
591
|
+
if (!this.db)
|
|
592
|
+
throw new DatabaseError(
|
|
593
|
+
"Database not connected",
|
|
594
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
595
|
+
);
|
|
596
|
+
this.db.pragma("vacuum");
|
|
597
|
+
logger.info("SQLite database vacuumed");
|
|
598
|
+
}
|
|
599
|
+
async analyze() {
|
|
600
|
+
if (!this.db)
|
|
601
|
+
throw new DatabaseError(
|
|
602
|
+
"Database not connected",
|
|
603
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
604
|
+
);
|
|
605
|
+
this.db.pragma("analyze");
|
|
606
|
+
logger.info("SQLite database analyzed");
|
|
607
|
+
}
|
|
608
|
+
// Statistics
|
|
609
|
+
async getStats() {
|
|
610
|
+
if (!this.db)
|
|
611
|
+
throw new DatabaseError(
|
|
612
|
+
"Database not connected",
|
|
613
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
614
|
+
);
|
|
615
|
+
const stats = {
|
|
616
|
+
totalFrames: this.db.prepare("SELECT COUNT(*) as count FROM frames").get().count,
|
|
617
|
+
activeFrames: this.db.prepare(
|
|
618
|
+
"SELECT COUNT(*) as count FROM frames WHERE state = 'active'"
|
|
619
|
+
).get().count,
|
|
620
|
+
totalEvents: this.db.prepare("SELECT COUNT(*) as count FROM events").get().count,
|
|
621
|
+
totalAnchors: this.db.prepare("SELECT COUNT(*) as count FROM anchors").get().count,
|
|
622
|
+
diskUsage: 0
|
|
623
|
+
};
|
|
624
|
+
try {
|
|
625
|
+
const fileStats = await fs.stat(this.dbPath);
|
|
626
|
+
stats.diskUsage = fileStats.size;
|
|
627
|
+
} catch (error) {
|
|
628
|
+
logger.debug("Failed to get database file size", {
|
|
629
|
+
dbPath: this.dbPath,
|
|
630
|
+
error: error instanceof Error ? error.message : String(error)
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
return stats;
|
|
634
|
+
}
|
|
635
|
+
async getQueryStats() {
|
|
636
|
+
logger.warn("Query stats not available for SQLite");
|
|
637
|
+
return [];
|
|
638
|
+
}
|
|
639
|
+
// Transaction support
|
|
640
|
+
async beginTransaction() {
|
|
641
|
+
if (!this.db)
|
|
642
|
+
throw new DatabaseError(
|
|
643
|
+
"Database not connected",
|
|
644
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
645
|
+
);
|
|
646
|
+
this.db.prepare("BEGIN").run();
|
|
647
|
+
this.inTransactionFlag = true;
|
|
648
|
+
}
|
|
649
|
+
async commitTransaction() {
|
|
650
|
+
if (!this.db)
|
|
651
|
+
throw new DatabaseError(
|
|
652
|
+
"Database not connected",
|
|
653
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
654
|
+
);
|
|
655
|
+
this.db.prepare("COMMIT").run();
|
|
656
|
+
this.inTransactionFlag = false;
|
|
657
|
+
}
|
|
658
|
+
async rollbackTransaction() {
|
|
659
|
+
if (!this.db)
|
|
660
|
+
throw new DatabaseError(
|
|
661
|
+
"Database not connected",
|
|
662
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
663
|
+
);
|
|
664
|
+
this.db.prepare("ROLLBACK").run();
|
|
665
|
+
this.inTransactionFlag = false;
|
|
666
|
+
}
|
|
667
|
+
async inTransaction(callback) {
|
|
668
|
+
await this.beginTransaction();
|
|
669
|
+
try {
|
|
670
|
+
await callback(this);
|
|
671
|
+
await this.commitTransaction();
|
|
672
|
+
} catch (error) {
|
|
673
|
+
await this.rollbackTransaction();
|
|
674
|
+
throw error;
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
// Export/Import
|
|
678
|
+
async exportData(tables, format) {
|
|
679
|
+
if (!this.db)
|
|
680
|
+
throw new DatabaseError(
|
|
681
|
+
"Database not connected",
|
|
682
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
683
|
+
);
|
|
684
|
+
if (format !== "json") {
|
|
685
|
+
throw new ValidationError(
|
|
686
|
+
`Format ${format} not supported for SQLite export`,
|
|
687
|
+
ErrorCode.VALIDATION_FAILED,
|
|
688
|
+
{ format, supportedFormats: ["json"] }
|
|
689
|
+
);
|
|
690
|
+
}
|
|
691
|
+
const data = {};
|
|
692
|
+
for (const table of tables) {
|
|
693
|
+
data[table] = this.db.prepare(`SELECT * FROM ${table}`).all();
|
|
694
|
+
}
|
|
695
|
+
return Buffer.from(JSON.stringify(data, null, 2));
|
|
696
|
+
}
|
|
697
|
+
async importData(data, format, options) {
|
|
698
|
+
if (!this.db)
|
|
699
|
+
throw new DatabaseError(
|
|
700
|
+
"Database not connected",
|
|
701
|
+
ErrorCode.DB_CONNECTION_FAILED
|
|
702
|
+
);
|
|
703
|
+
if (format !== "json") {
|
|
704
|
+
throw new ValidationError(
|
|
705
|
+
`Format ${format} not supported for SQLite import`,
|
|
706
|
+
ErrorCode.VALIDATION_FAILED,
|
|
707
|
+
{ format, supportedFormats: ["json"] }
|
|
708
|
+
);
|
|
709
|
+
}
|
|
710
|
+
const parsed = JSON.parse(data.toString());
|
|
711
|
+
await this.inTransaction(async () => {
|
|
712
|
+
for (const [table, rows] of Object.entries(parsed)) {
|
|
713
|
+
if (options?.truncate) {
|
|
714
|
+
this.db.prepare(`DELETE FROM ${table}`).run();
|
|
715
|
+
}
|
|
716
|
+
for (const row of rows) {
|
|
717
|
+
const cols = Object.keys(row);
|
|
718
|
+
const placeholders = cols.map(() => "?").join(",");
|
|
719
|
+
if (options?.upsert) {
|
|
720
|
+
const updates = cols.map((c) => `${c} = excluded.${c}`).join(",");
|
|
721
|
+
this.db.prepare(
|
|
722
|
+
`INSERT INTO ${table} (${cols.join(",")}) VALUES (${placeholders})
|
|
723
|
+
ON CONFLICT DO UPDATE SET ${updates}`
|
|
724
|
+
).run(...Object.values(row));
|
|
725
|
+
} else {
|
|
726
|
+
this.db.prepare(
|
|
727
|
+
`INSERT INTO ${table} (${cols.join(",")}) VALUES (${placeholders})`
|
|
728
|
+
).run(...Object.values(row));
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
});
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
export {
|
|
736
|
+
SQLiteAdapter
|
|
737
|
+
};
|
|
738
|
+
//# sourceMappingURL=sqlite-adapter.js.map
|