@stackmemoryai/stackmemory 0.5.5 → 0.5.6
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 +4 -0
- package/dist/agents/core/agent-task-manager.js.map +1 -1
- package/dist/agents/testing-agent.js +4 -0
- package/dist/agents/testing-agent.js.map +1 -1
- package/dist/agents/verifiers/base-verifier.js +4 -0
- package/dist/agents/verifiers/base-verifier.js.map +1 -1
- package/dist/agents/verifiers/formatter-verifier.js +4 -0
- package/dist/agents/verifiers/formatter-verifier.js.map +1 -1
- package/dist/agents/verifiers/llm-judge.js +4 -0
- package/dist/agents/verifiers/llm-judge.js.map +1 -1
- package/dist/cli/auto-detect.js +4 -0
- package/dist/cli/auto-detect.js.map +1 -1
- package/dist/cli/browser-test.js +4 -0
- package/dist/cli/browser-test.js.map +1 -1
- package/dist/cli/claude-sm-danger.js +4 -3
- package/dist/cli/claude-sm-danger.js.map +2 -2
- package/dist/cli/claude-sm.js +4 -0
- package/dist/cli/claude-sm.js.map +2 -2
- package/dist/cli/codex-sm.js +4 -0
- package/dist/cli/codex-sm.js.map +1 -1
- package/dist/cli/commands/api.js +4 -0
- package/dist/cli/commands/api.js.map +1 -1
- package/dist/cli/commands/cleanup-processes.js +4 -0
- package/dist/cli/commands/cleanup-processes.js.map +1 -1
- package/dist/cli/commands/clear.js +4 -0
- package/dist/cli/commands/clear.js.map +1 -1
- package/dist/cli/commands/config.js +4 -0
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/context-rehydrate.js +4 -0
- package/dist/cli/commands/context-rehydrate.js.map +1 -1
- package/dist/cli/commands/context.js +4 -0
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/dashboard.js +4 -0
- package/dist/cli/commands/dashboard.js.map +1 -1
- package/dist/cli/commands/db.js +4 -0
- package/dist/cli/commands/db.js.map +1 -1
- package/dist/cli/commands/decision.js +4 -0
- package/dist/cli/commands/decision.js.map +1 -1
- package/dist/cli/commands/handoff.js +4 -0
- package/dist/cli/commands/handoff.js.map +1 -1
- package/dist/cli/commands/hooks.js +4 -0
- package/dist/cli/commands/hooks.js.map +1 -1
- package/dist/cli/commands/linear-unified.js +4 -0
- package/dist/cli/commands/linear-unified.js.map +1 -1
- package/dist/cli/commands/linear.js +4 -0
- package/dist/cli/commands/linear.js.map +1 -1
- package/dist/cli/commands/log.js +4 -0
- package/dist/cli/commands/log.js.map +1 -1
- package/dist/cli/commands/login.js +4 -0
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/migrate.js +4 -0
- package/dist/cli/commands/migrate.js.map +1 -1
- package/dist/cli/commands/monitor.js +4 -0
- package/dist/cli/commands/monitor.js.map +1 -1
- package/dist/cli/commands/onboard.js +4 -0
- package/dist/cli/commands/onboard.js.map +1 -1
- package/dist/cli/commands/projects.js +4 -0
- package/dist/cli/commands/projects.js.map +1 -1
- package/dist/cli/commands/quality.js +4 -0
- package/dist/cli/commands/quality.js.map +1 -1
- package/dist/cli/commands/ralph.js +4 -0
- package/dist/cli/commands/ralph.js.map +1 -1
- package/dist/cli/commands/search.js +4 -0
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/service.js +4 -0
- package/dist/cli/commands/service.js.map +1 -1
- package/dist/cli/commands/session.js +4 -0
- package/dist/cli/commands/session.js.map +1 -1
- package/dist/cli/commands/shell.js +5 -4
- package/dist/cli/commands/shell.js.map +2 -2
- package/dist/cli/commands/signup.js +4 -0
- package/dist/cli/commands/signup.js.map +1 -1
- package/dist/cli/commands/skills.js +4 -0
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/storage-tier.js +4 -0
- package/dist/cli/commands/storage-tier.js.map +1 -1
- package/dist/cli/commands/storage.js +4 -0
- package/dist/cli/commands/storage.js.map +1 -1
- package/dist/cli/commands/sweep.js +5 -4
- package/dist/cli/commands/sweep.js.map +2 -2
- package/dist/cli/commands/tasks.js +4 -0
- package/dist/cli/commands/tasks.js.map +1 -1
- package/dist/cli/commands/test.js +4 -0
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/workflow.js +4 -0
- package/dist/cli/commands/workflow.js.map +1 -1
- package/dist/cli/commands/worktree.js +4 -0
- package/dist/cli/commands/worktree.js.map +1 -1
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils/viewer.js +4 -0
- package/dist/cli/utils/viewer.js.map +1 -1
- package/dist/core/analytics/team-analytics.js +4 -0
- package/dist/core/analytics/team-analytics.js.map +1 -1
- package/dist/core/config/config-manager.js +4 -0
- package/dist/core/config/config-manager.js.map +1 -1
- package/dist/core/config/storage-config.js +4 -0
- package/dist/core/config/storage-config.js.map +1 -1
- package/dist/core/config/types.js +4 -0
- package/dist/core/config/types.js.map +1 -1
- package/dist/core/context/auto-context.js +4 -0
- package/dist/core/context/auto-context.js.map +1 -1
- package/dist/core/context/compaction-handler.js +4 -0
- package/dist/core/context/compaction-handler.js.map +1 -1
- package/dist/core/context/context-bridge.js +4 -0
- package/dist/core/context/context-bridge.js.map +1 -1
- package/dist/core/context/dual-stack-manager.js +4 -0
- package/dist/core/context/dual-stack-manager.js.map +1 -1
- package/dist/core/context/enhanced-rehydration.js +4 -0
- package/dist/core/context/enhanced-rehydration.js.map +1 -1
- package/dist/core/context/frame-database.js +4 -0
- package/dist/core/context/frame-database.js.map +1 -1
- package/dist/core/context/frame-digest.js +4 -0
- package/dist/core/context/frame-digest.js.map +1 -1
- package/dist/core/context/frame-handoff-manager.js +4 -0
- package/dist/core/context/frame-handoff-manager.js.map +1 -1
- package/dist/core/context/frame-manager.js +4 -0
- package/dist/core/context/frame-manager.js.map +1 -1
- package/dist/core/context/frame-stack.js +4 -0
- package/dist/core/context/frame-stack.js.map +1 -1
- package/dist/core/context/frame-types.js +4 -0
- package/dist/core/context/incremental-gc.js +4 -0
- package/dist/core/context/incremental-gc.js.map +1 -1
- package/dist/core/context/index.js +4 -0
- package/dist/core/context/index.js.map +1 -1
- package/dist/core/context/model-aware-compaction.js +4 -0
- package/dist/core/context/model-aware-compaction.js.map +1 -1
- package/dist/core/context/permission-manager.js +4 -0
- package/dist/core/context/permission-manager.js.map +1 -1
- package/dist/core/context/recursive-context-manager.js +4 -0
- package/dist/core/context/recursive-context-manager.js.map +1 -1
- package/dist/core/context/refactored-frame-manager.js +4 -0
- package/dist/core/context/refactored-frame-manager.js.map +1 -1
- package/dist/core/context/shared-context-layer.js +4 -0
- package/dist/core/context/shared-context-layer.js.map +1 -1
- package/dist/core/context/stack-merge-resolver.js +4 -0
- package/dist/core/context/stack-merge-resolver.js.map +1 -1
- package/dist/core/context/validation.js +4 -0
- package/dist/core/context/validation.js.map +1 -1
- package/dist/core/database/batch-operations.js +4 -0
- package/dist/core/database/batch-operations.js.map +1 -1
- package/dist/core/database/connection-pool.js +4 -0
- package/dist/core/database/connection-pool.js.map +1 -1
- package/dist/core/database/database-adapter.js +4 -0
- package/dist/core/database/database-adapter.js.map +1 -1
- package/dist/core/database/migration-manager.js +4 -0
- package/dist/core/database/migration-manager.js.map +1 -1
- package/dist/core/database/paradedb-adapter.js +4 -0
- package/dist/core/database/paradedb-adapter.js.map +1 -1
- package/dist/core/database/query-cache.js +4 -0
- package/dist/core/database/query-cache.js.map +1 -1
- package/dist/core/database/query-router.js +4 -0
- package/dist/core/database/query-router.js.map +1 -1
- package/dist/core/database/sqlite-adapter.js +4 -0
- package/dist/core/database/sqlite-adapter.js.map +1 -1
- package/dist/core/digest/enhanced-hybrid-digest.js +4 -0
- package/dist/core/digest/enhanced-hybrid-digest.js.map +1 -1
- package/dist/core/digest/frame-digest-integration.js +4 -0
- package/dist/core/digest/frame-digest-integration.js.map +1 -1
- package/dist/core/digest/hybrid-digest-generator.js +4 -0
- package/dist/core/digest/hybrid-digest-generator.js.map +1 -1
- package/dist/core/digest/index.js +4 -0
- package/dist/core/digest/index.js.map +1 -1
- package/dist/core/digest/types.js +4 -0
- package/dist/core/digest/types.js.map +1 -1
- package/dist/core/errors/index.js +4 -0
- package/dist/core/errors/index.js.map +1 -1
- package/dist/core/errors/recovery.js +4 -0
- package/dist/core/errors/recovery.js.map +1 -1
- package/dist/core/execution/parallel-executor.js +4 -0
- package/dist/core/execution/parallel-executor.js.map +1 -1
- package/dist/core/frame/workflow-templates.js +4 -0
- package/dist/core/frame/workflow-templates.js.map +1 -1
- package/dist/core/merge/conflict-detector.js +4 -0
- package/dist/core/merge/conflict-detector.js.map +1 -1
- package/dist/core/merge/index.js +4 -0
- package/dist/core/merge/index.js.map +1 -1
- package/dist/core/merge/resolution-engine.js +4 -0
- package/dist/core/merge/resolution-engine.js.map +1 -1
- package/dist/core/merge/stack-diff.js +4 -0
- package/dist/core/merge/stack-diff.js.map +1 -1
- package/dist/core/merge/types.js +4 -0
- package/dist/core/monitoring/error-handler.js +4 -0
- package/dist/core/monitoring/error-handler.js.map +1 -1
- package/dist/core/monitoring/logger.js +4 -0
- package/dist/core/monitoring/logger.js.map +1 -1
- package/dist/core/monitoring/metrics.js +4 -0
- package/dist/core/monitoring/metrics.js.map +1 -1
- package/dist/core/monitoring/progress-tracker.js +4 -0
- package/dist/core/monitoring/progress-tracker.js.map +1 -1
- package/dist/core/monitoring/session-monitor.js +4 -0
- package/dist/core/monitoring/session-monitor.js.map +1 -1
- package/dist/core/performance/context-cache.js +4 -0
- package/dist/core/performance/context-cache.js.map +1 -1
- package/dist/core/performance/index.js +4 -0
- package/dist/core/performance/index.js.map +1 -1
- package/dist/core/performance/lazy-context-loader.js +4 -0
- package/dist/core/performance/lazy-context-loader.js.map +1 -1
- package/dist/core/performance/monitor.js +4 -0
- package/dist/core/performance/monitor.js.map +1 -1
- package/dist/core/performance/optimized-frame-context.js +4 -0
- package/dist/core/performance/optimized-frame-context.js.map +1 -1
- package/dist/core/performance/performance-benchmark.js +4 -0
- package/dist/core/performance/performance-benchmark.js.map +1 -1
- package/dist/core/performance/performance-profiler.js +4 -0
- package/dist/core/performance/performance-profiler.js.map +1 -1
- package/dist/core/performance/streaming-jsonl-parser.js +4 -0
- package/dist/core/performance/streaming-jsonl-parser.js.map +1 -1
- package/dist/core/persistence/postgres-adapter.js +4 -0
- package/dist/core/persistence/postgres-adapter.js.map +1 -1
- package/dist/core/projects/project-isolation.js +4 -0
- package/dist/core/projects/project-isolation.js.map +1 -1
- package/dist/core/projects/project-manager.js +4 -0
- package/dist/core/projects/project-manager.js.map +1 -1
- package/dist/core/query/query-parser.js +4 -0
- package/dist/core/query/query-parser.js.map +1 -1
- package/dist/core/query/query-templates.js +4 -0
- package/dist/core/query/query-templates.js.map +1 -1
- package/dist/core/retrieval/context-retriever.js +4 -0
- package/dist/core/retrieval/context-retriever.js.map +1 -1
- package/dist/core/retrieval/graph-retrieval.js +4 -0
- package/dist/core/retrieval/graph-retrieval.js.map +1 -1
- package/dist/core/retrieval/hierarchical-retrieval.js +4 -0
- package/dist/core/retrieval/hierarchical-retrieval.js.map +1 -1
- package/dist/core/retrieval/index.js +4 -0
- package/dist/core/retrieval/index.js.map +1 -1
- package/dist/core/retrieval/llm-context-retrieval.js +4 -0
- package/dist/core/retrieval/llm-context-retrieval.js.map +1 -1
- package/dist/core/retrieval/retrieval-benchmarks.js +4 -0
- package/dist/core/retrieval/retrieval-benchmarks.js.map +1 -1
- package/dist/core/retrieval/summary-generator.js +4 -0
- package/dist/core/retrieval/summary-generator.js.map +1 -1
- package/dist/core/retrieval/types.js +4 -0
- package/dist/core/retrieval/types.js.map +1 -1
- package/dist/core/session/clear-survival.js +4 -0
- package/dist/core/session/clear-survival.js.map +1 -1
- package/dist/core/session/enhanced-handoff.js +4 -0
- package/dist/core/session/enhanced-handoff.js.map +1 -1
- package/dist/core/session/handoff-generator.js +4 -0
- package/dist/core/session/handoff-generator.js.map +1 -1
- package/dist/core/session/index.js +4 -0
- package/dist/core/session/index.js.map +1 -1
- package/dist/core/session/session-manager.js +4 -0
- package/dist/core/session/session-manager.js.map +1 -1
- package/dist/core/skills/index.js +4 -0
- package/dist/core/skills/index.js.map +1 -1
- package/dist/core/skills/skill-storage.js +4 -0
- package/dist/core/skills/skill-storage.js.map +1 -1
- package/dist/core/skills/types.js +4 -0
- package/dist/core/skills/types.js.map +1 -1
- package/dist/core/storage/chromadb-adapter.js +4 -0
- package/dist/core/storage/chromadb-adapter.js.map +1 -1
- package/dist/core/storage/infinite-storage.js +4 -0
- package/dist/core/storage/infinite-storage.js.map +1 -1
- package/dist/core/storage/railway-optimized-storage.js +4 -0
- package/dist/core/storage/railway-optimized-storage.js.map +1 -1
- package/dist/core/storage/remote-storage.js +4 -0
- package/dist/core/storage/remote-storage.js.map +1 -1
- package/dist/core/storage/two-tier-storage.js +4 -0
- package/dist/core/storage/two-tier-storage.js.map +1 -1
- package/dist/core/trace/cli-trace-wrapper.js +4 -0
- package/dist/core/trace/cli-trace-wrapper.js.map +1 -1
- package/dist/core/trace/db-trace-wrapper.js +4 -0
- package/dist/core/trace/db-trace-wrapper.js.map +1 -1
- package/dist/core/trace/debug-trace.js +4 -0
- package/dist/core/trace/debug-trace.js.map +1 -1
- package/dist/core/trace/index.js +4 -0
- package/dist/core/trace/index.js.map +1 -1
- package/dist/core/trace/linear-api-wrapper.js +4 -0
- package/dist/core/trace/linear-api-wrapper.js.map +1 -1
- package/dist/core/trace/trace-demo.js +4 -0
- package/dist/core/trace/trace-demo.js.map +1 -1
- package/dist/core/trace/trace-detector.demo.js +4 -0
- package/dist/core/trace/trace-detector.demo.js.map +1 -1
- package/dist/core/trace/trace-detector.js +4 -0
- package/dist/core/trace/trace-detector.js.map +1 -1
- package/dist/core/trace/trace-store.js +4 -0
- package/dist/core/trace/trace-store.js.map +1 -1
- package/dist/core/trace/types.js +4 -0
- package/dist/core/trace/types.js.map +1 -1
- package/dist/core/types.js +4 -0
- package/dist/core/utils/compression.js +4 -0
- package/dist/core/utils/compression.js.map +1 -1
- package/dist/core/utils/update-checker.js +4 -0
- package/dist/core/utils/update-checker.js.map +1 -1
- package/dist/core/worktree/worktree-manager.js +4 -0
- package/dist/core/worktree/worktree-manager.js.map +1 -1
- package/dist/daemon/session-daemon.js +4 -0
- package/dist/daemon/session-daemon.js.map +1 -1
- package/dist/features/analytics/api/analytics-api.js +4 -0
- package/dist/features/analytics/api/analytics-api.js.map +1 -1
- package/dist/features/analytics/core/analytics-service.js +4 -0
- package/dist/features/analytics/core/analytics-service.js.map +1 -1
- package/dist/features/analytics/index.js +4 -0
- package/dist/features/analytics/index.js.map +1 -1
- package/dist/features/analytics/queries/metrics-queries.js +4 -0
- package/dist/features/analytics/queries/metrics-queries.js.map +1 -1
- package/dist/features/analytics/types/metrics.js +4 -0
- package/dist/features/browser/browser-mcp.js +4 -0
- package/dist/features/browser/browser-mcp.js.map +1 -1
- package/dist/features/tasks/linear-task-manager.js +4 -0
- package/dist/features/tasks/linear-task-manager.js.map +1 -1
- package/dist/features/tasks/task-aware-context.js +4 -0
- package/dist/features/tasks/task-aware-context.js.map +1 -1
- package/dist/features/tui/simple-monitor.js +4 -0
- package/dist/features/tui/simple-monitor.js.map +1 -1
- package/dist/features/tui/swarm-monitor.js +4 -0
- package/dist/features/tui/swarm-monitor.js.map +1 -1
- package/dist/features/web/client/stores/task-store.js +4 -0
- package/dist/features/web/client/stores/task-store.js.map +1 -1
- package/dist/features/web/server/index.js +4 -0
- package/dist/features/web/server/index.js.map +1 -1
- package/dist/hooks/config.js +4 -0
- package/dist/hooks/config.js.map +1 -1
- package/dist/hooks/daemon.js +4 -0
- package/dist/hooks/daemon.js.map +1 -1
- package/dist/hooks/events.js +4 -0
- package/dist/hooks/events.js.map +1 -1
- package/dist/hooks/index.js +4 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/anthropic/client.js +4 -0
- package/dist/integrations/anthropic/client.js.map +1 -1
- package/dist/integrations/claude-code/agent-bridge.js +4 -0
- package/dist/integrations/claude-code/agent-bridge.js.map +1 -1
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js +4 -0
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +1 -1
- package/dist/integrations/claude-code/lifecycle-hooks.js +4 -0
- package/dist/integrations/claude-code/lifecycle-hooks.js.map +1 -1
- package/dist/integrations/claude-code/post-task-hooks.js +4 -0
- package/dist/integrations/claude-code/post-task-hooks.js.map +1 -1
- package/dist/integrations/claude-code/subagent-client-stub.js +4 -0
- package/dist/integrations/claude-code/subagent-client-stub.js.map +1 -1
- package/dist/integrations/claude-code/subagent-client.js +4 -0
- package/dist/integrations/claude-code/subagent-client.js.map +1 -1
- package/dist/integrations/claude-code/task-coordinator.js +4 -0
- package/dist/integrations/claude-code/task-coordinator.js.map +1 -1
- package/dist/integrations/linear/auth.js +4 -0
- package/dist/integrations/linear/auth.js.map +1 -1
- package/dist/integrations/linear/auto-sync.js +4 -0
- package/dist/integrations/linear/auto-sync.js.map +1 -1
- package/dist/integrations/linear/client.js +4 -0
- package/dist/integrations/linear/client.js.map +1 -1
- package/dist/integrations/linear/config.js +4 -0
- package/dist/integrations/linear/config.js.map +1 -1
- package/dist/integrations/linear/migration.js +4 -0
- package/dist/integrations/linear/migration.js.map +1 -1
- package/dist/integrations/linear/oauth-server.js +4 -0
- package/dist/integrations/linear/oauth-server.js.map +1 -1
- package/dist/integrations/linear/rest-client.js +4 -0
- package/dist/integrations/linear/rest-client.js.map +1 -1
- package/dist/integrations/linear/sync-manager.js +4 -0
- package/dist/integrations/linear/sync-manager.js.map +1 -1
- package/dist/integrations/linear/sync-service.js +4 -0
- package/dist/integrations/linear/sync-service.js.map +1 -1
- package/dist/integrations/linear/sync.js +4 -0
- package/dist/integrations/linear/sync.js.map +1 -1
- package/dist/integrations/linear/types.js +4 -0
- package/dist/integrations/linear/unified-sync.js +4 -0
- package/dist/integrations/linear/unified-sync.js.map +1 -1
- package/dist/integrations/linear/webhook-handler.js +4 -0
- package/dist/integrations/linear/webhook-handler.js.map +1 -1
- package/dist/integrations/linear/webhook-server.js +4 -0
- package/dist/integrations/linear/webhook-server.js.map +1 -1
- package/dist/integrations/linear/webhook.js +4 -0
- package/dist/integrations/linear/webhook.js.map +1 -1
- package/dist/integrations/mcp/handlers/code-execution-handlers.js +4 -0
- package/dist/integrations/mcp/handlers/code-execution-handlers.js.map +1 -1
- package/dist/integrations/mcp/handlers/context-handlers.js +4 -0
- package/dist/integrations/mcp/handlers/context-handlers.js.map +1 -1
- package/dist/integrations/mcp/handlers/index.js +4 -0
- package/dist/integrations/mcp/handlers/index.js.map +1 -1
- package/dist/integrations/mcp/handlers/linear-handlers.js +4 -0
- package/dist/integrations/mcp/handlers/linear-handlers.js.map +1 -1
- package/dist/integrations/mcp/handlers/skill-handlers.js +4 -0
- package/dist/integrations/mcp/handlers/skill-handlers.js.map +1 -1
- package/dist/integrations/mcp/handlers/task-handlers.js +4 -0
- package/dist/integrations/mcp/handlers/task-handlers.js.map +1 -1
- package/dist/integrations/mcp/handlers/trace-handlers.js +4 -0
- package/dist/integrations/mcp/handlers/trace-handlers.js.map +1 -1
- package/dist/integrations/mcp/index.js +4 -0
- package/dist/integrations/mcp/index.js.map +1 -1
- package/dist/integrations/mcp/middleware/tool-scoring.js +4 -0
- package/dist/integrations/mcp/middleware/tool-scoring.js.map +1 -1
- package/dist/integrations/mcp/refactored-server.js +4 -0
- package/dist/integrations/mcp/refactored-server.js.map +1 -1
- package/dist/integrations/mcp/server.js +4 -0
- package/dist/integrations/mcp/server.js.map +1 -1
- package/dist/integrations/mcp/tool-definitions-code.js +4 -0
- package/dist/integrations/mcp/tool-definitions-code.js.map +1 -1
- package/dist/integrations/mcp/tool-definitions.js +4 -0
- package/dist/integrations/mcp/tool-definitions.js.map +1 -1
- package/dist/integrations/mcp/trace-test.js +4 -0
- package/dist/integrations/mcp/trace-test.js.map +1 -1
- package/dist/integrations/pg-aiguide/embedding-provider.js +4 -0
- package/dist/integrations/pg-aiguide/embedding-provider.js.map +1 -1
- package/dist/integrations/pg-aiguide/semantic-search.js +4 -0
- package/dist/integrations/pg-aiguide/semantic-search.js.map +1 -1
- package/dist/integrations/pg-aiguide/timescale-analytics.js +4 -0
- package/dist/integrations/pg-aiguide/timescale-analytics.js.map +1 -1
- package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js +4 -0
- package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +1 -1
- package/dist/integrations/ralph/context/context-budget-manager.js +4 -0
- package/dist/integrations/ralph/context/context-budget-manager.js.map +1 -1
- package/dist/integrations/ralph/context/stackmemory-context-loader.js +4 -0
- package/dist/integrations/ralph/context/stackmemory-context-loader.js.map +1 -1
- package/dist/integrations/ralph/coordination/enhanced-coordination.js +4 -0
- package/dist/integrations/ralph/coordination/enhanced-coordination.js.map +1 -1
- package/dist/integrations/ralph/index.js +4 -0
- package/dist/integrations/ralph/index.js.map +1 -1
- package/dist/integrations/ralph/learning/pattern-learner.js +4 -0
- package/dist/integrations/ralph/learning/pattern-learner.js.map +1 -1
- package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js +4 -0
- package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js.map +1 -1
- package/dist/integrations/ralph/monitoring/swarm-dashboard.js +4 -0
- package/dist/integrations/ralph/monitoring/swarm-dashboard.js.map +1 -1
- package/dist/integrations/ralph/monitoring/swarm-registry.js +4 -0
- package/dist/integrations/ralph/monitoring/swarm-registry.js.map +1 -1
- package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js +4 -0
- package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +1 -1
- package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js +4 -0
- package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js.map +1 -1
- package/dist/integrations/ralph/patterns/extended-coherence-sessions.js +4 -0
- package/dist/integrations/ralph/patterns/extended-coherence-sessions.js.map +1 -1
- package/dist/integrations/ralph/patterns/oracle-worker-pattern.js +4 -0
- package/dist/integrations/ralph/patterns/oracle-worker-pattern.js.map +1 -1
- package/dist/integrations/ralph/performance/performance-optimizer.js +4 -0
- package/dist/integrations/ralph/performance/performance-optimizer.js.map +1 -1
- package/dist/integrations/ralph/ralph-integration-demo.js +4 -0
- package/dist/integrations/ralph/ralph-integration-demo.js.map +1 -1
- package/dist/integrations/ralph/recovery/crash-recovery.js +4 -0
- package/dist/integrations/ralph/recovery/crash-recovery.js.map +1 -1
- package/dist/integrations/ralph/state/state-reconciler.js +4 -0
- package/dist/integrations/ralph/state/state-reconciler.js.map +1 -1
- package/dist/integrations/ralph/swarm/git-workflow-manager.js +4 -0
- package/dist/integrations/ralph/swarm/git-workflow-manager.js.map +1 -1
- package/dist/integrations/ralph/swarm/swarm-coordinator.js +4 -0
- package/dist/integrations/ralph/swarm/swarm-coordinator.js.map +1 -1
- package/dist/integrations/ralph/types.js +4 -0
- package/dist/integrations/ralph/visualization/ralph-debugger.js +4 -0
- package/dist/integrations/ralph/visualization/ralph-debugger.js.map +1 -1
- package/dist/mcp/stackmemory-mcp-server.js +4 -0
- package/dist/mcp/stackmemory-mcp-server.js.map +1 -1
- package/dist/middleware/exponential-rate-limiter.js +4 -0
- package/dist/middleware/exponential-rate-limiter.js.map +1 -1
- package/dist/models/user.model.js +4 -0
- package/dist/models/user.model.js.map +1 -1
- package/dist/servers/production/auth-middleware.js +4 -0
- package/dist/servers/production/auth-middleware.js.map +1 -1
- package/dist/servers/railway/config.js +4 -0
- package/dist/servers/railway/config.js.map +1 -1
- package/dist/servers/railway/index-enhanced.js +4 -0
- package/dist/servers/railway/index-enhanced.js.map +1 -1
- package/dist/servers/railway/index.js +4 -0
- package/dist/servers/railway/index.js.map +1 -1
- package/dist/servers/railway/simple.js +4 -0
- package/dist/servers/railway/simple.js.map +1 -1
- package/dist/servers/railway/storage-test.js +4 -0
- package/dist/servers/railway/storage-test.js.map +1 -1
- package/dist/services/config-service.js +4 -0
- package/dist/services/config-service.js.map +1 -1
- package/dist/services/context-service.js +4 -0
- package/dist/services/context-service.js.map +1 -1
- package/dist/skills/api-discovery.js +4 -0
- package/dist/skills/api-discovery.js.map +1 -1
- package/dist/skills/api-skill.js +4 -0
- package/dist/skills/api-skill.js.map +1 -1
- package/dist/skills/claude-skills.js +4 -0
- package/dist/skills/claude-skills.js.map +1 -1
- package/dist/skills/dashboard-launcher.js +4 -0
- package/dist/skills/dashboard-launcher.js.map +1 -1
- package/dist/skills/recursive-agent-orchestrator.js +4 -0
- package/dist/skills/recursive-agent-orchestrator.js.map +1 -1
- package/dist/skills/repo-ingestion-skill.js +4 -0
- package/dist/skills/repo-ingestion-skill.js.map +1 -1
- package/dist/skills/security-secrets-scanner.js +4 -0
- package/dist/skills/security-secrets-scanner.js.map +1 -1
- package/dist/skills/unified-rlm-orchestrator.js +4 -0
- package/dist/skills/unified-rlm-orchestrator.js.map +1 -1
- package/dist/types/task.js +4 -0
- package/dist/utils/env.js +4 -0
- package/dist/utils/env.js.map +1 -1
- package/dist/utils/formatting.js +4 -0
- package/dist/utils/formatting.js.map +1 -1
- package/dist/utils/process-cleanup.js +4 -0
- package/dist/utils/process-cleanup.js.map +1 -1
- package/dist/validation/schemas.js +4 -0
- package/dist/validation/schemas.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/integrations/claude-code/task-coordinator.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * Claude Code Task Coordinator\n *\n * Coordinates task execution between StackMemory and Claude Code's Task tool.\n * Handles agent invocation, result processing, and error recovery.\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { ClaudeCodeAgent } from './agent-bridge.js';\n\nexport interface TaskExecution {\n id: string;\n agentName: string;\n agentType: 'oracle' | 'worker' | 'reviewer';\n prompt: string;\n startTime: number;\n endTime?: number;\n status: 'pending' | 'running' | 'completed' | 'failed';\n result?: string;\n error?: string;\n retryCount: number;\n estimatedCost: number;\n actualTokens?: number;\n}\n\nexport interface CoordinationMetrics {\n totalTasks: number;\n completedTasks: number;\n failedTasks: number;\n averageExecutionTime: number;\n totalCost: number;\n successRate: number;\n agentUtilization: Record<string, number>;\n}\n\n/**\n * Claude Code Task Coordinator\n * Manages task execution and coordination with Claude Code agents\n */\nexport class ClaudeCodeTaskCoordinator {\n private activeTasks: Map<string, TaskExecution> = new Map();\n private completedTasks: TaskExecution[] = [];\n private metrics: CoordinationMetrics;\n\n constructor() {\n this.metrics = {\n totalTasks: 0,\n completedTasks: 0,\n failedTasks: 0,\n averageExecutionTime: 0,\n totalCost: 0,\n successRate: 0,\n agentUtilization: {},\n };\n }\n\n /**\n * Execute task with Claude Code agent\n */\n async executeTask(\n agentName: string,\n agentConfig: ClaudeCodeAgent,\n prompt: string,\n options: {\n maxRetries?: number;\n timeout?: number;\n priority?: 'low' | 'medium' | 'high';\n } = {}\n ): Promise<string> {\n const taskId = uuidv4();\n const { maxRetries = 2, timeout = 300000, priority = 'medium' } = options;\n\n const task: TaskExecution = {\n id: taskId,\n agentName,\n agentType: agentConfig.type,\n prompt,\n startTime: Date.now(),\n status: 'pending',\n retryCount: 0,\n estimatedCost: this.estimateTaskCost(prompt, agentConfig),\n };\n\n this.activeTasks.set(taskId, task);\n this.metrics.totalTasks++;\n\n logger.info('Starting Claude Code task execution', {\n taskId,\n agentName,\n agentType: agentConfig.type,\n promptLength: prompt.length,\n estimatedCost: task.estimatedCost,\n priority,\n });\n\n try {\n // Execute with retries\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n task.retryCount = attempt;\n task.status = 'running';\n\n // Execute the task with timeout\n const result = await this.executeWithTimeout(\n () => this.invokeClaudeCodeAgent(agentName, prompt, agentConfig),\n timeout\n );\n\n // Task completed successfully\n task.status = 'completed';\n task.result = result;\n task.endTime = Date.now();\n task.actualTokens = this.estimateTokenUsage(prompt, result);\n\n this.completeTask(task);\n return result;\n } catch (error) {\n lastError = error as Error;\n task.status = 'failed';\n\n logger.warn(`Claude Code task attempt ${attempt + 1} failed`, {\n taskId,\n agentName,\n error: lastError.message,\n attempt: attempt + 1,\n maxRetries: maxRetries + 1,\n });\n\n // Don't retry if it's the last attempt\n if (attempt === maxRetries) {\n break;\n }\n\n // Wait before retry with exponential backoff\n const backoffMs = Math.min(1000 * Math.pow(2, attempt), 10000);\n await new Promise((resolve) => setTimeout(resolve, backoffMs));\n }\n }\n\n // All retries exhausted\n task.error = lastError?.message || 'Unknown error';\n task.endTime = Date.now();\n this.failTask(task, lastError!);\n throw lastError;\n } finally {\n this.activeTasks.delete(taskId);\n }\n }\n\n /**\n * Execute multiple tasks in parallel with coordination\n */\n async executeParallelTasks(\n tasks: {\n agentName: string;\n agentConfig: ClaudeCodeAgent;\n prompt: string;\n priority?: 'low' | 'medium' | 'high';\n }[]\n ): Promise<{ results: string[]; failures: Error[] }> {\n logger.info('Executing parallel Claude Code tasks', {\n taskCount: tasks.length,\n agents: tasks.map((t) => t.agentName),\n });\n\n // Group tasks by priority\n const priorityGroups = {\n high: tasks.filter((t) => t.priority === 'high'),\n medium: tasks.filter((t) => t.priority === 'medium'),\n low: tasks.filter((t) => t.priority === 'low'),\n };\n\n const results: string[] = [];\n const failures: Error[] = [];\n\n // Execute high priority tasks first\n for (const priorityLevel of ['high', 'medium', 'low'] as const) {\n const priorityTasks = priorityGroups[priorityLevel];\n if (priorityTasks.length === 0) continue;\n\n logger.info(`Executing ${priorityLevel} priority tasks`, {\n count: priorityTasks.length,\n });\n\n // Execute tasks in this priority level concurrently\n const promises = priorityTasks.map(async (task) => {\n try {\n const result = await this.executeTask(\n task.agentName,\n task.agentConfig,\n task.prompt,\n { priority: task.priority }\n );\n return { success: true, result };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n });\n\n const outcomes = await Promise.allSettled(promises);\n\n for (const outcome of outcomes) {\n if (outcome.status === 'fulfilled') {\n if (outcome.value.success) {\n results.push(outcome.value.result);\n } else {\n failures.push(outcome.value.error);\n }\n } else {\n failures.push(new Error(outcome.reason));\n }\n }\n }\n\n logger.info('Parallel task execution completed', {\n totalTasks: tasks.length,\n successful: results.length,\n failed: failures.length,\n successRate: ((results.length / tasks.length) * 100).toFixed(1),\n });\n\n return { results, failures };\n }\n\n /**\n * Get coordination metrics and health status\n */\n getCoordinationMetrics(): CoordinationMetrics & {\n activeTasks: number;\n recentErrors: string[];\n performanceTrend: 'improving' | 'stable' | 'degrading';\n } {\n // Calculate recent error rate for performance trend\n const recentTasks = this.completedTasks.slice(-10);\n const recentErrorRate =\n recentTasks.length > 0\n ? recentTasks.filter((t) => t.status === 'failed').length /\n recentTasks.length\n : 0;\n\n const performanceTrend =\n recentErrorRate < 0.1\n ? 'improving'\n : recentErrorRate < 0.3\n ? 'stable'\n : 'degrading';\n\n const recentErrors = this.completedTasks\n .slice(-5)\n .filter((t) => t.status === 'failed')\n .map((t) => t.error || 'Unknown error');\n\n return {\n ...this.metrics,\n activeTasks: this.activeTasks.size,\n recentErrors,\n performanceTrend,\n };\n }\n\n /**\n * Clean up resources and reset metrics\n */\n async cleanup(): Promise<void> {\n logger.info('Cleaning up Claude Code Task Coordinator', {\n activeTasks: this.activeTasks.size,\n completedTasks: this.completedTasks.length,\n });\n\n // Wait for active tasks to complete or force cleanup after timeout\n if (this.activeTasks.size > 0) {\n const timeoutPromise = new Promise((resolve) =>\n setTimeout(resolve, 30000)\n );\n const completionPromise = this.waitForTaskCompletion();\n\n await Promise.race([completionPromise, timeoutPromise]);\n\n if (this.activeTasks.size > 0) {\n logger.warn('Force terminating active tasks', {\n remainingTasks: this.activeTasks.size,\n });\n }\n }\n\n this.activeTasks.clear();\n this.completedTasks = [];\n this.resetMetrics();\n }\n\n /**\n * Execute with timeout wrapper\n */\n private async executeWithTimeout<T>(\n fn: () => Promise<T>,\n timeoutMs: number\n ): Promise<T> {\n const timeoutPromise = new Promise<T>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Task execution timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n return Promise.race([fn(), timeoutPromise]);\n }\n\n /**\n * Invoke Claude Code agent (integration point)\n */\n private async invokeClaudeCodeAgent(\n agentName: string,\n prompt: string,\n agentConfig: ClaudeCodeAgent\n ): Promise<string> {\n logger.debug('Invoking Claude Code agent', {\n agentName,\n agentType: agentConfig.type,\n promptTokens: this.estimateTokenUsage(prompt, ''),\n });\n\n // TODO: Replace with actual Claude Code Task tool invocation\n // This is where we would call Claude Code's Task tool:\n /*\n const result = await claudeCodeTask({\n subagent_type: agentName,\n prompt: prompt,\n description: `${agentConfig.type} task execution`\n });\n \n return result.output;\n */\n\n // For now, simulate the Claude Code agent execution\n return this.simulateClaudeCodeExecution(agentName, prompt, agentConfig);\n }\n\n /**\n * Simulate Claude Code execution (temporary until real integration)\n */\n private simulateClaudeCodeExecution(\n agentName: string,\n prompt: string,\n agentConfig: ClaudeCodeAgent\n ): Promise<string> {\n return new Promise((resolve) => {\n // Simulate execution time based on agent type and complexity\n const executionTime =\n agentConfig.type === 'oracle'\n ? 2000 + Math.random() * 3000 // 2-5 seconds for Oracle\n : 1000 + Math.random() * 2000; // 1-3 seconds for Workers\n\n setTimeout(() => {\n const result = `Claude Code agent '${agentName}' completed task successfully.\n \nAgent Capabilities Used: ${agentConfig.capabilities.slice(0, 3).join(', ')}\nTask Type: ${agentConfig.type}\nSpecializations: ${agentConfig.specializations.join(', ')}\n\nSimulated output based on prompt context: ${prompt.substring(0, 100)}...\n\nThis simulation will be replaced with actual Claude Code Task tool integration.`;\n\n resolve(result);\n }, executionTime);\n });\n }\n\n /**\n * Complete a successful task\n */\n private completeTask(task: TaskExecution): void {\n this.completedTasks.push({ ...task });\n this.metrics.completedTasks++;\n\n // Update metrics\n this.updateExecutionMetrics(task);\n this.updateAgentUtilization(task.agentName);\n this.updateSuccessRate();\n\n logger.info('Claude Code task completed', {\n taskId: task.id,\n agentName: task.agentName,\n executionTime: task.endTime! - task.startTime,\n retries: task.retryCount,\n cost: this.calculateActualCost(task),\n });\n }\n\n /**\n * Handle a failed task\n */\n private failTask(task: TaskExecution, error: Error): void {\n this.completedTasks.push({ ...task });\n this.metrics.failedTasks++;\n\n this.updateExecutionMetrics(task);\n this.updateSuccessRate();\n\n logger.error('Claude Code task failed', {\n taskId: task.id,\n agentName: task.agentName,\n error: error.message,\n retries: task.retryCount,\n executionTime: task.endTime! - task.startTime,\n });\n }\n\n /**\n * Update execution time metrics\n */\n private updateExecutionMetrics(task: TaskExecution): void {\n if (!task.endTime) return;\n\n const executionTime = task.endTime - task.startTime;\n const totalTasks = this.metrics.completedTasks + this.metrics.failedTasks;\n\n if (totalTasks === 1) {\n this.metrics.averageExecutionTime = executionTime;\n } else {\n this.metrics.averageExecutionTime =\n (this.metrics.averageExecutionTime * (totalTasks - 1) + executionTime) /\n totalTasks;\n }\n\n this.metrics.totalCost += this.calculateActualCost(task);\n }\n\n /**\n * Update agent utilization metrics\n */\n private updateAgentUtilization(agentName: string): void {\n this.metrics.agentUtilization[agentName] =\n (this.metrics.agentUtilization[agentName] || 0) + 1;\n }\n\n /**\n * Update success rate\n */\n private updateSuccessRate(): void {\n const total = this.metrics.completedTasks + this.metrics.failedTasks;\n this.metrics.successRate =\n total > 0 ? this.metrics.completedTasks / total : 0;\n }\n\n /**\n * Estimate task cost based on prompt and agent\n */\n private estimateTaskCost(\n prompt: string,\n agentConfig: ClaudeCodeAgent\n ): number {\n const estimatedTokens = this.estimateTokenUsage(prompt, '');\n const baseCost = agentConfig.type === 'oracle' ? 0.015 : 0.00025; // per 1K tokens\n return (estimatedTokens / 1000) * baseCost * agentConfig.costMultiplier;\n }\n\n /**\n * Estimate token usage\n */\n private estimateTokenUsage(prompt: string, response: string): number {\n // Rough estimation: ~4 characters per token\n return Math.ceil((prompt.length + response.length) / 4);\n }\n\n /**\n * Calculate actual task cost\n */\n private calculateActualCost(task: TaskExecution): number {\n if (!task.actualTokens) return task.estimatedCost;\n\n const baseCost = task.agentType === 'oracle' ? 0.015 : 0.00025;\n return (task.actualTokens / 1000) * baseCost;\n }\n\n /**\n * Wait for all active tasks to complete\n */\n private async waitForTaskCompletion(): Promise<void> {\n while (this.activeTasks.size > 0) {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n\n /**\n * Reset metrics\n */\n private resetMetrics(): void {\n this.metrics = {\n totalTasks: 0,\n completedTasks: 0,\n failedTasks: 0,\n averageExecutionTime: 0,\n totalCost: 0,\n successRate: 0,\n agentUtilization: {},\n };\n }\n\n /**\n * Get active task status\n */\n getActiveTaskStatus(): {\n taskId: string;\n agentName: string;\n status: string;\n runtime: number;\n }[] {\n return Array.from(this.activeTasks.values()).map((task) => ({\n taskId: task.id,\n agentName: task.agentName,\n status: task.status,\n runtime: Date.now() - task.startTime,\n }));\n }\n\n /**\n * Cancel active task\n */\n async cancelTask(taskId: string): Promise<boolean> {\n const task = this.activeTasks.get(taskId);\n if (!task) return false;\n\n task.status = 'failed';\n task.error = 'Task cancelled by user';\n task.endTime = Date.now();\n\n this.failTask(task, new Error('Task cancelled'));\n this.activeTasks.delete(taskId);\n\n logger.info('Task cancelled', { taskId, agentName: task.agentName });\n return true;\n }\n}\n\nexport default ClaudeCodeTaskCoordinator;\n"],
|
|
5
|
-
"mappings": "AAOA,SAAS,MAAM,cAAc;AAC7B,SAAS,cAAc;AAgChB,MAAM,0BAA0B;AAAA,EAC7B,cAA0C,oBAAI,IAAI;AAAA,EAClD,iBAAkC,CAAC;AAAA,EACnC;AAAA,EAER,cAAc;AACZ,SAAK,UAAU;AAAA,MACb,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,sBAAsB;AAAA,MACtB,WAAW;AAAA,MACX,aAAa;AAAA,MACb,kBAAkB,CAAC;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,WACA,aACA,QACA,UAII,CAAC,GACY;AACjB,UAAM,SAAS,OAAO;AACtB,UAAM,EAAE,aAAa,GAAG,UAAU,KAAQ,WAAW,SAAS,IAAI;AAElE,UAAM,OAAsB;AAAA,MAC1B,IAAI;AAAA,MACJ;AAAA,MACA,WAAW,YAAY;AAAA,MACvB;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,eAAe,KAAK,iBAAiB,QAAQ,WAAW;AAAA,IAC1D;AAEA,SAAK,YAAY,IAAI,QAAQ,IAAI;AACjC,SAAK,QAAQ;AAEb,WAAO,KAAK,uCAAuC;AAAA,MACjD;AAAA,MACA;AAAA,MACA,WAAW,YAAY;AAAA,MACvB,cAAc,OAAO;AAAA,MACrB,eAAe,KAAK;AAAA,MACpB;AAAA,IACF,CAAC;AAED,QAAI;AAEF,UAAI,YAA0B;AAE9B,eAAS,UAAU,GAAG,WAAW,YAAY,WAAW;AACtD,YAAI;AACF,eAAK,aAAa;AAClB,eAAK,SAAS;AAGd,gBAAM,SAAS,MAAM,KAAK;AAAA,YACxB,MAAM,KAAK,sBAAsB,WAAW,QAAQ,WAAW;AAAA,YAC/D;AAAA,UACF;AAGA,eAAK,SAAS;AACd,eAAK,SAAS;AACd,eAAK,UAAU,KAAK,IAAI;AACxB,eAAK,eAAe,KAAK,mBAAmB,QAAQ,MAAM;AAE1D,eAAK,aAAa,IAAI;AACtB,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,sBAAY;AACZ,eAAK,SAAS;AAEd,iBAAO,KAAK,4BAA4B,UAAU,CAAC,WAAW;AAAA,YAC5D;AAAA,YACA;AAAA,YACA,OAAO,UAAU;AAAA,YACjB,SAAS,UAAU;AAAA,YACnB,YAAY,aAAa;AAAA,UAC3B,CAAC;AAGD,cAAI,YAAY,YAAY;AAC1B;AAAA,UACF;AAGA,gBAAM,YAAY,KAAK,IAAI,MAAO,KAAK,IAAI,GAAG,OAAO,GAAG,GAAK;AAC7D,gBAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,SAAS,CAAC;AAAA,QAC/D;AAAA,MACF;AAGA,WAAK,QAAQ,WAAW,WAAW;AACnC,WAAK,UAAU,KAAK,IAAI;AACxB,WAAK,SAAS,MAAM,SAAU;AAC9B,YAAM;AAAA,IACR,UAAE;AACA,WAAK,YAAY,OAAO,MAAM;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBACJ,OAMmD;AACnD,WAAO,KAAK,wCAAwC;AAAA,MAClD,WAAW,MAAM;AAAA,MACjB,QAAQ,MAAM,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,IACtC,CAAC;AAGD,UAAM,iBAAiB;AAAA,MACrB,MAAM,MAAM,OAAO,CAAC,MAAM,EAAE,aAAa,MAAM;AAAA,MAC/C,QAAQ,MAAM,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ;AAAA,MACnD,KAAK,MAAM,OAAO,CAAC,MAAM,EAAE,aAAa,KAAK;AAAA,IAC/C;AAEA,UAAM,UAAoB,CAAC;AAC3B,UAAM,WAAoB,CAAC;AAG3B,eAAW,iBAAiB,CAAC,QAAQ,UAAU,KAAK,GAAY;AAC9D,YAAM,gBAAgB,eAAe,aAAa;AAClD,UAAI,cAAc,WAAW,EAAG;AAEhC,aAAO,KAAK,aAAa,aAAa,mBAAmB;AAAA,QACvD,OAAO,cAAc;AAAA,MACvB,CAAC;AAGD,YAAM,WAAW,cAAc,IAAI,OAAO,SAAS;AACjD,YAAI;AACF,gBAAM,SAAS,MAAM,KAAK;AAAA,YACxB,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,EAAE,UAAU,KAAK,SAAS;AAAA,UAC5B;AACA,iBAAO,EAAE,SAAS,MAAM,OAAO;AAAA,QACjC,SAAS,OAAO;AACd,iBAAO,EAAE,SAAS,OAAO,MAAsB;AAAA,QACjD;AAAA,MACF,CAAC;AAED,YAAM,WAAW,MAAM,QAAQ,WAAW,QAAQ;AAElD,iBAAW,WAAW,UAAU;AAC9B,YAAI,QAAQ,WAAW,aAAa;AAClC,cAAI,QAAQ,MAAM,SAAS;AACzB,oBAAQ,KAAK,QAAQ,MAAM,MAAM;AAAA,UACnC,OAAO;AACL,qBAAS,KAAK,QAAQ,MAAM,KAAK;AAAA,UACnC;AAAA,QACF,OAAO;AACL,mBAAS,KAAK,IAAI,MAAM,QAAQ,MAAM,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,WAAO,KAAK,qCAAqC;AAAA,MAC/C,YAAY,MAAM;AAAA,MAClB,YAAY,QAAQ;AAAA,MACpB,QAAQ,SAAS;AAAA,MACjB,cAAe,QAAQ,SAAS,MAAM,SAAU,KAAK,QAAQ,CAAC;AAAA,IAChE,CAAC;AAED,WAAO,EAAE,SAAS,SAAS;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,yBAIE;AAEA,UAAM,cAAc,KAAK,eAAe,MAAM,GAAG;AACjD,UAAM,kBACJ,YAAY,SAAS,IACjB,YAAY,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAE,SACjD,YAAY,SACZ;AAEN,UAAM,mBACJ,kBAAkB,MACd,cACA,kBAAkB,MAChB,WACA;AAER,UAAM,eAAe,KAAK,eACvB,MAAM,EAAE,EACR,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,EACnC,IAAI,CAAC,MAAM,EAAE,SAAS,eAAe;AAExC,WAAO;AAAA,MACL,GAAG,KAAK;AAAA,MACR,aAAa,KAAK,YAAY;AAAA,MAC9B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAyB;AAC7B,WAAO,KAAK,4CAA4C;AAAA,MACtD,aAAa,KAAK,YAAY;AAAA,MAC9B,gBAAgB,KAAK,eAAe;AAAA,IACtC,CAAC;AAGD,QAAI,KAAK,YAAY,OAAO,GAAG;AAC7B,YAAM,iBAAiB,IAAI;AAAA,QAAQ,CAAC,YAClC,WAAW,SAAS,GAAK;AAAA,MAC3B;AACA,YAAM,oBAAoB,KAAK,sBAAsB;AAErD,YAAM,QAAQ,KAAK,CAAC,mBAAmB,cAAc,CAAC;AAEtD,UAAI,KAAK,YAAY,OAAO,GAAG;AAC7B,eAAO,KAAK,kCAAkC;AAAA,UAC5C,gBAAgB,KAAK,YAAY;AAAA,QACnC,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,YAAY,MAAM;AACvB,SAAK,iBAAiB,CAAC;AACvB,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBACZ,IACA,WACY;AACZ,UAAM,iBAAiB,IAAI,QAAW,CAAC,GAAG,WAAW;AACnD,iBAAW,MAAM;AACf,eAAO,IAAI,MAAM,gCAAgC,SAAS,IAAI,CAAC;AAAA,MACjE,GAAG,SAAS;AAAA,IACd,CAAC;AAED,WAAO,QAAQ,KAAK,CAAC,GAAG,GAAG,cAAc,CAAC;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,sBACZ,WACA,QACA,aACiB;AACjB,WAAO,MAAM,8BAA8B;AAAA,MACzC;AAAA,MACA,WAAW,YAAY;AAAA,MACvB,cAAc,KAAK,mBAAmB,QAAQ,EAAE;AAAA,IAClD,CAAC;AAeD,WAAO,KAAK,4BAA4B,WAAW,QAAQ,WAAW;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKQ,4BACN,WACA,QACA,aACiB;AACjB,WAAO,IAAI,QAAQ,CAAC,YAAY;AAE9B,YAAM,gBACJ,YAAY,SAAS,WACjB,MAAO,KAAK,OAAO,IAAI,MACvB,MAAO,KAAK,OAAO,IAAI;AAE7B,iBAAW,MAAM;AACf,cAAM,SAAS,sBAAsB,SAAS;AAAA;AAAA,2BAE3B,YAAY,aAAa,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,aAC7D,YAAY,IAAI;AAAA,mBACV,YAAY,gBAAgB,KAAK,IAAI,CAAC;AAAA;AAAA,4CAEb,OAAO,UAAU,GAAG,GAAG,CAAC;AAAA;AAAA;AAI5D,gBAAQ,MAAM;AAAA,MAChB,GAAG,aAAa;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,MAA2B;AAC9C,SAAK,eAAe,KAAK,EAAE,GAAG,KAAK,CAAC;AACpC,SAAK,QAAQ;AAGb,SAAK,uBAAuB,IAAI;AAChC,SAAK,uBAAuB,KAAK,SAAS;AAC1C,SAAK,kBAAkB;AAEvB,WAAO,KAAK,8BAA8B;AAAA,MACxC,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,eAAe,KAAK,UAAW,KAAK;AAAA,MACpC,SAAS,KAAK;AAAA,MACd,MAAM,KAAK,oBAAoB,IAAI;AAAA,IACrC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,MAAqB,OAAoB;AACxD,SAAK,eAAe,KAAK,EAAE,GAAG,KAAK,CAAC;AACpC,SAAK,QAAQ;AAEb,SAAK,uBAAuB,IAAI;AAChC,SAAK,kBAAkB;AAEvB,WAAO,MAAM,2BAA2B;AAAA,MACtC,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,OAAO,MAAM;AAAA,MACb,SAAS,KAAK;AAAA,MACd,eAAe,KAAK,UAAW,KAAK;AAAA,IACtC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,MAA2B;AACxD,QAAI,CAAC,KAAK,QAAS;AAEnB,UAAM,gBAAgB,KAAK,UAAU,KAAK;AAC1C,UAAM,aAAa,KAAK,QAAQ,iBAAiB,KAAK,QAAQ;AAE9D,QAAI,eAAe,GAAG;AACpB,WAAK,QAAQ,uBAAuB;AAAA,IACtC,OAAO;AACL,WAAK,QAAQ,wBACV,KAAK,QAAQ,wBAAwB,aAAa,KAAK,iBACxD;AAAA,IACJ;AAEA,SAAK,QAAQ,aAAa,KAAK,oBAAoB,IAAI;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,WAAyB;AACtD,SAAK,QAAQ,iBAAiB,SAAS,KACpC,KAAK,QAAQ,iBAAiB,SAAS,KAAK,KAAK;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAA0B;AAChC,UAAM,QAAQ,KAAK,QAAQ,iBAAiB,KAAK,QAAQ;AACzD,SAAK,QAAQ,cACX,QAAQ,IAAI,KAAK,QAAQ,iBAAiB,QAAQ;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKQ,iBACN,QACA,aACQ;AACR,UAAM,kBAAkB,KAAK,mBAAmB,QAAQ,EAAE;AAC1D,UAAM,WAAW,YAAY,SAAS,WAAW,QAAQ;AACzD,WAAQ,kBAAkB,MAAQ,WAAW,YAAY;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,QAAgB,UAA0B;AAEnE,WAAO,KAAK,MAAM,OAAO,SAAS,SAAS,UAAU,CAAC;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,MAA6B;AACvD,QAAI,CAAC,KAAK,aAAc,QAAO,KAAK;AAEpC,UAAM,WAAW,KAAK,cAAc,WAAW,QAAQ;AACvD,WAAQ,KAAK,eAAe,MAAQ;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,wBAAuC;AACnD,WAAO,KAAK,YAAY,OAAO,GAAG;AAChC,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAI,CAAC;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAqB;AAC3B,SAAK,UAAU;AAAA,MACb,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,sBAAsB;AAAA,MACtB,WAAW;AAAA,MACX,aAAa;AAAA,MACb,kBAAkB,CAAC;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,sBAKI;AACF,WAAO,MAAM,KAAK,KAAK,YAAY,OAAO,CAAC,EAAE,IAAI,CAAC,UAAU;AAAA,MAC1D,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK,IAAI,IAAI,KAAK;AAAA,IAC7B,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,QAAkC;AACjD,UAAM,OAAO,KAAK,YAAY,IAAI,MAAM;AACxC,QAAI,CAAC,KAAM,QAAO;AAElB,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,SAAK,UAAU,KAAK,IAAI;AAExB,SAAK,SAAS,MAAM,IAAI,MAAM,gBAAgB,CAAC;AAC/C,SAAK,YAAY,OAAO,MAAM;AAE9B,WAAO,KAAK,kBAAkB,EAAE,QAAQ,WAAW,KAAK,UAAU,CAAC;AACnE,WAAO;AAAA,EACT;AACF;AAEA,IAAO,2BAAQ;",
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
+
import { dirname as __pathDirname } from 'path';
|
|
3
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __pathDirname(__filename);
|
|
1
5
|
import { createHash, randomBytes } from "crypto";
|
|
2
6
|
import { readFileSync, writeFileSync, existsSync } from "fs";
|
|
3
7
|
import { join } from "path";
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/integrations/linear/auth.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * Linear OAuth Authentication Setup\n * Handles initial OAuth flow and token management for Linear integration\n */\n\nimport { createHash, randomBytes } from 'crypto';\nimport { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { logger } from '../../core/monitoring/logger.js';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\n\nexport interface LinearAuthConfig {\n clientId: string;\n clientSecret: string;\n redirectUri: string;\n scopes: string[];\n}\n\nexport interface LinearTokens {\n accessToken: string;\n refreshToken?: string;\n expiresAt: number; // Unix timestamp\n scope: string[];\n}\n\nexport interface LinearAuthResult {\n accessToken: string;\n refreshToken?: string;\n expiresIn: number;\n scope: string;\n tokenType: string;\n}\n\nexport class LinearAuthManager {\n private configPath: string;\n private tokensPath: string;\n private config?: LinearAuthConfig;\n\n constructor(projectRoot: string) {\n const configDir = join(projectRoot, '.stackmemory');\n this.configPath = join(configDir, 'linear-config.json');\n this.tokensPath = join(configDir, 'linear-tokens.json');\n }\n\n /**\n * Check if Linear integration is configured\n */\n isConfigured(): boolean {\n return existsSync(this.configPath) && existsSync(this.tokensPath);\n }\n\n /**\n * Save OAuth application configuration\n */\n saveConfig(config: LinearAuthConfig): void {\n writeFileSync(this.configPath, JSON.stringify(config, null, 2));\n this.config = config;\n logger.info('Linear OAuth configuration saved');\n }\n\n /**\n * Load OAuth configuration\n */\n loadConfig(): LinearAuthConfig | null {\n if (!existsSync(this.configPath)) {\n return null;\n }\n\n try {\n const configData = readFileSync(this.configPath, 'utf8');\n this.config = JSON.parse(configData);\n return this.config!;\n } catch (error: unknown) {\n logger.error('Failed to load Linear configuration:', error as Error);\n return null;\n }\n }\n\n /**\n * Generate OAuth authorization URL with PKCE\n */\n generateAuthUrl(state?: string): { url: string; codeVerifier: string } {\n if (!this.config) {\n throw new Error('Linear OAuth configuration not loaded');\n }\n\n // Generate PKCE parameters\n const codeVerifier = randomBytes(32).toString('base64url');\n const codeChallenge = createHash('sha256')\n .update(codeVerifier)\n .digest('base64url');\n\n const params = new URLSearchParams({\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n response_type: 'code',\n scope: this.config.scopes.join(' '),\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n actor: 'app', // Enable actor authorization for service accounts\n });\n\n if (state) {\n params.set('state', state);\n }\n\n const authUrl = `https://linear.app/oauth/authorize?${params.toString()}`;\n\n return { url: authUrl, codeVerifier };\n }\n\n /**\n * Exchange authorization code for access token\n */\n async exchangeCodeForToken(\n authCode: string,\n codeVerifier: string\n ): Promise<LinearTokens> {\n if (!this.config) {\n throw new Error('Linear OAuth configuration not loaded');\n }\n\n const tokenUrl = 'https://api.linear.app/oauth/token';\n\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n redirect_uri: this.config.redirectUri,\n code: authCode,\n code_verifier: codeVerifier,\n });\n\n const response = await fetch(tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n },\n body: body.toString(),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Token exchange failed: ${response.status} ${errorText}`);\n }\n\n const result = (await response.json()) as LinearAuthResult;\n\n // Calculate expiration time (tokens expire in 24 hours)\n const expiresAt = Date.now() + result.expiresIn * 1000;\n\n const tokens: LinearTokens = {\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n expiresAt,\n scope: result.scope.split(' '),\n };\n\n this.saveTokens(tokens);\n return tokens;\n }\n\n /**\n * Refresh access token using refresh token\n */\n async refreshAccessToken(): Promise<LinearTokens> {\n if (!this.config) {\n throw new Error('Linear OAuth configuration not loaded');\n }\n\n const currentTokens = this.loadTokens();\n if (!currentTokens?.refreshToken) {\n throw new Error('No refresh token available');\n }\n\n const tokenUrl = 'https://api.linear.app/oauth/token';\n\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n refresh_token: currentTokens.refreshToken,\n });\n\n const response = await fetch(tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n },\n body: body.toString(),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Token refresh failed: ${response.status} ${errorText}`);\n }\n\n const result = (await response.json()) as LinearAuthResult;\n\n const tokens: LinearTokens = {\n accessToken: result.accessToken,\n refreshToken: result.refreshToken || currentTokens.refreshToken,\n expiresAt: Date.now() + result.expiresIn * 1000,\n scope: result.scope.split(' '),\n };\n\n this.saveTokens(tokens);\n return tokens;\n }\n\n /**\n * Get valid access token (refresh if needed)\n */\n async getValidToken(): Promise<string> {\n const tokens = this.loadTokens();\n if (!tokens) {\n throw new Error('No Linear tokens found. Please complete OAuth setup.');\n }\n\n // Check if token expires in next 5 minutes\n const fiveMinutes = 5 * 60 * 1000;\n if (tokens.expiresAt - Date.now() < fiveMinutes) {\n logger.info('Linear token expiring soon, refreshing...');\n const newTokens = await this.refreshAccessToken();\n return newTokens.accessToken;\n }\n\n return tokens.accessToken;\n }\n\n /**\n * Save tokens to file\n */\n private saveTokens(tokens: LinearTokens): void {\n writeFileSync(this.tokensPath, JSON.stringify(tokens, null, 2));\n logger.info('Linear tokens saved');\n }\n\n /**\n * Load tokens from file\n */\n loadTokens(): LinearTokens | null {\n if (!existsSync(this.tokensPath)) {\n return null;\n }\n\n try {\n const tokensData = readFileSync(this.tokensPath, 'utf8');\n return JSON.parse(tokensData);\n } catch (error: unknown) {\n logger.error('Failed to load Linear tokens:', error as Error);\n return null;\n }\n }\n\n /**\n * Clear stored tokens and config\n */\n clearAuth(): void {\n if (existsSync(this.tokensPath)) {\n writeFileSync(this.tokensPath, '');\n }\n if (existsSync(this.configPath)) {\n writeFileSync(this.configPath, '');\n }\n logger.info('Linear authentication cleared');\n }\n}\n\n/**\n * Default Linear OAuth scopes for task management\n */\nexport const DEFAULT_LINEAR_SCOPES = [\n 'read', // Read issues, projects, teams\n 'write', // Create and update issues\n 'admin', // Manage team settings and workflows\n];\n\n/**\n * Linear OAuth setup helper\n */\nexport class LinearOAuthSetup {\n private authManager: LinearAuthManager;\n\n constructor(projectRoot: string) {\n this.authManager = new LinearAuthManager(projectRoot);\n }\n\n /**\n * Interactive setup for Linear OAuth\n */\n async setupInteractive(): Promise<{\n authUrl: string;\n instructions: string[];\n }> {\n // For now, we'll provide manual setup instructions\n // In a full implementation, this could open a browser or use a local server\n\n const config: LinearAuthConfig = {\n clientId: process.env['LINEAR_CLIENT_ID'] || '',\n clientSecret: process.env['LINEAR_CLIENT_SECRET'] || '',\n redirectUri:\n process.env['LINEAR_REDIRECT_URI'] ||\n 'http://localhost:3456/auth/linear/callback',\n scopes: DEFAULT_LINEAR_SCOPES,\n };\n\n if (!config.clientId || !config.clientSecret) {\n return {\n authUrl: '',\n instructions: [\n '1. Create a Linear OAuth application at https://linear.app/settings/api',\n '2. Set redirect URI to: http://localhost:3456/auth/linear/callback',\n '3. Copy your Client ID and Client Secret',\n '4. Set environment variables:',\n ' export LINEAR_CLIENT_ID=\"your_client_id\"',\n ' export LINEAR_CLIENT_SECRET=\"your_client_secret\"',\n '5. Re-run this setup command',\n ],\n };\n }\n\n this.authManager.saveConfig(config);\n\n const { url, codeVerifier } = this.authManager.generateAuthUrl();\n\n // Store code verifier temporarily (in a real app, this would be in a secure session store)\n process.env['_LINEAR_CODE_VERIFIER'] = codeVerifier;\n\n return {\n authUrl: url,\n instructions: [\n '1. Open this URL in your browser:',\n url,\n '',\n '2. Approve the StackMemory integration',\n '3. Copy the authorization code from the redirect URL',\n '4. Run: stackmemory linear authorize <code>',\n ],\n };\n }\n\n /**\n * Complete OAuth flow with authorization code\n */\n async completeAuth(authCode: string): Promise<boolean> {\n try {\n const codeVerifier = process.env['_LINEAR_CODE_VERIFIER'];\n if (!codeVerifier) {\n throw new Error(\n 'Code verifier not found. Please restart the setup process.'\n );\n }\n\n await this.authManager.exchangeCodeForToken(authCode, codeVerifier);\n delete process.env['_LINEAR_CODE_VERIFIER'];\n\n logger.info('Linear OAuth setup completed successfully!');\n return true;\n } catch (error: unknown) {\n logger.error('Failed to complete Linear OAuth setup:', error as Error);\n return false;\n }\n }\n\n /**\n * Test the Linear connection\n */\n async testConnection(): Promise<boolean> {\n try {\n const token = await this.authManager.getValidToken();\n\n // Test with a simple GraphQL query\n const response = await fetch('https://api.linear.app/graphql', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n query: 'query { viewer { id name email } }',\n }),\n });\n\n if (response.ok) {\n const result = (await response.json()) as {\n data?: { viewer?: { id: string; name: string; email: string } };\n };\n if (result.data?.viewer) {\n logger.info(\n `Connected to Linear as: ${result.data.viewer.name} (${result.data.viewer.email})`\n );\n return true;\n }\n }\n\n return false;\n } catch (error: unknown) {\n logger.error('Linear connection test failed:', error as Error);\n return false;\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
+
import { dirname as __pathDirname } from 'path';
|
|
3
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __pathDirname(__filename);
|
|
1
5
|
import { logger } from "../../core/monitoring/logger.js";
|
|
2
6
|
import { LinearTaskManager } from "../../features/tasks/linear-task-manager.js";
|
|
3
7
|
import { LinearAuthManager } from "./auth.js";
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/integrations/linear/auto-sync.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * Linear Auto-Sync Service\n * Background service for automatic bidirectional synchronization\n */\n\nimport { logger } from '../../core/monitoring/logger.js';\nimport { LinearTaskManager } from '../../features/tasks/linear-task-manager.js';\nimport { LinearAuthManager } from './auth.js';\nimport { LinearSyncEngine, DEFAULT_SYNC_CONFIG, SyncConfig } from './sync.js';\nimport { LinearConfigManager } from './config.js';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\n\nexport interface AutoSyncConfig extends SyncConfig {\n enabled: boolean;\n interval: number; // minutes\n retryAttempts: number;\n retryDelay: number; // milliseconds\n quietHours?: {\n start: number; // hour 0-23\n end: number; // hour 0-23\n };\n}\n\nexport class LinearAutoSyncService {\n private config: AutoSyncConfig;\n private projectRoot: string;\n private configManager: LinearConfigManager;\n private syncEngine?: LinearSyncEngine;\n private intervalId?: NodeJS.Timeout;\n private isRunning = false;\n private lastSyncTime = 0;\n private retryCount = 0;\n\n constructor(projectRoot: string, config?: Partial<AutoSyncConfig>) {\n this.projectRoot = projectRoot;\n this.configManager = new LinearConfigManager(projectRoot);\n\n // Load persisted config or use defaults\n const persistedConfig = this.configManager.loadConfig();\n const baseConfig = persistedConfig\n ? this.configManager.toAutoSyncConfig(persistedConfig)\n : {\n ...DEFAULT_SYNC_CONFIG,\n enabled: true,\n interval: 5,\n retryAttempts: 3,\n retryDelay: 30000,\n autoSync: true,\n direction: 'bidirectional' as const,\n conflictResolution: 'newest_wins' as const,\n quietHours: { start: 22, end: 7 },\n };\n\n this.config = { ...baseConfig, ...config };\n\n // Save any new config updates\n if (config && Object.keys(config).length > 0) {\n this.configManager.saveConfig(config);\n }\n }\n\n /**\n * Start the auto-sync service\n */\n async start(): Promise<void> {\n if (this.isRunning) {\n logger.warn('Linear auto-sync service is already running');\n return;\n }\n\n try {\n // Verify Linear integration is configured\n const authManager = new LinearAuthManager(this.projectRoot);\n if (!authManager.isConfigured()) {\n throw new Error(\n 'Linear integration not configured. Run \"stackmemory linear setup\" first.'\n );\n }\n\n // Initialize sync engine\n const dbPath = join(this.projectRoot, '.stackmemory', 'context.db');\n if (!existsSync(dbPath)) {\n throw new Error(\n 'StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n }\n\n const db = new Database(dbPath);\n const taskStore = new LinearTaskManager(this.projectRoot, db);\n\n this.syncEngine = new LinearSyncEngine(\n taskStore,\n authManager,\n this.config\n );\n\n // Test connection before starting\n const token = await authManager.getValidToken();\n if (!token) {\n throw new Error(\n 'Unable to get valid Linear token. Check authentication.'\n );\n }\n\n this.isRunning = true;\n this.scheduleNextSync();\n\n logger.info('Linear auto-sync service started', {\n interval: this.config.interval,\n direction: this.config.direction,\n conflictResolution: this.config.conflictResolution,\n });\n\n // Perform initial sync\n this.performSync();\n } catch (error: unknown) {\n logger.error('Failed to start Linear auto-sync service:', error as Error);\n throw error;\n }\n }\n\n /**\n * Stop the auto-sync service\n */\n stop(): void {\n if (this.intervalId) {\n clearTimeout(this.intervalId);\n this.intervalId = undefined;\n }\n\n this.isRunning = false;\n logger.info('Linear auto-sync service stopped');\n }\n\n /**\n * Get service status\n */\n getStatus(): {\n running: boolean;\n lastSyncTime: number;\n nextSyncTime?: number;\n retryCount: number;\n config: AutoSyncConfig;\n } {\n const nextSyncTime = this.intervalId\n ? this.lastSyncTime + this.config.interval * 60 * 1000\n : undefined;\n\n return {\n running: this.isRunning,\n lastSyncTime: this.lastSyncTime,\n nextSyncTime,\n retryCount: this.retryCount,\n config: this.config,\n };\n }\n\n /**\n * Update configuration\n */\n updateConfig(newConfig: Partial<AutoSyncConfig>): void {\n this.config = { ...this.config, ...newConfig };\n\n if (this.isRunning) {\n // Restart with new config\n this.stop();\n this.start();\n }\n\n logger.info('Linear auto-sync config updated', newConfig);\n }\n\n /**\n * Force immediate sync\n */\n async forceSync(): Promise<void> {\n if (!this.syncEngine) {\n throw new Error('Sync engine not initialized');\n }\n\n logger.info('Forcing immediate Linear sync');\n await this.performSync();\n }\n\n /**\n * Schedule next sync based on configuration\n */\n private scheduleNextSync(): void {\n if (!this.isRunning) return;\n\n const delay = this.config.interval * 60 * 1000; // Convert minutes to milliseconds\n\n this.intervalId = setTimeout(() => {\n if (this.isRunning) {\n this.performSync();\n }\n }, delay);\n }\n\n /**\n * Perform synchronization with error handling and retries\n */\n private async performSync(): Promise<void> {\n if (!this.syncEngine) {\n logger.error('Sync engine not available');\n return;\n }\n\n // Check quiet hours\n if (this.isInQuietHours()) {\n logger.debug('Skipping sync during quiet hours');\n this.scheduleNextSync();\n return;\n }\n\n try {\n logger.debug('Starting Linear auto-sync');\n\n const result = await this.syncEngine.sync();\n\n if (result.success) {\n this.lastSyncTime = Date.now();\n this.retryCount = 0;\n\n // Log sync results\n const hasChanges =\n result.synced.toLinear > 0 ||\n result.synced.fromLinear > 0 ||\n result.synced.updated > 0;\n\n if (hasChanges) {\n logger.info('Linear auto-sync completed with changes', {\n toLinear: result.synced.toLinear,\n fromLinear: result.synced.fromLinear,\n updated: result.synced.updated,\n conflicts: result.conflicts.length,\n });\n } else {\n logger.debug('Linear auto-sync completed - no changes');\n }\n\n // Handle conflicts\n if (result.conflicts.length > 0) {\n logger.warn('Linear sync conflicts detected', {\n count: result.conflicts.length,\n conflicts: result.conflicts.map((c) => ({\n taskId: c.taskId,\n reason: c.reason,\n })),\n });\n }\n } else {\n throw new Error(`Sync failed: ${result.errors.join(', ')}`);\n }\n } catch (error: unknown) {\n logger.error('Linear auto-sync failed:', error as Error);\n\n this.retryCount++;\n\n if (this.retryCount <= this.config.retryAttempts) {\n logger.info(\n `Retrying Linear sync in ${this.config.retryDelay / 1000}s (attempt ${this.retryCount}/${this.config.retryAttempts})`\n );\n\n // Schedule retry\n setTimeout(() => {\n if (this.isRunning) {\n this.performSync();\n }\n }, this.config.retryDelay);\n\n return; // Don't schedule next sync yet\n } else {\n logger.error(\n `Linear auto-sync failed after ${this.config.retryAttempts} attempts, skipping until next interval`\n );\n this.retryCount = 0;\n }\n }\n\n // Schedule next sync\n this.scheduleNextSync();\n }\n\n /**\n * Check if current time is within quiet hours\n */\n private isInQuietHours(): boolean {\n if (!this.config.quietHours) return false;\n\n const now = new Date();\n const currentHour = now.getHours();\n const { start, end } = this.config.quietHours;\n\n if (start < end) {\n // Quiet hours within same day (e.g., 22:00 - 07:00 next day)\n return currentHour >= start || currentHour < end;\n } else {\n // Quiet hours span midnight (e.g., 10:00 - 18:00)\n return currentHour >= start && currentHour < end;\n }\n }\n}\n\n/**\n * Global auto-sync service instance\n */\nlet autoSyncService: LinearAutoSyncService | null = null;\n\n/**\n * Initialize global auto-sync service\n */\nexport function initializeAutoSync(\n projectRoot: string,\n config?: Partial<AutoSyncConfig>\n): LinearAutoSyncService {\n if (autoSyncService) {\n autoSyncService.stop();\n }\n\n autoSyncService = new LinearAutoSyncService(projectRoot, config);\n return autoSyncService;\n}\n\n/**\n * Get global auto-sync service\n */\nexport function getAutoSyncService(): LinearAutoSyncService | null {\n return autoSyncService;\n}\n\n/**\n * Stop global auto-sync service\n */\nexport function stopAutoSync(): void {\n if (autoSyncService) {\n autoSyncService.stop();\n autoSyncService = null;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
+
import { dirname as __pathDirname } from 'path';
|
|
3
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __pathDirname(__filename);
|
|
1
5
|
import { logger } from "../../core/monitoring/logger.js";
|
|
2
6
|
class LinearClient {
|
|
3
7
|
config;
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/integrations/linear/client.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * Linear API Client for StackMemory\n * Handles bi-directional sync with Linear's GraphQL API\n */\n\nimport { logger } from '../../core/monitoring/logger.js';\n\nexport interface LinearConfig {\n apiKey: string;\n teamId?: string;\n webhookSecret?: string;\n baseUrl?: string;\n // If true, send Authorization header as `Bearer <apiKey>` (OAuth access token)\n useBearer?: boolean;\n // Optional callback to refresh token on 401 and return the new access token\n onUnauthorized?: () => Promise<string>;\n}\n\nexport interface LinearIssue {\n id: string;\n identifier: string; // Like \"SM-123\"\n title: string;\n description?: string;\n state: {\n id: string;\n name: string;\n type: 'backlog' | 'unstarted' | 'started' | 'completed' | 'cancelled';\n };\n priority: number; // 0-4 (0=none, 1=urgent, 2=high, 3=medium, 4=low)\n assignee?: {\n id: string;\n name: string;\n email: string;\n };\n estimate?: number; // Story points\n labels: Array<{\n id: string;\n name: string;\n }>;\n createdAt: string;\n updatedAt: string;\n url: string;\n}\n\nexport interface LinearCreateIssueInput {\n title: string;\n description?: string;\n teamId: string;\n priority?: number;\n estimate?: number;\n labelIds?: string[];\n}\n\ninterface RateLimitState {\n remaining: number;\n resetAt: number;\n retryAfter: number;\n}\n\nexport class LinearClient {\n private config: LinearConfig;\n private baseUrl: string;\n private rateLimitState: RateLimitState = {\n remaining: 1500, // Linear's default limit\n resetAt: Date.now() + 3600000,\n retryAfter: 0,\n };\n private requestQueue: Array<() => Promise<void>> = [];\n private isProcessingQueue = false;\n private minRequestInterval = 100; // Minimum ms between requests\n private lastRequestTime = 0;\n\n constructor(config: LinearConfig) {\n this.config = config;\n this.baseUrl = config.baseUrl || 'https://api.linear.app';\n\n if (!config.apiKey) {\n throw new Error('Linear API key is required');\n }\n }\n\n /**\n * Wait for rate limit to reset if needed\n */\n private async waitForRateLimit(): Promise<void> {\n const now = Date.now();\n\n // Check if we're in a retry-after period\n if (this.rateLimitState.retryAfter > now) {\n const waitTime = this.rateLimitState.retryAfter - now;\n logger.warn(`Rate limited, waiting ${Math.ceil(waitTime / 1000)}s`);\n await this.sleep(waitTime);\n }\n\n // Check if we've exhausted our rate limit\n if (this.rateLimitState.remaining <= 5) {\n if (this.rateLimitState.resetAt > now) {\n const waitTime = this.rateLimitState.resetAt - now;\n logger.warn(\n `Rate limit nearly exhausted, waiting ${Math.ceil(waitTime / 1000)}s for reset`\n );\n await this.sleep(Math.min(waitTime, 60000)); // Max 60s wait\n }\n }\n\n // Ensure minimum interval between requests\n const timeSinceLastRequest = now - this.lastRequestTime;\n if (timeSinceLastRequest < this.minRequestInterval) {\n await this.sleep(this.minRequestInterval - timeSinceLastRequest);\n }\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Update rate limit state from response headers\n */\n private updateRateLimitState(response: Response): void {\n const remaining = response.headers.get('x-ratelimit-remaining');\n const reset = response.headers.get('x-ratelimit-reset');\n const retryAfter = response.headers.get('retry-after');\n\n if (remaining !== null) {\n this.rateLimitState.remaining = parseInt(remaining, 10);\n }\n if (reset !== null) {\n this.rateLimitState.resetAt = parseInt(reset, 10) * 1000;\n }\n if (retryAfter !== null) {\n this.rateLimitState.retryAfter =\n Date.now() + parseInt(retryAfter, 10) * 1000;\n }\n }\n\n /**\n * Execute GraphQL query against Linear API with rate limiting\n */\n private async graphql<T>(\n query: string,\n variables?: Record<string, unknown>,\n retries = 3,\n allowAuthRefresh = true\n ): Promise<T> {\n // Wait for rate limit before making request\n await this.waitForRateLimit();\n\n this.lastRequestTime = Date.now();\n\n const authHeader = this.config.useBearer\n ? `Bearer ${this.config.apiKey}`\n : this.config.apiKey;\n\n let response = await fetch(`${this.baseUrl}/graphql`, {\n method: 'POST',\n headers: {\n Authorization: authHeader,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n query,\n variables,\n }),\n });\n\n // Update rate limit state from response\n this.updateRateLimitState(response);\n\n // Handle unauthorized (e.g., expired OAuth token)\n if (\n response.status === 401 &&\n this.config.onUnauthorized &&\n allowAuthRefresh\n ) {\n try {\n const newToken = await this.config.onUnauthorized();\n // Update local config and retry once without further auth refresh\n this.config.apiKey = newToken;\n const retryHeader = this.config.useBearer\n ? `Bearer ${newToken}`\n : newToken;\n response = await fetch(`${this.baseUrl}/graphql`, {\n method: 'POST',\n headers: {\n Authorization: retryHeader,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ query, variables }),\n });\n this.updateRateLimitState(response);\n } catch (e: unknown) {\n // Fall through to standard error handling\n }\n }\n\n // Handle rate limiting with exponential backoff\n if (response.status === 429) {\n if (retries > 0) {\n const retryAfter = response.headers.get('retry-after');\n const waitTime = retryAfter ? parseInt(retryAfter, 10) * 1000 : 60000;\n logger.warn(\n `Rate limited (429), retrying in ${waitTime / 1000}s (${retries} retries left)`\n );\n this.rateLimitState.retryAfter = Date.now() + waitTime;\n await this.sleep(waitTime);\n return this.graphql<T>(query, variables, retries - 1, allowAuthRefresh);\n }\n throw new Error('Linear API rate limit exceeded after retries');\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n logger.error(\n 'Linear API error response:',\n new Error(`${response.status}: ${errorText}`)\n );\n throw new Error(\n `Linear API error: ${response.status} ${response.statusText} - ${errorText}`\n );\n }\n\n const result = (await response.json()) as {\n data?: T;\n errors?: Array<{ message: string }>;\n };\n\n if (result.errors) {\n // Check for rate limit errors in GraphQL response\n const rateLimitError = result.errors.find(\n (e) =>\n e.message.toLowerCase().includes('rate limit') ||\n e.message.toLowerCase().includes('usage limit')\n );\n\n if (rateLimitError && retries > 0) {\n const waitTime = 60000; // Default 60s wait for GraphQL rate limit errors\n logger.warn(\n `GraphQL rate limit error, retrying in ${waitTime / 1000}s (${retries} retries left)`\n );\n this.rateLimitState.retryAfter = Date.now() + waitTime;\n await this.sleep(waitTime);\n return this.graphql<T>(query, variables, retries - 1);\n }\n\n logger.error('Linear GraphQL errors:', { errors: result.errors });\n throw new Error(`Linear GraphQL error: ${result.errors[0].message}`);\n }\n\n return result.data as T;\n }\n\n /**\n * Create a new issue in Linear\n */\n async createIssue(input: LinearCreateIssueInput): Promise<LinearIssue> {\n const mutation = `\n mutation CreateIssue($input: IssueCreateInput!) {\n issueCreate(input: $input) {\n success\n issue {\n id\n identifier\n title\n description\n state {\n id\n name\n type\n }\n priority\n assignee {\n id\n name\n email\n }\n estimate\n labels {\n nodes {\n id\n name\n }\n }\n createdAt\n updatedAt\n url\n }\n }\n }\n `;\n\n const result = await this.graphql<{\n issueCreate: {\n success: boolean;\n issue: LinearIssue;\n };\n }>(mutation, { input });\n\n if (!result.issueCreate.success) {\n throw new Error('Failed to create Linear issue');\n }\n\n return result.issueCreate.issue;\n }\n\n /**\n * Update an existing Linear issue\n */\n async updateIssue(\n issueId: string,\n updates: Partial<LinearCreateIssueInput> & { stateId?: string }\n ): Promise<LinearIssue> {\n const mutation = `\n mutation UpdateIssue($id: String!, $input: IssueUpdateInput!) {\n issueUpdate(id: $id, input: $input) {\n success\n issue {\n id\n identifier\n title\n description\n state {\n id\n name\n type\n }\n priority\n assignee {\n id\n name\n email\n }\n estimate\n labels {\n nodes {\n id\n name\n }\n }\n createdAt\n updatedAt\n url\n }\n }\n }\n `;\n\n const result = await this.graphql<{\n issueUpdate: {\n success: boolean;\n issue: LinearIssue;\n };\n }>(mutation, { id: issueId, input: updates });\n\n if (!result.issueUpdate.success) {\n throw new Error(`Failed to update Linear issue ${issueId}`);\n }\n\n return result.issueUpdate.issue;\n }\n\n /**\n * Get issue by ID\n */\n async getIssue(issueId: string): Promise<LinearIssue | null> {\n const query = `\n query GetIssue($id: String!) {\n issue(id: $id) {\n id\n identifier\n title\n description\n state {\n id\n name\n type\n }\n priority\n assignee {\n id\n name\n email\n }\n estimate\n labels {\n nodes {\n id\n name\n }\n }\n createdAt\n updatedAt\n url\n }\n }\n `;\n\n const result = await this.graphql<{\n issue: LinearIssue | null;\n }>(query, { id: issueId });\n\n return result.issue;\n }\n\n /**\n * Search for issues by identifier (e.g., \"SM-123\")\n */\n async findIssueByIdentifier(identifier: string): Promise<LinearIssue | null> {\n const query = `\n query FindIssue($filter: IssueFilter!) {\n issues(filter: $filter, first: 1) {\n nodes {\n id\n identifier\n title\n description\n state {\n id\n name\n type\n }\n priority\n assignee {\n id\n name\n email\n }\n estimate\n labels {\n nodes {\n id\n name\n }\n }\n createdAt\n updatedAt\n url\n }\n }\n }\n `;\n\n const result = await this.graphql<{\n issues: {\n nodes: LinearIssue[];\n };\n }>(query, {\n filter: {\n number: {\n eq: parseInt(identifier.split('-')[1] || '0') || 0,\n },\n },\n });\n\n return result.issues.nodes[0] || null;\n }\n\n /**\n * Get team information\n */\n async getTeam(\n teamId?: string\n ): Promise<{ id: string; name: string; key: string }> {\n const query = teamId\n ? `\n query GetTeam($id: String!) {\n team(id: $id) {\n id\n name\n key\n }\n }\n `\n : `\n query GetTeams {\n teams(first: 1) {\n nodes {\n id\n name\n key\n }\n }\n }\n `;\n\n if (teamId) {\n const result = await this.graphql<{\n team: { id: string; name: string; key: string };\n }>(query, { id: teamId });\n if (!result.team) {\n throw new Error(`Team ${teamId} not found`);\n }\n return result.team;\n } else {\n const result = await this.graphql<{\n teams: {\n nodes: Array<{ id: string; name: string; key: string }>;\n };\n }>(query);\n\n if (result.teams.nodes.length === 0) {\n throw new Error('No teams found');\n }\n\n return result.teams.nodes[0]!;\n }\n }\n\n /**\n * Get workflow states for a team\n */\n async getWorkflowStates(teamId: string): Promise<\n Array<{\n id: string;\n name: string;\n type: 'backlog' | 'unstarted' | 'started' | 'completed' | 'cancelled';\n color: string;\n }>\n > {\n const query = `\n query GetWorkflowStates($teamId: String!) {\n team(id: $teamId) {\n states {\n nodes {\n id\n name\n type\n color\n }\n }\n }\n }\n `;\n\n const result = await this.graphql<{\n team: {\n states: {\n nodes: Array<{\n id: string;\n name: string;\n type:\n | 'backlog'\n | 'unstarted'\n | 'started'\n | 'completed'\n | 'cancelled';\n color: string;\n }>;\n };\n };\n }>(query, { teamId });\n\n return result.team.states.nodes;\n }\n\n /**\n * Get current viewer/user information\n */\n async getViewer(): Promise<{\n id: string;\n name: string;\n email: string;\n }> {\n const query = `\n query GetViewer {\n viewer {\n id\n name\n email\n }\n }\n `;\n\n const result = await this.graphql<{\n viewer: {\n id: string;\n name: string;\n email: string;\n };\n }>(query);\n\n return result.viewer;\n }\n\n /**\n * Get all teams for the organization\n */\n async getTeams(): Promise<\n Array<{\n id: string;\n name: string;\n key: string;\n }>\n > {\n const query = `\n query GetTeams {\n teams(first: 50) {\n nodes {\n id\n name\n key\n }\n }\n }\n `;\n\n const result = await this.graphql<{\n teams: {\n nodes: Array<{\n id: string;\n name: string;\n key: string;\n }>;\n };\n }>(query);\n\n return result.teams.nodes;\n }\n\n /**\n * Get issues with filtering options\n */\n async getIssues(options?: {\n teamId?: string;\n assigneeId?: string;\n stateType?: 'backlog' | 'unstarted' | 'started' | 'completed' | 'cancelled';\n limit?: number;\n }): Promise<LinearIssue[]> {\n const query = `\n query GetIssues($filter: IssueFilter, $first: Int!) {\n issues(filter: $filter, first: $first) {\n nodes {\n id\n identifier\n title\n description\n state {\n id\n name\n type\n }\n priority\n assignee {\n id\n name\n email\n }\n estimate\n labels {\n nodes {\n id\n name\n }\n }\n createdAt\n updatedAt\n url\n }\n }\n }\n `;\n\n const filter: Record<string, unknown> = {};\n\n if (options?.teamId) {\n filter.team = { id: { eq: options.teamId } };\n }\n\n if (options?.assigneeId) {\n filter.assignee = { id: { eq: options.assigneeId } };\n }\n\n if (options?.stateType) {\n filter.state = { type: { eq: options.stateType } };\n }\n\n const result = await this.graphql<{\n issues: {\n nodes: LinearIssue[];\n };\n }>(query, {\n filter: Object.keys(filter).length > 0 ? filter : undefined,\n first: options?.limit || 50,\n });\n\n return result.issues.nodes;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
5
|
+
"mappings": ";;;;AAKA,SAAS,cAAc;AAsDhB,MAAM,aAAa;AAAA,EAChB;AAAA,EACA;AAAA,EACA,iBAAiC;AAAA,IACvC,WAAW;AAAA;AAAA,IACX,SAAS,KAAK,IAAI,IAAI;AAAA,IACtB,YAAY;AAAA,EACd;AAAA,EACQ,eAA2C,CAAC;AAAA,EAC5C,oBAAoB;AAAA,EACpB,qBAAqB;AAAA;AAAA,EACrB,kBAAkB;AAAA,EAE1B,YAAY,QAAsB;AAChC,SAAK,SAAS;AACd,SAAK,UAAU,OAAO,WAAW;AAEjC,QAAI,CAAC,OAAO,QAAQ;AAClB,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAkC;AAC9C,UAAM,MAAM,KAAK,IAAI;AAGrB,QAAI,KAAK,eAAe,aAAa,KAAK;AACxC,YAAM,WAAW,KAAK,eAAe,aAAa;AAClD,aAAO,KAAK,yBAAyB,KAAK,KAAK,WAAW,GAAI,CAAC,GAAG;AAClE,YAAM,KAAK,MAAM,QAAQ;AAAA,IAC3B;AAGA,QAAI,KAAK,eAAe,aAAa,GAAG;AACtC,UAAI,KAAK,eAAe,UAAU,KAAK;AACrC,cAAM,WAAW,KAAK,eAAe,UAAU;AAC/C,eAAO;AAAA,UACL,wCAAwC,KAAK,KAAK,WAAW,GAAI,CAAC;AAAA,QACpE;AACA,cAAM,KAAK,MAAM,KAAK,IAAI,UAAU,GAAK,CAAC;AAAA,MAC5C;AAAA,IACF;AAGA,UAAM,uBAAuB,MAAM,KAAK;AACxC,QAAI,uBAAuB,KAAK,oBAAoB;AAClD,YAAM,KAAK,MAAM,KAAK,qBAAqB,oBAAoB;AAAA,IACjE;AAAA,EACF;AAAA,EAEQ,MAAM,IAA2B;AACvC,WAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,UAA0B;AACrD,UAAM,YAAY,SAAS,QAAQ,IAAI,uBAAuB;AAC9D,UAAM,QAAQ,SAAS,QAAQ,IAAI,mBAAmB;AACtD,UAAM,aAAa,SAAS,QAAQ,IAAI,aAAa;AAErD,QAAI,cAAc,MAAM;AACtB,WAAK,eAAe,YAAY,SAAS,WAAW,EAAE;AAAA,IACxD;AACA,QAAI,UAAU,MAAM;AAClB,WAAK,eAAe,UAAU,SAAS,OAAO,EAAE,IAAI;AAAA,IACtD;AACA,QAAI,eAAe,MAAM;AACvB,WAAK,eAAe,aAClB,KAAK,IAAI,IAAI,SAAS,YAAY,EAAE,IAAI;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,QACZ,OACA,WACA,UAAU,GACV,mBAAmB,MACP;AAEZ,UAAM,KAAK,iBAAiB;AAE5B,SAAK,kBAAkB,KAAK,IAAI;AAEhC,UAAM,aAAa,KAAK,OAAO,YAC3B,UAAU,KAAK,OAAO,MAAM,KAC5B,KAAK,OAAO;AAEhB,QAAI,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,YAAY;AAAA,MACpD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe;AAAA,QACf,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAGD,SAAK,qBAAqB,QAAQ;AAGlC,QACE,SAAS,WAAW,OACpB,KAAK,OAAO,kBACZ,kBACA;AACA,UAAI;AACF,cAAM,WAAW,MAAM,KAAK,OAAO,eAAe;AAElD,aAAK,OAAO,SAAS;AACrB,cAAM,cAAc,KAAK,OAAO,YAC5B,UAAU,QAAQ,KAClB;AACJ,mBAAW,MAAM,MAAM,GAAG,KAAK,OAAO,YAAY;AAAA,UAChD,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,eAAe;AAAA,YACf,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,KAAK,UAAU,EAAE,OAAO,UAAU,CAAC;AAAA,QAC3C,CAAC;AACD,aAAK,qBAAqB,QAAQ;AAAA,MACpC,SAAS,GAAY;AAAA,MAErB;AAAA,IACF;AAGA,QAAI,SAAS,WAAW,KAAK;AAC3B,UAAI,UAAU,GAAG;AACf,cAAM,aAAa,SAAS,QAAQ,IAAI,aAAa;AACrD,cAAM,WAAW,aAAa,SAAS,YAAY,EAAE,IAAI,MAAO;AAChE,eAAO;AAAA,UACL,mCAAmC,WAAW,GAAI,MAAM,OAAO;AAAA,QACjE;AACA,aAAK,eAAe,aAAa,KAAK,IAAI,IAAI;AAC9C,cAAM,KAAK,MAAM,QAAQ;AACzB,eAAO,KAAK,QAAW,OAAO,WAAW,UAAU,GAAG,gBAAgB;AAAA,MACxE;AACA,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,aAAO;AAAA,QACL;AAAA,QACA,IAAI,MAAM,GAAG,SAAS,MAAM,KAAK,SAAS,EAAE;AAAA,MAC9C;AACA,YAAM,IAAI;AAAA,QACR,qBAAqB,SAAS,MAAM,IAAI,SAAS,UAAU,MAAM,SAAS;AAAA,MAC5E;AAAA,IACF;AAEA,UAAM,SAAU,MAAM,SAAS,KAAK;AAKpC,QAAI,OAAO,QAAQ;AAEjB,YAAM,iBAAiB,OAAO,OAAO;AAAA,QACnC,CAAC,MACC,EAAE,QAAQ,YAAY,EAAE,SAAS,YAAY,KAC7C,EAAE,QAAQ,YAAY,EAAE,SAAS,aAAa;AAAA,MAClD;AAEA,UAAI,kBAAkB,UAAU,GAAG;AACjC,cAAM,WAAW;AACjB,eAAO;AAAA,UACL,yCAAyC,WAAW,GAAI,MAAM,OAAO;AAAA,QACvE;AACA,aAAK,eAAe,aAAa,KAAK,IAAI,IAAI;AAC9C,cAAM,KAAK,MAAM,QAAQ;AACzB,eAAO,KAAK,QAAW,OAAO,WAAW,UAAU,CAAC;AAAA,MACtD;AAEA,aAAO,MAAM,0BAA0B,EAAE,QAAQ,OAAO,OAAO,CAAC;AAChE,YAAM,IAAI,MAAM,yBAAyB,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE;AAAA,IACrE;AAEA,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAqD;AACrE,UAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmCjB,UAAM,SAAS,MAAM,KAAK,QAKvB,UAAU,EAAE,MAAM,CAAC;AAEtB,QAAI,CAAC,OAAO,YAAY,SAAS;AAC/B,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AAEA,WAAO,OAAO,YAAY;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,SACA,SACsB;AACtB,UAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmCjB,UAAM,SAAS,MAAM,KAAK,QAKvB,UAAU,EAAE,IAAI,SAAS,OAAO,QAAQ,CAAC;AAE5C,QAAI,CAAC,OAAO,YAAY,SAAS;AAC/B,YAAM,IAAI,MAAM,iCAAiC,OAAO,EAAE;AAAA,IAC5D;AAEA,WAAO,OAAO,YAAY;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,SAA8C;AAC3D,UAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgCd,UAAM,SAAS,MAAM,KAAK,QAEvB,OAAO,EAAE,IAAI,QAAQ,CAAC;AAEzB,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,YAAiD;AAC3E,UAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCd,UAAM,SAAS,MAAM,KAAK,QAIvB,OAAO;AAAA,MACR,QAAQ;AAAA,QACN,QAAQ;AAAA,UACN,IAAI,SAAS,WAAW,MAAM,GAAG,EAAE,CAAC,KAAK,GAAG,KAAK;AAAA,QACnD;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,OAAO,OAAO,MAAM,CAAC,KAAK;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QACJ,QACoD;AACpD,UAAM,QAAQ,SACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYJ,QAAI,QAAQ;AACV,YAAM,SAAS,MAAM,KAAK,QAEvB,OAAO,EAAE,IAAI,OAAO,CAAC;AACxB,UAAI,CAAC,OAAO,MAAM;AAChB,cAAM,IAAI,MAAM,QAAQ,MAAM,YAAY;AAAA,MAC5C;AACA,aAAO,OAAO;AAAA,IAChB,OAAO;AACL,YAAM,SAAS,MAAM,KAAK,QAIvB,KAAK;AAER,UAAI,OAAO,MAAM,MAAM,WAAW,GAAG;AACnC,cAAM,IAAI,MAAM,gBAAgB;AAAA,MAClC;AAEA,aAAO,OAAO,MAAM,MAAM,CAAC;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,QAOtB;AACA,UAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAed,UAAM,SAAS,MAAM,KAAK,QAgBvB,OAAO,EAAE,OAAO,CAAC;AAEpB,WAAO,OAAO,KAAK,OAAO;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAIH;AACD,UAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUd,UAAM,SAAS,MAAM,KAAK,QAMvB,KAAK;AAER,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAMJ;AACA,UAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYd,UAAM,SAAS,MAAM,KAAK,QAQvB,KAAK;AAER,WAAO,OAAO,MAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,SAKW;AACzB,UAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCd,UAAM,SAAkC,CAAC;AAEzC,QAAI,SAAS,QAAQ;AACnB,aAAO,OAAO,EAAE,IAAI,EAAE,IAAI,QAAQ,OAAO,EAAE;AAAA,IAC7C;AAEA,QAAI,SAAS,YAAY;AACvB,aAAO,WAAW,EAAE,IAAI,EAAE,IAAI,QAAQ,WAAW,EAAE;AAAA,IACrD;AAEA,QAAI,SAAS,WAAW;AACtB,aAAO,QAAQ,EAAE,MAAM,EAAE,IAAI,QAAQ,UAAU,EAAE;AAAA,IACnD;AAEA,UAAM,SAAS,MAAM,KAAK,QAIvB,OAAO;AAAA,MACR,QAAQ,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AAAA,MAClD,OAAO,SAAS,SAAS;AAAA,IAC3B,CAAC;AAED,WAAO,OAAO,OAAO;AAAA,EACvB;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
+
import { dirname as __pathDirname } from 'path';
|
|
3
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __pathDirname(__filename);
|
|
1
5
|
import { readFileSync, writeFileSync, existsSync } from "fs";
|
|
2
6
|
import { join } from "path";
|
|
3
7
|
import { logger } from "../../core/monitoring/logger.js";
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/integrations/linear/config.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * Linear Auto-Sync Configuration Management\n * Handles persistent configuration for auto-sync service\n */\n\nimport { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { AutoSyncConfig } from './auto-sync.js';\nimport { ProjectIsolationManager } from '../../core/projects/project-isolation.js';\n\nexport interface PersistedSyncConfig {\n enabled: boolean;\n interval: number;\n direction: 'bidirectional' | 'to_linear' | 'from_linear';\n conflictResolution:\n | 'linear_wins'\n | 'stackmemory_wins'\n | 'manual'\n | 'newest_wins';\n retryAttempts: number;\n retryDelay: number;\n quietHours?: {\n start: number;\n end: number;\n };\n // Project isolation settings\n teamId?: string;\n organization?: string;\n workspaceFilter?: string;\n projectPrefix?: string;\n lastUpdated: number;\n}\n\nexport class LinearConfigManager {\n private configPath: string;\n private projectRoot: string;\n private isolationManager: ProjectIsolationManager;\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot;\n this.configPath = join(\n projectRoot,\n '.stackmemory',\n 'linear-auto-sync.json'\n );\n this.isolationManager = ProjectIsolationManager.getInstance();\n }\n\n /**\n * Load configuration from file\n */\n loadConfig(): PersistedSyncConfig | null {\n if (!existsSync(this.configPath)) {\n return null;\n }\n\n try {\n const configData = readFileSync(this.configPath, 'utf8');\n return JSON.parse(configData);\n } catch (error: unknown) {\n logger.error(\n 'Failed to load Linear auto-sync configuration:',\n error as Error\n );\n return null;\n }\n }\n\n /**\n * Save configuration to file\n */\n saveConfig(config: Partial<PersistedSyncConfig>): void {\n const existingConfig = this.loadConfig() || this.getDefaultConfig();\n\n const updatedConfig: PersistedSyncConfig = {\n ...existingConfig,\n ...config,\n lastUpdated: Date.now(),\n };\n\n try {\n writeFileSync(this.configPath, JSON.stringify(updatedConfig, null, 2));\n logger.info('Linear auto-sync configuration saved');\n } catch (error: unknown) {\n logger.error(\n 'Failed to save Linear auto-sync configuration:',\n error as Error\n );\n throw error;\n }\n }\n\n /**\n * Get default configuration with project isolation\n */\n getDefaultConfig(): PersistedSyncConfig {\n // Get stable project identification\n const projectId = this.isolationManager.getProjectIdentification(this.projectRoot);\n \n return {\n enabled: true,\n interval: 5, // 5 minutes\n direction: 'bidirectional',\n conflictResolution: 'newest_wins',\n retryAttempts: 3,\n retryDelay: 30000, // 30 seconds\n quietHours: {\n start: 22, // 10 PM\n end: 7, // 7 AM\n },\n // Project isolation from stable identification\n teamId: projectId.linearTeamId,\n organization: projectId.linearOrganization,\n workspaceFilter: projectId.workspaceFilter,\n projectPrefix: projectId.projectPrefix,\n lastUpdated: Date.now(),\n };\n }\n\n /**\n * Convert to AutoSyncConfig format\n */\n toAutoSyncConfig(config?: PersistedSyncConfig): AutoSyncConfig {\n const persistedConfig =\n config || this.loadConfig() || this.getDefaultConfig();\n\n return {\n enabled: persistedConfig.enabled,\n direction: persistedConfig.direction,\n defaultTeamId: undefined, // Will be set by sync engine\n autoSync: true,\n conflictResolution: persistedConfig.conflictResolution,\n syncInterval: persistedConfig.interval,\n interval: persistedConfig.interval,\n retryAttempts: persistedConfig.retryAttempts,\n retryDelay: persistedConfig.retryDelay,\n quietHours: persistedConfig.quietHours,\n };\n }\n\n /**\n * Update specific configuration values\n */\n updateConfig(updates: Partial<PersistedSyncConfig>): void {\n this.saveConfig(updates);\n }\n\n /**\n * Check if configuration exists\n */\n hasConfig(): boolean {\n return existsSync(this.configPath);\n }\n\n /**\n * Reset to default configuration\n */\n resetConfig(): void {\n this.saveConfig(this.getDefaultConfig());\n }\n}\n"],
|
|
5
|
-
"mappings": "AAKA,SAAS,cAAc,eAAe,kBAAkB;AACxD,SAAS,YAAY;AACrB,SAAS,cAAc;AAEvB,SAAS,+BAA+B;AAyBjC,MAAM,oBAAoB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,aAAqB;AAC/B,SAAK,cAAc;AACnB,SAAK,aAAa;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,SAAK,mBAAmB,wBAAwB,YAAY;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,aAAyC;AACvC,QAAI,CAAC,WAAW,KAAK,UAAU,GAAG;AAChC,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,aAAa,aAAa,KAAK,YAAY,MAAM;AACvD,aAAO,KAAK,MAAM,UAAU;AAAA,IAC9B,SAAS,OAAgB;AACvB,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,QAA4C;AACrD,UAAM,iBAAiB,KAAK,WAAW,KAAK,KAAK,iBAAiB;AAElE,UAAM,gBAAqC;AAAA,MACzC,GAAG;AAAA,MACH,GAAG;AAAA,MACH,aAAa,KAAK,IAAI;AAAA,IACxB;AAEA,QAAI;AACF,oBAAc,KAAK,YAAY,KAAK,UAAU,eAAe,MAAM,CAAC,CAAC;AACrE,aAAO,KAAK,sCAAsC;AAAA,IACpD,SAAS,OAAgB;AACvB,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAwC;AAEtC,UAAM,YAAY,KAAK,iBAAiB,yBAAyB,KAAK,WAAW;AAEjF,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA;AAAA,MACV,WAAW;AAAA,MACX,oBAAoB;AAAA,MACpB,eAAe;AAAA,MACf,YAAY;AAAA;AAAA,MACZ,YAAY;AAAA,QACV,OAAO;AAAA;AAAA,QACP,KAAK;AAAA;AAAA,MACP;AAAA;AAAA,MAEA,QAAQ,UAAU;AAAA,MAClB,cAAc,UAAU;AAAA,MACxB,iBAAiB,UAAU;AAAA,MAC3B,eAAe,UAAU;AAAA,MACzB,aAAa,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,QAA8C;AAC7D,UAAM,kBACJ,UAAU,KAAK,WAAW,KAAK,KAAK,iBAAiB;AAEvD,WAAO;AAAA,MACL,SAAS,gBAAgB;AAAA,MACzB,WAAW,gBAAgB;AAAA,MAC3B,eAAe;AAAA;AAAA,MACf,UAAU;AAAA,MACV,oBAAoB,gBAAgB;AAAA,MACpC,cAAc,gBAAgB;AAAA,MAC9B,UAAU,gBAAgB;AAAA,MAC1B,eAAe,gBAAgB;AAAA,MAC/B,YAAY,gBAAgB;AAAA,MAC5B,YAAY,gBAAgB;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAA6C;AACxD,SAAK,WAAW,OAAO;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqB;AACnB,WAAO,WAAW,KAAK,UAAU;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAoB;AAClB,SAAK,WAAW,KAAK,iBAAiB,CAAC;AAAA,EACzC;AACF;",
|
|
5
|
+
"mappings": ";;;;AAKA,SAAS,cAAc,eAAe,kBAAkB;AACxD,SAAS,YAAY;AACrB,SAAS,cAAc;AAEvB,SAAS,+BAA+B;AAyBjC,MAAM,oBAAoB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,aAAqB;AAC/B,SAAK,cAAc;AACnB,SAAK,aAAa;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,SAAK,mBAAmB,wBAAwB,YAAY;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,aAAyC;AACvC,QAAI,CAAC,WAAW,KAAK,UAAU,GAAG;AAChC,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,aAAa,aAAa,KAAK,YAAY,MAAM;AACvD,aAAO,KAAK,MAAM,UAAU;AAAA,IAC9B,SAAS,OAAgB;AACvB,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,QAA4C;AACrD,UAAM,iBAAiB,KAAK,WAAW,KAAK,KAAK,iBAAiB;AAElE,UAAM,gBAAqC;AAAA,MACzC,GAAG;AAAA,MACH,GAAG;AAAA,MACH,aAAa,KAAK,IAAI;AAAA,IACxB;AAEA,QAAI;AACF,oBAAc,KAAK,YAAY,KAAK,UAAU,eAAe,MAAM,CAAC,CAAC;AACrE,aAAO,KAAK,sCAAsC;AAAA,IACpD,SAAS,OAAgB;AACvB,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAwC;AAEtC,UAAM,YAAY,KAAK,iBAAiB,yBAAyB,KAAK,WAAW;AAEjF,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA;AAAA,MACV,WAAW;AAAA,MACX,oBAAoB;AAAA,MACpB,eAAe;AAAA,MACf,YAAY;AAAA;AAAA,MACZ,YAAY;AAAA,QACV,OAAO;AAAA;AAAA,QACP,KAAK;AAAA;AAAA,MACP;AAAA;AAAA,MAEA,QAAQ,UAAU;AAAA,MAClB,cAAc,UAAU;AAAA,MACxB,iBAAiB,UAAU;AAAA,MAC3B,eAAe,UAAU;AAAA,MACzB,aAAa,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,QAA8C;AAC7D,UAAM,kBACJ,UAAU,KAAK,WAAW,KAAK,KAAK,iBAAiB;AAEvD,WAAO;AAAA,MACL,SAAS,gBAAgB;AAAA,MACzB,WAAW,gBAAgB;AAAA,MAC3B,eAAe;AAAA;AAAA,MACf,UAAU;AAAA,MACV,oBAAoB,gBAAgB;AAAA,MACpC,cAAc,gBAAgB;AAAA,MAC9B,UAAU,gBAAgB;AAAA,MAC1B,eAAe,gBAAgB;AAAA,MAC/B,YAAY,gBAAgB;AAAA,MAC5B,YAAY,gBAAgB;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAA6C;AACxD,SAAK,WAAW,OAAO;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqB;AACnB,WAAO,WAAW,KAAK,UAAU;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAoB;AAClB,SAAK,WAAW,KAAK,iBAAiB,CAAC;AAAA,EACzC;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
+
import { dirname as __pathDirname } from 'path';
|
|
3
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __pathDirname(__filename);
|
|
1
5
|
import { LinearRestClient } from "./rest-client.js";
|
|
2
6
|
import { logger } from "../../core/monitoring/logger.js";
|
|
3
7
|
import chalk from "chalk";
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/integrations/linear/migration.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * Linear Workspace Migration Tool\n * Migrates all tasks from one Linear workspace to another\n */\n\nimport { LinearRestClient } from './rest-client.js';\nimport { logger } from '../../core/monitoring/logger.js';\nimport chalk from 'chalk';\n\nexport interface MigrationConfig {\n sourceApiKey: string;\n targetApiKey: string;\n dryRun?: boolean;\n includeStates?: string[]; // Filter by state\n taskPrefix?: string; // Only migrate tasks with this identifier prefix (e.g., \"STA-\")\n deleteFromSource?: boolean; // Delete tasks from source after successful migration\n batchSize?: number;\n delayMs?: number; // Delay between API calls\n}\n\nexport interface MigrationResult {\n totalTasks: number;\n exported: number;\n imported: number;\n failed: number;\n deleted: number;\n deleteFailed: number;\n errors: string[];\n taskMappings: Array<{\n sourceId: string;\n sourceIdentifier: string;\n targetId?: string;\n targetIdentifier?: string;\n deleted?: boolean;\n error?: string;\n }>;\n}\n\nexport class LinearMigrator {\n private sourceClient: LinearRestClient;\n private targetClient: LinearRestClient;\n private config: MigrationConfig;\n\n constructor(config: MigrationConfig) {\n this.config = config;\n this.sourceClient = new LinearRestClient(config.sourceApiKey);\n this.targetClient = new LinearRestClient(config.targetApiKey);\n }\n\n /**\n * Test connections to both workspaces\n */\n async testConnections(): Promise<{\n source: { success: boolean; info?: any; error?: string };\n target: { success: boolean; info?: any; error?: string };\n }> {\n const result = {\n source: { success: false } as any,\n target: { success: false } as any\n };\n\n // Test source connection\n try {\n const sourceViewer = await this.sourceClient.getViewer();\n const sourceTeam = await this.sourceClient.getTeam();\n result.source = {\n success: true,\n info: {\n user: sourceViewer,\n team: sourceTeam\n }\n };\n } catch (error: unknown) {\n result.source = {\n success: false,\n error: (error as Error).message\n };\n }\n\n // Test target connection \n try {\n const targetViewer = await this.targetClient.getViewer();\n const targetTeam = await this.targetClient.getTeam();\n result.target = {\n success: true,\n info: {\n user: targetViewer,\n team: targetTeam\n }\n };\n } catch (error: unknown) {\n result.target = {\n success: false,\n error: (error as Error).message\n };\n }\n\n return result;\n }\n\n /**\n * Migrate all tasks from source to target workspace\n */\n async migrate(): Promise<MigrationResult> {\n const result: MigrationResult = {\n totalTasks: 0,\n exported: 0,\n imported: 0,\n failed: 0,\n deleted: 0,\n deleteFailed: 0,\n errors: [],\n taskMappings: []\n };\n\n try {\n console.log(chalk.yellow('\uD83D\uDD04 Starting Linear workspace migration...'));\n\n // Get all tasks from source\n const sourceTasks = await this.sourceClient.getAllTasks(true); // Force refresh\n result.totalTasks = sourceTasks.length;\n console.log(chalk.cyan(`\uD83D\uDCCB Found ${sourceTasks.length} tasks in source workspace`));\n\n // Filter by prefix (e.g., \"STA-\" tasks only)\n let tasksToMigrate = sourceTasks;\n if (this.config.taskPrefix) {\n tasksToMigrate = sourceTasks.filter((task: any) => \n task.identifier.startsWith(this.config.taskPrefix!)\n );\n console.log(chalk.cyan(`\uD83D\uDCCB Filtered to ${tasksToMigrate.length} tasks with prefix \"${this.config.taskPrefix}\"`));\n }\n\n // Filter by states if specified\n if (this.config.includeStates?.length) {\n tasksToMigrate = tasksToMigrate.filter((task: any) => \n this.config.includeStates!.includes(task.state.type)\n );\n console.log(chalk.cyan(`\uD83D\uDCCB Further filtered to ${tasksToMigrate.length} tasks matching states: ${this.config.includeStates.join(', ')}`));\n }\n\n result.exported = tasksToMigrate.length;\n\n if (this.config.dryRun) {\n console.log(chalk.yellow('\uD83D\uDD0D DRY RUN - No tasks will be created'));\n tasksToMigrate.forEach(task => {\n result.taskMappings.push({\n sourceId: task.id,\n sourceIdentifier: task.identifier,\n targetId: 'DRY_RUN',\n targetIdentifier: 'DRY_RUN'\n });\n });\n result.imported = tasksToMigrate.length;\n return result;\n }\n\n // Get target team info\n const targetTeam = await this.targetClient.getTeam();\n console.log(chalk.cyan(`\uD83C\uDFAF Target team: ${targetTeam.name} (${targetTeam.key})`));\n\n // Migrate tasks in batches\n const batchSize = this.config.batchSize || 5;\n const delayMs = this.config.delayMs || 2000;\n\n for (let i = 0; i < tasksToMigrate.length; i += batchSize) {\n const batch = tasksToMigrate.slice(i, i + batchSize);\n console.log(chalk.yellow(`\uD83D\uDCE6 Processing batch ${Math.floor(i / batchSize) + 1}/${Math.ceil(tasksToMigrate.length / batchSize)}`));\n\n for (const task of batch) {\n try {\n const newTask = await this.migrateTask(task, targetTeam.id);\n const mapping = {\n sourceId: task.id,\n sourceIdentifier: task.identifier,\n targetId: newTask.id,\n targetIdentifier: newTask.identifier,\n deleted: false\n };\n\n result.imported++;\n console.log(chalk.green(`\u2705 ${task.identifier} \u2192 ${newTask.identifier}: ${task.title}`));\n\n // Delete from source if configured\n if (this.config.deleteFromSource) {\n try {\n await this.deleteTask(task.id);\n mapping.deleted = true;\n result.deleted++;\n console.log(chalk.gray(`\uD83D\uDDD1\uFE0F Deleted ${task.identifier} from source`));\n } catch (deleteError: unknown) {\n result.deleteFailed++;\n result.errors.push(`Delete failed for ${task.identifier}: ${(deleteError as Error).message}`);\n console.log(chalk.yellow(`\u26A0\uFE0F Failed to delete ${task.identifier} from source: ${(deleteError as Error).message}`));\n }\n }\n\n result.taskMappings.push(mapping);\n } catch (error: unknown) {\n const errorMsg = (error as Error).message;\n result.errors.push(`${task.identifier}: ${errorMsg}`);\n result.taskMappings.push({\n sourceId: task.id,\n sourceIdentifier: task.identifier,\n error: errorMsg\n });\n result.failed++;\n console.log(chalk.red(`\u274C ${task.identifier}: ${errorMsg}`));\n }\n }\n\n // Delay between batches to avoid rate limits\n if (i + batchSize < tasksToMigrate.length) {\n console.log(chalk.gray(`\u23F3 Waiting ${delayMs}ms before next batch...`));\n await this.delay(delayMs);\n }\n }\n\n } catch (error: unknown) {\n result.errors.push(`Migration failed: ${(error as Error).message}`);\n logger.error('Migration failed:', error as Error);\n }\n\n return result;\n }\n\n /**\n * Migrate a single task\n */\n private async migrateTask(sourceTask: any, targetTeamId: string): Promise<any> {\n // Map states from source to target format\n const stateMapping: Record<string, string> = {\n 'backlog': 'backlog',\n 'unstarted': 'unstarted', \n 'started': 'started',\n 'completed': 'completed',\n 'canceled': 'canceled'\n };\n\n // Create task in target workspace using GraphQL\n const createTaskQuery = `\n mutation CreateIssue($input: IssueCreateInput!) {\n issueCreate(input: $input) {\n success\n issue {\n id\n identifier\n title\n description\n state {\n id\n name\n type\n }\n priority\n createdAt\n updatedAt\n url\n }\n }\n }\n `;\n\n // Prepare task input\n const taskInput = {\n title: `[MIGRATED] ${sourceTask.title}`,\n description: this.formatMigratedDescription(sourceTask),\n teamId: targetTeamId,\n priority: this.mapPriority(sourceTask.priority)\n };\n\n const response = await this.targetClient.makeRequest<{\n data: {\n issueCreate: {\n success: boolean;\n issue: any;\n };\n };\n }>(createTaskQuery, { input: taskInput });\n\n if (!response.data?.issueCreate?.success) {\n throw new Error('Failed to create task in target workspace');\n }\n\n return response.data.issueCreate.issue;\n }\n\n /**\n * Format description with migration context\n */\n private formatMigratedDescription(sourceTask: any): string {\n let description = sourceTask.description || '';\n \n description += `\\n\\n---\\n**Migration Info:**\\n`;\n description += `- Original ID: ${sourceTask.identifier}\\n`;\n description += `- Migrated: ${new Date().toISOString()}\\n`;\n description += `- Original State: ${sourceTask.state.name}\\n`;\n \n if (sourceTask.assignee) {\n description += `- Original Assignee: ${sourceTask.assignee.name}\\n`;\n }\n \n if (sourceTask.estimate) {\n description += `- Original Estimate: ${sourceTask.estimate} points\\n`;\n }\n\n return description;\n }\n\n /**\n * Map priority values\n */\n private mapPriority(priority?: number): number {\n // Linear priorities: 0=none, 1=urgent, 2=high, 3=medium, 4=low\n return priority || 0;\n }\n\n /**\n * Delete a task from the source workspace\n */\n private async deleteTask(taskId: string): Promise<void> {\n const deleteQuery = `\n mutation DeleteIssue($id: String!) {\n issueDelete(id: $id) {\n success\n }\n }\n `;\n\n const response = await (this.sourceClient as any).makeRequest(deleteQuery, { id: taskId });\n \n if (!response.data?.issueDelete?.success) {\n throw new Error('Failed to delete task from source workspace');\n }\n }\n\n /**\n * Delay helper\n */\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n\n/**\n * CLI function to run migration\n */\nexport async function runMigration(config: MigrationConfig): Promise<void> {\n const migrator = new LinearMigrator(config);\n \n console.log(chalk.blue('\uD83D\uDD0D Testing connections...'));\n const connectionTest = await migrator.testConnections();\n \n if (!connectionTest.source.success) {\n console.error(chalk.red(`\u274C Source connection failed: ${connectionTest.source.error}`));\n return;\n }\n \n if (!connectionTest.target.success) {\n console.error(chalk.red(`\u274C Target connection failed: ${connectionTest.target.error}`));\n return;\n }\n \n console.log(chalk.green('\u2705 Both connections successful'));\n console.log(chalk.cyan(`\uD83D\uDCE4 Source: ${connectionTest.source.info.user.name} @ ${connectionTest.source.info.team.name}`));\n console.log(chalk.cyan(`\uD83D\uDCE5 Target: ${connectionTest.target.info.user.name} @ ${connectionTest.target.info.team.name}`));\n \n const result = await migrator.migrate();\n \n console.log(chalk.blue('\\n\uD83D\uDCCA Migration Summary:'));\n console.log(` Total tasks: ${result.totalTasks}`);\n console.log(` Exported: ${result.exported}`);\n console.log(chalk.green(` \u2705 Imported: ${result.imported}`));\n console.log(chalk.red(` \u274C Failed: ${result.failed}`));\n if (config.deleteFromSource) {\n console.log(chalk.gray(` \uD83D\uDDD1\uFE0F Deleted: ${result.deleted}`));\n if (result.deleteFailed > 0) {\n console.log(chalk.yellow(` \u26A0\uFE0F Delete failed: ${result.deleteFailed}`));\n }\n }\n \n if (result.errors.length > 0) {\n console.log(chalk.red('\\n\u274C Errors:'));\n result.errors.forEach(error => console.log(chalk.red(` - ${error}`)));\n }\n \n if (result.imported > 0) {\n console.log(chalk.green(`\\n\uD83C\uDF89 Migration completed! ${result.imported} tasks migrated successfully.`));\n if (config.deleteFromSource && result.deleted > 0) {\n console.log(chalk.gray(` ${result.deleted} tasks deleted from source workspace.`));\n }\n }\n}"],
|
|
5
|
-
"mappings": "AAKA,SAAS,wBAAwB;AACjC,SAAS,cAAc;AACvB,OAAO,WAAW;AA+BX,MAAM,eAAe;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAyB;AACnC,SAAK,SAAS;AACd,SAAK,eAAe,IAAI,iBAAiB,OAAO,YAAY;AAC5D,SAAK,eAAe,IAAI,iBAAiB,OAAO,YAAY;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAGH;AACD,UAAM,SAAS;AAAA,MACb,QAAQ,EAAE,SAAS,MAAM;AAAA,MACzB,QAAQ,EAAE,SAAS,MAAM;AAAA,IAC3B;AAGA,QAAI;AACF,YAAM,eAAe,MAAM,KAAK,aAAa,UAAU;AACvD,YAAM,aAAa,MAAM,KAAK,aAAa,QAAQ;AACnD,aAAO,SAAS;AAAA,QACd,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF,SAAS,OAAgB;AACvB,aAAO,SAAS;AAAA,QACd,SAAS;AAAA,QACT,OAAQ,MAAgB;AAAA,MAC1B;AAAA,IACF;AAGA,QAAI;AACF,YAAM,eAAe,MAAM,KAAK,aAAa,UAAU;AACvD,YAAM,aAAa,MAAM,KAAK,aAAa,QAAQ;AACnD,aAAO,SAAS;AAAA,QACd,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF,SAAS,OAAgB;AACvB,aAAO,SAAS;AAAA,QACd,SAAS;AAAA,QACT,OAAQ,MAAgB;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAoC;AACxC,UAAM,SAA0B;AAAA,MAC9B,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,cAAc;AAAA,MACd,QAAQ,CAAC;AAAA,MACT,cAAc,CAAC;AAAA,IACjB;AAEA,QAAI;AACF,cAAQ,IAAI,MAAM,OAAO,kDAA2C,CAAC;AAGrE,YAAM,cAAc,MAAM,KAAK,aAAa,YAAY,IAAI;AAC5D,aAAO,aAAa,YAAY;AAChC,cAAQ,IAAI,MAAM,KAAK,mBAAY,YAAY,MAAM,4BAA4B,CAAC;AAGlF,UAAI,iBAAiB;AACrB,UAAI,KAAK,OAAO,YAAY;AAC1B,yBAAiB,YAAY;AAAA,UAAO,CAAC,SACnC,KAAK,WAAW,WAAW,KAAK,OAAO,UAAW;AAAA,QACpD;AACA,gBAAQ,IAAI,MAAM,KAAK,yBAAkB,eAAe,MAAM,uBAAuB,KAAK,OAAO,UAAU,GAAG,CAAC;AAAA,MACjH;AAGA,UAAI,KAAK,OAAO,eAAe,QAAQ;AACrC,yBAAiB,eAAe;AAAA,UAAO,CAAC,SACtC,KAAK,OAAO,cAAe,SAAS,KAAK,MAAM,IAAI;AAAA,QACrD;AACA,gBAAQ,IAAI,MAAM,KAAK,iCAA0B,eAAe,MAAM,2BAA2B,KAAK,OAAO,cAAc,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,MAC1I;AAEA,aAAO,WAAW,eAAe;AAEjC,UAAI,KAAK,OAAO,QAAQ;AACtB,gBAAQ,IAAI,MAAM,OAAO,8CAAuC,CAAC;AACjE,uBAAe,QAAQ,UAAQ;AAC7B,iBAAO,aAAa,KAAK;AAAA,YACvB,UAAU,KAAK;AAAA,YACf,kBAAkB,KAAK;AAAA,YACvB,UAAU;AAAA,YACV,kBAAkB;AAAA,UACpB,CAAC;AAAA,QACH,CAAC;AACD,eAAO,WAAW,eAAe;AACjC,eAAO;AAAA,MACT;AAGA,YAAM,aAAa,MAAM,KAAK,aAAa,QAAQ;AACnD,cAAQ,IAAI,MAAM,KAAK,0BAAmB,WAAW,IAAI,KAAK,WAAW,GAAG,GAAG,CAAC;AAGhF,YAAM,YAAY,KAAK,OAAO,aAAa;AAC3C,YAAM,UAAU,KAAK,OAAO,WAAW;AAEvC,eAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK,WAAW;AACzD,cAAM,QAAQ,eAAe,MAAM,GAAG,IAAI,SAAS;AACnD,gBAAQ,IAAI,MAAM,OAAO,8BAAuB,KAAK,MAAM,IAAI,SAAS,IAAI,CAAC,IAAI,KAAK,KAAK,eAAe,SAAS,SAAS,CAAC,EAAE,CAAC;AAEhI,mBAAW,QAAQ,OAAO;AACxB,cAAI;AACF,kBAAM,UAAU,MAAM,KAAK,YAAY,MAAM,WAAW,EAAE;AAC1D,kBAAM,UAAU;AAAA,cACd,UAAU,KAAK;AAAA,cACf,kBAAkB,KAAK;AAAA,cACvB,UAAU,QAAQ;AAAA,cAClB,kBAAkB,QAAQ;AAAA,cAC1B,SAAS;AAAA,YACX;AAEA,mBAAO;AACP,oBAAQ,IAAI,MAAM,MAAM,UAAK,KAAK,UAAU,WAAM,QAAQ,UAAU,KAAK,KAAK,KAAK,EAAE,CAAC;AAGtF,gBAAI,KAAK,OAAO,kBAAkB;AAChC,kBAAI;AACF,sBAAM,KAAK,WAAW,KAAK,EAAE;AAC7B,wBAAQ,UAAU;AAClB,uBAAO;AACP,wBAAQ,IAAI,MAAM,KAAK,4BAAgB,KAAK,UAAU,cAAc,CAAC;AAAA,cACvE,SAAS,aAAsB;AAC7B,uBAAO;AACP,uBAAO,OAAO,KAAK,qBAAqB,KAAK,UAAU,KAAM,YAAsB,OAAO,EAAE;AAC5F,wBAAQ,IAAI,MAAM,OAAO,kCAAwB,KAAK,UAAU,iBAAkB,YAAsB,OAAO,EAAE,CAAC;AAAA,cACpH;AAAA,YACF;AAEA,mBAAO,aAAa,KAAK,OAAO;AAAA,UAClC,SAAS,OAAgB;AACvB,kBAAM,WAAY,MAAgB;AAClC,mBAAO,OAAO,KAAK,GAAG,KAAK,UAAU,KAAK,QAAQ,EAAE;AACpD,mBAAO,aAAa,KAAK;AAAA,cACvB,UAAU,KAAK;AAAA,cACf,kBAAkB,KAAK;AAAA,cACvB,OAAO;AAAA,YACT,CAAC;AACD,mBAAO;AACP,oBAAQ,IAAI,MAAM,IAAI,UAAK,KAAK,UAAU,KAAK,QAAQ,EAAE,CAAC;AAAA,UAC5D;AAAA,QACF;AAGA,YAAI,IAAI,YAAY,eAAe,QAAQ;AACzC,kBAAQ,IAAI,MAAM,KAAK,kBAAa,OAAO,yBAAyB,CAAC;AACrE,gBAAM,KAAK,MAAM,OAAO;AAAA,QAC1B;AAAA,MACF;AAAA,IAEF,SAAS,OAAgB;AACvB,aAAO,OAAO,KAAK,qBAAsB,MAAgB,OAAO,EAAE;AAClE,aAAO,MAAM,qBAAqB,KAAc;AAAA,IAClD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YAAY,YAAiB,cAAoC;AAE7E,UAAM,eAAuC;AAAA,MAC3C,WAAW;AAAA,MACX,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa;AAAA,MACb,YAAY;AAAA,IACd;AAGA,UAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBxB,UAAM,YAAY;AAAA,MAChB,OAAO,cAAc,WAAW,KAAK;AAAA,MACrC,aAAa,KAAK,0BAA0B,UAAU;AAAA,MACtD,QAAQ;AAAA,MACR,UAAU,KAAK,YAAY,WAAW,QAAQ;AAAA,IAChD;AAEA,UAAM,WAAW,MAAM,KAAK,aAAa,YAOtC,iBAAiB,EAAE,OAAO,UAAU,CAAC;AAExC,QAAI,CAAC,SAAS,MAAM,aAAa,SAAS;AACxC,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AAEA,WAAO,SAAS,KAAK,YAAY;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKQ,0BAA0B,YAAyB;AACzD,QAAI,cAAc,WAAW,eAAe;AAE5C,mBAAe;AAAA;AAAA;AAAA;AAAA;AACf,mBAAe,kBAAkB,WAAW,UAAU;AAAA;AACtD,mBAAe,gBAAe,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AACtD,mBAAe,qBAAqB,WAAW,MAAM,IAAI;AAAA;AAEzD,QAAI,WAAW,UAAU;AACvB,qBAAe,wBAAwB,WAAW,SAAS,IAAI;AAAA;AAAA,IACjE;AAEA,QAAI,WAAW,UAAU;AACvB,qBAAe,wBAAwB,WAAW,QAAQ;AAAA;AAAA,IAC5D;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,UAA2B;AAE7C,WAAO,YAAY;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAW,QAA+B;AACtD,UAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQpB,UAAM,WAAW,MAAO,KAAK,aAAqB,YAAY,aAAa,EAAE,IAAI,OAAO,CAAC;AAEzF,QAAI,CAAC,SAAS,MAAM,aAAa,SAAS;AACxC,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,MAAM,IAA2B;AACvC,WAAO,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AAAA,EACvD;AACF;AAKA,eAAsB,aAAa,QAAwC;AACzE,QAAM,WAAW,IAAI,eAAe,MAAM;AAE1C,UAAQ,IAAI,MAAM,KAAK,kCAA2B,CAAC;AACnD,QAAM,iBAAiB,MAAM,SAAS,gBAAgB;AAEtD,MAAI,CAAC,eAAe,OAAO,SAAS;AAClC,YAAQ,MAAM,MAAM,IAAI,oCAA+B,eAAe,OAAO,KAAK,EAAE,CAAC;AACrF;AAAA,EACF;AAEA,MAAI,CAAC,eAAe,OAAO,SAAS;AAClC,YAAQ,MAAM,MAAM,IAAI,oCAA+B,eAAe,OAAO,KAAK,EAAE,CAAC;AACrF;AAAA,EACF;AAEA,UAAQ,IAAI,MAAM,MAAM,oCAA+B,CAAC;AACxD,UAAQ,IAAI,MAAM,KAAK,qBAAc,eAAe,OAAO,KAAK,KAAK,IAAI,MAAM,eAAe,OAAO,KAAK,KAAK,IAAI,EAAE,CAAC;AACtH,UAAQ,IAAI,MAAM,KAAK,qBAAc,eAAe,OAAO,KAAK,KAAK,IAAI,MAAM,eAAe,OAAO,KAAK,KAAK,IAAI,EAAE,CAAC;AAEtH,QAAM,SAAS,MAAM,SAAS,QAAQ;AAEtC,UAAQ,IAAI,MAAM,KAAK,gCAAyB,CAAC;AACjD,UAAQ,IAAI,kBAAkB,OAAO,UAAU,EAAE;AACjD,UAAQ,IAAI,eAAe,OAAO,QAAQ,EAAE;AAC5C,UAAQ,IAAI,MAAM,MAAM,sBAAiB,OAAO,QAAQ,EAAE,CAAC;AAC3D,UAAQ,IAAI,MAAM,IAAI,oBAAe,OAAO,MAAM,EAAE,CAAC;AACrD,MAAI,OAAO,kBAAkB;AAC3B,YAAQ,IAAI,MAAM,KAAK,+BAAmB,OAAO,OAAO,EAAE,CAAC;AAC3D,QAAI,OAAO,eAAe,GAAG;AAC3B,cAAQ,IAAI,MAAM,OAAO,kCAAwB,OAAO,YAAY,EAAE,CAAC;AAAA,IACzE;AAAA,EACF;AAEA,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,YAAQ,IAAI,MAAM,IAAI,kBAAa,CAAC;AACpC,WAAO,OAAO,QAAQ,WAAS,QAAQ,IAAI,MAAM,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC;AAAA,EACvE;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,YAAQ,IAAI,MAAM,MAAM;AAAA,iCAA6B,OAAO,QAAQ,+BAA+B,CAAC;AACpG,QAAI,OAAO,oBAAoB,OAAO,UAAU,GAAG;AACjD,cAAQ,IAAI,MAAM,KAAK,MAAM,OAAO,OAAO,uCAAuC,CAAC;AAAA,IACrF;AAAA,EACF;AACF;",
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
+
import { dirname as __pathDirname } from 'path';
|
|
3
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __pathDirname(__filename);
|
|
1
5
|
import express from "express";
|
|
2
6
|
import { URL } from "url";
|
|
3
7
|
import { logger } from "../../core/monitoring/logger.js";
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/integrations/linear/oauth-server.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * OAuth Callback Server for Linear Integration\n * Handles the OAuth callback redirect and completes the authentication flow\n */\n\nimport express from 'express';\nimport http from 'http';\nimport { URL } from 'url';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { LinearAuthManager } from './auth.js';\nimport chalk from 'chalk';\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\nexport interface OAuthServerConfig {\n port?: number;\n host?: string;\n redirectPath?: string;\n autoShutdown?: boolean;\n shutdownDelay?: number;\n}\n\nexport class LinearOAuthServer {\n private app: express.Application;\n private server: http.Server | null = null;\n private authManager: LinearAuthManager;\n private config: OAuthServerConfig;\n private pendingCodeVerifiers: Map<string, string> = new Map();\n private authCompleteCallbacks: Map<string, (success: boolean) => void> = new Map();\n\n constructor(projectRoot: string, config?: OAuthServerConfig) {\n this.app = express();\n this.authManager = new LinearAuthManager(projectRoot);\n \n this.config = {\n port: config?.port || 3456,\n host: config?.host || 'localhost',\n redirectPath: config?.redirectPath || '/auth/linear/callback',\n autoShutdown: config?.autoShutdown !== false,\n shutdownDelay: config?.shutdownDelay || 5000,\n };\n\n this.setupRoutes();\n }\n\n private setupRoutes(): void {\n // Health check endpoint\n this.app.get('/health', (req, res) => {\n res.json({\n status: 'healthy',\n service: 'linear-oauth',\n timestamp: new Date().toISOString(),\n });\n });\n\n // OAuth callback endpoint\n this.app.get(this.config.redirectPath!, async (req, res) => {\n const { code, state, error, error_description } = req.query;\n\n // Handle OAuth errors\n if (error) {\n logger.error(`OAuth error: ${error} - ${error_description}`);\n res.send(this.generateErrorPage(\n 'Authorization Failed',\n `${error}: ${error_description || 'An error occurred during authorization'}`\n ));\n \n if (state && this.authCompleteCallbacks.has(state as string)) {\n this.authCompleteCallbacks.get(state as string)!(false);\n this.authCompleteCallbacks.delete(state as string);\n }\n \n this.scheduleShutdown();\n return;\n }\n\n // Validate required parameters\n if (!code) {\n res.send(this.generateErrorPage(\n 'Missing Authorization Code',\n 'No authorization code was provided in the callback'\n ));\n this.scheduleShutdown();\n return;\n }\n\n try {\n // Get the code verifier for this session\n const codeVerifier = state \n ? this.pendingCodeVerifiers.get(state as string)\n : process.env['_LINEAR_CODE_VERIFIER'];\n\n if (!codeVerifier) {\n throw new Error('Code verifier not found. Please restart the authorization process.');\n }\n\n // Exchange code for tokens\n logger.info('Exchanging authorization code for tokens...');\n await this.authManager.exchangeCodeForToken(code as string, codeVerifier);\n\n // Clean up\n if (state) {\n this.pendingCodeVerifiers.delete(state as string);\n }\n delete process.env['_LINEAR_CODE_VERIFIER'];\n\n // Test the connection\n const testSuccess = await this.testConnection();\n \n if (testSuccess) {\n res.send(this.generateSuccessPage());\n logger.info('Linear OAuth authentication completed successfully!');\n } else {\n throw new Error('Failed to verify Linear connection');\n }\n\n // Notify callback if registered\n if (state && this.authCompleteCallbacks.has(state as string)) {\n this.authCompleteCallbacks.get(state as string)!(true);\n this.authCompleteCallbacks.delete(state as string);\n }\n\n // Schedule server shutdown if auto-shutdown is enabled\n this.scheduleShutdown();\n } catch (error: unknown) {\n logger.error('Failed to complete OAuth flow:', error as Error);\n res.send(this.generateErrorPage(\n 'Authentication Failed',\n (error as Error).message\n ));\n \n if (state && this.authCompleteCallbacks.has(state as string)) {\n this.authCompleteCallbacks.get(state as string)!(false);\n this.authCompleteCallbacks.delete(state as string);\n }\n \n this.scheduleShutdown();\n }\n });\n\n // Start OAuth flow endpoint\n this.app.get('/auth/linear/start', (req, res) => {\n try {\n const config = this.authManager.loadConfig();\n if (!config) {\n res.status(400).send(this.generateErrorPage(\n 'Configuration Missing',\n 'Linear OAuth configuration not found. Please configure your client ID and secret.'\n ));\n return;\n }\n\n // Generate state for CSRF protection\n const state = this.generateState();\n const { url, codeVerifier } = this.authManager.generateAuthUrl(state);\n \n // Store code verifier for this session\n this.pendingCodeVerifiers.set(state, codeVerifier);\n\n // Redirect to Linear OAuth page\n res.redirect(url);\n } catch (error: unknown) {\n logger.error('Failed to start OAuth flow:', error as Error);\n res.status(500).send(this.generateErrorPage(\n 'OAuth Start Failed',\n (error as Error).message\n ));\n }\n });\n\n // 404 handler\n this.app.use((req, res) => {\n res.status(404).json({ error: 'Not found' });\n });\n }\n\n private generateState(): string {\n return Math.random().toString(36).substring(2, 15) + \n Math.random().toString(36).substring(2, 15);\n }\n\n private generateSuccessPage(): string {\n return `\n <!DOCTYPE html>\n <html>\n <head>\n <title>Linear Authorization Successful</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n }\n .container {\n background: white;\n padding: 3rem;\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n text-align: center;\n max-width: 400px;\n }\n h1 {\n color: #2d3748;\n margin-bottom: 1rem;\n }\n .success-icon {\n font-size: 4rem;\n margin-bottom: 1rem;\n }\n p {\n color: #4a5568;\n line-height: 1.6;\n margin: 1rem 0;\n }\n .close-note {\n color: #718096;\n font-size: 0.875rem;\n margin-top: 2rem;\n }\n code {\n background: #f7fafc;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-family: 'Courier New', monospace;\n }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"success-icon\">\u2705</div>\n <h1>Authorization Successful!</h1>\n <p>Your Linear account has been successfully connected to StackMemory.</p>\n <p>You can now use Linear integration features:</p>\n <p><code>stackmemory linear sync</code></p>\n <p><code>stackmemory linear create</code></p>\n <p class=\"close-note\">You can safely close this window and return to your terminal.</p>\n </div>\n </body>\n </html>\n `;\n }\n\n private generateErrorPage(title: string, message: string): string {\n return `\n <!DOCTYPE html>\n <html>\n <head>\n <title>${title}</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n }\n .container {\n background: white;\n padding: 3rem;\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n text-align: center;\n max-width: 400px;\n }\n h1 {\n color: #e53e3e;\n margin-bottom: 1rem;\n }\n .error-icon {\n font-size: 4rem;\n margin-bottom: 1rem;\n }\n p {\n color: #4a5568;\n line-height: 1.6;\n margin: 1rem 0;\n }\n .error-message {\n background: #fff5f5;\n border: 1px solid #fed7d7;\n color: #742a2a;\n padding: 1rem;\n border-radius: 6px;\n margin-top: 1rem;\n font-size: 0.875rem;\n }\n .retry-note {\n color: #718096;\n font-size: 0.875rem;\n margin-top: 2rem;\n }\n code {\n background: #f7fafc;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-family: 'Courier New', monospace;\n }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"error-icon\">\u274C</div>\n <h1>${title}</h1>\n <p>Unable to complete Linear authorization.</p>\n <div class=\"error-message\">${message}</div>\n <p class=\"retry-note\">\n Please try again with:<br>\n <code>stackmemory linear auth</code>\n </p>\n </div>\n </body>\n </html>\n `;\n }\n\n private async testConnection(): Promise<boolean> {\n try {\n const token = await this.authManager.getValidToken();\n \n const response = await fetch('https://api.linear.app/graphql', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n query: 'query { viewer { id name email } }',\n }),\n });\n\n if (response.ok) {\n const result = await response.json() as {\n data?: { viewer?: { id: string; name: string; email: string } };\n };\n if (result.data?.viewer) {\n logger.info(`Connected to Linear as: ${result.data.viewer.name} (${result.data.viewer.email})`);\n return true;\n }\n }\n\n return false;\n } catch (error: unknown) {\n logger.error('Linear connection test failed:', error as Error);\n return false;\n }\n }\n\n private scheduleShutdown(): void {\n if (this.config.autoShutdown && this.server) {\n setTimeout(() => {\n logger.info('Auto-shutting down OAuth server...');\n this.stop();\n }, this.config.shutdownDelay);\n }\n }\n\n public async start(): Promise<{ url: string; codeVerifier?: string }> {\n return new Promise((resolve, reject) => {\n try {\n // Load config and generate auth URL\n const config = this.authManager.loadConfig();\n if (!config) {\n // If no config, provide setup instructions\n const setupUrl = `http://${this.config.host}:${this.config.port}/auth/linear/start`;\n \n this.server = this.app.listen(\n this.config.port!,\n this.config.host!,\n () => {\n console.log(chalk.green('\u2713') + chalk.bold(' Linear OAuth Server Started'));\n console.log(chalk.cyan(' Authorization URL: ') + setupUrl);\n console.log(chalk.cyan(' Callback URL: ') + \n `http://${this.config.host}:${this.config.port}${this.config.redirectPath}`);\n console.log('');\n console.log(chalk.yellow(' \u26A0 Configuration Required:'));\n console.log(' 1. Create a Linear OAuth app at: https://linear.app/settings/api');\n console.log(` 2. Set redirect URI to: http://${this.config.host}:${this.config.port}${this.config.redirectPath}`);\n console.log(' 3. Set environment variables:');\n console.log(' export LINEAR_CLIENT_ID=\"your_client_id\"');\n console.log(' export LINEAR_CLIENT_SECRET=\"your_client_secret\"');\n console.log(' 4. Restart the auth process');\n \n resolve({ url: setupUrl });\n }\n );\n return;\n }\n\n // Generate state and auth URL\n const state = this.generateState();\n const { url, codeVerifier } = this.authManager.generateAuthUrl(state);\n \n // Store code verifier\n this.pendingCodeVerifiers.set(state, codeVerifier);\n\n this.server = this.app.listen(\n this.config.port!,\n this.config.host!,\n () => {\n console.log(chalk.green('\u2713') + chalk.bold(' Linear OAuth Server Started'));\n console.log(chalk.cyan(' Open this URL in your browser:'));\n console.log(' ' + chalk.underline(url));\n console.log('');\n console.log(chalk.gray(' The server will automatically shut down after authorization completes.'));\n \n resolve({ url, codeVerifier });\n }\n );\n\n // Register auth complete callback\n this.authCompleteCallbacks.set(state, (success) => {\n if (success) {\n console.log(chalk.green('\\n\u2713 Linear authorization completed successfully!'));\n } else {\n console.log(chalk.red('\\n\u2717 Linear authorization failed'));\n }\n });\n\n } catch (error: unknown) {\n reject(error);\n }\n });\n }\n\n public async stop(): Promise<void> {\n return new Promise((resolve) => {\n if (this.server) {\n this.server.close(() => {\n logger.info('OAuth server stopped');\n this.server = null;\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n\n public async waitForAuth(state: string, timeout: number = 300000): Promise<boolean> {\n return new Promise((resolve) => {\n const timeoutId = setTimeout(() => {\n this.authCompleteCallbacks.delete(state);\n resolve(false);\n }, timeout);\n\n this.authCompleteCallbacks.set(state, (success) => {\n clearTimeout(timeoutId);\n resolve(success);\n });\n });\n }\n}\n\n// Standalone execution support\nif (process.argv[1] === new URL(import.meta.url).pathname) {\n const projectRoot = process.cwd();\n const server = new LinearOAuthServer(projectRoot, {\n autoShutdown: true,\n shutdownDelay: 5000,\n });\n\n server.start()\n .then(({ url }) => {\n if (url) {\n console.log(chalk.cyan('\\nWaiting for authorization...'));\n console.log(chalk.gray('Press Ctrl+C to cancel\\n'));\n }\n })\n .catch((error) => {\n console.error(chalk.red('Failed to start OAuth server:'), error);\n process.exit(1);\n });\n\n process.on('SIGINT', async () => {\n console.log(chalk.yellow('\\n\\nShutting down OAuth server...'));\n await server.stop();\n process.exit(0);\n });\n}"],
|
|
5
|
-
"mappings": "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",
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["error"]
|
|
7
7
|
}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
+
import { dirname as __pathDirname } from 'path';
|
|
3
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __pathDirname(__filename);
|
|
1
5
|
import { logger } from "../../core/monitoring/logger.js";
|
|
2
6
|
class LinearRestClient {
|
|
3
7
|
apiKey;
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/integrations/linear/rest-client.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * Linear REST Client for StackMemory\n * Provides memory-based task storage using REST API instead of GraphQL\n */\n\nimport { logger } from '../../core/monitoring/logger.js';\n\nexport interface LinearTask {\n id: string;\n identifier: string;\n title: string;\n description?: string;\n state: {\n name: string;\n type: string;\n };\n priority: number;\n assignee?: {\n id: string;\n name: string;\n };\n estimate?: number;\n createdAt: string;\n updatedAt: string;\n url: string;\n}\n\nexport interface LinearTasksResponse {\n data: {\n issues: {\n nodes: LinearTask[];\n pageInfo: {\n hasNextPage: boolean;\n endCursor?: string;\n };\n };\n };\n}\n\nexport class LinearRestClient {\n private apiKey: string;\n private baseUrl = 'https://api.linear.app/graphql';\n private taskCache = new Map<string, LinearTask>();\n private lastSync = 0;\n private cacheTTL = 5 * 60 * 1000; // 5 minutes\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n /**\n * Get all tasks and store in memory\n */\n async getAllTasks(forceRefresh = false): Promise<LinearTask[]> {\n const now = Date.now();\n \n // Return cached data if fresh\n if (!forceRefresh && (now - this.lastSync) < this.cacheTTL && this.taskCache.size > 0) {\n return Array.from(this.taskCache.values());\n }\n\n try {\n const allTasks: LinearTask[] = [];\n let hasNextPage = true;\n let cursor: string | undefined;\n\n while (hasNextPage) {\n const query = `\n query($after: String) {\n issues(\n filter: { team: { key: { eq: \"ENG\" } } }\n first: 100\n after: $after\n ) {\n nodes {\n id\n identifier\n title\n description\n state {\n name\n type\n }\n priority\n assignee {\n id\n name\n }\n estimate\n createdAt\n updatedAt\n url\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n `;\n\n const variables = cursor ? { after: cursor } : {};\n const response = await this.makeRequest<LinearTasksResponse>(query, variables);\n\n const tasks = response.data.issues.nodes;\n allTasks.push(...tasks);\n\n // Update cache\n tasks.forEach(task => {\n this.taskCache.set(task.id, task);\n });\n\n hasNextPage = response.data.issues.pageInfo.hasNextPage;\n cursor = response.data.issues.pageInfo.endCursor;\n\n logger.info(`Fetched ${tasks.length} tasks, total: ${allTasks.length}`);\n }\n\n this.lastSync = now;\n logger.info(`Cached ${allTasks.length} Linear tasks in memory`);\n\n return allTasks;\n } catch (error: unknown) {\n logger.error('Failed to fetch Linear tasks:', error as Error);\n return Array.from(this.taskCache.values()); // Return cached data on error\n }\n }\n\n /**\n * Get tasks by status\n */\n async getTasksByStatus(status: string): Promise<LinearTask[]> {\n const tasks = await this.getAllTasks();\n return tasks.filter((task: any) => task.state.type === status);\n }\n\n /**\n * Get tasks assigned to current user\n */\n async getMyTasks(): Promise<LinearTask[]> {\n try {\n const viewer = await this.getViewer();\n const tasks = await this.getAllTasks();\n return tasks.filter((task: any) => task.assignee?.id === viewer.id);\n } catch (error: unknown) {\n logger.error('Failed to get assigned tasks:', error as Error);\n return [];\n }\n }\n\n /**\n * Get task count by status\n */\n async getTaskCounts(): Promise<Record<string, number>> {\n const tasks = await this.getAllTasks();\n const counts: Record<string, number> = {};\n\n tasks.forEach(task => {\n const status = task.state.type;\n counts[status] = (counts[status] || 0) + 1;\n });\n\n return counts;\n }\n\n /**\n * Search tasks by title or description\n */\n async searchTasks(query: string): Promise<LinearTask[]> {\n const tasks = await this.getAllTasks();\n const searchTerm = query.toLowerCase();\n\n return tasks.filter((task: any) => \n task.title.toLowerCase().includes(searchTerm) ||\n task.description?.toLowerCase().includes(searchTerm) ||\n task.identifier.toLowerCase().includes(searchTerm)\n );\n }\n\n /**\n * Get current viewer info\n */\n async getViewer(): Promise<{ id: string; name: string; email: string }> {\n const query = `\n query {\n viewer {\n id\n name\n email\n }\n }\n `;\n\n const response = await this.makeRequest<{\n data: {\n viewer: { id: string; name: string; email: string };\n };\n }>(query);\n\n return response.data.viewer;\n }\n\n /**\n * Get team info\n */\n async getTeam(): Promise<{ id: string; name: string; key: string }> {\n const query = `\n query {\n teams(filter: { key: { eq: \"ENG\" } }, first: 1) {\n nodes {\n id\n name\n key\n }\n }\n }\n `;\n\n const response = await this.makeRequest<{\n data: {\n teams: {\n nodes: Array<{ id: string; name: string; key: string }>;\n };\n };\n }>(query);\n\n if (response.data.teams.nodes.length === 0) {\n throw new Error('ENG team not found');\n }\n\n return response.data.teams.nodes[0]!;\n }\n\n /**\n * Get cache stats\n */\n getCacheStats(): {\n size: number;\n lastSync: number;\n age: number;\n fresh: boolean;\n } {\n const now = Date.now();\n return {\n size: this.taskCache.size,\n lastSync: this.lastSync,\n age: now - this.lastSync,\n fresh: (now - this.lastSync) < this.cacheTTL,\n };\n }\n\n /**\n * Clear cache\n */\n clearCache(): void {\n this.taskCache.clear();\n this.lastSync = 0;\n logger.info('Linear task cache cleared');\n }\n\n /**\n * Make GraphQL request\n */\n async makeRequest<T>(\n query: string,\n variables: Record<string, unknown> = {}\n ): Promise<T> {\n const response = await fetch(this.baseUrl, {\n method: 'POST',\n headers: {\n Authorization: this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ query, variables }),\n });\n\n const result = await response.json() as {\n data?: unknown;\n errors?: Array<{ message: string }>;\n };\n\n if (!response.ok || result.errors) {\n const errorMsg = result.errors?.[0]?.message || `${response.status} ${response.statusText}`;\n throw new Error(`Linear API error: ${errorMsg}`);\n }\n\n return result as T;\n }\n}"],
|
|
5
|
-
"mappings": "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",
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
+
import { dirname as __pathDirname } from 'path';
|
|
3
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __pathDirname(__filename);
|
|
1
5
|
import { EventEmitter } from "events";
|
|
2
6
|
import { logger } from "../../core/monitoring/logger.js";
|
|
3
7
|
import { LinearSyncEngine } from "./sync.js";
|