claude-flow 2.7.33 → 2.7.35

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.
Files changed (99) hide show
  1. package/.claude/settings.local.json +9 -2
  2. package/.claude/skills/agentic-jujutsu/SKILL.md +1 -1
  3. package/CHANGELOG.md +140 -0
  4. package/bin/claude-flow +1 -1
  5. package/dist/src/cli/commands/mcp.js +61 -7
  6. package/dist/src/cli/commands/mcp.js.map +1 -1
  7. package/dist/src/cli/init/index.js +55 -33
  8. package/dist/src/cli/init/index.js.map +1 -1
  9. package/dist/src/cli/simple-cli.js +182 -172
  10. package/dist/src/cli/simple-cli.js.map +1 -1
  11. package/dist/src/cli/simple-commands/init/agent-copier.js +9 -3
  12. package/dist/src/cli/simple-commands/init/agent-copier.js.map +1 -1
  13. package/dist/src/core/DatabaseManager.js +39 -9
  14. package/dist/src/core/DatabaseManager.js.map +1 -1
  15. package/dist/src/mcp/async/job-manager-mcp25.js +240 -0
  16. package/dist/src/mcp/async/job-manager-mcp25.js.map +1 -0
  17. package/dist/src/mcp/index.js +8 -0
  18. package/dist/src/mcp/index.js.map +1 -1
  19. package/dist/src/mcp/protocol/version-negotiation.js +182 -0
  20. package/dist/src/mcp/protocol/version-negotiation.js.map +1 -0
  21. package/dist/src/mcp/registry/mcp-registry-client-2025.js +210 -0
  22. package/dist/src/mcp/registry/mcp-registry-client-2025.js.map +1 -0
  23. package/dist/src/mcp/server-factory.js +189 -0
  24. package/dist/src/mcp/server-factory.js.map +1 -0
  25. package/dist/src/mcp/server-mcp-2025.js +283 -0
  26. package/dist/src/mcp/server-mcp-2025.js.map +1 -0
  27. package/dist/src/mcp/tool-registry-progressive.js +319 -0
  28. package/dist/src/mcp/tool-registry-progressive.js.map +1 -0
  29. package/dist/src/mcp/tools/_template.js +62 -0
  30. package/dist/src/mcp/tools/_template.js.map +1 -0
  31. package/dist/src/mcp/tools/loader.js +228 -0
  32. package/dist/src/mcp/tools/loader.js.map +1 -0
  33. package/dist/src/mcp/tools/system/search.js +224 -0
  34. package/dist/src/mcp/tools/system/search.js.map +1 -0
  35. package/dist/src/mcp/tools/system/status.js +168 -0
  36. package/dist/src/mcp/tools/system/status.js.map +1 -0
  37. package/dist/src/mcp/validation/schema-validator-2025.js +198 -0
  38. package/dist/src/mcp/validation/schema-validator-2025.js.map +1 -0
  39. package/dist/src/utils/error-recovery.js +215 -0
  40. package/dist/src/utils/error-recovery.js.map +1 -0
  41. package/dist/src/utils/metrics-reader.js +10 -0
  42. package/dist/src/utils/metrics-reader.js.map +1 -1
  43. package/docs/.claude-flow/metrics/performance.json +3 -3
  44. package/docs/.claude-flow/metrics/task-metrics.json +3 -3
  45. package/docs/.github-release-issue-v2.7.33.md +488 -0
  46. package/docs/AGENTDB_BRANCH_MERGE_VERIFICATION.md +436 -0
  47. package/docs/AUTOMATIC_ERROR_RECOVERY_v2.7.35.md +321 -0
  48. package/docs/BRANCH_REVIEW_SUMMARY.md +439 -0
  49. package/docs/CONFIRMATION_AUTOMATIC_ERROR_RECOVERY.md +384 -0
  50. package/docs/DEEP_CODE_REVIEW_v2.7.33.md +1159 -0
  51. package/docs/DOCKER_TEST_RESULTS_v2.7.35.md +305 -0
  52. package/docs/MCP_2025_FEATURE_CONFIRMATION.md +698 -0
  53. package/docs/NPM_PUBLISH_GUIDE_v2.7.33.md +628 -0
  54. package/docs/REGRESSION_TEST_REPORT_v2.7.33.md +397 -0
  55. package/docs/RELEASE_NOTES_v2.7.33.md +618 -0
  56. package/docs/RELEASE_READINESS_SUMMARY.md +377 -0
  57. package/docs/RELEASE_SUMMARY_v2.7.33.md +456 -0
  58. package/docs/agentic-flow-agentdb-mcp-integration.md +1198 -0
  59. package/docs/features/automatic-error-recovery.md +333 -0
  60. package/docs/github-issues/README.md +88 -0
  61. package/docs/github-issues/wsl-enotempty-automatic-recovery.md +470 -0
  62. package/docs/mcp-2025-implementation-summary.md +459 -0
  63. package/docs/mcp-spec-2025-implementation-plan.md +1330 -0
  64. package/docs/phase-1-2-implementation-summary.md +676 -0
  65. package/docs/regression-analysis-phase-1-2.md +555 -0
  66. package/docs/troubleshooting/wsl-better-sqlite3-error.md +239 -0
  67. package/package.json +5 -2
  68. package/scripts/create-github-issue.sh +64 -0
  69. package/scripts/test-docker-wsl.sh +198 -0
  70. package/src/cli/commands/mcp.ts +86 -9
  71. package/src/cli/init/index.ts +72 -42
  72. package/src/cli/simple-commands/init/agent-copier.js +10 -5
  73. package/src/core/DatabaseManager.ts +55 -9
  74. package/src/mcp/async/job-manager-mcp25.ts +456 -0
  75. package/src/mcp/index.ts +60 -0
  76. package/src/mcp/protocol/version-negotiation.ts +329 -0
  77. package/src/mcp/registry/mcp-registry-client-2025.ts +334 -0
  78. package/src/mcp/server-factory.ts +426 -0
  79. package/src/mcp/server-mcp-2025.ts +507 -0
  80. package/src/mcp/tool-registry-progressive.ts +539 -0
  81. package/src/mcp/tools/_template.ts +174 -0
  82. package/src/mcp/tools/loader.ts +362 -0
  83. package/src/mcp/tools/system/search.ts +276 -0
  84. package/src/mcp/tools/system/status.ts +206 -0
  85. package/src/mcp/validation/schema-validator-2025.ts +294 -0
  86. package/src/utils/error-recovery.ts +325 -0
  87. package/docs/AGENTDB_V1.6.1_DEEP_REVIEW.md +0 -386
  88. package/docs/AGENT_FOLDER_STRUCTURE_FIX.md +0 -192
  89. package/docs/RECENT_RELEASES_SUMMARY.md +0 -375
  90. package/docs/V2.7.31_RELEASE_NOTES.md +0 -375
  91. /package/.claude/agents/analysis/{analyze-code-quality.md → code-review/analyze-code-quality.md} +0 -0
  92. /package/.claude/agents/architecture/{arch-system-design.md → system-design/arch-system-design.md} +0 -0
  93. /package/.claude/agents/data/{data-ml-model.md → ml/data-ml-model.md} +0 -0
  94. /package/.claude/agents/development/{dev-backend-api.md → backend/dev-backend-api.md} +0 -0
  95. /package/.claude/agents/devops/{ops-cicd-github.md → ci-cd/ops-cicd-github.md} +0 -0
  96. /package/.claude/agents/documentation/{docs-api-openapi.md → api-docs/docs-api-openapi.md} +0 -0
  97. /package/.claude/agents/specialized/{spec-mobile-react-native.md → mobile/spec-mobile-react-native.md} +0 -0
  98. /package/.claude/agents/testing/{tdd-london-swarm.md → unit/tdd-london-swarm.md} +0 -0
  99. /package/.claude/agents/testing/{production-validator.md → validation/production-validator.md} +0 -0
