kirograph 0.28.1 → 1.1.1
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 +3 -2
- package/dist/architecture/index.js +4 -1
- package/dist/architecture/index.js.map +2 -2
- package/dist/architecture/manifest/index.js +13 -2
- package/dist/architecture/manifest/index.js.map +2 -2
- package/dist/architecture/manifest/python.js +2 -2
- package/dist/architecture/manifest/python.js.map +2 -2
- package/dist/bin/commands/help.js +3 -1
- package/dist/bin/commands/help.js.map +2 -2
- package/dist/bin/commands/install.js +2 -1
- package/dist/bin/commands/install.js.map +2 -2
- package/dist/bin/commands/memory.js +18 -8
- package/dist/bin/commands/memory.js.map +2 -2
- package/dist/bin/commands/reachability.js +7 -2
- package/dist/bin/commands/reachability.js.map +2 -2
- package/dist/bin/commands/status.js +2 -1
- package/dist/bin/commands/status.js.map +2 -2
- package/dist/bin/commands/uninit.js +2 -1
- package/dist/bin/commands/uninit.js.map +2 -2
- package/dist/bin/commands/vulns.js +26 -6
- package/dist/bin/commands/vulns.js.map +2 -2
- package/dist/bin/commands/wiki.js +56 -0
- package/dist/bin/commands/wiki.js.map +2 -2
- package/dist/bin/installer/common.js +7 -1
- package/dist/bin/installer/common.js.map +2 -2
- package/dist/bin/installer/detect.js +10 -0
- package/dist/bin/installer/detect.js.map +2 -2
- package/dist/bin/installer/hooks.js +13 -8
- package/dist/bin/installer/hooks.js.map +2 -2
- package/dist/bin/installer/steering.js +9 -0
- package/dist/bin/installer/steering.js.map +2 -2
- package/dist/bin/installer/targets/antigravity.js +1 -1
- package/dist/bin/installer/targets/antigravity.js.map +2 -2
- package/dist/bin/installer/targets/claude.js +1 -1
- package/dist/bin/installer/targets/claude.js.map +2 -2
- package/dist/bin/installer/targets/codex.js +1 -1
- package/dist/bin/installer/targets/codex.js.map +2 -2
- package/dist/bin/installer/targets/commandcode.js +84 -0
- package/dist/bin/installer/targets/commandcode.js.map +7 -0
- package/dist/bin/installer/targets/copilot.js +1 -1
- package/dist/bin/installer/targets/copilot.js.map +2 -2
- package/dist/bin/installer/targets/cursor.js +2 -2
- package/dist/bin/installer/targets/cursor.js.map +2 -2
- package/dist/bin/installer/targets/devin.js +1 -1
- package/dist/bin/installer/targets/devin.js.map +2 -2
- package/dist/bin/installer/targets/gemini-cli.js +1 -1
- package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
- package/dist/bin/installer/targets/index.js +10 -0
- package/dist/bin/installer/targets/index.js.map +2 -2
- package/dist/bin/installer/targets/opencode.js +1 -1
- package/dist/bin/installer/targets/opencode.js.map +2 -2
- package/dist/bin/installer/targets/windsurf.js +1 -1
- package/dist/bin/installer/targets/windsurf.js.map +2 -2
- package/dist/bin/kirograph.js +1 -1
- package/dist/bin/kirograph.js.map +1 -1
- package/dist/config.js +25 -1
- package/dist/config.js.map +2 -2
- package/dist/core/pipeline.js +18 -6
- package/dist/core/pipeline.js.map +2 -2
- package/dist/extraction/extractor.js +88 -26
- package/dist/extraction/extractor.js.map +2 -2
- package/dist/extraction/grammars.js +38 -3
- package/dist/extraction/grammars.js.map +2 -2
- package/dist/extraction/notebook.js +15 -7
- package/dist/extraction/notebook.js.map +2 -2
- package/dist/extraction/wasm/tree-sitter-bash.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-c.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-c_sharp.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cpp.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-csharp.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-css.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-dart.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-elisp.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-elixir.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-elm.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-embedded_template.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-embeddedtemplate.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-go.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-html.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-java.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-javascript.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-json.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-kotlin.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-lua.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-objc.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-ocaml.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-php.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-python.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-ql.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-rescript.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-ruby.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-rust.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-scala.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-solidity.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-swift.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-systemrdl.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-tlaplus.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-toml.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-tsx.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-typescript.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-vue.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-yaml.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-zig.wasm +0 -0
- package/dist/frameworks/index.js +68 -7
- package/dist/frameworks/index.js.map +2 -2
- package/dist/jev/client.js +99 -0
- package/dist/jev/client.js.map +7 -0
- package/dist/jev/types.js +17 -0
- package/dist/jev/types.js.map +7 -0
- package/dist/mcp/handlers/memory.js +14 -8
- package/dist/mcp/handlers/memory.js.map +2 -2
- package/dist/mcp/handlers/security.js +5 -3
- package/dist/mcp/handlers/security.js.map +2 -2
- package/dist/mcp/tools.js +1 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/memory/index.js +13 -1
- package/dist/memory/index.js.map +3 -3
- package/dist/memory/relation-jev.js +59 -0
- package/dist/memory/relation-jev.js.map +7 -0
- package/dist/memory/schema.js +57 -0
- package/dist/memory/schema.js.map +7 -0
- package/dist/security/auth-detection-jev.js +47 -0
- package/dist/security/auth-detection-jev.js.map +7 -0
- package/dist/security/manifest/adapter.js +34 -5
- package/dist/security/manifest/adapter.js.map +3 -3
- package/dist/security/manifest/parser.js +2 -2
- package/dist/security/manifest/parser.js.map +2 -2
- package/dist/security/manifest/plugins/cargo.js +23 -0
- package/dist/security/manifest/plugins/cargo.js.map +2 -2
- package/dist/security/manifest/plugins/composer.js +12 -0
- package/dist/security/manifest/plugins/composer.js.map +2 -2
- package/dist/security/manifest/plugins/gradle.js +12 -0
- package/dist/security/manifest/plugins/gradle.js.map +2 -2
- package/dist/security/manifest/plugins/hex.js +12 -0
- package/dist/security/manifest/plugins/hex.js.map +2 -2
- package/dist/security/manifest/plugins/maven.js +68 -1
- package/dist/security/manifest/plugins/maven.js.map +2 -2
- package/dist/security/manifest/plugins/npm.js +86 -0
- package/dist/security/manifest/plugins/npm.js.map +2 -2
- package/dist/security/manifest/plugins/nuget.js +13 -0
- package/dist/security/manifest/plugins/nuget.js.map +2 -2
- package/dist/security/manifest/plugins/pubspec.js +12 -0
- package/dist/security/manifest/plugins/pubspec.js.map +2 -2
- package/dist/security/manifest/plugins/pyproject.js +12 -0
- package/dist/security/manifest/plugins/pyproject.js.map +2 -2
- package/dist/security/manifest/plugins/rubygems.js +12 -0
- package/dist/security/manifest/plugins/rubygems.js.map +2 -2
- package/dist/security/pipeline.js +5 -2
- package/dist/security/pipeline.js.map +2 -2
- package/dist/security/reachability.js +115 -50
- package/dist/security/reachability.js.map +2 -2
- package/dist/security/types.js.map +1 -1
- package/dist/security/vuln/client.js +45 -1
- package/dist/security/vuln/client.js.map +2 -2
- package/dist/security/vuln/epss-client.js +1 -1
- package/dist/security/vuln/epss-client.js.map +1 -1
- package/dist/security/vuln/osv-adapter.js +144 -32
- package/dist/security/vuln/osv-adapter.js.map +2 -2
- package/dist/sync/index.js +9 -2
- package/dist/sync/index.js.map +2 -2
- package/dist/vectors/libsql-index.js +287 -0
- package/dist/vectors/libsql-index.js.map +7 -0
- package/dist/vectors/turso-index.js +307 -0
- package/dist/vectors/turso-index.js.map +7 -0
- package/dist/wiki/contradiction-jev.js +49 -0
- package/dist/wiki/contradiction-jev.js.map +7 -0
- package/dist/wiki/index.js +13 -0
- package/dist/wiki/index.js.map +2 -2
- package/dist/wiki/ingest.js +2 -0
- package/dist/wiki/ingest.js.map +2 -2
- package/dist/wiki/links.js +53 -0
- package/dist/wiki/links.js.map +7 -0
- package/dist/wiki/lint.js +3 -6
- package/dist/wiki/lint.js.map +2 -2
- package/dist/wiki/rename.js +103 -0
- package/dist/wiki/rename.js.map +7 -0
- package/package.json +3 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/mcp/handlers/memory.ts"],
|
|
4
|
-
"sourcesContent": ["import KiroGraph from '../../index';\nimport { clampLimit, formatAge } from './utils';\n\nexport async function handleMemory(toolName: string, args: Record<string, unknown>, cg: KiroGraph): Promise<string> {\n switch (toolName) {\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 if (!args.observationA || !args.observationB || !args.relation) {\n return 'Error: observationA, observationB, and relation are required.';\n }\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 default:\n return `Unknown tool: ${toolName}`;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import KiroGraph from '../../index';\nimport { clampLimit, formatAge } from './utils';\n\nexport async function handleMemory(toolName: string, args: Record<string, unknown>, cg: KiroGraph): Promise<string> {\n switch (toolName) {\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, MemorySchemaError } = 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 let id;\n try {\n 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 } catch (err) {\n if (err instanceof MemorySchemaError) return `Rejected: ${err.message}`;\n throw err;\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 if (!args.observationA || !args.observationB || !args.relation) {\n return 'Error: observationA, observationB, and relation are required.';\n }\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 default:\n return `Unknown tool: ${toolName}`;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -114,7 +114,7 @@ async function handleSecurity(toolName, args, cg) {
|
|
|
114
114
|
if (dbName.toUpperCase() === "OSV") return new OsvAdapter();
|
|
115
115
|
return null;
|
|
116
116
|
}).filter(Boolean);
|
|
117
|
-
const client = new VulnerabilityDatabaseClient(adapters, db);
|
|
117
|
+
const client = new VulnerabilityDatabaseClient(adapters, db, void 0, projectRoot);
|
|
118
118
|
await client.enrichAll();
|
|
119
119
|
}
|
|
120
120
|
let query = `
|
|
@@ -319,14 +319,16 @@ async function handleSecurity(toolName, args, cg) {
|
|
|
319
319
|
return `Target "${target}" not found. Provide a valid CVE ID or dependency package name.`;
|
|
320
320
|
}
|
|
321
321
|
}
|
|
322
|
-
const { ReachabilityAnalyzer } = await Promise.resolve().then(() => require("../../security/reachability.js"));
|
|
322
|
+
const { ReachabilityAnalyzer, explainReachability } = await Promise.resolve().then(() => require("../../security/reachability.js"));
|
|
323
323
|
const analyzer = new ReachabilityAnalyzer(db, config);
|
|
324
324
|
const result = await analyzer.analyze(vulnerabilityNodeId);
|
|
325
325
|
const lines = [
|
|
326
326
|
`# Reachability: ${targetLabel}`,
|
|
327
327
|
"",
|
|
328
328
|
`Verdict: ${result.verdict}`,
|
|
329
|
-
`Reaching entry points: ${result.reachingEntryPointCount}
|
|
329
|
+
`Reaching entry points: ${result.reachingEntryPointCount}`,
|
|
330
|
+
"",
|
|
331
|
+
`Why: ${explainReachability(result)}`
|
|
330
332
|
];
|
|
331
333
|
if (result.paths.length > 0) {
|
|
332
334
|
lines.push("", "## Paths");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/mcp/handlers/security.ts"],
|
|
4
|
-
"sourcesContent": ["import KiroGraph from '../../index';\nimport { clampLimit, truncate } from './utils';\n\nexport async function handleSecurity(toolName: string, args: Record<string, unknown>, cg: KiroGraph): Promise<string> {\n switch (toolName) {\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 default:\n return `Unknown tool: ${toolName}`;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import KiroGraph from '../../index';\nimport { clampLimit, truncate } from './utils';\n\nexport async function handleSecurity(toolName: string, args: Record<string, unknown>, cg: KiroGraph): Promise<string> {\n switch (toolName) {\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, undefined, projectRoot);\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, explainReachability } = 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 `Why: ${explainReachability(result)}`,\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 default:\n return `Unknown tool: ${toolName}`;\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAqC;AAErC,eAAsB,eAAe,UAAkB,MAA+B,IAAgC;AACpH,UAAQ,UAAU;AAAA,IAChB,KAAK,sBAAsB;AACzB,YAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,YAAM,cAAc,GAAG,eAAe;AACtC,YAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,UAAI,CAAC,OAAO,eAAgB,QAAO;AACnC,UAAI,CAAC,OAAO,mBAAoB,QAAO;AAEvC,YAAM,KAAK,GAAG,YAAY;AAC1B,SAAG,oBAAoB;AACvB,YAAM,QAAQ,GAAG,SAAS;AAE1B,YAAM,WAA8B,MAAM;AAAA,QACxC;AAAA,MACF,KAAK,EAAE,OAAO,EAAE;AAEhB,YAAM,YAA+B,MAAM;AAAA,QACzC;AAAA,MACF,KAAK,EAAE,OAAO,EAAE;AAEhB,YAAM,cAAyD,MAAM;AAAA,QACnE;AAAA,MACF;AACA,YAAM,WAAmC,CAAC;AAC1C,iBAAW,OAAO,aAAa;AAC7B,iBAAS,IAAI,OAAO,IAAI,IAAI;AAAA,MAC9B;AAEA,YAAM,aAAgC,MAAM;AAAA,QAC1C;AAAA,MACF,KAAK,EAAE,OAAO,EAAE;AAGhB,YAAM,EAAE,oBAAoB,sBAAsB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gCAAgC,CAAC;AAClI,YAAM,kBAAkB,IAAI,sBAAsB,WAAW;AAC7D,YAAM,YAAuC,MAAM,IAAI,wCAAwC;AAC/F,YAAM,qBAAqB,UAAU,OAAO,OAAK,gBAAgB,aAAa,EAAE,MAAM,CAAC,EAAE;AACzF,YAAM,mBAAmB,UAAU,QAAQ;AAE3C,YAAM,QAAkB;AAAA,QACtB;AAAA,QACA;AAAA,QACA,iBAAiB,SAAS,KAAK;AAAA,QAC/B,oBAAoB,gBAAgB,GAAG,qBAAqB,IAAI,KAAK,kBAAkB,iBAAiB,EAAE;AAAA,MAC5G;AAEA,UAAI,mBAAmB,GAAG;AACxB,cAAM,WAAW,SAAS,UAAU,KAAK;AACzC,cAAM,cAAc,SAAS,cAAc,KAAK;AAChD,cAAM,qBAAqB,SAAS,qBAAqB,KAAK;AAC9D,cAAM,UAAU,mBAAmB,WAAW,cAAc;AAE5D,cAAM,KAAK,IAAI,4BAA4B,EAAE;AAC7C,YAAI,WAAW,EAAG,OAAM,KAAK,oBAAe,QAAQ,EAAE;AACtD,YAAI,cAAc,EAAG,OAAM,KAAK,wBAAmB,WAAW,EAAE;AAChE,YAAI,qBAAqB,EAAG,OAAM,KAAK,+BAA0B,kBAAkB,EAAE;AACrF,YAAI,UAAU,EAAG,OAAM,KAAK,4BAAuB,OAAO,EAAE;AAAA,MAC9D;AAEA,UAAI,WAAW,QAAQ,GAAG;AACxB,cAAM,KAAK,IAAI,UAAK,WAAW,KAAK,aAAa,WAAW,UAAU,IAAI,UAAU,UAAU,6EAA6E;AAAA,MAC7K;AAGA,YAAM,gBAAiB,MAAM;AAAA,QAC3B;AAAA,MACF,GAA6C;AAC7C,UAAI,iBAAiB,MAAM;AACzB,cAAM,QAAQ,KAAK,IAAI,IAAI;AAC3B,cAAM,UAAU,SAAS,MAAO,KAAK,KAAK;AAC1C,cAAM,SAAS,OAAO,4BAA4B;AAClD,YAAI,UAAU,QAAQ;AACpB,gBAAM,KAAK,IAAI,gCAA2B,KAAK,MAAM,OAAO,CAAC,mBAAmB,MAAM,6CAA6C;AAAA,QACrI;AAAA,MACF;AAGA,UAAI;AACF,cAAM,WAAW,GAAG,SAAS;AAC7B,cAAM,iBAAiB,SAAS,IAAI,8EAA8E;AAClH,YAAI,gBAAgB;AAClB,gBAAM,eAAe,SAAS,IAAI,6CAA6C,GAAG,OAAO;AACzF,cAAI,eAAe,GAAG;AACpB,kBAAM,YAAY,SAAS,IAAI,yEAAyE,GAAG,OAAO;AAClH,kBAAM,KAAK,kBAAkB,YAAY,qBAAqB,SAAS,YAAY;AAAA,UACrF;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAAqB;AAE7B,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB;AAAA,IAEA,KAAK,mBAAmB;AACtB,YAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,YAAM,cAAc,GAAG,eAAe;AACtC,YAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,UAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,YAAM,KAAK,GAAG,YAAY;AAC1B,SAAG,oBAAoB;AACvB,YAAM,QAAQ,GAAG,SAAS;AAG1B,UAAI,KAAK,YAAY,MAAM;AACzB,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oCAAoC,CAAC;AACvG,cAAM,EAAE,4BAA4B,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,+BAA+B,CAAC;AAEnH,cAAM,WAAW,OAAO,kBAAkB,IAAI,CAAC,WAAmB;AAChE,cAAI,OAAO,YAAY,MAAM,MAAO,QAAO,IAAI,WAAW;AAC1D,iBAAO;AAAA,QACT,CAAC,EAAE,OAAO,OAAO;AAEjB,cAAM,SAAS,IAAI,4BAA4B,UAAU,IAAI,QAAW,WAAW;AACnF,cAAM,OAAO,UAAU;AAAA,MACzB;AAGA,UAAI,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYZ,YAAM,SAAgB,CAAC;AAGvB,UAAI,KAAK,UAAU;AACjB,cAAM,iBAAmD;AAAA,UACvD,UAAU,CAAC,GAAK,EAAI;AAAA,UACpB,MAAM,CAAC,GAAK,GAAG;AAAA,UACf,QAAQ,CAAC,GAAK,GAAG;AAAA,UACjB,KAAK,CAAC,KAAK,GAAG;AAAA,QAChB;AACA,cAAM,QAAQ,eAAgB,KAAK,SAAoB,YAAY,CAAC;AACpE,YAAI,CAAC,MAAO,QAAO,qBAAqB,KAAK,QAAQ;AACrD,iBAAS;AACT,eAAO,KAAK,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,MAChC;AAGA,UAAI,KAAK,SAAS;AAChB,cAAM,gBAAgB,CAAC,YAAY,gBAAgB,qBAAqB;AACxE,YAAI,CAAC,cAAc,SAAS,KAAK,OAAiB,GAAG;AACnD,iBAAO,oBAAoB,KAAK,OAAO;AAAA,QACzC;AACA,iBAAS;AACT,eAAO,KAAK,KAAK,OAAO;AAAA,MAC1B;AAEA,YAAM,YAAQ,yBAAW,KAAK,OAA6B,EAAE;AAC7D,eAAS;AACT,aAAO,KAAK,KAAK;AAEjB,YAAM,OAcD,MAAM,IAAI,OAAO,MAAM;AAI5B,YAAM,iBAAiB,CAAC,MACtB,MAAM,aAAa,IAAI,MAAM,wBAAwB,IAAI,MAAM,iBAAiB,IAAI;AACtF,YAAM,cAAc,oBAAI,IAA4B;AACpD,iBAAW,OAAO,MAAM;AACtB,cAAM,MAAM,GAAG,IAAI,MAAM,KAAK,IAAI,gBAAgB,EAAE,KAAK,IAAI,aAAa,EAAE;AAC5E,cAAM,KAAK,YAAY,IAAI,GAAG;AAC9B,YAAI,CAAC,MAAM,eAAe,IAAI,OAAO,IAAI,eAAe,GAAG,OAAO,EAAG,aAAY,IAAI,KAAK,GAAG;AAAA,MAC/F;AACA,YAAM,iBAAiB,CAAC,GAAG,YAAY,OAAO,CAAC;AAG/C,YAAM,EAAE,mBAAmB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gCAAgC,CAAC;AAC3G,YAAM,iBAAiB,IAAI,mBAAmB,WAAW;AACzD,YAAM,kBAAkB,eAAe,OAAO,SAAO,eAAe,aAAa,IAAI,MAAM,CAAC,EAAE;AAC9F,YAAM,eAAe,eAAe,OAAO,SAAO,CAAC,eAAe,aAAa,IAAI,MAAM,CAAC;AAE1F,UAAI,aAAa,WAAW,GAAG;AAC7B,cAAM,UAAU,8BAA+B,KAAK,YAAY,KAAK,UAAW,uBAAuB;AACvG,eAAO,kBAAkB,IAAI,GAAG,OAAO,KAAK,eAAe,iBAAiB;AAAA,MAC9E;AAEA,YAAM,EAAE,oBAAoB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,0CAA0C,CAAC;AAEtH,YAAM,QAAkB,CAAC,oBAAoB,aAAa,MAAM,GAAG,kBAAkB,IAAI,KAAK,eAAe,gBAAgB,EAAE;AAAA,CAAM;AAErI,iBAAW,OAAO,cAAc;AAC9B,cAAM,QAAQ,IAAI;AAClB,YAAI;AACJ,YAAI,SAAS,KAAM,iBAAgB;AAAA,iBAC1B,SAAS,EAAK,iBAAgB;AAAA,iBAC9B,SAAS,EAAK,iBAAgB;AAAA,iBAC9B,SAAS,EAAK,iBAAgB;AAAA,YAClC,iBAAgB;AAErB,YAAI;AACJ,YAAI,CAAC,IAAI,QAAS,gBAAe;AAAA,iBACxB,IAAI,YAAY,WAAY,gBAAe;AAAA,iBAC3C,IAAI,YAAY,eAAgB,gBAAe;AAAA,YACnD,gBAAe;AAEpB,cAAM,MAAM,IAAI,eACZ,GAAG,IAAI,YAAY,IAAI,IAAI,oBAAoB,IAAI,uBAAuB,GAAG,KAC7E;AAEJ,cAAM,WAAW,IAAI,cAAc,OAC/B,WAAW,IAAI,WAAW,QAAQ,CAAC,CAAC,MACpC;AACJ,cAAM,WAAW,IAAI,cAAc,OAC/B,WAAW,IAAI,WAAW,QAAQ,CAAC,CAAC,MACpC;AACJ,cAAM,KAAK,GAAG,aAAa,KAAK,IAAI,MAAM,KAAK,GAAG,MAAM,YAAY,IAAI,QAAQ,GAAG,QAAQ,EAAE;AAE7F,YAAI,IAAI,WAAW,IAAI,YAAY,uBAAuB;AACxD,gBAAM,eAAe,IAAI,QAAQ,SAAS,MAAM,IAAI,QAAQ,MAAM,GAAG,GAAG,IAAI,WAAM,IAAI;AACtF,gBAAM,KAAK,KAAK,YAAY,EAAE;AAAA,QAChC;AAEA,YAAI,IAAI,iBAAiB,IAAI,aAAa,IAAI,cAAc;AAC1D,gBAAM,MAAM,oBAAoB,IAAI,WAAW,IAAI,cAAc,IAAI,aAAa;AAClF,cAAI,IAAK,OAAM,KAAK,KAAK,GAAG,EAAE;AAAA,QAChC;AAAA,MACF;AAEA,iBAAO,uBAAS,MAAM,KAAK,IAAI,CAAC;AAAA,IAClC;AAAA,IAEA,KAAK,sBAAsB;AACzB,YAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,YAAM,cAAc,GAAG,eAAe;AACtC,YAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,UAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,YAAM,QAAQ,KAAK;AACnB,YAAM,UAAU,KAAK;AACrB,UAAI,CAAC,MAAO,QAAO;AACnB,UAAI,CAAC,QAAS,QAAO;AAErB,YAAM,KAAK,GAAG,YAAY;AAC1B,SAAG,oBAAoB;AACvB,YAAM,QAAQ,GAAG,SAAS;AAG1B,YAAM,SAA6D,MAAM;AAAA,QACvE;AAAA,QACA,CAAC,OAAO;AAAA,MACV;AAEA,UAAI,CAAC,QAAQ;AACX,eAAO,iCAAiC,OAAO;AAAA,MACjD;AAGA,YAAM,aAAa,QAAQ,KAAK;AAChC,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,WAAW,KAAK;AACtB,YAAM,UAAW,KAAK,WAAsB;AAC5C,YAAM,eAAgB,KAAK,gBAA2B;AAEtD,YAAM;AAAA,QACJ;AAAA;AAAA;AAAA;AAAA;AAAA,QAKA,CAAC,YAAY,OAAO,OAAO,GAAG;AAAA,MAChC;AAEA,YAAM;AAAA,QACJ;AAAA;AAAA;AAAA,QAGA,CAAC,YAAY,OAAO,YAAY,MAAM,cAAc,OAAO;AAAA,MAC7D;AAGA,YAAM;AAAA,QACJ;AAAA;AAAA,QAEA,CAAC,OAAO,SAAS,UAAU;AAAA,MAC7B;AAEA,aAAO,cAAc,KAAK,YAAY,OAAO;AAAA,IAC/C;AAAA,IAEA,KAAK,2BAA2B;AAC9B,YAAM,cAAc,GAAG,eAAe;AACtC,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,MAAO,QAAO;AAEnB,YAAM,EAAE,mBAAmB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gCAAgC,CAAC;AAC3G,YAAM,UAAU,IAAI,mBAAmB,WAAW;AAClD,cAAQ,IAAI,OAAO,KAAK,QAA8B,KAAK,OAA6B;AAExF,YAAM,aAAa,KAAK,SAAS,YAAY,KAAK,MAAM,MAAM;AAC9D,YAAM,cAAc,KAAK,UAAU,aAAa,KAAK,OAAO,MAAM;AAClE,aAAO,GAAG,KAAK,eAAe,UAAU,GAAG,WAAW;AAAA,IACxD;AAAA,IAEA,KAAK,kBAAkB;AACrB,YAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,YAAM,cAAc,GAAG,eAAe;AACtC,YAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,UAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,YAAM,KAAK,GAAG,YAAY;AAC1B,SAAG,oBAAoB;AAEvB,YAAM,EAAE,aAAa,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,+BAA+B,CAAC;AACpG,YAAM,WAAW,IAAI,aAAa,IAAI,WAAW;AACjD,YAAM,OAAO,SAAS,WAAW;AAEjC,iBAAO,uBAAS,IAAI;AAAA,IACtB;AAAA,IAEA,KAAK,iBAAiB;AACpB,YAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,YAAM,cAAc,GAAG,eAAe;AACtC,YAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,UAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,YAAM,KAAK,GAAG,YAAY;AAC1B,SAAG,oBAAoB;AAEvB,YAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,8BAA8B,CAAC;AAClG,YAAM,WAAW,IAAI,YAAY,IAAI,WAAW;AAChD,YAAM,OAAO,SAAS,WAAW;AAEjC,iBAAO,uBAAS,IAAI;AAAA,IACtB;AAAA,IAEA,KAAK,0BAA0B;AAC7B,YAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,YAAM,cAAc,GAAG,eAAe;AACtC,YAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,UAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,YAAM,SAAS,KAAK;AACpB,UAAI,CAAC,OAAQ,QAAO;AAEpB,YAAM,KAAK,GAAG,YAAY;AAC1B,SAAG,oBAAoB;AACvB,YAAM,QAAQ,GAAG,SAAS;AAG1B,UAAI,sBAAqC;AACzC,UAAI,cAAc;AAElB,YAAM,UAA2C,MAAM;AAAA,QACrD;AAAA,QACA,CAAC,MAAM;AAAA,MACT;AAEA,UAAI,SAAS;AACX,8BAAsB,QAAQ;AAAA,MAChC,OAAO;AAEL,cAAM,SAAgE,MAAM;AAAA,UAC1E;AAAA,UACA,CAAC,MAAM;AAAA,QACT;AAEA,YAAI,QAAQ;AACV,wBAAc,OAAO;AAErB,gBAAM,WAA2C,MAAM;AAAA,YACrD;AAAA,YACA,CAAC,OAAO,OAAO;AAAA,UACjB;AAEA,cAAI,UAAU;AACZ,kCAAsB,SAAS;AAAA,UACjC,OAAO;AACL,mBAAO,4CAA4C,MAAM;AAAA,UAC3D;AAAA,QACF,OAAO;AACL,iBAAO,WAAW,MAAM;AAAA,QAC1B;AAAA,MACF;AAGA,YAAM,EAAE,sBAAsB,oBAAoB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gCAAgC,CAAC;AAClI,YAAM,WAAW,IAAI,qBAAqB,IAAI,MAAM;AACpD,YAAM,SAAS,MAAM,SAAS,QAAQ,mBAAmB;AAEzD,YAAM,QAAkB;AAAA,QACtB,mBAAmB,WAAW;AAAA,QAC9B;AAAA,QACA,YAAY,OAAO,OAAO;AAAA,QAC1B,0BAA0B,OAAO,uBAAuB;AAAA,QACxD;AAAA,QACA,QAAQ,oBAAoB,MAAM,CAAC;AAAA,MACrC;AAEA,UAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,cAAM,KAAK,IAAI,UAAU;AACzB,mBAAW,KAAK,OAAO,MAAM,MAAM,GAAG,CAAC,GAAG;AACxC,gBAAM,KAAK,UAAU,EAAE,UAAU,KAAK,EAAE,KAAK,KAAK,UAAK,CAAC,EAAE;AAAA,QAC5D;AACA,YAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,gBAAM,KAAK,eAAU,OAAO,MAAM,SAAS,CAAC,aAAa;AAAA,QAC3D;AAAA,MACF;AAEA,UAAI,OAAO,kBAAkB,SAAS,GAAG;AACvC,cAAM,KAAK,IAAI,uBAAuB;AACtC,mBAAW,OAAO,OAAO,kBAAkB,MAAM,GAAG,EAAE,GAAG;AACvD,gBAAM,KAAK,KAAK,GAAG,EAAE;AAAA,QACvB;AACA,YAAI,OAAO,kBAAkB,SAAS,IAAI;AACxC,gBAAM,KAAK,eAAU,OAAO,kBAAkB,SAAS,EAAE,OAAO;AAAA,QAClE;AAAA,MACF;AAGA,UAAI,OAAO,YAAY,YAAY;AACjC,cAAM,SAAS,MAAM,SAAS,iBAAiB,mBAAmB;AAClE,YAAI,QAAQ;AACV,gBAAM,KAAK,IAAI,mBAAmB;AAClC,cAAI,OAAO,eAAe,SAAS,GAAG;AACpC,kBAAM,KAAK,oBAAoB,OAAO,eAAe,KAAK,IAAI,CAAC,EAAE;AAAA,UACnE;AACA,gBAAM,KAAK,0BAA0B,OAAO,oBAAoB,MAAM,EAAE;AACxE,gBAAM,KAAK,mBAAmB,OAAO,iBAAiB,EAAE;AAAA,QAC1D;AAAA,MACF;AAEA,iBAAO,uBAAS,MAAM,KAAK,IAAI,CAAC;AAAA,IAClC;AAAA,IAEA,KAAK,uBAAuB;AAC1B,YAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,YAAM,cAAc,GAAG,eAAe;AACtC,YAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,UAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,YAAM,KAAK,GAAG,YAAY;AAC1B,SAAG,oBAAoB;AACvB,YAAM,QAAQ,GAAG,SAAS;AAE1B,YAAM,YAAY,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AAGxE,UAAI,KAAK,YAAY,MAAM;AACzB,cAAM,EAAE,iBAAiB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,6BAA6B,CAAC;AACtG,cAAM,UAAU,IAAI,iBAAiB,EAAE;AACvC,cAAM,QAAQ,SAAS;AAAA,MACzB;AAEA,YAAM,OAQD,MAAM;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA,QAKA,CAAC,SAAS;AAAA,MACZ;AAEA,UAAI,KAAK,WAAW,GAAG;AACrB,eAAO,iDAAiD,SAAS,OAC9D,KAAK,UAAU,KAAK;AAAA,MACzB;AAEA,YAAM,QAAkB,CAAC,kCAAkC,SAAS;AAAA,CAAM;AAC1E,iBAAW,OAAO,MAAM;AACtB,cAAM,WAAW,IAAI,oBAAoB,IAAI,uBAAuB;AACpE,cAAM,SAAS,IAAI,kBAAkB;AACrC,cAAM,QAAQ,IAAI,mBAAmB;AACrC,cAAM,SAAS,IAAI,mBACf,KAAK,OAAO,KAAK,IAAI,IAAI,IAAI,qBAAqB,MAAO,KAAK,KAAK,KAAK,GAAG,IAC3E;AACJ,cAAM,MAAM,SAAI,OAAO,KAAK,MAAM,QAAQ,EAAE,CAAC,IAAI,SAAI,OAAO,KAAK,KAAK,MAAM,QAAQ,EAAE,CAAC;AACvF,cAAM,YAAY,WAAW,OAAO,KAAK,MAAM,oBAAoB;AACnE,cAAM,KAAK,GAAG,IAAI,YAAY,KAAK,IAAI,SAAS,MAAM,QAAQ,WAAM,MAAM,GAAG,SAAS,EAAE;AACxF,cAAM,KAAK,KAAK,GAAG,IAAI,MAAM,QAAQ,CAAC,CAAC,EAAE;AAAA,MAC3C;AAEA,YAAM,aAAgC,MAAM,IAAI,gDAAgD,KAAK,EAAE,OAAO,EAAE;AAChH,YAAM,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,WAAW,KAAK,qCAAqC,SAAS,GAAG;AAErG,iBAAO,uBAAS,MAAM,KAAK,IAAI,CAAC;AAAA,IAClC;AAAA,IAEA,KAAK,sBAAsB;AACzB,YAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,YAAM,cAAc,GAAG,eAAe;AACtC,YAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,UAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,YAAM,KAAK,GAAG,YAAY;AAC1B,SAAG,oBAAoB;AACvB,YAAM,QAAQ,GAAG,SAAS;AAE1B,YAAM,OAID,MAAM;AAAA,QACT;AAAA,MACF;AAEA,YAAM,EAAE,mBAAmB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,2BAA2B,CAAC;AACtG,YAAM,SAAS,OAAO;AACtB,YAAM,aAAa,mBAAmB,MAAM,MAAM;AAElD,UAAI,KAAK,WAAW,MAAM;AAExB,YAAI,WAAW,WAAW,GAAG;AAC3B,iBAAO;AAAA,QACT;AACA,cAAMA,SAAkB,CAAC,+BAA+B;AACxD,mBAAW,KAAK,YAAY;AAC1B,UAAAA,OAAM,KAAK,GAAG,EAAE,SAAS,YAAY,CAAC,KAAK,EAAE,WAAW,KAAK,EAAE,SAAS,MAAM,EAAE,OAAO,EAAE;AAAA,QAC3F;AACA,cAAMC,aAAY,WAAW,OAAO,OAAK,EAAE,aAAa,MAAM,EAAE;AAChE,cAAMC,aAAY,WAAW,OAAO,OAAK,EAAE,aAAa,MAAM,EAAE;AAChE,QAAAF,OAAM,KAAK,EAAE;AACb,YAAIC,aAAY,EAAG,CAAAD,OAAM,KAAK,GAAGC,UAAS,kBAAkBA,eAAc,IAAI,MAAM,EAAE,EAAE;AACxF,YAAIC,aAAY,EAAG,CAAAF,OAAM,KAAK,GAAGE,UAAS,mBAAmBA,eAAc,IAAI,MAAM,EAAE,EAAE;AACzF,mBAAO,uBAASF,OAAM,KAAK,IAAI,CAAC;AAAA,MAClC;AAGA,UAAI,KAAK,WAAW,GAAG;AACrB,eAAO;AAAA,MACT;AAEA,YAAM,eAAe,oBAAI,IAA6B;AACtD,iBAAW,KAAK,YAAY;AAC1B,qBAAa,IAAI,GAAG,EAAE,SAAS,IAAI,EAAE,WAAW,IAAI,EAAE,QAAQ;AAAA,MAChE;AAEA,YAAM,QAAkB,CAAC,qBAAqB,KAAK,MAAM;AAAA,CAAkB;AAG3E,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,KAAK,wBAAwB;AACnC,mBAAW,KAAK,YAAY;AAC1B,gBAAM,KAAK,GAAG,EAAE,SAAS,YAAY,CAAC,KAAK,EAAE,WAAW,KAAK,EAAE,SAAS,MAAM,EAAE,OAAO,EAAE;AAAA,QAC3F;AACA,cAAM,KAAK,EAAE;AAAA,MACf;AAEA,YAAM,KAAK,uBAAuB;AAClC,YAAM,KAAK,wCAAwC;AACnD,YAAM,KAAK,wCAAwC;AAEnD,iBAAW,OAAO,MAAM;AACtB,cAAM,MAAM,GAAG,IAAI,SAAS,IAAI,IAAI,YAAY;AAChD,cAAM,YAAY,aAAa,IAAI,GAAG;AACtC,cAAM,UAAU,IAAI,WAAW;AAC/B,cAAM,SAAS,cAAc,IAAI,UAAU,OAAO;AAClD,cAAM,KAAK,GAAG,IAAI,YAAY,MAAM,IAAI,SAAS,MAAM,OAAO,MAAM,MAAM,EAAE;AAAA,MAC9E;AAEA,YAAM,YAAY,WAAW,OAAO,OAAK,EAAE,aAAa,MAAM,EAAE;AAChE,YAAM,YAAY,WAAW,OAAO,OAAK,EAAE,aAAa,MAAM,EAAE;AAChE,YAAM,eAAe,KAAK,OAAO,OAAK,CAAC,EAAE,OAAO,EAAE;AAElD,YAAM,KAAK,EAAE;AACb,UAAI,YAAY,EAAG,OAAM,KAAK,GAAG,SAAS,kBAAkB,cAAc,IAAI,MAAM,EAAE,EAAE;AACxF,UAAI,YAAY,EAAG,OAAM,KAAK,GAAG,SAAS,mBAAmB,cAAc,IAAI,MAAM,EAAE,EAAE;AACzF,UAAI,eAAe,EAAG,OAAM,KAAK,GAAG,YAAY,mBAAmB,iBAAiB,IAAI,MAAM,EAAE,EAAE;AAClG,UAAI,cAAc,KAAK,cAAc,EAAG,OAAM,KAAK,sBAAsB;AAEzE,iBAAO,uBAAS,MAAM,KAAK,IAAI,CAAC;AAAA,IAClC;AAAA,IAEA,KAAK,4BAA4B;AAC/B,YAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,YAAM,cAAc,GAAG,eAAe;AACtC,YAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,UAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,YAAM,KAAK,GAAG,YAAY;AAC1B,SAAG,oBAAoB;AAEvB,YAAM,EAAE,sBAAsB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,kCAAkC,CAAC;AAChH,YAAM,WAAW,IAAI,sBAAsB,EAAE;AAC7C,YAAM,SAAS,MAAM,SAAS,QAAQ;AAEtC,UAAI,OAAO,gBAAgB,GAAG;AAC5B,eAAO;AAAA,MACT;AAEA,YAAM,YAAQ,yBAAW,KAAK,OAA6B,EAAE;AAC7D,YAAM,SAAU,KAAK,eAAe,OAChC,OAAO,cAAc,OAAO,OAAK,EAAE,kBAAkB,QAAQ,IAC7D,OAAO;AAEX,YAAM,QAAkB;AAAA,QACtB;AAAA,QACA;AAAA,QACA,iBAAiB,OAAO,WAAW,aAAa,OAAO,YAAY,oBAAoB,OAAO,mBAAmB,wBAAwB,OAAO,eAAe;AAAA,QAC/J;AAAA,MACF;AAEA,YAAM,YAAY,OAAO,MAAM,GAAG,KAAK;AACvC,UAAI,UAAU,WAAW,GAAG;AAC1B,cAAM,KAAK,KAAK,eAAe,OAC3B,yDACA,+CAA+C;AAAA,MACrD,OAAO;AACL,mBAAW,SAAS,WAAW;AAC7B,gBAAM,UAAU,MAAM,kBAAkB,WAAW;AACnD,gBAAM,UAAU,MAAM,YAAY,IAAI,SAAS,MAAM,UAAU,QAAQ,CAAC,CAAC,KAAK;AAC9E,gBAAM,KAAK,GAAG,OAAO,IAAI,MAAM,KAAK,KAAK,MAAM,aAAa,IAAI,OAAO,KAAK,MAAM,QAAQ,EAAE;AAC5F,qBAAW,OAAO,MAAM,eAAe,MAAM,GAAG,CAAC,GAAG;AAClD,kBAAM,KAAK,YAAO,IAAI,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI,QAAQ,OAAO,IAAI,aAAa,IAAI,MAAM,EAAE,GAAG,IAAI,UAAU,KAAK,IAAI,OAAO,KAAK,EAAE,GAAG;AAAA,UACpJ;AACA,cAAI,MAAM,eAAe,SAAS,GAAG;AACnC,kBAAM,KAAK,sBAAY,MAAM,eAAe,SAAS,CAAC,aAAa;AAAA,UACrE;AAAA,QACF;AACA,YAAI,OAAO,SAAS,OAAO;AACzB,gBAAM,KAAK,IAAI,aAAQ,OAAO,SAAS,KAAK,0CAA0C;AAAA,QACxF;AAAA,MACF;AAEA,iBAAO,uBAAS,MAAM,KAAK,IAAI,CAAC;AAAA,IAClC;AAAA,IAEA,KAAK,qBAAqB;AACxB,YAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,YAAM,cAAc,GAAG,eAAe;AACtC,YAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,UAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,YAAM,KAAK,GAAG,YAAY;AAC1B,SAAG,oBAAoB;AAEvB,YAAM,EAAE,eAAe,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,2BAA2B,CAAC;AAClG,YAAM,UAAU,IAAI,eAAe,IAAI,WAAW;AAClD,YAAM,SAAS,MAAM,QAAQ,KAAK,EAAE,cAAc,KAAK,iBAAiB,KAAK,CAAC;AAE9E,UAAI,OAAO,kBAAkB,GAAG;AAC9B,eAAO,6BAA6B,OAAO,YAAY,QAAQ,OAAO,iBAAiB,IAAI,MAAM,EAAE;AAAA,MACrG;AAEA,UAAI,WAAW,OAAO;AACtB,UAAI,KAAK,UAAU;AACjB,mBAAW,SAAS,OAAO,OAAK,EAAE,aAAc,KAAK,QAAmB;AAAA,MAC1E;AAEA,UAAI,SAAS,WAAW,GAAG;AACzB,eAAO,uCAAuC,KAAK,QAAQ,uCAAuC,OAAO,aAAa;AAAA,MACxH;AAEA,YAAM,QAAkB;AAAA,QACtB,mBAAmB,OAAO,YAAY;AAAA,QACtC;AAAA,QACA,UAAU,OAAO,aAAa,eAAe,OAAO,aAAa,WAAW,OAAO,SAAS;AAAA,QAC5F;AAAA,MACF;AAEA,iBAAW,KAAK,UAAU;AACxB,cAAM,KAAK,GAAG,EAAE,SAAS,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;AACnD,cAAM,KAAK,KAAK,EAAE,QAAQ,IAAI,EAAE,IAAI,IAAI,EAAE,MAAM,cAAc,EAAE,OAAO,EAAE;AACzE,YAAI,EAAE,UAAU;AACd,gBAAM,KAAK,kBAAkB,EAAE,QAAQ,EAAE;AAAA,QAC3C;AACA,YAAI,EAAE,kBAAkB,GAAG;AACzB,gBAAM,KAAK,oBAAoB,EAAE,eAAe,eAAe,EAAE,oBAAoB,IAAI,MAAM,EAAE,EAAE;AAAA,QACrG;AAAA,MACF;AAEA,iBAAO,uBAAS,MAAM,KAAK,IAAI,CAAC;AAAA,IAClC;AAAA,IAEA,KAAK,4BAA4B;AAC/B,YAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,YAAM,cAAc,GAAG,eAAe;AACtC,YAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,UAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,YAAM,KAAK,GAAG,YAAY;AAC1B,SAAG,oBAAoB;AAEvB,YAAM,EAAE,iBAAiB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,8BAA8B,CAAC;AACvG,YAAM,WAAW,IAAI,iBAAiB,EAAE;AACxC,UAAI,WAAW,MAAM,SAAS,QAAQ;AAEtC,YAAM,aAAc,KAAK,QAA+B;AACxD,YAAM,WAAmC;AAAA,QACvC,KAAK;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAEA,UAAI,eAAe,OAAO;AACxB,cAAM,SAAS,SAAS,UAAU;AAClC,YAAI,CAAC,OAAQ,QAAO,wBAAwB,UAAU;AACtD,mBAAW,SAAS,OAAO,OAAK,EAAE,SAAS,MAAM;AAAA,MACnD;AAEA,UAAI,SAAS,WAAW,GAAG;AACzB,eAAO,eAAe,QAClB,sCACA,OAAO,UAAU;AAAA,MACvB;AAEA,YAAM,QAAkB;AAAA,QACtB,qBAAqB,SAAS,MAAM,WAAW,SAAS,WAAW,IAAI,MAAM,EAAE;AAAA,QAC/E;AAAA,MACF;AAEA,iBAAW,KAAK,UAAU;AACxB,cAAM,KAAK,GAAG,EAAE,SAAS,YAAY,CAAC,MAAM,EAAE,aAAa,MAAM,EAAE,IAAI,EAAE;AACzE,cAAM,KAAK,KAAK,EAAE,QAAQ,IAAI,EAAE,IAAI,aAAa,EAAE,MAAM,EAAE;AAC3D,cAAM,KAAK,KAAK,EAAE,WAAW,EAAE;AAC/B,cAAM,KAAK,UAAU,EAAE,cAAc,EAAE;AACvC,cAAM,KAAK,EAAE;AAAA,MACf;AAEA,iBAAO,uBAAS,MAAM,KAAK,IAAI,CAAC;AAAA,IAClC;AAAA,IAEA,KAAK,0BAA0B;AAC7B,YAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,YAAM,cAAc,GAAG,eAAe;AACtC,YAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,UAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,YAAM,KAAK,GAAG,YAAY;AAC1B,SAAG,oBAAoB;AAEvB,YAAM,EAAE,mBAAmB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gCAAgC,CAAC;AAC3G,YAAM,UAAU,IAAI,mBAAmB,EAAE;AACzC,YAAM,EAAE,SAAS,OAAO,IAAI,MAAM,QAAQ,SAAS;AAEnD,YAAM,aAAqC,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,EAAE;AACjG,YAAM,eAAe,KAAK;AAC1B,YAAM,iBAAiB,eAAgB,WAAW,YAAY,KAAK,IAAK;AAExE,YAAM,WAAW,QACd,OAAO,QAAM,WAAW,EAAE,SAAS,KAAK,MAAM,cAAc,EAC5D,KAAK,CAAC,GAAG,OAAO,WAAW,EAAE,SAAS,KAAK,MAAM,WAAW,EAAE,SAAS,KAAK,EAAE;AAEjF,UAAI,SAAS,WAAW,GAAG;AACzB,eAAO,6CAA6C,gBAAgB,QAAQ,uBAAuB,QAAQ,MAAM;AAAA,MACnH;AAEA,YAAM,QAAkB;AAAA,QACtB,0BAA0B,SAAS,MAAM,sBAAsB,gBAAgB,QAAQ;AAAA,QACvF;AAAA,MACF;AAEA,iBAAW,KAAK,UAAU;AACxB,cAAM,WAAW,EAAE,mBAAmB,OAAO,cAAc,EAAE,eAAe,QAAQ,CAAC,CAAC,QAAQ;AAC9F,cAAM,gBAAgB,EAAE,oBAAoB,OAAO,gBAAgB,EAAE,eAAe,KAAK;AACzF,cAAM,KAAK,GAAG,EAAE,UAAU,YAAY,CAAC,KAAK,EAAE,WAAW,KAAK,EAAE,SAAS,IAAI,QAAQ,GAAG,aAAa,EAAE;AACvG,mBAAW,UAAU,EAAE,aAAa;AAClC,gBAAM,KAAK,YAAO,MAAM,EAAE;AAAA,QAC5B;AAAA,MACF;AAEA,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,KAAK,IAAI,UAAK,OAAO,MAAM,WAAW,OAAO,WAAW,IAAI,MAAM,EAAE,wCAAwC;AAAA,MACpH;AAEA,iBAAO,uBAAS,MAAM,KAAK,IAAI,CAAC;AAAA,IAClC;AAAA,IAEA,KAAK,2BAA2B;AAC9B,YAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,YAAM,cAAc,GAAG,eAAe;AACtC,YAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,UAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,YAAM,KAAK,GAAG,YAAY;AAC1B,SAAG,oBAAoB;AAEvB,YAAM,EAAE,oBAAoB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iCAAiC,CAAC;AAC7G,YAAM,UAAU,IAAI,oBAAoB,EAAE;AAC1C,YAAM,WAAW,MAAM,QAAQ,MAAM;AAErC,UAAI,SAAS,WAAW,GAAG;AACzB,eAAO;AAAA,MACT;AAEA,YAAM,aAAqC,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,EAAE;AAC7E,YAAM,SAAS,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,OAAO,WAAW,EAAE,SAAS,KAAK,MAAM,WAAW,EAAE,SAAS,KAAK,EAAE;AAE3G,YAAM,QAAkB;AAAA,QACtB,2BAA2B,SAAS,MAAM,WAAW,SAAS,WAAW,IAAI,MAAM,EAAE;AAAA,QACrF;AAAA,MACF;AAEA,iBAAW,KAAK,QAAQ;AACtB,cAAM,KAAK,GAAG,EAAE,UAAU,YAAY,CAAC,KAAK,EAAE,WAAW,KAAK,EAAE,SAAS,GAAG;AAC5E,cAAM,KAAK,KAAK,EAAE,WAAW,EAAE;AAC/B,YAAI,EAAE,gBAAgB,EAAE,eAAe;AACrC,gBAAM,KAAK,qBAAqB,EAAE,aAAa,GAAG,EAAE,oBAAoB,gBAAgB,EAAE,iBAAiB,KAAK,EAAE,EAAE;AAAA,QACtH;AAAA,MACF;AAEA,iBAAO,uBAAS,MAAM,KAAK,IAAI,CAAC;AAAA,IAClC;AAAA,IAEA,KAAK,yBAAyB;AAC5B,YAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,YAAM,cAAc,GAAG,eAAe;AACtC,YAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,UAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,YAAM,KAAK,GAAG,YAAY;AAC1B,SAAG,oBAAoB;AAEvB,YAAM,EAAE,mBAAmB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,+BAA+B,CAAC;AAC1G,YAAM,UAAU,IAAI,mBAAmB,EAAE;AACzC,UAAI,WAAW,QAAQ,UAAU;AAEjC,UAAI,KAAK,gBAAgB,MAAM;AAC7B,mBAAW,SAAS,OAAO,OAAK,EAAE,SAAS;AAAA,MAC7C;AAEA,UAAI,SAAS,WAAW,GAAG;AACzB,eAAO,KAAK,gBAAgB,OACxB,sCACA;AAAA,MACN;AAGA,YAAM,YAAoC,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,EAAE;AACrF,eAAS,KAAK,CAAC,GAAG,MAAM;AACtB,cAAM,OAAO,UAAU,EAAE,SAAS,KAAK;AACvC,cAAM,OAAO,UAAU,EAAE,SAAS,KAAK;AACvC,YAAI,SAAS,KAAM,QAAO,OAAO;AACjC,gBAAQ,EAAE,YAAY,MAAM,EAAE,YAAY;AAAA,MAC5C,CAAC;AAED,YAAM,eAAe,SAAS,OAAO,OAAK,EAAE,SAAS,EAAE;AACvD,YAAM,eAAe,SAAS,OAAO,OAAK,EAAE,cAAc,SAAS,EAAE;AAErE,YAAM,QAAkB;AAAA,QACtB,sBAAsB,SAAS,MAAM,QAAQ,eAAe,IAAI,KAAK,YAAY,aAAa,EAAE,GAAG,eAAe,IAAI,KAAK,YAAY,aAAa,EAAE;AAAA,QACtJ;AAAA,MACF;AAEA,iBAAW,KAAK,UAAU;AACxB,cAAM,gBAAgB,EAAE,YAAY,OAAO,YACvC,EAAE,YAAY,IAAI,aAClB,EAAE,YAAY,IAAI,SAClB,EAAE,YAAY,IAAI,WAClB;AAEJ,cAAM,SAAS,EAAE,cAAc,YAAY,cACvC,EAAE,cAAc,YAAY,cAC5B,EAAE,cAAc,WAAW,aAC3B;AAEJ,cAAM,KAAK,GAAG,MAAM,KAAK,aAAa,KAAK,EAAE,KAAK,KAAK,EAAE,WAAW,EAAE;AACtE,YAAI,EAAE,aAAa,KAAM,OAAM,KAAK,cAAc,EAAE,QAAQ,OAAO,EAAE,aAAa,IAAI,MAAM,EAAE,EAAE;AAChG,YAAI,EAAE,yBAAyB,KAAM,OAAM,KAAK,uBAAuB,EAAE,oBAAoB,OAAO,EAAE,yBAAyB,IAAI,MAAM,EAAE,EAAE;AAC7I,YAAI,EAAE,gBAAgB,MAAM;AAC1B,gBAAM,eAAe,IAAI,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AACtE,gBAAM,KAAK,mBAAmB,YAAY,EAAE;AAAA,QAC9C;AAAA,MACF;AAEA,iBAAO,uBAAS,MAAM,KAAK,IAAI,CAAC;AAAA,IAClC;AAAA,IAEA;AACE,aAAO,iBAAiB,QAAQ;AAAA,EACpC;AACF;",
|
|
6
6
|
"names": ["lines", "denyCount", "warnCount"]
|
|
7
7
|
}
|
package/dist/mcp/tools.js
CHANGED
|
@@ -1438,7 +1438,7 @@ const tools = [
|
|
|
1438
1438
|
},
|
|
1439
1439
|
{
|
|
1440
1440
|
name: "kirograph_reachability",
|
|
1441
|
-
description: "Check reachability for a dependency or CVE.",
|
|
1441
|
+
description: "Check reachability for a dependency or CVE \u2014 verdict, call paths (or why none was found), and impact summary.",
|
|
1442
1442
|
inputSchema: {
|
|
1443
1443
|
type: "object",
|
|
1444
1444
|
properties: {
|