@stackmemoryai/stackmemory 0.5.58 → 0.5.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/search.js +20 -3
- package/dist/cli/commands/search.js.map +2 -2
- package/dist/core/database/sqlite-adapter.js +13 -3
- package/dist/core/database/sqlite-adapter.js.map +2 -2
- package/dist/core/errors/error-utils.js +208 -0
- package/dist/core/errors/error-utils.js.map +7 -0
- package/dist/core/errors/index.js +13 -4
- package/dist/core/errors/index.js.map +2 -2
- package/dist/core/merge/unified-merge-resolver.js +303 -0
- package/dist/core/merge/unified-merge-resolver.js.map +7 -0
- package/dist/core/monitoring/logger.js +61 -9
- package/dist/core/monitoring/logger.js.map +2 -2
- package/dist/core/security/index.js +35 -0
- package/dist/core/security/index.js.map +7 -0
- package/dist/core/security/input-sanitizer.js +321 -0
- package/dist/core/security/input-sanitizer.js.map +7 -0
- package/dist/integrations/linear/client.js +5 -1
- package/dist/integrations/linear/client.js.map +2 -2
- package/dist/integrations/mcp/remote-server.js +27 -36
- package/dist/integrations/mcp/remote-server.js.map +2 -2
- package/dist/integrations/mcp/server.js +44 -29
- package/dist/integrations/mcp/server.js.map +3 -3
- package/dist/scripts/benchmark-performance.js +48 -0
- package/dist/scripts/benchmark-performance.js.map +7 -0
- package/dist/scripts/check-redis.js +42 -0
- package/dist/scripts/check-redis.js.map +7 -0
- package/dist/scripts/initialize.js +116 -0
- package/dist/scripts/initialize.js.map +7 -0
- package/dist/scripts/list-linear-tasks.js +124 -0
- package/dist/scripts/list-linear-tasks.js.map +7 -0
- package/dist/scripts/measure-handoff-impact.js +340 -0
- package/dist/scripts/measure-handoff-impact.js.map +7 -0
- package/dist/scripts/query-chromadb.js +160 -0
- package/dist/scripts/query-chromadb.js.map +7 -0
- package/dist/scripts/show-linear-summary.js +119 -0
- package/dist/scripts/show-linear-summary.js.map +7 -0
- package/dist/scripts/simple-swarm-demo.js +90 -0
- package/dist/scripts/simple-swarm-demo.js.map +7 -0
- package/dist/scripts/status.js +155 -0
- package/dist/scripts/status.js.map +7 -0
- package/dist/scripts/test-chromadb-sync.js +192 -0
- package/dist/scripts/test-chromadb-sync.js.map +7 -0
- package/dist/scripts/test-ralph-iteration-fix.js +86 -0
- package/dist/scripts/test-ralph-iteration-fix.js.map +7 -0
- package/dist/scripts/test-ralph-iterations.js +121 -0
- package/dist/scripts/test-ralph-iterations.js.map +7 -0
- package/dist/scripts/test-redis-storage.js +389 -0
- package/dist/scripts/test-redis-storage.js.map +7 -0
- package/dist/scripts/test-simple-ralph-state-sync.js +115 -0
- package/dist/scripts/test-simple-ralph-state-sync.js.map +7 -0
- package/dist/scripts/test-swarm-fixes.js +125 -0
- package/dist/scripts/test-swarm-fixes.js.map +7 -0
- package/dist/scripts/test-swarm-tui.js +23 -0
- package/dist/scripts/test-swarm-tui.js.map +7 -0
- package/dist/scripts/test-tui-shortcuts.js +52 -0
- package/dist/scripts/test-tui-shortcuts.js.map +7 -0
- package/dist/scripts/validate-tui-shortcuts.js +60 -0
- package/dist/scripts/validate-tui-shortcuts.js.map +7 -0
- package/dist/src/agents/core/agent-task-manager.js +527 -0
- package/dist/src/agents/core/agent-task-manager.js.map +7 -0
- package/dist/src/agents/verifiers/base-verifier.js +133 -0
- package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/formatter-verifier.js +130 -0
- package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/llm-judge.js +252 -0
- package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
- package/dist/src/cli/auto-detect.js +321 -0
- package/dist/src/cli/auto-detect.js.map +7 -0
- package/dist/src/cli/claude-sm-danger.js +21 -0
- package/dist/src/cli/claude-sm-danger.js.map +7 -0
- package/dist/src/cli/claude-sm.js +1156 -0
- package/dist/src/cli/claude-sm.js.map +7 -0
- package/dist/src/cli/codex-sm-danger.js +21 -0
- package/dist/src/cli/codex-sm-danger.js.map +7 -0
- package/dist/src/cli/codex-sm.js +349 -0
- package/dist/src/cli/codex-sm.js.map +7 -0
- package/dist/src/cli/commands/api.js +232 -0
- package/dist/src/cli/commands/api.js.map +7 -0
- package/dist/src/cli/commands/auto-background.js +180 -0
- package/dist/src/cli/commands/auto-background.js.map +7 -0
- package/dist/src/cli/commands/cleanup-processes.js +68 -0
- package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
- package/dist/src/cli/commands/clear.js +202 -0
- package/dist/src/cli/commands/clear.js.map +7 -0
- package/dist/src/cli/commands/config.js +445 -0
- package/dist/src/cli/commands/config.js.map +7 -0
- package/dist/src/cli/commands/context-rehydrate.js +751 -0
- package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
- package/dist/src/cli/commands/context.js +343 -0
- package/dist/src/cli/commands/context.js.map +7 -0
- package/dist/src/cli/commands/daemon.js +392 -0
- package/dist/src/cli/commands/daemon.js.map +7 -0
- package/dist/src/cli/commands/dashboard.js +210 -0
- package/dist/src/cli/commands/dashboard.js.map +7 -0
- package/dist/src/cli/commands/db.js +147 -0
- package/dist/src/cli/commands/db.js.map +7 -0
- package/dist/src/cli/commands/decision.js +266 -0
- package/dist/src/cli/commands/decision.js.map +7 -0
- package/dist/src/cli/commands/discovery.js +279 -0
- package/dist/src/cli/commands/discovery.js.map +7 -0
- package/dist/src/cli/commands/handoff.js +624 -0
- package/dist/src/cli/commands/handoff.js.map +7 -0
- package/dist/src/cli/commands/hooks.js +298 -0
- package/dist/src/cli/commands/hooks.js.map +7 -0
- package/dist/src/cli/commands/linear.js +529 -0
- package/dist/src/cli/commands/linear.js.map +7 -0
- package/dist/src/cli/commands/log.js +169 -0
- package/dist/src/cli/commands/log.js.map +7 -0
- package/dist/src/cli/commands/login.js +172 -0
- package/dist/src/cli/commands/login.js.map +7 -0
- package/dist/src/cli/commands/migrate.js +240 -0
- package/dist/src/cli/commands/migrate.js.map +7 -0
- package/dist/src/cli/commands/model.js +533 -0
- package/dist/src/cli/commands/model.js.map +7 -0
- package/dist/src/cli/commands/onboard.js +536 -0
- package/dist/src/cli/commands/onboard.js.map +7 -0
- package/dist/src/cli/commands/projects.js +199 -0
- package/dist/src/cli/commands/projects.js.map +7 -0
- package/dist/src/cli/commands/ralph.js +909 -0
- package/dist/src/cli/commands/ralph.js.map +7 -0
- package/dist/src/cli/commands/retrieval.js +248 -0
- package/dist/src/cli/commands/retrieval.js.map +7 -0
- package/dist/src/cli/commands/search.js +173 -0
- package/dist/src/cli/commands/search.js.map +7 -0
- package/dist/src/cli/commands/service.js +749 -0
- package/dist/src/cli/commands/service.js.map +7 -0
- package/dist/src/cli/commands/session.js +200 -0
- package/dist/src/cli/commands/session.js.map +7 -0
- package/dist/src/cli/commands/settings.js +306 -0
- package/dist/src/cli/commands/settings.js.map +7 -0
- package/dist/src/cli/commands/setup.js +701 -0
- package/dist/src/cli/commands/setup.js.map +7 -0
- package/dist/src/cli/commands/shell.js +249 -0
- package/dist/src/cli/commands/shell.js.map +7 -0
- package/dist/src/cli/commands/signup.js +50 -0
- package/dist/src/cli/commands/signup.js.map +7 -0
- package/dist/src/cli/commands/skills.js +470 -0
- package/dist/src/cli/commands/skills.js.map +7 -0
- package/dist/src/cli/commands/sms-notify.js +795 -0
- package/dist/src/cli/commands/sms-notify.js.map +7 -0
- package/dist/src/cli/commands/storage-tier.js +183 -0
- package/dist/src/cli/commands/storage-tier.js.map +7 -0
- package/dist/src/cli/commands/sweep.js +249 -0
- package/dist/src/cli/commands/sweep.js.map +7 -0
- package/dist/src/cli/commands/tasks.js +213 -0
- package/dist/src/cli/commands/tasks.js.map +7 -0
- package/dist/src/cli/commands/worktree.js +319 -0
- package/dist/src/cli/commands/worktree.js.map +7 -0
- package/dist/src/cli/index.js +594 -0
- package/dist/src/cli/index.js.map +7 -0
- package/dist/src/cli/opencode-sm.js +448 -0
- package/dist/src/cli/opencode-sm.js.map +7 -0
- package/dist/src/cli/utils/viewer.js +96 -0
- package/dist/src/cli/utils/viewer.js.map +7 -0
- package/dist/src/core/config/config-manager.js +398 -0
- package/dist/src/core/config/config-manager.js.map +7 -0
- package/dist/src/core/config/feature-flags.js +76 -0
- package/dist/src/core/config/feature-flags.js.map +7 -0
- package/dist/src/core/config/storage-config.js +115 -0
- package/dist/src/core/config/storage-config.js.map +7 -0
- package/dist/src/core/config/types.js +144 -0
- package/dist/src/core/config/types.js.map +7 -0
- package/dist/src/core/context/auto-context.js +80 -0
- package/dist/src/core/context/auto-context.js.map +7 -0
- package/dist/src/core/context/dual-stack-manager.js +870 -0
- package/dist/src/core/context/dual-stack-manager.js.map +7 -0
- package/dist/src/core/context/enhanced-rehydration.js +994 -0
- package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
- package/dist/src/core/context/frame-database.js +479 -0
- package/dist/src/core/context/frame-database.js.map +7 -0
- package/dist/src/core/context/frame-digest.js +250 -0
- package/dist/src/core/context/frame-digest.js.map +7 -0
- package/dist/src/core/context/frame-handoff-manager.js +778 -0
- package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
- package/dist/src/core/context/frame-lifecycle-hooks.js +119 -0
- package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
- package/dist/src/core/context/frame-recovery.js +302 -0
- package/dist/src/core/context/frame-recovery.js.map +7 -0
- package/dist/src/core/context/frame-stack.js +314 -0
- package/dist/src/core/context/frame-stack.js.map +7 -0
- package/dist/src/core/context/frame-types.js +5 -0
- package/dist/src/core/context/frame-types.js.map +7 -0
- package/dist/src/core/context/index.js +25 -0
- package/dist/src/core/context/index.js.map +7 -0
- package/dist/src/core/context/permission-manager.js +185 -0
- package/dist/src/core/context/permission-manager.js.map +7 -0
- package/dist/src/core/context/recursive-context-manager.js +592 -0
- package/dist/src/core/context/recursive-context-manager.js.map +7 -0
- package/dist/src/core/context/refactored-frame-manager.js +754 -0
- package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
- package/dist/src/core/context/shared-context-layer.js +621 -0
- package/dist/src/core/context/shared-context-layer.js.map +7 -0
- package/dist/src/core/context/stack-merge-resolver.js +749 -0
- package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
- package/dist/src/core/context/validation.js +130 -0
- package/dist/src/core/context/validation.js.map +7 -0
- package/dist/src/core/database/batch-operations.js +384 -0
- package/dist/src/core/database/batch-operations.js.map +7 -0
- package/dist/src/core/database/connection-pool.js +330 -0
- package/dist/src/core/database/connection-pool.js.map +7 -0
- package/dist/src/core/database/database-adapter.js +60 -0
- package/dist/src/core/database/database-adapter.js.map +7 -0
- package/dist/src/core/database/migration-manager.js +614 -0
- package/dist/src/core/database/migration-manager.js.map +7 -0
- package/dist/src/core/database/query-cache.js +298 -0
- package/dist/src/core/database/query-cache.js.map +7 -0
- package/dist/src/core/database/query-router.js +430 -0
- package/dist/src/core/database/query-router.js.map +7 -0
- package/dist/src/core/database/sqlite-adapter.js +738 -0
- package/dist/src/core/database/sqlite-adapter.js.map +7 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js +277 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
- package/dist/src/core/digest/frame-digest-integration.js +176 -0
- package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
- package/dist/src/core/digest/hybrid-digest-generator.js +553 -0
- package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
- package/dist/src/core/digest/index.js +9 -0
- package/dist/src/core/digest/index.js.map +7 -0
- package/dist/src/core/digest/types.js +25 -0
- package/dist/src/core/digest/types.js.map +7 -0
- package/dist/src/core/errors/error-utils.js +208 -0
- package/dist/src/core/errors/error-utils.js.map +7 -0
- package/dist/src/core/errors/index.js +521 -0
- package/dist/src/core/errors/index.js.map +7 -0
- package/dist/src/core/errors/recovery.js +269 -0
- package/dist/src/core/errors/recovery.js.map +7 -0
- package/dist/src/core/execution/parallel-executor.js +258 -0
- package/dist/src/core/execution/parallel-executor.js.map +7 -0
- package/dist/src/core/frame/workflow-templates.js +319 -0
- package/dist/src/core/frame/workflow-templates.js.map +7 -0
- package/dist/src/core/merge/conflict-detector.js +431 -0
- package/dist/src/core/merge/conflict-detector.js.map +7 -0
- package/dist/src/core/merge/index.js +9 -0
- package/dist/src/core/merge/index.js.map +7 -0
- package/dist/src/core/merge/resolution-engine.js +558 -0
- package/dist/src/core/merge/resolution-engine.js.map +7 -0
- package/dist/src/core/merge/stack-diff.js +532 -0
- package/dist/src/core/merge/stack-diff.js.map +7 -0
- package/dist/src/core/merge/types.js +5 -0
- package/dist/src/core/merge/types.js.map +7 -0
- package/dist/src/core/merge/unified-merge-resolver.js +303 -0
- package/dist/src/core/merge/unified-merge-resolver.js.map +7 -0
- package/dist/src/core/models/fallback-monitor.js +232 -0
- package/dist/src/core/models/fallback-monitor.js.map +7 -0
- package/dist/src/core/models/model-router.js +340 -0
- package/dist/src/core/models/model-router.js.map +7 -0
- package/dist/src/core/monitoring/error-handler.js +49 -0
- package/dist/src/core/monitoring/error-handler.js.map +7 -0
- package/dist/src/core/monitoring/logger.js +202 -0
- package/dist/src/core/monitoring/logger.js.map +7 -0
- package/dist/src/core/monitoring/metrics.js +172 -0
- package/dist/src/core/monitoring/metrics.js.map +7 -0
- package/dist/src/core/monitoring/progress-tracker.js +189 -0
- package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
- package/dist/src/core/monitoring/session-monitor.js +300 -0
- package/dist/src/core/monitoring/session-monitor.js.map +7 -0
- package/dist/src/core/performance/context-cache.js +273 -0
- package/dist/src/core/performance/context-cache.js.map +7 -0
- package/dist/src/core/performance/index.js +11 -0
- package/dist/src/core/performance/index.js.map +7 -0
- package/dist/src/core/performance/lazy-context-loader.js +327 -0
- package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
- package/dist/src/core/performance/monitor.js +221 -0
- package/dist/src/core/performance/monitor.js.map +7 -0
- package/dist/src/core/performance/optimized-frame-context.js +345 -0
- package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
- package/dist/src/core/performance/performance-benchmark.js +277 -0
- package/dist/src/core/performance/performance-benchmark.js.map +7 -0
- package/dist/src/core/performance/performance-profiler.js +370 -0
- package/dist/src/core/performance/performance-profiler.js.map +7 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js +195 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
- package/dist/src/core/persistence/postgres-adapter.js +349 -0
- package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
- package/dist/src/core/projects/project-isolation.js +201 -0
- package/dist/src/core/projects/project-isolation.js.map +7 -0
- package/dist/src/core/projects/project-manager.js +697 -0
- package/dist/src/core/projects/project-manager.js.map +7 -0
- package/dist/src/core/query/query-parser.js +370 -0
- package/dist/src/core/query/query-parser.js.map +7 -0
- package/dist/src/core/query/query-templates.js +321 -0
- package/dist/src/core/query/query-templates.js.map +7 -0
- package/dist/src/core/retrieval/context-retriever.js +479 -0
- package/dist/src/core/retrieval/context-retriever.js.map +7 -0
- package/dist/src/core/retrieval/index.js +8 -0
- package/dist/src/core/retrieval/index.js.map +7 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js +613 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
- package/dist/src/core/retrieval/llm-provider.js +151 -0
- package/dist/src/core/retrieval/llm-provider.js.map +7 -0
- package/dist/src/core/retrieval/retrieval-audit.js +236 -0
- package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
- package/dist/src/core/retrieval/summary-generator.js +589 -0
- package/dist/src/core/retrieval/summary-generator.js.map +7 -0
- package/dist/src/core/retrieval/types.js +21 -0
- package/dist/src/core/retrieval/types.js.map +7 -0
- package/dist/src/core/security/index.js +35 -0
- package/dist/src/core/security/index.js.map +7 -0
- package/dist/src/core/security/input-sanitizer.js +321 -0
- package/dist/src/core/security/input-sanitizer.js.map +7 -0
- package/dist/src/core/session/clear-survival.js +465 -0
- package/dist/src/core/session/clear-survival.js.map +7 -0
- package/dist/src/core/session/enhanced-handoff.js +792 -0
- package/dist/src/core/session/enhanced-handoff.js.map +7 -0
- package/dist/src/core/session/handoff-generator.js +343 -0
- package/dist/src/core/session/handoff-generator.js.map +7 -0
- package/dist/src/core/session/index.js +15 -0
- package/dist/src/core/session/index.js.map +7 -0
- package/dist/src/core/session/session-manager.js +347 -0
- package/dist/src/core/session/session-manager.js.map +7 -0
- package/dist/src/core/skills/index.js +7 -0
- package/dist/src/core/skills/index.js.map +7 -0
- package/dist/src/core/skills/skill-storage.js +764 -0
- package/dist/src/core/skills/skill-storage.js.map +7 -0
- package/dist/src/core/skills/types.js +193 -0
- package/dist/src/core/skills/types.js.map +7 -0
- package/dist/src/core/storage/chromadb-adapter.js +354 -0
- package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
- package/dist/src/core/storage/infinite-storage.js +510 -0
- package/dist/src/core/storage/infinite-storage.js.map +7 -0
- package/dist/src/core/storage/remote-storage.js +489 -0
- package/dist/src/core/storage/remote-storage.js.map +7 -0
- package/dist/src/core/storage/two-tier-storage.js +766 -0
- package/dist/src/core/storage/two-tier-storage.js.map +7 -0
- package/dist/src/core/trace/cli-trace-wrapper.js +132 -0
- package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/db-trace-wrapper.js +247 -0
- package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/debug-trace.js +417 -0
- package/dist/src/core/trace/debug-trace.js.map +7 -0
- package/dist/src/core/trace/index.js +109 -0
- package/dist/src/core/trace/index.js.map +7 -0
- package/dist/src/core/trace/linear-api-wrapper.js +178 -0
- package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
- package/dist/src/core/trace/trace-detector.js +528 -0
- package/dist/src/core/trace/trace-detector.js.map +7 -0
- package/dist/src/core/trace/trace-store.js +345 -0
- package/dist/src/core/trace/trace-store.js.map +7 -0
- package/dist/src/core/trace/types.js +77 -0
- package/dist/src/core/trace/types.js.map +7 -0
- package/dist/src/core/types.js +5 -0
- package/dist/src/core/types.js.map +7 -0
- package/dist/src/core/utils/async-mutex.js +114 -0
- package/dist/src/core/utils/async-mutex.js.map +7 -0
- package/dist/src/core/utils/compression.js +83 -0
- package/dist/src/core/utils/compression.js.map +7 -0
- package/dist/src/core/utils/update-checker.js +218 -0
- package/dist/src/core/utils/update-checker.js.map +7 -0
- package/dist/src/core/worktree/worktree-manager.js +465 -0
- package/dist/src/core/worktree/worktree-manager.js.map +7 -0
- package/dist/src/daemon/daemon-config.js +149 -0
- package/dist/src/daemon/daemon-config.js.map +7 -0
- package/dist/src/daemon/services/context-service.js +122 -0
- package/dist/src/daemon/services/context-service.js.map +7 -0
- package/dist/src/daemon/services/linear-service.js +136 -0
- package/dist/src/daemon/services/linear-service.js.map +7 -0
- package/dist/src/daemon/session-daemon.js +312 -0
- package/dist/src/daemon/session-daemon.js.map +7 -0
- package/dist/src/daemon/unified-daemon.js +276 -0
- package/dist/src/daemon/unified-daemon.js.map +7 -0
- package/dist/src/features/analytics/api/analytics-api.js +287 -0
- package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
- package/dist/src/features/analytics/core/analytics-service.js +282 -0
- package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
- package/dist/src/features/analytics/index.js +18 -0
- package/dist/src/features/analytics/index.js.map +7 -0
- package/dist/src/features/analytics/queries/metrics-queries.js +277 -0
- package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
- package/dist/src/features/analytics/types/metrics.js +5 -0
- package/dist/src/features/analytics/types/metrics.js.map +7 -0
- package/dist/src/features/browser/browser-mcp.js +492 -0
- package/dist/src/features/browser/browser-mcp.js.map +7 -0
- package/dist/src/features/sweep/index.js +20 -0
- package/dist/src/features/sweep/index.js.map +7 -0
- package/dist/src/features/sweep/prediction-client.js +155 -0
- package/dist/src/features/sweep/prediction-client.js.map +7 -0
- package/dist/src/features/sweep/prompt-builder.js +85 -0
- package/dist/src/features/sweep/prompt-builder.js.map +7 -0
- package/dist/src/features/sweep/pty-wrapper.js +171 -0
- package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
- package/dist/src/features/sweep/state-watcher.js +87 -0
- package/dist/src/features/sweep/state-watcher.js.map +7 -0
- package/dist/src/features/sweep/status-bar.js +88 -0
- package/dist/src/features/sweep/status-bar.js.map +7 -0
- package/dist/src/features/sweep/sweep-server-manager.js +226 -0
- package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
- package/dist/src/features/sweep/tab-interceptor.js +38 -0
- package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
- package/dist/src/features/sweep/types.js +18 -0
- package/dist/src/features/sweep/types.js.map +7 -0
- package/dist/src/features/tasks/linear-task-manager.js +487 -0
- package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
- package/dist/src/features/tasks/task-aware-context.js +410 -0
- package/dist/src/features/tasks/task-aware-context.js.map +7 -0
- package/dist/src/features/tui/simple-monitor.js +116 -0
- package/dist/src/features/tui/simple-monitor.js.map +7 -0
- package/dist/src/features/tui/swarm-monitor.js +648 -0
- package/dist/src/features/tui/swarm-monitor.js.map +7 -0
- package/dist/src/features/web/client/stores/task-store.js +26 -0
- package/dist/src/features/web/client/stores/task-store.js.map +7 -0
- package/dist/src/features/web/server/index.js +194 -0
- package/dist/src/features/web/server/index.js.map +7 -0
- package/dist/src/hooks/auto-background.js +151 -0
- package/dist/src/hooks/auto-background.js.map +7 -0
- package/dist/src/hooks/claude-code-whatsapp-hook.js +197 -0
- package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
- package/dist/src/hooks/config.js +150 -0
- package/dist/src/hooks/config.js.map +7 -0
- package/dist/src/hooks/daemon.js +364 -0
- package/dist/src/hooks/daemon.js.map +7 -0
- package/dist/src/hooks/events.js +58 -0
- package/dist/src/hooks/events.js.map +7 -0
- package/dist/src/hooks/index.js +12 -0
- package/dist/src/hooks/index.js.map +7 -0
- package/dist/src/hooks/linear-task-picker.js +186 -0
- package/dist/src/hooks/linear-task-picker.js.map +7 -0
- package/dist/src/hooks/schemas.js +197 -0
- package/dist/src/hooks/schemas.js.map +7 -0
- package/dist/src/hooks/secure-fs.js +49 -0
- package/dist/src/hooks/secure-fs.js.map +7 -0
- package/dist/src/hooks/security-logger.js +155 -0
- package/dist/src/hooks/security-logger.js.map +7 -0
- package/dist/src/hooks/session-summary.js +222 -0
- package/dist/src/hooks/session-summary.js.map +7 -0
- package/dist/src/hooks/sms-action-runner.js +371 -0
- package/dist/src/hooks/sms-action-runner.js.map +7 -0
- package/dist/src/hooks/sms-notify.js +506 -0
- package/dist/src/hooks/sms-notify.js.map +7 -0
- package/dist/src/hooks/sms-watcher.js +93 -0
- package/dist/src/hooks/sms-watcher.js.map +7 -0
- package/dist/src/hooks/sms-webhook.js +555 -0
- package/dist/src/hooks/sms-webhook.js.map +7 -0
- package/dist/src/hooks/whatsapp-commands.js +479 -0
- package/dist/src/hooks/whatsapp-commands.js.map +7 -0
- package/dist/src/hooks/whatsapp-scheduler.js +317 -0
- package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
- package/dist/src/hooks/whatsapp-sync.js +409 -0
- package/dist/src/hooks/whatsapp-sync.js.map +7 -0
- package/dist/src/index.js +25 -0
- package/dist/src/index.js.map +7 -0
- package/dist/src/integrations/anthropic/client.js +263 -0
- package/dist/src/integrations/anthropic/client.js.map +7 -0
- package/dist/src/integrations/claude-code/agent-bridge.js +768 -0
- package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +459 -0
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/lifecycle-hooks.js +254 -0
- package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/post-task-hooks.js +545 -0
- package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client-stub.js +20 -0
- package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client.js +511 -0
- package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
- package/dist/src/integrations/claude-code/task-coordinator.js +360 -0
- package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
- package/dist/src/integrations/linear/auth.js +337 -0
- package/dist/src/integrations/linear/auth.js.map +7 -0
- package/dist/src/integrations/linear/auto-sync.js +258 -0
- package/dist/src/integrations/linear/auto-sync.js.map +7 -0
- package/dist/src/integrations/linear/client.js +634 -0
- package/dist/src/integrations/linear/client.js.map +7 -0
- package/dist/src/integrations/linear/config.js +130 -0
- package/dist/src/integrations/linear/config.js.map +7 -0
- package/dist/src/integrations/linear/migration.js +361 -0
- package/dist/src/integrations/linear/migration.js.map +7 -0
- package/dist/src/integrations/linear/oauth-server.js +454 -0
- package/dist/src/integrations/linear/oauth-server.js.map +7 -0
- package/dist/src/integrations/linear/rest-client.js +213 -0
- package/dist/src/integrations/linear/rest-client.js.map +7 -0
- package/dist/src/integrations/linear/sync-manager.js +236 -0
- package/dist/src/integrations/linear/sync-manager.js.map +7 -0
- package/dist/src/integrations/linear/sync-service.js +231 -0
- package/dist/src/integrations/linear/sync-service.js.map +7 -0
- package/dist/src/integrations/linear/sync.js +782 -0
- package/dist/src/integrations/linear/sync.js.map +7 -0
- package/dist/src/integrations/linear/types.js +5 -0
- package/dist/src/integrations/linear/types.js.map +7 -0
- package/dist/src/integrations/linear/unified-sync.js +589 -0
- package/dist/src/integrations/linear/unified-sync.js.map +7 -0
- package/dist/src/integrations/linear/webhook-handler.js +219 -0
- package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
- package/dist/src/integrations/linear/webhook-server.js +218 -0
- package/dist/src/integrations/linear/webhook-server.js.map +7 -0
- package/dist/src/integrations/linear/webhook.js +291 -0
- package/dist/src/integrations/linear/webhook.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +266 -0
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js +257 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js +497 -0
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/index.js +166 -0
- package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js +247 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/skill-handlers.js +529 -0
- package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js +239 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js +308 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/index.js +23 -0
- package/dist/src/integrations/mcp/index.js.map +7 -0
- package/dist/src/integrations/mcp/middleware/tool-scoring.js +356 -0
- package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
- package/dist/src/integrations/mcp/refactored-server.js +374 -0
- package/dist/src/integrations/mcp/refactored-server.js.map +7 -0
- package/dist/src/integrations/mcp/remote-server.js +682 -0
- package/dist/src/integrations/mcp/remote-server.js.map +7 -0
- package/dist/src/integrations/mcp/schemas.js +147 -0
- package/dist/src/integrations/mcp/schemas.js.map +7 -0
- package/dist/src/integrations/mcp/server.js +1975 -0
- package/dist/src/integrations/mcp/server.js.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions-code.js +125 -0
- package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions.js +702 -0
- package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +860 -0
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
- package/dist/src/integrations/ralph/context/context-budget-manager.js +301 -0
- package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +360 -0
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +410 -0
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
- package/dist/src/integrations/ralph/index.js +18 -0
- package/dist/src/integrations/ralph/index.js.map +7 -0
- package/dist/src/integrations/ralph/learning/pattern-learner.js +401 -0
- package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +448 -0
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +294 -0
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js +108 -0
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +463 -0
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +400 -0
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +473 -0
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +388 -0
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/performance/performance-optimizer.js +358 -0
- package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
- package/dist/src/integrations/ralph/recovery/crash-recovery.js +462 -0
- package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
- package/dist/src/integrations/ralph/state/state-reconciler.js +404 -0
- package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +428 -0
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +996 -0
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
- package/dist/src/integrations/ralph/types.js +5 -0
- package/dist/src/integrations/ralph/types.js.map +7 -0
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js +585 -0
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
- package/dist/src/mcp/stackmemory-mcp-server.js +554 -0
- package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
- package/dist/src/middleware/exponential-rate-limiter.js +289 -0
- package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
- package/dist/src/models/user.model.js +358 -0
- package/dist/src/models/user.model.js.map +7 -0
- package/dist/src/servers/production/auth-middleware.js +528 -0
- package/dist/src/servers/production/auth-middleware.js.map +7 -0
- package/dist/src/services/config-service.js +65 -0
- package/dist/src/services/config-service.js.map +7 -0
- package/dist/src/services/context-service.js +194 -0
- package/dist/src/services/context-service.js.map +7 -0
- package/dist/src/skills/api-discovery.js +354 -0
- package/dist/src/skills/api-discovery.js.map +7 -0
- package/dist/src/skills/api-skill.js +475 -0
- package/dist/src/skills/api-skill.js.map +7 -0
- package/dist/src/skills/claude-skills.js +1061 -0
- package/dist/src/skills/claude-skills.js.map +7 -0
- package/dist/src/skills/dashboard-launcher.js +216 -0
- package/dist/src/skills/dashboard-launcher.js.map +7 -0
- package/dist/src/skills/recursive-agent-orchestrator.js +575 -0
- package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
- package/dist/src/skills/repo-ingestion-skill.js +609 -0
- package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
- package/dist/src/skills/unified-rlm-orchestrator.js +404 -0
- package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
- package/dist/src/types/task.js +5 -0
- package/dist/src/types/task.js.map +7 -0
- package/dist/src/utils/env.js +50 -0
- package/dist/src/utils/env.js.map +7 -0
- package/dist/src/utils/formatting.js +62 -0
- package/dist/src/utils/formatting.js.map +7 -0
- package/dist/src/utils/process-cleanup.js +136 -0
- package/dist/src/utils/process-cleanup.js.map +7 -0
- package/package.json +3 -3
- package/scripts/initialize.ts +16 -7
- package/scripts/install.sh +14 -62
- package/scripts/status.ts +111 -46
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/core/errors/index.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Custom error classes for StackMemory\n * Provides a hierarchy of error types for better error handling and debugging\n */\n\nexport enum ErrorCode {\n // Database errors (DB_*)\n DB_CONNECTION_FAILED = 'DB_001',\n DB_QUERY_FAILED = 'DB_002',\n DB_TRANSACTION_FAILED = 'DB_003',\n DB_MIGRATION_FAILED = 'DB_004',\n DB_CONSTRAINT_VIOLATION = 'DB_005',\n DB_SCHEMA_ERROR = 'DB_006',\n DB_INSERT_FAILED = 'DB_007',\n DB_UPDATE_FAILED = 'DB_008',\n DB_DELETE_FAILED = 'DB_009',\n DB_CORRUPTION = 'DB_010',\n\n // Frame errors (FRAME_*)\n FRAME_NOT_FOUND = 'FRAME_001',\n FRAME_INVALID_STATE = 'FRAME_002',\n FRAME_PARENT_NOT_FOUND = 'FRAME_003',\n FRAME_CYCLE_DETECTED = 'FRAME_004',\n FRAME_ALREADY_CLOSED = 'FRAME_005',\n FRAME_INIT_FAILED = 'FRAME_006',\n FRAME_INVALID_INPUT = 'FRAME_007',\n FRAME_STACK_OVERFLOW = 'FRAME_008',\n\n // Task errors (TASK_*)\n TASK_NOT_FOUND = 'TASK_001',\n TASK_INVALID_STATE = 'TASK_002',\n TASK_DEPENDENCY_CONFLICT = 'TASK_003',\n TASK_CIRCULAR_DEPENDENCY = 'TASK_004',\n\n // Integration errors (LINEAR_*)\n LINEAR_AUTH_FAILED = 'LINEAR_001',\n LINEAR_API_ERROR = 'LINEAR_002',\n LINEAR_SYNC_FAILED = 'LINEAR_003',\n LINEAR_WEBHOOK_FAILED = 'LINEAR_004',\n\n // MCP errors (MCP_*)\n MCP_TOOL_NOT_FOUND = 'MCP_001',\n MCP_INVALID_PARAMS = 'MCP_002',\n MCP_EXECUTION_FAILED = 'MCP_003',\n MCP_RATE_LIMITED = 'MCP_004',\n\n // Project errors (PROJECT_*)\n PROJECT_NOT_FOUND = 'PROJECT_001',\n PROJECT_INVALID_PATH = 'PROJECT_002',\n PROJECT_GIT_ERROR = 'PROJECT_003',\n\n // Validation errors (VAL_*)\n VALIDATION_FAILED = 'VAL_001',\n INVALID_INPUT = 'VAL_002',\n MISSING_REQUIRED_FIELD = 'VAL_003',\n TYPE_MISMATCH = 'VAL_004',\n\n // System errors (SYS_*)\n INITIALIZATION_ERROR = 'SYS_001',\n NOT_FOUND = 'SYS_002',\n INTERNAL_ERROR = 'SYS_003',\n CONFIGURATION_ERROR = 'SYS_004',\n PERMISSION_DENIED = 'SYS_005',\n RESOURCE_EXHAUSTED = 'SYS_006',\n SERVICE_UNAVAILABLE = 'SYS_007',\n SYSTEM_INIT_FAILED = 'SYS_008',\n UNKNOWN_ERROR = 'SYS_009',\n OPERATION_TIMEOUT = 'SYS_010',\n\n // Authentication errors (AUTH_*)\n AUTH_FAILED = 'AUTH_001',\n TOKEN_EXPIRED = 'AUTH_002',\n INVALID_CREDENTIALS = 'AUTH_003',\n\n // File system errors (FS_*)\n FILE_NOT_FOUND = 'FS_001',\n DISK_FULL = 'FS_002',\n\n // Git errors (GIT_*)\n NOT_GIT_REPO = 'GIT_001',\n GIT_COMMAND_FAILED = 'GIT_002',\n INVALID_BRANCH = 'GIT_003',\n\n // Network errors (NET_*)\n NETWORK_ERROR = 'NET_001',\n API_ERROR = 'NET_002',\n\n // Collaboration errors (COLLAB_*)\n STACK_CONTEXT_NOT_FOUND = 'COLLAB_001',\n HANDOFF_REQUEST_EXPIRED = 'COLLAB_002',\n MERGE_CONFLICT_UNRESOLVABLE = 'COLLAB_003',\n PERMISSION_VIOLATION = 'COLLAB_004',\n OPERATION_FAILED = 'COLLAB_005',\n OPERATION_EXPIRED = 'COLLAB_006',\n INVALID_STATE = 'COLLAB_007',\n RESOURCE_NOT_FOUND = 'COLLAB_008',\n HANDOFF_ALREADY_EXISTS = 'COLLAB_009',\n MERGE_SESSION_INVALID = 'COLLAB_010',\n STACK_SWITCH_FAILED = 'COLLAB_011',\n APPROVAL_TIMEOUT = 'COLLAB_012',\n CONFLICT_RESOLUTION_FAILED = 'COLLAB_013',\n TEAM_ACCESS_DENIED = 'COLLAB_014',\n STACK_LIMIT_EXCEEDED = 'COLLAB_015',\n}\n\nexport interface ErrorContext {\n [key: string]: unknown;\n}\n\nexport interface StackMemoryErrorOptions {\n code: ErrorCode;\n message: string;\n context?: ErrorContext;\n cause?: Error;\n isRetryable?: boolean;\n httpStatus?: number;\n}\n\n/**\n * Base error class for all StackMemory errors\n */\nexport class StackMemoryError extends Error {\n public readonly code: ErrorCode;\n public readonly context?: ErrorContext;\n public readonly cause?: Error;\n public readonly isRetryable: boolean;\n public readonly httpStatus: number;\n public readonly timestamp: Date;\n\n constructor(options: StackMemoryErrorOptions) {\n super(options.message);\n this.name = this.constructor.name;\n this.code = options.code;\n this.context = options.context;\n this.cause = options.cause;\n this.isRetryable = options.isRetryable ?? false;\n this.httpStatus = options.httpStatus ?? 500;\n this.timestamp = new Date();\n\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n context: this.context,\n isRetryable: this.isRetryable,\n httpStatus: this.httpStatus,\n timestamp: this.timestamp.toISOString(),\n stack: this.stack,\n cause: this.cause?.message,\n };\n }\n}\n\n/**\n * Database-related errors\n */\nexport class DatabaseError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.DB_QUERY_FAILED,\n context?: ErrorContext,\n cause?: Error\n ) {\n super({\n code,\n message,\n context,\n cause,\n isRetryable: code === ErrorCode.DB_CONNECTION_FAILED,\n httpStatus: 503,\n });\n }\n}\n\n/**\n * Frame-related errors\n */\nexport class FrameError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.FRAME_INVALID_STATE,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 400,\n });\n }\n}\n\n/**\n * Task-related errors\n */\nexport class TaskError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.TASK_INVALID_STATE,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 400,\n });\n }\n}\n\n/**\n * Integration errors (Linear, etc.)\n */\nexport class IntegrationError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.LINEAR_API_ERROR,\n context?: ErrorContext,\n cause?: Error\n ) {\n super({\n code,\n message,\n context,\n cause,\n isRetryable: true,\n httpStatus: 502,\n });\n }\n}\n\n/**\n * MCP-related errors\n */\nexport class MCPError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.MCP_EXECUTION_FAILED,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: code === ErrorCode.MCP_RATE_LIMITED,\n httpStatus: code === ErrorCode.MCP_RATE_LIMITED ? 429 : 400,\n });\n }\n}\n\n/**\n * Validation errors\n */\nexport class ValidationError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.VALIDATION_FAILED,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 400,\n });\n }\n}\n\n/**\n * Project-related errors\n */\nexport class ProjectError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.PROJECT_NOT_FOUND,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 404,\n });\n }\n}\n\n/**\n * System/Internal errors\n */\nexport class SystemError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.INTERNAL_ERROR,\n context?: ErrorContext,\n cause?: Error\n ) {\n super({\n code,\n message,\n context,\n cause,\n isRetryable: code === ErrorCode.SERVICE_UNAVAILABLE,\n httpStatus: 500,\n });\n }\n}\n\n/**\n * Helper function to determine if an error is retryable\n */\nexport function isRetryableError(error: unknown): boolean {\n if (error instanceof StackMemoryError) {\n return error.isRetryable;\n }\n // Check for common retryable error patterns\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('econnrefused') ||\n message.includes('timeout') ||\n message.includes('enotfound') ||\n message.includes('socket hang up')\n );\n }\n return false;\n}\n\n/**\n * Helper function to safely extract error message\n */\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n if (error && typeof error === 'object' && 'message' in error) {\n return String(error.message);\n }\n return 'An unknown error occurred';\n}\n\n/**\n * Helper function to wrap unknown errors in StackMemoryError\n */\nexport function wrapError(\n error: unknown,\n defaultMessage: string,\n code: ErrorCode = ErrorCode.INTERNAL_ERROR,\n context?: ErrorContext\n): StackMemoryError {\n if (error instanceof StackMemoryError) {\n return error;\n }\n\n const cause = error instanceof Error ? error : undefined;\n const message = error instanceof Error ? error.message : defaultMessage;\n\n return new SystemError(message, code, context, cause);\n}\n\n/**\n * Type guard to check if error is a StackMemoryError\n */\nexport function isStackMemoryError(error: unknown): error is StackMemoryError {\n return error instanceof StackMemoryError;\n}\n\n/**\n * Create context-aware error handler\n */\nexport function createErrorHandler(defaultContext: ErrorContext) {\n return (error: unknown, additionalContext?: ErrorContext) => {\n const context = { ...defaultContext, ...additionalContext };\n\n if (error instanceof StackMemoryError) {\n // Create a new error with merged context since context is readonly\n return new StackMemoryError({\n code: error.code,\n message: error.message,\n context: { ...error.context, ...context },\n cause: error.cause,\n isRetryable: error.isRetryable,\n httpStatus: error.httpStatus,\n });\n }\n\n return wrapError(\n error,\n getErrorMessage(error),\n ErrorCode.INTERNAL_ERROR,\n context\n );\n };\n}\n\n/**\n * User-friendly error messages for each error code\n */\nexport function getUserFriendlyMessage(code: ErrorCode): string {\n switch (code) {\n // Auth errors\n case ErrorCode.AUTH_FAILED:\n return 'Authentication failed. Please check your credentials and try again.';\n case ErrorCode.TOKEN_EXPIRED:\n return 'Your session has expired. Please log in again.';\n case ErrorCode.INVALID_CREDENTIALS:\n return 'Invalid credentials provided. Please check and try again.';\n\n // File system errors\n case ErrorCode.FILE_NOT_FOUND:\n return 'The requested file or directory was not found.';\n case ErrorCode.PERMISSION_DENIED:\n return 'Permission denied. Please check file permissions or run with appropriate privileges.';\n case ErrorCode.DISK_FULL:\n return 'Insufficient disk space. Please free up space and try again.';\n\n // Git errors\n case ErrorCode.NOT_GIT_REPO:\n return 'This command requires a git repository. Please run it from within a git repository.';\n case ErrorCode.GIT_COMMAND_FAILED:\n return 'Git operation failed. Please ensure your repository is in a valid state.';\n case ErrorCode.INVALID_BRANCH:\n return 'Invalid branch specified. Please check the branch name and try again.';\n\n // Database errors\n case ErrorCode.DB_CONNECTION_FAILED:\n return 'Database connection failed. Please try again or contact support if the issue persists.';\n case ErrorCode.DB_QUERY_FAILED:\n return 'Database query failed. Please try again.';\n case ErrorCode.DB_CORRUPTION:\n return 'Database appears to be corrupted. Please contact support.';\n\n // Network errors\n case ErrorCode.NETWORK_ERROR:\n return 'Network error. Please check your internet connection and try again.';\n case ErrorCode.API_ERROR:\n return 'API request failed. Please try again later.';\n case ErrorCode.OPERATION_TIMEOUT:\n return 'The operation timed out. Please try again.';\n\n // Validation errors\n case ErrorCode.INVALID_INPUT:\n return 'Invalid input provided. Please check your command and try again.';\n case ErrorCode.VALIDATION_FAILED:\n return 'Validation failed. Please check your input and try again.';\n case ErrorCode.MISSING_REQUIRED_FIELD:\n return 'A required field is missing. Please provide all required information.';\n\n // System errors\n case ErrorCode.CONFIGURATION_ERROR:\n return 'Configuration error. Please check your settings.';\n case ErrorCode.SERVICE_UNAVAILABLE:\n return 'Service is temporarily unavailable. Please try again later.';\n\n // Default\n default:\n return 'An unexpected error occurred. Please try again or contact support.';\n }\n}\n\n/**\n * ErrorHandler provides utilities for handling errors in CLI context\n */\nexport class ErrorHandler {\n private static retryMap = new Map<string, number>();\n private static readonly MAX_RETRIES = 3;\n\n /**\n * Handle an error and exit the process\n */\n static handle(error: unknown, operation: string): never {\n if (error instanceof StackMemoryError) {\n const userMessage = getUserFriendlyMessage(error.code);\n console.error(`\u274C ${userMessage}`);\n\n if (error.isRetryable) {\n console.error('\uD83D\uDCA1 This error may be recoverable. Please try again.');\n }\n\n process.exit(1);\n }\n\n if (error instanceof Error) {\n let stackMemoryError: StackMemoryError;\n\n if ('code' in error && typeof error.code === 'string') {\n stackMemoryError = ErrorHandler.fromNodeError(\n error as NodeJS.ErrnoException,\n { operation }\n );\n } else {\n stackMemoryError = wrapError(error, error.message, ErrorCode.OPERATION_FAILED, {\n operation,\n });\n }\n\n const userMessage = getUserFriendlyMessage(stackMemoryError.code);\n console.error(`\u274C ${userMessage}`);\n\n if (stackMemoryError.isRetryable) {\n console.error('\uD83D\uDCA1 This error may be recoverable. Please try again.');\n }\n\n process.exit(1);\n }\n\n // Unknown error type\n console.error('\u274C An unexpected error occurred.');\n process.exit(1);\n }\n\n /**\n * Convert Node.js error to StackMemoryError\n */\n static fromNodeError(\n nodeError: NodeJS.ErrnoException,\n context: ErrorContext = {}\n ): StackMemoryError {\n const code = nodeError.code;\n\n switch (code) {\n case 'ENOENT':\n return new SystemError(\n `File or directory not found: ${nodeError.path}`,\n ErrorCode.FILE_NOT_FOUND,\n { ...context, path: nodeError.path },\n nodeError\n );\n\n case 'EACCES':\n case 'EPERM':\n return new SystemError(\n `Permission denied: ${nodeError.path}`,\n ErrorCode.PERMISSION_DENIED,\n { ...context, path: nodeError.path },\n nodeError\n );\n\n case 'ENOSPC':\n return new SystemError(\n 'No space left on device',\n ErrorCode.DISK_FULL,\n context,\n nodeError\n );\n\n case 'ETIMEDOUT':\n return new SystemError(\n 'Operation timed out',\n ErrorCode.OPERATION_TIMEOUT,\n context,\n nodeError\n );\n\n default:\n return new SystemError(\n nodeError.message,\n ErrorCode.UNKNOWN_ERROR,\n { ...context, nodeErrorCode: code },\n nodeError\n );\n }\n }\n\n /**\n * Safely execute an operation with optional fallback\n */\n static async safeExecute<T>(\n operation: () => Promise<T> | T,\n operationName: string,\n fallback?: T\n ): Promise<T | undefined> {\n try {\n return await operation();\n } catch (error: unknown) {\n if (fallback !== undefined) {\n return fallback;\n }\n ErrorHandler.handle(error, operationName);\n }\n }\n\n /**\n * Execute with automatic retry and exponential backoff\n */\n static async withRetry<T>(\n operation: () => Promise<T> | T,\n operationName: string,\n maxRetries: number = ErrorHandler.MAX_RETRIES\n ): Promise<T> {\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const result = await operation();\n ErrorHandler.retryMap.delete(operationName);\n return result;\n } catch (error: unknown) {\n lastError = error;\n\n if (error instanceof StackMemoryError && !error.isRetryable) {\n ErrorHandler.handle(error, operationName);\n }\n\n if (attempt === maxRetries) {\n break;\n }\n\n const delay = Math.min(1000 * Math.pow(2, attempt - 1), 5000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n ErrorHandler.handle(lastError, `${operationName} (after ${maxRetries} attempts)`);\n }\n\n /**\n * Create a circuit breaker for an operation\n */\n static createCircuitBreaker<T>(\n operation: () => Promise<T> | T,\n operationName: string,\n threshold: number = 5\n ) {\n let failures = 0;\n let lastFailure = 0;\n const resetTimeout = 30000;\n\n return async (): Promise<T> => {\n const now = Date.now();\n\n if (now - lastFailure > resetTimeout) {\n failures = 0;\n }\n\n if (failures >= threshold) {\n throw new SystemError(\n `Circuit breaker open for '${operationName}'`,\n ErrorCode.SERVICE_UNAVAILABLE,\n { operationName, failures, threshold }\n );\n }\n\n try {\n const result = await operation();\n failures = 0;\n return result;\n } catch (error: unknown) {\n failures++;\n lastFailure = now;\n throw error;\n }\n };\n }\n}\n\n/**\n * Validation utilities\n */\nexport const validateInput = (\n value: unknown,\n name: string,\n validator: (val: unknown) => boolean\n): asserts value is NonNullable<unknown> => {\n if (!validator(value)) {\n throw new ValidationError(\n `Invalid ${name}: ${String(value)}`,\n ErrorCode.INVALID_INPUT,\n { name, value }\n );\n }\n};\n\nexport const validateEmail = (email: string): asserts email is string => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email) || email.length > 254) {\n throw new ValidationError(\n `Invalid email format: ${email}`,\n ErrorCode.INVALID_INPUT,\n { email }\n );\n }\n};\n\nexport const validatePath = (filePath: string): asserts filePath is string => {\n if (!filePath || filePath.includes('..') || filePath.includes('\\0')) {\n throw new ValidationError(\n `Invalid path: ${filePath}`,\n ErrorCode.INVALID_INPUT,\n { path: filePath }\n );\n }\n};\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/**\n * Custom error classes for StackMemory\n * Provides a hierarchy of error types for better error handling and debugging\n */\n\nexport enum ErrorCode {\n // Database errors (DB_*)\n DB_CONNECTION_FAILED = 'DB_001',\n DB_QUERY_FAILED = 'DB_002',\n DB_TRANSACTION_FAILED = 'DB_003',\n DB_MIGRATION_FAILED = 'DB_004',\n DB_CONSTRAINT_VIOLATION = 'DB_005',\n DB_SCHEMA_ERROR = 'DB_006',\n DB_INSERT_FAILED = 'DB_007',\n DB_UPDATE_FAILED = 'DB_008',\n DB_DELETE_FAILED = 'DB_009',\n DB_CORRUPTION = 'DB_010',\n\n // Frame errors (FRAME_*)\n FRAME_NOT_FOUND = 'FRAME_001',\n FRAME_INVALID_STATE = 'FRAME_002',\n FRAME_PARENT_NOT_FOUND = 'FRAME_003',\n FRAME_CYCLE_DETECTED = 'FRAME_004',\n FRAME_ALREADY_CLOSED = 'FRAME_005',\n FRAME_INIT_FAILED = 'FRAME_006',\n FRAME_INVALID_INPUT = 'FRAME_007',\n FRAME_STACK_OVERFLOW = 'FRAME_008',\n\n // Task errors (TASK_*)\n TASK_NOT_FOUND = 'TASK_001',\n TASK_INVALID_STATE = 'TASK_002',\n TASK_DEPENDENCY_CONFLICT = 'TASK_003',\n TASK_CIRCULAR_DEPENDENCY = 'TASK_004',\n\n // Integration errors (LINEAR_*)\n LINEAR_AUTH_FAILED = 'LINEAR_001',\n LINEAR_API_ERROR = 'LINEAR_002',\n LINEAR_SYNC_FAILED = 'LINEAR_003',\n LINEAR_WEBHOOK_FAILED = 'LINEAR_004',\n\n // MCP errors (MCP_*)\n MCP_TOOL_NOT_FOUND = 'MCP_001',\n MCP_INVALID_PARAMS = 'MCP_002',\n MCP_EXECUTION_FAILED = 'MCP_003',\n MCP_RATE_LIMITED = 'MCP_004',\n\n // Project errors (PROJECT_*)\n PROJECT_NOT_FOUND = 'PROJECT_001',\n PROJECT_INVALID_PATH = 'PROJECT_002',\n PROJECT_GIT_ERROR = 'PROJECT_003',\n\n // Validation errors (VAL_*)\n VALIDATION_FAILED = 'VAL_001',\n INVALID_INPUT = 'VAL_002',\n MISSING_REQUIRED_FIELD = 'VAL_003',\n TYPE_MISMATCH = 'VAL_004',\n\n // System errors (SYS_*)\n INITIALIZATION_ERROR = 'SYS_001',\n NOT_FOUND = 'SYS_002',\n INTERNAL_ERROR = 'SYS_003',\n CONFIGURATION_ERROR = 'SYS_004',\n PERMISSION_DENIED = 'SYS_005',\n RESOURCE_EXHAUSTED = 'SYS_006',\n SERVICE_UNAVAILABLE = 'SYS_007',\n SYSTEM_INIT_FAILED = 'SYS_008',\n UNKNOWN_ERROR = 'SYS_009',\n OPERATION_TIMEOUT = 'SYS_010',\n\n // Authentication errors (AUTH_*)\n AUTH_FAILED = 'AUTH_001',\n TOKEN_EXPIRED = 'AUTH_002',\n INVALID_CREDENTIALS = 'AUTH_003',\n\n // File system errors (FS_*)\n FILE_NOT_FOUND = 'FS_001',\n DISK_FULL = 'FS_002',\n\n // Git errors (GIT_*)\n NOT_GIT_REPO = 'GIT_001',\n GIT_COMMAND_FAILED = 'GIT_002',\n INVALID_BRANCH = 'GIT_003',\n\n // Network errors (NET_*)\n NETWORK_ERROR = 'NET_001',\n API_ERROR = 'NET_002',\n\n // Collaboration errors (COLLAB_*)\n STACK_CONTEXT_NOT_FOUND = 'COLLAB_001',\n HANDOFF_REQUEST_EXPIRED = 'COLLAB_002',\n MERGE_CONFLICT_UNRESOLVABLE = 'COLLAB_003',\n PERMISSION_VIOLATION = 'COLLAB_004',\n OPERATION_FAILED = 'COLLAB_005',\n OPERATION_EXPIRED = 'COLLAB_006',\n INVALID_STATE = 'COLLAB_007',\n RESOURCE_NOT_FOUND = 'COLLAB_008',\n HANDOFF_ALREADY_EXISTS = 'COLLAB_009',\n MERGE_SESSION_INVALID = 'COLLAB_010',\n STACK_SWITCH_FAILED = 'COLLAB_011',\n APPROVAL_TIMEOUT = 'COLLAB_012',\n CONFLICT_RESOLUTION_FAILED = 'COLLAB_013',\n TEAM_ACCESS_DENIED = 'COLLAB_014',\n STACK_LIMIT_EXCEEDED = 'COLLAB_015',\n}\n\nexport interface ErrorContext {\n [key: string]: unknown;\n}\n\nexport interface StackMemoryErrorOptions {\n code: ErrorCode;\n message: string;\n context?: ErrorContext;\n cause?: Error;\n isRetryable?: boolean;\n httpStatus?: number;\n}\n\n/**\n * Base error class for all StackMemory errors\n */\nexport class StackMemoryError extends Error {\n public readonly code: ErrorCode;\n public readonly context?: ErrorContext;\n public readonly cause?: Error;\n public readonly isRetryable: boolean;\n public readonly httpStatus: number;\n public readonly timestamp: Date;\n\n constructor(options: StackMemoryErrorOptions) {\n super(options.message);\n this.name = this.constructor.name;\n this.code = options.code;\n this.context = options.context;\n this.cause = options.cause;\n this.isRetryable = options.isRetryable ?? false;\n this.httpStatus = options.httpStatus ?? 500;\n this.timestamp = new Date();\n\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n context: this.context,\n isRetryable: this.isRetryable,\n httpStatus: this.httpStatus,\n timestamp: this.timestamp.toISOString(),\n stack: this.stack,\n cause: this.cause?.message,\n };\n }\n}\n\n/**\n * Database-related errors\n */\nexport class DatabaseError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.DB_QUERY_FAILED,\n context?: ErrorContext,\n cause?: Error\n ) {\n super({\n code,\n message,\n context,\n cause,\n isRetryable: code === ErrorCode.DB_CONNECTION_FAILED,\n httpStatus: 503,\n });\n }\n}\n\n/**\n * Frame-related errors\n */\nexport class FrameError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.FRAME_INVALID_STATE,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 400,\n });\n }\n}\n\n/**\n * Task-related errors\n */\nexport class TaskError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.TASK_INVALID_STATE,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 400,\n });\n }\n}\n\n/**\n * Integration errors (Linear, etc.)\n */\nexport class IntegrationError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.LINEAR_API_ERROR,\n context?: ErrorContext,\n cause?: Error\n ) {\n super({\n code,\n message,\n context,\n cause,\n isRetryable: true,\n httpStatus: 502,\n });\n }\n}\n\n/**\n * MCP-related errors\n */\nexport class MCPError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.MCP_EXECUTION_FAILED,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: code === ErrorCode.MCP_RATE_LIMITED,\n httpStatus: code === ErrorCode.MCP_RATE_LIMITED ? 429 : 400,\n });\n }\n}\n\n/**\n * Validation errors\n */\nexport class ValidationError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.VALIDATION_FAILED,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 400,\n });\n }\n}\n\n/**\n * Project-related errors\n */\nexport class ProjectError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.PROJECT_NOT_FOUND,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 404,\n });\n }\n}\n\n/**\n * System/Internal errors\n */\nexport class SystemError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.INTERNAL_ERROR,\n context?: ErrorContext,\n cause?: Error\n ) {\n super({\n code,\n message,\n context,\n cause,\n isRetryable: code === ErrorCode.SERVICE_UNAVAILABLE,\n httpStatus: 500,\n });\n }\n}\n\n/**\n * Helper function to determine if an error is retryable\n */\nexport function isRetryableError(error: unknown): boolean {\n if (error instanceof StackMemoryError) {\n return error.isRetryable;\n }\n // Check for common retryable error patterns\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('econnrefused') ||\n message.includes('timeout') ||\n message.includes('enotfound') ||\n message.includes('socket hang up')\n );\n }\n return false;\n}\n\n/**\n * Helper function to safely extract error message\n */\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n if (error && typeof error === 'object' && 'message' in error) {\n return String(error.message);\n }\n return 'An unknown error occurred';\n}\n\n/**\n * Helper function to wrap unknown errors in StackMemoryError\n */\nexport function wrapError(\n error: unknown,\n defaultMessage: string,\n code: ErrorCode = ErrorCode.INTERNAL_ERROR,\n context?: ErrorContext\n): StackMemoryError {\n if (error instanceof StackMemoryError) {\n return error;\n }\n\n const cause = error instanceof Error ? error : undefined;\n const message = error instanceof Error ? error.message : defaultMessage;\n\n return new SystemError(message, code, context, cause);\n}\n\n/**\n * Type guard to check if error is a StackMemoryError\n */\nexport function isStackMemoryError(error: unknown): error is StackMemoryError {\n return error instanceof StackMemoryError;\n}\n\n/**\n * Create context-aware error handler\n */\nexport function createErrorHandler(defaultContext: ErrorContext) {\n return (error: unknown, additionalContext?: ErrorContext) => {\n const context = { ...defaultContext, ...additionalContext };\n\n if (error instanceof StackMemoryError) {\n // Create a new error with merged context since context is readonly\n return new StackMemoryError({\n code: error.code,\n message: error.message,\n context: { ...error.context, ...context },\n cause: error.cause,\n isRetryable: error.isRetryable,\n httpStatus: error.httpStatus,\n });\n }\n\n return wrapError(\n error,\n getErrorMessage(error),\n ErrorCode.INTERNAL_ERROR,\n context\n );\n };\n}\n\n/**\n * User-friendly error messages for each error code\n */\nexport function getUserFriendlyMessage(code: ErrorCode): string {\n switch (code) {\n // Auth errors\n case ErrorCode.AUTH_FAILED:\n return 'Authentication failed. Please check your credentials and try again.';\n case ErrorCode.TOKEN_EXPIRED:\n return 'Your session has expired. Please log in again.';\n case ErrorCode.INVALID_CREDENTIALS:\n return 'Invalid credentials provided. Please check and try again.';\n\n // File system errors\n case ErrorCode.FILE_NOT_FOUND:\n return 'The requested file or directory was not found.';\n case ErrorCode.PERMISSION_DENIED:\n return 'Permission denied. Please check file permissions or run with appropriate privileges.';\n case ErrorCode.DISK_FULL:\n return 'Insufficient disk space. Please free up space and try again.';\n\n // Git errors\n case ErrorCode.NOT_GIT_REPO:\n return 'This command requires a git repository. Please run it from within a git repository.';\n case ErrorCode.GIT_COMMAND_FAILED:\n return 'Git operation failed. Please ensure your repository is in a valid state.';\n case ErrorCode.INVALID_BRANCH:\n return 'Invalid branch specified. Please check the branch name and try again.';\n\n // Database errors\n case ErrorCode.DB_CONNECTION_FAILED:\n return 'Database connection failed. Please try again or contact support if the issue persists.';\n case ErrorCode.DB_QUERY_FAILED:\n return 'Database query failed. Please try again.';\n case ErrorCode.DB_CORRUPTION:\n return 'Database appears to be corrupted. Please contact support.';\n\n // Network errors\n case ErrorCode.NETWORK_ERROR:\n return 'Network error. Please check your internet connection and try again.';\n case ErrorCode.API_ERROR:\n return 'API request failed. Please try again later.';\n case ErrorCode.OPERATION_TIMEOUT:\n return 'The operation timed out. Please try again.';\n\n // Validation errors\n case ErrorCode.INVALID_INPUT:\n return 'Invalid input provided. Please check your command and try again.';\n case ErrorCode.VALIDATION_FAILED:\n return 'Validation failed. Please check your input and try again.';\n case ErrorCode.MISSING_REQUIRED_FIELD:\n return 'A required field is missing. Please provide all required information.';\n\n // System errors\n case ErrorCode.CONFIGURATION_ERROR:\n return 'Configuration error. Please check your settings.';\n case ErrorCode.SERVICE_UNAVAILABLE:\n return 'Service is temporarily unavailable. Please try again later.';\n\n // Default\n default:\n return 'An unexpected error occurred. Please try again or contact support.';\n }\n}\n\n/**\n * ErrorHandler provides utilities for handling errors in CLI context\n */\nexport class ErrorHandler {\n private static retryMap = new Map<string, number>();\n private static readonly MAX_RETRIES = 3;\n\n /**\n * Handle an error and exit the process\n */\n static handle(error: unknown, operation: string): never {\n if (error instanceof StackMemoryError) {\n const userMessage = getUserFriendlyMessage(error.code);\n console.error(`\u274C ${userMessage}`);\n\n if (error.isRetryable) {\n console.error('\uD83D\uDCA1 This error may be recoverable. Please try again.');\n }\n\n process.exit(1);\n }\n\n if (error instanceof Error) {\n let stackMemoryError: StackMemoryError;\n\n if ('code' in error && typeof error.code === 'string') {\n stackMemoryError = ErrorHandler.fromNodeError(\n error as NodeJS.ErrnoException,\n { operation }\n );\n } else {\n stackMemoryError = wrapError(\n error,\n error.message,\n ErrorCode.OPERATION_FAILED,\n {\n operation,\n }\n );\n }\n\n const userMessage = getUserFriendlyMessage(stackMemoryError.code);\n console.error(`\u274C ${userMessage}`);\n\n if (stackMemoryError.isRetryable) {\n console.error('\uD83D\uDCA1 This error may be recoverable. Please try again.');\n }\n\n process.exit(1);\n }\n\n // Unknown error type\n console.error('\u274C An unexpected error occurred.');\n process.exit(1);\n }\n\n /**\n * Convert Node.js error to StackMemoryError\n */\n static fromNodeError(\n nodeError: NodeJS.ErrnoException,\n context: ErrorContext = {}\n ): StackMemoryError {\n const code = nodeError.code;\n\n switch (code) {\n case 'ENOENT':\n return new SystemError(\n `File or directory not found: ${nodeError.path}`,\n ErrorCode.FILE_NOT_FOUND,\n { ...context, path: nodeError.path },\n nodeError\n );\n\n case 'EACCES':\n case 'EPERM':\n return new SystemError(\n `Permission denied: ${nodeError.path}`,\n ErrorCode.PERMISSION_DENIED,\n { ...context, path: nodeError.path },\n nodeError\n );\n\n case 'ENOSPC':\n return new SystemError(\n 'No space left on device',\n ErrorCode.DISK_FULL,\n context,\n nodeError\n );\n\n case 'ETIMEDOUT':\n return new SystemError(\n 'Operation timed out',\n ErrorCode.OPERATION_TIMEOUT,\n context,\n nodeError\n );\n\n default:\n return new SystemError(\n nodeError.message,\n ErrorCode.UNKNOWN_ERROR,\n { ...context, nodeErrorCode: code },\n nodeError\n );\n }\n }\n\n /**\n * Safely execute an operation with optional fallback\n */\n static async safeExecute<T>(\n operation: () => Promise<T> | T,\n operationName: string,\n fallback?: T\n ): Promise<T | undefined> {\n try {\n return await operation();\n } catch (error: unknown) {\n if (fallback !== undefined) {\n return fallback;\n }\n ErrorHandler.handle(error, operationName);\n }\n }\n\n /**\n * Execute with automatic retry and exponential backoff\n */\n static async withRetry<T>(\n operation: () => Promise<T> | T,\n operationName: string,\n maxRetries: number = ErrorHandler.MAX_RETRIES\n ): Promise<T> {\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const result = await operation();\n ErrorHandler.retryMap.delete(operationName);\n return result;\n } catch (error: unknown) {\n lastError = error;\n\n if (error instanceof StackMemoryError && !error.isRetryable) {\n ErrorHandler.handle(error, operationName);\n }\n\n if (attempt === maxRetries) {\n break;\n }\n\n const delay = Math.min(1000 * Math.pow(2, attempt - 1), 5000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n ErrorHandler.handle(\n lastError,\n `${operationName} (after ${maxRetries} attempts)`\n );\n }\n\n /**\n * Create a circuit breaker for an operation\n */\n static createCircuitBreaker<T>(\n operation: () => Promise<T> | T,\n operationName: string,\n threshold: number = 5\n ) {\n let failures = 0;\n let lastFailure = 0;\n const resetTimeout = 30000;\n\n return async (): Promise<T> => {\n const now = Date.now();\n\n if (now - lastFailure > resetTimeout) {\n failures = 0;\n }\n\n if (failures >= threshold) {\n throw new SystemError(\n `Circuit breaker open for '${operationName}'`,\n ErrorCode.SERVICE_UNAVAILABLE,\n { operationName, failures, threshold }\n );\n }\n\n try {\n const result = await operation();\n failures = 0;\n return result;\n } catch (error: unknown) {\n failures++;\n lastFailure = now;\n throw error;\n }\n };\n }\n}\n\n/**\n * Validation utilities\n */\nexport const validateInput = (\n value: unknown,\n name: string,\n validator: (val: unknown) => boolean\n): asserts value is NonNullable<unknown> => {\n if (!validator(value)) {\n throw new ValidationError(\n `Invalid ${name}: ${String(value)}`,\n ErrorCode.INVALID_INPUT,\n { name, value }\n );\n }\n};\n\nexport const validateEmail = (email: string): asserts email is string => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email) || email.length > 254) {\n throw new ValidationError(\n `Invalid email format: ${email}`,\n ErrorCode.INVALID_INPUT,\n { email }\n );\n }\n};\n\nexport const validatePath = (filePath: string): asserts filePath is string => {\n if (!filePath || filePath.includes('..') || filePath.includes('\\0')) {\n throw new ValidationError(\n `Invalid path: ${filePath}`,\n ErrorCode.INVALID_INPUT,\n { path: filePath }\n );\n }\n};\n\n// Re-export error utilities\nexport * from './error-utils.js';\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["ErrorCode"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,303 @@
|
|
|
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 { v4 as uuidv4 } from "uuid";
|
|
6
|
+
import { ConflictDetector } from "./conflict-detector.js";
|
|
7
|
+
import { StackDiffVisualizer } from "./stack-diff.js";
|
|
8
|
+
import { ResolutionEngine } from "./resolution-engine.js";
|
|
9
|
+
import { logger } from "../monitoring/logger.js";
|
|
10
|
+
class UnifiedMergeResolver {
|
|
11
|
+
conflictDetector;
|
|
12
|
+
diffVisualizer;
|
|
13
|
+
resolutionEngine;
|
|
14
|
+
activeSessions = /* @__PURE__ */ new Map();
|
|
15
|
+
rollbackSnapshots = /* @__PURE__ */ new Map();
|
|
16
|
+
statistics = {
|
|
17
|
+
totalConflicts: 0,
|
|
18
|
+
resolvedConflicts: 0,
|
|
19
|
+
averageResolutionTime: 0,
|
|
20
|
+
successRate: 0,
|
|
21
|
+
rollbackCount: 0
|
|
22
|
+
};
|
|
23
|
+
constructor() {
|
|
24
|
+
this.conflictDetector = new ConflictDetector();
|
|
25
|
+
this.diffVisualizer = new StackDiffVisualizer();
|
|
26
|
+
this.resolutionEngine = new ResolutionEngine();
|
|
27
|
+
logger.debug("UnifiedMergeResolver initialized");
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Start a new merge session with automatic conflict detection
|
|
31
|
+
*/
|
|
32
|
+
async startMergeSession(stack1, stack2, options) {
|
|
33
|
+
const sessionId = `unified-merge-${Date.now()}-${uuidv4().substring(0, 8)}`;
|
|
34
|
+
const conflicts = this.conflictDetector.detectConflicts(stack1, stack2);
|
|
35
|
+
let rollbackPoint;
|
|
36
|
+
if (options?.preserveRollback !== false) {
|
|
37
|
+
rollbackPoint = this.createRollbackSnapshot(sessionId, stack1, stack2);
|
|
38
|
+
}
|
|
39
|
+
const session = {
|
|
40
|
+
sessionId,
|
|
41
|
+
stack1,
|
|
42
|
+
stack2,
|
|
43
|
+
conflicts,
|
|
44
|
+
status: "analyzing",
|
|
45
|
+
rollbackPoint,
|
|
46
|
+
startedAt: Date.now(),
|
|
47
|
+
metadata: {
|
|
48
|
+
totalFrames: stack1.frames.length + stack2.frames.length,
|
|
49
|
+
conflictCount: conflicts.length,
|
|
50
|
+
resolvedCount: 0
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
this.activeSessions.set(sessionId, session);
|
|
54
|
+
this.statistics.totalConflicts += conflicts.length;
|
|
55
|
+
logger.info(`Merge session started: ${sessionId}`, {
|
|
56
|
+
stack1Id: stack1.id,
|
|
57
|
+
stack2Id: stack2.id,
|
|
58
|
+
conflictCount: conflicts.length
|
|
59
|
+
});
|
|
60
|
+
if (options?.autoResolve && conflicts.length > 0 && options.context) {
|
|
61
|
+
const defaultStrategy = options.strategy || "ai_suggest";
|
|
62
|
+
await this.resolveConflicts(sessionId, defaultStrategy, options.context);
|
|
63
|
+
}
|
|
64
|
+
return sessionId;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Generate a preview of the merge result
|
|
68
|
+
*/
|
|
69
|
+
async generatePreview(sessionId, strategy) {
|
|
70
|
+
const session = this.activeSessions.get(sessionId);
|
|
71
|
+
if (!session) {
|
|
72
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
73
|
+
}
|
|
74
|
+
const preview = this.diffVisualizer.generateMergePreview(
|
|
75
|
+
session.stack1,
|
|
76
|
+
session.stack2,
|
|
77
|
+
strategy
|
|
78
|
+
);
|
|
79
|
+
session.preview = preview;
|
|
80
|
+
session.status = "preview";
|
|
81
|
+
session.metadata.strategyUsed = strategy;
|
|
82
|
+
this.activeSessions.set(sessionId, session);
|
|
83
|
+
logger.info(`Preview generated for session: ${sessionId}`, {
|
|
84
|
+
mergedFrameCount: preview.mergedFrames.length,
|
|
85
|
+
estimatedSuccess: preview.estimatedSuccess
|
|
86
|
+
});
|
|
87
|
+
return preview;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Resolve conflicts using the specified strategy
|
|
91
|
+
*/
|
|
92
|
+
async resolveConflicts(sessionId, strategy, context) {
|
|
93
|
+
const session = this.activeSessions.get(sessionId);
|
|
94
|
+
if (!session) {
|
|
95
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
96
|
+
}
|
|
97
|
+
session.status = "resolving";
|
|
98
|
+
try {
|
|
99
|
+
const result = await this.resolutionEngine.resolveConflicts(
|
|
100
|
+
session.stack1,
|
|
101
|
+
session.stack2,
|
|
102
|
+
strategy,
|
|
103
|
+
context
|
|
104
|
+
);
|
|
105
|
+
session.resolution = result.resolution;
|
|
106
|
+
session.status = result.success ? "completed" : "failed";
|
|
107
|
+
session.completedAt = Date.now();
|
|
108
|
+
session.metadata.resolvedCount = session.conflicts.filter(
|
|
109
|
+
(c) => c.resolution !== void 0
|
|
110
|
+
).length;
|
|
111
|
+
session.metadata.strategyUsed = strategy;
|
|
112
|
+
this.activeSessions.set(sessionId, session);
|
|
113
|
+
if (result.success) {
|
|
114
|
+
this.statistics.resolvedConflicts += session.metadata.resolvedCount;
|
|
115
|
+
this.updateSuccessRate();
|
|
116
|
+
this.updateAverageResolutionTime(session);
|
|
117
|
+
}
|
|
118
|
+
logger.info(`Conflicts resolved for session: ${sessionId}`, {
|
|
119
|
+
success: result.success,
|
|
120
|
+
strategy,
|
|
121
|
+
resolvedCount: session.metadata.resolvedCount
|
|
122
|
+
});
|
|
123
|
+
return result;
|
|
124
|
+
} catch (error) {
|
|
125
|
+
session.status = "failed";
|
|
126
|
+
this.activeSessions.set(sessionId, session);
|
|
127
|
+
logger.error(
|
|
128
|
+
`Failed to resolve conflicts for session: ${sessionId}`,
|
|
129
|
+
error
|
|
130
|
+
);
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Rollback a merge to its original state
|
|
136
|
+
*/
|
|
137
|
+
async rollback(sessionId) {
|
|
138
|
+
const session = this.activeSessions.get(sessionId);
|
|
139
|
+
if (!session || !session.rollbackPoint) {
|
|
140
|
+
logger.warn(`Cannot rollback session: ${sessionId} - no rollback point`);
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
const snapshot = this.rollbackSnapshots.get(session.rollbackPoint);
|
|
144
|
+
if (!snapshot) {
|
|
145
|
+
logger.error(`Rollback snapshot not found: ${session.rollbackPoint}`);
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
session.stack1 = snapshot.stack1;
|
|
149
|
+
session.stack2 = snapshot.stack2;
|
|
150
|
+
session.status = "rolled_back";
|
|
151
|
+
session.resolution = void 0;
|
|
152
|
+
session.conflicts = this.conflictDetector.detectConflicts(
|
|
153
|
+
snapshot.stack1,
|
|
154
|
+
snapshot.stack2
|
|
155
|
+
);
|
|
156
|
+
session.metadata.resolvedCount = 0;
|
|
157
|
+
this.activeSessions.set(sessionId, session);
|
|
158
|
+
this.statistics.rollbackCount++;
|
|
159
|
+
logger.info(`Session rolled back: ${sessionId}`);
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get merge session details
|
|
164
|
+
*/
|
|
165
|
+
getSession(sessionId) {
|
|
166
|
+
return this.activeSessions.get(sessionId);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* List all active merge sessions
|
|
170
|
+
*/
|
|
171
|
+
listActiveSessions() {
|
|
172
|
+
return Array.from(this.activeSessions.values()).filter(
|
|
173
|
+
(s) => s.status !== "completed" && s.status !== "rolled_back" && s.status !== "failed"
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get merge statistics
|
|
178
|
+
*/
|
|
179
|
+
getStatistics() {
|
|
180
|
+
return { ...this.statistics };
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Analyze parallel solutions across stacks
|
|
184
|
+
*/
|
|
185
|
+
analyzeParallelSolutions(frames) {
|
|
186
|
+
const solutions = this.conflictDetector.analyzeParallelSolutions(frames);
|
|
187
|
+
const recommendations = [];
|
|
188
|
+
if (solutions.length > 1) {
|
|
189
|
+
const grouped = /* @__PURE__ */ new Map();
|
|
190
|
+
for (const sol of solutions) {
|
|
191
|
+
const key = sol.approach.toLowerCase();
|
|
192
|
+
if (!grouped.has(key)) {
|
|
193
|
+
grouped.set(key, []);
|
|
194
|
+
}
|
|
195
|
+
grouped.get(key).push(sol);
|
|
196
|
+
}
|
|
197
|
+
for (const [approach, group] of grouped) {
|
|
198
|
+
if (group.length > 1) {
|
|
199
|
+
const avgEffectiveness = group.reduce((sum, s) => sum + (s.effectiveness || 0), 0) / group.length;
|
|
200
|
+
recommendations.push(
|
|
201
|
+
`${group.length} parallel solutions using "${approach}" approach (avg effectiveness: ${(avgEffectiveness * 100).toFixed(1)}%)`
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
const best = solutions.reduce(
|
|
206
|
+
(a, b) => (a.effectiveness || 0) > (b.effectiveness || 0) ? a : b,
|
|
207
|
+
solutions[0]
|
|
208
|
+
);
|
|
209
|
+
if (best && best.effectiveness && best.effectiveness > 0.7) {
|
|
210
|
+
recommendations.push(
|
|
211
|
+
`Recommended: Use solution from frame "${best.frameId}" (${(best.effectiveness * 100).toFixed(1)}% effectiveness)`
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
solutions: solutions.map((s) => ({
|
|
217
|
+
frameId: s.frameId,
|
|
218
|
+
approach: s.approach,
|
|
219
|
+
effectiveness: s.effectiveness || 0
|
|
220
|
+
})),
|
|
221
|
+
recommendations
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Create a visual diff between two stacks
|
|
226
|
+
*/
|
|
227
|
+
createVisualDiff(baseFrame, stack1, stack2) {
|
|
228
|
+
const diff = this.diffVisualizer.visualizeDivergence(
|
|
229
|
+
baseFrame,
|
|
230
|
+
stack1,
|
|
231
|
+
stack2
|
|
232
|
+
);
|
|
233
|
+
const conflicts = this.conflictDetector.detectConflicts(stack1, stack2);
|
|
234
|
+
return {
|
|
235
|
+
nodes: diff.nodes.map((n) => ({
|
|
236
|
+
id: n.id,
|
|
237
|
+
type: n.type,
|
|
238
|
+
depth: n.frame?.depth
|
|
239
|
+
})),
|
|
240
|
+
edges: diff.edges.map((e) => ({
|
|
241
|
+
source: e.source,
|
|
242
|
+
target: e.target,
|
|
243
|
+
type: e.type
|
|
244
|
+
})),
|
|
245
|
+
conflicts: conflicts.map((c) => ({
|
|
246
|
+
frameId1: c.frameId1,
|
|
247
|
+
frameId2: c.frameId2,
|
|
248
|
+
severity: c.severity
|
|
249
|
+
}))
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Close a merge session and clean up resources
|
|
254
|
+
*/
|
|
255
|
+
closeSession(sessionId) {
|
|
256
|
+
const session = this.activeSessions.get(sessionId);
|
|
257
|
+
if (session) {
|
|
258
|
+
if (session.rollbackPoint) {
|
|
259
|
+
this.rollbackSnapshots.delete(session.rollbackPoint);
|
|
260
|
+
}
|
|
261
|
+
this.activeSessions.delete(sessionId);
|
|
262
|
+
logger.debug(`Session closed: ${sessionId}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Private helpers
|
|
266
|
+
createRollbackSnapshot(sessionId, stack1, stack2) {
|
|
267
|
+
const snapshotId = `rollback-${sessionId}`;
|
|
268
|
+
this.rollbackSnapshots.set(snapshotId, {
|
|
269
|
+
stack1: this.deepCloneStack(stack1),
|
|
270
|
+
stack2: this.deepCloneStack(stack2)
|
|
271
|
+
});
|
|
272
|
+
return snapshotId;
|
|
273
|
+
}
|
|
274
|
+
deepCloneStack(stack) {
|
|
275
|
+
return {
|
|
276
|
+
...stack,
|
|
277
|
+
frames: stack.frames.map((f) => ({ ...f })),
|
|
278
|
+
events: stack.events.map((e) => ({ ...e }))
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
updateSuccessRate() {
|
|
282
|
+
if (this.statistics.totalConflicts > 0) {
|
|
283
|
+
this.statistics.successRate = this.statistics.resolvedConflicts / this.statistics.totalConflicts;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
updateAverageResolutionTime(session) {
|
|
287
|
+
if (session.completedAt && session.startedAt) {
|
|
288
|
+
const duration = session.completedAt - session.startedAt;
|
|
289
|
+
const completedSessions = Array.from(this.activeSessions.values()).filter(
|
|
290
|
+
(s) => s.completedAt
|
|
291
|
+
).length;
|
|
292
|
+
if (completedSessions === 1) {
|
|
293
|
+
this.statistics.averageResolutionTime = duration;
|
|
294
|
+
} else {
|
|
295
|
+
this.statistics.averageResolutionTime = (this.statistics.averageResolutionTime * (completedSessions - 1) + duration) / completedSessions;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
export {
|
|
301
|
+
UnifiedMergeResolver
|
|
302
|
+
};
|
|
303
|
+
//# sourceMappingURL=unified-merge-resolver.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/core/merge/unified-merge-resolver.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Unified Merge Resolver - STA-101\n * Bridges StackMergeResolver with advanced ConflictDetector and ResolutionEngine\n * Provides a unified interface for all merge conflict resolution scenarios\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport type { Frame, Event } from '../context/frame-types.js';\nimport { ConflictDetector } from './conflict-detector.js';\nimport { StackDiffVisualizer, PreviewResult } from './stack-diff.js';\nimport { ResolutionEngine, ResolutionContext } from './resolution-engine.js';\nimport {\n MergeConflict,\n ConflictResolution,\n ResolutionStrategy,\n FrameStack,\n MergeResult,\n MergeStatistics,\n} from './types.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport interface UnifiedMergeSession {\n sessionId: string;\n stack1: FrameStack;\n stack2: FrameStack;\n conflicts: MergeConflict[];\n resolution?: ConflictResolution;\n status:\n | 'analyzing'\n | 'preview'\n | 'resolving'\n | 'completed'\n | 'failed'\n | 'rolled_back';\n preview?: PreviewResult;\n rollbackPoint?: string;\n startedAt: number;\n completedAt?: number;\n metadata: {\n totalFrames: number;\n conflictCount: number;\n resolvedCount: number;\n strategyUsed?: ResolutionStrategy['type'];\n };\n}\n\nexport interface MergeOptions {\n strategy?: ResolutionStrategy['type'];\n autoResolve?: boolean;\n preserveRollback?: boolean;\n notifyOnComplete?: boolean;\n context?: ResolutionContext;\n}\n\nexport class UnifiedMergeResolver {\n private conflictDetector: ConflictDetector;\n private diffVisualizer: StackDiffVisualizer;\n private resolutionEngine: ResolutionEngine;\n private activeSessions: Map<string, UnifiedMergeSession> = new Map();\n private rollbackSnapshots: Map<\n string,\n { stack1: FrameStack; stack2: FrameStack }\n > = new Map();\n private statistics: MergeStatistics = {\n totalConflicts: 0,\n resolvedConflicts: 0,\n averageResolutionTime: 0,\n successRate: 0,\n rollbackCount: 0,\n };\n\n constructor() {\n this.conflictDetector = new ConflictDetector();\n this.diffVisualizer = new StackDiffVisualizer();\n this.resolutionEngine = new ResolutionEngine();\n logger.debug('UnifiedMergeResolver initialized');\n }\n\n /**\n * Start a new merge session with automatic conflict detection\n */\n async startMergeSession(\n stack1: FrameStack,\n stack2: FrameStack,\n options?: MergeOptions\n ): Promise<string> {\n const sessionId = `unified-merge-${Date.now()}-${uuidv4().substring(0, 8)}`;\n\n // Detect conflicts\n const conflicts = this.conflictDetector.detectConflicts(stack1, stack2);\n\n // Create rollback snapshot if requested\n let rollbackPoint: string | undefined;\n if (options?.preserveRollback !== false) {\n rollbackPoint = this.createRollbackSnapshot(sessionId, stack1, stack2);\n }\n\n const session: UnifiedMergeSession = {\n sessionId,\n stack1,\n stack2,\n conflicts,\n status: 'analyzing',\n rollbackPoint,\n startedAt: Date.now(),\n metadata: {\n totalFrames: stack1.frames.length + stack2.frames.length,\n conflictCount: conflicts.length,\n resolvedCount: 0,\n },\n };\n\n this.activeSessions.set(sessionId, session);\n this.statistics.totalConflicts += conflicts.length;\n\n logger.info(`Merge session started: ${sessionId}`, {\n stack1Id: stack1.id,\n stack2Id: stack2.id,\n conflictCount: conflicts.length,\n });\n\n // Auto-resolve if requested and possible\n if (options?.autoResolve && conflicts.length > 0 && options.context) {\n const defaultStrategy = options.strategy || 'ai_suggest';\n await this.resolveConflicts(sessionId, defaultStrategy, options.context);\n }\n\n return sessionId;\n }\n\n /**\n * Generate a preview of the merge result\n */\n async generatePreview(\n sessionId: string,\n strategy: ResolutionStrategy['type']\n ): Promise<PreviewResult> {\n const session = this.activeSessions.get(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n const preview = this.diffVisualizer.generateMergePreview(\n session.stack1,\n session.stack2,\n strategy\n );\n\n session.preview = preview;\n session.status = 'preview';\n session.metadata.strategyUsed = strategy;\n\n this.activeSessions.set(sessionId, session);\n\n logger.info(`Preview generated for session: ${sessionId}`, {\n mergedFrameCount: preview.mergedFrames.length,\n estimatedSuccess: preview.estimatedSuccess,\n });\n\n return preview;\n }\n\n /**\n * Resolve conflicts using the specified strategy\n */\n async resolveConflicts(\n sessionId: string,\n strategy: ResolutionStrategy['type'],\n context: ResolutionContext\n ): Promise<MergeResult> {\n const session = this.activeSessions.get(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n session.status = 'resolving';\n\n try {\n const result = await this.resolutionEngine.resolveConflicts(\n session.stack1,\n session.stack2,\n strategy,\n context\n );\n\n session.resolution = result.resolution;\n session.status = result.success ? 'completed' : 'failed';\n session.completedAt = Date.now();\n session.metadata.resolvedCount = session.conflicts.filter(\n (c) => c.resolution !== undefined\n ).length;\n session.metadata.strategyUsed = strategy;\n\n this.activeSessions.set(sessionId, session);\n\n // Update statistics\n if (result.success) {\n this.statistics.resolvedConflicts += session.metadata.resolvedCount;\n this.updateSuccessRate();\n this.updateAverageResolutionTime(session);\n }\n\n logger.info(`Conflicts resolved for session: ${sessionId}`, {\n success: result.success,\n strategy,\n resolvedCount: session.metadata.resolvedCount,\n });\n\n return result;\n } catch (error) {\n session.status = 'failed';\n this.activeSessions.set(sessionId, session);\n\n logger.error(\n `Failed to resolve conflicts for session: ${sessionId}`,\n error\n );\n throw error;\n }\n }\n\n /**\n * Rollback a merge to its original state\n */\n async rollback(sessionId: string): Promise<boolean> {\n const session = this.activeSessions.get(sessionId);\n if (!session || !session.rollbackPoint) {\n logger.warn(`Cannot rollback session: ${sessionId} - no rollback point`);\n return false;\n }\n\n const snapshot = this.rollbackSnapshots.get(session.rollbackPoint);\n if (!snapshot) {\n logger.error(`Rollback snapshot not found: ${session.rollbackPoint}`);\n return false;\n }\n\n // Restore original state\n session.stack1 = snapshot.stack1;\n session.stack2 = snapshot.stack2;\n session.status = 'rolled_back';\n session.resolution = undefined;\n session.conflicts = this.conflictDetector.detectConflicts(\n snapshot.stack1,\n snapshot.stack2\n );\n session.metadata.resolvedCount = 0;\n\n this.activeSessions.set(sessionId, session);\n this.statistics.rollbackCount++;\n\n logger.info(`Session rolled back: ${sessionId}`);\n return true;\n }\n\n /**\n * Get merge session details\n */\n getSession(sessionId: string): UnifiedMergeSession | undefined {\n return this.activeSessions.get(sessionId);\n }\n\n /**\n * List all active merge sessions\n */\n listActiveSessions(): UnifiedMergeSession[] {\n return Array.from(this.activeSessions.values()).filter(\n (s) =>\n s.status !== 'completed' &&\n s.status !== 'rolled_back' &&\n s.status !== 'failed'\n );\n }\n\n /**\n * Get merge statistics\n */\n getStatistics(): MergeStatistics {\n return { ...this.statistics };\n }\n\n /**\n * Analyze parallel solutions across stacks\n */\n analyzeParallelSolutions(frames: Frame[]): {\n solutions: Array<{\n frameId: string;\n approach: string;\n effectiveness: number;\n }>;\n recommendations: string[];\n } {\n const solutions = this.conflictDetector.analyzeParallelSolutions(frames);\n\n const recommendations: string[] = [];\n if (solutions.length > 1) {\n // Group by similar solutions\n const grouped = new Map<string, typeof solutions>();\n for (const sol of solutions) {\n const key = sol.approach.toLowerCase();\n if (!grouped.has(key)) {\n grouped.set(key, []);\n }\n grouped.get(key)!.push(sol);\n }\n\n // Generate recommendations\n for (const [approach, group] of grouped) {\n if (group.length > 1) {\n const avgEffectiveness =\n group.reduce((sum, s) => sum + (s.effectiveness || 0), 0) /\n group.length;\n recommendations.push(\n `${group.length} parallel solutions using \"${approach}\" approach (avg effectiveness: ${(avgEffectiveness * 100).toFixed(1)}%)`\n );\n }\n }\n\n // Find best solution\n const best = solutions.reduce(\n (a, b) => ((a.effectiveness || 0) > (b.effectiveness || 0) ? a : b),\n solutions[0]\n );\n if (best && best.effectiveness && best.effectiveness > 0.7) {\n recommendations.push(\n `Recommended: Use solution from frame \"${best.frameId}\" (${(best.effectiveness * 100).toFixed(1)}% effectiveness)`\n );\n }\n }\n\n return {\n solutions: solutions.map((s) => ({\n frameId: s.frameId,\n approach: s.approach,\n effectiveness: s.effectiveness || 0,\n })),\n recommendations,\n };\n }\n\n /**\n * Create a visual diff between two stacks\n */\n createVisualDiff(\n baseFrame: Frame,\n stack1: FrameStack,\n stack2: FrameStack\n ): {\n nodes: Array<{ id: string; type: string; depth?: number }>;\n edges: Array<{ source: string; target: string; type: string }>;\n conflicts: Array<{ frameId1: string; frameId2: string; severity: string }>;\n } {\n const diff = this.diffVisualizer.visualizeDivergence(\n baseFrame,\n stack1,\n stack2\n );\n const conflicts = this.conflictDetector.detectConflicts(stack1, stack2);\n\n return {\n nodes: diff.nodes.map((n) => ({\n id: n.id,\n type: n.type,\n depth: n.frame?.depth,\n })),\n edges: diff.edges.map((e) => ({\n source: e.source,\n target: e.target,\n type: e.type,\n })),\n conflicts: conflicts.map((c) => ({\n frameId1: c.frameId1,\n frameId2: c.frameId2,\n severity: c.severity,\n })),\n };\n }\n\n /**\n * Close a merge session and clean up resources\n */\n closeSession(sessionId: string): void {\n const session = this.activeSessions.get(sessionId);\n if (session) {\n // Clean up rollback snapshot\n if (session.rollbackPoint) {\n this.rollbackSnapshots.delete(session.rollbackPoint);\n }\n this.activeSessions.delete(sessionId);\n\n logger.debug(`Session closed: ${sessionId}`);\n }\n }\n\n // Private helpers\n\n private createRollbackSnapshot(\n sessionId: string,\n stack1: FrameStack,\n stack2: FrameStack\n ): string {\n const snapshotId = `rollback-${sessionId}`;\n\n // Deep clone stacks\n this.rollbackSnapshots.set(snapshotId, {\n stack1: this.deepCloneStack(stack1),\n stack2: this.deepCloneStack(stack2),\n });\n\n return snapshotId;\n }\n\n private deepCloneStack(stack: FrameStack): FrameStack {\n return {\n ...stack,\n frames: stack.frames.map((f) => ({ ...f })),\n events: stack.events.map((e) => ({ ...e })),\n };\n }\n\n private updateSuccessRate(): void {\n if (this.statistics.totalConflicts > 0) {\n this.statistics.successRate =\n this.statistics.resolvedConflicts / this.statistics.totalConflicts;\n }\n }\n\n private updateAverageResolutionTime(session: UnifiedMergeSession): void {\n if (session.completedAt && session.startedAt) {\n const duration = session.completedAt - session.startedAt;\n const completedSessions = Array.from(this.activeSessions.values()).filter(\n (s) => s.completedAt\n ).length;\n\n if (completedSessions === 1) {\n this.statistics.averageResolutionTime = duration;\n } else {\n // Running average\n this.statistics.averageResolutionTime =\n (this.statistics.averageResolutionTime * (completedSessions - 1) +\n duration) /\n completedSessions;\n }\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -4,16 +4,63 @@ const __filename = __fileURLToPath(import.meta.url);
|
|
|
4
4
|
const __dirname = __pathDirname(__filename);
|
|
5
5
|
import * as fs from "fs";
|
|
6
6
|
import * as path from "path";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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]");
|
|
12
39
|
}
|
|
13
|
-
return
|
|
40
|
+
return result;
|
|
14
41
|
}
|
|
15
|
-
function
|
|
16
|
-
|
|
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;
|
|
17
64
|
}
|
|
18
65
|
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
19
66
|
LogLevel2[LogLevel2["ERROR"] = 0] = "ERROR";
|
|
@@ -75,7 +122,12 @@ class Logger {
|
|
|
75
122
|
}
|
|
76
123
|
}
|
|
77
124
|
writeLog(entry) {
|
|
78
|
-
const
|
|
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";
|
|
79
131
|
if (this.logFile) {
|
|
80
132
|
try {
|
|
81
133
|
fs.appendFileSync(this.logFile, logLine);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/core/monitoring/logger.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Structured logging utility for StackMemory CLI\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n
|
|
5
|
-
"mappings": ";;;;
|
|
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
6
|
"names": ["LogLevel"]
|
|
7
7
|
}
|