@stackmemoryai/stackmemory 0.2.9 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/core/agent-task-manager.js +512 -0
- package/dist/agents/core/agent-task-manager.js.map +7 -0
- package/dist/agents/verifiers/base-verifier.js +129 -0
- package/dist/agents/verifiers/base-verifier.js.map +7 -0
- package/dist/agents/verifiers/formatter-verifier.js +126 -0
- package/dist/agents/verifiers/formatter-verifier.js.map +7 -0
- package/dist/agents/verifiers/llm-judge.js +248 -0
- package/dist/agents/verifiers/llm-judge.js.map +7 -0
- package/dist/cli/__tests__/index.test.js +290 -0
- package/dist/cli/__tests__/index.test.js.map +7 -0
- package/dist/cli/auto-detect.js +317 -0
- package/dist/cli/auto-detect.js.map +7 -0
- package/dist/cli/browser-test.js +29 -0
- package/dist/cli/browser-test.js.map +7 -0
- package/dist/cli/claude-sm.js +369 -0
- package/dist/cli/claude-sm.js.map +7 -0
- package/dist/cli/codex-sm.js +283 -0
- package/dist/cli/codex-sm.js.map +7 -0
- package/dist/cli/commands/agent.js +286 -0
- package/dist/cli/commands/agent.js.map +7 -0
- package/dist/cli/commands/config.js +199 -0
- package/dist/cli/commands/config.js.map +7 -0
- package/dist/cli/commands/context.js +327 -0
- package/dist/cli/commands/context.js.map +7 -0
- package/dist/cli/commands/handoff.js +191 -0
- package/dist/cli/commands/handoff.js.map +7 -0
- package/dist/cli/commands/linear-test.js +115 -0
- package/dist/cli/commands/linear-test.js.map +7 -0
- package/dist/cli/commands/linear.js +378 -0
- package/dist/cli/commands/linear.js.map +7 -0
- package/dist/cli/commands/log.js +165 -0
- package/dist/cli/commands/log.js.map +7 -0
- package/dist/cli/commands/onboard.js +349 -0
- package/dist/cli/commands/onboard.js.map +7 -0
- package/dist/cli/commands/projects.js +195 -0
- package/dist/cli/commands/projects.js.map +7 -0
- package/dist/cli/commands/search.js +152 -0
- package/dist/cli/commands/search.js.map +7 -0
- package/dist/cli/commands/session.js +179 -0
- package/dist/cli/commands/session.js.map +7 -0
- package/dist/cli/commands/tasks.js +205 -0
- package/dist/cli/commands/tasks.js.map +7 -0
- package/dist/cli/commands/webhook.js +131 -0
- package/dist/cli/commands/webhook.js.map +7 -0
- package/dist/cli/commands/worktree.js +276 -0
- package/dist/cli/commands/worktree.js.map +7 -0
- package/dist/cli/index.js +953 -0
- package/dist/cli/index.js.map +7 -0
- package/dist/cli/utils/viewer.js +92 -0
- package/dist/cli/utils/viewer.js.map +7 -0
- package/dist/core/config/__tests__/config-manager.test.js +248 -0
- package/dist/core/config/__tests__/config-manager.test.js.map +7 -0
- package/dist/core/config/config-manager.js +368 -0
- package/dist/core/config/config-manager.js.map +7 -0
- package/dist/core/config/types.js +140 -0
- package/dist/core/config/types.js.map +7 -0
- package/dist/core/context/__tests__/frame-manager.test.js +879 -0
- package/dist/core/context/__tests__/frame-manager.test.js.map +7 -0
- package/dist/core/context/auto-context.js +72 -0
- package/dist/core/context/auto-context.js.map +7 -0
- package/dist/core/context/compaction-handler.js +326 -0
- package/dist/core/context/compaction-handler.js.map +7 -0
- package/dist/core/context/frame-database.js +376 -0
- package/dist/core/context/frame-database.js.map +7 -0
- package/dist/core/context/frame-digest.js +239 -0
- package/dist/core/context/frame-digest.js.map +7 -0
- package/dist/core/context/frame-manager.js +682 -0
- package/dist/core/context/frame-manager.js.map +7 -0
- package/dist/core/context/frame-stack.js +270 -0
- package/dist/core/context/frame-stack.js.map +7 -0
- package/dist/core/context/frame-types.js +1 -0
- package/dist/core/context/frame-types.js.map +7 -0
- package/dist/core/context/index.js +33 -0
- package/dist/core/context/index.js.map +7 -0
- package/dist/core/context/model-aware-compaction.js +619 -0
- package/dist/core/context/model-aware-compaction.js.map +7 -0
- package/dist/core/context/refactored-frame-manager.js +393 -0
- package/dist/core/context/refactored-frame-manager.js.map +7 -0
- package/dist/core/database/batch-operations.js +329 -0
- package/dist/core/database/batch-operations.js.map +7 -0
- package/dist/core/database/connection-pool.js +224 -0
- package/dist/core/database/connection-pool.js.map +7 -0
- package/dist/core/database/query-cache.js +284 -0
- package/dist/core/database/query-cache.js.map +7 -0
- package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js +379 -0
- package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js.map +7 -0
- package/dist/core/digest/__tests__/frame-digest-integration.test.js +230 -0
- package/dist/core/digest/__tests__/frame-digest-integration.test.js.map +7 -0
- package/dist/core/digest/enhanced-hybrid-digest.js +267 -0
- package/dist/core/digest/enhanced-hybrid-digest.js.map +7 -0
- package/dist/core/digest/frame-digest-integration.js +172 -0
- package/dist/core/digest/frame-digest-integration.js.map +7 -0
- package/dist/core/digest/hybrid-digest-generator.js +549 -0
- package/dist/core/digest/hybrid-digest-generator.js.map +7 -0
- package/dist/core/digest/index.js +5 -0
- package/dist/core/digest/index.js.map +7 -0
- package/dist/core/digest/types.js +21 -0
- package/dist/core/digest/types.js.map +7 -0
- package/dist/core/errors/__tests__/error-handling.test.js +270 -0
- package/dist/core/errors/__tests__/error-handling.test.js.map +7 -0
- package/dist/core/errors/index.js +239 -0
- package/dist/core/errors/index.js.map +7 -0
- package/dist/core/errors/recovery.js +258 -0
- package/dist/core/errors/recovery.js.map +7 -0
- package/dist/core/merge/__tests__/conflict-scenarios.test.js +414 -0
- package/dist/core/merge/__tests__/conflict-scenarios.test.js.map +7 -0
- package/dist/core/merge/conflict-detector.js +424 -0
- package/dist/core/merge/conflict-detector.js.map +7 -0
- package/dist/core/merge/index.js +5 -0
- package/dist/core/merge/index.js.map +7 -0
- package/dist/core/merge/resolution-engine.js +565 -0
- package/dist/core/merge/resolution-engine.js.map +7 -0
- package/dist/core/merge/stack-diff.js +528 -0
- package/dist/core/merge/stack-diff.js.map +7 -0
- package/dist/core/merge/types.js +1 -0
- package/dist/core/merge/types.js.map +7 -0
- package/dist/core/monitoring/error-handler.js +278 -0
- package/dist/core/monitoring/error-handler.js.map +7 -0
- package/dist/core/monitoring/logger.js +115 -0
- package/dist/core/monitoring/logger.js.map +7 -0
- package/dist/core/monitoring/metrics.js +157 -0
- package/dist/core/monitoring/metrics.js.map +7 -0
- package/dist/core/monitoring/progress-tracker.js +174 -0
- package/dist/core/monitoring/progress-tracker.js.map +7 -0
- package/dist/core/performance/context-cache.js +269 -0
- package/dist/core/performance/context-cache.js.map +7 -0
- package/dist/core/performance/index.js +7 -0
- package/dist/core/performance/index.js.map +7 -0
- package/dist/core/performance/lazy-context-loader.js +319 -0
- package/dist/core/performance/lazy-context-loader.js.map +7 -0
- package/dist/core/performance/monitor.js +217 -0
- package/dist/core/performance/monitor.js.map +7 -0
- package/dist/core/performance/optimized-frame-context.js +326 -0
- package/dist/core/performance/optimized-frame-context.js.map +7 -0
- package/dist/core/performance/performance-benchmark.js +269 -0
- package/dist/core/performance/performance-benchmark.js.map +7 -0
- package/dist/core/performance/performance-profiler.js +318 -0
- package/dist/core/performance/performance-profiler.js.map +7 -0
- package/dist/core/performance/streaming-jsonl-parser.js +187 -0
- package/dist/core/performance/streaming-jsonl-parser.js.map +7 -0
- package/dist/core/persistence/postgres-adapter.js +345 -0
- package/dist/core/persistence/postgres-adapter.js.map +7 -0
- package/dist/core/projects/project-manager.js +699 -0
- package/dist/core/projects/project-manager.js.map +7 -0
- package/dist/core/query/__tests__/query-parser.test.js +301 -0
- package/dist/core/query/__tests__/query-parser.test.js.map +7 -0
- package/dist/core/query/__tests__/query-templates.test.js +210 -0
- package/dist/core/query/__tests__/query-templates.test.js.map +7 -0
- package/dist/core/query/query-parser.js +366 -0
- package/dist/core/query/query-parser.js.map +7 -0
- package/dist/core/query/query-templates.js +317 -0
- package/dist/core/query/query-templates.js.map +7 -0
- package/dist/core/retrieval/index.js +4 -0
- package/dist/core/retrieval/index.js.map +7 -0
- package/dist/core/retrieval/llm-context-retrieval.js +577 -0
- package/dist/core/retrieval/llm-context-retrieval.js.map +7 -0
- package/dist/core/retrieval/summary-generator.js +585 -0
- package/dist/core/retrieval/summary-generator.js.map +7 -0
- package/dist/core/retrieval/types.js +17 -0
- package/dist/core/retrieval/types.js.map +7 -0
- package/dist/core/session/index.js +11 -0
- package/dist/core/session/index.js.map +7 -0
- package/dist/core/session/session-manager.js +297 -0
- package/dist/core/session/session-manager.js.map +7 -0
- package/dist/core/trace/cli-trace-wrapper.js +110 -0
- package/dist/core/trace/cli-trace-wrapper.js.map +7 -0
- package/dist/core/trace/db-trace-wrapper.js +215 -0
- package/dist/core/trace/db-trace-wrapper.js.map +7 -0
- package/dist/core/trace/debug-trace.js +385 -0
- package/dist/core/trace/debug-trace.js.map +7 -0
- package/dist/core/trace/index.js +158 -0
- package/dist/core/trace/index.js.map +7 -0
- package/dist/core/trace/linear-api-wrapper.js +169 -0
- package/dist/core/trace/linear-api-wrapper.js.map +7 -0
- package/dist/core/trace/trace-demo.js +135 -0
- package/dist/core/trace/trace-demo.js.map +7 -0
- package/dist/core/trace/trace-detector.demo.js +138 -0
- package/dist/core/trace/trace-detector.demo.js.map +7 -0
- package/dist/core/trace/trace-detector.js +386 -0
- package/dist/core/trace/trace-detector.js.map +7 -0
- package/dist/core/trace/trace-detector.test.js +401 -0
- package/dist/core/trace/trace-detector.test.js.map +7 -0
- package/dist/core/trace/trace-store.js +341 -0
- package/dist/core/trace/trace-store.js.map +7 -0
- package/dist/core/trace/types.js +73 -0
- package/dist/core/trace/types.js.map +7 -0
- package/dist/core/types.js +1 -0
- package/dist/core/types.js.map +7 -0
- package/dist/core/utils/update-checker.js +214 -0
- package/dist/core/utils/update-checker.js.map +7 -0
- package/dist/core/worktree/worktree-manager.js +450 -0
- package/dist/core/worktree/worktree-manager.js.map +7 -0
- package/dist/features/analytics/api/analytics-api.js +283 -0
- package/dist/features/analytics/api/analytics-api.js.map +7 -0
- package/dist/features/analytics/core/analytics-service.js +267 -0
- package/dist/features/analytics/core/analytics-service.js.map +7 -0
- package/dist/features/analytics/index.js +14 -0
- package/dist/features/analytics/index.js.map +7 -0
- package/dist/features/analytics/queries/metrics-queries.js +273 -0
- package/dist/features/analytics/queries/metrics-queries.js.map +7 -0
- package/dist/features/analytics/types/metrics.js +1 -0
- package/dist/features/analytics/types/metrics.js.map +7 -0
- package/dist/features/browser/browser-mcp.js +488 -0
- package/dist/features/browser/browser-mcp.js.map +7 -0
- package/dist/features/tasks/__tests__/pebbles-task-store.test.js +747 -0
- package/dist/features/tasks/__tests__/pebbles-task-store.test.js.map +7 -0
- package/dist/features/tasks/pebbles-task-store.js +647 -0
- package/dist/features/tasks/pebbles-task-store.js.map +7 -0
- package/dist/features/tasks/task-aware-context.js +406 -0
- package/dist/features/tasks/task-aware-context.js.map +7 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +7 -0
- package/dist/integrations/linear/__tests__/auth.test.js +558 -0
- package/dist/integrations/linear/__tests__/auth.test.js.map +7 -0
- package/dist/integrations/linear/__tests__/sync-service.test.js +760 -0
- package/dist/integrations/linear/__tests__/sync-service.test.js.map +7 -0
- package/dist/integrations/linear/auth.js +308 -0
- package/dist/integrations/linear/auth.js.map +7 -0
- package/dist/integrations/linear/auto-sync.js +244 -0
- package/dist/integrations/linear/auto-sync.js.map +7 -0
- package/dist/integrations/linear/client.js +448 -0
- package/dist/integrations/linear/client.js.map +7 -0
- package/dist/integrations/linear/config.js +115 -0
- package/dist/integrations/linear/config.js.map +7 -0
- package/dist/integrations/linear/sync-manager.js +233 -0
- package/dist/integrations/linear/sync-manager.js.map +7 -0
- package/dist/integrations/linear/sync-service.js +214 -0
- package/dist/integrations/linear/sync-service.js.map +7 -0
- package/dist/integrations/linear/sync.js +565 -0
- package/dist/integrations/linear/sync.js.map +7 -0
- package/dist/integrations/linear/types.js +1 -0
- package/dist/integrations/linear/types.js.map +7 -0
- package/dist/integrations/linear/webhook-server.js +204 -0
- package/dist/integrations/linear/webhook-server.js.map +7 -0
- package/dist/integrations/linear/webhook.js +269 -0
- package/dist/integrations/linear/webhook.js.map +7 -0
- package/dist/integrations/mcp/__tests__/server.test.js +798 -0
- package/dist/integrations/mcp/__tests__/server.test.js.map +7 -0
- package/dist/integrations/mcp/handlers/context-handlers.js +253 -0
- package/dist/integrations/mcp/handlers/context-handlers.js.map +7 -0
- package/dist/integrations/mcp/handlers/index.js +134 -0
- package/dist/integrations/mcp/handlers/index.js.map +7 -0
- package/dist/integrations/mcp/handlers/linear-handlers.js +243 -0
- package/dist/integrations/mcp/handlers/linear-handlers.js.map +7 -0
- package/dist/integrations/mcp/handlers/task-handlers.js +235 -0
- package/dist/integrations/mcp/handlers/task-handlers.js.map +7 -0
- package/dist/integrations/mcp/handlers/trace-handlers.js +304 -0
- package/dist/integrations/mcp/handlers/trace-handlers.js.map +7 -0
- package/dist/integrations/mcp/index.js +19 -0
- package/dist/integrations/mcp/index.js.map +7 -0
- package/dist/integrations/mcp/refactored-server.js +331 -0
- package/dist/integrations/mcp/refactored-server.js.map +7 -0
- package/dist/integrations/mcp/server.js +1621 -0
- package/dist/integrations/mcp/server.js.map +7 -0
- package/dist/integrations/mcp/tool-definitions.js +562 -0
- package/dist/integrations/mcp/tool-definitions.js.map +7 -0
- package/dist/integrations/mcp/trace-test.js +44 -0
- package/dist/integrations/mcp/trace-test.js.map +7 -0
- package/dist/integrations/pg-aiguide/embedding-provider.js +174 -0
- package/dist/integrations/pg-aiguide/embedding-provider.js.map +7 -0
- package/dist/integrations/pg-aiguide/semantic-search.js +183 -0
- package/dist/integrations/pg-aiguide/semantic-search.js.map +7 -0
- package/dist/integrations/pg-aiguide/timescale-analytics.js +220 -0
- package/dist/integrations/pg-aiguide/timescale-analytics.js.map +7 -0
- package/dist/mcp/stackmemory-mcp-server.js +550 -0
- package/dist/mcp/stackmemory-mcp-server.js.map +7 -0
- package/dist/middleware/exponential-rate-limiter.js +285 -0
- package/dist/middleware/exponential-rate-limiter.js.map +7 -0
- package/dist/models/user.model.js +351 -0
- package/dist/models/user.model.js.map +7 -0
- package/dist/scripts/benchmark-performance.d.ts +7 -0
- package/dist/scripts/benchmark-performance.d.ts.map +1 -0
- package/dist/scripts/benchmark-performance.js +44 -0
- package/dist/scripts/benchmark-performance.js.map +1 -0
- package/dist/scripts/cleanup-duplicate-tasks.d.ts +12 -0
- package/dist/scripts/cleanup-duplicate-tasks.d.ts.map +1 -0
- package/dist/scripts/cleanup-duplicate-tasks.js +215 -0
- package/dist/scripts/cleanup-duplicate-tasks.js.map +1 -0
- package/dist/servers/production/auth-middleware.js +513 -0
- package/dist/servers/production/auth-middleware.js.map +7 -0
- package/dist/servers/railway/index.js +390 -0
- package/dist/servers/railway/index.js.map +7 -0
- package/dist/services/config-service.js +62 -0
- package/dist/services/config-service.js.map +7 -0
- package/dist/services/context-service.js +191 -0
- package/dist/services/context-service.js.map +7 -0
- package/dist/src/agents/core/agent-task-manager.d.ts +154 -0
- package/dist/src/agents/core/agent-task-manager.d.ts.map +1 -0
- package/dist/src/agents/core/agent-task-manager.js +504 -0
- package/dist/src/agents/core/agent-task-manager.js.map +1 -0
- package/dist/src/agents/verifiers/base-verifier.d.ts +112 -0
- package/dist/src/agents/verifiers/base-verifier.d.ts.map +1 -0
- package/dist/src/agents/verifiers/base-verifier.js +130 -0
- package/dist/src/agents/verifiers/base-verifier.js.map +1 -0
- package/dist/src/agents/verifiers/formatter-verifier.d.ts +14 -0
- package/dist/src/agents/verifiers/formatter-verifier.d.ts.map +1 -0
- package/dist/src/agents/verifiers/formatter-verifier.js +107 -0
- package/dist/src/agents/verifiers/formatter-verifier.js.map +1 -0
- package/dist/src/agents/verifiers/llm-judge.d.ts +46 -0
- package/dist/src/agents/verifiers/llm-judge.d.ts.map +1 -0
- package/dist/src/agents/verifiers/llm-judge.js +248 -0
- package/dist/src/agents/verifiers/llm-judge.js.map +1 -0
- package/dist/src/cli/claude-sm.js +55 -0
- package/dist/src/cli/claude-sm.js.map +1 -1
- package/dist/src/cli/commands/agent.d.ts +9 -0
- package/dist/src/cli/commands/agent.d.ts.map +1 -0
- package/dist/src/cli/commands/agent.js +303 -0
- package/dist/src/cli/commands/agent.js.map +1 -0
- package/dist/src/cli/commands/handoff.d.ts +6 -0
- package/dist/src/cli/commands/handoff.d.ts.map +1 -0
- package/dist/src/cli/commands/handoff.js +212 -0
- package/dist/src/cli/commands/handoff.js.map +1 -0
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +4 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/core/context/frame-database.d.ts +59 -0
- package/dist/src/core/context/frame-database.d.ts.map +1 -0
- package/dist/src/core/context/frame-database.js +333 -0
- package/dist/src/core/context/frame-database.js.map +1 -0
- package/dist/src/core/context/frame-digest.d.ts +59 -0
- package/dist/src/core/context/frame-digest.d.ts.map +1 -0
- package/dist/src/core/context/frame-digest.js +264 -0
- package/dist/src/core/context/frame-digest.js.map +1 -0
- package/dist/src/core/context/frame-manager.d.ts +2 -0
- package/dist/src/core/context/frame-manager.d.ts.map +1 -1
- package/dist/src/core/context/frame-manager.js +7 -0
- package/dist/src/core/context/frame-manager.js.map +1 -1
- package/dist/src/core/context/frame-stack.d.ts +85 -0
- package/dist/src/core/context/frame-stack.d.ts.map +1 -0
- package/dist/src/core/context/frame-stack.js +287 -0
- package/dist/src/core/context/frame-stack.js.map +1 -0
- package/dist/src/core/context/frame-types.d.ts +67 -0
- package/dist/src/core/context/frame-types.d.ts.map +1 -0
- package/dist/src/core/context/frame-types.js +6 -0
- package/dist/src/core/context/frame-types.js.map +1 -0
- package/dist/src/core/context/index.d.ts +11 -0
- package/dist/src/core/context/index.d.ts.map +1 -0
- package/dist/src/core/context/index.js +14 -0
- package/dist/src/core/context/index.js.map +1 -0
- package/dist/src/core/context/refactored-frame-manager.d.ts +99 -0
- package/dist/src/core/context/refactored-frame-manager.d.ts.map +1 -0
- package/dist/src/core/context/refactored-frame-manager.js +340 -0
- package/dist/src/core/context/refactored-frame-manager.js.map +1 -0
- package/dist/src/core/database/batch-operations.d.ts +118 -0
- package/dist/src/core/database/batch-operations.d.ts.map +1 -0
- package/dist/src/core/database/batch-operations.js +339 -0
- package/dist/src/core/database/batch-operations.js.map +1 -0
- package/dist/src/core/database/connection-pool.d.ts +79 -0
- package/dist/src/core/database/connection-pool.d.ts.map +1 -0
- package/dist/src/core/database/connection-pool.js +236 -0
- package/dist/src/core/database/connection-pool.js.map +1 -0
- package/dist/src/core/database/query-cache.d.ts +135 -0
- package/dist/src/core/database/query-cache.d.ts.map +1 -0
- package/dist/src/core/database/query-cache.js +294 -0
- package/dist/src/core/database/query-cache.js.map +1 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.d.ts +125 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.d.ts.map +1 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js +282 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js.map +1 -0
- package/dist/src/core/digest/frame-digest-integration.d.ts +67 -0
- package/dist/src/core/digest/frame-digest-integration.d.ts.map +1 -0
- package/dist/src/core/digest/frame-digest-integration.js +198 -0
- package/dist/src/core/digest/frame-digest-integration.js.map +1 -0
- package/dist/src/core/digest/hybrid-digest-generator.d.ts +3 -3
- package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +1 -1
- package/dist/src/core/digest/hybrid-digest-generator.js.map +1 -1
- package/dist/src/core/digest/index.d.ts +3 -1
- package/dist/src/core/digest/index.d.ts.map +1 -1
- package/dist/src/core/digest/index.js +3 -1
- package/dist/src/core/digest/index.js.map +1 -1
- package/dist/src/core/errors/index.d.ts +13 -5
- package/dist/src/core/errors/index.d.ts.map +1 -1
- package/dist/src/core/errors/index.js +13 -5
- package/dist/src/core/errors/index.js.map +1 -1
- package/dist/src/core/merge/conflict-detector.d.ts +122 -0
- package/dist/src/core/merge/conflict-detector.d.ts.map +1 -0
- package/dist/src/core/merge/conflict-detector.js +468 -0
- package/dist/src/core/merge/conflict-detector.js.map +1 -0
- package/dist/src/core/merge/index.d.ts +9 -0
- package/dist/src/core/merge/index.d.ts.map +1 -0
- package/dist/src/core/merge/index.js +9 -0
- package/dist/src/core/merge/index.js.map +1 -0
- package/dist/src/core/merge/resolution-engine.d.ts +120 -0
- package/dist/src/core/merge/resolution-engine.d.ts.map +1 -0
- package/dist/src/core/merge/resolution-engine.js +573 -0
- package/dist/src/core/merge/resolution-engine.js.map +1 -0
- package/dist/src/core/merge/stack-diff.d.ts +97 -0
- package/dist/src/core/merge/stack-diff.d.ts.map +1 -0
- package/dist/src/core/merge/stack-diff.js +516 -0
- package/dist/src/core/merge/stack-diff.js.map +1 -0
- package/dist/src/core/merge/types.d.ts +110 -0
- package/dist/src/core/merge/types.d.ts.map +1 -0
- package/dist/src/core/merge/types.js +6 -0
- package/dist/src/core/merge/types.js.map +1 -0
- package/dist/src/core/performance/context-cache.d.ts +109 -0
- package/dist/src/core/performance/context-cache.d.ts.map +1 -0
- package/dist/src/core/performance/context-cache.js +280 -0
- package/dist/src/core/performance/context-cache.js.map +1 -0
- package/dist/src/core/performance/index.d.ts +3 -0
- package/dist/src/core/performance/index.d.ts.map +1 -0
- package/dist/src/core/performance/index.js +3 -0
- package/dist/src/core/performance/index.js.map +1 -0
- package/dist/src/core/performance/lazy-context-loader.d.ts +93 -0
- package/dist/src/core/performance/lazy-context-loader.d.ts.map +1 -0
- package/dist/src/core/performance/lazy-context-loader.js +332 -0
- package/dist/src/core/performance/lazy-context-loader.js.map +1 -0
- package/dist/src/core/performance/monitor.d.ts +48 -0
- package/dist/src/core/performance/monitor.d.ts.map +1 -0
- package/dist/src/core/performance/monitor.js +226 -0
- package/dist/src/core/performance/monitor.js.map +1 -0
- package/dist/src/core/performance/optimized-frame-context.d.ts +74 -0
- package/dist/src/core/performance/optimized-frame-context.d.ts.map +1 -0
- package/dist/src/core/performance/optimized-frame-context.js +330 -0
- package/dist/src/core/performance/optimized-frame-context.js.map +1 -0
- package/dist/src/core/performance/performance-benchmark.d.ts +50 -0
- package/dist/src/core/performance/performance-benchmark.d.ts.map +1 -0
- package/dist/src/core/performance/performance-benchmark.js +290 -0
- package/dist/src/core/performance/performance-benchmark.js.map +1 -0
- package/dist/src/core/performance/performance-profiler.d.ts +151 -0
- package/dist/src/core/performance/performance-profiler.d.ts.map +1 -0
- package/dist/src/core/performance/performance-profiler.js +346 -0
- package/dist/src/core/performance/performance-profiler.js.map +1 -0
- package/dist/src/core/performance/streaming-jsonl-parser.d.ts +41 -0
- package/dist/src/core/performance/streaming-jsonl-parser.d.ts.map +1 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js +193 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js.map +1 -0
- package/dist/src/core/persistence/postgres-adapter.d.ts.map +1 -1
- package/dist/src/core/persistence/postgres-adapter.js +18 -4
- package/dist/src/core/persistence/postgres-adapter.js.map +1 -1
- package/dist/src/core/query/query-parser.d.ts +5 -0
- package/dist/src/core/query/query-parser.d.ts.map +1 -1
- package/dist/src/core/query/query-parser.js +86 -18
- package/dist/src/core/query/query-parser.js.map +1 -1
- package/dist/src/core/query/query-templates.d.ts +44 -0
- package/dist/src/core/query/query-templates.d.ts.map +1 -0
- package/dist/src/core/query/query-templates.js +326 -0
- package/dist/src/core/query/query-templates.js.map +1 -0
- package/dist/src/core/retrieval/llm-context-retrieval.d.ts +5 -3
- package/dist/src/core/retrieval/llm-context-retrieval.d.ts.map +1 -1
- package/dist/src/core/retrieval/llm-context-retrieval.js +73 -21
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +1 -1
- package/dist/src/core/trace/cli-trace-wrapper.d.ts +23 -0
- package/dist/src/core/trace/cli-trace-wrapper.d.ts.map +1 -0
- package/dist/src/core/trace/cli-trace-wrapper.js +141 -0
- package/dist/src/core/trace/cli-trace-wrapper.js.map +1 -0
- package/dist/src/core/trace/db-trace-wrapper.d.ts +36 -0
- package/dist/src/core/trace/db-trace-wrapper.d.ts.map +1 -0
- package/dist/src/core/trace/db-trace-wrapper.js +252 -0
- package/dist/src/core/trace/db-trace-wrapper.js.map +1 -0
- package/dist/src/core/trace/debug-trace.d.ts +84 -0
- package/dist/src/core/trace/debug-trace.d.ts.map +1 -0
- package/dist/src/core/trace/debug-trace.js +402 -0
- package/dist/src/core/trace/debug-trace.js.map +1 -0
- package/dist/src/core/trace/error-test.d.ts +6 -0
- package/dist/src/core/trace/error-test.d.ts.map +1 -0
- package/dist/src/core/trace/error-test.js +128 -0
- package/dist/src/core/trace/error-test.js.map +1 -0
- package/dist/src/core/trace/index.d.ts +25 -0
- package/dist/src/core/trace/index.d.ts.map +1 -0
- package/dist/src/core/trace/index.js +121 -0
- package/dist/src/core/trace/index.js.map +1 -0
- package/dist/src/core/trace/linear-api-wrapper.d.ts +17 -0
- package/dist/src/core/trace/linear-api-wrapper.d.ts.map +1 -0
- package/dist/src/core/trace/linear-api-wrapper.js +205 -0
- package/dist/src/core/trace/linear-api-wrapper.js.map +1 -0
- package/dist/src/core/trace/performance-test.d.ts +6 -0
- package/dist/src/core/trace/performance-test.d.ts.map +1 -0
- package/dist/src/core/trace/performance-test.js +111 -0
- package/dist/src/core/trace/performance-test.js.map +1 -0
- package/dist/src/core/trace/trace-demo.d.ts +8 -0
- package/dist/src/core/trace/trace-demo.d.ts.map +1 -0
- package/dist/src/core/trace/trace-demo.js +154 -0
- package/dist/src/core/trace/trace-demo.js.map +1 -0
- package/dist/src/core/trace/trace-detector.d.ts +2 -2
- package/dist/src/core/trace/trace-detector.d.ts.map +1 -1
- package/dist/src/core/trace/trace-detector.demo.js +1 -1
- package/dist/src/core/trace/trace-detector.demo.js.map +1 -1
- package/dist/src/core/trace/trace-detector.js +3 -3
- package/dist/src/core/trace/trace-detector.js.map +1 -1
- package/dist/src/features/tasks/pebbles-task-store.d.ts +9 -2
- package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -1
- package/dist/src/features/tasks/pebbles-task-store.js +97 -18
- package/dist/src/features/tasks/pebbles-task-store.js.map +1 -1
- package/dist/src/integrations/linear/auth.d.ts.map +1 -1
- package/dist/src/integrations/linear/auth.js.map +1 -1
- package/dist/src/integrations/linear/client.d.ts +15 -1
- package/dist/src/integrations/linear/client.d.ts.map +1 -1
- package/dist/src/integrations/linear/client.js +85 -3
- package/dist/src/integrations/linear/client.js.map +1 -1
- package/dist/src/integrations/linear/sync-manager.d.ts +2 -0
- package/dist/src/integrations/linear/sync-manager.d.ts.map +1 -1
- package/dist/src/integrations/linear/sync-manager.js +16 -4
- package/dist/src/integrations/linear/sync-manager.js.map +1 -1
- package/dist/src/integrations/linear/sync-service.d.ts +23 -2
- package/dist/src/integrations/linear/sync-service.d.ts.map +1 -1
- package/dist/src/integrations/linear/sync-service.js +44 -25
- package/dist/src/integrations/linear/sync-service.js.map +1 -1
- package/dist/src/integrations/linear/sync.d.ts +6 -0
- package/dist/src/integrations/linear/sync.d.ts.map +1 -1
- package/dist/src/integrations/linear/sync.js +27 -2
- package/dist/src/integrations/linear/sync.js.map +1 -1
- package/dist/src/integrations/linear/types.d.ts +16 -1
- package/dist/src/integrations/linear/types.d.ts.map +1 -1
- package/dist/src/integrations/linear/webhook-server.d.ts.map +1 -1
- package/dist/src/integrations/linear/webhook-server.js +10 -8
- package/dist/src/integrations/linear/webhook-server.js.map +1 -1
- package/dist/src/integrations/linear/webhook.d.ts +13 -0
- package/dist/src/integrations/linear/webhook.d.ts.map +1 -1
- package/dist/src/integrations/linear/webhook.js +101 -14
- package/dist/src/integrations/linear/webhook.js.map +1 -1
- package/dist/src/integrations/mcp/handlers/context-handlers.d.ts +39 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.d.ts.map +1 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js +266 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js.map +1 -0
- package/dist/src/integrations/mcp/handlers/index.d.ts +37 -0
- package/dist/src/integrations/mcp/handlers/index.d.ts.map +1 -0
- package/dist/src/integrations/mcp/handlers/index.js +134 -0
- package/dist/src/integrations/mcp/handlers/index.js.map +1 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts +33 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts.map +1 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js +251 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +1 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.d.ts +42 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.d.ts.map +1 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js +238 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js.map +1 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts +41 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts.map +1 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js +298 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +1 -0
- package/dist/src/integrations/mcp/index.d.ts +13 -0
- package/dist/src/integrations/mcp/index.d.ts.map +1 -0
- package/dist/src/integrations/mcp/index.js +17 -0
- package/dist/src/integrations/mcp/index.js.map +1 -0
- package/dist/src/integrations/mcp/refactored-server.d.ts +76 -0
- package/dist/src/integrations/mcp/refactored-server.d.ts.map +1 -0
- package/dist/src/integrations/mcp/refactored-server.js +351 -0
- package/dist/src/integrations/mcp/refactored-server.js.map +1 -0
- package/dist/src/integrations/mcp/tool-definitions.d.ts +44 -0
- package/dist/src/integrations/mcp/tool-definitions.d.ts.map +1 -0
- package/dist/src/integrations/mcp/tool-definitions.js +563 -0
- package/dist/src/integrations/mcp/tool-definitions.js.map +1 -0
- package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +1 -1
- package/dist/src/integrations/pg-aiguide/semantic-search.js +43 -21
- package/dist/src/integrations/pg-aiguide/semantic-search.js.map +1 -1
- package/dist/src/mcp/stackmemory-mcp-server.d.ts +9 -0
- package/dist/src/mcp/stackmemory-mcp-server.d.ts.map +1 -0
- package/dist/src/mcp/stackmemory-mcp-server.js +519 -0
- package/dist/src/mcp/stackmemory-mcp-server.js.map +1 -0
- package/dist/src/middleware/exponential-rate-limiter.d.ts +78 -0
- package/dist/src/middleware/exponential-rate-limiter.d.ts.map +1 -0
- package/dist/src/middleware/exponential-rate-limiter.js +293 -0
- package/dist/src/middleware/exponential-rate-limiter.js.map +1 -0
- package/dist/src/models/user.model.d.ts +8 -1
- package/dist/src/models/user.model.d.ts.map +1 -1
- package/dist/src/models/user.model.js +62 -14
- package/dist/src/models/user.model.js.map +1 -1
- package/dist/src/servers/production/auth-middleware.d.ts +5 -2
- package/dist/src/servers/production/auth-middleware.d.ts.map +1 -1
- package/dist/src/servers/production/auth-middleware.js +71 -34
- package/dist/src/servers/production/auth-middleware.js.map +1 -1
- package/dist/src/services/context-service.d.ts.map +1 -1
- package/dist/src/services/context-service.js +86 -1
- package/dist/src/services/context-service.js.map +1 -1
- package/dist/src/validation/schemas.d.ts +633 -0
- package/dist/src/validation/schemas.d.ts.map +1 -0
- package/dist/src/validation/schemas.js +347 -0
- package/dist/src/validation/schemas.js.map +1 -0
- package/dist/types/task.js +1 -0
- package/dist/types/task.js.map +7 -0
- package/dist/utils/logger.js +52 -0
- package/dist/utils/logger.js.map +7 -0
- package/dist/validation/schemas.js +218 -0
- package/dist/validation/schemas.js.map +7 -0
- package/package.json +7 -3
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/integrations/mcp/__tests__/server.test.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Tests for StackMemory MCP Server - Local Instance\n */\n\nimport { describe, it, expect, beforeEach, afterEach, vi, Mock } from 'vitest';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport Database from 'better-sqlite3';\nimport LocalStackMemoryMCP from '../server.js';\nimport { join } from 'path';\nimport { mkdtempSync, rmSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { tmpdir } from 'os';\n\n// Create a mock server reference that can be updated per test\nlet mockServerInstance: any = null;\n\n// Mock the MCP SDK - use a proper constructor function\nvi.mock('@modelcontextprotocol/sdk/server/index.js', () => {\n const MockServer = vi.fn().mockImplementation(function (this: any) {\n if (mockServerInstance) {\n Object.assign(this, mockServerInstance);\n } else {\n this.setRequestHandler = vi.fn();\n this.connect = vi.fn();\n }\n return this;\n });\n return { Server: MockServer };\n});\n\nvi.mock('@modelcontextprotocol/sdk/server/stdio.js', () => ({\n StdioServerTransport: vi.fn(),\n}));\n\n// Mock child_process\nvi.mock('child_process', () => ({\n execSync: vi.fn(() => Buffer.from('mocked git output')),\n}));\n\n// Mock browser MCP integration\nvi.mock('../../features/browser/browser-mcp.js', () => ({\n BrowserMCPIntegration: vi.fn().mockImplementation(() => ({\n initialize: vi.fn().mockResolvedValue(undefined),\n })),\n}));\n\n// Mock Linear imports with dynamic imports\nvi.mock('../../integrations/linear/auth.js', async () => {\n const actual = await vi.importActual('../../integrations/linear/auth.js');\n return {\n ...actual,\n LinearAuthManager: vi.fn().mockImplementation(() => ({\n loadTokens: vi.fn(),\n isConfigured: vi.fn(() => false),\n })),\n };\n});\n\nvi.mock('../../integrations/linear/client.js', async () => {\n const actual = await vi.importActual('../../integrations/linear/client.js');\n return {\n ...actual,\n LinearClient: vi.fn().mockImplementation(() => ({\n getIssue: vi.fn(),\n findIssueByIdentifier: vi.fn(),\n updateIssue: vi.fn(),\n getTeam: vi.fn(),\n getWorkflowStates: vi.fn(),\n getViewer: vi.fn(),\n getIssues: vi.fn(),\n })),\n };\n});\n\nvi.mock('../../integrations/linear/sync.js', async () => {\n const actual = await vi.importActual('../../integrations/linear/sync.js');\n return {\n ...actual,\n LinearSyncEngine: vi.fn().mockImplementation(() => ({\n sync: vi.fn(),\n })),\n DEFAULT_SYNC_CONFIG: {\n enabled: true,\n direction: 'bidirectional',\n conflictResolution: 'newest_wins',\n },\n };\n});\n\ndescribe('LocalStackMemoryMCP', () => {\n let tempDir: string;\n let mcpServer: any;\n let mockServer: any;\n let originalCwd: string;\n let originalArgv: string[];\n\n beforeEach(() => {\n // Setup temp directory\n tempDir = mkdtempSync(join(tmpdir(), 'stackmemory-mcp-test-'));\n originalCwd = process.cwd();\n originalArgv = [...process.argv];\n\n // Create .git directory to simulate git repo\n const gitDir = join(tempDir, '.git');\n mkdirSync(gitDir, { recursive: true });\n writeFileSync(\n join(gitDir, 'config'),\n '[core]\\n\\trepositoryformatversion = 0'\n );\n\n // Create package.json\n writeFileSync(\n join(tempDir, 'package.json'),\n JSON.stringify({\n name: 'test-project',\n version: '1.0.0',\n })\n );\n\n // Mock process.cwd() to return our temp directory\n vi.spyOn(process, 'cwd').mockReturnValue(tempDir);\n\n // Setup mock server - update the module-level reference\n mockServer = {\n setRequestHandler: vi.fn(),\n connect: vi.fn(),\n };\n mockServerInstance = mockServer;\n });\n\n afterEach(() => {\n if (mcpServer) {\n // Cleanup if needed\n }\n\n // Restore original process state\n vi.spyOn(process, 'cwd').mockRestore();\n process.argv = originalArgv;\n\n // Cleanup temp directory\n if (tempDir) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n\n vi.clearAllMocks();\n });\n\n describe('Initialization', () => {\n it('should initialize server with correct project detection', () => {\n mcpServer = new LocalStackMemoryMCP();\n\n expect(Server).toHaveBeenCalledWith(\n {\n name: 'stackmemory-local',\n version: '0.1.0',\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n });\n\n it('should create .stackmemory directory if it does not exist', () => {\n mcpServer = new LocalStackMemoryMCP();\n\n const stackmemoryDir = join(tempDir, '.stackmemory');\n expect(existsSync(stackmemoryDir)).toBe(true);\n });\n\n it('should initialize database and frame manager', () => {\n mcpServer = new LocalStackMemoryMCP();\n\n const dbPath = join(tempDir, '.stackmemory', 'context.db');\n expect(existsSync(dbPath)).toBe(true);\n });\n\n it('should handle missing .git directory gracefully', () => {\n // Remove .git directory\n rmSync(join(tempDir, '.git'), { recursive: true });\n\n // Should still work, using current directory as project root\n expect(() => {\n mcpServer = new LocalStackMemoryMCP();\n }).not.toThrow();\n });\n\n it('should setup tool handlers correctly', () => {\n mockServer.setRequestHandler.mockClear();\n mcpServer = new LocalStackMemoryMCP();\n\n // Should have called setRequestHandler at least twice (tools/list and tools/call)\n // BrowserMCP also adds handlers, so we check for at least 2\n expect(\n mockServer.setRequestHandler.mock.calls.length\n ).toBeGreaterThanOrEqual(2);\n\n // Check for tools/list handler\n const toolsListCall = mockServer.setRequestHandler.mock.calls.find(\n (call: any) => {\n try {\n return (\n call[0].parse({ method: 'tools/list' }).method === 'tools/list'\n );\n } catch {\n return false;\n }\n }\n );\n expect(toolsListCall).toBeDefined();\n\n // Check for tools/call handler\n const toolsCallCall = mockServer.setRequestHandler.mock.calls.find(\n (call: any) => {\n try {\n return (\n call[0].parse({\n method: 'tools/call',\n params: { name: 'test', arguments: {} },\n }).method === 'tools/call'\n );\n } catch {\n return false;\n }\n }\n );\n expect(toolsCallCall).toBeDefined();\n });\n });\n\n describe('Tool Listing', () => {\n beforeEach(() => {\n mcpServer = new LocalStackMemoryMCP();\n });\n\n it('should list all available tools', async () => {\n const toolsListHandler = mockServer.setRequestHandler.mock.calls[0][1];\n\n const result = await toolsListHandler({ method: 'tools/list' });\n\n expect(result.tools).toBeDefined();\n expect(Array.isArray(result.tools)).toBe(true);\n expect(result.tools.length).toBeGreaterThan(0);\n\n // Check for essential tools\n const toolNames = result.tools.map((tool: any) => tool.name);\n expect(toolNames).toContain('get_context');\n expect(toolNames).toContain('add_decision');\n expect(toolNames).toContain('start_frame');\n expect(toolNames).toContain('close_frame');\n expect(toolNames).toContain('add_anchor');\n expect(toolNames).toContain('get_hot_stack');\n expect(toolNames).toContain('create_task');\n expect(toolNames).toContain('update_task_status');\n expect(toolNames).toContain('get_active_tasks');\n });\n\n it('should include Linear integration tools', async () => {\n const toolsListHandler = mockServer.setRequestHandler.mock.calls[0][1];\n\n const result = await toolsListHandler({ method: 'tools/list' });\n\n const toolNames = result.tools.map((tool: any) => tool.name);\n expect(toolNames).toContain('linear_sync');\n expect(toolNames).toContain('linear_update_task');\n expect(toolNames).toContain('linear_get_tasks');\n expect(toolNames).toContain('linear_status');\n });\n\n it('should include proper tool schemas', async () => {\n const toolsListHandler = mockServer.setRequestHandler.mock.calls[0][1];\n\n const result = await toolsListHandler({ method: 'tools/list' });\n\n const getContextTool = result.tools.find(\n (tool: any) => tool.name === 'get_context'\n );\n expect(getContextTool).toBeDefined();\n expect(getContextTool.description).toBeDefined();\n expect(getContextTool.inputSchema).toBeDefined();\n expect(getContextTool.inputSchema.type).toBe('object');\n expect(getContextTool.inputSchema.properties).toBeDefined();\n\n const startFrameTool = result.tools.find(\n (tool: any) => tool.name === 'start_frame'\n );\n expect(startFrameTool.inputSchema.required).toContain('name');\n expect(startFrameTool.inputSchema.required).toContain('type');\n });\n });\n\n describe('Tool Execution - Context Management', () => {\n let toolsCallHandler: any;\n\n beforeEach(() => {\n mockServer.setRequestHandler.mockClear();\n mcpServer = new LocalStackMemoryMCP();\n toolsCallHandler = mockServer.setRequestHandler.mock.calls[1][1];\n });\n\n it('should handle get_context tool', async () => {\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'get_context',\n arguments: { query: 'test', limit: 5 },\n },\n });\n\n expect(result.content).toBeDefined();\n expect(Array.isArray(result.content)).toBe(true);\n expect(result.content[0].type).toBe('text');\n });\n\n it('should handle add_decision tool', async () => {\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'add_decision',\n arguments: { content: 'Test decision', type: 'decision' },\n },\n });\n\n expect(result.content).toBeDefined();\n expect(result.content[0].text).toContain('Added decision');\n expect(result.content[0].text).toContain('Test decision');\n });\n\n it('should handle start_frame tool', async () => {\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'start_frame',\n arguments: {\n name: 'Test Frame',\n type: 'task',\n constraints: ['constraint1', 'constraint2'],\n },\n },\n });\n\n expect(result.content).toBeDefined();\n expect(result.content[0].text).toContain('Started task');\n expect(result.content[0].text).toContain('Test Frame');\n expect(result.content[0].text).toContain('Frame ID:');\n expect(result.content[0].text).toContain('Stack depth:');\n });\n\n it('should handle close_frame tool', async () => {\n // First start a frame\n await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'start_frame',\n arguments: { name: 'Test Frame', type: 'task' },\n },\n });\n\n // Then close it\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'close_frame',\n arguments: {\n result: 'Completed successfully',\n outputs: { key: 'value' },\n },\n },\n });\n\n expect(result.content).toBeDefined();\n expect(result.content[0].text).toContain('Closed frame');\n expect(result.content[0].text).toContain('Completed successfully');\n });\n\n it('should handle close_frame with no active frame', async () => {\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'close_frame',\n arguments: { result: 'Test' },\n },\n });\n\n expect(result.content[0].text).toContain('No active frame to close');\n });\n\n it('should handle add_anchor tool', async () => {\n // First start a frame\n await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'start_frame',\n arguments: { name: 'Test Frame', type: 'task' },\n },\n });\n\n // Then add an anchor\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'add_anchor',\n arguments: {\n type: 'FACT',\n text: 'Important fact',\n priority: 9,\n },\n },\n });\n\n expect(result.content[0].text).toContain('Added FACT');\n expect(result.content[0].text).toContain('Important fact');\n expect(result.content[0].text).toContain('Anchor ID:');\n });\n\n it('should handle get_hot_stack tool', async () => {\n // First start some frames\n await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'start_frame',\n arguments: { name: 'Root Frame', type: 'task' },\n },\n });\n\n await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'start_frame',\n arguments: { name: 'Child Frame', type: 'subtask' },\n },\n });\n\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'get_hot_stack',\n arguments: { maxEvents: 10 },\n },\n });\n\n expect(result.content[0].text).toContain('Active Call Stack');\n expect(result.content[0].text).toContain('Root Frame');\n expect(result.content[0].text).toContain('Child Frame');\n expect(result.content[0].text).toContain('Total stack depth');\n });\n\n it('should handle get_hot_stack with no active frames', async () => {\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'get_hot_stack',\n arguments: {},\n },\n });\n\n expect(result.content[0].text).toContain('No active frames');\n });\n });\n\n describe('Tool Execution - Task Management', () => {\n let toolsCallHandler: any;\n\n beforeEach(async () => {\n mockServer.setRequestHandler.mockClear();\n mcpServer = new LocalStackMemoryMCP();\n toolsCallHandler = mockServer.setRequestHandler.mock.calls[1][1];\n\n // Start a frame for task operations (await it!)\n await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'start_frame',\n arguments: { name: 'Task Frame', type: 'task' },\n },\n });\n });\n\n it('should handle create_task tool', async () => {\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'create_task',\n arguments: {\n title: 'Test Task',\n description: 'A test task',\n priority: 'high',\n estimatedEffort: 120,\n tags: ['test', 'urgent'],\n },\n },\n });\n\n expect(result.content[0].text).toContain('Created task');\n expect(result.content[0].text).toContain('Test Task');\n expect(result.content[0].text).toContain('ID:');\n expect(result.content[0].text).toContain('tasks.jsonl');\n });\n\n it('should handle create_task without active frame', async () => {\n // First ensure we wait for any pending frame creation from beforeEach\n await new Promise((resolve) => setTimeout(resolve, 10));\n\n // Close all frames first (may fail if frame wasn't created, that's ok)\n try {\n await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'close_frame',\n arguments: { result: 'closed' },\n },\n });\n } catch {\n // Ignore close errors\n }\n\n // Create a fresh server instance with no frames\n mockServer.setRequestHandler.mockClear();\n mcpServer = new LocalStackMemoryMCP();\n const freshToolsHandler = mockServer.setRequestHandler.mock.calls[1][1];\n\n const result = await freshToolsHandler({\n method: 'tools/call',\n params: {\n name: 'create_task',\n arguments: { title: 'No Frame Task' },\n },\n });\n\n expect(result.content[0].text).toContain('No active frame');\n });\n\n it('should handle update_task_status tool', async () => {\n // First create a task\n const createResult = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'create_task',\n arguments: { title: 'Update Test Task' },\n },\n });\n\n // Extract task ID from response (simplified)\n const taskIdMatch = createResult.content[0].text.match(\n /ID: (tsk-[a-f0-9]{8})/\n );\n expect(taskIdMatch).toBeTruthy();\n const taskId = taskIdMatch[1];\n\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'update_task_status',\n arguments: {\n taskId,\n status: 'in_progress',\n reason: 'Starting work',\n },\n },\n });\n\n expect(result.content[0].text).toContain('Updated task');\n expect(result.content[0].text).toContain('in_progress');\n expect(result.content[0].text).toContain('Starting work');\n });\n\n it('should handle update_task_status with invalid task', async () => {\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'update_task_status',\n arguments: {\n taskId: 'invalid-task-id',\n status: 'completed',\n },\n },\n });\n\n expect(result.content[0].text).toContain('Failed to update task');\n });\n\n it('should handle get_active_tasks tool', async () => {\n // Create some tasks\n await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'create_task',\n arguments: { title: 'Active Task 1', priority: 'high' },\n },\n });\n\n await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'create_task',\n arguments: { title: 'Active Task 2', priority: 'low' },\n },\n });\n\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'get_active_tasks',\n arguments: {},\n },\n });\n\n // The response uses \"**Tasks**\" not \"Active Tasks\"\n expect(result.content[0].text).toContain('Tasks');\n expect(result.content[0].text).toContain('Active Task 1');\n expect(result.content[0].text).toContain('Active Task 2');\n });\n\n it('should handle get_active_tasks with no tasks', async () => {\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'get_active_tasks',\n arguments: {},\n },\n });\n\n expect(result.content[0].text).toContain('No active tasks');\n });\n\n it('should handle get_task_metrics tool', async () => {\n // Create some tasks with different statuses\n const taskId1 = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'create_task',\n arguments: { title: 'Metrics Task 1' },\n },\n });\n\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'get_task_metrics',\n arguments: {},\n },\n });\n\n expect(result.content[0].text).toContain('Task Metrics');\n expect(result.content[0].text).toContain('Total Tasks');\n expect(result.content[0].text).toContain('Completion Rate');\n expect(result.content[0].text).toContain('By Status');\n expect(result.content[0].text).toContain('By Priority');\n });\n\n it('should handle add_task_dependency tool', async () => {\n // Create two tasks\n const task1Result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'create_task',\n arguments: { title: 'Dependency Task' },\n },\n });\n\n const task2Result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'create_task',\n arguments: { title: 'Dependent Task' },\n },\n });\n\n // Extract task IDs\n const task1Id = task1Result.content[0].text.match(\n /ID: (tsk-[a-f0-9]{8})/\n )[1];\n const task2Id = task2Result.content[0].text.match(\n /ID: (tsk-[a-f0-9]{8})/\n )[1];\n\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'add_task_dependency',\n arguments: {\n taskId: task2Id,\n dependsOnId: task1Id,\n },\n },\n });\n\n expect(result.content[0].text).toContain('Added dependency');\n expect(result.content[0].text).toContain(task2Id);\n expect(result.content[0].text).toContain(task1Id);\n });\n });\n\n describe('Tool Execution - Linear Integration', () => {\n let toolsCallHandler: any;\n\n beforeEach(() => {\n mcpServer = new LocalStackMemoryMCP();\n toolsCallHandler = mockServer.setRequestHandler.mock.calls[1][1];\n });\n\n it('should handle linear_status tool when not configured', async () => {\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'linear_status',\n arguments: {},\n },\n });\n\n expect(result.content[0].text).toContain(\n 'Linear integration not configured'\n );\n expect(result.content[0].text).toContain('stackmemory linear setup');\n });\n\n it('should handle linear_sync tool when not authenticated', async () => {\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'linear_sync',\n arguments: { direction: 'bidirectional' },\n },\n });\n\n expect(result.content[0].text).toContain('Linear not authenticated');\n });\n\n it('should handle linear_update_task when not authenticated', async () => {\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'linear_update_task',\n arguments: { issueId: 'STA-123', status: 'done' },\n },\n });\n\n expect(result.content[0].text).toContain('Linear not authenticated');\n });\n\n it('should handle linear_get_tasks when not authenticated', async () => {\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'linear_get_tasks',\n arguments: { status: 'todo', limit: 10 },\n },\n });\n\n expect(result.content[0].text).toContain('Linear not authenticated');\n });\n\n it('should handle linear integration errors gracefully', async () => {\n // This test verifies error handling when Linear is not configured\n // The mock always returns isConfigured: false, so we get the expected error message\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'linear_status',\n arguments: {},\n },\n });\n\n // Verify the error response is properly formatted\n expect(result.content[0].text).toContain('Linear');\n });\n });\n\n describe('Error Handling', () => {\n let toolsCallHandler: any;\n\n beforeEach(() => {\n mcpServer = new LocalStackMemoryMCP();\n toolsCallHandler = mockServer.setRequestHandler.mock.calls[1][1];\n });\n\n it('should handle unknown tool calls', async () => {\n await expect(\n toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'unknown_tool',\n arguments: {},\n },\n })\n ).rejects.toThrow('Unknown tool: unknown_tool');\n });\n\n it('should handle malformed tool arguments gracefully', async () => {\n // Start a frame first to avoid \"no active frame\" error\n await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'start_frame',\n arguments: { name: 'Test Frame', type: 'task' },\n },\n });\n\n // Now test with incomplete arguments for update_task_status\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'update_task_status',\n arguments: { taskId: 'non-existent-task', status: 'in_progress' },\n },\n });\n\n // Should handle gracefully - returns error message about task not found\n expect(result).toBeDefined();\n });\n\n it('should maintain error context in responses', async () => {\n // First start a frame so we can add an anchor\n await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'start_frame',\n arguments: { name: 'Test Frame', type: 'task' },\n },\n });\n\n const result = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'add_anchor',\n arguments: {\n type: 'FACT',\n text: 'Test fact',\n },\n },\n });\n\n // Should succeed now that we have an active frame\n expect(result).toBeDefined();\n expect(result.content[0].text).toContain('Added');\n });\n });\n\n describe('Project Detection and Context Loading', () => {\n it('should detect git repository information', () => {\n // The server is created with mocked child_process.execSync\n mcpServer = new LocalStackMemoryMCP();\n\n // Server should create successfully regardless of git output\n expect(mcpServer).toBeDefined();\n });\n\n it('should handle missing git repository gracefully', () => {\n // The mock is already set up to return generic output\n // This test verifies the server doesn't crash without git\n expect(() => {\n mcpServer = new LocalStackMemoryMCP();\n }).not.toThrow();\n });\n\n it('should load README.md if present', () => {\n const readmePath = join(tempDir, 'README.md');\n writeFileSync(\n readmePath,\n '# Test Project\\n\\nThis is a test project for MCP server testing.'\n );\n\n mcpServer = new LocalStackMemoryMCP();\n\n // Should have loaded README content into context\n expect(existsSync(readmePath)).toBe(true);\n });\n\n it('should handle missing README.md gracefully', () => {\n // Ensure no README exists\n const readmePath = join(tempDir, 'README.md');\n if (existsSync(readmePath)) {\n rmSync(readmePath);\n }\n\n expect(() => {\n mcpServer = new LocalStackMemoryMCP();\n }).not.toThrow();\n });\n });\n\n describe('Database Schema and Persistence', () => {\n beforeEach(() => {\n mcpServer = new LocalStackMemoryMCP();\n });\n\n it('should create required database tables', () => {\n const dbPath = join(tempDir, '.stackmemory', 'context.db');\n const db = new Database(dbPath);\n\n const tables = db\n .prepare(\n `\n SELECT name FROM sqlite_master \n WHERE type='table' AND name IN ('contexts', 'frames', 'attention_log')\n `\n )\n .all();\n\n expect(tables).toHaveLength(3);\n db.close();\n });\n\n it('should handle database initialization errors gracefully', () => {\n // Creating the MCP server with a valid database should work\n // We can't easily mock Database after it's been imported\n // So this test just verifies normal creation works\n expect(() => {\n mcpServer = new LocalStackMemoryMCP();\n }).not.toThrow();\n });\n });\n\n describe('Server Lifecycle', () => {\n it('should start server successfully', async () => {\n mcpServer = new LocalStackMemoryMCP();\n\n const mockTransport = { connect: vi.fn() };\n vi.doMock('@modelcontextprotocol/sdk/server/stdio.js', () => ({\n StdioServerTransport: vi.fn(() => mockTransport),\n }));\n\n mockServer.connect.mockResolvedValue(undefined);\n\n await expect(mcpServer.start()).resolves.not.toThrow();\n expect(mockServer.connect).toHaveBeenCalled();\n });\n\n it('should handle server start errors', async () => {\n mcpServer = new LocalStackMemoryMCP();\n\n mockServer.connect.mockRejectedValue(new Error('Connection failed'));\n\n await expect(mcpServer.start()).rejects.toThrow('Connection failed');\n });\n });\n\n describe('Integration with Framework Components', () => {\n let toolsCallHandler: any;\n\n beforeEach(() => {\n // Reset mock calls before creating a new instance\n mockServer.setRequestHandler.mockClear();\n mcpServer = new LocalStackMemoryMCP();\n // Now calls[1][1] is the tools/call handler for THIS instance\n toolsCallHandler = mockServer.setRequestHandler.mock.calls[1][1];\n });\n\n it('should integrate frame manager operations', async () => {\n // Test frame lifecycle\n const startResult = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'start_frame',\n arguments: { name: 'Integration Test', type: 'task' },\n },\n });\n\n expect(startResult.content[0].text).toContain('Started');\n\n const hotStackResult = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'get_hot_stack',\n arguments: {},\n },\n });\n\n expect(hotStackResult.content[0].text).toContain('Integration Test');\n\n const closeResult = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'close_frame',\n arguments: { result: 'Integration complete' },\n },\n });\n\n expect(closeResult.content[0].text).toContain('Closed frame');\n });\n\n it('should integrate task store operations', async () => {\n // Start frame for task operations\n await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'start_frame',\n arguments: { name: 'Task Integration', type: 'task' },\n },\n });\n\n // Create task\n const createResult = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'create_task',\n arguments: { title: 'Integration Task' },\n },\n });\n\n expect(createResult.content[0].text).toContain('Created task');\n\n // Get active tasks\n const activeResult = await toolsCallHandler({\n method: 'tools/call',\n params: {\n name: 'get_active_tasks',\n arguments: {},\n },\n });\n\n expect(activeResult.content[0].text).toContain('Integration Task');\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { logger } from "../../../core/monitoring/logger.js";
|
|
2
|
+
class ContextHandlers {
|
|
3
|
+
constructor(deps) {
|
|
4
|
+
this.deps = deps;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Get current project context
|
|
8
|
+
*/
|
|
9
|
+
async handleGetContext(args) {
|
|
10
|
+
try {
|
|
11
|
+
const query = args.query || "";
|
|
12
|
+
const limit = args.limit || 5;
|
|
13
|
+
logger.info("Getting context", { query, limit });
|
|
14
|
+
const hotStack = this.deps.frameManager.getHotStackContext(20);
|
|
15
|
+
if (hotStack.length === 0) {
|
|
16
|
+
return {
|
|
17
|
+
content: [
|
|
18
|
+
{
|
|
19
|
+
type: "text",
|
|
20
|
+
text: "No active context frames found. Use start_frame to begin working on a task."
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if (this.deps.contextRetrieval && query) {
|
|
26
|
+
try {
|
|
27
|
+
const llmContext = { summary: "Context retrieval not yet implemented", frameIds: [] };
|
|
28
|
+
return {
|
|
29
|
+
content: [
|
|
30
|
+
{
|
|
31
|
+
type: "text",
|
|
32
|
+
text: llmContext.summary || "No specific context found."
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
metadata: {
|
|
36
|
+
relevantFrames: llmContext.frameIds,
|
|
37
|
+
query
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
} catch (error) {
|
|
41
|
+
logger.warn("LLM context retrieval failed, falling back to hot stack", error instanceof Error ? error : new Error(String(error)));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const contextText = hotStack.map((frame, i) => {
|
|
45
|
+
const depth = " ".repeat(i);
|
|
46
|
+
const constraints = frame.header.constraints?.length ? `
|
|
47
|
+
${depth} Constraints: ${frame.header.constraints.join(", ")}` : "";
|
|
48
|
+
const events = frame.recentEvents.length ? `
|
|
49
|
+
${depth} Recent: ${frame.recentEvents.length} events` : "";
|
|
50
|
+
return `${depth}Frame ${i + 1}: ${frame.header.goal}${constraints}${events}`;
|
|
51
|
+
}).join("\n");
|
|
52
|
+
return {
|
|
53
|
+
content: [
|
|
54
|
+
{
|
|
55
|
+
type: "text",
|
|
56
|
+
text: `Current Context Stack:
|
|
57
|
+
${contextText}`
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
};
|
|
61
|
+
} catch (error) {
|
|
62
|
+
logger.error("Error getting context", error instanceof Error ? error : new Error(String(error)));
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Record a decision or important information
|
|
68
|
+
*/
|
|
69
|
+
async handleAddDecision(args) {
|
|
70
|
+
try {
|
|
71
|
+
const { content, type } = args;
|
|
72
|
+
if (!content) {
|
|
73
|
+
throw new Error("Content is required");
|
|
74
|
+
}
|
|
75
|
+
const currentFrame = this.deps.frameManager.getCurrentFrameId();
|
|
76
|
+
if (!currentFrame) {
|
|
77
|
+
throw new Error("No active frame. Use start_frame first.");
|
|
78
|
+
}
|
|
79
|
+
this.deps.frameManager.addAnchor(
|
|
80
|
+
type === "constraint" ? "CONSTRAINT" : "DECISION",
|
|
81
|
+
content,
|
|
82
|
+
type === "constraint" ? 9 : 7
|
|
83
|
+
);
|
|
84
|
+
this.deps.frameManager.addEvent("decision", {
|
|
85
|
+
type,
|
|
86
|
+
content,
|
|
87
|
+
timestamp: Date.now()
|
|
88
|
+
});
|
|
89
|
+
logger.info("Added decision/constraint", { type, content });
|
|
90
|
+
return {
|
|
91
|
+
content: [
|
|
92
|
+
{
|
|
93
|
+
type: "text",
|
|
94
|
+
text: `Recorded ${type}: ${content}`
|
|
95
|
+
}
|
|
96
|
+
]
|
|
97
|
+
};
|
|
98
|
+
} catch (error) {
|
|
99
|
+
logger.error("Error adding decision", error instanceof Error ? error : new Error(String(error)));
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Start a new frame (task/subtask) on the call stack
|
|
105
|
+
*/
|
|
106
|
+
async handleStartFrame(args) {
|
|
107
|
+
try {
|
|
108
|
+
const { name, type = "task", constraints = [], definitions = {} } = args;
|
|
109
|
+
if (!name) {
|
|
110
|
+
throw new Error("Frame name is required");
|
|
111
|
+
}
|
|
112
|
+
const frameId = this.deps.frameManager.createFrame({
|
|
113
|
+
type,
|
|
114
|
+
name,
|
|
115
|
+
inputs: { constraints, definitions }
|
|
116
|
+
});
|
|
117
|
+
logger.info("Started frame", { frameId, name, type });
|
|
118
|
+
return {
|
|
119
|
+
content: [
|
|
120
|
+
{
|
|
121
|
+
type: "text",
|
|
122
|
+
text: `Started frame: ${name} (${frameId})`
|
|
123
|
+
}
|
|
124
|
+
],
|
|
125
|
+
metadata: {
|
|
126
|
+
frameId,
|
|
127
|
+
type,
|
|
128
|
+
name
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
} catch (error) {
|
|
132
|
+
logger.error("Error starting frame", error instanceof Error ? error : new Error(String(error)));
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Close current frame with summary
|
|
138
|
+
*/
|
|
139
|
+
async handleCloseFrame(args) {
|
|
140
|
+
try {
|
|
141
|
+
const { summary, frameId } = args;
|
|
142
|
+
const targetFrameId = frameId || this.deps.frameManager.getCurrentFrameId();
|
|
143
|
+
if (!targetFrameId) {
|
|
144
|
+
throw new Error("No active frame to close");
|
|
145
|
+
}
|
|
146
|
+
const frame = this.deps.frameManager.getFrame(targetFrameId);
|
|
147
|
+
if (!frame) {
|
|
148
|
+
throw new Error(`Frame not found: ${targetFrameId}`);
|
|
149
|
+
}
|
|
150
|
+
if (summary) {
|
|
151
|
+
this.deps.frameManager.addEvent("observation", {
|
|
152
|
+
type: "completion_summary",
|
|
153
|
+
content: summary,
|
|
154
|
+
timestamp: Date.now()
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
this.deps.frameManager.closeFrame(targetFrameId, summary ? { summary } : {});
|
|
158
|
+
logger.info("Closed frame", { frameId: targetFrameId, frameName: frame.name });
|
|
159
|
+
return {
|
|
160
|
+
content: [
|
|
161
|
+
{
|
|
162
|
+
type: "text",
|
|
163
|
+
text: `Closed frame: ${frame.name}${summary ? ` with summary: ${summary}` : ""}`
|
|
164
|
+
}
|
|
165
|
+
]
|
|
166
|
+
};
|
|
167
|
+
} catch (error) {
|
|
168
|
+
logger.error("Error closing frame", error instanceof Error ? error : new Error(String(error)));
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Add an anchor (important fact) to current frame
|
|
174
|
+
*/
|
|
175
|
+
async handleAddAnchor(args) {
|
|
176
|
+
try {
|
|
177
|
+
const { type, text, priority = 5 } = args;
|
|
178
|
+
if (!text) {
|
|
179
|
+
throw new Error("Anchor text is required");
|
|
180
|
+
}
|
|
181
|
+
const currentFrame = this.deps.frameManager.getCurrentFrameId();
|
|
182
|
+
if (!currentFrame) {
|
|
183
|
+
throw new Error("No active frame. Use start_frame first.");
|
|
184
|
+
}
|
|
185
|
+
const validTypes = ["FACT", "DECISION", "CONSTRAINT", "INTERFACE_CONTRACT", "TODO", "RISK"];
|
|
186
|
+
if (!validTypes.includes(type)) {
|
|
187
|
+
throw new Error(`Invalid anchor type. Must be one of: ${validTypes.join(", ")}`);
|
|
188
|
+
}
|
|
189
|
+
this.deps.frameManager.addAnchor(type, text, priority);
|
|
190
|
+
logger.info("Added anchor", { type, text, priority });
|
|
191
|
+
return {
|
|
192
|
+
content: [
|
|
193
|
+
{
|
|
194
|
+
type: "text",
|
|
195
|
+
text: `Added ${type.toLowerCase()}: ${text}`
|
|
196
|
+
}
|
|
197
|
+
]
|
|
198
|
+
};
|
|
199
|
+
} catch (error) {
|
|
200
|
+
logger.error("Error adding anchor", error instanceof Error ? error : new Error(String(error)));
|
|
201
|
+
throw error;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get current hot stack context
|
|
206
|
+
*/
|
|
207
|
+
async handleGetHotStack(args) {
|
|
208
|
+
try {
|
|
209
|
+
const maxEvents = args.max_events || 10;
|
|
210
|
+
const hotStack = this.deps.frameManager.getHotStackContext(maxEvents);
|
|
211
|
+
if (hotStack.length === 0) {
|
|
212
|
+
return {
|
|
213
|
+
content: [
|
|
214
|
+
{
|
|
215
|
+
type: "text",
|
|
216
|
+
text: "No active frames on the stack."
|
|
217
|
+
}
|
|
218
|
+
]
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
const stackSummary = hotStack.map((frame, index) => ({
|
|
222
|
+
depth: index,
|
|
223
|
+
frameId: frame.frameId,
|
|
224
|
+
goal: frame.header.goal,
|
|
225
|
+
constraints: frame.header.constraints || [],
|
|
226
|
+
anchors: frame.anchors.length,
|
|
227
|
+
recentEvents: frame.recentEvents.length,
|
|
228
|
+
artifacts: frame.activeArtifacts.length
|
|
229
|
+
}));
|
|
230
|
+
return {
|
|
231
|
+
content: [
|
|
232
|
+
{
|
|
233
|
+
type: "text",
|
|
234
|
+
text: `Hot Stack (${hotStack.length} frames):
|
|
235
|
+
` + stackSummary.map(
|
|
236
|
+
(f) => ` ${f.depth}: ${f.goal} (${f.anchors} anchors, ${f.recentEvents} events)`
|
|
237
|
+
).join("\n")
|
|
238
|
+
}
|
|
239
|
+
],
|
|
240
|
+
metadata: {
|
|
241
|
+
stack: stackSummary
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
} catch (error) {
|
|
245
|
+
logger.error("Error getting hot stack", error instanceof Error ? error : new Error(String(error)));
|
|
246
|
+
throw error;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
export {
|
|
251
|
+
ContextHandlers
|
|
252
|
+
};
|
|
253
|
+
//# sourceMappingURL=context-handlers.js.map
|
|
@@ -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/frame-manager.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) {\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) {\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) {\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) {\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) {\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) {\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 => \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) {\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,134 @@
|
|
|
1
|
+
import { ContextHandlers } from "./context-handlers.js";
|
|
2
|
+
import { TaskHandlers } from "./task-handlers.js";
|
|
3
|
+
import { LinearHandlers } from "./linear-handlers.js";
|
|
4
|
+
import { TraceHandlers } from "./trace-handlers.js";
|
|
5
|
+
import { ContextHandlers as ContextHandlers2 } from "./context-handlers.js";
|
|
6
|
+
import { TaskHandlers as TaskHandlers2 } from "./task-handlers.js";
|
|
7
|
+
import { LinearHandlers as LinearHandlers2 } from "./linear-handlers.js";
|
|
8
|
+
import { TraceHandlers as TraceHandlers2 } from "./trace-handlers.js";
|
|
9
|
+
class MCPHandlerFactory {
|
|
10
|
+
contextHandlers;
|
|
11
|
+
taskHandlers;
|
|
12
|
+
linearHandlers;
|
|
13
|
+
traceHandlers;
|
|
14
|
+
constructor(deps) {
|
|
15
|
+
this.contextHandlers = new ContextHandlers2({
|
|
16
|
+
frameManager: deps.frameManager,
|
|
17
|
+
contextRetrieval: deps.contextRetrieval
|
|
18
|
+
});
|
|
19
|
+
this.taskHandlers = new TaskHandlers2({
|
|
20
|
+
taskStore: deps.taskStore,
|
|
21
|
+
projectId: deps.projectId
|
|
22
|
+
});
|
|
23
|
+
this.linearHandlers = new LinearHandlers2({
|
|
24
|
+
linearAuthManager: deps.linearAuthManager,
|
|
25
|
+
linearSync: deps.linearSync,
|
|
26
|
+
taskStore: deps.taskStore
|
|
27
|
+
});
|
|
28
|
+
this.traceHandlers = new TraceHandlers2({
|
|
29
|
+
traceDetector: deps.traceDetector,
|
|
30
|
+
browserMCP: deps.browserMCP
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get handler for a specific tool
|
|
35
|
+
*/
|
|
36
|
+
getHandler(toolName) {
|
|
37
|
+
switch (toolName) {
|
|
38
|
+
// Context handlers
|
|
39
|
+
case "get_context":
|
|
40
|
+
return this.contextHandlers.handleGetContext.bind(this.contextHandlers);
|
|
41
|
+
case "add_decision":
|
|
42
|
+
return this.contextHandlers.handleAddDecision.bind(this.contextHandlers);
|
|
43
|
+
case "start_frame":
|
|
44
|
+
return this.contextHandlers.handleStartFrame.bind(this.contextHandlers);
|
|
45
|
+
case "close_frame":
|
|
46
|
+
return this.contextHandlers.handleCloseFrame.bind(this.contextHandlers);
|
|
47
|
+
case "add_anchor":
|
|
48
|
+
return this.contextHandlers.handleAddAnchor.bind(this.contextHandlers);
|
|
49
|
+
case "get_hot_stack":
|
|
50
|
+
return this.contextHandlers.handleGetHotStack.bind(this.contextHandlers);
|
|
51
|
+
// Task handlers
|
|
52
|
+
case "create_task":
|
|
53
|
+
return this.taskHandlers.handleCreateTask.bind(this.taskHandlers);
|
|
54
|
+
case "update_task_status":
|
|
55
|
+
return this.taskHandlers.handleUpdateTaskStatus.bind(this.taskHandlers);
|
|
56
|
+
case "get_active_tasks":
|
|
57
|
+
return this.taskHandlers.handleGetActiveTasks.bind(this.taskHandlers);
|
|
58
|
+
case "get_task_metrics":
|
|
59
|
+
return this.taskHandlers.handleGetTaskMetrics.bind(this.taskHandlers);
|
|
60
|
+
case "add_task_dependency":
|
|
61
|
+
return this.taskHandlers.handleAddTaskDependency.bind(this.taskHandlers);
|
|
62
|
+
// Linear handlers
|
|
63
|
+
case "linear_sync":
|
|
64
|
+
return this.linearHandlers.handleLinearSync.bind(this.linearHandlers);
|
|
65
|
+
case "linear_update_task":
|
|
66
|
+
return this.linearHandlers.handleLinearUpdateTask.bind(this.linearHandlers);
|
|
67
|
+
case "linear_get_tasks":
|
|
68
|
+
return this.linearHandlers.handleLinearGetTasks.bind(this.linearHandlers);
|
|
69
|
+
case "linear_status":
|
|
70
|
+
return this.linearHandlers.handleLinearStatus.bind(this.linearHandlers);
|
|
71
|
+
// Trace handlers
|
|
72
|
+
case "get_traces":
|
|
73
|
+
return this.traceHandlers.handleGetTraces.bind(this.traceHandlers);
|
|
74
|
+
case "analyze_traces":
|
|
75
|
+
return this.traceHandlers.handleAnalyzeTraces.bind(this.traceHandlers);
|
|
76
|
+
case "start_browser_debug":
|
|
77
|
+
return this.traceHandlers.handleStartBrowserDebug.bind(this.traceHandlers);
|
|
78
|
+
case "take_screenshot":
|
|
79
|
+
return this.traceHandlers.handleTakeScreenshot.bind(this.traceHandlers);
|
|
80
|
+
case "execute_script":
|
|
81
|
+
return this.traceHandlers.handleExecuteScript.bind(this.traceHandlers);
|
|
82
|
+
case "stop_browser_debug":
|
|
83
|
+
return this.traceHandlers.handleStopBrowserDebug.bind(this.traceHandlers);
|
|
84
|
+
default:
|
|
85
|
+
throw new Error(`Unknown tool: ${toolName}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get all available tool names
|
|
90
|
+
*/
|
|
91
|
+
getAvailableTools() {
|
|
92
|
+
return [
|
|
93
|
+
// Context tools
|
|
94
|
+
"get_context",
|
|
95
|
+
"add_decision",
|
|
96
|
+
"start_frame",
|
|
97
|
+
"close_frame",
|
|
98
|
+
"add_anchor",
|
|
99
|
+
"get_hot_stack",
|
|
100
|
+
// Task tools
|
|
101
|
+
"create_task",
|
|
102
|
+
"update_task_status",
|
|
103
|
+
"get_active_tasks",
|
|
104
|
+
"get_task_metrics",
|
|
105
|
+
"add_task_dependency",
|
|
106
|
+
// Linear tools
|
|
107
|
+
"linear_sync",
|
|
108
|
+
"linear_update_task",
|
|
109
|
+
"linear_get_tasks",
|
|
110
|
+
"linear_status",
|
|
111
|
+
// Trace tools
|
|
112
|
+
"get_traces",
|
|
113
|
+
"analyze_traces",
|
|
114
|
+
"start_browser_debug",
|
|
115
|
+
"take_screenshot",
|
|
116
|
+
"execute_script",
|
|
117
|
+
"stop_browser_debug"
|
|
118
|
+
];
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Check if a tool exists
|
|
122
|
+
*/
|
|
123
|
+
hasHandler(toolName) {
|
|
124
|
+
return this.getAvailableTools().includes(toolName);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export {
|
|
128
|
+
ContextHandlers,
|
|
129
|
+
LinearHandlers,
|
|
130
|
+
MCPHandlerFactory,
|
|
131
|
+
TaskHandlers,
|
|
132
|
+
TraceHandlers
|
|
133
|
+
};
|
|
134
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -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 { ContextHandlers, type ContextHandlerDependencies } from './context-handlers.js';\nexport { TaskHandlers, type TaskHandlerDependencies } from './task-handlers.js';\nexport { LinearHandlers, type LinearHandlerDependencies } from './linear-handlers.js';\nexport { TraceHandlers, type TraceHandlerDependencies } from './trace-handlers.js';\n\nimport { ContextHandlers, ContextHandlerDependencies } from './context-handlers.js';\nimport { TaskHandlers, TaskHandlerDependencies } from './task-handlers.js';\nimport { LinearHandlers, LinearHandlerDependencies } from './linear-handlers.js';\nimport { TraceHandlers, TraceHandlerDependencies } from './trace-handlers.js';\n\n// Combined dependencies interface\nexport interface MCPHandlerDependencies extends \n ContextHandlerDependencies,\n TaskHandlerDependencies,\n LinearHandlerDependencies,\n TraceHandlerDependencies {\n}\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(this.contextHandlers);\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(this.contextHandlers);\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(this.taskHandlers);\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(this.linearHandlers);\n case 'linear_get_tasks':\n return this.linearHandlers.handleLinearGetTasks.bind(this.linearHandlers);\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(this.traceHandlers);\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(this.traceHandlers);\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}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ContextHandlers", "TaskHandlers", "LinearHandlers", "TraceHandlers"]
|
|
7
|
+
}
|