@@ -124,18 +124,24 @@ export async function createAgentDirectories(targetDir, dryRun = false) {
124
124
  '.claude/agents/github',
125
125
  '.claude/agents/sparc',
126
126
  '.claude/agents/testing',
127
+ '.claude/agents/testing/unit',
128
+ '.claude/agents/testing/validation',
127
129
  '.claude/agents/templates',
128
130
  '.claude/agents/analysis',
131
+ '.claude/agents/analysis/code-review',
129
132
  '.claude/agents/architecture',
133
+ '.claude/agents/architecture/system-design',
130
134
  '.claude/agents/data',
135
+ '.claude/agents/data/ml',
131
136
  '.claude/agents/development',
137
+ '.claude/agents/development/backend',
132
138
  '.claude/agents/devops',
139
+ '.claude/agents/devops/ci-cd',
133
140
  '.claude/agents/documentation',
141
+ '.claude/agents/documentation/api-docs',
134
142
  '.claude/agents/specialized',
143
+ '.claude/agents/specialized/mobile',
135
144
  '.claude/agents/flow-nexus',
136
- '.claude/agents/goal',
137
- '.claude/agents/neural',
138
- '.claude/agents/reasoning',
139
145
  '.claude/commands',
140
146
  '.claude/commands/flow-nexus'
141
147
  ];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/cli/simple-commands/init/agent-copier.js"],"sourcesContent":["// agent-copier.js - Copy all agent files during initialization\nimport { promises as fs } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Copy all agent files from the installed package to project directory\n */\nexport async function copyAgentFiles(targetDir, options = {}) {\n const { force = false, dryRun = false } = options;\n \n // Path to agent files - try multiple locations\n const packageAgentsDir = join(__dirname, '../../../../.claude/agents'); // From npm package\n const localAgentsDir = '/workspaces/claude-code-flow/.claude/agents'; // Local development\n const cwdAgentsDir = join(process.cwd(), '.claude/agents'); // Current working directory\n \n let sourceAgentsDir;\n \n // Try local development first, then package, then cwd\n try {\n await fs.access(localAgentsDir);\n sourceAgentsDir = localAgentsDir;\n console.log(' 📁 Using local development agent files');\n } catch {\n try {\n await fs.access(packageAgentsDir);\n sourceAgentsDir = packageAgentsDir;\n console.log(' 📁 Using packaged agent files');\n } catch {\n try {\n await fs.access(cwdAgentsDir);\n sourceAgentsDir = cwdAgentsDir;\n console.log(' 📁 Using current directory agent files');\n } catch {\n console.log(' ⚠️ No agent files found in any location');\n return { success: false, error: 'Agent files not found' };\n }\n }\n }\n const targetAgentsDir = join(targetDir, '.claude/agents');\n \n console.log('📁 Copying agent system files...');\n console.log(` 📂 Source: ${sourceAgentsDir}`);\n console.log(` 📂 Target: ${targetAgentsDir}`);\n \n try {\n \n // Create target directory\n if (!dryRun) {\n await fs.mkdir(targetAgentsDir, { recursive: true });\n }\n \n const copiedFiles = [];\n const errors = [];\n \n // Recursively copy all agent files\n async function copyRecursive(srcDir, destDir) {\n const items = await fs.readdir(srcDir, { withFileTypes: true });\n \n for (const item of items) {\n const srcPath = join(srcDir, item.name);\n const destPath = join(destDir, item.name);\n \n if (item.isDirectory()) {\n if (!dryRun) {\n await fs.mkdir(destPath, { recursive: true });\n }\n await copyRecursive(srcPath, destPath);\n } else if (item.isFile() && item.name.endsWith('.md')) {\n try {\n // Check if file already exists\n let shouldCopy = force;\n if (!force) {\n try {\n await fs.access(destPath);\n // File exists, skip unless force is true\n continue;\n } catch {\n // File doesn't exist, safe to copy\n shouldCopy = true;\n }\n }\n \n if (shouldCopy && !dryRun) {\n const content = await fs.readFile(srcPath, 'utf8');\n await fs.writeFile(destPath, content, 'utf8');\n copiedFiles.push(destPath.replace(targetDir + '/', ''));\n } else if (dryRun) {\n copiedFiles.push(destPath.replace(targetDir + '/', ''));\n }\n } catch (err) {\n errors.push(`Failed to copy ${item.name}: ${err.message}`);\n }\n }\n }\n }\n \n await copyRecursive(sourceAgentsDir, targetAgentsDir);\n \n if (!dryRun && copiedFiles.length > 0) {\n console.log(` ✅ Copied ${copiedFiles.length} agent files`);\n console.log(' 📋 Agent system initialized with 64 specialized agents');\n console.log(' 🎯 Available categories: Core, Swarm, Consensus, Performance, GitHub, SPARC, Testing');\n } else if (dryRun) {\n console.log(` [DRY RUN] Would copy ${copiedFiles.length} agent files`);\n }\n \n if (errors.length > 0) {\n console.log(' ⚠️ Some agent files could not be copied:');\n errors.forEach(error => console.log(` - ${error}`));\n }\n \n return {\n success: true,\n copiedFiles,\n errors,\n totalAgents: copiedFiles.length\n };\n \n } catch (err) {\n console.log(` ❌ Failed to copy agent files: ${err.message}`);\n return {\n success: false,\n error: err.message,\n copiedFiles: [],\n errors: [err.message]\n };\n }\n}\n\n/**\n * Create agent directories structure\n */\nexport async function createAgentDirectories(targetDir, dryRun = false) {\n // Flat structure - all .md files directly in category folders\n const agentDirs = [\n '.claude',\n '.claude/agents',\n '.claude/agents/core',\n '.claude/agents/swarm',\n '.claude/agents/hive-mind',\n '.claude/agents/consensus',\n '.claude/agents/optimization',\n '.claude/agents/github',\n '.claude/agents/sparc',\n '.claude/agents/testing',\n '.claude/agents/templates',\n '.claude/agents/analysis',\n '.claude/agents/architecture',\n '.claude/agents/data',\n '.claude/agents/development',\n '.claude/agents/devops',\n '.claude/agents/documentation',\n '.claude/agents/specialized',\n '.claude/agents/flow-nexus',\n '.claude/agents/goal',\n '.claude/agents/neural',\n '.claude/agents/reasoning',\n '.claude/commands',\n '.claude/commands/flow-nexus'\n ];\n \n if (dryRun) {\n console.log(` [DRY RUN] Would create ${agentDirs.length} agent directories`);\n return;\n }\n \n for (const dir of agentDirs) {\n await fs.mkdir(join(targetDir, dir), { recursive: true });\n }\n \n console.log(` ✅ Created ${agentDirs.length} agent directories`);\n}\n\n/**\n * Validate agent system after copying\n */\n/**\n * Copy all command files from the installed package to project directory\n */\nexport async function copyCommandFiles(targetDir, options = {}) {\n const { force = false, dryRun = false } = options;\n \n // Path to command files - try multiple locations\n const packageCommandsDir = join(__dirname, '../../../../.claude/commands'); // From npm package\n const localCommandsDir = '/workspaces/claude-code-flow/.claude/commands'; // Local development\n const cwdCommandsDir = join(process.cwd(), '.claude/commands'); // Current working directory\n \n let sourceCommandsDir;\n \n // Try local development first, then package, then cwd\n try {\n await fs.access(localCommandsDir);\n sourceCommandsDir = localCommandsDir;\n console.log(' 📁 Using local development command files');\n } catch {\n try {\n await fs.access(packageCommandsDir);\n sourceCommandsDir = packageCommandsDir;\n console.log(' 📁 Using packaged command files');\n } catch {\n try {\n await fs.access(cwdCommandsDir);\n sourceCommandsDir = cwdCommandsDir;\n console.log(' 📁 Using current directory command files');\n } catch {\n console.log(' ⚠️ No command files found in any location');\n return { success: false, error: 'Command files not found' };\n }\n }\n }\n \n const targetCommandsDir = join(targetDir, '.claude/commands');\n \n console.log('📁 Copying command system files...');\n console.log(` 📂 Source: ${sourceCommandsDir}`);\n console.log(` 📂 Target: ${targetCommandsDir}`);\n \n try {\n // Create target directory\n if (!dryRun) {\n await fs.mkdir(targetCommandsDir, { recursive: true });\n }\n \n const copiedFiles = [];\n const errors = [];\n \n // Recursively copy all command files\n async function copyRecursive(srcDir, destDir) {\n const items = await fs.readdir(srcDir, { withFileTypes: true });\n \n for (const item of items) {\n const srcPath = join(srcDir, item.name);\n const destPath = join(destDir, item.name);\n \n if (item.isDirectory()) {\n if (!dryRun) {\n await fs.mkdir(destPath, { recursive: true });\n }\n await copyRecursive(srcPath, destPath);\n } else if (item.isFile() && item.name.endsWith('.md')) {\n try {\n // Check if file already exists\n let shouldCopy = force;\n if (!force) {\n try {\n await fs.access(destPath);\n // File exists, skip unless force is true\n continue;\n } catch {\n // File doesn't exist, safe to copy\n shouldCopy = true;\n }\n }\n \n if (shouldCopy && !dryRun) {\n const content = await fs.readFile(srcPath, 'utf8');\n await fs.writeFile(destPath, content, 'utf8');\n copiedFiles.push(destPath.replace(targetDir + '/', ''));\n } else if (dryRun) {\n copiedFiles.push(destPath.replace(targetDir + '/', ''));\n }\n } catch (err) {\n errors.push(`Failed to copy ${item.name}: ${err.message}`);\n }\n }\n }\n }\n \n await copyRecursive(sourceCommandsDir, targetCommandsDir);\n \n if (!dryRun && copiedFiles.length > 0) {\n console.log(` ✅ Copied ${copiedFiles.length} command files`);\n console.log(' 📋 Command system initialized with comprehensive documentation');\n console.log(' 🎯 Available categories: Analysis, Automation, GitHub, Hooks, Memory, Flow Nexus');\n } else if (dryRun) {\n console.log(` [DRY RUN] Would copy ${copiedFiles.length} command files`);\n }\n \n if (errors.length > 0) {\n console.log(' ⚠️ Some command files could not be copied:');\n errors.forEach(error => console.log(` - ${error}`));\n }\n \n return {\n success: true,\n copiedFiles,\n errors,\n totalCommands: copiedFiles.length\n };\n \n } catch (err) {\n console.log(` ❌ Failed to copy command files: ${err.message}`);\n return {\n success: false,\n error: err.message,\n copiedFiles: [],\n errors: [err.message]\n };\n }\n}\n\nexport async function validateAgentSystem(targetDir) {\n const agentsDir = join(targetDir, '.claude/agents');\n \n try {\n const categories = await fs.readdir(agentsDir, { withFileTypes: true });\n const agentCategories = categories.filter(item => item.isDirectory()).map(item => item.name);\n \n let totalAgents = 0;\n for (const category of agentCategories) {\n const categoryPath = join(agentsDir, category);\n const items = await fs.readdir(categoryPath, { withFileTypes: true });\n const agentFiles = items.filter(item => item.isFile() && item.name.endsWith('.md'));\n totalAgents += agentFiles.length;\n }\n \n console.log(' 🔍 Agent system validation:');\n console.log(` • Categories: ${agentCategories.length}`);\n console.log(` • Total agents: ${totalAgents}`);\n console.log(` • Categories: ${agentCategories.join(', ')}`);\n \n return {\n valid: totalAgents > 50, // Should have at least 50+ agents\n categories: agentCategories.length,\n totalAgents,\n categoryNames: agentCategories\n };\n \n } catch (err) {\n console.log(` ⚠️ Agent system validation failed: ${err.message}`);\n return {\n valid: false,\n error: err.message\n };\n }\n}"],"names":["promises","fs","join","dirname","fileURLToPath","__filename","url","__dirname","copyAgentFiles","targetDir","options","force","dryRun","packageAgentsDir","localAgentsDir","cwdAgentsDir","process","cwd","sourceAgentsDir","access","console","log","success","error","targetAgentsDir","mkdir","recursive","copiedFiles","errors","copyRecursive","srcDir","destDir","items","readdir","withFileTypes","item","srcPath","name","destPath","isDirectory","isFile","endsWith","shouldCopy","content","readFile","writeFile","push","replace","err","message","length","forEach","totalAgents","createAgentDirectories","agentDirs","dir","copyCommandFiles","packageCommandsDir","localCommandsDir","cwdCommandsDir","sourceCommandsDir","targetCommandsDir","totalCommands","validateAgentSystem","agentsDir","categories","agentCategories","filter","map","category","categoryPath","agentFiles","valid","categoryNames"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/cli/simple-commands/init/agent-copier.js"],"sourcesContent":["// agent-copier.js - Copy all agent files during initialization\nimport { promises as fs } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Copy all agent files from the installed package to project directory\n */\nexport async function copyAgentFiles(targetDir, options = {}) {\n const { force = false, dryRun = false } = options;\n \n // Path to agent files - try multiple locations\n const packageAgentsDir = join(__dirname, '../../../../.claude/agents'); // From npm package\n const localAgentsDir = '/workspaces/claude-code-flow/.claude/agents'; // Local development\n const cwdAgentsDir = join(process.cwd(), '.claude/agents'); // Current working directory\n \n let sourceAgentsDir;\n \n // Try local development first, then package, then cwd\n try {\n await fs.access(localAgentsDir);\n sourceAgentsDir = localAgentsDir;\n console.log(' 📁 Using local development agent files');\n } catch {\n try {\n await fs.access(packageAgentsDir);\n sourceAgentsDir = packageAgentsDir;\n console.log(' 📁 Using packaged agent files');\n } catch {\n try {\n await fs.access(cwdAgentsDir);\n sourceAgentsDir = cwdAgentsDir;\n console.log(' 📁 Using current directory agent files');\n } catch {\n console.log(' ⚠️ No agent files found in any location');\n return { success: false, error: 'Agent files not found' };\n }\n }\n }\n const targetAgentsDir = join(targetDir, '.claude/agents');\n \n console.log('📁 Copying agent system files...');\n console.log(` 📂 Source: ${sourceAgentsDir}`);\n console.log(` 📂 Target: ${targetAgentsDir}`);\n \n try {\n \n // Create target directory\n if (!dryRun) {\n await fs.mkdir(targetAgentsDir, { recursive: true });\n }\n \n const copiedFiles = [];\n const errors = [];\n \n // Recursively copy all agent files\n async function copyRecursive(srcDir, destDir) {\n const items = await fs.readdir(srcDir, { withFileTypes: true });\n \n for (const item of items) {\n const srcPath = join(srcDir, item.name);\n const destPath = join(destDir, item.name);\n \n if (item.isDirectory()) {\n if (!dryRun) {\n await fs.mkdir(destPath, { recursive: true });\n }\n await copyRecursive(srcPath, destPath);\n } else if (item.isFile() && item.name.endsWith('.md')) {\n try {\n // Check if file already exists\n let shouldCopy = force;\n if (!force) {\n try {\n await fs.access(destPath);\n // File exists, skip unless force is true\n continue;\n } catch {\n // File doesn't exist, safe to copy\n shouldCopy = true;\n }\n }\n \n if (shouldCopy && !dryRun) {\n const content = await fs.readFile(srcPath, 'utf8');\n await fs.writeFile(destPath, content, 'utf8');\n copiedFiles.push(destPath.replace(targetDir + '/', ''));\n } else if (dryRun) {\n copiedFiles.push(destPath.replace(targetDir + '/', ''));\n }\n } catch (err) {\n errors.push(`Failed to copy ${item.name}: ${err.message}`);\n }\n }\n }\n }\n \n await copyRecursive(sourceAgentsDir, targetAgentsDir);\n \n if (!dryRun && copiedFiles.length > 0) {\n console.log(` ✅ Copied ${copiedFiles.length} agent files`);\n console.log(' 📋 Agent system initialized with 64 specialized agents');\n console.log(' 🎯 Available categories: Core, Swarm, Consensus, Performance, GitHub, SPARC, Testing');\n } else if (dryRun) {\n console.log(` [DRY RUN] Would copy ${copiedFiles.length} agent files`);\n }\n \n if (errors.length > 0) {\n console.log(' ⚠️ Some agent files could not be copied:');\n errors.forEach(error => console.log(` - ${error}`));\n }\n \n return {\n success: true,\n copiedFiles,\n errors,\n totalAgents: copiedFiles.length\n };\n \n } catch (err) {\n console.log(` ❌ Failed to copy agent files: ${err.message}`);\n return {\n success: false,\n error: err.message,\n copiedFiles: [],\n errors: [err.message]\n };\n }\n}\n\n/**\n * Create agent directories structure\n */\nexport async function createAgentDirectories(targetDir, dryRun = false) {\n const agentDirs = [\n '.claude',\n '.claude/agents',\n '.claude/agents/core',\n '.claude/agents/swarm', \n '.claude/agents/hive-mind',\n '.claude/agents/consensus',\n '.claude/agents/optimization',\n '.claude/agents/github',\n '.claude/agents/sparc',\n '.claude/agents/testing',\n '.claude/agents/testing/unit',\n '.claude/agents/testing/validation',\n '.claude/agents/templates',\n '.claude/agents/analysis',\n '.claude/agents/analysis/code-review',\n '.claude/agents/architecture',\n '.claude/agents/architecture/system-design',\n '.claude/agents/data',\n '.claude/agents/data/ml',\n '.claude/agents/development',\n '.claude/agents/development/backend',\n '.claude/agents/devops',\n '.claude/agents/devops/ci-cd',\n '.claude/agents/documentation',\n '.claude/agents/documentation/api-docs',\n '.claude/agents/specialized',\n '.claude/agents/specialized/mobile',\n '.claude/agents/flow-nexus',\n '.claude/commands',\n '.claude/commands/flow-nexus'\n ];\n \n if (dryRun) {\n console.log(` [DRY RUN] Would create ${agentDirs.length} agent directories`);\n return;\n }\n \n for (const dir of agentDirs) {\n await fs.mkdir(join(targetDir, dir), { recursive: true });\n }\n \n console.log(` ✅ Created ${agentDirs.length} agent directories`);\n}\n\n/**\n * Validate agent system after copying\n */\n/**\n * Copy all command files from the installed package to project directory\n */\nexport async function copyCommandFiles(targetDir, options = {}) {\n const { force = false, dryRun = false } = options;\n \n // Path to command files - try multiple locations\n const packageCommandsDir = join(__dirname, '../../../../.claude/commands'); // From npm package\n const localCommandsDir = '/workspaces/claude-code-flow/.claude/commands'; // Local development\n const cwdCommandsDir = join(process.cwd(), '.claude/commands'); // Current working directory\n \n let sourceCommandsDir;\n \n // Try local development first, then package, then cwd\n try {\n await fs.access(localCommandsDir);\n sourceCommandsDir = localCommandsDir;\n console.log(' 📁 Using local development command files');\n } catch {\n try {\n await fs.access(packageCommandsDir);\n sourceCommandsDir = packageCommandsDir;\n console.log(' 📁 Using packaged command files');\n } catch {\n try {\n await fs.access(cwdCommandsDir);\n sourceCommandsDir = cwdCommandsDir;\n console.log(' 📁 Using current directory command files');\n } catch {\n console.log(' ⚠️ No command files found in any location');\n return { success: false, error: 'Command files not found' };\n }\n }\n }\n \n const targetCommandsDir = join(targetDir, '.claude/commands');\n \n console.log('📁 Copying command system files...');\n console.log(` 📂 Source: ${sourceCommandsDir}`);\n console.log(` 📂 Target: ${targetCommandsDir}`);\n \n try {\n // Create target directory\n if (!dryRun) {\n await fs.mkdir(targetCommandsDir, { recursive: true });\n }\n \n const copiedFiles = [];\n const errors = [];\n \n // Recursively copy all command files\n async function copyRecursive(srcDir, destDir) {\n const items = await fs.readdir(srcDir, { withFileTypes: true });\n \n for (const item of items) {\n const srcPath = join(srcDir, item.name);\n const destPath = join(destDir, item.name);\n \n if (item.isDirectory()) {\n if (!dryRun) {\n await fs.mkdir(destPath, { recursive: true });\n }\n await copyRecursive(srcPath, destPath);\n } else if (item.isFile() && item.name.endsWith('.md')) {\n try {\n // Check if file already exists\n let shouldCopy = force;\n if (!force) {\n try {\n await fs.access(destPath);\n // File exists, skip unless force is true\n continue;\n } catch {\n // File doesn't exist, safe to copy\n shouldCopy = true;\n }\n }\n \n if (shouldCopy && !dryRun) {\n const content = await fs.readFile(srcPath, 'utf8');\n await fs.writeFile(destPath, content, 'utf8');\n copiedFiles.push(destPath.replace(targetDir + '/', ''));\n } else if (dryRun) {\n copiedFiles.push(destPath.replace(targetDir + '/', ''));\n }\n } catch (err) {\n errors.push(`Failed to copy ${item.name}: ${err.message}`);\n }\n }\n }\n }\n \n await copyRecursive(sourceCommandsDir, targetCommandsDir);\n \n if (!dryRun && copiedFiles.length > 0) {\n console.log(` ✅ Copied ${copiedFiles.length} command files`);\n console.log(' 📋 Command system initialized with comprehensive documentation');\n console.log(' 🎯 Available categories: Analysis, Automation, GitHub, Hooks, Memory, Flow Nexus');\n } else if (dryRun) {\n console.log(` [DRY RUN] Would copy ${copiedFiles.length} command files`);\n }\n \n if (errors.length > 0) {\n console.log(' ⚠️ Some command files could not be copied:');\n errors.forEach(error => console.log(` - ${error}`));\n }\n \n return {\n success: true,\n copiedFiles,\n errors,\n totalCommands: copiedFiles.length\n };\n \n } catch (err) {\n console.log(` ❌ Failed to copy command files: ${err.message}`);\n return {\n success: false,\n error: err.message,\n copiedFiles: [],\n errors: [err.message]\n };\n }\n}\n\nexport async function validateAgentSystem(targetDir) {\n const agentsDir = join(targetDir, '.claude/agents');\n \n try {\n const categories = await fs.readdir(agentsDir, { withFileTypes: true });\n const agentCategories = categories.filter(item => item.isDirectory()).map(item => item.name);\n \n let totalAgents = 0;\n for (const category of agentCategories) {\n const categoryPath = join(agentsDir, category);\n const items = await fs.readdir(categoryPath, { withFileTypes: true });\n const agentFiles = items.filter(item => item.isFile() && item.name.endsWith('.md'));\n totalAgents += agentFiles.length;\n }\n \n console.log(' 🔍 Agent system validation:');\n console.log(` • Categories: ${agentCategories.length}`);\n console.log(` • Total agents: ${totalAgents}`);\n console.log(` • Categories: ${agentCategories.join(', ')}`);\n \n return {\n valid: totalAgents > 50, // Should have at least 50+ agents\n categories: agentCategories.length,\n totalAgents,\n categoryNames: agentCategories\n };\n \n } catch (err) {\n console.log(` ⚠️ Agent system validation failed: ${err.message}`);\n return {\n valid: false,\n error: err.message\n };\n }\n}"],"names":["promises","fs","join","dirname","fileURLToPath","__filename","url","__dirname","copyAgentFiles","targetDir","options","force","dryRun","packageAgentsDir","localAgentsDir","cwdAgentsDir","process","cwd","sourceAgentsDir","access","console","log","success","error","targetAgentsDir","mkdir","recursive","copiedFiles","errors","copyRecursive","srcDir","destDir","items","readdir","withFileTypes","item","srcPath","name","destPath","isDirectory","isFile","endsWith","shouldCopy","content","readFile","writeFile","push","replace","err","message","length","forEach","totalAgents","createAgentDirectories","agentDirs","dir","copyCommandFiles","packageCommandsDir","localCommandsDir","cwdCommandsDir","sourceCommandsDir","targetCommandsDir","totalCommands","validateAgentSystem","agentsDir","categories","agentCategories","filter","map","category","categoryPath","agentFiles","valid","categoryNames"],"mappings":"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"}
