@stackmemoryai/stackmemory 0.5.5 → 0.5.7
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/auto-background.js +180 -0
- package/dist/cli/commands/auto-background.js.map +7 -0
- 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 +6 -0
- package/dist/cli/index.js.map +2 -2
- 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/auto-background.js +146 -0
- package/dist/hooks/auto-background.js.map +7 -0
- 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 +5 -0
- package/dist/hooks/index.js.map +2 -2
- 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
- package/scripts/install-auto-background-hook.sh +144 -0
- package/templates/claude-hooks/auto-background-hook.js +156 -0
|
@@ -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": ";;;;AAKA,OAAO,aAAa;AAEpB,SAAS,WAAW;AACpB,SAAS,cAAc;AACvB,SAAS,yBAAyB;AAClC,OAAO,WAAW;AAElB,SAAS,OAAO,KAAa,cAA+B;AAC1D,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,UAAU,QAAW;AACvB,QAAI,iBAAiB,OAAW,QAAO;AACvC,UAAM,IAAI,MAAM,wBAAwB,GAAG,cAAc;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAAiC;AACvD,SAAO,QAAQ,IAAI,GAAG;AACxB;AAWO,MAAM,kBAAkB;AAAA,EACrB;AAAA,EACA,SAA6B;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,uBAA4C,oBAAI,IAAI;AAAA,EACpD,wBAAiE,oBAAI,IAAI;AAAA,EAEjF,YAAY,aAAqB,QAA4B;AAC3D,SAAK,MAAM,QAAQ;AACnB,SAAK,cAAc,IAAI,kBAAkB,WAAW;AAEpD,SAAK,SAAS;AAAA,MACZ,MAAM,QAAQ,QAAQ;AAAA,MACtB,MAAM,QAAQ,QAAQ;AAAA,MACtB,cAAc,QAAQ,gBAAgB;AAAA,MACtC,cAAc,QAAQ,iBAAiB;AAAA,MACvC,eAAe,QAAQ,iBAAiB;AAAA,IAC1C;AAEA,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,cAAoB;AAE1B,SAAK,IAAI,IAAI,WAAW,CAAC,KAAK,QAAQ;AACpC,UAAI,KAAK;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AAAA,IACH,CAAC;AAGD,SAAK,IAAI,IAAI,KAAK,OAAO,cAAe,OAAO,KAAK,QAAQ;AAC1D,YAAM,EAAE,MAAM,OAAO,OAAO,kBAAkB,IAAI,IAAI;AAGtD,UAAI,OAAO;AACT,eAAO,MAAM,gBAAgB,KAAK,MAAM,iBAAiB,EAAE;AAC3D,YAAI,KAAK,KAAK;AAAA,UACZ;AAAA,UACA,GAAG,KAAK,KAAK,qBAAqB,wCAAwC;AAAA,QAC5E,CAAC;AAED,YAAI,SAAS,KAAK,sBAAsB,IAAI,KAAe,GAAG;AAC5D,eAAK,sBAAsB,IAAI,KAAe,EAAG,KAAK;AACtD,eAAK,sBAAsB,OAAO,KAAe;AAAA,QACnD;AAEA,aAAK,iBAAiB;AACtB;AAAA,MACF;AAGA,UAAI,CAAC,MAAM;AACT,YAAI,KAAK,KAAK;AAAA,UACZ;AAAA,UACA;AAAA,QACF,CAAC;AACD,aAAK,iBAAiB;AACtB;AAAA,MACF;AAEA,UAAI;AAEF,cAAM,eAAe,QACjB,KAAK,qBAAqB,IAAI,KAAe,IAC7C,QAAQ,IAAI,uBAAuB;AAEvC,YAAI,CAAC,cAAc;AACjB,gBAAM,IAAI,MAAM,oEAAoE;AAAA,QACtF;AAGA,eAAO,KAAK,6CAA6C;AACzD,cAAM,KAAK,YAAY,qBAAqB,MAAgB,YAAY;AAGxE,YAAI,OAAO;AACT,eAAK,qBAAqB,OAAO,KAAe;AAAA,QAClD;AACA,eAAO,QAAQ,IAAI,uBAAuB;AAG1C,cAAM,cAAc,MAAM,KAAK,eAAe;AAE9C,YAAI,aAAa;AACf,cAAI,KAAK,KAAK,oBAAoB,CAAC;AACnC,iBAAO,KAAK,qDAAqD;AAAA,QACnE,OAAO;AACL,gBAAM,IAAI,MAAM,oCAAoC;AAAA,QACtD;AAGA,YAAI,SAAS,KAAK,sBAAsB,IAAI,KAAe,GAAG;AAC5D,eAAK,sBAAsB,IAAI,KAAe,EAAG,IAAI;AACrD,eAAK,sBAAsB,OAAO,KAAe;AAAA,QACnD;AAGA,aAAK,iBAAiB;AAAA,MACxB,SAASA,QAAgB;AACvB,eAAO,MAAM,kCAAkCA,MAAc;AAC7D,YAAI,KAAK,KAAK;AAAA,UACZ;AAAA,UACCA,OAAgB;AAAA,QACnB,CAAC;AAED,YAAI,SAAS,KAAK,sBAAsB,IAAI,KAAe,GAAG;AAC5D,eAAK,sBAAsB,IAAI,KAAe,EAAG,KAAK;AACtD,eAAK,sBAAsB,OAAO,KAAe;AAAA,QACnD;AAEA,aAAK,iBAAiB;AAAA,MACxB;AAAA,IACF,CAAC;AAGD,SAAK,IAAI,IAAI,sBAAsB,CAAC,KAAK,QAAQ;AAC/C,UAAI;AACF,cAAM,SAAS,KAAK,YAAY,WAAW;AAC3C,YAAI,CAAC,QAAQ;AACX,cAAI,OAAO,GAAG,EAAE,KAAK,KAAK;AAAA,YACxB;AAAA,YACA;AAAA,UACF,CAAC;AACD;AAAA,QACF;AAGA,cAAM,QAAQ,KAAK,cAAc;AACjC,cAAM,EAAE,KAAK,aAAa,IAAI,KAAK,YAAY,gBAAgB,KAAK;AAGpE,aAAK,qBAAqB,IAAI,OAAO,YAAY;AAGjD,YAAI,SAAS,GAAG;AAAA,MAClB,SAAS,OAAgB;AACvB,eAAO,MAAM,+BAA+B,KAAc;AAC1D,YAAI,OAAO,GAAG,EAAE,KAAK,KAAK;AAAA,UACxB;AAAA,UACC,MAAgB;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAGD,SAAK,IAAI,IAAI,CAAC,KAAK,QAAQ;AACzB,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,YAAY,CAAC;AAAA,IAC7C,CAAC;AAAA,EACH;AAAA,EAEQ,gBAAwB;AAC9B,WAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE,IAC1C,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AAAA,EACnD;AAAA,EAEQ,sBAA8B;AACpC,WAAO;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;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,EA8DT;AAAA,EAEQ,kBAAkB,OAAe,SAAyB;AAChE,WAAO;AAAA;AAAA;AAAA;AAAA,iBAIM,KAAK;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAyDN,KAAK;AAAA;AAAA,uCAEkB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS5C;AAAA,EAEA,MAAc,iBAAmC;AAC/C,QAAI;AACF,YAAM,QAAQ,MAAM,KAAK,YAAY,cAAc;AAEnD,YAAM,WAAW,MAAM,MAAM,kCAAkC;AAAA,QAC7D,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,iBAAiB,UAAU,KAAK;AAAA,UAChC,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO;AAAA,QACT,CAAC;AAAA,MACH,CAAC;AAED,UAAI,SAAS,IAAI;AACf,cAAM,SAAS,MAAM,SAAS,KAAK;AAGnC,YAAI,OAAO,MAAM,QAAQ;AACvB,iBAAO,KAAK,2BAA2B,OAAO,KAAK,OAAO,IAAI,KAAK,OAAO,KAAK,OAAO,KAAK,GAAG;AAC9F,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAgB;AACvB,aAAO,MAAM,kCAAkC,KAAc;AAC7D,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,mBAAyB;AAC/B,QAAI,KAAK,OAAO,gBAAgB,KAAK,QAAQ;AAC3C,iBAAW,MAAM;AACf,eAAO,KAAK,oCAAoC;AAChD,aAAK,KAAK;AAAA,MACZ,GAAG,KAAK,OAAO,aAAa;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAa,QAAyD;AACpE,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAI;AAEF,cAAM,SAAS,KAAK,YAAY,WAAW;AAC3C,YAAI,CAAC,QAAQ;AAEX,gBAAM,WAAW,UAAU,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI;AAE/D,eAAK,SAAS,KAAK,IAAI;AAAA,YACrB,KAAK,OAAO;AAAA,YACZ,KAAK,OAAO;AAAA,YACZ,MAAM;AACJ,sBAAQ,IAAI,MAAM,MAAM,QAAG,IAAI,MAAM,KAAK,8BAA8B,CAAC;AACzE,sBAAQ,IAAI,MAAM,KAAK,uBAAuB,IAAI,QAAQ;AAC1D,sBAAQ,IAAI,MAAM,KAAK,kBAAkB,IACvC,UAAU,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,GAAG,KAAK,OAAO,YAAY,EAAE;AAC7E,sBAAQ,IAAI,EAAE;AACd,sBAAQ,IAAI,MAAM,OAAO,kCAA6B,CAAC;AACvD,sBAAQ,IAAI,oEAAoE;AAChF,sBAAQ,IAAI,oCAAoC,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,GAAG,KAAK,OAAO,YAAY,EAAE;AACjH,sBAAQ,IAAI,iCAAiC;AAC7C,sBAAQ,IAAI,+CAA+C;AAC3D,sBAAQ,IAAI,uDAAuD;AACnE,sBAAQ,IAAI,+BAA+B;AAE3C,sBAAQ,EAAE,KAAK,SAAS,CAAC;AAAA,YAC3B;AAAA,UACF;AACA;AAAA,QACF;AAGA,cAAM,QAAQ,KAAK,cAAc;AACjC,cAAM,EAAE,KAAK,aAAa,IAAI,KAAK,YAAY,gBAAgB,KAAK;AAGpE,aAAK,qBAAqB,IAAI,OAAO,YAAY;AAEjD,aAAK,SAAS,KAAK,IAAI;AAAA,UACrB,KAAK,OAAO;AAAA,UACZ,KAAK,OAAO;AAAA,UACZ,MAAM;AACJ,oBAAQ,IAAI,MAAM,MAAM,QAAG,IAAI,MAAM,KAAK,8BAA8B,CAAC;AACzE,oBAAQ,IAAI,MAAM,KAAK,kCAAkC,CAAC;AAC1D,oBAAQ,IAAI,OAAO,MAAM,UAAU,GAAG,CAAC;AACvC,oBAAQ,IAAI,EAAE;AACd,oBAAQ,IAAI,MAAM,KAAK,0EAA0E,CAAC;AAElG,oBAAQ,EAAE,KAAK,aAAa,CAAC;AAAA,UAC/B;AAAA,QACF;AAGA,aAAK,sBAAsB,IAAI,OAAO,CAAC,YAAY;AACjD,cAAI,SAAS;AACX,oBAAQ,IAAI,MAAM,MAAM,uDAAkD,CAAC;AAAA,UAC7E,OAAO;AACL,oBAAQ,IAAI,MAAM,IAAI,sCAAiC,CAAC;AAAA,UAC1D;AAAA,QACF,CAAC;AAAA,MAEH,SAAS,OAAgB;AACvB,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,OAAsB;AACjC,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAI,KAAK,QAAQ;AACf,aAAK,OAAO,MAAM,MAAM;AACtB,iBAAO,KAAK,sBAAsB;AAClC,eAAK,SAAS;AACd,kBAAQ;AAAA,QACV,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,YAAY,OAAe,UAAkB,KAA0B;AAClF,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,YAAM,YAAY,WAAW,MAAM;AACjC,aAAK,sBAAsB,OAAO,KAAK;AACvC,gBAAQ,KAAK;AAAA,MACf,GAAG,OAAO;AAEV,WAAK,sBAAsB,IAAI,OAAO,CAAC,YAAY;AACjD,qBAAa,SAAS;AACtB,gBAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AAGA,IAAI,QAAQ,KAAK,CAAC,MAAM,IAAI,IAAI,YAAY,GAAG,EAAE,UAAU;AACzD,QAAM,cAAc,QAAQ,IAAI;AAChC,QAAM,SAAS,IAAI,kBAAkB,aAAa;AAAA,IAChD,cAAc;AAAA,IACd,eAAe;AAAA,EACjB,CAAC;AAED,SAAO,MAAM,EACV,KAAK,CAAC,EAAE,IAAI,MAAM;AACjB,QAAI,KAAK;AACP,cAAQ,IAAI,MAAM,KAAK,gCAAgC,CAAC;AACxD,cAAQ,IAAI,MAAM,KAAK,0BAA0B,CAAC;AAAA,IACpD;AAAA,EACF,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,YAAQ,MAAM,MAAM,IAAI,+BAA+B,GAAG,KAAK;AAC/D,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAEH,UAAQ,GAAG,UAAU,YAAY;AAC/B,YAAQ,IAAI,MAAM,OAAO,mCAAmC,CAAC;AAC7D,UAAM,OAAO,KAAK;AAClB,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;",
|
|
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": ";;;;AAKA,SAAS,cAAc;AAkChB,MAAM,iBAAiB;AAAA,EACpB;AAAA,EACA,UAAU;AAAA,EACV,YAAY,oBAAI,IAAwB;AAAA,EACxC,WAAW;AAAA,EACX,WAAW,IAAI,KAAK;AAAA;AAAA,EAE5B,YAAY,QAAgB;AAC1B,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,eAAe,OAA8B;AAC7D,UAAM,MAAM,KAAK,IAAI;AAGrB,QAAI,CAAC,gBAAiB,MAAM,KAAK,WAAY,KAAK,YAAY,KAAK,UAAU,OAAO,GAAG;AACrF,aAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,IAC3C;AAEA,QAAI;AACF,YAAM,WAAyB,CAAC;AAChC,UAAI,cAAc;AAClB,UAAI;AAEJ,aAAO,aAAa;AAClB,cAAM,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,cAAM,YAAY,SAAS,EAAE,OAAO,OAAO,IAAI,CAAC;AAChD,cAAM,WAAW,MAAM,KAAK,YAAiC,OAAO,SAAS;AAE7E,cAAM,QAAQ,SAAS,KAAK,OAAO;AACnC,iBAAS,KAAK,GAAG,KAAK;AAGtB,cAAM,QAAQ,UAAQ;AACpB,eAAK,UAAU,IAAI,KAAK,IAAI,IAAI;AAAA,QAClC,CAAC;AAED,sBAAc,SAAS,KAAK,OAAO,SAAS;AAC5C,iBAAS,SAAS,KAAK,OAAO,SAAS;AAEvC,eAAO,KAAK,WAAW,MAAM,MAAM,kBAAkB,SAAS,MAAM,EAAE;AAAA,MACxE;AAEA,WAAK,WAAW;AAChB,aAAO,KAAK,UAAU,SAAS,MAAM,yBAAyB;AAE9D,aAAO;AAAA,IACT,SAAS,OAAgB;AACvB,aAAO,MAAM,iCAAiC,KAAc;AAC5D,aAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,QAAuC;AAC5D,UAAM,QAAQ,MAAM,KAAK,YAAY;AACrC,WAAO,MAAM,OAAO,CAAC,SAAc,KAAK,MAAM,SAAS,MAAM;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAoC;AACxC,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,UAAU;AACpC,YAAM,QAAQ,MAAM,KAAK,YAAY;AACrC,aAAO,MAAM,OAAO,CAAC,SAAc,KAAK,UAAU,OAAO,OAAO,EAAE;AAAA,IACpE,SAAS,OAAgB;AACvB,aAAO,MAAM,iCAAiC,KAAc;AAC5D,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAiD;AACrD,UAAM,QAAQ,MAAM,KAAK,YAAY;AACrC,UAAM,SAAiC,CAAC;AAExC,UAAM,QAAQ,UAAQ;AACpB,YAAM,SAAS,KAAK,MAAM;AAC1B,aAAO,MAAM,KAAK,OAAO,MAAM,KAAK,KAAK;AAAA,IAC3C,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAsC;AACtD,UAAM,QAAQ,MAAM,KAAK,YAAY;AACrC,UAAM,aAAa,MAAM,YAAY;AAErC,WAAO,MAAM;AAAA,MAAO,CAAC,SACnB,KAAK,MAAM,YAAY,EAAE,SAAS,UAAU,KAC5C,KAAK,aAAa,YAAY,EAAE,SAAS,UAAU,KACnD,KAAK,WAAW,YAAY,EAAE,SAAS,UAAU;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAkE;AACtE,UAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUd,UAAM,WAAW,MAAM,KAAK,YAIzB,KAAK;AAER,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAA8D;AAClE,UAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYd,UAAM,WAAW,MAAM,KAAK,YAMzB,KAAK;AAER,QAAI,SAAS,KAAK,MAAM,MAAM,WAAW,GAAG;AAC1C,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACtC;AAEA,WAAO,SAAS,KAAK,MAAM,MAAM,CAAC;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAKE;AACA,UAAM,MAAM,KAAK,IAAI;AACrB,WAAO;AAAA,MACL,MAAM,KAAK,UAAU;AAAA,MACrB,UAAU,KAAK;AAAA,MACf,KAAK,MAAM,KAAK;AAAA,MAChB,OAAQ,MAAM,KAAK,WAAY,KAAK;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,SAAK,UAAU,MAAM;AACrB,SAAK,WAAW;AAChB,WAAO,KAAK,2BAA2B;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,OACA,YAAqC,CAAC,GAC1B;AACZ,UAAM,WAAW,MAAM,MAAM,KAAK,SAAS;AAAA,MACzC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,KAAK;AAAA,QACpB,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,OAAO,UAAU,CAAC;AAAA,IAC3C,CAAC;AAED,UAAM,SAAS,MAAM,SAAS,KAAK;AAKnC,QAAI,CAAC,SAAS,MAAM,OAAO,QAAQ;AACjC,YAAM,WAAW,OAAO,SAAS,CAAC,GAAG,WAAW,GAAG,SAAS,MAAM,IAAI,SAAS,UAAU;AACzF,YAAM,IAAI,MAAM,qBAAqB,QAAQ,EAAE;AAAA,IACjD;AAEA,WAAO;AAAA,EACT;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 { EventEmitter } from "events";
|
|
2
6
|
import { logger } from "../../core/monitoring/logger.js";
|
|
3
7
|
import { LinearSyncEngine } from "./sync.js";
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/integrations/linear/sync-manager.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * Linear Sync Manager\n * Handles periodic and event-based synchronization with Linear\n */\n\nimport { EventEmitter } from 'events';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { LinearSyncEngine, SyncConfig, SyncResult } from './sync.js';\nimport { LinearTaskManager } from '../../features/tasks/linear-task-manager.js';\nimport { LinearAuthManager } from './auth.js';\n\nexport interface SyncManagerConfig extends SyncConfig {\n autoSyncInterval?: number; // minutes\n syncOnTaskChange?: boolean;\n syncOnSessionStart?: boolean;\n syncOnSessionEnd?: boolean;\n debounceInterval?: number; // milliseconds\n}\n\nexport class LinearSyncManager extends EventEmitter {\n private syncEngine: LinearSyncEngine;\n private syncTimer?: NodeJS.Timeout;\n private pendingSyncTimer?: NodeJS.Timeout;\n private config: SyncManagerConfig;\n private lastSyncTime: number = 0;\n private syncInProgress: boolean = false;\n private syncLockAcquired: number = 0; // Timestamp when lock was acquired\n private readonly SYNC_LOCK_TIMEOUT = 300000; // 5 minutes max sync time\n private taskStore: LinearTaskManager;\n\n constructor(\n taskStore: LinearTaskManager,\n authManager: LinearAuthManager,\n config: SyncManagerConfig,\n projectRoot?: string\n ) {\n super();\n this.taskStore = taskStore;\n this.config = {\n ...config,\n autoSyncInterval: config.autoSyncInterval || 15,\n syncOnTaskChange: config.syncOnTaskChange !== false,\n syncOnSessionStart: config.syncOnSessionStart !== false,\n syncOnSessionEnd: config.syncOnSessionEnd !== false,\n debounceInterval: config.debounceInterval || 5000, // 5 seconds\n };\n\n this.syncEngine = new LinearSyncEngine(\n taskStore,\n authManager,\n config,\n projectRoot\n );\n\n this.setupEventListeners();\n this.setupPeriodicSync();\n }\n\n /**\n * Setup event listeners for automatic sync triggers\n */\n private setupEventListeners(): void {\n if (this.config.syncOnTaskChange && this.taskStore) {\n // Listen for task changes to trigger sync\n this.taskStore.on('sync:needed', (changeType: string) => {\n logger.debug(`Task change detected: ${changeType}`);\n this.scheduleDebouncedSync();\n });\n\n // Listen for specific task events if needed for logging\n this.taskStore.on('task:created', (task: any) => {\n logger.debug(`Task created: ${task.title}`);\n });\n\n this.taskStore.on('task:completed', (task: any) => {\n logger.debug(`Task completed: ${task.title}`);\n });\n\n logger.info('Task change sync enabled via EventEmitter');\n }\n }\n\n /**\n * Setup periodic sync timer\n */\n private setupPeriodicSync(): void {\n if (!this.config.autoSync || !this.config.autoSyncInterval) {\n return;\n }\n\n // Clear existing timer if any\n if (this.syncTimer) {\n clearInterval(this.syncTimer);\n }\n\n // Setup new timer\n const intervalMs = this.config.autoSyncInterval * 60 * 1000;\n this.syncTimer = setInterval(() => {\n this.performSync('periodic');\n }, intervalMs);\n\n logger.info(\n `Periodic Linear sync enabled: every ${this.config.autoSyncInterval} minutes`\n );\n }\n\n /**\n * Schedule a debounced sync to avoid too frequent syncs\n */\n private scheduleDebouncedSync(): void {\n if (!this.config.enabled) return;\n\n // Clear existing pending sync\n if (this.pendingSyncTimer) {\n clearTimeout(this.pendingSyncTimer);\n }\n\n // Schedule new sync\n this.pendingSyncTimer = setTimeout(() => {\n this.performSync('task-change');\n }, this.config.debounceInterval);\n }\n\n /**\n * Perform a sync operation\n */\n async performSync(\n trigger:\n | 'manual'\n | 'periodic'\n | 'task-change'\n | 'session-start'\n | 'session-end'\n ): Promise<SyncResult> {\n if (!this.config.enabled) {\n return {\n success: false,\n synced: { toLinear: 0, fromLinear: 0, updated: 0 },\n conflicts: [],\n errors: ['Sync is disabled'],\n };\n }\n\n if (this.syncInProgress) {\n logger.warn(`Linear sync already in progress, skipping ${trigger} sync`);\n return {\n success: false,\n synced: { toLinear: 0, fromLinear: 0, updated: 0 },\n conflicts: [],\n errors: ['Sync already in progress'],\n };\n }\n\n // Check minimum time between syncs (avoid rapid fire)\n const now = Date.now();\n const timeSinceLastSync = now - this.lastSyncTime;\n const minInterval = 10000; // 10 seconds minimum between syncs\n\n if (trigger !== 'manual' && timeSinceLastSync < minInterval) {\n logger.debug(\n `Skipping ${trigger} sync, too soon since last sync (${timeSinceLastSync}ms ago)`\n );\n return {\n success: false,\n synced: { toLinear: 0, fromLinear: 0, updated: 0 },\n conflicts: [],\n errors: [\n `Too soon since last sync (wait ${minInterval - timeSinceLastSync}ms)`,\n ],\n };\n }\n\n try {\n this.syncInProgress = true;\n this.emit('sync:started', { trigger });\n\n logger.info(`Starting Linear sync (trigger: ${trigger})`);\n const result = await this.syncEngine.sync();\n\n this.lastSyncTime = now;\n\n if (result.success) {\n logger.info(\n `Linear sync completed: ${result.synced.toLinear} to Linear, ${result.synced.fromLinear} from Linear, ${result.synced.updated} updated`\n );\n this.emit('sync:completed', { trigger, result });\n } else {\n logger.error(`Linear sync failed: ${result.errors.join(', ')}`);\n this.emit('sync:failed', { trigger, result });\n }\n\n return result;\n } catch (error: unknown) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n logger.error(`Linear sync error: ${errorMessage}`);\n\n const result: SyncResult = {\n success: false,\n synced: { toLinear: 0, fromLinear: 0, updated: 0 },\n conflicts: [],\n errors: [errorMessage],\n };\n\n this.emit('sync:failed', { trigger, result, error });\n return result;\n } finally {\n this.syncInProgress = false;\n }\n }\n\n /**\n * Sync on session start\n */\n async syncOnStart(): Promise<SyncResult | null> {\n if (this.config.syncOnSessionStart) {\n return await this.performSync('session-start');\n }\n return null;\n }\n\n /**\n * Sync on session end\n */\n async syncOnEnd(): Promise<SyncResult | null> {\n if (this.config.syncOnSessionEnd) {\n return await this.performSync('session-end');\n }\n return null;\n }\n\n /**\n * Update sync configuration\n */\n updateConfig(newConfig: Partial<SyncManagerConfig>): void {\n this.config = { ...this.config, ...newConfig };\n this.syncEngine.updateConfig(newConfig);\n\n // Restart periodic sync if interval changed\n if (\n newConfig.autoSyncInterval !== undefined ||\n newConfig.autoSync !== undefined\n ) {\n this.setupPeriodicSync();\n }\n }\n\n /**\n * Get sync status\n */\n getStatus(): {\n enabled: boolean;\n syncInProgress: boolean;\n lastSyncTime: number;\n nextSyncTime: number | null;\n config: SyncManagerConfig;\n } {\n const nextSyncTime =\n this.config.autoSync && this.config.autoSyncInterval\n ? this.lastSyncTime + this.config.autoSyncInterval * 60 * 1000\n : null;\n\n return {\n enabled: this.config.enabled,\n syncInProgress: this.syncInProgress,\n lastSyncTime: this.lastSyncTime,\n nextSyncTime,\n config: this.config,\n };\n }\n\n /**\n * Stop all sync activities\n */\n stop(): void {\n if (this.syncTimer) {\n clearInterval(this.syncTimer);\n this.syncTimer = undefined;\n }\n\n if (this.pendingSyncTimer) {\n clearTimeout(this.pendingSyncTimer);\n this.pendingSyncTimer = undefined;\n }\n\n this.removeAllListeners();\n logger.info('Linear sync manager stopped');\n }\n\n /**\n * Force an immediate sync\n */\n async forceSync(): Promise<SyncResult> {\n return await this.performSync('manual');\n }\n}\n\n/**\n * Default sync manager configuration\n */\nexport const DEFAULT_SYNC_MANAGER_CONFIG: SyncManagerConfig = {\n enabled: true,\n direction: 'bidirectional',\n autoSync: true,\n autoSyncInterval: 15, // minutes\n conflictResolution: 'newest_wins',\n syncOnTaskChange: true,\n syncOnSessionStart: true,\n syncOnSessionEnd: true,\n debounceInterval: 5000, // 5 seconds\n};\n"],
|
|
5
|
-
"mappings": "AAKA,SAAS,oBAAoB;AAC7B,SAAS,cAAc;AACvB,SAAS,wBAAgD;AAYlD,MAAM,0BAA0B,aAAa;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAuB;AAAA,EACvB,iBAA0B;AAAA,EAC1B,mBAA2B;AAAA;AAAA,EAClB,oBAAoB;AAAA;AAAA,EAC7B;AAAA,EAER,YACE,WACA,aACA,QACA,aACA;AACA,UAAM;AACN,SAAK,YAAY;AACjB,SAAK,SAAS;AAAA,MACZ,GAAG;AAAA,MACH,kBAAkB,OAAO,oBAAoB;AAAA,MAC7C,kBAAkB,OAAO,qBAAqB;AAAA,MAC9C,oBAAoB,OAAO,uBAAuB;AAAA,MAClD,kBAAkB,OAAO,qBAAqB;AAAA,MAC9C,kBAAkB,OAAO,oBAAoB;AAAA;AAAA,IAC/C;AAEA,SAAK,aAAa,IAAI;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,SAAK,oBAAoB;AACzB,SAAK,kBAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAA4B;AAClC,QAAI,KAAK,OAAO,oBAAoB,KAAK,WAAW;AAElD,WAAK,UAAU,GAAG,eAAe,CAAC,eAAuB;AACvD,eAAO,MAAM,yBAAyB,UAAU,EAAE;AAClD,aAAK,sBAAsB;AAAA,MAC7B,CAAC;AAGD,WAAK,UAAU,GAAG,gBAAgB,CAAC,SAAc;AAC/C,eAAO,MAAM,iBAAiB,KAAK,KAAK,EAAE;AAAA,MAC5C,CAAC;AAED,WAAK,UAAU,GAAG,kBAAkB,CAAC,SAAc;AACjD,eAAO,MAAM,mBAAmB,KAAK,KAAK,EAAE;AAAA,MAC9C,CAAC;AAED,aAAO,KAAK,2CAA2C;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAA0B;AAChC,QAAI,CAAC,KAAK,OAAO,YAAY,CAAC,KAAK,OAAO,kBAAkB;AAC1D;AAAA,IACF;AAGA,QAAI,KAAK,WAAW;AAClB,oBAAc,KAAK,SAAS;AAAA,IAC9B;AAGA,UAAM,aAAa,KAAK,OAAO,mBAAmB,KAAK;AACvD,SAAK,YAAY,YAAY,MAAM;AACjC,WAAK,YAAY,UAAU;AAAA,IAC7B,GAAG,UAAU;AAEb,WAAO;AAAA,MACL,uCAAuC,KAAK,OAAO,gBAAgB;AAAA,IACrE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAA8B;AACpC,QAAI,CAAC,KAAK,OAAO,QAAS;AAG1B,QAAI,KAAK,kBAAkB;AACzB,mBAAa,KAAK,gBAAgB;AAAA,IACpC;AAGA,SAAK,mBAAmB,WAAW,MAAM;AACvC,WAAK,YAAY,aAAa;AAAA,IAChC,GAAG,KAAK,OAAO,gBAAgB;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,SAMqB;AACrB,QAAI,CAAC,KAAK,OAAO,SAAS;AACxB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,EAAE,UAAU,GAAG,YAAY,GAAG,SAAS,EAAE;AAAA,QACjD,WAAW,CAAC;AAAA,QACZ,QAAQ,CAAC,kBAAkB;AAAA,MAC7B;AAAA,IACF;AAEA,QAAI,KAAK,gBAAgB;AACvB,aAAO,KAAK,6CAA6C,OAAO,OAAO;AACvE,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,EAAE,UAAU,GAAG,YAAY,GAAG,SAAS,EAAE;AAAA,QACjD,WAAW,CAAC;AAAA,QACZ,QAAQ,CAAC,0BAA0B;AAAA,MACrC;AAAA,IACF;AAGA,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,oBAAoB,MAAM,KAAK;AACrC,UAAM,cAAc;AAEpB,QAAI,YAAY,YAAY,oBAAoB,aAAa;AAC3D,aAAO;AAAA,QACL,YAAY,OAAO,oCAAoC,iBAAiB;AAAA,MAC1E;AACA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,EAAE,UAAU,GAAG,YAAY,GAAG,SAAS,EAAE;AAAA,QACjD,WAAW,CAAC;AAAA,QACZ,QAAQ;AAAA,UACN,kCAAkC,cAAc,iBAAiB;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,WAAK,iBAAiB;AACtB,WAAK,KAAK,gBAAgB,EAAE,QAAQ,CAAC;AAErC,aAAO,KAAK,kCAAkC,OAAO,GAAG;AACxD,YAAM,SAAS,MAAM,KAAK,WAAW,KAAK;AAE1C,WAAK,eAAe;AAEpB,UAAI,OAAO,SAAS;AAClB,eAAO;AAAA,UACL,0BAA0B,OAAO,OAAO,QAAQ,eAAe,OAAO,OAAO,UAAU,iBAAiB,OAAO,OAAO,OAAO;AAAA,QAC/H;AACA,aAAK,KAAK,kBAAkB,EAAE,SAAS,OAAO,CAAC;AAAA,MACjD,OAAO;AACL,eAAO,MAAM,uBAAuB,OAAO,OAAO,KAAK,IAAI,CAAC,EAAE;AAC9D,aAAK,KAAK,eAAe,EAAE,SAAS,OAAO,CAAC;AAAA,MAC9C;AAEA,aAAO;AAAA,IACT,SAAS,OAAgB;AACvB,YAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACvD,aAAO,MAAM,sBAAsB,YAAY,EAAE;AAEjD,YAAM,SAAqB;AAAA,QACzB,SAAS;AAAA,QACT,QAAQ,EAAE,UAAU,GAAG,YAAY,GAAG,SAAS,EAAE;AAAA,QACjD,WAAW,CAAC;AAAA,QACZ,QAAQ,CAAC,YAAY;AAAA,MACvB;AAEA,WAAK,KAAK,eAAe,EAAE,SAAS,QAAQ,MAAM,CAAC;AACnD,aAAO;AAAA,IACT,UAAE;AACA,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAA0C;AAC9C,QAAI,KAAK,OAAO,oBAAoB;AAClC,aAAO,MAAM,KAAK,YAAY,eAAe;AAAA,IAC/C;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAwC;AAC5C,QAAI,KAAK,OAAO,kBAAkB;AAChC,aAAO,MAAM,KAAK,YAAY,aAAa;AAAA,IAC7C;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,WAA6C;AACxD,SAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,UAAU;AAC7C,SAAK,WAAW,aAAa,SAAS;AAGtC,QACE,UAAU,qBAAqB,UAC/B,UAAU,aAAa,QACvB;AACA,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAME;AACA,UAAM,eACJ,KAAK,OAAO,YAAY,KAAK,OAAO,mBAChC,KAAK,eAAe,KAAK,OAAO,mBAAmB,KAAK,MACxD;AAEN,WAAO;AAAA,MACL,SAAS,KAAK,OAAO;AAAA,MACrB,gBAAgB,KAAK;AAAA,MACrB,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,QAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,QAAI,KAAK,WAAW;AAClB,oBAAc,KAAK,SAAS;AAC5B,WAAK,YAAY;AAAA,IACnB;AAEA,QAAI,KAAK,kBAAkB;AACzB,mBAAa,KAAK,gBAAgB;AAClC,WAAK,mBAAmB;AAAA,IAC1B;AAEA,SAAK,mBAAmB;AACxB,WAAO,KAAK,6BAA6B;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAiC;AACrC,WAAO,MAAM,KAAK,YAAY,QAAQ;AAAA,EACxC;AACF;AAKO,MAAM,8BAAiD;AAAA,EAC5D,SAAS;AAAA,EACT,WAAW;AAAA,EACX,UAAU;AAAA,EACV,kBAAkB;AAAA;AAAA,EAClB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA;AACpB;",
|
|
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 { LinearClient } from "./client.js";
|
|
2
6
|
import { ContextService } from "../../services/context-service.js";
|
|
3
7
|
import { ConfigService } from "../../services/config-service.js";
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/integrations/linear/sync-service.ts"],
|
|
4
4
|
"sourcesContent": ["import { LinearClient, LinearIssue, LinearCreateIssueInput } from './client.js';\nimport { ContextService } from '../../services/context-service.js';\nimport { ConfigService } from '../../services/config-service.js';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { Task, TaskStatus, TaskPriority } from '../../types/task.js';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\n\n// Minimal issue data needed for sync (webhook payloads may have fewer fields)\nexport interface LinearIssueData {\n id: string;\n identifier: string;\n title: string;\n description?: string;\n state: { id?: string; name?: string; type: string };\n priority?: number;\n assignee?: { id: string; name: string };\n labels?: Array<{ name: string }>;\n url?: string;\n updatedAt: string;\n}\n\nexport interface SyncResult {\n created: number;\n updated: number;\n deleted: number;\n conflicts: number;\n errors: string[];\n}\n\nexport class LinearSyncService {\n private linearClient: LinearClient;\n private contextService: ContextService;\n private configService: ConfigService;\n // Using singleton logger from monitoring\n\n constructor() {\n // Use singleton logger\n this.configService = new ConfigService();\n this.contextService = new ContextService();\n\n const apiKey = process.env['LINEAR_API_KEY'];\n if (!apiKey) {\n throw new Error('LINEAR_API_KEY environment variable not set');\n }\n\n this.linearClient = new LinearClient({ apiKey });\n }\n\n public async syncAllIssues(): Promise<SyncResult> {\n const result: SyncResult = {\n created: 0,\n updated: 0,\n deleted: 0,\n conflicts: 0,\n errors: [],\n };\n\n try {\n const config = await this.configService.getConfig();\n const teamId = config.integrations?.linear?.teamId;\n\n if (!teamId) {\n throw new Error('Linear team ID not configured');\n }\n\n const issues = await this.linearClient.getIssues({ teamId });\n\n for (const issue of issues) {\n try {\n const synced = await this.syncIssueToLocal(issue);\n if (synced === 'created') result.created++;\n else if (synced === 'updated') result.updated++;\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : String(error);\n result.errors.push(`Failed to sync ${issue.identifier}: ${message}`);\n }\n }\n\n logger.info(\n `Sync complete: ${result.created} created, ${result.updated} updated`\n );\n } catch (error: unknown) {\n logger.error('Sync failed:', error);\n const message = error instanceof Error ? error.message : String(error);\n result.errors.push(message);\n }\n\n return result;\n }\n\n public async syncIssueToLocal(\n issue: LinearIssueData\n ): Promise<'created' | 'updated' | 'skipped'> {\n try {\n const task = this.convertIssueToTask(issue);\n const existingTask = await this.contextService.getTaskByExternalId(\n issue.id\n );\n\n if (existingTask) {\n if (this.hasChanges(existingTask, task)) {\n await this.contextService.updateTask(existingTask.id, task);\n logger.debug(`Updated task: ${issue.identifier}`);\n return 'updated';\n }\n return 'skipped';\n } else {\n await this.contextService.createTask(task);\n logger.debug(`Created task: ${issue.identifier}`);\n return 'created';\n }\n } catch (error: unknown) {\n logger.error(`Failed to sync issue ${issue.identifier}:`, error);\n throw error;\n }\n }\n\n public async syncLocalToLinear(taskId: string): Promise<any> {\n try {\n const task = await this.contextService.getTask(taskId);\n if (!task) {\n throw new Error(`Task ${taskId} not found`);\n }\n\n if (task.externalId) {\n const updateData = this.convertTaskToUpdateData(task);\n const updated = await this.linearClient.updateIssue(\n task.externalId,\n updateData\n );\n logger.debug(`Updated Linear issue: ${updated.identifier}`);\n return updated;\n } else {\n const config = await this.configService.getConfig();\n const teamId = config.integrations?.linear?.teamId;\n if (!teamId) {\n throw new Error('Linear team ID not configured');\n }\n const createData: LinearCreateIssueInput = {\n title: task.title,\n description: task.description,\n teamId,\n priority: this.mapTaskPriorityToLinearPriority(task.priority),\n };\n const created = await this.linearClient.createIssue(createData);\n await this.contextService.updateTask(taskId, {\n externalId: created.id,\n });\n logger.debug(`Created Linear issue: ${created.identifier}`);\n return created;\n }\n } catch (error: unknown) {\n logger.error(`Failed to sync task ${taskId} to Linear:`, error);\n throw error;\n }\n }\n\n public async removeLocalIssue(identifier: string): Promise<void> {\n try {\n const tasks = await this.contextService.getAllTasks();\n const task = tasks.find((t) => t.externalIdentifier === identifier);\n\n if (task) {\n await this.contextService.deleteTask(task.id);\n logger.debug(`Removed local task: ${identifier}`);\n }\n } catch (error: unknown) {\n logger.error(`Failed to remove task ${identifier}:`, error);\n throw error;\n }\n }\n\n private convertIssueToTask(issue: LinearIssueData): Partial<Task> {\n return {\n title: issue.title,\n description: issue.description || '',\n status: this.mapLinearStateToTaskStatus(issue.state.type),\n priority: this.mapLinearPriorityToTaskPriority(issue.priority),\n externalId: issue.id,\n externalIdentifier: issue.identifier,\n externalUrl: issue.url,\n tags: issue.labels?.map((l) => l.name) || [],\n metadata: {\n linear: {\n stateId: issue.state.id,\n stateName: issue.state.name,\n assigneeId: issue.assignee?.id,\n assigneeName: issue.assignee?.name,\n },\n },\n updatedAt: new Date(issue.updatedAt),\n };\n }\n\n private convertTaskToUpdateData(\n task: Task\n ): Partial<LinearCreateIssueInput> & { stateId?: string } {\n return {\n title: task.title,\n description: task.description,\n priority: this.mapTaskPriorityToLinearPriority(task.priority),\n stateId: task.metadata?.linear?.stateId as string | undefined,\n };\n }\n\n private mapLinearStateToTaskStatus(state: string): TaskStatus {\n switch (state.toLowerCase()) {\n case 'backlog':\n case 'triage':\n return 'todo';\n case 'unstarted':\n case 'todo':\n return 'todo';\n case 'started':\n case 'in_progress':\n return 'in_progress';\n case 'completed':\n case 'done':\n return 'done';\n case 'canceled':\n case 'cancelled':\n return 'cancelled';\n default:\n return 'todo';\n }\n }\n\n private mapTaskPriorityToLinearPriority(priority?: TaskPriority): number {\n switch (priority) {\n case 'urgent':\n return 1;\n case 'high':\n return 2;\n case 'medium':\n return 3;\n case 'low':\n return 4;\n default:\n return 0;\n }\n }\n\n private mapLinearPriorityToTaskPriority(\n priority?: number\n ): TaskPriority | undefined {\n switch (priority) {\n case 1:\n return 'urgent';\n case 2:\n return 'high';\n case 3:\n return 'medium';\n case 4:\n return 'low';\n default:\n return undefined;\n }\n }\n\n private hasChanges(existing: Task, updated: Partial<Task>): boolean {\n return (\n existing.title !== updated.title ||\n existing.description !== updated.description ||\n existing.status !== updated.status ||\n existing.priority !== updated.priority ||\n JSON.stringify(existing.tags) !== JSON.stringify(updated.tags)\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 { 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/sync.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * Linear Bi-directional Sync Engine\n * Handles syncing tasks between StackMemory and Linear\n */\n\nimport { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { logger } from '../../core/monitoring/logger.js';\nimport {\n PebblesTask,\n LinearTaskManager,\n TaskStatus,\n TaskPriority,\n} from '../../features/tasks/linear-task-manager.js';\nimport { LinearClient, LinearIssue, LinearCreateIssueInput } from './client.js';\nimport { LinearAuthManager } from './auth.js';\nimport { getEnv, getOptionalEnv } from '../../utils/env.js';\n\n\nexport interface SyncConfig {\n enabled: boolean;\n direction: 'bidirectional' | 'to_linear' | 'from_linear';\n defaultTeamId?: string;\n autoSync: boolean;\n conflictResolution:\n | 'linear_wins'\n | 'stackmemory_wins'\n | 'manual'\n | 'newest_wins';\n syncInterval?: number; // minutes\n maxBatchSize?: number; // max tasks to sync per batch\n rateLimitDelay?: number; // ms delay between API calls\n}\n\nexport interface SyncResult {\n success: boolean;\n synced: {\n toLinear: number;\n fromLinear: number;\n updated: number;\n };\n conflicts: Array<{\n taskId: string;\n linearId: string;\n reason: string;\n }>;\n errors: string[];\n}\n\nexport interface TaskMapping {\n stackmemoryId: string;\n linearId: string;\n linearIdentifier: string;\n lastSyncTimestamp: number;\n lastLinearUpdate: string;\n lastStackMemoryUpdate: number;\n}\n\nexport class LinearSyncEngine {\n private taskStore: LinearTaskManager;\n private linearClient: LinearClient;\n private authManager: LinearAuthManager;\n private config: SyncConfig;\n private mappings: Map<string, TaskMapping> = new Map();\n private projectRoot: string;\n private mappingsPath: string;\n\n constructor(\n taskStore: LinearTaskManager,\n authManager: LinearAuthManager,\n config: SyncConfig,\n projectRoot?: string\n ) {\n this.taskStore = taskStore;\n this.authManager = authManager;\n this.config = config;\n this.projectRoot = projectRoot || process.cwd();\n this.mappingsPath = join(\n this.projectRoot,\n '.stackmemory',\n 'linear-mappings.json'\n );\n\n // Check for API key from environment variable first\n const apiKey = process.env['LINEAR_API_KEY'];\n\n if (apiKey) {\n // Use API key from environment\n this.linearClient = new LinearClient({\n apiKey: apiKey,\n });\n } else {\n // Fall back to OAuth tokens\n const tokens = this.authManager.loadTokens();\n if (!tokens) {\n throw new Error(\n 'Linear API key or authentication tokens not found. Set LINEAR_API_KEY environment variable or run \"stackmemory linear setup\" first.'\n );\n }\n\n this.linearClient = new LinearClient({\n apiKey: tokens.accessToken,\n useBearer: true,\n onUnauthorized: async () => {\n const refreshed = await this.authManager.refreshAccessToken();\n return refreshed.accessToken;\n },\n });\n }\n\n this.loadMappings();\n }\n\n /**\n * Update sync configuration\n */\n updateConfig(newConfig: Partial<SyncConfig>): void {\n this.config = { ...this.config, ...newConfig };\n }\n\n /**\n * Perform bi-directional sync\n */\n async sync(): Promise<SyncResult> {\n if (!this.config.enabled) {\n return {\n success: false,\n synced: { toLinear: 0, fromLinear: 0, updated: 0 },\n conflicts: [],\n errors: ['Sync is disabled'],\n };\n }\n\n const result: SyncResult = {\n success: true,\n synced: { toLinear: 0, fromLinear: 0, updated: 0 },\n conflicts: [],\n errors: [],\n };\n\n try {\n // Update client with valid token if not using environment API key\n const apiKey = process.env['LINEAR_API_KEY'];\n if (!apiKey) {\n const token = await this.authManager.getValidToken();\n this.linearClient = new LinearClient({\n apiKey: token,\n useBearer: true,\n onUnauthorized: async () => {\n const refreshed = await this.authManager.refreshAccessToken();\n return refreshed.accessToken;\n },\n });\n }\n\n // Get team info if not configured\n if (!this.config.defaultTeamId) {\n const team = await this.linearClient.getTeam();\n this.config.defaultTeamId = team.id;\n logger.info(`Using Linear team: ${team.name} (${team.key})`);\n }\n\n // Sync in both directions based on configuration\n if (\n this.config.direction === 'bidirectional' ||\n this.config.direction === 'to_linear'\n ) {\n const toLinearResult = await this.syncToLinear();\n result.synced.toLinear = toLinearResult.created;\n result.synced.updated += toLinearResult.updated;\n result.errors.push(...toLinearResult.errors);\n }\n\n if (\n this.config.direction === 'bidirectional' ||\n this.config.direction === 'from_linear'\n ) {\n const fromLinearResult = await this.syncFromLinear();\n result.synced.fromLinear = fromLinearResult.created;\n result.synced.updated += fromLinearResult.updated;\n result.conflicts.push(...fromLinearResult.conflicts);\n result.errors.push(...fromLinearResult.errors);\n }\n\n this.saveMappings();\n } catch (error: unknown) {\n result.success = false;\n result.errors.push(`Sync failed: ${String(error)}`);\n logger.error('Linear sync failed:', error as Error);\n }\n\n return result;\n }\n\n /**\n * Delay helper for rate limiting\n */\n private async delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Sync tasks from StackMemory to Linear\n */\n private async syncToLinear(): Promise<{\n created: number;\n updated: number;\n errors: string[];\n }> {\n const result = { created: 0, updated: 0, errors: [] as string[] };\n const maxBatchSize = this.config.maxBatchSize || 10;\n const rateLimitDelay = this.config.rateLimitDelay || 500;\n\n // Initialize duplicate detector\n const duplicateDetector = new LinearDuplicateDetector(this.linearClient);\n\n // Get unsynced tasks from StackMemory\n const unsyncedTasks = this.getUnsyncedTasks();\n\n // Limit batch size to avoid rate limits\n const tasksToSync = unsyncedTasks.slice(0, maxBatchSize);\n\n if (unsyncedTasks.length > maxBatchSize) {\n logger.info(\n `Syncing ${tasksToSync.length} of ${unsyncedTasks.length} unsynced tasks (batch limit)`\n );\n }\n\n for (const task of tasksToSync) {\n try {\n // Check for duplicates before creating\n const duplicateCheck = await duplicateDetector.checkForDuplicate(\n task.title,\n this.config.defaultTeamId\n );\n\n let linearIssue: LinearIssue;\n \n if (duplicateCheck.isDuplicate && duplicateCheck.existingIssue) {\n // Found duplicate - merge instead of creating\n logger.info(\n `Found existing Linear issue for \"${task.title}\": ${duplicateCheck.existingIssue.identifier} (${Math.round((duplicateCheck.similarity || 0) * 100)}% match)`\n );\n \n // Merge task content into existing issue\n linearIssue = await duplicateDetector.mergeIntoExisting(\n duplicateCheck.existingIssue,\n task.title,\n this.formatDescriptionForLinear(task),\n `StackMemory Task ID: ${task.id}\\nFrame: ${task.frame_id}`\n );\n } else {\n // No duplicate found, create new issue\n linearIssue = await this.createLinearIssueFromTask(task);\n }\n\n // Create mapping\n const mapping: TaskMapping = {\n stackmemoryId: task.id,\n linearId: linearIssue.id,\n linearIdentifier: linearIssue.identifier,\n lastSyncTimestamp: Date.now(),\n lastLinearUpdate: linearIssue.updatedAt,\n lastStackMemoryUpdate: task.timestamp * 1000,\n };\n\n this.mappings.set(task.id, mapping);\n\n // Update task with Linear reference\n this.updateTaskWithLinearRef(task.id, linearIssue);\n\n result.created++;\n logger.info(\n `Synced task to Linear: ${task.title} \u2192 ${linearIssue.identifier}`\n );\n\n // Rate limit delay between creates\n await this.delay(rateLimitDelay);\n } catch (error: unknown) {\n const errorMsg = String(error);\n // Stop syncing on rate limit errors\n if (\n errorMsg.includes('rate limit') ||\n errorMsg.includes('usage limit')\n ) {\n logger.warn('Rate limit hit, stopping sync batch');\n result.errors.push('Rate limit reached - sync paused');\n break;\n }\n result.errors.push(`Failed to sync task ${task.id}: ${errorMsg}`);\n logger.error(\n `Failed to sync task ${task.id} to Linear:`,\n error as Error\n );\n }\n }\n\n // Update existing Linear issues for modified StackMemory tasks\n const modifiedTasks = this.getModifiedTasks();\n\n for (const task of modifiedTasks) {\n try {\n const mapping = this.mappings.get(task.id);\n if (!mapping) continue;\n\n await this.updateLinearIssueFromTask(task, mapping);\n\n mapping.lastSyncTimestamp = Date.now();\n mapping.lastStackMemoryUpdate = task.timestamp * 1000;\n\n result.updated++;\n logger.info(`Updated Linear issue: ${mapping.linearIdentifier}`);\n } catch (error: unknown) {\n result.errors.push(\n `Failed to update Linear issue for task ${task.id}: ${String(error)}`\n );\n logger.error(\n `Failed to update Linear issue for task ${task.id}:`,\n error as Error\n );\n }\n }\n\n return result;\n }\n\n /**\n * Sync tasks from Linear to StackMemory\n */\n private async syncFromLinear(): Promise<{\n created: number;\n updated: number;\n conflicts: Array<{ taskId: string; linearId: string; reason: string }>;\n errors: string[];\n }> {\n const result = {\n created: 0,\n updated: 0,\n conflicts: [] as Array<{\n taskId: string;\n linearId: string;\n reason: string;\n }>,\n errors: [] as string[],\n };\n\n // First, import any new issues from Linear that aren't mapped yet\n const importResult = await this.importFromLinear();\n result.created = importResult.imported;\n result.errors.push(...importResult.errors);\n\n // Then update existing mapped tasks\n for (const [taskId, mapping] of this.mappings) {\n try {\n const linearIssue = await this.linearClient.getIssue(mapping.linearId);\n\n if (!linearIssue) {\n result.errors.push(`Linear issue ${mapping.linearId} not found`);\n continue;\n }\n\n // Check if Linear issue was updated since last sync\n const linearUpdateTime = new Date(linearIssue.updatedAt).getTime();\n if (linearUpdateTime <= mapping.lastSyncTimestamp) {\n continue; // No changes in Linear\n }\n\n // Check for conflicts\n const task = this.taskStore.getTask(taskId);\n if (!task) {\n result.errors.push(`StackMemory task ${taskId} not found`);\n continue;\n }\n\n const stackMemoryUpdateTime = task.timestamp * 1000;\n\n if (\n stackMemoryUpdateTime > mapping.lastSyncTimestamp &&\n linearUpdateTime > mapping.lastSyncTimestamp\n ) {\n // Conflict: both sides updated since last sync\n result.conflicts.push({\n taskId,\n linearId: mapping.linearId,\n reason: 'Both StackMemory and Linear were updated since last sync',\n });\n\n if (this.config.conflictResolution === 'manual') {\n continue; // Skip, let user resolve manually\n }\n }\n\n // Apply conflict resolution\n const shouldUpdateFromLinear = this.shouldUpdateFromLinear(\n task,\n linearIssue,\n mapping,\n stackMemoryUpdateTime,\n linearUpdateTime\n );\n\n if (shouldUpdateFromLinear) {\n this.updateTaskFromLinearIssue(task, linearIssue);\n\n mapping.lastSyncTimestamp = Date.now();\n mapping.lastLinearUpdate = linearIssue.updatedAt;\n\n result.updated++;\n logger.info(`Updated StackMemory task from Linear: ${task.title}`);\n }\n } catch (error: unknown) {\n result.errors.push(\n `Failed to sync from Linear for task ${taskId}: ${String(error)}`\n );\n logger.error(\n `Failed to sync from Linear for task ${taskId}:`,\n error as Error\n );\n }\n }\n\n return result;\n }\n\n /**\n * Create Linear issue from StackMemory task\n */\n private async createLinearIssueFromTask(\n task: PebblesTask\n ): Promise<LinearIssue> {\n const input: LinearCreateIssueInput = {\n title: task.title,\n description: this.formatDescriptionForLinear(task),\n teamId: this.config.defaultTeamId!,\n priority: this.mapPriorityToLinear(task.priority),\n estimate: task.estimated_effort\n ? Math.ceil(task.estimated_effort / 60)\n : undefined, // Convert minutes to hours\n labelIds: this.mapTagsToLinear(task.tags),\n };\n\n return await this.linearClient.createIssue(input);\n }\n\n /**\n * Update Linear issue from StackMemory task\n */\n private async updateLinearIssueFromTask(\n task: PebblesTask,\n mapping: TaskMapping\n ): Promise<void> {\n const updates: Partial<LinearCreateIssueInput> & { stateId?: string } = {\n title: task.title,\n description: this.formatDescriptionForLinear(task),\n priority: this.mapPriorityToLinear(task.priority),\n estimate: task.estimated_effort\n ? Math.ceil(task.estimated_effort / 60)\n : undefined,\n stateId: await this.mapStatusToLinearState(task.status),\n };\n\n await this.linearClient.updateIssue(mapping.linearId, updates);\n }\n\n /**\n * Update StackMemory task from Linear issue\n */\n private updateTaskFromLinearIssue(\n task: PebblesTask,\n linearIssue: LinearIssue\n ): void {\n // Map Linear state to StackMemory status\n const newStatus = this.mapLinearStateToStatus(linearIssue.state.type);\n\n if (newStatus !== task.status) {\n this.taskStore.updateTaskStatus(\n task.id,\n newStatus,\n 'Updated from Linear'\n );\n }\n\n // Note: Other fields like title, description could be updated here\n // but require careful consideration of conflict resolution\n }\n\n /**\n * Check if task should be updated from Linear based on conflict resolution strategy\n */\n private shouldUpdateFromLinear(\n task: PebblesTask,\n linearIssue: LinearIssue,\n mapping: TaskMapping,\n stackMemoryUpdateTime: number,\n linearUpdateTime: number\n ): boolean {\n switch (this.config.conflictResolution) {\n case 'linear_wins':\n return true;\n case 'stackmemory_wins':\n return false;\n case 'newest_wins':\n return linearUpdateTime > stackMemoryUpdateTime;\n case 'manual':\n return false;\n default:\n return false;\n }\n }\n\n /**\n * Get tasks that haven't been synced to Linear yet\n */\n private getUnsyncedTasks(): PebblesTask[] {\n const activeTasks = this.taskStore.getActiveTasks();\n return activeTasks.filter(\n (task) => !this.mappings.has(task.id) && !task.external_refs?.linear\n );\n }\n\n /**\n * Get tasks that have been modified since last sync\n */\n private getModifiedTasks(): PebblesTask[] {\n const tasks: PebblesTask[] = [];\n\n for (const [taskId, mapping] of this.mappings) {\n const task = this.taskStore.getTask(taskId);\n if (task && task.timestamp * 1000 > mapping.lastSyncTimestamp) {\n tasks.push(task);\n }\n }\n\n return tasks;\n }\n\n /**\n * Update task with Linear reference\n */\n private updateTaskWithLinearRef(\n taskId: string,\n linearIssue: LinearIssue\n ): void {\n const task = this.taskStore.getTask(taskId);\n if (!task) return;\n\n // This would need a method in LinearTaskManager to update external_refs\n // For now, we'll track this in our mappings\n logger.info(`Task ${taskId} mapped to Linear ${linearIssue.identifier}`);\n }\n\n // Mapping utilities\n\n private formatDescriptionForLinear(task: PebblesTask): string {\n let description = task.description || '';\n\n description += `\\n\\n---\\n**StackMemory Context:**\\n`;\n description += `- Task ID: ${task.id}\\n`;\n description += `- Frame: ${task.frame_id}\\n`;\n description += `- Created: ${new Date(task.created_at * 1000).toISOString()}\\n`;\n\n if (task.tags.length > 0) {\n description += `- Tags: ${task.tags.join(', ')}\\n`;\n }\n\n if (task.depends_on.length > 0) {\n description += `- Dependencies: ${task.depends_on.join(', ')}\\n`;\n }\n\n return description;\n }\n\n private mapPriorityToLinear(priority: TaskPriority): number {\n const map: Record<TaskPriority, number> = {\n low: 1, // Low priority in Linear\n medium: 2, // Medium priority in Linear\n high: 3, // High priority in Linear\n urgent: 4, // Urgent priority in Linear\n };\n return map[priority] || 2;\n }\n\n private mapTagsToLinear(_tags: string[]): string[] | undefined {\n // In a full implementation, this would map StackMemory tags to Linear label IDs\n // For now, return undefined to skip label assignment\n return undefined;\n }\n\n private mapLinearStateToStatus(linearStateType: string): TaskStatus {\n switch (linearStateType) {\n case 'backlog':\n case 'unstarted':\n return 'pending';\n case 'started':\n return 'in_progress';\n case 'completed':\n return 'completed';\n case 'cancelled':\n return 'cancelled';\n default:\n return 'pending';\n }\n }\n\n private async mapStatusToLinearState(\n status: TaskStatus\n ): Promise<string | undefined> {\n // Get available states for the team\n try {\n const team = await this.linearClient.getTeam();\n const states = await this.linearClient.getWorkflowStates(team.id);\n\n // Map StackMemory status to Linear state types\n const targetStateType = this.getLinearStateTypeFromStatus(status);\n\n // Find the first state that matches the target type\n const matchingState = states.find(\n (state) => state.type === targetStateType\n );\n return matchingState?.id;\n } catch (error: unknown) {\n logger.warn(\n 'Failed to map status to Linear state:',\n error instanceof Error ? { error } : undefined\n );\n return undefined;\n }\n }\n\n private getLinearStateTypeFromStatus(status: TaskStatus): string {\n switch (status) {\n case 'pending':\n return 'unstarted';\n case 'in_progress':\n return 'started';\n case 'completed':\n return 'completed';\n case 'cancelled':\n return 'cancelled';\n case 'blocked':\n return 'unstarted'; // Map blocked to unstarted in Linear\n default:\n return 'unstarted';\n }\n }\n\n // Persistence for mappings\n\n private loadMappings(): void {\n this.mappings.clear();\n\n if (existsSync(this.mappingsPath)) {\n try {\n const data = readFileSync(this.mappingsPath, 'utf8');\n const mappingsArray: TaskMapping[] = JSON.parse(data);\n for (const mapping of mappingsArray) {\n this.mappings.set(mapping.stackmemoryId, mapping);\n }\n logger.info(`Loaded ${this.mappings.size} task mappings from disk`);\n } catch (error: unknown) {\n logger.warn('Failed to load mappings, starting fresh');\n }\n }\n }\n\n private saveMappings(): void {\n try {\n const mappingsArray = Array.from(this.mappings.values());\n writeFileSync(this.mappingsPath, JSON.stringify(mappingsArray, null, 2));\n logger.info(`Saved ${this.mappings.size} task mappings to disk`);\n } catch (error: unknown) {\n logger.error('Failed to save mappings:', error as Error);\n }\n }\n\n /**\n * Import all issues from Linear to local task store\n */\n async importFromLinear(): Promise<{\n imported: number;\n skipped: number;\n errors: string[];\n }> {\n const result = { imported: 0, skipped: 0, errors: [] as string[] };\n\n try {\n // Get team info\n if (!this.config.defaultTeamId) {\n const team = await this.linearClient.getTeam();\n this.config.defaultTeamId = team.id;\n logger.info(`Using Linear team: ${team.name} (${team.key})`);\n }\n\n // Fetch all issues from Linear (excluding completed/cancelled)\n const issues = await this.linearClient.getIssues({\n teamId: this.config.defaultTeamId,\n limit: 100,\n });\n\n logger.info(`Found ${issues.length} issues in Linear`);\n\n // Build reverse mapping (linearId -> stackmemoryId)\n const linearIdToTaskId = new Map<string, string>();\n for (const [taskId, mapping] of this.mappings) {\n linearIdToTaskId.set(mapping.linearId, taskId);\n }\n\n for (const issue of issues) {\n try {\n // Skip if already mapped\n if (linearIdToTaskId.has(issue.id)) {\n result.skipped++;\n continue;\n }\n\n // Create local task from Linear issue\n const taskId = await this.createTaskFromLinearIssue(issue);\n\n if (taskId) {\n // Create mapping\n const mapping: TaskMapping = {\n stackmemoryId: taskId,\n linearId: issue.id,\n linearIdentifier: issue.identifier,\n lastSyncTimestamp: Date.now(),\n lastLinearUpdate: issue.updatedAt,\n lastStackMemoryUpdate: Date.now(),\n };\n this.mappings.set(taskId, mapping);\n result.imported++;\n logger.info(`Imported ${issue.identifier}: ${issue.title}`);\n }\n } catch (error: unknown) {\n result.errors.push(\n `Failed to import ${issue.identifier}: ${String(error)}`\n );\n logger.error(`Failed to import ${issue.identifier}:`, error as Error);\n }\n }\n\n this.saveMappings();\n } catch (error: unknown) {\n result.errors.push(`Import failed: ${String(error)}`);\n logger.error('Linear import failed:', error as Error);\n }\n\n return result;\n }\n\n /**\n * Create a local task from a Linear issue\n */\n private async createTaskFromLinearIssue(\n issue: LinearIssue\n ): Promise<string | null> {\n try {\n const priority = this.mapLinearPriorityToLocal(issue.priority);\n\n // Build description with Linear context\n let description = issue.description || '';\n description += `\\n\\n---\\n**Linear:** ${issue.identifier} | ${issue.url}`;\n\n // Extract labels (handle both array and {nodes: [...]} formats)\n const labels = Array.isArray(issue.labels)\n ? issue.labels\n : (issue.labels as unknown as { nodes: Array<{ name: string }> })\n ?.nodes || [];\n const tags = labels.map((l) => l.name);\n if (tags.length === 0) tags.push('linear');\n\n // Create the task via the task store\n const taskId = this.taskStore.createTask({\n title: `[${issue.identifier}] ${issue.title}`,\n description,\n priority,\n frameId: 'linear-import',\n tags,\n estimatedEffort: issue.estimate ? issue.estimate * 60 : undefined,\n });\n\n // Update status if not pending\n const status = this.mapLinearStateToStatus(issue.state.type);\n if (status !== 'pending') {\n this.taskStore.updateTaskStatus(\n taskId,\n status,\n `Imported from Linear as ${status}`\n );\n }\n\n return taskId;\n } catch (error: unknown) {\n logger.error(\n `Failed to create task from Linear issue ${issue.identifier}: ${String(error)}`\n );\n return null;\n }\n }\n\n /**\n * Map Linear priority (0-4) to local TaskPriority\n */\n private mapLinearPriorityToLocal(priority: number): TaskPriority {\n switch (priority) {\n case 1:\n return 'urgent';\n case 2:\n return 'high';\n case 3:\n return 'medium';\n case 4:\n return 'low';\n default:\n return 'medium';\n }\n }\n}\n\n/**\n * Default sync configuration\n */\nexport const DEFAULT_SYNC_CONFIG: SyncConfig = {\n enabled: false,\n direction: 'bidirectional',\n autoSync: true,\n conflictResolution: 'newest_wins',\n syncInterval: 15, // minutes\n maxBatchSize: 10, // max tasks per sync batch\n rateLimitDelay: 500, // 500ms between API calls\n};\n\n/**\n * Duplicate Detection for Linear Issues\n */\nexport interface DuplicateCheckResult {\n isDuplicate: boolean;\n existingIssue?: LinearIssue;\n similarity?: number;\n}\n\nexport class LinearDuplicateDetector {\n private linearClient: LinearClient;\n private titleCache: Map<string, LinearIssue[]> = new Map();\n private cacheExpiry: number = 5 * 60 * 1000; // 5 minutes\n private lastCacheRefresh: number = 0;\n\n constructor(linearClient: LinearClient) {\n this.linearClient = linearClient;\n }\n\n /**\n * Search for existing Linear issues with similar titles\n */\n async searchByTitle(title: string, teamId?: string): Promise<LinearIssue[]> {\n const normalizedTitle = this.normalizeTitle(title);\n \n // Check cache first\n if (this.isCacheValid()) {\n const cached = this.titleCache.get(normalizedTitle);\n if (cached) return cached;\n }\n\n try {\n // Get all issues from the team (Linear API limit is 250)\n const allIssues = await this.linearClient.getIssues({\n teamId,\n limit: 100, // Use smaller limit to avoid API errors\n });\n\n // Filter for matching titles (exact and fuzzy)\n const matchingIssues = allIssues.filter(issue => {\n const issueNormalized = this.normalizeTitle(issue.title);\n \n // Exact match\n if (issueNormalized === normalizedTitle) return true;\n \n // Fuzzy match - check if titles are very similar\n const similarity = this.calculateSimilarity(normalizedTitle, issueNormalized);\n return similarity > 0.85; // 85% similarity threshold\n });\n\n // Update cache\n this.titleCache.set(normalizedTitle, matchingIssues);\n this.lastCacheRefresh = Date.now();\n\n return matchingIssues;\n } catch (error) {\n logger.error('Failed to search Linear issues by title:', error as Error);\n return [];\n }\n }\n\n /**\n * Check if a task title would create a duplicate in Linear\n */\n async checkForDuplicate(\n title: string,\n teamId?: string\n ): Promise<DuplicateCheckResult> {\n const existingIssues = await this.searchByTitle(title, teamId);\n \n if (existingIssues.length === 0) {\n return { isDuplicate: false };\n }\n\n // Find the best match\n let bestMatch: LinearIssue | undefined;\n let bestSimilarity = 0;\n\n for (const issue of existingIssues) {\n const similarity = this.calculateSimilarity(\n this.normalizeTitle(title),\n this.normalizeTitle(issue.title)\n );\n \n if (similarity > bestSimilarity) {\n bestSimilarity = similarity;\n bestMatch = issue;\n }\n }\n\n return {\n isDuplicate: true,\n existingIssue: bestMatch,\n similarity: bestSimilarity,\n };\n }\n\n /**\n * Merge task content into existing Linear issue\n */\n async mergeIntoExisting(\n existingIssue: LinearIssue,\n newTitle: string,\n newDescription?: string,\n additionalContext?: string\n ): Promise<LinearIssue> {\n try {\n // Build merged description\n let mergedDescription = existingIssue.description || '';\n \n if (newDescription && !mergedDescription.includes(newDescription)) {\n mergedDescription += `\\n\\n## Additional Context (${new Date().toISOString()})\\n`;\n mergedDescription += newDescription;\n }\n\n if (additionalContext) {\n mergedDescription += `\\n\\n---\\n${additionalContext}`;\n }\n\n // Update the existing issue\n const updateQuery = `\n mutation UpdateIssue($id: String!, $input: IssueUpdateInput!) {\n issueUpdate(id: $id, input: $input) {\n issue {\n id\n identifier\n title\n description\n updatedAt\n }\n }\n }\n `;\n\n const variables = {\n id: existingIssue.id,\n input: {\n description: mergedDescription,\n },\n };\n\n const response = await this.linearClient.graphql(updateQuery, variables);\n const updatedIssue = response.issueUpdate?.issue;\n\n if (updatedIssue) {\n logger.info(\n `Merged content into existing Linear issue ${existingIssue.identifier}: ${existingIssue.title}`\n );\n return updatedIssue;\n }\n\n return existingIssue;\n } catch (error) {\n logger.error('Failed to merge into existing Linear issue:', error as Error);\n return existingIssue;\n }\n }\n\n /**\n * Normalize title for comparison\n */\n private normalizeTitle(title: string): string {\n return title\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .replace(/[^\\w\\s-]/g, '') // Remove special characters except hyphens\n .replace(/^(sta|eng|bug|feat|task|tsk)[-\\s]\\d+[-\\s:]*/, '') // Remove issue prefixes\n .trim();\n }\n\n /**\n * Calculate similarity between two strings (Levenshtein distance based)\n */\n private calculateSimilarity(str1: string, str2: string): number {\n if (str1 === str2) return 1;\n if (str1.length === 0 || str2.length === 0) return 0;\n\n // Use Levenshtein distance for similarity calculation\n const distance = this.levenshteinDistance(str1, str2);\n const maxLength = Math.max(str1.length, str2.length);\n \n return 1 - (distance / maxLength);\n }\n\n /**\n * Calculate Levenshtein distance between two strings\n */\n private levenshteinDistance(str1: string, str2: string): number {\n const m = str1.length;\n const n = str2.length;\n const dp: number[][] = Array(m + 1)\n .fill(null)\n .map(() => Array(n + 1).fill(0));\n\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n if (str1[i - 1] === str2[j - 1]) {\n dp[i][j] = dp[i - 1][j - 1];\n } else {\n dp[i][j] = 1 + Math.min(\n dp[i - 1][j], // deletion\n dp[i][j - 1], // insertion\n dp[i - 1][j - 1] // substitution\n );\n }\n }\n }\n\n return dp[m][n];\n }\n\n /**\n * Check if cache is still valid\n */\n private isCacheValid(): boolean {\n return Date.now() - this.lastCacheRefresh < this.cacheExpiry;\n }\n\n /**\n * Clear the title cache\n */\n clearCache(): void {\n this.titleCache.clear();\n this.lastCacheRefresh = 0;\n }\n}\n"],
|
|
5
|
-
"mappings": "AAKA,SAAS,cAAc,eAAe,kBAAkB;AACxD,SAAS,YAAY;AACrB,SAAS,cAAc;AAOvB,SAAS,oBAAyD;AA4C3D,MAAM,iBAAiB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAqC,oBAAI,IAAI;AAAA,EAC7C;AAAA,EACA;AAAA,EAER,YACE,WACA,aACA,QACA,aACA;AACA,SAAK,YAAY;AACjB,SAAK,cAAc;AACnB,SAAK,SAAS;AACd,SAAK,cAAc,eAAe,QAAQ,IAAI;AAC9C,SAAK,eAAe;AAAA,MAClB,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAGA,UAAM,SAAS,QAAQ,IAAI,gBAAgB;AAE3C,QAAI,QAAQ;AAEV,WAAK,eAAe,IAAI,aAAa;AAAA,QACnC;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AAEL,YAAM,SAAS,KAAK,YAAY,WAAW;AAC3C,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,WAAK,eAAe,IAAI,aAAa;AAAA,QACnC,QAAQ,OAAO;AAAA,QACf,WAAW;AAAA,QACX,gBAAgB,YAAY;AAC1B,gBAAM,YAAY,MAAM,KAAK,YAAY,mBAAmB;AAC5D,iBAAO,UAAU;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,WAAsC;AACjD,SAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,UAAU;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAA4B;AAChC,QAAI,CAAC,KAAK,OAAO,SAAS;AACxB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,EAAE,UAAU,GAAG,YAAY,GAAG,SAAS,EAAE;AAAA,QACjD,WAAW,CAAC;AAAA,QACZ,QAAQ,CAAC,kBAAkB;AAAA,MAC7B;AAAA,IACF;AAEA,UAAM,SAAqB;AAAA,MACzB,SAAS;AAAA,MACT,QAAQ,EAAE,UAAU,GAAG,YAAY,GAAG,SAAS,EAAE;AAAA,MACjD,WAAW,CAAC;AAAA,MACZ,QAAQ,CAAC;AAAA,IACX;AAEA,QAAI;AAEF,YAAM,SAAS,QAAQ,IAAI,gBAAgB;AAC3C,UAAI,CAAC,QAAQ;AACX,cAAM,QAAQ,MAAM,KAAK,YAAY,cAAc;AACnD,aAAK,eAAe,IAAI,aAAa;AAAA,UACnC,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,gBAAgB,YAAY;AAC1B,kBAAM,YAAY,MAAM,KAAK,YAAY,mBAAmB;AAC5D,mBAAO,UAAU;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,MACH;AAGA,UAAI,CAAC,KAAK,OAAO,eAAe;AAC9B,cAAM,OAAO,MAAM,KAAK,aAAa,QAAQ;AAC7C,aAAK,OAAO,gBAAgB,KAAK;AACjC,eAAO,KAAK,sBAAsB,KAAK,IAAI,KAAK,KAAK,GAAG,GAAG;AAAA,MAC7D;AAGA,UACE,KAAK,OAAO,cAAc,mBAC1B,KAAK,OAAO,cAAc,aAC1B;AACA,cAAM,iBAAiB,MAAM,KAAK,aAAa;AAC/C,eAAO,OAAO,WAAW,eAAe;AACxC,eAAO,OAAO,WAAW,eAAe;AACxC,eAAO,OAAO,KAAK,GAAG,eAAe,MAAM;AAAA,MAC7C;AAEA,UACE,KAAK,OAAO,cAAc,mBAC1B,KAAK,OAAO,cAAc,eAC1B;AACA,cAAM,mBAAmB,MAAM,KAAK,eAAe;AACnD,eAAO,OAAO,aAAa,iBAAiB;AAC5C,eAAO,OAAO,WAAW,iBAAiB;AAC1C,eAAO,UAAU,KAAK,GAAG,iBAAiB,SAAS;AACnD,eAAO,OAAO,KAAK,GAAG,iBAAiB,MAAM;AAAA,MAC/C;AAEA,WAAK,aAAa;AAAA,IACpB,SAAS,OAAgB;AACvB,aAAO,UAAU;AACjB,aAAO,OAAO,KAAK,gBAAgB,OAAO,KAAK,CAAC,EAAE;AAClD,aAAO,MAAM,uBAAuB,KAAc;AAAA,IACpD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,MAAM,IAA2B;AAC7C,WAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAIX;AACD,UAAM,SAAS,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC,EAAc;AAChE,UAAM,eAAe,KAAK,OAAO,gBAAgB;AACjD,UAAM,iBAAiB,KAAK,OAAO,kBAAkB;AAGrD,UAAM,oBAAoB,IAAI,wBAAwB,KAAK,YAAY;AAGvE,UAAM,gBAAgB,KAAK,iBAAiB;AAG5C,UAAM,cAAc,cAAc,MAAM,GAAG,YAAY;AAEvD,QAAI,cAAc,SAAS,cAAc;AACvC,aAAO;AAAA,QACL,WAAW,YAAY,MAAM,OAAO,cAAc,MAAM;AAAA,MAC1D;AAAA,IACF;AAEA,eAAW,QAAQ,aAAa;AAC9B,UAAI;AAEF,cAAM,iBAAiB,MAAM,kBAAkB;AAAA,UAC7C,KAAK;AAAA,UACL,KAAK,OAAO;AAAA,QACd;AAEA,YAAI;AAEJ,YAAI,eAAe,eAAe,eAAe,eAAe;AAE9D,iBAAO;AAAA,YACL,oCAAoC,KAAK,KAAK,MAAM,eAAe,cAAc,UAAU,KAAK,KAAK,OAAO,eAAe,cAAc,KAAK,GAAG,CAAC;AAAA,UACpJ;AAGA,wBAAc,MAAM,kBAAkB;AAAA,YACpC,eAAe;AAAA,YACf,KAAK;AAAA,YACL,KAAK,2BAA2B,IAAI;AAAA,YACpC,wBAAwB,KAAK,EAAE;AAAA,SAAY,KAAK,QAAQ;AAAA,UAC1D;AAAA,QACF,OAAO;AAEL,wBAAc,MAAM,KAAK,0BAA0B,IAAI;AAAA,QACzD;AAGA,cAAM,UAAuB;AAAA,UAC3B,eAAe,KAAK;AAAA,UACpB,UAAU,YAAY;AAAA,UACtB,kBAAkB,YAAY;AAAA,UAC9B,mBAAmB,KAAK,IAAI;AAAA,UAC5B,kBAAkB,YAAY;AAAA,UAC9B,uBAAuB,KAAK,YAAY;AAAA,QAC1C;AAEA,aAAK,SAAS,IAAI,KAAK,IAAI,OAAO;AAGlC,aAAK,wBAAwB,KAAK,IAAI,WAAW;AAEjD,eAAO;AACP,eAAO;AAAA,UACL,0BAA0B,KAAK,KAAK,WAAM,YAAY,UAAU;AAAA,QAClE;AAGA,cAAM,KAAK,MAAM,cAAc;AAAA,MACjC,SAAS,OAAgB;AACvB,cAAM,WAAW,OAAO,KAAK;AAE7B,YACE,SAAS,SAAS,YAAY,KAC9B,SAAS,SAAS,aAAa,GAC/B;AACA,iBAAO,KAAK,qCAAqC;AACjD,iBAAO,OAAO,KAAK,kCAAkC;AACrD;AAAA,QACF;AACA,eAAO,OAAO,KAAK,uBAAuB,KAAK,EAAE,KAAK,QAAQ,EAAE;AAChE,eAAO;AAAA,UACL,uBAAuB,KAAK,EAAE;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,gBAAgB,KAAK,iBAAiB;AAE5C,eAAW,QAAQ,eAAe;AAChC,UAAI;AACF,cAAM,UAAU,KAAK,SAAS,IAAI,KAAK,EAAE;AACzC,YAAI,CAAC,QAAS;AAEd,cAAM,KAAK,0BAA0B,MAAM,OAAO;AAElD,gBAAQ,oBAAoB,KAAK,IAAI;AACrC,gBAAQ,wBAAwB,KAAK,YAAY;AAEjD,eAAO;AACP,eAAO,KAAK,yBAAyB,QAAQ,gBAAgB,EAAE;AAAA,MACjE,SAAS,OAAgB;AACvB,eAAO,OAAO;AAAA,UACZ,0CAA0C,KAAK,EAAE,KAAK,OAAO,KAAK,CAAC;AAAA,QACrE;AACA,eAAO;AAAA,UACL,0CAA0C,KAAK,EAAE;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAKX;AACD,UAAM,SAAS;AAAA,MACb,SAAS;AAAA,MACT,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,MAKZ,QAAQ,CAAC;AAAA,IACX;AAGA,UAAM,eAAe,MAAM,KAAK,iBAAiB;AACjD,WAAO,UAAU,aAAa;AAC9B,WAAO,OAAO,KAAK,GAAG,aAAa,MAAM;AAGzC,eAAW,CAAC,QAAQ,OAAO,KAAK,KAAK,UAAU;AAC7C,UAAI;AACF,cAAM,cAAc,MAAM,KAAK,aAAa,SAAS,QAAQ,QAAQ;AAErE,YAAI,CAAC,aAAa;AAChB,iBAAO,OAAO,KAAK,gBAAgB,QAAQ,QAAQ,YAAY;AAC/D;AAAA,QACF;AAGA,cAAM,mBAAmB,IAAI,KAAK,YAAY,SAAS,EAAE,QAAQ;AACjE,YAAI,oBAAoB,QAAQ,mBAAmB;AACjD;AAAA,QACF;AAGA,cAAM,OAAO,KAAK,UAAU,QAAQ,MAAM;AAC1C,YAAI,CAAC,MAAM;AACT,iBAAO,OAAO,KAAK,oBAAoB,MAAM,YAAY;AACzD;AAAA,QACF;AAEA,cAAM,wBAAwB,KAAK,YAAY;AAE/C,YACE,wBAAwB,QAAQ,qBAChC,mBAAmB,QAAQ,mBAC3B;AAEA,iBAAO,UAAU,KAAK;AAAA,YACpB;AAAA,YACA,UAAU,QAAQ;AAAA,YAClB,QAAQ;AAAA,UACV,CAAC;AAED,cAAI,KAAK,OAAO,uBAAuB,UAAU;AAC/C;AAAA,UACF;AAAA,QACF;AAGA,cAAM,yBAAyB,KAAK;AAAA,UAClC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,YAAI,wBAAwB;AAC1B,eAAK,0BAA0B,MAAM,WAAW;AAEhD,kBAAQ,oBAAoB,KAAK,IAAI;AACrC,kBAAQ,mBAAmB,YAAY;AAEvC,iBAAO;AACP,iBAAO,KAAK,yCAAyC,KAAK,KAAK,EAAE;AAAA,QACnE;AAAA,MACF,SAAS,OAAgB;AACvB,eAAO,OAAO;AAAA,UACZ,uCAAuC,MAAM,KAAK,OAAO,KAAK,CAAC;AAAA,QACjE;AACA,eAAO;AAAA,UACL,uCAAuC,MAAM;AAAA,UAC7C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,0BACZ,MACsB;AACtB,UAAM,QAAgC;AAAA,MACpC,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK,2BAA2B,IAAI;AAAA,MACjD,QAAQ,KAAK,OAAO;AAAA,MACpB,UAAU,KAAK,oBAAoB,KAAK,QAAQ;AAAA,MAChD,UAAU,KAAK,mBACX,KAAK,KAAK,KAAK,mBAAmB,EAAE,IACpC;AAAA;AAAA,MACJ,UAAU,KAAK,gBAAgB,KAAK,IAAI;AAAA,IAC1C;AAEA,WAAO,MAAM,KAAK,aAAa,YAAY,KAAK;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,0BACZ,MACA,SACe;AACf,UAAM,UAAkE;AAAA,MACtE,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK,2BAA2B,IAAI;AAAA,MACjD,UAAU,KAAK,oBAAoB,KAAK,QAAQ;AAAA,MAChD,UAAU,KAAK,mBACX,KAAK,KAAK,KAAK,mBAAmB,EAAE,IACpC;AAAA,MACJ,SAAS,MAAM,KAAK,uBAAuB,KAAK,MAAM;AAAA,IACxD;AAEA,UAAM,KAAK,aAAa,YAAY,QAAQ,UAAU,OAAO;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKQ,0BACN,MACA,aACM;AAEN,UAAM,YAAY,KAAK,uBAAuB,YAAY,MAAM,IAAI;AAEpE,QAAI,cAAc,KAAK,QAAQ;AAC7B,WAAK,UAAU;AAAA,QACb,KAAK;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EAIF;AAAA;AAAA;AAAA;AAAA,EAKQ,uBACN,MACA,aACA,SACA,uBACA,kBACS;AACT,YAAQ,KAAK,OAAO,oBAAoB;AAAA,MACtC,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO,mBAAmB;AAAA,MAC5B,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAkC;AACxC,UAAM,cAAc,KAAK,UAAU,eAAe;AAClD,WAAO,YAAY;AAAA,MACjB,CAAC,SAAS,CAAC,KAAK,SAAS,IAAI,KAAK,EAAE,KAAK,CAAC,KAAK,eAAe;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAkC;AACxC,UAAM,QAAuB,CAAC;AAE9B,eAAW,CAAC,QAAQ,OAAO,KAAK,KAAK,UAAU;AAC7C,YAAM,OAAO,KAAK,UAAU,QAAQ,MAAM;AAC1C,UAAI,QAAQ,KAAK,YAAY,MAAO,QAAQ,mBAAmB;AAC7D,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,wBACN,QACA,aACM;AACN,UAAM,OAAO,KAAK,UAAU,QAAQ,MAAM;AAC1C,QAAI,CAAC,KAAM;AAIX,WAAO,KAAK,QAAQ,MAAM,qBAAqB,YAAY,UAAU,EAAE;AAAA,EACzE;AAAA;AAAA,EAIQ,2BAA2B,MAA2B;AAC5D,QAAI,cAAc,KAAK,eAAe;AAEtC,mBAAe;AAAA;AAAA;AAAA;AAAA;AACf,mBAAe,cAAc,KAAK,EAAE;AAAA;AACpC,mBAAe,YAAY,KAAK,QAAQ;AAAA;AACxC,mBAAe,cAAc,IAAI,KAAK,KAAK,aAAa,GAAI,EAAE,YAAY,CAAC;AAAA;AAE3E,QAAI,KAAK,KAAK,SAAS,GAAG;AACxB,qBAAe,WAAW,KAAK,KAAK,KAAK,IAAI,CAAC;AAAA;AAAA,IAChD;AAEA,QAAI,KAAK,WAAW,SAAS,GAAG;AAC9B,qBAAe,mBAAmB,KAAK,WAAW,KAAK,IAAI,CAAC;AAAA;AAAA,IAC9D;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,UAAgC;AAC1D,UAAM,MAAoC;AAAA,MACxC,KAAK;AAAA;AAAA,MACL,QAAQ;AAAA;AAAA,MACR,MAAM;AAAA;AAAA,MACN,QAAQ;AAAA;AAAA,IACV;AACA,WAAO,IAAI,QAAQ,KAAK;AAAA,EAC1B;AAAA,EAEQ,gBAAgB,OAAuC;AAG7D,WAAO;AAAA,EACT;AAAA,EAEQ,uBAAuB,iBAAqC;AAClE,YAAQ,iBAAiB;AAAA,MACvB,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,MAAc,uBACZ,QAC6B;AAE7B,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,aAAa,QAAQ;AAC7C,YAAM,SAAS,MAAM,KAAK,aAAa,kBAAkB,KAAK,EAAE;AAGhE,YAAM,kBAAkB,KAAK,6BAA6B,MAAM;AAGhE,YAAM,gBAAgB,OAAO;AAAA,QAC3B,CAAC,UAAU,MAAM,SAAS;AAAA,MAC5B;AACA,aAAO,eAAe;AAAA,IACxB,SAAS,OAAgB;AACvB,aAAO;AAAA,QACL;AAAA,QACA,iBAAiB,QAAQ,EAAE,MAAM,IAAI;AAAA,MACvC;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,6BAA6B,QAA4B;AAC/D,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA;AAAA,EAIQ,eAAqB;AAC3B,SAAK,SAAS,MAAM;AAEpB,QAAI,WAAW,KAAK,YAAY,GAAG;AACjC,UAAI;AACF,cAAM,OAAO,aAAa,KAAK,cAAc,MAAM;AACnD,cAAM,gBAA+B,KAAK,MAAM,IAAI;AACpD,mBAAW,WAAW,eAAe;AACnC,eAAK,SAAS,IAAI,QAAQ,eAAe,OAAO;AAAA,QAClD;AACA,eAAO,KAAK,UAAU,KAAK,SAAS,IAAI,0BAA0B;AAAA,MACpE,SAAS,OAAgB;AACvB,eAAO,KAAK,yCAAyC;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAqB;AAC3B,QAAI;AACF,YAAM,gBAAgB,MAAM,KAAK,KAAK,SAAS,OAAO,CAAC;AACvD,oBAAc,KAAK,cAAc,KAAK,UAAU,eAAe,MAAM,CAAC,CAAC;AACvE,aAAO,KAAK,SAAS,KAAK,SAAS,IAAI,wBAAwB;AAAA,IACjE,SAAS,OAAgB;AACvB,aAAO,MAAM,4BAA4B,KAAc;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAIH;AACD,UAAM,SAAS,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC,EAAc;AAEjE,QAAI;AAEF,UAAI,CAAC,KAAK,OAAO,eAAe;AAC9B,cAAM,OAAO,MAAM,KAAK,aAAa,QAAQ;AAC7C,aAAK,OAAO,gBAAgB,KAAK;AACjC,eAAO,KAAK,sBAAsB,KAAK,IAAI,KAAK,KAAK,GAAG,GAAG;AAAA,MAC7D;AAGA,YAAM,SAAS,MAAM,KAAK,aAAa,UAAU;AAAA,QAC/C,QAAQ,KAAK,OAAO;AAAA,QACpB,OAAO;AAAA,MACT,CAAC;AAED,aAAO,KAAK,SAAS,OAAO,MAAM,mBAAmB;AAGrD,YAAM,mBAAmB,oBAAI,IAAoB;AACjD,iBAAW,CAAC,QAAQ,OAAO,KAAK,KAAK,UAAU;AAC7C,yBAAiB,IAAI,QAAQ,UAAU,MAAM;AAAA,MAC/C;AAEA,iBAAW,SAAS,QAAQ;AAC1B,YAAI;AAEF,cAAI,iBAAiB,IAAI,MAAM,EAAE,GAAG;AAClC,mBAAO;AACP;AAAA,UACF;AAGA,gBAAM,SAAS,MAAM,KAAK,0BAA0B,KAAK;AAEzD,cAAI,QAAQ;AAEV,kBAAM,UAAuB;AAAA,cAC3B,eAAe;AAAA,cACf,UAAU,MAAM;AAAA,cAChB,kBAAkB,MAAM;AAAA,cACxB,mBAAmB,KAAK,IAAI;AAAA,cAC5B,kBAAkB,MAAM;AAAA,cACxB,uBAAuB,KAAK,IAAI;AAAA,YAClC;AACA,iBAAK,SAAS,IAAI,QAAQ,OAAO;AACjC,mBAAO;AACP,mBAAO,KAAK,YAAY,MAAM,UAAU,KAAK,MAAM,KAAK,EAAE;AAAA,UAC5D;AAAA,QACF,SAAS,OAAgB;AACvB,iBAAO,OAAO;AAAA,YACZ,oBAAoB,MAAM,UAAU,KAAK,OAAO,KAAK,CAAC;AAAA,UACxD;AACA,iBAAO,MAAM,oBAAoB,MAAM,UAAU,KAAK,KAAc;AAAA,QACtE;AAAA,MACF;AAEA,WAAK,aAAa;AAAA,IACpB,SAAS,OAAgB;AACvB,aAAO,OAAO,KAAK,kBAAkB,OAAO,KAAK,CAAC,EAAE;AACpD,aAAO,MAAM,yBAAyB,KAAc;AAAA,IACtD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,0BACZ,OACwB;AACxB,QAAI;AACF,YAAM,WAAW,KAAK,yBAAyB,MAAM,QAAQ;AAG7D,UAAI,cAAc,MAAM,eAAe;AACvC,qBAAe;AAAA;AAAA;AAAA,cAAwB,MAAM,UAAU,MAAM,MAAM,GAAG;AAGtE,YAAM,SAAS,MAAM,QAAQ,MAAM,MAAM,IACrC,MAAM,SACL,MAAM,QACH,SAAS,CAAC;AAClB,YAAM,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI;AACrC,UAAI,KAAK,WAAW,EAAG,MAAK,KAAK,QAAQ;AAGzC,YAAM,SAAS,KAAK,UAAU,WAAW;AAAA,QACvC,OAAO,IAAI,MAAM,UAAU,KAAK,MAAM,KAAK;AAAA,QAC3C;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,iBAAiB,MAAM,WAAW,MAAM,WAAW,KAAK;AAAA,MAC1D,CAAC;AAGD,YAAM,SAAS,KAAK,uBAAuB,MAAM,MAAM,IAAI;AAC3D,UAAI,WAAW,WAAW;AACxB,aAAK,UAAU;AAAA,UACb;AAAA,UACA;AAAA,UACA,2BAA2B,MAAM;AAAA,QACnC;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAgB;AACvB,aAAO;AAAA,QACL,2CAA2C,MAAM,UAAU,KAAK,OAAO,KAAK,CAAC;AAAA,MAC/E;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAyB,UAAgC;AAC/D,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AACF;AAKO,MAAM,sBAAkC;AAAA,EAC7C,SAAS;AAAA,EACT,WAAW;AAAA,EACX,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,cAAc;AAAA;AAAA,EACd,cAAc;AAAA;AAAA,EACd,gBAAgB;AAAA;AAClB;AAWO,MAAM,wBAAwB;AAAA,EAC3B;AAAA,EACA,aAAyC,oBAAI,IAAI;AAAA,EACjD,cAAsB,IAAI,KAAK;AAAA;AAAA,EAC/B,mBAA2B;AAAA,EAEnC,YAAY,cAA4B;AACtC,SAAK,eAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,OAAe,QAAyC;AAC1E,UAAM,kBAAkB,KAAK,eAAe,KAAK;AAGjD,QAAI,KAAK,aAAa,GAAG;AACvB,YAAM,SAAS,KAAK,WAAW,IAAI,eAAe;AAClD,UAAI,OAAQ,QAAO;AAAA,IACrB;AAEA,QAAI;AAEF,YAAM,YAAY,MAAM,KAAK,aAAa,UAAU;AAAA,QAClD;AAAA,QACA,OAAO;AAAA;AAAA,MACT,CAAC;AAGD,YAAM,iBAAiB,UAAU,OAAO,WAAS;AAC/C,cAAM,kBAAkB,KAAK,eAAe,MAAM,KAAK;AAGvD,YAAI,oBAAoB,gBAAiB,QAAO;AAGhD,cAAM,aAAa,KAAK,oBAAoB,iBAAiB,eAAe;AAC5E,eAAO,aAAa;AAAA,MACtB,CAAC;AAGD,WAAK,WAAW,IAAI,iBAAiB,cAAc;AACnD,WAAK,mBAAmB,KAAK,IAAI;AAEjC,aAAO;AAAA,IACT,SAAS,OAAO;AACd,aAAO,MAAM,4CAA4C,KAAc;AACvE,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBACJ,OACA,QAC+B;AAC/B,UAAM,iBAAiB,MAAM,KAAK,cAAc,OAAO,MAAM;AAE7D,QAAI,eAAe,WAAW,GAAG;AAC/B,aAAO,EAAE,aAAa,MAAM;AAAA,IAC9B;AAGA,QAAI;AACJ,QAAI,iBAAiB;AAErB,eAAW,SAAS,gBAAgB;AAClC,YAAM,aAAa,KAAK;AAAA,QACtB,KAAK,eAAe,KAAK;AAAA,QACzB,KAAK,eAAe,MAAM,KAAK;AAAA,MACjC;AAEA,UAAI,aAAa,gBAAgB;AAC/B,yBAAiB;AACjB,oBAAY;AAAA,MACd;AAAA,IACF;AAEA,WAAO;AAAA,MACL,aAAa;AAAA,MACb,eAAe;AAAA,MACf,YAAY;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBACJ,eACA,UACA,gBACA,mBACsB;AACtB,QAAI;AAEF,UAAI,oBAAoB,cAAc,eAAe;AAErD,UAAI,kBAAkB,CAAC,kBAAkB,SAAS,cAAc,GAAG;AACjE,6BAAqB;AAAA;AAAA,0BAA8B,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAC3E,6BAAqB;AAAA,MACvB;AAEA,UAAI,mBAAmB;AACrB,6BAAqB;AAAA;AAAA;AAAA,EAAY,iBAAiB;AAAA,MACpD;AAGA,YAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcpB,YAAM,YAAY;AAAA,QAChB,IAAI,cAAc;AAAA,QAClB,OAAO;AAAA,UACL,aAAa;AAAA,QACf;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,KAAK,aAAa,QAAQ,aAAa,SAAS;AACvE,YAAM,eAAe,SAAS,aAAa;AAE3C,UAAI,cAAc;AAChB,eAAO;AAAA,UACL,6CAA6C,cAAc,UAAU,KAAK,cAAc,KAAK;AAAA,QAC/F;AACA,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,aAAO,MAAM,+CAA+C,KAAc;AAC1E,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,OAAuB;AAC5C,WAAO,MACJ,YAAY,EACZ,KAAK,EACL,QAAQ,QAAQ,GAAG,EACnB,QAAQ,aAAa,EAAE,EACvB,QAAQ,+CAA+C,EAAE,EACzD,KAAK;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,MAAc,MAAsB;AAC9D,QAAI,SAAS,KAAM,QAAO;AAC1B,QAAI,KAAK,WAAW,KAAK,KAAK,WAAW,EAAG,QAAO;AAGnD,UAAM,WAAW,KAAK,oBAAoB,MAAM,IAAI;AACpD,UAAM,YAAY,KAAK,IAAI,KAAK,QAAQ,KAAK,MAAM;AAEnD,WAAO,IAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,MAAc,MAAsB;AAC9D,UAAM,IAAI,KAAK;AACf,UAAM,IAAI,KAAK;AACf,UAAM,KAAiB,MAAM,IAAI,CAAC,EAC/B,KAAK,IAAI,EACT,IAAI,MAAM,MAAM,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AAEjC,aAAS,IAAI,GAAG,KAAK,GAAG,IAAK,IAAG,CAAC,EAAE,CAAC,IAAI;AACxC,aAAS,IAAI,GAAG,KAAK,GAAG,IAAK,IAAG,CAAC,EAAE,CAAC,IAAI;AAExC,aAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,eAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,YAAI,KAAK,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,GAAG;AAC/B,aAAG,CAAC,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,QAC5B,OAAO;AACL,aAAG,CAAC,EAAE,CAAC,IAAI,IAAI,KAAK;AAAA,YAClB,GAAG,IAAI,CAAC,EAAE,CAAC;AAAA;AAAA,YACX,GAAG,CAAC,EAAE,IAAI,CAAC;AAAA;AAAA,YACX,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,GAAG,CAAC,EAAE,CAAC;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAwB;AAC9B,WAAO,KAAK,IAAI,IAAI,KAAK,mBAAmB,KAAK;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,SAAK,WAAW,MAAM;AACtB,SAAK,mBAAmB;AAAA,EAC1B;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 { LinearClient } from "./client.js";
|
|
2
6
|
import { LinearDuplicateDetector } from "./sync.js";
|
|
3
7
|
import { logger } from "../../core/monitoring/logger.js";
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/integrations/linear/unified-sync.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * Unified Linear Sync System\n * Consolidates all sync functionality with duplicate detection,\n * bidirectional sync, and task planning integration\n */\n\nimport { LinearClient, LinearIssue, LinearCreateIssueInput } from './client.js';\nimport { LinearDuplicateDetector, DuplicateCheckResult } from './sync.js';\nimport { LinearTaskManager } from '../../features/tasks/linear-task-manager.js';\nimport { LinearAuthManager } from './auth.js';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { Task, TaskStatus, TaskPriority } from '../../types/task.js';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { EventEmitter } from 'events';\n\n// Unified sync configuration\nexport interface UnifiedSyncConfig {\n // Core settings\n enabled: boolean;\n direction: 'bidirectional' | 'to_linear' | 'from_linear';\n defaultTeamId?: string;\n \n // Duplicate detection\n duplicateDetection: boolean;\n duplicateSimilarityThreshold: number; // 0-1, default 0.85\n mergeStrategy: 'merge_content' | 'skip' | 'create_anyway';\n \n // Conflict resolution\n conflictResolution: 'newest_wins' | 'linear_wins' | 'local_wins' | 'manual';\n \n // Task planning\n taskPlanningEnabled: boolean;\n taskPlanFile?: string; // Default: .stackmemory/task-plan.md\n autoCreateTaskPlan: boolean;\n \n // Performance\n maxBatchSize: number;\n rateLimitDelay: number; // ms between requests\n maxRetries: number;\n \n // Auto-sync\n autoSync: boolean;\n autoSyncInterval?: number; // minutes\n quietHours?: {\n start: number; // hour 0-23\n end: number;\n };\n}\n\nexport const DEFAULT_UNIFIED_CONFIG: UnifiedSyncConfig = {\n enabled: true,\n direction: 'bidirectional',\n duplicateDetection: true,\n duplicateSimilarityThreshold: 0.85,\n mergeStrategy: 'merge_content',\n conflictResolution: 'newest_wins',\n taskPlanningEnabled: true,\n taskPlanFile: '.stackmemory/task-plan.md',\n autoCreateTaskPlan: true,\n maxBatchSize: 50,\n rateLimitDelay: 100,\n maxRetries: 3,\n autoSync: false,\n autoSyncInterval: 15,\n};\n\n// Sync statistics\nexport interface SyncStats {\n toLinear: {\n created: number;\n updated: number;\n skipped: number;\n duplicatesMerged: number;\n };\n fromLinear: {\n created: number;\n updated: number;\n skipped: number;\n };\n conflicts: Array<{\n taskId: string;\n reason: string;\n resolution: string;\n }>;\n errors: string[];\n duration: number;\n timestamp: number;\n}\n\n// Task planning integration\ninterface TaskPlan {\n version: string;\n lastUpdated: Date;\n phases: Array<{\n name: string;\n description: string;\n tasks: Array<{\n id: string;\n title: string;\n priority: TaskPriority;\n status: TaskStatus;\n linearId?: string;\n dependencies?: string[];\n }>;\n }>;\n}\n\nexport class UnifiedLinearSync extends EventEmitter {\n private config: UnifiedSyncConfig;\n private linearClient: LinearClient;\n private taskStore: LinearTaskManager;\n private authManager: LinearAuthManager;\n private duplicateDetector: LinearDuplicateDetector;\n private projectRoot: string;\n private mappings: Map<string, string> = new Map(); // task.id -> linear.id\n private lastSyncStats?: SyncStats;\n private syncInProgress = false;\n\n constructor(\n taskStore: LinearTaskManager,\n authManager: LinearAuthManager,\n projectRoot: string,\n config?: Partial<UnifiedSyncConfig>\n ) {\n super();\n this.taskStore = taskStore;\n this.authManager = authManager;\n this.projectRoot = projectRoot;\n this.config = { ...DEFAULT_UNIFIED_CONFIG, ...config };\n \n // Initialize Linear client - will be set up in initialize()\n this.linearClient = null as any;\n this.duplicateDetector = null as any;\n \n // Load existing mappings\n this.loadMappings();\n }\n\n /**\n * Initialize the sync system\n */\n async initialize(): Promise<void> {\n try {\n // Get Linear authentication\n const token = await this.authManager.getValidToken();\n if (!token) {\n throw new Error('Linear authentication required. Run \"stackmemory linear auth\" first.');\n }\n\n // Initialize Linear client with proper auth\n const isOAuth = this.authManager.isOAuth();\n this.linearClient = new LinearClient({\n apiKey: token,\n useBearer: isOAuth,\n teamId: this.config.defaultTeamId,\n onUnauthorized: isOAuth\n ? async () => {\n const refreshed = await this.authManager.refreshAccessToken();\n return refreshed.accessToken;\n }\n : undefined,\n });\n\n // Initialize duplicate detector\n if (this.config.duplicateDetection) {\n this.duplicateDetector = new LinearDuplicateDetector(this.linearClient);\n }\n\n // Initialize task planning if enabled\n if (this.config.taskPlanningEnabled) {\n await this.initializeTaskPlanning();\n }\n\n logger.info('Unified Linear sync initialized', {\n direction: this.config.direction,\n duplicateDetection: this.config.duplicateDetection,\n taskPlanning: this.config.taskPlanningEnabled,\n });\n } catch (error: unknown) {\n logger.error('Failed to initialize Linear sync:', error as Error);\n throw error;\n }\n }\n\n /**\n * Main sync method - orchestrates bidirectional sync\n */\n async sync(): Promise<SyncStats> {\n if (this.syncInProgress) {\n throw new Error('Sync already in progress');\n }\n\n this.syncInProgress = true;\n const startTime = Date.now();\n \n const stats: SyncStats = {\n toLinear: { created: 0, updated: 0, skipped: 0, duplicatesMerged: 0 },\n fromLinear: { created: 0, updated: 0, skipped: 0 },\n conflicts: [],\n errors: [],\n duration: 0,\n timestamp: Date.now(),\n };\n\n try {\n this.emit('sync:started', { config: this.config });\n\n // Determine sync direction and execute\n switch (this.config.direction) {\n case 'bidirectional':\n await this.syncFromLinear(stats);\n await this.syncToLinear(stats);\n break;\n case 'from_linear':\n await this.syncFromLinear(stats);\n break;\n case 'to_linear':\n await this.syncToLinear(stats);\n break;\n }\n\n // Update task plan if enabled\n if (this.config.taskPlanningEnabled) {\n await this.updateTaskPlan(stats);\n }\n\n // Save mappings\n this.saveMappings();\n\n stats.duration = Date.now() - startTime;\n this.lastSyncStats = stats;\n\n this.emit('sync:completed', { stats });\n logger.info('Unified sync completed', {\n duration: `${stats.duration}ms`,\n toLinear: stats.toLinear,\n fromLinear: stats.fromLinear,\n conflicts: stats.conflicts.length,\n });\n\n return stats;\n } catch (error: unknown) {\n stats.errors.push((error as Error).message);\n stats.duration = Date.now() - startTime;\n \n this.emit('sync:failed', { stats, error });\n logger.error('Unified sync failed:', error as Error);\n \n throw error;\n } finally {\n this.syncInProgress = false;\n }\n }\n\n /**\n * Sync from Linear to local tasks\n */\n private async syncFromLinear(stats: SyncStats): Promise<void> {\n try {\n logger.debug('Syncing from Linear...');\n\n // Get team ID\n const teamId = this.config.defaultTeamId || (await this.getDefaultTeamId());\n \n // Fetch Linear issues\n const issues = await this.linearClient.getIssues({\n teamId,\n limit: this.config.maxBatchSize,\n });\n\n for (const issue of issues) {\n try {\n await this.delay(this.config.rateLimitDelay);\n \n // Check if we have this issue mapped\n const localTaskId = this.findLocalTaskByLinearId(issue.id);\n \n if (localTaskId) {\n // Update existing task\n const localTask = await this.taskStore.getTask(localTaskId);\n if (localTask && this.hasChanges(localTask, issue)) {\n await this.updateLocalTask(localTask, issue);\n stats.fromLinear.updated++;\n } else {\n stats.fromLinear.skipped++;\n }\n } else {\n // Create new local task\n await this.createLocalTask(issue);\n stats.fromLinear.created++;\n }\n } catch (error: unknown) {\n stats.errors.push(`Failed to sync issue ${issue.identifier}: ${(error as Error).message}`);\n }\n }\n } catch (error: unknown) {\n logger.error('Failed to sync from Linear:', error as Error);\n throw error;\n }\n }\n\n /**\n * Sync local tasks to Linear\n */\n private async syncToLinear(stats: SyncStats): Promise<void> {\n try {\n logger.debug('Syncing to Linear...');\n\n // Get all local tasks\n const tasks = await this.taskStore.getAllTasks();\n const teamId = this.config.defaultTeamId || (await this.getDefaultTeamId());\n\n for (const task of tasks) {\n try {\n await this.delay(this.config.rateLimitDelay);\n \n // Skip if already mapped to Linear\n const linearId = this.mappings.get(task.id);\n \n if (linearId) {\n // Update existing Linear issue\n const linearIssue = await this.linearClient.getIssue(linearId);\n if (linearIssue && this.taskNeedsUpdate(task, linearIssue)) {\n await this.updateLinearIssue(linearIssue, task);\n stats.toLinear.updated++;\n } else {\n stats.toLinear.skipped++;\n }\n } else {\n // Check for duplicates before creating\n if (this.config.duplicateDetection) {\n const duplicateCheck = await this.duplicateDetector.checkForDuplicate(\n task.title,\n teamId\n );\n \n if (duplicateCheck.isDuplicate && duplicateCheck.existingIssue) {\n if (this.config.mergeStrategy === 'merge_content') {\n // Merge into existing\n await this.mergeTaskIntoLinear(task, duplicateCheck.existingIssue);\n this.mappings.set(task.id, duplicateCheck.existingIssue.id);\n stats.toLinear.duplicatesMerged++;\n } else if (this.config.mergeStrategy === 'skip') {\n stats.toLinear.skipped++;\n continue;\n }\n } else {\n // Create new Linear issue\n await this.createLinearIssue(task, teamId);\n stats.toLinear.created++;\n }\n } else {\n // Create without duplicate check\n await this.createLinearIssue(task, teamId);\n stats.toLinear.created++;\n }\n }\n } catch (error: unknown) {\n stats.errors.push(`Failed to sync task ${task.id}: ${(error as Error).message}`);\n }\n }\n } catch (error: unknown) {\n logger.error('Failed to sync to Linear:', error as Error);\n throw error;\n }\n }\n\n /**\n * Initialize task planning system\n */\n private async initializeTaskPlanning(): Promise<void> {\n const planFile = join(this.projectRoot, this.config.taskPlanFile!);\n const planDir = dirname(planFile);\n\n // Ensure directory exists\n if (!existsSync(planDir)) {\n mkdirSync(planDir, { recursive: true });\n }\n\n // Create default task plan if it doesn't exist\n if (!existsSync(planFile) && this.config.autoCreateTaskPlan) {\n const defaultPlan: TaskPlan = {\n version: '1.0.0',\n lastUpdated: new Date(),\n phases: [\n {\n name: 'Backlog',\n description: 'Tasks to be prioritized',\n tasks: [],\n },\n {\n name: 'Current Sprint',\n description: 'Active work items',\n tasks: [],\n },\n {\n name: 'Completed',\n description: 'Finished tasks',\n tasks: [],\n },\n ],\n };\n\n this.saveTaskPlan(defaultPlan);\n logger.info('Created default task plan', { path: planFile });\n }\n }\n\n /**\n * Update task plan with sync results\n */\n private async updateTaskPlan(stats: SyncStats): Promise<void> {\n if (!this.config.taskPlanningEnabled) return;\n\n try {\n const plan = this.loadTaskPlan();\n const tasks = await this.taskStore.getAllTasks();\n\n // Reorganize tasks by status\n plan.phases = [\n {\n name: 'Backlog',\n description: 'Tasks to be prioritized',\n tasks: tasks\n .filter((t) => t.status === 'todo')\n .map((t) => ({\n id: t.id,\n title: t.title,\n priority: t.priority || 'medium',\n status: t.status,\n linearId: this.mappings.get(t.id),\n })),\n },\n {\n name: 'In Progress',\n description: 'Active work items',\n tasks: tasks\n .filter((t) => t.status === 'in_progress')\n .map((t) => ({\n id: t.id,\n title: t.title,\n priority: t.priority || 'medium',\n status: t.status,\n linearId: this.mappings.get(t.id),\n })),\n },\n {\n name: 'Completed',\n description: 'Finished tasks',\n tasks: tasks\n .filter((t) => t.status === 'done')\n .slice(-20) // Keep last 20 completed\n .map((t) => ({\n id: t.id,\n title: t.title,\n priority: t.priority || 'medium',\n status: t.status,\n linearId: this.mappings.get(t.id),\n })),\n },\n ];\n\n plan.lastUpdated = new Date();\n this.saveTaskPlan(plan);\n\n // Also generate markdown report\n this.generateTaskReport(plan, stats);\n } catch (error: unknown) {\n logger.error('Failed to update task plan:', error as Error);\n }\n }\n\n /**\n * Generate markdown task report\n */\n private generateTaskReport(plan: TaskPlan, stats: SyncStats): void {\n const reportFile = join(this.projectRoot, '.stackmemory', 'task-report.md');\n \n let content = `# Task Sync Report\\n\\n`;\n content += `**Last Updated:** ${plan.lastUpdated.toLocaleString()}\\n`;\n content += `**Sync Duration:** ${stats.duration}ms\\n\\n`;\n\n content += `## Sync Statistics\\n\\n`;\n content += `### To Linear\\n`;\n content += `- Created: ${stats.toLinear.created}\\n`;\n content += `- Updated: ${stats.toLinear.updated}\\n`;\n content += `- Duplicates Merged: ${stats.toLinear.duplicatesMerged}\\n`;\n content += `- Skipped: ${stats.toLinear.skipped}\\n\\n`;\n\n content += `### From Linear\\n`;\n content += `- Created: ${stats.fromLinear.created}\\n`;\n content += `- Updated: ${stats.fromLinear.updated}\\n`;\n content += `- Skipped: ${stats.fromLinear.skipped}\\n\\n`;\n\n if (stats.conflicts.length > 0) {\n content += `### Conflicts\\n`;\n stats.conflicts.forEach((c) => {\n content += `- **${c.taskId}**: ${c.reason} (${c.resolution})\\n`;\n });\n content += '\\n';\n }\n\n content += `## Task Overview\\n\\n`;\n plan.phases.forEach((phase) => {\n content += `### ${phase.name} (${phase.tasks.length})\\n`;\n content += `> ${phase.description}\\n\\n`;\n \n if (phase.tasks.length > 0) {\n phase.tasks.slice(0, 10).forEach((task) => {\n const linearLink = task.linearId ? ` [Linear]` : '';\n content += `- **${task.title}**${linearLink}\\n`;\n });\n \n if (phase.tasks.length > 10) {\n content += `- _...and ${phase.tasks.length - 10} more_\\n`;\n }\n }\n content += '\\n';\n });\n\n writeFileSync(reportFile, content);\n logger.debug('Task report generated', { path: reportFile });\n }\n\n /**\n * Helper methods\n */\n \n private async getDefaultTeamId(): Promise<string> {\n const teams = await this.linearClient.getTeams();\n if (teams.length === 0) {\n throw new Error('No Linear teams found');\n }\n return teams[0]!.id;\n }\n\n private findLocalTaskByLinearId(linearId: string): string | undefined {\n for (const [taskId, linId] of this.mappings) {\n if (linId === linearId) return taskId;\n }\n return undefined;\n }\n\n private hasChanges(localTask: Task, linearIssue: LinearIssue): boolean {\n return (\n localTask.title !== linearIssue.title ||\n localTask.description !== (linearIssue.description || '') ||\n this.mapLinearStateToStatus(linearIssue.state.type) !== localTask.status\n );\n }\n\n private taskNeedsUpdate(task: Task, linearIssue: LinearIssue): boolean {\n return (\n task.title !== linearIssue.title ||\n task.description !== (linearIssue.description || '') ||\n task.status !== this.mapLinearStateToStatus(linearIssue.state.type)\n );\n }\n\n private async createLocalTask(issue: LinearIssue): Promise<void> {\n const task = await this.taskStore.createTask({\n title: issue.title,\n description: issue.description || '',\n status: this.mapLinearStateToStatus(issue.state.type),\n priority: this.mapLinearPriorityToPriority(issue.priority),\n metadata: {\n linear: {\n id: issue.id,\n identifier: issue.identifier,\n url: issue.url,\n },\n },\n });\n\n this.mappings.set(task.id, issue.id);\n }\n\n private async updateLocalTask(task: Task, issue: LinearIssue): Promise<void> {\n await this.taskStore.updateTask(task.id, {\n title: issue.title,\n description: issue.description || '',\n status: this.mapLinearStateToStatus(issue.state.type),\n priority: this.mapLinearPriorityToPriority(issue.priority),\n });\n }\n\n private async createLinearIssue(task: Task, teamId: string): Promise<void> {\n const input: LinearCreateIssueInput = {\n title: task.title,\n description: task.description || '',\n teamId,\n priority: this.mapPriorityToLinearPriority(task.priority),\n };\n\n const issue = await this.linearClient.createIssue(input);\n this.mappings.set(task.id, issue.id);\n\n // Update task with Linear metadata\n await this.taskStore.updateTask(task.id, {\n metadata: {\n ...task.metadata,\n linear: {\n id: issue.id,\n identifier: issue.identifier,\n url: issue.url,\n },\n },\n });\n }\n\n private async updateLinearIssue(issue: LinearIssue, task: Task): Promise<void> {\n await this.linearClient.updateIssue(issue.id, {\n title: task.title,\n description: task.description,\n priority: this.mapPriorityToLinearPriority(task.priority),\n });\n }\n\n private async mergeTaskIntoLinear(task: Task, existingIssue: LinearIssue): Promise<void> {\n await this.duplicateDetector.mergeIntoExisting(\n existingIssue,\n task.title,\n task.description,\n `StackMemory Task: ${task.id}\\nMerged: ${new Date().toISOString()}`\n );\n }\n\n private mapLinearStateToStatus(state: string): TaskStatus {\n switch (state.toLowerCase()) {\n case 'backlog':\n case 'unstarted':\n return 'todo';\n case 'started':\n return 'in_progress';\n case 'completed':\n return 'done';\n case 'cancelled':\n return 'cancelled';\n default:\n return 'todo';\n }\n }\n\n private mapLinearPriorityToPriority(priority?: number): TaskPriority | undefined {\n switch (priority) {\n case 1:\n return 'urgent';\n case 2:\n return 'high';\n case 3:\n return 'medium';\n case 4:\n return 'low';\n default:\n return undefined;\n }\n }\n\n private mapPriorityToLinearPriority(priority?: TaskPriority): number {\n switch (priority) {\n case 'urgent':\n return 1;\n case 'high':\n return 2;\n case 'medium':\n return 3;\n case 'low':\n return 4;\n default:\n return 0;\n }\n }\n\n private loadMappings(): void {\n const mappingFile = join(this.projectRoot, '.stackmemory', 'linear-mappings.json');\n if (existsSync(mappingFile)) {\n try {\n const data = JSON.parse(readFileSync(mappingFile, 'utf8'));\n this.mappings = new Map(Object.entries(data));\n } catch (error: unknown) {\n logger.error('Failed to load mappings:', error as Error);\n }\n }\n }\n\n private saveMappings(): void {\n const mappingFile = join(this.projectRoot, '.stackmemory', 'linear-mappings.json');\n const data = Object.fromEntries(this.mappings);\n writeFileSync(mappingFile, JSON.stringify(data, null, 2));\n }\n\n private loadTaskPlan(): TaskPlan {\n const planFile = join(this.projectRoot, this.config.taskPlanFile!);\n if (existsSync(planFile)) {\n try {\n return JSON.parse(readFileSync(planFile, 'utf8'));\n } catch (error: unknown) {\n logger.error('Failed to load task plan:', error as Error);\n }\n }\n \n return {\n version: '1.0.0',\n lastUpdated: new Date(),\n phases: [],\n };\n }\n\n private saveTaskPlan(plan: TaskPlan): void {\n const planFile = join(this.projectRoot, this.config.taskPlanFile!);\n writeFileSync(planFile, JSON.stringify(plan, null, 2));\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Get last sync statistics\n */\n getLastSyncStats(): SyncStats | undefined {\n return this.lastSyncStats;\n }\n\n /**\n * Clear duplicate detector cache\n */\n clearCache(): void {\n if (this.duplicateDetector) {\n this.duplicateDetector.clearCache();\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 { createHmac } from "crypto";
|
|
2
6
|
import { LinearSyncEngine } from "./sync.js";
|
|
3
7
|
import { LinearAuthManager } from "./auth.js";
|