@stackmemoryai/stackmemory 0.5.57 → 0.5.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/codex-smd +6 -0
- package/dist/cli/codex-sm-danger.js +21 -0
- package/dist/cli/codex-sm-danger.js.map +7 -0
- package/dist/cli/commands/handoff.js +33 -3
- package/dist/cli/commands/handoff.js.map +2 -2
- package/dist/cli/commands/search.js +20 -3
- package/dist/cli/commands/search.js.map +2 -2
- package/dist/core/database/sqlite-adapter.js +13 -3
- package/dist/core/database/sqlite-adapter.js.map +2 -2
- package/dist/core/errors/error-utils.js +208 -0
- package/dist/core/errors/error-utils.js.map +7 -0
- package/dist/core/errors/index.js +13 -4
- package/dist/core/errors/index.js.map +2 -2
- package/dist/core/merge/unified-merge-resolver.js +303 -0
- package/dist/core/merge/unified-merge-resolver.js.map +7 -0
- package/dist/core/monitoring/logger.js +61 -9
- package/dist/core/monitoring/logger.js.map +2 -2
- package/dist/core/security/index.js +35 -0
- package/dist/core/security/index.js.map +7 -0
- package/dist/core/security/input-sanitizer.js +321 -0
- package/dist/core/security/input-sanitizer.js.map +7 -0
- package/dist/core/session/enhanced-handoff.js +136 -2
- package/dist/core/session/enhanced-handoff.js.map +3 -3
- package/dist/integrations/linear/client.js +5 -1
- package/dist/integrations/linear/client.js.map +2 -2
- package/dist/integrations/mcp/remote-server.js +27 -36
- package/dist/integrations/mcp/remote-server.js.map +2 -2
- package/dist/integrations/mcp/server.js +44 -29
- package/dist/integrations/mcp/server.js.map +3 -3
- package/dist/scripts/benchmark-performance.js +48 -0
- package/dist/scripts/benchmark-performance.js.map +7 -0
- package/dist/scripts/check-redis.js +42 -0
- package/dist/scripts/check-redis.js.map +7 -0
- package/dist/scripts/initialize.js +116 -0
- package/dist/scripts/initialize.js.map +7 -0
- package/dist/scripts/list-linear-tasks.js +124 -0
- package/dist/scripts/list-linear-tasks.js.map +7 -0
- package/dist/scripts/measure-handoff-impact.js +340 -0
- package/dist/scripts/measure-handoff-impact.js.map +7 -0
- package/dist/scripts/query-chromadb.js +160 -0
- package/dist/scripts/query-chromadb.js.map +7 -0
- package/dist/scripts/show-linear-summary.js +119 -0
- package/dist/scripts/show-linear-summary.js.map +7 -0
- package/dist/scripts/simple-swarm-demo.js +90 -0
- package/dist/scripts/simple-swarm-demo.js.map +7 -0
- package/dist/scripts/status.js +155 -0
- package/dist/scripts/status.js.map +7 -0
- package/dist/scripts/test-chromadb-sync.js +192 -0
- package/dist/scripts/test-chromadb-sync.js.map +7 -0
- package/dist/scripts/test-ralph-iteration-fix.js +86 -0
- package/dist/scripts/test-ralph-iteration-fix.js.map +7 -0
- package/dist/scripts/test-ralph-iterations.js +121 -0
- package/dist/scripts/test-ralph-iterations.js.map +7 -0
- package/dist/scripts/test-redis-storage.js +389 -0
- package/dist/scripts/test-redis-storage.js.map +7 -0
- package/dist/scripts/test-simple-ralph-state-sync.js +115 -0
- package/dist/scripts/test-simple-ralph-state-sync.js.map +7 -0
- package/dist/scripts/test-swarm-fixes.js +125 -0
- package/dist/scripts/test-swarm-fixes.js.map +7 -0
- package/dist/scripts/test-swarm-tui.js +23 -0
- package/dist/scripts/test-swarm-tui.js.map +7 -0
- package/dist/scripts/test-tui-shortcuts.js +52 -0
- package/dist/scripts/test-tui-shortcuts.js.map +7 -0
- package/dist/scripts/validate-tui-shortcuts.js +60 -0
- package/dist/scripts/validate-tui-shortcuts.js.map +7 -0
- package/dist/src/agents/core/agent-task-manager.js +527 -0
- package/dist/src/agents/core/agent-task-manager.js.map +7 -0
- package/dist/src/agents/verifiers/base-verifier.js +133 -0
- package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/formatter-verifier.js +130 -0
- package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/llm-judge.js +252 -0
- package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
- package/dist/src/cli/auto-detect.js +321 -0
- package/dist/src/cli/auto-detect.js.map +7 -0
- package/dist/src/cli/claude-sm-danger.js +21 -0
- package/dist/src/cli/claude-sm-danger.js.map +7 -0
- package/dist/src/cli/claude-sm.js +1156 -0
- package/dist/src/cli/claude-sm.js.map +7 -0
- package/dist/src/cli/codex-sm-danger.js +21 -0
- package/dist/src/cli/codex-sm-danger.js.map +7 -0
- package/dist/src/cli/codex-sm.js +349 -0
- package/dist/src/cli/codex-sm.js.map +7 -0
- package/dist/src/cli/commands/api.js +232 -0
- package/dist/src/cli/commands/api.js.map +7 -0
- package/dist/src/cli/commands/auto-background.js +180 -0
- package/dist/src/cli/commands/auto-background.js.map +7 -0
- package/dist/src/cli/commands/cleanup-processes.js +68 -0
- package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
- package/dist/src/cli/commands/clear.js +202 -0
- package/dist/src/cli/commands/clear.js.map +7 -0
- package/dist/src/cli/commands/config.js +445 -0
- package/dist/src/cli/commands/config.js.map +7 -0
- package/dist/src/cli/commands/context-rehydrate.js +751 -0
- package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
- package/dist/src/cli/commands/context.js +343 -0
- package/dist/src/cli/commands/context.js.map +7 -0
- package/dist/src/cli/commands/daemon.js +392 -0
- package/dist/src/cli/commands/daemon.js.map +7 -0
- package/dist/src/cli/commands/dashboard.js +210 -0
- package/dist/src/cli/commands/dashboard.js.map +7 -0
- package/dist/src/cli/commands/db.js +147 -0
- package/dist/src/cli/commands/db.js.map +7 -0
- package/dist/src/cli/commands/decision.js +266 -0
- package/dist/src/cli/commands/decision.js.map +7 -0
- package/dist/src/cli/commands/discovery.js +279 -0
- package/dist/src/cli/commands/discovery.js.map +7 -0
- package/dist/src/cli/commands/handoff.js +624 -0
- package/dist/src/cli/commands/handoff.js.map +7 -0
- package/dist/src/cli/commands/hooks.js +298 -0
- package/dist/src/cli/commands/hooks.js.map +7 -0
- package/dist/src/cli/commands/linear.js +529 -0
- package/dist/src/cli/commands/linear.js.map +7 -0
- package/dist/src/cli/commands/log.js +169 -0
- package/dist/src/cli/commands/log.js.map +7 -0
- package/dist/src/cli/commands/login.js +172 -0
- package/dist/src/cli/commands/login.js.map +7 -0
- package/dist/src/cli/commands/migrate.js +240 -0
- package/dist/src/cli/commands/migrate.js.map +7 -0
- package/dist/src/cli/commands/model.js +533 -0
- package/dist/src/cli/commands/model.js.map +7 -0
- package/dist/src/cli/commands/onboard.js +536 -0
- package/dist/src/cli/commands/onboard.js.map +7 -0
- package/dist/src/cli/commands/projects.js +199 -0
- package/dist/src/cli/commands/projects.js.map +7 -0
- package/dist/src/cli/commands/ralph.js +909 -0
- package/dist/src/cli/commands/ralph.js.map +7 -0
- package/dist/src/cli/commands/retrieval.js +248 -0
- package/dist/src/cli/commands/retrieval.js.map +7 -0
- package/dist/src/cli/commands/search.js +173 -0
- package/dist/src/cli/commands/search.js.map +7 -0
- package/dist/src/cli/commands/service.js +749 -0
- package/dist/src/cli/commands/service.js.map +7 -0
- package/dist/src/cli/commands/session.js +200 -0
- package/dist/src/cli/commands/session.js.map +7 -0
- package/dist/src/cli/commands/settings.js +306 -0
- package/dist/src/cli/commands/settings.js.map +7 -0
- package/dist/src/cli/commands/setup.js +701 -0
- package/dist/src/cli/commands/setup.js.map +7 -0
- package/dist/src/cli/commands/shell.js +249 -0
- package/dist/src/cli/commands/shell.js.map +7 -0
- package/dist/src/cli/commands/signup.js +50 -0
- package/dist/src/cli/commands/signup.js.map +7 -0
- package/dist/src/cli/commands/skills.js +470 -0
- package/dist/src/cli/commands/skills.js.map +7 -0
- package/dist/src/cli/commands/sms-notify.js +795 -0
- package/dist/src/cli/commands/sms-notify.js.map +7 -0
- package/dist/src/cli/commands/storage-tier.js +183 -0
- package/dist/src/cli/commands/storage-tier.js.map +7 -0
- package/dist/src/cli/commands/sweep.js +249 -0
- package/dist/src/cli/commands/sweep.js.map +7 -0
- package/dist/src/cli/commands/tasks.js +213 -0
- package/dist/src/cli/commands/tasks.js.map +7 -0
- package/dist/src/cli/commands/worktree.js +319 -0
- package/dist/src/cli/commands/worktree.js.map +7 -0
- package/dist/src/cli/index.js +594 -0
- package/dist/src/cli/index.js.map +7 -0
- package/dist/src/cli/opencode-sm.js +448 -0
- package/dist/src/cli/opencode-sm.js.map +7 -0
- package/dist/src/cli/utils/viewer.js +96 -0
- package/dist/src/cli/utils/viewer.js.map +7 -0
- package/dist/src/core/config/config-manager.js +398 -0
- package/dist/src/core/config/config-manager.js.map +7 -0
- package/dist/src/core/config/feature-flags.js +76 -0
- package/dist/src/core/config/feature-flags.js.map +7 -0
- package/dist/src/core/config/storage-config.js +115 -0
- package/dist/src/core/config/storage-config.js.map +7 -0
- package/dist/src/core/config/types.js +144 -0
- package/dist/src/core/config/types.js.map +7 -0
- package/dist/src/core/context/auto-context.js +80 -0
- package/dist/src/core/context/auto-context.js.map +7 -0
- package/dist/src/core/context/dual-stack-manager.js +870 -0
- package/dist/src/core/context/dual-stack-manager.js.map +7 -0
- package/dist/src/core/context/enhanced-rehydration.js +994 -0
- package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
- package/dist/src/core/context/frame-database.js +479 -0
- package/dist/src/core/context/frame-database.js.map +7 -0
- package/dist/src/core/context/frame-digest.js +250 -0
- package/dist/src/core/context/frame-digest.js.map +7 -0
- package/dist/src/core/context/frame-handoff-manager.js +778 -0
- package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
- package/dist/src/core/context/frame-lifecycle-hooks.js +119 -0
- package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
- package/dist/src/core/context/frame-recovery.js +302 -0
- package/dist/src/core/context/frame-recovery.js.map +7 -0
- package/dist/src/core/context/frame-stack.js +314 -0
- package/dist/src/core/context/frame-stack.js.map +7 -0
- package/dist/src/core/context/frame-types.js +5 -0
- package/dist/src/core/context/frame-types.js.map +7 -0
- package/dist/src/core/context/index.js +25 -0
- package/dist/src/core/context/index.js.map +7 -0
- package/dist/src/core/context/permission-manager.js +185 -0
- package/dist/src/core/context/permission-manager.js.map +7 -0
- package/dist/src/core/context/recursive-context-manager.js +592 -0
- package/dist/src/core/context/recursive-context-manager.js.map +7 -0
- package/dist/src/core/context/refactored-frame-manager.js +754 -0
- package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
- package/dist/src/core/context/shared-context-layer.js +621 -0
- package/dist/src/core/context/shared-context-layer.js.map +7 -0
- package/dist/src/core/context/stack-merge-resolver.js +749 -0
- package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
- package/dist/src/core/context/validation.js +130 -0
- package/dist/src/core/context/validation.js.map +7 -0
- package/dist/src/core/database/batch-operations.js +384 -0
- package/dist/src/core/database/batch-operations.js.map +7 -0
- package/dist/src/core/database/connection-pool.js +330 -0
- package/dist/src/core/database/connection-pool.js.map +7 -0
- package/dist/src/core/database/database-adapter.js +60 -0
- package/dist/src/core/database/database-adapter.js.map +7 -0
- package/dist/src/core/database/migration-manager.js +614 -0
- package/dist/src/core/database/migration-manager.js.map +7 -0
- package/dist/src/core/database/query-cache.js +298 -0
- package/dist/src/core/database/query-cache.js.map +7 -0
- package/dist/src/core/database/query-router.js +430 -0
- package/dist/src/core/database/query-router.js.map +7 -0
- package/dist/src/core/database/sqlite-adapter.js +738 -0
- package/dist/src/core/database/sqlite-adapter.js.map +7 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js +277 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
- package/dist/src/core/digest/frame-digest-integration.js +176 -0
- package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
- package/dist/src/core/digest/hybrid-digest-generator.js +553 -0
- package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
- package/dist/src/core/digest/index.js +9 -0
- package/dist/src/core/digest/index.js.map +7 -0
- package/dist/src/core/digest/types.js +25 -0
- package/dist/src/core/digest/types.js.map +7 -0
- package/dist/src/core/errors/error-utils.js +208 -0
- package/dist/src/core/errors/error-utils.js.map +7 -0
- package/dist/src/core/errors/index.js +521 -0
- package/dist/src/core/errors/index.js.map +7 -0
- package/dist/src/core/errors/recovery.js +269 -0
- package/dist/src/core/errors/recovery.js.map +7 -0
- package/dist/src/core/execution/parallel-executor.js +258 -0
- package/dist/src/core/execution/parallel-executor.js.map +7 -0
- package/dist/src/core/frame/workflow-templates.js +319 -0
- package/dist/src/core/frame/workflow-templates.js.map +7 -0
- package/dist/src/core/merge/conflict-detector.js +431 -0
- package/dist/src/core/merge/conflict-detector.js.map +7 -0
- package/dist/src/core/merge/index.js +9 -0
- package/dist/src/core/merge/index.js.map +7 -0
- package/dist/src/core/merge/resolution-engine.js +558 -0
- package/dist/src/core/merge/resolution-engine.js.map +7 -0
- package/dist/src/core/merge/stack-diff.js +532 -0
- package/dist/src/core/merge/stack-diff.js.map +7 -0
- package/dist/src/core/merge/types.js +5 -0
- package/dist/src/core/merge/types.js.map +7 -0
- package/dist/src/core/merge/unified-merge-resolver.js +303 -0
- package/dist/src/core/merge/unified-merge-resolver.js.map +7 -0
- package/dist/src/core/models/fallback-monitor.js +232 -0
- package/dist/src/core/models/fallback-monitor.js.map +7 -0
- package/dist/src/core/models/model-router.js +340 -0
- package/dist/src/core/models/model-router.js.map +7 -0
- package/dist/src/core/monitoring/error-handler.js +49 -0
- package/dist/src/core/monitoring/error-handler.js.map +7 -0
- package/dist/src/core/monitoring/logger.js +202 -0
- package/dist/src/core/monitoring/logger.js.map +7 -0
- package/dist/src/core/monitoring/metrics.js +172 -0
- package/dist/src/core/monitoring/metrics.js.map +7 -0
- package/dist/src/core/monitoring/progress-tracker.js +189 -0
- package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
- package/dist/src/core/monitoring/session-monitor.js +300 -0
- package/dist/src/core/monitoring/session-monitor.js.map +7 -0
- package/dist/src/core/performance/context-cache.js +273 -0
- package/dist/src/core/performance/context-cache.js.map +7 -0
- package/dist/src/core/performance/index.js +11 -0
- package/dist/src/core/performance/index.js.map +7 -0
- package/dist/src/core/performance/lazy-context-loader.js +327 -0
- package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
- package/dist/src/core/performance/monitor.js +221 -0
- package/dist/src/core/performance/monitor.js.map +7 -0
- package/dist/src/core/performance/optimized-frame-context.js +345 -0
- package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
- package/dist/src/core/performance/performance-benchmark.js +277 -0
- package/dist/src/core/performance/performance-benchmark.js.map +7 -0
- package/dist/src/core/performance/performance-profiler.js +370 -0
- package/dist/src/core/performance/performance-profiler.js.map +7 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js +195 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
- package/dist/src/core/persistence/postgres-adapter.js +349 -0
- package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
- package/dist/src/core/projects/project-isolation.js +201 -0
- package/dist/src/core/projects/project-isolation.js.map +7 -0
- package/dist/src/core/projects/project-manager.js +697 -0
- package/dist/src/core/projects/project-manager.js.map +7 -0
- package/dist/src/core/query/query-parser.js +370 -0
- package/dist/src/core/query/query-parser.js.map +7 -0
- package/dist/src/core/query/query-templates.js +321 -0
- package/dist/src/core/query/query-templates.js.map +7 -0
- package/dist/src/core/retrieval/context-retriever.js +479 -0
- package/dist/src/core/retrieval/context-retriever.js.map +7 -0
- package/dist/src/core/retrieval/index.js +8 -0
- package/dist/src/core/retrieval/index.js.map +7 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js +613 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
- package/dist/src/core/retrieval/llm-provider.js +151 -0
- package/dist/src/core/retrieval/llm-provider.js.map +7 -0
- package/dist/src/core/retrieval/retrieval-audit.js +236 -0
- package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
- package/dist/src/core/retrieval/summary-generator.js +589 -0
- package/dist/src/core/retrieval/summary-generator.js.map +7 -0
- package/dist/src/core/retrieval/types.js +21 -0
- package/dist/src/core/retrieval/types.js.map +7 -0
- package/dist/src/core/security/index.js +35 -0
- package/dist/src/core/security/index.js.map +7 -0
- package/dist/src/core/security/input-sanitizer.js +321 -0
- package/dist/src/core/security/input-sanitizer.js.map +7 -0
- package/dist/src/core/session/clear-survival.js +465 -0
- package/dist/src/core/session/clear-survival.js.map +7 -0
- package/dist/src/core/session/enhanced-handoff.js +792 -0
- package/dist/src/core/session/enhanced-handoff.js.map +7 -0
- package/dist/src/core/session/handoff-generator.js +343 -0
- package/dist/src/core/session/handoff-generator.js.map +7 -0
- package/dist/src/core/session/index.js +15 -0
- package/dist/src/core/session/index.js.map +7 -0
- package/dist/src/core/session/session-manager.js +347 -0
- package/dist/src/core/session/session-manager.js.map +7 -0
- package/dist/src/core/skills/index.js +7 -0
- package/dist/src/core/skills/index.js.map +7 -0
- package/dist/src/core/skills/skill-storage.js +764 -0
- package/dist/src/core/skills/skill-storage.js.map +7 -0
- package/dist/src/core/skills/types.js +193 -0
- package/dist/src/core/skills/types.js.map +7 -0
- package/dist/src/core/storage/chromadb-adapter.js +354 -0
- package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
- package/dist/src/core/storage/infinite-storage.js +510 -0
- package/dist/src/core/storage/infinite-storage.js.map +7 -0
- package/dist/src/core/storage/remote-storage.js +489 -0
- package/dist/src/core/storage/remote-storage.js.map +7 -0
- package/dist/src/core/storage/two-tier-storage.js +766 -0
- package/dist/src/core/storage/two-tier-storage.js.map +7 -0
- package/dist/src/core/trace/cli-trace-wrapper.js +132 -0
- package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/db-trace-wrapper.js +247 -0
- package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/debug-trace.js +417 -0
- package/dist/src/core/trace/debug-trace.js.map +7 -0
- package/dist/src/core/trace/index.js +109 -0
- package/dist/src/core/trace/index.js.map +7 -0
- package/dist/src/core/trace/linear-api-wrapper.js +178 -0
- package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
- package/dist/src/core/trace/trace-detector.js +528 -0
- package/dist/src/core/trace/trace-detector.js.map +7 -0
- package/dist/src/core/trace/trace-store.js +345 -0
- package/dist/src/core/trace/trace-store.js.map +7 -0
- package/dist/src/core/trace/types.js +77 -0
- package/dist/src/core/trace/types.js.map +7 -0
- package/dist/src/core/types.js +5 -0
- package/dist/src/core/types.js.map +7 -0
- package/dist/src/core/utils/async-mutex.js +114 -0
- package/dist/src/core/utils/async-mutex.js.map +7 -0
- package/dist/src/core/utils/compression.js +83 -0
- package/dist/src/core/utils/compression.js.map +7 -0
- package/dist/src/core/utils/update-checker.js +218 -0
- package/dist/src/core/utils/update-checker.js.map +7 -0
- package/dist/src/core/worktree/worktree-manager.js +465 -0
- package/dist/src/core/worktree/worktree-manager.js.map +7 -0
- package/dist/src/daemon/daemon-config.js +149 -0
- package/dist/src/daemon/daemon-config.js.map +7 -0
- package/dist/src/daemon/services/context-service.js +122 -0
- package/dist/src/daemon/services/context-service.js.map +7 -0
- package/dist/src/daemon/services/linear-service.js +136 -0
- package/dist/src/daemon/services/linear-service.js.map +7 -0
- package/dist/src/daemon/session-daemon.js +312 -0
- package/dist/src/daemon/session-daemon.js.map +7 -0
- package/dist/src/daemon/unified-daemon.js +276 -0
- package/dist/src/daemon/unified-daemon.js.map +7 -0
- package/dist/src/features/analytics/api/analytics-api.js +287 -0
- package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
- package/dist/src/features/analytics/core/analytics-service.js +282 -0
- package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
- package/dist/src/features/analytics/index.js +18 -0
- package/dist/src/features/analytics/index.js.map +7 -0
- package/dist/src/features/analytics/queries/metrics-queries.js +277 -0
- package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
- package/dist/src/features/analytics/types/metrics.js +5 -0
- package/dist/src/features/analytics/types/metrics.js.map +7 -0
- package/dist/src/features/browser/browser-mcp.js +492 -0
- package/dist/src/features/browser/browser-mcp.js.map +7 -0
- package/dist/src/features/sweep/index.js +20 -0
- package/dist/src/features/sweep/index.js.map +7 -0
- package/dist/src/features/sweep/prediction-client.js +155 -0
- package/dist/src/features/sweep/prediction-client.js.map +7 -0
- package/dist/src/features/sweep/prompt-builder.js +85 -0
- package/dist/src/features/sweep/prompt-builder.js.map +7 -0
- package/dist/src/features/sweep/pty-wrapper.js +171 -0
- package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
- package/dist/src/features/sweep/state-watcher.js +87 -0
- package/dist/src/features/sweep/state-watcher.js.map +7 -0
- package/dist/src/features/sweep/status-bar.js +88 -0
- package/dist/src/features/sweep/status-bar.js.map +7 -0
- package/dist/src/features/sweep/sweep-server-manager.js +226 -0
- package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
- package/dist/src/features/sweep/tab-interceptor.js +38 -0
- package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
- package/dist/src/features/sweep/types.js +18 -0
- package/dist/src/features/sweep/types.js.map +7 -0
- package/dist/src/features/tasks/linear-task-manager.js +487 -0
- package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
- package/dist/src/features/tasks/task-aware-context.js +410 -0
- package/dist/src/features/tasks/task-aware-context.js.map +7 -0
- package/dist/src/features/tui/simple-monitor.js +116 -0
- package/dist/src/features/tui/simple-monitor.js.map +7 -0
- package/dist/src/features/tui/swarm-monitor.js +648 -0
- package/dist/src/features/tui/swarm-monitor.js.map +7 -0
- package/dist/src/features/web/client/stores/task-store.js +26 -0
- package/dist/src/features/web/client/stores/task-store.js.map +7 -0
- package/dist/src/features/web/server/index.js +194 -0
- package/dist/src/features/web/server/index.js.map +7 -0
- package/dist/src/hooks/auto-background.js +151 -0
- package/dist/src/hooks/auto-background.js.map +7 -0
- package/dist/src/hooks/claude-code-whatsapp-hook.js +197 -0
- package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
- package/dist/src/hooks/config.js +150 -0
- package/dist/src/hooks/config.js.map +7 -0
- package/dist/src/hooks/daemon.js +364 -0
- package/dist/src/hooks/daemon.js.map +7 -0
- package/dist/src/hooks/events.js +58 -0
- package/dist/src/hooks/events.js.map +7 -0
- package/dist/src/hooks/index.js +12 -0
- package/dist/src/hooks/index.js.map +7 -0
- package/dist/src/hooks/linear-task-picker.js +186 -0
- package/dist/src/hooks/linear-task-picker.js.map +7 -0
- package/dist/src/hooks/schemas.js +197 -0
- package/dist/src/hooks/schemas.js.map +7 -0
- package/dist/src/hooks/secure-fs.js +49 -0
- package/dist/src/hooks/secure-fs.js.map +7 -0
- package/dist/src/hooks/security-logger.js +155 -0
- package/dist/src/hooks/security-logger.js.map +7 -0
- package/dist/src/hooks/session-summary.js +222 -0
- package/dist/src/hooks/session-summary.js.map +7 -0
- package/dist/src/hooks/sms-action-runner.js +371 -0
- package/dist/src/hooks/sms-action-runner.js.map +7 -0
- package/dist/src/hooks/sms-notify.js +506 -0
- package/dist/src/hooks/sms-notify.js.map +7 -0
- package/dist/src/hooks/sms-watcher.js +93 -0
- package/dist/src/hooks/sms-watcher.js.map +7 -0
- package/dist/src/hooks/sms-webhook.js +555 -0
- package/dist/src/hooks/sms-webhook.js.map +7 -0
- package/dist/src/hooks/whatsapp-commands.js +479 -0
- package/dist/src/hooks/whatsapp-commands.js.map +7 -0
- package/dist/src/hooks/whatsapp-scheduler.js +317 -0
- package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
- package/dist/src/hooks/whatsapp-sync.js +409 -0
- package/dist/src/hooks/whatsapp-sync.js.map +7 -0
- package/dist/src/index.js +25 -0
- package/dist/src/index.js.map +7 -0
- package/dist/src/integrations/anthropic/client.js +263 -0
- package/dist/src/integrations/anthropic/client.js.map +7 -0
- package/dist/src/integrations/claude-code/agent-bridge.js +768 -0
- package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +459 -0
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/lifecycle-hooks.js +254 -0
- package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/post-task-hooks.js +545 -0
- package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client-stub.js +20 -0
- package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client.js +511 -0
- package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
- package/dist/src/integrations/claude-code/task-coordinator.js +360 -0
- package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
- package/dist/src/integrations/linear/auth.js +337 -0
- package/dist/src/integrations/linear/auth.js.map +7 -0
- package/dist/src/integrations/linear/auto-sync.js +258 -0
- package/dist/src/integrations/linear/auto-sync.js.map +7 -0
- package/dist/src/integrations/linear/client.js +634 -0
- package/dist/src/integrations/linear/client.js.map +7 -0
- package/dist/src/integrations/linear/config.js +130 -0
- package/dist/src/integrations/linear/config.js.map +7 -0
- package/dist/src/integrations/linear/migration.js +361 -0
- package/dist/src/integrations/linear/migration.js.map +7 -0
- package/dist/src/integrations/linear/oauth-server.js +454 -0
- package/dist/src/integrations/linear/oauth-server.js.map +7 -0
- package/dist/src/integrations/linear/rest-client.js +213 -0
- package/dist/src/integrations/linear/rest-client.js.map +7 -0
- package/dist/src/integrations/linear/sync-manager.js +236 -0
- package/dist/src/integrations/linear/sync-manager.js.map +7 -0
- package/dist/src/integrations/linear/sync-service.js +231 -0
- package/dist/src/integrations/linear/sync-service.js.map +7 -0
- package/dist/src/integrations/linear/sync.js +782 -0
- package/dist/src/integrations/linear/sync.js.map +7 -0
- package/dist/src/integrations/linear/types.js +5 -0
- package/dist/src/integrations/linear/types.js.map +7 -0
- package/dist/src/integrations/linear/unified-sync.js +589 -0
- package/dist/src/integrations/linear/unified-sync.js.map +7 -0
- package/dist/src/integrations/linear/webhook-handler.js +219 -0
- package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
- package/dist/src/integrations/linear/webhook-server.js +218 -0
- package/dist/src/integrations/linear/webhook-server.js.map +7 -0
- package/dist/src/integrations/linear/webhook.js +291 -0
- package/dist/src/integrations/linear/webhook.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +266 -0
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js +257 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js +497 -0
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/index.js +166 -0
- package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js +247 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/skill-handlers.js +529 -0
- package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js +239 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js +308 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/index.js +23 -0
- package/dist/src/integrations/mcp/index.js.map +7 -0
- package/dist/src/integrations/mcp/middleware/tool-scoring.js +356 -0
- package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
- package/dist/src/integrations/mcp/refactored-server.js +374 -0
- package/dist/src/integrations/mcp/refactored-server.js.map +7 -0
- package/dist/src/integrations/mcp/remote-server.js +682 -0
- package/dist/src/integrations/mcp/remote-server.js.map +7 -0
- package/dist/src/integrations/mcp/schemas.js +147 -0
- package/dist/src/integrations/mcp/schemas.js.map +7 -0
- package/dist/src/integrations/mcp/server.js +1975 -0
- package/dist/src/integrations/mcp/server.js.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions-code.js +125 -0
- package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions.js +702 -0
- package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +860 -0
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
- package/dist/src/integrations/ralph/context/context-budget-manager.js +301 -0
- package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +360 -0
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +410 -0
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
- package/dist/src/integrations/ralph/index.js +18 -0
- package/dist/src/integrations/ralph/index.js.map +7 -0
- package/dist/src/integrations/ralph/learning/pattern-learner.js +401 -0
- package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +448 -0
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +294 -0
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js +108 -0
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +463 -0
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +400 -0
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +473 -0
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +388 -0
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/performance/performance-optimizer.js +358 -0
- package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
- package/dist/src/integrations/ralph/recovery/crash-recovery.js +462 -0
- package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
- package/dist/src/integrations/ralph/state/state-reconciler.js +404 -0
- package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +428 -0
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +996 -0
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
- package/dist/src/integrations/ralph/types.js +5 -0
- package/dist/src/integrations/ralph/types.js.map +7 -0
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js +585 -0
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
- package/dist/src/mcp/stackmemory-mcp-server.js +554 -0
- package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
- package/dist/src/middleware/exponential-rate-limiter.js +289 -0
- package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
- package/dist/src/models/user.model.js +358 -0
- package/dist/src/models/user.model.js.map +7 -0
- package/dist/src/servers/production/auth-middleware.js +528 -0
- package/dist/src/servers/production/auth-middleware.js.map +7 -0
- package/dist/src/services/config-service.js +65 -0
- package/dist/src/services/config-service.js.map +7 -0
- package/dist/src/services/context-service.js +194 -0
- package/dist/src/services/context-service.js.map +7 -0
- package/dist/src/skills/api-discovery.js +354 -0
- package/dist/src/skills/api-discovery.js.map +7 -0
- package/dist/src/skills/api-skill.js +475 -0
- package/dist/src/skills/api-skill.js.map +7 -0
- package/dist/src/skills/claude-skills.js +1061 -0
- package/dist/src/skills/claude-skills.js.map +7 -0
- package/dist/src/skills/dashboard-launcher.js +216 -0
- package/dist/src/skills/dashboard-launcher.js.map +7 -0
- package/dist/src/skills/recursive-agent-orchestrator.js +575 -0
- package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
- package/dist/src/skills/repo-ingestion-skill.js +609 -0
- package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
- package/dist/src/skills/unified-rlm-orchestrator.js +404 -0
- package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
- package/dist/src/types/task.js +5 -0
- package/dist/src/types/task.js.map +7 -0
- package/dist/src/utils/env.js +50 -0
- package/dist/src/utils/env.js.map +7 -0
- package/dist/src/utils/formatting.js +62 -0
- package/dist/src/utils/formatting.js.map +7 -0
- package/dist/src/utils/process-cleanup.js +136 -0
- package/dist/src/utils/process-cleanup.js.map +7 -0
- package/package.json +4 -3
- package/scripts/create-cleanup-issues.js +302 -0
- package/scripts/demos/browser-test.ts +39 -0
- package/scripts/demos/ralph-integration-demo.ts +244 -0
- package/scripts/demos/trace-demo.ts +214 -0
- package/scripts/demos/trace-detector.demo.ts +171 -0
- package/scripts/demos/trace-test.ts +67 -0
- package/scripts/initialize.ts +16 -7
- package/scripts/install.sh +14 -62
- package/scripts/status.ts +111 -46
- package/scripts/test-claude-config.sh +123 -0
- package/scripts/validate-claude-config.sh +155 -0
|
@@ -0,0 +1,340 @@
|
|
|
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 { existsSync, readFileSync } from "fs";
|
|
6
|
+
import { join } from "path";
|
|
7
|
+
import { homedir } from "os";
|
|
8
|
+
import { writeFileSecure, ensureSecureDir } from "../../hooks/secure-fs.js";
|
|
9
|
+
import {
|
|
10
|
+
ModelRouterConfigSchema,
|
|
11
|
+
parseConfigSafe
|
|
12
|
+
} from "../../hooks/schemas.js";
|
|
13
|
+
const CONFIG_PATH = join(homedir(), ".stackmemory", "model-router.json");
|
|
14
|
+
const DEFAULT_CONFIG = {
|
|
15
|
+
enabled: false,
|
|
16
|
+
defaultProvider: "anthropic",
|
|
17
|
+
taskRouting: {},
|
|
18
|
+
fallback: {
|
|
19
|
+
enabled: true,
|
|
20
|
+
// Fallback enabled by default
|
|
21
|
+
provider: "qwen",
|
|
22
|
+
onRateLimit: true,
|
|
23
|
+
onError: true,
|
|
24
|
+
onTimeout: true,
|
|
25
|
+
maxRetries: 2,
|
|
26
|
+
retryDelayMs: 1e3
|
|
27
|
+
},
|
|
28
|
+
providers: {
|
|
29
|
+
anthropic: {
|
|
30
|
+
provider: "anthropic",
|
|
31
|
+
model: "claude-sonnet-4-20250514",
|
|
32
|
+
apiKeyEnv: "ANTHROPIC_API_KEY"
|
|
33
|
+
},
|
|
34
|
+
qwen: {
|
|
35
|
+
provider: "qwen",
|
|
36
|
+
model: "qwen3-max-2025-01-23",
|
|
37
|
+
baseUrl: "https://dashscope.aliyuncs.com/compatible-mode/v1",
|
|
38
|
+
apiKeyEnv: "DASHSCOPE_API_KEY",
|
|
39
|
+
params: {
|
|
40
|
+
enable_thinking: true,
|
|
41
|
+
thinking_budget: 1e4
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
thinkingMode: {
|
|
46
|
+
enabled: true,
|
|
47
|
+
budget: 1e4,
|
|
48
|
+
temperature: 0.6,
|
|
49
|
+
topP: 0.95
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
function loadModelRouterConfig() {
|
|
53
|
+
try {
|
|
54
|
+
if (existsSync(CONFIG_PATH)) {
|
|
55
|
+
const data = JSON.parse(readFileSync(CONFIG_PATH, "utf8"));
|
|
56
|
+
return parseConfigSafe(
|
|
57
|
+
ModelRouterConfigSchema,
|
|
58
|
+
{ ...DEFAULT_CONFIG, ...data },
|
|
59
|
+
DEFAULT_CONFIG,
|
|
60
|
+
"model-router"
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
} catch {
|
|
64
|
+
}
|
|
65
|
+
return { ...DEFAULT_CONFIG };
|
|
66
|
+
}
|
|
67
|
+
function saveModelRouterConfig(config) {
|
|
68
|
+
try {
|
|
69
|
+
ensureSecureDir(join(homedir(), ".stackmemory"));
|
|
70
|
+
writeFileSecure(CONFIG_PATH, JSON.stringify(config, null, 2));
|
|
71
|
+
} catch {
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function getModelForTask(taskType) {
|
|
75
|
+
const config = loadModelRouterConfig();
|
|
76
|
+
if (!config.enabled) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const routedProvider = config.taskRouting[taskType];
|
|
80
|
+
const provider = routedProvider || config.defaultProvider;
|
|
81
|
+
return config.providers[provider] || null;
|
|
82
|
+
}
|
|
83
|
+
function buildModelEnv(modelConfig) {
|
|
84
|
+
const env = {};
|
|
85
|
+
const apiKey = process.env[modelConfig.apiKeyEnv];
|
|
86
|
+
if (!apiKey) {
|
|
87
|
+
console.warn(`[model-router] API key not found: ${modelConfig.apiKeyEnv}`);
|
|
88
|
+
return env;
|
|
89
|
+
}
|
|
90
|
+
env["ANTHROPIC_MODEL"] = modelConfig.model;
|
|
91
|
+
env["ANTHROPIC_SMALL_FAST_MODEL"] = modelConfig.model;
|
|
92
|
+
env["ANTHROPIC_AUTH_TOKEN"] = apiKey;
|
|
93
|
+
if (modelConfig.baseUrl) {
|
|
94
|
+
env["ANTHROPIC_BASE_URL"] = modelConfig.baseUrl;
|
|
95
|
+
}
|
|
96
|
+
return env;
|
|
97
|
+
}
|
|
98
|
+
function isPlanningContext(input) {
|
|
99
|
+
const planPatterns = [
|
|
100
|
+
/\bplan\b/i,
|
|
101
|
+
/\barchitect/i,
|
|
102
|
+
/\bdesign\b/i,
|
|
103
|
+
/\bstrateg/i,
|
|
104
|
+
/\bimplement.*approach/i,
|
|
105
|
+
/\bhow.*should.*we/i,
|
|
106
|
+
/\bthink.*through/i,
|
|
107
|
+
/\breason.*about/i,
|
|
108
|
+
/\banalyze.*options/i,
|
|
109
|
+
/\btrade-?offs?/i
|
|
110
|
+
];
|
|
111
|
+
return planPatterns.some((pattern) => pattern.test(input));
|
|
112
|
+
}
|
|
113
|
+
function requiresDeepThinking(input) {
|
|
114
|
+
const thinkPatterns = [
|
|
115
|
+
/\bcomplex/i,
|
|
116
|
+
/\bdifficult/i,
|
|
117
|
+
/\btricky/i,
|
|
118
|
+
/\bcareful/i,
|
|
119
|
+
/\bstep.*by.*step/i,
|
|
120
|
+
/\bthink.*hard/i,
|
|
121
|
+
/\bultrathink/i,
|
|
122
|
+
/\b--think/i,
|
|
123
|
+
/\b--think-hard/i
|
|
124
|
+
];
|
|
125
|
+
return thinkPatterns.some((pattern) => pattern.test(input));
|
|
126
|
+
}
|
|
127
|
+
class ModelRouter {
|
|
128
|
+
config;
|
|
129
|
+
currentProvider;
|
|
130
|
+
inFallbackMode = false;
|
|
131
|
+
fallbackReason;
|
|
132
|
+
constructor() {
|
|
133
|
+
this.config = loadModelRouterConfig();
|
|
134
|
+
this.currentProvider = this.config.defaultProvider;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Route a task to the appropriate model
|
|
138
|
+
*/
|
|
139
|
+
route(taskType, input) {
|
|
140
|
+
if (!this.config.enabled) {
|
|
141
|
+
return { provider: "anthropic", env: {}, switched: false };
|
|
142
|
+
}
|
|
143
|
+
let detectedType = taskType;
|
|
144
|
+
if (input && taskType === "default") {
|
|
145
|
+
if (isPlanningContext(input)) {
|
|
146
|
+
detectedType = "plan";
|
|
147
|
+
} else if (requiresDeepThinking(input)) {
|
|
148
|
+
detectedType = "think";
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const modelConfig = getModelForTask(detectedType);
|
|
152
|
+
if (!modelConfig) {
|
|
153
|
+
return { provider: "anthropic", env: {}, switched: false };
|
|
154
|
+
}
|
|
155
|
+
const switched = modelConfig.provider !== this.currentProvider;
|
|
156
|
+
this.currentProvider = modelConfig.provider;
|
|
157
|
+
return {
|
|
158
|
+
provider: modelConfig.provider,
|
|
159
|
+
env: buildModelEnv(modelConfig),
|
|
160
|
+
switched
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get current provider
|
|
165
|
+
*/
|
|
166
|
+
getCurrentProvider() {
|
|
167
|
+
return this.currentProvider;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Force switch to a specific provider
|
|
171
|
+
*/
|
|
172
|
+
switchTo(provider) {
|
|
173
|
+
const modelConfig = this.config.providers[provider];
|
|
174
|
+
if (!modelConfig) {
|
|
175
|
+
console.warn(`[model-router] Provider not configured: ${provider}`);
|
|
176
|
+
return {};
|
|
177
|
+
}
|
|
178
|
+
this.currentProvider = provider;
|
|
179
|
+
return buildModelEnv(modelConfig);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Reset to default provider
|
|
183
|
+
*/
|
|
184
|
+
reset() {
|
|
185
|
+
this.currentProvider = this.config.defaultProvider;
|
|
186
|
+
this.inFallbackMode = false;
|
|
187
|
+
this.fallbackReason = void 0;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Check if fallback is enabled and configured
|
|
191
|
+
*/
|
|
192
|
+
isFallbackEnabled() {
|
|
193
|
+
if (!this.config.fallback?.enabled) return false;
|
|
194
|
+
const fallbackProvider = this.config.providers[this.config.fallback.provider];
|
|
195
|
+
if (!fallbackProvider) return false;
|
|
196
|
+
const apiKey = process.env[fallbackProvider.apiKeyEnv];
|
|
197
|
+
return !!apiKey;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Check if error should trigger fallback
|
|
201
|
+
*/
|
|
202
|
+
shouldFallback(error) {
|
|
203
|
+
if (!this.isFallbackEnabled()) return false;
|
|
204
|
+
if (this.inFallbackMode) return false;
|
|
205
|
+
const fallback = this.config.fallback;
|
|
206
|
+
if (fallback.onRateLimit && error.status === 429) {
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
if (fallback.onError && error.status && error.status >= 500) {
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
if (fallback.onTimeout) {
|
|
213
|
+
const isTimeout = error.code === "ETIMEDOUT" || error.code === "ESOCKETTIMEDOUT" || error.message?.toLowerCase().includes("timeout");
|
|
214
|
+
if (isTimeout) return true;
|
|
215
|
+
}
|
|
216
|
+
if (error.message?.toLowerCase().includes("overloaded")) {
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Activate fallback mode
|
|
223
|
+
*/
|
|
224
|
+
activateFallback(reason) {
|
|
225
|
+
if (!this.isFallbackEnabled()) {
|
|
226
|
+
console.warn("[model-router] Fallback not available");
|
|
227
|
+
return {};
|
|
228
|
+
}
|
|
229
|
+
const fallbackProvider = this.config.fallback.provider;
|
|
230
|
+
const modelConfig = this.config.providers[fallbackProvider];
|
|
231
|
+
if (!modelConfig) {
|
|
232
|
+
console.warn(
|
|
233
|
+
`[model-router] Fallback provider not configured: ${fallbackProvider}`
|
|
234
|
+
);
|
|
235
|
+
return {};
|
|
236
|
+
}
|
|
237
|
+
this.inFallbackMode = true;
|
|
238
|
+
this.fallbackReason = reason;
|
|
239
|
+
this.currentProvider = fallbackProvider;
|
|
240
|
+
console.log(
|
|
241
|
+
`[model-router] Fallback activated: ${reason} -> ${fallbackProvider}`
|
|
242
|
+
);
|
|
243
|
+
return buildModelEnv(modelConfig);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Get fallback configuration
|
|
247
|
+
*/
|
|
248
|
+
getFallbackConfig() {
|
|
249
|
+
return this.config.fallback;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Check if currently in fallback mode
|
|
253
|
+
*/
|
|
254
|
+
isInFallbackMode() {
|
|
255
|
+
return this.inFallbackMode;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Get reason for fallback
|
|
259
|
+
*/
|
|
260
|
+
getFallbackReason() {
|
|
261
|
+
return this.fallbackReason;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get fallback environment variables (for pre-configuring)
|
|
265
|
+
*/
|
|
266
|
+
getFallbackEnv() {
|
|
267
|
+
if (!this.isFallbackEnabled()) return {};
|
|
268
|
+
const fallbackProvider = this.config.fallback.provider;
|
|
269
|
+
const modelConfig = this.config.providers[fallbackProvider];
|
|
270
|
+
if (!modelConfig) return {};
|
|
271
|
+
return buildModelEnv(modelConfig);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
let routerInstance = null;
|
|
275
|
+
function getModelRouter() {
|
|
276
|
+
if (!routerInstance) {
|
|
277
|
+
routerInstance = new ModelRouter();
|
|
278
|
+
}
|
|
279
|
+
return routerInstance;
|
|
280
|
+
}
|
|
281
|
+
function getPlanModeEnv() {
|
|
282
|
+
const router = getModelRouter();
|
|
283
|
+
const result = router.route("plan");
|
|
284
|
+
return result.env;
|
|
285
|
+
}
|
|
286
|
+
function getThinkingModeEnv() {
|
|
287
|
+
const router = getModelRouter();
|
|
288
|
+
const result = router.route("think");
|
|
289
|
+
return result.env;
|
|
290
|
+
}
|
|
291
|
+
function isFallbackAvailable() {
|
|
292
|
+
const router = getModelRouter();
|
|
293
|
+
return router.isFallbackEnabled();
|
|
294
|
+
}
|
|
295
|
+
function getFallbackStatus() {
|
|
296
|
+
const router = getModelRouter();
|
|
297
|
+
const config = loadModelRouterConfig();
|
|
298
|
+
if (!config.fallback?.enabled) {
|
|
299
|
+
return {
|
|
300
|
+
enabled: false,
|
|
301
|
+
provider: null,
|
|
302
|
+
hasApiKey: false,
|
|
303
|
+
inFallback: false
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
const fallbackProvider = config.providers[config.fallback.provider];
|
|
307
|
+
const hasApiKey = fallbackProvider ? !!process.env[fallbackProvider.apiKeyEnv] : false;
|
|
308
|
+
return {
|
|
309
|
+
enabled: true,
|
|
310
|
+
provider: config.fallback.provider,
|
|
311
|
+
hasApiKey,
|
|
312
|
+
inFallback: router.isInFallbackMode(),
|
|
313
|
+
reason: router.getFallbackReason()
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
function triggerFallback(reason = "manual") {
|
|
317
|
+
const router = getModelRouter();
|
|
318
|
+
return router.activateFallback(reason);
|
|
319
|
+
}
|
|
320
|
+
function resetFallback() {
|
|
321
|
+
const router = getModelRouter();
|
|
322
|
+
router.reset();
|
|
323
|
+
}
|
|
324
|
+
export {
|
|
325
|
+
ModelRouter,
|
|
326
|
+
buildModelEnv,
|
|
327
|
+
getFallbackStatus,
|
|
328
|
+
getModelForTask,
|
|
329
|
+
getModelRouter,
|
|
330
|
+
getPlanModeEnv,
|
|
331
|
+
getThinkingModeEnv,
|
|
332
|
+
isFallbackAvailable,
|
|
333
|
+
isPlanningContext,
|
|
334
|
+
loadModelRouterConfig,
|
|
335
|
+
requiresDeepThinking,
|
|
336
|
+
resetFallback,
|
|
337
|
+
saveModelRouterConfig,
|
|
338
|
+
triggerFallback
|
|
339
|
+
};
|
|
340
|
+
//# sourceMappingURL=model-router.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/models/model-router.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Model Router - Switch between Claude and alternative models\n * Supports routing plan/thinking tasks to specialized models like Qwen3-Max-Thinking\n */\n\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { writeFileSecure, ensureSecureDir } from '../../hooks/secure-fs.js';\nimport {\n ModelRouterConfigSchema,\n parseConfigSafe,\n} from '../../hooks/schemas.js';\n\nexport type ModelProvider =\n | 'anthropic'\n | 'qwen'\n | 'openai'\n | 'ollama'\n | 'custom';\nexport type TaskType = 'default' | 'plan' | 'think' | 'code' | 'review';\n\nexport interface ModelConfig {\n provider: ModelProvider;\n model: string;\n baseUrl?: string;\n apiKeyEnv: string; // Environment variable name for API key\n headers?: Record<string, string>;\n params?: Record<string, unknown>; // Provider-specific params\n}\n\nexport interface ModelRouterConfig {\n enabled: boolean;\n defaultProvider: ModelProvider;\n\n // Route specific task types to different models\n taskRouting: {\n plan?: ModelProvider; // Planning/architecture tasks\n think?: ModelProvider; // Deep thinking/reasoning\n code?: ModelProvider; // Code generation\n review?: ModelProvider; // Code review\n };\n\n // Fallback configuration\n fallback: {\n enabled: boolean;\n provider: ModelProvider; // Fallback provider (default: qwen)\n onRateLimit: boolean; // Fallback on 429 errors\n onError: boolean; // Fallback on 5xx errors\n onTimeout: boolean; // Fallback on timeout\n maxRetries: number; // Retries before fallback\n retryDelayMs: number; // Delay between retries\n };\n\n // Provider configurations\n providers: {\n anthropic?: ModelConfig;\n qwen?: ModelConfig;\n openai?: ModelConfig;\n ollama?: ModelConfig;\n custom?: ModelConfig;\n };\n\n // Thinking mode settings\n thinkingMode: {\n enabled: boolean;\n budget?: number; // Max thinking tokens\n temperature?: number; // Recommended: 0.6 for thinking\n topP?: number; // Recommended: 0.95 for thinking\n };\n}\n\nconst CONFIG_PATH = join(homedir(), '.stackmemory', 'model-router.json');\n\nconst DEFAULT_CONFIG: ModelRouterConfig = {\n enabled: false,\n defaultProvider: 'anthropic',\n taskRouting: {},\n fallback: {\n enabled: true, // Fallback enabled by default\n provider: 'qwen',\n onRateLimit: true,\n onError: true,\n onTimeout: true,\n maxRetries: 2,\n retryDelayMs: 1000,\n },\n providers: {\n anthropic: {\n provider: 'anthropic',\n model: 'claude-sonnet-4-20250514',\n apiKeyEnv: 'ANTHROPIC_API_KEY',\n },\n qwen: {\n provider: 'qwen',\n model: 'qwen3-max-2025-01-23',\n baseUrl: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n apiKeyEnv: 'DASHSCOPE_API_KEY',\n params: {\n enable_thinking: true,\n thinking_budget: 10000,\n },\n },\n },\n thinkingMode: {\n enabled: true,\n budget: 10000,\n temperature: 0.6,\n topP: 0.95,\n },\n};\n\n/**\n * Load model router configuration with Zod validation\n */\nexport function loadModelRouterConfig(): ModelRouterConfig {\n try {\n if (existsSync(CONFIG_PATH)) {\n const data = JSON.parse(readFileSync(CONFIG_PATH, 'utf8'));\n return parseConfigSafe(\n ModelRouterConfigSchema,\n { ...DEFAULT_CONFIG, ...data },\n DEFAULT_CONFIG,\n 'model-router'\n );\n }\n } catch {\n // Use defaults\n }\n return { ...DEFAULT_CONFIG };\n}\n\n/**\n * Save model router configuration\n */\nexport function saveModelRouterConfig(config: ModelRouterConfig): void {\n try {\n ensureSecureDir(join(homedir(), '.stackmemory'));\n writeFileSecure(CONFIG_PATH, JSON.stringify(config, null, 2));\n } catch {\n // Silently fail\n }\n}\n\n/**\n * Get model config for a specific task type\n */\nexport function getModelForTask(taskType: TaskType): ModelConfig | null {\n const config = loadModelRouterConfig();\n\n if (!config.enabled) {\n return null; // Use default Claude\n }\n\n // Check task-specific routing\n const routedProvider =\n config.taskRouting[taskType as keyof typeof config.taskRouting];\n const provider = routedProvider || config.defaultProvider;\n\n return config.providers[provider] || null;\n}\n\n/**\n * Build environment variables for alternative model\n */\nexport function buildModelEnv(\n modelConfig: ModelConfig\n): Record<string, string> {\n const env: Record<string, string> = {};\n\n // Get API key from environment\n const apiKey = process.env[modelConfig.apiKeyEnv];\n if (!apiKey) {\n console.warn(`[model-router] API key not found: ${modelConfig.apiKeyEnv}`);\n return env;\n }\n\n // Set Anthropic-compatible env vars (Claude Code reads these)\n env['ANTHROPIC_MODEL'] = modelConfig.model;\n env['ANTHROPIC_SMALL_FAST_MODEL'] = modelConfig.model;\n env['ANTHROPIC_AUTH_TOKEN'] = apiKey;\n\n if (modelConfig.baseUrl) {\n env['ANTHROPIC_BASE_URL'] = modelConfig.baseUrl;\n }\n\n return env;\n}\n\n/**\n * Detect if current context is a planning task\n */\nexport function isPlanningContext(input: string): boolean {\n const planPatterns = [\n /\\bplan\\b/i,\n /\\barchitect/i,\n /\\bdesign\\b/i,\n /\\bstrateg/i,\n /\\bimplement.*approach/i,\n /\\bhow.*should.*we/i,\n /\\bthink.*through/i,\n /\\breason.*about/i,\n /\\banalyze.*options/i,\n /\\btrade-?offs?/i,\n ];\n\n return planPatterns.some((pattern) => pattern.test(input));\n}\n\n/**\n * Detect if task requires deep thinking\n */\nexport function requiresDeepThinking(input: string): boolean {\n const thinkPatterns = [\n /\\bcomplex/i,\n /\\bdifficult/i,\n /\\btricky/i,\n /\\bcareful/i,\n /\\bstep.*by.*step/i,\n /\\bthink.*hard/i,\n /\\bultrathink/i,\n /\\b--think/i,\n /\\b--think-hard/i,\n ];\n\n return thinkPatterns.some((pattern) => pattern.test(input));\n}\n\n/**\n * Error types that trigger fallback\n */\nexport type FallbackTrigger = 'rate_limit' | 'error' | 'timeout' | 'manual';\n\n/**\n * Model Router class for managing model switching\n */\nexport class ModelRouter {\n private config: ModelRouterConfig;\n private currentProvider: ModelProvider;\n private inFallbackMode: boolean = false;\n private fallbackReason?: FallbackTrigger;\n\n constructor() {\n this.config = loadModelRouterConfig();\n this.currentProvider = this.config.defaultProvider;\n }\n\n /**\n * Route a task to the appropriate model\n */\n route(\n taskType: TaskType,\n input?: string\n ): {\n provider: ModelProvider;\n env: Record<string, string>;\n switched: boolean;\n } {\n if (!this.config.enabled) {\n return { provider: 'anthropic', env: {}, switched: false };\n }\n\n // Auto-detect task type if input provided\n let detectedType = taskType;\n if (input && taskType === 'default') {\n if (isPlanningContext(input)) {\n detectedType = 'plan';\n } else if (requiresDeepThinking(input)) {\n detectedType = 'think';\n }\n }\n\n const modelConfig = getModelForTask(detectedType);\n if (!modelConfig) {\n return { provider: 'anthropic', env: {}, switched: false };\n }\n\n const switched = modelConfig.provider !== this.currentProvider;\n this.currentProvider = modelConfig.provider;\n\n return {\n provider: modelConfig.provider,\n env: buildModelEnv(modelConfig),\n switched,\n };\n }\n\n /**\n * Get current provider\n */\n getCurrentProvider(): ModelProvider {\n return this.currentProvider;\n }\n\n /**\n * Force switch to a specific provider\n */\n switchTo(provider: ModelProvider): Record<string, string> {\n const modelConfig = this.config.providers[provider];\n if (!modelConfig) {\n console.warn(`[model-router] Provider not configured: ${provider}`);\n return {};\n }\n\n this.currentProvider = provider;\n return buildModelEnv(modelConfig);\n }\n\n /**\n * Reset to default provider\n */\n reset(): void {\n this.currentProvider = this.config.defaultProvider;\n this.inFallbackMode = false;\n this.fallbackReason = undefined;\n }\n\n /**\n * Check if fallback is enabled and configured\n */\n isFallbackEnabled(): boolean {\n if (!this.config.fallback?.enabled) return false;\n\n const fallbackProvider =\n this.config.providers[this.config.fallback.provider];\n if (!fallbackProvider) return false;\n\n // Check if fallback provider has API key\n const apiKey = process.env[fallbackProvider.apiKeyEnv];\n return !!apiKey;\n }\n\n /**\n * Check if error should trigger fallback\n */\n shouldFallback(error: {\n status?: number;\n code?: string;\n message?: string;\n }): boolean {\n if (!this.isFallbackEnabled()) return false;\n if (this.inFallbackMode) return false; // Already in fallback\n\n const fallback = this.config.fallback;\n\n // Rate limit (429)\n if (fallback.onRateLimit && error.status === 429) {\n return true;\n }\n\n // Server errors (5xx)\n if (fallback.onError && error.status && error.status >= 500) {\n return true;\n }\n\n // Timeout\n if (fallback.onTimeout) {\n const isTimeout =\n error.code === 'ETIMEDOUT' ||\n error.code === 'ESOCKETTIMEDOUT' ||\n error.message?.toLowerCase().includes('timeout');\n if (isTimeout) return true;\n }\n\n // Overloaded\n if (error.message?.toLowerCase().includes('overloaded')) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Activate fallback mode\n */\n activateFallback(reason: FallbackTrigger): Record<string, string> {\n if (!this.isFallbackEnabled()) {\n console.warn('[model-router] Fallback not available');\n return {};\n }\n\n const fallbackProvider = this.config.fallback.provider;\n const modelConfig = this.config.providers[fallbackProvider];\n\n if (!modelConfig) {\n console.warn(\n `[model-router] Fallback provider not configured: ${fallbackProvider}`\n );\n return {};\n }\n\n this.inFallbackMode = true;\n this.fallbackReason = reason;\n this.currentProvider = fallbackProvider;\n\n console.log(\n `[model-router] Fallback activated: ${reason} -> ${fallbackProvider}`\n );\n\n return buildModelEnv(modelConfig);\n }\n\n /**\n * Get fallback configuration\n */\n getFallbackConfig(): ModelRouterConfig['fallback'] {\n return this.config.fallback;\n }\n\n /**\n * Check if currently in fallback mode\n */\n isInFallbackMode(): boolean {\n return this.inFallbackMode;\n }\n\n /**\n * Get reason for fallback\n */\n getFallbackReason(): FallbackTrigger | undefined {\n return this.fallbackReason;\n }\n\n /**\n * Get fallback environment variables (for pre-configuring)\n */\n getFallbackEnv(): Record<string, string> {\n if (!this.isFallbackEnabled()) return {};\n\n const fallbackProvider = this.config.fallback.provider;\n const modelConfig = this.config.providers[fallbackProvider];\n\n if (!modelConfig) return {};\n\n return buildModelEnv(modelConfig);\n }\n}\n\n// Singleton instance\nlet routerInstance: ModelRouter | null = null;\n\nexport function getModelRouter(): ModelRouter {\n if (!routerInstance) {\n routerInstance = new ModelRouter();\n }\n return routerInstance;\n}\n\n/**\n * Quick helper to get env vars for plan mode\n */\nexport function getPlanModeEnv(): Record<string, string> {\n const router = getModelRouter();\n const result = router.route('plan');\n return result.env;\n}\n\n/**\n * Quick helper to get env vars for thinking mode\n */\nexport function getThinkingModeEnv(): Record<string, string> {\n const router = getModelRouter();\n const result = router.route('think');\n return result.env;\n}\n\n/**\n * Check if fallback is available\n */\nexport function isFallbackAvailable(): boolean {\n const router = getModelRouter();\n return router.isFallbackEnabled();\n}\n\n/**\n * Get fallback status for display\n */\nexport function getFallbackStatus(): {\n enabled: boolean;\n provider: ModelProvider | null;\n hasApiKey: boolean;\n inFallback: boolean;\n reason?: FallbackTrigger;\n} {\n const router = getModelRouter();\n const config = loadModelRouterConfig();\n\n if (!config.fallback?.enabled) {\n return {\n enabled: false,\n provider: null,\n hasApiKey: false,\n inFallback: false,\n };\n }\n\n const fallbackProvider = config.providers[config.fallback.provider];\n const hasApiKey = fallbackProvider\n ? !!process.env[fallbackProvider.apiKeyEnv]\n : false;\n\n return {\n enabled: true,\n provider: config.fallback.provider,\n hasApiKey,\n inFallback: router.isInFallbackMode(),\n reason: router.getFallbackReason(),\n };\n}\n\n/**\n * Trigger fallback manually (for testing or forced switch)\n */\nexport function triggerFallback(\n reason: FallbackTrigger = 'manual'\n): Record<string, string> {\n const router = getModelRouter();\n return router.activateFallback(reason);\n}\n\n/**\n * Reset fallback state\n */\nexport function resetFallback(): void {\n const router = getModelRouter();\n router.reset();\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
+
import { dirname as __pathDirname } from 'path';
|
|
3
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __pathDirname(__filename);
|
|
5
|
+
import {
|
|
6
|
+
ErrorCode,
|
|
7
|
+
StackMemoryError,
|
|
8
|
+
DatabaseError,
|
|
9
|
+
FrameError,
|
|
10
|
+
TaskError,
|
|
11
|
+
IntegrationError,
|
|
12
|
+
MCPError,
|
|
13
|
+
ValidationError,
|
|
14
|
+
ProjectError,
|
|
15
|
+
SystemError,
|
|
16
|
+
ErrorHandler,
|
|
17
|
+
getUserFriendlyMessage,
|
|
18
|
+
isRetryableError,
|
|
19
|
+
getErrorMessage,
|
|
20
|
+
wrapError,
|
|
21
|
+
isStackMemoryError,
|
|
22
|
+
createErrorHandler,
|
|
23
|
+
validateInput,
|
|
24
|
+
validateEmail,
|
|
25
|
+
validatePath
|
|
26
|
+
} from "../errors/index.js";
|
|
27
|
+
export {
|
|
28
|
+
DatabaseError,
|
|
29
|
+
ErrorCode,
|
|
30
|
+
ErrorHandler,
|
|
31
|
+
FrameError,
|
|
32
|
+
IntegrationError,
|
|
33
|
+
MCPError,
|
|
34
|
+
ProjectError,
|
|
35
|
+
StackMemoryError,
|
|
36
|
+
SystemError,
|
|
37
|
+
TaskError,
|
|
38
|
+
ValidationError,
|
|
39
|
+
createErrorHandler,
|
|
40
|
+
getErrorMessage,
|
|
41
|
+
getUserFriendlyMessage,
|
|
42
|
+
isRetryableError,
|
|
43
|
+
isStackMemoryError,
|
|
44
|
+
validateEmail,
|
|
45
|
+
validateInput,
|
|
46
|
+
validatePath,
|
|
47
|
+
wrapError
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/monitoring/error-handler.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Error handling re-exports for backwards compatibility\n *\n * All error handling is now consolidated in src/core/errors/index.ts\n * This module re-exports for code that imports from monitoring/error-handler\n */\n\nexport {\n // Error codes\n ErrorCode,\n\n // Error classes\n StackMemoryError,\n DatabaseError,\n FrameError,\n TaskError,\n IntegrationError,\n MCPError,\n ValidationError,\n ProjectError,\n SystemError,\n\n // Error handler\n ErrorHandler,\n\n // Utilities\n getUserFriendlyMessage,\n isRetryableError,\n getErrorMessage,\n wrapError,\n isStackMemoryError,\n createErrorHandler,\n\n // Validators\n validateInput,\n validateEmail,\n validatePath,\n\n // Types\n type ErrorContext,\n type StackMemoryErrorOptions,\n} from '../errors/index.js';\n"],
|
|
5
|
+
"mappings": ";;;;AAOA;AAAA,EAEE;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
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 * as fs from "fs";
|
|
6
|
+
import * as path from "path";
|
|
7
|
+
const SENSITIVE_PATTERNS = [
|
|
8
|
+
/\b(api[_-]?key|apikey)\s*[:=]\s*['"]?[\w-]+['"]?/gi,
|
|
9
|
+
/\b(secret|password|token|credential|auth)\s*[:=]\s*['"]?[\w-]+['"]?/gi,
|
|
10
|
+
/\b(lin_api_[\w]+)/gi,
|
|
11
|
+
/\b(lin_oauth_[\w]+)/gi,
|
|
12
|
+
/\b(sk-[\w]+)/gi,
|
|
13
|
+
/\b(npm_[\w]+)/gi,
|
|
14
|
+
/\b(ghp_[\w]+)/gi,
|
|
15
|
+
/\b(ghs_[\w]+)/gi,
|
|
16
|
+
/Bearer\s+[\w.-]+/gi,
|
|
17
|
+
/Basic\s+[\w=]+/gi,
|
|
18
|
+
/postgres(ql)?:\/\/[^@\s]+:[^@\s]+@/gi
|
|
19
|
+
];
|
|
20
|
+
const SENSITIVE_FIELD_NAMES = [
|
|
21
|
+
"password",
|
|
22
|
+
"token",
|
|
23
|
+
"apikey",
|
|
24
|
+
"api_key",
|
|
25
|
+
"secret",
|
|
26
|
+
"credential",
|
|
27
|
+
"authorization",
|
|
28
|
+
"auth",
|
|
29
|
+
"accesstoken",
|
|
30
|
+
"access_token",
|
|
31
|
+
"refreshtoken",
|
|
32
|
+
"refresh_token"
|
|
33
|
+
];
|
|
34
|
+
function redactString(input) {
|
|
35
|
+
let result = input;
|
|
36
|
+
for (const pattern of SENSITIVE_PATTERNS) {
|
|
37
|
+
pattern.lastIndex = 0;
|
|
38
|
+
result = result.replace(pattern, "[REDACTED]");
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
function sanitizeForLogging(obj) {
|
|
43
|
+
if (obj === null || obj === void 0) {
|
|
44
|
+
return obj;
|
|
45
|
+
}
|
|
46
|
+
if (typeof obj === "string") {
|
|
47
|
+
return redactString(obj);
|
|
48
|
+
}
|
|
49
|
+
if (Array.isArray(obj)) {
|
|
50
|
+
return obj.map(sanitizeForLogging);
|
|
51
|
+
}
|
|
52
|
+
if (typeof obj === "object") {
|
|
53
|
+
const sanitized = {};
|
|
54
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
55
|
+
if (SENSITIVE_FIELD_NAMES.some((sf) => key.toLowerCase().includes(sf))) {
|
|
56
|
+
sanitized[key] = "[REDACTED]";
|
|
57
|
+
} else {
|
|
58
|
+
sanitized[key] = sanitizeForLogging(value);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return sanitized;
|
|
62
|
+
}
|
|
63
|
+
return obj;
|
|
64
|
+
}
|
|
65
|
+
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
66
|
+
LogLevel2[LogLevel2["ERROR"] = 0] = "ERROR";
|
|
67
|
+
LogLevel2[LogLevel2["WARN"] = 1] = "WARN";
|
|
68
|
+
LogLevel2[LogLevel2["INFO"] = 2] = "INFO";
|
|
69
|
+
LogLevel2[LogLevel2["DEBUG"] = 3] = "DEBUG";
|
|
70
|
+
return LogLevel2;
|
|
71
|
+
})(LogLevel || {});
|
|
72
|
+
class Logger {
|
|
73
|
+
static instance;
|
|
74
|
+
logLevel = 2 /* INFO */;
|
|
75
|
+
logFile;
|
|
76
|
+
fileLoggingDisabledNotified = false;
|
|
77
|
+
constructor() {
|
|
78
|
+
const envLevel = process.env["STACKMEMORY_LOG_LEVEL"]?.toUpperCase();
|
|
79
|
+
switch (envLevel) {
|
|
80
|
+
case "ERROR":
|
|
81
|
+
this.logLevel = 0 /* ERROR */;
|
|
82
|
+
break;
|
|
83
|
+
case "WARN":
|
|
84
|
+
this.logLevel = 1 /* WARN */;
|
|
85
|
+
break;
|
|
86
|
+
case "DEBUG":
|
|
87
|
+
this.logLevel = 3 /* DEBUG */;
|
|
88
|
+
break;
|
|
89
|
+
default:
|
|
90
|
+
this.logLevel = 2 /* INFO */;
|
|
91
|
+
}
|
|
92
|
+
if (this.logLevel === 3 /* DEBUG */ || process.env["STACKMEMORY_LOG_FILE"]) {
|
|
93
|
+
this.logFile = process.env["STACKMEMORY_LOG_FILE"] || path.join(
|
|
94
|
+
process.env["HOME"] || ".",
|
|
95
|
+
".stackmemory",
|
|
96
|
+
"logs",
|
|
97
|
+
"cli.log"
|
|
98
|
+
);
|
|
99
|
+
this.ensureLogDirectory();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
static getInstance() {
|
|
103
|
+
if (!Logger.instance) {
|
|
104
|
+
Logger.instance = new Logger();
|
|
105
|
+
}
|
|
106
|
+
return Logger.instance;
|
|
107
|
+
}
|
|
108
|
+
ensureLogDirectory() {
|
|
109
|
+
if (!this.logFile) return;
|
|
110
|
+
const logDir = path.dirname(this.logFile);
|
|
111
|
+
try {
|
|
112
|
+
if (!fs.existsSync(logDir)) {
|
|
113
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
114
|
+
}
|
|
115
|
+
} catch (err) {
|
|
116
|
+
this.logFile = void 0;
|
|
117
|
+
if (!this.fileLoggingDisabledNotified) {
|
|
118
|
+
this.fileLoggingDisabledNotified = true;
|
|
119
|
+
const msg = "[Logger] File logging disabled (failed to create log directory). Falling back to console only.";
|
|
120
|
+
console.warn(msg);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
writeLog(entry) {
|
|
125
|
+
const sanitizedEntry = {
|
|
126
|
+
...entry,
|
|
127
|
+
message: redactString(entry.message),
|
|
128
|
+
context: entry.context ? sanitizeForLogging(entry.context) : void 0
|
|
129
|
+
};
|
|
130
|
+
const logLine = JSON.stringify(sanitizedEntry) + "\n";
|
|
131
|
+
if (this.logFile) {
|
|
132
|
+
try {
|
|
133
|
+
fs.appendFileSync(this.logFile, logLine);
|
|
134
|
+
} catch (err) {
|
|
135
|
+
this.logFile = void 0;
|
|
136
|
+
if (!this.fileLoggingDisabledNotified) {
|
|
137
|
+
this.fileLoggingDisabledNotified = true;
|
|
138
|
+
const msg = "[Logger] File logging disabled (write failed). Falling back to console only.";
|
|
139
|
+
console.warn(msg);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (entry.level <= this.logLevel) {
|
|
144
|
+
const levelNames = ["ERROR", "WARN", "INFO", "DEBUG"];
|
|
145
|
+
const levelName = levelNames[entry.level] || "UNKNOWN";
|
|
146
|
+
const consoleMessage = `[${entry.timestamp}] ${levelName}: ${entry.message}`;
|
|
147
|
+
if (entry.level === 0 /* ERROR */) {
|
|
148
|
+
console.error(consoleMessage);
|
|
149
|
+
if (entry.error) {
|
|
150
|
+
console.error(entry.error.stack);
|
|
151
|
+
}
|
|
152
|
+
} else if (entry.level === 1 /* WARN */) {
|
|
153
|
+
console.warn(consoleMessage);
|
|
154
|
+
} else {
|
|
155
|
+
console.log(consoleMessage);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
error(message, errorOrContext, context) {
|
|
160
|
+
const isError = errorOrContext instanceof Error;
|
|
161
|
+
this.writeLog({
|
|
162
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
163
|
+
level: 0 /* ERROR */,
|
|
164
|
+
message,
|
|
165
|
+
context: isError ? context : errorOrContext,
|
|
166
|
+
error: isError ? errorOrContext : void 0
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
warn(message, errorOrContext) {
|
|
170
|
+
const isError = errorOrContext instanceof Error;
|
|
171
|
+
this.writeLog({
|
|
172
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
173
|
+
level: 1 /* WARN */,
|
|
174
|
+
message,
|
|
175
|
+
context: isError ? void 0 : errorOrContext,
|
|
176
|
+
error: isError ? errorOrContext : void 0
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
info(message, context) {
|
|
180
|
+
this.writeLog({
|
|
181
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
182
|
+
level: 2 /* INFO */,
|
|
183
|
+
message,
|
|
184
|
+
context
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
debug(message, context) {
|
|
188
|
+
this.writeLog({
|
|
189
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
190
|
+
level: 3 /* DEBUG */,
|
|
191
|
+
message,
|
|
192
|
+
context
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
const logger = Logger.getInstance();
|
|
197
|
+
export {
|
|
198
|
+
LogLevel,
|
|
199
|
+
Logger,
|
|
200
|
+
logger
|
|
201
|
+
};
|
|
202
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/monitoring/logger.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Structured logging utility for StackMemory CLI\n * Includes automatic sensitive data redaction for security\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * Sensitive data patterns that should be redacted from logs\n */\nconst SENSITIVE_PATTERNS = [\n /\\b(api[_-]?key|apikey)\\s*[:=]\\s*['\"]?[\\w-]+['\"]?/gi,\n /\\b(secret|password|token|credential|auth)\\s*[:=]\\s*['\"]?[\\w-]+['\"]?/gi,\n /\\b(lin_api_[\\w]+)/gi,\n /\\b(lin_oauth_[\\w]+)/gi,\n /\\b(sk-[\\w]+)/gi,\n /\\b(npm_[\\w]+)/gi,\n /\\b(ghp_[\\w]+)/gi,\n /\\b(ghs_[\\w]+)/gi,\n /Bearer\\s+[\\w.-]+/gi,\n /Basic\\s+[\\w=]+/gi,\n /postgres(ql)?:\\/\\/[^@\\s]+:[^@\\s]+@/gi,\n];\n\nconst SENSITIVE_FIELD_NAMES = [\n 'password',\n 'token',\n 'apikey',\n 'api_key',\n 'secret',\n 'credential',\n 'authorization',\n 'auth',\n 'accesstoken',\n 'access_token',\n 'refreshtoken',\n 'refresh_token',\n];\n\n/**\n * Redact sensitive data from a string\n */\nfunction redactString(input: string): string {\n let result = input;\n for (const pattern of SENSITIVE_PATTERNS) {\n pattern.lastIndex = 0;\n result = result.replace(pattern, '[REDACTED]');\n }\n return result;\n}\n\n/**\n * Recursively sanitize an object for logging\n */\nfunction sanitizeForLogging(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj === 'string') {\n return redactString(obj);\n }\n\n if (Array.isArray(obj)) {\n return obj.map(sanitizeForLogging);\n }\n\n if (typeof obj === 'object') {\n const sanitized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (SENSITIVE_FIELD_NAMES.some((sf) => key.toLowerCase().includes(sf))) {\n sanitized[key] = '[REDACTED]';\n } else {\n sanitized[key] = sanitizeForLogging(value);\n }\n }\n return sanitized;\n }\n\n return obj;\n}\n\nexport enum LogLevel {\n ERROR = 0,\n WARN = 1,\n INFO = 2,\n DEBUG = 3,\n}\n\ninterface LogEntry {\n timestamp: string;\n level: LogLevel;\n message: string;\n context?: Record<string, unknown>;\n error?: Error;\n}\n\nexport class Logger {\n private static instance: Logger;\n private logLevel: LogLevel = LogLevel.INFO;\n private logFile?: string;\n private fileLoggingDisabledNotified = false;\n\n private constructor() {\n // Set log level from environment\n const envLevel = process.env['STACKMEMORY_LOG_LEVEL']?.toUpperCase();\n switch (envLevel) {\n case 'ERROR':\n this.logLevel = LogLevel.ERROR;\n break;\n case 'WARN':\n this.logLevel = LogLevel.WARN;\n break;\n case 'DEBUG':\n this.logLevel = LogLevel.DEBUG;\n break;\n default:\n this.logLevel = LogLevel.INFO;\n }\n\n // Set up log file if in debug mode or if specified\n if (\n this.logLevel === LogLevel.DEBUG ||\n process.env['STACKMEMORY_LOG_FILE']\n ) {\n this.logFile =\n process.env['STACKMEMORY_LOG_FILE'] ||\n path.join(\n process.env['HOME'] || '.',\n '.stackmemory',\n 'logs',\n 'cli.log'\n );\n this.ensureLogDirectory();\n }\n }\n\n static getInstance(): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger();\n }\n return Logger.instance;\n }\n\n private ensureLogDirectory(): void {\n if (!this.logFile) return;\n const logDir = path.dirname(this.logFile);\n try {\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n } catch (err: unknown) {\n // Disable file logging if we cannot create the directory (e.g., ENOSPC)\n this.logFile = undefined;\n if (!this.fileLoggingDisabledNotified) {\n this.fileLoggingDisabledNotified = true;\n // Emit a single warning to console so we don't spam output\n const msg =\n '[Logger] File logging disabled (failed to create log directory). Falling back to console only.';\n // Use console directly to avoid recursion\n\n console.warn(msg);\n }\n }\n }\n\n private writeLog(entry: LogEntry): void {\n // Sanitize context and message to prevent logging sensitive data\n const sanitizedEntry: LogEntry = {\n ...entry,\n message: redactString(entry.message),\n context: entry.context\n ? (sanitizeForLogging(entry.context) as Record<string, unknown>)\n : undefined,\n };\n const logLine = JSON.stringify(sanitizedEntry) + '\\n';\n\n // Always write to file if configured\n if (this.logFile) {\n try {\n fs.appendFileSync(this.logFile, logLine);\n } catch (err: unknown) {\n // Disable file logging on error (e.g., ENOSPC) to avoid repeated failures\n this.logFile = undefined;\n if (!this.fileLoggingDisabledNotified) {\n this.fileLoggingDisabledNotified = true;\n const msg =\n '[Logger] File logging disabled (write failed). Falling back to console only.';\n\n console.warn(msg);\n }\n }\n }\n\n // Console output based on level\n if (entry.level <= this.logLevel) {\n const levelNames = ['ERROR', 'WARN', 'INFO', 'DEBUG'];\n const levelName = levelNames[entry.level] || 'UNKNOWN';\n\n const consoleMessage = `[${entry.timestamp}] ${levelName}: ${entry.message}`;\n\n if (entry.level === LogLevel.ERROR) {\n console.error(consoleMessage);\n if (entry.error) {\n console.error(entry.error.stack);\n }\n } else if (entry.level === LogLevel.WARN) {\n console.warn(consoleMessage);\n } else {\n console.log(consoleMessage);\n }\n }\n }\n\n error(\n message: string,\n errorOrContext?: Error | Record<string, unknown>,\n context?: Record<string, unknown>\n ): void {\n const isError = errorOrContext instanceof Error;\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.ERROR,\n message,\n context: isError ? context : (errorOrContext as Record<string, unknown>),\n error: isError ? errorOrContext : undefined,\n });\n }\n\n warn(\n message: string,\n errorOrContext?: Error | Record<string, unknown>\n ): void {\n const isError = errorOrContext instanceof Error;\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.WARN,\n message,\n context: isError\n ? undefined\n : (errorOrContext as Record<string, unknown>),\n error: isError ? errorOrContext : undefined,\n });\n }\n\n info(message: string, context?: Record<string, unknown>): void {\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.INFO,\n message,\n context,\n });\n }\n\n debug(message: string, context?: Record<string, unknown>): void {\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.DEBUG,\n message,\n context,\n });\n }\n}\n\n// Export singleton instance\nexport const logger = Logger.getInstance();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["LogLevel"]
|
|
7
|
+
}
|