AI-powered CLI coding agent with 20+ built-in tools, MCP support, and multi-model providers
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport http counts 0 tools · 0 res
· 0 prompts
permission surface via code analysis
No tools enumerated yet for this server.
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit cb268b9 · analyzer v28 · 1d ago
skills & prompt files 5
- skill echoVic-blade-code-cb268b9/.blade/skills/base64-parser/SKILL.md
- skill echoVic-blade-code-cb268b9/.blade/skills/code-review/SKILL.md
- skill echoVic-blade-code-cb268b9/.blade/skills/github-explorer/SKILL.md
- agent-rules echoVic-blade-code-cb268b9/AGENTS.md
- agent-rules echoVic-blade-code-cb268b9/CLAUDE.md
danger signals4
- suspicious endpoint discord.com echoVic-blade-code-cb268b9/packages/cli/release.config.js :89
webhookUrl: process.env.DISCORD_WEBHOOK_URL || 'https://discord.com/api/webhooks/1460226980938125387/5fWgMuGmkGtb6j3eoDaz4JtSFfH8LtFtHK9F2srIHGoXp71zm4sHFPCc729PujDbHJ2F', - suspicious endpoint 169.254.169.254 (cloud metadata) echoVic-blade-code-cb268b9/packages/cli/tests/unit/hooks/http-hook-security.test.ts :68
'https://169.254.169.254/hook', // 云 metadata - suspicious endpoint 172.32.0.1 echoVic-blade-code-cb268b9/packages/cli/tests/unit/hooks/http-hook-security.test.ts :76
expect(() => validateHookUrl('https://172.32.0.1/hook')).not.toThrow(); - suspicious endpoint 172.15.0.1 echoVic-blade-code-cb268b9/packages/cli/tests/unit/hooks/http-hook-security.test.ts :77
expect(() => validateHookUrl('https://172.15.0.1/hook')).not.toThrow();
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 559
filesystem 57
- fs echoVic-blade-code-cb268b9/packages/cli/src/agent/subagents/AgentSessionStore.ts :10
import fs from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/agent/subagents/SubagentRegistry.ts :1
import fs from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/agent/teams/TeamStore.ts :1
import * as fs from 'fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/bootstrap/state.ts :10
import { realpathSync } from 'fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/commands/headlessBenchmark.ts :1
import { mkdir, readFile, writeFile } from 'node:fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/config/ConfigManager.ts :19
import { promises as fs } from 'fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/config/ConfigService.ts :15
import { promises as fs } from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/context/CompactionService.ts :6
import { promises as fs } from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/context/FileAnalyzer.ts :6
import { readFile } from 'node:fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/context/ToolResultBudget.ts :8
import * as fs from 'fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/context/storage/JSONLStore.ts :1
import * as fsSync from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/context/storage/PersistentStore.ts :2
import * as fs from 'node:fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/hooks/HookManager.ts :197
const content = await fs.readFile(localSettingsPath, 'utf-8'); - fs echoVic-blade-code-cb268b9/packages/cli/src/logging/Logger.ts :16
import { appendFileSync, existsSync, mkdirSync, readdirSync, statSync, unlinkSync } from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/logging/StreamDebugLogger.ts :8
import { appendFileSync, mkdirSync, writeFileSync } from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/mcp/auth/OAuthTokenStorage.ts :6
import { promises as fs } from 'fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/mcp/loadMcpConfig.ts :10
import fs from 'fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/memory/AutoMemoryManager.ts :14
import * as fs from 'node:fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/plugins/PluginInstaller.ts :9
import * as fs from 'node:fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/plugins/PluginLoader.ts :8
import * as fs from 'node:fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/plugins/PluginManifest.ts :8
import * as fs from 'node:fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/prompts/builder.ts :20
import { promises as fs } from 'fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/prompts/processors/AttachmentCollector.ts :8
import * as fs from 'fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/server/routes/skills.ts :2
import * as fs from 'node:fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/server/routes/suggestions.ts :4
import { readdir } from 'node:fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/server/server.ts :3
import { existsSync, readFileSync } from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/services/FileSystemService.ts :8
import * as fs from 'fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/services/SessionService.ts :6
import { readdir, readFile, rm } from 'node:fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/services/VersionChecker.ts :7
import * as fs from 'fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/skills/SkillInstaller.ts :9
import * as fs from 'node:fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/skills/SkillLoader.ts :8
import * as fs from 'node:fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/skills/SkillRegistry.ts :8
import * as fs from 'node:fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/slash-commands/builtinCommands.ts :5
import fs from 'node:fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/slash-commands/custom/CustomCommandExecutor.ts :11
import fs from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/slash-commands/custom/CustomCommandLoader.ts :7
import fs from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/slash-commands/custom/CustomCommandParser.ts :7
import fs from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/slash-commands/ide.ts :11
import { existsSync, readFileSync } from 'fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/slash-commands/init.ts :6
import { promises as fs } from 'fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/tools/builtin/file/FileAccessTracker.ts :1
import { promises as fs } from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/tools/builtin/file/SnapshotManager.ts :2
import { promises as fs } from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/tools/builtin/file/write.ts :1
import { promises as fs } from 'fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/tools/builtin/notebook/notebookEdit.ts :1
import * as fs from 'fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/tools/builtin/plan/ExitPlanModeTool.ts :1
import { promises as fs } from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/tools/builtin/search/glob.ts :3
import type { Stats } from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/tools/builtin/search/grep.ts :2
import { existsSync } from 'fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/tools/builtin/task/TaskListManager.ts :1
import * as fs from 'fs/promises'; - fs echoVic-blade-code-cb268b9/packages/cli/src/tools/execution/VerifyQueue.ts :19
import { existsSync } from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/ui/components/AgentCreationWizard.tsx :16
import fs from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/ui/components/AgentsManager.tsx :7
import fs from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/ui/components/HooksManager.tsx :315
await fs.mkdir(pathModule.dirname(settingsPath), { recursive: true }); - fs echoVic-blade-code-cb268b9/packages/cli/src/ui/components/PermissionsManager.tsx :2
import { promises as fs } from 'fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/ui/utils/imagePaste.ts :11
import { existsSync, readFileSync } from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/utils/at.ts :1
import fs from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/utils/environment.ts :2
import { existsSync, realpathSync } from 'fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/utils/filePatterns.ts :1
import { existsSync, readFileSync } from 'node:fs'; - fs echoVic-blade-code-cb268b9/packages/cli/src/utils/pathSecurity.ts :7
import * as fs from 'fs/promises'; - fs echoVic-blade-code-cb268b9/packages/vscode/src/extension.ts :9
import * as fs from 'fs';
shell / exec 25
- shell echoVic-blade-code-cb268b9/packages/cli/src/acp/AcpServiceContext.ts :15
import { spawn } from 'child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/commands/update.ts :5
import { execSync } from 'child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/context/storage/pathUtils.ts :1
import { execSync } from 'node:child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/hooks/SecureProcessExecutor.ts :7
import { spawn } from 'child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/ide/detectIde.ts :7
import { exec } from 'child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/ide/ideInstaller.ts :7
import { exec } from 'child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/mcp/auth/OAuthProvider.ts :6
import { spawn } from 'child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/plugins/PluginInstaller.ts :8
import { execSync } from 'node:child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/server/routes/suggestions.ts :3
import { execSync } from 'node:child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/server/routes/terminal.ts :46
const ptyProcess = spawn(command, args, { - shell echoVic-blade-code-cb268b9/packages/cli/src/services/VersionChecker.ts :239
const { spawn } = await import('child_process'); - shell echoVic-blade-code-cb268b9/packages/cli/src/skills/SkillInstaller.ts :8
import { exec } from 'node:child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/slash-commands/custom/CustomCommandExecutor.ts :10
import { execSync } from 'node:child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/slash-commands/memory.ts :5
import { spawn } from 'node:child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/tools/builtin/search/grep.ts :1
import { execSync, spawn } from 'child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/tools/builtin/shell/BackgroundShellManager.ts :1
import { type ChildProcess, spawn } from 'child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/tools/builtin/shell/bash.ts :1
import { spawn } from 'child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/tools/execution/VerifyQueue.ts :18
import { execFile } from 'node:child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/tools/validation/SensitiveFileDetector.ts :341
return new RegExp(`^${regexPattern}$`, 'i').test(text); - shell echoVic-blade-code-cb268b9/packages/cli/src/ui/utils/imagePaste.ts :10
import { execSync } from 'node:child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/utils/backgroundTaskManager.ts :1
import { spawn } from 'node:child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/utils/environment.ts :1
import { execSync } from 'child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/utils/git.ts :12
import { type ExecFileException, execFile, spawn } from 'child_process'; - shell echoVic-blade-code-cb268b9/packages/cli/src/utils/shell/commandNormalizer.ts :459
if (next && '$`"\\'.includes(next)) { - shell echoVic-blade-code-cb268b9/packages/cli/src/utils/shell/readOnlyValidation.ts :883
return new RegExp(`^${escaped}(?:\\s|$)[^<>()$\`|{}&;\\n\\r]*$`);
network 21
- net echoVic-blade-code-cb268b9/packages/cli/src/hooks/HookExecutor.ts :1001
const response = await fetch(hook.url, { - net echoVic-blade-code-cb268b9/packages/cli/src/mcp/auth/OAuthProvider.ts :8
import * as http from 'http'; - net echoVic-blade-code-cb268b9/packages/cli/src/server/routes/skills.ts :65
const response = await fetch( - net echoVic-blade-code-cb268b9/packages/cli/src/server/server.ts :4
import { createServer, type Server as NodeServer } from 'node:http'; - net echoVic-blade-code-cb268b9/packages/cli/src/services/ModelsDevService.ts :36
const response = await fetch(MODELS_DEV_API, { - net echoVic-blade-code-cb268b9/packages/cli/src/tools/builtin/web/searchProviders.ts :373
const response = await fetch( - net echoVic-blade-code-cb268b9/packages/cli/src/tools/builtin/web/webFetch.ts :450
return await fetch(url, { ...options, signal: controller.signal }); - net echoVic-blade-code-cb268b9/packages/cli/src/tools/builtin/web/webSearch.ts :1
import { type Dispatcher, ProxyAgent, fetch as undiciFetch } from 'undici'; - net echoVic-blade-code-cb268b9/packages/cli/src/ui/utils/security.ts :15
* await fetch('api', { headers: { 'Authorization': 'sk-abc123...' } }); - net echoVic-blade-code-cb268b9/packages/cli/src/utils/proxyFetch.ts :12
import { type Dispatcher, ProxyAgent, fetch as undiciFetch } from 'undici'; - net echoVic-blade-code-cb268b9/packages/cli/web/src/components/layout/Sidebar.tsx :106
await fetch(`/sessions/${sessionId}`, { - net echoVic-blade-code-cb268b9/packages/cli/web/src/components/mcp/McpModal.tsx :58
const response = await fetch('/mcp') - net echoVic-blade-code-cb268b9/packages/cli/web/src/components/preview/FilePreview.tsx :80
const response = await fetch(url); - net echoVic-blade-code-cb268b9/packages/cli/web/src/components/settings/AddModelModal.tsx :62
fetch('/providers') - net echoVic-blade-code-cb268b9/packages/cli/web/src/components/settings/SettingsModal.tsx :71
const response = await fetch('/models', { - net echoVic-blade-code-cb268b9/packages/cli/web/src/components/skills/SkillsModal.tsx :28
const response = await fetch('/skills') - net echoVic-blade-code-cb268b9/packages/cli/web/src/hooks/useAtMention.ts :89
const response = await fetch( - net echoVic-blade-code-cb268b9/packages/cli/web/src/hooks/useSlashCommand.ts :76
const response = await fetch(`/suggestions/commands?q=${encodeURIComponent(match.query)}`) - net echoVic-blade-code-cb268b9/packages/cli/web/src/services/sessionService.ts :72
const res = await fetch(`${API_BASE}/sessions`); - net echoVic-blade-code-cb268b9/packages/cli/web/src/store/ConfigStore.ts :32
const response = await fetch('/models') - net echoVic-blade-code-cb268b9/packages/cli/web/src/store/SettingsStore.ts :49
const response = await fetch('/configs')
secrets 4
- secrets echoVic-blade-code-cb268b9/packages/cli/src/commands/serve.ts :22
if (!process.env.BLADE_SERVER_PASSWORD) { - secrets echoVic-blade-code-cb268b9/packages/cli/src/commands/web.ts :32
if (!process.env.BLADE_SERVER_PASSWORD) { - secrets echoVic-blade-code-cb268b9/packages/cli/src/context/CompactionService.ts :279
apiKey: options.apiKey || process.env.BLADE_API_KEY || '', - secrets echoVic-blade-code-cb268b9/packages/cli/src/server/server.ts :81
const password = process.env.BLADE_SERVER_PASSWORD;
declared dependencies 4
- @biomejs/biome@^2.2.4
- @types/node@^25.5.0
- knip@^5.80.0
- typescript@^5.9.2
clipboard 1
- clipboard shell call echoVic-blade-code-cb268b9/packages/cli/src/ui/utils/imagePaste.ts :81
'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',