@stackmemoryai/stackmemory 0.5.57 → 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/bin/codex-smd +6 -0
- package/dist/cli/codex-sm-danger.js +21 -0
- package/dist/cli/codex-sm-danger.js.map +7 -0
- package/dist/cli/commands/handoff.js +33 -3
- package/dist/cli/commands/handoff.js.map +2 -2
- 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/core/session/enhanced-handoff.js +136 -2
- package/dist/core/session/enhanced-handoff.js.map +3 -3
- 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 +4 -3
- package/scripts/create-cleanup-issues.js +302 -0
- package/scripts/demos/browser-test.ts +39 -0
- package/scripts/demos/ralph-integration-demo.ts +244 -0
- package/scripts/demos/trace-demo.ts +214 -0
- package/scripts/demos/trace-detector.demo.ts +171 -0
- package/scripts/demos/trace-test.ts +67 -0
- package/scripts/initialize.ts +16 -7
- package/scripts/install.sh +14 -62
- package/scripts/status.ts +111 -46
- package/scripts/test-claude-config.sh +123 -0
- package/scripts/validate-claude-config.sh +155 -0
|
@@ -0,0 +1,489 @@
|
|
|
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 {
|
|
6
|
+
S3Client,
|
|
7
|
+
PutObjectCommand,
|
|
8
|
+
GetObjectCommand
|
|
9
|
+
} from "@aws-sdk/client-s3";
|
|
10
|
+
import { Storage } from "@google-cloud/storage";
|
|
11
|
+
import { logger } from "../monitoring/logger.js";
|
|
12
|
+
function getEnv(key, defaultValue) {
|
|
13
|
+
const value = process.env[key];
|
|
14
|
+
if (value === void 0) {
|
|
15
|
+
if (defaultValue !== void 0) return defaultValue;
|
|
16
|
+
throw new Error(`Environment variable ${key} is required`);
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
function getOptionalEnv(key) {
|
|
21
|
+
return process.env[key];
|
|
22
|
+
}
|
|
23
|
+
var StorageTier = /* @__PURE__ */ ((StorageTier2) => {
|
|
24
|
+
StorageTier2["HOT"] = "hot";
|
|
25
|
+
StorageTier2["NEARLINE"] = "nearline";
|
|
26
|
+
StorageTier2["COLDLINE"] = "coldline";
|
|
27
|
+
StorageTier2["ARCHIVE"] = "archive";
|
|
28
|
+
return StorageTier2;
|
|
29
|
+
})(StorageTier || {});
|
|
30
|
+
const DEFAULT_REMOTE_CONFIG = {
|
|
31
|
+
provider: "gcs",
|
|
32
|
+
// Default to GCS for better pricing
|
|
33
|
+
gcs: {
|
|
34
|
+
bucketName: "stackmemory-traces",
|
|
35
|
+
projectId: process.env["GCP_PROJECT_ID"] || "stackmemory"
|
|
36
|
+
},
|
|
37
|
+
timeseries: {
|
|
38
|
+
type: "sqlite",
|
|
39
|
+
// Use SQLite for development
|
|
40
|
+
host: "localhost",
|
|
41
|
+
port: 0,
|
|
42
|
+
database: "stackmemory_timeseries"
|
|
43
|
+
},
|
|
44
|
+
migration: {
|
|
45
|
+
batchSize: 100,
|
|
46
|
+
hotAgeHours: 168,
|
|
47
|
+
// 7 days
|
|
48
|
+
nearlineAgeHours: 720,
|
|
49
|
+
// 30 days
|
|
50
|
+
coldlineAgeHours: 2160,
|
|
51
|
+
// 90 days
|
|
52
|
+
archiveAgeHours: 8760,
|
|
53
|
+
// 365 days
|
|
54
|
+
scoreThreshold: 0.4
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
class RemoteStorageManager {
|
|
58
|
+
storageClient;
|
|
59
|
+
config;
|
|
60
|
+
localDb;
|
|
61
|
+
migrationInProgress = false;
|
|
62
|
+
constructor(localDb, config) {
|
|
63
|
+
this.localDb = localDb;
|
|
64
|
+
this.config = { ...DEFAULT_REMOTE_CONFIG, ...config };
|
|
65
|
+
this.initializeStorageClient();
|
|
66
|
+
this.initializeSchema();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Initialize storage client based on provider
|
|
70
|
+
*/
|
|
71
|
+
initializeStorageClient() {
|
|
72
|
+
switch (this.config.provider) {
|
|
73
|
+
case "gcs":
|
|
74
|
+
if (this.config.gcs) {
|
|
75
|
+
this.storageClient = new Storage({
|
|
76
|
+
projectId: this.config.gcs.projectId,
|
|
77
|
+
keyFilename: this.config.gcs.keyFilename
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
break;
|
|
81
|
+
case "s3":
|
|
82
|
+
case "railway":
|
|
83
|
+
if (this.config.s3?.accessKeyId && this.config.s3?.secretAccessKey) {
|
|
84
|
+
this.storageClient = new S3Client({
|
|
85
|
+
region: this.config.s3.region,
|
|
86
|
+
credentials: {
|
|
87
|
+
accessKeyId: this.config.s3.accessKeyId,
|
|
88
|
+
secretAccessKey: this.config.s3.secretAccessKey
|
|
89
|
+
},
|
|
90
|
+
endpoint: this.config.s3.endpoint
|
|
91
|
+
// Railway buckets endpoint
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Initialize migration tracking schema
|
|
99
|
+
*/
|
|
100
|
+
initializeSchema() {
|
|
101
|
+
this.localDb.exec(`
|
|
102
|
+
CREATE TABLE IF NOT EXISTS remote_migrations (
|
|
103
|
+
trace_id TEXT PRIMARY KEY,
|
|
104
|
+
migrated_at INTEGER NOT NULL,
|
|
105
|
+
storage_tier TEXT NOT NULL,
|
|
106
|
+
s3_key TEXT,
|
|
107
|
+
timeseries_id TEXT,
|
|
108
|
+
compression_level TEXT,
|
|
109
|
+
original_size INTEGER,
|
|
110
|
+
compressed_size INTEGER,
|
|
111
|
+
retrieval_count INTEGER DEFAULT 0,
|
|
112
|
+
last_retrieved INTEGER,
|
|
113
|
+
FOREIGN KEY (trace_id) REFERENCES traces(id) ON DELETE CASCADE
|
|
114
|
+
)
|
|
115
|
+
`);
|
|
116
|
+
this.localDb.exec(`
|
|
117
|
+
CREATE INDEX IF NOT EXISTS idx_migrations_tier ON remote_migrations(storage_tier);
|
|
118
|
+
CREATE INDEX IF NOT EXISTS idx_migrations_migrated ON remote_migrations(migrated_at);
|
|
119
|
+
`);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Identify traces for migration based on age and importance
|
|
123
|
+
*/
|
|
124
|
+
async identifyMigrationCandidates() {
|
|
125
|
+
const now = Date.now();
|
|
126
|
+
const traces = this.localDb.prepare(
|
|
127
|
+
`
|
|
128
|
+
SELECT
|
|
129
|
+
t.id,
|
|
130
|
+
t.score,
|
|
131
|
+
t.start_time,
|
|
132
|
+
LENGTH(t.compressed_data) +
|
|
133
|
+
COALESCE((SELECT SUM(LENGTH(tc.arguments) + LENGTH(tc.result))
|
|
134
|
+
FROM tool_calls tc WHERE tc.trace_id = t.id), 0) as size,
|
|
135
|
+
rm.trace_id as already_migrated
|
|
136
|
+
FROM traces t
|
|
137
|
+
LEFT JOIN remote_migrations rm ON t.id = rm.trace_id
|
|
138
|
+
WHERE rm.trace_id IS NULL -- Not already migrated
|
|
139
|
+
ORDER BY t.start_time ASC
|
|
140
|
+
`
|
|
141
|
+
).all();
|
|
142
|
+
const candidates = [];
|
|
143
|
+
for (const trace of traces) {
|
|
144
|
+
const ageHours = (now - trace.start_time) / (1e3 * 60 * 60);
|
|
145
|
+
const candidate = this.evaluateTrace(
|
|
146
|
+
trace.id,
|
|
147
|
+
ageHours,
|
|
148
|
+
trace.score,
|
|
149
|
+
trace.size || 0
|
|
150
|
+
);
|
|
151
|
+
candidates.push(candidate);
|
|
152
|
+
}
|
|
153
|
+
return candidates;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Evaluate a trace for migration based on GCS storage classes
|
|
157
|
+
*/
|
|
158
|
+
evaluateTrace(traceId, ageHours, score, size) {
|
|
159
|
+
let tier = "hot" /* HOT */;
|
|
160
|
+
let shouldMigrate = false;
|
|
161
|
+
let compressionLevel = "none";
|
|
162
|
+
if (ageHours > this.config.migration.archiveAgeHours) {
|
|
163
|
+
tier = "archive" /* ARCHIVE */;
|
|
164
|
+
shouldMigrate = true;
|
|
165
|
+
compressionLevel = "heavy";
|
|
166
|
+
} else if (ageHours > this.config.migration.coldlineAgeHours) {
|
|
167
|
+
tier = "coldline" /* COLDLINE */;
|
|
168
|
+
shouldMigrate = true;
|
|
169
|
+
compressionLevel = "heavy";
|
|
170
|
+
} else if (ageHours > this.config.migration.nearlineAgeHours) {
|
|
171
|
+
tier = "nearline" /* NEARLINE */;
|
|
172
|
+
shouldMigrate = true;
|
|
173
|
+
compressionLevel = "medium";
|
|
174
|
+
} else if (ageHours > this.config.migration.hotAgeHours) {
|
|
175
|
+
tier = "hot" /* HOT */;
|
|
176
|
+
if (score < this.config.migration.scoreThreshold) {
|
|
177
|
+
shouldMigrate = true;
|
|
178
|
+
compressionLevel = "light";
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const localSizeLimit = 2 * 1024 * 1024 * 1024;
|
|
182
|
+
const currentLocalSize = this.getLocalStorageSize();
|
|
183
|
+
if (currentLocalSize > localSizeLimit * 0.75) {
|
|
184
|
+
shouldMigrate = true;
|
|
185
|
+
if (compressionLevel === "none") {
|
|
186
|
+
compressionLevel = "light";
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
traceId,
|
|
191
|
+
age: ageHours,
|
|
192
|
+
score,
|
|
193
|
+
size,
|
|
194
|
+
tier,
|
|
195
|
+
shouldMigrate,
|
|
196
|
+
compressionLevel
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Migrate traces to remote storage
|
|
201
|
+
*/
|
|
202
|
+
async migrateTraces(candidates, dryRun = false) {
|
|
203
|
+
if (this.migrationInProgress) {
|
|
204
|
+
return {
|
|
205
|
+
migrated: 0,
|
|
206
|
+
failed: 0,
|
|
207
|
+
totalSize: 0,
|
|
208
|
+
errors: ["Migration already in progress"]
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
this.migrationInProgress = true;
|
|
212
|
+
const results = {
|
|
213
|
+
migrated: 0,
|
|
214
|
+
failed: 0,
|
|
215
|
+
totalSize: 0,
|
|
216
|
+
errors: []
|
|
217
|
+
};
|
|
218
|
+
try {
|
|
219
|
+
const toMigrate = candidates.filter((c) => c.shouldMigrate);
|
|
220
|
+
const batches = this.createBatches(
|
|
221
|
+
toMigrate,
|
|
222
|
+
this.config.migration.batchSize
|
|
223
|
+
);
|
|
224
|
+
for (const batch of batches) {
|
|
225
|
+
if (dryRun) {
|
|
226
|
+
logger.info("Dry run - would migrate batch", {
|
|
227
|
+
count: batch.length,
|
|
228
|
+
totalSize: batch.reduce((sum, c) => sum + c.size, 0)
|
|
229
|
+
});
|
|
230
|
+
results.migrated += batch.length;
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
const batchResults = await this.migrateBatch(batch);
|
|
234
|
+
results.migrated += batchResults.success;
|
|
235
|
+
results.failed += batchResults.failed;
|
|
236
|
+
results.totalSize += batchResults.totalSize;
|
|
237
|
+
results.errors.push(...batchResults.errors);
|
|
238
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
239
|
+
}
|
|
240
|
+
} finally {
|
|
241
|
+
this.migrationInProgress = false;
|
|
242
|
+
}
|
|
243
|
+
logger.info("Migration completed", results);
|
|
244
|
+
return results;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Migrate a batch of traces
|
|
248
|
+
*/
|
|
249
|
+
async migrateBatch(batch) {
|
|
250
|
+
const results = {
|
|
251
|
+
success: 0,
|
|
252
|
+
failed: 0,
|
|
253
|
+
totalSize: 0,
|
|
254
|
+
errors: []
|
|
255
|
+
};
|
|
256
|
+
for (const candidate of batch) {
|
|
257
|
+
try {
|
|
258
|
+
const trace = this.getTraceData(candidate.traceId);
|
|
259
|
+
if (!trace) {
|
|
260
|
+
throw new Error(`Trace ${candidate.traceId} not found`);
|
|
261
|
+
}
|
|
262
|
+
const compressed = this.compressTrace(
|
|
263
|
+
trace,
|
|
264
|
+
candidate.compressionLevel
|
|
265
|
+
);
|
|
266
|
+
if (this.s3Client) {
|
|
267
|
+
const s3Key = this.generateS3Key(candidate);
|
|
268
|
+
await this.uploadToS3(s3Key, compressed);
|
|
269
|
+
this.recordMigration(candidate, s3Key, trace, compressed);
|
|
270
|
+
} else {
|
|
271
|
+
this.recordMigration(candidate, "simulated", trace, compressed);
|
|
272
|
+
}
|
|
273
|
+
if (candidate.tier === StorageTier.COLD || candidate.tier === "archive" /* ARCHIVE */) {
|
|
274
|
+
this.removeLocalTrace(candidate.traceId);
|
|
275
|
+
}
|
|
276
|
+
results.success++;
|
|
277
|
+
results.totalSize += candidate.size;
|
|
278
|
+
} catch (error) {
|
|
279
|
+
results.failed++;
|
|
280
|
+
results.errors.push(`Failed to migrate ${candidate.traceId}: ${error}`);
|
|
281
|
+
logger.error("Migration failed for trace", {
|
|
282
|
+
traceId: candidate.traceId,
|
|
283
|
+
error
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return results;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Get full trace data for migration
|
|
291
|
+
*/
|
|
292
|
+
getTraceData(traceId) {
|
|
293
|
+
const traceRow = this.localDb.prepare("SELECT * FROM traces WHERE id = ?").get(traceId);
|
|
294
|
+
if (!traceRow) return null;
|
|
295
|
+
const toolCalls = this.localDb.prepare(
|
|
296
|
+
"SELECT * FROM tool_calls WHERE trace_id = ? ORDER BY sequence_number"
|
|
297
|
+
).all(traceId);
|
|
298
|
+
return {
|
|
299
|
+
trace: traceRow,
|
|
300
|
+
toolCalls
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Compress trace based on compression level
|
|
305
|
+
*/
|
|
306
|
+
compressTrace(data, level) {
|
|
307
|
+
const jsonData = JSON.stringify(data);
|
|
308
|
+
switch (level) {
|
|
309
|
+
case "none":
|
|
310
|
+
return Buffer.from(jsonData);
|
|
311
|
+
case "light":
|
|
312
|
+
return Buffer.from(JSON.stringify(JSON.parse(jsonData)));
|
|
313
|
+
case "medium":
|
|
314
|
+
const cleaned = JSON.parse(
|
|
315
|
+
jsonData,
|
|
316
|
+
(key, value) => value === null || value === void 0 ? void 0 : value
|
|
317
|
+
);
|
|
318
|
+
return Buffer.from(JSON.stringify(cleaned));
|
|
319
|
+
case "heavy":
|
|
320
|
+
const minimal = {
|
|
321
|
+
id: data.trace.id,
|
|
322
|
+
type: data.trace.type,
|
|
323
|
+
score: data.trace.score,
|
|
324
|
+
summary: data.trace.summary,
|
|
325
|
+
timestamps: {
|
|
326
|
+
start: data.trace.start_time,
|
|
327
|
+
end: data.trace.end_time
|
|
328
|
+
},
|
|
329
|
+
toolCount: data.toolCalls.length,
|
|
330
|
+
toolTypes: [...new Set(data.toolCalls.map((t) => t.tool))]
|
|
331
|
+
};
|
|
332
|
+
return Buffer.from(JSON.stringify(minimal));
|
|
333
|
+
default:
|
|
334
|
+
return Buffer.from(jsonData);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Generate S3 key for trace
|
|
339
|
+
*/
|
|
340
|
+
generateS3Key(candidate) {
|
|
341
|
+
const date = new Date(Date.now() - candidate.age * 60 * 60 * 1e3);
|
|
342
|
+
const year = date.getFullYear();
|
|
343
|
+
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
344
|
+
const day = String(date.getDate()).padStart(2, "0");
|
|
345
|
+
return `traces/${year}/${month}/${day}/${candidate.tier}/${candidate.traceId}.json`;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Upload to S3
|
|
349
|
+
*/
|
|
350
|
+
async uploadToS3(key, data) {
|
|
351
|
+
if (!this.s3Client) {
|
|
352
|
+
throw new Error("S3 client not configured");
|
|
353
|
+
}
|
|
354
|
+
const command = new PutObjectCommand({
|
|
355
|
+
Bucket: this.config.s3.bucket,
|
|
356
|
+
Key: key,
|
|
357
|
+
Body: data,
|
|
358
|
+
ContentType: "application/json",
|
|
359
|
+
Metadata: {
|
|
360
|
+
"trace-version": "1.0",
|
|
361
|
+
compression: "true"
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
await this.s3Client.send(command);
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Record migration in local database
|
|
368
|
+
*/
|
|
369
|
+
recordMigration(candidate, s3Key, originalData, compressedData) {
|
|
370
|
+
const stmt = this.localDb.prepare(`
|
|
371
|
+
INSERT INTO remote_migrations (
|
|
372
|
+
trace_id, migrated_at, storage_tier, s3_key,
|
|
373
|
+
compression_level, original_size, compressed_size
|
|
374
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
375
|
+
`);
|
|
376
|
+
stmt.run(
|
|
377
|
+
candidate.traceId,
|
|
378
|
+
Date.now(),
|
|
379
|
+
candidate.tier,
|
|
380
|
+
s3Key,
|
|
381
|
+
candidate.compressionLevel,
|
|
382
|
+
JSON.stringify(originalData).length,
|
|
383
|
+
compressedData.length
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Remove local trace after migration
|
|
388
|
+
*/
|
|
389
|
+
removeLocalTrace(traceId) {
|
|
390
|
+
this.localDb.prepare("DELETE FROM tool_calls WHERE trace_id = ?").run(traceId);
|
|
391
|
+
this.localDb.prepare("DELETE FROM traces WHERE id = ?").run(traceId);
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Get current local storage size
|
|
395
|
+
*/
|
|
396
|
+
getLocalStorageSize() {
|
|
397
|
+
const result = this.localDb.prepare(
|
|
398
|
+
`
|
|
399
|
+
SELECT
|
|
400
|
+
SUM(LENGTH(compressed_data)) +
|
|
401
|
+
COALESCE((SELECT SUM(LENGTH(arguments) + LENGTH(result))
|
|
402
|
+
FROM tool_calls), 0) as total_size
|
|
403
|
+
FROM traces
|
|
404
|
+
`
|
|
405
|
+
).get();
|
|
406
|
+
return result?.total_size || 0;
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Create batches from candidates
|
|
410
|
+
*/
|
|
411
|
+
createBatches(items, batchSize) {
|
|
412
|
+
const batches = [];
|
|
413
|
+
for (let i = 0; i < items.length; i += batchSize) {
|
|
414
|
+
batches.push(items.slice(i, i + batchSize));
|
|
415
|
+
}
|
|
416
|
+
return batches;
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Retrieve trace from remote storage
|
|
420
|
+
*/
|
|
421
|
+
async retrieveTrace(traceId) {
|
|
422
|
+
const migration = this.localDb.prepare(
|
|
423
|
+
`
|
|
424
|
+
SELECT * FROM remote_migrations WHERE trace_id = ?
|
|
425
|
+
`
|
|
426
|
+
).get(traceId);
|
|
427
|
+
if (!migration) {
|
|
428
|
+
throw new Error(`Trace ${traceId} not found in remote storage`);
|
|
429
|
+
}
|
|
430
|
+
this.localDb.prepare(
|
|
431
|
+
`
|
|
432
|
+
UPDATE remote_migrations
|
|
433
|
+
SET retrieval_count = retrieval_count + 1, last_retrieved = ?
|
|
434
|
+
WHERE trace_id = ?
|
|
435
|
+
`
|
|
436
|
+
).run(Date.now(), traceId);
|
|
437
|
+
if (!this.s3Client) {
|
|
438
|
+
throw new Error("S3 client not configured");
|
|
439
|
+
}
|
|
440
|
+
const command = new GetObjectCommand({
|
|
441
|
+
Bucket: this.config.s3.bucket,
|
|
442
|
+
Key: migration.s3_key
|
|
443
|
+
});
|
|
444
|
+
const response = await this.s3Client.send(command);
|
|
445
|
+
const data = await response.Body?.transformToString();
|
|
446
|
+
if (!data) {
|
|
447
|
+
throw new Error("No data retrieved from S3");
|
|
448
|
+
}
|
|
449
|
+
return JSON.parse(data);
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Get migration statistics
|
|
453
|
+
*/
|
|
454
|
+
getMigrationStats() {
|
|
455
|
+
const stats = this.localDb.prepare(
|
|
456
|
+
`
|
|
457
|
+
SELECT
|
|
458
|
+
storage_tier,
|
|
459
|
+
COUNT(*) as count,
|
|
460
|
+
SUM(original_size) as original_size,
|
|
461
|
+
SUM(compressed_size) as compressed_size,
|
|
462
|
+
AVG(retrieval_count) as avg_retrievals
|
|
463
|
+
FROM remote_migrations
|
|
464
|
+
GROUP BY storage_tier
|
|
465
|
+
`
|
|
466
|
+
).all();
|
|
467
|
+
const total = this.localDb.prepare(
|
|
468
|
+
`
|
|
469
|
+
SELECT
|
|
470
|
+
COUNT(*) as total_migrated,
|
|
471
|
+
SUM(original_size) as total_original,
|
|
472
|
+
SUM(compressed_size) as total_compressed
|
|
473
|
+
FROM remote_migrations
|
|
474
|
+
`
|
|
475
|
+
).get();
|
|
476
|
+
return {
|
|
477
|
+
byTier: stats,
|
|
478
|
+
total,
|
|
479
|
+
compressionRatio: total ? (1 - total.total_compressed / total.total_original).toFixed(2) : 0,
|
|
480
|
+
localSize: this.getLocalStorageSize()
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
export {
|
|
485
|
+
DEFAULT_REMOTE_CONFIG,
|
|
486
|
+
RemoteStorageManager,
|
|
487
|
+
StorageTier
|
|
488
|
+
};
|
|
489
|
+
//# sourceMappingURL=remote-storage.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/storage/remote-storage.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Remote Storage Interface for Two-Tier Storage System\n * Implements infinite retention with TimeSeries DB + S3\n */\n\nimport {\n S3Client,\n PutObjectCommand,\n GetObjectCommand,\n DeleteObjectCommand,\n} from '@aws-sdk/client-s3';\nimport { Storage } from '@google-cloud/storage';\nimport { logger } from '../monitoring/logger.js';\nimport { Trace, CompressedTrace } from '../trace/types.js';\nimport Database from 'better-sqlite3';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\nexport enum StorageTier {\n HOT = 'hot', // < 7 days - Railway Buckets or GCS Standard\n NEARLINE = 'nearline', // 7-30 days - GCS Nearline ($0.01/GB)\n COLDLINE = 'coldline', // 30-90 days - GCS Coldline ($0.004/GB)\n ARCHIVE = 'archive', // > 90 days - GCS Archive ($0.0012/GB)\n}\n\nexport interface RemoteStorageConfig {\n provider: 'gcs' | 's3' | 'railway';\n gcs?: {\n bucketName: string;\n projectId: string;\n keyFilename?: string; // Path to service account key\n };\n s3?: {\n bucket: string;\n region: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n endpoint?: string; // For Railway buckets or MinIO\n };\n timeseries: {\n type: 'clickhouse' | 'timescale' | 'influxdb' | 'sqlite'; // SQLite for dev\n host: string;\n port: number;\n database: string;\n username?: string;\n password?: string;\n };\n migration: {\n batchSize: number;\n hotAgeHours: number; // < 7 days\n nearlineAgeHours: number; // 7-30 days\n coldlineAgeHours: number; // 30-90 days\n archiveAgeHours: number; // > 90 days\n scoreThreshold: number; // Score threshold for early migration\n };\n}\n\nexport const DEFAULT_REMOTE_CONFIG: RemoteStorageConfig = {\n provider: 'gcs', // Default to GCS for better pricing\n gcs: {\n bucketName: 'stackmemory-traces',\n projectId: process.env['GCP_PROJECT_ID'] || 'stackmemory',\n },\n timeseries: {\n type: 'sqlite', // Use SQLite for development\n host: 'localhost',\n port: 0,\n database: 'stackmemory_timeseries',\n },\n migration: {\n batchSize: 100,\n hotAgeHours: 168, // 7 days\n nearlineAgeHours: 720, // 30 days\n coldlineAgeHours: 2160, // 90 days\n archiveAgeHours: 8760, // 365 days\n scoreThreshold: 0.4,\n },\n};\n\nexport interface MigrationCandidate {\n traceId: string;\n age: number;\n score: number;\n size: number;\n tier: StorageTier;\n shouldMigrate: boolean;\n compressionLevel: 'none' | 'light' | 'medium' | 'heavy';\n}\n\n/**\n * Remote storage manager for infinite trace retention\n */\nexport class RemoteStorageManager {\n private storageClient?: S3Client | Storage;\n private config: RemoteStorageConfig;\n private localDb: Database.Database;\n private migrationInProgress = false;\n\n constructor(\n localDb: Database.Database,\n config?: Partial<RemoteStorageConfig>\n ) {\n this.localDb = localDb;\n this.config = { ...DEFAULT_REMOTE_CONFIG, ...config };\n\n this.initializeStorageClient();\n this.initializeSchema();\n }\n\n /**\n * Initialize storage client based on provider\n */\n private initializeStorageClient(): void {\n switch (this.config.provider) {\n case 'gcs':\n if (this.config.gcs) {\n this.storageClient = new Storage({\n projectId: this.config.gcs.projectId,\n keyFilename: this.config.gcs.keyFilename,\n });\n }\n break;\n\n case 's3':\n case 'railway':\n if (this.config.s3?.accessKeyId && this.config.s3?.secretAccessKey) {\n this.storageClient = new S3Client({\n region: this.config.s3.region,\n credentials: {\n accessKeyId: this.config.s3.accessKeyId,\n secretAccessKey: this.config.s3.secretAccessKey,\n },\n endpoint: this.config.s3.endpoint, // Railway buckets endpoint\n });\n }\n break;\n }\n }\n\n /**\n * Initialize migration tracking schema\n */\n private initializeSchema(): void {\n this.localDb.exec(`\n CREATE TABLE IF NOT EXISTS remote_migrations (\n trace_id TEXT PRIMARY KEY,\n migrated_at INTEGER NOT NULL,\n storage_tier TEXT NOT NULL,\n s3_key TEXT,\n timeseries_id TEXT,\n compression_level TEXT,\n original_size INTEGER,\n compressed_size INTEGER,\n retrieval_count INTEGER DEFAULT 0,\n last_retrieved INTEGER,\n FOREIGN KEY (trace_id) REFERENCES traces(id) ON DELETE CASCADE\n )\n `);\n\n this.localDb.exec(`\n CREATE INDEX IF NOT EXISTS idx_migrations_tier ON remote_migrations(storage_tier);\n CREATE INDEX IF NOT EXISTS idx_migrations_migrated ON remote_migrations(migrated_at);\n `);\n }\n\n /**\n * Identify traces for migration based on age and importance\n */\n async identifyMigrationCandidates(): Promise<MigrationCandidate[]> {\n const now = Date.now();\n\n // Query all traces with their metadata\n const traces = this.localDb\n .prepare(\n `\n SELECT \n t.id,\n t.score,\n t.start_time,\n LENGTH(t.compressed_data) + \n COALESCE((SELECT SUM(LENGTH(tc.arguments) + LENGTH(tc.result)) \n FROM tool_calls tc WHERE tc.trace_id = t.id), 0) as size,\n rm.trace_id as already_migrated\n FROM traces t\n LEFT JOIN remote_migrations rm ON t.id = rm.trace_id\n WHERE rm.trace_id IS NULL -- Not already migrated\n ORDER BY t.start_time ASC\n `\n )\n .all() as any[];\n\n const candidates: MigrationCandidate[] = [];\n\n for (const trace of traces) {\n const ageHours = (now - trace.start_time) / (1000 * 60 * 60);\n const candidate = this.evaluateTrace(\n trace.id,\n ageHours,\n trace.score,\n trace.size || 0\n );\n\n candidates.push(candidate);\n }\n\n return candidates;\n }\n\n /**\n * Evaluate a trace for migration based on GCS storage classes\n */\n private evaluateTrace(\n traceId: string,\n ageHours: number,\n score: number,\n size: number\n ): MigrationCandidate {\n let tier = StorageTier.HOT;\n let shouldMigrate = false;\n let compressionLevel: 'none' | 'light' | 'medium' | 'heavy' = 'none';\n\n // Determine storage tier based on age and GCS storage classes\n if (ageHours > this.config.migration.archiveAgeHours) {\n // GCS Archive: $0.0012/GB - accessed < once per year\n tier = StorageTier.ARCHIVE;\n shouldMigrate = true;\n compressionLevel = 'heavy';\n } else if (ageHours > this.config.migration.coldlineAgeHours) {\n // GCS Coldline: $0.004/GB - accessed < once per quarter\n tier = StorageTier.COLDLINE;\n shouldMigrate = true;\n compressionLevel = 'heavy';\n } else if (ageHours > this.config.migration.nearlineAgeHours) {\n // GCS Nearline: $0.01/GB - accessed < once per month\n tier = StorageTier.NEARLINE;\n shouldMigrate = true;\n compressionLevel = 'medium';\n } else if (ageHours > this.config.migration.hotAgeHours) {\n // Still hot but consider migration if low importance\n tier = StorageTier.HOT;\n if (score < this.config.migration.scoreThreshold) {\n shouldMigrate = true;\n compressionLevel = 'light';\n }\n }\n\n // Force migration for size pressure\n const localSizeLimit = 2 * 1024 * 1024 * 1024; // 2GB\n const currentLocalSize = this.getLocalStorageSize();\n\n if (currentLocalSize > localSizeLimit * 0.75) {\n // Start migrating when 75% full\n shouldMigrate = true;\n if (compressionLevel === 'none') {\n compressionLevel = 'light';\n }\n }\n\n return {\n traceId,\n age: ageHours,\n score,\n size,\n tier,\n shouldMigrate,\n compressionLevel,\n };\n }\n\n /**\n * Migrate traces to remote storage\n */\n async migrateTraces(\n candidates: MigrationCandidate[],\n dryRun: boolean = false\n ): Promise<{\n migrated: number;\n failed: number;\n totalSize: number;\n errors: string[];\n }> {\n if (this.migrationInProgress) {\n return {\n migrated: 0,\n failed: 0,\n totalSize: 0,\n errors: ['Migration already in progress'],\n };\n }\n\n this.migrationInProgress = true;\n const results = {\n migrated: 0,\n failed: 0,\n totalSize: 0,\n errors: [] as string[],\n };\n\n try {\n // Process in batches\n const toMigrate = candidates.filter((c: any) => c.shouldMigrate);\n const batches = this.createBatches(\n toMigrate,\n this.config.migration.batchSize\n );\n\n for (const batch of batches) {\n if (dryRun) {\n logger.info('Dry run - would migrate batch', {\n count: batch.length,\n totalSize: batch.reduce((sum, c) => sum + c.size, 0),\n });\n results.migrated += batch.length;\n continue;\n }\n\n const batchResults = await this.migrateBatch(batch);\n results.migrated += batchResults.success;\n results.failed += batchResults.failed;\n results.totalSize += batchResults.totalSize;\n results.errors.push(...batchResults.errors);\n\n // Small delay between batches\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n } finally {\n this.migrationInProgress = false;\n }\n\n logger.info('Migration completed', results);\n return results;\n }\n\n /**\n * Migrate a batch of traces\n */\n private async migrateBatch(batch: MigrationCandidate[]): Promise<{\n success: number;\n failed: number;\n totalSize: number;\n errors: string[];\n }> {\n const results = {\n success: 0,\n failed: 0,\n totalSize: 0,\n errors: [] as string[],\n };\n\n for (const candidate of batch) {\n try {\n // Get full trace data\n const trace = this.getTraceData(candidate.traceId);\n if (!trace) {\n throw new Error(`Trace ${candidate.traceId} not found`);\n }\n\n // Compress based on level\n const compressed = this.compressTrace(\n trace,\n candidate.compressionLevel\n );\n\n // Upload to S3\n if (this.s3Client) {\n const s3Key = this.generateS3Key(candidate);\n await this.uploadToS3(s3Key, compressed);\n\n // Record migration\n this.recordMigration(candidate, s3Key, trace, compressed);\n } else {\n // Local simulation for testing\n this.recordMigration(candidate, 'simulated', trace, compressed);\n }\n\n // Optionally remove from local after successful migration\n if (\n candidate.tier === StorageTier.COLD ||\n candidate.tier === StorageTier.ARCHIVE\n ) {\n this.removeLocalTrace(candidate.traceId);\n }\n\n results.success++;\n results.totalSize += candidate.size;\n } catch (error: unknown) {\n results.failed++;\n results.errors.push(`Failed to migrate ${candidate.traceId}: ${error}`);\n logger.error('Migration failed for trace', {\n traceId: candidate.traceId,\n error,\n });\n }\n }\n\n return results;\n }\n\n /**\n * Get full trace data for migration\n */\n private getTraceData(traceId: string): any {\n const traceRow = this.localDb\n .prepare('SELECT * FROM traces WHERE id = ?')\n .get(traceId);\n\n if (!traceRow) return null;\n\n const toolCalls = this.localDb\n .prepare(\n 'SELECT * FROM tool_calls WHERE trace_id = ? ORDER BY sequence_number'\n )\n .all(traceId);\n\n return {\n trace: traceRow,\n toolCalls,\n };\n }\n\n /**\n * Compress trace based on compression level\n */\n private compressTrace(\n data: any,\n level: 'none' | 'light' | 'medium' | 'heavy'\n ): Buffer {\n const jsonData = JSON.stringify(data);\n\n // Apply different compression based on level\n switch (level) {\n case 'none':\n return Buffer.from(jsonData);\n\n case 'light':\n // Remove formatting, keep all data\n return Buffer.from(JSON.stringify(JSON.parse(jsonData)));\n\n case 'medium':\n // Remove null fields and compress\n const cleaned = JSON.parse(jsonData, (key, value) =>\n value === null || value === undefined ? undefined : value\n );\n return Buffer.from(JSON.stringify(cleaned));\n\n case 'heavy':\n // Remove tool results and arguments, keep only essential\n const minimal = {\n id: data.trace.id,\n type: data.trace.type,\n score: data.trace.score,\n summary: data.trace.summary,\n timestamps: {\n start: data.trace.start_time,\n end: data.trace.end_time,\n },\n toolCount: data.toolCalls.length,\n toolTypes: [...new Set(data.toolCalls.map((t: any) => t.tool))],\n };\n return Buffer.from(JSON.stringify(minimal));\n\n default:\n return Buffer.from(jsonData);\n }\n }\n\n /**\n * Generate S3 key for trace\n */\n private generateS3Key(candidate: MigrationCandidate): string {\n const date = new Date(Date.now() - candidate.age * 60 * 60 * 1000);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return `traces/${year}/${month}/${day}/${candidate.tier}/${candidate.traceId}.json`;\n }\n\n /**\n * Upload to S3\n */\n private async uploadToS3(key: string, data: Buffer): Promise<void> {\n if (!this.s3Client) {\n throw new Error('S3 client not configured');\n }\n\n const command = new PutObjectCommand({\n Bucket: this.config.s3.bucket,\n Key: key,\n Body: data,\n ContentType: 'application/json',\n Metadata: {\n 'trace-version': '1.0',\n compression: 'true',\n },\n });\n\n await this.s3Client.send(command);\n }\n\n /**\n * Record migration in local database\n */\n private recordMigration(\n candidate: MigrationCandidate,\n s3Key: string,\n originalData: any,\n compressedData: Buffer\n ): void {\n const stmt = this.localDb.prepare(`\n INSERT INTO remote_migrations (\n trace_id, migrated_at, storage_tier, s3_key,\n compression_level, original_size, compressed_size\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n candidate.traceId,\n Date.now(),\n candidate.tier,\n s3Key,\n candidate.compressionLevel,\n JSON.stringify(originalData).length,\n compressedData.length\n );\n }\n\n /**\n * Remove local trace after migration\n */\n private removeLocalTrace(traceId: string): void {\n this.localDb\n .prepare('DELETE FROM tool_calls WHERE trace_id = ?')\n .run(traceId);\n this.localDb.prepare('DELETE FROM traces WHERE id = ?').run(traceId);\n }\n\n /**\n * Get current local storage size\n */\n private getLocalStorageSize(): number {\n const result = this.localDb\n .prepare(\n `\n SELECT \n SUM(LENGTH(compressed_data)) +\n COALESCE((SELECT SUM(LENGTH(arguments) + LENGTH(result)) \n FROM tool_calls), 0) as total_size\n FROM traces\n `\n )\n .get() as any;\n\n return result?.total_size || 0;\n }\n\n /**\n * Create batches from candidates\n */\n private createBatches<T>(items: T[], batchSize: number): T[][] {\n const batches: T[][] = [];\n for (let i = 0; i < items.length; i += batchSize) {\n batches.push(items.slice(i, i + batchSize));\n }\n return batches;\n }\n\n /**\n * Retrieve trace from remote storage\n */\n async retrieveTrace(traceId: string): Promise<any> {\n const migration = this.localDb\n .prepare(\n `\n SELECT * FROM remote_migrations WHERE trace_id = ?\n `\n )\n .get(traceId) as any;\n\n if (!migration) {\n throw new Error(`Trace ${traceId} not found in remote storage`);\n }\n\n // Update retrieval count\n this.localDb\n .prepare(\n `\n UPDATE remote_migrations \n SET retrieval_count = retrieval_count + 1, last_retrieved = ?\n WHERE trace_id = ?\n `\n )\n .run(Date.now(), traceId);\n\n if (!this.s3Client) {\n throw new Error('S3 client not configured');\n }\n\n // Retrieve from S3\n const command = new GetObjectCommand({\n Bucket: this.config.s3.bucket,\n Key: migration.s3_key,\n });\n\n const response = await this.s3Client.send(command);\n const data = await response.Body?.transformToString();\n\n if (!data) {\n throw new Error('No data retrieved from S3');\n }\n\n return JSON.parse(data);\n }\n\n /**\n * Get migration statistics\n */\n getMigrationStats(): any {\n const stats = this.localDb\n .prepare(\n `\n SELECT \n storage_tier,\n COUNT(*) as count,\n SUM(original_size) as original_size,\n SUM(compressed_size) as compressed_size,\n AVG(retrieval_count) as avg_retrievals\n FROM remote_migrations\n GROUP BY storage_tier\n `\n )\n .all();\n\n const total = this.localDb\n .prepare(\n `\n SELECT \n COUNT(*) as total_migrated,\n SUM(original_size) as total_original,\n SUM(compressed_size) as total_compressed\n FROM remote_migrations\n `\n )\n .get();\n\n return {\n byTier: stats,\n total,\n compressionRatio: total\n ? (\n 1 -\n (total as any).total_compressed / (total as any).total_original\n ).toFixed(2)\n : 0,\n localSize: this.getLocalStorageSize(),\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["StorageTier"]
|
|
7
|
+
}
|