@stackmemoryai/stackmemory 0.5.58 → 0.5.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +105 -1
- package/dist/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.map +7 -0
- package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
- package/dist/src/cli/auto-detect.js.map +7 -0
- package/dist/src/cli/claude-sm-danger.js.map +7 -0
- package/dist/src/cli/claude-sm.js +1236 -0
- package/dist/src/cli/claude-sm.js.map +7 -0
- package/dist/src/cli/codex-sm-danger.js.map +7 -0
- package/dist/src/cli/codex-sm.js.map +7 -0
- package/dist/src/cli/commands/api.js.map +7 -0
- package/dist/src/cli/commands/auto-background.js.map +7 -0
- package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
- package/dist/src/cli/commands/clear.js.map +7 -0
- package/dist/src/cli/commands/config.js.map +7 -0
- package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
- package/dist/src/cli/commands/context.js.map +7 -0
- package/dist/src/cli/commands/daemon.js.map +7 -0
- package/dist/src/cli/commands/dashboard.js.map +7 -0
- package/dist/src/cli/commands/db.js.map +7 -0
- package/dist/src/cli/commands/decision.js.map +7 -0
- package/dist/src/cli/commands/discovery.js.map +7 -0
- package/dist/src/cli/commands/handoff.js.map +7 -0
- package/dist/src/cli/commands/hooks.js.map +7 -0
- package/dist/src/cli/commands/linear.js.map +7 -0
- package/dist/src/cli/commands/log.js.map +7 -0
- package/dist/src/cli/commands/login.js.map +7 -0
- package/dist/src/cli/commands/migrate.js.map +7 -0
- package/dist/src/cli/commands/model.js.map +7 -0
- package/dist/src/cli/commands/onboard.js.map +7 -0
- package/dist/src/cli/commands/projects.js.map +7 -0
- package/dist/src/cli/commands/ralph.js.map +7 -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.map +7 -0
- package/dist/src/cli/commands/session.js.map +7 -0
- package/dist/src/cli/commands/settings.js.map +7 -0
- package/dist/src/cli/commands/setup.js.map +7 -0
- package/dist/src/cli/commands/shell.js.map +7 -0
- package/dist/src/cli/commands/signup.js.map +7 -0
- package/dist/src/cli/commands/skills.js.map +7 -0
- package/dist/src/cli/commands/sms-notify.js.map +7 -0
- package/dist/src/cli/commands/storage-tier.js.map +7 -0
- package/dist/src/cli/commands/sweep.js.map +7 -0
- package/dist/src/cli/commands/tasks.js.map +7 -0
- package/dist/src/cli/commands/worktree.js.map +7 -0
- package/dist/src/cli/index.js +609 -0
- package/dist/src/cli/index.js.map +7 -0
- package/dist/src/cli/opencode-sm.js.map +7 -0
- package/dist/src/cli/utils/viewer.js.map +7 -0
- package/dist/src/core/config/config-manager.js.map +7 -0
- package/dist/src/core/config/feature-flags.js.map +7 -0
- package/dist/src/core/config/storage-config.js.map +7 -0
- package/dist/src/core/config/types.js.map +7 -0
- package/dist/src/core/context/auto-context.js.map +7 -0
- package/dist/src/core/context/dual-stack-manager.js.map +7 -0
- package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
- package/dist/src/core/context/frame-database.js.map +7 -0
- package/dist/src/core/context/frame-digest.js.map +7 -0
- package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
- package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
- package/dist/src/core/context/frame-recovery.js.map +7 -0
- package/dist/src/core/context/frame-stack.js.map +7 -0
- package/dist/src/core/context/index.js.map +7 -0
- package/dist/src/core/context/permission-manager.js.map +7 -0
- package/dist/src/core/context/recursive-context-manager.js.map +7 -0
- package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
- package/dist/src/core/context/shared-context-layer.js.map +7 -0
- package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
- package/dist/src/core/context/validation.js.map +7 -0
- package/dist/src/core/database/batch-operations.js.map +7 -0
- package/dist/src/core/database/connection-pool.js.map +7 -0
- package/dist/src/core/database/database-adapter.js.map +7 -0
- package/dist/src/core/database/migration-manager.js.map +7 -0
- package/dist/src/core/database/query-cache.js.map +7 -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.map +7 -0
- package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
- package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
- package/dist/src/core/digest/index.js.map +7 -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.map +7 -0
- package/dist/src/core/execution/parallel-executor.js.map +7 -0
- package/dist/src/core/extensions/custom-tools.js +567 -0
- package/dist/src/core/extensions/custom-tools.js.map +7 -0
- package/dist/src/core/extensions/index.js +55 -0
- package/dist/src/core/extensions/index.js.map +7 -0
- package/dist/src/core/extensions/loader.js +709 -0
- package/dist/src/core/extensions/loader.js.map +7 -0
- package/dist/src/core/extensions/plugin-system.js +506 -0
- package/dist/src/core/extensions/plugin-system.js.map +7 -0
- package/dist/src/core/extensions/provider-adapter.js +617 -0
- package/dist/src/core/extensions/provider-adapter.js.map +7 -0
- package/dist/src/core/extensions/sandbox-runtime.js +664 -0
- package/dist/src/core/extensions/sandbox-runtime.js.map +7 -0
- package/dist/src/core/frame/workflow-templates.js.map +7 -0
- package/dist/src/core/merge/conflict-detector.js.map +7 -0
- package/dist/src/core/merge/index.js.map +7 -0
- package/dist/src/core/merge/resolution-engine.js.map +7 -0
- package/dist/src/core/merge/stack-diff.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.map +7 -0
- package/dist/src/core/models/model-router.js.map +7 -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.map +7 -0
- package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
- package/dist/src/core/monitoring/session-monitor.js.map +7 -0
- package/dist/src/core/performance/context-cache.js.map +7 -0
- package/dist/src/core/performance/index.js.map +7 -0
- package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
- package/dist/src/core/performance/monitor.js.map +7 -0
- package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
- package/dist/src/core/performance/performance-benchmark.js.map +7 -0
- package/dist/src/core/performance/performance-profiler.js.map +7 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
- package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
- package/dist/src/core/projects/project-isolation.js.map +7 -0
- package/dist/src/core/projects/project-manager.js.map +7 -0
- package/dist/src/core/query/query-parser.js.map +7 -0
- package/dist/src/core/query/query-templates.js.map +7 -0
- package/dist/src/core/retrieval/context-retriever.js.map +7 -0
- package/dist/src/core/retrieval/index.js.map +7 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
- package/dist/src/core/retrieval/llm-provider.js.map +7 -0
- package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
- package/dist/src/core/retrieval/summary-generator.js.map +7 -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.map +7 -0
- package/dist/src/core/session/enhanced-handoff.js.map +7 -0
- package/dist/src/core/session/handoff-generator.js.map +7 -0
- package/dist/src/core/session/index.js.map +7 -0
- package/dist/src/core/session/session-manager.js.map +7 -0
- package/dist/src/core/skills/index.js.map +7 -0
- package/dist/src/core/skills/skill-storage.js.map +7 -0
- package/dist/src/core/skills/types.js.map +7 -0
- package/dist/src/core/storage/chromadb-adapter.js +380 -0
- package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
- package/dist/src/core/storage/infinite-storage.js.map +7 -0
- package/dist/src/core/storage/remote-storage.js.map +7 -0
- package/dist/src/core/storage/two-tier-storage.js.map +7 -0
- package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/debug-trace.js.map +7 -0
- package/dist/src/core/trace/index.js.map +7 -0
- package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
- package/dist/src/core/trace/trace-detector.js.map +7 -0
- package/dist/src/core/trace/trace-store.js.map +7 -0
- package/dist/src/core/trace/types.js.map +7 -0
- package/dist/src/core/utils/async-mutex.js.map +7 -0
- package/dist/src/core/utils/compression.js.map +7 -0
- package/dist/src/core/utils/update-checker.js.map +7 -0
- package/dist/src/core/worktree/worktree-manager.js.map +7 -0
- package/dist/src/daemon/daemon-config.js.map +7 -0
- package/dist/src/daemon/services/context-service.js.map +7 -0
- package/dist/src/daemon/services/linear-service.js.map +7 -0
- package/dist/src/daemon/session-daemon.js.map +7 -0
- package/dist/src/daemon/unified-daemon.js.map +7 -0
- package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
- package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
- package/dist/src/features/analytics/index.js.map +7 -0
- package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
- package/dist/src/features/browser/browser-mcp.js.map +7 -0
- package/dist/src/features/sweep/index.js.map +7 -0
- package/dist/src/features/sweep/prediction-client.js.map +7 -0
- package/dist/src/features/sweep/prompt-builder.js.map +7 -0
- package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
- package/dist/src/features/sweep/state-watcher.js.map +7 -0
- package/dist/src/features/sweep/status-bar.js.map +7 -0
- package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
- package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
- package/dist/src/features/sweep/types.js.map +7 -0
- package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
- package/dist/src/features/tasks/task-aware-context.js.map +7 -0
- package/dist/src/features/tui/simple-monitor.js.map +7 -0
- package/dist/src/features/tui/swarm-monitor.js.map +7 -0
- package/dist/src/features/web/client/stores/task-store.js.map +7 -0
- package/dist/src/features/web/server/index.js.map +7 -0
- package/dist/src/hooks/auto-background.js.map +7 -0
- package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
- package/dist/src/hooks/config.js.map +7 -0
- package/dist/src/hooks/daemon.js.map +7 -0
- package/dist/src/hooks/events.js.map +7 -0
- package/dist/src/hooks/index.js.map +7 -0
- package/dist/src/hooks/linear-task-picker.js.map +7 -0
- package/dist/src/hooks/schemas.js.map +7 -0
- package/dist/src/hooks/secure-fs.js.map +7 -0
- package/dist/src/hooks/security-logger.js.map +7 -0
- package/dist/src/hooks/session-summary.js.map +7 -0
- package/dist/src/hooks/sms-action-runner.js.map +7 -0
- package/dist/src/hooks/sms-notify.js.map +7 -0
- package/dist/src/hooks/sms-watcher.js.map +7 -0
- package/dist/src/hooks/sms-webhook.js.map +7 -0
- package/dist/src/hooks/whatsapp-commands.js.map +7 -0
- package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
- package/dist/src/hooks/whatsapp-sync.js.map +7 -0
- package/dist/src/index.js.map +7 -0
- package/dist/src/integrations/anthropic/client.js.map +7 -0
- package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
- package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
- package/dist/src/integrations/linear/auth.js.map +7 -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.map +7 -0
- package/dist/src/integrations/linear/migration.js.map +7 -0
- package/dist/src/integrations/linear/oauth-server.js.map +7 -0
- package/dist/src/integrations/linear/rest-client.js.map +7 -0
- package/dist/src/integrations/linear/sync-manager.js.map +7 -0
- package/dist/src/integrations/linear/sync-service.js.map +7 -0
- package/dist/src/integrations/linear/sync.js.map +7 -0
- package/dist/src/integrations/linear/unified-sync.js.map +7 -0
- package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
- package/dist/src/integrations/linear/webhook-server.js.map +7 -0
- package/dist/src/integrations/linear/webhook.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/index.js.map +7 -0
- package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -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.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.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
- package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
- package/dist/src/integrations/ralph/index.js.map +7 -0
- package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
- package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
- package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -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/visualization/ralph-debugger.js.map +7 -0
- package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
- package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
- package/dist/src/models/user.model.js.map +7 -0
- package/dist/src/servers/production/auth-middleware.js.map +7 -0
- package/dist/src/services/config-service.js.map +7 -0
- package/dist/src/services/context-service.js.map +7 -0
- package/dist/src/skills/api-discovery.js.map +7 -0
- package/dist/src/skills/api-skill.js.map +7 -0
- package/dist/src/skills/claude-skills.js.map +7 -0
- package/dist/src/skills/dashboard-launcher.js.map +7 -0
- package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
- package/dist/src/skills/repo-ingestion-skill.js +632 -0
- package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
- package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
- package/dist/src/types/task.js.map +7 -0
- package/dist/src/utils/env.js.map +7 -0
- package/dist/src/utils/formatting.js.map +7 -0
- package/dist/src/utils/process-cleanup.js.map +7 -0
- package/package.json +13 -9
- package/scripts/background-sync-manager.js +145 -83
- package/scripts/claude-sm-autostart.js +17 -12
- package/scripts/gepa/README.md +275 -0
- package/scripts/gepa/config.json +53 -0
- package/scripts/gepa/evals/coding-tasks.jsonl +5 -0
- package/scripts/gepa/evals/fixtures/buggy-loop.js +18 -0
- package/scripts/gepa/evals/fixtures/callback-hell.js +53 -0
- package/scripts/gepa/generations/gen-000/baseline.md +124 -0
- package/scripts/gepa/hooks/auto-optimize.js +494 -0
- package/scripts/gepa/hooks/eval-tracker.js +203 -0
- package/scripts/gepa/hooks/reflect.js +311 -0
- package/scripts/gepa/optimize.js +611 -0
- package/scripts/gepa/state.json +14 -0
- package/scripts/initialize.ts +16 -7
- package/scripts/install.sh +14 -62
- package/scripts/status.ts +111 -46
- package/scripts/test-pre-publish-quick.sh +1 -1
- package/dist/agents/core/agent-task-manager.js.map +0 -7
- package/dist/agents/testing-agent.js +0 -614
- package/dist/agents/testing-agent.js.map +0 -7
- package/dist/agents/verifiers/base-verifier.js.map +0 -7
- package/dist/agents/verifiers/formatter-verifier.js.map +0 -7
- package/dist/agents/verifiers/llm-judge.js.map +0 -7
- package/dist/cli/auto-detect.js.map +0 -7
- package/dist/cli/browser-test.js +0 -33
- package/dist/cli/browser-test.js.map +0 -7
- package/dist/cli/claude-sm-danger.js.map +0 -7
- package/dist/cli/claude-sm.js +0 -1156
- package/dist/cli/claude-sm.js.map +0 -7
- package/dist/cli/codex-sm-danger.js.map +0 -7
- package/dist/cli/codex-sm.js.map +0 -7
- package/dist/cli/commands/api.js.map +0 -7
- package/dist/cli/commands/auto-background.js.map +0 -7
- package/dist/cli/commands/cleanup-processes.js.map +0 -7
- package/dist/cli/commands/clear.js.map +0 -7
- package/dist/cli/commands/config.js.map +0 -7
- package/dist/cli/commands/context-rehydrate.js.map +0 -7
- package/dist/cli/commands/context.js.map +0 -7
- package/dist/cli/commands/daemon.js.map +0 -7
- package/dist/cli/commands/dashboard.js.map +0 -7
- package/dist/cli/commands/db.js.map +0 -7
- package/dist/cli/commands/decision.js.map +0 -7
- package/dist/cli/commands/discovery.js.map +0 -7
- package/dist/cli/commands/handoff.js.map +0 -7
- package/dist/cli/commands/hooks.js.map +0 -7
- package/dist/cli/commands/linear-unified.js +0 -353
- package/dist/cli/commands/linear-unified.js.map +0 -7
- package/dist/cli/commands/linear.js.map +0 -7
- package/dist/cli/commands/log.js.map +0 -7
- package/dist/cli/commands/login.js.map +0 -7
- package/dist/cli/commands/migrate.js.map +0 -7
- package/dist/cli/commands/model.js.map +0 -7
- package/dist/cli/commands/monitor.js +0 -313
- package/dist/cli/commands/monitor.js.map +0 -7
- package/dist/cli/commands/onboard.js.map +0 -7
- package/dist/cli/commands/projects.js.map +0 -7
- package/dist/cli/commands/quality.js +0 -413
- package/dist/cli/commands/quality.js.map +0 -7
- package/dist/cli/commands/ralph.js.map +0 -7
- package/dist/cli/commands/retrieval.js.map +0 -7
- package/dist/cli/commands/search.js +0 -156
- package/dist/cli/commands/search.js.map +0 -7
- package/dist/cli/commands/service.js.map +0 -7
- package/dist/cli/commands/session.js.map +0 -7
- package/dist/cli/commands/settings.js.map +0 -7
- package/dist/cli/commands/setup.js.map +0 -7
- package/dist/cli/commands/shell.js.map +0 -7
- package/dist/cli/commands/signup.js.map +0 -7
- package/dist/cli/commands/skills.js.map +0 -7
- package/dist/cli/commands/sms-notify.js.map +0 -7
- package/dist/cli/commands/storage-tier.js.map +0 -7
- package/dist/cli/commands/storage.js +0 -360
- package/dist/cli/commands/storage.js.map +0 -7
- package/dist/cli/commands/sweep.js.map +0 -7
- package/dist/cli/commands/tasks.js.map +0 -7
- package/dist/cli/commands/test.js +0 -286
- package/dist/cli/commands/test.js.map +0 -7
- package/dist/cli/commands/workflow.js +0 -142
- package/dist/cli/commands/workflow.js.map +0 -7
- package/dist/cli/commands/worktree.js.map +0 -7
- package/dist/cli/index.js +0 -594
- package/dist/cli/index.js.map +0 -7
- package/dist/cli/opencode-sm.js.map +0 -7
- package/dist/cli/utils/viewer.js.map +0 -7
- package/dist/core/analytics/team-analytics.js +0 -378
- package/dist/core/analytics/team-analytics.js.map +0 -7
- package/dist/core/config/config-manager.js.map +0 -7
- package/dist/core/config/feature-flags.js.map +0 -7
- package/dist/core/config/storage-config.js.map +0 -7
- package/dist/core/config/types.js.map +0 -7
- package/dist/core/context/auto-context.js.map +0 -7
- package/dist/core/context/dual-stack-manager.js.map +0 -7
- package/dist/core/context/enhanced-rehydration.js.map +0 -7
- package/dist/core/context/frame-database.js.map +0 -7
- package/dist/core/context/frame-digest.js.map +0 -7
- package/dist/core/context/frame-handoff-manager.js.map +0 -7
- package/dist/core/context/frame-lifecycle-hooks.js.map +0 -7
- package/dist/core/context/frame-manager.js +0 -1069
- package/dist/core/context/frame-manager.js.map +0 -7
- package/dist/core/context/frame-recovery.js.map +0 -7
- package/dist/core/context/frame-stack.js.map +0 -7
- package/dist/core/context/incremental-gc.js +0 -290
- package/dist/core/context/incremental-gc.js.map +0 -7
- package/dist/core/context/index.js.map +0 -7
- package/dist/core/context/model-aware-compaction.js +0 -623
- package/dist/core/context/model-aware-compaction.js.map +0 -7
- package/dist/core/context/permission-manager.js.map +0 -7
- package/dist/core/context/recursive-context-manager.js.map +0 -7
- package/dist/core/context/refactored-frame-manager.js.map +0 -7
- package/dist/core/context/shared-context-layer.js.map +0 -7
- package/dist/core/context/stack-merge-resolver.js.map +0 -7
- package/dist/core/context/validation.js.map +0 -7
- package/dist/core/database/batch-operations.js.map +0 -7
- package/dist/core/database/connection-pool.js.map +0 -7
- package/dist/core/database/database-adapter.js.map +0 -7
- package/dist/core/database/migration-manager.js.map +0 -7
- package/dist/core/database/paradedb-adapter.js +0 -990
- package/dist/core/database/paradedb-adapter.js.map +0 -7
- package/dist/core/database/query-cache.js.map +0 -7
- package/dist/core/database/query-router.js.map +0 -7
- package/dist/core/database/sqlite-adapter.js +0 -728
- package/dist/core/database/sqlite-adapter.js.map +0 -7
- package/dist/core/digest/enhanced-hybrid-digest.js.map +0 -7
- package/dist/core/digest/frame-digest-integration.js.map +0 -7
- package/dist/core/digest/hybrid-digest-generator.js.map +0 -7
- package/dist/core/digest/index.js.map +0 -7
- package/dist/core/digest/types.js.map +0 -7
- package/dist/core/errors/index.js +0 -512
- package/dist/core/errors/index.js.map +0 -7
- package/dist/core/errors/recovery.js.map +0 -7
- package/dist/core/execution/parallel-executor.js.map +0 -7
- package/dist/core/frame/workflow-templates.js.map +0 -7
- package/dist/core/merge/conflict-detector.js.map +0 -7
- package/dist/core/merge/index.js.map +0 -7
- package/dist/core/merge/resolution-engine.js.map +0 -7
- package/dist/core/merge/stack-diff.js.map +0 -7
- package/dist/core/models/fallback-monitor.js.map +0 -7
- package/dist/core/models/model-router.js.map +0 -7
- package/dist/core/monitoring/error-handler.js.map +0 -7
- package/dist/core/monitoring/logger.js +0 -150
- package/dist/core/monitoring/logger.js.map +0 -7
- package/dist/core/monitoring/metrics.js.map +0 -7
- package/dist/core/monitoring/progress-tracker.js.map +0 -7
- package/dist/core/monitoring/session-monitor.js.map +0 -7
- package/dist/core/performance/context-cache.js.map +0 -7
- package/dist/core/performance/index.js.map +0 -7
- package/dist/core/performance/lazy-context-loader.js.map +0 -7
- package/dist/core/performance/monitor.js.map +0 -7
- package/dist/core/performance/optimized-frame-context.js.map +0 -7
- package/dist/core/performance/performance-benchmark.js.map +0 -7
- package/dist/core/performance/performance-profiler.js.map +0 -7
- package/dist/core/performance/streaming-jsonl-parser.js.map +0 -7
- package/dist/core/persistence/postgres-adapter.js.map +0 -7
- package/dist/core/projects/project-isolation.js.map +0 -7
- package/dist/core/projects/project-manager.js.map +0 -7
- package/dist/core/query/query-parser.js.map +0 -7
- package/dist/core/query/query-templates.js.map +0 -7
- package/dist/core/retrieval/context-retriever.js.map +0 -7
- package/dist/core/retrieval/graph-retrieval.js +0 -662
- package/dist/core/retrieval/graph-retrieval.js.map +0 -7
- package/dist/core/retrieval/hierarchical-retrieval.js +0 -656
- package/dist/core/retrieval/hierarchical-retrieval.js.map +0 -7
- package/dist/core/retrieval/index.js.map +0 -7
- package/dist/core/retrieval/llm-context-retrieval.js.map +0 -7
- package/dist/core/retrieval/llm-provider.js.map +0 -7
- package/dist/core/retrieval/retrieval-audit.js.map +0 -7
- package/dist/core/retrieval/retrieval-benchmarks.js +0 -521
- package/dist/core/retrieval/retrieval-benchmarks.js.map +0 -7
- package/dist/core/retrieval/summary-generator.js.map +0 -7
- package/dist/core/retrieval/types.js.map +0 -7
- package/dist/core/session/clear-survival.js.map +0 -7
- package/dist/core/session/enhanced-handoff.js.map +0 -7
- package/dist/core/session/handoff-generator.js.map +0 -7
- package/dist/core/session/index.js.map +0 -7
- package/dist/core/session/session-manager.js.map +0 -7
- package/dist/core/skills/index.js.map +0 -7
- package/dist/core/skills/skill-storage.js.map +0 -7
- package/dist/core/skills/types.js.map +0 -7
- package/dist/core/storage/chromadb-adapter.js +0 -354
- package/dist/core/storage/chromadb-adapter.js.map +0 -7
- package/dist/core/storage/infinite-storage.js.map +0 -7
- package/dist/core/storage/railway-optimized-storage.js +0 -591
- package/dist/core/storage/railway-optimized-storage.js.map +0 -7
- package/dist/core/storage/remote-storage.js.map +0 -7
- package/dist/core/storage/two-tier-storage.js.map +0 -7
- package/dist/core/trace/cli-trace-wrapper.js.map +0 -7
- package/dist/core/trace/db-trace-wrapper.js.map +0 -7
- package/dist/core/trace/debug-trace.js.map +0 -7
- package/dist/core/trace/index.js.map +0 -7
- package/dist/core/trace/linear-api-wrapper.js.map +0 -7
- package/dist/core/trace/trace-demo.js +0 -154
- package/dist/core/trace/trace-demo.js.map +0 -7
- package/dist/core/trace/trace-detector.demo.js +0 -142
- package/dist/core/trace/trace-detector.demo.js.map +0 -7
- package/dist/core/trace/trace-detector.js.map +0 -7
- package/dist/core/trace/trace-store.js.map +0 -7
- package/dist/core/trace/types.js.map +0 -7
- package/dist/core/utils/async-mutex.js.map +0 -7
- package/dist/core/utils/compression.js.map +0 -7
- package/dist/core/utils/update-checker.js.map +0 -7
- package/dist/core/worktree/worktree-manager.js.map +0 -7
- package/dist/daemon/daemon-config.js.map +0 -7
- package/dist/daemon/services/context-service.js.map +0 -7
- package/dist/daemon/services/linear-service.js.map +0 -7
- package/dist/daemon/session-daemon.js.map +0 -7
- package/dist/daemon/unified-daemon.js.map +0 -7
- package/dist/features/analytics/api/analytics-api.js.map +0 -7
- package/dist/features/analytics/core/analytics-service.js.map +0 -7
- package/dist/features/analytics/index.js.map +0 -7
- package/dist/features/analytics/queries/metrics-queries.js.map +0 -7
- package/dist/features/browser/browser-mcp.js.map +0 -7
- package/dist/features/sweep/index.js.map +0 -7
- package/dist/features/sweep/prediction-client.js.map +0 -7
- package/dist/features/sweep/prompt-builder.js.map +0 -7
- package/dist/features/sweep/pty-wrapper.js.map +0 -7
- package/dist/features/sweep/state-watcher.js.map +0 -7
- package/dist/features/sweep/status-bar.js.map +0 -7
- package/dist/features/sweep/sweep-server-manager.js.map +0 -7
- package/dist/features/sweep/tab-interceptor.js.map +0 -7
- package/dist/features/sweep/types.js.map +0 -7
- package/dist/features/tasks/linear-task-manager.js.map +0 -7
- package/dist/features/tasks/task-aware-context.js.map +0 -7
- package/dist/features/tui/simple-monitor.js.map +0 -7
- package/dist/features/tui/swarm-monitor.js.map +0 -7
- package/dist/features/web/client/stores/task-store.js.map +0 -7
- package/dist/features/web/server/index.js.map +0 -7
- package/dist/hooks/auto-background.js.map +0 -7
- package/dist/hooks/claude-code-whatsapp-hook.js.map +0 -7
- package/dist/hooks/config.js.map +0 -7
- package/dist/hooks/daemon.js.map +0 -7
- package/dist/hooks/events.js.map +0 -7
- package/dist/hooks/index.js.map +0 -7
- package/dist/hooks/linear-task-picker.js.map +0 -7
- package/dist/hooks/schemas.js.map +0 -7
- package/dist/hooks/secure-fs.js.map +0 -7
- package/dist/hooks/security-logger.js.map +0 -7
- package/dist/hooks/session-summary.js.map +0 -7
- package/dist/hooks/sms-action-runner.js.map +0 -7
- package/dist/hooks/sms-notify.js.map +0 -7
- package/dist/hooks/sms-watcher.js.map +0 -7
- package/dist/hooks/sms-webhook.js.map +0 -7
- package/dist/hooks/whatsapp-commands.js.map +0 -7
- package/dist/hooks/whatsapp-scheduler.js.map +0 -7
- package/dist/hooks/whatsapp-sync.js.map +0 -7
- package/dist/index.js.map +0 -7
- package/dist/integrations/anthropic/client.js.map +0 -7
- package/dist/integrations/claude-code/agent-bridge.js.map +0 -7
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
- package/dist/integrations/claude-code/lifecycle-hooks.js.map +0 -7
- package/dist/integrations/claude-code/post-task-hooks.js.map +0 -7
- package/dist/integrations/claude-code/subagent-client-stub.js.map +0 -7
- package/dist/integrations/claude-code/subagent-client.js.map +0 -7
- package/dist/integrations/claude-code/task-coordinator.js.map +0 -7
- package/dist/integrations/linear/auth.js.map +0 -7
- package/dist/integrations/linear/auto-sync.js.map +0 -7
- package/dist/integrations/linear/client.js +0 -630
- package/dist/integrations/linear/client.js.map +0 -7
- package/dist/integrations/linear/config.js.map +0 -7
- package/dist/integrations/linear/migration.js.map +0 -7
- package/dist/integrations/linear/oauth-server.js.map +0 -7
- package/dist/integrations/linear/rest-client.js.map +0 -7
- package/dist/integrations/linear/sync-manager.js.map +0 -7
- package/dist/integrations/linear/sync-service.js.map +0 -7
- package/dist/integrations/linear/sync.js.map +0 -7
- package/dist/integrations/linear/unified-sync.js.map +0 -7
- package/dist/integrations/linear/webhook-handler.js.map +0 -7
- package/dist/integrations/linear/webhook-server.js.map +0 -7
- package/dist/integrations/linear/webhook.js.map +0 -7
- package/dist/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/context-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/index.js.map +0 -7
- package/dist/integrations/mcp/handlers/linear-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/skill-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/task-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/trace-handlers.js.map +0 -7
- package/dist/integrations/mcp/index.js.map +0 -7
- package/dist/integrations/mcp/middleware/tool-scoring.js.map +0 -7
- package/dist/integrations/mcp/refactored-server.js.map +0 -7
- package/dist/integrations/mcp/remote-server.js +0 -691
- package/dist/integrations/mcp/remote-server.js.map +0 -7
- package/dist/integrations/mcp/schemas.js.map +0 -7
- package/dist/integrations/mcp/server.js +0 -1960
- package/dist/integrations/mcp/server.js.map +0 -7
- package/dist/integrations/mcp/tool-definitions-code.js.map +0 -7
- package/dist/integrations/mcp/tool-definitions.js.map +0 -7
- package/dist/integrations/mcp/trace-test.js +0 -48
- package/dist/integrations/mcp/trace-test.js.map +0 -7
- package/dist/integrations/pg-aiguide/embedding-provider.js +0 -189
- package/dist/integrations/pg-aiguide/embedding-provider.js.map +0 -7
- package/dist/integrations/pg-aiguide/semantic-search.js +0 -187
- package/dist/integrations/pg-aiguide/semantic-search.js.map +0 -7
- package/dist/integrations/pg-aiguide/timescale-analytics.js +0 -224
- package/dist/integrations/pg-aiguide/timescale-analytics.js.map +0 -7
- package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
- package/dist/integrations/ralph/context/context-budget-manager.js.map +0 -7
- package/dist/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
- package/dist/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
- package/dist/integrations/ralph/index.js.map +0 -7
- package/dist/integrations/ralph/learning/pattern-learner.js.map +0 -7
- package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
- package/dist/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
- package/dist/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
- package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
- package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
- package/dist/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
- package/dist/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
- package/dist/integrations/ralph/performance/performance-optimizer.js.map +0 -7
- package/dist/integrations/ralph/ralph-integration-demo.js +0 -182
- package/dist/integrations/ralph/ralph-integration-demo.js.map +0 -7
- package/dist/integrations/ralph/recovery/crash-recovery.js.map +0 -7
- package/dist/integrations/ralph/state/state-reconciler.js.map +0 -7
- package/dist/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
- package/dist/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
- package/dist/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
- package/dist/mcp/stackmemory-mcp-server.js.map +0 -7
- package/dist/middleware/exponential-rate-limiter.js.map +0 -7
- package/dist/models/user.model.js.map +0 -7
- package/dist/servers/production/auth-middleware.js.map +0 -7
- package/dist/servers/railway/config.js +0 -55
- package/dist/servers/railway/config.js.map +0 -7
- package/dist/servers/railway/index-enhanced.js +0 -160
- package/dist/servers/railway/index-enhanced.js.map +0 -7
- package/dist/servers/railway/index.js +0 -1349
- package/dist/servers/railway/index.js.map +0 -7
- package/dist/servers/railway/simple.js +0 -64
- package/dist/servers/railway/simple.js.map +0 -7
- package/dist/servers/railway/storage-test.js +0 -459
- package/dist/servers/railway/storage-test.js.map +0 -7
- package/dist/services/config-service.js.map +0 -7
- package/dist/services/context-service.js.map +0 -7
- package/dist/skills/api-discovery.js.map +0 -7
- package/dist/skills/api-skill.js.map +0 -7
- package/dist/skills/claude-skills.js.map +0 -7
- package/dist/skills/dashboard-launcher.js.map +0 -7
- package/dist/skills/recursive-agent-orchestrator.js.map +0 -7
- package/dist/skills/repo-ingestion-skill.js +0 -609
- package/dist/skills/repo-ingestion-skill.js.map +0 -7
- package/dist/skills/security-secrets-scanner.js +0 -284
- package/dist/skills/security-secrets-scanner.js.map +0 -7
- package/dist/skills/unified-rlm-orchestrator.js.map +0 -7
- package/dist/utils/env.js.map +0 -7
- package/dist/utils/formatting.js.map +0 -7
- package/dist/utils/process-cleanup.js.map +0 -7
- package/dist/validation/schemas.js +0 -222
- package/dist/validation/schemas.js.map +0 -7
- /package/dist/{agents → src/agents}/core/agent-task-manager.js +0 -0
- /package/dist/{agents → src/agents}/verifiers/base-verifier.js +0 -0
- /package/dist/{agents → src/agents}/verifiers/formatter-verifier.js +0 -0
- /package/dist/{agents → src/agents}/verifiers/llm-judge.js +0 -0
- /package/dist/{cli → src/cli}/auto-detect.js +0 -0
- /package/dist/{cli → src/cli}/claude-sm-danger.js +0 -0
- /package/dist/{cli → src/cli}/codex-sm-danger.js +0 -0
- /package/dist/{cli → src/cli}/codex-sm.js +0 -0
- /package/dist/{cli → src/cli}/commands/api.js +0 -0
- /package/dist/{cli → src/cli}/commands/auto-background.js +0 -0
- /package/dist/{cli → src/cli}/commands/cleanup-processes.js +0 -0
- /package/dist/{cli → src/cli}/commands/clear.js +0 -0
- /package/dist/{cli → src/cli}/commands/config.js +0 -0
- /package/dist/{cli → src/cli}/commands/context-rehydrate.js +0 -0
- /package/dist/{cli → src/cli}/commands/context.js +0 -0
- /package/dist/{cli → src/cli}/commands/daemon.js +0 -0
- /package/dist/{cli → src/cli}/commands/dashboard.js +0 -0
- /package/dist/{cli → src/cli}/commands/db.js +0 -0
- /package/dist/{cli → src/cli}/commands/decision.js +0 -0
- /package/dist/{cli → src/cli}/commands/discovery.js +0 -0
- /package/dist/{cli → src/cli}/commands/handoff.js +0 -0
- /package/dist/{cli → src/cli}/commands/hooks.js +0 -0
- /package/dist/{cli → src/cli}/commands/linear.js +0 -0
- /package/dist/{cli → src/cli}/commands/log.js +0 -0
- /package/dist/{cli → src/cli}/commands/login.js +0 -0
- /package/dist/{cli → src/cli}/commands/migrate.js +0 -0
- /package/dist/{cli → src/cli}/commands/model.js +0 -0
- /package/dist/{cli → src/cli}/commands/onboard.js +0 -0
- /package/dist/{cli → src/cli}/commands/projects.js +0 -0
- /package/dist/{cli → src/cli}/commands/ralph.js +0 -0
- /package/dist/{cli → src/cli}/commands/retrieval.js +0 -0
- /package/dist/{cli → src/cli}/commands/service.js +0 -0
- /package/dist/{cli → src/cli}/commands/session.js +0 -0
- /package/dist/{cli → src/cli}/commands/settings.js +0 -0
- /package/dist/{cli → src/cli}/commands/setup.js +0 -0
- /package/dist/{cli → src/cli}/commands/shell.js +0 -0
- /package/dist/{cli → src/cli}/commands/signup.js +0 -0
- /package/dist/{cli → src/cli}/commands/skills.js +0 -0
- /package/dist/{cli → src/cli}/commands/sms-notify.js +0 -0
- /package/dist/{cli → src/cli}/commands/storage-tier.js +0 -0
- /package/dist/{cli → src/cli}/commands/sweep.js +0 -0
- /package/dist/{cli → src/cli}/commands/tasks.js +0 -0
- /package/dist/{cli → src/cli}/commands/worktree.js +0 -0
- /package/dist/{cli → src/cli}/opencode-sm.js +0 -0
- /package/dist/{cli → src/cli}/utils/viewer.js +0 -0
- /package/dist/{core → src/core}/config/config-manager.js +0 -0
- /package/dist/{core → src/core}/config/feature-flags.js +0 -0
- /package/dist/{core → src/core}/config/storage-config.js +0 -0
- /package/dist/{core → src/core}/config/types.js +0 -0
- /package/dist/{core → src/core}/context/auto-context.js +0 -0
- /package/dist/{core → src/core}/context/dual-stack-manager.js +0 -0
- /package/dist/{core → src/core}/context/enhanced-rehydration.js +0 -0
- /package/dist/{core → src/core}/context/frame-database.js +0 -0
- /package/dist/{core → src/core}/context/frame-digest.js +0 -0
- /package/dist/{core → src/core}/context/frame-handoff-manager.js +0 -0
- /package/dist/{core → src/core}/context/frame-lifecycle-hooks.js +0 -0
- /package/dist/{core → src/core}/context/frame-recovery.js +0 -0
- /package/dist/{core → src/core}/context/frame-stack.js +0 -0
- /package/dist/{core → src/core}/context/frame-types.js +0 -0
- /package/dist/{core → src/core}/context/frame-types.js.map +0 -0
- /package/dist/{core → src/core}/context/index.js +0 -0
- /package/dist/{core → src/core}/context/permission-manager.js +0 -0
- /package/dist/{core → src/core}/context/recursive-context-manager.js +0 -0
- /package/dist/{core → src/core}/context/refactored-frame-manager.js +0 -0
- /package/dist/{core → src/core}/context/shared-context-layer.js +0 -0
- /package/dist/{core → src/core}/context/stack-merge-resolver.js +0 -0
- /package/dist/{core → src/core}/context/validation.js +0 -0
- /package/dist/{core → src/core}/database/batch-operations.js +0 -0
- /package/dist/{core → src/core}/database/connection-pool.js +0 -0
- /package/dist/{core → src/core}/database/database-adapter.js +0 -0
- /package/dist/{core → src/core}/database/migration-manager.js +0 -0
- /package/dist/{core → src/core}/database/query-cache.js +0 -0
- /package/dist/{core → src/core}/database/query-router.js +0 -0
- /package/dist/{core → src/core}/digest/enhanced-hybrid-digest.js +0 -0
- /package/dist/{core → src/core}/digest/frame-digest-integration.js +0 -0
- /package/dist/{core → src/core}/digest/hybrid-digest-generator.js +0 -0
- /package/dist/{core → src/core}/digest/index.js +0 -0
- /package/dist/{core → src/core}/digest/types.js +0 -0
- /package/dist/{core → src/core}/errors/recovery.js +0 -0
- /package/dist/{core → src/core}/execution/parallel-executor.js +0 -0
- /package/dist/{core/merge → src/core/extensions}/types.js +0 -0
- /package/dist/{core/merge → src/core/extensions}/types.js.map +0 -0
- /package/dist/{core → src/core}/frame/workflow-templates.js +0 -0
- /package/dist/{core → src/core}/merge/conflict-detector.js +0 -0
- /package/dist/{core → src/core}/merge/index.js +0 -0
- /package/dist/{core → src/core}/merge/resolution-engine.js +0 -0
- /package/dist/{core → src/core}/merge/stack-diff.js +0 -0
- /package/dist/{core → src/core/merge}/types.js +0 -0
- /package/dist/{core → src/core/merge}/types.js.map +0 -0
- /package/dist/{core → src/core}/models/fallback-monitor.js +0 -0
- /package/dist/{core → src/core}/models/model-router.js +0 -0
- /package/dist/{core → src/core}/monitoring/error-handler.js +0 -0
- /package/dist/{core → src/core}/monitoring/metrics.js +0 -0
- /package/dist/{core → src/core}/monitoring/progress-tracker.js +0 -0
- /package/dist/{core → src/core}/monitoring/session-monitor.js +0 -0
- /package/dist/{core → src/core}/performance/context-cache.js +0 -0
- /package/dist/{core → src/core}/performance/index.js +0 -0
- /package/dist/{core → src/core}/performance/lazy-context-loader.js +0 -0
- /package/dist/{core → src/core}/performance/monitor.js +0 -0
- /package/dist/{core → src/core}/performance/optimized-frame-context.js +0 -0
- /package/dist/{core → src/core}/performance/performance-benchmark.js +0 -0
- /package/dist/{core → src/core}/performance/performance-profiler.js +0 -0
- /package/dist/{core → src/core}/performance/streaming-jsonl-parser.js +0 -0
- /package/dist/{core → src/core}/persistence/postgres-adapter.js +0 -0
- /package/dist/{core → src/core}/projects/project-isolation.js +0 -0
- /package/dist/{core → src/core}/projects/project-manager.js +0 -0
- /package/dist/{core → src/core}/query/query-parser.js +0 -0
- /package/dist/{core → src/core}/query/query-templates.js +0 -0
- /package/dist/{core → src/core}/retrieval/context-retriever.js +0 -0
- /package/dist/{core → src/core}/retrieval/index.js +0 -0
- /package/dist/{core → src/core}/retrieval/llm-context-retrieval.js +0 -0
- /package/dist/{core → src/core}/retrieval/llm-provider.js +0 -0
- /package/dist/{core → src/core}/retrieval/retrieval-audit.js +0 -0
- /package/dist/{core → src/core}/retrieval/summary-generator.js +0 -0
- /package/dist/{core → src/core}/retrieval/types.js +0 -0
- /package/dist/{core → src/core}/session/clear-survival.js +0 -0
- /package/dist/{core → src/core}/session/enhanced-handoff.js +0 -0
- /package/dist/{core → src/core}/session/handoff-generator.js +0 -0
- /package/dist/{core → src/core}/session/index.js +0 -0
- /package/dist/{core → src/core}/session/session-manager.js +0 -0
- /package/dist/{core → src/core}/skills/index.js +0 -0
- /package/dist/{core → src/core}/skills/skill-storage.js +0 -0
- /package/dist/{core → src/core}/skills/types.js +0 -0
- /package/dist/{core → src/core}/storage/infinite-storage.js +0 -0
- /package/dist/{core → src/core}/storage/remote-storage.js +0 -0
- /package/dist/{core → src/core}/storage/two-tier-storage.js +0 -0
- /package/dist/{core → src/core}/trace/cli-trace-wrapper.js +0 -0
- /package/dist/{core → src/core}/trace/db-trace-wrapper.js +0 -0
- /package/dist/{core → src/core}/trace/debug-trace.js +0 -0
- /package/dist/{core → src/core}/trace/index.js +0 -0
- /package/dist/{core → src/core}/trace/linear-api-wrapper.js +0 -0
- /package/dist/{core → src/core}/trace/trace-detector.js +0 -0
- /package/dist/{core → src/core}/trace/trace-store.js +0 -0
- /package/dist/{core → src/core}/trace/types.js +0 -0
- /package/dist/{integrations/linear → src/core}/types.js +0 -0
- /package/dist/{integrations/linear → src/core}/types.js.map +0 -0
- /package/dist/{core → src/core}/utils/async-mutex.js +0 -0
- /package/dist/{core → src/core}/utils/compression.js +0 -0
- /package/dist/{core → src/core}/utils/update-checker.js +0 -0
- /package/dist/{core → src/core}/worktree/worktree-manager.js +0 -0
- /package/dist/{daemon → src/daemon}/daemon-config.js +0 -0
- /package/dist/{daemon → src/daemon}/services/context-service.js +0 -0
- /package/dist/{daemon → src/daemon}/services/linear-service.js +0 -0
- /package/dist/{daemon → src/daemon}/session-daemon.js +0 -0
- /package/dist/{daemon → src/daemon}/unified-daemon.js +0 -0
- /package/dist/{features → src/features}/analytics/api/analytics-api.js +0 -0
- /package/dist/{features → src/features}/analytics/core/analytics-service.js +0 -0
- /package/dist/{features → src/features}/analytics/index.js +0 -0
- /package/dist/{features → src/features}/analytics/queries/metrics-queries.js +0 -0
- /package/dist/{features → src/features}/analytics/types/metrics.js +0 -0
- /package/dist/{features → src/features}/analytics/types/metrics.js.map +0 -0
- /package/dist/{features → src/features}/browser/browser-mcp.js +0 -0
- /package/dist/{features → src/features}/sweep/index.js +0 -0
- /package/dist/{features → src/features}/sweep/prediction-client.js +0 -0
- /package/dist/{features → src/features}/sweep/prompt-builder.js +0 -0
- /package/dist/{features → src/features}/sweep/pty-wrapper.js +0 -0
- /package/dist/{features → src/features}/sweep/state-watcher.js +0 -0
- /package/dist/{features → src/features}/sweep/status-bar.js +0 -0
- /package/dist/{features → src/features}/sweep/sweep-server-manager.js +0 -0
- /package/dist/{features → src/features}/sweep/tab-interceptor.js +0 -0
- /package/dist/{features → src/features}/sweep/types.js +0 -0
- /package/dist/{features → src/features}/tasks/linear-task-manager.js +0 -0
- /package/dist/{features → src/features}/tasks/task-aware-context.js +0 -0
- /package/dist/{features → src/features}/tui/simple-monitor.js +0 -0
- /package/dist/{features → src/features}/tui/swarm-monitor.js +0 -0
- /package/dist/{features → src/features}/web/client/stores/task-store.js +0 -0
- /package/dist/{features → src/features}/web/server/index.js +0 -0
- /package/dist/{hooks → src/hooks}/auto-background.js +0 -0
- /package/dist/{hooks → src/hooks}/claude-code-whatsapp-hook.js +0 -0
- /package/dist/{hooks → src/hooks}/config.js +0 -0
- /package/dist/{hooks → src/hooks}/daemon.js +0 -0
- /package/dist/{hooks → src/hooks}/events.js +0 -0
- /package/dist/{hooks → src/hooks}/index.js +0 -0
- /package/dist/{hooks → src/hooks}/linear-task-picker.js +0 -0
- /package/dist/{hooks → src/hooks}/schemas.js +0 -0
- /package/dist/{hooks → src/hooks}/secure-fs.js +0 -0
- /package/dist/{hooks → src/hooks}/security-logger.js +0 -0
- /package/dist/{hooks → src/hooks}/session-summary.js +0 -0
- /package/dist/{hooks → src/hooks}/sms-action-runner.js +0 -0
- /package/dist/{hooks → src/hooks}/sms-notify.js +0 -0
- /package/dist/{hooks → src/hooks}/sms-watcher.js +0 -0
- /package/dist/{hooks → src/hooks}/sms-webhook.js +0 -0
- /package/dist/{hooks → src/hooks}/whatsapp-commands.js +0 -0
- /package/dist/{hooks → src/hooks}/whatsapp-scheduler.js +0 -0
- /package/dist/{hooks → src/hooks}/whatsapp-sync.js +0 -0
- /package/dist/{index.js → src/index.js} +0 -0
- /package/dist/{integrations → src/integrations}/anthropic/client.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/agent-bridge.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/enhanced-pre-clear-hooks.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/lifecycle-hooks.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/post-task-hooks.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/subagent-client-stub.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/subagent-client.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/task-coordinator.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/auth.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/auto-sync.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/config.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/migration.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/oauth-server.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/rest-client.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/sync-manager.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/sync-service.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/sync.js +0 -0
- /package/dist/{integrations/ralph → src/integrations/linear}/types.js +0 -0
- /package/dist/{integrations/ralph → src/integrations/linear}/types.js.map +0 -0
- /package/dist/{integrations → src/integrations}/linear/unified-sync.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/webhook-handler.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/webhook-server.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/webhook.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/code-execution-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/context-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/discovery-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/index.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/linear-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/skill-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/task-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/trace-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/index.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/middleware/tool-scoring.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/refactored-server.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/schemas.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/tool-definitions-code.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/tool-definitions.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/bridge/ralph-stackmemory-bridge.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/context/context-budget-manager.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/context/stackmemory-context-loader.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/coordination/enhanced-coordination.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/index.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/learning/pattern-learner.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/lifecycle/iteration-lifecycle.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/monitoring/swarm-dashboard.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/monitoring/swarm-registry.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/orchestration/multi-loop-orchestrator.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/patterns/compounding-engineering-pattern.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/patterns/extended-coherence-sessions.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/patterns/oracle-worker-pattern.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/performance/performance-optimizer.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/recovery/crash-recovery.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/state/state-reconciler.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/swarm/git-workflow-manager.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/swarm/swarm-coordinator.js +0 -0
- /package/dist/{types/task.js.map → src/integrations/ralph/types.js.map} +0 -0
- /package/dist/{integrations → src/integrations}/ralph/visualization/ralph-debugger.js +0 -0
- /package/dist/{mcp → src/mcp}/stackmemory-mcp-server.js +0 -0
- /package/dist/{middleware → src/middleware}/exponential-rate-limiter.js +0 -0
- /package/dist/{models → src/models}/user.model.js +0 -0
- /package/dist/{servers → src/servers}/production/auth-middleware.js +0 -0
- /package/dist/{services → src/services}/config-service.js +0 -0
- /package/dist/{services → src/services}/context-service.js +0 -0
- /package/dist/{skills → src/skills}/api-discovery.js +0 -0
- /package/dist/{skills → src/skills}/api-skill.js +0 -0
- /package/dist/{skills → src/skills}/claude-skills.js +0 -0
- /package/dist/{skills → src/skills}/dashboard-launcher.js +0 -0
- /package/dist/{skills → src/skills}/recursive-agent-orchestrator.js +0 -0
- /package/dist/{skills → src/skills}/unified-rlm-orchestrator.js +0 -0
- /package/dist/{types → src/types}/task.js +0 -0
- /package/dist/{utils → src/utils}/env.js +0 -0
- /package/dist/{utils → src/utils}/formatting.js +0 -0
- /package/dist/{utils → src/utils}/process-cleanup.js +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/core/frame/workflow-templates.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Workflow Templates for StackMemory\n * Inspired by Continuous-Claude's structured approach\n *\n * Each workflow auto-creates child frames for phases\n * and enforces completion gates between transitions\n */\n\nimport { Frame, FrameManager } from '../context/index.js';\n\nexport interface WorkflowPhase {\n name: string;\n requiredOutputs?: string[];\n validationRules?: ((frame: Frame) => boolean)[];\n autoTransition?: boolean;\n}\n\nexport interface WorkflowTemplate {\n name: string;\n description: string;\n phases: WorkflowPhase[];\n metadata?: Record<string, any>;\n}\n\nexport class WorkflowTemplates {\n private frameManager: FrameManager;\n\n constructor(frameManager: FrameManager) {\n this.frameManager = frameManager;\n }\n\n /**\n * TDD Workflow: Red \u2192 Green \u2192 Refactor\n */\n static TDD: WorkflowTemplate = {\n name: 'tdd',\n description: 'Test-Driven Development workflow',\n phases: [\n {\n name: 'write-failing-tests',\n requiredOutputs: ['test_file', 'test_count'],\n validationRules: [(frame) => frame.metadata?.tests_failing === true],\n },\n {\n name: 'implement-minimal',\n requiredOutputs: ['implementation_file'],\n validationRules: [(frame) => frame.metadata?.tests_passing === true],\n },\n {\n name: 'refactor',\n requiredOutputs: ['refactored_files'],\n validationRules: [\n (frame) => frame.metadata?.tests_passing === true,\n (frame) => frame.metadata?.complexity_reduced === true,\n ],\n autoTransition: true,\n },\n ],\n };\n\n /**\n * Feature Development Workflow\n */\n static FEATURE: WorkflowTemplate = {\n name: 'feature',\n description: 'Feature development workflow',\n phases: [\n {\n name: 'research',\n requiredOutputs: ['requirements', 'constraints', 'dependencies'],\n validationRules: [\n (frame) => frame.metadata?.research_complete === true,\n ],\n },\n {\n name: 'design',\n requiredOutputs: ['architecture_decision', 'api_design'],\n validationRules: [(frame) => frame.metadata?.design_reviewed === true],\n },\n {\n name: 'implement',\n requiredOutputs: ['implementation_files', 'tests'],\n validationRules: [\n (frame) => frame.metadata?.tests_passing === true,\n (frame) => frame.metadata?.lint_passing === true,\n ],\n },\n {\n name: 'validate',\n requiredOutputs: ['test_results', 'performance_metrics'],\n validationRules: [\n (frame) => frame.metadata?.validation_complete === true,\n ],\n autoTransition: true,\n },\n ],\n };\n\n /**\n * Bug Fix Workflow\n */\n static BUGFIX: WorkflowTemplate = {\n name: 'bugfix',\n description: 'Bug fixing workflow',\n phases: [\n {\n name: 'reproduce',\n requiredOutputs: ['reproduction_steps', 'failing_test'],\n validationRules: [(frame) => frame.metadata?.bug_reproduced === true],\n },\n {\n name: 'diagnose',\n requiredOutputs: ['root_cause', 'affected_code'],\n validationRules: [(frame) => frame.metadata?.cause_identified === true],\n },\n {\n name: 'fix',\n requiredOutputs: ['fix_commits', 'updated_tests'],\n validationRules: [(frame) => frame.metadata?.fix_applied === true],\n },\n {\n name: 'verify',\n requiredOutputs: ['verification_results', 'regression_tests'],\n validationRules: [\n (frame) => frame.metadata?.bug_fixed === true,\n (frame) => frame.metadata?.no_regressions === true,\n ],\n autoTransition: true,\n },\n ],\n };\n\n /**\n * Refactoring Workflow\n */\n static REFACTOR: WorkflowTemplate = {\n name: 'refactor',\n description: 'Code refactoring workflow',\n phases: [\n {\n name: 'analyze',\n requiredOutputs: [\n 'code_metrics',\n 'smell_detection',\n 'complexity_report',\n ],\n validationRules: [\n (frame) => frame.metadata?.analysis_complete === true,\n ],\n },\n {\n name: 'plan',\n requiredOutputs: ['refactor_plan', 'risk_assessment'],\n validationRules: [(frame) => frame.metadata?.plan_approved === true],\n },\n {\n name: 'refactor',\n requiredOutputs: ['refactored_code', 'preserved_tests'],\n validationRules: [(frame) => frame.metadata?.tests_passing === true],\n },\n {\n name: 'validate',\n requiredOutputs: ['before_after_metrics', 'performance_comparison'],\n validationRules: [\n (frame) => frame.metadata?.metrics_improved === true,\n (frame) => frame.metadata?.behavior_preserved === true,\n ],\n autoTransition: true,\n },\n ],\n };\n\n /**\n * Start a workflow, creating the parent frame and first phase frame\n */\n async startWorkflow(\n template: WorkflowTemplate,\n parentFrameId?: string\n ): Promise<Frame> {\n // Create parent workflow frame\n const workflowFrame = await this.frameManager.push(\n {\n type: 'workflow',\n description: `${template.name} workflow`,\n metadata: {\n workflow: template.name,\n current_phase: 0,\n phases: template.phases.map((p) => p.name),\n started_at: new Date().toISOString(),\n },\n },\n parentFrameId\n );\n\n // Auto-create first phase frame\n await this.startPhase(workflowFrame.id, 0);\n\n return workflowFrame;\n }\n\n /**\n * Transition to next phase if current phase is complete\n */\n async transitionPhase(frameId: string): Promise<boolean> {\n const frame = await this.frameManager.getFrame(frameId);\n if (!frame || frame.type !== 'workflow') return false;\n\n const currentPhase = frame.metadata?.current_phase || 0;\n const template = this.getTemplate(frame.metadata?.workflow);\n if (!template) return false;\n\n // Validate current phase completion\n const phaseFrame = await this.getCurrentPhaseFrame(frameId);\n if (!phaseFrame) return false;\n\n const phase = template.phases[currentPhase];\n const isComplete = await this.validatePhase(phaseFrame, phase);\n\n if (!isComplete) {\n console.log(`Phase ${phase.name} validation failed`);\n return false;\n }\n\n // Close current phase frame\n await this.frameManager.close(phaseFrame.id, {\n completed: true,\n phase: phase.name,\n });\n\n // Check if workflow is complete\n if (currentPhase >= template.phases.length - 1) {\n await this.frameManager.close(frameId, {\n workflow_complete: true,\n completed_at: new Date().toISOString(),\n });\n return true;\n }\n\n // Start next phase\n await this.frameManager.updateMetadata(frameId, {\n current_phase: currentPhase + 1,\n });\n await this.startPhase(frameId, currentPhase + 1);\n\n return true;\n }\n\n /**\n * Start a specific phase within a workflow\n */\n private async startPhase(\n workflowFrameId: string,\n phaseIndex: number\n ): Promise<Frame> {\n const frame = await this.frameManager.getFrame(workflowFrameId);\n const template = this.getTemplate(frame?.metadata?.workflow);\n if (!template || phaseIndex >= template.phases.length) {\n throw new Error('Invalid phase index');\n }\n\n const phase = template.phases[phaseIndex];\n return await this.frameManager.push(\n {\n type: 'phase',\n description: `Phase: ${phase.name}`,\n metadata: {\n phase_name: phase.name,\n phase_index: phaseIndex,\n required_outputs: phase.requiredOutputs,\n started_at: new Date().toISOString(),\n },\n },\n workflowFrameId\n );\n }\n\n /**\n * Validate a phase frame against its requirements\n */\n private async validatePhase(\n frame: Frame,\n phase: WorkflowPhase\n ): Promise<boolean> {\n // Check required outputs\n if (phase.requiredOutputs) {\n for (const output of phase.requiredOutputs) {\n if (!frame.metadata?.[output]) {\n return false;\n }\n }\n }\n\n // Run validation rules\n if (phase.validationRules) {\n for (const rule of phase.validationRules) {\n if (!rule(frame)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Get current phase frame for a workflow\n */\n private async getCurrentPhaseFrame(\n workflowFrameId: string\n ): Promise<Frame | null> {\n const children = await this.frameManager.getChildren(workflowFrameId);\n return (\n children.find((f) => f.type === 'phase' && f.status === 'open') || null\n );\n }\n\n /**\n * Get template by name\n */\n private getTemplate(name?: string): WorkflowTemplate | null {\n if (!name) return null;\n\n const templates: Record<string, WorkflowTemplate> = {\n tdd: WorkflowTemplates.TDD,\n feature: WorkflowTemplates.FEATURE,\n bugfix: WorkflowTemplates.BUGFIX,\n refactor: WorkflowTemplates.REFACTOR,\n };\n\n return templates[name] || null;\n }\n\n /**\n * List available workflow templates\n */\n static listTemplates(): WorkflowTemplate[] {\n return [\n WorkflowTemplates.TDD,\n WorkflowTemplates.FEATURE,\n WorkflowTemplates.BUGFIX,\n WorkflowTemplates.REFACTOR,\n ];\n }\n}\n\n/**\n * Export workflow templates object for CLI commands\n */\nexport const workflowTemplates = {\n tdd: {\n name: 'Test-Driven Development',\n description: 'Write tests first, then implement',\n phases: [\n { name: 'write-failing-tests', description: 'Write tests that fail' },\n { name: 'implement-code', description: 'Make tests pass' },\n { name: 'refactor', description: 'Clean up code' },\n ],\n },\n feature: {\n name: 'Feature Development',\n description: 'Develop a new feature',\n phases: [\n { name: 'design', description: 'Design the feature' },\n { name: 'implement', description: 'Build the feature' },\n { name: 'test', description: 'Test the feature' },\n ],\n },\n bugfix: {\n name: 'Bug Fix',\n description: 'Fix a reported bug',\n phases: [\n { name: 'reproduce', description: 'Reproduce the bug' },\n { name: 'fix', description: 'Fix the bug' },\n { name: 'verify', description: 'Verify the fix' },\n ],\n },\n refactor: {\n name: 'Refactoring',\n description: 'Improve code structure',\n phases: [\n { name: 'analyze', description: 'Analyze current code' },\n { name: 'refactor', description: 'Refactor code' },\n { name: 'test', description: 'Ensure no regressions' },\n ],\n },\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/core/merge/conflict-detector.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Conflict Detection Engine\n * Detects paradoxes in parallel frame timelines\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n MergeConflict,\n FrameStack,\n ParallelSolution,\n DecisionConflict,\n} from './types.js';\nimport { Frame, Event } from '../context/index.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport class ConflictDetector {\n private readonly SIMILARITY_THRESHOLD = 0.8;\n\n /**\n * Detect all types of conflicts between two frame stacks\n */\n detectConflicts(stack1: FrameStack, stack2: FrameStack): MergeConflict[] {\n const conflicts: MergeConflict[] = [];\n\n // Detect parallel solution conflicts\n const parallelConflicts = this.detectParallelSolutions(stack1, stack2);\n conflicts.push(...parallelConflicts);\n\n // Detect conflicting decisions\n const decisionConflicts = this.detectConflictingDecisions(\n stack1.events,\n stack2.events\n );\n conflicts.push(...decisionConflicts);\n\n // Detect structural divergence\n const structuralConflicts = this.detectStructuralDivergence(\n stack1.frames,\n stack2.frames\n );\n conflicts.push(...structuralConflicts);\n\n logger.info(`Detected ${conflicts.length} conflicts between stacks`, {\n stack1Id: stack1.id,\n stack2Id: stack2.id,\n conflictTypes: this.summarizeConflictTypes(conflicts),\n });\n\n return conflicts;\n }\n\n /**\n * Analyze frames to find parallel solutions to the same problem\n */\n analyzeParallelSolutions(frames: Frame[]): ParallelSolution[] {\n const solutions: ParallelSolution[] = [];\n\n // Group frames by similar purpose/name\n const groupedFrames = this.groupSimilarFrames(frames);\n\n for (const group of groupedFrames) {\n if (group.length > 1) {\n // Multiple frames solving similar problems\n group.forEach((frame) => {\n solutions.push({\n frameId: frame.frame_id,\n solution: this.extractSolution(frame),\n approach: this.analyzeApproach(frame),\n author: frame.inputs?.author || 'unknown',\n timestamp: frame.created_at,\n effectiveness: this.calculateEffectiveness(frame),\n });\n });\n }\n }\n\n return solutions;\n }\n\n /**\n * Identify conflicting decisions in event streams\n */\n identifyConflictingDecisions(events: Event[]): DecisionConflict[] {\n const conflicts: DecisionConflict[] = [];\n const decisions = this.extractDecisions(events);\n\n for (let i = 0; i < decisions.length; i++) {\n for (let j = i + 1; j < decisions.length; j++) {\n if (this.decisionsConflict(decisions[i], decisions[j])) {\n conflicts.push({\n decision1: decisions[i].payload?.decision || '',\n decision2: decisions[j].payload?.decision || '',\n impact: this.assessImpact(decisions[i], decisions[j]),\n canCoexist: this.canCoexist(decisions[i], decisions[j]),\n });\n }\n }\n }\n\n return conflicts;\n }\n\n /**\n * Detect parallel solutions between two stacks\n */\n private detectParallelSolutions(\n stack1: FrameStack,\n stack2: FrameStack\n ): MergeConflict[] {\n const conflicts: MergeConflict[] = [];\n\n // Find frames that appear to solve the same problem\n for (const frame1 of stack1.frames) {\n for (const frame2 of stack2.frames) {\n if (\n this.framesAreSimilar(frame1, frame2) &&\n !this.framesAreIdentical(frame1, frame2)\n ) {\n conflicts.push({\n id: uuidv4(),\n type: 'parallel_solution',\n frameId1: frame1.frame_id,\n frameId2: frame2.frame_id,\n severity: this.calculateParallelSeverity(frame1, frame2),\n description: `Parallel solutions detected: \"${frame1.name}\" vs \"${frame2.name}\"`,\n detectedAt: Date.now(),\n conflictingPaths: this.extractPaths(frame1, frame2),\n });\n }\n }\n }\n\n return conflicts;\n }\n\n /**\n * Detect conflicting decisions between event streams\n */\n private detectConflictingDecisions(\n events1: Event[],\n events2: Event[]\n ): MergeConflict[] {\n const conflicts: MergeConflict[] = [];\n const decisions1 = this.extractDecisions(events1);\n const decisions2 = this.extractDecisions(events2);\n\n for (const d1 of decisions1) {\n for (const d2 of decisions2) {\n if (this.decisionsConflict(d1, d2)) {\n conflicts.push({\n id: uuidv4(),\n type: 'conflicting_decision',\n frameId1: d1.frame_id,\n frameId2: d2.frame_id,\n severity: this.assessImpact(d1, d2) as\n | 'low'\n | 'medium'\n | 'high'\n | 'critical',\n description: `Conflicting decisions: \"${d1.payload?.decision}\" vs \"${d2.payload?.decision}\"`,\n detectedAt: Date.now(),\n });\n }\n }\n }\n\n return conflicts;\n }\n\n /**\n * Detect structural divergence in frame hierarchies\n */\n private detectStructuralDivergence(\n frames1: Frame[],\n frames2: Frame[]\n ): MergeConflict[] {\n const conflicts: MergeConflict[] = [];\n\n // Build frame trees\n const tree1 = this.buildFrameTree(frames1);\n const tree2 = this.buildFrameTree(frames2);\n\n // Find divergence points\n const divergences = this.findDivergences(tree1, tree2);\n\n for (const divergence of divergences) {\n conflicts.push({\n id: uuidv4(),\n type: 'structural_divergence',\n frameId1: divergence.node1,\n frameId2: divergence.node2,\n severity: this.calculateDivergenceSeverity(divergence),\n description: `Structural divergence at depth ${divergence.depth}`,\n detectedAt: Date.now(),\n });\n }\n\n return conflicts;\n }\n\n /**\n * Helper: Check if two frames are similar (solving same problem)\n */\n private framesAreSimilar(frame1: Frame, frame2: Frame): boolean {\n // Check name similarity\n const nameSimilarity = this.calculateSimilarity(frame1.name, frame2.name);\n if (nameSimilarity > this.SIMILARITY_THRESHOLD) return true;\n\n // Check type and parent\n if (\n frame1.type === frame2.type &&\n frame1.parent_frame_id === frame2.parent_frame_id\n ) {\n return true;\n }\n\n // Check inputs similarity\n const inputSimilarity = this.compareInputs(frame1.inputs, frame2.inputs);\n return inputSimilarity > this.SIMILARITY_THRESHOLD;\n }\n\n /**\n * Helper: Check if frames are identical\n */\n private framesAreIdentical(frame1: Frame, frame2: Frame): boolean {\n return frame1.frame_id === frame2.frame_id;\n }\n\n /**\n * Helper: Calculate string similarity (Levenshtein-based)\n */\n private calculateSimilarity(str1: string, str2: string): number {\n const maxLen = Math.max(str1.length, str2.length);\n if (maxLen === 0) return 1;\n\n const distance = this.levenshteinDistance(str1, str2);\n return 1 - distance / maxLen;\n }\n\n /**\n * Helper: Levenshtein distance implementation\n */\n private levenshteinDistance(str1: string, str2: string): number {\n const matrix: number[][] = [];\n\n for (let i = 0; i <= str2.length; i++) {\n matrix[i] = [i];\n }\n\n for (let j = 0; j <= str1.length; j++) {\n matrix[0][j] = j;\n }\n\n for (let i = 1; i <= str2.length; i++) {\n for (let j = 1; j <= str1.length; j++) {\n if (str2.charAt(i - 1) === str1.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1,\n matrix[i][j - 1] + 1,\n matrix[i - 1][j] + 1\n );\n }\n }\n }\n\n return matrix[str2.length][str1.length];\n }\n\n /**\n * Helper: Compare frame inputs\n */\n private compareInputs(\n inputs1: Record<string, unknown>,\n inputs2: Record<string, unknown>\n ): number {\n const keys1 = Object.keys(inputs1 || {});\n const keys2 = Object.keys(inputs2 || {});\n const allKeys = new Set([...keys1, ...keys2]);\n\n if (allKeys.size === 0) return 1;\n\n let matches = 0;\n for (const key of allKeys) {\n if (JSON.stringify(inputs1[key]) === JSON.stringify(inputs2[key])) {\n matches++;\n }\n }\n\n return matches / allKeys.size;\n }\n\n /**\n * Helper: Calculate severity for parallel solutions\n */\n private calculateParallelSeverity(\n frame1: Frame,\n frame2: Frame\n ): 'low' | 'medium' | 'high' | 'critical' {\n // Critical if both are completed and have different outputs\n if (frame1.state === 'closed' && frame2.state === 'closed') {\n const outputSimilarity = this.compareInputs(\n frame1.outputs,\n frame2.outputs\n );\n if (outputSimilarity < 0.5) return 'critical';\n if (outputSimilarity < 0.7) return 'high';\n }\n\n // High if different approaches to same parent task\n if (frame1.parent_frame_id === frame2.parent_frame_id) {\n return 'high';\n }\n\n return 'medium';\n }\n\n /**\n * Helper: Extract decision events\n */\n private extractDecisions(events: Event[]): Event[] {\n return events.filter(\n (e) =>\n e.event_type === 'decision' ||\n e.payload?.type === 'decision' ||\n e.payload?.decision !== undefined\n );\n }\n\n /**\n * Helper: Check if two decisions conflict\n */\n private decisionsConflict(d1: Event, d2: Event): boolean {\n // Check if decisions affect same resource/path\n const resource1 = d1.payload?.resource || d1.payload?.path;\n const resource2 = d2.payload?.resource || d2.payload?.path;\n\n if (resource1 && resource2 && resource1 === resource2) {\n // Different decisions on same resource\n return d1.payload?.decision !== d2.payload?.decision;\n }\n\n // Check for logical conflicts\n return this.hasLogicalConflict(d1.payload, d2.payload);\n }\n\n /**\n * Helper: Check for logical conflicts in payloads\n */\n private hasLogicalConflict(payload1: unknown, payload2: unknown): boolean {\n // Architecture decisions\n if (payload1?.architecture && payload2?.architecture) {\n return payload1.architecture !== payload2.architecture;\n }\n\n // Technology choices\n if (payload1?.technology && payload2?.technology) {\n return payload1.technology !== payload2.technology;\n }\n\n return false;\n }\n\n /**\n * Helper: Assess impact of conflicting decisions\n */\n private assessImpact(d1: Event, d2: Event): 'low' | 'medium' | 'high' {\n // High impact for architecture/design decisions\n if (\n d1.payload?.type === 'architecture' ||\n d2.payload?.type === 'architecture'\n ) {\n return 'high';\n }\n\n // Medium for implementation decisions\n if (\n d1.payload?.scope === 'implementation' ||\n d2.payload?.scope === 'implementation'\n ) {\n return 'medium';\n }\n\n return 'low';\n }\n\n /**\n * Helper: Check if decisions can coexist\n */\n private canCoexist(d1: Event, d2: Event): boolean {\n // Different scopes can coexist\n if (d1.payload?.scope !== d2.payload?.scope) {\n return true;\n }\n\n // Non-conflicting resources can coexist\n const resource1 = d1.payload?.resource;\n const resource2 = d2.payload?.resource;\n\n return resource1 !== resource2;\n }\n\n /**\n * Helper: Build frame tree structure\n */\n private buildFrameTree(frames: Frame[]): Map<string, Set<string>> {\n const tree = new Map<string, Set<string>>();\n\n for (const frame of frames) {\n if (frame.parent_frame_id) {\n if (!tree.has(frame.parent_frame_id)) {\n tree.set(frame.parent_frame_id, new Set());\n }\n const parentSet = tree.get(frame.parent_frame_id);\n if (parentSet) {\n parentSet.add(frame.frame_id);\n }\n }\n }\n\n return tree;\n }\n\n /**\n * Helper: Find divergence points in trees\n */\n private findDivergences(\n tree1: Map<string, Set<string>>,\n tree2: Map<string, Set<string>>\n ): Array<{ node1: string; node2: string; depth: number }> {\n const divergences: Array<{ node1: string; node2: string; depth: number }> =\n [];\n\n // Find nodes that exist in both but have different children\n for (const [node, children1] of tree1) {\n if (tree2.has(node)) {\n const children2 = tree2.get(node);\n if (children2 && !this.setsEqual(children1, children2)) {\n divergences.push({\n node1: node,\n node2: node,\n depth: this.calculateDepth(node, tree1),\n });\n }\n }\n }\n\n return divergences;\n }\n\n /**\n * Helper: Check if two sets are equal\n */\n private setsEqual<T>(set1: Set<T>, set2: Set<T>): boolean {\n if (set1.size !== set2.size) return false;\n for (const item of set1) {\n if (!set2.has(item)) return false;\n }\n return true;\n }\n\n /**\n * Helper: Calculate node depth in tree\n */\n private calculateDepth(node: string, tree: Map<string, Set<string>>): number {\n let depth = 0;\n let current = node;\n\n // Find parent of current node\n for (const [parent, children] of tree) {\n if (children.has(current)) {\n depth++;\n current = parent;\n }\n }\n\n return depth;\n }\n\n /**\n * Helper: Calculate divergence severity\n */\n private calculateDivergenceSeverity(divergence: {\n depth: number;\n }): 'low' | 'medium' | 'high' | 'critical' {\n if (divergence.depth === 0) return 'critical'; // Root divergence\n if (divergence.depth === 1) return 'high';\n if (divergence.depth === 2) return 'medium';\n return 'low';\n }\n\n /**\n * Helper: Extract paths from frames\n */\n private extractPaths(frame1: Frame, frame2: Frame): string[] {\n const paths: string[] = [];\n\n if (frame1.inputs?.path) paths.push(frame1.inputs.path);\n if (frame2.inputs?.path) paths.push(frame2.inputs.path);\n if (frame1.outputs?.files) paths.push(...frame1.outputs.files);\n if (frame2.outputs?.files) paths.push(...frame2.outputs.files);\n\n return [...new Set(paths)];\n }\n\n /**\n * Helper: Extract solution from frame\n */\n private extractSolution(frame: Frame): string {\n return (\n frame.outputs?.solution || frame.digest_text || 'No solution description'\n );\n }\n\n /**\n * Helper: Analyze approach taken\n */\n private analyzeApproach(frame: Frame): string {\n if (frame.outputs?.approach) return frame.outputs.approach;\n if (frame.type === 'debug') return 'Debug approach';\n if (frame.type === 'review') return 'Review approach';\n return 'Standard approach';\n }\n\n /**\n * Helper: Calculate solution effectiveness\n */\n private calculateEffectiveness(frame: Frame): number {\n let score = 0.5; // Base score\n\n // Completed frames are more effective\n if (frame.state === 'closed') score += 0.2;\n\n // Frames with outputs are more effective\n if (frame.outputs && Object.keys(frame.outputs).length > 0) score += 0.1;\n\n // Frames with digests are more effective\n if (frame.digest_text) score += 0.1;\n\n // Quick completion is more effective\n if (frame.closed_at && frame.created_at) {\n const duration = frame.closed_at - frame.created_at;\n if (duration < 300000) score += 0.1; // Less than 5 minutes\n }\n\n return Math.min(score, 1);\n }\n\n /**\n * Helper: Group similar frames together\n */\n private groupSimilarFrames(frames: Frame[]): Frame[][] {\n const groups: Frame[][] = [];\n const processed = new Set<string>();\n\n for (const frame of frames) {\n if (processed.has(frame.frame_id)) continue;\n\n const group = [frame];\n processed.add(frame.frame_id);\n\n for (const other of frames) {\n if (\n !processed.has(other.frame_id) &&\n this.framesAreSimilar(frame, other)\n ) {\n group.push(other);\n processed.add(other.frame_id);\n }\n }\n\n groups.push(group);\n }\n\n return groups;\n }\n\n /**\n * Helper: Summarize conflict types\n */\n private summarizeConflictTypes(\n conflicts: MergeConflict[]\n ): Record<string, number> {\n const summary: Record<string, number> = {\n parallel_solution: 0,\n conflicting_decision: 0,\n structural_divergence: 0,\n };\n\n for (const conflict of conflicts) {\n summary[conflict.type]++;\n }\n\n return summary;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/core/merge/index.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Stack Merge Conflict Resolution System\n * STA-101: Export all merge components\n */\n\nexport * from './types.js';\nexport * from './conflict-detector.js';\nexport * from './stack-diff.js';\nexport * from './resolution-engine.js';\n"],
|
|
5
|
-
"mappings": ";;;;AAKA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/core/merge/resolution-engine.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Resolution Engine\n * Implements multiple strategies for resolving merge conflicts\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n MergeConflict,\n ConflictResolution,\n ResolutionStrategy,\n TeamVote,\n FrameStack,\n MergeResult,\n NotificationResult,\n} from './types.js';\nimport { Frame } from '../context/index.js';\nimport { ConflictDetector } from './conflict-detector.js';\nimport { StackDiffVisualizer } from './stack-diff.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport interface ResolutionContext {\n userId: string;\n userRole: 'junior' | 'mid' | 'senior' | 'lead';\n teamVotes?: TeamVote[];\n aiConfidence?: number;\n timeConstraint?: number; // milliseconds\n}\n\nexport class ResolutionEngine {\n private conflictDetector: ConflictDetector;\n private diffVisualizer: StackDiffVisualizer;\n private resolutionHistory: Map<string, ConflictResolution> = new Map();\n\n constructor() {\n this.conflictDetector = new ConflictDetector();\n this.diffVisualizer = new StackDiffVisualizer();\n }\n\n /**\n * Resolve conflicts using the specified strategy\n */\n async resolveConflicts(\n stack1: FrameStack,\n stack2: FrameStack,\n strategy: ResolutionStrategy['type'],\n context: ResolutionContext\n ): Promise<MergeResult> {\n const conflicts = this.conflictDetector.detectConflicts(stack1, stack2);\n\n logger.info(\n `Resolving ${conflicts.length} conflicts using ${strategy} strategy`,\n {\n userId: context.userId,\n userRole: context.userRole,\n }\n );\n\n let resolution: ConflictResolution;\n\n switch (strategy) {\n case 'keep_both':\n resolution = await this.keepBothStrategy(\n conflicts,\n stack1,\n stack2,\n context\n );\n break;\n\n case 'team_vote':\n resolution = await this.teamVoteStrategy(\n conflicts,\n stack1,\n stack2,\n context\n );\n break;\n\n case 'senior_override':\n resolution = await this.seniorOverrideStrategy(\n conflicts,\n stack1,\n stack2,\n context\n );\n break;\n\n case 'ai_suggest':\n resolution = await this.aiSuggestStrategy(\n conflicts,\n stack1,\n stack2,\n context\n );\n break;\n\n case 'hybrid':\n resolution = await this.hybridStrategy(\n conflicts,\n stack1,\n stack2,\n context\n );\n break;\n\n default:\n throw new Error(`Unknown resolution strategy: ${strategy}`);\n }\n\n // Execute the merge based on resolution\n const mergeResult = await this.executeMerge(\n stack1,\n stack2,\n conflicts,\n resolution\n );\n\n // Store resolution in history\n this.storeResolution(mergeResult.mergedFrameId || '', resolution);\n\n return mergeResult;\n }\n\n /**\n * Strategy: Keep Both Solutions\n * Creates a merged frame that includes both approaches\n */\n private async keepBothStrategy(\n conflicts: MergeConflict[],\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): Promise<ConflictResolution> {\n logger.info('Applying keep_both strategy');\n\n const strategy: ResolutionStrategy = {\n type: 'keep_both',\n confidence: 0.8,\n reasoning:\n 'Preserving both solutions to maintain all work and allow future evaluation',\n };\n\n // Mark all conflicts as resolved by keeping both\n for (const conflict of conflicts) {\n conflict.resolution = {\n strategy,\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: 'Both solutions preserved in merged frame',\n };\n }\n\n return {\n strategy,\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: `Kept all ${stack1.frames.length + stack2.frames.length} frames from both stacks`,\n };\n }\n\n /**\n * Strategy: Team Vote\n * Uses democratic voting to choose between options\n */\n private async teamVoteStrategy(\n conflicts: MergeConflict[],\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): Promise<ConflictResolution> {\n logger.info('Applying team_vote strategy');\n\n if (!context.teamVotes || context.teamVotes.length === 0) {\n throw new Error('Team vote strategy requires votes from team members');\n }\n\n // Count votes for each conflict\n const voteResults = this.countVotes(context.teamVotes);\n\n const strategy: ResolutionStrategy = {\n type: 'team_vote',\n confidence: this.calculateVoteConfidence(voteResults),\n reasoning: `Team consensus from ${context.teamVotes.length} votes`,\n votes: context.teamVotes,\n };\n\n // Apply vote results to conflicts\n for (const conflict of conflicts) {\n conflict.resolution = {\n strategy,\n resolvedBy: 'team_consensus',\n resolvedAt: Date.now(),\n notes: `Resolved by ${voteResults.consensus}% consensus`,\n };\n }\n\n return {\n strategy,\n resolvedBy: 'team_consensus',\n resolvedAt: Date.now(),\n notes: `Democratic resolution with ${voteResults.consensus}% agreement`,\n };\n }\n\n /**\n * Strategy: Senior Override\n * Senior developer's choice takes precedence\n */\n private async seniorOverrideStrategy(\n conflicts: MergeConflict[],\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): Promise<ConflictResolution> {\n logger.info('Applying senior_override strategy');\n\n if (context.userRole !== 'senior' && context.userRole !== 'lead') {\n throw new Error('Senior override requires senior or lead role');\n }\n\n // Assume stack1 is the senior's preferred choice\n this.determinePreferredStack(stack1, stack2, context);\n\n const strategy: ResolutionStrategy = {\n type: 'senior_override',\n confidence: 0.95,\n reasoning: `Senior developer (${context.userId}) selected based on experience and architectural knowledge`,\n };\n\n for (const conflict of conflicts) {\n conflict.resolution = {\n strategy,\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: `Overridden by ${context.userRole} authority`,\n };\n }\n\n return {\n strategy,\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: `Senior override applied to all ${conflicts.length} conflicts`,\n };\n }\n\n /**\n * Strategy: AI Suggest\n * Uses AI analysis to recommend best resolution\n */\n private async aiSuggestStrategy(\n conflicts: MergeConflict[],\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): Promise<ConflictResolution> {\n logger.info('Applying ai_suggest strategy');\n\n // Analyze frames for quality and effectiveness\n const analysis = await this.analyzeFrameQuality(stack1, stack2);\n\n const strategy: ResolutionStrategy = {\n type: 'ai_suggest',\n confidence: context.aiConfidence || 0.85,\n reasoning: this.generateAIReasoning(analysis),\n };\n\n // Apply AI recommendations to each conflict\n for (const conflict of conflicts) {\n const recommendation = this.getAIRecommendation(conflict, analysis);\n conflict.resolution = {\n strategy,\n resolvedBy: 'ai_system',\n resolvedAt: Date.now(),\n notes: recommendation,\n };\n }\n\n return {\n strategy,\n resolvedBy: 'ai_system',\n resolvedAt: Date.now(),\n notes: `AI analysis with ${strategy.confidence * 100}% confidence`,\n };\n }\n\n /**\n * Strategy: Hybrid\n * Combines multiple strategies based on conflict type\n */\n private async hybridStrategy(\n conflicts: MergeConflict[],\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): Promise<ConflictResolution> {\n logger.info('Applying hybrid strategy');\n\n const strategy: ResolutionStrategy = {\n type: 'hybrid',\n confidence: 0.9,\n reasoning: 'Using optimal strategy for each conflict type',\n };\n\n // Apply different strategies based on conflict type\n for (const conflict of conflicts) {\n let subStrategy: ResolutionStrategy['type'];\n\n switch (conflict.type) {\n case 'parallel_solution':\n // Keep both for parallel solutions\n subStrategy = 'keep_both';\n break;\n\n case 'conflicting_decision':\n // Use AI for decision conflicts\n subStrategy = 'ai_suggest';\n break;\n\n case 'structural_divergence':\n // Use senior override for structural issues\n subStrategy =\n context.userRole === 'senior' || context.userRole === 'lead'\n ? 'senior_override'\n : 'team_vote';\n break;\n\n default:\n subStrategy = 'ai_suggest';\n }\n\n conflict.resolution = {\n strategy: {\n ...strategy,\n reasoning: `${subStrategy} for ${conflict.type}`,\n },\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: `Hybrid resolution using ${subStrategy}`,\n };\n }\n\n return {\n strategy,\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: `Hybrid strategy optimized for each conflict type`,\n };\n }\n\n /**\n * Execute the merge based on resolution\n */\n private async executeMerge(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[],\n resolution: ConflictResolution\n ): Promise<MergeResult> {\n const mergedFrameId = uuidv4();\n const rollbackPoint = this.createRollbackPoint(stack1, stack2);\n const notifications: NotificationResult[] = [];\n\n try {\n // Create merged frame stack\n const mergedFrames = this.mergeFrames(\n stack1,\n stack2,\n conflicts,\n resolution\n );\n\n // Validate merge integrity\n const isValid = this.validateMerge(mergedFrames, conflicts);\n\n if (!isValid) {\n throw new Error('Merge validation failed');\n }\n\n // Send notifications\n const notifyResults = await this.sendNotifications(conflicts, resolution);\n notifications.push(...notifyResults);\n\n logger.info('Merge executed successfully', {\n mergedFrameId,\n frameCount: mergedFrames.length,\n strategy: resolution.strategy.type,\n });\n\n return {\n success: true,\n mergedFrameId,\n conflicts,\n resolution,\n rollbackPoint,\n notifications,\n };\n } catch (error: unknown) {\n logger.error('Merge execution failed', error as Error);\n\n return {\n success: false,\n conflicts,\n resolution,\n rollbackPoint,\n notifications,\n };\n }\n }\n\n /**\n * Count votes from team members\n */\n private countVotes(votes: TeamVote[]): {\n frame1: number;\n frame2: number;\n both: number;\n neither: number;\n total: number;\n consensus: number;\n } {\n const counts = {\n frame1: 0,\n frame2: 0,\n both: 0,\n neither: 0,\n total: votes.length,\n consensus: 0,\n };\n\n for (const vote of votes) {\n counts[vote.choice]++;\n }\n\n // Calculate consensus percentage\n const maxVotes = Math.max(\n counts.frame1,\n counts.frame2,\n counts.both,\n counts.neither\n );\n counts.consensus = Math.round((maxVotes / counts.total) * 100);\n\n return counts;\n }\n\n /**\n * Calculate confidence based on vote distribution\n */\n private calculateVoteConfidence(voteResults: { consensus: number }): number {\n // High confidence if strong consensus\n if (voteResults.consensus >= 80) return 0.95;\n if (voteResults.consensus >= 60) return 0.75;\n if (voteResults.consensus >= 40) return 0.5;\n return 0.3;\n }\n\n /**\n * Determine winner from vote results\n */\n private determineVoteWinner(\n conflict: MergeConflict,\n voteResults: {\n frame1: number;\n frame2: number;\n both: number;\n neither: number;\n }\n ): string {\n if (voteResults.frame1 > voteResults.frame2) return conflict.frameId1;\n if (voteResults.frame2 > voteResults.frame1) return conflict.frameId2;\n if (voteResults.both > voteResults.neither) return 'both';\n return 'neither';\n }\n\n /**\n * Determine preferred stack for senior override\n */\n private determinePreferredStack(\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): FrameStack {\n // Check if senior owns one of the stacks\n if (stack1.owner === context.userId) return stack1;\n if (stack2.owner === context.userId) return stack2;\n\n // Otherwise, prefer more recent/complete stack\n if (stack1.lastModified > stack2.lastModified) return stack1;\n if (\n stack2.frames.filter((f) => f.state === 'closed').length >\n stack1.frames.filter((f) => f.state === 'closed').length\n ) {\n return stack2;\n }\n\n return stack1;\n }\n\n /**\n * Analyze frame quality for AI suggestions\n */\n private async analyzeFrameQuality(\n stack1: FrameStack,\n stack2: FrameStack\n ): Promise<{\n stack1: { completeness: number; efficiency: number; quality: number };\n stack2: { completeness: number; efficiency: number; quality: number };\n }> {\n const analysis = {\n stack1: {\n completeness: this.calculateCompleteness(stack1),\n efficiency: this.calculateEfficiency(stack1),\n quality: this.calculateQuality(stack1),\n },\n stack2: {\n completeness: this.calculateCompleteness(stack2),\n efficiency: this.calculateEfficiency(stack2),\n quality: this.calculateQuality(stack2),\n },\n };\n\n return analysis;\n }\n\n /**\n * Calculate stack completeness\n */\n private calculateCompleteness(stack: FrameStack): number {\n const closedFrames = stack.frames.filter(\n (f) => f.state === 'closed'\n ).length;\n return closedFrames / stack.frames.length;\n }\n\n /**\n * Calculate stack efficiency\n */\n private calculateEfficiency(stack: FrameStack): number {\n let totalDuration = 0;\n let completedFrames = 0;\n\n for (const frame of stack.frames) {\n if (frame.closed_at && frame.created_at) {\n totalDuration += frame.closed_at - frame.created_at;\n completedFrames++;\n }\n }\n\n if (completedFrames === 0) return 0;\n\n const avgDuration = totalDuration / completedFrames;\n // Normalize: 5 minutes = 1.0, longer = lower score\n return Math.max(0, Math.min(1, 300000 / avgDuration));\n }\n\n /**\n * Calculate stack quality\n */\n private calculateQuality(stack: FrameStack): number {\n let qualityScore = 0;\n\n for (const frame of stack.frames) {\n if (frame.outputs && Object.keys(frame.outputs).length > 0)\n qualityScore += 0.3;\n if (frame.digest_text) qualityScore += 0.3;\n if (frame.state === 'closed') qualityScore += 0.4;\n }\n\n return Math.min(1, qualityScore / stack.frames.length);\n }\n\n /**\n * Generate AI reasoning for resolution\n */\n private generateAIReasoning(analysis: {\n stack1: { completeness: number; efficiency: number; quality: number };\n stack2: { completeness: number; efficiency: number; quality: number };\n }): string {\n const stack1Score =\n analysis.stack1.completeness * 0.3 +\n analysis.stack1.efficiency * 0.3 +\n analysis.stack1.quality * 0.4;\n\n const stack2Score =\n analysis.stack2.completeness * 0.3 +\n analysis.stack2.efficiency * 0.3 +\n analysis.stack2.quality * 0.4;\n\n if (stack1Score > stack2Score) {\n return `Stack 1 shows higher overall quality (${(stack1Score * 100).toFixed(1)}% vs ${(stack2Score * 100).toFixed(1)}%)`;\n } else {\n return `Stack 2 shows higher overall quality (${(stack2Score * 100).toFixed(1)}% vs ${(stack1Score * 100).toFixed(1)}%)`;\n }\n }\n\n /**\n * Get AI recommendation for specific conflict\n */\n private getAIRecommendation(conflict: MergeConflict): string {\n switch (conflict.type) {\n case 'parallel_solution':\n return 'Recommend keeping both solutions for A/B testing';\n\n case 'conflicting_decision':\n return 'Recommend the decision with higher quality score';\n\n case 'structural_divergence':\n return 'Recommend restructuring to accommodate both approaches';\n\n default:\n return 'Recommend manual review for this conflict';\n }\n }\n\n /**\n * Create rollback point before merge\n */\n private createRollbackPoint(\n _stack1: FrameStack,\n _stack2: FrameStack\n ): string {\n const rollbackId = uuidv4();\n\n // Store current state for rollback (would persist in real implementation)\n\n // In real implementation, persist this to database\n logger.info('Created rollback point', { rollbackId });\n\n return rollbackId;\n }\n\n /**\n * Merge frames based on resolution\n */\n private mergeFrames(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[],\n resolution: ConflictResolution\n ): Frame[] {\n const mergedFrames: Frame[] = [];\n const processedIds = new Set<string>();\n\n // Process based on resolution strategy\n switch (resolution.strategy.type) {\n case 'keep_both':\n // Add all frames from both stacks\n mergedFrames.push(...stack1.frames, ...stack2.frames);\n break;\n\n case 'team_vote':\n case 'senior_override':\n case 'ai_suggest':\n // Add frames based on resolution decisions\n for (const frame of stack1.frames) {\n const conflict = conflicts.find((c) => c.frameId1 === frame.frame_id);\n if (!conflict || conflict.resolution?.strategy.type === 'keep_both') {\n mergedFrames.push(frame);\n processedIds.add(frame.frame_id);\n }\n }\n\n for (const frame of stack2.frames) {\n if (!processedIds.has(frame.frame_id)) {\n const conflict = conflicts.find(\n (c) => c.frameId2 === frame.frame_id\n );\n if (\n !conflict ||\n conflict.resolution?.strategy.type === 'keep_both'\n ) {\n mergedFrames.push(frame);\n }\n }\n }\n break;\n\n case 'hybrid':\n // Complex merging based on conflict types\n this.hybridMerge(stack1, stack2, conflicts, mergedFrames);\n break;\n }\n\n return mergedFrames;\n }\n\n /**\n * Hybrid merge implementation\n */\n private hybridMerge(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[],\n mergedFrames: Frame[]\n ): void {\n const conflictMap = new Map<string, MergeConflict>();\n\n for (const conflict of conflicts) {\n conflictMap.set(conflict.frameId1, conflict);\n conflictMap.set(conflict.frameId2, conflict);\n }\n\n // Process each frame based on its conflict type\n for (const frame of [...stack1.frames, ...stack2.frames]) {\n const conflict = conflictMap.get(frame.frame_id);\n\n if (!conflict) {\n // No conflict, add frame\n if (!mergedFrames.find((f) => f.frame_id === frame.frame_id)) {\n mergedFrames.push(frame);\n }\n } else if (conflict.type === 'parallel_solution') {\n // Keep both for parallel solutions\n if (!mergedFrames.find((f) => f.frame_id === frame.frame_id)) {\n mergedFrames.push(frame);\n }\n }\n // Other conflict types handled by resolution\n }\n }\n\n /**\n * Validate merge integrity\n */\n private validateMerge(\n mergedFrames: Frame[],\n conflicts: MergeConflict[]\n ): boolean {\n // Check for duplicate frame IDs\n const ids = new Set<string>();\n for (const frame of mergedFrames) {\n if (ids.has(frame.frame_id)) {\n logger.error('Duplicate frame ID in merge', {\n frameId: frame.frame_id,\n });\n return false;\n }\n ids.add(frame.frame_id);\n }\n\n // Check parent-child relationships\n for (const frame of mergedFrames) {\n if (frame.parent_frame_id) {\n const parent = mergedFrames.find(\n (f) => f.frame_id === frame.parent_frame_id\n );\n if (!parent) {\n logger.warn('Orphaned frame in merge', { frameId: frame.frame_id });\n }\n }\n }\n\n // Check all conflicts have resolutions\n for (const conflict of conflicts) {\n if (!conflict.resolution) {\n logger.error('Unresolved conflict in merge', {\n conflictId: conflict.id,\n });\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Send notifications about merge\n */\n private async sendNotifications(\n conflicts: MergeConflict[],\n resolution: ConflictResolution\n ): Promise<NotificationResult[]> {\n const notifications: NotificationResult[] = [];\n\n // In real implementation, send actual notifications\n // For now, simulate notification sending\n const notification: NotificationResult = {\n userId: resolution.resolvedBy || 'team',\n type: 'in-app',\n sent: true,\n timestamp: Date.now(),\n };\n\n notifications.push(notification);\n\n logger.info('Notifications sent', { count: notifications.length });\n\n return notifications;\n }\n\n /**\n * Store resolution in history\n */\n private storeResolution(\n mergeId: string,\n resolution: ConflictResolution\n ): void {\n this.resolutionHistory.set(mergeId, resolution);\n\n // In real implementation, persist to database\n logger.info('Resolution stored in history', {\n mergeId,\n strategy: resolution.strategy.type,\n });\n }\n\n /**\n * Get resolution history for analysis\n */\n getResolutionHistory(): Map<string, ConflictResolution> {\n return this.resolutionHistory;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/core/merge/stack-diff.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Stack Diff Visualizer\n * Creates visual representations of frame stack divergence\n */\n\nimport {\n StackDiff,\n FrameStack,\n DiffTree,\n DiffNode,\n DiffEdge,\n MergeConflict,\n} from './types.js';\nimport { Frame } from '../context/index.js';\nimport { ConflictDetector } from './conflict-detector.js';\n\nexport interface VisualMarker {\n frameId: string;\n type: 'added' | 'removed' | 'modified' | 'conflict';\n color: string;\n symbol: string;\n description: string;\n}\n\nexport interface PreviewResult {\n mergedFrames: Frame[];\n keptFromStack1: string[];\n keptFromStack2: string[];\n conflicts: MergeConflict[];\n estimatedSuccess: number;\n}\n\nexport class StackDiffVisualizer {\n private conflictDetector: ConflictDetector;\n\n constructor() {\n this.conflictDetector = new ConflictDetector();\n }\n\n /**\n * Visualize divergence between two frame stacks\n */\n visualizeDivergence(\n baseFrame: Frame,\n branch1: FrameStack,\n branch2: FrameStack\n ): DiffTree {\n const nodes: DiffNode[] = [];\n const edges: DiffEdge[] = [];\n\n // Add base node\n nodes.push({\n id: baseFrame.frame_id,\n type: 'common',\n frame: baseFrame,\n position: { x: 0, y: 0 },\n metadata: { label: 'Common Ancestor' },\n });\n\n // Process branch 1\n const branch1Nodes = this.processBranch(\n branch1,\n baseFrame.frame_id,\n -100, // Left side\n 100\n );\n nodes.push(...branch1Nodes.nodes);\n edges.push(...branch1Nodes.edges);\n\n // Process branch 2\n const branch2Nodes = this.processBranch(\n branch2,\n baseFrame.frame_id,\n 100, // Right side\n 100\n );\n nodes.push(...branch2Nodes.nodes);\n edges.push(...branch2Nodes.edges);\n\n // Detect and mark conflicts\n const conflicts = this.conflictDetector.detectConflicts(branch1, branch2);\n this.markConflicts(nodes, edges, conflicts);\n\n return {\n nodes,\n edges,\n layout: 'tree',\n };\n }\n\n /**\n * Render conflict markers for visualization\n */\n renderConflictMarkers(conflicts: MergeConflict[]): VisualMarker[] {\n const markers: VisualMarker[] = [];\n\n for (const conflict of conflicts) {\n markers.push({\n frameId: conflict.frameId1,\n type: 'conflict',\n color: this.getSeverityColor(conflict.severity),\n symbol: this.getConflictSymbol(conflict.type),\n description: conflict.description,\n });\n\n markers.push({\n frameId: conflict.frameId2,\n type: 'conflict',\n color: this.getSeverityColor(conflict.severity),\n symbol: this.getConflictSymbol(conflict.type),\n description: conflict.description,\n });\n }\n\n return markers;\n }\n\n /**\n * Generate a merge preview based on resolution strategy\n */\n generateMergePreview(\n stack1: FrameStack,\n stack2: FrameStack,\n strategy:\n | 'keep_both'\n | 'team_vote'\n | 'senior_override'\n | 'ai_suggest'\n | 'hybrid'\n ): PreviewResult {\n const mergedFrames: Frame[] = [];\n const keptFromStack1: string[] = [];\n const keptFromStack2: string[] = [];\n const conflicts = this.conflictDetector.detectConflicts(stack1, stack2);\n\n switch (strategy) {\n case 'keep_both':\n return this.previewKeepBoth(stack1, stack2, conflicts);\n\n case 'team_vote':\n return this.previewTeamVote(stack1, stack2, conflicts);\n\n case 'senior_override':\n return this.previewSeniorOverride(stack1, stack2, conflicts);\n\n case 'ai_suggest':\n return this.previewAISuggest(stack1, stack2, conflicts);\n\n case 'hybrid':\n return this.previewHybrid(stack1, stack2, conflicts);\n\n default:\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess: 0,\n };\n }\n }\n\n /**\n * Create a stack diff comparison\n */\n createStackDiff(\n baseFrameId: string,\n stack1: FrameStack,\n stack2: FrameStack\n ): StackDiff {\n const conflicts = this.conflictDetector.detectConflicts(stack1, stack2);\n const divergencePoint = this.findDivergencePoint(stack1, stack2);\n const commonAncestor = this.findCommonAncestor(stack1, stack2);\n\n // Find base frame\n const baseFrame =\n stack1.frames.find((f) => f.frame_id === baseFrameId) ||\n stack2.frames.find((f) => f.frame_id === baseFrameId);\n\n const visualRepresentation = baseFrame\n ? this.visualizeDivergence(baseFrame, stack1, stack2)\n : undefined;\n\n return {\n baseFrame: baseFrameId,\n branch1: stack1,\n branch2: stack2,\n divergencePoint,\n conflicts,\n commonAncestor,\n visualRepresentation,\n };\n }\n\n /**\n * Process a branch for visualization\n */\n private processBranch(\n stack: FrameStack,\n parentId: string,\n xOffset: number,\n yStart: number\n ): { nodes: DiffNode[]; edges: DiffEdge[] } {\n const nodes: DiffNode[] = [];\n const edges: DiffEdge[] = [];\n let yPos = yStart;\n\n // Find frames that are children of parent\n const children = stack.frames.filter((f) => f.parent_frame_id === parentId);\n\n for (const frame of children) {\n // Add node\n nodes.push({\n id: frame.frame_id,\n type: xOffset < 0 ? 'branch1' : 'branch2',\n frame,\n position: { x: xOffset, y: yPos },\n metadata: {\n branch: xOffset < 0 ? 'left' : 'right',\n depth: frame.depth,\n },\n });\n\n // Add edge from parent\n edges.push({\n source: parentId,\n target: frame.frame_id,\n type: 'parent',\n weight: 1,\n });\n\n // Process children recursively\n const childResults = this.processBranch(\n stack,\n frame.frame_id,\n xOffset + (xOffset < 0 ? -50 : 50),\n yPos + 100\n );\n\n nodes.push(...childResults.nodes);\n edges.push(...childResults.edges);\n\n yPos += 150;\n }\n\n return { nodes, edges };\n }\n\n /**\n * Mark conflicts in the visualization\n */\n private markConflicts(\n nodes: DiffNode[],\n edges: DiffEdge[],\n conflicts: MergeConflict[]\n ): void {\n for (const conflict of conflicts) {\n // Mark conflicting nodes\n const node1 = nodes.find((n) => n.id === conflict.frameId1);\n const node2 = nodes.find((n) => n.id === conflict.frameId2);\n\n if (node1) {\n node1.type = 'conflict';\n node1.metadata = {\n ...node1.metadata,\n conflictType: conflict.type,\n severity: conflict.severity,\n };\n }\n\n if (node2) {\n node2.type = 'conflict';\n node2.metadata = {\n ...node2.metadata,\n conflictType: conflict.type,\n severity: conflict.severity,\n };\n }\n\n // Add conflict edge\n if (node1 && node2) {\n edges.push({\n source: conflict.frameId1,\n target: conflict.frameId2,\n type: 'conflict',\n weight: this.getSeverityWeight(conflict.severity),\n });\n }\n }\n }\n\n /**\n * Get color for severity level\n */\n private getSeverityColor(severity: string): string {\n switch (severity) {\n case 'critical':\n return '#ff0000';\n case 'high':\n return '#ff6600';\n case 'medium':\n return '#ffaa00';\n case 'low':\n return '#ffdd00';\n default:\n return '#888888';\n }\n }\n\n /**\n * Get symbol for conflict type\n */\n private getConflictSymbol(type: string): string {\n switch (type) {\n case 'parallel_solution':\n return '\u26A1';\n case 'conflicting_decision':\n return '\u26A0\uFE0F';\n case 'structural_divergence':\n return '\uD83D\uDD00';\n default:\n return '\u2753';\n }\n }\n\n /**\n * Get weight for severity level\n */\n private getSeverityWeight(severity: string): number {\n switch (severity) {\n case 'critical':\n return 4;\n case 'high':\n return 3;\n case 'medium':\n return 2;\n case 'low':\n return 1;\n default:\n return 0;\n }\n }\n\n /**\n * Preview keep both strategy\n */\n private previewKeepBoth(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[]\n ): PreviewResult {\n const mergedFrames: Frame[] = [];\n const keptFromStack1: string[] = [];\n const keptFromStack2: string[] = [];\n\n // Keep all frames from both stacks\n for (const frame of stack1.frames) {\n mergedFrames.push(frame);\n keptFromStack1.push(frame.frame_id);\n }\n\n for (const frame of stack2.frames) {\n // Only add if not already present\n if (!mergedFrames.find((f) => f.frame_id === frame.frame_id)) {\n mergedFrames.push(frame);\n keptFromStack2.push(frame.frame_id);\n }\n }\n\n // Success depends on conflict severity\n const criticalConflicts = conflicts.filter(\n (c) => c.severity === 'critical'\n ).length;\n const estimatedSuccess = Math.max(0, 1 - criticalConflicts * 0.2);\n\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess,\n };\n }\n\n /**\n * Preview team vote strategy\n */\n private previewTeamVote(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[]\n ): PreviewResult {\n // Simulate team voting - for preview, assume 50/50 split\n const mergedFrames: Frame[] = [];\n const keptFromStack1: string[] = [];\n const keptFromStack2: string[] = [];\n\n // Add non-conflicting frames from both\n const conflictingFrameIds = new Set<string>();\n for (const conflict of conflicts) {\n conflictingFrameIds.add(conflict.frameId1);\n conflictingFrameIds.add(conflict.frameId2);\n }\n\n for (const frame of stack1.frames) {\n if (!conflictingFrameIds.has(frame.frame_id)) {\n mergedFrames.push(frame);\n keptFromStack1.push(frame.frame_id);\n }\n }\n\n for (const frame of stack2.frames) {\n if (\n !conflictingFrameIds.has(frame.frame_id) &&\n !mergedFrames.find((f) => f.frame_id === frame.frame_id)\n ) {\n mergedFrames.push(frame);\n keptFromStack2.push(frame.frame_id);\n }\n }\n\n // For conflicts, alternate between stacks (simulating vote)\n let useStack1 = true;\n for (const conflict of conflicts) {\n if (useStack1) {\n const frame = stack1.frames.find(\n (f) => f.frame_id === conflict.frameId1\n );\n if (frame) {\n mergedFrames.push(frame);\n keptFromStack1.push(frame.frame_id);\n }\n } else {\n const frame = stack2.frames.find(\n (f) => f.frame_id === conflict.frameId2\n );\n if (frame) {\n mergedFrames.push(frame);\n keptFromStack2.push(frame.frame_id);\n }\n }\n useStack1 = !useStack1;\n }\n\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess: 0.75, // Team consensus usually works well\n };\n }\n\n /**\n * Preview senior override strategy\n */\n private previewSeniorOverride(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[]\n ): PreviewResult {\n // Assume stack1 is senior developer's work\n const mergedFrames = [...stack1.frames];\n const keptFromStack1 = stack1.frames.map((f) => f.frame_id);\n const keptFromStack2: string[] = [];\n\n // Add non-conflicting frames from stack2\n const stack1Ids = new Set(keptFromStack1);\n for (const frame of stack2.frames) {\n const hasConflict = conflicts.some((c) => c.frameId2 === frame.frame_id);\n\n if (!hasConflict && !stack1Ids.has(frame.frame_id)) {\n mergedFrames.push(frame);\n keptFromStack2.push(frame.frame_id);\n }\n }\n\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess: 0.85, // Senior override is usually reliable\n };\n }\n\n /**\n * Preview AI suggest strategy\n */\n private previewAISuggest(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[]\n ): PreviewResult {\n const mergedFrames: Frame[] = [];\n const keptFromStack1: string[] = [];\n const keptFromStack2: string[] = [];\n\n // AI would analyze effectiveness - simulate with heuristics\n for (const conflict of conflicts) {\n const frame1 = stack1.frames.find(\n (f) => f.frame_id === conflict.frameId1\n );\n const frame2 = stack2.frames.find(\n (f) => f.frame_id === conflict.frameId2\n );\n\n if (frame1 && frame2) {\n // Choose based on completion and output quality\n const score1 = this.scoreFrame(frame1);\n const score2 = this.scoreFrame(frame2);\n\n if (score1 >= score2) {\n mergedFrames.push(frame1);\n keptFromStack1.push(frame1.frame_id);\n } else {\n mergedFrames.push(frame2);\n keptFromStack2.push(frame2.frame_id);\n }\n }\n }\n\n // Add non-conflicting frames\n this.addNonConflictingFrames(\n stack1,\n stack2,\n conflicts,\n mergedFrames,\n keptFromStack1,\n keptFromStack2\n );\n\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess: 0.9, // AI suggestions are usually optimal\n };\n }\n\n /**\n * Preview hybrid strategy\n */\n private previewHybrid(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[]\n ): PreviewResult {\n const mergedFrames: Frame[] = [];\n const keptFromStack1: string[] = [];\n const keptFromStack2: string[] = [];\n\n // Hybrid: Use different strategies based on conflict type\n for (const conflict of conflicts) {\n if (conflict.type === 'parallel_solution') {\n // Keep both for parallel solutions\n const frame1 = stack1.frames.find(\n (f) => f.frame_id === conflict.frameId1\n );\n const frame2 = stack2.frames.find(\n (f) => f.frame_id === conflict.frameId2\n );\n\n if (frame1) {\n mergedFrames.push(frame1);\n keptFromStack1.push(frame1.frame_id);\n }\n if (frame2) {\n mergedFrames.push(frame2);\n keptFromStack2.push(frame2.frame_id);\n }\n } else if (conflict.type === 'conflicting_decision') {\n // Use AI for decisions\n const frame1 = stack1.frames.find(\n (f) => f.frame_id === conflict.frameId1\n );\n const frame2 = stack2.frames.find(\n (f) => f.frame_id === conflict.frameId2\n );\n\n if (frame1 && frame2) {\n const score1 = this.scoreFrame(frame1);\n const score2 = this.scoreFrame(frame2);\n\n if (score1 >= score2) {\n mergedFrames.push(frame1);\n keptFromStack1.push(frame1.frame_id);\n } else {\n mergedFrames.push(frame2);\n keptFromStack2.push(frame2.frame_id);\n }\n }\n } else {\n // Use senior override for structural divergence\n const frame1 = stack1.frames.find(\n (f) => f.frame_id === conflict.frameId1\n );\n if (frame1) {\n mergedFrames.push(frame1);\n keptFromStack1.push(frame1.frame_id);\n }\n }\n }\n\n // Add non-conflicting frames\n this.addNonConflictingFrames(\n stack1,\n stack2,\n conflicts,\n mergedFrames,\n keptFromStack1,\n keptFromStack2\n );\n\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess: 0.88, // Hybrid is very effective\n };\n }\n\n /**\n * Score a frame for quality\n */\n private scoreFrame(frame: Frame): number {\n let score = 0;\n\n if (frame.state === 'closed') score += 0.3;\n if (frame.outputs && Object.keys(frame.outputs).length > 0) score += 0.2;\n if (frame.digest_text) score += 0.2;\n if (frame.closed_at && frame.created_at) {\n const duration = frame.closed_at - frame.created_at;\n if (duration < 600000) score += 0.3; // Less than 10 minutes\n }\n\n return score;\n }\n\n /**\n * Add non-conflicting frames to merge\n */\n private addNonConflictingFrames(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[],\n mergedFrames: Frame[],\n keptFromStack1: string[],\n keptFromStack2: string[]\n ): void {\n const conflictingIds = new Set<string>();\n const mergedIds = new Set<string>(mergedFrames.map((f) => f.frame_id));\n\n for (const conflict of conflicts) {\n conflictingIds.add(conflict.frameId1);\n conflictingIds.add(conflict.frameId2);\n }\n\n for (const frame of stack1.frames) {\n if (\n !conflictingIds.has(frame.frame_id) &&\n !mergedIds.has(frame.frame_id)\n ) {\n mergedFrames.push(frame);\n keptFromStack1.push(frame.frame_id);\n mergedIds.add(frame.frame_id);\n }\n }\n\n for (const frame of stack2.frames) {\n if (\n !conflictingIds.has(frame.frame_id) &&\n !mergedIds.has(frame.frame_id)\n ) {\n mergedFrames.push(frame);\n keptFromStack2.push(frame.frame_id);\n mergedIds.add(frame.frame_id);\n }\n }\n }\n\n /**\n * Find divergence point between stacks\n */\n private findDivergencePoint(stack1: FrameStack, stack2: FrameStack): number {\n const events1 = stack1.events.sort((a, b) => a.ts - b.ts);\n const events2 = stack2.events.sort((a, b) => a.ts - b.ts);\n\n for (let i = 0; i < Math.min(events1.length, events2.length); i++) {\n if (events1[i].event_id !== events2[i].event_id) {\n return events1[i].ts;\n }\n }\n\n return Math.min(\n events1[events1.length - 1]?.ts || 0,\n events2[events2.length - 1]?.ts || 0\n );\n }\n\n /**\n * Find common ancestor frame\n */\n private findCommonAncestor(\n stack1: FrameStack,\n stack2: FrameStack\n ): string | undefined {\n const frames1 = new Set(stack1.frames.map((f) => f.frame_id));\n\n // Find the deepest common frame\n let deepestCommon: Frame | undefined;\n let maxDepth = -1;\n\n for (const frame of stack2.frames) {\n if (frames1.has(frame.frame_id) && frame.depth > maxDepth) {\n deepestCommon = frame;\n maxDepth = frame.depth;\n }\n }\n\n return deepestCommon?.frame_id;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/core/models/fallback-monitor.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Fallback Monitor - Watches Claude output for errors and triggers automatic fallback\n * Restarts session with Qwen when Claude fails\n */\n\nimport { spawn, ChildProcess } from 'child_process';\nimport {\n loadModelRouterConfig,\n buildModelEnv,\n type ModelProvider,\n} from './model-router.js';\n\nexport interface FallbackMonitorConfig {\n enabled: boolean;\n maxRestarts: number;\n restartDelayMs: number;\n errorPatterns: RegExp[];\n onFallback?: (provider: ModelProvider, reason: string) => void;\n onRestore?: (provider: ModelProvider) => void;\n}\n\nconst DEFAULT_ERROR_PATTERNS = [\n /rate.?limit/i,\n /429/,\n /too.?many.?requests/i,\n /overloaded/i,\n /capacity/i,\n /temporarily.?unavailable/i,\n /503/,\n /502/,\n /500/,\n /internal.?server.?error/i,\n /timeout/i,\n /ETIMEDOUT/,\n /ESOCKETTIMEDOUT/,\n /ECONNRESET/,\n /ECONNREFUSED/,\n];\n\n/**\n * FallbackMonitor watches a Claude process and restarts with fallback on errors\n */\nexport class FallbackMonitor {\n private config: FallbackMonitorConfig;\n private routerConfig = loadModelRouterConfig();\n private currentProvider: ModelProvider = 'anthropic';\n private restartCount = 0;\n private inFallback = false;\n private errorBuffer = '';\n private lastErrorTime = 0;\n private errorCount = 0;\n\n constructor(config: Partial<FallbackMonitorConfig> = {}) {\n this.config = {\n enabled: true,\n maxRestarts: 3,\n restartDelayMs: 2000,\n errorPatterns: DEFAULT_ERROR_PATTERNS,\n ...config,\n };\n }\n\n /**\n * Check if text contains error patterns that should trigger fallback\n */\n detectError(text: string): { shouldFallback: boolean; reason: string } {\n for (const pattern of this.config.errorPatterns) {\n if (pattern.test(text)) {\n return {\n shouldFallback: true,\n reason: pattern.source,\n };\n }\n }\n return { shouldFallback: false, reason: '' };\n }\n\n /**\n * Get environment variables for fallback provider\n */\n getFallbackEnv(): Record<string, string> {\n const fallbackProvider = this.routerConfig.fallback?.provider || 'qwen';\n const providerConfig = this.routerConfig.providers[fallbackProvider];\n\n if (!providerConfig) {\n console.error(`[fallback] Provider not configured: ${fallbackProvider}`);\n return {};\n }\n\n return buildModelEnv(providerConfig);\n }\n\n /**\n * Check if fallback is available (has API key)\n */\n isFallbackAvailable(): boolean {\n const fallbackProvider = this.routerConfig.fallback?.provider || 'qwen';\n const providerConfig = this.routerConfig.providers[fallbackProvider];\n\n if (!providerConfig) return false;\n\n return !!process.env[providerConfig.apiKeyEnv];\n }\n\n /**\n * Wrap a Claude process with fallback monitoring\n * Returns a function to spawn the process with automatic restart on failure\n */\n wrapProcess(\n command: string,\n args: string[],\n options: { env?: NodeJS.ProcessEnv; cwd?: string } = {}\n ): {\n start: () => ChildProcess;\n stop: () => void;\n isInFallback: () => boolean;\n getCurrentProvider: () => ModelProvider;\n } {\n let currentProcess: ChildProcess | null = null;\n let stopped = false;\n\n const startProcess = (): ChildProcess => {\n const env = { ...process.env, ...options.env };\n\n // Apply fallback env if in fallback mode\n if (this.inFallback) {\n const fallbackEnv = this.getFallbackEnv();\n Object.assign(env, fallbackEnv);\n this.currentProvider = this.routerConfig.fallback?.provider || 'qwen';\n }\n\n // Use 'inherit' for TTY to preserve interactive mode\n // Claude CLI checks stdout TTY to decide interactive vs print mode\n const isTTY = process.stdout.isTTY;\n\n currentProcess = spawn(command, args, {\n stdio: isTTY ? 'inherit' : ['inherit', 'pipe', 'pipe'],\n env,\n cwd: options.cwd,\n });\n\n // Only monitor output in non-TTY mode (fallback detection still works via exit code)\n if (!isTTY) {\n // Monitor stdout\n currentProcess.stdout?.on('data', (data: Buffer) => {\n const text = data.toString();\n process.stdout.write(data);\n this.checkForErrors(text);\n });\n\n // Monitor stderr\n currentProcess.stderr?.on('data', (data: Buffer) => {\n const text = data.toString();\n process.stderr.write(data);\n this.checkForErrors(text);\n });\n }\n\n // Handle exit\n currentProcess.on('exit', (code, _signal) => {\n if (stopped) return;\n\n // Check if we should restart with fallback\n if (code !== 0 && this.shouldRestart()) {\n console.log(\n `\\n[fallback] Process exited with code ${code}, restarting with fallback...`\n );\n this.activateFallback('exit_code');\n setTimeout(() => {\n if (!stopped) {\n startProcess();\n }\n }, this.config.restartDelayMs);\n }\n });\n\n return currentProcess;\n };\n\n return {\n start: startProcess,\n stop: () => {\n stopped = true;\n currentProcess?.kill();\n },\n isInFallback: () => this.inFallback,\n getCurrentProvider: () => this.currentProvider,\n };\n }\n\n /**\n * Check output text for errors and trigger fallback if needed\n */\n private checkForErrors(text: string): void {\n this.errorBuffer += text;\n\n // Keep buffer manageable\n if (this.errorBuffer.length > 10000) {\n this.errorBuffer = this.errorBuffer.slice(-5000);\n }\n\n const { shouldFallback, reason } = this.detectError(text);\n\n if (shouldFallback) {\n const now = Date.now();\n\n // Debounce rapid errors\n if (now - this.lastErrorTime < 1000) {\n this.errorCount++;\n } else {\n this.errorCount = 1;\n }\n this.lastErrorTime = now;\n\n // Trigger fallback after multiple rapid errors\n if (\n this.errorCount >= 2 &&\n !this.inFallback &&\n this.isFallbackAvailable()\n ) {\n console.log(`\\n[fallback] Detected error pattern: ${reason}`);\n this.activateFallback(reason);\n }\n }\n }\n\n /**\n * Activate fallback mode\n */\n private activateFallback(reason: string): void {\n if (this.inFallback) return;\n\n this.inFallback = true;\n this.restartCount++;\n this.currentProvider = this.routerConfig.fallback?.provider || 'qwen';\n\n console.log(\n `[fallback] Switching to ${this.currentProvider} (reason: ${reason})`\n );\n\n if (this.config.onFallback) {\n this.config.onFallback(this.currentProvider, reason);\n }\n }\n\n /**\n * Check if we should restart\n */\n private shouldRestart(): boolean {\n return (\n this.config.enabled &&\n this.restartCount < this.config.maxRestarts &&\n this.isFallbackAvailable()\n );\n }\n\n /**\n * Reset fallback state\n */\n reset(): void {\n this.inFallback = false;\n this.restartCount = 0;\n this.errorCount = 0;\n this.errorBuffer = '';\n this.currentProvider = 'anthropic';\n }\n\n /**\n * Get current status\n */\n getStatus(): {\n inFallback: boolean;\n currentProvider: ModelProvider;\n restartCount: number;\n fallbackAvailable: boolean;\n } {\n return {\n inFallback: this.inFallback,\n currentProvider: this.currentProvider,\n restartCount: this.restartCount,\n fallbackAvailable: this.isFallbackAvailable(),\n };\n }\n}\n\n/**\n * Create a simple fallback-aware spawn function\n */\nexport function spawnWithFallback(\n command: string,\n args: string[],\n options: {\n env?: NodeJS.ProcessEnv;\n cwd?: string;\n onFallback?: (provider: ModelProvider, reason: string) => void;\n } = {}\n): ChildProcess {\n const monitor = new FallbackMonitor({\n onFallback: options.onFallback,\n });\n\n const wrapper = monitor.wrapProcess(command, args, options);\n return wrapper.start();\n}\n\n/**\n * Quick helper to get env vars with fallback pre-configured\n */\nexport function getEnvWithFallback(): Record<string, string> {\n const config = loadModelRouterConfig();\n const env: Record<string, string> = {};\n\n // Set fallback provider info for error recovery\n if (config.fallback?.enabled) {\n const fallbackProvider = config.providers[config.fallback.provider];\n if (fallbackProvider) {\n env['STACKMEMORY_FALLBACK_PROVIDER'] = config.fallback.provider;\n env['STACKMEMORY_FALLBACK_MODEL'] = fallbackProvider.model;\n env['STACKMEMORY_FALLBACK_URL'] = fallbackProvider.baseUrl || '';\n env['STACKMEMORY_FALLBACK_KEY_ENV'] = fallbackProvider.apiKeyEnv;\n }\n }\n\n return env;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/core/models/model-router.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Model Router - Switch between Claude and alternative models\n * Supports routing plan/thinking tasks to specialized models like Qwen3-Max-Thinking\n */\n\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { writeFileSecure, ensureSecureDir } from '../../hooks/secure-fs.js';\nimport {\n ModelRouterConfigSchema,\n parseConfigSafe,\n} from '../../hooks/schemas.js';\n\nexport type ModelProvider =\n | 'anthropic'\n | 'qwen'\n | 'openai'\n | 'ollama'\n | 'custom';\nexport type TaskType = 'default' | 'plan' | 'think' | 'code' | 'review';\n\nexport interface ModelConfig {\n provider: ModelProvider;\n model: string;\n baseUrl?: string;\n apiKeyEnv: string; // Environment variable name for API key\n headers?: Record<string, string>;\n params?: Record<string, unknown>; // Provider-specific params\n}\n\nexport interface ModelRouterConfig {\n enabled: boolean;\n defaultProvider: ModelProvider;\n\n // Route specific task types to different models\n taskRouting: {\n plan?: ModelProvider; // Planning/architecture tasks\n think?: ModelProvider; // Deep thinking/reasoning\n code?: ModelProvider; // Code generation\n review?: ModelProvider; // Code review\n };\n\n // Fallback configuration\n fallback: {\n enabled: boolean;\n provider: ModelProvider; // Fallback provider (default: qwen)\n onRateLimit: boolean; // Fallback on 429 errors\n onError: boolean; // Fallback on 5xx errors\n onTimeout: boolean; // Fallback on timeout\n maxRetries: number; // Retries before fallback\n retryDelayMs: number; // Delay between retries\n };\n\n // Provider configurations\n providers: {\n anthropic?: ModelConfig;\n qwen?: ModelConfig;\n openai?: ModelConfig;\n ollama?: ModelConfig;\n custom?: ModelConfig;\n };\n\n // Thinking mode settings\n thinkingMode: {\n enabled: boolean;\n budget?: number; // Max thinking tokens\n temperature?: number; // Recommended: 0.6 for thinking\n topP?: number; // Recommended: 0.95 for thinking\n };\n}\n\nconst CONFIG_PATH = join(homedir(), '.stackmemory', 'model-router.json');\n\nconst DEFAULT_CONFIG: ModelRouterConfig = {\n enabled: false,\n defaultProvider: 'anthropic',\n taskRouting: {},\n fallback: {\n enabled: true, // Fallback enabled by default\n provider: 'qwen',\n onRateLimit: true,\n onError: true,\n onTimeout: true,\n maxRetries: 2,\n retryDelayMs: 1000,\n },\n providers: {\n anthropic: {\n provider: 'anthropic',\n model: 'claude-sonnet-4-20250514',\n apiKeyEnv: 'ANTHROPIC_API_KEY',\n },\n qwen: {\n provider: 'qwen',\n model: 'qwen3-max-2025-01-23',\n baseUrl: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n apiKeyEnv: 'DASHSCOPE_API_KEY',\n params: {\n enable_thinking: true,\n thinking_budget: 10000,\n },\n },\n },\n thinkingMode: {\n enabled: true,\n budget: 10000,\n temperature: 0.6,\n topP: 0.95,\n },\n};\n\n/**\n * Load model router configuration with Zod validation\n */\nexport function loadModelRouterConfig(): ModelRouterConfig {\n try {\n if (existsSync(CONFIG_PATH)) {\n const data = JSON.parse(readFileSync(CONFIG_PATH, 'utf8'));\n return parseConfigSafe(\n ModelRouterConfigSchema,\n { ...DEFAULT_CONFIG, ...data },\n DEFAULT_CONFIG,\n 'model-router'\n );\n }\n } catch {\n // Use defaults\n }\n return { ...DEFAULT_CONFIG };\n}\n\n/**\n * Save model router configuration\n */\nexport function saveModelRouterConfig(config: ModelRouterConfig): void {\n try {\n ensureSecureDir(join(homedir(), '.stackmemory'));\n writeFileSecure(CONFIG_PATH, JSON.stringify(config, null, 2));\n } catch {\n // Silently fail\n }\n}\n\n/**\n * Get model config for a specific task type\n */\nexport function getModelForTask(taskType: TaskType): ModelConfig | null {\n const config = loadModelRouterConfig();\n\n if (!config.enabled) {\n return null; // Use default Claude\n }\n\n // Check task-specific routing\n const routedProvider =\n config.taskRouting[taskType as keyof typeof config.taskRouting];\n const provider = routedProvider || config.defaultProvider;\n\n return config.providers[provider] || null;\n}\n\n/**\n * Build environment variables for alternative model\n */\nexport function buildModelEnv(\n modelConfig: ModelConfig\n): Record<string, string> {\n const env: Record<string, string> = {};\n\n // Get API key from environment\n const apiKey = process.env[modelConfig.apiKeyEnv];\n if (!apiKey) {\n console.warn(`[model-router] API key not found: ${modelConfig.apiKeyEnv}`);\n return env;\n }\n\n // Set Anthropic-compatible env vars (Claude Code reads these)\n env['ANTHROPIC_MODEL'] = modelConfig.model;\n env['ANTHROPIC_SMALL_FAST_MODEL'] = modelConfig.model;\n env['ANTHROPIC_AUTH_TOKEN'] = apiKey;\n\n if (modelConfig.baseUrl) {\n env['ANTHROPIC_BASE_URL'] = modelConfig.baseUrl;\n }\n\n return env;\n}\n\n/**\n * Detect if current context is a planning task\n */\nexport function isPlanningContext(input: string): boolean {\n const planPatterns = [\n /\\bplan\\b/i,\n /\\barchitect/i,\n /\\bdesign\\b/i,\n /\\bstrateg/i,\n /\\bimplement.*approach/i,\n /\\bhow.*should.*we/i,\n /\\bthink.*through/i,\n /\\breason.*about/i,\n /\\banalyze.*options/i,\n /\\btrade-?offs?/i,\n ];\n\n return planPatterns.some((pattern) => pattern.test(input));\n}\n\n/**\n * Detect if task requires deep thinking\n */\nexport function requiresDeepThinking(input: string): boolean {\n const thinkPatterns = [\n /\\bcomplex/i,\n /\\bdifficult/i,\n /\\btricky/i,\n /\\bcareful/i,\n /\\bstep.*by.*step/i,\n /\\bthink.*hard/i,\n /\\bultrathink/i,\n /\\b--think/i,\n /\\b--think-hard/i,\n ];\n\n return thinkPatterns.some((pattern) => pattern.test(input));\n}\n\n/**\n * Error types that trigger fallback\n */\nexport type FallbackTrigger = 'rate_limit' | 'error' | 'timeout' | 'manual';\n\n/**\n * Model Router class for managing model switching\n */\nexport class ModelRouter {\n private config: ModelRouterConfig;\n private currentProvider: ModelProvider;\n private inFallbackMode: boolean = false;\n private fallbackReason?: FallbackTrigger;\n\n constructor() {\n this.config = loadModelRouterConfig();\n this.currentProvider = this.config.defaultProvider;\n }\n\n /**\n * Route a task to the appropriate model\n */\n route(\n taskType: TaskType,\n input?: string\n ): {\n provider: ModelProvider;\n env: Record<string, string>;\n switched: boolean;\n } {\n if (!this.config.enabled) {\n return { provider: 'anthropic', env: {}, switched: false };\n }\n\n // Auto-detect task type if input provided\n let detectedType = taskType;\n if (input && taskType === 'default') {\n if (isPlanningContext(input)) {\n detectedType = 'plan';\n } else if (requiresDeepThinking(input)) {\n detectedType = 'think';\n }\n }\n\n const modelConfig = getModelForTask(detectedType);\n if (!modelConfig) {\n return { provider: 'anthropic', env: {}, switched: false };\n }\n\n const switched = modelConfig.provider !== this.currentProvider;\n this.currentProvider = modelConfig.provider;\n\n return {\n provider: modelConfig.provider,\n env: buildModelEnv(modelConfig),\n switched,\n };\n }\n\n /**\n * Get current provider\n */\n getCurrentProvider(): ModelProvider {\n return this.currentProvider;\n }\n\n /**\n * Force switch to a specific provider\n */\n switchTo(provider: ModelProvider): Record<string, string> {\n const modelConfig = this.config.providers[provider];\n if (!modelConfig) {\n console.warn(`[model-router] Provider not configured: ${provider}`);\n return {};\n }\n\n this.currentProvider = provider;\n return buildModelEnv(modelConfig);\n }\n\n /**\n * Reset to default provider\n */\n reset(): void {\n this.currentProvider = this.config.defaultProvider;\n this.inFallbackMode = false;\n this.fallbackReason = undefined;\n }\n\n /**\n * Check if fallback is enabled and configured\n */\n isFallbackEnabled(): boolean {\n if (!this.config.fallback?.enabled) return false;\n\n const fallbackProvider =\n this.config.providers[this.config.fallback.provider];\n if (!fallbackProvider) return false;\n\n // Check if fallback provider has API key\n const apiKey = process.env[fallbackProvider.apiKeyEnv];\n return !!apiKey;\n }\n\n /**\n * Check if error should trigger fallback\n */\n shouldFallback(error: {\n status?: number;\n code?: string;\n message?: string;\n }): boolean {\n if (!this.isFallbackEnabled()) return false;\n if (this.inFallbackMode) return false; // Already in fallback\n\n const fallback = this.config.fallback;\n\n // Rate limit (429)\n if (fallback.onRateLimit && error.status === 429) {\n return true;\n }\n\n // Server errors (5xx)\n if (fallback.onError && error.status && error.status >= 500) {\n return true;\n }\n\n // Timeout\n if (fallback.onTimeout) {\n const isTimeout =\n error.code === 'ETIMEDOUT' ||\n error.code === 'ESOCKETTIMEDOUT' ||\n error.message?.toLowerCase().includes('timeout');\n if (isTimeout) return true;\n }\n\n // Overloaded\n if (error.message?.toLowerCase().includes('overloaded')) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Activate fallback mode\n */\n activateFallback(reason: FallbackTrigger): Record<string, string> {\n if (!this.isFallbackEnabled()) {\n console.warn('[model-router] Fallback not available');\n return {};\n }\n\n const fallbackProvider = this.config.fallback.provider;\n const modelConfig = this.config.providers[fallbackProvider];\n\n if (!modelConfig) {\n console.warn(\n `[model-router] Fallback provider not configured: ${fallbackProvider}`\n );\n return {};\n }\n\n this.inFallbackMode = true;\n this.fallbackReason = reason;\n this.currentProvider = fallbackProvider;\n\n console.log(\n `[model-router] Fallback activated: ${reason} -> ${fallbackProvider}`\n );\n\n return buildModelEnv(modelConfig);\n }\n\n /**\n * Get fallback configuration\n */\n getFallbackConfig(): ModelRouterConfig['fallback'] {\n return this.config.fallback;\n }\n\n /**\n * Check if currently in fallback mode\n */\n isInFallbackMode(): boolean {\n return this.inFallbackMode;\n }\n\n /**\n * Get reason for fallback\n */\n getFallbackReason(): FallbackTrigger | undefined {\n return this.fallbackReason;\n }\n\n /**\n * Get fallback environment variables (for pre-configuring)\n */\n getFallbackEnv(): Record<string, string> {\n if (!this.isFallbackEnabled()) return {};\n\n const fallbackProvider = this.config.fallback.provider;\n const modelConfig = this.config.providers[fallbackProvider];\n\n if (!modelConfig) return {};\n\n return buildModelEnv(modelConfig);\n }\n}\n\n// Singleton instance\nlet routerInstance: ModelRouter | null = null;\n\nexport function getModelRouter(): ModelRouter {\n if (!routerInstance) {\n routerInstance = new ModelRouter();\n }\n return routerInstance;\n}\n\n/**\n * Quick helper to get env vars for plan mode\n */\nexport function getPlanModeEnv(): Record<string, string> {\n const router = getModelRouter();\n const result = router.route('plan');\n return result.env;\n}\n\n/**\n * Quick helper to get env vars for thinking mode\n */\nexport function getThinkingModeEnv(): Record<string, string> {\n const router = getModelRouter();\n const result = router.route('think');\n return result.env;\n}\n\n/**\n * Check if fallback is available\n */\nexport function isFallbackAvailable(): boolean {\n const router = getModelRouter();\n return router.isFallbackEnabled();\n}\n\n/**\n * Get fallback status for display\n */\nexport function getFallbackStatus(): {\n enabled: boolean;\n provider: ModelProvider | null;\n hasApiKey: boolean;\n inFallback: boolean;\n reason?: FallbackTrigger;\n} {\n const router = getModelRouter();\n const config = loadModelRouterConfig();\n\n if (!config.fallback?.enabled) {\n return {\n enabled: false,\n provider: null,\n hasApiKey: false,\n inFallback: false,\n };\n }\n\n const fallbackProvider = config.providers[config.fallback.provider];\n const hasApiKey = fallbackProvider\n ? !!process.env[fallbackProvider.apiKeyEnv]\n : false;\n\n return {\n enabled: true,\n provider: config.fallback.provider,\n hasApiKey,\n inFallback: router.isInFallbackMode(),\n reason: router.getFallbackReason(),\n };\n}\n\n/**\n * Trigger fallback manually (for testing or forced switch)\n */\nexport function triggerFallback(\n reason: FallbackTrigger = 'manual'\n): Record<string, string> {\n const router = getModelRouter();\n return router.activateFallback(reason);\n}\n\n/**\n * Reset fallback state\n */\nexport function resetFallback(): void {\n const router = getModelRouter();\n router.reset();\n}\n"],
|
|
5
|
-
"mappings": ";;;;AAKA,SAAS,YAAY,oBAAoB;AACzC,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,iBAAiB,uBAAuB;AACjD;AAAA,EACE;AAAA,EACA;AAAA,OACK;AA4DP,MAAM,cAAc,KAAK,QAAQ,GAAG,gBAAgB,mBAAmB;AAEvE,MAAM,iBAAoC;AAAA,EACxC,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,aAAa,CAAC;AAAA,EACd,UAAU;AAAA,IACR,SAAS;AAAA;AAAA,IACT,UAAU;AAAA,IACV,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB;AAAA,EACA,WAAW;AAAA,IACT,WAAW;AAAA,MACT,UAAU;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,IACA,MAAM;AAAA,MACJ,UAAU;AAAA,MACV,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAW;AAAA,MACX,QAAQ;AAAA,QACN,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AACF;AAKO,SAAS,wBAA2C;AACzD,MAAI;AACF,QAAI,WAAW,WAAW,GAAG;AAC3B,YAAM,OAAO,KAAK,MAAM,aAAa,aAAa,MAAM,CAAC;AACzD,aAAO;AAAA,QACL;AAAA,QACA,EAAE,GAAG,gBAAgB,GAAG,KAAK;AAAA,QAC7B;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO,EAAE,GAAG,eAAe;AAC7B;AAKO,SAAS,sBAAsB,QAAiC;AACrE,MAAI;AACF,oBAAgB,KAAK,QAAQ,GAAG,cAAc,CAAC;AAC/C,oBAAgB,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC9D,QAAQ;AAAA,EAER;AACF;AAKO,SAAS,gBAAgB,UAAwC;AACtE,QAAM,SAAS,sBAAsB;AAErC,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,EACT;AAGA,QAAM,iBACJ,OAAO,YAAY,QAA2C;AAChE,QAAM,WAAW,kBAAkB,OAAO;AAE1C,SAAO,OAAO,UAAU,QAAQ,KAAK;AACvC;AAKO,SAAS,cACd,aACwB;AACxB,QAAM,MAA8B,CAAC;AAGrC,QAAM,SAAS,QAAQ,IAAI,YAAY,SAAS;AAChD,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,qCAAqC,YAAY,SAAS,EAAE;AACzE,WAAO;AAAA,EACT;AAGA,MAAI,iBAAiB,IAAI,YAAY;AACrC,MAAI,4BAA4B,IAAI,YAAY;AAChD,MAAI,sBAAsB,IAAI;AAE9B,MAAI,YAAY,SAAS;AACvB,QAAI,oBAAoB,IAAI,YAAY;AAAA,EAC1C;AAEA,SAAO;AACT;AAKO,SAAS,kBAAkB,OAAwB;AACxD,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,aAAa,KAAK,CAAC,YAAY,QAAQ,KAAK,KAAK,CAAC;AAC3D;AAKO,SAAS,qBAAqB,OAAwB;AAC3D,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,cAAc,KAAK,CAAC,YAAY,QAAQ,KAAK,KAAK,CAAC;AAC5D;AAUO,MAAM,YAAY;AAAA,EACf;AAAA,EACA;AAAA,EACA,iBAA0B;AAAA,EAC1B;AAAA,EAER,cAAc;AACZ,SAAK,SAAS,sBAAsB;AACpC,SAAK,kBAAkB,KAAK,OAAO;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MACE,UACA,OAKA;AACA,QAAI,CAAC,KAAK,OAAO,SAAS;AACxB,aAAO,EAAE,UAAU,aAAa,KAAK,CAAC,GAAG,UAAU,MAAM;AAAA,IAC3D;AAGA,QAAI,eAAe;AACnB,QAAI,SAAS,aAAa,WAAW;AACnC,UAAI,kBAAkB,KAAK,GAAG;AAC5B,uBAAe;AAAA,MACjB,WAAW,qBAAqB,KAAK,GAAG;AACtC,uBAAe;AAAA,MACjB;AAAA,IACF;AAEA,UAAM,cAAc,gBAAgB,YAAY;AAChD,QAAI,CAAC,aAAa;AAChB,aAAO,EAAE,UAAU,aAAa,KAAK,CAAC,GAAG,UAAU,MAAM;AAAA,IAC3D;AAEA,UAAM,WAAW,YAAY,aAAa,KAAK;AAC/C,SAAK,kBAAkB,YAAY;AAEnC,WAAO;AAAA,MACL,UAAU,YAAY;AAAA,MACtB,KAAK,cAAc,WAAW;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAoC;AAClC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,UAAiD;AACxD,UAAM,cAAc,KAAK,OAAO,UAAU,QAAQ;AAClD,QAAI,CAAC,aAAa;AAChB,cAAQ,KAAK,2CAA2C,QAAQ,EAAE;AAClE,aAAO,CAAC;AAAA,IACV;AAEA,SAAK,kBAAkB;AACvB,WAAO,cAAc,WAAW;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,kBAAkB,KAAK,OAAO;AACnC,SAAK,iBAAiB;AACtB,SAAK,iBAAiB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,oBAA6B;AAC3B,QAAI,CAAC,KAAK,OAAO,UAAU,QAAS,QAAO;AAE3C,UAAM,mBACJ,KAAK,OAAO,UAAU,KAAK,OAAO,SAAS,QAAQ;AACrD,QAAI,CAAC,iBAAkB,QAAO;AAG9B,UAAM,SAAS,QAAQ,IAAI,iBAAiB,SAAS;AACrD,WAAO,CAAC,CAAC;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,OAIH;AACV,QAAI,CAAC,KAAK,kBAAkB,EAAG,QAAO;AACtC,QAAI,KAAK,eAAgB,QAAO;AAEhC,UAAM,WAAW,KAAK,OAAO;AAG7B,QAAI,SAAS,eAAe,MAAM,WAAW,KAAK;AAChD,aAAO;AAAA,IACT;AAGA,QAAI,SAAS,WAAW,MAAM,UAAU,MAAM,UAAU,KAAK;AAC3D,aAAO;AAAA,IACT;AAGA,QAAI,SAAS,WAAW;AACtB,YAAM,YACJ,MAAM,SAAS,eACf,MAAM,SAAS,qBACf,MAAM,SAAS,YAAY,EAAE,SAAS,SAAS;AACjD,UAAI,UAAW,QAAO;AAAA,IACxB;AAGA,QAAI,MAAM,SAAS,YAAY,EAAE,SAAS,YAAY,GAAG;AACvD,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,QAAiD;AAChE,QAAI,CAAC,KAAK,kBAAkB,GAAG;AAC7B,cAAQ,KAAK,uCAAuC;AACpD,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,mBAAmB,KAAK,OAAO,SAAS;AAC9C,UAAM,cAAc,KAAK,OAAO,UAAU,gBAAgB;AAE1D,QAAI,CAAC,aAAa;AAChB,cAAQ;AAAA,QACN,oDAAoD,gBAAgB;AAAA,MACtE;AACA,aAAO,CAAC;AAAA,IACV;AAEA,SAAK,iBAAiB;AACtB,SAAK,iBAAiB;AACtB,SAAK,kBAAkB;AAEvB,YAAQ;AAAA,MACN,sCAAsC,MAAM,OAAO,gBAAgB;AAAA,IACrE;AAEA,WAAO,cAAc,WAAW;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAmD;AACjD,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA4B;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAiD;AAC/C,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAyC;AACvC,QAAI,CAAC,KAAK,kBAAkB,EAAG,QAAO,CAAC;AAEvC,UAAM,mBAAmB,KAAK,OAAO,SAAS;AAC9C,UAAM,cAAc,KAAK,OAAO,UAAU,gBAAgB;AAE1D,QAAI,CAAC,YAAa,QAAO,CAAC;AAE1B,WAAO,cAAc,WAAW;AAAA,EAClC;AACF;AAGA,IAAI,iBAAqC;AAElC,SAAS,iBAA8B;AAC5C,MAAI,CAAC,gBAAgB;AACnB,qBAAiB,IAAI,YAAY;AAAA,EACnC;AACA,SAAO;AACT;AAKO,SAAS,iBAAyC;AACvD,QAAM,SAAS,eAAe;AAC9B,QAAM,SAAS,OAAO,MAAM,MAAM;AAClC,SAAO,OAAO;AAChB;AAKO,SAAS,qBAA6C;AAC3D,QAAM,SAAS,eAAe;AAC9B,QAAM,SAAS,OAAO,MAAM,OAAO;AACnC,SAAO,OAAO;AAChB;AAKO,SAAS,sBAA+B;AAC7C,QAAM,SAAS,eAAe;AAC9B,SAAO,OAAO,kBAAkB;AAClC;AAKO,SAAS,oBAMd;AACA,QAAM,SAAS,eAAe;AAC9B,QAAM,SAAS,sBAAsB;AAErC,MAAI,CAAC,OAAO,UAAU,SAAS;AAC7B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,WAAW;AAAA,MACX,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,mBAAmB,OAAO,UAAU,OAAO,SAAS,QAAQ;AAClE,QAAM,YAAY,mBACd,CAAC,CAAC,QAAQ,IAAI,iBAAiB,SAAS,IACxC;AAEJ,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,OAAO,SAAS;AAAA,IAC1B;AAAA,IACA,YAAY,OAAO,iBAAiB;AAAA,IACpC,QAAQ,OAAO,kBAAkB;AAAA,EACnC;AACF;AAKO,SAAS,gBACd,SAA0B,UACF;AACxB,QAAM,SAAS,eAAe;AAC9B,SAAO,OAAO,iBAAiB,MAAM;AACvC;AAKO,SAAS,gBAAsB;AACpC,QAAM,SAAS,eAAe;AAC9B,SAAO,MAAM;AACf;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/core/monitoring/error-handler.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Error handling re-exports for backwards compatibility\n *\n * All error handling is now consolidated in src/core/errors/index.ts\n * This module re-exports for code that imports from monitoring/error-handler\n */\n\nexport {\n // Error codes\n ErrorCode,\n\n // Error classes\n StackMemoryError,\n DatabaseError,\n FrameError,\n TaskError,\n IntegrationError,\n MCPError,\n ValidationError,\n ProjectError,\n SystemError,\n\n // Error handler\n ErrorHandler,\n\n // Utilities\n getUserFriendlyMessage,\n isRetryableError,\n getErrorMessage,\n wrapError,\n isStackMemoryError,\n createErrorHandler,\n\n // Validators\n validateInput,\n validateEmail,\n validatePath,\n\n // Types\n type ErrorContext,\n type StackMemoryErrorOptions,\n} from '../errors/index.js';\n"],
|
|
5
|
-
"mappings": ";;;;AAOA;AAAA,EAEE;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
-
import { dirname as __pathDirname } from 'path';
|
|
3
|
-
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
-
const __dirname = __pathDirname(__filename);
|
|
5
|
-
import * as fs from "fs";
|
|
6
|
-
import * as path from "path";
|
|
7
|
-
function getEnv(key, defaultValue) {
|
|
8
|
-
const value = process.env[key];
|
|
9
|
-
if (value === void 0) {
|
|
10
|
-
if (defaultValue !== void 0) return defaultValue;
|
|
11
|
-
throw new Error(`Environment variable ${key} is required`);
|
|
12
|
-
}
|
|
13
|
-
return value;
|
|
14
|
-
}
|
|
15
|
-
function getOptionalEnv(key) {
|
|
16
|
-
return process.env[key];
|
|
17
|
-
}
|
|
18
|
-
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
19
|
-
LogLevel2[LogLevel2["ERROR"] = 0] = "ERROR";
|
|
20
|
-
LogLevel2[LogLevel2["WARN"] = 1] = "WARN";
|
|
21
|
-
LogLevel2[LogLevel2["INFO"] = 2] = "INFO";
|
|
22
|
-
LogLevel2[LogLevel2["DEBUG"] = 3] = "DEBUG";
|
|
23
|
-
return LogLevel2;
|
|
24
|
-
})(LogLevel || {});
|
|
25
|
-
class Logger {
|
|
26
|
-
static instance;
|
|
27
|
-
logLevel = 2 /* INFO */;
|
|
28
|
-
logFile;
|
|
29
|
-
fileLoggingDisabledNotified = false;
|
|
30
|
-
constructor() {
|
|
31
|
-
const envLevel = process.env["STACKMEMORY_LOG_LEVEL"]?.toUpperCase();
|
|
32
|
-
switch (envLevel) {
|
|
33
|
-
case "ERROR":
|
|
34
|
-
this.logLevel = 0 /* ERROR */;
|
|
35
|
-
break;
|
|
36
|
-
case "WARN":
|
|
37
|
-
this.logLevel = 1 /* WARN */;
|
|
38
|
-
break;
|
|
39
|
-
case "DEBUG":
|
|
40
|
-
this.logLevel = 3 /* DEBUG */;
|
|
41
|
-
break;
|
|
42
|
-
default:
|
|
43
|
-
this.logLevel = 2 /* INFO */;
|
|
44
|
-
}
|
|
45
|
-
if (this.logLevel === 3 /* DEBUG */ || process.env["STACKMEMORY_LOG_FILE"]) {
|
|
46
|
-
this.logFile = process.env["STACKMEMORY_LOG_FILE"] || path.join(
|
|
47
|
-
process.env["HOME"] || ".",
|
|
48
|
-
".stackmemory",
|
|
49
|
-
"logs",
|
|
50
|
-
"cli.log"
|
|
51
|
-
);
|
|
52
|
-
this.ensureLogDirectory();
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
static getInstance() {
|
|
56
|
-
if (!Logger.instance) {
|
|
57
|
-
Logger.instance = new Logger();
|
|
58
|
-
}
|
|
59
|
-
return Logger.instance;
|
|
60
|
-
}
|
|
61
|
-
ensureLogDirectory() {
|
|
62
|
-
if (!this.logFile) return;
|
|
63
|
-
const logDir = path.dirname(this.logFile);
|
|
64
|
-
try {
|
|
65
|
-
if (!fs.existsSync(logDir)) {
|
|
66
|
-
fs.mkdirSync(logDir, { recursive: true });
|
|
67
|
-
}
|
|
68
|
-
} catch (err) {
|
|
69
|
-
this.logFile = void 0;
|
|
70
|
-
if (!this.fileLoggingDisabledNotified) {
|
|
71
|
-
this.fileLoggingDisabledNotified = true;
|
|
72
|
-
const msg = "[Logger] File logging disabled (failed to create log directory). Falling back to console only.";
|
|
73
|
-
console.warn(msg);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
writeLog(entry) {
|
|
78
|
-
const logLine = JSON.stringify(entry) + "\n";
|
|
79
|
-
if (this.logFile) {
|
|
80
|
-
try {
|
|
81
|
-
fs.appendFileSync(this.logFile, logLine);
|
|
82
|
-
} catch (err) {
|
|
83
|
-
this.logFile = void 0;
|
|
84
|
-
if (!this.fileLoggingDisabledNotified) {
|
|
85
|
-
this.fileLoggingDisabledNotified = true;
|
|
86
|
-
const msg = "[Logger] File logging disabled (write failed). Falling back to console only.";
|
|
87
|
-
console.warn(msg);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
if (entry.level <= this.logLevel) {
|
|
92
|
-
const levelNames = ["ERROR", "WARN", "INFO", "DEBUG"];
|
|
93
|
-
const levelName = levelNames[entry.level] || "UNKNOWN";
|
|
94
|
-
const consoleMessage = `[${entry.timestamp}] ${levelName}: ${entry.message}`;
|
|
95
|
-
if (entry.level === 0 /* ERROR */) {
|
|
96
|
-
console.error(consoleMessage);
|
|
97
|
-
if (entry.error) {
|
|
98
|
-
console.error(entry.error.stack);
|
|
99
|
-
}
|
|
100
|
-
} else if (entry.level === 1 /* WARN */) {
|
|
101
|
-
console.warn(consoleMessage);
|
|
102
|
-
} else {
|
|
103
|
-
console.log(consoleMessage);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
error(message, errorOrContext, context) {
|
|
108
|
-
const isError = errorOrContext instanceof Error;
|
|
109
|
-
this.writeLog({
|
|
110
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
111
|
-
level: 0 /* ERROR */,
|
|
112
|
-
message,
|
|
113
|
-
context: isError ? context : errorOrContext,
|
|
114
|
-
error: isError ? errorOrContext : void 0
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
warn(message, errorOrContext) {
|
|
118
|
-
const isError = errorOrContext instanceof Error;
|
|
119
|
-
this.writeLog({
|
|
120
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
121
|
-
level: 1 /* WARN */,
|
|
122
|
-
message,
|
|
123
|
-
context: isError ? void 0 : errorOrContext,
|
|
124
|
-
error: isError ? errorOrContext : void 0
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
info(message, context) {
|
|
128
|
-
this.writeLog({
|
|
129
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
130
|
-
level: 2 /* INFO */,
|
|
131
|
-
message,
|
|
132
|
-
context
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
debug(message, context) {
|
|
136
|
-
this.writeLog({
|
|
137
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
138
|
-
level: 3 /* DEBUG */,
|
|
139
|
-
message,
|
|
140
|
-
context
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
const logger = Logger.getInstance();
|
|
145
|
-
export {
|
|
146
|
-
LogLevel,
|
|
147
|
-
Logger,
|
|
148
|
-
logger
|
|
149
|
-
};
|
|
150
|
-
//# sourceMappingURL=logger.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 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// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\nexport enum 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 const logLine = JSON.stringify(entry) + '\\n';\n\n // Always write to file if configured\n if (this.logFile) {\n try {\n fs.appendFileSync(this.logFile, logLine);\n } catch (err: unknown) {\n // Disable file logging on error (e.g., ENOSPC) to avoid repeated failures\n this.logFile = undefined;\n if (!this.fileLoggingDisabledNotified) {\n this.fileLoggingDisabledNotified = true;\n const msg =\n '[Logger] File logging disabled (write failed). Falling back to console only.';\n\n console.warn(msg);\n }\n }\n }\n\n // Console output based on level\n if (entry.level <= this.logLevel) {\n const levelNames = ['ERROR', 'WARN', 'INFO', 'DEBUG'];\n const levelName = levelNames[entry.level] || 'UNKNOWN';\n\n const consoleMessage = `[${entry.timestamp}] ${levelName}: ${entry.message}`;\n\n if (entry.level === LogLevel.ERROR) {\n console.error(consoleMessage);\n if (entry.error) {\n console.error(entry.error.stack);\n }\n } else if (entry.level === LogLevel.WARN) {\n console.warn(consoleMessage);\n } else {\n console.log(consoleMessage);\n }\n }\n }\n\n error(\n message: string,\n errorOrContext?: Error | Record<string, unknown>,\n context?: Record<string, unknown>\n ): void {\n const isError = errorOrContext instanceof Error;\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.ERROR,\n message,\n context: isError ? context : (errorOrContext as Record<string, unknown>),\n error: isError ? errorOrContext : undefined,\n });\n }\n\n warn(\n message: string,\n errorOrContext?: Error | Record<string, unknown>\n ): void {\n const isError = errorOrContext instanceof Error;\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.WARN,\n message,\n context: isError\n ? undefined\n : (errorOrContext as Record<string, unknown>),\n error: isError ? errorOrContext : undefined,\n });\n }\n\n info(message: string, context?: Record<string, unknown>): void {\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.INFO,\n message,\n context,\n });\n }\n\n debug(message: string, context?: Record<string, unknown>): void {\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.DEBUG,\n message,\n context,\n });\n }\n}\n\n// Export singleton instance\nexport const logger = Logger.getInstance();\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["LogLevel"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/core/monitoring/metrics.ts"],
|
|
4
|
-
"sourcesContent": ["import { EventEmitter } from 'events';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { logger } from './logger.js';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\ninterface MetricEntry {\n timestamp: Date;\n metric: string;\n value: number;\n type: 'counter' | 'gauge' | 'timing';\n tags?: Record<string, string>;\n}\n\nclass MetricsCollector extends EventEmitter {\n private metrics: MetricEntry[] = [];\n private metricsFile?: string;\n private flushInterval: NodeJS.Timeout | null = null;\n private aggregates: Map<\n string,\n { sum: number; count: number; min: number; max: number }\n > = new Map();\n\n constructor() {\n super();\n\n // Set up metrics file if enabled\n if (process.env['STACKMEMORY_METRICS_ENABLED'] === 'true') {\n const metricsDir = path.join(\n process.env['HOME'] || '.',\n '.stackmemory',\n 'metrics'\n );\n if (!fs.existsSync(metricsDir)) {\n fs.mkdirSync(metricsDir, { recursive: true });\n }\n this.metricsFile = path.join(\n metricsDir,\n `metrics-${new Date().toISOString().split('T')[0]}.jsonl`\n );\n\n // Flush metrics every 30 seconds\n this.flushInterval = setInterval(() => this.flush(), 30000);\n }\n }\n\n async record(\n metric: string,\n value: number,\n tags?: Record<string, string>\n ): Promise<void> {\n const entry: MetricEntry = {\n timestamp: new Date(),\n metric,\n value,\n type: 'gauge',\n tags,\n };\n\n this.metrics.push(entry);\n this.updateAggregates(metric, value);\n this.emit('metric', entry);\n\n // Auto-flush if buffer is large\n if (this.metrics.length > 1000) {\n await this.flush();\n }\n }\n\n async increment(\n metric: string,\n tags?: Record<string, string>,\n value = 1\n ): Promise<void> {\n const entry: MetricEntry = {\n timestamp: new Date(),\n metric,\n value,\n type: 'counter',\n tags,\n };\n\n this.metrics.push(entry);\n this.updateAggregates(metric, value);\n this.emit('metric', entry);\n }\n\n async timing(\n metric: string,\n duration: number,\n tags?: Record<string, string>\n ): Promise<void> {\n const entry: MetricEntry = {\n timestamp: new Date(),\n metric,\n value: duration,\n type: 'timing',\n tags,\n };\n\n this.metrics.push(entry);\n this.updateAggregates(metric, duration);\n this.emit('metric', entry);\n }\n\n private updateAggregates(metric: string, value: number): void {\n const existing = this.aggregates.get(metric) || {\n sum: 0,\n count: 0,\n min: Infinity,\n max: -Infinity,\n };\n\n this.aggregates.set(metric, {\n sum: existing.sum + value,\n count: existing.count + 1,\n min: Math.min(existing.min, value),\n max: Math.max(existing.max, value),\n });\n }\n\n async flush(): Promise<void> {\n if (this.metrics.length === 0) return;\n\n const toFlush = [...this.metrics];\n this.metrics = [];\n\n if (this.metricsFile) {\n try {\n const lines = toFlush.map((m) => JSON.stringify(m)).join('\\n') + '\\n';\n await fs.promises.appendFile(this.metricsFile, lines);\n } catch (error: unknown) {\n logger.error(\n 'Failed to write metrics',\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n\n // Emit batch event for external processors\n this.emit('flush', toFlush);\n }\n\n getStats(metric?: string): Record<string, any> {\n if (metric) {\n const stats = this.aggregates.get(metric);\n if (!stats) return {};\n\n return {\n [metric]: {\n ...stats,\n avg: stats.count > 0 ? stats.sum / stats.count : 0,\n },\n };\n }\n\n const result: Record<string, any> = {};\n for (const [key, stats] of this.aggregates.entries()) {\n result[key] = {\n ...stats,\n avg: stats.count > 0 ? stats.sum / stats.count : 0,\n };\n }\n return result;\n }\n\n reset(): void {\n this.metrics = [];\n this.aggregates.clear();\n }\n\n destroy(): void {\n if (this.flushInterval) {\n clearInterval(this.flushInterval);\n this.flushInterval = null;\n }\n this.flush();\n }\n}\n\n// Singleton instance\nconst collector = new MetricsCollector();\n\n// Cleanup on exit\nprocess.on('beforeExit', () => collector.destroy());\n\nexport class Metrics {\n static async record(\n metric: string,\n value: number,\n tags?: Record<string, string>\n ): Promise<void> {\n await collector.record(metric, value, tags);\n }\n\n static async increment(\n metric: string,\n tags?: Record<string, string>\n ): Promise<void> {\n await collector.increment(metric, tags);\n }\n\n static async timing(\n metric: string,\n duration: number,\n tags?: Record<string, string>\n ): Promise<void> {\n await collector.timing(metric, duration, tags);\n }\n\n static getStats(metric?: string): Record<string, any> {\n return collector.getStats(metric);\n }\n\n static reset(): void {\n collector.reset();\n }\n\n static on(event: string, listener: (...args: any[]) => void): void {\n collector.on(event, listener);\n }\n}\n\nexport const metrics = Metrics;\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|