@@ -5,29 +5,59 @@ export class DatabaseManager {
5
5
  dbType;
6
6
  dbPath;
7
7
  initialized = false;
8
+ retryCount = 0;
9
+ maxRetries = 3;
8
10
  constructor(dbType = 'sqlite', dbPath){
9
11
  this.dbType = dbType;
10
12
  this.dbPath = dbPath || this.getDefaultPath();
11
13
  if (this.dbType === 'sqlite') {
12
- try {
13
- this.provider = new SQLiteProvider(this.dbPath);
14
- } catch (error) {
15
- console.warn('SQLite not available, falling back to JSON storage:', error);
16
- this.provider = new JSONProvider(this.dbPath.replace('.sqlite', '.json'));
17
- this.dbType = 'json';
18
- }
14
+ this.provider = this.initializeSQLiteWithRecovery();
19
15
  } else {
20
16
  this.provider = new JSONProvider(this.dbPath);
21
17
  }
22
18
  }
19
+ initializeSQLiteWithRecovery() {
20
+ try {
21
+ return new SQLiteProvider(this.dbPath);
22
+ } catch (error) {
23
+ const errorMsg = error instanceof Error ? error.message : String(error);
24
+ if (errorMsg.includes('ENOTEMPTY') || errorMsg.includes('better-sqlite3')) {
25
+ console.warn('⚠️ SQLite initialization failed due to npm cache error');
26
+ console.warn(' Will attempt automatic recovery during initialize()');
27
+ } else {
28
+ console.warn('SQLite not available, falling back to JSON storage:', error);
29
+ }
30
+ this.provider = new JSONProvider(this.dbPath.replace('.sqlite', '.json'));
31
+ this.dbType = 'json';
32
+ return this.provider;
33
+ }
34
+ }
23
35
  getDefaultPath() {
24
36
  const baseDir = path.join(process.cwd(), '.claude-flow');
25
37
  return this.dbType === 'sqlite' ? path.join(baseDir, 'database.sqlite') : path.join(baseDir, 'database.json');
26
38
  }
27
39
  async initialize() {
28
40
  await fs.ensureDir(path.dirname(this.dbPath));
29
- await this.provider.initialize();
30
- this.initialized = true;
41
+ try {
42
+ await this.provider.initialize();
43
+ this.initialized = true;
44
+ } catch (error) {
45
+ if (this.dbType === 'json') {
46
+ throw error;
47
+ }
48
+ const errorMsg = error instanceof Error ? error.message : String(error);
49
+ if (this.retryCount < this.maxRetries) {
50
+ console.warn(`⚠️ Database initialization failed (attempt ${this.retryCount + 1}/${this.maxRetries})`);
51
+ console.warn(` Error: ${errorMsg}`);
52
+ console.log('🔄 Switching to JSON storage as fallback...');
53
+ this.provider = new JSONProvider(this.dbPath.replace('.sqlite', '.json'));
54
+ this.dbType = 'json';
55
+ this.retryCount++;
56
+ await this.initialize();
57
+ } else {
58
+ throw error;
59
+ }
60
+ }
31
61
  }
32
62
  async store(key, value, namespace = 'default') {
33
63
  if (!this.initialized) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/DatabaseManager.ts"],"sourcesContent":["/**\n * DatabaseManager - Manages SQLite and JSON fallback storage\n * Provides a unified interface for persistent data storage with automatic fallback\n */\n\nimport * as fs from 'fs-extra';\nimport * as path from 'path';\nimport { IDatabaseProvider } from '../types/interfaces.js';\n\nexport class DatabaseManager implements IDatabaseProvider {\n private provider: IDatabaseProvider;\n private dbType: 'sqlite' | 'json';\n private dbPath: string;\n private initialized: boolean = false;\n\n constructor(dbType: 'sqlite' | 'json' = 'sqlite', dbPath?: string) {\n this.dbType = dbType;\n this.dbPath = dbPath || this.getDefaultPath();\n\n // Try SQLite first, fallback to JSON if needed\n if (this.dbType === 'sqlite') {\n try {\n this.provider = new SQLiteProvider(this.dbPath);\n } catch (error) {\n console.warn('SQLite not available, falling back to JSON storage:', error);\n this.provider = new JSONProvider(this.dbPath.replace('.sqlite', '.json'));\n this.dbType = 'json';\n }\n } else {\n this.provider = new JSONProvider(this.dbPath);\n }\n }\n\n private getDefaultPath(): string {\n const baseDir = path.join(process.cwd(), '.claude-flow');\n return this.dbType === 'sqlite'\n ? path.join(baseDir, 'database.sqlite')\n : path.join(baseDir, 'database.json');\n }\n\n async initialize(): Promise<void> {\n await fs.ensureDir(path.dirname(this.dbPath));\n await this.provider.initialize();\n this.initialized = true;\n }\n\n async store(key: string, value: any, namespace: string = 'default'): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n return this.provider.store(key, value, namespace);\n }\n\n async retrieve(key: string, namespace: string = 'default'): Promise<any> {\n if (!this.initialized) {\n await this.initialize();\n }\n return this.provider.retrieve(key, namespace);\n }\n\n async delete(key: string, namespace: string = 'default'): Promise<boolean> {\n if (!this.initialized) {\n await this.initialize();\n }\n return this.provider.delete(key, namespace);\n }\n\n async list(namespace: string = 'default'): Promise<string[]> {\n if (!this.initialized) {\n await this.initialize();\n }\n return this.provider.list(namespace);\n }\n\n async close(): Promise<void> {\n if (this.provider) {\n await this.provider.close();\n }\n this.initialized = false;\n }\n\n getDatabaseType(): 'sqlite' | 'json' {\n return this.dbType;\n }\n\n getDatabasePath(): string {\n return this.dbPath;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n // Specialized methods for common operations\n async storeJSON(key: string, data: object, namespace?: string): Promise<void> {\n await this.store(key, JSON.stringify(data), namespace);\n }\n\n async retrieveJSON(key: string, namespace?: string): Promise<object | null> {\n const data = await this.retrieve(key, namespace);\n if (!data) return null;\n try {\n return typeof data === 'string' ? JSON.parse(data) : data;\n } catch {\n return null;\n }\n }\n\n async exists(key: string, namespace?: string): Promise<boolean> {\n const data = await this.retrieve(key, namespace);\n return data !== null && data !== undefined;\n }\n\n async clear(namespace?: string): Promise<void> {\n const keys = await this.list(namespace);\n await Promise.all(keys.map(key => this.delete(key, namespace)));\n }\n}\n\n/**\n * SQLite implementation\n */\nclass SQLiteProvider implements IDatabaseProvider {\n private db: any;\n private dbPath: string;\n\n constructor(dbPath: string) {\n this.dbPath = dbPath;\n // Dynamic import to handle optional dependency\n try {\n const Database = require('better-sqlite3');\n this.db = new Database(dbPath);\n } catch (error) {\n throw new Error('better-sqlite3 not available. Install with: npm install better-sqlite3');\n }\n }\n\n async initialize(): Promise<void> {\n // Create tables\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS storage (\n namespace TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT NOT NULL,\n created_at INTEGER DEFAULT (strftime('%s', 'now')),\n updated_at INTEGER DEFAULT (strftime('%s', 'now')),\n PRIMARY KEY (namespace, key)\n )\n `);\n\n this.db.exec(`\n CREATE INDEX IF NOT EXISTS idx_storage_namespace ON storage(namespace);\n CREATE INDEX IF NOT EXISTS idx_storage_created_at ON storage(created_at);\n `);\n }\n\n async store(key: string, value: any, namespace: string = 'default'): Promise<void> {\n const stmt = this.db.prepare(`\n INSERT OR REPLACE INTO storage (namespace, key, value, updated_at)\n VALUES (?, ?, ?, strftime('%s', 'now'))\n `);\n\n const serializedValue = typeof value === 'string' ? value : JSON.stringify(value);\n stmt.run(namespace, key, serializedValue);\n }\n\n async retrieve(key: string, namespace: string = 'default'): Promise<any> {\n const stmt = this.db.prepare('SELECT value FROM storage WHERE namespace = ? AND key = ?');\n const row = stmt.get(namespace, key);\n\n if (!row) return null;\n\n try {\n return JSON.parse(row.value);\n } catch {\n return row.value;\n }\n }\n\n async delete(key: string, namespace: string = 'default'): Promise<boolean> {\n const stmt = this.db.prepare('DELETE FROM storage WHERE namespace = ? AND key = ?');\n const result = stmt.run(namespace, key);\n return result.changes > 0;\n }\n\n async list(namespace: string = 'default'): Promise<string[]> {\n const stmt = this.db.prepare('SELECT key FROM storage WHERE namespace = ? ORDER BY key');\n const rows = stmt.all(namespace);\n return rows.map((row: any) => row.key);\n }\n\n async close(): Promise<void> {\n if (this.db) {\n this.db.close();\n }\n }\n}\n\n/**\n * JSON file-based implementation\n */\nclass JSONProvider implements IDatabaseProvider {\n private data: Record<string, Record<string, any>> = {};\n private dbPath: string;\n\n constructor(dbPath: string) {\n this.dbPath = dbPath;\n }\n\n async initialize(): Promise<void> {\n try {\n if (await fs.pathExists(this.dbPath)) {\n const content = await fs.readJSON(this.dbPath);\n this.data = content || {};\n }\n } catch (error) {\n console.warn('Failed to load JSON database, starting fresh:', error);\n this.data = {};\n }\n }\n\n async store(key: string, value: any, namespace: string = 'default'): Promise<void> {\n if (!this.data[namespace]) {\n this.data[namespace] = {};\n }\n\n this.data[namespace][key] = value;\n await this.persist();\n }\n\n async retrieve(key: string, namespace: string = 'default'): Promise<any> {\n if (!this.data[namespace]) {\n return null;\n }\n return this.data[namespace][key] || null;\n }\n\n async delete(key: string, namespace: string = 'default'): Promise<boolean> {\n if (!this.data[namespace] || !(key in this.data[namespace])) {\n return false;\n }\n\n delete this.data[namespace][key];\n await this.persist();\n return true;\n }\n\n async list(namespace: string = 'default'): Promise<string[]> {\n if (!this.data[namespace]) {\n return [];\n }\n return Object.keys(this.data[namespace]).sort();\n }\n\n async close(): Promise<void> {\n await this.persist();\n }\n\n private async persist(): Promise<void> {\n try {\n await fs.ensureDir(path.dirname(this.dbPath));\n await fs.writeJSON(this.dbPath, this.data, { spaces: 2 });\n } catch (error) {\n console.error('Failed to persist JSON database:', error);\n }\n }\n}"],"names":["fs","path","DatabaseManager","provider","dbType","dbPath","initialized","getDefaultPath","SQLiteProvider","error","console","warn","JSONProvider","replace","baseDir","join","process","cwd","initialize","ensureDir","dirname","store","key","value","namespace","retrieve","delete","list","close","getDatabaseType","getDatabasePath","isInitialized","storeJSON","data","JSON","stringify","retrieveJSON","parse","exists","undefined","clear","keys","Promise","all","map","db","Database","require","Error","exec","stmt","prepare","serializedValue","run","row","get","result","changes","rows","pathExists","content","readJSON","persist","Object","sort","writeJSON","spaces"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/core/DatabaseManager.ts"],"sourcesContent":["/**\n * DatabaseManager - Manages SQLite and JSON fallback storage\n * Provides a unified interface for persistent data storage with automatic fallback\n */\n\nimport * as fs from 'fs-extra';\nimport * as path from 'path';\nimport { IDatabaseProvider } from '../types/interfaces.js';\n\nexport class DatabaseManager implements IDatabaseProvider {\n private provider: IDatabaseProvider;\n private dbType: 'sqlite' | 'json';\n private dbPath: string;\n private initialized: boolean = false;\n private retryCount: number = 0;\n private maxRetries: number = 3;\n\n constructor(dbType: 'sqlite' | 'json' = 'sqlite', dbPath?: string) {\n this.dbType = dbType;\n this.dbPath = dbPath || this.getDefaultPath();\n\n // Try SQLite first, fallback to JSON if needed\n if (this.dbType === 'sqlite') {\n this.provider = this.initializeSQLiteWithRecovery();\n } else {\n this.provider = new JSONProvider(this.dbPath);\n }\n }\n\n /**\n * Initialize SQLite with automatic error recovery\n */\n private initializeSQLiteWithRecovery(): IDatabaseProvider {\n try {\n return new SQLiteProvider(this.dbPath);\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n\n // Check if it's an npm cache error\n if (errorMsg.includes('ENOTEMPTY') || errorMsg.includes('better-sqlite3')) {\n console.warn('⚠️ SQLite initialization failed due to npm cache error');\n console.warn(' Will attempt automatic recovery during initialize()');\n } else {\n console.warn('SQLite not available, falling back to JSON storage:', error);\n }\n\n // Fallback to JSON for now\n this.provider = new JSONProvider(this.dbPath.replace('.sqlite', '.json'));\n this.dbType = 'json';\n return this.provider;\n }\n }\n\n private getDefaultPath(): string {\n const baseDir = path.join(process.cwd(), '.claude-flow');\n return this.dbType === 'sqlite'\n ? path.join(baseDir, 'database.sqlite')\n : path.join(baseDir, 'database.json');\n }\n\n async initialize(): Promise<void> {\n await fs.ensureDir(path.dirname(this.dbPath));\n\n try {\n await this.provider.initialize();\n this.initialized = true;\n } catch (error) {\n // If JSON provider failed, just propagate the error\n if (this.dbType === 'json') {\n throw error;\n }\n\n // For SQLite errors, attempt recovery\n const errorMsg = error instanceof Error ? error.message : String(error);\n if (this.retryCount < this.maxRetries) {\n console.warn(`⚠️ Database initialization failed (attempt ${this.retryCount + 1}/${this.maxRetries})`);\n console.warn(` Error: ${errorMsg}`);\n\n // Attempt to recover by switching to JSON\n console.log('🔄 Switching to JSON storage as fallback...');\n this.provider = new JSONProvider(this.dbPath.replace('.sqlite', '.json'));\n this.dbType = 'json';\n this.retryCount++;\n\n // Retry initialization with JSON provider\n await this.initialize();\n } else {\n throw error;\n }\n }\n }\n\n async store(key: string, value: any, namespace: string = 'default'): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n return this.provider.store(key, value, namespace);\n }\n\n async retrieve(key: string, namespace: string = 'default'): Promise<any> {\n if (!this.initialized) {\n await this.initialize();\n }\n return this.provider.retrieve(key, namespace);\n }\n\n async delete(key: string, namespace: string = 'default'): Promise<boolean> {\n if (!this.initialized) {\n await this.initialize();\n }\n return this.provider.delete(key, namespace);\n }\n\n async list(namespace: string = 'default'): Promise<string[]> {\n if (!this.initialized) {\n await this.initialize();\n }\n return this.provider.list(namespace);\n }\n\n async close(): Promise<void> {\n if (this.provider) {\n await this.provider.close();\n }\n this.initialized = false;\n }\n\n getDatabaseType(): 'sqlite' | 'json' {\n return this.dbType;\n }\n\n getDatabasePath(): string {\n return this.dbPath;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n // Specialized methods for common operations\n async storeJSON(key: string, data: object, namespace?: string): Promise<void> {\n await this.store(key, JSON.stringify(data), namespace);\n }\n\n async retrieveJSON(key: string, namespace?: string): Promise<object | null> {\n const data = await this.retrieve(key, namespace);\n if (!data) return null;\n try {\n return typeof data === 'string' ? JSON.parse(data) : data;\n } catch {\n return null;\n }\n }\n\n async exists(key: string, namespace?: string): Promise<boolean> {\n const data = await this.retrieve(key, namespace);\n return data !== null && data !== undefined;\n }\n\n async clear(namespace?: string): Promise<void> {\n const keys = await this.list(namespace);\n await Promise.all(keys.map(key => this.delete(key, namespace)));\n }\n}\n\n/**\n * SQLite implementation\n */\nclass SQLiteProvider implements IDatabaseProvider {\n private db: any;\n private dbPath: string;\n\n constructor(dbPath: string) {\n this.dbPath = dbPath;\n // Dynamic import to handle optional dependency\n try {\n const Database = require('better-sqlite3');\n this.db = new Database(dbPath);\n } catch (error) {\n throw new Error('better-sqlite3 not available. Install with: npm install better-sqlite3');\n }\n }\n\n async initialize(): Promise<void> {\n // Create tables\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS storage (\n namespace TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT NOT NULL,\n created_at INTEGER DEFAULT (strftime('%s', 'now')),\n updated_at INTEGER DEFAULT (strftime('%s', 'now')),\n PRIMARY KEY (namespace, key)\n )\n `);\n\n this.db.exec(`\n CREATE INDEX IF NOT EXISTS idx_storage_namespace ON storage(namespace);\n CREATE INDEX IF NOT EXISTS idx_storage_created_at ON storage(created_at);\n `);\n }\n\n async store(key: string, value: any, namespace: string = 'default'): Promise<void> {\n const stmt = this.db.prepare(`\n INSERT OR REPLACE INTO storage (namespace, key, value, updated_at)\n VALUES (?, ?, ?, strftime('%s', 'now'))\n `);\n\n const serializedValue = typeof value === 'string' ? value : JSON.stringify(value);\n stmt.run(namespace, key, serializedValue);\n }\n\n async retrieve(key: string, namespace: string = 'default'): Promise<any> {\n const stmt = this.db.prepare('SELECT value FROM storage WHERE namespace = ? AND key = ?');\n const row = stmt.get(namespace, key);\n\n if (!row) return null;\n\n try {\n return JSON.parse(row.value);\n } catch {\n return row.value;\n }\n }\n\n async delete(key: string, namespace: string = 'default'): Promise<boolean> {\n const stmt = this.db.prepare('DELETE FROM storage WHERE namespace = ? AND key = ?');\n const result = stmt.run(namespace, key);\n return result.changes > 0;\n }\n\n async list(namespace: string = 'default'): Promise<string[]> {\n const stmt = this.db.prepare('SELECT key FROM storage WHERE namespace = ? ORDER BY key');\n const rows = stmt.all(namespace);\n return rows.map((row: any) => row.key);\n }\n\n async close(): Promise<void> {\n if (this.db) {\n this.db.close();\n }\n }\n}\n\n/**\n * JSON file-based implementation\n */\nclass JSONProvider implements IDatabaseProvider {\n private data: Record<string, Record<string, any>> = {};\n private dbPath: string;\n\n constructor(dbPath: string) {\n this.dbPath = dbPath;\n }\n\n async initialize(): Promise<void> {\n try {\n if (await fs.pathExists(this.dbPath)) {\n const content = await fs.readJSON(this.dbPath);\n this.data = content || {};\n }\n } catch (error) {\n console.warn('Failed to load JSON database, starting fresh:', error);\n this.data = {};\n }\n }\n\n async store(key: string, value: any, namespace: string = 'default'): Promise<void> {\n if (!this.data[namespace]) {\n this.data[namespace] = {};\n }\n\n this.data[namespace][key] = value;\n await this.persist();\n }\n\n async retrieve(key: string, namespace: string = 'default'): Promise<any> {\n if (!this.data[namespace]) {\n return null;\n }\n return this.data[namespace][key] || null;\n }\n\n async delete(key: string, namespace: string = 'default'): Promise<boolean> {\n if (!this.data[namespace] || !(key in this.data[namespace])) {\n return false;\n }\n\n delete this.data[namespace][key];\n await this.persist();\n return true;\n }\n\n async list(namespace: string = 'default'): Promise<string[]> {\n if (!this.data[namespace]) {\n return [];\n }\n return Object.keys(this.data[namespace]).sort();\n }\n\n async close(): Promise<void> {\n await this.persist();\n }\n\n private async persist(): Promise<void> {\n try {\n await fs.ensureDir(path.dirname(this.dbPath));\n await fs.writeJSON(this.dbPath, this.data, { spaces: 2 });\n } catch (error) {\n console.error('Failed to persist JSON database:', error);\n }\n }\n}"],"names":["fs","path","DatabaseManager","provider","dbType","dbPath","initialized","retryCount","maxRetries","getDefaultPath","initializeSQLiteWithRecovery","JSONProvider","SQLiteProvider","error","errorMsg","Error","message","String","includes","console","warn","replace","baseDir","join","process","cwd","initialize","ensureDir","dirname","log","store","key","value","namespace","retrieve","delete","list","close","getDatabaseType","getDatabasePath","isInitialized","storeJSON","data","JSON","stringify","retrieveJSON","parse","exists","undefined","clear","keys","Promise","all","map","db","Database","require","exec","stmt","prepare","serializedValue","run","row","get","result","changes","rows","pathExists","content","readJSON","persist","Object","sort","writeJSON","spaces"],"mappings":"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"}
@@ -0,0 +1,240 @@
1
+ import { EventEmitter } from 'events';
2
+ import { v4 as uuidv4 } from 'uuid';
3
+ export class MemoryJobPersistence {
4
+ jobs = new Map();
5
+ async save(job) {
6
+ this.jobs.set(job.job_id, {
7
+ ...job
8
+ });
9
+ }
10
+ async load(job_id) {
11
+ const job = this.jobs.get(job_id);
12
+ return job ? {
13
+ ...job
14
+ } : null;
15
+ }
16
+ async list(filter) {
17
+ let jobs = Array.from(this.jobs.values());
18
+ if (filter?.status) {
19
+ jobs = jobs.filter((j)=>j.status === filter.status);
20
+ }
21
+ if (filter?.limit) {
22
+ jobs = jobs.slice(0, filter.limit);
23
+ }
24
+ return jobs;
25
+ }
26
+ async delete(job_id) {
27
+ this.jobs.delete(job_id);
28
+ }
29
+ }
30
+ export class MCPAsyncJobManager extends EventEmitter {
31
+ logger;
32
+ config;
33
+ jobs = new Map();
34
+ executors = new Map();
35
+ persistence;
36
+ constructor(persistence, logger, config = {}){
37
+ super(), this.logger = logger, this.config = config;
38
+ this.persistence = persistence || new MemoryJobPersistence();
39
+ this.config.maxJobs = this.config.maxJobs || 1000;
40
+ this.config.jobTTL = this.config.jobTTL || 86400000;
41
+ this.config.defaultPollInterval = this.config.defaultPollInterval || 5;
42
+ setInterval(()=>this.cleanupExpiredJobs(), 3600000);
43
+ }
44
+ async submitJob(request, executor) {
45
+ if (this.jobs.size >= this.config.maxJobs) {
46
+ throw new Error('Job queue full. Please try again later.');
47
+ }
48
+ const existingJob = Array.from(this.jobs.values()).find((j)=>j.request_id === request.request_id && (j.status === 'queued' || j.status === 'running'));
49
+ if (existingJob) {
50
+ throw new Error(`Duplicate request_id: ${request.request_id}. Job already submitted.`);
51
+ }
52
+ const job = {
53
+ request_id: request.request_id,
54
+ job_id: uuidv4(),
55
+ tool_id: request.tool_id,
56
+ arguments: request.arguments,
57
+ mode: request.mode,
58
+ status: 'queued',
59
+ progress: 0,
60
+ context: request.context,
61
+ created_at: new Date()
62
+ };
63
+ await this.persistence.save(job);
64
+ this.jobs.set(job.job_id, job);
65
+ this.logger.info('Job submitted', {
66
+ job_id: job.job_id,
67
+ request_id: job.request_id,
68
+ tool_id: job.tool_id
69
+ });
70
+ this.executeJob(job, executor);
71
+ return {
72
+ request_id: job.request_id,
73
+ job_id: job.job_id,
74
+ status: 'in_progress',
75
+ poll_after: this.config.defaultPollInterval
76
+ };
77
+ }
78
+ async pollJob(job_id) {
79
+ const job = await this.persistence.load(job_id);
80
+ if (!job) {
81
+ throw new Error(`Job not found: ${job_id}`);
82
+ }
83
+ const status = job.status === 'success' ? 'success' : job.status === 'error' ? 'error' : 'in_progress';
84
+ const handle = {
85
+ request_id: job.request_id,
86
+ job_id: job.job_id,
87
+ status,
88
+ poll_after: status === 'in_progress' ? this.config.defaultPollInterval : 0
89
+ };
90
+ if (status === 'in_progress') {
91
+ handle.progress = {
92
+ percent: job.progress,
93
+ message: job.progress_message
94
+ };
95
+ }
96
+ return handle;
97
+ }
98
+ async resumeJob(job_id) {
99
+ const job = await this.persistence.load(job_id);
100
+ if (!job) {
101
+ throw new Error(`Job not found: ${job_id}`);
102
+ }
103
+ const result = {
104
+ request_id: job.request_id,
105
+ status: job.status === 'success' ? 'success' : job.status === 'error' ? 'error' : 'in_progress',
106
+ metadata: {}
107
+ };
108
+ if (job.status === 'success') {
109
+ result.result = job.result;
110
+ result.metadata.duration_ms = job.completed_at && job.started_at ? job.completed_at.getTime() - job.started_at.getTime() : undefined;
111
+ result.metadata.tokens_used = job.tokens_used;
112
+ } else if (job.status === 'error') {
113
+ result.error = {
114
+ code: 'EXECUTION_ERROR',
115
+ message: job.error?.message || 'Job execution failed',
116
+ details: job.error
117
+ };
118
+ } else {
119
+ result.progress = {
120
+ percent: job.progress,
121
+ message: job.progress_message
122
+ };
123
+ }
124
+ return result;
125
+ }
126
+ async cancelJob(job_id) {
127
+ const job = this.jobs.get(job_id);
128
+ if (!job) {
129
+ return false;
130
+ }
131
+ if (job.status === 'success' || job.status === 'error') {
132
+ return false;
133
+ }
134
+ if (job.abortController) {
135
+ job.abortController.abort();
136
+ }
137
+ job.status = 'cancelled';
138
+ job.completed_at = new Date();
139
+ await this.persistence.save(job);
140
+ this.emit('job:cancelled', job_id);
141
+ this.logger.info('Job cancelled', {
142
+ job_id
143
+ });
144
+ return true;
145
+ }
146
+ async listJobs(filter) {
147
+ return await this.persistence.list(filter);
148
+ }
149
+ async executeJob(job, executor) {
150
+ job.status = 'running';
151
+ job.started_at = new Date();
152
+ job.abortController = new AbortController();
153
+ await this.persistence.save(job);
154
+ this.emit('job:started', job.job_id);
155
+ this.logger.info('Job started', {
156
+ job_id: job.job_id,
157
+ tool_id: job.tool_id
158
+ });
159
+ try {
160
+ const onProgress = (percent, message)=>{
161
+ job.progress = Math.min(100, Math.max(0, percent));
162
+ job.progress_message = message;
163
+ this.persistence.save(job).catch((err)=>this.logger.error('Failed to save progress', {
164
+ job_id: job.job_id,
165
+ error: err
166
+ }));
167
+ this.emit('job:progress', job.job_id, job.progress, message);
168
+ };
169
+ if (job.abortController.signal.aborted) {
170
+ throw new Error('Job cancelled before execution');
171
+ }
172
+ const result = await executor(job.arguments, onProgress);
173
+ job.status = 'success';
174
+ job.result = result;
175
+ job.progress = 100;
176
+ job.completed_at = new Date();
177
+ await this.persistence.save(job);
178
+ this.emit('job:completed', job.job_id, result);
179
+ this.logger.info('Job completed', {
180
+ job_id: job.job_id,
181
+ duration_ms: job.completed_at.getTime() - job.started_at.getTime()
182
+ });
183
+ } catch (error) {
184
+ job.status = 'error';
185
+ job.error = {
186
+ message: error.message,
187
+ stack: error.stack,
188
+ code: error.code
189
+ };
190
+ job.completed_at = new Date();
191
+ await this.persistence.save(job);
192
+ this.emit('job:failed', job.job_id, error);
193
+ this.logger.error('Job failed', {
194
+ job_id: job.job_id,
195
+ error: error.message
196
+ });
197
+ }
198
+ }
199
+ async cleanupExpiredJobs() {
200
+ const now = Date.now();
201
+ const jobs = await this.persistence.list();
202
+ let cleaned = 0;
203
+ for (const job of jobs){
204
+ const age = now - job.created_at.getTime();
205
+ if (age > this.config.jobTTL && job.status !== 'running') {
206
+ await this.persistence.delete(job.job_id);
207
+ this.jobs.delete(job.job_id);
208
+ cleaned++;
209
+ }
210
+ }
211
+ if (cleaned > 0) {
212
+ this.logger.info('Cleaned up expired jobs', {
213
+ count: cleaned
214
+ });
215
+ }
216
+ return cleaned;
217
+ }
218
+ getMetrics() {
219
+ const jobs = Array.from(this.jobs.values());
220
+ return {
221
+ total: jobs.length,
222
+ byStatus: {
223
+ queued: jobs.filter((j)=>j.status === 'queued').length,
224
+ running: jobs.filter((j)=>j.status === 'running').length,
225
+ success: jobs.filter((j)=>j.status === 'success').length,
226
+ error: jobs.filter((j)=>j.status === 'error').length,
227
+ cancelled: jobs.filter((j)=>j.status === 'cancelled').length
228
+ },
229
+ averageDuration: this.calculateAverageDuration(jobs)
230
+ };
231
+ }
232
+ calculateAverageDuration(jobs) {
233
+ const completed = jobs.filter((j)=>(j.status === 'success' || j.status === 'error') && j.started_at && j.completed_at);
234
+ if (completed.length === 0) return 0;
235
+ const total = completed.reduce((sum, j)=>sum + (j.completed_at.getTime() - j.started_at.getTime()), 0);
236
+ return total / completed.length;
237
+ }
238
+ }
239
+
240
+ //# sourceMappingURL=job-manager-mcp25.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/mcp/async/job-manager-mcp25.ts"],"sourcesContent":["/**\n * MCP 2025-11 Async Job Manager\n *\n * Implements async job lifecycle per MCP 2025-11 specification:\n * - Job handles with request_id\n * - Poll/resume semantics\n * - Progress tracking\n * - Job persistence\n */\n\nimport { EventEmitter } from 'events';\nimport { v4 as uuidv4 } from 'uuid';\nimport type { ILogger } from '../../interfaces/logger.js';\n\n/**\n * MCP tool request (2025-11 format)\n */\nexport interface MCPToolRequest {\n request_id: string;\n tool_id: string;\n arguments: Record<string, any>;\n session?: string;\n mode: 'async' | 'sync';\n context?: {\n trace_id?: string;\n client_name?: string;\n [key: string]: any;\n };\n}\n\n/**\n * MCP job handle (2025-11 format)\n */\nexport interface MCPJobHandle {\n request_id: string;\n job_id: string;\n status: 'in_progress' | 'success' | 'error';\n poll_after: number; // seconds\n progress?: {\n percent: number;\n message?: string;\n };\n}\n\n/**\n * MCP job result (2025-11 format)\n */\nexport interface MCPJobResult {\n request_id: string;\n status: 'success' | 'error' | 'in_progress';\n result?: any;\n error?: {\n code: string;\n message: string;\n details?: any;\n };\n progress?: {\n percent: number;\n message?: string;\n };\n metadata: {\n duration_ms?: number;\n tokens_used?: number;\n [key: string]: any;\n };\n}\n\n/**\n * Internal job state\n */\ninterface AsyncJob {\n request_id: string;\n job_id: string;\n tool_id: string;\n arguments: Record<string, any>;\n mode: 'async' | 'sync';\n status: 'queued' | 'running' | 'success' | 'error' | 'cancelled';\n progress: number;\n progress_message?: string;\n result?: any;\n error?: any;\n context?: any;\n created_at: Date;\n started_at?: Date;\n completed_at?: Date;\n tokens_used?: number;\n abortController?: AbortController;\n}\n\n/**\n * Job persistence interface\n */\nexport interface JobPersistence {\n save(job: AsyncJob): Promise<void>;\n load(job_id: string): Promise<AsyncJob | null>;\n list(filter?: { status?: string; limit?: number }): Promise<AsyncJob[]>;\n delete(job_id: string): Promise<void>;\n}\n\n/**\n * Simple in-memory job persistence (fallback)\n */\nexport class MemoryJobPersistence implements JobPersistence {\n private jobs: Map<string, AsyncJob> = new Map();\n\n async save(job: AsyncJob): Promise<void> {\n this.jobs.set(job.job_id, { ...job });\n }\n\n async load(job_id: string): Promise<AsyncJob | null> {\n const job = this.jobs.get(job_id);\n return job ? { ...job } : null;\n }\n\n async list(filter?: { status?: string; limit?: number }): Promise<AsyncJob[]> {\n let jobs = Array.from(this.jobs.values());\n\n if (filter?.status) {\n jobs = jobs.filter(j => j.status === filter.status);\n }\n\n if (filter?.limit) {\n jobs = jobs.slice(0, filter.limit);\n }\n\n return jobs;\n }\n\n async delete(job_id: string): Promise<void> {\n this.jobs.delete(job_id);\n }\n}\n\n/**\n * MCP 2025-11 Async Job Manager\n */\nexport class MCPAsyncJobManager extends EventEmitter {\n private jobs: Map<string, AsyncJob> = new Map();\n private executors: Map<string, Promise<any>> = new Map();\n private persistence: JobPersistence;\n\n constructor(\n persistence: JobPersistence | null,\n private logger: ILogger,\n private config: {\n maxJobs?: number;\n jobTTL?: number;\n defaultPollInterval?: number;\n } = {}\n ) {\n super();\n this.persistence = persistence || new MemoryJobPersistence();\n\n // Default config\n this.config.maxJobs = this.config.maxJobs || 1000;\n this.config.jobTTL = this.config.jobTTL || 86400000; // 24 hours\n this.config.defaultPollInterval = this.config.defaultPollInterval || 5;\n\n // Cleanup expired jobs periodically\n setInterval(() => this.cleanupExpiredJobs(), 3600000); // Every hour\n }\n\n /**\n * Submit async job (MCP 2025-11 format)\n */\n async submitJob(\n request: MCPToolRequest,\n executor: (args: any, onProgress: (percent: number, message?: string) => void) => Promise<any>\n ): Promise<MCPJobHandle> {\n // Check capacity\n if (this.jobs.size >= this.config.maxJobs!) {\n throw new Error('Job queue full. Please try again later.');\n }\n\n // Check for duplicate request_id (prevent race conditions)\n const existingJob = Array.from(this.jobs.values()).find(\n j => j.request_id === request.request_id &&\n (j.status === 'queued' || j.status === 'running')\n );\n if (existingJob) {\n throw new Error(`Duplicate request_id: ${request.request_id}. Job already submitted.`);\n }\n\n // Create job\n const job: AsyncJob = {\n request_id: request.request_id,\n job_id: uuidv4(),\n tool_id: request.tool_id,\n arguments: request.arguments,\n mode: request.mode,\n status: 'queued',\n progress: 0,\n context: request.context,\n created_at: new Date(),\n };\n\n // Save to persistence\n await this.persistence.save(job);\n this.jobs.set(job.job_id, job);\n\n this.logger.info('Job submitted', {\n job_id: job.job_id,\n request_id: job.request_id,\n tool_id: job.tool_id,\n });\n\n // Start execution in background\n this.executeJob(job, executor);\n\n // Return job handle immediately\n return {\n request_id: job.request_id,\n job_id: job.job_id,\n status: 'in_progress',\n poll_after: this.config.defaultPollInterval!,\n };\n }\n\n /**\n * Poll job status\n */\n async pollJob(job_id: string): Promise<MCPJobHandle> {\n const job = await this.persistence.load(job_id);\n\n if (!job) {\n throw new Error(`Job not found: ${job_id}`);\n }\n\n const status = job.status === 'success' ? 'success' :\n job.status === 'error' ? 'error' : 'in_progress';\n\n const handle: MCPJobHandle = {\n request_id: job.request_id,\n job_id: job.job_id,\n status,\n poll_after: status === 'in_progress' ? this.config.defaultPollInterval! : 0,\n };\n\n if (status === 'in_progress') {\n handle.progress = {\n percent: job.progress,\n message: job.progress_message,\n };\n }\n\n return handle;\n }\n\n /**\n * Resume job (get results)\n */\n async resumeJob(job_id: string): Promise<MCPJobResult> {\n const job = await this.persistence.load(job_id);\n\n if (!job) {\n throw new Error(`Job not found: ${job_id}`);\n }\n\n const result: MCPJobResult = {\n request_id: job.request_id,\n status: job.status === 'success' ? 'success' :\n job.status === 'error' ? 'error' : 'in_progress',\n metadata: {},\n };\n\n if (job.status === 'success') {\n result.result = job.result;\n result.metadata.duration_ms = job.completed_at && job.started_at\n ? job.completed_at.getTime() - job.started_at.getTime()\n : undefined;\n result.metadata.tokens_used = job.tokens_used;\n } else if (job.status === 'error') {\n result.error = {\n code: 'EXECUTION_ERROR',\n message: job.error?.message || 'Job execution failed',\n details: job.error,\n };\n } else {\n // Still in progress\n result.progress = {\n percent: job.progress,\n message: job.progress_message,\n };\n }\n\n return result;\n }\n\n /**\n * Cancel a running job\n */\n async cancelJob(job_id: string): Promise<boolean> {\n const job = this.jobs.get(job_id);\n\n if (!job) {\n return false;\n }\n\n if (job.status === 'success' || job.status === 'error') {\n return false; // Already finished\n }\n\n // Abort execution if AbortController is available\n if (job.abortController) {\n job.abortController.abort();\n }\n\n job.status = 'cancelled';\n job.completed_at = new Date();\n await this.persistence.save(job);\n\n this.emit('job:cancelled', job_id);\n this.logger.info('Job cancelled', { job_id });\n\n return true;\n }\n\n /**\n * List jobs\n */\n async listJobs(filter?: {\n status?: string;\n limit?: number;\n }): Promise<AsyncJob[]> {\n return await this.persistence.list(filter);\n }\n\n /**\n * Execute job in background\n */\n private async executeJob(\n job: AsyncJob,\n executor: (args: any, onProgress: (percent: number, message?: string) => void) => Promise<any>\n ): Promise<void> {\n // Update status to running\n job.status = 'running';\n job.started_at = new Date();\n\n // Create AbortController for cancellation support\n job.abortController = new AbortController();\n\n await this.persistence.save(job);\n\n this.emit('job:started', job.job_id);\n this.logger.info('Job started', { job_id: job.job_id, tool_id: job.tool_id });\n\n try {\n // Progress callback\n const onProgress = (percent: number, message?: string) => {\n job.progress = Math.min(100, Math.max(0, percent));\n job.progress_message = message;\n this.persistence.save(job).catch(err =>\n this.logger.error('Failed to save progress', { job_id: job.job_id, error: err })\n );\n this.emit('job:progress', job.job_id, job.progress, message);\n };\n\n // Check if already cancelled\n if (job.abortController.signal.aborted) {\n throw new Error('Job cancelled before execution');\n }\n\n // Execute with abort support\n const result = await executor(job.arguments, onProgress);\n\n // Mark successful\n job.status = 'success';\n job.result = result;\n job.progress = 100;\n job.completed_at = new Date();\n await this.persistence.save(job);\n\n this.emit('job:completed', job.job_id, result);\n this.logger.info('Job completed', {\n job_id: job.job_id,\n duration_ms: job.completed_at.getTime() - job.started_at!.getTime(),\n });\n } catch (error: any) {\n // Mark failed\n job.status = 'error';\n job.error = {\n message: error.message,\n stack: error.stack,\n code: error.code,\n };\n job.completed_at = new Date();\n await this.persistence.save(job);\n\n this.emit('job:failed', job.job_id, error);\n this.logger.error('Job failed', {\n job_id: job.job_id,\n error: error.message,\n });\n }\n }\n\n /**\n * Cleanup expired jobs\n */\n private async cleanupExpiredJobs(): Promise<number> {\n const now = Date.now();\n const jobs = await this.persistence.list();\n let cleaned = 0;\n\n for (const job of jobs) {\n const age = now - job.created_at.getTime();\n\n // Remove if expired and not running\n if (age > this.config.jobTTL! && job.status !== 'running') {\n await this.persistence.delete(job.job_id);\n this.jobs.delete(job.job_id);\n cleaned++;\n }\n }\n\n if (cleaned > 0) {\n this.logger.info('Cleaned up expired jobs', { count: cleaned });\n }\n\n return cleaned;\n }\n\n /**\n * Get metrics\n */\n getMetrics() {\n const jobs = Array.from(this.jobs.values());\n\n return {\n total: jobs.length,\n byStatus: {\n queued: jobs.filter(j => j.status === 'queued').length,\n running: jobs.filter(j => j.status === 'running').length,\n success: jobs.filter(j => j.status === 'success').length,\n error: jobs.filter(j => j.status === 'error').length,\n cancelled: jobs.filter(j => j.status === 'cancelled').length,\n },\n averageDuration: this.calculateAverageDuration(jobs),\n };\n }\n\n private calculateAverageDuration(jobs: AsyncJob[]): number {\n const completed = jobs.filter(j =>\n (j.status === 'success' || j.status === 'error') &&\n j.started_at && j.completed_at\n );\n\n if (completed.length === 0) return 0;\n\n const total = completed.reduce((sum, j) =>\n sum + (j.completed_at!.getTime() - j.started_at!.getTime()), 0\n );\n\n return total / completed.length;\n }\n}\n"],"names":["EventEmitter","v4","uuidv4","MemoryJobPersistence","jobs","Map","save","job","set","job_id","load","get","list","filter","Array","from","values","status","j","limit","slice","delete","MCPAsyncJobManager","executors","persistence","logger","config","maxJobs","jobTTL","defaultPollInterval","setInterval","cleanupExpiredJobs","submitJob","request","executor","size","Error","existingJob","find","request_id","tool_id","arguments","mode","progress","context","created_at","Date","info","executeJob","poll_after","pollJob","handle","percent","message","progress_message","resumeJob","result","metadata","duration_ms","completed_at","started_at","getTime","undefined","tokens_used","error","code","details","cancelJob","abortController","abort","emit","listJobs","AbortController","onProgress","Math","min","max","catch","err","signal","aborted","stack","now","cleaned","age","count","getMetrics","total","length","byStatus","queued","running","success","cancelled","averageDuration","calculateAverageDuration","completed","reduce","sum"],"mappings":"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"}
@@ -2,6 +2,14 @@ export { InProcessMCPServer, createInProcessServer } from './in-process-server.j
2
2
  export { ClaudeFlowToolRegistry, createToolRegistry, createClaudeFlowSdkServer } from './tool-registry.js';
3
3
  export { SDKIntegration, initializeSDKIntegration, getSDKIntegration, createInProcessQuery, getInProcessServerConfig, measurePerformance } from './sdk-integration.js';
4
4
  export { MCPServer } from './server.js';
5
+ export { MCP2025Server } from './server-mcp-2025.js';
6
+ export { MCPServerFactory, createMCPServer, isMCP2025Available, getServerCapabilities } from './server-factory.js';
7
+ export { VersionNegotiator, BackwardCompatibilityAdapter } from './protocol/version-negotiation.js';
8
+ export { MCPAsyncJobManager } from './async/job-manager-mcp25.js';
9
+ export { MCPRegistryClient } from './registry/mcp-registry-client-2025.js';
10
+ export { SchemaValidator, upgradeToolSchema } from './validation/schema-validator-2025.js';
11
+ export { ProgressiveToolRegistry, createProgressiveToolRegistry, createProgressiveClaudeFlowSdkServer } from './tool-registry-progressive.js';
12
+ export { DynamicToolLoader } from './tools/loader.js';
5
13
  export { MCPLifecycleManager, LifecycleState } from './lifecycle-manager.js';
6
14
  export { ToolRegistry } from './tools.js';
7
15
  export { MCPProtocolManager } from './protocol-manager.js';