kirograph 0.27.1 → 0.27.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -1
- package/dist/bin/commands/callees.js +76 -0
- package/dist/bin/commands/callees.js.map +7 -0
- package/dist/bin/commands/callers.js +76 -0
- package/dist/bin/commands/callers.js.map +7 -0
- package/dist/bin/commands/circular-deps.js +68 -0
- package/dist/bin/commands/circular-deps.js.map +7 -0
- package/dist/bin/commands/impact.js +76 -0
- package/dist/bin/commands/impact.js.map +7 -0
- package/dist/bin/commands/type-hierarchy.js +76 -0
- package/dist/bin/commands/type-hierarchy.js.map +7 -0
- package/dist/bin/installer/common.js +15 -9
- package/dist/bin/installer/common.js.map +2 -2
- package/dist/bin/installer/config-prompt.js +8 -2
- package/dist/bin/installer/config-prompt.js.map +2 -2
- package/dist/bin/installer/index.js +25 -1
- package/dist/bin/installer/index.js.map +2 -2
- package/dist/bin/installer/instructions.js +14 -21
- package/dist/bin/installer/instructions.js.map +2 -2
- package/dist/bin/installer/mcp.js.map +2 -2
- package/dist/bin/installer/steering.js +38 -0
- package/dist/bin/installer/steering.js.map +2 -2
- package/dist/bin/installer/targets/aider.js +3 -3
- package/dist/bin/installer/targets/aider.js.map +2 -2
- package/dist/bin/installer/targets/amp.js +3 -3
- package/dist/bin/installer/targets/amp.js.map +2 -2
- package/dist/bin/installer/targets/antigravity.js +4 -4
- package/dist/bin/installer/targets/antigravity.js.map +2 -2
- package/dist/bin/installer/targets/augment.js +3 -3
- package/dist/bin/installer/targets/augment.js.map +2 -2
- package/dist/bin/installer/targets/claude.js +3 -3
- package/dist/bin/installer/targets/claude.js.map +2 -2
- package/dist/bin/installer/targets/cline.js +4 -4
- package/dist/bin/installer/targets/cline.js.map +2 -2
- package/dist/bin/installer/targets/codex.js +4 -4
- package/dist/bin/installer/targets/codex.js.map +2 -2
- package/dist/bin/installer/targets/continue.js +4 -4
- package/dist/bin/installer/targets/continue.js.map +2 -2
- package/dist/bin/installer/targets/copilot-cli.js +4 -4
- package/dist/bin/installer/targets/copilot-cli.js.map +2 -2
- package/dist/bin/installer/targets/copilot.js +4 -4
- package/dist/bin/installer/targets/copilot.js.map +2 -2
- package/dist/bin/installer/targets/cursor.js +5 -5
- package/dist/bin/installer/targets/cursor.js.map +2 -2
- package/dist/bin/installer/targets/devin.js +4 -4
- package/dist/bin/installer/targets/devin.js.map +2 -2
- package/dist/bin/installer/targets/gemini-cli.js +4 -4
- package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
- package/dist/bin/installer/targets/generic.js +2 -2
- package/dist/bin/installer/targets/generic.js.map +2 -2
- package/dist/bin/installer/targets/goose.js +3 -4
- package/dist/bin/installer/targets/goose.js.map +3 -3
- package/dist/bin/installer/targets/index.js.map +1 -1
- package/dist/bin/installer/targets/junie.js +4 -4
- package/dist/bin/installer/targets/junie.js.map +2 -2
- package/dist/bin/installer/targets/kilo.js +4 -4
- package/dist/bin/installer/targets/kilo.js.map +2 -2
- package/dist/bin/installer/targets/kiro.js +23 -3
- package/dist/bin/installer/targets/kiro.js.map +2 -2
- package/dist/bin/installer/targets/opencode.js +3 -3
- package/dist/bin/installer/targets/opencode.js.map +2 -2
- package/dist/bin/installer/targets/openhands.js +3 -3
- package/dist/bin/installer/targets/openhands.js.map +2 -2
- package/dist/bin/installer/targets/qoder.js +2 -2
- package/dist/bin/installer/targets/qoder.js.map +2 -2
- package/dist/bin/installer/targets/qwen.js +2 -2
- package/dist/bin/installer/targets/qwen.js.map +2 -2
- package/dist/bin/installer/targets/replit.js +3 -3
- package/dist/bin/installer/targets/replit.js.map +2 -2
- package/dist/bin/installer/targets/roo.js +4 -4
- package/dist/bin/installer/targets/roo.js.map +2 -2
- package/dist/bin/installer/targets/tabnine.js +3 -3
- package/dist/bin/installer/targets/tabnine.js.map +2 -2
- package/dist/bin/installer/targets/trae.js +3 -3
- package/dist/bin/installer/targets/trae.js.map +2 -2
- package/dist/bin/installer/targets/warp.js +4 -4
- package/dist/bin/installer/targets/warp.js.map +2 -2
- package/dist/bin/installer/targets/windsurf.js +4 -4
- package/dist/bin/installer/targets/windsurf.js.map +2 -2
- package/dist/bin/kirograph.js +11 -1
- package/dist/bin/kirograph.js.map +3 -3
- package/dist/config.js +4 -0
- package/dist/config.js.map +2 -2
- package/dist/mcp/cache.js +1 -1
- package/dist/mcp/cache.js.map +2 -2
- package/dist/mcp/tool-names.js +43 -4
- package/dist/mcp/tool-names.js.map +2 -2
- package/dist/mcp/tools.js +774 -182
- package/dist/mcp/tools.js.map +3 -3
- package/package.json +1 -1
package/dist/mcp/tools.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/mcp/tools.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * KiroGraph MCP Tool Definitions + Handlers\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport { execSync } from 'child_process';\nimport KiroGraph, { findNearestKiroGraphRoot } from '../index';\nimport type { NodeKind } from '../types';\nimport { logError } from '../errors';\nimport { compress, estimateTokens, detectCommandFamily } from '../compression/index';\nimport { TokenTracker } from '../compression/tracker';\nexport { KIROGRAPH_TOOL_NAMES } from './tool-names';\n\nconst MAX_OUTPUT = 15_000;\n\nfunction truncate(s: string): string {\n return s.length > MAX_OUTPUT ? s.slice(0, MAX_OUTPUT) + '\\n\u2026[truncated]' : s;\n}\n\n/** Estimate how many tokens reading the full files would cost (chars / 4 heuristic). */\nfunction estimateFileTokens(projectRoot: string, filePaths: string[]): number {\n let total = 0;\n for (const fp of filePaths) {\n try {\n const fullPath = path.isAbsolute(fp) ? fp : path.join(projectRoot, fp);\n const stat = fs.statSync(fullPath);\n total += Math.round(stat.size / 4);\n } catch {\n // File may not exist or be unreadable \u2014 skip\n }\n }\n return total;\n}\n\nfunction clampLimit(value: number | undefined, defaultValue: number): number {\n const n = typeof value === 'number' ? value : defaultValue;\n return Math.max(1, Math.min(100, Math.round(n)));\n}\n\n/** Map internal kind values to human-readable MCP response kinds. */\nfunction mapKind(kind: string): string {\n if (kind === 'type_alias') return 'type';\n return kind;\n}\n\n/** Write a session marker so hooks can detect MCP was consulted. */\nfunction writeSessionMarker(projectRoot: string): void {\n try {\n const hash = crypto.createHash('sha256').update(projectRoot).digest('hex').slice(0, 16);\n fs.writeFileSync(`/tmp/kirograph-consulted-${hash}`, String(Date.now()));\n } catch { /* best-effort */ }\n}\n\n/** Format a timestamp as a human-readable relative age. */\nfunction formatAge(timestamp: number): string {\n const diff = Date.now() - timestamp;\n const minutes = Math.floor(diff / 60000);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n const weeks = Math.floor(days / 7);\n if (weeks < 5) return `${weeks}w ago`;\n const months = Math.floor(days / 30);\n return `${months}mo ago`;\n}\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: 'object';\n properties: Record<string, { type: string; description: string; enum?: string[]; default?: unknown }>;\n required?: string[];\n };\n}\n\nexport const tools: ToolDefinition[] = [\n {\n name: 'kirograph_search',\n description: 'Quick symbol search by name. Returns locations only (no code). Use kirograph_context for comprehensive task context.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Symbol name or partial name (e.g., \"auth\", \"signIn\", \"UserService\")' },\n kind: {\n type: 'string',\n description: 'Filter by node kind',\n enum: ['function', 'method', 'class', 'interface', 'type_alias', 'variable', 'route', 'component'],\n },\n limit: { type: 'number', description: 'Max results 1-100 (default: 10)', default: 10 },\n projectPath: { type: 'string', description: 'Project root path (optional, defaults to current project)' },\n },\n required: ['query'],\n },\n },\n {\n name: 'kirograph_context',\n description: 'PRIMARY TOOL: Build comprehensive context for a task or feature request. Returns entry points, related symbols, and key code \u2014 often enough to understand the codebase without additional tool calls.',\n inputSchema: {\n type: 'object',\n properties: {\n task: { type: 'string', description: 'Description of the task, bug, or feature to build context for' },\n maxNodes: { type: 'number', description: 'Max symbols to include (default: 20)', default: 20 },\n includeCode: { type: 'boolean', description: 'Include code snippets (default: true)', default: true },\n projectPath: { type: 'string', description: 'Project root path (optional, defaults to current project)' },\n },\n required: ['task'],\n },\n },\n {\n name: 'kirograph_callers',\n description: 'Find all functions/methods that call a specific symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name to find callers for' },\n limit: { type: 'number', description: 'Max results 1-100 (default: 20)', default: 20 },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_callees',\n description: 'Find all functions/methods that a specific symbol calls.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name to find callees for' },\n limit: { type: 'number', description: 'Max results 1-100 (default: 20)', default: 20 },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_impact',\n description: 'Analyze what code would be affected by changing a symbol. Use before making changes.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name to analyze impact for' },\n depth: { type: 'number', description: 'Traversal depth (default: 2)', default: 2 },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_node',\n description: 'Get details about a specific symbol, optionally including its source code.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name to look up' },\n includeCode: { type: 'boolean', description: 'Include source code (default: false)', default: false },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_status',\n description: 'Check index health and statistics.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_files',\n description: 'List the indexed file structure of the project. Supports filtering by path prefix, glob pattern, or depth.',\n inputSchema: {\n type: 'object',\n properties: {\n filterPath: { type: 'string', description: 'Filter by directory path prefix (e.g., \"src/\")' },\n pattern: { type: 'string', description: 'Filter by glob pattern (e.g., \"**/*.ts\")' },\n maxDepth: { type: 'number', description: 'Limit tree depth' },\n format: {\n type: 'string',\n description: 'Output format: \"tree\" (default, visual tree), \"flat\" (one path per line), \"grouped\" (grouped by directory), \"compact\" (rtk-style summary with counts)',\n enum: ['tree', 'flat', 'grouped', 'compact'],\n default: 'tree',\n },\n includeMetadata: { type: 'boolean', description: 'Include language and symbol count (default: true)', default: true },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_dead_code',\n description: 'Find symbols with no incoming references (potential dead code). Only includes unexported symbols.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results 1-100 (default: 50)', default: 50 },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_circular_deps',\n description: 'Find circular import dependencies in the codebase.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_path',\n description: 'Find the shortest path between two symbols in the graph.',\n inputSchema: {\n type: 'object',\n properties: {\n from: { type: 'string', description: 'Source symbol name' },\n to: { type: 'string', description: 'Target symbol name' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['from', 'to'],\n },\n },\n {\n name: 'kirograph_architecture',\n description: 'Get the high-level software architecture: packages, layers, and their dependencies. Requires enableArchitecture=true in config. Call this first on a new task to orient yourself without reading files.',\n inputSchema: {\n type: 'object',\n properties: {\n level: {\n type: 'string',\n description: 'View level: \"packages\" (package graph), \"layers\" (architectural layers), or \"both\" (default)',\n enum: ['packages', 'layers', 'both'],\n default: 'both',\n },\n includeFiles: { type: 'boolean', description: 'Include per-file package/layer assignments (default: false)', default: false },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_coupling',\n description: 'Show coupling metrics for packages: afferent (Ca), efferent (Ce), and instability (Ce/(Ca+Ce)). High instability = depends on many others; low instability = depended on by many. Requires enableArchitecture=true.',\n inputSchema: {\n type: 'object',\n properties: {\n sortBy: {\n type: 'string',\n description: 'Sort order: \"instability\" (default), \"afferent\", or \"efferent\"',\n enum: ['instability', 'afferent', 'efferent'],\n default: 'instability',\n },\n limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_package',\n description: 'Drill into one package: files it contains, symbols it exports, packages it depends on, and packages that depend on it. Requires enableArchitecture=true.',\n inputSchema: {\n type: 'object',\n properties: {\n package: { type: 'string', description: 'Package name or path (partial match accepted)' },\n includeFiles: { type: 'boolean', description: 'List files in the package (default: true)', default: true },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['package'],\n },\n },\n {\n name: 'kirograph_hotspots',\n description: 'Find the most-connected symbols in the codebase by total edge degree (incoming + outgoing). Useful for identifying load-bearing code, core abstractions, or blast-radius hot zones.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results 1-100 (default: 20)', default: 20 },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_surprising',\n description: 'Find non-obvious cross-file connections: direct edges between symbols in structurally distant parts of the codebase. High-score pairs indicate unexpected coupling worth investigating.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results 1-100 (default: 20)', default: 20 },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_diff',\n description: 'Compare the current graph against a saved snapshot. Shows added/removed symbols and relationships since the snapshot was taken. Use `kirograph snapshot` CLI command to save a snapshot first.',\n inputSchema: {\n type: 'object',\n properties: {\n snapshot: { type: 'string', description: 'Snapshot label to compare against. Omit to use the latest saved snapshot.' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_type_hierarchy',\n description: 'Traverse the type hierarchy of a class or interface (base types and derived types).',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Class or interface name' },\n direction: {\n type: 'string',\n description: 'Direction: \"up\" for base types, \"down\" for derived types, \"both\" for all (default)',\n enum: ['up', 'down', 'both'],\n default: 'both',\n },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_exec',\n description: 'Run a shell command and return token-optimized output. Automatically filters noise from git, test runners, linters, build tools, docker, and package managers. Use instead of raw shell for 60-90% token savings on verbose commands.',\n inputSchema: {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'Shell command to execute (e.g., \"git status\", \"npm test\", \"cargo build\")' },\n cwd: { type: 'string', description: 'Working directory (default: project root)' },\n level: {\n type: 'string',\n description: 'Compression level: \"normal\" (balanced), \"aggressive\" (more compact), \"ultra\" (maximum compression)',\n enum: ['normal', 'aggressive', 'ultra'],\n default: 'normal',\n },\n timeout: { type: 'number', description: 'Timeout in seconds (default: 60)', default: 60 },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['command'],\n },\n },\n {\n name: 'kirograph_gain',\n description: 'Show token savings statistics \u2014 both from graph tools (vs manual file reads/grep) and from kirograph_exec shell compression.',\n inputSchema: {\n type: 'object',\n properties: {\n period: {\n type: 'string',\n description: 'Time period: \"session\" (current), \"today\", \"week\", or \"all\"',\n enum: ['session', 'today', 'week', 'all'],\n default: 'session',\n },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_read',\n description: 'Read a file with caching and multiple modes. First read returns full content; subsequent reads of unchanged files return a compact \"cached\" marker (~13 tokens). Supports modes: full, map, signatures, diff, lines, imports, exports.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path to read (absolute or relative to project root)' },\n mode: {\n type: 'string',\n description: 'Read mode: \"full\" (default), \"map\" (structure overview), \"signatures\" (function signatures), \"diff\" (changes since last read), \"lines\" (line range), \"imports\", \"exports\"',\n enum: ['full', 'map', 'signatures', 'diff', 'lines', 'imports', 'exports'],\n default: 'full',\n },\n start: { type: 'number', description: 'Start line (for lines mode)' },\n end: { type: 'number', description: 'End line (for lines mode)' },\n noCache: { type: 'boolean', description: 'Force fresh read, bypass cache (default: false)', default: false },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['path'],\n },\n },\n {\n name: 'kirograph_budget',\n description: 'Show current session context budget usage. Returns tokens consumed, remaining budget, and utilization percentage.',\n inputSchema: {\n type: 'object',\n properties: {\n reset: { type: 'boolean', description: 'Reset session budget counters (default: false)', default: false },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_flows',\n description: 'Trace execution flows from entry points (routes, handlers, main functions) through the call graph. Returns ordered call chains sorted by criticality.',\n inputSchema: {\n type: 'object',\n properties: {\n entryPoint: { type: 'string', description: 'Symbol name to trace from, or omit to auto-detect entry points' },\n maxFlows: { type: 'number', description: 'Max number of flows to return (default 10)' },\n maxDepth: { type: 'number', description: 'Max call chain depth (default 10)' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_communities',\n description: 'Detect code communities (clusters of related symbols) using graph-based community detection. Shows which code belongs together and how communities are coupled.',\n inputSchema: {\n type: 'object',\n properties: {\n resolution: { type: 'number', description: 'Resolution parameter (default 1.0, higher = more communities)' },\n limit: { type: 'number', description: 'Max communities to return (default 15)' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_refactor',\n description: 'Refactoring assistant. Use mode \"rename\" to preview all locations that reference a symbol (rename preview). Use mode \"suggest\" for community-driven refactoring suggestions.',\n inputSchema: {\n type: 'object',\n properties: {\n mode: { type: 'string', description: 'Mode: \"rename\" (preview references) or \"suggest\" (refactoring suggestions)', enum: ['rename', 'suggest'] },\n symbol: { type: 'string', description: 'Symbol name (required for rename mode)' },\n limit: { type: 'number', description: 'Max results (default 10)' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['mode'],\n },\n },\n // \u2500\u2500 Memory tools (require enableMemory=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_mem_search',\n description: 'Search project memory for past decisions, errors, patterns, and context. Returns observations ranked by relevance.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Natural language search query' },\n kind: {\n type: 'string',\n description: 'Filter by observation kind',\n enum: ['decision', 'error', 'pattern', 'architecture', 'summary', 'note'],\n },\n limit: { type: 'number', description: 'Max results (default: 10)', default: 10 },\n sessionId: { type: 'string', description: 'Filter to specific session' },\n asOf: { type: 'number', description: 'Query facts valid at this timestamp (epoch ms). Filters out expired/superseded observations.' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['query'],\n },\n },\n {\n name: 'kirograph_mem_store',\n description: 'Store an observation in project memory. Content is automatically compressed (if caveman mode is on) and linked to relevant code symbols.',\n inputSchema: {\n type: 'object',\n properties: {\n content: { type: 'string', description: 'Observation text' },\n kind: {\n type: 'string',\n description: 'Observation kind',\n enum: ['decision', 'error', 'pattern', 'architecture', 'summary', 'note'],\n default: 'note',\n },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n topicKey: { type: 'string', description: \"Stable semantic key for this observation (e.g. 'architecture/auth-model'). Enables addressing by concept.\" },\n reviewAfter: { type: 'number', description: 'Epoch ms: schedule this observation for re-evaluation after this timestamp.' },\n },\n required: ['content'],\n },\n },\n {\n name: 'kirograph_mem_timeline',\n description: 'List recent sessions and their observations chronologically.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Number of sessions to show (default: 5)', default: 5 },\n sessionId: { type: 'string', description: 'Show observations for a specific session' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_mem_status',\n description: 'Memory subsystem health: session count, observations, embedding coverage, storage size.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n // \u2500\u2500 Engram-parity mem tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_mem_review',\n description: 'List observations past their review_after date \u2014 stale facts the agent should re-evaluate, update, or supersede.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_mem_mark_reviewed',\n description: 'Mark an observation as reviewed \u2014 clears its review_after date.',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Observation ID' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['id'],\n },\n },\n {\n name: 'kirograph_mem_compare',\n description: 'Establish a typed relation between two observations (supersedes, conflicts_with, compatible, scoped, related, not_conflict). Accepts observation IDs or topic_key values.',\n inputSchema: {\n type: 'object',\n properties: {\n observationA: { type: 'string', description: 'First observation ID or topic_key' },\n observationB: { type: 'string', description: 'Second observation ID or topic_key' },\n relation: { type: 'string', enum: ['supersedes', 'conflicts_with', 'compatible', 'scoped', 'related', 'not_conflict'], description: 'Relation type' },\n confidence: { type: 'number', description: 'Confidence 0.0\u20131.0 (default: 1.0)' },\n reason: { type: 'string', description: 'Explanation for the relation' },\n evidence: { type: 'string', description: 'Supporting evidence text' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['observationA', 'observationB', 'relation'],\n },\n },\n {\n name: 'kirograph_mem_judge',\n description: 'Finalize a pending conflict relation \u2014 confirm, revise, or dismiss it.',\n inputSchema: {\n type: 'object',\n properties: {\n relationId: { type: 'string', description: 'Relation ID (from kirograph_mem_compare or kirograph_mem_search)' },\n relation: { type: 'string', enum: ['supersedes', 'conflicts_with', 'compatible', 'scoped', 'related', 'not_conflict'], description: 'Final relation type' },\n confidence: { type: 'number', description: 'Final confidence 0.0\u20131.0' },\n reason: { type: 'string', description: 'Reasoning for judgment' },\n evidence: { type: 'string', description: 'Supporting evidence' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['relationId', 'relation', 'confidence'],\n },\n },\n {\n name: 'kirograph_mem_capture',\n description: 'Extract and store structured learnings from a freeform text block. Looks for ## Key Learnings, ## Observations, ## Decisions, ## Key Changes sections and saves each bullet as a separate observation.',\n inputSchema: {\n type: 'object',\n properties: {\n content: { type: 'string', description: 'Text block with structured sections' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['content'],\n },\n },\n {\n name: 'kirograph_mem_save_prompt',\n description: 'Save the current user prompt to session memory for context reconstruction.',\n inputSchema: {\n type: 'object',\n properties: {\n content: { type: 'string', description: 'Prompt content to save' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['content'],\n },\n },\n {\n name: 'kirograph_mem_suggest_topic_key',\n description: 'Suggest a stable topic_key for an observation based on its kind and content. Returns a deterministic slug like \"architecture/auth-model\".',\n inputSchema: {\n type: 'object',\n properties: {\n kind: { type: 'string', enum: ['decision', 'error', 'pattern', 'architecture', 'summary', 'note'], description: 'Observation kind' },\n title: { type: 'string', description: 'Short title or first sentence of the observation' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['kind', 'title'],\n },\n },\n {\n name: 'kirograph_mem_conflicts_scan',\n description: 'Scan recent observations for potential conflicts using FTS similarity. Returns candidate pairs that may need a relation established via kirograph_mem_compare.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max observations to scan (default: 50)', default: 50 },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n // \u2500\u2500 Wiki tools (require enableWiki=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_wiki_ingest',\n description: 'Returns an ingest prompt (SCHEMA + MANIFEST + source content) for the LLM to produce a WIKI_DIFF. Call kirograph_wiki_apply_diff with the result.',\n inputSchema: {\n type: 'object',\n properties: {\n source: { type: 'string', description: 'Source content to ingest (markdown, notes, ADR text, etc.)' },\n sourceName: { type: 'string', description: 'Name or path of the source (e.g. \"ADR-001.md\")', default: 'source' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['source'],\n },\n },\n {\n name: 'kirograph_wiki_apply_diff',\n description: 'Apply a WIKI_DIFF string (produced by the LLM after kirograph_wiki_ingest) to the wiki filesystem and SQLite index.',\n inputSchema: {\n type: 'object',\n properties: {\n diff: { type: 'string', description: 'WIKI_DIFF string with WIKI_DIFF_START/END blocks' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['diff'],\n },\n },\n {\n name: 'kirograph_wiki_search',\n description: 'Full-text search over wiki pages. Returns page slugs, titles, and previews ranked by relevance.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query' },\n limit: { type: 'number', description: 'Max results (default: 5)', default: 5 },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['query'],\n },\n },\n {\n name: 'kirograph_wiki_page',\n description: 'Retrieve the full markdown content of a wiki page by slug.',\n inputSchema: {\n type: 'object',\n properties: {\n slug: { type: 'string', description: 'Page slug (e.g. \"AuthService\", \"arch/auth-model\")' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['slug'],\n },\n },\n {\n name: 'kirograph_wiki_lint',\n description: 'Health check the wiki for broken links, orphan pages, stale sources, and potential contradictions between pages.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_wiki_list',\n description: 'List all wiki pages with slug, title, source count, and last updated date.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n // \u2500\u2500 Docs tools (require enableDocs=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_docs_toc',\n description: 'Get table of contents for a documentation file or the whole project. Returns section IDs, titles, levels, and summaries.',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'Filter to a specific doc file (relative path). Omit for project-wide TOC.' },\n tree: { type: 'boolean', description: 'Return nested tree structure (default: false, flat list)', default: false },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_docs_search',\n description: 'Search documentation sections by query. Returns matching sections ranked by relevance. Independent from kirograph_search (code-only).',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query (natural language or keywords)' },\n file: { type: 'string', description: 'Narrow search to a specific doc file (relative path)' },\n limit: { type: 'number', description: 'Max results (default: 10)', default: 10 },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['query'],\n },\n },\n {\n name: 'kirograph_docs_section',\n description: 'Retrieve full content of a documentation section by its stable ID. Use context=true to also get ancestor headings and child summaries.',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Section ID (from kirograph_docs_toc or kirograph_docs_search results)' },\n context: { type: 'boolean', description: 'Include ancestor heading chain and child summaries (default: false)', default: false },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['id'],\n },\n },\n {\n name: 'kirograph_docs_outline',\n description: 'Get the heading hierarchy for a single documentation file. Lighter than full TOC when you know which file is relevant.',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'Relative path to the doc file' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['file'],\n },\n },\n {\n name: 'kirograph_docs_refs',\n description: 'Find code symbols referenced by a doc section, or doc sections that reference a code symbol. Bidirectional lookup.',\n inputSchema: {\n type: 'object',\n properties: {\n sectionId: { type: 'string', description: 'Doc section ID (find code symbols it references)' },\n nodeId: { type: 'string', description: 'Code symbol qualified name (find doc sections that reference it)' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n // \u2500\u2500 Data tools (require enableData=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_data_list',\n description: 'List all indexed datasets with row counts, column counts, and file sizes.',\n inputSchema: { type: 'object', properties: { projectPath: { type: 'string', description: 'Project root path (optional)' } } },\n },\n {\n name: 'kirograph_data_describe',\n description: 'Full schema profile of a dataset: column names, types, cardinality, null%, sample values. Use to orient on a dataset without reading any rows.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID (from kirograph_data_list)' },\n column: { type: 'string', description: 'Optional: deep-dive on a single column' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_query',\n description: 'Filtered row retrieval with structured operators. Returns only matching rows (max 500). Use instead of reading raw data files.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n filters: { type: 'array', description: 'Array of {column, op, value} filters. Ops: eq, neq, gt, gte, lt, lte, contains, in, is_null, between' },\n columns: { type: 'array', description: 'Column projection (only return these columns)' },\n limit: { type: 'number', description: 'Max rows (default: 100, hard cap: 500)', default: 100 },\n offset: { type: 'number', description: 'Pagination offset', default: 0 },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_aggregate',\n description: 'Server-side GROUP BY aggregation. Computation runs in SQLite \u2014 only the result set enters context. Use for count, sum, avg, min, max questions.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n groupBy: { type: 'array', description: 'Columns to group by' },\n metrics: { type: 'array', description: 'Array of {column, op} metrics. Ops: count, sum, avg, min, max, count_distinct' },\n filters: { type: 'array', description: 'Optional pre-filters (same format as kirograph_data_query)' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['dataset', 'groupBy', 'metrics'],\n },\n },\n {\n name: 'kirograph_data_search',\n description: 'Search column names and sample values by keyword. Tells you which column holds the answer without loading data.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n query: { type: 'string', description: 'Search keyword' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['dataset', 'query'],\n },\n },\n {\n name: 'kirograph_data_join',\n description: 'SQL JOIN across two indexed datasets. Combines data without loading either file into context.',\n inputSchema: {\n type: 'object',\n properties: {\n left: { type: 'string', description: 'Left dataset ID' },\n right: { type: 'string', description: 'Right dataset ID' },\n leftColumn: { type: 'string', description: 'Join column from left dataset' },\n rightColumn: { type: 'string', description: 'Join column from right dataset' },\n type: { type: 'string', description: 'Join type: inner (default), left, right', enum: ['inner', 'left', 'right'], default: 'inner' },\n columns: { type: 'array', description: 'Column projection (prefix with dataset ID)' },\n limit: { type: 'number', description: 'Max rows (default: 100, hard cap: 500)', default: 100 },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['left', 'right', 'leftColumn', 'rightColumn'],\n },\n },\n {\n name: 'kirograph_data_correlations',\n description: 'Pairwise Pearson correlations between numeric columns. Discovers hidden relationships without loading data.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n threshold: { type: 'number', description: 'Min absolute correlation to include (default: 0.3)', default: 0.3 },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_quality',\n description: 'Data quality triage: rank columns by risk (null rate, cardinality anomalies, type issues). Identifies problematic columns without loading data.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['dataset'],\n },\n },\n // \u2500\u2500 Security tools (require enableSecurity=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_security',\n description: 'Security overview: vulnerability counts, affected/not_affected verdicts, stale data warnings. Requires enableSecurity=true and enableArchitecture=true.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_vulns',\n description: 'List vulnerabilities with reachability verdicts, severity, and affected components. Supports on-demand refresh.',\n inputSchema: {\n type: 'object',\n properties: {\n severity: { type: 'string', description: 'Filter by severity level', enum: ['critical', 'high', 'medium', 'low'] },\n verdict: { type: 'string', description: 'Filter by reachability verdict', enum: ['affected', 'not_affected', 'under_investigation'] },\n limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },\n refresh: { type: 'boolean', description: 'Trigger fresh vulnerability enrichment before listing (default: false)', default: false },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_vuln_add',\n description: 'Manually register a CVE against a dependency without querying external databases.',\n inputSchema: {\n type: 'object',\n properties: {\n cveId: { type: 'string', description: 'CVE identifier (e.g., \"CVE-2023-12345\")' },\n package: { type: 'string', description: 'Package name to associate the CVE with' },\n severity: { type: 'number', description: 'CVSS v3.1 base score (optional)' },\n summary: { type: 'string', description: 'Vulnerability summary (optional)' },\n fixedVersion: { type: 'string', description: 'Version that fixes the vulnerability (optional)' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['cveId', 'package'],\n },\n },\n {\n name: 'kirograph_vuln_suppress',\n description: 'Suppress a CVE so it no longer appears in vulnerability reports (mark as false positive or accepted risk). Suppressions are stored in .kirograph/security-suppressions.json.',\n inputSchema: {\n type: 'object',\n properties: {\n cveId: { type: 'string', description: 'CVE identifier to suppress (e.g., \"CVE-2024-1234\")' },\n reason: { type: 'string', description: 'Reason for suppression (optional)' },\n expires: { type: 'string', description: 'Expiry date in ISO format after which the suppression is removed (e.g. \"2026-12-31\", optional)' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['cveId'],\n },\n },\n {\n name: 'kirograph_sbom',\n description: 'Generate and return CycloneDX 1.5 SBOM JSON for the project.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_vex',\n description: 'Generate and return CycloneDX 1.5 VEX JSON with reachability verdicts.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_reachability',\n description: 'Check reachability for a specific dependency or vulnerability. Returns verdict, paths, and impact summary.',\n inputSchema: {\n type: 'object',\n properties: {\n target: { type: 'string', description: 'Dependency name or CVE ID to check reachability for' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n required: ['target'],\n },\n },\n {\n name: 'kirograph_staleness',\n description: 'Check dependency freshness \u2014 identifies packages significantly behind their latest published version.',\n inputSchema: {\n type: 'object',\n properties: {\n threshold: { type: 'number', description: 'Only return packages with staleness_score >= threshold (default: 0.3)', default: 0.3 },\n refresh: { type: 'boolean', description: 'Fetch latest version info from registries before listing (default: false)', default: false },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_licenses',\n description: 'Show dependency licenses and check against the configured license policy (deny/warn lists). Supports wildcard patterns (e.g. GPL-* matches GPL-2.0, GPL-3.0-only).',\n inputSchema: {\n type: 'object',\n properties: {\n policy: { type: 'boolean', description: 'Return only policy violations (default: false)', default: false },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_attack_surface',\n description: 'Map the attack surface: all HTTP routes and their paths to vulnerable dependencies, with hop count, authentication status, and risk score.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max routes to return (default: 20)', default: 20 },\n publicOnly: { type: 'boolean', description: 'Only return public/unauthenticated routes', default: false },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_secrets',\n description: 'Scan for hardcoded secrets and credentials, enriched with call-graph blast radius showing which entry points reach the secret.',\n inputSchema: {\n type: 'object',\n properties: {\n includeTests: { type: 'boolean', description: 'Include test files in scan', default: false },\n severity: { type: 'string', description: 'Filter by severity: critical, high, medium, low', enum: ['critical', 'high', 'medium', 'low'] },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_security_flows',\n description: 'SAST-lite: detect dangerous data flows (SQL injection, dangerous eval, unsafe deserialization, path traversal, weak crypto). Each finding tagged with OWASP Top 10 category.',\n inputSchema: {\n type: 'object',\n properties: {\n type: { type: 'string', description: 'Filter by type: sql, eval, deserialize, path, crypto, all', default: 'all' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_supply_chain',\n description: 'Supply chain health: OpenSSF Scorecard scores, maintainer count, abandoned package detection for project dependencies.',\n inputSchema: {\n type: 'object',\n properties: {\n threshold: { type: 'string', description: 'Minimum risk level: critical, high, medium', enum: ['critical', 'high', 'medium'] },\n refresh: { type: 'boolean', description: 'Re-fetch from APIs', default: false },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_dep_confusion',\n description: 'Detect dependency confusion vulnerabilities: internal package names that exist in public registries (typosquatting/supply chain attack vectors).',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_remediation',\n description: 'Remediation SLA tracking: which vulnerabilities are overdue for fixing based on severity thresholds (critical=7d, high=30d, medium=90d).',\n inputSchema: {\n type: 'object',\n properties: {\n overdueOnly: { type: 'boolean', description: 'Show only overdue items', default: false },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n // \u2500\u2500 Pattern tools (require enablePatterns=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_pattern_coverage',\n description: 'OWASP Top 10 coverage report: shows which vulnerability categories are covered by bundled pattern rules and how many matches exist in each.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_pattern_save_baseline',\n description: 'Save current pattern match counts as a baseline for future diffing.',\n inputSchema: {\n type: 'object',\n properties: {\n label: { type: 'string', description: 'Baseline label (default: \"default\")', default: 'default' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n {\n name: 'kirograph_pattern_diff',\n description: 'Diff current pattern matches against a saved baseline. Shows new findings, resolved findings, and unchanged counts.',\n inputSchema: {\n type: 'object',\n properties: {\n label: { type: 'string', description: 'Baseline label (default: \"default\")', default: 'default' },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n },\n];\n\n/**\n * Dynamic tool definition for kirograph_live_search.\n * NOT included in the static `tools` array \u2014 injected into tools/list at runtime\n * only when config.enablePatterns === true AND @ast-grep/napi is available.\n * NOT added to KIROGRAPH_TOOL_NAMES (which is a static list for Kiro autoApprove).\n */\nexport const LIVE_SEARCH_TOOL_DEFINITION: ToolDefinition = {\n name: 'kirograph_live_search',\n description:\n 'Run a live AST pattern search against the indexed file list using @ast-grep/napi. Finds structural code patterns (SQL injection, eval, path traversal, etc.) without needing the codebase to be re-indexed. Only available when enablePatterns: true.',\n inputSchema: {\n type: 'object' as const,\n required: ['pattern', 'language'],\n properties: {\n pattern: { type: 'string', description: 'ast-grep inline pattern (e.g. \"eval($X)\")' },\n language: { type: 'string', description: 'Language to search: javascript, typescript, python, go, rust, java, etc.' },\n limit: { type: 'number', description: 'Max results (default 20, max 100)', default: 20 },\n projectPath: { type: 'string', description: 'Project root path (optional)' },\n },\n },\n};\n\nexport class ToolHandler {\n private defaultCg: KiroGraph | null;\n private connections = new Map<string, KiroGraph>();\n /** Anti-loop: track recent data_query calls per dataset for pagination detection. */\n private queryTracker = new Map<string, { offsets: number[]; lastCall: number }>();\n\n constructor(cg: KiroGraph | null) {\n this.defaultCg = cg;\n }\n\n setDefaultKiroGraph(cg: KiroGraph): void {\n this.defaultCg = cg;\n }\n\n /** Close all cached cross-project connections. */\n closeAll(): void {\n for (const cg of this.connections.values()) {\n try { cg.close(); } catch { /* ignore */ }\n }\n this.connections.clear();\n }\n\n /** Anti-loop: detect pagination patterns and warn the agent. */\n private checkPaginationLoop(dataset: string, offset: number | undefined, response: string): string {\n const now = Date.now();\n const key = dataset;\n const currentOffset = offset ?? 0;\n\n // Clean stale entries (older than 60s)\n for (const [k, v] of this.queryTracker) {\n if (now - v.lastCall > 60_000) this.queryTracker.delete(k);\n }\n\n const entry = this.queryTracker.get(key) ?? { offsets: [], lastCall: 0 };\n entry.offsets.push(currentOffset);\n entry.lastCall = now;\n\n // Keep only last 10 offsets\n if (entry.offsets.length > 10) entry.offsets = entry.offsets.slice(-10);\n this.queryTracker.set(key, entry);\n\n // Check for pagination pattern: >5 calls with incrementing offsets\n if (entry.offsets.length > 5) {\n const recent = entry.offsets.slice(-6);\n let isIncrementing = true;\n for (let i = 1; i < recent.length; i++) {\n if (recent[i]! <= recent[i - 1]!) { isIncrementing = false; break; }\n }\n if (isIncrementing) {\n return response + '\\n\\n\u26A0 Pagination detected. Consider using kirograph_data_aggregate for summary statistics instead of paginating through all rows.';\n }\n }\n\n return response;\n }\n\n private async getConnection(projectPath?: string): Promise<KiroGraph | null> {\n if (!projectPath) return this.defaultCg;\n // Normalize and validate: must be an absolute path after resolution\n const resolved = path.resolve(projectPath);\n if (!path.isAbsolute(resolved)) return null;\n if (this.connections.has(resolved)) return this.connections.get(resolved)!;\n try {\n const cg = await KiroGraph.open(resolved);\n this.connections.set(resolved, cg);\n return cg;\n } catch {\n return null;\n }\n }\n\n async handle(toolName: string, args: Record<string, unknown>): Promise<{ content: Array<{ type: 'text'; text: string }>; isError?: boolean }> {\n try {\n const text = await this.dispatch(toolName, args);\n const truncated = truncate(text);\n\n // Track graph/memory tool savings (skip exec/gain \u2014 they track themselves)\n if (toolName !== 'kirograph_exec' && toolName !== 'kirograph_gain') {\n try {\n const projectRoot = (args.projectPath as string) || this.defaultCg?.getProjectRoot() || process.cwd();\n const { estimateNaiveCost } = await Promise.resolve().then(() => require('../compression/naive-cost.js'));\n const { estimateTokens } = await Promise.resolve().then(() => require('../compression/index.js'));\n const outputTokens = estimateTokens(truncated);\n const naiveCost = estimateNaiveCost(toolName, outputTokens, args);\n if (naiveCost !== null && naiveCost > outputTokens) {\n const tracker = new TokenTracker(projectRoot);\n if (toolName.startsWith('kirograph_mem_')) {\n tracker.recordMemorySaving(toolName, outputTokens, naiveCost);\n } else if (toolName.startsWith('kirograph_docs_')) {\n tracker.recordDocsSaving(toolName, outputTokens, naiveCost);\n } else if (toolName.startsWith('kirograph_data_')) {\n tracker.recordDataSaving(toolName, outputTokens, naiveCost);\n } else {\n tracker.recordGraphSaving(toolName, outputTokens, naiveCost);\n }\n }\n } catch { /* non-critical */ }\n }\n\n return { content: [{ type: 'text', text: truncated }] };\n } catch (err) {\n logError('MCP tool error', { tool: toolName, error: err });\n const message = err instanceof Error ? err.message : String(err);\n return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };\n }\n }\n\n private async dispatch(toolName: string, args: Record<string, unknown>): Promise<string> {\n // Tools that don't require an initialized graph\n if (toolName === 'kirograph_exec') {\n const cmd = args.command as string;\n if (!cmd) return 'Error: command is required.';\n\n const projectRoot = (args.projectPath as string) || (args.cwd as string) || process.cwd();\n const execCwd = (args.cwd as string) || projectRoot;\n\n // Read default level from config if not explicitly provided\n let defaultLevel: 'normal' | 'aggressive' | 'ultra' = 'normal';\n try {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const config = await loadConfig(projectRoot);\n if (config.shellCompressionLevel && config.shellCompressionLevel !== 'off') {\n defaultLevel = config.shellCompressionLevel as 'normal' | 'aggressive' | 'ultra';\n }\n } catch { /* no config \u2014 use default */ }\n\n const level = (args.level as 'normal' | 'aggressive' | 'ultra') ?? defaultLevel;\n const timeout = ((args.timeout as number) ?? 60) * 1000;\n\n let rawOutput: string;\n let exitCode = 0;\n try {\n rawOutput = execSync(cmd, {\n cwd: execCwd,\n timeout,\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 10 * 1024 * 1024,\n });\n } catch (err: any) {\n // Command failed \u2014 capture output anyway\n rawOutput = (err.stdout || '') + (err.stderr || '');\n exitCode = err.status ?? 1;\n }\n\n const result = compress(cmd, rawOutput, { level, preserveErrors: exitCode !== 0 });\n\n // Track savings\n const tracker = new TokenTracker(projectRoot);\n tracker.record(cmd, result.originalTokens, result.compressedTokens, result.strategy);\n\n const header = exitCode !== 0 ? `[exit ${exitCode}] ` : '';\n const footer = result.savings > 5\n ? `\\n\\n[${result.savings}% tokens saved | ${result.originalTokens}\u2192${result.compressedTokens} | ${result.strategy}]`\n : '';\n\n return `${header}${result.output}${footer}`;\n }\n\n if (toolName === 'kirograph_gain') {\n const projectRoot = (args.projectPath as string) || process.cwd();\n const period = (args.period as string) ?? 'session';\n const tracker = new TokenTracker(projectRoot);\n const stats = tracker.getStats(period as 'session' | 'today' | 'week' | 'all');\n\n if (stats.totalCommands === 0) {\n return 'No savings recorded yet. Use kirograph tools and kirograph_exec \u2014 savings are tracked automatically.';\n }\n\n const lines = [\n `Token Savings (${period}):`,\n ` Total calls: ${stats.totalCommands}`,\n ` Tokens without KiroGraph: ~${stats.totalOriginal.toLocaleString()}`,\n ` Tokens with KiroGraph: ~${stats.totalCompressed.toLocaleString()}`,\n ` Saved: ${stats.totalSaved.toLocaleString()} tokens (${stats.savingsPercent}%)`,\n ];\n\n // Source breakdown\n if (stats.bySource.exec.count > 0 || stats.bySource.graph.count > 0 || stats.bySource.memory.count > 0 || stats.bySource.docs.count > 0) {\n lines.push('', 'By source:');\n if (stats.bySource.graph.count > 0) {\n lines.push(` Graph tools: ${stats.bySource.graph.count} calls, ~${stats.bySource.graph.saved.toLocaleString()} tokens saved (vs file reads/grep)`);\n }\n if (stats.bySource.docs.count > 0) {\n lines.push(` Docs tools: ${stats.bySource.docs.count} calls, ~${stats.bySource.docs.saved.toLocaleString()} tokens saved (vs reading full doc files)`);\n }\n if (stats.bySource.data.count > 0) {\n lines.push(` Data tools: ${stats.bySource.data.count} calls, ~${stats.bySource.data.saved.toLocaleString()} tokens saved (vs loading raw data files)`);\n }\n if (stats.bySource.exec.count > 0) {\n lines.push(` Compression: ${stats.bySource.exec.count} calls, ~${stats.bySource.exec.saved.toLocaleString()} tokens saved (vs raw output)`);\n }\n if (stats.bySource.memory.count > 0) {\n lines.push(` Memory: ${stats.bySource.memory.count} calls, ~${stats.bySource.memory.saved.toLocaleString()} tokens saved (vs re-discovering context)`);\n }\n }\n\n if (Object.keys(stats.byFamily).length > 0) {\n lines.push('', 'Top families:');\n for (const [family, data] of Object.entries(stats.byFamily).slice(0, 7)) {\n lines.push(` ${family}: ${data.count} calls, ${data.savings}% avg savings`);\n }\n }\n\n if (stats.recentCommands.length > 0) {\n lines.push('', 'Recent:');\n for (const cmd of stats.recentCommands.slice(0, 5)) {\n const tag = cmd.source === 'graph' ? '\uD83D\uDCCA' : '\u26A1';\n lines.push(` ${tag} ${cmd.command.slice(0, 40)} \u2192 ${cmd.savings}% saved`);\n }\n }\n\n return lines.join('\\n');\n }\n\n if (toolName === 'kirograph_read') {\n const filePath = args.path as string;\n if (!filePath) return 'Error: path is required.';\n\n const projectRoot = (args.projectPath as string) || process.cwd();\n const resolvedPath = path.isAbsolute(filePath) ? filePath : path.join(projectRoot, filePath);\n const mode = (args.mode as string) ?? 'full';\n const noCache = (args.noCache as boolean) ?? false;\n\n if (!fs.existsSync(resolvedPath)) {\n return `Error: File not found: ${resolvedPath}`;\n }\n\n const { getFileReadCache } = await Promise.resolve().then(() => require('./cache.js'));\n const { executeReadMode } = await Promise.resolve().then(() => require('./read-modes.js'));\n const cache = getFileReadCache();\n\n // For non-full modes, skip caching logic and use read-modes directly\n if (mode !== 'full') {\n // Get graph connection for map/signatures/imports/exports modes\n let cg: KiroGraph | null = null;\n try {\n cg = await this.getConnection(args.projectPath as string | undefined);\n } catch { /* no graph available */ }\n\n const result = executeReadMode({\n mode: mode as any,\n filePath: resolvedPath,\n start: args.start as number | undefined,\n end: args.end as number | undefined,\n cg,\n });\n\n // Update cache with current content for future diff mode\n cache.read(resolvedPath, true);\n\n return result.content;\n }\n\n // Full mode with caching\n const result = cache.read(resolvedPath, noCache);\n\n if (result.cached) {\n return result.content;\n }\n\n if (result.changed) {\n return `[file changed since last read]\\n\\n${result.content}`;\n }\n\n return result.content;\n }\n\n if (toolName === 'kirograph_budget') {\n const projectRoot = (args.projectPath as string) || process.cwd();\n const reset = (args.reset as boolean) ?? false;\n\n const { BudgetTracker } = await Promise.resolve().then(() => require('../compression/tracker.js'));\n const budget = BudgetTracker.getInstance(projectRoot);\n\n if (reset) {\n budget.reset();\n return 'Context budget counters reset.';\n }\n\n const status = budget.getStatus();\n const lines = [\n 'Context Budget:',\n ` Tokens consumed: ${status.consumed.toLocaleString()}`,\n ` Budget limit: ${status.limit > 0 ? status.limit.toLocaleString() : 'unlimited'}`,\n ` Remaining: ${status.limit > 0 ? status.remaining.toLocaleString() : '\u221E'}`,\n ` Utilization: ${status.utilization}%`,\n ];\n\n if (status.warning) {\n lines.push(`\\n \u26A0 ${status.warning}`);\n }\n\n return lines.join('\\n');\n }\n\n const cg = await this.getConnection(args.projectPath as string | undefined);\n if (!cg) return 'KiroGraph not initialized. Run `kirograph init` in your project first.';\n\n // Write session marker so hooks can detect MCP was consulted\n writeSessionMarker(cg.getProjectRoot());\n\n switch (toolName) {\n case 'kirograph_search': {\n const limit = clampLimit(args.limit as number | undefined, 10);\n const results = cg.searchNodes(\n args.query as string,\n args.kind as NodeKind | undefined,\n limit\n );\n if (results.length === 0) return `No symbols found matching \"${args.query}\".`;\n return results.map(r =>\n `${mapKind(r.node.kind)} ${r.node.name}\\n File: ${r.node.filePath}:${r.node.startLine}\\n Qualified: ${r.node.qualifiedName}`\n ).join('\\n\\n');\n }\n\n case 'kirograph_context': {\n const ctx = await cg.buildContext(args.task as string, {\n maxNodes: (args.maxNodes as number) ?? 20,\n includeCode: (args.includeCode as boolean) ?? true,\n });\n const lines: string[] = [ctx.summary, ''];\n if (ctx.entryPoints.length === 0) {\n lines.push('No matching symbols found. If this is a new feature, consider using kirograph_files to explore the codebase structure.');\n } else {\n lines.push('## Entry Points');\n for (const n of ctx.entryPoints) {\n lines.push(`- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`);\n if (ctx.codeSnippets.has(n.id)) {\n lines.push('```', ctx.codeSnippets.get(n.id)!, '```');\n }\n }\n if (ctx.relatedNodes.length > 0) {\n lines.push('', '## Related Symbols');\n for (const n of ctx.relatedNodes.slice(0, 10)) {\n lines.push(`- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`);\n }\n }\n }\n\n // Memory integration: surface relevant observations if memory is enabled\n try {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (config.enableMemory) {\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n // Collect qualified names from entry points and related nodes\n const qualifiedNames = [\n ...ctx.entryPoints.map((n: any) => n.qualifiedName),\n ...ctx.relatedNodes.slice(0, 5).map((n: any) => n.qualifiedName),\n ].filter(Boolean);\n\n const contextLimit = config.memoryContextLimit ?? 3;\n const contextThreshold = config.memoryContextThreshold ?? 0.3;\n\n // Try linked observations first, fall back to search\n let memResults = mem.getLinkedObservations(qualifiedNames, contextLimit, contextThreshold);\n if (memResults.length === 0) {\n // Fall back to searching by task description\n memResults = (await mem.search(args.task as string, { limit: contextLimit }))\n .filter(r => r.score >= contextThreshold);\n }\n\n if (memResults.length > 0) {\n lines.push('', '## Related Memory');\n for (const r of memResults.slice(0, contextLimit)) {\n const age = formatAge(r.observation.createdAt);\n lines.push(`- [${r.observation.kind}] ${r.observation.content} (${age})`);\n }\n }\n }\n } catch { /* memory is non-critical \u2014 don't fail context on memory errors */ }\n\n // Docs integration: surface relevant doc sections if enabled and docsContextLimit > 0\n try {\n const projectRoot2 = cg.getProjectRoot();\n const config2 = await (await Promise.resolve().then(() => require('../config.js'))).loadConfig(projectRoot2);\n if (config2.enableDocs && config2.docsContextLimit > 0) {\n const db2 = cg.getDatabase();\n db2.applyDocsSchema();\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const docsQueries = new DocsQueries(db2.getRawDb(), projectRoot2);\n\n // Collect qualified names from entry points\n const qNames = ctx.entryPoints.map((n: any) => n.qualifiedName).filter(Boolean);\n\n if (qNames.length > 0) {\n // Find doc sections that reference these symbols\n const docRefs = docsQueries.getRefs({ qualifiedName: qNames[0] });\n const additionalRefs = qNames.slice(1, 5).flatMap(qn => docsQueries.getRefs({ qualifiedName: qn }));\n const allDocRefs = [...docRefs, ...additionalRefs];\n\n // Deduplicate by section ID and take top N\n const seenSections = new Set<string>();\n const uniqueRefs = allDocRefs.filter(r => {\n if (seenSections.has(r.sectionId)) return false;\n seenSections.add(r.sectionId);\n return r.confidence >= config2.docsContextThreshold;\n }).slice(0, config2.docsContextLimit);\n\n if (uniqueRefs.length > 0) {\n lines.push('', '## Related Documentation');\n for (const ref of uniqueRefs) {\n const section = docsQueries.getSection(ref.sectionId);\n if (section) {\n const summary = section.section.summary ?? section.section.title;\n lines.push(`- [${ref.refType}] ${summary} \u2014 ${section.section.filePath} (ID: ${ref.sectionId})`);\n }\n }\n }\n }\n }\n } catch { /* docs is non-critical */ }\n\n // Data integration: surface relevant dataset schemas if enabled and dataContextLimit > 0\n try {\n const projectRoot3 = cg.getProjectRoot();\n const config3 = await (await Promise.resolve().then(() => require('../config.js'))).loadConfig(projectRoot3);\n if (config3.enableData && config3.dataContextLimit > 0) {\n const db3 = cg.getDatabase();\n db3.applyDataSchema();\n\n // Find datasets referenced by the entry point files\n const entryFiles = ctx.entryPoints.map((n: any) => n.filePath).filter(Boolean);\n if (entryFiles.length > 0) {\n const placeholders = entryFiles.map(() => '?').join(', ');\n const dataRefs = db3.getRawDb().all(\n `SELECT DISTINCT d.id, d.file_path, d.row_count, d.column_count\n FROM data_code_refs r JOIN data_datasets d ON r.dataset_id = d.id\n WHERE r.qualified_name IN (${placeholders})`,\n entryFiles,\n ) as any[];\n\n if (dataRefs.length > 0) {\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const dq = new DataQueries(db3.getRawDb());\n const limit = config3.dataContextLimit;\n\n lines.push('', '## Related Data');\n for (const ref of dataRefs.slice(0, limit)) {\n const info = dq.describeDataset(ref.id);\n if (info) {\n const colSummary = info.columns.map(c => `${c.name}:${c.inferredType}`).join(', ');\n lines.push(`- **${ref.id}** (${ref.file_path}) \u2014 ${ref.row_count} rows, ${ref.column_count} cols`);\n lines.push(` Schema: ${colSummary}`);\n }\n }\n }\n }\n }\n } catch { /* data is non-critical */ }\n\n // Security integration: surface vulnerability warnings if enableSecurity is true\n try {\n const projectRootSec = cg.getProjectRoot();\n const configSec = await (await Promise.resolve().then(() => require('../config.js'))).loadConfig(projectRootSec);\n if (configSec.enableSecurity) {\n const dbSec = cg.getDatabase();\n dbSec.applySecuritySchema();\n const rawDbSec = dbSec.getRawDb();\n\n // Collect node IDs from entry points and related nodes\n const contextNodeIds = [\n ...ctx.entryPoints.map((n: any) => n.id),\n ...ctx.relatedNodes.map((n: any) => n.id),\n ].filter(Boolean);\n\n if (contextNodeIds.length > 0) {\n const { getSecurityWarningsForNodes, formatSecurityWarnings } = await Promise.resolve().then(() => require('../security/context-warnings.js'));\n const warnings = getSecurityWarningsForNodes(rawDbSec, contextNodeIds);\n\n if (warnings.length > 0) {\n // Build a name map for entry points\n const nodeNames = new Map<string, string>();\n for (const n of ctx.entryPoints) {\n nodeNames.set(n.id, n.name);\n }\n for (const n of ctx.relatedNodes) {\n nodeNames.set(n.id, n.name);\n }\n\n const secSection = formatSecurityWarnings(warnings, nodeNames);\n if (secSection) {\n lines.push(secSection);\n }\n }\n }\n }\n } catch { /* security is non-critical */ }\n\n // Pattern matches warning (when enablePatterns: true and pattern_matches table exists)\n try {\n const projectRootPat = cg.getProjectRoot();\n const configPat = await (await Promise.resolve().then(() => require('../config.js'))).loadConfig(projectRootPat);\n if ((configPat as any).enablePatterns) {\n const dbPat = cg.getDatabase();\n dbPat.applyPatternsSchema();\n const rawDbPat = dbPat.getRawDb();\n const tableExists = rawDbPat.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (tableExists) {\n // Collect file paths from context nodes\n const contextFiles = [\n ...ctx.entryPoints.map((n: any) => n.filePath),\n ...ctx.relatedNodes.map((n: any) => n.filePath),\n ].filter(Boolean) as string[];\n const uniqueContextFiles = [...new Set(contextFiles)];\n\n if (uniqueContextFiles.length > 0) {\n const placeholders = uniqueContextFiles.map(() => '?').join(',');\n const patternRows: Array<{ file_path: string; pattern_id: string; severity: string; owasp_category: string; line: number }> =\n rawDbPat.all(\n `SELECT file_path, pattern_id, severity, owasp_category, line FROM pattern_matches WHERE file_path IN (${placeholders}) ORDER BY severity DESC LIMIT 5`,\n uniqueContextFiles\n );\n if (patternRows.length > 0) {\n const patternWarnings = patternRows.map(p =>\n `- **${p.pattern_id}** [${p.severity.toUpperCase()}/${p.owasp_category}]: ${p.file_path}:${p.line}`\n ).join('\\n');\n lines.push('', '## \u26A0 Pattern Findings', '', patternWarnings);\n if (patternRows.length === 5) lines.push('', 'More findings \u2014 run `kirograph pattern --list` to see all rules.');\n }\n }\n }\n }\n } catch { /* non-critical */ }\n\n // Context savings estimation\n const graphTokens = lines.join('\\n').length / 4; // rough token estimate\n const uniqueFiles = new Set([\n ...ctx.entryPoints.map((n: any) => n.filePath),\n ...ctx.relatedNodes.map((n: any) => n.filePath),\n ]);\n if (uniqueFiles.size > 0) {\n const naiveTokens = estimateFileTokens(cg.getProjectRoot(), [...uniqueFiles]);\n if (naiveTokens > 0) {\n const savingsPct = Math.round((1 - graphTokens / naiveTokens) * 100);\n if (savingsPct > 0) {\n lines.push('', `---`, `Context savings: ~${Math.round(graphTokens)} tokens (graph) vs ~${naiveTokens} tokens (full files) \u2014 ${savingsPct}% reduction`);\n }\n }\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_callers': {\n const limit = clampLimit(args.limit as number | undefined, 20);\n const results = cg.searchNodes(args.symbol as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.symbol}\" not found in index.`;\n const node = results[0].node;\n const callers = await cg.getCallers(node.id, limit);\n if (callers.length === 0) return `No callers found for \\`${node.name}\\`.`;\n return `Callers of \\`${node.name}\\`:\\n` + callers.map(n =>\n `- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`\n ).join('\\n');\n }\n\n case 'kirograph_callees': {\n const limit = clampLimit(args.limit as number | undefined, 20);\n const results = cg.searchNodes(args.symbol as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.symbol}\" not found in index.`;\n const node = results[0].node;\n const callees = await cg.getCallees(node.id, limit);\n if (callees.length === 0) return `\\`${node.name}\\` doesn't call any indexed symbols.`;\n return `\\`${node.name}\\` calls:\\n` + callees.map(n =>\n `- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`\n ).join('\\n');\n }\n\n case 'kirograph_impact': {\n const results = cg.searchNodes(args.symbol as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.symbol}\" not found in index.`;\n const node = results[0].node;\n const affected = await cg.getImpactRadius(node.id, (args.depth as number) ?? 2);\n if (affected.length === 0) return `No dependents found for \\`${node.name}\\`.`;\n\n let output = `Changing \\`${node.name}\\` may affect ${affected.length} symbol(s):\\n` +\n affected.map(n => `- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`).join('\\n');\n\n // Memory integration: surface observations linked to the target symbol\n try {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (config.enableMemory) {\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const contextLimit = config.memoryContextLimit ?? 3;\n const contextThreshold = config.memoryContextThreshold ?? 0.3;\n const memResults = mem.getLinkedObservations(\n [node.qualifiedName],\n contextLimit,\n contextThreshold\n );\n\n if (memResults.length > 0) {\n output += '\\n\\nRelated Memory:';\n for (const r of memResults) {\n const age = formatAge(r.observation.createdAt);\n output += `\\n- [${r.observation.kind}] ${r.observation.content} (${age})`;\n }\n }\n }\n } catch { /* memory is non-critical */ }\n\n // Check if symbol has pattern matches\n try {\n const rawDbImp = cg.getDatabase().getRawDb();\n const tableExistsImp = rawDbImp.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (tableExistsImp) {\n const symNode = rawDbImp.get('SELECT id FROM nodes WHERE name = ? LIMIT 1', [args.symbol]);\n if (symNode) {\n const patternMatches = rawDbImp.all(\n 'SELECT pattern_id, severity, line FROM pattern_matches WHERE symbol_node_id = ?',\n [(symNode as { id: string }).id]\n ) as Array<{ pattern_id: string; severity: string; line: number }>;\n if (patternMatches.length > 0) {\n output += '\\n\\n\u26A0 This symbol has pattern matches:';\n for (const pm of patternMatches) {\n output += `\\n [${pm.severity.toUpperCase()}] ${pm.pattern_id} at line ${pm.line}`;\n }\n }\n }\n }\n } catch { /* non-critical */ }\n\n return output;\n }\n\n case 'kirograph_node': {\n const results = cg.searchNodes(args.symbol as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.symbol}\" not found in index.`;\n const node = results[0].node;\n const lines = [\n `${mapKind(node.kind)} \\`${node.name}\\``,\n `File: ${node.filePath}:${node.startLine}-${node.endLine}`,\n `Qualified: ${node.qualifiedName}`,\n node.signature ? `Signature: ${node.signature}` : '',\n node.docstring ? `Docs: ${node.docstring}` : '',\n ].filter(Boolean);\n if (args.includeCode) {\n const src = cg.getNodeSource(node);\n if (src) lines.push('', '```', src, '```');\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_status': {\n const stats = await cg.getStats();\n const langLine = Object.entries(stats.filesByLanguage)\n .sort((a, b) => b[1] - a[1])\n .map(([k, v]) => `${k}=${v}`)\n .join(', ');\n const dbMb = (stats.dbSizeBytes / 1024 / 1024).toFixed(2);\n const semanticLines = stats.embeddingsEnabled\n ? [\n ` Semantic search: enabled`,\n ` Semantic model: ${stats.embeddingModel}`,\n ` Semantic engine: ${\n stats.semanticEngine === 'turboquant' ? `turboquant (${stats.vecIndexCount} entries \u00B7 ANN)` :\n stats.semanticEngine === 'turbovec' ? `turbovec (${stats.vecIndexCount} entries \u00B7 ${stats.turbovecBits ?? 4} bits \u00B7 Rust/SIMD)` :\n stats.semanticEngine === 'sqlite-vec' ? `sqlite-vec (${stats.vecIndexCount} entries in ANN index)` :\n stats.semanticEngine === 'orama' ? `orama hybrid (${stats.vecIndexCount} docs in index)` :\n stats.semanticEngine === 'pglite' ? `pglite+pgvector (${stats.vecIndexCount} rows in DB)` :\n stats.semanticEngine === 'lancedb' ? `lancedb (${stats.vecIndexCount} entries in ANN index)` :\n stats.semanticEngine === 'qdrant' ? `qdrant (${stats.vecIndexCount} points in collection)` :\n stats.semanticEngine === 'typesense' ? `typesense (${stats.vecIndexCount} documents in collection)` :\n 'in-process cosine'\n }`,\n ` Embeddings: ${stats.embeddingCount} / ${stats.embeddableNodeCount || stats.nodes} embeddable symbols`,\n ...(stats.engineFallback ? [` \u26A0 Engine fallback: ${stats.engineFallback}`] : []),\n ]\n : [` Semantic search: disabled`];\n const frameworkLine = stats.frameworks.length > 0\n ? ` Frameworks: ${stats.frameworks.join(', ')}`\n : ` Frameworks: none detected`;\n const archLine = stats.architectureEnabled\n ? stats.architectureStats\n ? ` Architecture: enabled \u2014 ${stats.architectureStats.packages} packages, ${stats.architectureStats.layers} layers, ${stats.architectureStats.packageDeps} deps`\n : ` Architecture: enabled (not yet analyzed \u2014 run kirograph index)`\n : ` Architecture: disabled`;\n\n // Docs stats\n let docsLine = ' Documentation: disabled';\n try {\n const { loadConfig: loadCfg } = await Promise.resolve().then(() => require('../config.js'));\n const cfg = await loadCfg(cg.getProjectRoot());\n if (cfg.enableDocs) {\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const rawDb = db.getRawDb();\n const docFiles = rawDb.get('SELECT COUNT(DISTINCT file_path) as cnt FROM doc_sections')?.cnt ?? 0;\n const docSections = rawDb.get('SELECT COUNT(*) as cnt FROM doc_sections')?.cnt ?? 0;\n const docRefs = rawDb.get('SELECT COUNT(*) as cnt FROM doc_code_refs')?.cnt ?? 0;\n docsLine = ` Documentation: enabled \u2014 ${docFiles} files, ${docSections} sections, ${docRefs} code refs`;\n }\n } catch { /* non-critical */ }\n\n // Data stats\n let dataLine = ' Data: disabled';\n try {\n const { loadConfig: loadCfg2 } = await Promise.resolve().then(() => require('../config.js'));\n const cfg2 = await loadCfg2(cg.getProjectRoot());\n if (cfg2.enableData) {\n const rawDb2 = cg.getDatabase().getRawDb();\n cg.getDatabase().applyDataSchema();\n const datasetCount = rawDb2.get('SELECT COUNT(*) as cnt FROM data_datasets')?.cnt ?? 0;\n if (datasetCount > 0) {\n const totalRows = rawDb2.get('SELECT SUM(row_count) as total FROM data_datasets')?.total ?? 0;\n const totalCols = rawDb2.get('SELECT SUM(column_count) as total FROM data_datasets')?.total ?? 0;\n const totalSize = rawDb2.get('SELECT SUM(file_size) as total FROM data_datasets')?.total ?? 0;\n const sizeMb = (totalSize / 1024 / 1024).toFixed(2);\n dataLine = ` Data: enabled \u2014 ${datasetCount} datasets, ${totalRows.toLocaleString()} rows, ${totalCols} columns (${sizeMb} MB source)`;\n } else {\n dataLine = ` Data: enabled (no datasets indexed yet \u2014 run kirograph index)`;\n }\n }\n } catch { /* non-critical */ }\n\n // Security stats\n let securityLine = ' Security: disabled';\n try {\n const { loadConfig: loadCfgSec } = await Promise.resolve().then(() => require('../config.js'));\n const cfgSec = await loadCfgSec(cg.getProjectRoot());\n if (cfgSec.enableSecurity) {\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n const depCount = rawDb.get('SELECT COUNT(*) as cnt FROM sec_dependencies')?.cnt ?? 0;\n const vulnCount = rawDb.get('SELECT COUNT(*) as cnt FROM sec_vulnerabilities')?.cnt ?? 0;\n const affectedCount = rawDb.get(\"SELECT COUNT(*) as cnt FROM sec_reachability WHERE verdict = 'affected'\")?.cnt ?? 0;\n const staleCount = rawDb.get('SELECT COUNT(*) as cnt FROM sec_dependencies WHERE vuln_data_stale = 1')?.cnt ?? 0;\n const staleNote = staleCount > 0 ? ` \u26A0 ${staleCount} stale` : '';\n securityLine = ` Security: enabled \u2014 ${depCount} deps, ${vulnCount} vulns (${affectedCount} affected)${staleNote}`;\n }\n } catch { /* non-critical */ }\n\n // Patterns stats\n let patternsLine = ' Patterns: disabled';\n try {\n const { loadConfig: loadCfgPat } = await Promise.resolve().then(() => require('../config.js'));\n const cfgP = await loadCfgPat(cg.getProjectRoot());\n if ((cfgP as any).enablePatterns) {\n const rawDbP = cg.getDatabase().getRawDb();\n const tableExistsP = rawDbP.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (tableExistsP) {\n const matchCount = rawDbP.get('SELECT COUNT(*) as cnt FROM pattern_matches')?.cnt ?? 0;\n const fileCount = rawDbP.get('SELECT COUNT(DISTINCT file_path) as cnt FROM pattern_matches')?.cnt ?? 0;\n const ruleCount = rawDbP.get('SELECT COUNT(DISTINCT pattern_id) as cnt FROM pattern_matches')?.cnt ?? 0;\n patternsLine = ` Patterns: enabled \u2014 ${matchCount} matches, ${ruleCount} rules triggered, ${fileCount} files`;\n } else {\n patternsLine = ` Patterns: enabled (no data yet \u2014 run kirograph index)`;\n }\n }\n } catch { /* non-critical */ }\n\n // Sync state warning\n const threshold = stats.syncWarningThreshold ?? 10;\n const pendingFiles: number = stats.pendingFiles ?? 0;\n const syncRunning: boolean = stats.syncRunning ?? false;\n const syncLines: string[] = [];\n if (syncRunning) {\n syncLines.push(` \u26A0 Sync is currently running in the background.`);\n }\n if (threshold > 0 && pendingFiles >= threshold) {\n syncLines.push(\n ` \u26A0 Index may be incomplete \u2014 ${pendingFiles} file${pendingFiles !== 1 ? 's' : ''} pending sync.` +\n (syncRunning ? ' Sync is running in background.' : ' Run `kirograph sync` to update.') +\n ` Would you like to wait before proceeding?`\n );\n }\n\n // Token savings summary\n const tracker = new TokenTracker(cg.getProjectRoot());\n const gainStats = tracker.getStats('session');\n const gainLines: string[] = [];\n if (gainStats.totalCommands > 0) {\n gainLines.push(` Compression: ${gainStats.totalCommands} commands, ${gainStats.savingsPercent}% avg savings (${gainStats.totalSaved.toLocaleString()} tokens saved this session)`);\n }\n\n return [\n `KiroGraph Status`,\n ` Project: ${cg.getProjectRoot()}`,\n ` Files indexed: ${stats.files}`,\n ` Symbols: ${stats.nodes}`,\n ` Relationships: ${stats.edges}`,\n ` By kind: ${Object.entries(stats.nodesByKind).map(([k, v]) => `${k}=${v}`).join(', ')}`,\n langLine ? ` By language: ${langLine}` : '',\n frameworkLine,\n archLine,\n docsLine,\n dataLine,\n securityLine,\n patternsLine,\n ` DB size: ${dbMb} MB`,\n ...semanticLines,\n ...syncLines,\n ...gainLines,\n ].filter(Boolean).join('\\n');\n }\n\n case 'kirograph_files': {\n const format = (args.format as string) ?? 'tree';\n const includeMetadata = args.includeMetadata !== false;\n const tree = cg.getFiles({\n filterPath: args.filterPath as string | undefined,\n pattern: args.pattern as string | undefined,\n maxDepth: args.maxDepth as number | undefined,\n });\n\n if (format === 'flat') {\n const flat: string[] = [];\n function flattenTree(nodes: import('../index').FileTreeNode[]): void {\n for (const node of nodes) {\n if (node.type === 'file') {\n const meta = includeMetadata && node.language ? ` [${node.language}${node.symbolCount ? ` \u00B7 ${node.symbolCount}` : ''}]` : '';\n flat.push(`${node.path}${meta}`);\n }\n if (node.children?.length) flattenTree(node.children);\n }\n }\n flattenTree(tree);\n return flat.length > 0 ? flat.join('\\n') : 'No indexed files found.';\n }\n\n if (format === 'grouped') {\n const groups = new Map<string, import('../index').FileTreeNode[]>();\n function groupTree(nodes: import('../index').FileTreeNode[]): void {\n for (const node of nodes) {\n if (node.type === 'file') {\n const dir = node.path.includes('/') ? node.path.slice(0, node.path.lastIndexOf('/')) : '.';\n if (!groups.has(dir)) groups.set(dir, []);\n groups.get(dir)!.push(node);\n }\n if (node.children?.length) groupTree(node.children);\n }\n }\n groupTree(tree);\n const lines: string[] = [];\n for (const [dir, files] of [...groups.entries()].sort()) {\n lines.push(`${dir}/`);\n for (const f of files) {\n const meta = includeMetadata && f.language ? ` [${f.language}${f.symbolCount ? ` \u00B7 ${f.symbolCount}` : ''}]` : '';\n lines.push(` ${f.name}${meta}`);\n }\n }\n return lines.length > 0 ? lines.join('\\n') : 'No indexed files found.';\n }\n\n if (format === 'compact') {\n // rtk-style compact: directory summary with file counts and language breakdown\n const dirStats = new Map<string, { files: number; symbols: number; langs: Map<string, number> }>();\n function compactTree(nodes: import('../index').FileTreeNode[]): void {\n for (const node of nodes) {\n if (node.type === 'file') {\n const dir = node.path.includes('/') ? node.path.slice(0, node.path.lastIndexOf('/')) : '.';\n const stat = dirStats.get(dir) || { files: 0, symbols: 0, langs: new Map() };\n stat.files++;\n stat.symbols += node.symbolCount || 0;\n if (node.language) stat.langs.set(node.language, (stat.langs.get(node.language) || 0) + 1);\n dirStats.set(dir, stat);\n }\n if (node.children?.length) compactTree(node.children);\n }\n }\n compactTree(tree);\n const totalFiles = [...dirStats.values()].reduce((s, d) => s + d.files, 0);\n const totalSymbols = [...dirStats.values()].reduce((s, d) => s + d.symbols, 0);\n const lines: string[] = [`${totalFiles} files, ${totalSymbols} symbols in ${dirStats.size} directories:\\n`];\n for (const [dir, stat] of [...dirStats.entries()].sort()) {\n const langSummary = [...stat.langs.entries()].map(([l, c]) => `${l}:${c}`).join(' ');\n lines.push(`${dir}/ (${stat.files} files, ${stat.symbols} symbols) ${langSummary}`);\n }\n return lines.join('\\n');\n }\n\n // Default: tree format\n const lines: string[] = [];\n function renderTree(nodes: import('../index').FileTreeNode[], prefix: string): void {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const isLast = i === nodes.length - 1;\n const connector = isLast ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 ';\n const childPrefix = prefix + (isLast ? ' ' : '\u2502 ');\n const meta = includeMetadata && node.type === 'file' && node.language\n ? ` [${node.language}${node.symbolCount ? ` \u00B7 ${node.symbolCount} symbols` : ''}]`\n : '';\n lines.push(`${prefix}${connector}${node.name}${meta}`);\n if (node.children?.length) renderTree(node.children, childPrefix);\n }\n }\n renderTree(tree, '');\n return lines.length > 0 ? lines.join('\\n') : 'No indexed files found.';\n }\n\n case 'kirograph_dead_code': {\n const limit = clampLimit(args.limit as number | undefined, 50);\n const dead = cg.findDeadCode(limit);\n if (dead.length === 0) return 'No dead code detected.';\n return `Potential dead code (${dead.length} unexported symbols with no incoming references):\\n` +\n dead.map(n => `- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`).join('\\n');\n }\n\n case 'kirograph_circular_deps': {\n const cycles = cg.findCircularDependencies();\n if (cycles.length === 0) return 'No circular dependencies found.';\n return `Found ${cycles.length} circular dependency cycle(s):\\n` +\n cycles.map((cycle, i) => `Cycle ${i + 1}: ${cycle.join(' \u2192 ')}`).join('\\n');\n }\n\n case 'kirograph_path': {\n const fromResults = cg.searchNodes(args.from as string, undefined, 3);\n const toResults = cg.searchNodes(args.to as string, undefined, 3);\n if (fromResults.length === 0) return `Symbol \"${args.from}\" not found in index.`;\n if (toResults.length === 0) return `Symbol \"${args.to}\" not found in index.`;\n const fromNode = fromResults[0].node;\n const toNode = toResults[0].node;\n const pathNodes = await cg.findPath(fromNode.id, toNode.id);\n if (pathNodes.length === 0) return `No path found between \\`${fromNode.name}\\` and \\`${toNode.name}\\`.`;\n return `Path from \\`${fromNode.name}\\` to \\`${toNode.name}\\` (${pathNodes.length} nodes):\\n` +\n pathNodes.map((n, i) => `${i + 1}. ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`).join('\\n');\n }\n\n case 'kirograph_type_hierarchy': {\n const results = cg.searchNodes(args.symbol as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.symbol}\" not found in index.`;\n const node = results[0].node;\n const direction = (args.direction as 'up' | 'down' | 'both') ?? 'both';\n const hierarchy = cg.getTypeHierarchy(node.id, direction);\n if (hierarchy.length === 0) return `No type hierarchy found for \\`${node.name}\\`.`;\n return `Type hierarchy for \\`${node.name}\\` (direction: ${direction}):\\n` +\n hierarchy.map(n => `- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`).join('\\n');\n }\n\n case 'kirograph_architecture': {\n if (!cg.isArchitectureEnabled()) {\n return 'Architecture analysis is disabled. Set enableArchitecture=true in .kirograph/config.json and re-index.';\n }\n const level = (args.level as string) ?? 'both';\n const includeFiles = args.includeFiles === true;\n const arch = cg.getArchitecture();\n\n const lines: string[] = ['# Architecture'];\n\n if ((level === 'packages' || level === 'both') && arch.packages.length > 0) {\n lines.push('\\n## Packages');\n for (const pkg of arch.packages) {\n const meta = [pkg.language, pkg.version].filter(Boolean).join(', ');\n lines.push(`- **${pkg.name}** (${pkg.path}) [${pkg.source}${meta ? ' \u00B7 ' + meta : ''}]`);\n }\n if (arch.packageDeps.length > 0) {\n lines.push('\\n## Package Dependencies');\n for (const dep of arch.packageDeps) {\n const src = arch.packages.find(p => p.id === dep.sourcePkg)?.name ?? dep.sourcePkg;\n const tgt = arch.packages.find(p => p.id === dep.targetPkg)?.name ?? dep.targetPkg;\n lines.push(`- ${src} \u2192 ${tgt} (${dep.depCount} import${dep.depCount !== 1 ? 's' : ''})`);\n }\n }\n }\n\n if ((level === 'layers' || level === 'both') && arch.layers.length > 0) {\n lines.push('\\n## Layers');\n for (const layer of arch.layers) {\n const fileCount = Object.values(arch.fileLayers).filter(fl => fl.some(l => l.layerId === layer.id)).length;\n lines.push(`- **${layer.name}** [${layer.source}] \u2014 ${fileCount} file${fileCount !== 1 ? 's' : ''}`);\n }\n if (arch.layerDeps.length > 0) {\n lines.push('\\n## Layer Dependencies');\n for (const dep of arch.layerDeps) {\n const src = dep.sourceLayer.replace('layer:', '');\n const tgt = dep.targetLayer.replace('layer:', '');\n lines.push(`- ${src} \u2192 ${tgt} (${dep.depCount})`);\n }\n }\n }\n\n if (includeFiles && (level === 'packages' || level === 'both')) {\n lines.push('\\n## File \u2192 Package');\n for (const [file, pkgIds] of Object.entries(arch.filePackages).slice(0, 50)) {\n const names = pkgIds.map(id => arch.packages.find(p => p.id === id)?.name ?? id).join(', ');\n lines.push(`- ${file}: ${names}`);\n }\n if (Object.keys(arch.filePackages).length > 50) lines.push(' \u2026(truncated)');\n }\n\n if (arch.packages.length === 0 && arch.layers.length === 0) {\n return 'No architecture data found. Run `kirograph index` with enableArchitecture=true.';\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_coupling': {\n if (!cg.isArchitectureEnabled()) {\n return 'Architecture analysis is disabled. Set enableArchitecture=true in .kirograph/config.json and re-index.';\n }\n const sortBy = (args.sortBy as string) ?? 'instability';\n const limit = clampLimit(args.limit as number | undefined, 20);\n const arch = cg.getArchitecture();\n\n if (arch.coupling.length === 0) {\n return 'No coupling data. Run `kirograph index` with enableArchitecture=true.';\n }\n\n const sorted = [...arch.coupling].sort((a, b) => {\n if (sortBy === 'afferent') return b.afferent - a.afferent;\n if (sortBy === 'efferent') return b.efferent - a.efferent;\n return b.instability - a.instability;\n }).slice(0, limit);\n\n const lines = [\n `Coupling Metrics (sorted by ${sortBy}):`,\n '',\n 'Package Ca Ce I',\n '\u2500'.repeat(52),\n ];\n\n for (const c of sorted) {\n const pkg = arch.packages.find(p => p.id === c.packageId);\n const name = (pkg?.name ?? c.packageId).slice(0, 32).padEnd(32);\n const ca = String(c.afferent).padStart(4);\n const ce = String(c.efferent).padStart(4);\n const inst = c.instability.toFixed(2).padStart(5);\n lines.push(`${name} ${ca} ${ce} ${inst}`);\n }\n\n lines.push('', 'Ca=afferent (depended on by), Ce=efferent (depends on), I=instability (Ce/(Ca+Ce))');\n return lines.join('\\n');\n }\n\n case 'kirograph_package': {\n if (!cg.isArchitectureEnabled()) {\n return 'Architecture analysis is disabled. Set enableArchitecture=true in .kirograph/config.json and re-index.';\n }\n const query = (args.package as string).toLowerCase();\n const includeFiles = args.includeFiles !== false;\n const arch = cg.getArchitecture();\n\n const pkg = arch.packages.find(p =>\n p.name.toLowerCase().includes(query) || p.path.toLowerCase().includes(query) || p.id.toLowerCase().includes(query)\n );\n if (!pkg) return `Package \"${args.package}\" not found. Use kirograph_architecture to list all packages.`;\n\n const lines = [\n `## Package: ${pkg.name}`,\n `Path: ${pkg.path}`,\n `Source: ${pkg.source}${pkg.manifestPath ? ` (${pkg.manifestPath})` : ''}`,\n ...(pkg.version ? [`Version: ${pkg.version}`] : []),\n ...(pkg.language ? [`Language: ${pkg.language}`] : []),\n ];\n\n const deps = arch.packageDeps.filter(d => d.sourcePkg === pkg.id);\n const dependents = arch.packageDeps.filter(d => d.targetPkg === pkg.id);\n const coupling = arch.coupling.find(c => c.packageId === pkg.id);\n\n if (coupling) {\n lines.push('', `Coupling: Ca=${coupling.afferent} Ce=${coupling.efferent} I=${coupling.instability.toFixed(2)}`);\n }\n\n if (deps.length > 0) {\n lines.push('', `Depends on (${deps.length}):`);\n for (const dep of deps) {\n const name = arch.packages.find(p => p.id === dep.targetPkg)?.name ?? dep.targetPkg;\n lines.push(` \u2192 ${name} (${dep.depCount} import${dep.depCount !== 1 ? 's' : ''})`);\n }\n }\n\n if (dependents.length > 0) {\n lines.push('', `Depended on by (${dependents.length}):`);\n for (const dep of dependents) {\n const name = arch.packages.find(p => p.id === dep.sourcePkg)?.name ?? dep.sourcePkg;\n lines.push(` \u2190 ${name} (${dep.depCount} import${dep.depCount !== 1 ? 's' : ''})`);\n }\n }\n\n if (pkg.externalDeps && pkg.externalDeps.length > 0) {\n lines.push('', `External deps (${pkg.externalDeps.length}): ${pkg.externalDeps.slice(0, 10).join(', ')}${pkg.externalDeps.length > 10 ? '\u2026' : ''}`);\n }\n\n if (includeFiles) {\n const files = Object.entries(arch.filePackages)\n .filter(([, ids]) => ids.includes(pkg.id))\n .map(([f]) => f)\n .sort();\n if (files.length > 0) {\n lines.push('', `Files (${files.length}):`);\n for (const f of files.slice(0, 30)) lines.push(` ${f}`);\n if (files.length > 30) lines.push(` \u2026and ${files.length - 30} more`);\n }\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_hotspots': {\n const limit = clampLimit(args.limit as number | undefined, 20);\n const hotspots = cg.findHotspots(limit);\n if (hotspots.length === 0) return 'No symbols found in index.';\n const lines = [`Top ${hotspots.length} most-connected symbols (by edge degree):\\n`];\n for (const n of hotspots) {\n lines.push(`${mapKind(n.kind)} \\`${n.name}\\` \u2014 degree ${n.degree} (in: ${n.inDegree}, out: ${n.outDegree})`);\n lines.push(` File: ${n.filePath}:${n.startLine}`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_surprising': {\n const limit = clampLimit(args.limit as number | undefined, 20);\n const connections = cg.findSurprisingConnections(limit);\n if (connections.length === 0) return 'No surprising cross-file connections found.';\n const lines = [`Top ${connections.length} surprising cross-file connections:\\n`];\n for (const c of connections) {\n lines.push(`${mapKind(c.source.kind)} \\`${c.source.name}\\` ${c.kind}\u2192 ${mapKind(c.target.kind)} \\`${c.target.name}\\` (score: ${c.score.toFixed(2)})`);\n lines.push(` ${c.source.filePath} \u2192 ${c.target.filePath}`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_diff': {\n const sm = cg.createSnapshotManager();\n const snapshot = args.snapshot\n ? sm.load(args.snapshot as string)\n : sm.loadLatest();\n if (!snapshot) {\n return args.snapshot\n ? `Snapshot \"${args.snapshot}\" not found. Use \\`kirograph snapshot list\\` to see available snapshots.`\n : 'No snapshots found. Run `kirograph snapshot` to save one first.';\n }\n const diff = sm.diff(snapshot, sm.currentSnapshot());\n const fromDate = new Date(diff.from.timestamp).toISOString().slice(0, 19).replace('T', ' ');\n const lines = [\n `Graph diff: \"${diff.from.label}\" (${fromDate}) \u2192 current`,\n ``,\n `Symbols: +${diff.addedNodes.length} added, -${diff.removedNodes.length} removed`,\n `Edges: +${diff.addedEdges.length} added, -${diff.removedEdges.length} removed`,\n ];\n if (diff.addedNodes.length > 0) {\n lines.push(`\\n## Added symbols (${diff.addedNodes.length})`);\n for (const n of diff.addedNodes.slice(0, 30)) {\n lines.push(`+ ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}`);\n }\n if (diff.addedNodes.length > 30) lines.push(` \u2026and ${diff.addedNodes.length - 30} more`);\n }\n if (diff.removedNodes.length > 0) {\n lines.push(`\\n## Removed symbols (${diff.removedNodes.length})`);\n for (const n of diff.removedNodes.slice(0, 30)) {\n lines.push(`- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}`);\n }\n if (diff.removedNodes.length > 30) lines.push(` \u2026and ${diff.removedNodes.length - 30} more`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_flows': {\n const { getExecutionFlows, traceFlow, detectEntryPoints } = await Promise.resolve().then(() => require('../graph/flows.js'));\n const db = cg.getDatabase();\n\n if (args.entryPoint) {\n // Trace from a specific symbol\n const results = cg.searchNodes(args.entryPoint as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.entryPoint}\" not found in index.`;\n const hops = traceFlow(db, results[0].node.id, (args.maxDepth as number) ?? 10);\n if (hops.length < 2) return `No outgoing call chain found from \"${args.entryPoint}\".`;\n\n const lines = [`## Execution flow from \\`${args.entryPoint}\\``, ''];\n for (let i = 0; i < hops.length; i++) {\n const hop = hops[i];\n const indent = ' '.repeat(i);\n const arrow = i === 0 ? '\u2192' : '\u21B3';\n const conf = hop.confidence && hop.confidence !== 'extracted' ? ` [${hop.confidence}]` : '';\n lines.push(`${indent}${arrow} ${hop.kind} \\`${hop.symbol}\\` \u2014 ${hop.filePath}:${hop.line}${conf}`);\n }\n return lines.join('\\n');\n }\n\n // Auto-detect entry points and trace flows\n const flows = getExecutionFlows(db, {\n maxFlows: (args.maxFlows as number) ?? 10,\n maxDepth: (args.maxDepth as number) ?? 10,\n });\n\n if (flows.length === 0) return 'No execution flows detected. The graph may be too small or have no call edges.';\n\n const lines = [`## Execution Flows (${flows.length} detected)`, ''];\n for (const flow of flows) {\n lines.push(`### \\`${flow.entryPoint}\\` (${flow.entryPointKind}) \u2014 criticality: ${flow.criticality.toFixed(2)}`);\n lines.push(`File: ${flow.entryPointFile}`, '');\n for (let i = 0; i < flow.hops.length; i++) {\n const hop = flow.hops[i];\n const indent = ' '.repeat(Math.min(i, 5));\n const arrow = i === 0 ? '\u2192' : '\u21B3';\n const conf = hop.confidence && hop.confidence !== 'extracted' ? ` [${hop.confidence}]` : '';\n lines.push(`${indent}${arrow} \\`${hop.symbol}\\` (${hop.kind}) \u2014 ${hop.filePath}:${hop.line}${conf}`);\n }\n lines.push('');\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_communities': {\n const { detectCommunities } = await Promise.resolve().then(() => require('../graph/communities.js'));\n const db = cg.getDatabase();\n const result = detectCommunities(db, {\n resolution: (args.resolution as number) ?? 1.0,\n });\n\n if (result.communities.length === 0) return 'No communities detected. The graph may be too small or have no edges.';\n\n const limit = Math.min((args.limit as number) ?? 15, result.communities.length);\n const lines = [\n `## Communities (${result.communities.length} detected, modularity: ${result.modularity.toFixed(3)})`,\n `Graph: ${result.totalNodes} nodes, ${result.totalEdges} edges`,\n '',\n ];\n\n for (const c of result.communities.slice(0, limit)) {\n lines.push(`### ${c.label} (${c.memberCount} symbols)`);\n lines.push(`- Directory: \\`${c.dominantDirectory}\\``);\n lines.push(`- Language: ${c.dominantLanguage}`);\n lines.push(`- Inter-community edges: ${c.interCommunityEdges}`);\n lines.push(`- Top members:`);\n for (const m of c.members.slice(0, 8)) {\n lines.push(` - ${m.kind} \\`${m.name}\\` \u2014 ${m.filePath}`);\n }\n if (c.memberCount > 8) lines.push(` - \u2026and ${c.memberCount - 8} more`);\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_refactor': {\n const { renamePreview, suggestRefactorings } = await Promise.resolve().then(() => require('../graph/refactor.js'));\n const db = cg.getDatabase();\n const mode = args.mode as string;\n\n if (mode === 'rename') {\n if (!args.symbol) return 'Error: \"symbol\" parameter is required for rename mode.';\n const preview = renamePreview(db, args.symbol as string);\n if (!preview) return `Symbol \"${args.symbol}\" not found in index.`;\n\n const lines = [\n `## Rename Preview: \\`${preview.symbol}\\``,\n `Kind: ${preview.kind}`,\n `Defined at: ${preview.filePath}:${preview.line}`,\n `Total references: ${preview.totalReferences}`,\n '',\n ];\n\n if (preview.references.length === 0) {\n lines.push('No references found \u2014 this symbol can be safely renamed without affecting other code.');\n } else {\n // Group by file\n const byFile = new Map<string, typeof preview.references>();\n for (const ref of preview.references) {\n if (!byFile.has(ref.filePath)) byFile.set(ref.filePath, []);\n byFile.get(ref.filePath)!.push(ref);\n }\n\n for (const [file, refs] of byFile) {\n lines.push(`### ${file} (${refs.length} references)`);\n for (const ref of refs.slice(0, 10)) {\n lines.push(`- Line ${ref.line}: \\`${ref.context}\\` (${ref.edgeKind})`);\n }\n if (refs.length > 10) lines.push(` \u2026and ${refs.length - 10} more`);\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n }\n\n if (mode === 'suggest') {\n const suggestions = suggestRefactorings(db, (args.limit as number) ?? 10);\n if (suggestions.length === 0) return 'No refactoring suggestions \u2014 the codebase structure looks clean.';\n\n const lines = [`## Refactoring Suggestions (${suggestions.length})`, ''];\n for (const s of suggestions) {\n const icon = s.priority === 'high' ? '\uD83D\uDD34' : s.priority === 'medium' ? '\uD83D\uDFE1' : '\uD83D\uDFE2';\n lines.push(`${icon} **${s.type}** [${s.priority}]: ${s.description}`);\n lines.push(` Rationale: ${s.rationale}`);\n if (s.symbols.length > 0) {\n lines.push(` Symbols: ${s.symbols.slice(0, 3).join(', ')}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n return 'Unknown mode. Use \"rename\" or \"suggest\".';\n }\n\n // \u2500\u2500 Memory tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_mem_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const results = await mem.search(args.query as string, {\n limit: (args.limit as number) ?? 10,\n kind: args.kind as any,\n sessionId: args.sessionId as string | undefined,\n asOf: args.asOf as number | undefined,\n });\n\n if (results.length === 0) return `No memory observations found for \"${args.query}\".`;\n\n return results.map((r, i) => {\n const age = formatAge(r.observation.createdAt);\n const lines = [`${i + 1}. [${r.observation.kind}] ${r.observation.content} (${age})`];\n if (r.relations && r.relations.length > 0) {\n for (const rel of r.relations) {\n const other = rel.observationA === r.observation.id ? rel.observationB : rel.observationA;\n const icon = rel.relation === 'conflicts_with' ? '\u26A1' : rel.relation === 'supersedes' ? '\u21A9' : '~';\n lines.push(` ${icon} ${rel.relation} ${other} (confidence: ${rel.confidence})${rel.judgmentStatus === 'judged' ? ' (judged)' : ''}`);\n }\n }\n return lines.join('\\n');\n }).join('\\n');\n }\n\n case 'kirograph_mem_store': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const id = await mem.store({\n content: args.content as string,\n kind: (args.kind as any) ?? 'note',\n source: 'agent',\n topicKey: args.topicKey as string | undefined,\n reviewAfter: args.reviewAfter as number | undefined,\n });\n\n if (!id) return 'Observation already exists (duplicate content).';\n return `Stored observation ${id} [${(args.kind as string) ?? 'note'}]`;\n }\n\n case 'kirograph_mem_timeline': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const { sessions, observations } = mem.timeline({\n limit: (args.limit as number) ?? 5,\n sessionId: args.sessionId as string | undefined,\n });\n\n if (sessions.length === 0) return 'No memory sessions found.';\n\n const lines: string[] = [];\n for (const session of sessions) {\n const start = new Date(session.startedAt).toISOString().slice(0, 16).replace('T', ' ');\n const status = session.endedAt ? 'ended' : 'active';\n const obs = observations.get(session.id) ?? [];\n lines.push(`## ${start} [${session.ide ?? 'unknown'}] (${status}, ${obs.length} observations)`);\n for (const o of obs.slice(0, 5)) {\n lines.push(` - [${o.kind}] ${o.content.slice(0, 120)}`);\n }\n if (obs.length > 5) lines.push(` \u2026and ${obs.length - 5} more`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_mem_status': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const stats = mem.getStats();\n const lines = [\n 'KiroGraph Memory Status',\n ` Sessions: ${stats.sessions} (${stats.activeSessions} active)`,\n ` Observations: ${stats.observations}`,\n ` Symbol links: ${stats.links}`,\n ` Embeddings: ${stats.vectors} / ${stats.embeddableCount}`,\n ` Model mismatch: ${stats.modelMismatch ? '\u26A0 yes \u2014 run kirograph mem reembed' : 'no'}`,\n ` Relations: ${stats.relations} (${stats.pendingConflicts} pending)`,\n ` Caveman compression: ${config.cavemanMode !== 'off' ? config.cavemanMode : 'off (storing raw)'}`,\n ];\n return lines.join('\\n');\n }\n\n case 'kirograph_mem_review': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const obs = mem.getObservationsForReview(args.limit as number ?? 20);\n if (obs.length === 0) return 'No overdue observations \u2014 all review_after dates are in the future.';\n const now = Date.now();\n return obs.map((o, i) => {\n const daysOverdue = Math.floor((now - (o.reviewAfter ?? now)) / 86400000);\n return `${i + 1}. [${o.kind}]${o.topicKey ? ` (${o.topicKey})` : ''} ${o.content.slice(0, 120)} \u2014 overdue by ${daysOverdue}d`;\n }).join('\\n');\n }\n\n case 'kirograph_mem_mark_reviewed': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n mem.markReviewed(args.id as string);\n return `Observation ${args.id} marked as reviewed.`;\n }\n\n case 'kirograph_mem_compare': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const relationId = mem.compareObservations({\n observationA: args.observationA as string,\n observationB: args.observationB as string,\n relation: args.relation as any,\n confidence: args.confidence as number ?? 1.0,\n reason: args.reason as string | undefined,\n evidence: args.evidence as string | undefined,\n });\n return `Relation ${relationId} created (${args.relation}, confidence: ${args.confidence ?? 1.0}). Use kirograph_mem_judge to finalize.`;\n }\n\n case 'kirograph_mem_judge': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n mem.judgeRelation(\n args.relationId as string,\n args.relation as any,\n args.confidence as number,\n args.reason as string | undefined,\n args.evidence as string | undefined,\n );\n return `Relation ${args.relationId} judged as [${args.relation}] (confidence: ${args.confidence}).`;\n }\n\n case 'kirograph_mem_capture': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const extracted = mem.capturePassive(args.content as string);\n if (extracted.length === 0) return 'No structured sections found. Use ## Key Learnings, ## Observations, ## Decisions, or ## Key Changes headings.';\n return `Captured ${extracted.length} observation(s):\\n` + extracted.map((e, i) => `${i + 1}. [${e.kind}] ${e.content.slice(0, 100)}${e.id ? '' : ' (duplicate)'}`).join('\\n');\n }\n\n case 'kirograph_mem_save_prompt': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const id = await mem.savePrompt(args.content as string);\n return `Prompt saved as ${id}.`;\n }\n\n case 'kirograph_mem_suggest_topic_key': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const key = mem.suggestTopicKey(args.kind as string, args.title as string);\n return `Suggested topic_key: ${key}`;\n }\n\n case 'kirograph_mem_conflicts_scan': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const candidates = mem.scanConflicts(args.limit as number ?? 50);\n if (candidates.length === 0) return 'No potential conflicts found among recent observations.';\n return `Found ${candidates.length} potential conflict(s):\\n` + candidates.map((c, i) =>\n `${i + 1}. [${c.observationA.kind}] \"${c.observationA.content.slice(0, 80)}\" \u2194 [${c.observationB.kind}] \"${c.observationB.content.slice(0, 80)}\" (similarity: ${c.similarity.toFixed(2)})`\n ).join('\\n') + '\\n\\nUse kirograph_mem_compare to establish relations.';\n }\n\n // \u2500\u2500 Docs tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_docs_toc': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot);\n\n const toc = docs.getToc({ file: args.file as string | undefined, tree: args.tree as boolean | undefined });\n if (toc.length === 0) return args.file ? `No sections found in \"${args.file}\".` : 'No documentation indexed. Run kirograph index.';\n\n const lines: string[] = [];\n const renderEntry = (entry: any, indent: string) => {\n const prefix = '#'.repeat(entry.level || 1);\n const summary = entry.summary ? ` \u2014 ${entry.summary}` : '';\n lines.push(`${indent}${prefix} ${entry.title}${summary}`);\n lines.push(`${indent} ID: ${entry.id}`);\n if (entry.children?.length) {\n for (const child of entry.children) renderEntry(child, indent + ' ');\n }\n };\n\n if (args.tree) {\n for (const entry of toc) renderEntry(entry, '');\n } else {\n for (const entry of toc) {\n const prefix = '#'.repeat(entry.level || 1);\n const summary = entry.summary ? ` \u2014 ${entry.summary}` : '';\n lines.push(`${prefix} ${entry.title} [${entry.filePath}]${summary}`);\n lines.push(` ID: ${entry.id}`);\n }\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_docs_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot, config);\n\n const results = await docs.searchSections(args.query as string, {\n file: args.file as string | undefined,\n limit: (args.limit as number) ?? 10,\n });\n\n if (results.length === 0) return `No documentation sections found matching \"${args.query}\".`;\n\n return results.map((r, i) => {\n const summary = r.section.summary ? `\\n ${r.section.summary}` : '';\n return `${i + 1}. ${r.section.title} [${r.section.filePath}]${summary}\\n ID: ${r.section.id}`;\n }).join('\\n\\n');\n }\n\n case 'kirograph_docs_section': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot);\n\n const result = docs.getSection(args.id as string, { context: args.context as boolean | undefined });\n if (!result) return `Section \"${args.id}\" not found.`;\n\n const lines: string[] = [];\n\n if (result.ancestors?.length) {\n lines.push('Breadcrumb: ' + result.ancestors.map(a => a.title).join(' > ') + ' > ' + result.section.title);\n lines.push('');\n }\n\n lines.push(result.content);\n\n if (result.children?.length) {\n lines.push('', '## Child sections:');\n for (const child of result.children) {\n const summary = child.summary ? ` \u2014 ${child.summary}` : '';\n lines.push(` - ${child.title}${summary} (ID: ${child.id})`);\n }\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_docs_outline': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot);\n\n const outline = docs.getOutline(args.file as string);\n if (outline.length === 0) return `No sections found in \"${args.file}\". Is the file indexed?`;\n\n const lines: string[] = [`Outline: ${args.file}`, ''];\n const renderOutline = (entries: any[], indent: string) => {\n for (const entry of entries) {\n const summary = entry.summary ? ` \u2014 ${entry.summary}` : '';\n lines.push(`${indent}${'#'.repeat(entry.level || 1)} ${entry.title}${summary}`);\n if (entry.children?.length) renderOutline(entry.children, indent + ' ');\n }\n };\n renderOutline(outline, '');\n\n return lines.join('\\n');\n }\n\n case 'kirograph_docs_refs': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot);\n\n const refs = docs.getRefs({\n sectionId: args.sectionId as string | undefined,\n qualifiedName: args.nodeId as string | undefined,\n });\n\n if (refs.length === 0) {\n if (args.sectionId) return `No code references found in section \"${args.sectionId}\".`;\n if (args.nodeId) return `No documentation sections reference \"${args.nodeId}\".`;\n return 'Provide either sectionId or nodeId to look up cross-references.';\n }\n\n return refs.map(r => {\n const direction = args.sectionId ? `\u2192 ${r.qualifiedName}` : `\u2190 ${r.sectionTitle ?? r.sectionId}`;\n return `[${r.refType}] ${direction} (confidence: ${r.confidence.toFixed(2)})`;\n }).join('\\n');\n }\n\n // \u2500\u2500 Data tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_data_list': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n const datasets = dq.listDatasets();\n\n if (datasets.length === 0) return 'No datasets indexed. Run kirograph index or kirograph data reindex.';\n\n return datasets.map(ds => {\n const sizeMb = (ds.fileSize / 1024 / 1024).toFixed(2);\n return `${ds.id} (${ds.format})\\n File: ${ds.filePath}\\n Rows: ${ds.rowCount.toLocaleString()} | Columns: ${ds.columnCount} | Size: ${sizeMb} MB`;\n }).join('\\n\\n');\n }\n\n case 'kirograph_data_describe': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n if (args.column) {\n const col = dq.describeColumn(args.dataset as string, args.column as string);\n if (!col) return `Column \"${args.column}\" not found in dataset \"${args.dataset}\".`;\n return [\n `Column: ${col.name}`,\n `Type: ${col.inferredType}`,\n `Nullable: ${col.nullable} (${(col.nullPct * 100).toFixed(1)}% null)`,\n `Cardinality: ${col.cardinality}`,\n col.minValue ? `Min: ${col.minValue}` : '',\n col.maxValue ? `Max: ${col.maxValue}` : '',\n col.meanValue !== null ? `Mean: ${col.meanValue.toFixed(2)}` : '',\n `Samples: ${col.sampleValues.join(', ')}`,\n ].filter(Boolean).join('\\n');\n }\n\n const result = dq.describeDataset(args.dataset as string);\n if (!result) return `Dataset \"${args.dataset}\" not found. Use kirograph_data_list to see available datasets.`;\n\n const lines = [\n `Dataset: ${result.dataset.id} (${result.dataset.format})`,\n `File: ${result.dataset.filePath}`,\n `Rows: ${result.dataset.rowCount.toLocaleString()} | Columns: ${result.dataset.columnCount}`,\n '',\n 'Columns:',\n ];\n for (const col of result.columns) {\n const nullInfo = col.nullable ? ` (${(col.nullPct * 100).toFixed(0)}% null)` : '';\n const samples = col.sampleValues.length > 0 ? ` \u2014 samples: ${col.sampleValues.slice(0, 3).join(', ')}` : '';\n const summary = col.summary ? ` [${col.summary}]` : '';\n lines.push(` ${col.name}: ${col.inferredType}${nullInfo} [${col.cardinality} distinct]${samples}${summary}`);\n }\n\n // Validation rules\n const rules = dq.validationRules(args.dataset as string);\n if (rules && rules.length > 0) {\n lines.push('', 'Validation rules:');\n for (const r of rules.slice(0, 10)) {\n lines.push(` ${r.column}: ${r.rules.join('; ')}`);\n }\n }\n\n // Sample data hints\n const hints = dq.sampleHints(args.dataset as string);\n if (hints && hints.length > 0) {\n lines.push('', 'Sample data hints:');\n for (const h of hints.slice(0, 10)) {\n lines.push(` ${h.column}: ${h.hint}`);\n }\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_data_query': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const result = dq.queryRows(args.dataset as string, {\n filters: args.filters as any[],\n columns: args.columns as string[],\n limit: (args.limit as number) ?? 100,\n offset: (args.offset as number) ?? 0,\n });\n\n if (!result) return `Dataset \"${args.dataset}\" not found.`;\n if (result.rows.length === 0) return `No rows match the given filters (${result.totalMatching} total in dataset).`;\n\n const header = `${result.rows.length} rows returned (${result.totalMatching} total matching):\\n`;\n const rowStrs = result.rows.slice(0, 50).map((row, i) => {\n const vals = Object.entries(row).map(([k, v]) => `${k}=${v ?? 'null'}`).join(', ');\n return ` ${i + 1}. ${vals}`;\n });\n if (result.rows.length > 50) rowStrs.push(` \u2026and ${result.rows.length - 50} more rows`);\n let response = header + rowStrs.join('\\n');\n\n // Token budget enforcement\n const maxChars = config.dataMaxResponseTokens * 4;\n if (response.length > maxChars) {\n response = response.slice(0, maxChars) + '\\n\\n[truncated: response exceeded token budget]';\n }\n\n // Anti-loop detection\n response = this.checkPaginationLoop(args.dataset as string, args.offset as number | undefined, response);\n\n return response;\n }\n\n case 'kirograph_data_aggregate': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const result = dq.aggregate(args.dataset as string, {\n groupBy: (args.groupBy as string[]) ?? [],\n metrics: (args.metrics as any[]) ?? [],\n filters: args.filters as any[],\n });\n\n if (!result) return `Dataset \"${args.dataset}\" not found.`;\n if (result.rows.length === 0) return 'No results (empty dataset or all rows filtered out).';\n\n const keys = Object.keys(result.rows[0]);\n const header = keys.join(' | ');\n const separator = keys.map(() => '---').join(' | ');\n const rows = result.rows.slice(0, 100).map(row => keys.map(k => row[k] ?? 'null').join(' | '));\n\n let response = `${header}\\n${separator}\\n${rows.join('\\n')}${result.rows.length > 100 ? `\\n\u2026and ${result.rows.length - 100} more groups` : ''}`;\n\n // Token budget enforcement\n const maxChars = config.dataMaxResponseTokens * 4;\n if (response.length > maxChars) {\n response = response.slice(0, maxChars) + '\\n\\n[truncated: response exceeded token budget]';\n }\n\n return response;\n }\n\n case 'kirograph_data_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const cols = dq.searchColumns(args.dataset as string, args.query as string);\n if (cols.length === 0) return `No columns matching \"${args.query}\" in dataset \"${args.dataset}\".`;\n\n return cols.map(c => {\n const samples = c.sampleValues.length > 0 ? ` \u2014 samples: ${c.sampleValues.slice(0, 3).join(', ')}` : '';\n return `${c.name}: ${c.inferredType} [${c.cardinality} distinct]${samples}`;\n }).join('\\n');\n }\n\n case 'kirograph_data_join': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n try {\n const result = dq.join({\n left: args.left as string,\n right: args.right as string,\n leftColumn: args.leftColumn as string,\n rightColumn: args.rightColumn as string,\n type: (args.type as any) ?? 'inner',\n columns: args.columns as string[] | undefined,\n limit: args.limit as number | undefined,\n });\n\n if (!result) return `Dataset not found. Verify both dataset IDs with kirograph_data_list.`;\n\n const joinTypeStr = String(args.type ?? 'inner').toUpperCase();\n const header = `Join: ${args.left}.${args.leftColumn} ${joinTypeStr} JOIN ${args.right}.${args.rightColumn}\\nMatching rows: ${result.totalMatching} (showing ${result.rows.length})`;\n if (result.rows.length === 0) return `${header}\\n\\nNo matching rows.`;\n\n const lines = result.rows.map(r => JSON.stringify(r));\n let response = `${header}\\n\\n${lines.join('\\n')}`;\n\n // Token budget enforcement\n const maxChars = config.dataMaxResponseTokens * 4;\n if (response.length > maxChars) {\n response = response.slice(0, maxChars) + '\\n\\n[truncated: response exceeded token budget]';\n }\n\n return response;\n } catch (err) {\n return `Error: ${err instanceof Error ? err.message : String(err)}`;\n }\n }\n\n case 'kirograph_data_correlations': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const pairs = dq.correlations(args.dataset as string, args.threshold as number | undefined);\n if (pairs === null) return `Dataset \"${args.dataset}\" not found.`;\n if (pairs.length === 0) return `No correlations above threshold ${args.threshold ?? 0.3} found. The dataset may have fewer than 2 numeric columns or no significant correlations.`;\n\n const lines = pairs.map(p =>\n `${p.column1} \u2194 ${p.column2}: ${p.correlation > 0 ? '+' : ''}${p.correlation.toFixed(4)} (${p.strength})`\n );\n return `Correlations for \"${args.dataset}\" (threshold: ${args.threshold ?? 0.3}):\\n\\n${lines.join('\\n')}`;\n }\n\n case 'kirograph_data_quality': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const quality = dq.quality(args.dataset as string);\n if (quality === null) return `Dataset \"${args.dataset}\" not found.`;\n if (quality.length === 0) return `No quality issues detected in \"${args.dataset}\". All columns look healthy.`;\n\n const lines = quality.map(q =>\n `${q.column} (risk: ${(q.riskScore * 100).toFixed(0)}%): ${q.issues.join('; ')}`\n );\n return `Quality report for \"${args.dataset}\" (${quality.length} columns with issues):\\n\\n${lines.join('\\n')}`;\n }\n\n // \u2500\u2500 Security tools (require enableSecurity=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_security': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n if (!config.enableArchitecture) return 'Security requires architecture analysis. Set enableArchitecture: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n const depCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_dependencies`,\n ) ?? { count: 0 };\n\n const vulnCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_vulnerabilities`,\n ) ?? { count: 0 };\n\n const verdictRows: Array<{ verdict: string; count: number }> = rawDb.all(\n `SELECT verdict, COUNT(*) as count FROM sec_reachability GROUP BY verdict`,\n );\n const verdicts: Record<string, number> = {};\n for (const row of verdictRows) {\n verdicts[row.verdict] = row.count;\n }\n\n const staleCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_dependencies WHERE vuln_data_stale = 1`,\n ) ?? { count: 0 };\n\n // Count suppressed CVEs\n const { SuppressionManager: SecSuppressionManager } = await Promise.resolve().then(() => require('../security/suppressions.js'));\n const secSuppressions = new SecSuppressionManager(projectRoot);\n const allCveIds: Array<{ cve_id: string }> = rawDb.all(`SELECT cve_id FROM sec_vulnerabilities`);\n const suppressedCveCount = allCveIds.filter(r => secSuppressions.isSuppressed(r.cve_id)).length;\n const visibleVulnCount = vulnCount.count - suppressedCveCount;\n\n const lines: string[] = [\n '# Security Overview',\n '',\n `Dependencies: ${depCount.count}`,\n `Vulnerabilities: ${visibleVulnCount}${suppressedCveCount > 0 ? ` (${suppressedCveCount} suppressed)` : ''}`,\n ];\n\n if (visibleVulnCount > 0) {\n const affected = verdicts['affected'] ?? 0;\n const notAffected = verdicts['not_affected'] ?? 0;\n const underInvestigation = verdicts['under_investigation'] ?? 0;\n const pending = visibleVulnCount - affected - notAffected - underInvestigation;\n\n lines.push('', '## Reachability Verdicts', '');\n if (affected > 0) lines.push(`\u25CF Affected: ${affected}`);\n if (notAffected > 0) lines.push(`\u25CF Not affected: ${notAffected}`);\n if (underInvestigation > 0) lines.push(`\u25CF Under investigation: ${underInvestigation}`);\n if (pending > 0) lines.push(`\u25CF Pending analysis: ${pending}`);\n }\n\n if (staleCount.count > 0) {\n lines.push('', `\u26A0 ${staleCount.count} dependenc${staleCount.count === 1 ? 'y has' : 'ies have'} stale vulnerability data. Use kirograph_vulns with refresh=true to update.`);\n }\n\n // Check if vulnerability data is stale by age\n const lastVulnCheck = (rawDb.get(\n `SELECT MIN(last_vuln_check) as oldest FROM sec_dependencies WHERE last_vuln_check IS NOT NULL`,\n ) as { oldest: number | null } | undefined)?.oldest;\n if (lastVulnCheck != null) {\n const ageMs = Date.now() - lastVulnCheck;\n const ageDays = ageMs / (1000 * 60 * 60 * 24);\n const maxAge = config.securityEnrichMaxAgeDays ?? 7;\n if (ageDays > maxAge) {\n lines.push('', `\u26A0 Vulnerability data is ${Math.floor(ageDays)} days old (max: ${maxAge}). Run kirograph vulns --refresh to update.`);\n }\n }\n\n // Pattern SAST findings count\n try {\n const rawDbSec = db.getRawDb();\n const tableExistsSec = rawDbSec.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (tableExistsSec) {\n const patternCount = rawDbSec.get('SELECT COUNT(*) as cnt FROM pattern_matches')?.cnt ?? 0;\n if (patternCount > 0) {\n const critCount = rawDbSec.get(\"SELECT COUNT(*) as cnt FROM pattern_matches WHERE severity = 'critical'\")?.cnt ?? 0;\n lines.push(`SAST findings: ${patternCount} pattern matches (${critCount} critical)`);\n }\n }\n } catch { /* non-critical */ }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_vulns': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n // Handle refresh\n if (args.refresh === true) {\n const { OsvAdapter } = await Promise.resolve().then(() => require('../security/vuln/osv-adapter.js'));\n const { VulnerabilityDatabaseClient } = await Promise.resolve().then(() => require('../security/vuln/client.js'));\n\n const adapters = config.securityDatabases.map((dbName: string) => {\n if (dbName.toUpperCase() === 'OSV') return new OsvAdapter();\n return null;\n }).filter(Boolean) as any[];\n\n const client = new VulnerabilityDatabaseClient(adapters, db);\n await client.enrichAll();\n }\n\n // Build query\n let query = `\n SELECT\n v.node_id, v.cve_id, v.severity_score, v.fixed_version, v.summary,\n v.epss_score, v.epss_percentile, v.risk_score,\n d.package_name, d.ecosystem, d.resolved_version, d.declared_constraint,\n r.verdict\n FROM sec_vulnerabilities v\n LEFT JOIN edges e ON e.target = v.node_id AND e.kind = 'has_vulnerability'\n LEFT JOIN sec_dependencies d ON d.node_id = e.source\n LEFT JOIN sec_reachability r ON r.vulnerability_node_id = v.node_id\n WHERE 1=1\n `;\n const params: any[] = [];\n\n // Severity filter\n if (args.severity) {\n const severityRanges: Record<string, [number, number]> = {\n critical: [9.0, 10.0],\n high: [7.0, 8.9],\n medium: [4.0, 6.9],\n low: [0.1, 3.9],\n };\n const range = severityRanges[(args.severity as string).toLowerCase()];\n if (!range) return `Invalid severity: ${args.severity}. Use: critical, high, medium, low`;\n query += ` AND v.severity_score >= ? AND v.severity_score <= ?`;\n params.push(range[0], range[1]);\n }\n\n // Verdict filter\n if (args.verdict) {\n const validVerdicts = ['affected', 'not_affected', 'under_investigation'];\n if (!validVerdicts.includes(args.verdict as string)) {\n return `Invalid verdict: ${args.verdict}. Use: affected, not_affected, under_investigation`;\n }\n query += ` AND r.verdict = ?`;\n params.push(args.verdict);\n }\n\n const limit = clampLimit(args.limit as number | undefined, 20);\n query += ` ORDER BY v.risk_score DESC NULLS LAST LIMIT ?`;\n params.push(limit);\n\n const rows: Array<{\n node_id: string;\n cve_id: string;\n severity_score: number | null;\n fixed_version: string | null;\n summary: string | null;\n epss_score: number | null;\n epss_percentile: number | null;\n risk_score: number | null;\n package_name: string | null;\n ecosystem: string | null;\n resolved_version: string | null;\n declared_constraint: string | null;\n verdict: string | null;\n }> = rawDb.all(query, params);\n\n // Deduplicate by (cve_id, package_name, ecosystem) \u2014 same CVE can appear multiple\n // times when a package is declared in multiple manifests (monorepo).\n const verdictRankMcp = (v: string | null) =>\n v === 'affected' ? 3 : v === 'under_investigation' ? 2 : v === 'not_affected' ? 1 : 0;\n const dedupMapMcp = new Map<string, typeof rows[0]>();\n for (const row of rows) {\n const key = `${row.cve_id}::${row.package_name ?? ''}::${row.ecosystem ?? ''}`;\n const ex = dedupMapMcp.get(key);\n if (!ex || verdictRankMcp(row.verdict) > verdictRankMcp(ex.verdict)) dedupMapMcp.set(key, row);\n }\n const dedupedRowsMcp = [...dedupMapMcp.values()];\n\n // Filter out suppressed CVEs\n const { SuppressionManager } = await Promise.resolve().then(() => require('../security/suppressions.js'));\n const suppressionMgr = new SuppressionManager(projectRoot);\n const suppressedCount = dedupedRowsMcp.filter(row => suppressionMgr.isSuppressed(row.cve_id)).length;\n const filteredRows = dedupedRowsMcp.filter(row => !suppressionMgr.isSuppressed(row.cve_id));\n\n if (filteredRows.length === 0) {\n const noMatch = 'No vulnerabilities found' + ((args.severity || args.verdict) ? ' matching filters.' : '.');\n return suppressedCount > 0 ? `${noMatch} (${suppressedCount} suppressed)` : noMatch;\n }\n\n const { formatFixSuggestion } = await Promise.resolve().then(() => require('../security/export/fix-suggestions.js'));\n\n const lines: string[] = [`Vulnerabilities (${filteredRows.length}${suppressedCount > 0 ? `, ${suppressedCount} suppressed` : ''}):\\n`];\n\n for (const row of filteredRows) {\n const score = row.severity_score;\n let severityLabel: string;\n if (score == null) severityLabel = 'UNKNOWN';\n else if (score >= 9.0) severityLabel = 'CRITICAL';\n else if (score >= 7.0) severityLabel = 'HIGH';\n else if (score >= 4.0) severityLabel = 'MEDIUM';\n else severityLabel = 'LOW';\n\n let verdictLabel: string;\n if (!row.verdict) verdictLabel = 'pending';\n else if (row.verdict === 'affected') verdictLabel = 'affected';\n else if (row.verdict === 'not_affected') verdictLabel = 'not affected';\n else verdictLabel = 'investigating';\n\n const pkg = row.package_name\n ? `${row.package_name}@${row.resolved_version || row.declared_constraint || '?'}`\n : 'unknown package';\n\n const epssNote = row.epss_score != null\n ? ` [EPSS: ${row.epss_score.toFixed(2)}]`\n : '';\n const riskNote = row.risk_score != null\n ? ` [Risk: ${row.risk_score.toFixed(1)}]`\n : '';\n lines.push(`${severityLabel} ${row.cve_id} ${pkg} [${verdictLabel}]${epssNote}${riskNote}`);\n\n if (row.summary && row.summary !== 'Manually registered') {\n const truncSummary = row.summary.length > 120 ? row.summary.slice(0, 120) + '\u2026' : row.summary;\n lines.push(` ${truncSummary}`);\n }\n\n if (row.fixed_version && row.ecosystem && row.package_name) {\n const fix = formatFixSuggestion(row.ecosystem, row.package_name, row.fixed_version);\n if (fix) lines.push(` ${fix}`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_vuln_add': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const cveId = args.cveId as string;\n const pkgName = args.package as string;\n if (!cveId) return 'Error: cveId is required.';\n if (!pkgName) return 'Error: package is required.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n // Find matching Dependency_Node\n const depRow: { node_id: string; ecosystem: string } | undefined = rawDb.get(\n `SELECT node_id, ecosystem FROM sec_dependencies WHERE package_name = ?`,\n [pkgName],\n );\n\n if (!depRow) {\n return `No dependency found matching \"${pkgName}\". Run kirograph index first to discover dependencies.`;\n }\n\n // Create Vulnerability_Node\n const vulnNodeId = `vuln:${cveId}`;\n const now = Date.now();\n const severity = args.severity as number | undefined;\n const summary = (args.summary as string) ?? 'Manually registered';\n const fixedVersion = (args.fixedVersion as string) ?? null;\n\n rawDb.run(\n `INSERT OR REPLACE INTO nodes\n (id, kind, name, qualified_name, file_path, language,\n start_line, end_line, start_column, end_column,\n is_exported, is_async, is_static, is_abstract, updated_at)\n VALUES (?, 'vulnerability', ?, ?, '', 'unknown', 0, 0, 0, 0, 0, 0, 0, 0, ?)`,\n [vulnNodeId, cveId, cveId, now],\n );\n\n rawDb.run(\n `INSERT OR REPLACE INTO sec_vulnerabilities\n (node_id, cve_id, severity_score, affected_ranges, fixed_version, summary, source_database)\n VALUES (?, ?, ?, '[]', ?, ?, 'manual')`,\n [vulnNodeId, cveId, severity ?? null, fixedVersion, summary],\n );\n\n // Create has_vulnerability edge\n rawDb.run(\n `INSERT OR IGNORE INTO edges (source, target, kind, confidence, confidence_score)\n VALUES (?, ?, 'has_vulnerability', 'extracted', 1.0)`,\n [depRow.node_id, vulnNodeId],\n );\n\n return `Registered ${cveId} against ${pkgName}.`;\n }\n\n case 'kirograph_vuln_suppress': {\n const projectRoot = cg.getProjectRoot();\n const cveId = args.cveId as string;\n if (!cveId) return 'Error: cveId is required.';\n\n const { SuppressionManager } = await Promise.resolve().then(() => require('../security/suppressions.js'));\n const manager = new SuppressionManager(projectRoot);\n manager.add(cveId, args.reason as string | undefined, args.expires as string | undefined);\n\n const reasonNote = args.reason ? ` Reason: ${args.reason}.` : '';\n const expiresNote = args.expires ? ` Expires: ${args.expires}.` : '';\n return `${cveId} suppressed.${reasonNote}${expiresNote}`;\n }\n\n case 'kirograph_sbom': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { SBOMExporter } = await Promise.resolve().then(() => require('../security/export/sbom.js'));\n const exporter = new SBOMExporter(db, projectRoot);\n const json = exporter.exportJSON();\n\n return truncate(json);\n }\n\n case 'kirograph_vex': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { VEXExporter } = await Promise.resolve().then(() => require('../security/export/vex.js'));\n const exporter = new VEXExporter(db, projectRoot);\n const json = exporter.exportJSON();\n\n return truncate(json);\n }\n\n case 'kirograph_reachability': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const target = args.target as string;\n if (!target) return 'Error: target is required (dependency name or CVE ID).';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n // Try to find target as a CVE ID in sec_vulnerabilities\n let vulnerabilityNodeId: string | null = null;\n let targetLabel = target;\n\n const vulnRow: { node_id: string } | undefined = rawDb.get(\n `SELECT node_id FROM sec_vulnerabilities WHERE cve_id = ?`,\n [target],\n );\n\n if (vulnRow) {\n vulnerabilityNodeId = vulnRow.node_id;\n } else {\n // Try to find target as a dependency name\n const depRow: { node_id: string; package_name: string } | undefined = rawDb.get(\n `SELECT node_id, package_name FROM sec_dependencies WHERE package_name = ?`,\n [target],\n );\n\n if (depRow) {\n targetLabel = depRow.package_name;\n // Find vulnerabilities linked to this dependency\n const vulnEdge: { target: string } | undefined = rawDb.get(\n `SELECT target FROM edges WHERE source = ? AND kind = 'has_vulnerability' LIMIT 1`,\n [depRow.node_id],\n );\n\n if (vulnEdge) {\n vulnerabilityNodeId = vulnEdge.target;\n } else {\n return `No vulnerabilities found for dependency \"${target}\". The dependency exists but has no known vulnerabilities.`;\n }\n } else {\n return `Target \"${target}\" not found. Provide a valid CVE ID or dependency package name.`;\n }\n }\n\n // Run reachability analysis\n const { ReachabilityAnalyzer } = await Promise.resolve().then(() => require('../security/reachability.js'));\n const analyzer = new ReachabilityAnalyzer(db, config);\n const result = await analyzer.analyze(vulnerabilityNodeId);\n\n const lines: string[] = [\n `# Reachability: ${targetLabel}`,\n '',\n `Verdict: ${result.verdict}`,\n `Reaching entry points: ${result.reachingEntryPointCount}`,\n ];\n\n if (result.paths.length > 0) {\n lines.push('', '## Paths');\n for (const p of result.paths.slice(0, 5)) {\n lines.push(`- From ${p.entryPoint}: ${p.path.join(' \u2192 ')}`);\n }\n if (result.paths.length > 5) {\n lines.push(` \u2026and ${result.paths.length - 5} more paths`);\n }\n }\n\n if (result.unresolvedSymbols.length > 0) {\n lines.push('', '## Unresolved Symbols');\n for (const sym of result.unresolvedSymbols.slice(0, 10)) {\n lines.push(`- ${sym}`);\n }\n if (result.unresolvedSymbols.length > 10) {\n lines.push(` \u2026and ${result.unresolvedSymbols.length - 10} more`);\n }\n }\n\n // Get impact summary if affected\n if (result.verdict === 'affected') {\n const impact = await analyzer.getImpactSummary(vulnerabilityNodeId);\n if (impact) {\n lines.push('', '## Impact Summary');\n if (impact.affectedLayers.length > 0) {\n lines.push(`Affected layers: ${impact.affectedLayers.join(', ')}`);\n }\n lines.push(`Affected entry points: ${impact.affectedEntryPoints.length}`);\n lines.push(`Distinct paths: ${impact.distinctPathCount}`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_staleness': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n const threshold = typeof args.threshold === 'number' ? args.threshold : 0.3;\n\n // Optionally refresh staleness data from registries\n if (args.refresh === true) {\n const { StalenessChecker } = await Promise.resolve().then(() => require('../security/staleness.js'));\n const checker = new StalenessChecker(db);\n await checker.checkAll();\n }\n\n const rows: Array<{\n package_name: string;\n ecosystem: string;\n resolved_version: string | null;\n declared_constraint: string;\n latest_version: string | null;\n latest_published: number | null;\n staleness_score: number | null;\n }> = rawDb.all(\n `SELECT package_name, ecosystem, resolved_version, declared_constraint,\n latest_version, latest_published, staleness_score\n FROM sec_dependencies\n WHERE staleness_score >= ?\n ORDER BY staleness_score DESC`,\n [threshold],\n );\n\n if (rows.length === 0) {\n return `No dependencies found with staleness_score >= ${threshold}.` +\n (args.refresh ? '' : ' Use refresh=true to fetch latest version data from registries.');\n }\n\n const lines: string[] = [`Stale Dependencies (threshold: ${threshold}):\\n`];\n for (const row of rows) {\n const resolved = row.resolved_version ?? row.declared_constraint ?? '?';\n const latest = row.latest_version ?? '?';\n const score = row.staleness_score ?? 0;\n const months = row.latest_published\n ? Math.round((Date.now() - row.latest_published) / (1000 * 60 * 60 * 24 * 30))\n : null;\n const bar = '\u2588'.repeat(Math.round(score * 10)) + '\u2591'.repeat(10 - Math.round(score * 10));\n const monthsStr = months !== null ? `, ${months}mo since latest` : '';\n lines.push(`${row.package_name} (${row.ecosystem}): ${resolved} \u2192 ${latest}${monthsStr}`);\n lines.push(` ${bar} ${score.toFixed(2)}`);\n }\n\n const totalCount: { count: number } = rawDb.get(`SELECT COUNT(*) as count FROM sec_dependencies`) ?? { count: 0 };\n lines.push('', `${rows.length} of ${totalCount.count} dependencies are stale (score >= ${threshold})`);\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_licenses': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n const deps: Array<{\n package_name: string;\n ecosystem: string;\n license: string | null;\n }> = rawDb.all(\n `SELECT package_name, ecosystem, license FROM sec_dependencies ORDER BY ecosystem, package_name`,\n );\n\n const { checkLicensePolicy } = await Promise.resolve().then(() => require('../security/license.js'));\n const policy = config.securityLicensePolicy;\n const violations = checkLicensePolicy(deps, policy);\n\n if (args.policy === true) {\n // Return only violations\n if (violations.length === 0) {\n return 'No license policy violations found.';\n }\n const lines: string[] = ['# License Policy Violations\\n'];\n for (const v of violations) {\n lines.push(`${v.severity.toUpperCase()} ${v.packageName} [${v.ecosystem}] ${v.license}`);\n }\n const denyCount = violations.filter(v => v.severity === 'deny').length;\n const warnCount = violations.filter(v => v.severity === 'warn').length;\n lines.push('');\n if (denyCount > 0) lines.push(`${denyCount} denied license${denyCount !== 1 ? 's' : ''}`);\n if (warnCount > 0) lines.push(`${warnCount} license warning${warnCount !== 1 ? 's' : ''}`);\n return truncate(lines.join('\\n'));\n }\n\n // Full listing\n if (deps.length === 0) {\n return 'No dependencies found. Run kirograph index first.';\n }\n\n const violationMap = new Map<string, 'deny' | 'warn'>();\n for (const v of violations) {\n violationMap.set(`${v.ecosystem}:${v.packageName}`, v.severity);\n }\n\n const lines: string[] = [`# License Report (${deps.length} dependencies)\\n`];\n\n // Violations first\n if (violations.length > 0) {\n lines.push('## Policy Violations\\n');\n for (const v of violations) {\n lines.push(`${v.severity.toUpperCase()} ${v.packageName} [${v.ecosystem}] ${v.license}`);\n }\n lines.push('');\n }\n\n lines.push('## All Dependencies\\n');\n lines.push('package | ecosystem | license | status');\n lines.push('------- | --------- | ------- | ------');\n\n for (const dep of deps) {\n const key = `${dep.ecosystem}:${dep.package_name}`;\n const violation = violationMap.get(key);\n const license = dep.license ?? '(unknown)';\n const status = violation ?? (dep.license ? 'ok' : 'unknown');\n lines.push(`${dep.package_name} | ${dep.ecosystem} | ${license} | ${status}`);\n }\n\n const denyCount = violations.filter(v => v.severity === 'deny').length;\n const warnCount = violations.filter(v => v.severity === 'warn').length;\n const unknownCount = deps.filter(d => !d.license).length;\n\n lines.push('');\n if (denyCount > 0) lines.push(`${denyCount} denied license${denyCount !== 1 ? 's' : ''}`);\n if (warnCount > 0) lines.push(`${warnCount} license warning${warnCount !== 1 ? 's' : ''}`);\n if (unknownCount > 0) lines.push(`${unknownCount} unknown license${unknownCount !== 1 ? 's' : ''}`);\n if (denyCount === 0 && warnCount === 0) lines.push('No policy violations');\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_attack_surface': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { AttackSurfaceAnalyzer } = await Promise.resolve().then(() => require('../security/attack-surface.js'));\n const analyzer = new AttackSurfaceAnalyzer(db);\n const result = await analyzer.analyze();\n\n if (result.totalRoutes === 0) {\n return 'No route nodes found in the graph. Ensure the project has been indexed with architecture analysis enabled.';\n }\n\n const limit = clampLimit(args.limit as number | undefined, 20);\n const routes = (args.publicOnly === true)\n ? result.criticalPaths.filter(r => r.exposureLevel === 'public')\n : result.criticalPaths;\n\n const lines: string[] = [\n '# Attack Surface',\n '',\n `Total routes: ${result.totalRoutes} Public: ${result.publicRoutes} Authenticated: ${result.authenticatedRoutes} Routes with vulns: ${result.routesWithVulns}`,\n '',\n ];\n\n const displayed = routes.slice(0, limit);\n if (displayed.length === 0) {\n lines.push(args.publicOnly === true\n ? 'No public routes with vulnerable dependencies found.'\n : 'No routes with vulnerable dependencies found.');\n } else {\n for (const entry of displayed) {\n const authTag = entry.isAuthenticated ? '[auth]' : '[public]';\n const riskTag = entry.riskScore > 0 ? ` risk=${entry.riskScore.toFixed(1)}` : '';\n lines.push(`${authTag} ${entry.route} (${entry.exposureLevel})${riskTag} ${entry.filePath}`);\n for (const dep of entry.vulnerableDeps.slice(0, 3)) {\n lines.push(` \u2514 ${dep.cveId} via ${dep.packageName} (${dep.hopCount} hop${dep.hopCount !== 1 ? 's' : ''}${dep.verdict ? `, ${dep.verdict}` : ''})`);\n }\n if (entry.vulnerableDeps.length > 3) {\n lines.push(` \u2514 \u2026and ${entry.vulnerableDeps.length - 3} more vulns`);\n }\n }\n if (routes.length > limit) {\n lines.push('', `\u2026and ${routes.length - limit} more routes (increase limit to see all)`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_secrets': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { SecretsScanner } = await Promise.resolve().then(() => require('../security/secrets.js'));\n const scanner = new SecretsScanner(db, projectRoot);\n const result = await scanner.scan({ includeTests: args.includeTests === true });\n\n if (result.totalFindings === 0) {\n return `No secrets found. Scanned ${result.filesScanned} file${result.filesScanned !== 1 ? 's' : ''}.`;\n }\n\n let findings = result.findings;\n if (args.severity) {\n findings = findings.filter(f => f.severity === (args.severity as string));\n }\n\n if (findings.length === 0) {\n return `No secrets found matching severity \"${args.severity}\". Total findings (all severities): ${result.totalFindings}.`;\n }\n\n const lines: string[] = [\n `# Secrets Scan (${result.filesScanned} files scanned)`,\n '',\n `Found: ${result.totalFindings} Critical: ${result.criticalCount} High: ${result.highCount}`,\n '',\n ];\n\n for (const f of findings) {\n lines.push(`${f.severity.toUpperCase()} ${f.type}`);\n lines.push(` ${f.filePath}:${f.line}:${f.column} snippet: ${f.snippet}`);\n if (f.nodeName) {\n lines.push(` in function: ${f.nodeName}`);\n }\n if (f.entryPointCount > 0) {\n lines.push(` reachable from ${f.entryPointCount} entry point${f.entryPointCount !== 1 ? 's' : ''}`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_security_flows': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { DataFlowAnalyzer } = await Promise.resolve().then(() => require('../security/data-flows.js'));\n const analyzer = new DataFlowAnalyzer(db);\n let findings = await analyzer.analyze();\n\n const typeFilter = (args.type as string | undefined) ?? 'all';\n const TYPE_MAP: Record<string, string> = {\n sql: 'sql-injection',\n eval: 'dangerous-eval',\n deserialize: 'unsafe-deserialize',\n path: 'path-traversal',\n crypto: 'hardcoded-crypto',\n };\n\n if (typeFilter !== 'all') {\n const mapped = TYPE_MAP[typeFilter];\n if (!mapped) return `Invalid type filter \"${typeFilter}\". Use: sql, eval, deserialize, path, crypto, all`;\n findings = findings.filter(f => f.type === mapped);\n }\n\n if (findings.length === 0) {\n return typeFilter === 'all'\n ? 'No dangerous data flows detected.'\n : `No \"${typeFilter}\" findings detected.`;\n }\n\n const lines: string[] = [\n `# Security Flows (${findings.length} finding${findings.length !== 1 ? 's' : ''})`,\n '',\n ];\n\n for (const f of findings) {\n lines.push(`${f.severity.toUpperCase()} [${f.owaspCategory}] ${f.type}`);\n lines.push(` ${f.filePath}:${f.line} symbol: ${f.symbol}`);\n lines.push(` ${f.description}`);\n lines.push(` Fix: ${f.recommendation}`);\n lines.push('');\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_supply_chain': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { SupplyChainChecker } = await Promise.resolve().then(() => require('../security/supply-chain.js'));\n const checker = new SupplyChainChecker(db);\n const { results, errors } = await checker.checkAll();\n\n const RISK_ORDER: Record<string, number> = { critical: 0, high: 1, medium: 2, low: 3, unknown: 4 };\n const thresholdArg = args.threshold as string | undefined;\n const thresholdOrder = thresholdArg ? (RISK_ORDER[thresholdArg] ?? 4) : 2; // default: medium and above\n\n const filtered = results\n .filter(r => (RISK_ORDER[r.riskLevel] ?? 4) <= thresholdOrder)\n .sort((a, b) => (RISK_ORDER[a.riskLevel] ?? 4) - (RISK_ORDER[b.riskLevel] ?? 4));\n\n if (filtered.length === 0) {\n return `No supply chain risks found at threshold \"${thresholdArg ?? 'medium'}\" or above. Checked ${results.length} dependencies.`;\n }\n\n const lines: string[] = [\n `# Supply Chain Health (${filtered.length} risks, threshold: ${thresholdArg ?? 'medium'})`,\n '',\n ];\n\n for (const r of filtered) {\n const scoreStr = r.scorecardScore !== null ? ` scorecard=${r.scorecardScore.toFixed(1)}/10` : '';\n const maintainerStr = r.maintainerCount !== null ? ` maintainers=${r.maintainerCount}` : '';\n lines.push(`${r.riskLevel.toUpperCase()} ${r.packageName} (${r.ecosystem})${scoreStr}${maintainerStr}`);\n for (const reason of r.riskReasons) {\n lines.push(` \u2022 ${reason}`);\n }\n }\n\n if (errors.length > 0) {\n lines.push('', `\u26A0 ${errors.length} package${errors.length !== 1 ? 's' : ''} could not be checked (network errors)`);\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_dep_confusion': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { DepConfusionChecker } = await Promise.resolve().then(() => require('../security/dep-confusion.js'));\n const checker = new DepConfusionChecker(db);\n const findings = await checker.check();\n\n if (findings.length === 0) {\n return 'No dependency confusion vulnerabilities detected.';\n }\n\n const RISK_ORDER: Record<string, number> = { critical: 0, high: 1, medium: 2 };\n const sorted = [...findings].sort((a, b) => (RISK_ORDER[a.riskLevel] ?? 3) - (RISK_ORDER[b.riskLevel] ?? 3));\n\n const lines: string[] = [\n `# Dependency Confusion (${findings.length} finding${findings.length !== 1 ? 's' : ''})`,\n '',\n ];\n\n for (const f of sorted) {\n lines.push(`${f.riskLevel.toUpperCase()} ${f.packageName} (${f.ecosystem})`);\n lines.push(` ${f.explanation}`);\n if (f.publicExists && f.publicVersion) {\n lines.push(` Public version: ${f.publicVersion}${f.publicPublishedAt ? ` published: ${f.publicPublishedAt}` : ''}`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_remediation': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { RemediationTracker } = await Promise.resolve().then(() => require('../security/remediation.js'));\n const tracker = new RemediationTracker(db);\n let statuses = tracker.getStatus();\n\n if (args.overdueOnly === true) {\n statuses = statuses.filter(s => s.isOverdue);\n }\n\n if (statuses.length === 0) {\n return args.overdueOnly === true\n ? 'No overdue vulnerabilities found.'\n : 'No open vulnerabilities with SLA tracking data found.';\n }\n\n // Sort: overdue first, then by slaStatus, then by severity desc\n const SLA_ORDER: Record<string, number> = { overdue: 0, warning: 1, no_fix: 2, ok: 3 };\n statuses.sort((a, b) => {\n const slaA = SLA_ORDER[a.slaStatus] ?? 3;\n const slaB = SLA_ORDER[b.slaStatus] ?? 3;\n if (slaA !== slaB) return slaA - slaB;\n return (b.severity ?? 0) - (a.severity ?? 0);\n });\n\n const overdueCount = statuses.filter(s => s.isOverdue).length;\n const warningCount = statuses.filter(s => s.slaStatus === 'warning').length;\n\n const lines: string[] = [\n `# Remediation SLA (${statuses.length} open${overdueCount > 0 ? `, ${overdueCount} overdue` : ''}${warningCount > 0 ? `, ${warningCount} warning` : ''})`,\n '',\n ];\n\n for (const s of statuses) {\n const severityLabel = s.severity == null ? 'UNKNOWN'\n : s.severity >= 9 ? 'CRITICAL'\n : s.severity >= 7 ? 'HIGH'\n : s.severity >= 4 ? 'MEDIUM'\n : 'LOW';\n\n const slaTag = s.slaStatus === 'overdue' ? '[OVERDUE]'\n : s.slaStatus === 'warning' ? '[WARNING]'\n : s.slaStatus === 'no_fix' ? '[NO_FIX]'\n : '[OK]';\n\n lines.push(`${slaTag} ${severityLabel} ${s.cveId} ${s.packageName}`);\n if (s.daysOpen !== null) lines.push(` Open for ${s.daysOpen} day${s.daysOpen !== 1 ? 's' : ''}`);\n if (s.daysWithFixAvailable !== null) lines.push(` Fix available for ${s.daysWithFixAvailable} day${s.daysWithFixAvailable !== 1 ? 's' : ''}`);\n if (s.slaDeadline !== null) {\n const deadlineDate = new Date(s.slaDeadline).toISOString().slice(0, 10);\n lines.push(` SLA deadline: ${deadlineDate}`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_live_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n\n if (!config.enablePatterns) {\n return 'kirograph_live_search requires enablePatterns: true in .kirograph/config.json';\n }\n\n const { PatternRunner } = await Promise.resolve().then(() => require('../patterns/runner.js'));\n const runner = new PatternRunner();\n\n if (!runner.isAvailable()) {\n return 'kirograph_live_search requires @ast-grep/napi. Run: npm install @ast-grep/napi';\n }\n\n const pattern = args.pattern as string;\n const language = args.language as string;\n const rawLimit = typeof args.limit === 'number' ? args.limit : 20;\n const limit = Math.max(1, Math.min(100, Math.round(rawLimit)));\n\n const db = cg.getDatabase();\n const rawDb = db.getRawDb();\n\n const files: Array<{ path: string }> = rawDb.all(\n 'SELECT path FROM files WHERE language = ? LIMIT 5000',\n [language],\n );\n\n const results: Array<{ filePath: string; line: number; matchText: string }> = [];\n let truncated = false;\n\n for (const file of files) {\n if (results.length >= limit) { truncated = true; break; }\n\n let content: string;\n try {\n const fullPath = path.isAbsolute(file.path) ? file.path : path.join(projectRoot, file.path);\n content = fs.readFileSync(fullPath, 'utf8');\n } catch {\n continue;\n }\n\n const matches = await runner.runInline(pattern, language, content);\n for (const m of matches) {\n if (results.length >= limit) { truncated = true; break; }\n results.push({ filePath: file.path, line: m.line, matchText: m.matchText });\n }\n }\n\n if (results.length === 0) {\n return `0 matches for '${pattern}' in ${language} files`;\n }\n\n const lines: string[] = [\n `${results.length} match${results.length !== 1 ? 'es' : ''} for '${pattern}' in ${language} files`,\n '',\n ];\n\n for (const r of results) {\n lines.push(` ${r.filePath}:${r.line}`);\n lines.push(` ${r.matchText}`);\n lines.push('');\n }\n\n if (truncated) {\n lines.push(`[truncated \u2014 showing first ${limit} results; refine your pattern or use --lang to narrow scope]`);\n }\n\n return truncate(lines.join('\\n'));\n }\n\n // \u2500\u2500 Pattern tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_pattern_coverage': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!(config as any).enablePatterns) {\n return 'Pattern analysis is not enabled. Set enablePatterns: true in .kirograph/config.json and run kirograph index.';\n }\n\n // Load all pattern rules to enumerate coverage\n const { PatternLibraryLoader } = await Promise.resolve().then(() => require('../patterns/loader.js'));\n const loader = new PatternLibraryLoader();\n const builtinPath = path.join(__dirname, '../patterns/library');\n const customPath = (config as any).patternLibraryPath as string | undefined;\n let rules: import('../patterns/types').PatternRule[] = [];\n try {\n rules = loader.load(builtinPath, customPath);\n } catch { /* no rules \u2014 continue */ }\n\n // Group rules by owaspCategory prefix (A01\u2013A10)\n const rulesByCategory = new Map<string, import('../patterns/types').PatternRule[]>();\n for (const rule of rules) {\n const prefix = rule.owaspCategory.match(/^(A\\d{2})/)?.[1] ?? rule.owaspCategory;\n if (!rulesByCategory.has(prefix)) rulesByCategory.set(prefix, []);\n rulesByCategory.get(prefix)!.push(rule);\n }\n\n // Query match counts from DB if table exists\n const db = cg.getDatabase();\n db.applyPatternsSchema();\n const rawDb = db.getRawDb();\n const matchCountsByCategory = new Map<string, number>();\n try {\n const tableExists = rawDb.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (tableExists) {\n const rows: Array<{ owasp_category: string; cnt: number }> = rawDb.all(\n 'SELECT owasp_category, COUNT(*) as cnt FROM pattern_matches GROUP BY owasp_category'\n );\n for (const row of rows) {\n const prefix = row.owasp_category.match(/^(A\\d{2})/)?.[1] ?? row.owasp_category;\n matchCountsByCategory.set(prefix, (matchCountsByCategory.get(prefix) ?? 0) + row.cnt);\n }\n }\n } catch { /* non-critical */ }\n\n // All OWASP Top 10 categories\n const owaspTop10 = [\n 'A01', 'A02', 'A03', 'A04', 'A05',\n 'A06', 'A07', 'A08', 'A09', 'A10',\n ];\n const owaspNames: Record<string, string> = {\n A01: 'Broken Access Control',\n A02: 'Cryptographic Failures',\n A03: 'Injection',\n A04: 'Insecure Design',\n A05: 'Security Misconfiguration',\n A06: 'Vulnerable and Outdated Components',\n A07: 'Identification and Authentication Failures',\n A08: 'Software and Data Integrity Failures',\n A09: 'Security Logging and Monitoring Failures',\n A10: 'Server-Side Request Forgery',\n };\n\n const covered: string[] = [];\n const uncovered: string[] = [];\n\n const lines: string[] = [\n '# OWASP Top 10 Pattern Coverage',\n '',\n `Total rules loaded: ${rules.length}`,\n '',\n 'Category | Rules | Matches',\n '-------- | ----- | -------',\n ];\n\n for (const cat of owaspTop10) {\n const catRules = rulesByCategory.get(cat) ?? [];\n const matchCount = matchCountsByCategory.get(cat) ?? 0;\n const label = `${cat}: ${owaspNames[cat] ?? cat}`;\n if (catRules.length > 0) {\n covered.push(label);\n lines.push(`${label} | ${catRules.length} | ${matchCount}`);\n } else {\n uncovered.push(label);\n }\n }\n\n // Extra categories not in top 10\n for (const [cat, catRules] of rulesByCategory.entries()) {\n if (!owaspTop10.includes(cat)) {\n const matchCount = matchCountsByCategory.get(cat) ?? 0;\n lines.push(`${cat} | ${catRules.length} | ${matchCount}`);\n }\n }\n\n if (uncovered.length > 0) {\n lines.push('', `Uncovered categories (${uncovered.length}):`, ...uncovered.map(c => ` - ${c}`));\n }\n\n lines.push('', `Coverage: ${covered.length} / ${owaspTop10.length} OWASP Top 10 categories`);\n\n return lines.join('\\n');\n }\n\n case 'kirograph_pattern_save_baseline': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!(config as any).enablePatterns) {\n return 'Pattern analysis is not enabled. Set enablePatterns: true in .kirograph/config.json and run kirograph index.';\n }\n\n const label = (args.label as string) ?? 'default';\n\n const db = cg.getDatabase();\n db.applyPatternsSchema();\n const rawDb = db.getRawDb();\n\n const tableExists = rawDb.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (!tableExists) {\n return 'No pattern_matches table found. Run kirograph index first to populate pattern data.';\n }\n\n const rows: Array<{ pattern_id: string; cnt: number }> = rawDb.all(\n 'SELECT pattern_id, COUNT(*) as cnt FROM pattern_matches GROUP BY pattern_id'\n );\n\n const baseline: Record<string, number> = {};\n for (const row of rows) {\n baseline[row.pattern_id] = row.cnt;\n }\n\n const kirographDir = path.join(projectRoot, '.kirograph');\n if (!fs.existsSync(kirographDir)) fs.mkdirSync(kirographDir, { recursive: true });\n\n const baselinePath = path.join(kirographDir, `pattern-baseline-${label}.json`);\n fs.writeFileSync(baselinePath, JSON.stringify({ label, savedAt: Date.now(), counts: baseline }, null, 2));\n\n const totalMatches = Object.values(baseline).reduce((s, c) => s + c, 0);\n return `Baseline \"${label}\" saved: ${Object.keys(baseline).length} patterns, ${totalMatches} total matches \u2192 ${baselinePath}`;\n }\n\n case 'kirograph_pattern_diff': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!(config as any).enablePatterns) {\n return 'Pattern analysis is not enabled. Set enablePatterns: true in .kirograph/config.json and run kirograph index.';\n }\n\n const label = (args.label as string) ?? 'default';\n const baselinePath = path.join(projectRoot, '.kirograph', `pattern-baseline-${label}.json`);\n\n if (!fs.existsSync(baselinePath)) {\n return `Baseline \"${label}\" not found. Run kirograph_pattern_save_baseline first.`;\n }\n\n let baseline: { label: string; savedAt: number; counts: Record<string, number> };\n try {\n baseline = JSON.parse(fs.readFileSync(baselinePath, 'utf8'));\n } catch {\n return `Failed to read baseline file: ${baselinePath}`;\n }\n\n const db = cg.getDatabase();\n db.applyPatternsSchema();\n const rawDb = db.getRawDb();\n\n const tableExists = rawDb.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n const currentCounts: Record<string, number> = {};\n if (tableExists) {\n const rows: Array<{ pattern_id: string; cnt: number }> = rawDb.all(\n 'SELECT pattern_id, COUNT(*) as cnt FROM pattern_matches GROUP BY pattern_id'\n );\n for (const row of rows) {\n currentCounts[row.pattern_id] = row.cnt;\n }\n }\n\n const allPatternIds = new Set([...Object.keys(baseline.counts), ...Object.keys(currentCounts)]);\n\n const newFindings: Array<{ id: string; count: number }> = [];\n const resolvedFindings: Array<{ id: string; count: number }> = [];\n const unchanged: Array<{ id: string; count: number }> = [];\n const changed: Array<{ id: string; before: number; after: number; delta: number }> = [];\n\n for (const id of allPatternIds) {\n const before = baseline.counts[id] ?? 0;\n const after = currentCounts[id] ?? 0;\n if (before === 0 && after > 0) {\n newFindings.push({ id, count: after });\n } else if (before > 0 && after === 0) {\n resolvedFindings.push({ id, count: before });\n } else if (before === after) {\n unchanged.push({ id, count: after });\n } else {\n changed.push({ id, before, after, delta: after - before });\n }\n }\n\n const savedDate = new Date(baseline.savedAt).toISOString().slice(0, 16).replace('T', ' ');\n const lines: string[] = [\n `# Pattern Diff: \"${label}\" (saved ${savedDate}) \u2192 current`,\n '',\n `NEW: ${newFindings.length} RESOLVED: ${resolvedFindings.length} CHANGED: ${changed.length} UNCHANGED: ${unchanged.length}`,\n ];\n\n if (newFindings.length > 0) {\n lines.push('', '## New Findings (not in baseline)');\n for (const f of newFindings.sort((a, b) => b.count - a.count)) {\n lines.push(` + ${f.id}: ${f.count} matches`);\n }\n }\n\n if (resolvedFindings.length > 0) {\n lines.push('', '## Resolved (in baseline, not in current)');\n for (const f of resolvedFindings.sort((a, b) => b.count - a.count)) {\n lines.push(` - ${f.id}: was ${f.count} matches`);\n }\n }\n\n if (changed.length > 0) {\n lines.push('', '## Changed');\n for (const f of changed.sort((a, b) => Math.abs(b.delta) - Math.abs(a.delta))) {\n const sign = f.delta > 0 ? '+' : '';\n lines.push(` ~ ${f.id}: ${f.before} \u2192 ${f.after} (${sign}${f.delta})`);\n }\n }\n\n return lines.join('\\n');\n }\n\n // \u2500\u2500 Wiki tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_wiki_ingest': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph', {\n autoResolveConflicts: (config as any).wikiAutoResolveConflicts ?? false,\n });\n wiki.initialize();\n\n const source = args.source as string ?? '';\n const sourceName = args.sourceName as string ?? 'source';\n if (!source) return 'source is required';\n\n if (config.wikiSynthesisMode === 'local') {\n wiki.queueSource(source, sourceName);\n const count = wiki.getQueueCount();\n return `Source \"${sourceName}\" queued for local wiki synthesis (${count} in queue). The agentStop hook will run \"kirograph wiki synthesize\" automatically.`;\n }\n\n const prompt = wiki.getIngestPrompt(source, sourceName);\n return `WIKI_INGEST_PROMPT\\n${prompt}\\n\\nProduce WIKI_DIFF blocks following SCHEMA.md, then call kirograph_wiki_apply_diff with the diff string.`;\n }\n\n case 'kirograph_wiki_apply_diff': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph', {\n autoResolveConflicts: (config as any).wikiAutoResolveConflicts ?? false,\n });\n wiki.initialize();\n\n const diff = args.diff as string ?? '';\n if (!diff) return 'diff is required';\n\n const result = wiki.applyDiff(diff);\n const lines: string[] = ['\u2713 Wiki diff applied'];\n if (result.created.length) lines.push(` Created: ${result.created.join(', ')}`);\n if (result.updated.length) lines.push(` Updated: ${result.updated.join(', ')}`);\n if (result.conflictsResolved.length) lines.push(` Conflicts auto-resolved: ${result.conflictsResolved.join(', ')}`);\n if (result.conflictsPending.length) {\n lines.push(` \u26A1 Conflicts pending (${result.conflictsPending.length}):`);\n for (const c of result.conflictsPending) {\n lines.push(` ${c.page} \u00A7${c.section}: \"${c.existing}\" vs \"${c.incoming}\" (source: ${c.source})`);\n }\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_wiki_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph');\n wiki.initialize();\n\n const query = args.query as string ?? '';\n if (!query) return 'query is required';\n const limit = Math.min(Number(args.limit ?? 5), 20);\n\n const results = wiki.search(query, limit);\n if (results.length === 0) return `No wiki pages found for \"${query}\".`;\n\n const lines = [`Wiki Search: ${query}`, ''];\n for (const { page, score } of results) {\n lines.push(`[${page.slug}] ${page.title} (score: ${score.toFixed(3)})`);\n // Show first non-heading line as preview\n const preview = page.content.split('\\n').find(l => l.trim() && !l.startsWith('#'));\n if (preview) lines.push(` ${preview.trim().slice(0, 120)}`);\n lines.push('');\n }\n return lines.join('\\n').trim();\n }\n\n case 'kirograph_wiki_page': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph');\n wiki.initialize();\n\n const slug = args.slug as string ?? '';\n if (!slug) return 'slug is required';\n\n const page = wiki.getPage(slug);\n if (!page) return `Wiki page \"${slug}\" not found. Use kirograph_wiki_list to see available pages.`;\n\n return page.content;\n }\n\n case 'kirograph_wiki_lint': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph');\n wiki.initialize();\n\n const issues = wiki.lint();\n if (issues.length === 0) return '\u2713 Wiki lint passed \u2014 no issues found.';\n\n const lines = [`Wiki Lint \u2014 ${issues.length} issue(s)`, ''];\n for (const issue of issues) {\n const icon = issue.kind === 'contradiction' ? '\u26A1' : issue.kind === 'orphan' ? '\u25CB' : issue.kind === 'broken_link' ? '\uD83D\uDD17' : '\u26A0';\n lines.push(`${icon} [${issue.kind}] ${issue.slug}`);\n lines.push(` ${issue.detail}`);\n lines.push('');\n }\n return lines.join('\\n').trim();\n }\n\n case 'kirograph_wiki_list': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph');\n wiki.initialize();\n\n const pages = wiki.listPages();\n if (pages.length === 0) return 'Wiki is empty. Use kirograph_wiki_ingest to add pages.';\n\n const stats = wiki.getStats();\n const lines = [\n `Wiki \u2014 ${stats.pageCount} page(s), ${stats.totalSources} total sources`,\n '',\n ];\n for (const page of pages) {\n const date = new Date(page.updatedAt).toISOString().slice(0, 10);\n lines.push(` ${page.slug.padEnd(32)} ${page.title} (${page.sourceCount} src, ${date})`);\n }\n return lines.join('\\n');\n }\n\n default:\n return `Unknown tool: ${toolName}`;\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["KiroGraph", "estimateTokens", "cg", "result", "renderTree", "flattenTree", "groupTree", "lines", "compactTree", "denyCount", "warnCount"]
|
|
4
|
+
"sourcesContent": ["/**\n * KiroGraph MCP Tool Definitions + Handlers\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport { execSync } from 'child_process';\nimport KiroGraph, { findNearestKiroGraphRoot } from '../index';\nimport type { NodeKind } from '../types';\nimport { logError } from '../errors';\nimport { compress, estimateTokens, detectCommandFamily } from '../compression/index';\nimport { TokenTracker } from '../compression/tracker';\nexport { KIROGRAPH_TOOL_NAMES } from './tool-names';\n\nconst MAX_OUTPUT = 15_000;\n\nfunction truncate(s: string): string {\n return s.length > MAX_OUTPUT ? s.slice(0, MAX_OUTPUT) + '\\n\u2026[truncated]' : s;\n}\n\n/** Estimate how many tokens reading the full files would cost (chars / 4 heuristic). */\nfunction estimateFileTokens(projectRoot: string, filePaths: string[]): number {\n let total = 0;\n for (const fp of filePaths) {\n try {\n const fullPath = path.isAbsolute(fp) ? fp : path.join(projectRoot, fp);\n const stat = fs.statSync(fullPath);\n total += Math.round(stat.size / 4);\n } catch {\n // File may not exist or be unreadable \u2014 skip\n }\n }\n return total;\n}\n\nfunction clampLimit(value: number | undefined, defaultValue: number): number {\n const n = typeof value === 'number' ? value : defaultValue;\n return Math.max(1, Math.min(100, Math.round(n)));\n}\n\n/** Map internal kind values to human-readable MCP response kinds. */\nfunction mapKind(kind: string): string {\n if (kind === 'type_alias') return 'type';\n return kind;\n}\n\n/** Write a session marker so hooks can detect MCP was consulted. */\nfunction writeSessionMarker(projectRoot: string): void {\n try {\n const hash = crypto.createHash('sha256').update(projectRoot).digest('hex').slice(0, 16);\n fs.writeFileSync(`/tmp/kirograph-consulted-${hash}`, String(Date.now()));\n } catch { /* best-effort */ }\n}\n\n/** Format a timestamp as a human-readable relative age. */\nfunction formatAge(timestamp: number): string {\n const diff = Date.now() - timestamp;\n const minutes = Math.floor(diff / 60000);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n const weeks = Math.floor(days / 7);\n if (weeks < 5) return `${weeks}w ago`;\n const months = Math.floor(days / 30);\n return `${months}mo ago`;\n}\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: 'object';\n properties: Record<string, { type: string; description: string; enum?: string[]; default?: unknown }>;\n required?: string[];\n };\n}\n\nexport const tools: ToolDefinition[] = [\n {\n name: 'kirograph_search',\n description: 'Quick symbol search by name. Returns locations only (no code). Use kirograph_context for comprehensive task context.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Symbol name or partial name (e.g., \"auth\", \"signIn\", \"UserService\")' },\n kind: {\n type: 'string',\n description: 'Filter by node kind',\n enum: ['function', 'method', 'class', 'interface', 'type_alias', 'variable', 'route', 'component'],\n },\n limit: { type: 'number', description: 'Max results 1-100 (default: 10)', default: 10 },\n projectPath: { type: 'string' },\n },\n required: ['query'],\n },\n },\n {\n name: 'kirograph_context',\n description: 'Build comprehensive context for a task or feature request.',\n inputSchema: {\n type: 'object',\n properties: {\n task: { type: 'string', description: 'Task description or feature name' },\n maxNodes: { type: 'number', description: 'Max symbols to include', default: 20 },\n includeCode: { type: 'boolean', description: 'Include code snippets. Deprecated \u2014 prefer detail.', default: true },\n detail: {\n type: 'string',\n description: 'Code verbosity: full, signatures, or summary',\n enum: ['full', 'signatures', 'summary'],\n default: 'full',\n },\n projectPath: { type: 'string' },\n },\n required: ['task'],\n },\n },\n {\n name: 'kirograph_callers',\n description: 'Find all functions/methods that call a specific symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name to find callers for' },\n limit: { type: 'number', description: 'Max results 1-100 (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_callees',\n description: 'Find all functions/methods that a specific symbol calls.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name to find callees for' },\n limit: { type: 'number', description: 'Max results 1-100 (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_impact',\n description: 'Analyze what code would be affected by changing a symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name to analyze impact for' },\n depth: { type: 'number', description: 'Traversal depth (default: 2)', default: 2 },\n projectPath: { type: 'string' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_node',\n description: 'Get details about a specific symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name to look up' },\n includeCode: { type: 'boolean', description: 'Include full source code. Deprecated \u2014 prefer detail.', default: false },\n detail: {\n type: 'string',\n description: 'Output level: summary, signatures, or full',\n enum: ['summary', 'signatures', 'full'],\n default: 'summary',\n },\n projectPath: { type: 'string' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_status',\n description: 'Check index health and statistics.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_files',\n description: 'List indexed file structure with optional filtering.',\n inputSchema: {\n type: 'object',\n properties: {\n filterPath: { type: 'string', description: 'Filter by directory path prefix (e.g., \"src/\")' },\n pattern: { type: 'string', description: 'Filter by glob pattern (e.g., \"**/*.ts\")' },\n maxDepth: { type: 'number', description: 'Max directory depth to traverse' },\n format: {\n type: 'string',\n description: 'Output format: \"tree\" (default, visual tree), \"flat\" (one path per line), \"grouped\" (grouped by directory), \"compact\" (rtk-style summary with counts)',\n enum: ['tree', 'flat', 'grouped', 'compact'],\n default: 'tree',\n },\n includeMetadata: { type: 'boolean', description: 'Include language and symbol count', default: true },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_dead_code',\n description: 'Find symbols with no incoming references (potential dead code). Only includes unexported symbols.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results 1-100 (default: 50)', default: 50 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_circular_deps',\n description: 'Find circular import dependencies in the codebase.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_path',\n description: 'Find the shortest path between two symbols in the graph.',\n inputSchema: {\n type: 'object',\n properties: {\n from: { type: 'string', description: 'Source symbol name' },\n to: { type: 'string', description: 'Target symbol name' },\n projectPath: { type: 'string' },\n },\n required: ['from', 'to'],\n },\n },\n {\n name: 'kirograph_architecture',\n description: 'Show high-level architecture: packages, layers, dependencies.',\n inputSchema: {\n type: 'object',\n properties: {\n level: {\n type: 'string',\n description: 'packages, layers, or both',\n enum: ['packages', 'layers', 'both'],\n default: 'both',\n },\n includeFiles: { type: 'boolean', description: 'Include per-file package/layer assignments', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_coupling',\n description: 'Package coupling metrics: Ca, Ce, and instability (Ce/(Ca+Ce)).',\n inputSchema: {\n type: 'object',\n properties: {\n sortBy: {\n type: 'string',\n description: 'Sort by instability, ca, ce, or name',\n enum: ['instability', 'afferent', 'efferent'],\n default: 'instability',\n },\n limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_package',\n description: 'Drill into a package: files, exports, and dependencies.',\n inputSchema: {\n type: 'object',\n properties: {\n package: { type: 'string', description: 'Package name or path (partial match accepted)' },\n includeFiles: { type: 'boolean', description: 'List files in the package (default: true)', default: true },\n projectPath: { type: 'string' },\n },\n required: ['package'],\n },\n },\n {\n name: 'kirograph_hotspots',\n description: 'Find the most-connected symbols in the codebase by total edge degree (incoming + outgoing). Useful for identifying load-bearing code, core abstractions, or blast-radius hot zones.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results 1-100 (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_surprising',\n description: 'Find non-obvious cross-file connections: direct edges between symbols in structurally distant parts of the codebase. High-score pairs indicate unexpected coupling worth investigating.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results 1-100 (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_diff',\n description: 'Compare current graph against a saved snapshot.',\n inputSchema: {\n type: 'object',\n properties: {\n snapshot: { type: 'string', description: 'Snapshot label; omit for latest' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_snapshot_save',\n description: 'Save a snapshot of the current graph state. Snapshots can be compared with kirograph_diff to track structural changes over time.',\n inputSchema: {\n type: 'object',\n properties: {\n label: { type: 'string', description: 'Label for the snapshot (default: timestamp-based label)' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_snapshot_list',\n description: 'List all saved graph snapshots with their labels, timestamps, and symbol/edge counts.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_type_hierarchy',\n description: 'Traverse base and derived types of a class or interface.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Class or interface name' },\n direction: {\n type: 'string',\n description: 'up=base, down=derived, both=all',\n enum: ['up', 'down', 'both'],\n default: 'both',\n },\n projectPath: { type: 'string' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_exec',\n description: 'Run a shell command with token-optimized, noise-filtered output.',\n inputSchema: {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'Shell command to execute' },\n cwd: { type: 'string', description: 'Working directory' },\n level: {\n type: 'string',\n description: 'Compression level: \"normal\" (balanced), \"aggressive\" (more compact), \"ultra\" (maximum compression)',\n enum: ['normal', 'aggressive', 'ultra'],\n default: 'normal',\n },\n timeout: { type: 'number', description: 'Timeout in seconds', default: 60 },\n projectPath: { type: 'string' },\n },\n required: ['command'],\n },\n },\n {\n name: 'kirograph_gain',\n description: 'Show token savings from graph tools and shell compression.',\n inputSchema: {\n type: 'object',\n properties: {\n period: {\n type: 'string',\n description: 'Time window: session, hour, day, week, all',\n enum: ['session', 'today', 'week', 'all'],\n default: 'session',\n },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_read',\n description: 'Read a file with caching; unchanged files return cache marker.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path to read (absolute or relative to project root)' },\n mode: {\n type: 'string',\n description: 'Read mode: \"full\" (default), \"map\" (structure overview), \"signatures\" (function signatures), \"diff\" (changes since last read), \"lines\" (line range), \"imports\", \"exports\"',\n enum: ['full', 'map', 'signatures', 'diff', 'lines', 'imports', 'exports'],\n default: 'full',\n },\n start: { type: 'number', description: 'Start line (for lines mode)' },\n end: { type: 'number', description: 'End line (for lines mode)' },\n noCache: { type: 'boolean', description: 'Force fresh read, bypass cache', default: false },\n projectPath: { type: 'string' },\n },\n required: ['path'],\n },\n },\n {\n name: 'kirograph_retrieve',\n description: 'Retrieve cached file content by path (CCR \u2014 Cached Content Retrieval). Returns the full content stored in the session cache, or reads and caches the file if not yet seen. Use after kirograph_read returns a \"[cached: file unchanged]\" marker to get the actual content without a redundant filesystem read.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path to retrieve (absolute or relative to project root)' },\n projectPath: { type: 'string' },\n },\n required: ['path'],\n },\n },\n {\n name: 'kirograph_compress',\n description: 'Compress text via rtk shell filters or caveman grammar engine.',\n inputSchema: {\n type: 'object',\n properties: {\n text: { type: 'string', description: 'Text to compress' },\n command: { type: 'string', description: 'Shell command text came from (selects rtk engine)' },\n level: {\n type: 'string',\n description: 'Compression intensity: \"lite\" / \"normal\" (light), \"full\" / \"aggressive\" (default), \"ultra\" (maximum)',\n enum: ['lite', 'normal', 'full', 'aggressive', 'ultra'],\n default: 'full',\n },\n },\n required: ['text'],\n },\n },\n {\n name: 'kirograph_budget',\n description: 'Show session context budget: tokens used, remaining, utilization.',\n inputSchema: {\n type: 'object',\n properties: {\n reset: { type: 'boolean', description: 'Reset session budget counters', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_flows',\n description: 'Trace execution flows from entry points through the call graph.',\n inputSchema: {\n type: 'object',\n properties: {\n entryPoint: { type: 'string', description: 'Symbol to trace; omit to auto-detect' },\n maxFlows: { type: 'number', description: 'Max number of flows to return (default 10)' },\n maxDepth: { type: 'number', description: 'Max call chain depth (default 10)' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_communities',\n description: 'Detect clusters of related symbols via graph community detection.',\n inputSchema: {\n type: 'object',\n properties: {\n resolution: { type: 'number', description: 'Granularity 0.1\u20132.0; higher=more smaller clusters' },\n limit: { type: 'number', description: 'Max communities to return (default 15)' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_refactor',\n description: 'Rename preview (all references) or function summarization.',\n inputSchema: {\n type: 'object',\n properties: {\n mode: { type: 'string', description: 'rename=preview references, summarize=summary', enum: ['rename', 'suggest'] },\n symbol: { type: 'string', description: 'Symbol name (required for rename mode)' },\n limit: { type: 'number', description: 'Max results (default 10)' },\n projectPath: { type: 'string' },\n },\n required: ['mode'],\n },\n },\n // \u2500\u2500 Memory tools (require enableMemory=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_mem_search',\n description: 'Search project memory for decisions, errors, patterns, context.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Natural language search query' },\n kind: {\n type: 'string',\n description: 'Filter by observation kind',\n enum: ['decision', 'error', 'pattern', 'architecture', 'summary', 'note'],\n },\n limit: { type: 'number', description: 'Max results (default: 10)', default: 10 },\n sessionId: { type: 'string', description: 'Filter to specific session' },\n asOf: { type: 'number', description: 'Query facts valid at this timestamp (epoch ms). Filters out expired/superseded observations.' },\n projectPath: { type: 'string' },\n },\n required: ['query'],\n },\n },\n {\n name: 'kirograph_mem_store',\n description: 'Store an observation in project memory.',\n inputSchema: {\n type: 'object',\n properties: {\n content: { type: 'string', description: 'Observation text' },\n kind: {\n type: 'string',\n description: 'Observation kind',\n enum: ['decision', 'error', 'pattern', 'architecture', 'summary', 'note'],\n default: 'note',\n },\n projectPath: { type: 'string' },\n topicKey: { type: 'string', description: \"Stable semantic key for this observation (e.g. 'architecture/auth-model'). Enables addressing by concept.\" },\n reviewAfter: { type: 'number', description: 'ISO date to flag for review' },\n },\n required: ['content'],\n },\n },\n {\n name: 'kirograph_mem_timeline',\n description: 'List recent sessions and their observations chronologically.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Number of sessions to show', default: 5 },\n sessionId: { type: 'string', description: 'Show observations for a specific session' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_status',\n description: 'Memory subsystem health: sessions, observations, embeddings, size.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Engram-parity mem tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_mem_review',\n description: 'List observations past their review_after date.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_mark_reviewed',\n description: 'Clear review_after date on an observation.',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Observation ID' },\n projectPath: { type: 'string' },\n },\n required: ['id'],\n },\n },\n {\n name: 'kirograph_mem_compare',\n description: 'Establish a typed relation between two observations (supersedes, conflicts_with, compatible, scoped, related, not_conflict). Accepts observation IDs or topic_key values.',\n inputSchema: {\n type: 'object',\n properties: {\n observationA: { type: 'string', description: 'First observation ID or topic_key' },\n observationB: { type: 'string', description: 'Second observation ID or topic_key' },\n relation: { type: 'string', enum: ['supersedes', 'conflicts_with', 'compatible', 'scoped', 'related', 'not_conflict'], description: 'Relation type' },\n confidence: { type: 'number', description: 'Confidence 0.0\u20131.0 (default: 1.0)' },\n reason: { type: 'string', description: 'Explanation of the relation' },\n evidence: { type: 'string', description: 'Supporting evidence text' },\n projectPath: { type: 'string' },\n },\n required: ['observationA', 'observationB', 'relation'],\n },\n },\n {\n name: 'kirograph_mem_judge',\n description: 'Finalize a pending conflict relation \u2014 confirm, revise, or dismiss it.',\n inputSchema: {\n type: 'object',\n properties: {\n relationId: { type: 'string', description: 'Relation ID (from kirograph_mem_compare or kirograph_mem_search)' },\n relation: { type: 'string', enum: ['supersedes', 'conflicts_with', 'compatible', 'scoped', 'related', 'not_conflict'], description: 'Final relation type' },\n confidence: { type: 'number', description: 'Final confidence 0.0\u20131.0' },\n reason: { type: 'string', description: 'Reasoning' },\n evidence: { type: 'string', description: 'Supporting evidence' },\n projectPath: { type: 'string' },\n },\n required: ['relationId', 'relation', 'confidence'],\n },\n },\n {\n name: 'kirograph_mem_capture',\n description: 'Extract and store structured learnings from freeform text.',\n inputSchema: {\n type: 'object',\n properties: {\n content: { type: 'string', description: 'Text block with structured sections' },\n projectPath: { type: 'string' },\n },\n required: ['content'],\n },\n },\n {\n name: 'kirograph_mem_save_prompt',\n description: 'Save the current user prompt to session memory.',\n inputSchema: {\n type: 'object',\n properties: {\n content: { type: 'string', description: 'The user prompt text to save' },\n projectPath: { type: 'string' },\n },\n required: ['content'],\n },\n },\n {\n name: 'kirograph_mem_suggest_topic_key',\n description: 'Suggest a stable topic_key slug for an observation.',\n inputSchema: {\n type: 'object',\n properties: {\n kind: { type: 'string', enum: ['decision', 'error', 'pattern', 'architecture', 'summary', 'note'], description: 'Observation kind' },\n title: { type: 'string', description: 'Short description of the observation' },\n projectPath: { type: 'string' },\n },\n required: ['kind', 'title'],\n },\n },\n {\n name: 'kirograph_mem_conflicts_scan',\n description: 'Scan recent observations for potential conflicts using FTS.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max observations to scan (default: 50)', default: 50 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_prune',\n description: 'Remove memory observations older than a given duration.',\n inputSchema: {\n type: 'object',\n properties: {\n olderThan: { type: 'string', description: 'Duration threshold e.g. \"90d\" or \"6m\"', default: '90d' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_lint',\n description: 'Health check: stale links, model mismatch, orphaned sessions.',\n inputSchema: {\n type: 'object',\n properties: {\n fix: { type: 'boolean', description: 'Auto-remove stale links', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_conflicts_list',\n description: 'List pending conflict relations needing resolution.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_conflicts_ignore',\n description: 'Dismiss a pending conflict relation as not relevant.',\n inputSchema: {\n type: 'object',\n properties: {\n relationId: { type: 'string', description: 'Relation ID to ignore (from kirograph_mem_conflicts_list)' },\n projectPath: { type: 'string' },\n },\n required: ['relationId'],\n },\n },\n // \u2500\u2500 Wiki tools (require enableWiki=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_wiki_ingest',\n description: 'Build ingest prompt for LLM to produce a WIKI_DIFF.',\n inputSchema: {\n type: 'object',\n properties: {\n source: { type: 'string', description: 'Source content to ingest (markdown, notes, ADR text, etc.)' },\n sourceName: { type: 'string', description: 'Name or path of the source', default: 'source' },\n projectPath: { type: 'string' },\n },\n required: ['source'],\n },\n },\n {\n name: 'kirograph_wiki_apply_diff',\n description: 'Apply a WIKI_DIFF to the wiki filesystem and SQLite index.',\n inputSchema: {\n type: 'object',\n properties: {\n diff: { type: 'string', description: 'WIKI_DIFF string with WIKI_DIFF_START/END blocks' },\n projectPath: { type: 'string' },\n },\n required: ['diff'],\n },\n },\n {\n name: 'kirograph_wiki_search',\n description: 'FTS over wiki pages; returns slugs, titles, previews.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query' },\n limit: { type: 'number', description: 'Max results (default: 5)', default: 5 },\n projectPath: { type: 'string' },\n },\n required: ['query'],\n },\n },\n {\n name: 'kirograph_wiki_page',\n description: 'Retrieve full markdown of a wiki page by slug.',\n inputSchema: {\n type: 'object',\n properties: {\n slug: { type: 'string', description: 'Page slug (e.g. \"arch/auth-model\")' },\n projectPath: { type: 'string' },\n },\n required: ['slug'],\n },\n },\n {\n name: 'kirograph_wiki_lint',\n description: 'Check wiki for broken links, orphans, stale sources, contradictions.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_wiki_list',\n description: 'List all wiki pages with slug, title, source count, date.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_wiki_synthesize',\n description: 'Run local-model wiki synthesis: process the pending source queue (requires wikiSynthesisMode: \"local\").',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_wiki_init',\n description: 'Initialize the wiki: create SCHEMA.md and MANIFEST.md in .kirograph/wiki/.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_wiki_reindex',\n description: 'Rebuild the SQLite index from .kirograph/wiki/*.md files on disk.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_wiki_status',\n description: 'Show wiki subsystem stats: page count, total sources, oldest/newest page dates.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Docs tools (require enableDocs=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_docs_toc',\n description: 'Get TOC for a doc file or whole project (IDs, titles, levels, summaries).',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'Filter to a specific doc file (relative path). Omit for project-wide TOC.' },\n tree: { type: 'boolean', description: 'Return nested tree structure.', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_docs_search',\n description: 'Search documentation sections by query, ranked by relevance.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query (natural language or keywords)' },\n file: { type: 'string', description: 'Limit search to a specific doc file.' },\n limit: { type: 'number', description: 'Max results (default: 10)', default: 10 },\n projectPath: { type: 'string' },\n },\n required: ['query'],\n },\n },\n {\n name: 'kirograph_docs_section',\n description: 'Retrieve full content of a doc section by its stable ID.',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Section ID.' },\n context: { type: 'boolean', description: 'Include ancestor headings and child summaries.', default: false },\n projectPath: { type: 'string' },\n },\n required: ['id'],\n },\n },\n {\n name: 'kirograph_docs_outline',\n description: 'Get heading hierarchy for a single documentation file.',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'Documentation file path (relative to project root).' },\n projectPath: { type: 'string' },\n },\n required: ['file'],\n },\n },\n {\n name: 'kirograph_docs_refs',\n description: 'Bidirectional lookup: doc section\u2194code symbol references.',\n inputSchema: {\n type: 'object',\n properties: {\n sectionId: { type: 'string', description: 'Doc section ID to find referenced symbols.' },\n nodeId: { type: 'string', description: 'Code symbol ID to find referencing doc sections.' },\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Data tools (require enableData=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_data_list',\n description: 'List all indexed datasets with row/column counts and file sizes.',\n inputSchema: { type: 'object', properties: { projectPath: { type: 'string' } } },\n },\n {\n name: 'kirograph_data_describe',\n description: 'Full schema profile: types, cardinality, null%, sample values.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID (from kirograph_data_list)' },\n column: { type: 'string', description: 'Deep-dive on a single column.' },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_query',\n description: 'Filtered row retrieval with structured operators (max 500 rows).',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n filters: { type: 'array', description: 'Array of {column, op, value} filters. Ops: eq, neq, gt, gte, lt, lte, contains, in, is_null, between' },\n columns: { type: 'array', description: 'Column projection (only return these columns)' },\n limit: { type: 'number', description: 'Max rows (default: 100, hard cap: 500)', default: 100 },\n offset: { type: 'number', description: 'Pagination offset', default: 0 },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_aggregate',\n description: 'Server-side GROUP BY aggregation: count, sum, avg, min, max.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n groupBy: { type: 'array', description: 'Columns to group by' },\n metrics: { type: 'array', description: 'Array of {column, op} metrics. Ops: count, sum, avg, min, max, count_distinct' },\n filters: { type: 'array', description: 'Optional pre-filters (same format as kirograph_data_query)' },\n projectPath: { type: 'string' },\n },\n required: ['dataset', 'groupBy', 'metrics'],\n },\n },\n {\n name: 'kirograph_data_search',\n description: 'Search column names and sample values by keyword.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n query: { type: 'string', description: 'Search keyword' },\n projectPath: { type: 'string' },\n },\n required: ['dataset', 'query'],\n },\n },\n {\n name: 'kirograph_data_join',\n description: 'SQL JOIN across two indexed datasets.',\n inputSchema: {\n type: 'object',\n properties: {\n left: { type: 'string', description: 'Left dataset ID' },\n right: { type: 'string', description: 'Right dataset ID' },\n leftColumn: { type: 'string', description: 'Join column from left dataset' },\n rightColumn: { type: 'string', description: 'Join column from right dataset' },\n type: { type: 'string', description: 'Join type: inner (default), left, right', enum: ['inner', 'left', 'right'], default: 'inner' },\n columns: { type: 'array', description: 'Column projection (prefix with dataset ID)' },\n limit: { type: 'number', description: 'Max rows (default: 100, hard cap: 500)', default: 100 },\n projectPath: { type: 'string' },\n },\n required: ['left', 'right', 'leftColumn', 'rightColumn'],\n },\n },\n {\n name: 'kirograph_data_correlations',\n description: 'Pairwise Pearson correlations between numeric columns.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n threshold: { type: 'number', description: 'Min absolute correlation to include (default: 0.3)', default: 0.3 },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_quality',\n description: 'Rank columns by data quality risk: nulls, cardinality, type issues.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_drift',\n description: 'Schema drift between last two index runs: columns, types, row counts.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID (from kirograph_data_list)' },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_history',\n description: 'History of schema snapshots: timestamps, row/column counts, hashes.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID (from kirograph_data_list)' },\n limit: { type: 'number', description: 'Max snapshots to return (default: 10)', default: 10 },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n // \u2500\u2500 Watchmen tools (require enableMemory=true + enableWatchmen=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_watchmen_status',\n description: 'Show watchmen status: pending observation count, synthesis threshold, and which brief files would be written on next synthesis.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_watchmen_synthesize',\n description: 'Run watchmen synthesis immediately using the local model (requires watchmenSynthesisMode: \"local\"). Processes pending observations into a workspace brief.',\n inputSchema: {\n type: 'object',\n properties: {\n force: { type: 'boolean', description: 'Run even if below threshold (default: false)', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_watchmen_reset',\n description: 'Reset the watchmen synthesis counter by storing a summary observation, without running full synthesis.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Affected tests \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_affected',\n description: 'Find test files affected by a set of changed source files, by traversing the dependency graph.',\n inputSchema: {\n type: 'object',\n properties: {\n files: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of changed source file paths (relative to project root)',\n },\n depth: { type: 'number', description: 'Max dependency traversal depth (default: 5)', default: 5 },\n testPattern: { type: 'string', description: 'Custom glob to identify test files (optional)' },\n projectPath: { type: 'string' },\n },\n required: ['files'],\n },\n },\n // \u2500\u2500 Security tools (require enableSecurity=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_security',\n description: 'Security overview: vuln counts, verdicts, stale data warnings.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_vulns',\n description: 'List vulns with reachability verdicts, severity, affected components.',\n inputSchema: {\n type: 'object',\n properties: {\n severity: { type: 'string', description: 'Filter by severity level', enum: ['critical', 'high', 'medium', 'low'] },\n verdict: { type: 'string', description: 'Filter by reachability verdict', enum: ['affected', 'not_affected', 'under_investigation'] },\n limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },\n refresh: { type: 'boolean', description: 'Trigger fresh vulnerability enrichment before listing (default: false)', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_vuln_add',\n description: 'Manually register a CVE against a dependency.',\n inputSchema: {\n type: 'object',\n properties: {\n cveId: { type: 'string', description: 'CVE identifier (e.g., \"CVE-2023-12345\")' },\n package: { type: 'string', description: 'Package name to associate the CVE with' },\n severity: { type: 'number', description: 'CVSS v3.1 base score (optional)' },\n summary: { type: 'string', description: 'Vulnerability summary (optional)' },\n fixedVersion: { type: 'string', description: 'Version that fixes the vulnerability (optional)' },\n projectPath: { type: 'string' },\n },\n required: ['cveId', 'package'],\n },\n },\n {\n name: 'kirograph_vuln_suppress',\n description: 'Suppress a CVE from vulnerability reports.',\n inputSchema: {\n type: 'object',\n properties: {\n cveId: { type: 'string', description: 'CVE identifier to suppress (e.g., \"CVE-2024-1234\")' },\n reason: { type: 'string', description: 'Reason for suppression (optional)' },\n expires: { type: 'string', description: 'Expiry date in ISO format after which the suppression is removed (e.g. \"2026-12-31\", optional)' },\n projectPath: { type: 'string' },\n },\n required: ['cveId'],\n },\n },\n {\n name: 'kirograph_sbom',\n description: 'Generate CycloneDX 1.5 SBOM JSON for the project.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_vex',\n description: 'Generate CycloneDX 1.5 VEX JSON with reachability verdicts.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_reachability',\n description: 'Check reachability for a dependency or CVE.',\n inputSchema: {\n type: 'object',\n properties: {\n target: { type: 'string', description: 'Dependency name or CVE ID to check reachability for' },\n projectPath: { type: 'string' },\n },\n required: ['target'],\n },\n },\n {\n name: 'kirograph_staleness',\n description: 'Check dependency freshness against latest published versions.',\n inputSchema: {\n type: 'object',\n properties: {\n threshold: { type: 'number', description: 'Only return packages with staleness_score >= threshold (default: 0.3)', default: 0.3 },\n refresh: { type: 'boolean', description: 'Fetch latest version info from registries before listing (default: false)', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_licenses',\n description: 'Show licenses and check against configured deny/warn policy.',\n inputSchema: {\n type: 'object',\n properties: {\n policy: { type: 'boolean', description: 'Return only policy violations (default: false)', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_attack_surface',\n description: 'Map HTTP routes to vulnerable deps with hop count and auth status.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max routes to return (default: 20)', default: 20 },\n publicOnly: { type: 'boolean', description: 'Only return public/unauthenticated routes', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_secrets',\n description: 'Scan for hardcoded secrets with call-graph blast radius.',\n inputSchema: {\n type: 'object',\n properties: {\n includeTests: { type: 'boolean', description: 'Include test files in scan', default: false },\n severity: { type: 'string', description: 'Filter by severity: critical, high, medium, low', enum: ['critical', 'high', 'medium', 'low'] },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_security_flows',\n description: 'SAST-lite: detect SQL injection, eval, deserialize, path, crypto flows.',\n inputSchema: {\n type: 'object',\n properties: {\n type: { type: 'string', description: 'Filter by type: sql, eval, deserialize, path, crypto, all', default: 'all' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_supply_chain',\n description: 'OpenSSF Scorecard scores, maintainer count, abandoned package detection.',\n inputSchema: {\n type: 'object',\n properties: {\n threshold: { type: 'string', description: 'Minimum risk level: critical, high, medium', enum: ['critical', 'high', 'medium'] },\n refresh: { type: 'boolean', description: 'Re-fetch from APIs', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_dep_confusion',\n description: 'Detect dependency confusion: internal names in public registries.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_remediation',\n description: 'Remediation SLA tracking: overdue vulns by severity thresholds.',\n inputSchema: {\n type: 'object',\n properties: {\n overdueOnly: { type: 'boolean', description: 'Show only overdue items', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Pattern tools (require enablePatterns=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_pattern_coverage',\n description: 'OWASP Top 10 coverage report: categories covered and match counts.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_pattern_save_baseline',\n description: 'Save current pattern match counts as a baseline.',\n inputSchema: {\n type: 'object',\n properties: {\n label: { type: 'string', description: 'Baseline label (default: \"default\")', default: 'default' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_pattern_diff',\n description: 'Diff pattern matches against a saved baseline.',\n inputSchema: {\n type: 'object',\n properties: {\n label: { type: 'string', description: 'Baseline label (default: \"default\")', default: 'default' },\n projectPath: { type: 'string' },\n },\n },\n },\n];\n\n/**\n * Dynamic tool definition for kirograph_live_search.\n * NOT included in the static `tools` array \u2014 injected into tools/list at runtime\n * only when config.enablePatterns === true AND @ast-grep/napi is available.\n * NOT added to KIROGRAPH_TOOL_NAMES (which is a static list for Kiro autoApprove).\n */\nexport const LIVE_SEARCH_TOOL_DEFINITION: ToolDefinition = {\n name: 'kirograph_live_search',\n description:\n 'Run a live AST pattern search against the indexed file list using @ast-grep/napi. Finds structural code patterns (SQL injection, eval, path traversal, etc.) without needing the codebase to be re-indexed. Only available when enablePatterns: true.',\n inputSchema: {\n type: 'object' as const,\n required: ['pattern', 'language'],\n properties: {\n pattern: { type: 'string', description: 'ast-grep inline pattern (e.g. \"eval($X)\")' },\n language: { type: 'string', description: 'Language to search: javascript, typescript, python, go, rust, java, etc.' },\n limit: { type: 'number', description: 'Max results (default 20, max 100)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n};\n\nexport class ToolHandler {\n private defaultCg: KiroGraph | null;\n private connections = new Map<string, KiroGraph>();\n /** Anti-loop: track recent data_query calls per dataset for pagination detection. */\n private queryTracker = new Map<string, { offsets: number[]; lastCall: number }>();\n\n constructor(cg: KiroGraph | null) {\n this.defaultCg = cg;\n }\n\n setDefaultKiroGraph(cg: KiroGraph): void {\n this.defaultCg = cg;\n }\n\n /** Close all cached cross-project connections. */\n closeAll(): void {\n for (const cg of this.connections.values()) {\n try { cg.close(); } catch { /* ignore */ }\n }\n this.connections.clear();\n }\n\n /** Anti-loop: detect pagination patterns and warn the agent. */\n private checkPaginationLoop(dataset: string, offset: number | undefined, response: string): string {\n const now = Date.now();\n const key = dataset;\n const currentOffset = offset ?? 0;\n\n // Clean stale entries (older than 60s)\n for (const [k, v] of this.queryTracker) {\n if (now - v.lastCall > 60_000) this.queryTracker.delete(k);\n }\n\n const entry = this.queryTracker.get(key) ?? { offsets: [], lastCall: 0 };\n entry.offsets.push(currentOffset);\n entry.lastCall = now;\n\n // Keep only last 10 offsets\n if (entry.offsets.length > 10) entry.offsets = entry.offsets.slice(-10);\n this.queryTracker.set(key, entry);\n\n // Check for pagination pattern: >5 calls with incrementing offsets\n if (entry.offsets.length > 5) {\n const recent = entry.offsets.slice(-6);\n let isIncrementing = true;\n for (let i = 1; i < recent.length; i++) {\n if (recent[i]! <= recent[i - 1]!) { isIncrementing = false; break; }\n }\n if (isIncrementing) {\n return response + '\\n\\n\u26A0 Pagination detected. Consider using kirograph_data_aggregate for summary statistics instead of paginating through all rows.';\n }\n }\n\n return response;\n }\n\n private async getConnection(projectPath?: string): Promise<KiroGraph | null> {\n if (!projectPath) return this.defaultCg;\n // Normalize and validate: must be an absolute path after resolution\n const resolved = path.resolve(projectPath);\n if (!path.isAbsolute(resolved)) return null;\n if (this.connections.has(resolved)) return this.connections.get(resolved)!;\n try {\n const cg = await KiroGraph.open(resolved);\n this.connections.set(resolved, cg);\n return cg;\n } catch {\n return null;\n }\n }\n\n async handle(toolName: string, args: Record<string, unknown>): Promise<{ content: Array<{ type: 'text'; text: string }>; isError?: boolean }> {\n try {\n const text = await this.dispatch(toolName, args);\n const truncated = truncate(text);\n\n // Track graph/memory tool savings (skip exec/gain \u2014 they track themselves)\n if (toolName !== 'kirograph_exec' && toolName !== 'kirograph_gain') {\n try {\n const projectRoot = (args.projectPath as string) || this.defaultCg?.getProjectRoot() || process.cwd();\n const { estimateNaiveCost } = await Promise.resolve().then(() => require('../compression/naive-cost.js'));\n const { estimateTokens } = await Promise.resolve().then(() => require('../compression/index.js'));\n const outputTokens = estimateTokens(truncated);\n const naiveCost = estimateNaiveCost(toolName, outputTokens, args);\n if (naiveCost !== null && naiveCost > outputTokens) {\n const tracker = new TokenTracker(projectRoot);\n if (toolName.startsWith('kirograph_mem_')) {\n tracker.recordMemorySaving(toolName, outputTokens, naiveCost);\n } else if (toolName.startsWith('kirograph_docs_')) {\n tracker.recordDocsSaving(toolName, outputTokens, naiveCost);\n } else if (toolName.startsWith('kirograph_data_')) {\n tracker.recordDataSaving(toolName, outputTokens, naiveCost);\n } else {\n tracker.recordGraphSaving(toolName, outputTokens, naiveCost);\n }\n }\n } catch { /* non-critical */ }\n }\n\n return { content: [{ type: 'text', text: truncated }] };\n } catch (err) {\n logError('MCP tool error', { tool: toolName, error: err });\n const message = err instanceof Error ? err.message : String(err);\n return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };\n }\n }\n\n private async dispatch(toolName: string, args: Record<string, unknown>): Promise<string> {\n // Tools that don't require an initialized graph\n if (toolName === 'kirograph_exec') {\n const cmd = args.command as string;\n if (!cmd) return 'Error: command is required.';\n\n const projectRoot = (args.projectPath as string) || (args.cwd as string) || process.cwd();\n const execCwd = (args.cwd as string) || projectRoot;\n\n // Read default level from config if not explicitly provided\n let defaultLevel: 'normal' | 'aggressive' | 'ultra' = 'normal';\n try {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const config = await loadConfig(projectRoot);\n if (config.shellCompressionLevel && config.shellCompressionLevel !== 'off') {\n defaultLevel = config.shellCompressionLevel as 'normal' | 'aggressive' | 'ultra';\n }\n } catch { /* no config \u2014 use default */ }\n\n const level = (args.level as 'normal' | 'aggressive' | 'ultra') ?? defaultLevel;\n const timeout = ((args.timeout as number) ?? 60) * 1000;\n\n let rawOutput: string;\n let exitCode = 0;\n try {\n rawOutput = execSync(cmd, {\n cwd: execCwd,\n timeout,\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 10 * 1024 * 1024,\n });\n } catch (err: any) {\n // Command failed \u2014 capture output anyway\n rawOutput = (err.stdout || '') + (err.stderr || '');\n exitCode = err.status ?? 1;\n }\n\n const result = compress(cmd, rawOutput, { level, preserveErrors: exitCode !== 0 });\n\n // Track savings\n const tracker = new TokenTracker(projectRoot);\n tracker.record(cmd, result.originalTokens, result.compressedTokens, result.strategy);\n\n const header = exitCode !== 0 ? `[exit ${exitCode}] ` : '';\n const footer = result.savings > 5\n ? `\\n\\n[${result.savings}% tokens saved | ${result.originalTokens}\u2192${result.compressedTokens} | ${result.strategy}]`\n : '';\n\n return `${header}${result.output}${footer}`;\n }\n\n if (toolName === 'kirograph_gain') {\n const projectRoot = (args.projectPath as string) || process.cwd();\n const period = (args.period as string) ?? 'session';\n const tracker = new TokenTracker(projectRoot);\n const stats = tracker.getStats(period as 'session' | 'today' | 'week' | 'all');\n\n if (stats.totalCommands === 0) {\n return 'No savings recorded yet. Use kirograph tools and kirograph_exec \u2014 savings are tracked automatically.';\n }\n\n const lines = [\n `Token Savings (${period}):`,\n ` Total calls: ${stats.totalCommands}`,\n ` Tokens without KiroGraph: ~${stats.totalOriginal.toLocaleString()}`,\n ` Tokens with KiroGraph: ~${stats.totalCompressed.toLocaleString()}`,\n ` Saved: ${stats.totalSaved.toLocaleString()} tokens (${stats.savingsPercent}%)`,\n ];\n\n // Source breakdown\n if (stats.bySource.exec.count > 0 || stats.bySource.graph.count > 0 || stats.bySource.memory.count > 0 || stats.bySource.docs.count > 0) {\n lines.push('', 'By source:');\n if (stats.bySource.graph.count > 0) {\n lines.push(` Graph tools: ${stats.bySource.graph.count} calls, ~${stats.bySource.graph.saved.toLocaleString()} tokens saved (vs file reads/grep)`);\n }\n if (stats.bySource.docs.count > 0) {\n lines.push(` Docs tools: ${stats.bySource.docs.count} calls, ~${stats.bySource.docs.saved.toLocaleString()} tokens saved (vs reading full doc files)`);\n }\n if (stats.bySource.data.count > 0) {\n lines.push(` Data tools: ${stats.bySource.data.count} calls, ~${stats.bySource.data.saved.toLocaleString()} tokens saved (vs loading raw data files)`);\n }\n if (stats.bySource.exec.count > 0) {\n lines.push(` Compression: ${stats.bySource.exec.count} calls, ~${stats.bySource.exec.saved.toLocaleString()} tokens saved (vs raw output)`);\n }\n if (stats.bySource.memory.count > 0) {\n lines.push(` Memory: ${stats.bySource.memory.count} calls, ~${stats.bySource.memory.saved.toLocaleString()} tokens saved (vs re-discovering context)`);\n }\n }\n\n if (Object.keys(stats.byFamily).length > 0) {\n lines.push('', 'Top families:');\n for (const [family, data] of Object.entries(stats.byFamily).slice(0, 7)) {\n lines.push(` ${family}: ${data.count} calls, ${data.savings}% avg savings`);\n }\n }\n\n if (stats.recentCommands.length > 0) {\n lines.push('', 'Recent:');\n for (const cmd of stats.recentCommands.slice(0, 5)) {\n const tag = cmd.source === 'graph' ? '\uD83D\uDCCA' : '\u26A1';\n lines.push(` ${tag} ${cmd.command.slice(0, 40)} \u2192 ${cmd.savings}% saved`);\n }\n }\n\n return lines.join('\\n');\n }\n\n if (toolName === 'kirograph_read') {\n const filePath = args.path as string;\n if (!filePath) return 'Error: path is required.';\n\n const projectRoot = (args.projectPath as string) || process.cwd();\n const resolvedPath = path.isAbsolute(filePath) ? filePath : path.join(projectRoot, filePath);\n const mode = (args.mode as string) ?? 'full';\n const noCache = (args.noCache as boolean) ?? false;\n\n if (!fs.existsSync(resolvedPath)) {\n return `Error: File not found: ${resolvedPath}`;\n }\n\n const { getFileReadCache } = await Promise.resolve().then(() => require('./cache.js'));\n const { executeReadMode } = await Promise.resolve().then(() => require('./read-modes.js'));\n const cache = getFileReadCache();\n\n // For non-full modes, skip caching logic and use read-modes directly\n if (mode !== 'full') {\n // Get graph connection for map/signatures/imports/exports modes\n let cg: KiroGraph | null = null;\n try {\n cg = await this.getConnection(args.projectPath as string | undefined);\n } catch { /* no graph available */ }\n\n const result = executeReadMode({\n mode: mode as any,\n filePath: resolvedPath,\n start: args.start as number | undefined,\n end: args.end as number | undefined,\n cg,\n });\n\n // Update cache with current content for future diff mode\n cache.read(resolvedPath, true);\n\n return result.content;\n }\n\n // Full mode with caching\n const result = cache.read(resolvedPath, noCache);\n\n if (result.cached) {\n return result.content;\n }\n\n if (result.changed) {\n return `[file changed since last read]\\n\\n${result.content}`;\n }\n\n return result.content;\n }\n\n if (toolName === 'kirograph_retrieve') {\n const filePath = args.path as string;\n if (!filePath) return 'Error: path is required.';\n\n const projectRoot = (args.projectPath as string) || process.cwd();\n const resolvedPath = path.isAbsolute(filePath) ? filePath : path.join(projectRoot, filePath);\n\n const { getFileReadCache } = await Promise.resolve().then(() => require('./cache.js'));\n const cache = getFileReadCache();\n\n // Return cached content if we have it; otherwise read and cache\n const cached = cache.getPreviousContent(resolvedPath);\n if (cached !== undefined) {\n return cached;\n }\n\n if (!fs.existsSync(resolvedPath)) {\n return `Error: File not found: ${resolvedPath}`;\n }\n\n // Not in cache yet \u2014 do a fresh read and populate it\n const result = cache.read(resolvedPath, true);\n return result.content;\n }\n\n if (toolName === 'kirograph_compress') {\n const text = args.text as string;\n if (!text) return 'Error: text is required.';\n\n const rawLevel = (args.level as string) ?? 'full';\n const command = args.command as string | undefined;\n const { estimateTokens: est } = await Promise.resolve().then(() => require('../compression/index.js'));\n const originalTokens = est(text);\n\n let compressed: string;\n let strategy: string;\n\n if (command) {\n // Shell output \u2014 use rtk-style structural filters\n const shellLevel = rawLevel === 'ultra' ? 'ultra' : rawLevel === 'lite' || rawLevel === 'normal' ? 'normal' : 'aggressive';\n const { compress } = await Promise.resolve().then(() => require('../compression/index.js'));\n const result = compress(command, text, { level: shellLevel as any });\n compressed = result.output;\n strategy = `rtk:${result.commandFamily}:${shellLevel}`;\n } else {\n // Prose / observations \u2014 use caveman grammar\n const cavemanLevel = rawLevel === 'normal' || rawLevel === 'lite' ? 'lite' : rawLevel === 'aggressive' ? 'full' : rawLevel as any;\n const { compressObservation } = await Promise.resolve().then(() => require('../memory/compress.js'));\n const result = compressObservation(text, cavemanLevel);\n compressed = result.compressed;\n strategy = `caveman:${cavemanLevel}`;\n }\n\n const compressedTokens = est(compressed);\n const savings = originalTokens > 0 ? Math.round(((originalTokens - compressedTokens) / originalTokens) * 100) : 0;\n const footer = savings > 5\n ? `\\n\\n[${savings}% tokens saved | ${originalTokens}\u2192${compressedTokens} | ${strategy}]`\n : '';\n\n return compressed + footer;\n }\n\n if (toolName === 'kirograph_budget') {\n const projectRoot = (args.projectPath as string) || process.cwd();\n const reset = (args.reset as boolean) ?? false;\n\n const { BudgetTracker } = await Promise.resolve().then(() => require('../compression/tracker.js'));\n const budget = BudgetTracker.getInstance(projectRoot);\n\n if (reset) {\n budget.reset();\n return 'Context budget counters reset.';\n }\n\n const status = budget.getStatus();\n const lines = [\n 'Context Budget:',\n ` Tokens consumed: ${status.consumed.toLocaleString()}`,\n ` Budget limit: ${status.limit > 0 ? status.limit.toLocaleString() : 'unlimited'}`,\n ` Remaining: ${status.limit > 0 ? status.remaining.toLocaleString() : '\u221E'}`,\n ` Utilization: ${status.utilization}%`,\n ];\n\n if (status.warning) {\n lines.push(`\\n \u26A0 ${status.warning}`);\n }\n\n return lines.join('\\n');\n }\n\n const cg = await this.getConnection(args.projectPath as string | undefined);\n if (!cg) return 'KiroGraph not initialized. Run `kirograph init` in your project first.';\n\n // Write session marker so hooks can detect MCP was consulted\n writeSessionMarker(cg.getProjectRoot());\n\n switch (toolName) {\n case 'kirograph_search': {\n const limit = clampLimit(args.limit as number | undefined, 10);\n const results = cg.searchNodes(\n args.query as string,\n args.kind as NodeKind | undefined,\n limit\n );\n if (results.length === 0) return `No symbols found matching \"${args.query}\".`;\n return results.map(r =>\n `${mapKind(r.node.kind)} ${r.node.name}\\n File: ${r.node.filePath}:${r.node.startLine}\\n Qualified: ${r.node.qualifiedName}`\n ).join('\\n\\n');\n }\n\n case 'kirograph_context': {\n const detail = (args.detail as string) ?? ((args.includeCode === false) ? 'summary' : 'full');\n const ctx = await cg.buildContext(args.task as string, {\n maxNodes: (args.maxNodes as number) ?? 20,\n includeCode: detail === 'full',\n });\n const lines: string[] = [ctx.summary, ''];\n if (ctx.entryPoints.length === 0) {\n lines.push('No matching symbols found. If this is a new feature, consider using kirograph_files to explore the codebase structure.');\n } else {\n lines.push('## Entry Points');\n for (const n of ctx.entryPoints) {\n lines.push(`- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`);\n if (detail === 'full' && ctx.codeSnippets.has(n.id)) {\n lines.push('```', ctx.codeSnippets.get(n.id)!, '```');\n } else if (detail === 'signatures') {\n if ((n as any).signature) lines.push(` Signature: ${(n as any).signature}`);\n if ((n as any).docstring) lines.push(` Docs: ${(n as any).docstring}`);\n }\n }\n if (ctx.relatedNodes.length > 0) {\n lines.push('', '## Related Symbols');\n for (const n of ctx.relatedNodes.slice(0, 10)) {\n lines.push(`- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`);\n }\n }\n }\n\n // Memory integration: surface relevant observations if memory is enabled\n try {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (config.enableMemory) {\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n // Collect qualified names from entry points and related nodes\n const qualifiedNames = [\n ...ctx.entryPoints.map((n: any) => n.qualifiedName),\n ...ctx.relatedNodes.slice(0, 5).map((n: any) => n.qualifiedName),\n ].filter(Boolean);\n\n const contextLimit = config.memoryContextLimit ?? 3;\n const contextThreshold = config.memoryContextThreshold ?? 0.3;\n\n // Try linked observations first, fall back to search\n let memResults = mem.getLinkedObservations(qualifiedNames, contextLimit, contextThreshold);\n if (memResults.length === 0) {\n // Fall back to searching by task description\n memResults = (await mem.search(args.task as string, { limit: contextLimit }))\n .filter(r => r.score >= contextThreshold);\n }\n\n if (memResults.length > 0) {\n lines.push('', '## Related Memory');\n for (const r of memResults.slice(0, contextLimit)) {\n lines.push(`- [${r.observation.kind}] ${r.observation.content}`);\n }\n }\n }\n } catch { /* memory is non-critical \u2014 don't fail context on memory errors */ }\n\n // Docs integration: surface relevant doc sections if enabled and docsContextLimit > 0\n try {\n const projectRoot2 = cg.getProjectRoot();\n const config2 = await (await Promise.resolve().then(() => require('../config.js'))).loadConfig(projectRoot2);\n if (config2.enableDocs && config2.docsContextLimit > 0) {\n const db2 = cg.getDatabase();\n db2.applyDocsSchema();\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const docsQueries = new DocsQueries(db2.getRawDb(), projectRoot2);\n\n // Collect qualified names from entry points\n const qNames = ctx.entryPoints.map((n: any) => n.qualifiedName).filter(Boolean);\n\n if (qNames.length > 0) {\n // Find doc sections that reference these symbols\n const docRefs = docsQueries.getRefs({ qualifiedName: qNames[0] });\n const additionalRefs = qNames.slice(1, 5).flatMap(qn => docsQueries.getRefs({ qualifiedName: qn }));\n const allDocRefs = [...docRefs, ...additionalRefs];\n\n // Deduplicate by section ID and take top N\n const seenSections = new Set<string>();\n const uniqueRefs = allDocRefs.filter(r => {\n if (seenSections.has(r.sectionId)) return false;\n seenSections.add(r.sectionId);\n return r.confidence >= config2.docsContextThreshold;\n }).slice(0, config2.docsContextLimit);\n\n if (uniqueRefs.length > 0) {\n lines.push('', '## Related Documentation');\n for (const ref of uniqueRefs) {\n const section = docsQueries.getSection(ref.sectionId);\n if (section) {\n const summary = section.section.summary ?? section.section.title;\n lines.push(`- [${ref.refType}] ${summary} \u2014 ${section.section.filePath} (ID: ${ref.sectionId})`);\n }\n }\n }\n }\n }\n } catch { /* docs is non-critical */ }\n\n // Data integration: surface relevant dataset schemas if enabled and dataContextLimit > 0\n try {\n const projectRoot3 = cg.getProjectRoot();\n const config3 = await (await Promise.resolve().then(() => require('../config.js'))).loadConfig(projectRoot3);\n if (config3.enableData && config3.dataContextLimit > 0) {\n const db3 = cg.getDatabase();\n db3.applyDataSchema();\n\n // Find datasets referenced by the entry point files\n const entryFiles = ctx.entryPoints.map((n: any) => n.filePath).filter(Boolean);\n if (entryFiles.length > 0) {\n const placeholders = entryFiles.map(() => '?').join(', ');\n const dataRefs = db3.getRawDb().all(\n `SELECT DISTINCT d.id, d.file_path, d.row_count, d.column_count\n FROM data_code_refs r JOIN data_datasets d ON r.dataset_id = d.id\n WHERE r.qualified_name IN (${placeholders})`,\n entryFiles,\n ) as any[];\n\n if (dataRefs.length > 0) {\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const dq = new DataQueries(db3.getRawDb());\n const limit = config3.dataContextLimit;\n\n lines.push('', '## Related Data');\n for (const ref of dataRefs.slice(0, limit)) {\n const info = dq.describeDataset(ref.id);\n if (info) {\n const colSummary = info.columns.map(c => `${c.name}:${c.inferredType}`).join(', ');\n lines.push(`- **${ref.id}** (${ref.file_path}) \u2014 ${ref.row_count} rows, ${ref.column_count} cols`);\n lines.push(` Schema: ${colSummary}`);\n }\n }\n }\n }\n }\n } catch { /* data is non-critical */ }\n\n // Security integration: surface vulnerability warnings if enableSecurity is true\n try {\n const projectRootSec = cg.getProjectRoot();\n const configSec = await (await Promise.resolve().then(() => require('../config.js'))).loadConfig(projectRootSec);\n if (configSec.enableSecurity) {\n const dbSec = cg.getDatabase();\n dbSec.applySecuritySchema();\n const rawDbSec = dbSec.getRawDb();\n\n // Collect node IDs from entry points and related nodes\n const contextNodeIds = [\n ...ctx.entryPoints.map((n: any) => n.id),\n ...ctx.relatedNodes.map((n: any) => n.id),\n ].filter(Boolean);\n\n if (contextNodeIds.length > 0) {\n const { getSecurityWarningsForNodes, formatSecurityWarnings } = await Promise.resolve().then(() => require('../security/context-warnings.js'));\n const warnings = getSecurityWarningsForNodes(rawDbSec, contextNodeIds);\n\n if (warnings.length > 0) {\n // Build a name map for entry points\n const nodeNames = new Map<string, string>();\n for (const n of ctx.entryPoints) {\n nodeNames.set(n.id, n.name);\n }\n for (const n of ctx.relatedNodes) {\n nodeNames.set(n.id, n.name);\n }\n\n const secSection = formatSecurityWarnings(warnings, nodeNames);\n if (secSection) {\n lines.push(secSection);\n }\n }\n }\n }\n } catch { /* security is non-critical */ }\n\n // Pattern matches warning (when enablePatterns: true and pattern_matches table exists)\n try {\n const projectRootPat = cg.getProjectRoot();\n const configPat = await (await Promise.resolve().then(() => require('../config.js'))).loadConfig(projectRootPat);\n if ((configPat as any).enablePatterns) {\n const dbPat = cg.getDatabase();\n dbPat.applyPatternsSchema();\n const rawDbPat = dbPat.getRawDb();\n const tableExists = rawDbPat.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (tableExists) {\n // Collect file paths from context nodes\n const contextFiles = [\n ...ctx.entryPoints.map((n: any) => n.filePath),\n ...ctx.relatedNodes.map((n: any) => n.filePath),\n ].filter(Boolean) as string[];\n const uniqueContextFiles = [...new Set(contextFiles)];\n\n if (uniqueContextFiles.length > 0) {\n const placeholders = uniqueContextFiles.map(() => '?').join(',');\n const patternRows: Array<{ file_path: string; pattern_id: string; severity: string; owasp_category: string; line: number }> =\n rawDbPat.all(\n `SELECT file_path, pattern_id, severity, owasp_category, line FROM pattern_matches WHERE file_path IN (${placeholders}) ORDER BY severity DESC LIMIT 5`,\n uniqueContextFiles\n );\n if (patternRows.length > 0) {\n const patternWarnings = patternRows.map(p =>\n `- **${p.pattern_id}** [${p.severity.toUpperCase()}/${p.owasp_category}]: ${p.file_path}:${p.line}`\n ).join('\\n');\n lines.push('', '## \u26A0 Pattern Findings', '', patternWarnings);\n if (patternRows.length === 5) lines.push('', 'More findings \u2014 run `kirograph pattern --list` to see all rules.');\n }\n }\n }\n }\n } catch { /* non-critical */ }\n\n // Context savings estimation\n const graphTokens = lines.join('\\n').length / 4; // rough token estimate\n const uniqueFiles = new Set([\n ...ctx.entryPoints.map((n: any) => n.filePath),\n ...ctx.relatedNodes.map((n: any) => n.filePath),\n ]);\n if (uniqueFiles.size > 0) {\n const naiveTokens = estimateFileTokens(cg.getProjectRoot(), [...uniqueFiles]);\n if (naiveTokens > 0) {\n const savingsPct = Math.round((1 - graphTokens / naiveTokens) * 100);\n if (savingsPct > 0) {\n lines.push('', `---`, `Context savings: ~${Math.round(graphTokens)} tokens (graph) vs ~${naiveTokens} tokens (full files) \u2014 ${savingsPct}% reduction`);\n }\n }\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_callers': {\n const limit = clampLimit(args.limit as number | undefined, 20);\n const results = cg.searchNodes(args.symbol as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.symbol}\" not found in index.`;\n const node = results[0].node;\n const callers = await cg.getCallers(node.id, limit);\n if (callers.length === 0) return `No callers found for \\`${node.name}\\`.`;\n return `Callers of \\`${node.name}\\`:\\n` + callers.map(n =>\n `- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`\n ).join('\\n');\n }\n\n case 'kirograph_callees': {\n const limit = clampLimit(args.limit as number | undefined, 20);\n const results = cg.searchNodes(args.symbol as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.symbol}\" not found in index.`;\n const node = results[0].node;\n const callees = await cg.getCallees(node.id, limit);\n if (callees.length === 0) return `\\`${node.name}\\` doesn't call any indexed symbols.`;\n return `\\`${node.name}\\` calls:\\n` + callees.map(n =>\n `- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`\n ).join('\\n');\n }\n\n case 'kirograph_impact': {\n const results = cg.searchNodes(args.symbol as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.symbol}\" not found in index.`;\n const node = results[0].node;\n const affected = await cg.getImpactRadius(node.id, (args.depth as number) ?? 2);\n if (affected.length === 0) return `No dependents found for \\`${node.name}\\`.`;\n\n let output = `Changing \\`${node.name}\\` may affect ${affected.length} symbol(s):\\n` +\n affected.map(n => `- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`).join('\\n');\n\n // Memory integration: surface observations linked to the target symbol\n try {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (config.enableMemory) {\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const contextLimit = config.memoryContextLimit ?? 3;\n const contextThreshold = config.memoryContextThreshold ?? 0.3;\n const memResults = mem.getLinkedObservations(\n [node.qualifiedName],\n contextLimit,\n contextThreshold\n );\n\n if (memResults.length > 0) {\n output += '\\n\\nRelated Memory:';\n for (const r of memResults) {\n const age = formatAge(r.observation.createdAt);\n output += `\\n- [${r.observation.kind}] ${r.observation.content} (${age})`;\n }\n }\n }\n } catch { /* memory is non-critical */ }\n\n // Check if symbol has pattern matches\n try {\n const rawDbImp = cg.getDatabase().getRawDb();\n const tableExistsImp = rawDbImp.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (tableExistsImp) {\n const symNode = rawDbImp.get('SELECT id FROM nodes WHERE name = ? LIMIT 1', [args.symbol]);\n if (symNode) {\n const patternMatches = rawDbImp.all(\n 'SELECT pattern_id, severity, line FROM pattern_matches WHERE symbol_node_id = ?',\n [(symNode as { id: string }).id]\n ) as Array<{ pattern_id: string; severity: string; line: number }>;\n if (patternMatches.length > 0) {\n output += '\\n\\n\u26A0 This symbol has pattern matches:';\n for (const pm of patternMatches) {\n output += `\\n [${pm.severity.toUpperCase()}] ${pm.pattern_id} at line ${pm.line}`;\n }\n }\n }\n }\n } catch { /* non-critical */ }\n\n return output;\n }\n\n case 'kirograph_node': {\n const results = cg.searchNodes(args.symbol as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.symbol}\" not found in index.`;\n const node = results[0].node;\n const nodeDetail = (args.detail as string) ?? (args.includeCode ? 'full' : 'summary');\n const lines = [\n `${mapKind(node.kind)} \\`${node.name}\\``,\n `File: ${node.filePath}:${node.startLine}-${node.endLine}`,\n `Qualified: ${node.qualifiedName}`,\n ];\n if (nodeDetail === 'signatures' || nodeDetail === 'full') {\n if (node.signature) lines.push(`Signature: ${node.signature}`);\n if (node.docstring) lines.push(`Docs: ${node.docstring}`);\n }\n if (nodeDetail === 'full') {\n const src = cg.getNodeSource(node);\n if (src) lines.push('', '```', src, '```');\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_status': {\n const stats = await cg.getStats();\n const langLine = Object.entries(stats.filesByLanguage)\n .sort((a, b) => b[1] - a[1])\n .map(([k, v]) => `${k}=${v}`)\n .join(', ');\n const dbMb = (stats.dbSizeBytes / 1024 / 1024).toFixed(2);\n const semanticLines = stats.embeddingsEnabled\n ? [\n ` Semantic search: enabled`,\n ` Semantic model: ${stats.embeddingModel}`,\n ` Semantic engine: ${\n stats.semanticEngine === 'turboquant' ? `turboquant (${stats.vecIndexCount} entries \u00B7 ANN)` :\n stats.semanticEngine === 'turbovec' ? `turbovec (${stats.vecIndexCount} entries \u00B7 ${stats.turbovecBits ?? 4} bits \u00B7 Rust/SIMD)` :\n stats.semanticEngine === 'sqlite-vec' ? `sqlite-vec (${stats.vecIndexCount} entries in ANN index)` :\n stats.semanticEngine === 'orama' ? `orama hybrid (${stats.vecIndexCount} docs in index)` :\n stats.semanticEngine === 'pglite' ? `pglite+pgvector (${stats.vecIndexCount} rows in DB)` :\n stats.semanticEngine === 'lancedb' ? `lancedb (${stats.vecIndexCount} entries in ANN index)` :\n stats.semanticEngine === 'qdrant' ? `qdrant (${stats.vecIndexCount} points in collection)` :\n stats.semanticEngine === 'typesense' ? `typesense (${stats.vecIndexCount} documents in collection)` :\n 'in-process cosine'\n }`,\n ` Embeddings: ${stats.embeddingCount} / ${stats.embeddableNodeCount || stats.nodes} embeddable symbols`,\n ...(stats.engineFallback ? [` \u26A0 Engine fallback: ${stats.engineFallback}`] : []),\n ]\n : [` Semantic search: disabled`];\n const frameworkLine = stats.frameworks.length > 0\n ? ` Frameworks: ${stats.frameworks.join(', ')}`\n : ` Frameworks: none detected`;\n const archLine = stats.architectureEnabled\n ? stats.architectureStats\n ? ` Architecture: enabled \u2014 ${stats.architectureStats.packages} packages, ${stats.architectureStats.layers} layers, ${stats.architectureStats.packageDeps} deps`\n : ` Architecture: enabled (not yet analyzed \u2014 run kirograph index)`\n : ` Architecture: disabled`;\n\n // Docs stats\n let docsLine = ' Documentation: disabled';\n try {\n const { loadConfig: loadCfg } = await Promise.resolve().then(() => require('../config.js'));\n const cfg = await loadCfg(cg.getProjectRoot());\n if (cfg.enableDocs) {\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const rawDb = db.getRawDb();\n const docFiles = rawDb.get('SELECT COUNT(DISTINCT file_path) as cnt FROM doc_sections')?.cnt ?? 0;\n const docSections = rawDb.get('SELECT COUNT(*) as cnt FROM doc_sections')?.cnt ?? 0;\n const docRefs = rawDb.get('SELECT COUNT(*) as cnt FROM doc_code_refs')?.cnt ?? 0;\n docsLine = ` Documentation: enabled \u2014 ${docFiles} files, ${docSections} sections, ${docRefs} code refs`;\n }\n } catch { /* non-critical */ }\n\n // Data stats\n let dataLine = ' Data: disabled';\n try {\n const { loadConfig: loadCfg2 } = await Promise.resolve().then(() => require('../config.js'));\n const cfg2 = await loadCfg2(cg.getProjectRoot());\n if (cfg2.enableData) {\n const rawDb2 = cg.getDatabase().getRawDb();\n cg.getDatabase().applyDataSchema();\n const datasetCount = rawDb2.get('SELECT COUNT(*) as cnt FROM data_datasets')?.cnt ?? 0;\n if (datasetCount > 0) {\n const totalRows = rawDb2.get('SELECT SUM(row_count) as total FROM data_datasets')?.total ?? 0;\n const totalCols = rawDb2.get('SELECT SUM(column_count) as total FROM data_datasets')?.total ?? 0;\n const totalSize = rawDb2.get('SELECT SUM(file_size) as total FROM data_datasets')?.total ?? 0;\n const sizeMb = (totalSize / 1024 / 1024).toFixed(2);\n dataLine = ` Data: enabled \u2014 ${datasetCount} datasets, ${totalRows.toLocaleString()} rows, ${totalCols} columns (${sizeMb} MB source)`;\n } else {\n dataLine = ` Data: enabled (no datasets indexed yet \u2014 run kirograph index)`;\n }\n }\n } catch { /* non-critical */ }\n\n // Security stats\n let securityLine = ' Security: disabled';\n try {\n const { loadConfig: loadCfgSec } = await Promise.resolve().then(() => require('../config.js'));\n const cfgSec = await loadCfgSec(cg.getProjectRoot());\n if (cfgSec.enableSecurity) {\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n const depCount = rawDb.get('SELECT COUNT(*) as cnt FROM sec_dependencies')?.cnt ?? 0;\n const vulnCount = rawDb.get('SELECT COUNT(*) as cnt FROM sec_vulnerabilities')?.cnt ?? 0;\n const affectedCount = rawDb.get(\"SELECT COUNT(*) as cnt FROM sec_reachability WHERE verdict = 'affected'\")?.cnt ?? 0;\n const staleCount = rawDb.get('SELECT COUNT(*) as cnt FROM sec_dependencies WHERE vuln_data_stale = 1')?.cnt ?? 0;\n const staleNote = staleCount > 0 ? ` \u26A0 ${staleCount} stale` : '';\n securityLine = ` Security: enabled \u2014 ${depCount} deps, ${vulnCount} vulns (${affectedCount} affected)${staleNote}`;\n }\n } catch { /* non-critical */ }\n\n // Patterns stats\n let patternsLine = ' Patterns: disabled';\n try {\n const { loadConfig: loadCfgPat } = await Promise.resolve().then(() => require('../config.js'));\n const cfgP = await loadCfgPat(cg.getProjectRoot());\n if ((cfgP as any).enablePatterns) {\n const rawDbP = cg.getDatabase().getRawDb();\n const tableExistsP = rawDbP.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (tableExistsP) {\n const matchCount = rawDbP.get('SELECT COUNT(*) as cnt FROM pattern_matches')?.cnt ?? 0;\n const fileCount = rawDbP.get('SELECT COUNT(DISTINCT file_path) as cnt FROM pattern_matches')?.cnt ?? 0;\n const ruleCount = rawDbP.get('SELECT COUNT(DISTINCT pattern_id) as cnt FROM pattern_matches')?.cnt ?? 0;\n patternsLine = ` Patterns: enabled \u2014 ${matchCount} matches, ${ruleCount} rules triggered, ${fileCount} files`;\n } else {\n patternsLine = ` Patterns: enabled (no data yet \u2014 run kirograph index)`;\n }\n }\n } catch { /* non-critical */ }\n\n // Sync state warning\n const threshold = stats.syncWarningThreshold ?? 10;\n const pendingFiles: number = stats.pendingFiles ?? 0;\n const syncRunning: boolean = stats.syncRunning ?? false;\n const syncLines: string[] = [];\n if (syncRunning) {\n syncLines.push(` \u26A0 Sync is currently running in the background.`);\n }\n if (threshold > 0 && pendingFiles >= threshold) {\n syncLines.push(\n ` \u26A0 Index may be incomplete \u2014 ${pendingFiles} file${pendingFiles !== 1 ? 's' : ''} pending sync.` +\n (syncRunning ? ' Sync is running in background.' : ' Run `kirograph sync` to update.') +\n ` Would you like to wait before proceeding?`\n );\n }\n\n // Token savings summary\n const tracker = new TokenTracker(cg.getProjectRoot());\n const gainStats = tracker.getStats('session');\n const gainLines: string[] = [];\n if (gainStats.totalCommands > 0) {\n gainLines.push(` Compression: ${gainStats.totalCommands} commands, ${gainStats.savingsPercent}% avg savings (${gainStats.totalSaved.toLocaleString()} tokens saved this session)`);\n }\n\n return [\n `KiroGraph Status`,\n ` Project: ${cg.getProjectRoot()}`,\n ` Files indexed: ${stats.files}`,\n ` Symbols: ${stats.nodes}`,\n ` Relationships: ${stats.edges}`,\n ` By kind: ${Object.entries(stats.nodesByKind).map(([k, v]) => `${k}=${v}`).join(', ')}`,\n langLine ? ` By language: ${langLine}` : '',\n frameworkLine,\n archLine,\n docsLine,\n dataLine,\n securityLine,\n patternsLine,\n ` DB size: ${dbMb} MB`,\n ...semanticLines,\n ...syncLines,\n ...gainLines,\n ].filter(Boolean).join('\\n');\n }\n\n case 'kirograph_files': {\n const format = (args.format as string) ?? 'tree';\n const includeMetadata = args.includeMetadata !== false;\n const tree = cg.getFiles({\n filterPath: args.filterPath as string | undefined,\n pattern: args.pattern as string | undefined,\n maxDepth: args.maxDepth as number | undefined,\n });\n\n if (format === 'flat') {\n const flat: string[] = [];\n function flattenTree(nodes: import('../index').FileTreeNode[]): void {\n for (const node of nodes) {\n if (node.type === 'file') {\n const meta = includeMetadata && node.language ? ` [${node.language}${node.symbolCount ? ` \u00B7 ${node.symbolCount}` : ''}]` : '';\n flat.push(`${node.path}${meta}`);\n }\n if (node.children?.length) flattenTree(node.children);\n }\n }\n flattenTree(tree);\n return flat.length > 0 ? flat.join('\\n') : 'No indexed files found.';\n }\n\n if (format === 'grouped') {\n const groups = new Map<string, import('../index').FileTreeNode[]>();\n function groupTree(nodes: import('../index').FileTreeNode[]): void {\n for (const node of nodes) {\n if (node.type === 'file') {\n const dir = node.path.includes('/') ? node.path.slice(0, node.path.lastIndexOf('/')) : '.';\n if (!groups.has(dir)) groups.set(dir, []);\n groups.get(dir)!.push(node);\n }\n if (node.children?.length) groupTree(node.children);\n }\n }\n groupTree(tree);\n const lines: string[] = [];\n for (const [dir, files] of [...groups.entries()].sort()) {\n lines.push(`${dir}/`);\n for (const f of files) {\n const meta = includeMetadata && f.language ? ` [${f.language}${f.symbolCount ? ` \u00B7 ${f.symbolCount}` : ''}]` : '';\n lines.push(` ${f.name}${meta}`);\n }\n }\n return lines.length > 0 ? lines.join('\\n') : 'No indexed files found.';\n }\n\n if (format === 'compact') {\n // rtk-style compact: directory summary with file counts and language breakdown\n const dirStats = new Map<string, { files: number; symbols: number; langs: Map<string, number> }>();\n function compactTree(nodes: import('../index').FileTreeNode[]): void {\n for (const node of nodes) {\n if (node.type === 'file') {\n const dir = node.path.includes('/') ? node.path.slice(0, node.path.lastIndexOf('/')) : '.';\n const stat = dirStats.get(dir) || { files: 0, symbols: 0, langs: new Map() };\n stat.files++;\n stat.symbols += node.symbolCount || 0;\n if (node.language) stat.langs.set(node.language, (stat.langs.get(node.language) || 0) + 1);\n dirStats.set(dir, stat);\n }\n if (node.children?.length) compactTree(node.children);\n }\n }\n compactTree(tree);\n const totalFiles = [...dirStats.values()].reduce((s, d) => s + d.files, 0);\n const totalSymbols = [...dirStats.values()].reduce((s, d) => s + d.symbols, 0);\n const lines: string[] = [`${totalFiles} files, ${totalSymbols} symbols in ${dirStats.size} directories:\\n`];\n for (const [dir, stat] of [...dirStats.entries()].sort()) {\n const langSummary = [...stat.langs.entries()].map(([l, c]) => `${l}:${c}`).join(' ');\n lines.push(`${dir}/ (${stat.files} files, ${stat.symbols} symbols) ${langSummary}`);\n }\n return lines.join('\\n');\n }\n\n // Default: tree format\n const lines: string[] = [];\n function renderTree(nodes: import('../index').FileTreeNode[], prefix: string): void {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const isLast = i === nodes.length - 1;\n const connector = isLast ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 ';\n const childPrefix = prefix + (isLast ? ' ' : '\u2502 ');\n const meta = includeMetadata && node.type === 'file' && node.language\n ? ` [${node.language}${node.symbolCount ? ` \u00B7 ${node.symbolCount} symbols` : ''}]`\n : '';\n lines.push(`${prefix}${connector}${node.name}${meta}`);\n if (node.children?.length) renderTree(node.children, childPrefix);\n }\n }\n renderTree(tree, '');\n return lines.length > 0 ? lines.join('\\n') : 'No indexed files found.';\n }\n\n case 'kirograph_dead_code': {\n const limit = clampLimit(args.limit as number | undefined, 50);\n const dead = cg.findDeadCode(limit);\n if (dead.length === 0) return 'No dead code detected.';\n return `Potential dead code (${dead.length} unexported symbols with no incoming references):\\n` +\n dead.map(n => `- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`).join('\\n');\n }\n\n case 'kirograph_circular_deps': {\n const cycles = cg.findCircularDependencies();\n if (cycles.length === 0) return 'No circular dependencies found.';\n return `Found ${cycles.length} circular dependency cycle(s):\\n` +\n cycles.map((cycle, i) => `Cycle ${i + 1}: ${cycle.join(' \u2192 ')}`).join('\\n');\n }\n\n case 'kirograph_path': {\n const fromResults = cg.searchNodes(args.from as string, undefined, 3);\n const toResults = cg.searchNodes(args.to as string, undefined, 3);\n if (fromResults.length === 0) return `Symbol \"${args.from}\" not found in index.`;\n if (toResults.length === 0) return `Symbol \"${args.to}\" not found in index.`;\n const fromNode = fromResults[0].node;\n const toNode = toResults[0].node;\n const pathNodes = await cg.findPath(fromNode.id, toNode.id);\n if (pathNodes.length === 0) return `No path found between \\`${fromNode.name}\\` and \\`${toNode.name}\\`.`;\n return `Path from \\`${fromNode.name}\\` to \\`${toNode.name}\\` (${pathNodes.length} nodes):\\n` +\n pathNodes.map((n, i) => `${i + 1}. ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`).join('\\n');\n }\n\n case 'kirograph_type_hierarchy': {\n const results = cg.searchNodes(args.symbol as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.symbol}\" not found in index.`;\n const node = results[0].node;\n const direction = (args.direction as 'up' | 'down' | 'both') ?? 'both';\n const hierarchy = cg.getTypeHierarchy(node.id, direction);\n if (hierarchy.length === 0) return `No type hierarchy found for \\`${node.name}\\`.`;\n return `Type hierarchy for \\`${node.name}\\` (direction: ${direction}):\\n` +\n hierarchy.map(n => `- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`).join('\\n');\n }\n\n case 'kirograph_architecture': {\n if (!cg.isArchitectureEnabled()) {\n return 'Architecture analysis is disabled. Set enableArchitecture=true in .kirograph/config.json and re-index.';\n }\n const level = (args.level as string) ?? 'both';\n const includeFiles = args.includeFiles === true;\n const arch = cg.getArchitecture();\n\n const lines: string[] = ['# Architecture'];\n\n if ((level === 'packages' || level === 'both') && arch.packages.length > 0) {\n lines.push('\\n## Packages');\n for (const pkg of arch.packages) {\n const meta = [pkg.language, pkg.version].filter(Boolean).join(', ');\n lines.push(`- **${pkg.name}** (${pkg.path}) [${pkg.source}${meta ? ' \u00B7 ' + meta : ''}]`);\n }\n if (arch.packageDeps.length > 0) {\n lines.push('\\n## Package Dependencies');\n for (const dep of arch.packageDeps) {\n const src = arch.packages.find(p => p.id === dep.sourcePkg)?.name ?? dep.sourcePkg;\n const tgt = arch.packages.find(p => p.id === dep.targetPkg)?.name ?? dep.targetPkg;\n lines.push(`- ${src} \u2192 ${tgt} (${dep.depCount} import${dep.depCount !== 1 ? 's' : ''})`);\n }\n }\n }\n\n if ((level === 'layers' || level === 'both') && arch.layers.length > 0) {\n lines.push('\\n## Layers');\n for (const layer of arch.layers) {\n const fileCount = Object.values(arch.fileLayers).filter(fl => fl.some(l => l.layerId === layer.id)).length;\n lines.push(`- **${layer.name}** [${layer.source}] \u2014 ${fileCount} file${fileCount !== 1 ? 's' : ''}`);\n }\n if (arch.layerDeps.length > 0) {\n lines.push('\\n## Layer Dependencies');\n for (const dep of arch.layerDeps) {\n const src = dep.sourceLayer.replace('layer:', '');\n const tgt = dep.targetLayer.replace('layer:', '');\n lines.push(`- ${src} \u2192 ${tgt} (${dep.depCount})`);\n }\n }\n }\n\n if (includeFiles && (level === 'packages' || level === 'both')) {\n lines.push('\\n## File \u2192 Package');\n for (const [file, pkgIds] of Object.entries(arch.filePackages).slice(0, 50)) {\n const names = pkgIds.map(id => arch.packages.find(p => p.id === id)?.name ?? id).join(', ');\n lines.push(`- ${file}: ${names}`);\n }\n if (Object.keys(arch.filePackages).length > 50) lines.push(' \u2026(truncated)');\n }\n\n if (arch.packages.length === 0 && arch.layers.length === 0) {\n return 'No architecture data found. Run `kirograph index` with enableArchitecture=true.';\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_coupling': {\n if (!cg.isArchitectureEnabled()) {\n return 'Architecture analysis is disabled. Set enableArchitecture=true in .kirograph/config.json and re-index.';\n }\n const sortBy = (args.sortBy as string) ?? 'instability';\n const limit = clampLimit(args.limit as number | undefined, 20);\n const arch = cg.getArchitecture();\n\n if (arch.coupling.length === 0) {\n return 'No coupling data. Run `kirograph index` with enableArchitecture=true.';\n }\n\n const sorted = [...arch.coupling].sort((a, b) => {\n if (sortBy === 'afferent') return b.afferent - a.afferent;\n if (sortBy === 'efferent') return b.efferent - a.efferent;\n return b.instability - a.instability;\n }).slice(0, limit);\n\n const lines = [\n `Coupling Metrics (sorted by ${sortBy}):`,\n '',\n 'Package Ca Ce I',\n '\u2500'.repeat(52),\n ];\n\n for (const c of sorted) {\n const pkg = arch.packages.find(p => p.id === c.packageId);\n const name = (pkg?.name ?? c.packageId).slice(0, 32).padEnd(32);\n const ca = String(c.afferent).padStart(4);\n const ce = String(c.efferent).padStart(4);\n const inst = c.instability.toFixed(2).padStart(5);\n lines.push(`${name} ${ca} ${ce} ${inst}`);\n }\n\n lines.push('', 'Ca=afferent (depended on by), Ce=efferent (depends on), I=instability (Ce/(Ca+Ce))');\n return lines.join('\\n');\n }\n\n case 'kirograph_package': {\n if (!cg.isArchitectureEnabled()) {\n return 'Architecture analysis is disabled. Set enableArchitecture=true in .kirograph/config.json and re-index.';\n }\n const query = (args.package as string).toLowerCase();\n const includeFiles = args.includeFiles !== false;\n const arch = cg.getArchitecture();\n\n const pkg = arch.packages.find(p =>\n p.name.toLowerCase().includes(query) || p.path.toLowerCase().includes(query) || p.id.toLowerCase().includes(query)\n );\n if (!pkg) return `Package \"${args.package}\" not found. Use kirograph_architecture to list all packages.`;\n\n const lines = [\n `## Package: ${pkg.name}`,\n `Path: ${pkg.path}`,\n `Source: ${pkg.source}${pkg.manifestPath ? ` (${pkg.manifestPath})` : ''}`,\n ...(pkg.version ? [`Version: ${pkg.version}`] : []),\n ...(pkg.language ? [`Language: ${pkg.language}`] : []),\n ];\n\n const deps = arch.packageDeps.filter(d => d.sourcePkg === pkg.id);\n const dependents = arch.packageDeps.filter(d => d.targetPkg === pkg.id);\n const coupling = arch.coupling.find(c => c.packageId === pkg.id);\n\n if (coupling) {\n lines.push('', `Coupling: Ca=${coupling.afferent} Ce=${coupling.efferent} I=${coupling.instability.toFixed(2)}`);\n }\n\n if (deps.length > 0) {\n lines.push('', `Depends on (${deps.length}):`);\n for (const dep of deps) {\n const name = arch.packages.find(p => p.id === dep.targetPkg)?.name ?? dep.targetPkg;\n lines.push(` \u2192 ${name} (${dep.depCount} import${dep.depCount !== 1 ? 's' : ''})`);\n }\n }\n\n if (dependents.length > 0) {\n lines.push('', `Depended on by (${dependents.length}):`);\n for (const dep of dependents) {\n const name = arch.packages.find(p => p.id === dep.sourcePkg)?.name ?? dep.sourcePkg;\n lines.push(` \u2190 ${name} (${dep.depCount} import${dep.depCount !== 1 ? 's' : ''})`);\n }\n }\n\n if (pkg.externalDeps && pkg.externalDeps.length > 0) {\n lines.push('', `External deps (${pkg.externalDeps.length}): ${pkg.externalDeps.slice(0, 10).join(', ')}${pkg.externalDeps.length > 10 ? '\u2026' : ''}`);\n }\n\n if (includeFiles) {\n const files = Object.entries(arch.filePackages)\n .filter(([, ids]) => ids.includes(pkg.id))\n .map(([f]) => f)\n .sort();\n if (files.length > 0) {\n lines.push('', `Files (${files.length}):`);\n for (const f of files.slice(0, 30)) lines.push(` ${f}`);\n if (files.length > 30) lines.push(` \u2026and ${files.length - 30} more`);\n }\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_hotspots': {\n const limit = clampLimit(args.limit as number | undefined, 20);\n const hotspots = cg.findHotspots(limit);\n if (hotspots.length === 0) return 'No symbols found in index.';\n const lines = [`Top ${hotspots.length} most-connected symbols (by edge degree):\\n`];\n for (const n of hotspots) {\n lines.push(`${mapKind(n.kind)} \\`${n.name}\\` \u2014 degree ${n.degree} (in: ${n.inDegree}, out: ${n.outDegree})`);\n lines.push(` File: ${n.filePath}:${n.startLine}`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_surprising': {\n const limit = clampLimit(args.limit as number | undefined, 20);\n const connections = cg.findSurprisingConnections(limit);\n if (connections.length === 0) return 'No surprising cross-file connections found.';\n const lines = [`Top ${connections.length} surprising cross-file connections:\\n`];\n for (const c of connections) {\n lines.push(`${mapKind(c.source.kind)} \\`${c.source.name}\\` ${c.kind}\u2192 ${mapKind(c.target.kind)} \\`${c.target.name}\\` (score: ${c.score.toFixed(2)})`);\n lines.push(` ${c.source.filePath} \u2192 ${c.target.filePath}`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_diff': {\n const sm = cg.createSnapshotManager();\n const snapshot = args.snapshot\n ? sm.load(args.snapshot as string)\n : sm.loadLatest();\n if (!snapshot) {\n return args.snapshot\n ? `Snapshot \"${args.snapshot}\" not found. Use \\`kirograph snapshot list\\` to see available snapshots.`\n : 'No snapshots found. Run `kirograph snapshot` to save one first.';\n }\n const diff = sm.diff(snapshot, sm.currentSnapshot());\n const fromDate = new Date(diff.from.timestamp).toISOString().slice(0, 19).replace('T', ' ');\n const lines = [\n `Graph diff: \"${diff.from.label}\" (${fromDate}) \u2192 current`,\n ``,\n `Symbols: +${diff.addedNodes.length} added, -${diff.removedNodes.length} removed`,\n `Edges: +${diff.addedEdges.length} added, -${diff.removedEdges.length} removed`,\n ];\n if (diff.addedNodes.length > 0) {\n lines.push(`\\n## Added symbols (${diff.addedNodes.length})`);\n for (const n of diff.addedNodes.slice(0, 30)) {\n lines.push(`+ ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}`);\n }\n if (diff.addedNodes.length > 30) lines.push(` \u2026and ${diff.addedNodes.length - 30} more`);\n }\n if (diff.removedNodes.length > 0) {\n lines.push(`\\n## Removed symbols (${diff.removedNodes.length})`);\n for (const n of diff.removedNodes.slice(0, 30)) {\n lines.push(`- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}`);\n }\n if (diff.removedNodes.length > 30) lines.push(` \u2026and ${diff.removedNodes.length - 30} more`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_snapshot_save': {\n const sm = cg.createSnapshotManager();\n const snapshot = sm.save(args.label as string | undefined);\n return `Snapshot saved: \"${snapshot.label}\" \u2014 ${snapshot.nodeCount} symbols, ${snapshot.edgeCount} edges`;\n }\n\n case 'kirograph_snapshot_list': {\n const sm = cg.createSnapshotManager();\n const snapshots = sm.list();\n if (snapshots.length === 0) return 'No snapshots yet. Use kirograph_snapshot_save to save one first.';\n const lines = [`Saved snapshots (${snapshots.length}):\\n`];\n for (const s of snapshots) {\n const date = new Date(s.timestamp).toISOString().slice(0, 19).replace('T', ' ');\n lines.push(`- ${s.label} (${date}, ${s.nodeCount} symbols, ${s.edgeCount} edges)`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_flows': {\n const { getExecutionFlows, traceFlow, detectEntryPoints } = await Promise.resolve().then(() => require('../graph/flows.js'));\n const db = cg.getDatabase();\n\n if (args.entryPoint) {\n // Trace from a specific symbol\n const results = cg.searchNodes(args.entryPoint as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.entryPoint}\" not found in index.`;\n const hops = traceFlow(db, results[0].node.id, (args.maxDepth as number) ?? 10);\n if (hops.length < 2) return `No outgoing call chain found from \"${args.entryPoint}\".`;\n\n const lines = [`## Execution flow from \\`${args.entryPoint}\\``, ''];\n for (let i = 0; i < hops.length; i++) {\n const hop = hops[i];\n const indent = ' '.repeat(i);\n const arrow = i === 0 ? '\u2192' : '\u21B3';\n const conf = hop.confidence && hop.confidence !== 'extracted' ? ` [${hop.confidence}]` : '';\n lines.push(`${indent}${arrow} ${hop.kind} \\`${hop.symbol}\\` \u2014 ${hop.filePath}:${hop.line}${conf}`);\n }\n return lines.join('\\n');\n }\n\n // Auto-detect entry points and trace flows\n const flows = getExecutionFlows(db, {\n maxFlows: (args.maxFlows as number) ?? 10,\n maxDepth: (args.maxDepth as number) ?? 10,\n });\n\n if (flows.length === 0) return 'No execution flows detected. The graph may be too small or have no call edges.';\n\n const lines = [`## Execution Flows (${flows.length} detected)`, ''];\n for (const flow of flows) {\n lines.push(`### \\`${flow.entryPoint}\\` (${flow.entryPointKind}) \u2014 criticality: ${flow.criticality.toFixed(2)}`);\n lines.push(`File: ${flow.entryPointFile}`, '');\n for (let i = 0; i < flow.hops.length; i++) {\n const hop = flow.hops[i];\n const indent = ' '.repeat(Math.min(i, 5));\n const arrow = i === 0 ? '\u2192' : '\u21B3';\n const conf = hop.confidence && hop.confidence !== 'extracted' ? ` [${hop.confidence}]` : '';\n lines.push(`${indent}${arrow} \\`${hop.symbol}\\` (${hop.kind}) \u2014 ${hop.filePath}:${hop.line}${conf}`);\n }\n lines.push('');\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_communities': {\n const { detectCommunities } = await Promise.resolve().then(() => require('../graph/communities.js'));\n const db = cg.getDatabase();\n const result = detectCommunities(db, {\n resolution: (args.resolution as number) ?? 1.0,\n });\n\n if (result.communities.length === 0) return 'No communities detected. The graph may be too small or have no edges.';\n\n const limit = Math.min((args.limit as number) ?? 15, result.communities.length);\n const lines = [\n `## Communities (${result.communities.length} detected, modularity: ${result.modularity.toFixed(3)})`,\n `Graph: ${result.totalNodes} nodes, ${result.totalEdges} edges`,\n '',\n ];\n\n for (const c of result.communities.slice(0, limit)) {\n lines.push(`### ${c.label} (${c.memberCount} symbols)`);\n lines.push(`- Directory: \\`${c.dominantDirectory}\\``);\n lines.push(`- Language: ${c.dominantLanguage}`);\n lines.push(`- Inter-community edges: ${c.interCommunityEdges}`);\n lines.push(`- Top members:`);\n for (const m of c.members.slice(0, 8)) {\n lines.push(` - ${m.kind} \\`${m.name}\\` \u2014 ${m.filePath}`);\n }\n if (c.memberCount > 8) lines.push(` - \u2026and ${c.memberCount - 8} more`);\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_refactor': {\n const { renamePreview, suggestRefactorings } = await Promise.resolve().then(() => require('../graph/refactor.js'));\n const db = cg.getDatabase();\n const mode = args.mode as string;\n\n if (mode === 'rename') {\n if (!args.symbol) return 'Error: \"symbol\" parameter is required for rename mode.';\n const preview = renamePreview(db, args.symbol as string);\n if (!preview) return `Symbol \"${args.symbol}\" not found in index.`;\n\n const lines = [\n `## Rename Preview: \\`${preview.symbol}\\``,\n `Kind: ${preview.kind}`,\n `Defined at: ${preview.filePath}:${preview.line}`,\n `Total references: ${preview.totalReferences}`,\n '',\n ];\n\n if (preview.references.length === 0) {\n lines.push('No references found \u2014 this symbol can be safely renamed without affecting other code.');\n } else {\n // Group by file\n const byFile = new Map<string, typeof preview.references>();\n for (const ref of preview.references) {\n if (!byFile.has(ref.filePath)) byFile.set(ref.filePath, []);\n byFile.get(ref.filePath)!.push(ref);\n }\n\n for (const [file, refs] of byFile) {\n lines.push(`### ${file} (${refs.length} references)`);\n for (const ref of refs.slice(0, 10)) {\n lines.push(`- Line ${ref.line}: \\`${ref.context}\\` (${ref.edgeKind})`);\n }\n if (refs.length > 10) lines.push(` \u2026and ${refs.length - 10} more`);\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n }\n\n if (mode === 'suggest') {\n const suggestions = suggestRefactorings(db, (args.limit as number) ?? 10);\n if (suggestions.length === 0) return 'No refactoring suggestions \u2014 the codebase structure looks clean.';\n\n const lines = [`## Refactoring Suggestions (${suggestions.length})`, ''];\n for (const s of suggestions) {\n const icon = s.priority === 'high' ? '\uD83D\uDD34' : s.priority === 'medium' ? '\uD83D\uDFE1' : '\uD83D\uDFE2';\n lines.push(`${icon} **${s.type}** [${s.priority}]: ${s.description}`);\n lines.push(` Rationale: ${s.rationale}`);\n if (s.symbols.length > 0) {\n lines.push(` Symbols: ${s.symbols.slice(0, 3).join(', ')}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n return 'Unknown mode. Use \"rename\" or \"suggest\".';\n }\n\n // \u2500\u2500 Memory tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_mem_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const results = await mem.search(args.query as string, {\n limit: (args.limit as number) ?? 10,\n kind: args.kind as any,\n sessionId: args.sessionId as string | undefined,\n asOf: args.asOf as number | undefined,\n });\n\n if (results.length === 0) return `No memory observations found for \"${args.query}\".`;\n\n return results.map((r, i) => {\n const age = formatAge(r.observation.createdAt);\n const lines = [`${i + 1}. [${r.observation.kind}] ${r.observation.content} (${age})`];\n if (r.relations && r.relations.length > 0) {\n for (const rel of r.relations) {\n const other = rel.observationA === r.observation.id ? rel.observationB : rel.observationA;\n const icon = rel.relation === 'conflicts_with' ? '\u26A1' : rel.relation === 'supersedes' ? '\u21A9' : '~';\n lines.push(` ${icon} ${rel.relation} ${other} (confidence: ${rel.confidence})${rel.judgmentStatus === 'judged' ? ' (judged)' : ''}`);\n }\n }\n return lines.join('\\n');\n }).join('\\n');\n }\n\n case 'kirograph_mem_store': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const id = await mem.store({\n content: args.content as string,\n kind: (args.kind as any) ?? 'note',\n source: 'agent',\n topicKey: args.topicKey as string | undefined,\n reviewAfter: args.reviewAfter as number | undefined,\n });\n\n if (!id) return 'Observation already exists (duplicate content).';\n return `Stored observation ${id} [${(args.kind as string) ?? 'note'}]`;\n }\n\n case 'kirograph_mem_timeline': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const { sessions, observations } = mem.timeline({\n limit: (args.limit as number) ?? 5,\n sessionId: args.sessionId as string | undefined,\n });\n\n if (sessions.length === 0) return 'No memory sessions found.';\n\n const lines: string[] = [];\n for (const session of sessions) {\n const start = new Date(session.startedAt).toISOString().slice(0, 16).replace('T', ' ');\n const status = session.endedAt ? 'ended' : 'active';\n const obs = observations.get(session.id) ?? [];\n lines.push(`## ${start} [${session.ide ?? 'unknown'}] (${status}, ${obs.length} observations)`);\n for (const o of obs.slice(0, 5)) {\n lines.push(` - [${o.kind}] ${o.content.slice(0, 120)}`);\n }\n if (obs.length > 5) lines.push(` \u2026and ${obs.length - 5} more`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_mem_status': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const stats = mem.getStats();\n const lines = [\n 'KiroGraph Memory Status',\n ` Sessions: ${stats.sessions} (${stats.activeSessions} active)`,\n ` Observations: ${stats.observations}`,\n ` Symbol links: ${stats.links}`,\n ` Embeddings: ${stats.vectors} / ${stats.embeddableCount}`,\n ` Model mismatch: ${stats.modelMismatch ? '\u26A0 yes \u2014 run kirograph mem reembed' : 'no'}`,\n ` Relations: ${stats.relations} (${stats.pendingConflicts} pending)`,\n ` Caveman compression: ${config.cavemanMode !== 'off' ? config.cavemanMode : 'off (storing raw)'}`,\n ];\n return lines.join('\\n');\n }\n\n case 'kirograph_mem_review': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const obs = mem.getObservationsForReview(args.limit as number ?? 20);\n if (obs.length === 0) return 'No overdue observations \u2014 all review_after dates are in the future.';\n const now = Date.now();\n return obs.map((o, i) => {\n const daysOverdue = Math.floor((now - (o.reviewAfter ?? now)) / 86400000);\n return `${i + 1}. [${o.kind}]${o.topicKey ? ` (${o.topicKey})` : ''} ${o.content.slice(0, 120)} \u2014 overdue by ${daysOverdue}d`;\n }).join('\\n');\n }\n\n case 'kirograph_mem_mark_reviewed': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n mem.markReviewed(args.id as string);\n return `Observation ${args.id} marked as reviewed.`;\n }\n\n case 'kirograph_mem_compare': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const relationId = mem.compareObservations({\n observationA: args.observationA as string,\n observationB: args.observationB as string,\n relation: args.relation as any,\n confidence: args.confidence as number ?? 1.0,\n reason: args.reason as string | undefined,\n evidence: args.evidence as string | undefined,\n });\n return `Relation ${relationId} created (${args.relation}, confidence: ${args.confidence ?? 1.0}). Use kirograph_mem_judge to finalize.`;\n }\n\n case 'kirograph_mem_judge': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n mem.judgeRelation(\n args.relationId as string,\n args.relation as any,\n args.confidence as number,\n args.reason as string | undefined,\n args.evidence as string | undefined,\n );\n return `Relation ${args.relationId} judged as [${args.relation}] (confidence: ${args.confidence}).`;\n }\n\n case 'kirograph_mem_capture': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const extracted = mem.capturePassive(args.content as string);\n if (extracted.length === 0) return 'No structured sections found. Use ## Key Learnings, ## Observations, ## Decisions, or ## Key Changes headings.';\n return `Captured ${extracted.length} observation(s):\\n` + extracted.map((e, i) => `${i + 1}. [${e.kind}] ${e.content.slice(0, 100)}${e.id ? '' : ' (duplicate)'}`).join('\\n');\n }\n\n case 'kirograph_mem_save_prompt': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const id = await mem.savePrompt(args.content as string);\n return `Prompt saved as ${id}.`;\n }\n\n case 'kirograph_mem_suggest_topic_key': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const key = mem.suggestTopicKey(args.kind as string, args.title as string);\n return `Suggested topic_key: ${key}`;\n }\n\n case 'kirograph_mem_conflicts_scan': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const candidates = mem.scanConflicts(args.limit as number ?? 50);\n if (candidates.length === 0) return 'No potential conflicts found among recent observations.';\n return `Found ${candidates.length} potential conflict(s):\\n` + candidates.map((c, i) =>\n `${i + 1}. [${c.observationA.kind}] \"${c.observationA.content.slice(0, 80)}\" \u2194 [${c.observationB.kind}] \"${c.observationB.content.slice(0, 80)}\" (similarity: ${c.similarity.toFixed(2)})`\n ).join('\\n') + '\\n\\nUse kirograph_mem_compare to establish relations.';\n }\n\n case 'kirograph_mem_prune': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const olderThan = (args.olderThan as string) ?? '90d';\n const durationMs = (() => {\n const m = olderThan.match(/^(\\d+)(d|m|w|h)$/);\n if (!m) return 90 * 86400000;\n const v = parseInt(m[1]);\n switch (m[2]) {\n case 'h': return v * 3600000;\n case 'd': return v * 86400000;\n case 'w': return v * 7 * 86400000;\n case 'm': return v * 30 * 86400000;\n default: return 90 * 86400000;\n }\n })();\n const deleted = mem.prune(durationMs);\n return `Pruned ${deleted} observation(s) older than ${olderThan}.`;\n }\n\n case 'kirograph_mem_lint': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const result = mem.lint();\n const lines = ['Memory Lint Results:'];\n lines.push(` Stale links: ${result.staleLinks}`);\n lines.push(` Model mismatch: ${result.modelMismatch ? 'yes' : 'no'}`);\n lines.push(` Stale sessions: ${result.staleSessions} (auto-closed)`);\n if (args.fix && result.staleLinks > 0) {\n const removed = mem.removeStaleLinks();\n lines.push(`\\n\u2713 Removed ${removed} stale link(s)`);\n } else if (result.staleLinks > 0) {\n lines.push(`\\nPass fix: true to remove stale links.`);\n }\n if (result.modelMismatch) {\n lines.push(`\\nRun 'kirograph mem reembed' to fix model mismatch.`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_mem_conflicts_list': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const limit = clampLimit(args.limit as number | undefined, 20);\n const pending = mem.getPendingRelations(limit);\n if (pending.length === 0) return 'No pending conflict relations.';\n return `Pending relations (${pending.length}):\\n\\n` + pending.map(r =>\n `[${r.id}] ${r.relation}\\n A: ${r.observationA}\\n B: ${r.observationB}${r.reason ? `\\n Reason: ${r.reason}` : ''}`\n ).join('\\n\\n') + '\\n\\nUse kirograph_mem_conflicts_ignore to dismiss, or kirograph_mem_judge to finalize.';\n }\n\n case 'kirograph_mem_conflicts_ignore': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const relationId = args.relationId as string;\n mem.ignoreRelation(relationId);\n return `Relation \"${relationId}\" ignored.`;\n }\n\n // \u2500\u2500 Docs tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_docs_toc': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot);\n\n const toc = docs.getToc({ file: args.file as string | undefined, tree: args.tree as boolean | undefined });\n if (toc.length === 0) return args.file ? `No sections found in \"${args.file}\".` : 'No documentation indexed. Run kirograph index.';\n\n const lines: string[] = [];\n const renderEntry = (entry: any, indent: string) => {\n const prefix = '#'.repeat(entry.level || 1);\n const summary = entry.summary ? ` \u2014 ${entry.summary}` : '';\n lines.push(`${indent}${prefix} ${entry.title}${summary}`);\n lines.push(`${indent} ID: ${entry.id}`);\n if (entry.children?.length) {\n for (const child of entry.children) renderEntry(child, indent + ' ');\n }\n };\n\n if (args.tree) {\n for (const entry of toc) renderEntry(entry, '');\n } else {\n for (const entry of toc) {\n const prefix = '#'.repeat(entry.level || 1);\n const summary = entry.summary ? ` \u2014 ${entry.summary}` : '';\n lines.push(`${prefix} ${entry.title} [${entry.filePath}]${summary}`);\n lines.push(` ID: ${entry.id}`);\n }\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_docs_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot, config);\n\n const results = await docs.searchSections(args.query as string, {\n file: args.file as string | undefined,\n limit: (args.limit as number) ?? 10,\n });\n\n if (results.length === 0) return `No documentation sections found matching \"${args.query}\".`;\n\n return results.map((r, i) => {\n const summary = r.section.summary ? `\\n ${r.section.summary}` : '';\n return `${i + 1}. ${r.section.title} [${r.section.filePath}]${summary}\\n ID: ${r.section.id}`;\n }).join('\\n\\n');\n }\n\n case 'kirograph_docs_section': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot);\n\n const result = docs.getSection(args.id as string, { context: args.context as boolean | undefined });\n if (!result) return `Section \"${args.id}\" not found.`;\n\n const lines: string[] = [];\n\n if (result.ancestors?.length) {\n lines.push('Breadcrumb: ' + result.ancestors.map(a => a.title).join(' > ') + ' > ' + result.section.title);\n lines.push('');\n }\n\n lines.push(result.content);\n\n if (result.children?.length) {\n lines.push('', '## Child sections:');\n for (const child of result.children) {\n const summary = child.summary ? ` \u2014 ${child.summary}` : '';\n lines.push(` - ${child.title}${summary} (ID: ${child.id})`);\n }\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_docs_outline': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot);\n\n const outline = docs.getOutline(args.file as string);\n if (outline.length === 0) return `No sections found in \"${args.file}\". Is the file indexed?`;\n\n const lines: string[] = [`Outline: ${args.file}`, ''];\n const renderOutline = (entries: any[], indent: string) => {\n for (const entry of entries) {\n const summary = entry.summary ? ` \u2014 ${entry.summary}` : '';\n lines.push(`${indent}${'#'.repeat(entry.level || 1)} ${entry.title}${summary}`);\n if (entry.children?.length) renderOutline(entry.children, indent + ' ');\n }\n };\n renderOutline(outline, '');\n\n return lines.join('\\n');\n }\n\n case 'kirograph_docs_refs': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot);\n\n const refs = docs.getRefs({\n sectionId: args.sectionId as string | undefined,\n qualifiedName: args.nodeId as string | undefined,\n });\n\n if (refs.length === 0) {\n if (args.sectionId) return `No code references found in section \"${args.sectionId}\".`;\n if (args.nodeId) return `No documentation sections reference \"${args.nodeId}\".`;\n return 'Provide either sectionId or nodeId to look up cross-references.';\n }\n\n return refs.map(r => {\n const direction = args.sectionId ? `\u2192 ${r.qualifiedName}` : `\u2190 ${r.sectionTitle ?? r.sectionId}`;\n return `[${r.refType}] ${direction} (confidence: ${r.confidence.toFixed(2)})`;\n }).join('\\n');\n }\n\n // \u2500\u2500 Data tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_data_list': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n const datasets = dq.listDatasets();\n\n if (datasets.length === 0) return 'No datasets indexed. Run kirograph index or kirograph data reindex.';\n\n return datasets.map(ds => {\n const sizeMb = (ds.fileSize / 1024 / 1024).toFixed(2);\n return `${ds.id} (${ds.format})\\n File: ${ds.filePath}\\n Rows: ${ds.rowCount.toLocaleString()} | Columns: ${ds.columnCount} | Size: ${sizeMb} MB`;\n }).join('\\n\\n');\n }\n\n case 'kirograph_data_describe': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n if (args.column) {\n const col = dq.describeColumn(args.dataset as string, args.column as string);\n if (!col) return `Column \"${args.column}\" not found in dataset \"${args.dataset}\".`;\n return [\n `Column: ${col.name}`,\n `Type: ${col.inferredType}`,\n `Nullable: ${col.nullable} (${(col.nullPct * 100).toFixed(1)}% null)`,\n `Cardinality: ${col.cardinality}`,\n col.minValue ? `Min: ${col.minValue}` : '',\n col.maxValue ? `Max: ${col.maxValue}` : '',\n col.meanValue !== null ? `Mean: ${col.meanValue.toFixed(2)}` : '',\n `Samples: ${col.sampleValues.join(', ')}`,\n ].filter(Boolean).join('\\n');\n }\n\n const result = dq.describeDataset(args.dataset as string);\n if (!result) return `Dataset \"${args.dataset}\" not found. Use kirograph_data_list to see available datasets.`;\n\n const lines = [\n `Dataset: ${result.dataset.id} (${result.dataset.format})`,\n `File: ${result.dataset.filePath}`,\n `Rows: ${result.dataset.rowCount.toLocaleString()} | Columns: ${result.dataset.columnCount}`,\n '',\n 'Columns:',\n ];\n for (const col of result.columns) {\n const nullInfo = col.nullable ? ` (${(col.nullPct * 100).toFixed(0)}% null)` : '';\n const samples = col.sampleValues.length > 0 ? ` \u2014 samples: ${col.sampleValues.slice(0, 3).join(', ')}` : '';\n const summary = col.summary ? ` [${col.summary}]` : '';\n lines.push(` ${col.name}: ${col.inferredType}${nullInfo} [${col.cardinality} distinct]${samples}${summary}`);\n }\n\n // Validation rules\n const rules = dq.validationRules(args.dataset as string);\n if (rules && rules.length > 0) {\n lines.push('', 'Validation rules:');\n for (const r of rules.slice(0, 10)) {\n lines.push(` ${r.column}: ${r.rules.join('; ')}`);\n }\n }\n\n // Sample data hints\n const hints = dq.sampleHints(args.dataset as string);\n if (hints && hints.length > 0) {\n lines.push('', 'Sample data hints:');\n for (const h of hints.slice(0, 10)) {\n lines.push(` ${h.column}: ${h.hint}`);\n }\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_data_query': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const result = dq.queryRows(args.dataset as string, {\n filters: args.filters as any[],\n columns: args.columns as string[],\n limit: (args.limit as number) ?? 100,\n offset: (args.offset as number) ?? 0,\n });\n\n if (!result) return `Dataset \"${args.dataset}\" not found.`;\n if (result.rows.length === 0) return `No rows match the given filters (${result.totalMatching} total in dataset).`;\n\n const header = `${result.rows.length} rows returned (${result.totalMatching} total matching):\\n`;\n const rowStrs = result.rows.slice(0, 50).map((row, i) => {\n const vals = Object.entries(row).map(([k, v]) => `${k}=${v ?? 'null'}`).join(', ');\n return ` ${i + 1}. ${vals}`;\n });\n if (result.rows.length > 50) rowStrs.push(` \u2026and ${result.rows.length - 50} more rows`);\n let response = header + rowStrs.join('\\n');\n\n // Token budget enforcement\n const maxChars = config.dataMaxResponseTokens * 4;\n if (response.length > maxChars) {\n response = response.slice(0, maxChars) + '\\n\\n[truncated: response exceeded token budget]';\n }\n\n // Anti-loop detection\n response = this.checkPaginationLoop(args.dataset as string, args.offset as number | undefined, response);\n\n return response;\n }\n\n case 'kirograph_data_aggregate': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const result = dq.aggregate(args.dataset as string, {\n groupBy: (args.groupBy as string[]) ?? [],\n metrics: (args.metrics as any[]) ?? [],\n filters: args.filters as any[],\n });\n\n if (!result) return `Dataset \"${args.dataset}\" not found.`;\n if (result.rows.length === 0) return 'No results (empty dataset or all rows filtered out).';\n\n const keys = Object.keys(result.rows[0]);\n const header = keys.join(' | ');\n const separator = keys.map(() => '---').join(' | ');\n const rows = result.rows.slice(0, 100).map(row => keys.map(k => row[k] ?? 'null').join(' | '));\n\n let response = `${header}\\n${separator}\\n${rows.join('\\n')}${result.rows.length > 100 ? `\\n\u2026and ${result.rows.length - 100} more groups` : ''}`;\n\n // Token budget enforcement\n const maxChars = config.dataMaxResponseTokens * 4;\n if (response.length > maxChars) {\n response = response.slice(0, maxChars) + '\\n\\n[truncated: response exceeded token budget]';\n }\n\n return response;\n }\n\n case 'kirograph_data_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const cols = dq.searchColumns(args.dataset as string, args.query as string);\n if (cols.length === 0) return `No columns matching \"${args.query}\" in dataset \"${args.dataset}\".`;\n\n return cols.map(c => {\n const samples = c.sampleValues.length > 0 ? ` \u2014 samples: ${c.sampleValues.slice(0, 3).join(', ')}` : '';\n return `${c.name}: ${c.inferredType} [${c.cardinality} distinct]${samples}`;\n }).join('\\n');\n }\n\n case 'kirograph_data_join': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n try {\n const result = dq.join({\n left: args.left as string,\n right: args.right as string,\n leftColumn: args.leftColumn as string,\n rightColumn: args.rightColumn as string,\n type: (args.type as any) ?? 'inner',\n columns: args.columns as string[] | undefined,\n limit: args.limit as number | undefined,\n });\n\n if (!result) return `Dataset not found. Verify both dataset IDs with kirograph_data_list.`;\n\n const joinTypeStr = String(args.type ?? 'inner').toUpperCase();\n const header = `Join: ${args.left}.${args.leftColumn} ${joinTypeStr} JOIN ${args.right}.${args.rightColumn}\\nMatching rows: ${result.totalMatching} (showing ${result.rows.length})`;\n if (result.rows.length === 0) return `${header}\\n\\nNo matching rows.`;\n\n const lines = result.rows.map(r => JSON.stringify(r));\n let response = `${header}\\n\\n${lines.join('\\n')}`;\n\n // Token budget enforcement\n const maxChars = config.dataMaxResponseTokens * 4;\n if (response.length > maxChars) {\n response = response.slice(0, maxChars) + '\\n\\n[truncated: response exceeded token budget]';\n }\n\n return response;\n } catch (err) {\n return `Error: ${err instanceof Error ? err.message : String(err)}`;\n }\n }\n\n case 'kirograph_data_correlations': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const pairs = dq.correlations(args.dataset as string, args.threshold as number | undefined);\n if (pairs === null) return `Dataset \"${args.dataset}\" not found.`;\n if (pairs.length === 0) return `No correlations above threshold ${args.threshold ?? 0.3} found. The dataset may have fewer than 2 numeric columns or no significant correlations.`;\n\n const lines = pairs.map(p =>\n `${p.column1} \u2194 ${p.column2}: ${p.correlation > 0 ? '+' : ''}${p.correlation.toFixed(4)} (${p.strength})`\n );\n return `Correlations for \"${args.dataset}\" (threshold: ${args.threshold ?? 0.3}):\\n\\n${lines.join('\\n')}`;\n }\n\n case 'kirograph_data_quality': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const quality = dq.quality(args.dataset as string);\n if (quality === null) return `Dataset \"${args.dataset}\" not found.`;\n if (quality.length === 0) return `No quality issues detected in \"${args.dataset}\". All columns look healthy.`;\n\n const lines = quality.map(q =>\n `${q.column} (risk: ${(q.riskScore * 100).toFixed(0)}%): ${q.issues.join('; ')}`\n );\n return `Quality report for \"${args.dataset}\" (${quality.length} columns with issues):\\n\\n${lines.join('\\n')}`;\n }\n\n case 'kirograph_data_drift': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const drift = dq.detectDrift(args.dataset as string);\n if (drift === null) return `Dataset \"${args.dataset}\" not found.`;\n if (!drift.hasDrift) {\n const rowDelta = drift.rowCountDelta !== 0\n ? ` (rows: ${drift.rowCountDelta > 0 ? '+' : ''}${drift.rowCountDelta})`\n : '';\n return `No schema drift detected for \"${args.dataset}\".${rowDelta}`;\n }\n const driftLines = [`Schema drift detected for \"${args.dataset}\":`];\n if (drift.addedColumns?.length) driftLines.push(` Added columns: ${drift.addedColumns.join(', ')}`);\n if (drift.removedColumns?.length) driftLines.push(` Removed columns: ${drift.removedColumns.join(', ')}`);\n if ((drift as any).typeChanges?.length) {\n for (const tc of (drift as any).typeChanges) {\n driftLines.push(` Type change: ${tc.column} ${tc.from} \u2192 ${tc.to}`);\n }\n }\n if (drift.rowCountDelta !== 0) driftLines.push(` Row count delta: ${drift.rowCountDelta > 0 ? '+' : ''}${drift.rowCountDelta}`);\n return driftLines.join('\\n');\n }\n\n case 'kirograph_data_history': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const limit = Math.min(Number(args.limit ?? 10), 50);\n const history = dq.getHistory(args.dataset as string, limit);\n if (history === null) return `Dataset \"${args.dataset}\" not found.`;\n if (history.length === 0) return `No history snapshots for \"${args.dataset}\".`;\n\n const histLines = [`Schema history for \"${args.dataset}\" (${history.length} snapshot(s)):\\n`];\n for (const snap of history) {\n const date = new Date(snap.snapshotAt).toISOString().replace('T', ' ').slice(0, 19);\n const colNames = snap.columns.map((c: any) => c.name).join(', ');\n histLines.push(`${date} rows: ${snap.rowCount.toLocaleString()} cols: ${snap.columnCount} schema: ${colNames}`);\n }\n return histLines.join('\\n');\n }\n\n // \u2500\u2500 Watchmen tools (require enableMemory + enableWatchmen) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_watchmen_status': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n if (!config.enableWatchmen) return 'Watchmen is not enabled. Set enableWatchmen: true in .kirograph/config.json';\n\n const { WatchmenChecker } = await Promise.resolve().then(() => require('../watchmen/index.js'));\n const { MemoryDatabase } = await Promise.resolve().then(() => require('../memory/database.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const memDb = new MemoryDatabase(db.getRawDb());\n memDb.initialize();\n\n const checker = new WatchmenChecker(config.watchmenThreshold);\n const { ready, pendingCount } = checker.shouldSynthesize(memDb);\n const { targetFiles } = checker.buildReadyResponse('', pendingCount, projectRoot);\n\n const statusLines = [\n `Watchmen Status:`,\n ` Pending observations: ${pendingCount} / ${config.watchmenThreshold} threshold`,\n ` Ready to synthesize: ${ready ? 'yes' : 'no'}`,\n ` Target files:`,\n ];\n for (const f of targetFiles) statusLines.push(` \u00B7 ${f}`);\n return statusLines.join('\\n');\n }\n\n case 'kirograph_watchmen_synthesize': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory || !config.enableWatchmen) return 'Watchmen is not enabled (enableMemory + enableWatchmen required).';\n if (config.watchmenSynthesisMode !== 'local') return 'watchmenSynthesisMode is not \"local\" \u2014 use the agent hook instead.';\n\n const { WatchmenChecker } = await Promise.resolve().then(() => require('../watchmen/index.js'));\n const { MemoryDatabase } = await Promise.resolve().then(() => require('../memory/database.js'));\n const { runLocalSynthesis } = await Promise.resolve().then(() => require('../watchmen/synthesize.js'));\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const memDb = new MemoryDatabase(db.getRawDb());\n memDb.initialize();\n\n const checker = new WatchmenChecker(config.watchmenThreshold);\n const { ready, pendingCount } = checker.shouldSynthesize(memDb);\n\n if (!ready && !args.force) {\n return `Watchmen: ${pendingCount}/${config.watchmenThreshold} observations \u2014 threshold not reached. Pass force: true to run anyway.`;\n }\n\n const observations = memDb.getObservationsSinceLastSummary(50);\n if (observations.length === 0) return 'No observations to synthesize.';\n\n const readyResult = checker.buildReadyResponse('', pendingCount, projectRoot);\n const result = await runLocalSynthesis(observations, readyResult, config.watchmenLocalModel, projectRoot, true);\n\n const mgr = new MemoryManager(config, db.getRawDb(), projectRoot);\n mgr.initialize();\n await mgr.store({ content: result.summaryObservation, kind: 'summary', source: 'agent' });\n\n const synthLines = [`Watchmen synthesis complete.`];\n if (result.filesWritten.length) synthLines.push(`Brief written to: ${result.filesWritten.join(', ')}`);\n if (result.skillsWritten.length) synthLines.push(`Skills written: ${result.skillsWritten.join(', ')}`);\n if (result.skillsPruned.length) synthLines.push(`Pruned stale: ${result.skillsPruned.join(', ')}`);\n return synthLines.join('\\n');\n }\n\n case 'kirograph_watchmen_reset': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n if (!config.enableWatchmen) return 'Watchmen is not enabled.';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mgr = new MemoryManager(config, db.getRawDb(), projectRoot);\n mgr.initialize();\n\n const id = await mgr.store({ content: `Watchmen counter reset via MCP at ${new Date().toISOString()}.`, kind: 'summary', source: 'manual' });\n return id ? 'Watchmen counter reset \u2014 pending observations set back to 0.' : 'Already at zero \u2014 nothing to reset.';\n }\n\n // \u2500\u2500 Affected tests \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_affected': {\n const files = (args.files as string[]) ?? [];\n if (files.length === 0) return 'No files provided. Pass file paths in the \"files\" array.';\n\n const affected = cg.getAffectedTests(files, {\n depth: (args.depth as number) ?? 5,\n testPattern: args.testPattern as string | undefined,\n });\n\n if (affected.length === 0) return `No affected test files found for the provided ${files.length} changed file(s).`;\n return `Affected test files (${affected.length}) for ${files.length} changed file(s):\\n\\n` +\n affected.map(f => `- ${f}`).join('\\n');\n }\n\n // \u2500\u2500 Security tools (require enableSecurity=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_security': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n if (!config.enableArchitecture) return 'Security requires architecture analysis. Set enableArchitecture: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n const depCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_dependencies`,\n ) ?? { count: 0 };\n\n const vulnCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_vulnerabilities`,\n ) ?? { count: 0 };\n\n const verdictRows: Array<{ verdict: string; count: number }> = rawDb.all(\n `SELECT verdict, COUNT(*) as count FROM sec_reachability GROUP BY verdict`,\n );\n const verdicts: Record<string, number> = {};\n for (const row of verdictRows) {\n verdicts[row.verdict] = row.count;\n }\n\n const staleCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_dependencies WHERE vuln_data_stale = 1`,\n ) ?? { count: 0 };\n\n // Count suppressed CVEs\n const { SuppressionManager: SecSuppressionManager } = await Promise.resolve().then(() => require('../security/suppressions.js'));\n const secSuppressions = new SecSuppressionManager(projectRoot);\n const allCveIds: Array<{ cve_id: string }> = rawDb.all(`SELECT cve_id FROM sec_vulnerabilities`);\n const suppressedCveCount = allCveIds.filter(r => secSuppressions.isSuppressed(r.cve_id)).length;\n const visibleVulnCount = vulnCount.count - suppressedCveCount;\n\n const lines: string[] = [\n '# Security Overview',\n '',\n `Dependencies: ${depCount.count}`,\n `Vulnerabilities: ${visibleVulnCount}${suppressedCveCount > 0 ? ` (${suppressedCveCount} suppressed)` : ''}`,\n ];\n\n if (visibleVulnCount > 0) {\n const affected = verdicts['affected'] ?? 0;\n const notAffected = verdicts['not_affected'] ?? 0;\n const underInvestigation = verdicts['under_investigation'] ?? 0;\n const pending = visibleVulnCount - affected - notAffected - underInvestigation;\n\n lines.push('', '## Reachability Verdicts', '');\n if (affected > 0) lines.push(`\u25CF Affected: ${affected}`);\n if (notAffected > 0) lines.push(`\u25CF Not affected: ${notAffected}`);\n if (underInvestigation > 0) lines.push(`\u25CF Under investigation: ${underInvestigation}`);\n if (pending > 0) lines.push(`\u25CF Pending analysis: ${pending}`);\n }\n\n if (staleCount.count > 0) {\n lines.push('', `\u26A0 ${staleCount.count} dependenc${staleCount.count === 1 ? 'y has' : 'ies have'} stale vulnerability data. Use kirograph_vulns with refresh=true to update.`);\n }\n\n // Check if vulnerability data is stale by age\n const lastVulnCheck = (rawDb.get(\n `SELECT MIN(last_vuln_check) as oldest FROM sec_dependencies WHERE last_vuln_check IS NOT NULL`,\n ) as { oldest: number | null } | undefined)?.oldest;\n if (lastVulnCheck != null) {\n const ageMs = Date.now() - lastVulnCheck;\n const ageDays = ageMs / (1000 * 60 * 60 * 24);\n const maxAge = config.securityEnrichMaxAgeDays ?? 7;\n if (ageDays > maxAge) {\n lines.push('', `\u26A0 Vulnerability data is ${Math.floor(ageDays)} days old (max: ${maxAge}). Run kirograph vulns --refresh to update.`);\n }\n }\n\n // Pattern SAST findings count\n try {\n const rawDbSec = db.getRawDb();\n const tableExistsSec = rawDbSec.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (tableExistsSec) {\n const patternCount = rawDbSec.get('SELECT COUNT(*) as cnt FROM pattern_matches')?.cnt ?? 0;\n if (patternCount > 0) {\n const critCount = rawDbSec.get(\"SELECT COUNT(*) as cnt FROM pattern_matches WHERE severity = 'critical'\")?.cnt ?? 0;\n lines.push(`SAST findings: ${patternCount} pattern matches (${critCount} critical)`);\n }\n }\n } catch { /* non-critical */ }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_vulns': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n // Handle refresh\n if (args.refresh === true) {\n const { OsvAdapter } = await Promise.resolve().then(() => require('../security/vuln/osv-adapter.js'));\n const { VulnerabilityDatabaseClient } = await Promise.resolve().then(() => require('../security/vuln/client.js'));\n\n const adapters = config.securityDatabases.map((dbName: string) => {\n if (dbName.toUpperCase() === 'OSV') return new OsvAdapter();\n return null;\n }).filter(Boolean) as any[];\n\n const client = new VulnerabilityDatabaseClient(adapters, db);\n await client.enrichAll();\n }\n\n // Build query\n let query = `\n SELECT\n v.node_id, v.cve_id, v.severity_score, v.fixed_version, v.summary,\n v.epss_score, v.epss_percentile, v.risk_score,\n d.package_name, d.ecosystem, d.resolved_version, d.declared_constraint,\n r.verdict\n FROM sec_vulnerabilities v\n LEFT JOIN edges e ON e.target = v.node_id AND e.kind = 'has_vulnerability'\n LEFT JOIN sec_dependencies d ON d.node_id = e.source\n LEFT JOIN sec_reachability r ON r.vulnerability_node_id = v.node_id\n WHERE 1=1\n `;\n const params: any[] = [];\n\n // Severity filter\n if (args.severity) {\n const severityRanges: Record<string, [number, number]> = {\n critical: [9.0, 10.0],\n high: [7.0, 8.9],\n medium: [4.0, 6.9],\n low: [0.1, 3.9],\n };\n const range = severityRanges[(args.severity as string).toLowerCase()];\n if (!range) return `Invalid severity: ${args.severity}. Use: critical, high, medium, low`;\n query += ` AND v.severity_score >= ? AND v.severity_score <= ?`;\n params.push(range[0], range[1]);\n }\n\n // Verdict filter\n if (args.verdict) {\n const validVerdicts = ['affected', 'not_affected', 'under_investigation'];\n if (!validVerdicts.includes(args.verdict as string)) {\n return `Invalid verdict: ${args.verdict}. Use: affected, not_affected, under_investigation`;\n }\n query += ` AND r.verdict = ?`;\n params.push(args.verdict);\n }\n\n const limit = clampLimit(args.limit as number | undefined, 20);\n query += ` ORDER BY v.risk_score DESC NULLS LAST LIMIT ?`;\n params.push(limit);\n\n const rows: Array<{\n node_id: string;\n cve_id: string;\n severity_score: number | null;\n fixed_version: string | null;\n summary: string | null;\n epss_score: number | null;\n epss_percentile: number | null;\n risk_score: number | null;\n package_name: string | null;\n ecosystem: string | null;\n resolved_version: string | null;\n declared_constraint: string | null;\n verdict: string | null;\n }> = rawDb.all(query, params);\n\n // Deduplicate by (cve_id, package_name, ecosystem) \u2014 same CVE can appear multiple\n // times when a package is declared in multiple manifests (monorepo).\n const verdictRankMcp = (v: string | null) =>\n v === 'affected' ? 3 : v === 'under_investigation' ? 2 : v === 'not_affected' ? 1 : 0;\n const dedupMapMcp = new Map<string, typeof rows[0]>();\n for (const row of rows) {\n const key = `${row.cve_id}::${row.package_name ?? ''}::${row.ecosystem ?? ''}`;\n const ex = dedupMapMcp.get(key);\n if (!ex || verdictRankMcp(row.verdict) > verdictRankMcp(ex.verdict)) dedupMapMcp.set(key, row);\n }\n const dedupedRowsMcp = [...dedupMapMcp.values()];\n\n // Filter out suppressed CVEs\n const { SuppressionManager } = await Promise.resolve().then(() => require('../security/suppressions.js'));\n const suppressionMgr = new SuppressionManager(projectRoot);\n const suppressedCount = dedupedRowsMcp.filter(row => suppressionMgr.isSuppressed(row.cve_id)).length;\n const filteredRows = dedupedRowsMcp.filter(row => !suppressionMgr.isSuppressed(row.cve_id));\n\n if (filteredRows.length === 0) {\n const noMatch = 'No vulnerabilities found' + ((args.severity || args.verdict) ? ' matching filters.' : '.');\n return suppressedCount > 0 ? `${noMatch} (${suppressedCount} suppressed)` : noMatch;\n }\n\n const { formatFixSuggestion } = await Promise.resolve().then(() => require('../security/export/fix-suggestions.js'));\n\n const lines: string[] = [`Vulnerabilities (${filteredRows.length}${suppressedCount > 0 ? `, ${suppressedCount} suppressed` : ''}):\\n`];\n\n for (const row of filteredRows) {\n const score = row.severity_score;\n let severityLabel: string;\n if (score == null) severityLabel = 'UNKNOWN';\n else if (score >= 9.0) severityLabel = 'CRITICAL';\n else if (score >= 7.0) severityLabel = 'HIGH';\n else if (score >= 4.0) severityLabel = 'MEDIUM';\n else severityLabel = 'LOW';\n\n let verdictLabel: string;\n if (!row.verdict) verdictLabel = 'pending';\n else if (row.verdict === 'affected') verdictLabel = 'affected';\n else if (row.verdict === 'not_affected') verdictLabel = 'not affected';\n else verdictLabel = 'investigating';\n\n const pkg = row.package_name\n ? `${row.package_name}@${row.resolved_version || row.declared_constraint || '?'}`\n : 'unknown package';\n\n const epssNote = row.epss_score != null\n ? ` [EPSS: ${row.epss_score.toFixed(2)}]`\n : '';\n const riskNote = row.risk_score != null\n ? ` [Risk: ${row.risk_score.toFixed(1)}]`\n : '';\n lines.push(`${severityLabel} ${row.cve_id} ${pkg} [${verdictLabel}]${epssNote}${riskNote}`);\n\n if (row.summary && row.summary !== 'Manually registered') {\n const truncSummary = row.summary.length > 120 ? row.summary.slice(0, 120) + '\u2026' : row.summary;\n lines.push(` ${truncSummary}`);\n }\n\n if (row.fixed_version && row.ecosystem && row.package_name) {\n const fix = formatFixSuggestion(row.ecosystem, row.package_name, row.fixed_version);\n if (fix) lines.push(` ${fix}`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_vuln_add': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const cveId = args.cveId as string;\n const pkgName = args.package as string;\n if (!cveId) return 'Error: cveId is required.';\n if (!pkgName) return 'Error: package is required.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n // Find matching Dependency_Node\n const depRow: { node_id: string; ecosystem: string } | undefined = rawDb.get(\n `SELECT node_id, ecosystem FROM sec_dependencies WHERE package_name = ?`,\n [pkgName],\n );\n\n if (!depRow) {\n return `No dependency found matching \"${pkgName}\". Run kirograph index first to discover dependencies.`;\n }\n\n // Create Vulnerability_Node\n const vulnNodeId = `vuln:${cveId}`;\n const now = Date.now();\n const severity = args.severity as number | undefined;\n const summary = (args.summary as string) ?? 'Manually registered';\n const fixedVersion = (args.fixedVersion as string) ?? null;\n\n rawDb.run(\n `INSERT OR REPLACE INTO nodes\n (id, kind, name, qualified_name, file_path, language,\n start_line, end_line, start_column, end_column,\n is_exported, is_async, is_static, is_abstract, updated_at)\n VALUES (?, 'vulnerability', ?, ?, '', 'unknown', 0, 0, 0, 0, 0, 0, 0, 0, ?)`,\n [vulnNodeId, cveId, cveId, now],\n );\n\n rawDb.run(\n `INSERT OR REPLACE INTO sec_vulnerabilities\n (node_id, cve_id, severity_score, affected_ranges, fixed_version, summary, source_database)\n VALUES (?, ?, ?, '[]', ?, ?, 'manual')`,\n [vulnNodeId, cveId, severity ?? null, fixedVersion, summary],\n );\n\n // Create has_vulnerability edge\n rawDb.run(\n `INSERT OR IGNORE INTO edges (source, target, kind, confidence, confidence_score)\n VALUES (?, ?, 'has_vulnerability', 'extracted', 1.0)`,\n [depRow.node_id, vulnNodeId],\n );\n\n return `Registered ${cveId} against ${pkgName}.`;\n }\n\n case 'kirograph_vuln_suppress': {\n const projectRoot = cg.getProjectRoot();\n const cveId = args.cveId as string;\n if (!cveId) return 'Error: cveId is required.';\n\n const { SuppressionManager } = await Promise.resolve().then(() => require('../security/suppressions.js'));\n const manager = new SuppressionManager(projectRoot);\n manager.add(cveId, args.reason as string | undefined, args.expires as string | undefined);\n\n const reasonNote = args.reason ? ` Reason: ${args.reason}.` : '';\n const expiresNote = args.expires ? ` Expires: ${args.expires}.` : '';\n return `${cveId} suppressed.${reasonNote}${expiresNote}`;\n }\n\n case 'kirograph_sbom': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { SBOMExporter } = await Promise.resolve().then(() => require('../security/export/sbom.js'));\n const exporter = new SBOMExporter(db, projectRoot);\n const json = exporter.exportJSON();\n\n return truncate(json);\n }\n\n case 'kirograph_vex': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { VEXExporter } = await Promise.resolve().then(() => require('../security/export/vex.js'));\n const exporter = new VEXExporter(db, projectRoot);\n const json = exporter.exportJSON();\n\n return truncate(json);\n }\n\n case 'kirograph_reachability': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const target = args.target as string;\n if (!target) return 'Error: target is required (dependency name or CVE ID).';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n // Try to find target as a CVE ID in sec_vulnerabilities\n let vulnerabilityNodeId: string | null = null;\n let targetLabel = target;\n\n const vulnRow: { node_id: string } | undefined = rawDb.get(\n `SELECT node_id FROM sec_vulnerabilities WHERE cve_id = ?`,\n [target],\n );\n\n if (vulnRow) {\n vulnerabilityNodeId = vulnRow.node_id;\n } else {\n // Try to find target as a dependency name\n const depRow: { node_id: string; package_name: string } | undefined = rawDb.get(\n `SELECT node_id, package_name FROM sec_dependencies WHERE package_name = ?`,\n [target],\n );\n\n if (depRow) {\n targetLabel = depRow.package_name;\n // Find vulnerabilities linked to this dependency\n const vulnEdge: { target: string } | undefined = rawDb.get(\n `SELECT target FROM edges WHERE source = ? AND kind = 'has_vulnerability' LIMIT 1`,\n [depRow.node_id],\n );\n\n if (vulnEdge) {\n vulnerabilityNodeId = vulnEdge.target;\n } else {\n return `No vulnerabilities found for dependency \"${target}\". The dependency exists but has no known vulnerabilities.`;\n }\n } else {\n return `Target \"${target}\" not found. Provide a valid CVE ID or dependency package name.`;\n }\n }\n\n // Run reachability analysis\n const { ReachabilityAnalyzer } = await Promise.resolve().then(() => require('../security/reachability.js'));\n const analyzer = new ReachabilityAnalyzer(db, config);\n const result = await analyzer.analyze(vulnerabilityNodeId);\n\n const lines: string[] = [\n `# Reachability: ${targetLabel}`,\n '',\n `Verdict: ${result.verdict}`,\n `Reaching entry points: ${result.reachingEntryPointCount}`,\n ];\n\n if (result.paths.length > 0) {\n lines.push('', '## Paths');\n for (const p of result.paths.slice(0, 5)) {\n lines.push(`- From ${p.entryPoint}: ${p.path.join(' \u2192 ')}`);\n }\n if (result.paths.length > 5) {\n lines.push(` \u2026and ${result.paths.length - 5} more paths`);\n }\n }\n\n if (result.unresolvedSymbols.length > 0) {\n lines.push('', '## Unresolved Symbols');\n for (const sym of result.unresolvedSymbols.slice(0, 10)) {\n lines.push(`- ${sym}`);\n }\n if (result.unresolvedSymbols.length > 10) {\n lines.push(` \u2026and ${result.unresolvedSymbols.length - 10} more`);\n }\n }\n\n // Get impact summary if affected\n if (result.verdict === 'affected') {\n const impact = await analyzer.getImpactSummary(vulnerabilityNodeId);\n if (impact) {\n lines.push('', '## Impact Summary');\n if (impact.affectedLayers.length > 0) {\n lines.push(`Affected layers: ${impact.affectedLayers.join(', ')}`);\n }\n lines.push(`Affected entry points: ${impact.affectedEntryPoints.length}`);\n lines.push(`Distinct paths: ${impact.distinctPathCount}`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_staleness': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n const threshold = typeof args.threshold === 'number' ? args.threshold : 0.3;\n\n // Optionally refresh staleness data from registries\n if (args.refresh === true) {\n const { StalenessChecker } = await Promise.resolve().then(() => require('../security/staleness.js'));\n const checker = new StalenessChecker(db);\n await checker.checkAll();\n }\n\n const rows: Array<{\n package_name: string;\n ecosystem: string;\n resolved_version: string | null;\n declared_constraint: string;\n latest_version: string | null;\n latest_published: number | null;\n staleness_score: number | null;\n }> = rawDb.all(\n `SELECT package_name, ecosystem, resolved_version, declared_constraint,\n latest_version, latest_published, staleness_score\n FROM sec_dependencies\n WHERE staleness_score >= ?\n ORDER BY staleness_score DESC`,\n [threshold],\n );\n\n if (rows.length === 0) {\n return `No dependencies found with staleness_score >= ${threshold}.` +\n (args.refresh ? '' : ' Use refresh=true to fetch latest version data from registries.');\n }\n\n const lines: string[] = [`Stale Dependencies (threshold: ${threshold}):\\n`];\n for (const row of rows) {\n const resolved = row.resolved_version ?? row.declared_constraint ?? '?';\n const latest = row.latest_version ?? '?';\n const score = row.staleness_score ?? 0;\n const months = row.latest_published\n ? Math.round((Date.now() - row.latest_published) / (1000 * 60 * 60 * 24 * 30))\n : null;\n const bar = '\u2588'.repeat(Math.round(score * 10)) + '\u2591'.repeat(10 - Math.round(score * 10));\n const monthsStr = months !== null ? `, ${months}mo since latest` : '';\n lines.push(`${row.package_name} (${row.ecosystem}): ${resolved} \u2192 ${latest}${monthsStr}`);\n lines.push(` ${bar} ${score.toFixed(2)}`);\n }\n\n const totalCount: { count: number } = rawDb.get(`SELECT COUNT(*) as count FROM sec_dependencies`) ?? { count: 0 };\n lines.push('', `${rows.length} of ${totalCount.count} dependencies are stale (score >= ${threshold})`);\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_licenses': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n const deps: Array<{\n package_name: string;\n ecosystem: string;\n license: string | null;\n }> = rawDb.all(\n `SELECT package_name, ecosystem, license FROM sec_dependencies ORDER BY ecosystem, package_name`,\n );\n\n const { checkLicensePolicy } = await Promise.resolve().then(() => require('../security/license.js'));\n const policy = config.securityLicensePolicy;\n const violations = checkLicensePolicy(deps, policy);\n\n if (args.policy === true) {\n // Return only violations\n if (violations.length === 0) {\n return 'No license policy violations found.';\n }\n const lines: string[] = ['# License Policy Violations\\n'];\n for (const v of violations) {\n lines.push(`${v.severity.toUpperCase()} ${v.packageName} [${v.ecosystem}] ${v.license}`);\n }\n const denyCount = violations.filter(v => v.severity === 'deny').length;\n const warnCount = violations.filter(v => v.severity === 'warn').length;\n lines.push('');\n if (denyCount > 0) lines.push(`${denyCount} denied license${denyCount !== 1 ? 's' : ''}`);\n if (warnCount > 0) lines.push(`${warnCount} license warning${warnCount !== 1 ? 's' : ''}`);\n return truncate(lines.join('\\n'));\n }\n\n // Full listing\n if (deps.length === 0) {\n return 'No dependencies found. Run kirograph index first.';\n }\n\n const violationMap = new Map<string, 'deny' | 'warn'>();\n for (const v of violations) {\n violationMap.set(`${v.ecosystem}:${v.packageName}`, v.severity);\n }\n\n const lines: string[] = [`# License Report (${deps.length} dependencies)\\n`];\n\n // Violations first\n if (violations.length > 0) {\n lines.push('## Policy Violations\\n');\n for (const v of violations) {\n lines.push(`${v.severity.toUpperCase()} ${v.packageName} [${v.ecosystem}] ${v.license}`);\n }\n lines.push('');\n }\n\n lines.push('## All Dependencies\\n');\n lines.push('package | ecosystem | license | status');\n lines.push('------- | --------- | ------- | ------');\n\n for (const dep of deps) {\n const key = `${dep.ecosystem}:${dep.package_name}`;\n const violation = violationMap.get(key);\n const license = dep.license ?? '(unknown)';\n const status = violation ?? (dep.license ? 'ok' : 'unknown');\n lines.push(`${dep.package_name} | ${dep.ecosystem} | ${license} | ${status}`);\n }\n\n const denyCount = violations.filter(v => v.severity === 'deny').length;\n const warnCount = violations.filter(v => v.severity === 'warn').length;\n const unknownCount = deps.filter(d => !d.license).length;\n\n lines.push('');\n if (denyCount > 0) lines.push(`${denyCount} denied license${denyCount !== 1 ? 's' : ''}`);\n if (warnCount > 0) lines.push(`${warnCount} license warning${warnCount !== 1 ? 's' : ''}`);\n if (unknownCount > 0) lines.push(`${unknownCount} unknown license${unknownCount !== 1 ? 's' : ''}`);\n if (denyCount === 0 && warnCount === 0) lines.push('No policy violations');\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_attack_surface': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { AttackSurfaceAnalyzer } = await Promise.resolve().then(() => require('../security/attack-surface.js'));\n const analyzer = new AttackSurfaceAnalyzer(db);\n const result = await analyzer.analyze();\n\n if (result.totalRoutes === 0) {\n return 'No route nodes found in the graph. Ensure the project has been indexed with architecture analysis enabled.';\n }\n\n const limit = clampLimit(args.limit as number | undefined, 20);\n const routes = (args.publicOnly === true)\n ? result.criticalPaths.filter(r => r.exposureLevel === 'public')\n : result.criticalPaths;\n\n const lines: string[] = [\n '# Attack Surface',\n '',\n `Total routes: ${result.totalRoutes} Public: ${result.publicRoutes} Authenticated: ${result.authenticatedRoutes} Routes with vulns: ${result.routesWithVulns}`,\n '',\n ];\n\n const displayed = routes.slice(0, limit);\n if (displayed.length === 0) {\n lines.push(args.publicOnly === true\n ? 'No public routes with vulnerable dependencies found.'\n : 'No routes with vulnerable dependencies found.');\n } else {\n for (const entry of displayed) {\n const authTag = entry.isAuthenticated ? '[auth]' : '[public]';\n const riskTag = entry.riskScore > 0 ? ` risk=${entry.riskScore.toFixed(1)}` : '';\n lines.push(`${authTag} ${entry.route} (${entry.exposureLevel})${riskTag} ${entry.filePath}`);\n for (const dep of entry.vulnerableDeps.slice(0, 3)) {\n lines.push(` \u2514 ${dep.cveId} via ${dep.packageName} (${dep.hopCount} hop${dep.hopCount !== 1 ? 's' : ''}${dep.verdict ? `, ${dep.verdict}` : ''})`);\n }\n if (entry.vulnerableDeps.length > 3) {\n lines.push(` \u2514 \u2026and ${entry.vulnerableDeps.length - 3} more vulns`);\n }\n }\n if (routes.length > limit) {\n lines.push('', `\u2026and ${routes.length - limit} more routes (increase limit to see all)`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_secrets': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { SecretsScanner } = await Promise.resolve().then(() => require('../security/secrets.js'));\n const scanner = new SecretsScanner(db, projectRoot);\n const result = await scanner.scan({ includeTests: args.includeTests === true });\n\n if (result.totalFindings === 0) {\n return `No secrets found. Scanned ${result.filesScanned} file${result.filesScanned !== 1 ? 's' : ''}.`;\n }\n\n let findings = result.findings;\n if (args.severity) {\n findings = findings.filter(f => f.severity === (args.severity as string));\n }\n\n if (findings.length === 0) {\n return `No secrets found matching severity \"${args.severity}\". Total findings (all severities): ${result.totalFindings}.`;\n }\n\n const lines: string[] = [\n `# Secrets Scan (${result.filesScanned} files scanned)`,\n '',\n `Found: ${result.totalFindings} Critical: ${result.criticalCount} High: ${result.highCount}`,\n '',\n ];\n\n for (const f of findings) {\n lines.push(`${f.severity.toUpperCase()} ${f.type}`);\n lines.push(` ${f.filePath}:${f.line}:${f.column} snippet: ${f.snippet}`);\n if (f.nodeName) {\n lines.push(` in function: ${f.nodeName}`);\n }\n if (f.entryPointCount > 0) {\n lines.push(` reachable from ${f.entryPointCount} entry point${f.entryPointCount !== 1 ? 's' : ''}`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_security_flows': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { DataFlowAnalyzer } = await Promise.resolve().then(() => require('../security/data-flows.js'));\n const analyzer = new DataFlowAnalyzer(db);\n let findings = await analyzer.analyze();\n\n const typeFilter = (args.type as string | undefined) ?? 'all';\n const TYPE_MAP: Record<string, string> = {\n sql: 'sql-injection',\n eval: 'dangerous-eval',\n deserialize: 'unsafe-deserialize',\n path: 'path-traversal',\n crypto: 'hardcoded-crypto',\n };\n\n if (typeFilter !== 'all') {\n const mapped = TYPE_MAP[typeFilter];\n if (!mapped) return `Invalid type filter \"${typeFilter}\". Use: sql, eval, deserialize, path, crypto, all`;\n findings = findings.filter(f => f.type === mapped);\n }\n\n if (findings.length === 0) {\n return typeFilter === 'all'\n ? 'No dangerous data flows detected.'\n : `No \"${typeFilter}\" findings detected.`;\n }\n\n const lines: string[] = [\n `# Security Flows (${findings.length} finding${findings.length !== 1 ? 's' : ''})`,\n '',\n ];\n\n for (const f of findings) {\n lines.push(`${f.severity.toUpperCase()} [${f.owaspCategory}] ${f.type}`);\n lines.push(` ${f.filePath}:${f.line} symbol: ${f.symbol}`);\n lines.push(` ${f.description}`);\n lines.push(` Fix: ${f.recommendation}`);\n lines.push('');\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_supply_chain': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { SupplyChainChecker } = await Promise.resolve().then(() => require('../security/supply-chain.js'));\n const checker = new SupplyChainChecker(db);\n const { results, errors } = await checker.checkAll();\n\n const RISK_ORDER: Record<string, number> = { critical: 0, high: 1, medium: 2, low: 3, unknown: 4 };\n const thresholdArg = args.threshold as string | undefined;\n const thresholdOrder = thresholdArg ? (RISK_ORDER[thresholdArg] ?? 4) : 2; // default: medium and above\n\n const filtered = results\n .filter(r => (RISK_ORDER[r.riskLevel] ?? 4) <= thresholdOrder)\n .sort((a, b) => (RISK_ORDER[a.riskLevel] ?? 4) - (RISK_ORDER[b.riskLevel] ?? 4));\n\n if (filtered.length === 0) {\n return `No supply chain risks found at threshold \"${thresholdArg ?? 'medium'}\" or above. Checked ${results.length} dependencies.`;\n }\n\n const lines: string[] = [\n `# Supply Chain Health (${filtered.length} risks, threshold: ${thresholdArg ?? 'medium'})`,\n '',\n ];\n\n for (const r of filtered) {\n const scoreStr = r.scorecardScore !== null ? ` scorecard=${r.scorecardScore.toFixed(1)}/10` : '';\n const maintainerStr = r.maintainerCount !== null ? ` maintainers=${r.maintainerCount}` : '';\n lines.push(`${r.riskLevel.toUpperCase()} ${r.packageName} (${r.ecosystem})${scoreStr}${maintainerStr}`);\n for (const reason of r.riskReasons) {\n lines.push(` \u2022 ${reason}`);\n }\n }\n\n if (errors.length > 0) {\n lines.push('', `\u26A0 ${errors.length} package${errors.length !== 1 ? 's' : ''} could not be checked (network errors)`);\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_dep_confusion': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { DepConfusionChecker } = await Promise.resolve().then(() => require('../security/dep-confusion.js'));\n const checker = new DepConfusionChecker(db);\n const findings = await checker.check();\n\n if (findings.length === 0) {\n return 'No dependency confusion vulnerabilities detected.';\n }\n\n const RISK_ORDER: Record<string, number> = { critical: 0, high: 1, medium: 2 };\n const sorted = [...findings].sort((a, b) => (RISK_ORDER[a.riskLevel] ?? 3) - (RISK_ORDER[b.riskLevel] ?? 3));\n\n const lines: string[] = [\n `# Dependency Confusion (${findings.length} finding${findings.length !== 1 ? 's' : ''})`,\n '',\n ];\n\n for (const f of sorted) {\n lines.push(`${f.riskLevel.toUpperCase()} ${f.packageName} (${f.ecosystem})`);\n lines.push(` ${f.explanation}`);\n if (f.publicExists && f.publicVersion) {\n lines.push(` Public version: ${f.publicVersion}${f.publicPublishedAt ? ` published: ${f.publicPublishedAt}` : ''}`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_remediation': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { RemediationTracker } = await Promise.resolve().then(() => require('../security/remediation.js'));\n const tracker = new RemediationTracker(db);\n let statuses = tracker.getStatus();\n\n if (args.overdueOnly === true) {\n statuses = statuses.filter(s => s.isOverdue);\n }\n\n if (statuses.length === 0) {\n return args.overdueOnly === true\n ? 'No overdue vulnerabilities found.'\n : 'No open vulnerabilities with SLA tracking data found.';\n }\n\n // Sort: overdue first, then by slaStatus, then by severity desc\n const SLA_ORDER: Record<string, number> = { overdue: 0, warning: 1, no_fix: 2, ok: 3 };\n statuses.sort((a, b) => {\n const slaA = SLA_ORDER[a.slaStatus] ?? 3;\n const slaB = SLA_ORDER[b.slaStatus] ?? 3;\n if (slaA !== slaB) return slaA - slaB;\n return (b.severity ?? 0) - (a.severity ?? 0);\n });\n\n const overdueCount = statuses.filter(s => s.isOverdue).length;\n const warningCount = statuses.filter(s => s.slaStatus === 'warning').length;\n\n const lines: string[] = [\n `# Remediation SLA (${statuses.length} open${overdueCount > 0 ? `, ${overdueCount} overdue` : ''}${warningCount > 0 ? `, ${warningCount} warning` : ''})`,\n '',\n ];\n\n for (const s of statuses) {\n const severityLabel = s.severity == null ? 'UNKNOWN'\n : s.severity >= 9 ? 'CRITICAL'\n : s.severity >= 7 ? 'HIGH'\n : s.severity >= 4 ? 'MEDIUM'\n : 'LOW';\n\n const slaTag = s.slaStatus === 'overdue' ? '[OVERDUE]'\n : s.slaStatus === 'warning' ? '[WARNING]'\n : s.slaStatus === 'no_fix' ? '[NO_FIX]'\n : '[OK]';\n\n lines.push(`${slaTag} ${severityLabel} ${s.cveId} ${s.packageName}`);\n if (s.daysOpen !== null) lines.push(` Open for ${s.daysOpen} day${s.daysOpen !== 1 ? 's' : ''}`);\n if (s.daysWithFixAvailable !== null) lines.push(` Fix available for ${s.daysWithFixAvailable} day${s.daysWithFixAvailable !== 1 ? 's' : ''}`);\n if (s.slaDeadline !== null) {\n const deadlineDate = new Date(s.slaDeadline).toISOString().slice(0, 10);\n lines.push(` SLA deadline: ${deadlineDate}`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_live_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n\n if (!config.enablePatterns) {\n return 'kirograph_live_search requires enablePatterns: true in .kirograph/config.json';\n }\n\n const { PatternRunner } = await Promise.resolve().then(() => require('../patterns/runner.js'));\n const runner = new PatternRunner();\n\n if (!runner.isAvailable()) {\n return 'kirograph_live_search requires @ast-grep/napi. Run: npm install @ast-grep/napi';\n }\n\n const pattern = args.pattern as string;\n const language = args.language as string;\n const rawLimit = typeof args.limit === 'number' ? args.limit : 20;\n const limit = Math.max(1, Math.min(100, Math.round(rawLimit)));\n\n const db = cg.getDatabase();\n const rawDb = db.getRawDb();\n\n const files: Array<{ path: string }> = rawDb.all(\n 'SELECT path FROM files WHERE language = ? LIMIT 5000',\n [language],\n );\n\n const results: Array<{ filePath: string; line: number; matchText: string }> = [];\n let truncated = false;\n\n for (const file of files) {\n if (results.length >= limit) { truncated = true; break; }\n\n let content: string;\n try {\n const fullPath = path.isAbsolute(file.path) ? file.path : path.join(projectRoot, file.path);\n content = fs.readFileSync(fullPath, 'utf8');\n } catch {\n continue;\n }\n\n const matches = await runner.runInline(pattern, language, content);\n for (const m of matches) {\n if (results.length >= limit) { truncated = true; break; }\n results.push({ filePath: file.path, line: m.line, matchText: m.matchText });\n }\n }\n\n if (results.length === 0) {\n return `0 matches for '${pattern}' in ${language} files`;\n }\n\n const lines: string[] = [\n `${results.length} match${results.length !== 1 ? 'es' : ''} for '${pattern}' in ${language} files`,\n '',\n ];\n\n for (const r of results) {\n lines.push(` ${r.filePath}:${r.line}`);\n lines.push(` ${r.matchText}`);\n lines.push('');\n }\n\n if (truncated) {\n lines.push(`[truncated \u2014 showing first ${limit} results; refine your pattern or use --lang to narrow scope]`);\n }\n\n return truncate(lines.join('\\n'));\n }\n\n // \u2500\u2500 Pattern tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_pattern_coverage': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!(config as any).enablePatterns) {\n return 'Pattern analysis is not enabled. Set enablePatterns: true in .kirograph/config.json and run kirograph index.';\n }\n\n // Load all pattern rules to enumerate coverage\n const { PatternLibraryLoader } = await Promise.resolve().then(() => require('../patterns/loader.js'));\n const loader = new PatternLibraryLoader();\n const builtinPath = path.join(__dirname, '../patterns/library');\n const customPath = (config as any).patternLibraryPath as string | undefined;\n let rules: import('../patterns/types').PatternRule[] = [];\n try {\n rules = loader.load(builtinPath, customPath);\n } catch { /* no rules \u2014 continue */ }\n\n // Group rules by owaspCategory prefix (A01\u2013A10)\n const rulesByCategory = new Map<string, import('../patterns/types').PatternRule[]>();\n for (const rule of rules) {\n const prefix = rule.owaspCategory.match(/^(A\\d{2})/)?.[1] ?? rule.owaspCategory;\n if (!rulesByCategory.has(prefix)) rulesByCategory.set(prefix, []);\n rulesByCategory.get(prefix)!.push(rule);\n }\n\n // Query match counts from DB if table exists\n const db = cg.getDatabase();\n db.applyPatternsSchema();\n const rawDb = db.getRawDb();\n const matchCountsByCategory = new Map<string, number>();\n try {\n const tableExists = rawDb.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (tableExists) {\n const rows: Array<{ owasp_category: string; cnt: number }> = rawDb.all(\n 'SELECT owasp_category, COUNT(*) as cnt FROM pattern_matches GROUP BY owasp_category'\n );\n for (const row of rows) {\n const prefix = row.owasp_category.match(/^(A\\d{2})/)?.[1] ?? row.owasp_category;\n matchCountsByCategory.set(prefix, (matchCountsByCategory.get(prefix) ?? 0) + row.cnt);\n }\n }\n } catch { /* non-critical */ }\n\n // All OWASP Top 10 categories\n const owaspTop10 = [\n 'A01', 'A02', 'A03', 'A04', 'A05',\n 'A06', 'A07', 'A08', 'A09', 'A10',\n ];\n const owaspNames: Record<string, string> = {\n A01: 'Broken Access Control',\n A02: 'Cryptographic Failures',\n A03: 'Injection',\n A04: 'Insecure Design',\n A05: 'Security Misconfiguration',\n A06: 'Vulnerable and Outdated Components',\n A07: 'Identification and Authentication Failures',\n A08: 'Software and Data Integrity Failures',\n A09: 'Security Logging and Monitoring Failures',\n A10: 'Server-Side Request Forgery',\n };\n\n const covered: string[] = [];\n const uncovered: string[] = [];\n\n const lines: string[] = [\n '# OWASP Top 10 Pattern Coverage',\n '',\n `Total rules loaded: ${rules.length}`,\n '',\n 'Category | Rules | Matches',\n '-------- | ----- | -------',\n ];\n\n for (const cat of owaspTop10) {\n const catRules = rulesByCategory.get(cat) ?? [];\n const matchCount = matchCountsByCategory.get(cat) ?? 0;\n const label = `${cat}: ${owaspNames[cat] ?? cat}`;\n if (catRules.length > 0) {\n covered.push(label);\n lines.push(`${label} | ${catRules.length} | ${matchCount}`);\n } else {\n uncovered.push(label);\n }\n }\n\n // Extra categories not in top 10\n for (const [cat, catRules] of rulesByCategory.entries()) {\n if (!owaspTop10.includes(cat)) {\n const matchCount = matchCountsByCategory.get(cat) ?? 0;\n lines.push(`${cat} | ${catRules.length} | ${matchCount}`);\n }\n }\n\n if (uncovered.length > 0) {\n lines.push('', `Uncovered categories (${uncovered.length}):`, ...uncovered.map(c => ` - ${c}`));\n }\n\n lines.push('', `Coverage: ${covered.length} / ${owaspTop10.length} OWASP Top 10 categories`);\n\n return lines.join('\\n');\n }\n\n case 'kirograph_pattern_save_baseline': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!(config as any).enablePatterns) {\n return 'Pattern analysis is not enabled. Set enablePatterns: true in .kirograph/config.json and run kirograph index.';\n }\n\n const label = (args.label as string) ?? 'default';\n\n const db = cg.getDatabase();\n db.applyPatternsSchema();\n const rawDb = db.getRawDb();\n\n const tableExists = rawDb.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (!tableExists) {\n return 'No pattern_matches table found. Run kirograph index first to populate pattern data.';\n }\n\n const rows: Array<{ pattern_id: string; cnt: number }> = rawDb.all(\n 'SELECT pattern_id, COUNT(*) as cnt FROM pattern_matches GROUP BY pattern_id'\n );\n\n const baseline: Record<string, number> = {};\n for (const row of rows) {\n baseline[row.pattern_id] = row.cnt;\n }\n\n const kirographDir = path.join(projectRoot, '.kirograph');\n if (!fs.existsSync(kirographDir)) fs.mkdirSync(kirographDir, { recursive: true });\n\n const baselinePath = path.join(kirographDir, `pattern-baseline-${label}.json`);\n fs.writeFileSync(baselinePath, JSON.stringify({ label, savedAt: Date.now(), counts: baseline }, null, 2));\n\n const totalMatches = Object.values(baseline).reduce((s, c) => s + c, 0);\n return `Baseline \"${label}\" saved: ${Object.keys(baseline).length} patterns, ${totalMatches} total matches \u2192 ${baselinePath}`;\n }\n\n case 'kirograph_pattern_diff': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!(config as any).enablePatterns) {\n return 'Pattern analysis is not enabled. Set enablePatterns: true in .kirograph/config.json and run kirograph index.';\n }\n\n const label = (args.label as string) ?? 'default';\n const baselinePath = path.join(projectRoot, '.kirograph', `pattern-baseline-${label}.json`);\n\n if (!fs.existsSync(baselinePath)) {\n return `Baseline \"${label}\" not found. Run kirograph_pattern_save_baseline first.`;\n }\n\n let baseline: { label: string; savedAt: number; counts: Record<string, number> };\n try {\n baseline = JSON.parse(fs.readFileSync(baselinePath, 'utf8'));\n } catch {\n return `Failed to read baseline file: ${baselinePath}`;\n }\n\n const db = cg.getDatabase();\n db.applyPatternsSchema();\n const rawDb = db.getRawDb();\n\n const tableExists = rawDb.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n const currentCounts: Record<string, number> = {};\n if (tableExists) {\n const rows: Array<{ pattern_id: string; cnt: number }> = rawDb.all(\n 'SELECT pattern_id, COUNT(*) as cnt FROM pattern_matches GROUP BY pattern_id'\n );\n for (const row of rows) {\n currentCounts[row.pattern_id] = row.cnt;\n }\n }\n\n const allPatternIds = new Set([...Object.keys(baseline.counts), ...Object.keys(currentCounts)]);\n\n const newFindings: Array<{ id: string; count: number }> = [];\n const resolvedFindings: Array<{ id: string; count: number }> = [];\n const unchanged: Array<{ id: string; count: number }> = [];\n const changed: Array<{ id: string; before: number; after: number; delta: number }> = [];\n\n for (const id of allPatternIds) {\n const before = baseline.counts[id] ?? 0;\n const after = currentCounts[id] ?? 0;\n if (before === 0 && after > 0) {\n newFindings.push({ id, count: after });\n } else if (before > 0 && after === 0) {\n resolvedFindings.push({ id, count: before });\n } else if (before === after) {\n unchanged.push({ id, count: after });\n } else {\n changed.push({ id, before, after, delta: after - before });\n }\n }\n\n const savedDate = new Date(baseline.savedAt).toISOString().slice(0, 16).replace('T', ' ');\n const lines: string[] = [\n `# Pattern Diff: \"${label}\" (saved ${savedDate}) \u2192 current`,\n '',\n `NEW: ${newFindings.length} RESOLVED: ${resolvedFindings.length} CHANGED: ${changed.length} UNCHANGED: ${unchanged.length}`,\n ];\n\n if (newFindings.length > 0) {\n lines.push('', '## New Findings (not in baseline)');\n for (const f of newFindings.sort((a, b) => b.count - a.count)) {\n lines.push(` + ${f.id}: ${f.count} matches`);\n }\n }\n\n if (resolvedFindings.length > 0) {\n lines.push('', '## Resolved (in baseline, not in current)');\n for (const f of resolvedFindings.sort((a, b) => b.count - a.count)) {\n lines.push(` - ${f.id}: was ${f.count} matches`);\n }\n }\n\n if (changed.length > 0) {\n lines.push('', '## Changed');\n for (const f of changed.sort((a, b) => Math.abs(b.delta) - Math.abs(a.delta))) {\n const sign = f.delta > 0 ? '+' : '';\n lines.push(` ~ ${f.id}: ${f.before} \u2192 ${f.after} (${sign}${f.delta})`);\n }\n }\n\n return lines.join('\\n');\n }\n\n // \u2500\u2500 Wiki tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_wiki_ingest': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph', {\n autoResolveConflicts: (config as any).wikiAutoResolveConflicts ?? false,\n });\n wiki.initialize();\n\n const source = args.source as string ?? '';\n const sourceName = args.sourceName as string ?? 'source';\n if (!source) return 'source is required';\n\n if (config.wikiSynthesisMode === 'local') {\n wiki.queueSource(source, sourceName);\n const count = wiki.getQueueCount();\n return `Source \"${sourceName}\" queued for local wiki synthesis (${count} in queue). The agentStop hook will run \"kirograph wiki synthesize\" automatically.`;\n }\n\n const prompt = wiki.getIngestPrompt(source, sourceName);\n return `WIKI_INGEST_PROMPT\\n${prompt}\\n\\nProduce WIKI_DIFF blocks following SCHEMA.md, then call kirograph_wiki_apply_diff with the diff string.`;\n }\n\n case 'kirograph_wiki_apply_diff': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph', {\n autoResolveConflicts: (config as any).wikiAutoResolveConflicts ?? false,\n });\n wiki.initialize();\n\n const diff = args.diff as string ?? '';\n if (!diff) return 'diff is required';\n\n const result = wiki.applyDiff(diff);\n const lines: string[] = ['\u2713 Wiki diff applied'];\n if (result.created.length) lines.push(` Created: ${result.created.join(', ')}`);\n if (result.updated.length) lines.push(` Updated: ${result.updated.join(', ')}`);\n if (result.conflictsResolved.length) lines.push(` Conflicts auto-resolved: ${result.conflictsResolved.join(', ')}`);\n if (result.conflictsPending.length) {\n lines.push(` \u26A1 Conflicts pending (${result.conflictsPending.length}):`);\n for (const c of result.conflictsPending) {\n lines.push(` ${c.page} \u00A7${c.section}: \"${c.existing}\" vs \"${c.incoming}\" (source: ${c.source})`);\n }\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_wiki_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph');\n wiki.initialize();\n\n const query = args.query as string ?? '';\n if (!query) return 'query is required';\n const limit = Math.min(Number(args.limit ?? 5), 20);\n\n const results = wiki.search(query, limit);\n if (results.length === 0) return `No wiki pages found for \"${query}\".`;\n\n const lines = [`Wiki Search: ${query}`, ''];\n for (const { page, score } of results) {\n lines.push(`[${page.slug}] ${page.title} (score: ${score.toFixed(3)})`);\n // Show first non-heading line as preview\n const preview = page.content.split('\\n').find(l => l.trim() && !l.startsWith('#'));\n if (preview) lines.push(` ${preview.trim().slice(0, 120)}`);\n lines.push('');\n }\n return lines.join('\\n').trim();\n }\n\n case 'kirograph_wiki_page': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph');\n wiki.initialize();\n\n const slug = args.slug as string ?? '';\n if (!slug) return 'slug is required';\n\n const page = wiki.getPage(slug);\n if (!page) return `Wiki page \"${slug}\" not found. Use kirograph_wiki_list to see available pages.`;\n\n return page.content;\n }\n\n case 'kirograph_wiki_lint': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph');\n wiki.initialize();\n\n const issues = wiki.lint();\n if (issues.length === 0) return '\u2713 Wiki lint passed \u2014 no issues found.';\n\n const lines = [`Wiki Lint \u2014 ${issues.length} issue(s)`, ''];\n for (const issue of issues) {\n const icon = issue.kind === 'contradiction' ? '\u26A1' : issue.kind === 'orphan' ? '\u25CB' : issue.kind === 'broken_link' ? '\uD83D\uDD17' : '\u26A0';\n lines.push(`${icon} [${issue.kind}] ${issue.slug}`);\n lines.push(` ${issue.detail}`);\n lines.push('');\n }\n return lines.join('\\n').trim();\n }\n\n case 'kirograph_wiki_list': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph');\n wiki.initialize();\n\n const pages = wiki.listPages();\n if (pages.length === 0) return 'Wiki is empty. Use kirograph_wiki_ingest to add pages.';\n\n const stats = wiki.getStats();\n const lines = [\n `Wiki \u2014 ${stats.pageCount} page(s), ${stats.totalSources} total sources`,\n '',\n ];\n for (const page of pages) {\n const date = new Date(page.updatedAt).toISOString().slice(0, 10);\n lines.push(` ${page.slug.padEnd(32)} ${page.title} (${page.sourceCount} src, ${date})`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_wiki_synthesize': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n if (config.wikiSynthesisMode !== 'local') return 'wikiSynthesisMode is not \"local\". This tool is for local-model synthesis only.';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph', {\n autoResolveConflicts: (config as any).wikiAutoResolveConflicts ?? false,\n });\n wiki.initialize();\n\n const queueCount = wiki.getQueueCount();\n if (queueCount === 0) return 'Wiki queue is empty \u2014 nothing to synthesize.';\n\n const result = await wiki.synthesize(config.wikiLocalModel, true);\n const synthLines = [`Wiki synthesis complete \u2014 processed ${result.processed} source(s).`];\n if (result.created.length) synthLines.push(`Created: ${result.created.join(', ')}`);\n if (result.updated.length) synthLines.push(`Updated: ${result.updated.join(', ')}`);\n if (result.errors.length) synthLines.push(`Errors: ${result.errors.join('; ')}`);\n return synthLines.join('\\n');\n }\n\n case 'kirograph_wiki_init': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph', {\n autoResolveConflicts: (config as any).wikiAutoResolveConflicts ?? false,\n });\n wiki.initWiki();\n return 'Wiki initialized. SCHEMA.md and MANIFEST.md created in .kirograph/wiki/.';\n }\n\n case 'kirograph_wiki_reindex': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph');\n wiki.initialize();\n\n const count = wiki.reindex();\n return `Reindexed ${count} wiki page(s) from .kirograph/wiki/*.md.`;\n }\n\n case 'kirograph_wiki_status': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph');\n wiki.initialize();\n\n const stats = wiki.getStats();\n const oldest = stats.oldestPage ? new Date(stats.oldestPage).toISOString().slice(0, 10) : 'n/a';\n const newest = stats.newestPage ? new Date(stats.newestPage).toISOString().slice(0, 10) : 'n/a';\n return [\n 'Wiki Status:',\n ` Pages: ${stats.pageCount}`,\n ` Total sources: ${stats.totalSources}`,\n ` Oldest page: ${oldest}`,\n ` Newest page: ${newest}`,\n ` Wiki dir: .kirograph/wiki/`,\n ].join('\\n');\n }\n\n default:\n return `Unknown tool: ${toolName}`;\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["KiroGraph", "estimateTokens", "cg", "result", "compress", "renderTree", "flattenTree", "groupTree", "lines", "compactTree", "denyCount", "warnCount"]
|
|
7
7
|
}
|