@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
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/integrations/linear/webhook.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Linear Webhook Handler\n * Processes incoming webhooks from Linear for real-time sync\n */\n\nimport { logger } from '../../core/monitoring/logger.js';\nimport { IntegrationError, ErrorCode } from '../../core/errors/index.js';\nimport { LinearSyncEngine } from './sync.js';\nimport { LinearTaskManager } from '../../features/tasks/linear-task-manager.js';\nimport crypto from 'crypto';\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 IntegrationError(\n `Environment variable ${key} is required`,\n ErrorCode.LINEAR_WEBHOOK_FAILED\n );\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\nexport interface LinearWebhookPayload {\n action: 'create' | 'update' | 'remove';\n createdAt: string;\n data: {\n id: string;\n identifier: string;\n title?: string;\n description?: string;\n state?: {\n id: string;\n name: string;\n type: string;\n };\n priority?: number;\n assignee?: {\n id: string;\n name: string;\n email: string;\n };\n team?: {\n id: string;\n key: string;\n name: string;\n };\n labels?: Array<{\n id: string;\n name: string;\n color: string;\n }>;\n dueDate?: string;\n completedAt?: string;\n updatedAt: string;\n };\n type: 'Issue' | 'Comment' | 'Project' | 'Cycle';\n url: string;\n webhookId: string;\n webhookTimestamp: number;\n}\n\nexport class LinearWebhookHandler {\n private syncEngine?: LinearSyncEngine;\n private taskStore?: LinearTaskManager;\n private webhookSecret?: string;\n\n constructor(webhookSecret?: string) {\n this.webhookSecret = webhookSecret || process.env['LINEAR_WEBHOOK_SECRET'];\n }\n\n /**\n * Set the sync engine for processing webhooks\n */\n setSyncEngine(syncEngine: LinearSyncEngine): void {\n this.syncEngine = syncEngine;\n }\n\n /**\n * Set the task store for direct updates\n */\n setTaskStore(taskStore: LinearTaskManager): void {\n this.taskStore = taskStore;\n }\n\n /**\n * Verify webhook signature\n */\n verifySignature(body: string, signature: string): boolean {\n if (!this.webhookSecret) {\n logger.warn('No webhook secret configured, skipping verification');\n return true; // Allow in development\n }\n\n const hmac = crypto.createHmac('sha256', this.webhookSecret);\n hmac.update(body);\n const expectedSignature = hmac.digest('hex');\n\n return signature === expectedSignature;\n }\n\n /**\n * Validate webhook payload structure\n */\n private validateWebhookPayload(\n payload: unknown\n ): LinearWebhookPayload | null {\n if (!payload || typeof payload !== 'object') return null;\n\n const p = payload as any;\n\n // Validate required fields\n if (!p.action || typeof p.action !== 'string') return null;\n if (!p.type || typeof p.type !== 'string') return null;\n if (!p.data || typeof p.data !== 'object') return null;\n if (!p.data.id || typeof p.data.id !== 'string') return null;\n\n // Sanitize string fields to prevent injection\n if (p.data.title && typeof p.data.title === 'string') {\n p.data.title = p.data.title.substring(0, 500); // Limit length\n }\n if (p.data.description && typeof p.data.description === 'string') {\n p.data.description = p.data.description.substring(0, 5000); // Limit length\n }\n\n return p as LinearWebhookPayload;\n }\n\n /**\n * Process incoming webhook\n */\n async processWebhook(payload: LinearWebhookPayload): Promise<void> {\n // Validate payload first\n const validatedPayload = this.validateWebhookPayload(payload);\n if (!validatedPayload) {\n logger.error('Invalid webhook payload received');\n throw new IntegrationError(\n 'Invalid webhook payload',\n ErrorCode.LINEAR_WEBHOOK_FAILED\n );\n }\n\n logger.info('Processing Linear webhook', {\n action: validatedPayload.action,\n type: validatedPayload.type,\n id: validatedPayload.data.id,\n });\n\n payload = validatedPayload;\n\n // Only process Issue webhooks for now\n if (payload.type !== 'Issue') {\n logger.info(`Ignoring webhook for type: ${payload.type}`);\n return;\n }\n\n switch (payload.action) {\n case 'create':\n await this.handleIssueCreated(payload);\n break;\n case 'update':\n await this.handleIssueUpdated(payload);\n break;\n case 'remove':\n await this.handleIssueRemoved(payload);\n break;\n default:\n logger.warn(`Unknown webhook action: ${payload.action}`);\n }\n }\n\n /**\n * Handle issue created in Linear\n */\n private async handleIssueCreated(\n payload: LinearWebhookPayload\n ): Promise<void> {\n logger.info('Linear issue created', {\n identifier: payload.data.identifier,\n });\n\n // Check if we should sync this issue\n if (!this.shouldSyncIssue(payload.data)) {\n return;\n }\n\n // For now, just log it - full implementation would create a StackMemory task\n logger.info('Would create StackMemory task for Linear issue', {\n identifier: payload.data.identifier,\n title: payload.data.title,\n });\n\n // Create a StackMemory task from Linear issue\n if (this.taskStore) {\n try {\n const taskId = this.taskStore.createTask({\n frameId: 'linear-import', // Special frame for Linear imports\n title: payload.data.title || 'Untitled Linear Issue',\n description: payload.data.description || '',\n priority: this.mapLinearPriorityToStackMemory(payload.data.priority),\n assignee: payload.data.assignee?.email,\n tags: payload.data.labels?.map((l: any) => l.name) || [],\n });\n\n // Store mapping for future syncing\n this.storeMapping(taskId, payload.data.id);\n\n logger.info('Created StackMemory task from Linear issue', {\n stackmemoryId: taskId,\n linearId: payload.data.id,\n });\n } catch (error: unknown) {\n logger.error('Failed to create task from Linear issue', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }\n\n /**\n * Handle issue updated in Linear\n */\n private async handleIssueUpdated(\n payload: LinearWebhookPayload\n ): Promise<void> {\n logger.info('Linear issue updated', {\n identifier: payload.data.identifier,\n });\n\n if (!this.syncEngine) {\n logger.warn('No sync engine configured, cannot process update');\n return;\n }\n\n // Find mapped StackMemory task\n const mapping = this.findMappingByLinearId(payload.data.id);\n if (!mapping) {\n logger.info('No mapping found for Linear issue', { id: payload.data.id });\n return;\n }\n\n // Check for conflicts\n const task = this.taskStore?.getTask(mapping.stackmemoryId);\n if (!task) {\n logger.warn('StackMemory task not found', { id: mapping.stackmemoryId });\n return;\n }\n\n // Update the task based on Linear changes\n let newStatus:\n | 'pending'\n | 'in_progress'\n | 'completed'\n | 'cancelled'\n | undefined;\n\n if (payload.data.state) {\n const mappedStatus = this.mapLinearStateToStatus(payload.data.state) as\n | 'pending'\n | 'in_progress'\n | 'completed'\n | 'cancelled';\n if (mappedStatus !== task.status) {\n newStatus = mappedStatus;\n }\n }\n\n if (payload.data.completedAt) {\n newStatus = 'completed';\n }\n\n // Update status if changed\n if (newStatus) {\n this.taskStore?.updateTaskStatus(\n mapping.stackmemoryId,\n newStatus,\n 'Linear webhook update'\n );\n logger.info('Updated StackMemory task status from webhook', {\n taskId: mapping.stackmemoryId,\n newStatus,\n });\n }\n\n // For other properties, we'd need to implement a more complete update method\n // For now, log what changed\n if (payload.data.title && payload.data.title !== task.title) {\n logger.info(\n 'Task title changed in Linear but not updated in StackMemory',\n {\n taskId: mapping.stackmemoryId,\n oldTitle: task.title,\n newTitle: payload.data.title,\n }\n );\n }\n }\n\n /**\n * Handle issue removed in Linear\n */\n private async handleIssueRemoved(\n payload: LinearWebhookPayload\n ): Promise<void> {\n logger.info('Linear issue removed', {\n identifier: payload.data.identifier,\n });\n\n const mapping = this.findMappingByLinearId(payload.data.id);\n if (!mapping) {\n logger.info('No mapping found for removed Linear issue');\n return;\n }\n\n // Mark the StackMemory task as cancelled\n this.taskStore?.updateTaskStatus(\n mapping.stackmemoryId,\n 'cancelled',\n 'Linear issue deleted'\n );\n\n logger.info('Marked StackMemory task as cancelled due to Linear deletion', {\n taskId: mapping.stackmemoryId,\n });\n }\n\n /**\n * Check if we should sync this issue\n */\n private shouldSyncIssue(issue: LinearWebhookPayload['data']): boolean {\n // Add your filtering logic here\n // For example, only sync issues from specific teams or with certain labels\n\n // Skip issues without a title\n if (!issue.title) {\n return false;\n }\n\n // Skip archived/cancelled issues\n if (issue.state?.type === 'canceled' || issue.state?.type === 'archived') {\n return false;\n }\n\n return true;\n }\n\n /**\n * Find mapping by Linear ID\n */\n private findMappingByLinearId(\n linearId: string\n ): { stackmemoryId: string; linearId: string } | null {\n // Use in-memory mapping for now\n // In production, this would query a database\n const mapping = this.taskMappings.get(linearId);\n if (mapping) {\n return { stackmemoryId: mapping, linearId };\n }\n return null;\n }\n\n // In-memory task mappings (Linear ID -> StackMemory ID)\n private taskMappings = new Map<string, string>();\n\n /**\n * Store mapping between Linear and StackMemory IDs\n */\n private storeMapping(stackmemoryId: string, linearId: string): void {\n this.taskMappings.set(linearId, stackmemoryId);\n // In production, persist to database\n }\n\n /**\n * Map Linear priority to StackMemory priority\n */\n private mapLinearPriorityToStackMemory(\n priority: number | undefined\n ): 'low' | 'medium' | 'high' | 'urgent' {\n if (!priority) return 'medium';\n if (priority <= 1) return 'urgent';\n if (priority === 2) return 'high';\n if (priority === 3) return 'medium';\n return 'low';\n }\n\n /**\n * Map Linear state to StackMemory status\n */\n private mapLinearStateToStatus(state: {\n type?: string;\n name?: string;\n }): string {\n const stateType = state.type?.toLowerCase() || state.name?.toLowerCase();\n\n switch (stateType) {\n case 'backlog':\n case 'unstarted':\n return 'pending';\n case 'started':\n case 'in progress':\n return 'in_progress';\n case 'completed':\n case 'done':\n return 'completed';\n case 'canceled':\n case 'cancelled':\n return 'cancelled';\n default:\n return 'pending';\n }\n }\n\n /**\n * Map Linear priority to StackMemory priority\n */\n private mapLinearPriorityToPriority(priority: number): number {\n // Linear uses 0-4, StackMemory uses 1-5\n return 5 - priority;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/integrations/mcp/handlers/code-execution-handlers.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Code Execution MCP Handlers\n * Provides controlled Python/JavaScript code execution with safety measures\n */\n\nimport { spawn } from 'child_process';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { tmpdir } from 'os';\nimport { randomBytes } from 'crypto';\n\ninterface ExecutionResult {\n success: boolean;\n stdout: string;\n stderr: string;\n exitCode: number | null;\n truncated: boolean;\n outputFile?: string;\n}\n\nconst MAX_OUTPUT_SIZE = 50000; // Maximum output size before truncation\nconst EXECUTION_TIMEOUT = 30000; // 30 seconds timeout\n\nexport class CodeExecutionHandler {\n private readonly allowedLanguages = ['python', 'javascript', 'typescript'];\n private readonly sandboxDir: string;\n\n constructor() {\n // Create a sandbox directory for code execution\n this.sandboxDir = join(tmpdir(), 'stackmemory-sandbox');\n this.ensureSandboxDir();\n }\n\n private async ensureSandboxDir(): Promise<void> {\n try {\n await fs.mkdir(this.sandboxDir, { recursive: true });\n } catch (error) {\n console.error('Failed to create sandbox directory:', error);\n }\n }\n\n /**\n * Execute code in a controlled environment\n */\n async executeCode(params: {\n language: string;\n code: string;\n workingDirectory?: string;\n timeout?: number;\n }): Promise<ExecutionResult> {\n const { language, code, workingDirectory, timeout = EXECUTION_TIMEOUT } = params;\n\n // Validate language\n if (!this.allowedLanguages.includes(language.toLowerCase())) {\n return {\n success: false,\n stdout: '',\n stderr: `Language '${language}' is not allowed. Use: ${this.allowedLanguages.join(', ')}`,\n exitCode: 1,\n truncated: false,\n };\n }\n\n // Create temporary file for code\n const tempFile = join(\n this.sandboxDir,\n `code_${randomBytes(8).toString('hex')}.${this.getFileExtension(language)}`\n );\n\n try {\n // Write code to temporary file\n await fs.writeFile(tempFile, code, 'utf-8');\n\n // Execute code\n const result = await this.runCode(language, tempFile, workingDirectory || this.sandboxDir, timeout);\n\n // Clean up temp file\n await fs.unlink(tempFile).catch(() => {});\n\n return result;\n } catch (error) {\n return {\n success: false,\n stdout: '',\n stderr: `Execution error: ${error instanceof Error ? error.message : String(error)}`,\n exitCode: 1,\n truncated: false,\n };\n }\n }\n\n /**\n * Run code with appropriate interpreter\n */\n private async runCode(\n language: string,\n filePath: string,\n workingDirectory: string,\n timeout: number\n ): Promise<ExecutionResult> {\n const command = this.getCommand(language);\n const args = this.getArgs(language, filePath);\n\n return new Promise((resolve) => {\n let stdout = '';\n let stderr = '';\n let truncated = false;\n\n const child = spawn(command, args, {\n cwd: workingDirectory,\n env: {\n ...process.env,\n PYTHONDONTWRITEBYTECODE: '1', // Don't create .pyc files\n NODE_ENV: 'sandbox',\n },\n });\n\n // Set timeout\n const timeoutId = setTimeout(() => {\n child.kill('SIGTERM');\n stderr += '\\n[Process killed due to timeout]';\n }, timeout);\n\n child.stdout.on('data', (data) => {\n stdout += data.toString();\n if (stdout.length > MAX_OUTPUT_SIZE) {\n truncated = true;\n child.kill('SIGTERM');\n }\n });\n\n child.stderr.on('data', (data) => {\n stderr += data.toString();\n if (stderr.length > MAX_OUTPUT_SIZE) {\n truncated = true;\n child.kill('SIGTERM');\n }\n });\n\n child.on('close', async (code) => {\n clearTimeout(timeoutId);\n\n // If output is truncated, save to file\n let outputFile: string | undefined;\n if (truncated) {\n outputFile = join(this.sandboxDir, `output_${randomBytes(8).toString('hex')}.txt`);\n await fs.writeFile(outputFile, stdout + '\\n---STDERR---\\n' + stderr, 'utf-8').catch(() => {});\n }\n\n resolve({\n success: code === 0,\n stdout: truncated ? stdout.slice(0, MAX_OUTPUT_SIZE) + '\\n[Output truncated]' : stdout,\n stderr: truncated ? stderr.slice(0, MAX_OUTPUT_SIZE) + '\\n[Output truncated]' : stderr,\n exitCode: code,\n truncated,\n outputFile,\n });\n });\n\n child.on('error', (error) => {\n clearTimeout(timeoutId);\n resolve({\n success: false,\n stdout: '',\n stderr: `Failed to start process: ${error.message}`,\n exitCode: null,\n truncated: false,\n });\n });\n });\n }\n\n /**\n * Get file extension for language\n */\n private getFileExtension(language: string): string {\n switch (language.toLowerCase()) {\n case 'python':\n return 'py';\n case 'javascript':\n return 'js';\n case 'typescript':\n return 'ts';\n default:\n return 'txt';\n }\n }\n\n /**\n * Get command for language\n */\n private getCommand(language: string): string {\n switch (language.toLowerCase()) {\n case 'python':\n return 'python3';\n case 'javascript':\n return 'node';\n case 'typescript':\n return 'npx';\n default:\n return 'echo';\n }\n }\n\n /**\n * Get arguments for language\n */\n private getArgs(language: string, filePath: string): string[] {\n switch (language.toLowerCase()) {\n case 'python':\n return [filePath];\n case 'javascript':\n return [filePath];\n case 'typescript':\n return ['tsx', filePath];\n default:\n return ['Unsupported language'];\n }\n }\n\n /**\n * Validate code for dangerous patterns\n */\n validateCode(code: string): { safe: boolean; warnings: string[] } {\n const warnings: string[] = [];\n const dangerousPatterns = [\n { pattern: /import\\s+os/i, message: 'Importing os module detected' },\n { pattern: /import\\s+subprocess/i, message: 'Subprocess module detected' },\n { pattern: /exec\\s*\\(/i, message: 'exec() function detected' },\n { pattern: /eval\\s*\\(/i, message: 'eval() function detected' },\n { pattern: /__import__/i, message: '__import__ detected' },\n { pattern: /open\\s*\\([^)]*['\"]\\//i, message: 'Absolute path file access detected' },\n { pattern: /require\\s*\\([^)]*child_process/i, message: 'child_process module detected' },\n { pattern: /require\\s*\\([^)]*fs/i, message: 'fs module access detected' },\n ];\n\n for (const { pattern, message } of dangerousPatterns) {\n if (pattern.test(code)) {\n warnings.push(message);\n }\n }\n\n return {\n safe: warnings.length === 0,\n warnings,\n };\n }\n\n /**\n * Get sandbox status\n */\n async getSandboxStatus(): Promise<{\n sandboxDir: string;\n tempFiles: number;\n totalSize: number;\n }> {\n try {\n const files = await fs.readdir(this.sandboxDir);\n let totalSize = 0;\n\n for (const file of files) {\n const stat = await fs.stat(join(this.sandboxDir, file));\n totalSize += stat.size;\n }\n\n return {\n sandboxDir: this.sandboxDir,\n tempFiles: files.length,\n totalSize,\n };\n } catch {\n return {\n sandboxDir: this.sandboxDir,\n tempFiles: 0,\n totalSize: 0,\n };\n }\n }\n\n /**\n * Clean sandbox directory\n */\n async cleanSandbox(): Promise<void> {\n try {\n const files = await fs.readdir(this.sandboxDir);\n for (const file of files) {\n await fs.unlink(join(this.sandboxDir, file)).catch(() => {});\n }\n } catch (error) {\n console.error('Failed to clean sandbox:', error);\n }\n }\n}\n\n// Export MCP tool handlers\nexport const codeExecutionHandlers = {\n 'code.execute': async (params: any) => {\n const handler = new CodeExecutionHandler();\n \n // Validate code before execution\n const validation = handler.validateCode(params.code);\n if (!validation.safe && !params.force) {\n return {\n error: 'Code validation failed',\n warnings: validation.warnings,\n hint: 'Add force: true to execute anyway',\n };\n }\n\n return await handler.executeCode(params);\n },\n\n 'code.validate': async (params: any) => {\n const handler = new CodeExecutionHandler();\n return handler.validateCode(params.code);\n },\n\n 'code.sandbox_status': async () => {\n const handler = new CodeExecutionHandler();\n return await handler.getSandboxStatus();\n },\n\n 'code.clean_sandbox': async () => {\n const handler = new CodeExecutionHandler();\n await handler.cleanSandbox();\n return { success: true, message: 'Sandbox cleaned' };\n },\n};"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/integrations/mcp/handlers/context-handlers.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Context-related MCP tool handlers\n * Handles frame management and context retrieval\n */\n\nimport { FrameManager, FrameType } from '../../../core/context/index.js';\nimport { LLMContextRetrieval } from '../../../core/retrieval/index.js';\nimport { logger } from '../../../core/monitoring/logger.js';\n\nexport interface ContextHandlerDependencies {\n frameManager: FrameManager;\n contextRetrieval: LLMContextRetrieval;\n}\n\nexport class ContextHandlers {\n constructor(private deps: ContextHandlerDependencies) {}\n\n /**\n * Get current project context\n */\n async handleGetContext(args: any): Promise<any> {\n try {\n const query = args.query || '';\n const limit = args.limit || 5;\n\n logger.info('Getting context', { query, limit });\n\n // Get hot stack context\n const hotStack = this.deps.frameManager.getHotStackContext(20);\n\n if (hotStack.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No active context frames found. Use start_frame to begin working on a task.',\n },\n ],\n };\n }\n\n // Use LLM context retrieval if available\n if (this.deps.contextRetrieval && query) {\n try {\n // TODO: Implement getRelevantContext method\n const llmContext = { summary: 'Context retrieval not yet implemented', frameIds: [] };\n return {\n content: [\n {\n type: 'text',\n text: llmContext.summary || 'No specific context found.',\n },\n ],\n metadata: {\n relevantFrames: llmContext.frameIds,\n query,\n },\n };\n } catch (error: unknown) {\n logger.warn('LLM context retrieval failed, falling back to hot stack', error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n // Format hot stack context\n const contextText = hotStack\n .map((frame, i) => {\n const depth = ' '.repeat(i);\n const constraints = frame.header.constraints?.length\n ? `\\n${depth} Constraints: ${frame.header.constraints.join(', ')}`\n : '';\n const events = frame.recentEvents.length\n ? `\\n${depth} Recent: ${frame.recentEvents.length} events`\n : '';\n\n return `${depth}Frame ${i + 1}: ${frame.header.goal}${constraints}${events}`;\n })\n .join('\\n');\n\n return {\n content: [\n {\n type: 'text',\n text: `Current Context Stack:\\n${contextText}`,\n },\n ],\n };\n } catch (error: unknown) {\n logger.error('Error getting context', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Record a decision or important information\n */\n async handleAddDecision(args: any): Promise<any> {\n try {\n const { content, type } = args;\n \n if (!content) {\n throw new Error('Content is required');\n }\n\n const currentFrame = this.deps.frameManager.getCurrentFrameId();\n if (!currentFrame) {\n throw new Error('No active frame. Use start_frame first.');\n }\n\n // Add as anchor\n this.deps.frameManager.addAnchor(\n type === 'constraint' ? 'CONSTRAINT' : 'DECISION',\n content,\n type === 'constraint' ? 9 : 7\n );\n\n // Also add as event\n this.deps.frameManager.addEvent('decision', {\n type,\n content,\n timestamp: Date.now(),\n });\n\n logger.info('Added decision/constraint', { type, content });\n\n return {\n content: [\n {\n type: 'text',\n text: `Recorded ${type}: ${content}`,\n },\n ],\n };\n } catch (error: unknown) {\n logger.error('Error adding decision', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Start a new frame (task/subtask) on the call stack\n */\n async handleStartFrame(args: any): Promise<any> {\n try {\n const { name, type = 'task', constraints = [], definitions = {} } = args;\n \n if (!name) {\n throw new Error('Frame name is required');\n }\n\n const frameId = this.deps.frameManager.createFrame({\n type: type as FrameType,\n name,\n inputs: { constraints, definitions }\n });\n\n logger.info('Started frame', { frameId, name, type });\n\n return {\n content: [\n {\n type: 'text',\n text: `Started frame: ${name} (${frameId})`,\n },\n ],\n metadata: {\n frameId,\n type,\n name,\n },\n };\n } catch (error: unknown) {\n logger.error('Error starting frame', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Close current frame with summary\n */\n async handleCloseFrame(args: any): Promise<any> {\n try {\n const { summary, frameId } = args;\n const targetFrameId = frameId || this.deps.frameManager.getCurrentFrameId();\n\n if (!targetFrameId) {\n throw new Error('No active frame to close');\n }\n\n const frame = this.deps.frameManager.getFrame(targetFrameId);\n if (!frame) {\n throw new Error(`Frame not found: ${targetFrameId}`);\n }\n\n // Add summary if provided\n if (summary) {\n this.deps.frameManager.addEvent('observation', {\n type: 'completion_summary',\n content: summary,\n timestamp: Date.now(),\n });\n }\n\n this.deps.frameManager.closeFrame(targetFrameId, summary ? { summary } : {});\n\n logger.info('Closed frame', { frameId: targetFrameId, frameName: frame.name });\n\n return {\n content: [\n {\n type: 'text',\n text: `Closed frame: ${frame.name}${summary ? ` with summary: ${summary}` : ''}`,\n },\n ],\n };\n } catch (error: unknown) {\n logger.error('Error closing frame', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Add an anchor (important fact) to current frame\n */\n async handleAddAnchor(args: any): Promise<any> {\n try {\n const { type, text, priority = 5 } = args;\n \n if (!text) {\n throw new Error('Anchor text is required');\n }\n\n const currentFrame = this.deps.frameManager.getCurrentFrameId();\n if (!currentFrame) {\n throw new Error('No active frame. Use start_frame first.');\n }\n\n const validTypes = ['FACT', 'DECISION', 'CONSTRAINT', 'INTERFACE_CONTRACT', 'TODO', 'RISK'];\n if (!validTypes.includes(type)) {\n throw new Error(`Invalid anchor type. Must be one of: ${validTypes.join(', ')}`);\n }\n\n this.deps.frameManager.addAnchor(type, text, priority);\n\n logger.info('Added anchor', { type, text, priority });\n\n return {\n content: [\n {\n type: 'text',\n text: `Added ${type.toLowerCase()}: ${text}`,\n },\n ],\n };\n } catch (error: unknown) {\n logger.error('Error adding anchor', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Get current hot stack context\n */\n async handleGetHotStack(args: any): Promise<any> {\n try {\n const maxEvents = args.max_events || 10;\n const hotStack = this.deps.frameManager.getHotStackContext(maxEvents);\n\n if (hotStack.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No active frames on the stack.',\n },\n ],\n };\n }\n\n const stackSummary = hotStack.map((frame, index) => ({\n depth: index,\n frameId: frame.frameId,\n goal: frame.header.goal,\n constraints: frame.header.constraints || [],\n anchors: frame.anchors.length,\n recentEvents: frame.recentEvents.length,\n artifacts: frame.activeArtifacts.length,\n }));\n\n return {\n content: [\n {\n type: 'text',\n text: `Hot Stack (${hotStack.length} frames):\\n` +\n stackSummary.map((f: any) => \n ` ${f.depth}: ${f.goal} (${f.anchors} anchors, ${f.recentEvents} events)`\n ).join('\\n'),\n },\n ],\n metadata: {\n stack: stackSummary,\n },\n };\n } catch (error: unknown) {\n logger.error('Error getting hot stack', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/integrations/mcp/handlers/discovery-handlers.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Discovery MCP Tool Handlers\n * Intelligently discovers relevant files based on current context\n */\n\nimport { FrameManager } from '../../../core/context/index.js';\nimport { LLMContextRetrieval } from '../../../core/retrieval/index.js';\nimport { logger } from '../../../core/monitoring/logger.js';\nimport { execSync } from 'child_process';\nimport { existsSync, readFileSync, readdirSync, statSync } from 'fs';\nimport { join, relative, extname } from 'path';\nimport Database from 'better-sqlite3';\n\nexport interface DiscoveryDependencies {\n frameManager: FrameManager;\n contextRetrieval: LLMContextRetrieval;\n db: Database.Database;\n projectRoot: string;\n}\n\ninterface DiscoveredFile {\n path: string;\n relevance: 'high' | 'medium' | 'low';\n reason: string;\n matchedKeywords?: string[];\n excerpt?: string;\n}\n\ninterface DiscoveryResult {\n files: DiscoveredFile[];\n keywords: string[];\n contextSummary: string;\n mdContext: Record<string, string>;\n}\n\nexport class DiscoveryHandlers {\n constructor(private deps: DiscoveryDependencies) {}\n\n /**\n * Discover relevant files based on current context\n */\n async handleDiscover(args: {\n query?: string;\n depth?: 'shallow' | 'medium' | 'deep';\n includePatterns?: string[];\n excludePatterns?: string[];\n maxFiles?: number;\n }): Promise<any> {\n try {\n const {\n query,\n depth = 'medium',\n includePatterns = ['*.ts', '*.tsx', '*.js', '*.md', '*.json'],\n excludePatterns = ['node_modules', 'dist', '.git', '*.min.js'],\n maxFiles = 20,\n } = args;\n\n logger.info('Starting discovery', { query, depth });\n\n // Step 1: Extract keywords from current context\n const keywords = this.extractContextKeywords(query);\n\n // Step 2: Parse .md files for additional context\n const mdContext = this.parseMdFiles();\n\n // Step 3: Get recently touched files from frames\n const recentFiles = this.getRecentFilesFromContext();\n\n // Step 4: Search codebase for relevant files\n const discoveredFiles = await this.searchCodebase(\n keywords,\n includePatterns,\n excludePatterns,\n depth,\n maxFiles\n );\n\n // Step 5: Merge and rank results\n const rankedFiles = this.rankFiles(\n discoveredFiles,\n recentFiles,\n keywords\n );\n\n // Step 6: Generate context summary\n const contextSummary = this.generateContextSummary(keywords, rankedFiles);\n\n const result: DiscoveryResult = {\n files: rankedFiles.slice(0, maxFiles),\n keywords,\n contextSummary,\n mdContext,\n };\n\n return {\n content: [\n {\n type: 'text',\n text: this.formatDiscoveryResult(result),\n },\n ],\n metadata: result,\n };\n } catch (error) {\n logger.error('Discovery failed', error);\n throw error;\n }\n }\n\n /**\n * Get related files to a specific file or concept\n */\n async handleRelatedFiles(args: {\n file?: string;\n concept?: string;\n maxFiles?: number;\n }): Promise<any> {\n try {\n const { file, concept, maxFiles = 10 } = args;\n\n if (!file && !concept) {\n throw new Error('Either file or concept is required');\n }\n\n let relatedFiles: DiscoveredFile[] = [];\n\n if (file) {\n // Find files that import/reference this file\n relatedFiles = this.findFileReferences(file, maxFiles);\n }\n\n if (concept) {\n // Search for files mentioning this concept\n const conceptFiles = this.searchForConcept(concept, maxFiles);\n relatedFiles = this.mergeAndDedupe(relatedFiles, conceptFiles);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: this.formatRelatedFiles(relatedFiles, file, concept),\n },\n ],\n metadata: { relatedFiles },\n };\n } catch (error) {\n logger.error('Related files search failed', error);\n throw error;\n }\n }\n\n /**\n * Get session summary with actionable context\n */\n async handleSessionSummary(args: {\n includeFiles?: boolean;\n includeDecisions?: boolean;\n }): Promise<any> {\n try {\n const { includeFiles = true, includeDecisions = true } = args;\n\n const hotStack = this.deps.frameManager.getHotStackContext(50);\n const recentFiles = includeFiles ? this.getRecentFilesFromContext() : [];\n const decisions = includeDecisions ? this.getRecentDecisions() : [];\n\n const summary = {\n activeFrames: hotStack.length,\n currentGoal:\n hotStack[hotStack.length - 1]?.header?.goal || 'No active task',\n recentFiles: recentFiles.slice(0, 10),\n decisions: decisions.slice(0, 5),\n stackDepth: this.deps.frameManager.getStackDepth(),\n };\n\n return {\n content: [\n {\n type: 'text',\n text: this.formatSessionSummary(summary),\n },\n ],\n metadata: summary,\n };\n } catch (error) {\n logger.error('Session summary failed', error);\n throw error;\n }\n }\n\n // ===============================\n // Private helper methods\n // ===============================\n\n private extractContextKeywords(query?: string): string[] {\n const keywords: Set<string> = new Set();\n\n // Add query terms\n if (query) {\n const queryWords = query\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 2);\n queryWords.forEach((w) => keywords.add(w));\n }\n\n // Extract from current frames\n const hotStack = this.deps.frameManager.getHotStackContext(20);\n for (const frame of hotStack) {\n // Frame name/goal\n if (frame.header?.goal) {\n const goalWords = frame.header.goal\n .toLowerCase()\n .split(/[\\s\\-_]+/)\n .filter((w) => w.length > 2);\n goalWords.forEach((w) => keywords.add(w));\n }\n\n // Constraints\n frame.header?.constraints?.forEach((c: string) => {\n const words = c\n .toLowerCase()\n .split(/[\\s\\-_]+/)\n .filter((w) => w.length > 2);\n words.forEach((w) => keywords.add(w));\n });\n\n // Recent events\n frame.recentEvents?.forEach((evt: any) => {\n if (evt.data?.content) {\n const words = String(evt.data.content)\n .toLowerCase()\n .split(/[\\s\\-_]+/)\n .filter((w) => w.length > 3)\n .slice(0, 5);\n words.forEach((w) => keywords.add(w));\n }\n });\n }\n\n // Extract from recent files in events\n try {\n const fileEvents = this.deps.db\n .prepare(\n `\n SELECT DISTINCT data FROM events e\n JOIN frames f ON e.frame_id = f.frame_id\n WHERE e.type IN ('file_read', 'file_write', 'file_edit')\n ORDER BY e.timestamp DESC\n LIMIT 20\n `\n )\n .all() as any[];\n\n for (const evt of fileEvents) {\n try {\n const data = JSON.parse(evt.data || '{}');\n if (data.path) {\n // Extract meaningful parts from file path\n const pathParts = data.path.split('/').slice(-2);\n pathParts.forEach((part: string) => {\n const words = part\n .replace(/\\.[^.]+$/, '')\n .split(/[\\-_]+/)\n .filter((w) => w.length > 2);\n words.forEach((w) => keywords.add(w.toLowerCase()));\n });\n }\n } catch {}\n }\n } catch {}\n\n // Remove common stopwords\n const stopwords = new Set([\n 'the',\n 'and',\n 'for',\n 'with',\n 'this',\n 'that',\n 'from',\n 'have',\n 'has',\n 'been',\n 'will',\n 'can',\n 'should',\n 'would',\n 'could',\n 'function',\n 'const',\n 'let',\n 'var',\n 'import',\n 'export',\n 'return',\n 'async',\n 'await',\n ]);\n\n return Array.from(keywords).filter((k) => !stopwords.has(k));\n }\n\n private parseMdFiles(): Record<string, string> {\n const mdContext: Record<string, string> = {};\n const mdFiles = ['CLAUDE.md', 'README.md', '.stackmemory/context.md'];\n\n for (const mdFile of mdFiles) {\n const fullPath = join(this.deps.projectRoot, mdFile);\n if (existsSync(fullPath)) {\n try {\n const content = readFileSync(fullPath, 'utf8');\n // Extract key sections\n const sections = this.extractMdSections(content);\n mdContext[mdFile] = sections;\n } catch {}\n }\n }\n\n // Also check ~/.claude/CLAUDE.md\n const homeClaude = join(process.env['HOME'] || '', '.claude', 'CLAUDE.md');\n if (existsSync(homeClaude)) {\n try {\n const content = readFileSync(homeClaude, 'utf8');\n mdContext['~/.claude/CLAUDE.md'] = this.extractMdSections(content);\n } catch {}\n }\n\n return mdContext;\n }\n\n private extractMdSections(content: string): string {\n // Extract meaningful sections (headers and their content)\n const lines = content.split('\\n');\n const sections: string[] = [];\n let currentSection = '';\n let inCodeBlock = false;\n\n for (const line of lines) {\n if (line.startsWith('```')) {\n inCodeBlock = !inCodeBlock;\n continue;\n }\n if (inCodeBlock) continue;\n\n if (line.startsWith('#')) {\n if (currentSection) sections.push(currentSection.trim());\n currentSection = line + '\\n';\n } else if (currentSection && line.trim()) {\n currentSection += line + '\\n';\n }\n }\n if (currentSection) sections.push(currentSection.trim());\n\n // Return condensed version (first 500 chars of each section)\n return sections\n .map((s) => (s.length > 500 ? s.slice(0, 500) + '...' : s))\n .join('\\n\\n');\n }\n\n private getRecentFilesFromContext(): string[] {\n const files: Set<string> = new Set();\n\n try {\n const fileEvents = this.deps.db\n .prepare(\n `\n SELECT DISTINCT data FROM events e\n JOIN frames f ON e.frame_id = f.frame_id\n WHERE e.type IN ('file_read', 'file_write', 'file_edit', 'tool_call')\n AND e.timestamp > ?\n ORDER BY e.timestamp DESC\n LIMIT 50\n `\n )\n .all(Math.floor(Date.now() / 1000) - 3600) as any[]; // Last hour\n\n for (const evt of fileEvents) {\n try {\n const data = JSON.parse(evt.data || '{}');\n if (data.path) files.add(data.path);\n if (data.file) files.add(data.file);\n if (data.file_path) files.add(data.file_path);\n } catch {}\n }\n } catch {}\n\n // Also get from git status\n try {\n const gitStatus = execSync('git status --porcelain', {\n cwd: this.deps.projectRoot,\n encoding: 'utf8',\n });\n const modifiedFiles = gitStatus\n .split('\\n')\n .filter((l) => l.trim())\n .map((l) => l.slice(3).trim())\n .filter((f) => f);\n modifiedFiles.forEach((f) => files.add(f));\n } catch {}\n\n return Array.from(files);\n }\n\n private async searchCodebase(\n keywords: string[],\n includePatterns: string[],\n excludePatterns: string[],\n depth: 'shallow' | 'medium' | 'deep',\n maxFiles: number\n ): Promise<DiscoveredFile[]> {\n const files: DiscoveredFile[] = [];\n const maxResults = depth === 'shallow' ? 10 : depth === 'medium' ? 25 : 50;\n\n // Build grep command for each keyword\n for (const keyword of keywords.slice(0, 10)) {\n try {\n const excludeArgs = excludePatterns\n .map((p) => `--exclude-dir=${p}`)\n .join(' ');\n const includeArgs = includePatterns\n .map((p) => `--include=${p}`)\n .join(' ');\n\n const cmd = `grep -ril ${excludeArgs} ${includeArgs} \"${keyword}\" . 2>/dev/null | head -${maxResults}`;\n const result = execSync(cmd, {\n cwd: this.deps.projectRoot,\n encoding: 'utf8',\n timeout: 5000,\n });\n\n const matchedFiles = result.split('\\n').filter((f) => f.trim());\n for (const file of matchedFiles) {\n const cleanPath = file.replace(/^\\.\\//, '');\n const existing = files.find((f) => f.path === cleanPath);\n if (existing) {\n existing.matchedKeywords = existing.matchedKeywords || [];\n if (!existing.matchedKeywords.includes(keyword)) {\n existing.matchedKeywords.push(keyword);\n }\n } else {\n files.push({\n path: cleanPath,\n relevance: 'medium',\n reason: `Contains keyword: ${keyword}`,\n matchedKeywords: [keyword],\n });\n }\n }\n } catch {\n // Grep failed for this keyword, continue\n }\n }\n\n // Boost relevance for files with multiple keyword matches\n for (const file of files) {\n const matchCount = file.matchedKeywords?.length || 0;\n if (matchCount >= 3) {\n file.relevance = 'high';\n file.reason = `Matches ${matchCount} keywords: ${file.matchedKeywords?.slice(0, 3).join(', ')}`;\n }\n }\n\n return files;\n }\n\n private rankFiles(\n discovered: DiscoveredFile[],\n recent: string[],\n keywords: string[]\n ): DiscoveredFile[] {\n const recentSet = new Set(recent);\n\n // Add recent files with high relevance\n for (const recentFile of recent) {\n const existing = discovered.find((f) => f.path === recentFile);\n if (existing) {\n existing.relevance = 'high';\n existing.reason = 'Recently accessed + ' + existing.reason;\n } else {\n discovered.push({\n path: recentFile,\n relevance: 'high',\n reason: 'Recently accessed in context',\n });\n }\n }\n\n // Sort by relevance and match count\n return discovered.sort((a, b) => {\n const relevanceOrder = { high: 3, medium: 2, low: 1 };\n const relDiff = relevanceOrder[b.relevance] - relevanceOrder[a.relevance];\n if (relDiff !== 0) return relDiff;\n\n const aMatches = a.matchedKeywords?.length || 0;\n const bMatches = b.matchedKeywords?.length || 0;\n return bMatches - aMatches;\n });\n }\n\n private findFileReferences(file: string, maxFiles: number): DiscoveredFile[] {\n const results: DiscoveredFile[] = [];\n\n try {\n // Search for imports of this file\n const basename = file.replace(/\\.[^.]+$/, '');\n const cmd = `grep -ril \"from.*${basename}\" . --include=\"*.ts\" --include=\"*.tsx\" --include=\"*.js\" --exclude-dir=node_modules --exclude-dir=dist 2>/dev/null | head -${maxFiles}`;\n const result = execSync(cmd, {\n cwd: this.deps.projectRoot,\n encoding: 'utf8',\n timeout: 5000,\n });\n\n const files = result.split('\\n').filter((f) => f.trim());\n for (const f of files) {\n results.push({\n path: f.replace(/^\\.\\//, ''),\n relevance: 'high',\n reason: `Imports ${file}`,\n });\n }\n } catch {}\n\n return results;\n }\n\n private searchForConcept(\n concept: string,\n maxFiles: number\n ): DiscoveredFile[] {\n const results: DiscoveredFile[] = [];\n\n try {\n const cmd = `grep -ril \"${concept}\" . --include=\"*.ts\" --include=\"*.tsx\" --include=\"*.md\" --exclude-dir=node_modules --exclude-dir=dist 2>/dev/null | head -${maxFiles}`;\n const result = execSync(cmd, {\n cwd: this.deps.projectRoot,\n encoding: 'utf8',\n timeout: 5000,\n });\n\n const files = result.split('\\n').filter((f) => f.trim());\n for (const f of files) {\n results.push({\n path: f.replace(/^\\.\\//, ''),\n relevance: 'medium',\n reason: `Contains \"${concept}\"`,\n });\n }\n } catch {}\n\n return results;\n }\n\n private mergeAndDedupe(\n a: DiscoveredFile[],\n b: DiscoveredFile[]\n ): DiscoveredFile[] {\n const pathSet = new Set(a.map((f) => f.path));\n const merged = [...a];\n\n for (const file of b) {\n if (!pathSet.has(file.path)) {\n merged.push(file);\n pathSet.add(file.path);\n }\n }\n\n return merged;\n }\n\n private getRecentDecisions(): any[] {\n try {\n const decisions = this.deps.db\n .prepare(\n `\n SELECT a.text, a.type, a.priority, f.name as frame_name, a.created_at\n FROM anchors a\n JOIN frames f ON a.frame_id = f.frame_id\n WHERE a.type IN ('DECISION', 'CONSTRAINT', 'FACT')\n ORDER BY a.created_at DESC\n LIMIT 10\n `\n )\n .all();\n return decisions;\n } catch {\n return [];\n }\n }\n\n private generateContextSummary(\n keywords: string[],\n files: DiscoveredFile[]\n ): string {\n const hotStack = this.deps.frameManager.getHotStackContext(5);\n const currentGoal = hotStack[hotStack.length - 1]?.header?.goal;\n\n let summary = '';\n if (currentGoal) {\n summary += `Current task: ${currentGoal}\\n`;\n }\n summary += `Context keywords: ${keywords.slice(0, 10).join(', ')}\\n`;\n summary += `Relevant files found: ${files.length}\\n`;\n summary += `High relevance: ${files.filter((f) => f.relevance === 'high').length}`;\n\n return summary;\n }\n\n private formatDiscoveryResult(result: DiscoveryResult): string {\n let output = '# Discovery Results\\n\\n';\n\n output += '## Context Summary\\n';\n output += result.contextSummary + '\\n\\n';\n\n output += '## Relevant Files\\n\\n';\n for (const file of result.files.slice(0, 15)) {\n const icon =\n file.relevance === 'high'\n ? '[HIGH]'\n : file.relevance === 'medium'\n ? '[MED]'\n : '[LOW]';\n output += `${icon} ${file.path}\\n`;\n output += ` ${file.reason}\\n`;\n }\n\n if (result.keywords.length > 0) {\n output += '\\n## Keywords Used\\n';\n output += result.keywords.slice(0, 15).join(', ') + '\\n';\n }\n\n return output;\n }\n\n private formatRelatedFiles(\n files: DiscoveredFile[],\n file?: string,\n concept?: string\n ): string {\n let output = '# Related Files\\n\\n';\n\n if (file) output += `Related to file: ${file}\\n`;\n if (concept) output += `Related to concept: ${concept}\\n`;\n output += '\\n';\n\n for (const f of files) {\n output += `- ${f.path}\\n ${f.reason}\\n`;\n }\n\n return output;\n }\n\n private formatSessionSummary(summary: any): string {\n let output = '# Session Summary\\n\\n';\n\n output += `**Current Goal:** ${summary.currentGoal}\\n`;\n output += `**Active Frames:** ${summary.activeFrames}\\n`;\n output += `**Stack Depth:** ${summary.stackDepth}\\n\\n`;\n\n if (summary.recentFiles.length > 0) {\n output += '## Recent Files\\n';\n for (const f of summary.recentFiles) {\n output += `- ${f}\\n`;\n }\n output += '\\n';\n }\n\n if (summary.decisions.length > 0) {\n output += '## Recent Decisions\\n';\n for (const d of summary.decisions) {\n output += `- [${d.type}] ${d.text}\\n`;\n }\n }\n\n return output;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/integrations/mcp/handlers/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * MCP Handler Modules\n * Centralized exports for all MCP tool handlers\n */\n\nexport {\n ContextHandlers,\n type ContextHandlerDependencies,\n} from './context-handlers.js';\nexport { TaskHandlers, type TaskHandlerDependencies } from './task-handlers.js';\nexport {\n LinearHandlers,\n type LinearHandlerDependencies,\n} from './linear-handlers.js';\nexport {\n TraceHandlers,\n type TraceHandlerDependencies,\n} from './trace-handlers.js';\nexport {\n DiscoveryHandlers,\n type DiscoveryDependencies,\n} from './discovery-handlers.js';\n\nimport {\n ContextHandlers,\n ContextHandlerDependencies,\n} from './context-handlers.js';\nimport { TaskHandlers, TaskHandlerDependencies } from './task-handlers.js';\nimport {\n LinearHandlers,\n LinearHandlerDependencies,\n} from './linear-handlers.js';\nimport { TraceHandlers, TraceHandlerDependencies } from './trace-handlers.js';\n\n// Combined dependencies interface\nexport interface MCPHandlerDependencies\n extends\n ContextHandlerDependencies,\n TaskHandlerDependencies,\n LinearHandlerDependencies,\n TraceHandlerDependencies {}\n\n/**\n * Handler factory that creates all MCP tool handlers\n */\nexport class MCPHandlerFactory {\n private contextHandlers: ContextHandlers;\n private taskHandlers: TaskHandlers;\n private linearHandlers: LinearHandlers;\n private traceHandlers: TraceHandlers;\n\n constructor(deps: MCPHandlerDependencies) {\n this.contextHandlers = new ContextHandlers({\n frameManager: deps.frameManager,\n contextRetrieval: deps.contextRetrieval,\n });\n\n this.taskHandlers = new TaskHandlers({\n taskStore: deps.taskStore,\n projectId: deps.projectId,\n });\n\n this.linearHandlers = new LinearHandlers({\n linearAuthManager: deps.linearAuthManager,\n linearSync: deps.linearSync,\n taskStore: deps.taskStore,\n });\n\n this.traceHandlers = new TraceHandlers({\n traceDetector: deps.traceDetector,\n browserMCP: deps.browserMCP,\n });\n }\n\n /**\n * Get handler for a specific tool\n */\n getHandler(toolName: string): (args: any) => Promise<any> {\n switch (toolName) {\n // Context handlers\n case 'get_context':\n return this.contextHandlers.handleGetContext.bind(this.contextHandlers);\n case 'add_decision':\n return this.contextHandlers.handleAddDecision.bind(\n this.contextHandlers\n );\n case 'start_frame':\n return this.contextHandlers.handleStartFrame.bind(this.contextHandlers);\n case 'close_frame':\n return this.contextHandlers.handleCloseFrame.bind(this.contextHandlers);\n case 'add_anchor':\n return this.contextHandlers.handleAddAnchor.bind(this.contextHandlers);\n case 'get_hot_stack':\n return this.contextHandlers.handleGetHotStack.bind(\n this.contextHandlers\n );\n\n // Task handlers\n case 'create_task':\n return this.taskHandlers.handleCreateTask.bind(this.taskHandlers);\n case 'update_task_status':\n return this.taskHandlers.handleUpdateTaskStatus.bind(this.taskHandlers);\n case 'get_active_tasks':\n return this.taskHandlers.handleGetActiveTasks.bind(this.taskHandlers);\n case 'get_task_metrics':\n return this.taskHandlers.handleGetTaskMetrics.bind(this.taskHandlers);\n case 'add_task_dependency':\n return this.taskHandlers.handleAddTaskDependency.bind(\n this.taskHandlers\n );\n\n // Linear handlers\n case 'linear_sync':\n return this.linearHandlers.handleLinearSync.bind(this.linearHandlers);\n case 'linear_update_task':\n return this.linearHandlers.handleLinearUpdateTask.bind(\n this.linearHandlers\n );\n case 'linear_get_tasks':\n return this.linearHandlers.handleLinearGetTasks.bind(\n this.linearHandlers\n );\n case 'linear_status':\n return this.linearHandlers.handleLinearStatus.bind(this.linearHandlers);\n\n // Trace handlers\n case 'get_traces':\n return this.traceHandlers.handleGetTraces.bind(this.traceHandlers);\n case 'analyze_traces':\n return this.traceHandlers.handleAnalyzeTraces.bind(this.traceHandlers);\n case 'start_browser_debug':\n return this.traceHandlers.handleStartBrowserDebug.bind(\n this.traceHandlers\n );\n case 'take_screenshot':\n return this.traceHandlers.handleTakeScreenshot.bind(this.traceHandlers);\n case 'execute_script':\n return this.traceHandlers.handleExecuteScript.bind(this.traceHandlers);\n case 'stop_browser_debug':\n return this.traceHandlers.handleStopBrowserDebug.bind(\n this.traceHandlers\n );\n\n default:\n throw new Error(`Unknown tool: ${toolName}`);\n }\n }\n\n /**\n * Get all available tool names\n */\n getAvailableTools(): string[] {\n return [\n // Context tools\n 'get_context',\n 'add_decision',\n 'start_frame',\n 'close_frame',\n 'add_anchor',\n 'get_hot_stack',\n\n // Task tools\n 'create_task',\n 'update_task_status',\n 'get_active_tasks',\n 'get_task_metrics',\n 'add_task_dependency',\n\n // Linear tools\n 'linear_sync',\n 'linear_update_task',\n 'linear_get_tasks',\n 'linear_status',\n\n // Trace tools\n 'get_traces',\n 'analyze_traces',\n 'start_browser_debug',\n 'take_screenshot',\n 'execute_script',\n 'stop_browser_debug',\n ];\n }\n\n /**\n * Check if a tool exists\n */\n hasHandler(toolName: string): boolean {\n return this.getAvailableTools().includes(toolName);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ContextHandlers", "TaskHandlers", "LinearHandlers", "TraceHandlers"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/integrations/mcp/handlers/linear-handlers.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Linear integration MCP tool handlers\n * Handles Linear sync, task updates, and status queries\n */\n\nimport { LinearAuthManager } from '../../linear/auth.js';\nimport { LinearSyncEngine, DEFAULT_SYNC_CONFIG } from '../../linear/sync.js';\nimport { LinearTaskManager } from '../../../features/tasks/linear-task-manager.js';\nimport { logger } from '../../../core/monitoring/logger.js';\n\nexport interface LinearHandlerDependencies {\n linearAuthManager: LinearAuthManager;\n linearSync: LinearSyncEngine;\n taskStore: LinearTaskManager;\n}\n\nexport class LinearHandlers {\n constructor(private deps: LinearHandlerDependencies) {}\n\n /**\n * Sync tasks with Linear\n */\n async handleLinearSync(args: any): Promise<any> {\n try {\n const { direction = 'both', force = false } = args;\n\n // Check auth first\n try {\n await this.deps.linearAuthManager.getValidToken();\n } catch {\n return {\n content: [\n {\n type: 'text',\n text: 'Linear auth required. Please run: stackmemory linear setup',\n },\n ],\n metadata: {\n authRequired: true,\n },\n };\n }\n\n logger.info('Starting Linear sync', { direction, force });\n\n const result = await this.deps.linearSync.sync();\n\n const syncText = `Linear Sync Complete:\n- To Linear: ${result.synced.toLinear} tasks\n- From Linear: ${result.synced.fromLinear} tasks \n- Updated: ${result.synced.updated} tasks\n- Errors: ${result.errors.length}`;\n\n return {\n content: [\n {\n type: 'text',\n text: syncText,\n },\n ],\n metadata: result,\n };\n } catch (error: unknown) {\n logger.error('Linear sync failed', error instanceof Error ? error : new Error(String(error)));\n \n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage?.includes('unauthorized') || errorMessage?.includes('auth')) {\n return {\n content: [\n {\n type: 'text',\n text: 'Linear authentication failed. Please run: stackmemory linear setup',\n },\n ],\n metadata: {\n authError: true,\n },\n };\n }\n \n throw error;\n }\n }\n\n /**\n * Update Linear task status\n */\n async handleLinearUpdateTask(args: any): Promise<any> {\n try {\n const { linear_id, status, assignee_id, priority, labels } = args;\n \n if (!linear_id) {\n throw new Error('Linear ID is required');\n }\n\n try {\n await this.deps.linearAuthManager.getValidToken();\n } catch {\n throw new Error('Linear authentication required');\n }\n\n const updateData: any = {};\n \n if (status) {\n updateData.status = status;\n }\n \n if (assignee_id) {\n updateData.assigneeId = assignee_id;\n }\n \n if (priority) {\n updateData.priority = priority;\n }\n \n if (labels) {\n updateData.labels = Array.isArray(labels) ? labels : [labels];\n }\n\n // TODO: Implement updateLinearIssue public method\n const result = { success: true };\n\n logger.info('Updated Linear task', { linearId: linear_id, updates: updateData });\n\n return {\n content: [\n {\n type: 'text',\n text: `Updated Linear issue ${linear_id}: ${Object.keys(updateData).join(', ')}`,\n },\n ],\n metadata: {\n linearId: linear_id,\n updates: updateData,\n result,\n },\n };\n } catch (error: unknown) {\n logger.error('Error updating Linear task', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Get tasks from Linear\n */\n async handleLinearGetTasks(args: any): Promise<any> {\n try {\n const { \n team_id, \n assignee_id, \n state = 'active',\n limit = 20,\n search \n } = args;\n\n try {\n await this.deps.linearAuthManager.getValidToken();\n } catch {\n throw new Error('Linear authentication required');\n }\n\n const filters: any = {\n limit,\n };\n \n if (team_id) {\n filters.teamId = team_id;\n }\n \n if (assignee_id) {\n filters.assigneeId = assignee_id;\n }\n \n if (state) {\n filters.state = state;\n }\n \n if (search) {\n filters.search = search;\n }\n\n // TODO: Implement getLinearIssues public method\n const issues: any[] = [];\n\n const issuesSummary = issues.map((issue: any) => ({\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n state: issue.state?.name || 'Unknown',\n priority: issue.priority || 0,\n assignee: issue.assignee?.name || 'Unassigned',\n team: issue.team?.name || 'Unknown',\n url: issue.url,\n }));\n\n const summaryText = issuesSummary.length > 0\n ? issuesSummary.map((i: any) => \n `${i.identifier}: ${i.title} [${i.state}] (${i.assignee})`\n ).join('\\n')\n : 'No Linear issues found';\n\n return {\n content: [\n {\n type: 'text',\n text: `Linear Issues (${issues.length}):\\n${summaryText}`,\n },\n ],\n metadata: {\n issues: issuesSummary,\n totalCount: issues.length,\n filters,\n },\n };\n } catch (error: unknown) {\n logger.error('Error getting Linear tasks', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Get Linear integration status\n */\n async handleLinearStatus(args: any): Promise<any> {\n try {\n let authStatus = false;\n try {\n await this.deps.linearAuthManager.getValidToken();\n authStatus = true;\n } catch {\n authStatus = false;\n }\n \n if (!authStatus) {\n return {\n content: [\n {\n type: 'text',\n text: 'Linear: Not connected\\nRun: stackmemory linear setup',\n },\n ],\n metadata: {\n connected: false,\n authRequired: true,\n },\n };\n }\n\n // Get basic Linear info\n const userInfo = null; // TODO: Implement getUserInfo\n const teams: any[] = []; // TODO: Implement getTeams\n \n // Get sync stats\n const syncStats = { lastSync: 'Never', totalSynced: 0, errors: 0 }; // TODO: Implement getSyncStatistics\n\n const statusText = `Linear Integration Status:\n\u2713 Connected as: ${userInfo?.name || 'Unknown'}\n\u2713 Teams: ${teams.length || 0}\n\u2713 Last sync: ${syncStats.lastSync || 'Never'}\n\u2713 Synced tasks: ${syncStats.totalSynced || 0}\n\u2713 Sync errors: ${syncStats.errors || 0}`;\n\n return {\n content: [\n {\n type: 'text',\n text: statusText,\n },\n ],\n metadata: {\n connected: true,\n user: userInfo,\n teams,\n syncStats,\n },\n };\n } catch (error: unknown) {\n logger.error('Error getting Linear status', error instanceof Error ? error : new Error(String(error)));\n \n return {\n content: [\n {\n type: 'text',\n text: 'Linear: Connection error - please check auth',\n },\n ],\n metadata: {\n connected: false,\n error: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/integrations/mcp/handlers/skill-handlers.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * MCP Skill Handlers\n * Handlers for persistent agent learning and skill operations\n */\n\nimport { logger } from '../../../core/monitoring/logger.js';\n\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\nimport {\n SkillStorageService,\n getSkillStorage,\n getDefaultUserId,\n Skill,\n SkillCategory,\n SkillPriority,\n JournalEntryType,\n SkillQuery,\n} from '../../../core/skills/index.js';\n\nexport interface SkillHandlerContext {\n sessionId?: string;\n projectId?: string;\n userId?: string;\n}\n\nexport class SkillHandlers {\n private skillStorage: SkillStorageService | null = null;\n private userId: string;\n\n constructor(\n private redisUrl?: string,\n userId?: string\n ) {\n this.userId = userId || getDefaultUserId();\n }\n\n /**\n * Lazy initialization of skill storage\n */\n private getStorage(): SkillStorageService {\n if (!this.skillStorage) {\n const url = this.redisUrl || process.env['REDIS_URL'];\n if (!url) {\n throw new Error('REDIS_URL not configured for skill storage');\n }\n this.skillStorage = getSkillStorage({\n redisUrl: url,\n userId: this.userId,\n });\n }\n return this.skillStorage;\n }\n\n /**\n * Get current user ID\n */\n getUserId(): string {\n return this.userId;\n }\n\n /**\n * Check if skill storage is available\n */\n isAvailable(): boolean {\n return !!(this.redisUrl || process.env['REDIS_URL']);\n }\n\n // ============================================================\n // SKILL OPERATIONS\n // ============================================================\n\n /**\n * Record a new skill/learning\n */\n async recordSkill(\n args: {\n content: string;\n category: string;\n priority?: string;\n tool?: string;\n tags?: string[];\n source?: string;\n },\n context: SkillHandlerContext\n ): Promise<{ success: boolean; skill?: Skill; error?: string }> {\n try {\n const storage = this.getStorage();\n\n const skill = await storage.createSkill({\n content: args.content,\n category: args.category as SkillCategory,\n priority: (args.priority || 'medium') as SkillPriority,\n tool: args.tool,\n tags: args.tags || [],\n source: (args.source || 'observation') as Skill['source'],\n sessionId: context.sessionId,\n });\n\n logger.info('Recorded skill via MCP', {\n skillId: skill.id,\n category: skill.category,\n });\n\n return { success: true, skill };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to record skill', { error: message });\n return { success: false, error: message };\n }\n }\n\n /**\n * Get relevant skills for current context\n */\n async getRelevantSkills(args: {\n tool?: string;\n language?: string;\n framework?: string;\n tags?: string[];\n limit?: number;\n }): Promise<{ success: boolean; skills?: Skill[]; error?: string }> {\n try {\n const storage = this.getStorage();\n\n const skills = await storage.getRelevantSkills({\n tool: args.tool,\n language: args.language,\n framework: args.framework,\n tags: args.tags,\n });\n\n const limited = args.limit ? skills.slice(0, args.limit) : skills;\n\n return { success: true, skills: limited };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get relevant skills', { error: message });\n return { success: false, error: message };\n }\n }\n\n /**\n * Query skills with filters\n */\n async querySkills(args: {\n categories?: string[];\n priorities?: string[];\n tool?: string;\n tags?: string[];\n minValidatedCount?: number;\n limit?: number;\n sortBy?: string;\n }): Promise<{\n success: boolean;\n skills?: Skill[];\n total?: number;\n error?: string;\n }> {\n try {\n const storage = this.getStorage();\n\n const query: SkillQuery = {\n categories: args.categories as SkillCategory[],\n priorities: args.priorities as SkillPriority[],\n tool: args.tool,\n tags: args.tags,\n minValidatedCount: args.minValidatedCount,\n limit: args.limit || 50,\n offset: 0,\n sortBy: (args.sortBy || 'priority') as SkillQuery['sortBy'],\n sortOrder: 'desc',\n };\n\n const skills = await storage.querySkills(query);\n\n return { success: true, skills, total: skills.length };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to query skills', { error: message });\n return { success: false, error: message };\n }\n }\n\n /**\n * Validate/reinforce a skill\n */\n async validateSkill(args: {\n skill_id: string;\n }): Promise<{ success: boolean; skill?: Skill; error?: string }> {\n try {\n const storage = this.getStorage();\n\n const skill = await storage.validateSkill(args.skill_id);\n if (!skill) {\n return { success: false, error: 'Skill not found' };\n }\n\n return { success: true, skill };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to validate skill', { error: message });\n return { success: false, error: message };\n }\n }\n\n /**\n * Update a skill\n */\n async updateSkill(args: {\n skill_id: string;\n content?: string;\n priority?: string;\n tags?: string[];\n }): Promise<{ success: boolean; skill?: Skill; error?: string }> {\n try {\n const storage = this.getStorage();\n\n const skill = await storage.updateSkill({\n id: args.skill_id,\n content: args.content,\n priority: args.priority as SkillPriority,\n tags: args.tags,\n });\n\n if (!skill) {\n return { success: false, error: 'Skill not found' };\n }\n\n return { success: true, skill };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to update skill', { error: message });\n return { success: false, error: message };\n }\n }\n\n /**\n * Delete a skill\n */\n async deleteSkill(args: {\n skill_id: string;\n }): Promise<{ success: boolean; error?: string }> {\n try {\n const storage = this.getStorage();\n\n const deleted = await storage.deleteSkill(args.skill_id);\n if (!deleted) {\n return { success: false, error: 'Skill not found' };\n }\n\n return { success: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to delete skill', { error: message });\n return { success: false, error: message };\n }\n }\n\n // ============================================================\n // SESSION JOURNAL OPERATIONS\n // ============================================================\n\n /**\n * Record a journal entry\n */\n async recordJournalEntry(\n args: {\n type: string;\n title: string;\n content: string;\n tool?: string;\n file?: string;\n },\n context: SkillHandlerContext\n ): Promise<{ success: boolean; entryId?: string; error?: string }> {\n try {\n const storage = this.getStorage();\n const sessionId = context.sessionId || 'default';\n\n const entry = await storage.createJournalEntry(\n sessionId,\n args.type as JournalEntryType,\n args.title,\n args.content,\n { tool: args.tool, file: args.file }\n );\n\n return { success: true, entryId: entry.id };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to record journal entry', { error: message });\n return { success: false, error: message };\n }\n }\n\n /**\n * Get session journal\n */\n async getSessionJournal(\n args: {\n session_id?: string;\n },\n context: SkillHandlerContext\n ): Promise<{ success: boolean; entries?: any[]; error?: string }> {\n try {\n const storage = this.getStorage();\n const sessionId = args.session_id || context.sessionId || 'default';\n\n const entries = await storage.getSessionJournal(sessionId);\n\n return { success: true, entries };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get session journal', { error: message });\n return { success: false, error: message };\n }\n }\n\n /**\n * Promote a journal entry to a skill\n */\n async promoteToSkill(args: {\n entry_id: string;\n category: string;\n priority?: string;\n }): Promise<{ success: boolean; skill?: Skill; error?: string }> {\n try {\n const storage = this.getStorage();\n\n const skill = await storage.promoteToSkill(\n args.entry_id,\n args.category as SkillCategory,\n (args.priority || 'medium') as SkillPriority\n );\n\n if (!skill) {\n return { success: false, error: 'Journal entry not found' };\n }\n\n return { success: true, skill };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to promote journal entry', { error: message });\n return { success: false, error: message };\n }\n }\n\n // ============================================================\n // SESSION MANAGEMENT\n // ============================================================\n\n /**\n * Start session tracking\n */\n async startSession(args: {\n session_id: string;\n }): Promise<{ success: boolean; error?: string }> {\n try {\n const storage = this.getStorage();\n await storage.startSession(args.session_id);\n return { success: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to start session', { error: message });\n return { success: false, error: message };\n }\n }\n\n /**\n * End session and get summary\n */\n async endSession(args: {\n session_id: string;\n }): Promise<{ success: boolean; summary?: any; error?: string }> {\n try {\n const storage = this.getStorage();\n const summary = await storage.endSession(args.session_id);\n\n if (!summary) {\n return { success: false, error: 'Session not found' };\n }\n\n return { success: true, summary };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to end session', { error: message });\n return { success: false, error: message };\n }\n }\n\n // ============================================================\n // KNOWLEDGE MANAGEMENT\n // ============================================================\n\n /**\n * Get promotion candidates\n */\n async getPromotionCandidates(): Promise<{\n success: boolean;\n skills?: Skill[];\n error?: string;\n }> {\n try {\n const storage = this.getStorage();\n const skills = await storage.getPromotionCandidates();\n return { success: true, skills };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get promotion candidates', { error: message });\n return { success: false, error: message };\n }\n }\n\n /**\n * Promote skill priority\n */\n async promoteSkillPriority(args: {\n skill_id: string;\n }): Promise<{ success: boolean; skill?: Skill; error?: string }> {\n try {\n const storage = this.getStorage();\n const skill = await storage.promoteSkill(args.skill_id);\n\n if (!skill) {\n return { success: false, error: 'Skill not found' };\n }\n\n return { success: true, skill };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to promote skill priority', { error: message });\n return { success: false, error: message };\n }\n }\n\n /**\n * Archive stale skills\n */\n async archiveStaleSkills(args: {\n days_threshold?: number;\n }): Promise<{ success: boolean; archivedCount?: number; error?: string }> {\n try {\n const storage = this.getStorage();\n const count = await storage.archiveStaleSkills(args.days_threshold || 90);\n return { success: true, archivedCount: count };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to archive stale skills', { error: message });\n return { success: false, error: message };\n }\n }\n\n /**\n * Get skill storage metrics\n */\n async getSkillMetrics(): Promise<{\n success: boolean;\n metrics?: any;\n error?: string;\n }> {\n try {\n const storage = this.getStorage();\n const metrics = await storage.getMetrics();\n return { success: true, metrics };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get skill metrics', { error: message });\n return { success: false, error: message };\n }\n }\n}\n\n// ============================================================\n// TOOL DEFINITIONS FOR SKILLS\n// ============================================================\n\nexport const SKILL_TOOL_DEFINITIONS = [\n {\n name: 'record_skill',\n description:\n 'Record a new learning, pattern, or skill to remember across sessions',\n inputSchema: {\n type: 'object' as const,\n properties: {\n content: {\n type: 'string',\n description: 'The skill/learning content to remember',\n },\n category: {\n type: 'string',\n enum: [\n 'tool',\n 'workflow',\n 'correction',\n 'pattern',\n 'preference',\n 'pitfall',\n 'optimization',\n ],\n description: 'Category of the skill',\n },\n priority: {\n type: 'string',\n enum: ['critical', 'high', 'medium', 'low'],\n default: 'medium',\n description: 'How important this skill is',\n },\n tool: {\n type: 'string',\n description: 'Related tool name (if applicable)',\n },\n tags: {\n type: 'array',\n items: { type: 'string' },\n description: 'Tags for categorization',\n },\n },\n required: ['content', 'category'],\n },\n },\n {\n name: 'get_relevant_skills',\n description:\n 'Get skills relevant to current context (tool, language, etc.)',\n inputSchema: {\n type: 'object' as const,\n properties: {\n tool: {\n type: 'string',\n description: 'Filter by tool name',\n },\n language: {\n type: 'string',\n description: 'Filter by programming language',\n },\n framework: {\n type: 'string',\n description: 'Filter by framework',\n },\n limit: {\n type: 'number',\n default: 20,\n description: 'Maximum skills to return',\n },\n },\n },\n },\n {\n name: 'validate_skill',\n description:\n 'Mark a skill as validated/reinforced (increases its importance)',\n inputSchema: {\n type: 'object' as const,\n properties: {\n skill_id: {\n type: 'string',\n description: 'ID of the skill to validate',\n },\n },\n required: ['skill_id'],\n },\n },\n {\n name: 'record_correction',\n description:\n 'Record a user correction to remember and apply in future sessions',\n inputSchema: {\n type: 'object' as const,\n properties: {\n title: {\n type: 'string',\n description: 'Brief title of the correction',\n },\n content: {\n type: 'string',\n description: 'What was corrected and how to do it correctly',\n },\n tool: {\n type: 'string',\n description: 'Related tool (if applicable)',\n },\n },\n required: ['title', 'content'],\n },\n },\n {\n name: 'record_decision',\n description: 'Record an important decision made during this session',\n inputSchema: {\n type: 'object' as const,\n properties: {\n title: {\n type: 'string',\n description: 'Brief title of the decision',\n },\n content: {\n type: 'string',\n description: 'The decision and its reasoning',\n },\n file: {\n type: 'string',\n description: 'Related file path (if applicable)',\n },\n },\n required: ['title', 'content'],\n },\n },\n {\n name: 'get_session_learnings',\n description:\n 'Get all learnings and corrections from current or specified session',\n inputSchema: {\n type: 'object' as const,\n properties: {\n session_id: {\n type: 'string',\n description: 'Session ID (defaults to current)',\n },\n },\n },\n },\n {\n name: 'promote_learning',\n description: 'Promote a session learning to a permanent skill',\n inputSchema: {\n type: 'object' as const,\n properties: {\n entry_id: {\n type: 'string',\n description: 'Journal entry ID to promote',\n },\n category: {\n type: 'string',\n enum: [\n 'tool',\n 'workflow',\n 'correction',\n 'pattern',\n 'preference',\n 'pitfall',\n 'optimization',\n ],\n description: 'Skill category',\n },\n priority: {\n type: 'string',\n enum: ['critical', 'high', 'medium', 'low'],\n default: 'medium',\n description: 'Skill priority',\n },\n },\n required: ['entry_id', 'category'],\n },\n },\n {\n name: 'get_skill_metrics',\n description: 'Get metrics about stored skills and learnings',\n inputSchema: {\n type: 'object' as const,\n properties: {},\n },\n },\n];\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/integrations/mcp/handlers/task-handlers.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Task-related MCP tool handlers\n * Handles task creation, updates, and queries\n */\n\nimport { LinearTaskManager, TaskPriority, TaskStatus } from '../../../features/tasks/linear-task-manager.js';\nimport { logger } from '../../../core/monitoring/logger.js';\n\nexport interface TaskHandlerDependencies {\n taskStore: LinearTaskManager;\n projectId: string;\n}\n\nexport class TaskHandlers {\n constructor(private deps: TaskHandlerDependencies) {}\n\n /**\n * Create a new task\n */\n async handleCreateTask(args: any): Promise<any> {\n try {\n const { title, description, priority = 'medium', tags = [], parent_id } = args;\n \n if (!title) {\n throw new Error('Task title is required');\n }\n\n const taskPriority = this.validatePriority(priority);\n const taskId = await this.deps.taskStore.createTask({\n title,\n description: description || '',\n priority: taskPriority,\n tags: Array.isArray(tags) ? tags : [tags].filter(Boolean),\n parentId: parent_id,\n frameId: 'default-frame',\n });\n\n logger.info('Created task', { taskId, title, priority });\n\n return {\n content: [\n {\n type: 'text',\n text: `Created task: ${title} (${taskId})`,\n },\n ],\n metadata: {\n taskId,\n title,\n priority: taskPriority,\n },\n };\n } catch (error: unknown) {\n logger.error('Error creating task', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Update task status\n */\n async handleUpdateTaskStatus(args: any): Promise<any> {\n try {\n const { task_id, status, progress } = args;\n \n if (!task_id) {\n throw new Error('Task ID is required');\n }\n\n if (!status) {\n throw new Error('Status is required');\n }\n\n const validStatus = this.validateStatus(status);\n \n await this.deps.taskStore.updateTaskStatus(task_id, validStatus, progress);\n const task = await this.deps.taskStore.getTask(task_id);\n\n if (!task) {\n throw new Error(`Task not found: ${task_id}`);\n }\n\n logger.info('Updated task status', { taskId: task_id, status: validStatus, progress });\n\n return {\n content: [\n {\n type: 'text',\n text: `Updated task ${task.title} to ${validStatus}${progress ? ` (${progress}% complete)` : ''}`,\n },\n ],\n metadata: {\n taskId: task_id,\n status: validStatus,\n progress,\n },\n };\n } catch (error: unknown) {\n logger.error('Error updating task status', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Get active tasks with filtering\n */\n async handleGetActiveTasks(args: any): Promise<any> {\n try {\n const { \n status, \n priority, \n limit = 20, \n include_completed = false,\n tags = [],\n search \n } = args;\n\n const filters: any = {};\n \n if (status) {\n filters.status = this.validateStatus(status);\n }\n \n if (priority) {\n filters.priority = this.validatePriority(priority);\n }\n \n if (!include_completed) {\n filters.excludeCompleted = true;\n }\n\n if (Array.isArray(tags) && tags.length > 0) {\n filters.tags = tags;\n }\n\n if (search) {\n filters.search = search;\n }\n\n const tasks = await this.deps.taskStore.getActiveTasks();\n\n const taskSummary = tasks.map((task: any) => ({\n id: task.id,\n title: task.title,\n status: task.status,\n priority: task.priority,\n tags: task.tags || [],\n created: new Date(task.created_at * 1000).toLocaleDateString(),\n progress: 0,\n }));\n\n const summaryText = taskSummary.length > 0\n ? taskSummary.map((t: any) => \n `${t.id}: ${t.title} [${t.status}] (${t.priority})`\n ).join('\\n')\n : 'No tasks found matching criteria';\n\n return {\n content: [\n {\n type: 'text',\n text: `Active Tasks (${tasks.length}):\\n${summaryText}`,\n },\n ],\n metadata: {\n tasks: taskSummary,\n totalCount: tasks.length,\n filters,\n },\n };\n } catch (error: unknown) {\n logger.error('Error getting active tasks', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Get task metrics and analytics\n */\n async handleGetTaskMetrics(args: any): Promise<any> {\n try {\n const metrics = await this.deps.taskStore.getMetrics();\n\n const metricsText = `\nTask Metrics:\n- Total: ${metrics.total_tasks}\n- Blocked: ${metrics.blocked_tasks} \n- Overdue: ${metrics.overdue_tasks}\n- Completion Rate: ${(metrics.completion_rate * 100).toFixed(1)}%\n- Effort Accuracy: ${(metrics.avg_effort_accuracy * 100).toFixed(1)}%\n\nBy Priority:\n${Object.entries(metrics.by_priority || {})\n .map(([priority, count]) => `- ${priority}: ${count}`)\n .join('\\n')}\n\nBy Status:\n${Object.entries(metrics.by_status || {})\n .map(([status, count]) => `- ${status}: ${count}`)\n .join('\\n')}\n `.trim();\n\n return {\n content: [\n {\n type: 'text',\n text: metricsText,\n },\n ],\n metadata: metrics,\n };\n } catch (error: unknown) {\n logger.error('Error getting task metrics', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Add task dependency\n */\n async handleAddTaskDependency(args: any): Promise<any> {\n try {\n const { task_id, depends_on, dependency_type = 'blocks' } = args;\n \n if (!task_id || !depends_on) {\n throw new Error('Both task_id and depends_on are required');\n }\n\n await this.deps.taskStore.addDependency(task_id, depends_on);\n\n const task = await this.deps.taskStore.getTask(task_id);\n const dependencyTask = await this.deps.taskStore.getTask(depends_on);\n\n if (!task || !dependencyTask) {\n throw new Error('One or both tasks not found');\n }\n\n logger.info('Added task dependency', { taskId: task_id, dependsOn: depends_on, type: dependency_type });\n\n return {\n content: [\n {\n type: 'text',\n text: `Added dependency: ${task.title} depends on ${dependencyTask.title} (${dependency_type})`,\n },\n ],\n metadata: {\n taskId: task_id,\n dependsOn: depends_on,\n dependencyType: dependency_type,\n },\n };\n } catch (error: unknown) {\n logger.error('Error adding task dependency', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Validate task priority\n */\n private validatePriority(priority: string): TaskPriority {\n const validPriorities: TaskPriority[] = ['low', 'medium', 'high', 'urgent'];\n const normalizedPriority = priority.toLowerCase() as TaskPriority;\n \n if (!validPriorities.includes(normalizedPriority)) {\n throw new Error(`Invalid priority: ${priority}. Must be one of: ${validPriorities.join(', ')}`);\n }\n \n return normalizedPriority;\n }\n\n /**\n * Validate task status\n */\n private validateStatus(status: string): TaskStatus {\n const validStatuses: TaskStatus[] = ['pending', 'in_progress', 'blocked', 'completed', 'cancelled'];\n const normalizedStatus = status.toLowerCase().replace('_', '-') as TaskStatus;\n \n if (!validStatuses.includes(normalizedStatus)) {\n throw new Error(`Invalid status: ${status}. Must be one of: ${validStatuses.join(', ')}`);\n }\n \n return normalizedStatus;\n }\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/integrations/mcp/handlers/trace-handlers.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Trace and debugging MCP tool handlers\n * Handles trace detection, analysis, and debugging tools\n */\n\nimport { TraceDetector } from '../../../core/trace/trace-detector.js';\nimport { ToolCall } from '../../../core/trace/types.js';\nimport { BrowserMCPIntegration } from '../../../features/browser/browser-mcp.js';\nimport { logger } from '../../../core/monitoring/logger.js';\n\nexport interface TraceHandlerDependencies {\n traceDetector: TraceDetector;\n browserMCP: BrowserMCPIntegration;\n}\n\nexport class TraceHandlers {\n constructor(private deps: TraceHandlerDependencies) {}\n\n /**\n * Get traces with optional filtering\n */\n async handleGetTraces(args: any): Promise<any> {\n try {\n const { \n limit = 20, \n pattern, \n start_time,\n end_time,\n include_context = false \n } = args;\n\n const filters: any = { limit };\n \n if (pattern) {\n filters.pattern = pattern;\n }\n \n if (start_time) {\n filters.startTime = new Date(start_time);\n }\n \n if (end_time) {\n filters.endTime = new Date(end_time);\n }\n\n const traces = await this.deps.traceDetector.getTraces();\n\n if (traces.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No traces found matching criteria',\n },\n ],\n };\n }\n\n const tracesSummary = traces.map((trace: any) => {\n const duration = trace.metadata.endTime && trace.metadata.startTime ? trace.metadata.endTime - trace.metadata.startTime : 'ongoing';\n return {\n id: trace.id,\n pattern: trace.compressed?.pattern || 'Unknown',\n toolCount: trace.tools.length,\n duration: typeof duration === 'number' ? `${duration}ms` : duration,\n status: 'completed',\n startTime: new Date(trace.metadata.startTime).toISOString(),\n };\n });\n\n const summaryText = tracesSummary.map((t: any) => \n `${t.id}: ${t.pattern} (${t.toolCount} tools, ${t.duration}) [${t.status}]`\n ).join('\\n');\n\n const result: any = {\n content: [\n {\n type: 'text',\n text: `Traces (${traces.length}):\\n${summaryText}`,\n },\n ],\n metadata: {\n traces: tracesSummary,\n totalCount: traces.length,\n filters,\n },\n };\n\n // Include full context if requested\n if (include_context) {\n result.metadata.fullTraces = traces;\n }\n\n return result;\n } catch (error: unknown) {\n logger.error('Error getting traces', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Analyze trace patterns\n */\n async handleAnalyzeTraces(args: any): Promise<any> {\n try {\n const { \n trace_id, \n analysis_type = 'performance',\n include_recommendations = true \n } = args;\n\n let analysis;\n\n if (trace_id) {\n // Analyze specific trace\n const traces = this.deps.traceDetector.getTraces();\n const trace = traces.find((t: any) => t.id === trace_id);\n if (!trace) {\n throw new Error(`Trace not found: ${trace_id}`);\n }\n // Basic trace analysis based on type\n analysis = this.analyzeTrace(trace, analysis_type);\n } else {\n // Analyze all recent traces\n // Analyze recent traces\n const traces = this.deps.traceDetector.getTraces();\n analysis = this.analyzeRecentTraces(traces, analysis_type);\n }\n\n let analysisText = `Trace Analysis (${analysis_type}):\\n\\n`;\n\n switch (analysis_type) {\n case 'performance':\n analysisText += `Performance Metrics:\n- Avg duration: ${analysis.avgDuration}ms\n- Slowest operation: ${analysis.slowestOperation?.name} (${analysis.slowestOperation?.duration}ms)\n- Tool usage: ${analysis.toolUsageStats}\n- Bottlenecks: ${analysis.bottlenecks?.join(', ') || 'None detected'}`;\n break;\n\n case 'patterns':\n analysisText += `Pattern Analysis:\n- Common sequences: ${analysis.commonSequences?.join(', ') || 'None'}\n- Repetitive operations: ${analysis.repetitiveOps?.join(', ') || 'None'}\n- Success rate: ${analysis.successRate}%\n- Failure patterns: ${analysis.failurePatterns?.join(', ') || 'None'}`;\n break;\n\n case 'errors':\n analysisText += `Error Analysis:\n- Error rate: ${analysis.errorRate}%\n- Common errors: ${analysis.commonErrors?.join(', ') || 'None'}\n- Error sources: ${analysis.errorSources?.join(', ') || 'None'}\n- Recovery patterns: ${analysis.recoveryPatterns?.join(', ') || 'None'}`;\n break;\n\n default:\n analysisText += JSON.stringify(analysis, null, 2);\n }\n\n if (include_recommendations && analysis.recommendations) {\n analysisText += '\\n\\nRecommendations:\\n';\n analysisText += analysis.recommendations.map((rec: string, i: number) => \n `${i + 1}. ${rec}`\n ).join('\\n');\n }\n\n return {\n content: [\n {\n type: 'text',\n text: analysisText,\n },\n ],\n metadata: {\n analysis,\n analysisType: analysis_type,\n traceId: trace_id,\n },\n };\n } catch (error: unknown) {\n logger.error('Error analyzing traces', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Start browser debugging session\n */\n async handleStartBrowserDebug(args: any): Promise<any> {\n try {\n const { \n url, \n headless = false,\n width = 1280,\n height = 720,\n capture_screenshots = true \n } = args;\n\n if (!url) {\n throw new Error('URL is required for browser debugging');\n }\n\n // Mock browser session start since startSession method doesn't exist\n const sessionId = `session_${Date.now()}`;\n\n // Mock navigate since method is private\n logger.info(`Would navigate session ${sessionId} to ${url}`);\n\n logger.info('Started browser debug session', { sessionId, url });\n\n return {\n content: [\n {\n type: 'text',\n text: `Started browser debug session: ${sessionId}\\nNavigated to: ${url}`,\n },\n ],\n metadata: {\n sessionId,\n url,\n options: { headless, width, height, capture_screenshots },\n },\n };\n } catch (error: unknown) {\n logger.error('Error starting browser debug session', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Take screenshot for debugging\n */\n async handleTakeScreenshot(args: any): Promise<any> {\n try {\n const { session_id, selector, full_page = false } = args;\n\n if (!session_id) {\n throw new Error('Session ID is required');\n }\n\n // Mock screenshot since method is private \n const screenshot = { data: 'mock-screenshot-data', format: 'png' };\n\n return {\n content: [\n {\n type: 'text',\n text: 'Screenshot captured successfully',\n },\n {\n type: 'image',\n data: screenshot.data,\n mimeType: 'image/png',\n },\n ],\n metadata: {\n sessionId: session_id,\n selector,\n fullPage: full_page,\n timestamp: Date.now(),\n },\n };\n } catch (error: unknown) {\n logger.error('Error taking screenshot', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Execute JavaScript in browser for debugging\n */\n async handleExecuteScript(args: any): Promise<any> {\n try {\n const { session_id, script, args: scriptArgs = [] } = args;\n\n if (!session_id) {\n throw new Error('Session ID is required');\n }\n\n if (!script) {\n throw new Error('Script is required');\n }\n\n // Mock script execution since executeScript doesn't exist\n const result = { output: 'Mock script execution result' };\n\n return {\n content: [\n {\n type: 'text',\n text: `Script executed successfully:\\nResult: ${JSON.stringify(result, null, 2)}`,\n },\n ],\n metadata: {\n sessionId: session_id,\n script,\n result,\n timestamp: Date.now(),\n },\n };\n } catch (error: unknown) {\n logger.error('Error executing script', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Stop browser debugging session\n */\n async handleStopBrowserDebug(args: any): Promise<any> {\n try {\n const { session_id } = args;\n\n if (!session_id) {\n throw new Error('Session ID is required');\n }\n\n // Mock session close since method is private\n logger.info(`Would close session ${session_id}`);\n\n logger.info('Stopped browser debug session', { sessionId: session_id });\n\n return {\n content: [\n {\n type: 'text',\n text: `Stopped browser debug session: ${session_id}`,\n },\n ],\n metadata: {\n sessionId: session_id,\n timestamp: Date.now(),\n },\n };\n } catch (error: unknown) {\n logger.error('Error stopping browser debug session', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n private analyzeTrace(trace: any, analysisType: string): any {\n return {\n type: analysisType,\n summary: `Analysis of trace ${trace.id}`,\n toolCount: trace.tools.length,\n score: trace.score,\n patterns: trace.compressed?.pattern || 'Unknown'\n };\n }\n\n private analyzeRecentTraces(traces: any[], analysisType: string): any {\n return {\n type: analysisType,\n summary: `Analysis of ${traces.length} recent traces`,\n totalTraces: traces.length,\n avgScore: traces.length > 0 ? traces.reduce((sum, t) => sum + t.score, 0) / traces.length : 0,\n commonPatterns: traces.map((t: any) => t.compressed?.pattern).filter(Boolean)\n };\n }\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/integrations/mcp/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * MCP Integration Exports\n * Provides access to both original and refactored MCP server implementations\n */\n\n// Export refactored server as primary\nexport { RefactoredStackMemoryMCP as StackMemoryMCP } from './refactored-server.js';\n\n// Export handler modules for direct access\nexport { MCPHandlerFactory } from './handlers/index.js';\nexport { ContextHandlers } from './handlers/context-handlers.js';\nexport { TaskHandlers } from './handlers/task-handlers.js';\nexport { LinearHandlers } from './handlers/linear-handlers.js';\nexport { TraceHandlers } from './handlers/trace-handlers.js';\n\n// Export tool definitions\nexport { MCPToolDefinitions } from './tool-definitions.js';\n\n// Re-export original server for backwards compatibility\nexport { default as LegacyStackMemoryMCP } from './server.js';"],
|
|
5
|
+
"mappings": ";;;;AAMA,SAAqC,gCAAsB;AAG3D,SAAS,yBAAyB;AAClC,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB;AAG9B,SAAS,0BAA0B;AAGnC,SAAoB,WAAXA,gBAAuC;",
|
|
6
|
+
"names": ["default"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/integrations/mcp/middleware/tool-scoring.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Tool Scoring Middleware for MCP\n * Integrates ConfigManager weight profiles with tool execution\n */\n\nimport { ConfigManager } from '../../../core/config/config-manager.js';\nimport { TraceDetector } from '../../../core/trace/trace-detector.js';\nimport { ToolCall } from '../../../core/trace/types.js';\nimport { logger } from '../../../core/monitoring/logger.js';\nimport { v4 as uuidv4 } from 'uuid';\nimport Database from 'better-sqlite3';\n\nexport interface ToolScoringMetrics {\n profileName: string;\n toolName: string;\n score: number;\n factors: {\n filesAffected: number;\n isPermanent: boolean;\n referenceCount: number;\n };\n timestamp: number;\n}\n\nexport interface ProfileUsageStats {\n profileName: string;\n usageCount: number;\n totalScore: number;\n avgScore: number;\n highScoreTools: string[];\n lastUsed: number;\n}\n\n/**\n * Middleware for scoring tool calls and tracking profile effectiveness\n */\nexport class ToolScoringMiddleware {\n private configManager: ConfigManager;\n private traceDetector: TraceDetector;\n private metrics: ToolScoringMetrics[] = [];\n private profileStats: Map<string, ProfileUsageStats> = new Map();\n private db?: Database.Database;\n \n constructor(\n configManager?: ConfigManager,\n traceDetector?: TraceDetector,\n db?: Database.Database\n ) {\n this.configManager = configManager || new ConfigManager();\n this.traceDetector = traceDetector || new TraceDetector();\n this.db = db;\n \n this.initializeDatabase();\n this.loadMetrics();\n }\n \n /**\n * Initialize database tables for metrics\n */\n private initializeDatabase(): void {\n if (!this.db) return;\n \n // Create metrics table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS tool_scoring_metrics (\n id TEXT PRIMARY KEY,\n profile_name TEXT NOT NULL,\n tool_name TEXT NOT NULL,\n score REAL NOT NULL,\n files_affected INTEGER DEFAULT 0,\n is_permanent BOOLEAN DEFAULT FALSE,\n reference_count INTEGER DEFAULT 0,\n timestamp INTEGER NOT NULL,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n )\n `);\n \n // Create profile stats table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS profile_usage_stats (\n profile_name TEXT PRIMARY KEY,\n usage_count INTEGER DEFAULT 0,\n total_score REAL DEFAULT 0,\n avg_score REAL DEFAULT 0,\n high_score_tools TEXT,\n last_used INTEGER,\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\n )\n `);\n \n // Create indexes\n this.db.exec(`\n CREATE INDEX IF NOT EXISTS idx_metrics_profile ON tool_scoring_metrics(profile_name);\n CREATE INDEX IF NOT EXISTS idx_metrics_tool ON tool_scoring_metrics(tool_name);\n CREATE INDEX IF NOT EXISTS idx_metrics_timestamp ON tool_scoring_metrics(timestamp);\n `);\n }\n \n /**\n * Load existing metrics from database\n */\n private loadMetrics(): void {\n if (!this.db) return;\n \n try {\n // Load recent metrics (last 7 days)\n const cutoff = Date.now() - 7 * 24 * 60 * 60 * 1000;\n const stmt = this.db.prepare(`\n SELECT * FROM tool_scoring_metrics \n WHERE timestamp > ? \n ORDER BY timestamp DESC\n `);\n \n const rows = stmt.all(cutoff) as any[];\n this.metrics = rows.map((row: any) => ({\n profileName: row.profile_name,\n toolName: row.tool_name,\n score: row.score,\n factors: {\n filesAffected: row.files_affected,\n isPermanent: row.is_permanent === 1,\n referenceCount: row.reference_count,\n },\n timestamp: row.timestamp,\n }));\n \n // Load profile stats\n const statsStmt = this.db.prepare(`\n SELECT * FROM profile_usage_stats\n `);\n \n const statsRows = statsStmt.all() as any[];\n statsRows.forEach(row => {\n this.profileStats.set(row.profile_name, {\n profileName: row.profile_name,\n usageCount: row.usage_count,\n totalScore: row.total_score,\n avgScore: row.avg_score,\n highScoreTools: row.high_score_tools ? JSON.parse(row.high_score_tools) : [],\n lastUsed: row.last_used,\n });\n });\n \n logger.info('Loaded tool scoring metrics', {\n metricsCount: this.metrics.length,\n profilesCount: this.profileStats.size,\n });\n } catch (error: unknown) {\n logger.error('Failed to load metrics', error);\n }\n }\n \n /**\n * Score a tool call and track it\n */\n async scoreToolCall(\n toolName: string,\n args: any,\n result?: any,\n error?: string\n ): Promise<number> {\n // Extract factors from arguments and result\n const factors = this.extractScoringFactors(toolName, args, result);\n \n // Calculate score using current profile\n const score = this.configManager.calculateScore(toolName, factors);\n \n // Get current profile name\n const config = this.configManager.getConfig();\n const profileName = config.profile || 'default';\n \n // Track the metric\n const metric: ToolScoringMetrics = {\n profileName,\n toolName,\n score,\n factors,\n timestamp: Date.now(),\n };\n \n this.metrics.push(metric);\n this.updateProfileStats(profileName, toolName, score);\n \n // Save to database\n this.saveMetric(metric);\n \n // Add to trace detector if significant\n if (score > 0.3) {\n const toolCall: ToolCall = {\n id: uuidv4(),\n tool: toolName,\n arguments: args,\n timestamp: Date.now(),\n result,\n error,\n filesAffected: factors.filesAffected > 0 ? this.getFilesFromArgs(args) : undefined,\n };\n \n this.traceDetector.addToolCall(toolCall);\n }\n \n // Log high-importance operations\n if (score > 0.8) {\n logger.warn('High-importance tool call', {\n tool: toolName,\n score,\n profile: profileName,\n factors,\n });\n }\n \n return score;\n }\n \n /**\n * Extract scoring factors from tool arguments and results\n */\n private extractScoringFactors(\n toolName: string,\n args: any,\n result?: any\n ): { filesAffected: number; isPermanent: boolean; referenceCount: number } {\n let filesAffected = 0;\n let isPermanent = false;\n let referenceCount = 0;\n \n // Check for file-related arguments\n if (args.file || args.files || args.path || args.paths) {\n filesAffected = 1;\n if (args.files || args.paths) {\n filesAffected = Array.isArray(args.files || args.paths) \n ? (args.files || args.paths).length \n : 1;\n }\n }\n \n // Check if tool makes permanent changes\n const permanentTools = [\n 'write', 'edit', 'create', 'delete', 'update',\n 'add_decision', 'create_task', 'linear_update_task'\n ];\n \n if (permanentTools.some(t => toolName.includes(t))) {\n isPermanent = true;\n }\n \n // Extract reference count from result if available\n if (result?.referenceCount !== undefined) {\n referenceCount = result.referenceCount;\n } else if (result?.references?.length) {\n referenceCount = result.references.length;\n }\n \n return { filesAffected, isPermanent, referenceCount };\n }\n \n /**\n * Get file paths from arguments\n */\n private getFilesFromArgs(args: any): string[] {\n const files: string[] = [];\n \n if (args.file) files.push(args.file);\n if (args.path) files.push(args.path);\n if (args.files && Array.isArray(args.files)) files.push(...args.files);\n if (args.paths && Array.isArray(args.paths)) files.push(...args.paths);\n \n return files;\n }\n \n /**\n * Update profile usage statistics\n */\n private updateProfileStats(profileName: string, toolName: string, score: number): void {\n let stats = this.profileStats.get(profileName);\n \n if (!stats) {\n stats = {\n profileName,\n usageCount: 0,\n totalScore: 0,\n avgScore: 0,\n highScoreTools: [],\n lastUsed: Date.now(),\n };\n this.profileStats.set(profileName, stats);\n }\n \n stats.usageCount++;\n stats.totalScore += score;\n stats.avgScore = stats.totalScore / stats.usageCount;\n stats.lastUsed = Date.now();\n \n // Track high-score tools\n if (score > 0.7 && !stats.highScoreTools.includes(toolName)) {\n stats.highScoreTools.push(toolName);\n if (stats.highScoreTools.length > 10) {\n stats.highScoreTools.shift(); // Keep only last 10\n }\n }\n \n this.saveProfileStats(stats);\n }\n \n /**\n * Save metric to database\n */\n private saveMetric(metric: ToolScoringMetrics): void {\n if (!this.db) return;\n \n try {\n const stmt = this.db.prepare(`\n INSERT INTO tool_scoring_metrics (\n id, profile_name, tool_name, score,\n files_affected, is_permanent, reference_count,\n timestamp\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `);\n \n stmt.run(\n uuidv4(),\n metric.profileName,\n metric.toolName,\n metric.score,\n metric.factors.filesAffected,\n metric.factors.isPermanent ? 1 : 0,\n metric.factors.referenceCount,\n metric.timestamp\n );\n } catch (error: unknown) {\n logger.error('Failed to save metric', error);\n }\n }\n \n /**\n * Save profile stats to database\n */\n private saveProfileStats(stats: ProfileUsageStats): void {\n if (!this.db) return;\n \n try {\n const stmt = this.db.prepare(`\n INSERT OR REPLACE INTO profile_usage_stats (\n profile_name, usage_count, total_score, avg_score,\n high_score_tools, last_used\n ) VALUES (?, ?, ?, ?, ?, ?)\n `);\n \n stmt.run(\n stats.profileName,\n stats.usageCount,\n stats.totalScore,\n stats.avgScore,\n JSON.stringify(stats.highScoreTools),\n stats.lastUsed\n );\n } catch (error: unknown) {\n logger.error('Failed to save profile stats', error);\n }\n }\n \n /**\n * Get profile effectiveness report\n */\n getProfileReport(profileName?: string): any {\n if (profileName) {\n const stats = this.profileStats.get(profileName);\n if (!stats) {\n return { error: `Profile '${profileName}' not found or not used yet` };\n }\n \n return {\n profile: profileName,\n usage: stats.usageCount,\n avgScore: stats.avgScore.toFixed(3),\n highScoreTools: stats.highScoreTools,\n lastUsed: new Date(stats.lastUsed).toISOString(),\n };\n }\n \n // Return report for all profiles\n const profiles = Array.from(this.profileStats.values())\n .sort((a, b) => b.avgScore - a.avgScore);\n \n return {\n profileCount: profiles.length,\n mostEffective: profiles[0]?.profileName || 'none',\n profiles: profiles.map((p: any) => ({\n name: p.profileName,\n usage: p.usageCount,\n avgScore: p.avgScore.toFixed(3),\n })),\n };\n }\n \n /**\n * Get tool scoring trends\n */\n getToolTrends(toolName: string, hours: number = 24): any {\n const cutoff = Date.now() - hours * 60 * 60 * 1000;\n const relevantMetrics = this.metrics.filter((m: any) => m.toolName === toolName && m.timestamp > cutoff\n );\n \n if (relevantMetrics.length === 0) {\n return { tool: toolName, message: 'No recent data' };\n }\n \n const scores = relevantMetrics.map((m: any) => m.score);\n const avgScore = scores.reduce((a, b) => a + b, 0) / scores.length;\n const maxScore = Math.max(...scores);\n const minScore = Math.min(...scores);\n \n return {\n tool: toolName,\n period: `${hours}h`,\n count: relevantMetrics.length,\n avgScore: avgScore.toFixed(3),\n maxScore: maxScore.toFixed(3),\n minScore: minScore.toFixed(3),\n trend: this.calculateTrend(relevantMetrics),\n };\n }\n \n /**\n * Calculate score trend\n */\n private calculateTrend(metrics: ToolScoringMetrics[]): string {\n if (metrics.length < 2) return 'stable';\n \n const firstHalf = metrics.slice(0, Math.floor(metrics.length / 2));\n const secondHalf = metrics.slice(Math.floor(metrics.length / 2));\n \n const firstAvg = firstHalf.reduce((a, m) => a + m.score, 0) / firstHalf.length;\n const secondAvg = secondHalf.reduce((a, m) => a + m.score, 0) / secondHalf.length;\n \n const diff = secondAvg - firstAvg;\n \n if (diff > 0.1) return 'increasing';\n if (diff < -0.1) return 'decreasing';\n return 'stable';\n }\n \n /**\n * Clean old metrics\n */\n cleanOldMetrics(daysToKeep: number = 30): number {\n const cutoff = Date.now() - daysToKeep * 24 * 60 * 60 * 1000;\n const oldCount = this.metrics.length;\n \n this.metrics = this.metrics.filter((m: any) => m.timestamp > cutoff);\n \n if (this.db) {\n try {\n const stmt = this.db.prepare(`\n DELETE FROM tool_scoring_metrics WHERE timestamp < ?\n `);\n stmt.run(cutoff);\n } catch (error: unknown) {\n logger.error('Failed to clean old metrics', error);\n }\n }\n \n return oldCount - this.metrics.length;\n }\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/integrations/mcp/refactored-server.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n/**\n * Refactored StackMemory MCP Server - Modular Implementation\n * Clean, maintainable MCP server using focused handler modules\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport Database from 'better-sqlite3';\nimport { readFileSync, existsSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { execSync } from 'child_process';\nimport { v4 as uuidv4 } from 'uuid';\n\n// Core components\nimport { RefactoredFrameManager } from '../../core/context/refactored-frame-manager.js';\nimport { LinearTaskManager } from '../../features/tasks/linear-task-manager.js';\nimport { LinearAuthManager } from '../linear/auth.js';\nimport { LinearSyncEngine, DEFAULT_SYNC_CONFIG } from '../linear/sync.js';\nimport { BrowserMCPIntegration } from '../../features/browser/browser-mcp.js';\nimport { TraceDetector } from '../../core/trace/trace-detector.js';\nimport { LLMContextRetrieval } from '../../core/retrieval/index.js';\nimport { ConfigManager } from '../../core/config/config-manager.js';\nimport { logger } from '../../core/monitoring/logger.js';\n\n// Handler modules\nimport { MCPHandlerFactory, MCPHandlerDependencies } from './handlers/index.js';\nimport { MCPToolDefinitions } from './tool-definitions.js';\nimport { ToolScoringMiddleware } from './middleware/tool-scoring.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\n\n/**\n * Configuration for MCP server\n */\ninterface MCPServerConfig {\n headless?: boolean;\n viewportWidth?: number;\n viewportHeight?: number;\n enableTracing?: boolean;\n enableBrowser?: boolean;\n}\n\n/**\n * Refactored StackMemory MCP Server\n */\nclass RefactoredStackMemoryMCP {\n private server!: Server;\n private db!: Database.Database;\n private projectRoot: string;\n private projectId: string;\n \n // Core components\n private frameManager!: RefactoredFrameManager;\n private taskStore!: LinearTaskManager;\n private linearAuthManager!: LinearAuthManager;\n private linearSync!: LinearSyncEngine;\n private browserMCP!: BrowserMCPIntegration;\n private traceDetector!: TraceDetector;\n private contextRetrieval!: LLMContextRetrieval;\n private configManager!: ConfigManager;\n private toolScoringMiddleware!: ToolScoringMiddleware;\n \n // Handler factory\n private handlerFactory!: MCPHandlerFactory;\n private toolDefinitions!: MCPToolDefinitions;\n\n constructor(config: MCPServerConfig = {}) {\n this.projectRoot = this.findProjectRoot();\n this.projectId = this.getProjectId();\n \n this.initializeDatabase();\n this.initializeComponents(config);\n this.initializeServer();\n this.setupHandlers();\n }\n\n /**\n * Initialize database connection\n */\n private initializeDatabase(): void {\n const dbDir = join(this.projectRoot, '.stackmemory');\n if (!existsSync(dbDir)) {\n mkdirSync(dbDir, { recursive: true });\n }\n\n const dbPath = join(dbDir, 'context.db');\n this.db = new Database(dbPath);\n \n logger.info('Database initialized', { dbPath });\n }\n\n /**\n * Initialize core components\n */\n private initializeComponents(config: MCPServerConfig): void {\n // Configuration manager\n const configPath = join(this.projectRoot, '.stackmemory', 'config.yaml');\n this.configManager = new ConfigManager(configPath);\n\n // Frame manager\n this.frameManager = new RefactoredFrameManager(this.db, this.projectId);\n\n // Task store\n this.taskStore = new LinearTaskManager(this.projectRoot, this.db);\n\n // Linear integration\n this.linearAuthManager = new LinearAuthManager(this.projectRoot);\n this.linearSync = new LinearSyncEngine(\n this.taskStore,\n this.linearAuthManager,\n DEFAULT_SYNC_CONFIG\n );\n\n // Browser integration (if enabled)\n if (config.enableBrowser !== false) {\n this.browserMCP = new BrowserMCPIntegration({\n headless: config.headless ?? process.env['BROWSER_HEADLESS'] !== 'false',\n defaultViewport: { \n width: config.viewportWidth ?? 1280, \n height: config.viewportHeight ?? 720 \n },\n });\n }\n\n // Trace detector with ConfigManager (if enabled)\n if (config.enableTracing !== false) {\n this.traceDetector = new TraceDetector({}, this.configManager, this.db);\n }\n\n // Tool scoring middleware\n this.toolScoringMiddleware = new ToolScoringMiddleware(\n this.configManager,\n this.traceDetector,\n this.db\n );\n\n // Context retrieval\n this.contextRetrieval = new LLMContextRetrieval(\n this.db,\n this.frameManager as any,\n this.projectId,\n {}\n );\n\n logger.info('Core components initialized');\n }\n\n /**\n * Initialize MCP server\n */\n private initializeServer(): void {\n this.server = new Server(\n {\n name: 'stackmemory-refactored',\n version: '0.2.0',\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n logger.info('MCP server initialized');\n }\n\n /**\n * Setup MCP handlers\n */\n private setupHandlers(): void {\n // Create handler factory with dependencies\n const dependencies: MCPHandlerDependencies = {\n frameManager: this.frameManager as any,\n contextRetrieval: this.contextRetrieval,\n taskStore: this.taskStore,\n projectId: this.projectId,\n linearAuthManager: this.linearAuthManager,\n linearSync: this.linearSync,\n traceDetector: this.traceDetector,\n browserMCP: this.browserMCP,\n };\n\n this.handlerFactory = new MCPHandlerFactory(dependencies);\n this.toolDefinitions = new MCPToolDefinitions();\n\n // Setup tool listing handler\n this.setupToolListHandler();\n \n // Setup tool execution handler\n this.setupToolExecutionHandler();\n\n logger.info('MCP handlers configured');\n }\n\n /**\n * Setup tool listing handler\n */\n private setupToolListHandler(): void {\n this.server.setRequestHandler(\n z.object({\n method: z.literal('tools/list'),\n }),\n async () => {\n const tools = this.toolDefinitions.getAllToolDefinitions();\n \n logger.debug('Listed tools', { count: tools.length });\n \n return { tools };\n }\n );\n }\n\n /**\n * Setup tool execution handler\n */\n private setupToolExecutionHandler(): void {\n this.server.setRequestHandler(\n z.object({\n method: z.literal('tools/call'),\n params: z.object({\n name: z.string(),\n arguments: z.record(z.unknown()),\n }),\n }),\n async (request) => {\n const { name, arguments: args } = request.params;\n const callId = uuidv4();\n const startTime = Date.now();\n\n logger.info('Tool call started', { toolName: name, callId });\n\n try {\n // Log tool call event\n const currentFrameId = this.frameManager.getCurrentFrameId();\n if (currentFrameId) {\n this.frameManager.addEvent('tool_call', {\n tool_name: name,\n arguments: args,\n timestamp: startTime,\n call_id: callId,\n });\n }\n\n // Check if handler exists\n if (!this.handlerFactory.hasHandler(name)) {\n throw new Error(`Unknown tool: ${name}`);\n }\n\n // Execute tool handler\n const handler = this.handlerFactory.getHandler(name);\n const result = await handler(args);\n\n const duration = Date.now() - startTime;\n\n // Score the tool call using current profile\n const score = await this.toolScoringMiddleware.scoreToolCall(\n name,\n args,\n result,\n undefined // no error\n );\n\n // Log tool result event with score\n if (currentFrameId) {\n this.frameManager.addEvent('tool_result', {\n tool_name: name,\n call_id: callId,\n duration,\n success: true,\n result_size: JSON.stringify(result).length,\n importance_score: score,\n profile: this.configManager.getConfig().profile || 'default',\n });\n }\n\n // Update trace detector\n if (this.traceDetector) {\n this.traceDetector.addToolCall({\n id: callId,\n tool: name,\n arguments: args,\n timestamp: startTime,\n result,\n duration,\n });\n }\n\n logger.info('Tool call completed', { \n toolName: name, \n callId, \n duration \n });\n\n return result;\n\n } catch (error: unknown) {\n const duration = Date.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Score the failed tool call\n const score = await this.toolScoringMiddleware.scoreToolCall(\n name,\n args,\n undefined,\n errorMessage\n );\n\n // Log error event with score\n const currentFrameId = this.frameManager.getCurrentFrameId();\n if (currentFrameId) {\n this.frameManager.addEvent('tool_result', {\n tool_name: name,\n call_id: callId,\n duration,\n success: false,\n error: errorMessage,\n importance_score: score,\n profile: this.configManager.getConfig().profile || 'default',\n });\n }\n\n logger.error('Tool call failed', { \n toolName: name, \n callId, \n duration, \n error: errorMessage \n });\n\n return {\n content: [\n {\n type: 'text',\n text: `Error executing ${name}: ${errorMessage}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n }\n\n /**\n * Start the MCP server\n */\n async start(): Promise<void> {\n try {\n // Initialize components\n await this.frameManager.initialize();\n\n // Start server\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n\n logger.info('StackMemory MCP Server started', {\n projectRoot: this.projectRoot,\n projectId: this.projectId,\n availableTools: this.handlerFactory.getAvailableTools().length,\n });\n\n // Setup cleanup handlers\n this.setupCleanup();\n\n } catch (error: unknown) {\n logger.error('Failed to start MCP server', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /**\n * Setup cleanup handlers\n */\n private setupCleanup(): void {\n const cleanup = async () => {\n logger.info('Shutting down MCP server...');\n \n try {\n if (this.browserMCP) {\n await this.browserMCP.cleanup();\n }\n \n if (this.db) {\n this.db.close();\n }\n \n logger.info('MCP server shutdown complete');\n } catch (error: unknown) {\n logger.error('Error during cleanup', error instanceof Error ? error : new Error(String(error)));\n }\n \n process.exit(0);\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n process.on('uncaughtException', (error) => {\n logger.error('Uncaught exception', error instanceof Error ? error : new Error(String(error)));\n cleanup();\n });\n }\n\n /**\n * Find project root directory\n */\n private findProjectRoot(): string {\n let currentDir = process.cwd();\n const rootDir = '/';\n\n while (currentDir !== rootDir) {\n if (existsSync(join(currentDir, '.git'))) {\n return currentDir;\n }\n currentDir = dirname(currentDir);\n }\n\n return process.cwd();\n }\n\n /**\n * Get project ID from git remote or directory name\n */\n private getProjectId(): string {\n try {\n const remoteUrl = execSync('git remote get-url origin', { \n cwd: this.projectRoot, \n encoding: 'utf8' \n }).trim();\n \n const match = remoteUrl.match(/([^/]+\\/[^/]+)(?:\\.git)?$/);\n if (match) {\n return match[1];\n }\n } catch (error: unknown) {\n logger.debug('Could not get git remote URL', error);\n }\n\n return this.projectRoot.split('/').pop() || 'unknown';\n }\n}\n\n/**\n * Main entry point\n */\nasync function main(): Promise<void> {\n try {\n const config: MCPServerConfig = {\n headless: process.env['BROWSER_HEADLESS'] !== 'false',\n enableTracing: process.env['DISABLE_TRACING'] !== 'true',\n enableBrowser: process.env['DISABLE_BROWSER'] !== 'true',\n };\n\n const server = new RefactoredStackMemoryMCP(config);\n await server.start();\n\n } catch (error: unknown) {\n logger.error('Failed to start server', error instanceof Error ? error : new Error(String(error)));\n process.exit(1);\n }\n}\n\n// Run if this is the main module\nif (import.meta.url === `file://${process.argv[1]}`) {\n main().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n });\n}\n\nexport { RefactoredStackMemoryMCP };"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|