@stackmemoryai/stackmemory 0.5.59 → 0.5.61
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/README.md +105 -1
- package/dist/src/cli/claude-sm.js +130 -50
- package/dist/src/cli/claude-sm.js.map +2 -2
- package/dist/src/cli/index.js +18 -3
- package/dist/src/cli/index.js.map +3 -3
- package/dist/src/core/extensions/custom-tools.js +567 -0
- package/dist/src/core/extensions/custom-tools.js.map +7 -0
- package/dist/src/core/extensions/index.js +55 -0
- package/dist/src/core/extensions/index.js.map +7 -0
- package/dist/src/core/extensions/loader.js +709 -0
- package/dist/src/core/extensions/loader.js.map +7 -0
- package/dist/src/core/extensions/plugin-system.js +506 -0
- package/dist/src/core/extensions/plugin-system.js.map +7 -0
- package/dist/src/core/extensions/provider-adapter.js +617 -0
- package/dist/src/core/extensions/provider-adapter.js.map +7 -0
- package/dist/src/core/extensions/sandbox-runtime.js +664 -0
- package/dist/src/core/extensions/sandbox-runtime.js.map +7 -0
- package/dist/src/core/storage/chromadb-adapter.js +32 -6
- package/dist/src/core/storage/chromadb-adapter.js.map +2 -2
- package/dist/src/skills/repo-ingestion-skill.js +35 -12
- package/dist/src/skills/repo-ingestion-skill.js.map +2 -2
- package/package.json +11 -7
- package/scripts/background-sync-manager.js +145 -83
- package/scripts/claude-sm-autostart.js +17 -12
- package/scripts/gepa/README.md +275 -0
- package/scripts/gepa/config.json +53 -0
- package/scripts/gepa/evals/coding-tasks.jsonl +5 -0
- package/scripts/gepa/evals/fixtures/buggy-loop.js +18 -0
- package/scripts/gepa/evals/fixtures/callback-hell.js +53 -0
- package/scripts/gepa/generations/gen-000/baseline.md +124 -0
- package/scripts/gepa/hooks/auto-optimize.js +494 -0
- package/scripts/gepa/hooks/eval-tracker.js +203 -0
- package/scripts/gepa/hooks/reflect.js +311 -0
- package/scripts/gepa/optimize.js +611 -0
- package/scripts/gepa/state.json +14 -0
- package/scripts/test-pre-publish-quick.sh +1 -1
- package/dist/agents/core/agent-task-manager.js +0 -527
- package/dist/agents/core/agent-task-manager.js.map +0 -7
- package/dist/agents/testing-agent.js +0 -614
- package/dist/agents/testing-agent.js.map +0 -7
- package/dist/agents/verifiers/base-verifier.js +0 -133
- package/dist/agents/verifiers/base-verifier.js.map +0 -7
- package/dist/agents/verifiers/formatter-verifier.js +0 -130
- package/dist/agents/verifiers/formatter-verifier.js.map +0 -7
- package/dist/agents/verifiers/llm-judge.js +0 -252
- package/dist/agents/verifiers/llm-judge.js.map +0 -7
- package/dist/cli/auto-detect.js +0 -321
- package/dist/cli/auto-detect.js.map +0 -7
- package/dist/cli/browser-test.js +0 -33
- package/dist/cli/browser-test.js.map +0 -7
- package/dist/cli/claude-sm-danger.js +0 -21
- package/dist/cli/claude-sm-danger.js.map +0 -7
- package/dist/cli/claude-sm.js +0 -1156
- package/dist/cli/claude-sm.js.map +0 -7
- package/dist/cli/codex-sm-danger.js +0 -21
- package/dist/cli/codex-sm-danger.js.map +0 -7
- package/dist/cli/codex-sm.js +0 -349
- package/dist/cli/codex-sm.js.map +0 -7
- package/dist/cli/commands/api.js +0 -232
- package/dist/cli/commands/api.js.map +0 -7
- package/dist/cli/commands/auto-background.js +0 -180
- package/dist/cli/commands/auto-background.js.map +0 -7
- package/dist/cli/commands/cleanup-processes.js +0 -68
- package/dist/cli/commands/cleanup-processes.js.map +0 -7
- package/dist/cli/commands/clear.js +0 -202
- package/dist/cli/commands/clear.js.map +0 -7
- package/dist/cli/commands/config.js +0 -445
- package/dist/cli/commands/config.js.map +0 -7
- package/dist/cli/commands/context-rehydrate.js +0 -751
- package/dist/cli/commands/context-rehydrate.js.map +0 -7
- package/dist/cli/commands/context.js +0 -343
- package/dist/cli/commands/context.js.map +0 -7
- package/dist/cli/commands/daemon.js +0 -392
- package/dist/cli/commands/daemon.js.map +0 -7
- package/dist/cli/commands/dashboard.js +0 -210
- package/dist/cli/commands/dashboard.js.map +0 -7
- package/dist/cli/commands/db.js +0 -147
- package/dist/cli/commands/db.js.map +0 -7
- package/dist/cli/commands/decision.js +0 -266
- package/dist/cli/commands/decision.js.map +0 -7
- package/dist/cli/commands/discovery.js +0 -279
- package/dist/cli/commands/discovery.js.map +0 -7
- package/dist/cli/commands/handoff.js +0 -624
- package/dist/cli/commands/handoff.js.map +0 -7
- package/dist/cli/commands/hooks.js +0 -298
- package/dist/cli/commands/hooks.js.map +0 -7
- package/dist/cli/commands/linear-unified.js +0 -353
- package/dist/cli/commands/linear-unified.js.map +0 -7
- package/dist/cli/commands/linear.js +0 -529
- package/dist/cli/commands/linear.js.map +0 -7
- package/dist/cli/commands/log.js +0 -169
- package/dist/cli/commands/log.js.map +0 -7
- package/dist/cli/commands/login.js +0 -172
- package/dist/cli/commands/login.js.map +0 -7
- package/dist/cli/commands/migrate.js +0 -240
- package/dist/cli/commands/migrate.js.map +0 -7
- package/dist/cli/commands/model.js +0 -533
- package/dist/cli/commands/model.js.map +0 -7
- package/dist/cli/commands/monitor.js +0 -313
- package/dist/cli/commands/monitor.js.map +0 -7
- package/dist/cli/commands/onboard.js +0 -536
- package/dist/cli/commands/onboard.js.map +0 -7
- package/dist/cli/commands/projects.js +0 -199
- package/dist/cli/commands/projects.js.map +0 -7
- package/dist/cli/commands/quality.js +0 -413
- package/dist/cli/commands/quality.js.map +0 -7
- package/dist/cli/commands/ralph.js +0 -909
- package/dist/cli/commands/ralph.js.map +0 -7
- package/dist/cli/commands/retrieval.js +0 -248
- package/dist/cli/commands/retrieval.js.map +0 -7
- package/dist/cli/commands/search.js +0 -173
- package/dist/cli/commands/search.js.map +0 -7
- package/dist/cli/commands/service.js +0 -749
- package/dist/cli/commands/service.js.map +0 -7
- package/dist/cli/commands/session.js +0 -200
- package/dist/cli/commands/session.js.map +0 -7
- package/dist/cli/commands/settings.js +0 -306
- package/dist/cli/commands/settings.js.map +0 -7
- package/dist/cli/commands/setup.js +0 -701
- package/dist/cli/commands/setup.js.map +0 -7
- package/dist/cli/commands/shell.js +0 -249
- package/dist/cli/commands/shell.js.map +0 -7
- package/dist/cli/commands/signup.js +0 -50
- package/dist/cli/commands/signup.js.map +0 -7
- package/dist/cli/commands/skills.js +0 -470
- package/dist/cli/commands/skills.js.map +0 -7
- package/dist/cli/commands/sms-notify.js +0 -795
- package/dist/cli/commands/sms-notify.js.map +0 -7
- package/dist/cli/commands/storage-tier.js +0 -183
- package/dist/cli/commands/storage-tier.js.map +0 -7
- package/dist/cli/commands/storage.js +0 -360
- package/dist/cli/commands/storage.js.map +0 -7
- package/dist/cli/commands/sweep.js +0 -249
- package/dist/cli/commands/sweep.js.map +0 -7
- package/dist/cli/commands/tasks.js +0 -213
- package/dist/cli/commands/tasks.js.map +0 -7
- package/dist/cli/commands/test.js +0 -286
- package/dist/cli/commands/test.js.map +0 -7
- package/dist/cli/commands/workflow.js +0 -142
- package/dist/cli/commands/workflow.js.map +0 -7
- package/dist/cli/commands/worktree.js +0 -319
- package/dist/cli/commands/worktree.js.map +0 -7
- package/dist/cli/index.js +0 -594
- package/dist/cli/index.js.map +0 -7
- package/dist/cli/opencode-sm.js +0 -448
- package/dist/cli/opencode-sm.js.map +0 -7
- package/dist/cli/utils/viewer.js +0 -96
- package/dist/cli/utils/viewer.js.map +0 -7
- package/dist/core/analytics/team-analytics.js +0 -378
- package/dist/core/analytics/team-analytics.js.map +0 -7
- package/dist/core/config/config-manager.js +0 -398
- package/dist/core/config/config-manager.js.map +0 -7
- package/dist/core/config/feature-flags.js +0 -76
- package/dist/core/config/feature-flags.js.map +0 -7
- package/dist/core/config/storage-config.js +0 -115
- package/dist/core/config/storage-config.js.map +0 -7
- package/dist/core/config/types.js +0 -144
- package/dist/core/config/types.js.map +0 -7
- package/dist/core/context/auto-context.js +0 -80
- package/dist/core/context/auto-context.js.map +0 -7
- package/dist/core/context/dual-stack-manager.js +0 -870
- package/dist/core/context/dual-stack-manager.js.map +0 -7
- package/dist/core/context/enhanced-rehydration.js +0 -994
- package/dist/core/context/enhanced-rehydration.js.map +0 -7
- package/dist/core/context/frame-database.js +0 -479
- package/dist/core/context/frame-database.js.map +0 -7
- package/dist/core/context/frame-digest.js +0 -250
- package/dist/core/context/frame-digest.js.map +0 -7
- package/dist/core/context/frame-handoff-manager.js +0 -778
- package/dist/core/context/frame-handoff-manager.js.map +0 -7
- package/dist/core/context/frame-lifecycle-hooks.js +0 -119
- package/dist/core/context/frame-lifecycle-hooks.js.map +0 -7
- package/dist/core/context/frame-manager.js +0 -1069
- package/dist/core/context/frame-manager.js.map +0 -7
- package/dist/core/context/frame-recovery.js +0 -302
- package/dist/core/context/frame-recovery.js.map +0 -7
- package/dist/core/context/frame-stack.js +0 -314
- package/dist/core/context/frame-stack.js.map +0 -7
- package/dist/core/context/frame-types.js +0 -5
- package/dist/core/context/frame-types.js.map +0 -7
- package/dist/core/context/incremental-gc.js +0 -290
- package/dist/core/context/incremental-gc.js.map +0 -7
- package/dist/core/context/index.js +0 -25
- package/dist/core/context/index.js.map +0 -7
- package/dist/core/context/model-aware-compaction.js +0 -623
- package/dist/core/context/model-aware-compaction.js.map +0 -7
- package/dist/core/context/permission-manager.js +0 -185
- package/dist/core/context/permission-manager.js.map +0 -7
- package/dist/core/context/recursive-context-manager.js +0 -592
- package/dist/core/context/recursive-context-manager.js.map +0 -7
- package/dist/core/context/refactored-frame-manager.js +0 -754
- package/dist/core/context/refactored-frame-manager.js.map +0 -7
- package/dist/core/context/shared-context-layer.js +0 -621
- package/dist/core/context/shared-context-layer.js.map +0 -7
- package/dist/core/context/stack-merge-resolver.js +0 -749
- package/dist/core/context/stack-merge-resolver.js.map +0 -7
- package/dist/core/context/validation.js +0 -130
- package/dist/core/context/validation.js.map +0 -7
- package/dist/core/database/batch-operations.js +0 -384
- package/dist/core/database/batch-operations.js.map +0 -7
- package/dist/core/database/connection-pool.js +0 -330
- package/dist/core/database/connection-pool.js.map +0 -7
- package/dist/core/database/database-adapter.js +0 -60
- package/dist/core/database/database-adapter.js.map +0 -7
- package/dist/core/database/migration-manager.js +0 -614
- package/dist/core/database/migration-manager.js.map +0 -7
- package/dist/core/database/paradedb-adapter.js +0 -990
- package/dist/core/database/paradedb-adapter.js.map +0 -7
- package/dist/core/database/query-cache.js +0 -298
- package/dist/core/database/query-cache.js.map +0 -7
- package/dist/core/database/query-router.js +0 -430
- package/dist/core/database/query-router.js.map +0 -7
- package/dist/core/database/sqlite-adapter.js +0 -738
- package/dist/core/database/sqlite-adapter.js.map +0 -7
- package/dist/core/digest/enhanced-hybrid-digest.js +0 -277
- package/dist/core/digest/enhanced-hybrid-digest.js.map +0 -7
- package/dist/core/digest/frame-digest-integration.js +0 -176
- package/dist/core/digest/frame-digest-integration.js.map +0 -7
- package/dist/core/digest/hybrid-digest-generator.js +0 -553
- package/dist/core/digest/hybrid-digest-generator.js.map +0 -7
- package/dist/core/digest/index.js +0 -9
- package/dist/core/digest/index.js.map +0 -7
- package/dist/core/digest/types.js +0 -25
- package/dist/core/digest/types.js.map +0 -7
- package/dist/core/errors/error-utils.js +0 -208
- package/dist/core/errors/error-utils.js.map +0 -7
- package/dist/core/errors/index.js +0 -521
- package/dist/core/errors/index.js.map +0 -7
- package/dist/core/errors/recovery.js +0 -269
- package/dist/core/errors/recovery.js.map +0 -7
- package/dist/core/execution/parallel-executor.js +0 -258
- package/dist/core/execution/parallel-executor.js.map +0 -7
- package/dist/core/frame/workflow-templates.js +0 -319
- package/dist/core/frame/workflow-templates.js.map +0 -7
- package/dist/core/merge/conflict-detector.js +0 -431
- package/dist/core/merge/conflict-detector.js.map +0 -7
- package/dist/core/merge/index.js +0 -9
- package/dist/core/merge/index.js.map +0 -7
- package/dist/core/merge/resolution-engine.js +0 -558
- package/dist/core/merge/resolution-engine.js.map +0 -7
- package/dist/core/merge/stack-diff.js +0 -532
- package/dist/core/merge/stack-diff.js.map +0 -7
- package/dist/core/merge/unified-merge-resolver.js +0 -303
- package/dist/core/merge/unified-merge-resolver.js.map +0 -7
- package/dist/core/models/fallback-monitor.js +0 -232
- package/dist/core/models/fallback-monitor.js.map +0 -7
- package/dist/core/models/model-router.js +0 -340
- package/dist/core/models/model-router.js.map +0 -7
- package/dist/core/monitoring/error-handler.js +0 -49
- package/dist/core/monitoring/error-handler.js.map +0 -7
- package/dist/core/monitoring/logger.js +0 -202
- package/dist/core/monitoring/logger.js.map +0 -7
- package/dist/core/monitoring/metrics.js +0 -172
- package/dist/core/monitoring/metrics.js.map +0 -7
- package/dist/core/monitoring/progress-tracker.js +0 -189
- package/dist/core/monitoring/progress-tracker.js.map +0 -7
- package/dist/core/monitoring/session-monitor.js +0 -300
- package/dist/core/monitoring/session-monitor.js.map +0 -7
- package/dist/core/performance/context-cache.js +0 -273
- package/dist/core/performance/context-cache.js.map +0 -7
- package/dist/core/performance/index.js +0 -11
- package/dist/core/performance/index.js.map +0 -7
- package/dist/core/performance/lazy-context-loader.js +0 -327
- package/dist/core/performance/lazy-context-loader.js.map +0 -7
- package/dist/core/performance/monitor.js +0 -221
- package/dist/core/performance/monitor.js.map +0 -7
- package/dist/core/performance/optimized-frame-context.js +0 -345
- package/dist/core/performance/optimized-frame-context.js.map +0 -7
- package/dist/core/performance/performance-benchmark.js +0 -277
- package/dist/core/performance/performance-benchmark.js.map +0 -7
- package/dist/core/performance/performance-profiler.js +0 -370
- package/dist/core/performance/performance-profiler.js.map +0 -7
- package/dist/core/performance/streaming-jsonl-parser.js +0 -195
- package/dist/core/performance/streaming-jsonl-parser.js.map +0 -7
- package/dist/core/persistence/postgres-adapter.js +0 -349
- package/dist/core/persistence/postgres-adapter.js.map +0 -7
- package/dist/core/projects/project-isolation.js +0 -201
- package/dist/core/projects/project-isolation.js.map +0 -7
- package/dist/core/projects/project-manager.js +0 -697
- package/dist/core/projects/project-manager.js.map +0 -7
- package/dist/core/query/query-parser.js +0 -370
- package/dist/core/query/query-parser.js.map +0 -7
- package/dist/core/query/query-templates.js +0 -321
- package/dist/core/query/query-templates.js.map +0 -7
- package/dist/core/retrieval/context-retriever.js +0 -479
- package/dist/core/retrieval/context-retriever.js.map +0 -7
- package/dist/core/retrieval/graph-retrieval.js +0 -662
- package/dist/core/retrieval/graph-retrieval.js.map +0 -7
- package/dist/core/retrieval/hierarchical-retrieval.js +0 -656
- package/dist/core/retrieval/hierarchical-retrieval.js.map +0 -7
- package/dist/core/retrieval/index.js +0 -8
- package/dist/core/retrieval/index.js.map +0 -7
- package/dist/core/retrieval/llm-context-retrieval.js +0 -613
- package/dist/core/retrieval/llm-context-retrieval.js.map +0 -7
- package/dist/core/retrieval/llm-provider.js +0 -151
- package/dist/core/retrieval/llm-provider.js.map +0 -7
- package/dist/core/retrieval/retrieval-audit.js +0 -236
- package/dist/core/retrieval/retrieval-audit.js.map +0 -7
- package/dist/core/retrieval/retrieval-benchmarks.js +0 -521
- package/dist/core/retrieval/retrieval-benchmarks.js.map +0 -7
- package/dist/core/retrieval/summary-generator.js +0 -589
- package/dist/core/retrieval/summary-generator.js.map +0 -7
- package/dist/core/retrieval/types.js +0 -21
- package/dist/core/retrieval/types.js.map +0 -7
- package/dist/core/security/index.js +0 -35
- package/dist/core/security/index.js.map +0 -7
- package/dist/core/security/input-sanitizer.js +0 -321
- package/dist/core/security/input-sanitizer.js.map +0 -7
- package/dist/core/session/clear-survival.js +0 -465
- package/dist/core/session/clear-survival.js.map +0 -7
- package/dist/core/session/enhanced-handoff.js +0 -792
- package/dist/core/session/enhanced-handoff.js.map +0 -7
- package/dist/core/session/handoff-generator.js +0 -343
- package/dist/core/session/handoff-generator.js.map +0 -7
- package/dist/core/session/index.js +0 -15
- package/dist/core/session/index.js.map +0 -7
- package/dist/core/session/session-manager.js +0 -347
- package/dist/core/session/session-manager.js.map +0 -7
- package/dist/core/skills/index.js +0 -7
- package/dist/core/skills/index.js.map +0 -7
- package/dist/core/skills/skill-storage.js +0 -764
- package/dist/core/skills/skill-storage.js.map +0 -7
- package/dist/core/skills/types.js +0 -193
- package/dist/core/skills/types.js.map +0 -7
- package/dist/core/storage/chromadb-adapter.js +0 -354
- package/dist/core/storage/chromadb-adapter.js.map +0 -7
- package/dist/core/storage/infinite-storage.js +0 -510
- package/dist/core/storage/infinite-storage.js.map +0 -7
- package/dist/core/storage/railway-optimized-storage.js +0 -591
- package/dist/core/storage/railway-optimized-storage.js.map +0 -7
- package/dist/core/storage/remote-storage.js +0 -489
- package/dist/core/storage/remote-storage.js.map +0 -7
- package/dist/core/storage/two-tier-storage.js +0 -766
- package/dist/core/storage/two-tier-storage.js.map +0 -7
- package/dist/core/trace/cli-trace-wrapper.js +0 -132
- package/dist/core/trace/cli-trace-wrapper.js.map +0 -7
- package/dist/core/trace/db-trace-wrapper.js +0 -247
- package/dist/core/trace/db-trace-wrapper.js.map +0 -7
- package/dist/core/trace/debug-trace.js +0 -417
- package/dist/core/trace/debug-trace.js.map +0 -7
- package/dist/core/trace/index.js +0 -109
- package/dist/core/trace/index.js.map +0 -7
- package/dist/core/trace/linear-api-wrapper.js +0 -178
- package/dist/core/trace/linear-api-wrapper.js.map +0 -7
- package/dist/core/trace/trace-demo.js +0 -154
- package/dist/core/trace/trace-demo.js.map +0 -7
- package/dist/core/trace/trace-detector.demo.js +0 -142
- package/dist/core/trace/trace-detector.demo.js.map +0 -7
- package/dist/core/trace/trace-detector.js +0 -528
- package/dist/core/trace/trace-detector.js.map +0 -7
- package/dist/core/trace/trace-store.js +0 -345
- package/dist/core/trace/trace-store.js.map +0 -7
- package/dist/core/trace/types.js +0 -77
- package/dist/core/trace/types.js.map +0 -7
- package/dist/core/types.js +0 -5
- package/dist/core/types.js.map +0 -7
- package/dist/core/utils/async-mutex.js +0 -114
- package/dist/core/utils/async-mutex.js.map +0 -7
- package/dist/core/utils/compression.js +0 -83
- package/dist/core/utils/compression.js.map +0 -7
- package/dist/core/utils/update-checker.js +0 -218
- package/dist/core/utils/update-checker.js.map +0 -7
- package/dist/core/worktree/worktree-manager.js +0 -465
- package/dist/core/worktree/worktree-manager.js.map +0 -7
- package/dist/daemon/daemon-config.js +0 -149
- package/dist/daemon/daemon-config.js.map +0 -7
- package/dist/daemon/services/context-service.js +0 -122
- package/dist/daemon/services/context-service.js.map +0 -7
- package/dist/daemon/services/linear-service.js +0 -136
- package/dist/daemon/services/linear-service.js.map +0 -7
- package/dist/daemon/session-daemon.js +0 -312
- package/dist/daemon/session-daemon.js.map +0 -7
- package/dist/daemon/unified-daemon.js +0 -276
- package/dist/daemon/unified-daemon.js.map +0 -7
- package/dist/features/analytics/api/analytics-api.js +0 -287
- package/dist/features/analytics/api/analytics-api.js.map +0 -7
- package/dist/features/analytics/core/analytics-service.js +0 -282
- package/dist/features/analytics/core/analytics-service.js.map +0 -7
- package/dist/features/analytics/index.js +0 -18
- package/dist/features/analytics/index.js.map +0 -7
- package/dist/features/analytics/queries/metrics-queries.js +0 -277
- package/dist/features/analytics/queries/metrics-queries.js.map +0 -7
- package/dist/features/analytics/types/metrics.js +0 -5
- package/dist/features/analytics/types/metrics.js.map +0 -7
- package/dist/features/browser/browser-mcp.js +0 -492
- package/dist/features/browser/browser-mcp.js.map +0 -7
- package/dist/features/sweep/index.js +0 -20
- package/dist/features/sweep/index.js.map +0 -7
- package/dist/features/sweep/prediction-client.js +0 -155
- package/dist/features/sweep/prediction-client.js.map +0 -7
- package/dist/features/sweep/prompt-builder.js +0 -85
- package/dist/features/sweep/prompt-builder.js.map +0 -7
- package/dist/features/sweep/pty-wrapper.js +0 -171
- package/dist/features/sweep/pty-wrapper.js.map +0 -7
- package/dist/features/sweep/state-watcher.js +0 -87
- package/dist/features/sweep/state-watcher.js.map +0 -7
- package/dist/features/sweep/status-bar.js +0 -88
- package/dist/features/sweep/status-bar.js.map +0 -7
- package/dist/features/sweep/sweep-server-manager.js +0 -226
- package/dist/features/sweep/sweep-server-manager.js.map +0 -7
- package/dist/features/sweep/tab-interceptor.js +0 -38
- package/dist/features/sweep/tab-interceptor.js.map +0 -7
- package/dist/features/sweep/types.js +0 -18
- package/dist/features/sweep/types.js.map +0 -7
- package/dist/features/tasks/linear-task-manager.js +0 -487
- package/dist/features/tasks/linear-task-manager.js.map +0 -7
- package/dist/features/tasks/task-aware-context.js +0 -410
- package/dist/features/tasks/task-aware-context.js.map +0 -7
- package/dist/features/tui/simple-monitor.js +0 -116
- package/dist/features/tui/simple-monitor.js.map +0 -7
- package/dist/features/tui/swarm-monitor.js +0 -648
- package/dist/features/tui/swarm-monitor.js.map +0 -7
- package/dist/features/web/client/stores/task-store.js +0 -26
- package/dist/features/web/client/stores/task-store.js.map +0 -7
- package/dist/features/web/server/index.js +0 -194
- package/dist/features/web/server/index.js.map +0 -7
- package/dist/hooks/auto-background.js +0 -151
- package/dist/hooks/auto-background.js.map +0 -7
- package/dist/hooks/claude-code-whatsapp-hook.js +0 -197
- package/dist/hooks/claude-code-whatsapp-hook.js.map +0 -7
- package/dist/hooks/config.js +0 -150
- package/dist/hooks/config.js.map +0 -7
- package/dist/hooks/daemon.js +0 -364
- package/dist/hooks/daemon.js.map +0 -7
- package/dist/hooks/events.js +0 -58
- package/dist/hooks/events.js.map +0 -7
- package/dist/hooks/index.js +0 -12
- package/dist/hooks/index.js.map +0 -7
- package/dist/hooks/linear-task-picker.js +0 -186
- package/dist/hooks/linear-task-picker.js.map +0 -7
- package/dist/hooks/schemas.js +0 -197
- package/dist/hooks/schemas.js.map +0 -7
- package/dist/hooks/secure-fs.js +0 -49
- package/dist/hooks/secure-fs.js.map +0 -7
- package/dist/hooks/security-logger.js +0 -155
- package/dist/hooks/security-logger.js.map +0 -7
- package/dist/hooks/session-summary.js +0 -222
- package/dist/hooks/session-summary.js.map +0 -7
- package/dist/hooks/sms-action-runner.js +0 -371
- package/dist/hooks/sms-action-runner.js.map +0 -7
- package/dist/hooks/sms-notify.js +0 -506
- package/dist/hooks/sms-notify.js.map +0 -7
- package/dist/hooks/sms-watcher.js +0 -93
- package/dist/hooks/sms-watcher.js.map +0 -7
- package/dist/hooks/sms-webhook.js +0 -555
- package/dist/hooks/sms-webhook.js.map +0 -7
- package/dist/hooks/whatsapp-commands.js +0 -479
- package/dist/hooks/whatsapp-commands.js.map +0 -7
- package/dist/hooks/whatsapp-scheduler.js +0 -317
- package/dist/hooks/whatsapp-scheduler.js.map +0 -7
- package/dist/hooks/whatsapp-sync.js +0 -409
- package/dist/hooks/whatsapp-sync.js.map +0 -7
- package/dist/index.js +0 -25
- package/dist/index.js.map +0 -7
- package/dist/integrations/anthropic/client.js +0 -263
- package/dist/integrations/anthropic/client.js.map +0 -7
- package/dist/integrations/claude-code/agent-bridge.js +0 -768
- package/dist/integrations/claude-code/agent-bridge.js.map +0 -7
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js +0 -459
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
- package/dist/integrations/claude-code/lifecycle-hooks.js +0 -254
- package/dist/integrations/claude-code/lifecycle-hooks.js.map +0 -7
- package/dist/integrations/claude-code/post-task-hooks.js +0 -545
- package/dist/integrations/claude-code/post-task-hooks.js.map +0 -7
- package/dist/integrations/claude-code/subagent-client-stub.js +0 -20
- package/dist/integrations/claude-code/subagent-client-stub.js.map +0 -7
- package/dist/integrations/claude-code/subagent-client.js +0 -511
- package/dist/integrations/claude-code/subagent-client.js.map +0 -7
- package/dist/integrations/claude-code/task-coordinator.js +0 -360
- package/dist/integrations/claude-code/task-coordinator.js.map +0 -7
- package/dist/integrations/linear/auth.js +0 -337
- package/dist/integrations/linear/auth.js.map +0 -7
- package/dist/integrations/linear/auto-sync.js +0 -258
- package/dist/integrations/linear/auto-sync.js.map +0 -7
- package/dist/integrations/linear/client.js +0 -634
- package/dist/integrations/linear/client.js.map +0 -7
- package/dist/integrations/linear/config.js +0 -130
- package/dist/integrations/linear/config.js.map +0 -7
- package/dist/integrations/linear/migration.js +0 -361
- package/dist/integrations/linear/migration.js.map +0 -7
- package/dist/integrations/linear/oauth-server.js +0 -454
- package/dist/integrations/linear/oauth-server.js.map +0 -7
- package/dist/integrations/linear/rest-client.js +0 -213
- package/dist/integrations/linear/rest-client.js.map +0 -7
- package/dist/integrations/linear/sync-manager.js +0 -236
- package/dist/integrations/linear/sync-manager.js.map +0 -7
- package/dist/integrations/linear/sync-service.js +0 -231
- package/dist/integrations/linear/sync-service.js.map +0 -7
- package/dist/integrations/linear/sync.js +0 -782
- package/dist/integrations/linear/sync.js.map +0 -7
- package/dist/integrations/linear/types.js +0 -5
- package/dist/integrations/linear/types.js.map +0 -7
- package/dist/integrations/linear/unified-sync.js +0 -589
- package/dist/integrations/linear/unified-sync.js.map +0 -7
- package/dist/integrations/linear/webhook-handler.js +0 -219
- package/dist/integrations/linear/webhook-handler.js.map +0 -7
- package/dist/integrations/linear/webhook-server.js +0 -218
- package/dist/integrations/linear/webhook-server.js.map +0 -7
- package/dist/integrations/linear/webhook.js +0 -291
- package/dist/integrations/linear/webhook.js.map +0 -7
- package/dist/integrations/mcp/handlers/code-execution-handlers.js +0 -266
- package/dist/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/context-handlers.js +0 -257
- package/dist/integrations/mcp/handlers/context-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/discovery-handlers.js +0 -497
- package/dist/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/index.js +0 -166
- package/dist/integrations/mcp/handlers/index.js.map +0 -7
- package/dist/integrations/mcp/handlers/linear-handlers.js +0 -247
- package/dist/integrations/mcp/handlers/linear-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/skill-handlers.js +0 -529
- package/dist/integrations/mcp/handlers/skill-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/task-handlers.js +0 -239
- package/dist/integrations/mcp/handlers/task-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/trace-handlers.js +0 -308
- package/dist/integrations/mcp/handlers/trace-handlers.js.map +0 -7
- package/dist/integrations/mcp/index.js +0 -23
- package/dist/integrations/mcp/index.js.map +0 -7
- package/dist/integrations/mcp/middleware/tool-scoring.js +0 -356
- package/dist/integrations/mcp/middleware/tool-scoring.js.map +0 -7
- package/dist/integrations/mcp/refactored-server.js +0 -374
- package/dist/integrations/mcp/refactored-server.js.map +0 -7
- package/dist/integrations/mcp/remote-server.js +0 -682
- package/dist/integrations/mcp/remote-server.js.map +0 -7
- package/dist/integrations/mcp/schemas.js +0 -147
- package/dist/integrations/mcp/schemas.js.map +0 -7
- package/dist/integrations/mcp/server.js +0 -1975
- package/dist/integrations/mcp/server.js.map +0 -7
- package/dist/integrations/mcp/tool-definitions-code.js +0 -125
- package/dist/integrations/mcp/tool-definitions-code.js.map +0 -7
- package/dist/integrations/mcp/tool-definitions.js +0 -702
- package/dist/integrations/mcp/tool-definitions.js.map +0 -7
- package/dist/integrations/mcp/trace-test.js +0 -48
- package/dist/integrations/mcp/trace-test.js.map +0 -7
- package/dist/integrations/pg-aiguide/embedding-provider.js +0 -189
- package/dist/integrations/pg-aiguide/embedding-provider.js.map +0 -7
- package/dist/integrations/pg-aiguide/semantic-search.js +0 -187
- package/dist/integrations/pg-aiguide/semantic-search.js.map +0 -7
- package/dist/integrations/pg-aiguide/timescale-analytics.js +0 -224
- package/dist/integrations/pg-aiguide/timescale-analytics.js.map +0 -7
- package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js +0 -860
- package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
- package/dist/integrations/ralph/context/context-budget-manager.js +0 -301
- package/dist/integrations/ralph/context/context-budget-manager.js.map +0 -7
- package/dist/integrations/ralph/context/stackmemory-context-loader.js +0 -360
- package/dist/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
- package/dist/integrations/ralph/coordination/enhanced-coordination.js +0 -410
- package/dist/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
- package/dist/integrations/ralph/index.js +0 -18
- package/dist/integrations/ralph/index.js.map +0 -7
- package/dist/integrations/ralph/learning/pattern-learner.js +0 -401
- package/dist/integrations/ralph/learning/pattern-learner.js.map +0 -7
- package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js +0 -448
- package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
- package/dist/integrations/ralph/monitoring/swarm-dashboard.js +0 -294
- package/dist/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
- package/dist/integrations/ralph/monitoring/swarm-registry.js +0 -108
- package/dist/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
- package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js +0 -463
- package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
- package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js +0 -400
- package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
- package/dist/integrations/ralph/patterns/extended-coherence-sessions.js +0 -473
- package/dist/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
- package/dist/integrations/ralph/patterns/oracle-worker-pattern.js +0 -388
- package/dist/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
- package/dist/integrations/ralph/performance/performance-optimizer.js +0 -358
- package/dist/integrations/ralph/performance/performance-optimizer.js.map +0 -7
- package/dist/integrations/ralph/ralph-integration-demo.js +0 -182
- package/dist/integrations/ralph/ralph-integration-demo.js.map +0 -7
- package/dist/integrations/ralph/recovery/crash-recovery.js +0 -462
- package/dist/integrations/ralph/recovery/crash-recovery.js.map +0 -7
- package/dist/integrations/ralph/state/state-reconciler.js +0 -404
- package/dist/integrations/ralph/state/state-reconciler.js.map +0 -7
- package/dist/integrations/ralph/swarm/git-workflow-manager.js +0 -428
- package/dist/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
- package/dist/integrations/ralph/swarm/swarm-coordinator.js +0 -996
- package/dist/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
- package/dist/integrations/ralph/types.js +0 -5
- package/dist/integrations/ralph/types.js.map +0 -7
- package/dist/integrations/ralph/visualization/ralph-debugger.js +0 -585
- package/dist/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
- package/dist/mcp/stackmemory-mcp-server.js +0 -554
- package/dist/mcp/stackmemory-mcp-server.js.map +0 -7
- package/dist/middleware/exponential-rate-limiter.js +0 -289
- package/dist/middleware/exponential-rate-limiter.js.map +0 -7
- package/dist/models/user.model.js +0 -358
- package/dist/models/user.model.js.map +0 -7
- package/dist/servers/production/auth-middleware.js +0 -528
- package/dist/servers/production/auth-middleware.js.map +0 -7
- package/dist/servers/railway/config.js +0 -55
- package/dist/servers/railway/config.js.map +0 -7
- package/dist/servers/railway/index-enhanced.js +0 -160
- package/dist/servers/railway/index-enhanced.js.map +0 -7
- package/dist/servers/railway/index.js +0 -1349
- package/dist/servers/railway/index.js.map +0 -7
- package/dist/servers/railway/simple.js +0 -64
- package/dist/servers/railway/simple.js.map +0 -7
- package/dist/servers/railway/storage-test.js +0 -459
- package/dist/servers/railway/storage-test.js.map +0 -7
- package/dist/services/config-service.js +0 -65
- package/dist/services/config-service.js.map +0 -7
- package/dist/services/context-service.js +0 -194
- package/dist/services/context-service.js.map +0 -7
- package/dist/skills/api-discovery.js +0 -354
- package/dist/skills/api-discovery.js.map +0 -7
- package/dist/skills/api-skill.js +0 -475
- package/dist/skills/api-skill.js.map +0 -7
- package/dist/skills/claude-skills.js +0 -1061
- package/dist/skills/claude-skills.js.map +0 -7
- package/dist/skills/dashboard-launcher.js +0 -216
- package/dist/skills/dashboard-launcher.js.map +0 -7
- package/dist/skills/recursive-agent-orchestrator.js +0 -575
- package/dist/skills/recursive-agent-orchestrator.js.map +0 -7
- package/dist/skills/repo-ingestion-skill.js +0 -609
- package/dist/skills/repo-ingestion-skill.js.map +0 -7
- package/dist/skills/security-secrets-scanner.js +0 -284
- package/dist/skills/security-secrets-scanner.js.map +0 -7
- package/dist/skills/unified-rlm-orchestrator.js +0 -404
- package/dist/skills/unified-rlm-orchestrator.js.map +0 -7
- package/dist/types/task.js +0 -5
- package/dist/types/task.js.map +0 -7
- package/dist/utils/env.js +0 -50
- package/dist/utils/env.js.map +0 -7
- package/dist/utils/formatting.js +0 -62
- package/dist/utils/formatting.js.map +0 -7
- package/dist/utils/process-cleanup.js +0 -136
- package/dist/utils/process-cleanup.js.map +0 -7
- package/dist/validation/schemas.js +0 -222
- package/dist/validation/schemas.js.map +0 -7
- /package/dist/{core/merge → src/core/extensions}/types.js +0 -0
- /package/dist/{core/merge → src/core/extensions}/types.js.map +0 -0
|
@@ -1,591 +0,0 @@
|
|
|
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 { createClient } from "redis";
|
|
6
|
-
import {
|
|
7
|
-
S3Client,
|
|
8
|
-
PutObjectCommand,
|
|
9
|
-
GetObjectCommand,
|
|
10
|
-
DeleteObjectCommand
|
|
11
|
-
} from "@aws-sdk/client-s3";
|
|
12
|
-
import { Storage } from "@google-cloud/storage";
|
|
13
|
-
import { logger } from "../monitoring/logger.js";
|
|
14
|
-
import * as zlib from "zlib";
|
|
15
|
-
import { promisify } from "util";
|
|
16
|
-
function getEnv(key, defaultValue) {
|
|
17
|
-
const value = process.env[key];
|
|
18
|
-
if (value === void 0) {
|
|
19
|
-
if (defaultValue !== void 0) return defaultValue;
|
|
20
|
-
throw new Error(`Environment variable ${key} is required`);
|
|
21
|
-
}
|
|
22
|
-
return value;
|
|
23
|
-
}
|
|
24
|
-
function getOptionalEnv(key) {
|
|
25
|
-
return process.env[key];
|
|
26
|
-
}
|
|
27
|
-
const gzipAsync = promisify(zlib.gzip);
|
|
28
|
-
const gunzipAsync = promisify(zlib.gunzip);
|
|
29
|
-
var StorageTier = /* @__PURE__ */ ((StorageTier2) => {
|
|
30
|
-
StorageTier2["HOT"] = "hot";
|
|
31
|
-
StorageTier2["WARM"] = "warm";
|
|
32
|
-
StorageTier2["COLD"] = "cold";
|
|
33
|
-
return StorageTier2;
|
|
34
|
-
})(StorageTier || {});
|
|
35
|
-
const DEFAULT_RAILWAY_CONFIG = {
|
|
36
|
-
redis: {
|
|
37
|
-
url: process.env["REDIS_URL"] || "redis://localhost:6379",
|
|
38
|
-
ttlSeconds: 86400,
|
|
39
|
-
// 24 hours
|
|
40
|
-
maxMemoryMb: 100
|
|
41
|
-
// 100MB Redis limit
|
|
42
|
-
},
|
|
43
|
-
railwayBuckets: {
|
|
44
|
-
endpoint: process.env["RAILWAY_BUCKET_ENDPOINT"] || "https://buckets.railway.app",
|
|
45
|
-
bucket: process.env["RAILWAY_BUCKET_NAME"] || "stackmemory-warm",
|
|
46
|
-
accessKeyId: process.env["RAILWAY_BUCKET_ACCESS_KEY"] || "",
|
|
47
|
-
secretAccessKey: process.env["RAILWAY_BUCKET_SECRET_KEY"] || "",
|
|
48
|
-
region: "us-east-1"
|
|
49
|
-
},
|
|
50
|
-
gcs: {
|
|
51
|
-
bucketName: process.env["GCS_BUCKET"] || "stackmemory-cold",
|
|
52
|
-
projectId: process.env["GCP_PROJECT_ID"] || "stackmemory",
|
|
53
|
-
keyFilename: process.env["GCP_KEY_FILE"]
|
|
54
|
-
},
|
|
55
|
-
tiers: {
|
|
56
|
-
hotHours: 24,
|
|
57
|
-
warmDays: 30,
|
|
58
|
-
compressionScore: 0.4
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
class RailwayOptimizedStorage {
|
|
62
|
-
redisClient;
|
|
63
|
-
railwayS3;
|
|
64
|
-
gcsStorage;
|
|
65
|
-
localDb;
|
|
66
|
-
config;
|
|
67
|
-
configManager;
|
|
68
|
-
metricsCache = /* @__PURE__ */ new Map();
|
|
69
|
-
initialized;
|
|
70
|
-
constructor(localDb, configManager, config) {
|
|
71
|
-
this.localDb = localDb;
|
|
72
|
-
this.configManager = configManager;
|
|
73
|
-
this.config = { ...DEFAULT_RAILWAY_CONFIG, ...config };
|
|
74
|
-
this.initializeSchema();
|
|
75
|
-
this.initialized = this.initializeClients();
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Initialize storage clients
|
|
79
|
-
*/
|
|
80
|
-
async initializeClients() {
|
|
81
|
-
if (this.config.redis.url) {
|
|
82
|
-
try {
|
|
83
|
-
this.redisClient = createClient({ url: this.config.redis.url });
|
|
84
|
-
this.redisClient.on("error", (err) => {
|
|
85
|
-
logger.error("Redis client error", err);
|
|
86
|
-
});
|
|
87
|
-
await this.redisClient.connect();
|
|
88
|
-
await this.redisClient.configSet("maxmemory-policy", "allkeys-lru");
|
|
89
|
-
logger.info("Redis connected for hot tier storage");
|
|
90
|
-
} catch (error) {
|
|
91
|
-
logger.warn(
|
|
92
|
-
"Redis connection failed, falling back to SQLite only",
|
|
93
|
-
error
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
if (this.config.railwayBuckets.accessKeyId) {
|
|
98
|
-
this.railwayS3 = new S3Client({
|
|
99
|
-
endpoint: this.config.railwayBuckets.endpoint,
|
|
100
|
-
region: this.config.railwayBuckets.region,
|
|
101
|
-
credentials: {
|
|
102
|
-
accessKeyId: this.config.railwayBuckets.accessKeyId,
|
|
103
|
-
secretAccessKey: this.config.railwayBuckets.secretAccessKey
|
|
104
|
-
},
|
|
105
|
-
forcePathStyle: true
|
|
106
|
-
// Required for Railway buckets
|
|
107
|
-
});
|
|
108
|
-
logger.info("Railway Buckets configured for warm tier");
|
|
109
|
-
}
|
|
110
|
-
if (this.config.gcs.projectId) {
|
|
111
|
-
try {
|
|
112
|
-
this.gcsStorage = new Storage({
|
|
113
|
-
projectId: this.config.gcs.projectId,
|
|
114
|
-
keyFilename: this.config.gcs.keyFilename
|
|
115
|
-
});
|
|
116
|
-
logger.info("GCS configured for cold tier storage");
|
|
117
|
-
} catch (error) {
|
|
118
|
-
logger.warn("GCS setup failed, will use Railway buckets only", error);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Initialize database schema for tracking
|
|
124
|
-
*/
|
|
125
|
-
initializeSchema() {
|
|
126
|
-
this.localDb.exec(`
|
|
127
|
-
CREATE TABLE IF NOT EXISTS storage_tiers (
|
|
128
|
-
trace_id TEXT PRIMARY KEY,
|
|
129
|
-
tier TEXT NOT NULL,
|
|
130
|
-
location TEXT NOT NULL,
|
|
131
|
-
original_size INTEGER,
|
|
132
|
-
compressed_size INTEGER,
|
|
133
|
-
compression_ratio REAL,
|
|
134
|
-
access_count INTEGER DEFAULT 0,
|
|
135
|
-
last_accessed INTEGER,
|
|
136
|
-
created_at INTEGER,
|
|
137
|
-
migrated_at INTEGER,
|
|
138
|
-
score REAL,
|
|
139
|
-
FOREIGN KEY (trace_id) REFERENCES traces(id) ON DELETE CASCADE
|
|
140
|
-
)
|
|
141
|
-
`);
|
|
142
|
-
this.localDb.exec(`
|
|
143
|
-
CREATE INDEX IF NOT EXISTS idx_storage_tier ON storage_tiers(tier);
|
|
144
|
-
CREATE INDEX IF NOT EXISTS idx_storage_created ON storage_tiers(created_at);
|
|
145
|
-
CREATE INDEX IF NOT EXISTS idx_storage_accessed ON storage_tiers(last_accessed);
|
|
146
|
-
`);
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Store a trace in the appropriate tier
|
|
150
|
-
*/
|
|
151
|
-
async storeTrace(trace) {
|
|
152
|
-
await this.initialized;
|
|
153
|
-
const score = trace.score;
|
|
154
|
-
const age = Date.now() - trace.metadata.startTime;
|
|
155
|
-
const ageHours = age / (1e3 * 60 * 60);
|
|
156
|
-
let tier;
|
|
157
|
-
if (ageHours < this.config.tiers.hotHours && score > this.config.tiers.compressionScore) {
|
|
158
|
-
tier = "hot" /* HOT */;
|
|
159
|
-
} else if (ageHours < this.config.tiers.warmDays * 24) {
|
|
160
|
-
tier = "warm" /* WARM */;
|
|
161
|
-
} else {
|
|
162
|
-
tier = "cold" /* COLD */;
|
|
163
|
-
}
|
|
164
|
-
switch (tier) {
|
|
165
|
-
case "hot" /* HOT */:
|
|
166
|
-
await this.storeInRedis(trace);
|
|
167
|
-
break;
|
|
168
|
-
case "warm" /* WARM */:
|
|
169
|
-
await this.storeInRailwayBuckets(trace);
|
|
170
|
-
break;
|
|
171
|
-
case "cold" /* COLD */:
|
|
172
|
-
await this.storeInGCS(trace);
|
|
173
|
-
break;
|
|
174
|
-
}
|
|
175
|
-
this.trackStorage(trace.id, tier, trace);
|
|
176
|
-
return tier;
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Store trace in Redis (hot tier)
|
|
180
|
-
*/
|
|
181
|
-
async storeInRedis(trace) {
|
|
182
|
-
if (!this.redisClient) {
|
|
183
|
-
return;
|
|
184
|
-
}
|
|
185
|
-
try {
|
|
186
|
-
const key = `trace:${trace.id}`;
|
|
187
|
-
const data = JSON.stringify(trace);
|
|
188
|
-
let storedData;
|
|
189
|
-
if (data.length > 1e4) {
|
|
190
|
-
const compressed = await gzipAsync(data);
|
|
191
|
-
storedData = compressed.toString("base64");
|
|
192
|
-
await this.redisClient.hSet(key, {
|
|
193
|
-
data: storedData,
|
|
194
|
-
compressed: "true",
|
|
195
|
-
score: trace.score.toString(),
|
|
196
|
-
type: trace.type,
|
|
197
|
-
timestamp: trace.metadata.startTime.toString()
|
|
198
|
-
});
|
|
199
|
-
} else {
|
|
200
|
-
storedData = data;
|
|
201
|
-
await this.redisClient.hSet(key, {
|
|
202
|
-
data: storedData,
|
|
203
|
-
compressed: "false",
|
|
204
|
-
score: trace.score.toString(),
|
|
205
|
-
type: trace.type,
|
|
206
|
-
timestamp: trace.metadata.startTime.toString()
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
await this.redisClient.expire(key, this.config.redis.ttlSeconds);
|
|
210
|
-
await this.redisClient.zAdd("traces:by_score", {
|
|
211
|
-
score: trace.score,
|
|
212
|
-
value: trace.id
|
|
213
|
-
});
|
|
214
|
-
await this.redisClient.zAdd("traces:by_time", {
|
|
215
|
-
score: trace.metadata.startTime,
|
|
216
|
-
value: trace.id
|
|
217
|
-
});
|
|
218
|
-
logger.debug("Stored trace in Redis", {
|
|
219
|
-
traceId: trace.id,
|
|
220
|
-
size: data.length,
|
|
221
|
-
compressed: data.length > 1e4
|
|
222
|
-
});
|
|
223
|
-
} catch (error) {
|
|
224
|
-
logger.error("Failed to store in Redis", error);
|
|
225
|
-
throw error;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Store trace in Railway Buckets (warm tier)
|
|
230
|
-
*/
|
|
231
|
-
async storeInRailwayBuckets(trace) {
|
|
232
|
-
if (!this.railwayS3) {
|
|
233
|
-
throw new Error("Railway Buckets not configured");
|
|
234
|
-
}
|
|
235
|
-
try {
|
|
236
|
-
const data = JSON.stringify(trace);
|
|
237
|
-
const compressed = await gzipAsync(data);
|
|
238
|
-
const date = new Date(trace.metadata.startTime);
|
|
239
|
-
const key = `traces/${date.getFullYear()}/${String(date.getMonth() + 1).padStart(2, "0")}/${String(date.getDate()).padStart(2, "0")}/${trace.id}.json.gz`;
|
|
240
|
-
const command = new PutObjectCommand({
|
|
241
|
-
Bucket: this.config.railwayBuckets.bucket,
|
|
242
|
-
Key: key,
|
|
243
|
-
Body: compressed,
|
|
244
|
-
ContentType: "application/gzip",
|
|
245
|
-
Metadata: {
|
|
246
|
-
"trace-id": trace.id,
|
|
247
|
-
"trace-type": trace.type,
|
|
248
|
-
"trace-score": trace.score.toString(),
|
|
249
|
-
"original-size": data.length.toString(),
|
|
250
|
-
"compressed-size": compressed.length.toString()
|
|
251
|
-
}
|
|
252
|
-
});
|
|
253
|
-
await this.railwayS3.send(command);
|
|
254
|
-
if (this.redisClient) {
|
|
255
|
-
await this.redisClient.del(`trace:${trace.id}`);
|
|
256
|
-
}
|
|
257
|
-
logger.info("Stored trace in Railway Buckets", {
|
|
258
|
-
traceId: trace.id,
|
|
259
|
-
key,
|
|
260
|
-
originalSize: data.length,
|
|
261
|
-
compressedSize: compressed.length,
|
|
262
|
-
compressionRatio: (1 - compressed.length / data.length).toFixed(2)
|
|
263
|
-
});
|
|
264
|
-
} catch (error) {
|
|
265
|
-
logger.error("Failed to store in Railway Buckets", error);
|
|
266
|
-
throw error;
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* Store trace in GCS (cold tier)
|
|
271
|
-
*/
|
|
272
|
-
async storeInGCS(trace) {
|
|
273
|
-
if (!this.gcsStorage) {
|
|
274
|
-
return this.storeInRailwayBuckets(trace);
|
|
275
|
-
}
|
|
276
|
-
try {
|
|
277
|
-
const minimal = this.createMinimalTrace(trace);
|
|
278
|
-
const data = JSON.stringify(minimal);
|
|
279
|
-
const compressed = await gzipAsync(data);
|
|
280
|
-
const date = new Date(trace.metadata.startTime);
|
|
281
|
-
const key = `archive/${date.getFullYear()}/${String(date.getMonth() + 1).padStart(2, "0")}/${trace.id}.json.gz`;
|
|
282
|
-
const bucket = this.gcsStorage.bucket(this.config.gcs.bucketName);
|
|
283
|
-
const file = bucket.file(key);
|
|
284
|
-
await file.save(compressed, {
|
|
285
|
-
metadata: {
|
|
286
|
-
contentType: "application/gzip",
|
|
287
|
-
metadata: {
|
|
288
|
-
traceId: trace.id,
|
|
289
|
-
traceType: trace.type,
|
|
290
|
-
score: trace.score.toString(),
|
|
291
|
-
originalTools: trace.tools.length.toString()
|
|
292
|
-
}
|
|
293
|
-
},
|
|
294
|
-
storageClass: "COLDLINE"
|
|
295
|
-
// Use Coldline for cost optimization
|
|
296
|
-
});
|
|
297
|
-
if (this.railwayS3) {
|
|
298
|
-
try {
|
|
299
|
-
const warmKey = this.getWarmTierKey(trace);
|
|
300
|
-
await this.railwayS3.send(
|
|
301
|
-
new DeleteObjectCommand({
|
|
302
|
-
Bucket: this.config.railwayBuckets.bucket,
|
|
303
|
-
Key: warmKey
|
|
304
|
-
})
|
|
305
|
-
);
|
|
306
|
-
} catch (error) {
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
logger.info("Archived trace to GCS", {
|
|
310
|
-
traceId: trace.id,
|
|
311
|
-
key,
|
|
312
|
-
originalSize: JSON.stringify(trace).length,
|
|
313
|
-
compressedSize: compressed.length
|
|
314
|
-
});
|
|
315
|
-
} catch (error) {
|
|
316
|
-
logger.error("Failed to store in GCS", error);
|
|
317
|
-
throw error;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* Create minimal trace for cold storage
|
|
322
|
-
*/
|
|
323
|
-
createMinimalTrace(trace) {
|
|
324
|
-
return {
|
|
325
|
-
id: trace.id,
|
|
326
|
-
type: trace.type,
|
|
327
|
-
score: trace.score,
|
|
328
|
-
summary: trace.summary,
|
|
329
|
-
metadata: {
|
|
330
|
-
startTime: trace.metadata.startTime,
|
|
331
|
-
endTime: trace.metadata.endTime,
|
|
332
|
-
filesModified: trace.metadata.filesModified.length,
|
|
333
|
-
errorsCount: trace.metadata.errorsEncountered.length,
|
|
334
|
-
decisionsCount: trace.metadata.decisionsRecorded.length,
|
|
335
|
-
causalChain: trace.metadata.causalChain
|
|
336
|
-
},
|
|
337
|
-
toolSummary: {
|
|
338
|
-
count: trace.tools.length,
|
|
339
|
-
types: [...new Set(trace.tools.map((t) => t.tool))],
|
|
340
|
-
firstTool: trace.tools[0]?.tool,
|
|
341
|
-
lastTool: trace.tools[trace.tools.length - 1]?.tool
|
|
342
|
-
},
|
|
343
|
-
compressed: trace.compressed
|
|
344
|
-
};
|
|
345
|
-
}
|
|
346
|
-
/**
|
|
347
|
-
* Retrieve a trace from any tier
|
|
348
|
-
*/
|
|
349
|
-
async retrieveTrace(traceId) {
|
|
350
|
-
await this.initialized;
|
|
351
|
-
const location = this.localDb.prepare("SELECT tier, location FROM storage_tiers WHERE trace_id = ?").get(traceId);
|
|
352
|
-
if (!location) {
|
|
353
|
-
return null;
|
|
354
|
-
}
|
|
355
|
-
this.localDb.prepare(
|
|
356
|
-
"UPDATE storage_tiers SET access_count = access_count + 1, last_accessed = ? WHERE trace_id = ?"
|
|
357
|
-
).run(Date.now(), traceId);
|
|
358
|
-
switch (location.tier) {
|
|
359
|
-
case "hot" /* HOT */:
|
|
360
|
-
return this.retrieveFromRedis(traceId);
|
|
361
|
-
case "warm" /* WARM */:
|
|
362
|
-
return this.retrieveFromRailwayBuckets(traceId, location.location);
|
|
363
|
-
case "cold" /* COLD */:
|
|
364
|
-
return this.retrieveFromGCS(traceId, location.location);
|
|
365
|
-
default:
|
|
366
|
-
return null;
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
/**
|
|
370
|
-
* Retrieve from Redis
|
|
371
|
-
*/
|
|
372
|
-
async retrieveFromRedis(traceId) {
|
|
373
|
-
if (!this.redisClient) return null;
|
|
374
|
-
try {
|
|
375
|
-
const key = `trace:${traceId}`;
|
|
376
|
-
const data = await this.redisClient.hGetAll(key);
|
|
377
|
-
if (!data || !data.data) return null;
|
|
378
|
-
let traceData;
|
|
379
|
-
if (data.compressed === "true") {
|
|
380
|
-
const compressed = Buffer.from(data.data, "base64");
|
|
381
|
-
const decompressed = await gunzipAsync(compressed);
|
|
382
|
-
traceData = decompressed.toString();
|
|
383
|
-
} else {
|
|
384
|
-
traceData = data.data;
|
|
385
|
-
}
|
|
386
|
-
return JSON.parse(traceData);
|
|
387
|
-
} catch (error) {
|
|
388
|
-
logger.error("Failed to retrieve from Redis", error);
|
|
389
|
-
return null;
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
/**
|
|
393
|
-
* Retrieve from Railway Buckets
|
|
394
|
-
*/
|
|
395
|
-
async retrieveFromRailwayBuckets(traceId, key) {
|
|
396
|
-
if (!this.railwayS3) return null;
|
|
397
|
-
try {
|
|
398
|
-
const command = new GetObjectCommand({
|
|
399
|
-
Bucket: this.config.railwayBuckets.bucket,
|
|
400
|
-
Key: key
|
|
401
|
-
});
|
|
402
|
-
const response = await this.railwayS3.send(command);
|
|
403
|
-
const compressed = await response.Body?.transformToByteArray();
|
|
404
|
-
if (!compressed) return null;
|
|
405
|
-
const decompressed = await gunzipAsync(Buffer.from(compressed));
|
|
406
|
-
return JSON.parse(decompressed.toString());
|
|
407
|
-
} catch (error) {
|
|
408
|
-
logger.error("Failed to retrieve from Railway Buckets", error);
|
|
409
|
-
return null;
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
/**
|
|
413
|
-
* Retrieve from GCS
|
|
414
|
-
*/
|
|
415
|
-
async retrieveFromGCS(traceId, key) {
|
|
416
|
-
if (!this.gcsStorage) return null;
|
|
417
|
-
try {
|
|
418
|
-
const bucket = this.gcsStorage.bucket(this.config.gcs.bucketName);
|
|
419
|
-
const file = bucket.file(key);
|
|
420
|
-
const [compressed] = await file.download();
|
|
421
|
-
const decompressed = await gunzipAsync(compressed);
|
|
422
|
-
return JSON.parse(decompressed.toString());
|
|
423
|
-
} catch (error) {
|
|
424
|
-
logger.error("Failed to retrieve from GCS", error);
|
|
425
|
-
return null;
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
/**
|
|
429
|
-
* Track storage in database
|
|
430
|
-
*/
|
|
431
|
-
trackStorage(traceId, tier, trace) {
|
|
432
|
-
const originalSize = JSON.stringify(trace).length;
|
|
433
|
-
const compressedSize = Math.floor(originalSize * 0.3);
|
|
434
|
-
this.localDb.prepare(
|
|
435
|
-
`
|
|
436
|
-
INSERT OR REPLACE INTO storage_tiers (
|
|
437
|
-
trace_id, tier, location, original_size, compressed_size,
|
|
438
|
-
compression_ratio, access_count, last_accessed, created_at,
|
|
439
|
-
migrated_at, score
|
|
440
|
-
) VALUES (?, ?, ?, ?, ?, ?, 0, ?, ?, ?, ?)
|
|
441
|
-
`
|
|
442
|
-
).run(
|
|
443
|
-
traceId,
|
|
444
|
-
tier,
|
|
445
|
-
this.getStorageLocation(trace, tier),
|
|
446
|
-
originalSize,
|
|
447
|
-
compressedSize,
|
|
448
|
-
1 - compressedSize / originalSize,
|
|
449
|
-
Date.now(),
|
|
450
|
-
trace.metadata.startTime,
|
|
451
|
-
Date.now(),
|
|
452
|
-
trace.score
|
|
453
|
-
);
|
|
454
|
-
}
|
|
455
|
-
/**
|
|
456
|
-
* Get storage location key
|
|
457
|
-
*/
|
|
458
|
-
getStorageLocation(trace, tier) {
|
|
459
|
-
const date = new Date(trace.metadata.startTime);
|
|
460
|
-
const year = date.getFullYear();
|
|
461
|
-
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
462
|
-
const day = String(date.getDate()).padStart(2, "0");
|
|
463
|
-
switch (tier) {
|
|
464
|
-
case "hot" /* HOT */:
|
|
465
|
-
return `redis:trace:${trace.id}`;
|
|
466
|
-
case "warm" /* WARM */:
|
|
467
|
-
return `traces/${year}/${month}/${day}/${trace.id}.json.gz`;
|
|
468
|
-
case "cold" /* COLD */:
|
|
469
|
-
return `archive/${year}/${month}/${trace.id}.json.gz`;
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
/**
|
|
473
|
-
* Get warm tier key for a trace
|
|
474
|
-
*/
|
|
475
|
-
getWarmTierKey(trace) {
|
|
476
|
-
const date = new Date(trace.metadata.startTime);
|
|
477
|
-
return `traces/${date.getFullYear()}/${String(date.getMonth() + 1).padStart(2, "0")}/${String(date.getDate()).padStart(2, "0")}/${trace.id}.json.gz`;
|
|
478
|
-
}
|
|
479
|
-
/**
|
|
480
|
-
* Migrate traces between tiers based on age
|
|
481
|
-
*/
|
|
482
|
-
async migrateTiers() {
|
|
483
|
-
const results = {
|
|
484
|
-
hotToWarm: 0,
|
|
485
|
-
warmToCold: 0,
|
|
486
|
-
errors: []
|
|
487
|
-
};
|
|
488
|
-
const now = Date.now();
|
|
489
|
-
const candidates = this.localDb.prepare(
|
|
490
|
-
`
|
|
491
|
-
SELECT trace_id, tier, created_at, score
|
|
492
|
-
FROM storage_tiers
|
|
493
|
-
WHERE tier != 'cold'
|
|
494
|
-
ORDER BY created_at ASC
|
|
495
|
-
`
|
|
496
|
-
).all();
|
|
497
|
-
for (const candidate of candidates) {
|
|
498
|
-
const ageHours = (now - candidate.created_at) / (1e3 * 60 * 60);
|
|
499
|
-
try {
|
|
500
|
-
if (candidate.tier === "hot" /* HOT */ && ageHours > this.config.tiers.hotHours) {
|
|
501
|
-
const trace = await this.retrieveTrace(candidate.trace_id);
|
|
502
|
-
if (trace) {
|
|
503
|
-
await this.storeInRailwayBuckets(trace);
|
|
504
|
-
this.trackStorage(candidate.trace_id, "warm" /* WARM */, trace);
|
|
505
|
-
results.hotToWarm++;
|
|
506
|
-
}
|
|
507
|
-
} else if (candidate.tier === "warm" /* WARM */ && ageHours > this.config.tiers.warmDays * 24) {
|
|
508
|
-
const trace = await this.retrieveTrace(candidate.trace_id);
|
|
509
|
-
if (trace) {
|
|
510
|
-
await this.storeInGCS(trace);
|
|
511
|
-
this.trackStorage(candidate.trace_id, "cold" /* COLD */, trace);
|
|
512
|
-
results.warmToCold++;
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
} catch (error) {
|
|
516
|
-
results.errors.push(
|
|
517
|
-
`Failed to migrate ${candidate.trace_id}: ${error}`
|
|
518
|
-
);
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
logger.info("Tier migration completed", results);
|
|
522
|
-
return results;
|
|
523
|
-
}
|
|
524
|
-
/**
|
|
525
|
-
* Get storage statistics
|
|
526
|
-
*/
|
|
527
|
-
getStorageStats() {
|
|
528
|
-
const tierStats = this.localDb.prepare(
|
|
529
|
-
`
|
|
530
|
-
SELECT
|
|
531
|
-
tier,
|
|
532
|
-
COUNT(*) as count,
|
|
533
|
-
SUM(original_size) as total_original,
|
|
534
|
-
SUM(compressed_size) as total_compressed,
|
|
535
|
-
AVG(compression_ratio) as avg_compression,
|
|
536
|
-
AVG(access_count) as avg_access
|
|
537
|
-
FROM storage_tiers
|
|
538
|
-
GROUP BY tier
|
|
539
|
-
`
|
|
540
|
-
).all();
|
|
541
|
-
const ageDistribution = this.localDb.prepare(
|
|
542
|
-
`
|
|
543
|
-
SELECT
|
|
544
|
-
CASE
|
|
545
|
-
WHEN (? - created_at) / 3600000 < 24 THEN '< 24h'
|
|
546
|
-
WHEN (? - created_at) / 86400000 < 7 THEN '1-7d'
|
|
547
|
-
WHEN (? - created_at) / 86400000 < 30 THEN '7-30d'
|
|
548
|
-
ELSE '30d+'
|
|
549
|
-
END as age_group,
|
|
550
|
-
COUNT(*) as count
|
|
551
|
-
FROM storage_tiers
|
|
552
|
-
GROUP BY age_group
|
|
553
|
-
`
|
|
554
|
-
).all(Date.now(), Date.now(), Date.now());
|
|
555
|
-
return {
|
|
556
|
-
byTier: tierStats,
|
|
557
|
-
byAge: ageDistribution,
|
|
558
|
-
totalTraces: tierStats.reduce((sum, t) => sum + t.count, 0),
|
|
559
|
-
totalSize: tierStats.reduce(
|
|
560
|
-
(sum, t) => sum + t.total_original,
|
|
561
|
-
0
|
|
562
|
-
),
|
|
563
|
-
compressedSize: tierStats.reduce(
|
|
564
|
-
(sum, t) => sum + t.total_compressed,
|
|
565
|
-
0
|
|
566
|
-
)
|
|
567
|
-
};
|
|
568
|
-
}
|
|
569
|
-
/**
|
|
570
|
-
* Clean up expired data
|
|
571
|
-
*/
|
|
572
|
-
async cleanup() {
|
|
573
|
-
let cleaned = 0;
|
|
574
|
-
const cutoff = Date.now() - 90 * 24 * 60 * 60 * 1e3;
|
|
575
|
-
const result = this.localDb.prepare(
|
|
576
|
-
`
|
|
577
|
-
DELETE FROM storage_tiers
|
|
578
|
-
WHERE tier = 'cold' AND created_at < ? AND access_count = 0
|
|
579
|
-
`
|
|
580
|
-
).run(cutoff);
|
|
581
|
-
cleaned = result.changes;
|
|
582
|
-
logger.info("Cleanup completed", { removed: cleaned });
|
|
583
|
-
return cleaned;
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
export {
|
|
587
|
-
DEFAULT_RAILWAY_CONFIG,
|
|
588
|
-
RailwayOptimizedStorage,
|
|
589
|
-
StorageTier
|
|
590
|
-
};
|
|
591
|
-
//# sourceMappingURL=railway-optimized-storage.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/core/storage/railway-optimized-storage.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Railway-Optimized 3-Tier Storage System\n * Tier 1: Redis (Hot) - Last 24 hours, instant access\n * Tier 2: Railway Buckets (Warm) - 1-30 days, S3-compatible\n * Tier 3: GCS (Cold) - 30+ days, cost-effective archive\n */\n\nimport { createClient, RedisClientType } from 'redis';\nimport {\n S3Client,\n PutObjectCommand,\n GetObjectCommand,\n DeleteObjectCommand,\n HeadObjectCommand,\n} from '@aws-sdk/client-s3';\nimport { Storage } from '@google-cloud/storage';\nimport Database from 'better-sqlite3';\nimport { logger } from '../monitoring/logger.js';\nimport { Trace, CompressedTrace, ToolCall } from '../trace/types.js';\nimport { ConfigManager } from '../config/config-manager.js';\nimport * as zlib from 'zlib';\nimport { promisify } from 'util';\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\nconst gzipAsync = promisify(zlib.gzip);\nconst gunzipAsync = promisify(zlib.gunzip);\n\nexport enum StorageTier {\n HOT = 'hot', // Redis: < 24 hours\n WARM = 'warm', // Railway Buckets: 1-30 days\n COLD = 'cold', // GCS: 30+ days\n}\n\nexport interface RailwayStorageConfig {\n redis: {\n url: string;\n ttlSeconds: number;\n maxMemoryMb: number;\n };\n railwayBuckets: {\n endpoint: string;\n bucket: string;\n accessKeyId: string;\n secretAccessKey: string;\n region: string;\n };\n gcs: {\n bucketName: string;\n projectId: string;\n keyFilename?: string;\n };\n tiers: {\n hotHours: number; // Hours to keep in Redis\n warmDays: number; // Days to keep in Railway Buckets\n compressionScore: number; // Score threshold for early compression\n };\n}\n\nexport const DEFAULT_RAILWAY_CONFIG: RailwayStorageConfig = {\n redis: {\n url: process.env['REDIS_URL'] || 'redis://localhost:6379',\n ttlSeconds: 86400, // 24 hours\n maxMemoryMb: 100, // 100MB Redis limit\n },\n railwayBuckets: {\n endpoint:\n process.env['RAILWAY_BUCKET_ENDPOINT'] || 'https://buckets.railway.app',\n bucket: process.env['RAILWAY_BUCKET_NAME'] || 'stackmemory-warm',\n accessKeyId: process.env['RAILWAY_BUCKET_ACCESS_KEY'] || '',\n secretAccessKey: process.env['RAILWAY_BUCKET_SECRET_KEY'] || '',\n region: 'us-east-1',\n },\n gcs: {\n bucketName: process.env['GCS_BUCKET'] || 'stackmemory-cold',\n projectId: process.env['GCP_PROJECT_ID'] || 'stackmemory',\n keyFilename: process.env['GCP_KEY_FILE'],\n },\n tiers: {\n hotHours: 24,\n warmDays: 30,\n compressionScore: 0.4,\n },\n};\n\ninterface StorageMetrics {\n tier: StorageTier;\n originalSize: number;\n compressedSize: number;\n compressionRatio: number;\n accessCount: number;\n lastAccessed: number;\n migrationTime?: number;\n}\n\n/**\n * Railway-optimized storage manager with 3-tier architecture\n */\nexport class RailwayOptimizedStorage {\n private redisClient?: RedisClientType;\n private railwayS3?: S3Client;\n private gcsStorage?: Storage;\n private localDb: Database.Database;\n private config: RailwayStorageConfig;\n private configManager: ConfigManager;\n private metricsCache: Map<string, StorageMetrics> = new Map();\n\n private initialized: Promise<void>;\n\n constructor(\n localDb: Database.Database,\n configManager: ConfigManager,\n config?: Partial<RailwayStorageConfig>\n ) {\n this.localDb = localDb;\n this.configManager = configManager;\n this.config = { ...DEFAULT_RAILWAY_CONFIG, ...config };\n\n this.initializeSchema();\n this.initialized = this.initializeClients();\n }\n\n /**\n * Initialize storage clients\n */\n private async initializeClients(): Promise<void> {\n // Initialize Redis\n if (this.config.redis.url) {\n try {\n this.redisClient = createClient({ url: this.config.redis.url });\n\n this.redisClient.on('error', (err) => {\n logger.error('Redis client error', err);\n });\n\n await this.redisClient.connect();\n\n // Configure Redis memory policy\n await this.redisClient.configSet('maxmemory-policy', 'allkeys-lru');\n\n logger.info('Redis connected for hot tier storage');\n } catch (error: unknown) {\n logger.warn(\n 'Redis connection failed, falling back to SQLite only',\n error\n );\n }\n }\n\n // Initialize Railway S3-compatible buckets\n if (this.config.railwayBuckets.accessKeyId) {\n this.railwayS3 = new S3Client({\n endpoint: this.config.railwayBuckets.endpoint,\n region: this.config.railwayBuckets.region,\n credentials: {\n accessKeyId: this.config.railwayBuckets.accessKeyId,\n secretAccessKey: this.config.railwayBuckets.secretAccessKey,\n },\n forcePathStyle: true, // Required for Railway buckets\n });\n\n logger.info('Railway Buckets configured for warm tier');\n }\n\n // Initialize GCS for cold storage\n if (this.config.gcs.projectId) {\n try {\n this.gcsStorage = new Storage({\n projectId: this.config.gcs.projectId,\n keyFilename: this.config.gcs.keyFilename,\n });\n\n logger.info('GCS configured for cold tier storage');\n } catch (error: unknown) {\n logger.warn('GCS setup failed, will use Railway buckets only', error);\n }\n }\n }\n\n /**\n * Initialize database schema for tracking\n */\n private initializeSchema(): void {\n this.localDb.exec(`\n CREATE TABLE IF NOT EXISTS storage_tiers (\n trace_id TEXT PRIMARY KEY,\n tier TEXT NOT NULL,\n location TEXT NOT NULL,\n original_size INTEGER,\n compressed_size INTEGER,\n compression_ratio REAL,\n access_count INTEGER DEFAULT 0,\n last_accessed INTEGER,\n created_at INTEGER,\n migrated_at INTEGER,\n score REAL,\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_storage_tier ON storage_tiers(tier);\n CREATE INDEX IF NOT EXISTS idx_storage_created ON storage_tiers(created_at);\n CREATE INDEX IF NOT EXISTS idx_storage_accessed ON storage_tiers(last_accessed);\n `);\n }\n\n /**\n * Store a trace in the appropriate tier\n */\n async storeTrace(trace: Trace): Promise<StorageTier> {\n // Ensure clients are initialized\n await this.initialized;\n\n const score = trace.score;\n const age = Date.now() - trace.metadata.startTime;\n const ageHours = age / (1000 * 60 * 60);\n\n // Determine tier based on age and score\n let tier: StorageTier;\n if (\n ageHours < this.config.tiers.hotHours &&\n score > this.config.tiers.compressionScore\n ) {\n tier = StorageTier.HOT;\n } else if (ageHours < this.config.tiers.warmDays * 24) {\n tier = StorageTier.WARM;\n } else {\n tier = StorageTier.COLD;\n }\n\n // Store in appropriate tier\n switch (tier) {\n case StorageTier.HOT:\n await this.storeInRedis(trace);\n break;\n case StorageTier.WARM:\n await this.storeInRailwayBuckets(trace);\n break;\n case StorageTier.COLD:\n await this.storeInGCS(trace);\n break;\n }\n\n // Track in database\n this.trackStorage(trace.id, tier, trace);\n\n return tier;\n }\n\n /**\n * Store trace in Redis (hot tier)\n */\n private async storeInRedis(trace: Trace): Promise<void> {\n if (!this.redisClient) {\n // Fallback to local SQLite if Redis unavailable\n return;\n }\n\n try {\n const key = `trace:${trace.id}`;\n const data = JSON.stringify(trace);\n\n // Compress if large\n let storedData: string;\n if (data.length > 10000) {\n const compressed = await gzipAsync(data);\n storedData = compressed.toString('base64');\n await this.redisClient.hSet(key, {\n data: storedData,\n compressed: 'true',\n score: trace.score.toString(),\n type: trace.type,\n timestamp: trace.metadata.startTime.toString(),\n });\n } else {\n storedData = data;\n await this.redisClient.hSet(key, {\n data: storedData,\n compressed: 'false',\n score: trace.score.toString(),\n type: trace.type,\n timestamp: trace.metadata.startTime.toString(),\n });\n }\n\n // Set TTL\n await this.redisClient.expire(key, this.config.redis.ttlSeconds);\n\n // Add to sorted set for efficient retrieval\n await this.redisClient.zAdd('traces:by_score', {\n score: trace.score,\n value: trace.id,\n });\n\n await this.redisClient.zAdd('traces:by_time', {\n score: trace.metadata.startTime,\n value: trace.id,\n });\n\n logger.debug('Stored trace in Redis', {\n traceId: trace.id,\n size: data.length,\n compressed: data.length > 10000,\n });\n } catch (error: unknown) {\n logger.error('Failed to store in Redis', error);\n throw error;\n }\n }\n\n /**\n * Store trace in Railway Buckets (warm tier)\n */\n private async storeInRailwayBuckets(trace: Trace): Promise<void> {\n if (!this.railwayS3) {\n throw new Error('Railway Buckets not configured');\n }\n\n try {\n // Compress trace\n const data = JSON.stringify(trace);\n const compressed = await gzipAsync(data);\n\n // Generate key with date partitioning\n const date = new Date(trace.metadata.startTime);\n const key = `traces/${date.getFullYear()}/${String(date.getMonth() + 1).padStart(2, '0')}/${String(date.getDate()).padStart(2, '0')}/${trace.id}.json.gz`;\n\n // Upload to Railway Bucket\n const command = new PutObjectCommand({\n Bucket: this.config.railwayBuckets.bucket,\n Key: key,\n Body: compressed,\n ContentType: 'application/gzip',\n Metadata: {\n 'trace-id': trace.id,\n 'trace-type': trace.type,\n 'trace-score': trace.score.toString(),\n 'original-size': data.length.toString(),\n 'compressed-size': compressed.length.toString(),\n },\n });\n\n await this.railwayS3.send(command);\n\n // Remove from Redis if exists\n if (this.redisClient) {\n await this.redisClient.del(`trace:${trace.id}`);\n }\n\n logger.info('Stored trace in Railway Buckets', {\n traceId: trace.id,\n key,\n originalSize: data.length,\n compressedSize: compressed.length,\n compressionRatio: (1 - compressed.length / data.length).toFixed(2),\n });\n } catch (error: unknown) {\n logger.error('Failed to store in Railway Buckets', error);\n throw error;\n }\n }\n\n /**\n * Store trace in GCS (cold tier)\n */\n private async storeInGCS(trace: Trace): Promise<void> {\n if (!this.gcsStorage) {\n // Fallback to Railway Buckets if GCS not available\n return this.storeInRailwayBuckets(trace);\n }\n\n try {\n // Heavy compression for cold storage\n const minimal = this.createMinimalTrace(trace);\n const data = JSON.stringify(minimal);\n const compressed = await gzipAsync(data);\n\n // Generate key with year/month partitioning\n const date = new Date(trace.metadata.startTime);\n const key = `archive/${date.getFullYear()}/${String(date.getMonth() + 1).padStart(2, '0')}/${trace.id}.json.gz`;\n\n // Upload to GCS with Coldline storage class\n const bucket = this.gcsStorage.bucket(this.config.gcs.bucketName);\n const file = bucket.file(key);\n\n await file.save(compressed, {\n metadata: {\n contentType: 'application/gzip',\n metadata: {\n traceId: trace.id,\n traceType: trace.type,\n score: trace.score.toString(),\n originalTools: trace.tools.length.toString(),\n },\n },\n storageClass: 'COLDLINE', // Use Coldline for cost optimization\n });\n\n // Remove from warm tier if exists\n if (this.railwayS3) {\n try {\n const warmKey = this.getWarmTierKey(trace);\n await this.railwayS3.send(\n new DeleteObjectCommand({\n Bucket: this.config.railwayBuckets.bucket,\n Key: warmKey,\n })\n );\n } catch (error: unknown) {\n // Ignore deletion errors\n }\n }\n\n logger.info('Archived trace to GCS', {\n traceId: trace.id,\n key,\n originalSize: JSON.stringify(trace).length,\n compressedSize: compressed.length,\n });\n } catch (error: unknown) {\n logger.error('Failed to store in GCS', error);\n throw error;\n }\n }\n\n /**\n * Create minimal trace for cold storage\n */\n private createMinimalTrace(trace: Trace): any {\n // Keep only essential information\n return {\n id: trace.id,\n type: trace.type,\n score: trace.score,\n summary: trace.summary,\n metadata: {\n startTime: trace.metadata.startTime,\n endTime: trace.metadata.endTime,\n filesModified: trace.metadata.filesModified.length,\n errorsCount: trace.metadata.errorsEncountered.length,\n decisionsCount: trace.metadata.decisionsRecorded.length,\n causalChain: trace.metadata.causalChain,\n },\n toolSummary: {\n count: trace.tools.length,\n types: [...new Set(trace.tools.map((t: any) => t.tool))],\n firstTool: trace.tools[0]?.tool,\n lastTool: trace.tools[trace.tools.length - 1]?.tool,\n },\n compressed: trace.compressed,\n };\n }\n\n /**\n * Retrieve a trace from any tier\n */\n async retrieveTrace(traceId: string): Promise<Trace | null> {\n // Ensure clients are initialized\n await this.initialized;\n\n // Check tier location\n const location = this.localDb\n .prepare('SELECT tier, location FROM storage_tiers WHERE trace_id = ?')\n .get(traceId) as any;\n\n if (!location) {\n return null;\n }\n\n // Update access metrics\n this.localDb\n .prepare(\n 'UPDATE storage_tiers SET access_count = access_count + 1, last_accessed = ? WHERE trace_id = ?'\n )\n .run(Date.now(), traceId);\n\n // Retrieve based on tier\n switch (location.tier) {\n case StorageTier.HOT:\n return this.retrieveFromRedis(traceId);\n case StorageTier.WARM:\n return this.retrieveFromRailwayBuckets(traceId, location.location);\n case StorageTier.COLD:\n return this.retrieveFromGCS(traceId, location.location);\n default:\n return null;\n }\n }\n\n /**\n * Retrieve from Redis\n */\n private async retrieveFromRedis(traceId: string): Promise<Trace | null> {\n if (!this.redisClient) return null;\n\n try {\n const key = `trace:${traceId}`;\n const data = await this.redisClient.hGetAll(key);\n\n if (!data || !data.data) return null;\n\n let traceData: string;\n if (data.compressed === 'true') {\n const compressed = Buffer.from(data.data, 'base64');\n const decompressed = await gunzipAsync(compressed);\n traceData = decompressed.toString();\n } else {\n traceData = data.data;\n }\n\n return JSON.parse(traceData);\n } catch (error: unknown) {\n logger.error('Failed to retrieve from Redis', error);\n return null;\n }\n }\n\n /**\n * Retrieve from Railway Buckets\n */\n private async retrieveFromRailwayBuckets(\n traceId: string,\n key: string\n ): Promise<Trace | null> {\n if (!this.railwayS3) return null;\n\n try {\n const command = new GetObjectCommand({\n Bucket: this.config.railwayBuckets.bucket,\n Key: key,\n });\n\n const response = await this.railwayS3.send(command);\n const compressed = await response.Body?.transformToByteArray();\n\n if (!compressed) return null;\n\n const decompressed = await gunzipAsync(Buffer.from(compressed));\n return JSON.parse(decompressed.toString());\n } catch (error: unknown) {\n logger.error('Failed to retrieve from Railway Buckets', error);\n return null;\n }\n }\n\n /**\n * Retrieve from GCS\n */\n private async retrieveFromGCS(\n traceId: string,\n key: string\n ): Promise<Trace | null> {\n if (!this.gcsStorage) return null;\n\n try {\n const bucket = this.gcsStorage.bucket(this.config.gcs.bucketName);\n const file = bucket.file(key);\n\n const [compressed] = await file.download();\n const decompressed = await gunzipAsync(compressed);\n\n // Note: Returns minimal trace from cold storage\n return JSON.parse(decompressed.toString());\n } catch (error: unknown) {\n logger.error('Failed to retrieve from GCS', error);\n return null;\n }\n }\n\n /**\n * Track storage in database\n */\n private trackStorage(traceId: string, tier: StorageTier, trace: Trace): void {\n const originalSize = JSON.stringify(trace).length;\n const compressedSize = Math.floor(originalSize * 0.3); // Estimate\n\n this.localDb\n .prepare(\n `\n INSERT OR REPLACE INTO storage_tiers (\n trace_id, tier, location, original_size, compressed_size,\n compression_ratio, access_count, last_accessed, created_at,\n migrated_at, score\n ) VALUES (?, ?, ?, ?, ?, ?, 0, ?, ?, ?, ?)\n `\n )\n .run(\n traceId,\n tier,\n this.getStorageLocation(trace, tier),\n originalSize,\n compressedSize,\n 1 - compressedSize / originalSize,\n Date.now(),\n trace.metadata.startTime,\n Date.now(),\n trace.score\n );\n }\n\n /**\n * Get storage location key\n */\n private getStorageLocation(trace: Trace, tier: StorageTier): string {\n const date = new Date(trace.metadata.startTime);\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 switch (tier) {\n case StorageTier.HOT:\n return `redis:trace:${trace.id}`;\n case StorageTier.WARM:\n return `traces/${year}/${month}/${day}/${trace.id}.json.gz`;\n case StorageTier.COLD:\n return `archive/${year}/${month}/${trace.id}.json.gz`;\n }\n }\n\n /**\n * Get warm tier key for a trace\n */\n private getWarmTierKey(trace: Trace): string {\n const date = new Date(trace.metadata.startTime);\n return `traces/${date.getFullYear()}/${String(date.getMonth() + 1).padStart(2, '0')}/${String(date.getDate()).padStart(2, '0')}/${trace.id}.json.gz`;\n }\n\n /**\n * Migrate traces between tiers based on age\n */\n async migrateTiers(): Promise<{\n hotToWarm: number;\n warmToCold: number;\n errors: string[];\n }> {\n const results = {\n hotToWarm: 0,\n warmToCold: 0,\n errors: [] as string[],\n };\n\n const now = Date.now();\n\n // Find traces to migrate\n const candidates = this.localDb\n .prepare(\n `\n SELECT trace_id, tier, created_at, score\n FROM storage_tiers\n WHERE tier != 'cold'\n ORDER BY created_at ASC\n `\n )\n .all() as any[];\n\n for (const candidate of candidates) {\n const ageHours = (now - candidate.created_at) / (1000 * 60 * 60);\n\n try {\n if (\n candidate.tier === StorageTier.HOT &&\n ageHours > this.config.tiers.hotHours\n ) {\n // Migrate hot \u2192 warm\n const trace = await this.retrieveTrace(candidate.trace_id);\n if (trace) {\n await this.storeInRailwayBuckets(trace);\n this.trackStorage(candidate.trace_id, StorageTier.WARM, trace);\n results.hotToWarm++;\n }\n } else if (\n candidate.tier === StorageTier.WARM &&\n ageHours > this.config.tiers.warmDays * 24\n ) {\n // Migrate warm \u2192 cold\n const trace = await this.retrieveTrace(candidate.trace_id);\n if (trace) {\n await this.storeInGCS(trace);\n this.trackStorage(candidate.trace_id, StorageTier.COLD, trace);\n results.warmToCold++;\n }\n }\n } catch (error: unknown) {\n results.errors.push(\n `Failed to migrate ${candidate.trace_id}: ${error}`\n );\n }\n }\n\n logger.info('Tier migration completed', results);\n return results;\n }\n\n /**\n * Get storage statistics\n */\n getStorageStats(): any {\n const tierStats = this.localDb\n .prepare(\n `\n SELECT \n tier,\n COUNT(*) as count,\n SUM(original_size) as total_original,\n SUM(compressed_size) as total_compressed,\n AVG(compression_ratio) as avg_compression,\n AVG(access_count) as avg_access\n FROM storage_tiers\n GROUP BY tier\n `\n )\n .all();\n\n const ageDistribution = this.localDb\n .prepare(\n `\n SELECT \n CASE \n WHEN (? - created_at) / 3600000 < 24 THEN '< 24h'\n WHEN (? - created_at) / 86400000 < 7 THEN '1-7d'\n WHEN (? - created_at) / 86400000 < 30 THEN '7-30d'\n ELSE '30d+'\n END as age_group,\n COUNT(*) as count\n FROM storage_tiers\n GROUP BY age_group\n `\n )\n .all(Date.now(), Date.now(), Date.now());\n\n return {\n byTier: tierStats,\n byAge: ageDistribution,\n totalTraces: tierStats.reduce((sum: number, t: any) => sum + t.count, 0),\n totalSize: tierStats.reduce(\n (sum: number, t: any) => sum + t.total_original,\n 0\n ),\n compressedSize: tierStats.reduce(\n (sum: number, t: any) => sum + t.total_compressed,\n 0\n ),\n };\n }\n\n /**\n * Clean up expired data\n */\n async cleanup(): Promise<number> {\n let cleaned = 0;\n\n // Remove old entries from storage_tiers table\n const cutoff = Date.now() - 90 * 24 * 60 * 60 * 1000; // 90 days\n\n const result = this.localDb\n .prepare(\n `\n DELETE FROM storage_tiers\n WHERE tier = 'cold' AND created_at < ? AND access_count = 0\n `\n )\n .run(cutoff);\n\n cleaned = result.changes;\n\n logger.info('Cleanup completed', { removed: cleaned });\n return cleaned;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["StorageTier"]
|
|
7
|
-
}
|