@prestyj/cli 5.31.0 → 5.32.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/assets/skills/task-list/SKILL.md +39 -0
- package/dist/app-sidecar/app-settings.js +11 -5
- package/dist/app-sidecar/app-settings.js.map +1 -1
- package/dist/app-sidecar/auth-routes.js +10 -3
- package/dist/app-sidecar/auth-routes.js.map +1 -1
- package/dist/app-sidecar/git-target.d.ts +15 -2
- package/dist/app-sidecar/git-target.js +24 -10
- package/dist/app-sidecar/git-target.js.map +1 -1
- package/dist/app-sidecar/goal-routes.js +14 -2
- package/dist/app-sidecar/goal-routes.js.map +1 -1
- package/dist/app-sidecar/history-routes.js +7 -0
- package/dist/app-sidecar/history-routes.js.map +1 -1
- package/dist/app-sidecar/history.d.ts +5 -0
- package/dist/app-sidecar/history.js.map +1 -1
- package/dist/app-sidecar/integration-routes.js +4 -0
- package/dist/app-sidecar/integration-routes.js.map +1 -1
- package/dist/app-sidecar/mcp-routes.js +1 -0
- package/dist/app-sidecar/mcp-routes.js.map +1 -1
- package/dist/app-sidecar/mcp-rows.d.ts +2 -0
- package/dist/app-sidecar/mcp-rows.js +4 -1
- package/dist/app-sidecar/mcp-rows.js.map +1 -1
- package/dist/app-sidecar/prompt-routes.js +67 -1
- package/dist/app-sidecar/prompt-routes.js.map +1 -1
- package/dist/app-sidecar/route-context.d.ts +2 -0
- package/dist/app-sidecar/run-control-routes.d.ts +14 -0
- package/dist/app-sidecar/run-control-routes.js +104 -25
- package/dist/app-sidecar/run-control-routes.js.map +1 -1
- package/dist/app-sidecar/session-routes.js +15 -1
- package/dist/app-sidecar/session-routes.js.map +1 -1
- package/dist/app-sidecar/task-routes.js +24 -0
- package/dist/app-sidecar/task-routes.js.map +1 -1
- package/dist/app-sidecar/trophy-manager.d.ts +15 -0
- package/dist/app-sidecar/trophy-manager.js +71 -0
- package/dist/app-sidecar/trophy-manager.js.map +1 -0
- package/dist/app-sidecar/workspace-routes.js +1 -0
- package/dist/app-sidecar/workspace-routes.js.map +1 -1
- package/dist/app-sidecar.js +157 -30
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli/auth.js +22 -1
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/mcp.js +6 -1
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli.js +13 -9
- package/dist/cli.js.map +1 -1
- package/dist/config.js +4 -2
- package/dist/config.js.map +1 -1
- package/dist/core/action-threats.d.ts +68 -0
- package/dist/core/action-threats.js +894 -0
- package/dist/core/action-threats.js.map +1 -0
- package/dist/core/agent-notifications.d.ts +18 -0
- package/dist/core/agent-notifications.js +35 -2
- package/dist/core/agent-notifications.js.map +1 -1
- package/dist/core/agent-session/verification-tracker.d.ts +21 -0
- package/dist/core/agent-session/verification-tracker.js +39 -1
- package/dist/core/agent-session/verification-tracker.js.map +1 -1
- package/dist/core/agent-session.d.ts +176 -2
- package/dist/core/agent-session.js +515 -30
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/blocked-packages-file.d.ts +33 -0
- package/dist/core/blocked-packages-file.js +274 -0
- package/dist/core/blocked-packages-file.js.map +1 -0
- package/dist/core/compaction/policy.d.ts +2 -2
- package/dist/core/compaction/policy.js +86 -43
- package/dist/core/compaction/policy.js.map +1 -1
- package/dist/core/compaction/token-estimator.d.ts +4 -1
- package/dist/core/compaction/token-estimator.js +5 -2
- package/dist/core/compaction/token-estimator.js.map +1 -1
- package/dist/core/event-bus.d.ts +10 -0
- package/dist/core/event-bus.js +2 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/goal-run-marker.d.ts +32 -0
- package/dist/core/goal-run-marker.js +178 -0
- package/dist/core/goal-run-marker.js.map +1 -0
- package/dist/core/goal-summary.js +8 -2
- package/dist/core/goal-summary.js.map +1 -1
- package/dist/core/idle-wake.d.ts +62 -0
- package/dist/core/idle-wake.js +103 -0
- package/dist/core/idle-wake.js.map +1 -0
- package/dist/core/injection-detect.d.ts +2 -1
- package/dist/core/injection-detect.js +13 -4
- package/dist/core/injection-detect.js.map +1 -1
- package/dist/core/installed-threats.d.ts +23 -0
- package/dist/core/installed-threats.js +71 -0
- package/dist/core/installed-threats.js.map +1 -0
- package/dist/core/mcp/catalog-cache.d.ts +2 -0
- package/dist/core/mcp/catalog-cache.js +4 -0
- package/dist/core/mcp/catalog-cache.js.map +1 -1
- package/dist/core/mcp/client.d.ts +8 -0
- package/dist/core/mcp/client.js +37 -3
- package/dist/core/mcp/client.js.map +1 -1
- package/dist/core/mcp/deferred-catalog.d.ts +12 -1
- package/dist/core/mcp/deferred-catalog.js +37 -10
- package/dist/core/mcp/deferred-catalog.js.map +1 -1
- package/dist/core/mcp/index.d.ts +2 -0
- package/dist/core/mcp/index.js +1 -0
- package/dist/core/mcp/index.js.map +1 -1
- package/dist/core/mcp/tool-guard.d.ts +58 -0
- package/dist/core/mcp/tool-guard.js +215 -0
- package/dist/core/mcp/tool-guard.js.map +1 -0
- package/dist/core/network-guard.d.ts +0 -20
- package/dist/core/network-guard.js +6 -0
- package/dist/core/network-guard.js.map +1 -1
- package/dist/core/package-cooldown.d.ts +71 -0
- package/dist/core/package-cooldown.js +301 -0
- package/dist/core/package-cooldown.js.map +1 -0
- package/dist/core/package-threats.d.ts +77 -3
- package/dist/core/package-threats.js +1250 -78
- package/dist/core/package-threats.js.map +1 -1
- package/dist/core/process-manager.d.ts +54 -12
- package/dist/core/process-manager.js +233 -56
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/prompt-commands.js +1 -0
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/resolve-start.d.ts +2 -0
- package/dist/core/resolve-start.js +34 -5
- package/dist/core/resolve-start.js.map +1 -1
- package/dist/core/session-manager.d.ts +3 -1
- package/dist/core/session-manager.js +2 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +1 -0
- package/dist/core/settings-manager.js +4 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/shell-threats.d.ts +14 -1
- package/dist/core/shell-threats.js +73 -24
- package/dist/core/shell-threats.js.map +1 -1
- package/dist/core/skill-scan.d.ts +112 -0
- package/dist/core/skill-scan.js +781 -0
- package/dist/core/skill-scan.js.map +1 -0
- package/dist/core/skills.d.ts +33 -0
- package/dist/core/skills.js +87 -16
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts +5 -1
- package/dist/core/slash-commands.js +24 -9
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/steering.d.ts +7 -0
- package/dist/core/steering.js +13 -0
- package/dist/core/steering.js.map +1 -1
- package/dist/core/style-packs/index.js +1 -1
- package/dist/core/style-packs/index.js.map +1 -1
- package/dist/core/style-packs/packs.js +2 -2
- package/dist/core/subagent-manager.js +5 -4
- package/dist/core/subagent-manager.js.map +1 -1
- package/dist/core/subagent-policy.js +4 -1
- package/dist/core/subagent-policy.js.map +1 -1
- package/dist/core/threat-feed.d.ts +65 -0
- package/dist/core/threat-feed.js +329 -0
- package/dist/core/threat-feed.js.map +1 -0
- package/dist/core/trophies/catalog-more.d.ts +2 -0
- package/dist/core/trophies/catalog-more.js +857 -0
- package/dist/core/trophies/catalog-more.js.map +1 -0
- package/dist/core/trophies/catalog.d.ts +4 -0
- package/dist/core/trophies/catalog.js +649 -0
- package/dist/core/trophies/catalog.js.map +1 -0
- package/dist/core/trophies/engine.d.ts +70 -0
- package/dist/core/trophies/engine.js +351 -0
- package/dist/core/trophies/engine.js.map +1 -0
- package/dist/core/trophies/store.d.ts +17 -0
- package/dist/core/trophies/store.js +113 -0
- package/dist/core/trophies/store.js.map +1 -0
- package/dist/core/trophies/types.d.ts +119 -0
- package/dist/core/trophies/types.js +78 -0
- package/dist/core/trophies/types.js.map +1 -0
- package/dist/core/verification-evidence.d.ts +10 -6
- package/dist/core/verification-evidence.js +190 -11
- package/dist/core/verification-evidence.js.map +1 -1
- package/dist/goals-agent/goals-agent.js +46 -3
- package/dist/goals-agent/goals-agent.js.map +1 -1
- package/dist/interactive.js +16 -5
- package/dist/interactive.js.map +1 -1
- package/dist/modes/acp-goals.d.ts +6 -2
- package/dist/modes/acp-goals.js +1 -2
- package/dist/modes/acp-goals.js.map +1 -1
- package/dist/modes/acp-mode.js +14 -3
- package/dist/modes/acp-mode.js.map +1 -1
- package/dist/modes/agent-home-mode.js +13 -1
- package/dist/modes/agent-home-mode.js.map +1 -1
- package/dist/modes/rpc-mode.d.ts +2 -1
- package/dist/modes/rpc-mode.js +15 -3
- package/dist/modes/rpc-mode.js.map +1 -1
- package/dist/modes/serve-mode.js +13 -1
- package/dist/modes/serve-mode.js.map +1 -1
- package/dist/system-prompt.d.ts +1 -0
- package/dist/system-prompt.js +12 -8
- package/dist/system-prompt.js.map +1 -1
- package/dist/test-support/slow-git.d.ts +1 -0
- package/dist/test-support/slow-git.js +21 -0
- package/dist/test-support/slow-git.js.map +1 -0
- package/dist/tools/background-watch-lint.d.ts +18 -0
- package/dist/tools/background-watch-lint.js +102 -0
- package/dist/tools/background-watch-lint.js.map +1 -0
- package/dist/tools/bash.d.ts +15 -4
- package/dist/tools/bash.js +72 -47
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/checklist.d.ts +3 -3
- package/dist/tools/compress.js +45 -0
- package/dist/tools/compress.js.map +1 -1
- package/dist/tools/edit.js +5 -0
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/generate-image.d.ts +29 -6
- package/dist/tools/generate-image.js +325 -151
- package/dist/tools/generate-image.js.map +1 -1
- package/dist/tools/grep.d.ts +14 -0
- package/dist/tools/grep.js +36 -2
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/index.d.ts +5 -1
- package/dist/tools/index.js +7 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/skill.d.ts +2 -2
- package/dist/tools/skill.js +8 -1
- package/dist/tools/skill.js.map +1 -1
- package/dist/tools/subagent-shared.js +4 -1
- package/dist/tools/subagent-shared.js.map +1 -1
- package/dist/tools/task-output.js +11 -1
- package/dist/tools/task-output.js.map +1 -1
- package/dist/tools/write.js +8 -0
- package/dist/tools/write.js.map +1 -1
- package/dist/ui/components/Footer.js +4 -0
- package/dist/ui/components/Footer.js.map +1 -1
- package/dist/ui/components/ModelSelector.d.ts +10 -0
- package/dist/ui/components/ModelSelector.js +51 -5
- package/dist/ui/components/ModelSelector.js.map +1 -1
- package/dist/ui/components/ToolExecution.js +2 -2
- package/dist/ui/components/ToolExecution.js.map +1 -1
- package/dist/ui/mcp.d.ts +2 -0
- package/dist/ui/mcp.js.map +1 -1
- package/dist/ui/terminal-history.js +2 -1
- package/dist/ui/terminal-history.js.map +1 -1
- package/dist/ui/tool-line-summary.js +3 -1
- package/dist/ui/tool-line-summary.js.map +1 -1
- package/dist/utils/git-overview.d.ts +41 -0
- package/dist/utils/git-overview.js +146 -0
- package/dist/utils/git-overview.js.map +1 -0
- package/dist/utils/git.d.ts +12 -3
- package/dist/utils/git.js +21 -8
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/image.d.ts +14 -0
- package/dist/utils/image.js +23 -0
- package/dist/utils/image.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { log } from "../logger.js";
|
|
5
|
+
import { findHideFromUser } from "../skill-scan.js";
|
|
6
|
+
const ANSI =
|
|
7
|
+
// eslint-disable-next-line no-control-regex
|
|
8
|
+
/\u001B(?:\[[0-?]*[ -/]*[@-~]|\][^\u0007\u001B]*(?:\u0007|\u001B\\)|[@-Z\\-_])|\u009B[0-?]*[ -/]*[@-~]/g;
|
|
9
|
+
// eslint-disable-next-line no-control-regex
|
|
10
|
+
const CONTROL = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F]/g;
|
|
11
|
+
/** Strip ANSI escape sequences (and stray control bytes) from server text. */
|
|
12
|
+
export function stripAnsi(text) {
|
|
13
|
+
return text.replace(ANSI, "").replace(CONTROL, "");
|
|
14
|
+
}
|
|
15
|
+
const STRONG_SECRET = /(?:~|\$HOME|%USERPROFILE%)?\/?\.ssh\b|\bid_(?:rsa|ed25519|ecdsa|dsa)|\bmcp\.json\b|\bauth\.json\b|claude_desktop_config\.json|\.aws\/credentials|\.netrc\b|\.git-credentials\b|\bsecurity\s+find-(?:generic|internet)-password\b/i;
|
|
16
|
+
const DOTENV = /(?:^|[\s'"`(/])\.env(?:\.\w+)?(?![\w-])/;
|
|
17
|
+
const READ_VERB = /\b(?:read|cat|open|load|fetch|get|retrieve|collect|grab|copy|include|attach|pass|provide|send|upload|put|insert|add)\b/i;
|
|
18
|
+
const ORDER = /\b(?:must|always|first|before\s+(?:using|calling|running|you)|make\s+sure|you\s+(?:need|have)\s+to|is\s+(?:required|necessary|mandatory)|otherwise|required)\b/i;
|
|
19
|
+
const IN_PARAM = /\b(?:pass|provide|include|put|insert|send|add)\b[^.]{0,80}\b(?:as|in|into|via|through)\s+(?:the\s+)?(?:['"`]?\w+['"`]?\s+)?(?:param(?:eter)?|argument|arg|field|sidenote|note|input)\b/i;
|
|
20
|
+
const IMPORTANT_BLOCK = /<\s*(?:important|system|instructions?|critical|admin|secret|hidden)\s*>|\[\s*(?:important|system)\s*\]/i;
|
|
21
|
+
const OTHER_TOOLS = /\b(?:other|another|any|all|every|each)\s+(?:\w+\s+)?tools?\b|\btools?\s+(?:from|on|of)\s+(?:other|another)\b|\bmcp__\w+/i;
|
|
22
|
+
const REDIRECT = /\b(?:always|must|instead|whenever|before|after|also|never|override|replace|redirect|bcc|cc|send\s+a\s+copy|forward)\b/i;
|
|
23
|
+
function sentences(text) {
|
|
24
|
+
return text.split(/(?<=[.!?])\s+|\n+/).filter((s) => s.trim() !== "");
|
|
25
|
+
}
|
|
26
|
+
/** Identifiers distinctive enough to count as a deliberate tool reference. */
|
|
27
|
+
function distinctive(name) {
|
|
28
|
+
return name.length >= 5 && /[_-]|[a-z][A-Z]/.test(name);
|
|
29
|
+
}
|
|
30
|
+
function mentionsTool(text, name) {
|
|
31
|
+
// Cheap substring gate: building a RegExp per (tool × description) pair
|
|
32
|
+
// cost ~30 ms for 200 tools against 200 known tools.
|
|
33
|
+
if (!text.includes(name))
|
|
34
|
+
return false;
|
|
35
|
+
const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
36
|
+
return new RegExp(`(?<![\\w-])${escaped}(?![\\w-])`).test(text);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Check one cleaned description. `ownTools` are this server's names;
|
|
40
|
+
* `otherTools` maps each other known server's tool names (for shadowing).
|
|
41
|
+
*/
|
|
42
|
+
export function checkToolDescription(description, ownTools, otherTools) {
|
|
43
|
+
for (const s of sentences(description)) {
|
|
44
|
+
const strong = STRONG_SECRET.test(s);
|
|
45
|
+
const env = DOTENV.test(s);
|
|
46
|
+
if ((strong || env) && READ_VERB.test(s) && (ORDER.test(s) || IN_PARAM.test(s))) {
|
|
47
|
+
return { rule: "secret-read", reason: "orders reading secret files or config" };
|
|
48
|
+
}
|
|
49
|
+
if (strong && IN_PARAM.test(s)) {
|
|
50
|
+
return { rule: "secret-read", reason: "asks for secret files in a parameter" };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const hide = findHideFromUser(description);
|
|
54
|
+
if (hide)
|
|
55
|
+
return {
|
|
56
|
+
rule: "hide-from-user",
|
|
57
|
+
reason: `tells the model to hide things from the user ("${hide}")`,
|
|
58
|
+
};
|
|
59
|
+
for (const [tool, server] of otherTools) {
|
|
60
|
+
if (ownTools.has(tool) || !distinctive(tool))
|
|
61
|
+
continue;
|
|
62
|
+
if (!mentionsTool(description, tool))
|
|
63
|
+
continue;
|
|
64
|
+
const near = sentences(description).some((s) => mentionsTool(s, tool) && REDIRECT.test(s));
|
|
65
|
+
if (near || IMPORTANT_BLOCK.test(description)) {
|
|
66
|
+
return { rule: "shadowing", reason: `redirects "${tool}" from server "${server}"` };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (IMPORTANT_BLOCK.test(description)) {
|
|
70
|
+
const external = [
|
|
71
|
+
...description.matchAll(/`?\b([a-zA-Z][\w-]{4,})\b`?\s+tool\b|\btool\s+[`'"]([\w-]{5,})[`'"]/g),
|
|
72
|
+
]
|
|
73
|
+
.map((m) => m[1] ?? m[2] ?? "")
|
|
74
|
+
.some((n) => distinctive(n) && !ownTools.has(n));
|
|
75
|
+
if (external || OTHER_TOOLS.test(description) || STRONG_SECRET.test(description)) {
|
|
76
|
+
return {
|
|
77
|
+
rule: "important-block",
|
|
78
|
+
reason: "<IMPORTANT>-style block instructs the model about other tools",
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
function hashDescription(text) {
|
|
85
|
+
return crypto.createHash("sha256").update(text).digest("hex").slice(0, 32);
|
|
86
|
+
}
|
|
87
|
+
function isRecord(v) {
|
|
88
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
89
|
+
}
|
|
90
|
+
function parsePins(raw) {
|
|
91
|
+
const out = { version: 1, servers: {} };
|
|
92
|
+
if (!isRecord(raw) || !isRecord(raw.servers))
|
|
93
|
+
return out;
|
|
94
|
+
for (const [name, entry] of Object.entries(raw.servers)) {
|
|
95
|
+
if (!isRecord(entry) || typeof entry.serverVersion !== "string" || !isRecord(entry.tools))
|
|
96
|
+
continue;
|
|
97
|
+
const tools = {};
|
|
98
|
+
for (const [tool, hash] of Object.entries(entry.tools)) {
|
|
99
|
+
if (typeof hash === "string")
|
|
100
|
+
tools[tool] = hash;
|
|
101
|
+
}
|
|
102
|
+
out.servers[name] = { serverVersion: entry.serverVersion, tools };
|
|
103
|
+
}
|
|
104
|
+
return out;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Pins tool descriptions per server in a JSON file under the GG dir and
|
|
108
|
+
* filters each arriving tool list. One instance per manager; the file is the
|
|
109
|
+
* shared truth across sessions and pooled connections.
|
|
110
|
+
*/
|
|
111
|
+
export class McpToolGuard {
|
|
112
|
+
filePath;
|
|
113
|
+
writeQueue = Promise.resolve();
|
|
114
|
+
constructor(filePath) {
|
|
115
|
+
this.filePath = filePath;
|
|
116
|
+
}
|
|
117
|
+
async readPins() {
|
|
118
|
+
try {
|
|
119
|
+
return parsePins(JSON.parse(await fs.readFile(this.filePath, "utf-8")));
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return { version: 1, servers: {} };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Filter a server's tool list. Returns the tools to expose (descriptions
|
|
127
|
+
* ANSI-stripped, order preserved) and the hidden ones with one-line reasons.
|
|
128
|
+
*/
|
|
129
|
+
async filter(server, serverVersion, tools) {
|
|
130
|
+
let result = { tools: [], hidden: [] };
|
|
131
|
+
// Serialize read-modify-write so concurrent servers don't clobber pins.
|
|
132
|
+
const run = this.writeQueue.then(async () => {
|
|
133
|
+
result = await this.filterLocked(server, serverVersion ?? "", tools);
|
|
134
|
+
});
|
|
135
|
+
this.writeQueue = run.catch(() => undefined);
|
|
136
|
+
await run;
|
|
137
|
+
for (const h of result.hidden) {
|
|
138
|
+
log("WARN", "mcp", hiddenToolMessage(h), { rule: h.rule });
|
|
139
|
+
}
|
|
140
|
+
return result;
|
|
141
|
+
}
|
|
142
|
+
async filterLocked(server, serverVersion, tools) {
|
|
143
|
+
const pins = await this.readPins();
|
|
144
|
+
const previous = pins.servers[server];
|
|
145
|
+
const rebaseline = !previous || previous.serverVersion !== serverVersion;
|
|
146
|
+
const nextPins = rebaseline ? {} : { ...previous.tools };
|
|
147
|
+
const ownTools = new Set(tools.map((t) => t.name));
|
|
148
|
+
const otherTools = new Map();
|
|
149
|
+
for (const [name, entry] of Object.entries(pins.servers).sort(([a], [b]) => a.localeCompare(b))) {
|
|
150
|
+
if (name === server)
|
|
151
|
+
continue;
|
|
152
|
+
for (const tool of Object.keys(entry.tools))
|
|
153
|
+
if (!otherTools.has(tool))
|
|
154
|
+
otherTools.set(tool, name);
|
|
155
|
+
}
|
|
156
|
+
const kept = [];
|
|
157
|
+
const hidden = [];
|
|
158
|
+
for (const tool of tools) {
|
|
159
|
+
const rawDescription = tool.description ?? "";
|
|
160
|
+
const hash = hashDescription(rawDescription);
|
|
161
|
+
const pinned = nextPins[tool.name];
|
|
162
|
+
// Keep the original pin on a mismatch so the tool stays hidden until a
|
|
163
|
+
// version bump, rather than the new text becoming trusted next connect.
|
|
164
|
+
if (pinned === undefined)
|
|
165
|
+
nextPins[tool.name] = hash;
|
|
166
|
+
if (stripAnsi(tool.name) !== tool.name || /\s/.test(tool.name)) {
|
|
167
|
+
hidden.push({
|
|
168
|
+
server,
|
|
169
|
+
tool: stripAnsi(tool.name),
|
|
170
|
+
rule: "bad-name",
|
|
171
|
+
reason: "tool name contains control characters",
|
|
172
|
+
});
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
if (!rebaseline && pinned !== undefined && pinned !== hash) {
|
|
176
|
+
hidden.push({
|
|
177
|
+
server,
|
|
178
|
+
tool: tool.name,
|
|
179
|
+
rule: "rug-pull",
|
|
180
|
+
reason: `description changed without a server version change (${serverVersion || "no version"})`,
|
|
181
|
+
});
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
const description = stripAnsi(rawDescription);
|
|
185
|
+
const verdict = checkToolDescription(description, ownTools, otherTools);
|
|
186
|
+
if (verdict) {
|
|
187
|
+
hidden.push({ server, tool: tool.name, ...verdict });
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
kept.push(description === rawDescription ? tool : { ...tool, description });
|
|
191
|
+
}
|
|
192
|
+
const changed = rebaseline || Object.keys(nextPins).length !== Object.keys(previous?.tools ?? {}).length;
|
|
193
|
+
if (changed) {
|
|
194
|
+
pins.servers[server] = { serverVersion, tools: nextPins };
|
|
195
|
+
try {
|
|
196
|
+
await fs.mkdir(path.dirname(this.filePath), { recursive: true, mode: 0o700 });
|
|
197
|
+
await fs.writeFile(this.filePath, JSON.stringify(pins, null, 2), {
|
|
198
|
+
encoding: "utf-8",
|
|
199
|
+
mode: 0o600,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
log("WARN", "mcp", "failed to persist MCP tool pins", {
|
|
204
|
+
message: err instanceof Error ? err.message : String(err),
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return { tools: kept, hidden };
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/** One plain line: which tool is hidden, and why. */
|
|
212
|
+
export function hiddenToolMessage(h) {
|
|
213
|
+
return `MCP tool "${h.tool}" from server "${h.server}" hidden: ${h.reason}.`;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=tool-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-guard.js","sourceRoot":"","sources":["../../../src/core/mcp/tool-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Network egress allowlist.
|
|
3
|
-
*
|
|
4
|
-
* Two layers, with very different strength:
|
|
5
|
-
*
|
|
6
|
-
* 1. **Real enforcement** — the agent's own egress paths (`web-fetch`,
|
|
7
|
-
* `web-search`) check every request URL and every redirect hop against the
|
|
8
|
-
* allowlist. Nothing gets out of those tools to a disallowed host.
|
|
9
|
-
*
|
|
10
|
-
* 2. **Defence in depth (bypassable by design)** — {@link extractCommandHosts}
|
|
11
|
-
* recognises the common network command shapes (`curl`, `wget`, `git`,
|
|
12
|
-
* `ssh`/`scp`, package installs) so `bash` can refuse an obvious egress to a
|
|
13
|
-
* disallowed host. It is *not* a sandbox: `python -c`, a shell variable, a
|
|
14
|
-
* base64'd URL, or any unrecognised tool walks straight past it. It exists
|
|
15
|
-
* to catch accidents, not to contain a hostile model. Real containment needs
|
|
16
|
-
* OS-level enforcement (sandbox-exec, Landlock/seccomp, a netns proxy).
|
|
17
|
-
*
|
|
18
|
-
* Deliberately allow-shaped, not deny-shaped: a command with no recognised host
|
|
19
|
-
* is never blocked, so ordinary work is unaffected.
|
|
20
|
-
*/
|
|
21
1
|
/** Host pattern match: exact, or `*.example.com` matching any subdomain. */
|
|
22
2
|
export declare function isHostAllowed(host: string, allow: readonly string[]): boolean;
|
|
23
3
|
/** Hostname of a URL-ish token, or undefined when it isn't one. */
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* Deliberately allow-shaped, not deny-shaped: a command with no recognised host
|
|
19
19
|
* is never blocked, so ordinary work is unaffected.
|
|
20
20
|
*/
|
|
21
|
+
import { urlExfilBlockMessage } from "./action-threats.js";
|
|
21
22
|
/** Host pattern match: exact, or `*.example.com` matching any subdomain. */
|
|
22
23
|
export function isHostAllowed(host, allow) {
|
|
23
24
|
const target = host.trim().toLowerCase().replace(/\.$/, "");
|
|
@@ -193,6 +194,11 @@ export function checkUrlNetwork(url, mode, allow) {
|
|
|
193
194
|
}
|
|
194
195
|
/** Check a URL against a possibly-absent policy. */
|
|
195
196
|
export function checkUrlPolicy(url, getPolicy) {
|
|
197
|
+
// Exfil channels (collection hosts, credential literals) are refused under
|
|
198
|
+
// every policy, including "off".
|
|
199
|
+
const exfil = urlExfilBlockMessage(url);
|
|
200
|
+
if (exfil)
|
|
201
|
+
return exfil;
|
|
196
202
|
const policy = getPolicy?.();
|
|
197
203
|
if (!policy)
|
|
198
204
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-guard.js","sourceRoot":"","sources":["../../src/core/network-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"network-guard.js","sourceRoot":"","sources":["../../src/core/network-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export type PackageManager = "npm" | "pnpm" | "yarn" | "bun" | "pip" | "uv";
|
|
2
|
+
/** How to spawn `<manager> --version`. Windows: npm/pnpm/yarn are `.cmd` shims, which need a shell. */
|
|
3
|
+
export declare function versionSpawn(manager: PackageManager, platform?: NodeJS.Platform): {
|
|
4
|
+
file: string;
|
|
5
|
+
args: string[];
|
|
6
|
+
shell: boolean;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* `<manager> --version`, once per process (yarn: once per directory, since
|
|
10
|
+
* berry is pinned per project); null when missing.
|
|
11
|
+
*/
|
|
12
|
+
export declare function managerVersion(manager: PackageManager, cwd?: string): Promise<string | null>;
|
|
13
|
+
/** Whether `manager` at `version` honours the cooldown we apply. */
|
|
14
|
+
export declare function hasNativeCooldown(manager: PackageManager, version: string | null): boolean;
|
|
15
|
+
/** Package managers a command mentions (cheap regex, no spawn). */
|
|
16
|
+
export declare function mentionedManagers(command: string): PackageManager[];
|
|
17
|
+
/** Cheap regex: could this command install packages? Non-installs skip every spawn and file read. */
|
|
18
|
+
export declare function mayInstall(command: string): boolean;
|
|
19
|
+
export declare function uvResolves(command: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Whether installs here may come from a registry other than public npm
|
|
22
|
+
* (command `--registry`, `npm_config_registry`, a `registry=` /
|
|
23
|
+
* `@scope:registry=` line in .npmrc up the tree or in ~/.npmrc,
|
|
24
|
+
* `npmRegistryServer` in .yarnrc.yml). Cheap sync reads, install commands only.
|
|
25
|
+
*/
|
|
26
|
+
export declare function usesCustomNpmRegistry(command: string, cwd: string, env?: NodeJS.ProcessEnv): boolean;
|
|
27
|
+
/** Whether pip/uv may install from an index other than PyPI (flags, env, pip.conf). */
|
|
28
|
+
export declare function usesCustomPypiIndex(command: string, env?: NodeJS.ProcessEnv): boolean;
|
|
29
|
+
export interface CooldownEnvOptions {
|
|
30
|
+
days: number;
|
|
31
|
+
now: number;
|
|
32
|
+
cwd: string;
|
|
33
|
+
/** Detected versions; a manager without one gets nothing (avoids unknown-config warnings/errors). */
|
|
34
|
+
versions: Partial<Record<PackageManager, string | null>>;
|
|
35
|
+
/** Environment to read registry settings from (default process.env). */
|
|
36
|
+
env?: NodeJS.ProcessEnv;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Cooldown environment variables for `command`:
|
|
40
|
+
* - npm `min-release-age` (days), npm ≥ 11.10 only (older npm warns on it).
|
|
41
|
+
* - pnpm `minimum-release-age` (minutes) via npm_config_, only when the
|
|
42
|
+
* command runs pnpm (npm warns on this key).
|
|
43
|
+
* - yarn berry ≥ 4.10 `YARN_NPM_MINIMAL_AGE_GATE` (minutes).
|
|
44
|
+
* - pip `PIP_UPLOADED_PRIOR_TO` relative ISO duration (older pip ignores it).
|
|
45
|
+
* - uv `UV_EXCLUDE_NEWER` absolute timestamp: always without `uv.lock`; with
|
|
46
|
+
* one only for resolving commands (plain `uv sync`/`uv run` keep the lock;
|
|
47
|
+
* the lockfile check covers those).
|
|
48
|
+
*/
|
|
49
|
+
export declare function packageCooldownEnv(command: string, opts: CooldownEnvOptions): Record<string, string>;
|
|
50
|
+
/**
|
|
51
|
+
* bun has no env setting: append `--minimum-release-age=<seconds>` to each
|
|
52
|
+
* `bun install/add/update` / `bunx` (bun ≥ 1.3, only when not already given).
|
|
53
|
+
*/
|
|
54
|
+
export declare function bunCooldownCommand(command: string, days: number, version: string | null): string;
|
|
55
|
+
/**
|
|
56
|
+
* Prefix each package-manager invocation with its own cooldown variable from
|
|
57
|
+
* `env` (`npm i` → `npm_config_min_release_age=2 npm i`). Used where one
|
|
58
|
+
* long-lived shell serves every command.
|
|
59
|
+
*/
|
|
60
|
+
export declare function scopeCooldown(command: string, env: Record<string, string>): string;
|
|
61
|
+
/** Detect versions of the managers a command mentions (cached; nothing for non-installs). */
|
|
62
|
+
export declare function detectMentionedVersions(command: string, cwd?: string): Promise<Partial<Record<PackageManager, string | null>>>;
|
|
63
|
+
/**
|
|
64
|
+
* One plain line explaining a failed install the cooldown caused, so the
|
|
65
|
+
* agent doesn't misread a cryptic ETARGET / "no candidates". Null otherwise.
|
|
66
|
+
*/
|
|
67
|
+
export declare function cooldownFailureHint(output: string, days: number): string | null;
|
|
68
|
+
/** Test hook. */
|
|
69
|
+
export declare function clearManagerVersionCache(): void;
|
|
70
|
+
/** Cooldown env for an MCP stdio launch (`npx …`/`uvx …`); {} for anything else. */
|
|
71
|
+
export declare function launchCooldownEnv(command: string, args: readonly string[], cwd: string, days?: number): Promise<Record<string, string>>;
|