@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,360 +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 { Command } from "commander";
|
|
6
|
-
import chalk from "chalk";
|
|
7
|
-
import ora from "ora";
|
|
8
|
-
import Database from "better-sqlite3";
|
|
9
|
-
import { join } from "path";
|
|
10
|
-
import { existsSync } from "fs";
|
|
11
|
-
import { RailwayOptimizedStorage } from "../../core/storage/railway-optimized-storage.js";
|
|
12
|
-
import { ConfigManager } from "../../core/config/config-manager.js";
|
|
13
|
-
import { formatBytes, formatDuration } from "../../utils/formatting.js";
|
|
14
|
-
function getEnv(key, defaultValue) {
|
|
15
|
-
const value = process.env[key];
|
|
16
|
-
if (value === void 0) {
|
|
17
|
-
if (defaultValue !== void 0) return defaultValue;
|
|
18
|
-
throw new Error(`Environment variable ${key} is required`);
|
|
19
|
-
}
|
|
20
|
-
return value;
|
|
21
|
-
}
|
|
22
|
-
function getOptionalEnv(key) {
|
|
23
|
-
return process.env[key];
|
|
24
|
-
}
|
|
25
|
-
function createStorageCommand() {
|
|
26
|
-
const storage = new Command("storage").description(
|
|
27
|
-
"Manage 3-tier storage system (Redis/Railway/GCS)"
|
|
28
|
-
);
|
|
29
|
-
storage.command("status").description("Show storage tier statistics").option("-v, --verbose", "Show detailed statistics").action(async (options) => {
|
|
30
|
-
const spinner = ora("Loading storage statistics...").start();
|
|
31
|
-
try {
|
|
32
|
-
const dbPath = join(process.cwd(), ".stackmemory", "context.db");
|
|
33
|
-
if (!existsSync(dbPath)) {
|
|
34
|
-
spinner.fail("StackMemory not initialized in this directory");
|
|
35
|
-
process.exit(1);
|
|
36
|
-
}
|
|
37
|
-
const db = new Database(dbPath);
|
|
38
|
-
const configManager = new ConfigManager();
|
|
39
|
-
const storage2 = new RailwayOptimizedStorage(db, configManager);
|
|
40
|
-
const stats = storage2.getStorageStats();
|
|
41
|
-
spinner.succeed("Storage statistics loaded");
|
|
42
|
-
console.log(chalk.blue("\n\u{1F4CA} Storage Tier Distribution:"));
|
|
43
|
-
console.log(chalk.gray("\u2501".repeat(50)));
|
|
44
|
-
for (const tier of stats.byTier) {
|
|
45
|
-
const icon = tier.tier === "hot" ? "\u{1F525}" : tier.tier === "warm" ? "\u2601\uFE0F" : "\u2744\uFE0F";
|
|
46
|
-
const color = tier.tier === "hot" ? chalk.red : tier.tier === "warm" ? chalk.yellow : chalk.cyan;
|
|
47
|
-
console.log(`
|
|
48
|
-
${icon} ${color(tier.tier.toUpperCase())} Tier:`);
|
|
49
|
-
console.log(` Traces: ${chalk.white(tier.count)}`);
|
|
50
|
-
console.log(
|
|
51
|
-
` Original Size: ${chalk.white(formatBytes(tier.total_original || 0))}`
|
|
52
|
-
);
|
|
53
|
-
console.log(
|
|
54
|
-
` Compressed Size: ${chalk.white(formatBytes(tier.total_compressed || 0))}`
|
|
55
|
-
);
|
|
56
|
-
console.log(
|
|
57
|
-
` Compression Ratio: ${chalk.green((tier.avg_compression * 100).toFixed(1) + "%")}`
|
|
58
|
-
);
|
|
59
|
-
console.log(
|
|
60
|
-
` Avg Access Count: ${chalk.white(tier.avg_access?.toFixed(1) || "0")}`
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
console.log(chalk.blue("\n\u{1F4C5} Age Distribution:"));
|
|
64
|
-
console.log(chalk.gray("\u2501".repeat(50)));
|
|
65
|
-
for (const age of stats.byAge) {
|
|
66
|
-
const percent = (age.count / stats.totalTraces * 100).toFixed(1);
|
|
67
|
-
const bar = "\u2588".repeat(Math.floor(percent / 2));
|
|
68
|
-
console.log(
|
|
69
|
-
` ${age.age_group.padEnd(10)} ${bar} ${percent}% (${age.count})`
|
|
70
|
-
);
|
|
71
|
-
}
|
|
72
|
-
console.log(chalk.blue("\n\u{1F4C8} Summary:"));
|
|
73
|
-
console.log(chalk.gray("\u2501".repeat(50)));
|
|
74
|
-
console.log(` Total Traces: ${chalk.white(stats.totalTraces)}`);
|
|
75
|
-
console.log(
|
|
76
|
-
` Total Size: ${chalk.white(formatBytes(stats.totalSize))}`
|
|
77
|
-
);
|
|
78
|
-
console.log(
|
|
79
|
-
` Compressed Size: ${chalk.white(formatBytes(stats.compressedSize))}`
|
|
80
|
-
);
|
|
81
|
-
const compressionRatio = ((1 - stats.compressedSize / stats.totalSize) * 100).toFixed(1);
|
|
82
|
-
console.log(
|
|
83
|
-
` Overall Compression: ${chalk.green(compressionRatio + "%")}`
|
|
84
|
-
);
|
|
85
|
-
const costEstimate = calculateStorageCost(stats);
|
|
86
|
-
console.log(chalk.blue("\n\u{1F4B0} Estimated Monthly Cost:"));
|
|
87
|
-
console.log(chalk.gray("\u2501".repeat(50)));
|
|
88
|
-
console.log(
|
|
89
|
-
` Redis (Hot): ${chalk.green("$0.00")} (included with Railway)`
|
|
90
|
-
);
|
|
91
|
-
console.log(
|
|
92
|
-
` Railway Buckets (Warm): ${chalk.yellow(costEstimate.railway)}`
|
|
93
|
-
);
|
|
94
|
-
console.log(` GCS Coldline (Cold): ${chalk.cyan(costEstimate.gcs)}`);
|
|
95
|
-
console.log(` Total: ${chalk.white(costEstimate.total)}`);
|
|
96
|
-
if (options.verbose) {
|
|
97
|
-
const recentMigrations = db.prepare(
|
|
98
|
-
`
|
|
99
|
-
SELECT trace_id, tier, migrated_at, score
|
|
100
|
-
FROM storage_tiers
|
|
101
|
-
WHERE migrated_at > ?
|
|
102
|
-
ORDER BY migrated_at DESC
|
|
103
|
-
LIMIT 10
|
|
104
|
-
`
|
|
105
|
-
).all(Date.now() - 24 * 60 * 60 * 1e3);
|
|
106
|
-
if (recentMigrations.length > 0) {
|
|
107
|
-
console.log(chalk.blue("\n\u{1F504} Recent Migrations (last 24h):"));
|
|
108
|
-
console.log(chalk.gray("\u2501".repeat(50)));
|
|
109
|
-
for (const m of recentMigrations) {
|
|
110
|
-
const time = new Date(m.migrated_at).toLocaleTimeString();
|
|
111
|
-
console.log(
|
|
112
|
-
` ${time} - ${m.trace_id.substring(0, 8)}... \u2192 ${m.tier} (score: ${m.score.toFixed(2)})`
|
|
113
|
-
);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
db.close();
|
|
118
|
-
} catch (error) {
|
|
119
|
-
spinner.fail("Failed to load storage statistics");
|
|
120
|
-
console.error(error);
|
|
121
|
-
process.exit(1);
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
storage.command("migrate").description("Migrate traces between storage tiers").option("--dry-run", "Show what would be migrated without doing it").option("--force", "Force migration regardless of age").action(async (options) => {
|
|
125
|
-
const spinner = ora("Checking for traces to migrate...").start();
|
|
126
|
-
try {
|
|
127
|
-
const dbPath = join(process.cwd(), ".stackmemory", "context.db");
|
|
128
|
-
const db = new Database(dbPath);
|
|
129
|
-
const configManager = new ConfigManager();
|
|
130
|
-
const storage2 = new RailwayOptimizedStorage(db, configManager);
|
|
131
|
-
if (options.dryRun) {
|
|
132
|
-
const candidates = db.prepare(
|
|
133
|
-
`
|
|
134
|
-
SELECT trace_id, tier, created_at, score,
|
|
135
|
-
(? - created_at) / 3600000 as age_hours
|
|
136
|
-
FROM storage_tiers
|
|
137
|
-
WHERE tier != 'cold'
|
|
138
|
-
ORDER BY created_at ASC
|
|
139
|
-
`
|
|
140
|
-
).all(Date.now());
|
|
141
|
-
const toMigrate = {
|
|
142
|
-
hotToWarm: candidates.filter(
|
|
143
|
-
(c) => c.tier === "hot" && c.age_hours > 24
|
|
144
|
-
),
|
|
145
|
-
warmToCold: candidates.filter(
|
|
146
|
-
(c) => c.tier === "warm" && c.age_hours > 720
|
|
147
|
-
)
|
|
148
|
-
};
|
|
149
|
-
spinner.info("Dry run - no changes will be made");
|
|
150
|
-
console.log(chalk.blue("\n\u{1F504} Migration Plan:"));
|
|
151
|
-
console.log(chalk.gray("\u2501".repeat(50)));
|
|
152
|
-
if (toMigrate.hotToWarm.length > 0) {
|
|
153
|
-
console.log(
|
|
154
|
-
chalk.red(
|
|
155
|
-
`
|
|
156
|
-
\u{1F525} \u2192 \u2601\uFE0F Hot to Warm: ${toMigrate.hotToWarm.length} traces`
|
|
157
|
-
)
|
|
158
|
-
);
|
|
159
|
-
for (const t of toMigrate.hotToWarm.slice(0, 5)) {
|
|
160
|
-
console.log(
|
|
161
|
-
` \u2022 ${t.trace_id.substring(0, 8)}... (${t.age_hours.toFixed(0)}h old, score: ${t.score.toFixed(2)})`
|
|
162
|
-
);
|
|
163
|
-
}
|
|
164
|
-
if (toMigrate.hotToWarm.length > 5) {
|
|
165
|
-
console.log(` ... and ${toMigrate.hotToWarm.length - 5} more`);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
if (toMigrate.warmToCold.length > 0) {
|
|
169
|
-
console.log(
|
|
170
|
-
chalk.yellow(
|
|
171
|
-
`
|
|
172
|
-
\u2601\uFE0F \u2192 \u2744\uFE0F Warm to Cold: ${toMigrate.warmToCold.length} traces`
|
|
173
|
-
)
|
|
174
|
-
);
|
|
175
|
-
for (const t of toMigrate.warmToCold.slice(0, 5)) {
|
|
176
|
-
const ageDays = Math.floor(t.age_hours / 24);
|
|
177
|
-
console.log(
|
|
178
|
-
` \u2022 ${t.trace_id.substring(0, 8)}... (${ageDays}d old, score: ${t.score.toFixed(2)})`
|
|
179
|
-
);
|
|
180
|
-
}
|
|
181
|
-
if (toMigrate.warmToCold.length > 5) {
|
|
182
|
-
console.log(` ... and ${toMigrate.warmToCold.length - 5} more`);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
if (toMigrate.hotToWarm.length === 0 && toMigrate.warmToCold.length === 0) {
|
|
186
|
-
console.log(chalk.green("\u2713 No traces need migration"));
|
|
187
|
-
}
|
|
188
|
-
} else {
|
|
189
|
-
spinner.text = "Migrating traces between tiers...";
|
|
190
|
-
const results = await storage2.migrateTiers();
|
|
191
|
-
spinner.succeed("Migration completed");
|
|
192
|
-
console.log(chalk.blue("\n\u2705 Migration Results:"));
|
|
193
|
-
console.log(chalk.gray("\u2501".repeat(50)));
|
|
194
|
-
console.log(
|
|
195
|
-
` Hot \u2192 Warm: ${chalk.yellow(results.hotToWarm)} traces`
|
|
196
|
-
);
|
|
197
|
-
console.log(
|
|
198
|
-
` Warm \u2192 Cold: ${chalk.cyan(results.warmToCold)} traces`
|
|
199
|
-
);
|
|
200
|
-
if (results.errors.length > 0) {
|
|
201
|
-
console.log(chalk.red(`
|
|
202
|
-
\u274C Errors (${results.errors.length}):`));
|
|
203
|
-
for (const error of results.errors.slice(0, 5)) {
|
|
204
|
-
console.log(` \u2022 ${error}`);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
db.close();
|
|
209
|
-
} catch (error) {
|
|
210
|
-
spinner.fail("Migration failed");
|
|
211
|
-
console.error(error);
|
|
212
|
-
process.exit(1);
|
|
213
|
-
}
|
|
214
|
-
});
|
|
215
|
-
storage.command("cleanup").description("Clean up old traces from cold storage").option("--days <number>", "Remove traces older than N days", parseInt, 90).option("--dry-run", "Show what would be removed without doing it").action(async (options) => {
|
|
216
|
-
const spinner = ora("Analyzing storage for cleanup...").start();
|
|
217
|
-
try {
|
|
218
|
-
const dbPath = join(process.cwd(), ".stackmemory", "context.db");
|
|
219
|
-
const db = new Database(dbPath);
|
|
220
|
-
const configManager = new ConfigManager();
|
|
221
|
-
const storage2 = new RailwayOptimizedStorage(db, configManager);
|
|
222
|
-
const cutoff = Date.now() - options.days * 24 * 60 * 60 * 1e3;
|
|
223
|
-
if (options.dryRun) {
|
|
224
|
-
const toRemove = db.prepare(
|
|
225
|
-
`
|
|
226
|
-
SELECT COUNT(*) as count, SUM(compressed_size) as size
|
|
227
|
-
FROM storage_tiers
|
|
228
|
-
WHERE tier = 'cold' AND created_at < ? AND access_count = 0
|
|
229
|
-
`
|
|
230
|
-
).get(cutoff);
|
|
231
|
-
spinner.info("Dry run - no traces will be removed");
|
|
232
|
-
console.log(chalk.blue("\n\u{1F9F9} Cleanup Analysis:"));
|
|
233
|
-
console.log(chalk.gray("\u2501".repeat(50)));
|
|
234
|
-
console.log(` Traces to remove: ${chalk.red(toRemove.count || 0)}`);
|
|
235
|
-
console.log(
|
|
236
|
-
` Space to free: ${chalk.yellow(formatBytes(toRemove.size || 0))}`
|
|
237
|
-
);
|
|
238
|
-
console.log(` Criteria: > ${options.days} days old with 0 access`);
|
|
239
|
-
} else {
|
|
240
|
-
const removed = await storage2.cleanup();
|
|
241
|
-
spinner.succeed(`Cleanup completed - removed ${removed} traces`);
|
|
242
|
-
}
|
|
243
|
-
db.close();
|
|
244
|
-
} catch (error) {
|
|
245
|
-
spinner.fail("Cleanup failed");
|
|
246
|
-
console.error(error);
|
|
247
|
-
process.exit(1);
|
|
248
|
-
}
|
|
249
|
-
});
|
|
250
|
-
storage.command("retrieve <traceId>").description("Retrieve a trace from any storage tier").action(async (traceId) => {
|
|
251
|
-
const spinner = ora(`Retrieving trace ${traceId}...`).start();
|
|
252
|
-
try {
|
|
253
|
-
const dbPath = join(process.cwd(), ".stackmemory", "context.db");
|
|
254
|
-
const db = new Database(dbPath);
|
|
255
|
-
const configManager = new ConfigManager();
|
|
256
|
-
const storage2 = new RailwayOptimizedStorage(db, configManager);
|
|
257
|
-
const trace = await storage2.retrieveTrace(traceId);
|
|
258
|
-
if (!trace) {
|
|
259
|
-
spinner.fail(`Trace ${traceId} not found`);
|
|
260
|
-
process.exit(1);
|
|
261
|
-
}
|
|
262
|
-
spinner.succeed("Trace retrieved");
|
|
263
|
-
console.log(chalk.blue("\n\u{1F4E6} Trace Details:"));
|
|
264
|
-
console.log(chalk.gray("\u2501".repeat(50)));
|
|
265
|
-
console.log(` ID: ${chalk.cyan(trace.id)}`);
|
|
266
|
-
console.log(` Type: ${chalk.yellow(trace.type)}`);
|
|
267
|
-
console.log(` Score: ${chalk.green(trace.score.toFixed(3))}`);
|
|
268
|
-
console.log(` Summary: ${trace.summary}`);
|
|
269
|
-
console.log(
|
|
270
|
-
` Tools: ${trace.tools?.length || trace.toolSummary?.count || 0}`
|
|
271
|
-
);
|
|
272
|
-
const metadata = trace.metadata;
|
|
273
|
-
if (metadata) {
|
|
274
|
-
console.log(chalk.blue("\n\u{1F4CB} Metadata:"));
|
|
275
|
-
console.log(
|
|
276
|
-
` Start: ${new Date(metadata.startTime).toLocaleString()}`
|
|
277
|
-
);
|
|
278
|
-
console.log(
|
|
279
|
-
` Duration: ${formatDuration(metadata.endTime - metadata.startTime)}`
|
|
280
|
-
);
|
|
281
|
-
console.log(
|
|
282
|
-
` Files: ${metadata.filesModified?.length || metadata.filesModified || 0}`
|
|
283
|
-
);
|
|
284
|
-
console.log(
|
|
285
|
-
` Errors: ${metadata.errorsEncountered?.length || metadata.errorsCount || 0}`
|
|
286
|
-
);
|
|
287
|
-
}
|
|
288
|
-
const location = db.prepare(
|
|
289
|
-
"SELECT tier, location, access_count FROM storage_tiers WHERE trace_id = ?"
|
|
290
|
-
).get(traceId);
|
|
291
|
-
if (location) {
|
|
292
|
-
const tierIcon = location.tier === "hot" ? "\u{1F525}" : location.tier === "warm" ? "\u2601\uFE0F" : "\u2744\uFE0F";
|
|
293
|
-
console.log(chalk.blue("\n\u{1F4BE} Storage:"));
|
|
294
|
-
console.log(` Tier: ${tierIcon} ${location.tier}`);
|
|
295
|
-
console.log(` Access Count: ${location.access_count}`);
|
|
296
|
-
}
|
|
297
|
-
db.close();
|
|
298
|
-
} catch (error) {
|
|
299
|
-
spinner.fail("Failed to retrieve trace");
|
|
300
|
-
console.error(error);
|
|
301
|
-
process.exit(1);
|
|
302
|
-
}
|
|
303
|
-
});
|
|
304
|
-
storage.command("config").description("Show storage configuration").action(async () => {
|
|
305
|
-
console.log(chalk.blue("\n\u2699\uFE0F Storage Configuration:"));
|
|
306
|
-
console.log(chalk.gray("\u2501".repeat(50)));
|
|
307
|
-
console.log(chalk.red("\n\u{1F525} Hot Tier (Redis):"));
|
|
308
|
-
console.log(
|
|
309
|
-
` URL: ${process.env["REDIS_URL"] ? chalk.green("Configured") : chalk.yellow("Not configured")}`
|
|
310
|
-
);
|
|
311
|
-
console.log(` TTL: 24 hours`);
|
|
312
|
-
console.log(` Max Memory: 100MB`);
|
|
313
|
-
console.log(chalk.yellow("\n\u2601\uFE0F Warm Tier (Railway Buckets):"));
|
|
314
|
-
console.log(
|
|
315
|
-
` Endpoint: ${process.env["RAILWAY_BUCKET_ENDPOINT"] || "Not configured"}`
|
|
316
|
-
);
|
|
317
|
-
console.log(
|
|
318
|
-
` Bucket: ${process.env["RAILWAY_BUCKET_NAME"] || "stackmemory-warm"}`
|
|
319
|
-
);
|
|
320
|
-
console.log(
|
|
321
|
-
` Access Key: ${process.env["RAILWAY_BUCKET_ACCESS_KEY"] ? chalk.green("Set") : chalk.yellow("Not set")}`
|
|
322
|
-
);
|
|
323
|
-
console.log(` Retention: 30 days`);
|
|
324
|
-
console.log(chalk.cyan("\n\u2744\uFE0F Cold Tier (GCS):"));
|
|
325
|
-
console.log(
|
|
326
|
-
` Project: ${process.env["GCP_PROJECT_ID"] || "Not configured"}`
|
|
327
|
-
);
|
|
328
|
-
console.log(
|
|
329
|
-
` Bucket: ${process.env["GCS_BUCKET"] || "stackmemory-cold"}`
|
|
330
|
-
);
|
|
331
|
-
console.log(
|
|
332
|
-
` Key File: ${process.env["GCP_KEY_FILE"] ? chalk.green("Set") : chalk.yellow("Not set")}`
|
|
333
|
-
);
|
|
334
|
-
console.log(` Storage Class: Coldline`);
|
|
335
|
-
console.log(` Retention: Infinite`);
|
|
336
|
-
console.log(chalk.blue("\n\u{1F4CA} Migration Thresholds:"));
|
|
337
|
-
console.log(` Hot \u2192 Warm: After 24 hours`);
|
|
338
|
-
console.log(` Warm \u2192 Cold: After 30 days`);
|
|
339
|
-
console.log(` Low Score Migration: < 0.4 score`);
|
|
340
|
-
});
|
|
341
|
-
return storage;
|
|
342
|
-
}
|
|
343
|
-
function calculateStorageCost(stats) {
|
|
344
|
-
const warmTier = stats.byTier.find((t) => t.tier === "warm");
|
|
345
|
-
const coldTier = stats.byTier.find((t) => t.tier === "cold");
|
|
346
|
-
const warmGB = (warmTier?.total_compressed || 0) / (1024 * 1024 * 1024);
|
|
347
|
-
const coldGB = (coldTier?.total_compressed || 0) / (1024 * 1024 * 1024);
|
|
348
|
-
const railwayCost = warmGB * 0.02;
|
|
349
|
-
const gcsCost = coldGB * 4e-3;
|
|
350
|
-
const totalCost = railwayCost + gcsCost;
|
|
351
|
-
return {
|
|
352
|
-
railway: `$${railwayCost.toFixed(2)}`,
|
|
353
|
-
gcs: `$${gcsCost.toFixed(2)}`,
|
|
354
|
-
total: `$${totalCost.toFixed(2)}`
|
|
355
|
-
};
|
|
356
|
-
}
|
|
357
|
-
export {
|
|
358
|
-
createStorageCommand
|
|
359
|
-
};
|
|
360
|
-
//# sourceMappingURL=storage.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/cli/commands/storage.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Storage management commands for StackMemory\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport { RailwayOptimizedStorage } from '../../core/storage/railway-optimized-storage.js';\nimport { ConfigManager } from '../../core/config/config-manager.js';\nimport { formatBytes, formatDuration } from '../../utils/formatting.js';\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 function createStorageCommand(): Command {\n const storage = new Command('storage').description(\n 'Manage 3-tier storage system (Redis/Railway/GCS)'\n );\n\n storage\n .command('status')\n .description('Show storage tier statistics')\n .option('-v, --verbose', 'Show detailed statistics')\n .action(async (options) => {\n const spinner = ora('Loading storage statistics...').start();\n\n try {\n const dbPath = join(process.cwd(), '.stackmemory', 'context.db');\n if (!existsSync(dbPath)) {\n spinner.fail('StackMemory not initialized in this directory');\n process.exit(1);\n }\n\n const db = new Database(dbPath);\n const configManager = new ConfigManager();\n const storage = new RailwayOptimizedStorage(db, configManager);\n\n const stats = storage.getStorageStats();\n spinner.succeed('Storage statistics loaded');\n\n console.log(chalk.blue('\\n\uD83D\uDCCA Storage Tier Distribution:'));\n console.log(chalk.gray('\u2501'.repeat(50)));\n\n // Tier statistics\n for (const tier of stats.byTier) {\n const icon =\n tier.tier === 'hot' ? '\uD83D\uDD25' : tier.tier === 'warm' ? '\u2601\uFE0F' : '\u2744\uFE0F';\n const color =\n tier.tier === 'hot'\n ? chalk.red\n : tier.tier === 'warm'\n ? chalk.yellow\n : chalk.cyan;\n\n console.log(`\\n${icon} ${color(tier.tier.toUpperCase())} Tier:`);\n console.log(` Traces: ${chalk.white(tier.count)}`);\n console.log(\n ` Original Size: ${chalk.white(formatBytes(tier.total_original || 0))}`\n );\n console.log(\n ` Compressed Size: ${chalk.white(formatBytes(tier.total_compressed || 0))}`\n );\n console.log(\n ` Compression Ratio: ${chalk.green((tier.avg_compression * 100).toFixed(1) + '%')}`\n );\n console.log(\n ` Avg Access Count: ${chalk.white(tier.avg_access?.toFixed(1) || '0')}`\n );\n }\n\n // Age distribution\n console.log(chalk.blue('\\n\uD83D\uDCC5 Age Distribution:'));\n console.log(chalk.gray('\u2501'.repeat(50)));\n for (const age of stats.byAge) {\n const percent = ((age.count / stats.totalTraces) * 100).toFixed(1);\n const bar = '\u2588'.repeat(Math.floor(percent / 2));\n console.log(\n ` ${age.age_group.padEnd(10)} ${bar} ${percent}% (${age.count})`\n );\n }\n\n // Summary\n console.log(chalk.blue('\\n\uD83D\uDCC8 Summary:'));\n console.log(chalk.gray('\u2501'.repeat(50)));\n console.log(` Total Traces: ${chalk.white(stats.totalTraces)}`);\n console.log(\n ` Total Size: ${chalk.white(formatBytes(stats.totalSize))}`\n );\n console.log(\n ` Compressed Size: ${chalk.white(formatBytes(stats.compressedSize))}`\n );\n\n const compressionRatio = (\n (1 - stats.compressedSize / stats.totalSize) *\n 100\n ).toFixed(1);\n console.log(\n ` Overall Compression: ${chalk.green(compressionRatio + '%')}`\n );\n\n // Cost estimation\n const costEstimate = calculateStorageCost(stats);\n console.log(chalk.blue('\\n\uD83D\uDCB0 Estimated Monthly Cost:'));\n console.log(chalk.gray('\u2501'.repeat(50)));\n console.log(\n ` Redis (Hot): ${chalk.green('$0.00')} (included with Railway)`\n );\n console.log(\n ` Railway Buckets (Warm): ${chalk.yellow(costEstimate.railway)}`\n );\n console.log(` GCS Coldline (Cold): ${chalk.cyan(costEstimate.gcs)}`);\n console.log(` Total: ${chalk.white(costEstimate.total)}`);\n\n if (options.verbose) {\n // Show recent migrations\n const recentMigrations = db\n .prepare(\n `\n SELECT trace_id, tier, migrated_at, score\n FROM storage_tiers\n WHERE migrated_at > ?\n ORDER BY migrated_at DESC\n LIMIT 10\n `\n )\n .all(Date.now() - 24 * 60 * 60 * 1000) as any[];\n\n if (recentMigrations.length > 0) {\n console.log(chalk.blue('\\n\uD83D\uDD04 Recent Migrations (last 24h):'));\n console.log(chalk.gray('\u2501'.repeat(50)));\n for (const m of recentMigrations) {\n const time = new Date(m.migrated_at).toLocaleTimeString();\n console.log(\n ` ${time} - ${m.trace_id.substring(0, 8)}... \u2192 ${m.tier} (score: ${m.score.toFixed(2)})`\n );\n }\n }\n }\n\n db.close();\n } catch (error: unknown) {\n spinner.fail('Failed to load storage statistics');\n console.error(error);\n process.exit(1);\n }\n });\n\n storage\n .command('migrate')\n .description('Migrate traces between storage tiers')\n .option('--dry-run', 'Show what would be migrated without doing it')\n .option('--force', 'Force migration regardless of age')\n .action(async (options) => {\n const spinner = ora('Checking for traces to migrate...').start();\n\n try {\n const dbPath = join(process.cwd(), '.stackmemory', 'context.db');\n const db = new Database(dbPath);\n const configManager = new ConfigManager();\n const storage = new RailwayOptimizedStorage(db, configManager);\n\n if (options.dryRun) {\n // Analyze what would be migrated\n const candidates = db\n .prepare(\n `\n SELECT trace_id, tier, created_at, score,\n (? - created_at) / 3600000 as age_hours\n FROM storage_tiers\n WHERE tier != 'cold'\n ORDER BY created_at ASC\n `\n )\n .all(Date.now()) as any[];\n\n const toMigrate = {\n hotToWarm: candidates.filter(\n (c: any) => c.tier === 'hot' && c.age_hours > 24\n ),\n warmToCold: candidates.filter(\n (c: any) => c.tier === 'warm' && c.age_hours > 720\n ),\n };\n\n spinner.info('Dry run - no changes will be made');\n\n console.log(chalk.blue('\\n\uD83D\uDD04 Migration Plan:'));\n console.log(chalk.gray('\u2501'.repeat(50)));\n\n if (toMigrate.hotToWarm.length > 0) {\n console.log(\n chalk.red(\n `\\n\uD83D\uDD25 \u2192 \u2601\uFE0F Hot to Warm: ${toMigrate.hotToWarm.length} traces`\n )\n );\n for (const t of toMigrate.hotToWarm.slice(0, 5)) {\n console.log(\n ` \u2022 ${t.trace_id.substring(0, 8)}... (${t.age_hours.toFixed(0)}h old, score: ${t.score.toFixed(2)})`\n );\n }\n if (toMigrate.hotToWarm.length > 5) {\n console.log(` ... and ${toMigrate.hotToWarm.length - 5} more`);\n }\n }\n\n if (toMigrate.warmToCold.length > 0) {\n console.log(\n chalk.yellow(\n `\\n\u2601\uFE0F \u2192 \u2744\uFE0F Warm to Cold: ${toMigrate.warmToCold.length} traces`\n )\n );\n for (const t of toMigrate.warmToCold.slice(0, 5)) {\n const ageDays = Math.floor(t.age_hours / 24);\n console.log(\n ` \u2022 ${t.trace_id.substring(0, 8)}... (${ageDays}d old, score: ${t.score.toFixed(2)})`\n );\n }\n if (toMigrate.warmToCold.length > 5) {\n console.log(` ... and ${toMigrate.warmToCold.length - 5} more`);\n }\n }\n\n if (\n toMigrate.hotToWarm.length === 0 &&\n toMigrate.warmToCold.length === 0\n ) {\n console.log(chalk.green('\u2713 No traces need migration'));\n }\n } else {\n // Perform actual migration\n spinner.text = 'Migrating traces between tiers...';\n const results = await storage.migrateTiers();\n\n spinner.succeed('Migration completed');\n\n console.log(chalk.blue('\\n\u2705 Migration Results:'));\n console.log(chalk.gray('\u2501'.repeat(50)));\n console.log(\n ` Hot \u2192 Warm: ${chalk.yellow(results.hotToWarm)} traces`\n );\n console.log(\n ` Warm \u2192 Cold: ${chalk.cyan(results.warmToCold)} traces`\n );\n\n if (results.errors.length > 0) {\n console.log(chalk.red(`\\n\u274C Errors (${results.errors.length}):`));\n for (const error of results.errors.slice(0, 5)) {\n console.log(` \u2022 ${error}`);\n }\n }\n }\n\n db.close();\n } catch (error: unknown) {\n spinner.fail('Migration failed');\n console.error(error);\n process.exit(1);\n }\n });\n\n storage\n .command('cleanup')\n .description('Clean up old traces from cold storage')\n .option('--days <number>', 'Remove traces older than N days', parseInt, 90)\n .option('--dry-run', 'Show what would be removed without doing it')\n .action(async (options) => {\n const spinner = ora('Analyzing storage for cleanup...').start();\n\n try {\n const dbPath = join(process.cwd(), '.stackmemory', 'context.db');\n const db = new Database(dbPath);\n const configManager = new ConfigManager();\n const storage = new RailwayOptimizedStorage(db, configManager);\n\n const cutoff = Date.now() - options.days * 24 * 60 * 60 * 1000;\n\n if (options.dryRun) {\n const toRemove = db\n .prepare(\n `\n SELECT COUNT(*) as count, SUM(compressed_size) as size\n FROM storage_tiers\n WHERE tier = 'cold' AND created_at < ? AND access_count = 0\n `\n )\n .get(cutoff) as any;\n\n spinner.info('Dry run - no traces will be removed');\n\n console.log(chalk.blue('\\n\uD83E\uDDF9 Cleanup Analysis:'));\n console.log(chalk.gray('\u2501'.repeat(50)));\n console.log(` Traces to remove: ${chalk.red(toRemove.count || 0)}`);\n console.log(\n ` Space to free: ${chalk.yellow(formatBytes(toRemove.size || 0))}`\n );\n console.log(` Criteria: > ${options.days} days old with 0 access`);\n } else {\n const removed = await storage.cleanup();\n spinner.succeed(`Cleanup completed - removed ${removed} traces`);\n }\n\n db.close();\n } catch (error: unknown) {\n spinner.fail('Cleanup failed');\n console.error(error);\n process.exit(1);\n }\n });\n\n storage\n .command('retrieve <traceId>')\n .description('Retrieve a trace from any storage tier')\n .action(async (traceId) => {\n const spinner = ora(`Retrieving trace ${traceId}...`).start();\n\n try {\n const dbPath = join(process.cwd(), '.stackmemory', 'context.db');\n const db = new Database(dbPath);\n const configManager = new ConfigManager();\n const storage = new RailwayOptimizedStorage(db, configManager);\n\n const trace = await storage.retrieveTrace(traceId);\n\n if (!trace) {\n spinner.fail(`Trace ${traceId} not found`);\n process.exit(1);\n }\n\n spinner.succeed('Trace retrieved');\n\n console.log(chalk.blue('\\n\uD83D\uDCE6 Trace Details:'));\n console.log(chalk.gray('\u2501'.repeat(50)));\n console.log(` ID: ${chalk.cyan(trace.id)}`);\n console.log(` Type: ${chalk.yellow(trace.type)}`);\n console.log(` Score: ${chalk.green(trace.score.toFixed(3))}`);\n console.log(` Summary: ${trace.summary}`);\n console.log(\n ` Tools: ${trace.tools?.length || trace.toolSummary?.count || 0}`\n );\n\n const metadata = trace.metadata;\n if (metadata) {\n console.log(chalk.blue('\\n\uD83D\uDCCB Metadata:'));\n console.log(\n ` Start: ${new Date(metadata.startTime).toLocaleString()}`\n );\n console.log(\n ` Duration: ${formatDuration(metadata.endTime - metadata.startTime)}`\n );\n console.log(\n ` Files: ${metadata.filesModified?.length || metadata.filesModified || 0}`\n );\n console.log(\n ` Errors: ${metadata.errorsEncountered?.length || metadata.errorsCount || 0}`\n );\n }\n\n // Show storage location\n const location = db\n .prepare(\n 'SELECT tier, location, access_count FROM storage_tiers WHERE trace_id = ?'\n )\n .get(traceId) as any;\n\n if (location) {\n const tierIcon =\n location.tier === 'hot'\n ? '\uD83D\uDD25'\n : location.tier === 'warm'\n ? '\u2601\uFE0F'\n : '\u2744\uFE0F';\n console.log(chalk.blue('\\n\uD83D\uDCBE Storage:'));\n console.log(` Tier: ${tierIcon} ${location.tier}`);\n console.log(` Access Count: ${location.access_count}`);\n }\n\n db.close();\n } catch (error: unknown) {\n spinner.fail('Failed to retrieve trace');\n console.error(error);\n process.exit(1);\n }\n });\n\n storage\n .command('config')\n .description('Show storage configuration')\n .action(async () => {\n console.log(chalk.blue('\\n\u2699\uFE0F Storage Configuration:'));\n console.log(chalk.gray('\u2501'.repeat(50)));\n\n console.log(chalk.red('\\n\uD83D\uDD25 Hot Tier (Redis):'));\n console.log(\n ` URL: ${process.env['REDIS_URL'] ? chalk.green('Configured') : chalk.yellow('Not configured')}`\n );\n console.log(` TTL: 24 hours`);\n console.log(` Max Memory: 100MB`);\n\n console.log(chalk.yellow('\\n\u2601\uFE0F Warm Tier (Railway Buckets):'));\n console.log(\n ` Endpoint: ${process.env['RAILWAY_BUCKET_ENDPOINT'] || 'Not configured'}`\n );\n console.log(\n ` Bucket: ${process.env['RAILWAY_BUCKET_NAME'] || 'stackmemory-warm'}`\n );\n console.log(\n ` Access Key: ${process.env['RAILWAY_BUCKET_ACCESS_KEY'] ? chalk.green('Set') : chalk.yellow('Not set')}`\n );\n console.log(` Retention: 30 days`);\n\n console.log(chalk.cyan('\\n\u2744\uFE0F Cold Tier (GCS):'));\n console.log(\n ` Project: ${process.env['GCP_PROJECT_ID'] || 'Not configured'}`\n );\n console.log(\n ` Bucket: ${process.env['GCS_BUCKET'] || 'stackmemory-cold'}`\n );\n console.log(\n ` Key File: ${process.env['GCP_KEY_FILE'] ? chalk.green('Set') : chalk.yellow('Not set')}`\n );\n console.log(` Storage Class: Coldline`);\n console.log(` Retention: Infinite`);\n\n console.log(chalk.blue('\\n\uD83D\uDCCA Migration Thresholds:'));\n console.log(` Hot \u2192 Warm: After 24 hours`);\n console.log(` Warm \u2192 Cold: After 30 days`);\n console.log(` Low Score Migration: < 0.4 score`);\n });\n\n return storage;\n}\n\n/**\n * Calculate storage cost estimates\n */\nfunction calculateStorageCost(stats: any): {\n railway: string;\n gcs: string;\n total: string;\n} {\n // Find warm and cold tier sizes\n const warmTier = stats.byTier.find((t: any) => t.tier === 'warm');\n const coldTier = stats.byTier.find((t: any) => t.tier === 'cold');\n\n const warmGB = (warmTier?.total_compressed || 0) / (1024 * 1024 * 1024);\n const coldGB = (coldTier?.total_compressed || 0) / (1024 * 1024 * 1024);\n\n // Railway Buckets: ~$0.02/GB (estimate)\n const railwayCost = warmGB * 0.02;\n\n // GCS Coldline: $0.004/GB\n const gcsCost = coldGB * 0.004;\n\n const totalCost = railwayCost + gcsCost;\n\n return {\n railway: `$${railwayCost.toFixed(2)}`,\n gcs: `$${gcsCost.toFixed(2)}`,\n total: `$${totalCost.toFixed(2)}`,\n };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["storage"]
|
|
7
|
-
}
|
|
@@ -1,249 +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 { Command } from "commander";
|
|
6
|
-
import chalk from "chalk";
|
|
7
|
-
import ora from "ora";
|
|
8
|
-
import { existsSync } from "fs";
|
|
9
|
-
import { join } from "path";
|
|
10
|
-
import {
|
|
11
|
-
createServerManager,
|
|
12
|
-
createPredictionClient,
|
|
13
|
-
launchWrapper,
|
|
14
|
-
DEFAULT_SERVER_CONFIG
|
|
15
|
-
} from "../../features/sweep/index.js";
|
|
16
|
-
const HOME = process.env["HOME"] || "/tmp";
|
|
17
|
-
function createSweepCommand() {
|
|
18
|
-
const cmd = new Command("sweep").description("Manage Sweep Next-Edit prediction server").addHelpText(
|
|
19
|
-
"after",
|
|
20
|
-
`
|
|
21
|
-
Examples:
|
|
22
|
-
stackmemory sweep start Start the Sweep server
|
|
23
|
-
stackmemory sweep stop Stop the Sweep server
|
|
24
|
-
stackmemory sweep status Check server status
|
|
25
|
-
stackmemory sweep predict Run a prediction manually
|
|
26
|
-
stackmemory sweep hook Install/check Claude Code hook
|
|
27
|
-
|
|
28
|
-
The Sweep server uses the Sweep 1.5B model for next-edit predictions.
|
|
29
|
-
Predictions are triggered after file edits via Claude Code hooks.
|
|
30
|
-
`
|
|
31
|
-
);
|
|
32
|
-
cmd.command("start").description("Start the Sweep prediction server").option(
|
|
33
|
-
"--port <number>",
|
|
34
|
-
"Server port",
|
|
35
|
-
String(DEFAULT_SERVER_CONFIG.port)
|
|
36
|
-
).option("--model <path>", "Path to GGUF model file").option(
|
|
37
|
-
"--context <size>",
|
|
38
|
-
"Context size",
|
|
39
|
-
String(DEFAULT_SERVER_CONFIG.contextSize)
|
|
40
|
-
).option("--gpu-layers <n>", "Number of GPU layers (0 for CPU only)", "0").action(async (options) => {
|
|
41
|
-
const spinner = ora("Starting Sweep server...").start();
|
|
42
|
-
try {
|
|
43
|
-
const config = {
|
|
44
|
-
port: parseInt(options.port, 10),
|
|
45
|
-
contextSize: parseInt(options.context, 10),
|
|
46
|
-
gpuLayers: parseInt(options.gpuLayers, 10)
|
|
47
|
-
};
|
|
48
|
-
if (options.model) {
|
|
49
|
-
config.modelPath = options.model;
|
|
50
|
-
}
|
|
51
|
-
const manager = createServerManager(config);
|
|
52
|
-
const status = await manager.startServer();
|
|
53
|
-
spinner.succeed(chalk.green("Sweep server started"));
|
|
54
|
-
console.log(chalk.gray(` PID: ${status.pid}`));
|
|
55
|
-
console.log(chalk.gray(` Port: ${status.port}`));
|
|
56
|
-
console.log(chalk.gray(` Model: ${status.modelPath}`));
|
|
57
|
-
} catch (error) {
|
|
58
|
-
spinner.fail(chalk.red("Failed to start Sweep server"));
|
|
59
|
-
console.error(chalk.red(error.message));
|
|
60
|
-
process.exit(1);
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
cmd.command("stop").description("Stop the Sweep prediction server").action(async () => {
|
|
64
|
-
const spinner = ora("Stopping Sweep server...").start();
|
|
65
|
-
try {
|
|
66
|
-
const manager = createServerManager();
|
|
67
|
-
await manager.stopServer();
|
|
68
|
-
spinner.succeed(chalk.green("Sweep server stopped"));
|
|
69
|
-
} catch (error) {
|
|
70
|
-
spinner.fail(chalk.red("Failed to stop Sweep server"));
|
|
71
|
-
console.error(chalk.red(error.message));
|
|
72
|
-
process.exit(1);
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
cmd.command("status").description("Check Sweep server status").action(async () => {
|
|
76
|
-
try {
|
|
77
|
-
const manager = createServerManager();
|
|
78
|
-
const status = await manager.getStatus();
|
|
79
|
-
if (status.running) {
|
|
80
|
-
console.log(chalk.green("Sweep server is running"));
|
|
81
|
-
console.log(chalk.gray(` PID: ${status.pid}`));
|
|
82
|
-
console.log(chalk.gray(` Port: ${status.port}`));
|
|
83
|
-
console.log(chalk.gray(` Host: ${status.host}`));
|
|
84
|
-
if (status.startedAt) {
|
|
85
|
-
const uptime = Math.floor((Date.now() - status.startedAt) / 1e3);
|
|
86
|
-
console.log(chalk.gray(` Uptime: ${formatUptime(uptime)}`));
|
|
87
|
-
}
|
|
88
|
-
if (status.modelPath) {
|
|
89
|
-
console.log(chalk.gray(` Model: ${status.modelPath}`));
|
|
90
|
-
}
|
|
91
|
-
} else {
|
|
92
|
-
console.log(chalk.yellow("Sweep server is not running"));
|
|
93
|
-
console.log(chalk.gray(" Start with: stackmemory sweep start"));
|
|
94
|
-
}
|
|
95
|
-
const defaultModelPath = join(
|
|
96
|
-
HOME,
|
|
97
|
-
".stackmemory",
|
|
98
|
-
"models",
|
|
99
|
-
"sweep",
|
|
100
|
-
"sweep-next-edit-1.5b.q8_0.v2.gguf"
|
|
101
|
-
);
|
|
102
|
-
if (!existsSync(defaultModelPath)) {
|
|
103
|
-
console.log("");
|
|
104
|
-
console.log(chalk.yellow("Model not found at default location"));
|
|
105
|
-
console.log(
|
|
106
|
-
chalk.gray(
|
|
107
|
-
" Download with:\n huggingface-cli download sweepai/sweep-next-edit-1.5B \\\n sweep-next-edit-1.5b.q8_0.v2.gguf \\\n --local-dir ~/.stackmemory/models/sweep"
|
|
108
|
-
)
|
|
109
|
-
);
|
|
110
|
-
}
|
|
111
|
-
} catch (error) {
|
|
112
|
-
console.error(
|
|
113
|
-
chalk.red("Error checking status:"),
|
|
114
|
-
error.message
|
|
115
|
-
);
|
|
116
|
-
process.exit(1);
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
cmd.command("predict").description("Run a prediction manually (for testing)").argument("<file>", "File to predict edits for").option(
|
|
120
|
-
"--port <number>",
|
|
121
|
-
"Server port",
|
|
122
|
-
String(DEFAULT_SERVER_CONFIG.port)
|
|
123
|
-
).action(async (file, options) => {
|
|
124
|
-
const spinner = ora("Running prediction...").start();
|
|
125
|
-
try {
|
|
126
|
-
const { readFileSync } = await import("fs");
|
|
127
|
-
const content = readFileSync(file, "utf-8");
|
|
128
|
-
const client = createPredictionClient({
|
|
129
|
-
port: parseInt(options.port, 10)
|
|
130
|
-
});
|
|
131
|
-
const healthy = await client.checkHealth();
|
|
132
|
-
if (!healthy) {
|
|
133
|
-
spinner.fail(chalk.red("Server not running"));
|
|
134
|
-
console.log(chalk.gray("Start with: stackmemory sweep start"));
|
|
135
|
-
process.exit(1);
|
|
136
|
-
}
|
|
137
|
-
const result = await client.predict({
|
|
138
|
-
file_path: file,
|
|
139
|
-
current_content: content,
|
|
140
|
-
recent_diffs: []
|
|
141
|
-
});
|
|
142
|
-
spinner.stop();
|
|
143
|
-
if (result.success && result.predicted_content) {
|
|
144
|
-
console.log(chalk.green("Prediction complete"));
|
|
145
|
-
console.log(chalk.gray(`Latency: ${result.latency_ms}ms`));
|
|
146
|
-
console.log(chalk.gray(`Tokens: ${result.tokens_generated}`));
|
|
147
|
-
console.log("");
|
|
148
|
-
console.log(chalk.cyan("Predicted content:"));
|
|
149
|
-
console.log(result.predicted_content.slice(0, 500));
|
|
150
|
-
if (result.predicted_content.length > 500) {
|
|
151
|
-
console.log(chalk.gray("... (truncated)"));
|
|
152
|
-
}
|
|
153
|
-
} else if (result.success) {
|
|
154
|
-
console.log(chalk.yellow("No changes predicted"));
|
|
155
|
-
} else {
|
|
156
|
-
console.log(chalk.red("Prediction failed:"), result.message);
|
|
157
|
-
}
|
|
158
|
-
} catch (error) {
|
|
159
|
-
spinner.fail(chalk.red("Prediction failed"));
|
|
160
|
-
console.error(chalk.red(error.message));
|
|
161
|
-
process.exit(1);
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
cmd.command("hook").description("Check Claude Code hook status").action(async () => {
|
|
165
|
-
const hookPath = join(HOME, ".claude", "hooks", "post-edit-sweep.js");
|
|
166
|
-
const templatePath = join(
|
|
167
|
-
process.cwd(),
|
|
168
|
-
"templates",
|
|
169
|
-
"claude-hooks",
|
|
170
|
-
"post-edit-sweep.js"
|
|
171
|
-
);
|
|
172
|
-
console.log(chalk.cyan("Sweep Hook Status"));
|
|
173
|
-
console.log("");
|
|
174
|
-
if (existsSync(hookPath)) {
|
|
175
|
-
console.log(chalk.green("Hook installed:"), hookPath);
|
|
176
|
-
} else {
|
|
177
|
-
console.log(chalk.yellow("Hook not installed"));
|
|
178
|
-
console.log(chalk.gray(` Copy from: ${templatePath}`));
|
|
179
|
-
console.log(chalk.gray(` To: ${hookPath}`));
|
|
180
|
-
}
|
|
181
|
-
const settingsPath = join(HOME, ".claude", "settings.json");
|
|
182
|
-
if (existsSync(settingsPath)) {
|
|
183
|
-
try {
|
|
184
|
-
const { readFileSync } = await import("fs");
|
|
185
|
-
const settings = JSON.parse(readFileSync(settingsPath, "utf-8"));
|
|
186
|
-
const hasHook = JSON.stringify(settings).includes("post-edit-sweep");
|
|
187
|
-
if (hasHook) {
|
|
188
|
-
console.log(chalk.green("Hook registered in settings.json"));
|
|
189
|
-
} else {
|
|
190
|
-
console.log(chalk.yellow("Hook not registered in settings.json"));
|
|
191
|
-
console.log(
|
|
192
|
-
chalk.gray(
|
|
193
|
-
' Add to hooks.PostToolUse:\n { "matcher": "Edit", "hooks": [{ "type": "command", "command": "node ~/.claude/hooks/post-edit-sweep.js" }] }'
|
|
194
|
-
)
|
|
195
|
-
);
|
|
196
|
-
}
|
|
197
|
-
} catch {
|
|
198
|
-
console.log(chalk.yellow("Could not read settings.json"));
|
|
199
|
-
}
|
|
200
|
-
} else {
|
|
201
|
-
console.log(chalk.yellow("settings.json not found"));
|
|
202
|
-
}
|
|
203
|
-
const statePath = join(HOME, ".stackmemory", "sweep-state.json");
|
|
204
|
-
if (existsSync(statePath)) {
|
|
205
|
-
try {
|
|
206
|
-
const { readFileSync } = await import("fs");
|
|
207
|
-
const state = JSON.parse(readFileSync(statePath, "utf-8"));
|
|
208
|
-
console.log(
|
|
209
|
-
chalk.gray(
|
|
210
|
-
` Recent diffs tracked: ${state.recentDiffs?.length || 0}`
|
|
211
|
-
)
|
|
212
|
-
);
|
|
213
|
-
if (state.lastPrediction) {
|
|
214
|
-
const ago = Math.floor(
|
|
215
|
-
(Date.now() - state.lastPrediction.timestamp) / 1e3
|
|
216
|
-
);
|
|
217
|
-
console.log(
|
|
218
|
-
chalk.gray(` Last prediction: ${formatUptime(ago)} ago`)
|
|
219
|
-
);
|
|
220
|
-
}
|
|
221
|
-
} catch {
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
});
|
|
225
|
-
cmd.command("wrap").description("Launch Claude Code with Sweep prediction status bar").option("--claude-bin <path>", "Path to claude binary").allowUnknownOption(true).action(async (options, command) => {
|
|
226
|
-
try {
|
|
227
|
-
const claudeArgs = command.args || [];
|
|
228
|
-
await launchWrapper({
|
|
229
|
-
claudeBin: options.claudeBin,
|
|
230
|
-
claudeArgs
|
|
231
|
-
});
|
|
232
|
-
} catch (error) {
|
|
233
|
-
console.error(chalk.red(error.message));
|
|
234
|
-
process.exit(1);
|
|
235
|
-
}
|
|
236
|
-
});
|
|
237
|
-
return cmd;
|
|
238
|
-
}
|
|
239
|
-
function formatUptime(seconds) {
|
|
240
|
-
if (seconds < 60) return `${seconds}s`;
|
|
241
|
-
if (seconds < 3600) return `${Math.floor(seconds / 60)}m ${seconds % 60}s`;
|
|
242
|
-
const hours = Math.floor(seconds / 3600);
|
|
243
|
-
const mins = Math.floor(seconds % 3600 / 60);
|
|
244
|
-
return `${hours}h ${mins}m`;
|
|
245
|
-
}
|
|
246
|
-
export {
|
|
247
|
-
createSweepCommand
|
|
248
|
-
};
|
|
249
|
-
//# sourceMappingURL=sweep.js.map
|