@weavelogic/knowledge-graph-agent 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/README.md +290 -3
  2. package/dist/_virtual/index10.js +2 -2
  3. package/dist/_virtual/index6.js +2 -2
  4. package/dist/_virtual/index7.js +2 -2
  5. package/dist/_virtual/index8.js +2 -2
  6. package/dist/_virtual/index9.js +2 -2
  7. package/dist/audit/config.d.ts +150 -0
  8. package/dist/audit/config.d.ts.map +1 -0
  9. package/dist/audit/config.js +111 -0
  10. package/dist/audit/config.js.map +1 -0
  11. package/dist/audit/index.d.ts +38 -0
  12. package/dist/audit/index.d.ts.map +1 -0
  13. package/dist/audit/services/audit-chain.d.ts +276 -0
  14. package/dist/audit/services/audit-chain.d.ts.map +1 -0
  15. package/dist/audit/services/audit-chain.js +502 -0
  16. package/dist/audit/services/audit-chain.js.map +1 -0
  17. package/dist/audit/services/index.d.ts +11 -0
  18. package/dist/audit/services/index.d.ts.map +1 -0
  19. package/dist/audit/services/syndication.d.ts +334 -0
  20. package/dist/audit/services/syndication.d.ts.map +1 -0
  21. package/dist/audit/services/syndication.js +589 -0
  22. package/dist/audit/services/syndication.js.map +1 -0
  23. package/dist/audit/types.d.ts +453 -0
  24. package/dist/audit/types.d.ts.map +1 -0
  25. package/dist/cli/commands/audit.d.ts +21 -0
  26. package/dist/cli/commands/audit.d.ts.map +1 -0
  27. package/dist/cli/commands/audit.js +621 -0
  28. package/dist/cli/commands/audit.js.map +1 -0
  29. package/dist/cli/commands/vector.d.ts +14 -0
  30. package/dist/cli/commands/vector.d.ts.map +1 -0
  31. package/dist/cli/commands/vector.js +429 -0
  32. package/dist/cli/commands/vector.js.map +1 -0
  33. package/dist/cli/commands/workflow.d.ts +12 -0
  34. package/dist/cli/commands/workflow.d.ts.map +1 -0
  35. package/dist/cli/commands/workflow.js +471 -0
  36. package/dist/cli/commands/workflow.js.map +1 -0
  37. package/dist/cli/index.d.ts.map +1 -1
  38. package/dist/cli/index.js +26 -0
  39. package/dist/cli/index.js.map +1 -1
  40. package/dist/database/schemas/index.d.ts +85 -0
  41. package/dist/database/schemas/index.d.ts.map +1 -0
  42. package/dist/index.d.ts +2 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +9 -0
  45. package/dist/index.js.map +1 -1
  46. package/dist/mcp-server/tools/audit/checkpoint.d.ts +58 -0
  47. package/dist/mcp-server/tools/audit/checkpoint.d.ts.map +1 -0
  48. package/dist/mcp-server/tools/audit/checkpoint.js +73 -0
  49. package/dist/mcp-server/tools/audit/checkpoint.js.map +1 -0
  50. package/dist/mcp-server/tools/audit/index.d.ts +53 -0
  51. package/dist/mcp-server/tools/audit/index.d.ts.map +1 -0
  52. package/dist/mcp-server/tools/audit/index.js +12 -0
  53. package/dist/mcp-server/tools/audit/index.js.map +1 -0
  54. package/dist/mcp-server/tools/audit/query.d.ts +58 -0
  55. package/dist/mcp-server/tools/audit/query.d.ts.map +1 -0
  56. package/dist/mcp-server/tools/audit/query.js +125 -0
  57. package/dist/mcp-server/tools/audit/query.js.map +1 -0
  58. package/dist/mcp-server/tools/audit/sync.d.ts +58 -0
  59. package/dist/mcp-server/tools/audit/sync.d.ts.map +1 -0
  60. package/dist/mcp-server/tools/audit/sync.js +126 -0
  61. package/dist/mcp-server/tools/audit/sync.js.map +1 -0
  62. package/dist/mcp-server/tools/index.d.ts +3 -0
  63. package/dist/mcp-server/tools/index.d.ts.map +1 -1
  64. package/dist/mcp-server/tools/registry.js +90 -0
  65. package/dist/mcp-server/tools/registry.js.map +1 -1
  66. package/dist/mcp-server/tools/vector/index.d.ts +12 -0
  67. package/dist/mcp-server/tools/vector/index.d.ts.map +1 -0
  68. package/dist/mcp-server/tools/vector/index.js +12 -0
  69. package/dist/mcp-server/tools/vector/index.js.map +1 -0
  70. package/dist/mcp-server/tools/vector/search.d.ts +41 -0
  71. package/dist/mcp-server/tools/vector/search.d.ts.map +1 -0
  72. package/dist/mcp-server/tools/vector/search.js +224 -0
  73. package/dist/mcp-server/tools/vector/search.js.map +1 -0
  74. package/dist/mcp-server/tools/vector/trajectory.d.ts +39 -0
  75. package/dist/mcp-server/tools/vector/trajectory.d.ts.map +1 -0
  76. package/dist/mcp-server/tools/vector/trajectory.js +170 -0
  77. package/dist/mcp-server/tools/vector/trajectory.js.map +1 -0
  78. package/dist/mcp-server/tools/vector/upsert.d.ts +44 -0
  79. package/dist/mcp-server/tools/vector/upsert.d.ts.map +1 -0
  80. package/dist/mcp-server/tools/vector/upsert.js +175 -0
  81. package/dist/mcp-server/tools/vector/upsert.js.map +1 -0
  82. package/dist/mcp-server/tools/workflow/index.d.ts +29 -0
  83. package/dist/mcp-server/tools/workflow/index.d.ts.map +1 -0
  84. package/dist/mcp-server/tools/workflow/index.js +12 -0
  85. package/dist/mcp-server/tools/workflow/index.js.map +1 -0
  86. package/dist/mcp-server/tools/workflow/list.d.ts +41 -0
  87. package/dist/mcp-server/tools/workflow/list.d.ts.map +1 -0
  88. package/dist/mcp-server/tools/workflow/list.js +195 -0
  89. package/dist/mcp-server/tools/workflow/list.js.map +1 -0
  90. package/dist/mcp-server/tools/workflow/start.d.ts +40 -0
  91. package/dist/mcp-server/tools/workflow/start.d.ts.map +1 -0
  92. package/dist/mcp-server/tools/workflow/start.js +165 -0
  93. package/dist/mcp-server/tools/workflow/start.js.map +1 -0
  94. package/dist/mcp-server/tools/workflow/status.d.ts +38 -0
  95. package/dist/mcp-server/tools/workflow/status.d.ts.map +1 -0
  96. package/dist/mcp-server/tools/workflow/status.js +97 -0
  97. package/dist/mcp-server/tools/workflow/status.js.map +1 -0
  98. package/dist/node_modules/ajv/dist/compile/index.js +1 -1
  99. package/dist/node_modules/ajv/dist/vocabularies/applicator/index.js +1 -1
  100. package/dist/node_modules/ajv/dist/vocabularies/core/index.js +1 -1
  101. package/dist/node_modules/ajv/dist/vocabularies/format/index.js +1 -1
  102. package/dist/node_modules/ajv/dist/vocabularies/validation/index.js +1 -1
  103. package/dist/vector/config.d.ts +300 -0
  104. package/dist/vector/config.d.ts.map +1 -0
  105. package/dist/vector/config.js +124 -0
  106. package/dist/vector/config.js.map +1 -0
  107. package/dist/vector/index.d.ts +50 -0
  108. package/dist/vector/index.d.ts.map +1 -0
  109. package/dist/vector/services/index.d.ts +13 -0
  110. package/dist/vector/services/index.d.ts.map +1 -0
  111. package/dist/vector/services/trajectory-tracker.d.ts +405 -0
  112. package/dist/vector/services/trajectory-tracker.d.ts.map +1 -0
  113. package/dist/vector/services/trajectory-tracker.js +445 -0
  114. package/dist/vector/services/trajectory-tracker.js.map +1 -0
  115. package/dist/vector/services/vector-store.d.ts +339 -0
  116. package/dist/vector/services/vector-store.d.ts.map +1 -0
  117. package/dist/vector/services/vector-store.js +748 -0
  118. package/dist/vector/services/vector-store.js.map +1 -0
  119. package/dist/vector/types.d.ts +677 -0
  120. package/dist/vector/types.d.ts.map +1 -0
  121. package/dist/workflow/adapters/goap-adapter.d.ts +196 -0
  122. package/dist/workflow/adapters/goap-adapter.d.ts.map +1 -0
  123. package/dist/workflow/adapters/goap-adapter.js +706 -0
  124. package/dist/workflow/adapters/goap-adapter.js.map +1 -0
  125. package/dist/workflow/adapters/index.d.ts +10 -0
  126. package/dist/workflow/adapters/index.d.ts.map +1 -0
  127. package/dist/workflow/config.d.ts +135 -0
  128. package/dist/workflow/config.d.ts.map +1 -0
  129. package/dist/workflow/config.js +92 -0
  130. package/dist/workflow/config.js.map +1 -0
  131. package/dist/workflow/handlers/index.d.ts +9 -0
  132. package/dist/workflow/handlers/index.d.ts.map +1 -0
  133. package/dist/workflow/handlers/webhook-handlers.d.ts +397 -0
  134. package/dist/workflow/handlers/webhook-handlers.d.ts.map +1 -0
  135. package/dist/workflow/handlers/webhook-handlers.js +454 -0
  136. package/dist/workflow/handlers/webhook-handlers.js.map +1 -0
  137. package/dist/workflow/index.d.ts +42 -0
  138. package/dist/workflow/index.d.ts.map +1 -0
  139. package/dist/workflow/services/index.d.ts +9 -0
  140. package/dist/workflow/services/index.d.ts.map +1 -0
  141. package/dist/workflow/services/workflow-service.d.ts +318 -0
  142. package/dist/workflow/services/workflow-service.d.ts.map +1 -0
  143. package/dist/workflow/services/workflow-service.js +577 -0
  144. package/dist/workflow/services/workflow-service.js.map +1 -0
  145. package/dist/workflow/types.d.ts +470 -0
  146. package/dist/workflow/types.d.ts.map +1 -0
  147. package/dist/workflow/workflows/realtime-collab.d.ts +245 -0
  148. package/dist/workflow/workflows/realtime-collab.d.ts.map +1 -0
  149. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector.js","sources":["../../../src/cli/commands/vector.ts"],"sourcesContent":["/**\n * Vector Command\n *\n * CLI commands for vector operations including semantic search,\n * vector store statistics, index management, and trajectory tracking.\n *\n * @module cli/commands/vector\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport {\n createVectorStore,\n createTrajectoryTracker,\n type VectorIndexStats,\n type SearchResult,\n type AgentTrajectory,\n type DetectedPattern,\n} from '../../vector/index.js';\nimport { validateProjectRoot } from '../../core/security.js';\n\n/**\n * Format bytes to human-readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;\n}\n\n/**\n * Format duration in milliseconds to human-readable string\n */\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(2)}s`;\n if (ms < 3600000) return `${(ms / 60000).toFixed(2)}m`;\n return `${(ms / 3600000).toFixed(2)}h`;\n}\n\n/**\n * Format table row with padding\n */\nfunction formatRow(cells: string[], widths: number[]): string {\n return cells.map((cell, i) => cell.padEnd(widths[i])).join(' ');\n}\n\n/**\n * Print a table with headers and rows\n */\nfunction printTable(\n headers: string[],\n rows: string[][],\n options: { indent?: number; headerColor?: typeof chalk.white } = {}\n): void {\n const indent = ' '.repeat(options.indent ?? 1);\n const headerColor = options.headerColor ?? chalk.white;\n\n // Calculate column widths\n const widths = headers.map((h, i) => {\n const maxRowWidth = Math.max(...rows.map((r) => (r[i] || '').length));\n return Math.max(h.length, maxRowWidth);\n });\n\n // Print header\n console.log(indent + headerColor(formatRow(headers, widths)));\n console.log(indent + chalk.gray('-'.repeat(widths.reduce((a, b) => a + b + 2, 0))));\n\n // Print rows\n for (const row of rows) {\n console.log(indent + chalk.gray(formatRow(row, widths)));\n }\n}\n\n/**\n * Create vector command group\n */\nexport function createVectorCommand(): Command {\n const vector = new Command('vector')\n .alias('vec')\n .description('Vector operations for semantic search and trajectory tracking');\n\n // Search subcommand\n vector\n .command('search <query>')\n .description('Perform semantic search on vector store')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-k, --top-k <n>', 'Number of results to return', '10')\n .option('-t, --type <type>', 'Filter by node type')\n .option('--hybrid', 'Enable hybrid search (combines vector + graph)')\n .option('--min-score <score>', 'Minimum similarity score (0-1)', '0')\n .option('--json', 'Output as JSON')\n .action(async (query, options) => {\n const spinner = ora('Searching vectors...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const topK = parseInt(options.topK, 10) || 10;\n const minScore = parseFloat(options.minScore) || 0;\n\n // Create vector store\n const store = createVectorStore();\n await store.initialize();\n\n // Check if we have vectors\n const stats = store.getStats();\n if (stats.totalVectors === 0) {\n spinner.warn('Vector store is empty');\n console.log(chalk.gray(' No vectors have been indexed yet.'));\n console.log(chalk.gray(' Run ') + chalk.cyan('kg vector rebuild') + chalk.gray(' to index vectors.'));\n return;\n }\n\n spinner.text = 'Generating query embedding...';\n\n // For now, create a mock embedding from the query\n // In production, this would use an actual embedding model\n const queryEmbedding = createMockEmbedding(query, stats.dimensions);\n\n spinner.text = `Searching ${stats.totalVectors} vectors...`;\n\n let results: SearchResult[];\n\n if (options.hybrid) {\n // Hybrid search\n const hybridResults = await store.hybridSearch({\n embedding: queryEmbedding,\n limit: topK,\n minScore,\n filters: options.type ? { type: options.type } : undefined,\n });\n results = hybridResults;\n } else {\n // Standard vector search\n results = await store.search({\n vector: queryEmbedding,\n k: topK,\n minScore,\n filter: options.type ? { type: options.type } : undefined,\n });\n }\n\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(results, null, 2));\n return;\n }\n\n console.log(chalk.cyan(`\\n Search Results for \"${query}\"\\n`));\n\n if (results.length === 0) {\n console.log(chalk.gray(' No results found'));\n return;\n }\n\n console.log(chalk.gray(` Found ${results.length} result${results.length === 1 ? '' : 's'}\\n`));\n\n // Display results as a table\n const headers = ['#', 'ID', 'Score', 'Type', 'Metadata'];\n const rows = results.map((r, i) => [\n String(i + 1),\n r.id.substring(0, 24) + (r.id.length > 24 ? '...' : ''),\n r.score.toFixed(4),\n (r.metadata?.type as string) || '-',\n Object.keys(r.metadata || {}).length > 0\n ? Object.keys(r.metadata).slice(0, 3).join(', ')\n : '-',\n ]);\n\n printTable(headers, rows);\n\n // Show detailed metadata for top results\n console.log(chalk.white('\\n Top Result Details:\\n'));\n const top = results[0];\n console.log(chalk.gray(` ID: ${top.id}`));\n console.log(chalk.gray(` Score: ${top.score.toFixed(6)}`));\n if (top.distance !== undefined) {\n console.log(chalk.gray(` Distance: ${top.distance.toFixed(6)}`));\n }\n if (Object.keys(top.metadata || {}).length > 0) {\n console.log(chalk.gray(' Metadata:'));\n for (const [key, value] of Object.entries(top.metadata)) {\n const displayValue = typeof value === 'object' ? JSON.stringify(value) : String(value);\n console.log(chalk.gray(` ${key}: ${displayValue.substring(0, 50)}`));\n }\n }\n\n console.log();\n } catch (error) {\n spinner.fail('Search failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n // Stats subcommand\n vector\n .command('stats')\n .description('Display vector store statistics')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const projectRoot = validateProjectRoot(options.path);\n\n // Create vector store\n const store = createVectorStore();\n await store.initialize();\n\n const stats = store.getStats();\n\n if (options.json) {\n console.log(JSON.stringify(stats, null, 2));\n return;\n }\n\n console.log(chalk.cyan.bold('\\n Vector Store Statistics\\n'));\n\n // Overview\n console.log(chalk.white(' Overview'));\n console.log(chalk.gray(` Total Vectors: ${stats.totalVectors.toLocaleString()}`));\n console.log(chalk.gray(` Dimensions: ${stats.dimensions}`));\n console.log(chalk.gray(` Index Type: ${stats.indexType.toUpperCase()}`));\n console.log(chalk.gray(` Memory Usage: ${formatBytes(stats.memoryUsage)}`));\n console.log(chalk.gray(` Last Updated: ${stats.lastUpdated.toISOString()}`));\n\n // Index stats\n if (stats.indexStats) {\n console.log();\n console.log(chalk.white(' Index Configuration'));\n if (stats.indexStats.levels !== undefined) {\n console.log(chalk.gray(` HNSW Levels: ${stats.indexStats.levels}`));\n }\n if (stats.indexStats.entryPoint) {\n console.log(chalk.gray(` Entry Point: ${stats.indexStats.entryPoint.substring(0, 24)}...`));\n }\n if (stats.indexStats.avgConnections !== undefined) {\n console.log(chalk.gray(` Avg Connections: ${stats.indexStats.avgConnections.toFixed(2)}`));\n }\n }\n\n // Namespace breakdown\n if (stats.namespaces && Object.keys(stats.namespaces).length > 0) {\n console.log();\n console.log(chalk.white(' Namespaces'));\n for (const [ns, count] of Object.entries(stats.namespaces)) {\n const bar = '|'.repeat(Math.min(count, 30));\n console.log(chalk.gray(` ${ns.padEnd(15)} ${String(count).padStart(6)} ${chalk.blue(bar)}`));\n }\n }\n\n // Performance hints\n console.log();\n console.log(chalk.white(' Performance'));\n if (stats.totalVectors === 0) {\n console.log(chalk.yellow(' [!] Vector store is empty'));\n console.log(chalk.gray(' Run \"kg vector rebuild\" to populate the index'));\n } else if (stats.totalVectors < 100) {\n console.log(chalk.green(' [OK] Small index - linear search may be faster'));\n } else if (stats.totalVectors < 10000) {\n console.log(chalk.green(' [OK] Medium index - HNSW optimal'));\n } else {\n console.log(chalk.yellow(' [!] Large index - consider quantization'));\n }\n\n console.log();\n } catch (error) {\n console.error(chalk.red('Failed to get stats:'), String(error));\n process.exit(1);\n }\n });\n\n // Rebuild subcommand\n vector\n .command('rebuild')\n .description('Rebuild vector index from knowledge graph')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('--force', 'Force rebuild even if index exists')\n .option('--batch-size <size>', 'Batch size for indexing', '100')\n .option('-v, --verbose', 'Verbose output')\n .action(async (options) => {\n const spinner = ora('Rebuilding vector index...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const batchSize = parseInt(options.batchSize, 10) || 100;\n\n // Create vector store\n const store = createVectorStore();\n await store.initialize();\n\n const existingStats = store.getStats();\n\n if (existingStats.totalVectors > 0 && !options.force) {\n spinner.warn(`Index already contains ${existingStats.totalVectors} vectors`);\n console.log(chalk.gray(' Use --force to rebuild anyway'));\n return;\n }\n\n if (options.force && existingStats.totalVectors > 0) {\n spinner.text = 'Clearing existing index...';\n await store.clear();\n }\n\n // In a real implementation, this would:\n // 1. Read nodes from the knowledge graph database\n // 2. Generate embeddings for each node\n // 3. Insert vectors in batches\n\n spinner.text = 'Scanning knowledge graph...';\n\n // Simulate rebuild process\n const kgPath = join(projectRoot, '.kg', 'knowledge.db');\n if (!existsSync(kgPath)) {\n spinner.fail('Knowledge graph not found');\n console.log(chalk.gray(' Run ') + chalk.cyan('kg graph') + chalk.gray(' first'));\n return;\n }\n\n // Mock rebuild with progress\n spinner.text = 'Generating embeddings...';\n\n // For demonstration, we show what would happen\n spinner.succeed('Vector index rebuild complete');\n\n console.log();\n console.log(chalk.white(' Rebuild Summary'));\n console.log(chalk.gray(` Vectors indexed: 0 (mock - no embedding model configured)`));\n console.log(chalk.gray(` Batch size: ${batchSize}`));\n console.log(chalk.gray(` Project root: ${projectRoot}`));\n\n console.log();\n console.log(chalk.yellow(' Note: Full vector indexing requires an embedding model.'));\n console.log(chalk.gray(' Configure OPENAI_API_KEY or use local embeddings.'));\n console.log();\n\n } catch (error) {\n spinner.fail('Rebuild failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n // Trajectory subcommand group\n const trajectory = vector\n .command('trajectory')\n .alias('traj')\n .description('Agent trajectory tracking operations');\n\n // trajectory list\n trajectory\n .command('list')\n .description('List recorded agent trajectories')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-a, --agent <id>', 'Filter by agent ID')\n .option('-w, --workflow <id>', 'Filter by workflow ID')\n .option('-l, --limit <n>', 'Maximum number of trajectories', '20')\n .option('--success', 'Show only successful trajectories')\n .option('--failed', 'Show only failed trajectories')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const limit = parseInt(options.limit, 10) || 20;\n\n // Create trajectory tracker\n const tracker = createTrajectoryTracker({\n maxTrajectories: 1000,\n enableAutoLearning: true,\n });\n\n const stats = tracker.getStats();\n\n if (options.json) {\n const exported = tracker.export();\n let trajectories = exported.trajectories;\n\n if (options.agent) {\n trajectories = trajectories.filter((t) => t.agentId === options.agent);\n }\n if (options.workflow) {\n trajectories = trajectories.filter((t) => t.workflowId === options.workflow);\n }\n if (options.success) {\n trajectories = trajectories.filter((t) => t.success);\n }\n if (options.failed) {\n trajectories = trajectories.filter((t) => !t.success);\n }\n\n console.log(JSON.stringify(trajectories.slice(0, limit), null, 2));\n return;\n }\n\n console.log(chalk.cyan.bold('\\n Agent Trajectories\\n'));\n\n // Overview stats\n console.log(chalk.white(' Overview'));\n console.log(chalk.gray(` Active: ${stats.activeTrajectories}`));\n console.log(chalk.gray(` Completed: ${stats.completedTrajectories}`));\n console.log(chalk.gray(` Success: ${(stats.successRate * 100).toFixed(1)}%`));\n console.log(chalk.gray(` Avg Duration: ${formatDuration(stats.avgDuration)}`));\n console.log(chalk.gray(` Patterns: ${stats.detectedPatterns}`));\n\n // Get trajectories\n const exported = tracker.export();\n let trajectories = exported.trajectories;\n\n if (options.agent) {\n trajectories = trajectories.filter((t) => t.agentId === options.agent);\n }\n if (options.workflow) {\n trajectories = trajectories.filter((t) => t.workflowId === options.workflow);\n }\n if (options.success) {\n trajectories = trajectories.filter((t) => t.success);\n }\n if (options.failed) {\n trajectories = trajectories.filter((t) => !t.success);\n }\n\n trajectories = trajectories.slice(-limit).reverse();\n\n if (trajectories.length === 0) {\n console.log();\n console.log(chalk.gray(' No trajectories found'));\n console.log(chalk.gray(' Trajectories are recorded during agent operations.'));\n console.log();\n return;\n }\n\n console.log();\n console.log(chalk.white(` Recent Trajectories (${trajectories.length})`));\n\n const headers = ['ID', 'Agent', 'Steps', 'Duration', 'Status'];\n const rows = trajectories.map((t) => [\n t.id.substring(0, 16) + '...',\n t.agentId.substring(0, 12) + (t.agentId.length > 12 ? '...' : ''),\n String(t.steps.length),\n formatDuration(t.totalDuration),\n t.success ? chalk.green('OK') : chalk.red('FAIL'),\n ]);\n\n printTable(headers, rows);\n console.log();\n\n } catch (error) {\n console.error(chalk.red('Failed to list trajectories:'), String(error));\n process.exit(1);\n }\n });\n\n // trajectory show\n trajectory\n .command('show <id>')\n .description('Show detailed trajectory information')\n .option('--json', 'Output as JSON')\n .action(async (id, options) => {\n try {\n // Create trajectory tracker\n const tracker = createTrajectoryTracker({\n maxTrajectories: 1000,\n enableAutoLearning: true,\n });\n\n const trajectory = tracker.getTrajectory(id);\n\n if (!trajectory) {\n console.log(chalk.yellow(`\\n Trajectory not found: ${id}\\n`));\n console.log(chalk.gray(' Use \"kg vector trajectory list\" to see available trajectories.'));\n console.log();\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(trajectory, null, 2));\n return;\n }\n\n console.log(chalk.cyan.bold('\\n Trajectory Details\\n'));\n\n // Basic info\n console.log(chalk.white(' Information'));\n console.log(chalk.gray(` ID: ${trajectory.id}`));\n console.log(chalk.gray(` Agent: ${trajectory.agentId}`));\n if (trajectory.workflowId) {\n console.log(chalk.gray(` Workflow: ${trajectory.workflowId}`));\n }\n console.log(chalk.gray(` Started: ${trajectory.startedAt.toISOString()}`));\n if (trajectory.completedAt) {\n console.log(chalk.gray(` Completed: ${trajectory.completedAt.toISOString()}`));\n }\n console.log(chalk.gray(` Duration: ${formatDuration(trajectory.totalDuration)}`));\n console.log(\n chalk.gray(' Status: ') +\n (trajectory.success ? chalk.green('SUCCESS') : chalk.red('FAILED'))\n );\n\n // Steps\n if (trajectory.steps.length > 0) {\n console.log();\n console.log(chalk.white(` Steps (${trajectory.steps.length})`));\n\n const stepHeaders = ['#', 'Action', 'Outcome', 'Duration'];\n const stepRows = trajectory.steps.map((s, i) => [\n String(i + 1),\n s.action.substring(0, 30) + (s.action.length > 30 ? '...' : ''),\n s.outcome === 'success'\n ? chalk.green(s.outcome)\n : s.outcome === 'failure'\n ? chalk.red(s.outcome)\n : chalk.yellow(s.outcome),\n formatDuration(s.duration),\n ]);\n\n printTable(stepHeaders, stepRows);\n }\n\n // Metadata\n if (trajectory.metadata && Object.keys(trajectory.metadata).length > 0) {\n console.log();\n console.log(chalk.white(' Metadata'));\n for (const [key, value] of Object.entries(trajectory.metadata)) {\n const displayValue = typeof value === 'object' ? JSON.stringify(value) : String(value);\n console.log(chalk.gray(` ${key}: ${displayValue.substring(0, 60)}`));\n }\n }\n\n console.log();\n } catch (error) {\n console.error(chalk.red('Failed to show trajectory:'), String(error));\n process.exit(1);\n }\n });\n\n // trajectory patterns\n trajectory\n .command('patterns')\n .description('Show detected action patterns')\n .option('--min-confidence <n>', 'Minimum confidence threshold (0-1)', '0.5')\n .option('--type <type>', 'Filter by pattern type (success, failure, optimization)')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const minConfidence = parseFloat(options.minConfidence) || 0.5;\n\n // Create trajectory tracker\n const tracker = createTrajectoryTracker({\n maxTrajectories: 1000,\n enableAutoLearning: true,\n });\n\n const patterns = tracker.getPatterns({\n minConfidence,\n type: options.type as 'success' | 'failure' | 'optimization' | undefined,\n });\n\n if (options.json) {\n console.log(JSON.stringify(patterns, null, 2));\n return;\n }\n\n console.log(chalk.cyan.bold('\\n Detected Patterns\\n'));\n\n if (patterns.length === 0) {\n console.log(chalk.gray(' No patterns detected yet.'));\n console.log(chalk.gray(' Patterns are learned from successful agent trajectories.'));\n console.log();\n return;\n }\n\n const headers = ['ID', 'Type', 'Frequency', 'Success', 'Confidence'];\n const rows = patterns.map((p) => [\n p.id.substring(0, 30) + (p.id.length > 30 ? '...' : ''),\n p.type,\n String(p.frequency),\n `${(p.successRate * 100).toFixed(0)}%`,\n `${(p.confidence * 100).toFixed(0)}%`,\n ]);\n\n printTable(headers, rows);\n\n // Show top pattern details\n if (patterns.length > 0) {\n const top = patterns[0];\n console.log();\n console.log(chalk.white(' Top Pattern Details'));\n console.log(chalk.gray(` ID: ${top.id}`));\n console.log(chalk.gray(` Actions: ${top.actions.join(' -> ')}`));\n console.log(chalk.gray(` Avg Duration: ${formatDuration(top.avgDuration)}`));\n }\n\n console.log();\n } catch (error) {\n console.error(chalk.red('Failed to show patterns:'), String(error));\n process.exit(1);\n }\n });\n\n // trajectory clear\n trajectory\n .command('clear')\n .description('Clear all trajectory data')\n .option('--confirm', 'Confirm clearing without prompt')\n .action(async (options) => {\n try {\n if (!options.confirm) {\n console.log(chalk.yellow('\\n Warning: This will delete all trajectory data.\\n'));\n console.log(chalk.gray(' Use --confirm to proceed.'));\n console.log();\n return;\n }\n\n const tracker = createTrajectoryTracker();\n tracker.clear();\n\n console.log(chalk.green('\\n Trajectory data cleared.\\n'));\n } catch (error) {\n console.error(chalk.red('Failed to clear trajectories:'), String(error));\n process.exit(1);\n }\n });\n\n return vector;\n}\n\n/**\n * Create a mock embedding from text\n *\n * This is a placeholder that creates deterministic pseudo-embeddings\n * based on the text content. In production, this would use an actual\n * embedding model (OpenAI, Cohere, local models, etc.)\n *\n * @param text - Text to embed\n * @param dimensions - Number of dimensions\n * @returns Mock embedding vector\n */\nfunction createMockEmbedding(text: string, dimensions: number): number[] {\n const embedding: number[] = [];\n const normalized = text.toLowerCase().trim();\n\n // Simple hash-based pseudo-embedding\n for (let i = 0; i < dimensions; i++) {\n let value = 0;\n for (let j = 0; j < normalized.length; j++) {\n const charCode = normalized.charCodeAt(j);\n value += Math.sin(charCode * (i + 1) * 0.1) * Math.cos(j * 0.3);\n }\n // Normalize to [-1, 1] range\n embedding.push(Math.tanh(value / Math.max(1, normalized.length)));\n }\n\n // L2 normalize\n const norm = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0));\n return embedding.map((v) => v / (norm || 1));\n}\n"],"names":["exported","trajectories","trajectory"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Workflow Command
3
+ *
4
+ * Manage knowledge graph workflows for automated processing,
5
+ * analysis, and synchronization tasks.
6
+ */
7
+ import { Command } from 'commander';
8
+ /**
9
+ * Create workflow command with subcommands
10
+ */
11
+ export declare function createWorkflowCommand(): Command;
12
+ //# sourceMappingURL=workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/workflow.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgDpC;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CA+Z/C"}
@@ -0,0 +1,471 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { randomUUID } from "crypto";
5
+ const workflows = /* @__PURE__ */ new Map();
6
+ const VALID_WORKFLOW_TYPES = [
7
+ "analysis",
8
+ "sync",
9
+ "generation",
10
+ "validation",
11
+ "migration"
12
+ ];
13
+ function createWorkflowCommand() {
14
+ const workflow = new Command("workflow").alias("wf").description("Manage knowledge graph workflows");
15
+ workflow.command("start <type>").description("Start a new workflow").addHelpText("after", `
16
+ Workflow Types:
17
+ analysis - Analyze codebase and extract knowledge
18
+ sync - Synchronize with external systems
19
+ generation - Generate knowledge graph artifacts
20
+ validation - Validate graph integrity and structure
21
+ migration - Migrate data between formats
22
+
23
+ Examples:
24
+ $ kg workflow start analysis
25
+ $ kg workflow start sync --input '{"namespace": "myproject"}'
26
+ $ kg workflow start generation --async
27
+ `).option("-i, --input <json>", "Input data as JSON").option("-a, --async", "Run workflow asynchronously").option("--dry-run", "Preview workflow without executing").action(async (type, options) => {
28
+ const spinner = ora("Starting workflow...").start();
29
+ try {
30
+ if (!VALID_WORKFLOW_TYPES.includes(type)) {
31
+ spinner.fail(`Invalid workflow type: ${type}`);
32
+ console.log(
33
+ chalk.gray("\n Valid types: ") + chalk.cyan(VALID_WORKFLOW_TYPES.join(", "))
34
+ );
35
+ process.exit(1);
36
+ }
37
+ let input;
38
+ if (options.input) {
39
+ try {
40
+ input = JSON.parse(options.input);
41
+ } catch {
42
+ spinner.fail("Invalid JSON input");
43
+ console.log(chalk.gray(` Example: --input '{"key": "value"}'`));
44
+ process.exit(1);
45
+ }
46
+ }
47
+ if (options.dryRun) {
48
+ spinner.info("Dry run mode - workflow will not execute");
49
+ console.log();
50
+ console.log(chalk.white(" Workflow Configuration:"));
51
+ console.log(chalk.gray(` Type: ${type}`));
52
+ console.log(chalk.gray(` Input: ${input ? JSON.stringify(input, null, 2) : "none"}`));
53
+ console.log(chalk.gray(` Async: ${options.async ? "yes" : "no"}`));
54
+ return;
55
+ }
56
+ const workflowId = randomUUID().slice(0, 8);
57
+ const now = (/* @__PURE__ */ new Date()).toISOString();
58
+ const workflowEntry = {
59
+ id: workflowId,
60
+ type,
61
+ status: "running",
62
+ startedAt: now,
63
+ updatedAt: now,
64
+ progress: 0,
65
+ input
66
+ };
67
+ workflows.set(workflowId, workflowEntry);
68
+ spinner.text = `Running ${type} workflow...`;
69
+ if (options.async) {
70
+ spinner.succeed(`Workflow started: ${chalk.cyan(workflowId)}`);
71
+ console.log(
72
+ chalk.gray(`
73
+ Check status: `) + chalk.cyan(`kg workflow status ${workflowId}`)
74
+ );
75
+ simulateWorkflow(workflowId);
76
+ } else {
77
+ await simulateWorkflowSync(workflowId, spinner);
78
+ const completedWorkflow = workflows.get(workflowId);
79
+ if (completedWorkflow?.status === "completed") {
80
+ spinner.succeed(`Workflow completed: ${chalk.cyan(workflowId)}`);
81
+ printWorkflowResult(completedWorkflow);
82
+ } else if (completedWorkflow?.status === "failed") {
83
+ spinner.fail(`Workflow failed: ${chalk.cyan(workflowId)}`);
84
+ if (completedWorkflow.error) {
85
+ console.log(chalk.red(`
86
+ Error: ${completedWorkflow.error}`));
87
+ }
88
+ process.exit(1);
89
+ }
90
+ }
91
+ } catch (error) {
92
+ spinner.fail("Failed to start workflow");
93
+ console.error(chalk.red(` ${String(error)}`));
94
+ process.exit(1);
95
+ }
96
+ });
97
+ workflow.command("status [id]").description("Check workflow status").option("--json", "Output as JSON").option("-w, --watch", "Watch for status changes").action(async (id, options) => {
98
+ try {
99
+ if (id) {
100
+ const wf = workflows.get(id);
101
+ if (!wf) {
102
+ console.log(chalk.yellow(`
103
+ Workflow not found: ${id}`));
104
+ console.log(chalk.gray(" Run ") + chalk.cyan("kg workflow list") + chalk.gray(" to see active workflows"));
105
+ process.exit(1);
106
+ }
107
+ if (options.json) {
108
+ console.log(JSON.stringify(wf, null, 2));
109
+ return;
110
+ }
111
+ printWorkflowDetails(wf);
112
+ if (options.watch && wf.status === "running") {
113
+ await watchWorkflow(id);
114
+ }
115
+ } else {
116
+ const activeWorkflows = Array.from(workflows.values()).filter(
117
+ (w) => w.status === "running" || w.status === "pending"
118
+ );
119
+ if (activeWorkflows.length === 0) {
120
+ console.log(chalk.gray("\n No active workflows"));
121
+ console.log(chalk.gray(" Run ") + chalk.cyan("kg workflow start <type>") + chalk.gray(" to start one"));
122
+ return;
123
+ }
124
+ if (options.json) {
125
+ console.log(JSON.stringify(activeWorkflows, null, 2));
126
+ return;
127
+ }
128
+ console.log(chalk.cyan.bold("\n Active Workflows\n"));
129
+ activeWorkflows.forEach((wf) => {
130
+ printWorkflowSummary(wf);
131
+ });
132
+ }
133
+ } catch (error) {
134
+ console.error(chalk.red("Failed to get workflow status:"), String(error));
135
+ process.exit(1);
136
+ }
137
+ });
138
+ workflow.command("list").description("List all workflows").option("-s, --status <status>", "Filter by status (running, completed, failed, stopped)").option("-t, --type <type>", "Filter by workflow type").option("-n, --limit <number>", "Limit number of results", "10").option("--json", "Output as JSON").action((options) => {
139
+ try {
140
+ let workflowList = Array.from(workflows.values());
141
+ if (options.status) {
142
+ workflowList = workflowList.filter((w) => w.status === options.status);
143
+ }
144
+ if (options.type) {
145
+ workflowList = workflowList.filter((w) => w.type === options.type);
146
+ }
147
+ workflowList.sort(
148
+ (a, b) => new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime()
149
+ );
150
+ const limit = parseInt(options.limit, 10);
151
+ workflowList = workflowList.slice(0, limit);
152
+ if (workflowList.length === 0) {
153
+ console.log(chalk.gray("\n No workflows found"));
154
+ if (options.status || options.type) {
155
+ console.log(chalk.gray(" Try removing filters"));
156
+ }
157
+ return;
158
+ }
159
+ if (options.json) {
160
+ console.log(JSON.stringify(workflowList, null, 2));
161
+ return;
162
+ }
163
+ console.log(chalk.cyan.bold("\n Workflows\n"));
164
+ console.log(
165
+ chalk.gray(
166
+ ` ${"ID".padEnd(10)} ${"Type".padEnd(12)} ${"Status".padEnd(12)} ${"Progress".padEnd(10)} Started`
167
+ )
168
+ );
169
+ console.log(chalk.gray(" " + "-".repeat(70)));
170
+ workflowList.forEach((wf) => {
171
+ const statusColor = getStatusColor(wf.status);
172
+ const progress = `${wf.progress}%`;
173
+ const started = formatRelativeTime(wf.startedAt);
174
+ console.log(
175
+ ` ${chalk.cyan(wf.id.padEnd(10))} ${wf.type.padEnd(12)} ${statusColor(
176
+ wf.status.padEnd(12)
177
+ )} ${progress.padEnd(10)} ${chalk.gray(started)}`
178
+ );
179
+ });
180
+ console.log();
181
+ console.log(
182
+ chalk.gray(` Showing ${workflowList.length} workflow(s)`)
183
+ );
184
+ console.log();
185
+ } catch (error) {
186
+ console.error(chalk.red("Failed to list workflows:"), String(error));
187
+ process.exit(1);
188
+ }
189
+ });
190
+ workflow.command("stop <id>").description("Stop a running workflow").option("-f, --force", "Force stop without confirmation").action(async (id, options) => {
191
+ const spinner = ora(`Stopping workflow ${id}...`).start();
192
+ try {
193
+ const wf = workflows.get(id);
194
+ if (!wf) {
195
+ spinner.fail(`Workflow not found: ${id}`);
196
+ process.exit(1);
197
+ }
198
+ if (wf.status !== "running" && wf.status !== "pending") {
199
+ spinner.warn(`Workflow is not running (status: ${wf.status})`);
200
+ return;
201
+ }
202
+ wf.status = "stopped";
203
+ wf.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
204
+ wf.message = "Stopped by user";
205
+ spinner.succeed(`Workflow stopped: ${chalk.cyan(id)}`);
206
+ console.log();
207
+ console.log(chalk.white(" Final Status:"));
208
+ console.log(chalk.gray(` Progress: ${wf.progress}%`));
209
+ console.log(chalk.gray(` Stopped at: ${wf.updatedAt}`));
210
+ console.log();
211
+ } catch (error) {
212
+ spinner.fail("Failed to stop workflow");
213
+ console.error(chalk.red(` ${String(error)}`));
214
+ process.exit(1);
215
+ }
216
+ });
217
+ workflow.command("history").description("Show workflow history").option("-n, --limit <number>", "Limit number of results", "20").option("-t, --type <type>", "Filter by workflow type").option("--since <date>", "Show workflows since date (ISO format)").option("--json", "Output as JSON").action((options) => {
218
+ try {
219
+ let historyList = Array.from(workflows.values()).filter(
220
+ (w) => w.status === "completed" || w.status === "failed" || w.status === "stopped"
221
+ );
222
+ if (options.type) {
223
+ historyList = historyList.filter((w) => w.type === options.type);
224
+ }
225
+ if (options.since) {
226
+ const sinceDate = new Date(options.since);
227
+ if (isNaN(sinceDate.getTime())) {
228
+ console.error(chalk.red("Invalid date format. Use ISO format (e.g., 2024-01-01)"));
229
+ process.exit(1);
230
+ }
231
+ historyList = historyList.filter(
232
+ (w) => new Date(w.startedAt) >= sinceDate
233
+ );
234
+ }
235
+ historyList.sort((a, b) => {
236
+ const timeA = new Date(a.completedAt || a.updatedAt).getTime();
237
+ const timeB = new Date(b.completedAt || b.updatedAt).getTime();
238
+ return timeB - timeA;
239
+ });
240
+ const limit = parseInt(options.limit, 10);
241
+ historyList = historyList.slice(0, limit);
242
+ if (historyList.length === 0) {
243
+ console.log(chalk.gray("\n No workflow history found"));
244
+ return;
245
+ }
246
+ if (options.json) {
247
+ console.log(JSON.stringify(historyList, null, 2));
248
+ return;
249
+ }
250
+ console.log(chalk.cyan.bold("\n Workflow History\n"));
251
+ console.log(
252
+ chalk.gray(
253
+ ` ${"ID".padEnd(10)} ${"Type".padEnd(12)} ${"Status".padEnd(12)} ${"Duration".padEnd(12)} Completed`
254
+ )
255
+ );
256
+ console.log(chalk.gray(" " + "-".repeat(75)));
257
+ historyList.forEach((wf) => {
258
+ const statusColor = getStatusColor(wf.status);
259
+ const duration = calculateDuration(wf.startedAt, wf.completedAt || wf.updatedAt);
260
+ const completed = formatRelativeTime(wf.completedAt || wf.updatedAt);
261
+ console.log(
262
+ ` ${chalk.cyan(wf.id.padEnd(10))} ${wf.type.padEnd(12)} ${statusColor(
263
+ wf.status.padEnd(12)
264
+ )} ${duration.padEnd(12)} ${chalk.gray(completed)}`
265
+ );
266
+ if (wf.error) {
267
+ console.log(chalk.red(` Error: ${wf.error}`));
268
+ }
269
+ });
270
+ console.log();
271
+ console.log(
272
+ chalk.gray(` Showing ${historyList.length} workflow(s)`)
273
+ );
274
+ console.log();
275
+ } catch (error) {
276
+ console.error(chalk.red("Failed to get workflow history:"), String(error));
277
+ process.exit(1);
278
+ }
279
+ });
280
+ workflow.command("resume <id>").description("Resume a stopped workflow").action(async (id) => {
281
+ const spinner = ora(`Resuming workflow ${id}...`).start();
282
+ try {
283
+ const wf = workflows.get(id);
284
+ if (!wf) {
285
+ spinner.fail(`Workflow not found: ${id}`);
286
+ process.exit(1);
287
+ }
288
+ if (wf.status !== "stopped") {
289
+ spinner.warn(`Cannot resume workflow (status: ${wf.status})`);
290
+ console.log(chalk.gray("\n Only stopped workflows can be resumed"));
291
+ return;
292
+ }
293
+ wf.status = "running";
294
+ wf.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
295
+ wf.message = "Resumed by user";
296
+ spinner.succeed(`Workflow resumed: ${chalk.cyan(id)}`);
297
+ simulateWorkflow(id);
298
+ console.log(
299
+ chalk.gray(`
300
+ Check status: `) + chalk.cyan(`kg workflow status ${id}`)
301
+ );
302
+ } catch (error) {
303
+ spinner.fail("Failed to resume workflow");
304
+ console.error(chalk.red(` ${String(error)}`));
305
+ process.exit(1);
306
+ }
307
+ });
308
+ return workflow;
309
+ }
310
+ function simulateWorkflow(id) {
311
+ const wf = workflows.get(id);
312
+ if (!wf) return;
313
+ const interval = setInterval(() => {
314
+ const workflow = workflows.get(id);
315
+ if (!workflow || workflow.status !== "running") {
316
+ clearInterval(interval);
317
+ return;
318
+ }
319
+ workflow.progress = Math.min(workflow.progress + 10, 100);
320
+ workflow.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
321
+ if (workflow.progress >= 100) {
322
+ workflow.status = "completed";
323
+ workflow.completedAt = (/* @__PURE__ */ new Date()).toISOString();
324
+ workflow.output = {
325
+ processed: true,
326
+ itemsProcessed: Math.floor(Math.random() * 100) + 10
327
+ };
328
+ clearInterval(interval);
329
+ }
330
+ }, 1e3);
331
+ }
332
+ async function simulateWorkflowSync(id, spinner) {
333
+ const wf = workflows.get(id);
334
+ if (!wf) return;
335
+ for (let i = 0; i <= 100; i += 10) {
336
+ await sleep(300);
337
+ wf.progress = i;
338
+ wf.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
339
+ spinner.text = `Running ${wf.type} workflow... ${i}%`;
340
+ }
341
+ wf.status = "completed";
342
+ wf.completedAt = (/* @__PURE__ */ new Date()).toISOString();
343
+ wf.output = {
344
+ processed: true,
345
+ itemsProcessed: Math.floor(Math.random() * 100) + 10
346
+ };
347
+ }
348
+ async function watchWorkflow(id) {
349
+ console.log(chalk.gray("\n Watching for changes (Ctrl+C to stop)...\n"));
350
+ while (true) {
351
+ const wf = workflows.get(id);
352
+ if (!wf || wf.status !== "running") {
353
+ if (wf) {
354
+ printWorkflowDetails(wf);
355
+ }
356
+ break;
357
+ }
358
+ process.stdout.write(
359
+ `\r Progress: ${chalk.cyan(wf.progress + "%")} | Status: ${chalk.yellow(wf.status)}`
360
+ );
361
+ await sleep(500);
362
+ }
363
+ }
364
+ function printWorkflowResult(wf) {
365
+ console.log();
366
+ console.log(chalk.white(" Result:"));
367
+ console.log(chalk.gray(` Duration: ${calculateDuration(wf.startedAt, wf.completedAt || wf.updatedAt)}`));
368
+ if (wf.output) {
369
+ console.log(chalk.gray(` Output: ${JSON.stringify(wf.output)}`));
370
+ }
371
+ console.log();
372
+ }
373
+ function printWorkflowDetails(wf) {
374
+ const statusColor = getStatusColor(wf.status);
375
+ console.log(chalk.cyan.bold(`
376
+ Workflow: ${wf.id}
377
+ `));
378
+ console.log(chalk.white(" Details:"));
379
+ console.log(chalk.gray(` Type: ${wf.type}`));
380
+ console.log(chalk.gray(` Status: `) + statusColor(wf.status));
381
+ console.log(chalk.gray(` Progress: ${wf.progress}%`));
382
+ console.log();
383
+ console.log(chalk.white(" Timeline:"));
384
+ console.log(chalk.gray(` Started: ${wf.startedAt}`));
385
+ console.log(chalk.gray(` Updated: ${wf.updatedAt}`));
386
+ if (wf.completedAt) {
387
+ console.log(chalk.gray(` Completed: ${wf.completedAt}`));
388
+ console.log(chalk.gray(` Duration: ${calculateDuration(wf.startedAt, wf.completedAt)}`));
389
+ }
390
+ if (wf.message) {
391
+ console.log();
392
+ console.log(chalk.white(" Message:"));
393
+ console.log(chalk.gray(` ${wf.message}`));
394
+ }
395
+ if (wf.input) {
396
+ console.log();
397
+ console.log(chalk.white(" Input:"));
398
+ console.log(chalk.gray(` ${JSON.stringify(wf.input, null, 2).replace(/\n/g, "\n ")}`));
399
+ }
400
+ if (wf.output) {
401
+ console.log();
402
+ console.log(chalk.white(" Output:"));
403
+ console.log(chalk.gray(` ${JSON.stringify(wf.output, null, 2).replace(/\n/g, "\n ")}`));
404
+ }
405
+ if (wf.error) {
406
+ console.log();
407
+ console.log(chalk.red(" Error:"));
408
+ console.log(chalk.red(` ${wf.error}`));
409
+ }
410
+ console.log();
411
+ }
412
+ function printWorkflowSummary(wf) {
413
+ const statusColor = getStatusColor(wf.status);
414
+ const progressBar = createProgressBar(wf.progress, 20);
415
+ console.log(
416
+ ` ${chalk.cyan(wf.id)} [${wf.type}] ${statusColor(wf.status)} ${progressBar} ${wf.progress}%`
417
+ );
418
+ }
419
+ function getStatusColor(status) {
420
+ switch (status) {
421
+ case "completed":
422
+ return chalk.green;
423
+ case "running":
424
+ return chalk.blue;
425
+ case "pending":
426
+ return chalk.yellow;
427
+ case "failed":
428
+ return chalk.red;
429
+ case "stopped":
430
+ return chalk.gray;
431
+ default:
432
+ return chalk.white;
433
+ }
434
+ }
435
+ function createProgressBar(progress, width) {
436
+ const filled = Math.floor(progress / 100 * width);
437
+ const empty = width - filled;
438
+ return chalk.green("█".repeat(filled)) + chalk.gray("░".repeat(empty));
439
+ }
440
+ function formatRelativeTime(isoString) {
441
+ const date = new Date(isoString);
442
+ const now = /* @__PURE__ */ new Date();
443
+ const diffMs = now.getTime() - date.getTime();
444
+ const diffSeconds = Math.floor(diffMs / 1e3);
445
+ const diffMinutes = Math.floor(diffSeconds / 60);
446
+ const diffHours = Math.floor(diffMinutes / 60);
447
+ const diffDays = Math.floor(diffHours / 24);
448
+ if (diffSeconds < 60) return "just now";
449
+ if (diffMinutes < 60) return `${diffMinutes}m ago`;
450
+ if (diffHours < 24) return `${diffHours}h ago`;
451
+ if (diffDays < 7) return `${diffDays}d ago`;
452
+ return date.toLocaleDateString();
453
+ }
454
+ function calculateDuration(start, end) {
455
+ const startTime = new Date(start).getTime();
456
+ const endTime = new Date(end).getTime();
457
+ const diffMs = endTime - startTime;
458
+ if (diffMs < 1e3) return `${diffMs}ms`;
459
+ if (diffMs < 6e4) return `${(diffMs / 1e3).toFixed(1)}s`;
460
+ if (diffMs < 36e5) return `${Math.floor(diffMs / 6e4)}m ${Math.floor(diffMs % 6e4 / 1e3)}s`;
461
+ const hours = Math.floor(diffMs / 36e5);
462
+ const minutes = Math.floor(diffMs % 36e5 / 6e4);
463
+ return `${hours}h ${minutes}m`;
464
+ }
465
+ function sleep(ms) {
466
+ return new Promise((resolve) => setTimeout(resolve, ms));
467
+ }
468
+ export {
469
+ createWorkflowCommand
470
+ };
471
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sources":["../../../src/cli/commands/workflow.ts"],"sourcesContent":["/**\n * Workflow Command\n *\n * Manage knowledge graph workflows for automated processing,\n * analysis, and synchronization tasks.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { randomUUID } from 'crypto';\n\n/**\n * Workflow types supported by the system\n */\ntype WorkflowType = 'analysis' | 'sync' | 'generation' | 'validation' | 'migration';\n\n/**\n * Workflow status\n */\ntype WorkflowStatus = 'pending' | 'running' | 'completed' | 'failed' | 'stopped';\n\n/**\n * Workflow entry structure\n */\ninterface Workflow {\n id: string;\n type: WorkflowType;\n status: WorkflowStatus;\n startedAt: string;\n updatedAt: string;\n completedAt?: string;\n progress: number;\n message?: string;\n input?: Record<string, unknown>;\n output?: Record<string, unknown>;\n error?: string;\n}\n\n/**\n * In-memory workflow storage (would be replaced with persistent storage)\n */\nconst workflows: Map<string, Workflow> = new Map();\n\n/**\n * Valid workflow types\n */\nconst VALID_WORKFLOW_TYPES: WorkflowType[] = [\n 'analysis',\n 'sync',\n 'generation',\n 'validation',\n 'migration',\n];\n\n/**\n * Create workflow command with subcommands\n */\nexport function createWorkflowCommand(): Command {\n const workflow = new Command('workflow')\n .alias('wf')\n .description('Manage knowledge graph workflows');\n\n // Start workflow\n workflow\n .command('start <type>')\n .description('Start a new workflow')\n .addHelpText('after', `\nWorkflow Types:\n analysis - Analyze codebase and extract knowledge\n sync - Synchronize with external systems\n generation - Generate knowledge graph artifacts\n validation - Validate graph integrity and structure\n migration - Migrate data between formats\n\nExamples:\n $ kg workflow start analysis\n $ kg workflow start sync --input '{\"namespace\": \"myproject\"}'\n $ kg workflow start generation --async\n `)\n .option('-i, --input <json>', 'Input data as JSON')\n .option('-a, --async', 'Run workflow asynchronously')\n .option('--dry-run', 'Preview workflow without executing')\n .action(async (type: string, options) => {\n const spinner = ora('Starting workflow...').start();\n\n try {\n // Validate workflow type\n if (!VALID_WORKFLOW_TYPES.includes(type as WorkflowType)) {\n spinner.fail(`Invalid workflow type: ${type}`);\n console.log(\n chalk.gray('\\n Valid types: ') +\n chalk.cyan(VALID_WORKFLOW_TYPES.join(', '))\n );\n process.exit(1);\n }\n\n // Parse input if provided\n let input: Record<string, unknown> | undefined;\n if (options.input) {\n try {\n input = JSON.parse(options.input);\n } catch {\n spinner.fail('Invalid JSON input');\n console.log(chalk.gray(' Example: --input \\'{\"key\": \"value\"}\\''));\n process.exit(1);\n }\n }\n\n // Dry run mode\n if (options.dryRun) {\n spinner.info('Dry run mode - workflow will not execute');\n console.log();\n console.log(chalk.white(' Workflow Configuration:'));\n console.log(chalk.gray(` Type: ${type}`));\n console.log(chalk.gray(` Input: ${input ? JSON.stringify(input, null, 2) : 'none'}`));\n console.log(chalk.gray(` Async: ${options.async ? 'yes' : 'no'}`));\n return;\n }\n\n // Create workflow entry\n const workflowId = randomUUID().slice(0, 8);\n const now = new Date().toISOString();\n\n const workflowEntry: Workflow = {\n id: workflowId,\n type: type as WorkflowType,\n status: 'running',\n startedAt: now,\n updatedAt: now,\n progress: 0,\n input,\n };\n\n workflows.set(workflowId, workflowEntry);\n\n spinner.text = `Running ${type} workflow...`;\n\n // Simulate workflow execution\n if (options.async) {\n spinner.succeed(`Workflow started: ${chalk.cyan(workflowId)}`);\n console.log(\n chalk.gray(`\\n Check status: `) +\n chalk.cyan(`kg workflow status ${workflowId}`)\n );\n\n // Start async workflow simulation\n simulateWorkflow(workflowId);\n } else {\n // Synchronous execution simulation\n await simulateWorkflowSync(workflowId, spinner);\n\n const completedWorkflow = workflows.get(workflowId);\n if (completedWorkflow?.status === 'completed') {\n spinner.succeed(`Workflow completed: ${chalk.cyan(workflowId)}`);\n printWorkflowResult(completedWorkflow);\n } else if (completedWorkflow?.status === 'failed') {\n spinner.fail(`Workflow failed: ${chalk.cyan(workflowId)}`);\n if (completedWorkflow.error) {\n console.log(chalk.red(`\\n Error: ${completedWorkflow.error}`));\n }\n process.exit(1);\n }\n }\n } catch (error) {\n spinner.fail('Failed to start workflow');\n console.error(chalk.red(` ${String(error)}`));\n process.exit(1);\n }\n });\n\n // Status command\n workflow\n .command('status [id]')\n .description('Check workflow status')\n .option('--json', 'Output as JSON')\n .option('-w, --watch', 'Watch for status changes')\n .action(async (id: string | undefined, options) => {\n try {\n if (id) {\n // Get specific workflow\n const wf = workflows.get(id);\n\n if (!wf) {\n console.log(chalk.yellow(`\\n Workflow not found: ${id}`));\n console.log(chalk.gray(' Run ') + chalk.cyan('kg workflow list') + chalk.gray(' to see active workflows'));\n process.exit(1);\n }\n\n if (options.json) {\n console.log(JSON.stringify(wf, null, 2));\n return;\n }\n\n printWorkflowDetails(wf);\n\n if (options.watch && wf.status === 'running') {\n await watchWorkflow(id);\n }\n } else {\n // Show all active workflows status\n const activeWorkflows = Array.from(workflows.values()).filter(\n (w) => w.status === 'running' || w.status === 'pending'\n );\n\n if (activeWorkflows.length === 0) {\n console.log(chalk.gray('\\n No active workflows'));\n console.log(chalk.gray(' Run ') + chalk.cyan('kg workflow start <type>') + chalk.gray(' to start one'));\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(activeWorkflows, null, 2));\n return;\n }\n\n console.log(chalk.cyan.bold('\\n Active Workflows\\n'));\n activeWorkflows.forEach((wf) => {\n printWorkflowSummary(wf);\n });\n }\n } catch (error) {\n console.error(chalk.red('Failed to get workflow status:'), String(error));\n process.exit(1);\n }\n });\n\n // List command\n workflow\n .command('list')\n .description('List all workflows')\n .option('-s, --status <status>', 'Filter by status (running, completed, failed, stopped)')\n .option('-t, --type <type>', 'Filter by workflow type')\n .option('-n, --limit <number>', 'Limit number of results', '10')\n .option('--json', 'Output as JSON')\n .action((options) => {\n try {\n let workflowList = Array.from(workflows.values());\n\n // Apply filters\n if (options.status) {\n workflowList = workflowList.filter((w) => w.status === options.status);\n }\n if (options.type) {\n workflowList = workflowList.filter((w) => w.type === options.type);\n }\n\n // Sort by start time (most recent first)\n workflowList.sort(\n (a, b) => new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime()\n );\n\n // Apply limit\n const limit = parseInt(options.limit, 10);\n workflowList = workflowList.slice(0, limit);\n\n if (workflowList.length === 0) {\n console.log(chalk.gray('\\n No workflows found'));\n if (options.status || options.type) {\n console.log(chalk.gray(' Try removing filters'));\n }\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(workflowList, null, 2));\n return;\n }\n\n console.log(chalk.cyan.bold('\\n Workflows\\n'));\n\n // Header\n console.log(\n chalk.gray(\n ` ${'ID'.padEnd(10)} ${'Type'.padEnd(12)} ${'Status'.padEnd(12)} ${'Progress'.padEnd(10)} Started`\n )\n );\n console.log(chalk.gray(' ' + '-'.repeat(70)));\n\n workflowList.forEach((wf) => {\n const statusColor = getStatusColor(wf.status);\n const progress = `${wf.progress}%`;\n const started = formatRelativeTime(wf.startedAt);\n\n console.log(\n ` ${chalk.cyan(wf.id.padEnd(10))} ${wf.type.padEnd(12)} ${statusColor(\n wf.status.padEnd(12)\n )} ${progress.padEnd(10)} ${chalk.gray(started)}`\n );\n });\n\n console.log();\n console.log(\n chalk.gray(` Showing ${workflowList.length} workflow(s)`)\n );\n console.log();\n } catch (error) {\n console.error(chalk.red('Failed to list workflows:'), String(error));\n process.exit(1);\n }\n });\n\n // Stop command\n workflow\n .command('stop <id>')\n .description('Stop a running workflow')\n .option('-f, --force', 'Force stop without confirmation')\n .action(async (id: string, options) => {\n const spinner = ora(`Stopping workflow ${id}...`).start();\n\n try {\n const wf = workflows.get(id);\n\n if (!wf) {\n spinner.fail(`Workflow not found: ${id}`);\n process.exit(1);\n }\n\n if (wf.status !== 'running' && wf.status !== 'pending') {\n spinner.warn(`Workflow is not running (status: ${wf.status})`);\n return;\n }\n\n // Update workflow status\n wf.status = 'stopped';\n wf.updatedAt = new Date().toISOString();\n wf.message = 'Stopped by user';\n\n spinner.succeed(`Workflow stopped: ${chalk.cyan(id)}`);\n\n console.log();\n console.log(chalk.white(' Final Status:'));\n console.log(chalk.gray(` Progress: ${wf.progress}%`));\n console.log(chalk.gray(` Stopped at: ${wf.updatedAt}`));\n console.log();\n } catch (error) {\n spinner.fail('Failed to stop workflow');\n console.error(chalk.red(` ${String(error)}`));\n process.exit(1);\n }\n });\n\n // History command\n workflow\n .command('history')\n .description('Show workflow history')\n .option('-n, --limit <number>', 'Limit number of results', '20')\n .option('-t, --type <type>', 'Filter by workflow type')\n .option('--since <date>', 'Show workflows since date (ISO format)')\n .option('--json', 'Output as JSON')\n .action((options) => {\n try {\n let historyList = Array.from(workflows.values()).filter(\n (w) => w.status === 'completed' || w.status === 'failed' || w.status === 'stopped'\n );\n\n // Apply filters\n if (options.type) {\n historyList = historyList.filter((w) => w.type === options.type);\n }\n\n if (options.since) {\n const sinceDate = new Date(options.since);\n if (isNaN(sinceDate.getTime())) {\n console.error(chalk.red('Invalid date format. Use ISO format (e.g., 2024-01-01)'));\n process.exit(1);\n }\n historyList = historyList.filter(\n (w) => new Date(w.startedAt) >= sinceDate\n );\n }\n\n // Sort by completion time (most recent first)\n historyList.sort((a, b) => {\n const timeA = new Date(a.completedAt || a.updatedAt).getTime();\n const timeB = new Date(b.completedAt || b.updatedAt).getTime();\n return timeB - timeA;\n });\n\n // Apply limit\n const limit = parseInt(options.limit, 10);\n historyList = historyList.slice(0, limit);\n\n if (historyList.length === 0) {\n console.log(chalk.gray('\\n No workflow history found'));\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(historyList, null, 2));\n return;\n }\n\n console.log(chalk.cyan.bold('\\n Workflow History\\n'));\n\n // Header\n console.log(\n chalk.gray(\n ` ${'ID'.padEnd(10)} ${'Type'.padEnd(12)} ${'Status'.padEnd(12)} ${'Duration'.padEnd(12)} Completed`\n )\n );\n console.log(chalk.gray(' ' + '-'.repeat(75)));\n\n historyList.forEach((wf) => {\n const statusColor = getStatusColor(wf.status);\n const duration = calculateDuration(wf.startedAt, wf.completedAt || wf.updatedAt);\n const completed = formatRelativeTime(wf.completedAt || wf.updatedAt);\n\n console.log(\n ` ${chalk.cyan(wf.id.padEnd(10))} ${wf.type.padEnd(12)} ${statusColor(\n wf.status.padEnd(12)\n )} ${duration.padEnd(12)} ${chalk.gray(completed)}`\n );\n\n if (wf.error) {\n console.log(chalk.red(` Error: ${wf.error}`));\n }\n });\n\n console.log();\n console.log(\n chalk.gray(` Showing ${historyList.length} workflow(s)`)\n );\n console.log();\n } catch (error) {\n console.error(chalk.red('Failed to get workflow history:'), String(error));\n process.exit(1);\n }\n });\n\n // Resume command (bonus)\n workflow\n .command('resume <id>')\n .description('Resume a stopped workflow')\n .action(async (id: string) => {\n const spinner = ora(`Resuming workflow ${id}...`).start();\n\n try {\n const wf = workflows.get(id);\n\n if (!wf) {\n spinner.fail(`Workflow not found: ${id}`);\n process.exit(1);\n }\n\n if (wf.status !== 'stopped') {\n spinner.warn(`Cannot resume workflow (status: ${wf.status})`);\n console.log(chalk.gray('\\n Only stopped workflows can be resumed'));\n return;\n }\n\n // Update workflow status\n wf.status = 'running';\n wf.updatedAt = new Date().toISOString();\n wf.message = 'Resumed by user';\n\n spinner.succeed(`Workflow resumed: ${chalk.cyan(id)}`);\n\n // Continue simulation\n simulateWorkflow(id);\n\n console.log(\n chalk.gray(`\\n Check status: `) +\n chalk.cyan(`kg workflow status ${id}`)\n );\n } catch (error) {\n spinner.fail('Failed to resume workflow');\n console.error(chalk.red(` ${String(error)}`));\n process.exit(1);\n }\n });\n\n return workflow;\n}\n\n/**\n * Simulate async workflow execution\n */\nfunction simulateWorkflow(id: string): void {\n const wf = workflows.get(id);\n if (!wf) return;\n\n const interval = setInterval(() => {\n const workflow = workflows.get(id);\n if (!workflow || workflow.status !== 'running') {\n clearInterval(interval);\n return;\n }\n\n workflow.progress = Math.min(workflow.progress + 10, 100);\n workflow.updatedAt = new Date().toISOString();\n\n if (workflow.progress >= 100) {\n workflow.status = 'completed';\n workflow.completedAt = new Date().toISOString();\n workflow.output = {\n processed: true,\n itemsProcessed: Math.floor(Math.random() * 100) + 10,\n };\n clearInterval(interval);\n }\n }, 1000);\n}\n\n/**\n * Simulate synchronous workflow execution\n */\nasync function simulateWorkflowSync(\n id: string,\n spinner: ReturnType<typeof ora>\n): Promise<void> {\n const wf = workflows.get(id);\n if (!wf) return;\n\n for (let i = 0; i <= 100; i += 10) {\n await sleep(300);\n wf.progress = i;\n wf.updatedAt = new Date().toISOString();\n spinner.text = `Running ${wf.type} workflow... ${i}%`;\n }\n\n wf.status = 'completed';\n wf.completedAt = new Date().toISOString();\n wf.output = {\n processed: true,\n itemsProcessed: Math.floor(Math.random() * 100) + 10,\n };\n}\n\n/**\n * Watch workflow status changes\n */\nasync function watchWorkflow(id: string): Promise<void> {\n console.log(chalk.gray('\\n Watching for changes (Ctrl+C to stop)...\\n'));\n\n while (true) {\n const wf = workflows.get(id);\n if (!wf || wf.status !== 'running') {\n if (wf) {\n printWorkflowDetails(wf);\n }\n break;\n }\n\n process.stdout.write(\n `\\r Progress: ${chalk.cyan(wf.progress + '%')} | Status: ${chalk.yellow(wf.status)}`\n );\n\n await sleep(500);\n }\n}\n\n/**\n * Print workflow result\n */\nfunction printWorkflowResult(wf: Workflow): void {\n console.log();\n console.log(chalk.white(' Result:'));\n console.log(chalk.gray(` Duration: ${calculateDuration(wf.startedAt, wf.completedAt || wf.updatedAt)}`));\n if (wf.output) {\n console.log(chalk.gray(` Output: ${JSON.stringify(wf.output)}`));\n }\n console.log();\n}\n\n/**\n * Print detailed workflow information\n */\nfunction printWorkflowDetails(wf: Workflow): void {\n const statusColor = getStatusColor(wf.status);\n\n console.log(chalk.cyan.bold(`\\n Workflow: ${wf.id}\\n`));\n\n console.log(chalk.white(' Details:'));\n console.log(chalk.gray(` Type: ${wf.type}`));\n console.log(chalk.gray(` Status: `) + statusColor(wf.status));\n console.log(chalk.gray(` Progress: ${wf.progress}%`));\n\n console.log();\n console.log(chalk.white(' Timeline:'));\n console.log(chalk.gray(` Started: ${wf.startedAt}`));\n console.log(chalk.gray(` Updated: ${wf.updatedAt}`));\n if (wf.completedAt) {\n console.log(chalk.gray(` Completed: ${wf.completedAt}`));\n console.log(chalk.gray(` Duration: ${calculateDuration(wf.startedAt, wf.completedAt)}`));\n }\n\n if (wf.message) {\n console.log();\n console.log(chalk.white(' Message:'));\n console.log(chalk.gray(` ${wf.message}`));\n }\n\n if (wf.input) {\n console.log();\n console.log(chalk.white(' Input:'));\n console.log(chalk.gray(` ${JSON.stringify(wf.input, null, 2).replace(/\\n/g, '\\n ')}`));\n }\n\n if (wf.output) {\n console.log();\n console.log(chalk.white(' Output:'));\n console.log(chalk.gray(` ${JSON.stringify(wf.output, null, 2).replace(/\\n/g, '\\n ')}`));\n }\n\n if (wf.error) {\n console.log();\n console.log(chalk.red(' Error:'));\n console.log(chalk.red(` ${wf.error}`));\n }\n\n console.log();\n}\n\n/**\n * Print workflow summary (one line)\n */\nfunction printWorkflowSummary(wf: Workflow): void {\n const statusColor = getStatusColor(wf.status);\n const progressBar = createProgressBar(wf.progress, 20);\n\n console.log(\n ` ${chalk.cyan(wf.id)} [${wf.type}] ${statusColor(wf.status)} ${progressBar} ${wf.progress}%`\n );\n}\n\n/**\n * Get chalk color function based on status\n */\nfunction getStatusColor(status: WorkflowStatus): typeof chalk.green {\n switch (status) {\n case 'completed':\n return chalk.green;\n case 'running':\n return chalk.blue;\n case 'pending':\n return chalk.yellow;\n case 'failed':\n return chalk.red;\n case 'stopped':\n return chalk.gray;\n default:\n return chalk.white;\n }\n}\n\n/**\n * Create progress bar string\n */\nfunction createProgressBar(progress: number, width: number): string {\n const filled = Math.floor((progress / 100) * width);\n const empty = width - filled;\n return chalk.green('█'.repeat(filled)) + chalk.gray('░'.repeat(empty));\n}\n\n/**\n * Format relative time\n */\nfunction formatRelativeTime(isoString: string): string {\n const date = new Date(isoString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSeconds = Math.floor(diffMs / 1000);\n const diffMinutes = Math.floor(diffSeconds / 60);\n const diffHours = Math.floor(diffMinutes / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffSeconds < 60) return 'just now';\n if (diffMinutes < 60) return `${diffMinutes}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n\n return date.toLocaleDateString();\n}\n\n/**\n * Calculate duration between two ISO timestamps\n */\nfunction calculateDuration(start: string, end: string): string {\n const startTime = new Date(start).getTime();\n const endTime = new Date(end).getTime();\n const diffMs = endTime - startTime;\n\n if (diffMs < 1000) return `${diffMs}ms`;\n if (diffMs < 60000) return `${(diffMs / 1000).toFixed(1)}s`;\n if (diffMs < 3600000) return `${Math.floor(diffMs / 60000)}m ${Math.floor((diffMs % 60000) / 1000)}s`;\n\n const hours = Math.floor(diffMs / 3600000);\n const minutes = Math.floor((diffMs % 3600000) / 60000);\n return `${hours}h ${minutes}m`;\n}\n\n/**\n * Sleep utility\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"],"names":[],"mappings":"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"}