mindweave 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -4
- package/dist/alternator/chassis/lsp.js +36 -4
- package/dist/alternator/chassis/lsp.js.map +1 -1
- package/dist/alternator/chassis/provision.js +54 -6
- package/dist/alternator/chassis/provision.js.map +1 -1
- package/dist/alternator/chassis/servers.js +34 -21
- package/dist/alternator/chassis/servers.js.map +1 -1
- package/dist/cli/App.js +6 -6
- package/dist/cli/App.js.map +1 -1
- package/dist/cli/attachments.js +37 -1
- package/dist/cli/attachments.js.map +1 -1
- package/dist/cli/bootstrap.js +25 -3
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/components/FirstRunFrame.js +1 -1
- package/dist/cli/components/MarathonBox.js +2 -1
- package/dist/cli/components/MarathonBox.js.map +1 -1
- package/dist/cli/marathonUi.js +2 -0
- package/dist/cli/marathonUi.js.map +1 -1
- package/dist/cli/startupArgs.js +1 -1
- package/dist/core/permissions.js +26 -1
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/spendView.js +8 -1
- package/dist/core/spendView.js.map +1 -1
- package/dist/core/turnRunner.js +28 -2
- package/dist/core/turnRunner.js.map +1 -1
- package/dist/drivers/deepseek/inlineTools.js +36 -2
- package/dist/drivers/deepseek/inlineTools.js.map +1 -1
- package/dist/drivers/ollama/endpoint.js +25 -0
- package/dist/drivers/ollama/endpoint.js.map +1 -1
- package/dist/dynamo/engine.js +408 -88
- package/dist/dynamo/engine.js.map +1 -1
- package/dist/dynamo/guard.js +11 -4
- package/dist/dynamo/guard.js.map +1 -1
- package/dist/dynamo/hooks.js +209 -0
- package/dist/dynamo/hooks.js.map +1 -0
- package/dist/dynamo/marathon.js +67 -10
- package/dist/dynamo/marathon.js.map +1 -1
- package/dist/dynamo/todoReminder.js +26 -0
- package/dist/dynamo/todoReminder.js.map +1 -0
- package/dist/governor/forbidden.js +19 -0
- package/dist/governor/forbidden.js.map +1 -1
- package/dist/governor/freshness.js +1 -1
- package/dist/governor/freshness.js.map +1 -1
- package/dist/governor/index.js +8 -1
- package/dist/governor/index.js.map +1 -1
- package/dist/governor/rules.js +1 -0
- package/dist/governor/rules.js.map +1 -1
- package/dist/governor/write.js +50 -2
- package/dist/governor/write.js.map +1 -1
- package/dist/mcp/config.js +0 -41
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/projectApproval.js +117 -0
- package/dist/mcp/projectApproval.js.map +1 -0
- package/dist/mcp/resultStore.js +19 -5
- package/dist/mcp/resultStore.js.map +1 -1
- package/dist/mcp/transport/stdio.js +4 -1
- package/dist/mcp/transport/stdio.js.map +1 -1
- package/dist/memory/allMetas.js +1 -1
- package/dist/memory/allMetas.js.map +1 -1
- package/dist/memory/autoMemory.js +1 -0
- package/dist/memory/autoMemory.js.map +1 -1
- package/dist/memory/clearedArchive.js +120 -0
- package/dist/memory/clearedArchive.js.map +1 -0
- package/dist/memory/compaction.js +154 -14
- package/dist/memory/compaction.js.map +1 -1
- package/dist/memory/counters.js +64 -0
- package/dist/memory/counters.js.map +1 -0
- package/dist/memory/projectNotes.js +61 -13
- package/dist/memory/projectNotes.js.map +1 -1
- package/dist/memory/rewind.js +6 -2
- package/dist/memory/rewind.js.map +1 -1
- package/dist/memory/session.js +13 -5
- package/dist/memory/session.js.map +1 -1
- package/dist/memory/sessionMemory.js +6 -2
- package/dist/memory/sessionMemory.js.map +1 -1
- package/dist/memory/store.js +3 -0
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/workingSet.js +0 -375
- package/dist/memory/workingSet.js.map +1 -1
- package/dist/project/context.js +54 -7
- package/dist/project/context.js.map +1 -1
- package/dist/tools/approval.js +19 -4
- package/dist/tools/approval.js.map +1 -1
- package/dist/tools/backgroundShells.js +8 -1
- package/dist/tools/backgroundShells.js.map +1 -1
- package/dist/tools/browser.js +2 -1
- package/dist/tools/browser.js.map +1 -1
- package/dist/tools/checkpoints.js +28 -4
- package/dist/tools/checkpoints.js.map +1 -1
- package/dist/tools/childEnv.js +50 -0
- package/dist/tools/childEnv.js.map +1 -0
- package/dist/tools/codeIntel.js +4 -1
- package/dist/tools/codeIntel.js.map +1 -1
- package/dist/tools/commandParse.js +238 -0
- package/dist/tools/commandParse.js.map +1 -0
- package/dist/tools/commandPolicy.js +283 -0
- package/dist/tools/commandPolicy.js.map +1 -0
- package/dist/tools/edit.js +2 -1
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/editRipple.js +18 -3
- package/dist/tools/editRipple.js.map +1 -1
- package/dist/tools/editTarget.js +11 -6
- package/dist/tools/editTarget.js.map +1 -1
- package/dist/tools/governorTools.js +61 -1
- package/dist/tools/governorTools.js.map +1 -1
- package/dist/tools/grep.js +13 -5
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/guard.js +249 -2
- package/dist/tools/guard.js.map +1 -1
- package/dist/tools/invisible.js +62 -0
- package/dist/tools/invisible.js.map +1 -0
- package/dist/tools/killTree.js +3 -0
- package/dist/tools/killTree.js.map +1 -1
- package/dist/tools/readFile.js +2 -2
- package/dist/tools/readFile.js.map +1 -1
- package/dist/tools/readSymbol.js +5 -24
- package/dist/tools/readSymbol.js.map +1 -1
- package/dist/tools/replaceSymbol.js +1 -1
- package/dist/tools/replaceSymbol.js.map +1 -1
- package/dist/tools/ripgrepShell.js +56 -0
- package/dist/tools/ripgrepShell.js.map +1 -0
- package/dist/tools/runCommand.js +74 -15
- package/dist/tools/runCommand.js.map +1 -1
- package/dist/tools/runsLater.js +50 -0
- package/dist/tools/runsLater.js.map +1 -0
- package/dist/tools/serverConsent.js +27 -0
- package/dist/tools/serverConsent.js.map +1 -0
- package/dist/tools/ui.js +27 -0
- package/dist/tools/ui.js.map +1 -1
- package/dist/tools/untrusted.js +22 -1
- package/dist/tools/untrusted.js.map +1 -1
- package/dist/tools/viewImage.js +2 -2
- package/dist/tools/viewImage.js.map +1 -1
- package/dist/tools/webFetch.js +76 -8
- package/dist/tools/webFetch.js.map +1 -1
- package/dist/tools/workspace.js +87 -24
- package/dist/tools/workspace.js.map +1 -1
- package/dist/tools/writeFile.js +9 -4
- package/dist/tools/writeFile.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* commandPolicy.ts — decisions about a shell command, made from the commands it contains.
|
|
3
|
+
*
|
|
4
|
+
* Built on commandParse.ts. Three things, each of which regular expressions over the raw
|
|
5
|
+
* text could not do:
|
|
6
|
+
*
|
|
7
|
+
* 1. Which commands are plainly harmless, so Sentinel mode does not ask about them.
|
|
8
|
+
* Every run_command was a question, which teaches people to answer "yes" without
|
|
9
|
+
* reading. A command is waved through only when EVERY part of it is a known
|
|
10
|
+
* read-only command with arguments that cannot write or run anything, nothing in it
|
|
11
|
+
* is expanded or unreadable, and it writes no file. Anything else keeps its question.
|
|
12
|
+
* 2. The user's own rules by command prefix: allow, prompt or forbid, with a reason the
|
|
13
|
+
* model is shown ("use X instead").
|
|
14
|
+
* 3. Which protected file a command NAMES, whatever it does with it. The old check only
|
|
15
|
+
* knew the verbs `cat` and `type`, so `cp .env notes.txt` followed by reading the copy,
|
|
16
|
+
* or `curl -F f=@key.pem`, got a secret out. Naming a protected path as something to
|
|
17
|
+
* read, copy out or send is refused; naming it as a destination, or as the target of
|
|
18
|
+
* a listing or a deletion, is not.
|
|
19
|
+
*/
|
|
20
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
21
|
+
import { homedir } from "node:os";
|
|
22
|
+
import { isAbsolute, join, resolve } from "node:path";
|
|
23
|
+
import { parseCommand, verbOf } from "./commandParse.js";
|
|
24
|
+
import { expandHomeWords, guardedPathReason, protectedPathReason } from "./guard.js";
|
|
25
|
+
/** Parse command-rules.md (pure). Lines starting with # and malformed lines are ignored. */
|
|
26
|
+
export function parseCommandRules(text) {
|
|
27
|
+
const rules = [];
|
|
28
|
+
for (const raw of text.split(/\r?\n/)) {
|
|
29
|
+
const line = raw.trim();
|
|
30
|
+
if (!line || line.startsWith("#"))
|
|
31
|
+
continue;
|
|
32
|
+
const [head, ...why] = line.split("::");
|
|
33
|
+
const parts = head.trim().split(/\s+/);
|
|
34
|
+
const decision = parts.shift()?.toLowerCase();
|
|
35
|
+
const alias = decision === "forbidden" ? "forbid" : decision === "ask" ? "prompt" : decision;
|
|
36
|
+
if (alias !== "allow" && alias !== "prompt" && alias !== "forbid")
|
|
37
|
+
continue;
|
|
38
|
+
if (parts.length === 0)
|
|
39
|
+
continue;
|
|
40
|
+
const justification = why.join("::").trim();
|
|
41
|
+
rules.push({ decision: alias, words: parts, ...(justification ? { justification } : {}) });
|
|
42
|
+
}
|
|
43
|
+
return rules;
|
|
44
|
+
}
|
|
45
|
+
const same = (a, b) => a.toLowerCase() === b.toLowerCase();
|
|
46
|
+
/** Does `rule` apply to `cmd`? The program must match, and then the next words in order. */
|
|
47
|
+
export function ruleMatches(rule, cmd) {
|
|
48
|
+
if (rule.words.length === 0 || cmd.words.length < rule.words.length)
|
|
49
|
+
return false;
|
|
50
|
+
if (!same(verbOf({ ...cmd, words: [rule.words[0]] }), verbOf(cmd)))
|
|
51
|
+
return false;
|
|
52
|
+
return rule.words.slice(1).every((w, i) => same(w, cmd.words[i + 1] ?? ""));
|
|
53
|
+
}
|
|
54
|
+
export function ruleVerdict(parsed, rules) {
|
|
55
|
+
let forbid;
|
|
56
|
+
let prompt;
|
|
57
|
+
let allAllowed = parsed.commands.length > 0;
|
|
58
|
+
for (const cmd of parsed.commands) {
|
|
59
|
+
const hits = rules.filter((r) => ruleMatches(r, cmd));
|
|
60
|
+
forbid ??= hits.find((r) => r.decision === "forbid");
|
|
61
|
+
prompt ??= hits.find((r) => r.decision === "prompt");
|
|
62
|
+
// A prompt or forbid rule on the same command beats an allow.
|
|
63
|
+
if (!hits.some((r) => r.decision === "allow") || hits.some((r) => r.decision !== "allow"))
|
|
64
|
+
allAllowed = false;
|
|
65
|
+
}
|
|
66
|
+
return { ...(forbid ? { forbid } : {}), ...(prompt ? { prompt } : {}), allAllowed };
|
|
67
|
+
}
|
|
68
|
+
const anyArgs = () => true;
|
|
69
|
+
/** True when no argument is one of `bad` (also as `--flag=value`). */
|
|
70
|
+
const without = (...bad) => (args) => !args.some((a) => bad.some((b) => a.toLowerCase() === b || a.toLowerCase().startsWith(`${b}=`)));
|
|
71
|
+
/** At most `n` words that are not options: `uniq in out` would write `out`. */
|
|
72
|
+
const positionalsAtMost = (n) => (args) => args.filter((a) => !a.startsWith("-")).length <= n;
|
|
73
|
+
const READ_ONLY = {
|
|
74
|
+
// listing and printing
|
|
75
|
+
ls: anyArgs, dir: anyArgs, pwd: anyArgs, echo: anyArgs, printf: anyArgs, cat: anyArgs, type: anyArgs,
|
|
76
|
+
head: anyArgs, tail: anyArgs, wc: anyArgs, nl: anyArgs, cut: anyArgs, tr: anyArgs, stat: anyArgs, file: anyArgs,
|
|
77
|
+
du: anyArgs, df: anyArgs, tree: anyArgs, which: anyArgs, where: anyArgs, whoami: anyArgs, hostname: anyArgs,
|
|
78
|
+
uname: anyArgs, id: anyArgs, ps: anyArgs, basename: anyArgs, dirname: anyArgs, realpath: anyArgs, readlink: anyArgs,
|
|
79
|
+
cmp: anyArgs, diff: anyArgs, jq: anyArgs,
|
|
80
|
+
uniq: positionalsAtMost(1),
|
|
81
|
+
sort: without("-o", "--output"),
|
|
82
|
+
date: without("-s", "--set"),
|
|
83
|
+
grep: anyArgs, egrep: anyArgs, fgrep: anyArgs,
|
|
84
|
+
rg: without("--pre", "--hostname-bin"),
|
|
85
|
+
find: without("-exec", "-execdir", "-ok", "-okdir", "-delete", "-fprint", "-fprint0", "-fprintf", "-fls"),
|
|
86
|
+
// PowerShell
|
|
87
|
+
"get-childitem": noEnvDrive, gci: noEnvDrive,
|
|
88
|
+
"get-content": anyArgs, gc: anyArgs,
|
|
89
|
+
"get-location": anyArgs, gl: anyArgs,
|
|
90
|
+
"get-item": noEnvDrive, gi: noEnvDrive, "get-itemproperty": noEnvDrive, gp: noEnvDrive,
|
|
91
|
+
"test-path": anyArgs, "resolve-path": anyArgs, rvpa: anyArgs,
|
|
92
|
+
"select-string": anyArgs, sls: anyArgs,
|
|
93
|
+
"measure-object": anyArgs, measure: anyArgs, "select-object": anyArgs, select: anyArgs,
|
|
94
|
+
"sort-object": anyArgs, "group-object": anyArgs, group: anyArgs,
|
|
95
|
+
"format-list": anyArgs, fl: anyArgs, "format-table": anyArgs, ft: anyArgs, "out-string": anyArgs,
|
|
96
|
+
"get-process": anyArgs, gps: anyArgs, "get-service": anyArgs, "get-command": anyArgs, gcm: anyArgs,
|
|
97
|
+
"get-date": anyArgs, "get-help": anyArgs, "get-filehash": anyArgs,
|
|
98
|
+
"write-output": anyArgs, "write-host": anyArgs, write: anyArgs,
|
|
99
|
+
"split-path": anyArgs, "join-path": anyArgs, "compare-object": anyArgs,
|
|
100
|
+
"convertto-json": anyArgs, "convertfrom-json": anyArgs, "where-object": anyArgs,
|
|
101
|
+
};
|
|
102
|
+
/** `Get-ChildItem Env:` lists the environment. */
|
|
103
|
+
function noEnvDrive(args) {
|
|
104
|
+
return !args.some((a) => /^(env|variable|function|alias):?/i.test(a.replace(/^-(path|literalpath)[:=]?/i, "")));
|
|
105
|
+
}
|
|
106
|
+
/** git subcommands that only read, with the options each must not be given. */
|
|
107
|
+
const GIT_READ_ONLY = {
|
|
108
|
+
status: anyArgs, log: anyArgs, diff: anyArgs, show: anyArgs, "ls-files": anyArgs, "ls-tree": anyArgs,
|
|
109
|
+
"rev-parse": anyArgs, "rev-list": anyArgs, describe: anyArgs, blame: anyArgs, shortlog: anyArgs,
|
|
110
|
+
"cat-file": anyArgs, grep: anyArgs, "name-rev": anyArgs, "merge-base": anyArgs, "diff-tree": anyArgs,
|
|
111
|
+
"show-ref": anyArgs, "check-ignore": anyArgs, "count-objects": anyArgs, whatchanged: anyArgs,
|
|
112
|
+
reflog: (args) => !args.some((a) => /^(expire|delete)$/.test(a)),
|
|
113
|
+
remote: (args) => args.length === 0 || args.every((a) => a === "-v" || a === "--verbose") || /^(show|get-url)$/.test(args[0] ?? ""),
|
|
114
|
+
branch: (args) => args.every((a) => /^(-a|-r|-v|-vv|--all|--remotes|--list|--show-current|--verbose|--merged|--no-merged|--contains)$/.test(a)),
|
|
115
|
+
tag: (args) => args.every((a) => /^(-l|--list|-n\d*|--sort=.*)$/.test(a)),
|
|
116
|
+
stash: (args) => /^(list|show)$/.test(args[0] ?? ""),
|
|
117
|
+
worktree: (args) => args[0] === "list",
|
|
118
|
+
};
|
|
119
|
+
/** Options that make an otherwise read-only git command write or run a program. */
|
|
120
|
+
const GIT_BAD_OPTIONS = ["--output", "--ext-diff", "--textconv", "--exec", "--upload-pack", "--receive-pack", "--open-files-in-pager"];
|
|
121
|
+
function gitReadOnly(cmd, gitConfigSafe) {
|
|
122
|
+
if (!gitConfigSafe)
|
|
123
|
+
return false;
|
|
124
|
+
const [, sub, ...args] = cmd.words;
|
|
125
|
+
if (sub === "--version" || sub === "version")
|
|
126
|
+
return args.length === 0;
|
|
127
|
+
const check = sub ? GIT_READ_ONLY[sub] : undefined;
|
|
128
|
+
return !!check && without(...GIT_BAD_OPTIONS)(args) && check(args);
|
|
129
|
+
}
|
|
130
|
+
/** Is this one command a known read-only command, given what it is passed? */
|
|
131
|
+
export function isReadOnly(cmd, gitConfigSafe) {
|
|
132
|
+
if (cmd.writes.length > 0 || cmd.expands || cmd.words.length === 0)
|
|
133
|
+
return false;
|
|
134
|
+
const verb = verbOf(cmd);
|
|
135
|
+
if (verb === "git")
|
|
136
|
+
return gitReadOnly(cmd, gitConfigSafe);
|
|
137
|
+
const check = READ_ONLY[verb];
|
|
138
|
+
return !!check && check(cmd.words.slice(1));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Whether git in `cwd` would run a program from the repository's own config just to answer a
|
|
142
|
+
* read-only question (fsmonitor, a pager, an external diff or textconv, a filter). A repo that
|
|
143
|
+
* arrived with such a config makes even `git status` a way to run code, so its git commands keep
|
|
144
|
+
* their question. True when it cannot be told: a worktree file, an unreadable config.
|
|
145
|
+
*/
|
|
146
|
+
export function gitConfigRunsPrograms(cwd) {
|
|
147
|
+
const dotGit = join(cwd, ".git");
|
|
148
|
+
if (!existsSync(dotGit))
|
|
149
|
+
return false; // not a repository: git reads only the user's own config
|
|
150
|
+
try {
|
|
151
|
+
const text = readFileSync(join(dotGit, "config"), "utf8");
|
|
152
|
+
return /^\s*(fsmonitor|pager|sshcommand|editor|askpass|external|textconv|command|clean|smudge|process|program|hookspath|path)\s*=|^\s*\[(include|includeIf)\b/im.test(text);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Sentinel's question can be skipped: every part of the command is read-only or allowed by
|
|
160
|
+
* a user rule, and nothing in it is unreadable. Never true for a command this reader cannot
|
|
161
|
+
* fully read.
|
|
162
|
+
*/
|
|
163
|
+
export function needsNoQuestion(parsed, rules, cwd) {
|
|
164
|
+
if (parsed.unreadable || parsed.commands.length === 0)
|
|
165
|
+
return false;
|
|
166
|
+
const verdict = ruleVerdict(parsed, rules);
|
|
167
|
+
if (verdict.forbid || verdict.prompt)
|
|
168
|
+
return false;
|
|
169
|
+
const gitSafe = !gitConfigRunsPrograms(cwd);
|
|
170
|
+
return parsed.commands.every((cmd) => isReadOnly(cmd, gitSafe) || (cmd.writes.length === 0 && rules.some((r) => r.decision === "allow" && ruleMatches(r, cmd))));
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Programs that run whatever they are handed next: an interpreter, a shell, a launcher, a downloader. A rule on
|
|
174
|
+
* one of these ("allow node") would approve every command that begins with it, so no prefix is ever suggested.
|
|
175
|
+
*/
|
|
176
|
+
const TOO_BROAD = new Set([
|
|
177
|
+
"node", "nodejs", "deno", "bun", "python", "python3", "py", "ruby", "perl", "php", "lua", "java", "dotnet",
|
|
178
|
+
"bash", "sh", "zsh", "fish", "dash", "pwsh", "powershell", "cmd", "npx", "pnpx", "bunx", "uvx", "pipx", "sudo", "doas",
|
|
179
|
+
"env", "xargs", "nohup", "time", "timeout", "start", "ssh", "scp", "sftp", "curl", "wget", "iwr", "irm", "nc", "ncat",
|
|
180
|
+
"rm", "rmdir", "rd", "del", "erase", "remove-item", "ri", "mv", "move", "cp", "copy", "dd", "format", "chmod", "chown",
|
|
181
|
+
"kill", "taskkill", "pkill", "make", "gmake", "find", "awk", "sed",
|
|
182
|
+
]);
|
|
183
|
+
/** Tools whose first word is a program and whose second is the action: the prefix takes both. */
|
|
184
|
+
const TWO_WORD = new Set([
|
|
185
|
+
"git", "npm", "pnpm", "yarn", "cargo", "go", "docker", "podman", "kubectl", "gh", "pip", "pip3", "uv", "poetry",
|
|
186
|
+
"composer", "gradle", "mvn", "terraform", "helm", "rustup", "brew", "apt", "apt-get", "winget", "choco", "flutter", "swift",
|
|
187
|
+
]);
|
|
188
|
+
/**
|
|
189
|
+
* The prefix a "don't ask again" answer would save for this command, or null when none is safe to offer.
|
|
190
|
+
*
|
|
191
|
+
* Only a single, fully readable command that writes no file qualifies. `npm test` becomes `npm test`; a bare
|
|
192
|
+
* `cargo build --release` becomes `cargo build`. A shell, interpreter or launcher, and a command that is itself
|
|
193
|
+
* one of the risky ones, get nothing: the person can still answer yes for this one command.
|
|
194
|
+
*/
|
|
195
|
+
export function suggestAllowPrefix(parsed) {
|
|
196
|
+
if (parsed.unreadable || parsed.commands.length !== 1)
|
|
197
|
+
return null;
|
|
198
|
+
const cmd = parsed.commands[0];
|
|
199
|
+
if (cmd.writes.length > 0 || cmd.expands)
|
|
200
|
+
return null;
|
|
201
|
+
const verb = verbOf(cmd);
|
|
202
|
+
if (!verb || TOO_BROAD.has(verb))
|
|
203
|
+
return null;
|
|
204
|
+
const second = cmd.words[1];
|
|
205
|
+
if (TWO_WORD.has(verb)) {
|
|
206
|
+
if (!second || second.startsWith("-") || /[\\/$%*?]/.test(second))
|
|
207
|
+
return null;
|
|
208
|
+
// `npm run build` is a script name, and `npm run` alone would allow every script in the file.
|
|
209
|
+
if (second.toLowerCase() === "run" || second.toLowerCase() === "exec" || second.toLowerCase() === "x") {
|
|
210
|
+
const third = cmd.words[2];
|
|
211
|
+
return third && !third.startsWith("-") && !/[\\/$%*?]/.test(third) ? `${verb} ${second} ${third}` : null;
|
|
212
|
+
}
|
|
213
|
+
return `${verb} ${second}`;
|
|
214
|
+
}
|
|
215
|
+
return verb;
|
|
216
|
+
}
|
|
217
|
+
// ── protected paths named in a command ──────────────────────────────────────
|
|
218
|
+
/** Verbs that do not read what they are pointed at: a listing, a deletion, a directory change. */
|
|
219
|
+
const NEVER_READS = new Set([
|
|
220
|
+
"ls", "dir", "get-childitem", "gci", "test-path", "mkdir", "md", "new-item", "ni", "touch", "rm", "del", "erase",
|
|
221
|
+
"remove-item", "ri", "rmdir", "rd", "echo", "write-output", "write-host", "write", "pwd", "cd", "chdir",
|
|
222
|
+
"set-location", "sl", "pushd", "popd", "stat", "file", "basename", "dirname",
|
|
223
|
+
]);
|
|
224
|
+
/** Verbs that copy or move: their LAST path is where it goes, which may be a protected file. */
|
|
225
|
+
const COPIES = new Set(["cp", "copy", "copy-item", "cpi", "mv", "move", "move-item", "mi", "ren", "rename", "rename-item", "rni"]);
|
|
226
|
+
/** The candidate paths inside one word: itself, the value of `--flag=value`, and `@file`. */
|
|
227
|
+
function pathCandidates(word) {
|
|
228
|
+
const out = new Set([word]);
|
|
229
|
+
const eq = word.indexOf("=");
|
|
230
|
+
if (eq > 0)
|
|
231
|
+
out.add(word.slice(eq + 1).replace(/^@/, ""));
|
|
232
|
+
if (word.startsWith("@"))
|
|
233
|
+
out.add(word.slice(1));
|
|
234
|
+
const at = word.lastIndexOf("@");
|
|
235
|
+
if (at > 0 && word[at + 1] !== undefined)
|
|
236
|
+
out.add(word.slice(at + 1));
|
|
237
|
+
return [...out].filter((c) => c.length > 0 && !/^[a-z][a-z0-9+.-]*:\/\//i.test(c));
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* The protected file this command names as something to read, copy out or send, as a reason
|
|
241
|
+
* ("`.env` is an environment/secrets file"), or null. Judges what the paths lead to (links
|
|
242
|
+
* and stream spellings resolved), not just the text.
|
|
243
|
+
*/
|
|
244
|
+
export async function protectedArgsReason(parsed, cwd) {
|
|
245
|
+
for (const cmd of parsed.commands) {
|
|
246
|
+
const verb = verbOf(cmd);
|
|
247
|
+
if (NEVER_READS.has(verb))
|
|
248
|
+
continue;
|
|
249
|
+
let args = cmd.words.slice(1).filter((w) => !(w.startsWith("-") && !w.includes("=")));
|
|
250
|
+
if (COPIES.has(verb) && args.length >= 2)
|
|
251
|
+
args = args.slice(0, -1);
|
|
252
|
+
const inputs = [...args, ...cmd.words.slice(1).filter((w) => w.startsWith("-") && w.includes("=")), ...cmd.reads];
|
|
253
|
+
for (const word of inputs) {
|
|
254
|
+
for (const candidate of pathCandidates(word)) {
|
|
255
|
+
const text = protectedPathReason(candidate.replace(/\\/g, "/"));
|
|
256
|
+
if (text)
|
|
257
|
+
return `\`${candidate}\` is ${text}`;
|
|
258
|
+
const abs = resolveWord(candidate, cwd);
|
|
259
|
+
if (!abs || !(/[\\/]/.test(candidate) || /^[.~]/.test(candidate) || existsSync(abs)))
|
|
260
|
+
continue;
|
|
261
|
+
const real = await guardedPathReason(abs);
|
|
262
|
+
if (real)
|
|
263
|
+
return `\`${candidate}\` is ${real}`;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
function resolveWord(word, cwd) {
|
|
270
|
+
const expanded = expandHomeWords(word.startsWith("~") ? word.replace(/^~/, homedir()) : word);
|
|
271
|
+
if (/[$%*?<>|"]/.test(expanded))
|
|
272
|
+
return null;
|
|
273
|
+
return isAbsolute(expanded) ? resolve(expanded) : resolve(cwd, expanded);
|
|
274
|
+
}
|
|
275
|
+
// ── the entry points the tools use ───────────────────────────────────────────
|
|
276
|
+
/** Which shell dialect a run_command call uses. */
|
|
277
|
+
export function dialectFor(args) {
|
|
278
|
+
if (process.platform !== "win32")
|
|
279
|
+
return "posix";
|
|
280
|
+
return args.shell === "cmd" ? "cmd" : "powershell";
|
|
281
|
+
}
|
|
282
|
+
export { parseCommand };
|
|
283
|
+
//# sourceMappingURL=commandPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandPolicy.js","sourceRoot":"","sources":["../../src/tools/commandPolicy.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/edit.js
CHANGED
|
@@ -100,7 +100,8 @@ export const edit = {
|
|
|
100
100
|
}
|
|
101
101
|
ops.push({ oldString: e.old_string, newString: e.new_string, replaceAll: e.replace_all === true });
|
|
102
102
|
}
|
|
103
|
-
const
|
|
103
|
+
const preview = ops.map((o) => `- ${o.oldString}\n+ ${o.newString}`).join("\n\n");
|
|
104
|
+
const target = await prepareEditTarget(ctx, rawPath, "editing", preview);
|
|
104
105
|
if (!target.ok)
|
|
105
106
|
return target.error;
|
|
106
107
|
const { filePath, content, eol } = target;
|
package/dist/tools/edit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AA6CA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5G,OAAO,EAAE,iBAAiB,EAAe,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,CAAC,MAAM,IAAI,GAAS;IACxB,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,KAAK;IACf,mFAAmF;IACnF,oFAAoF;IACpF,sFAAsF;IACtF,oFAAoF;IACpF,sFAAsF;IACtF,+EAA+E;IAC/E,8CAA8C;IAC9C,WAAW,EACT,wFAAwF;QACxF,8EAA8E;QAC9E,wFAAwF;QACxF,sFAAsF;QACtF,wFAAwF;QACxF,wFAAwF;QACxF,mDAAmD;QACnD,sFAAsF;QACtF,sFAAsF;QACtF,yFAAyF;QACzF,yFAAyF;QACzF,iEAAiE;QACjE,uFAAuF;QACvF,wFAAwF;QACxF,4EAA4E;QAC5E,6EAA6E;QAC7E,mFAAmF;IACrF,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,oBAAoB,EAAE,KAAK;QAC3B,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;QAC3B,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iGAAiG;aAC/G;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,CAAC;gBACX,WAAW,EAAE,uFAAuF;gBACpG,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,oBAAoB,EAAE,KAAK;oBAC3B,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;oBACtC,UAAU,EAAE;wBACV,UAAU,EAAE;4BACV,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,0EAA0E;yBACxF;wBACD,UAAU,EAAE;4BACV,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,iEAAiE;yBAC/E;wBACD,WAAW,EAAE;4BACX,IAAI,EAAE,SAAS;4BACf,WAAW,EACT,oGAAoG;gCACpG,oGAAoG;yBACvG;qBACF;iBACF;aACF;SACF;KACF;IAED,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG;QACrB,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,IAAI,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,6DAA6D,CAAC,CAAC;QAChG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,OAAO,WAAW,CAAC,sFAAsF,CAAC,CAAC;QAC7G,CAAC;QAED,kFAAkF;QAClF,kBAAkB;QAClB,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAA4B,CAAC;YACnD,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YACxF,mFAAmF;YACnF,8EAA8E;YAC9E,6CAA6C;YAC7C,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;gBAC7E,OAAO,WAAW,CAChB,SAAS,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,qCAAqC;oBAC1F,wDAAwD,CAC3D,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,KAAK,EAAE,EAAE,CAAC;gBAC5D,OAAO,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;YAC1F,CAAC;YACD,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;gBACrC,OAAO,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;YACpG,CAAC;YACD,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;gBAClC,OAAO,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;YAC7G,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC,CAAC;QACrG,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC;QACpC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;QAE1C,6EAA6E;QAC7E,8EAA8E;QAC9E,gFAAgF;QAChF,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC5C,+EAA+E;QAC/E,gFAAgF;QAChF,0EAA0E;QAC1E,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,iFAAiF;YACjF,qCAAqC;YACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC;YACzE,gFAAgF;YAChF,yEAAyE;YACzE,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACvE,OAAO,WAAW,CAAC,GAAG,KAAK,4BAA4B,OAAO,KAAK,MAAM,2BAA2B,CAAC,CAAC;QACxG,CAAC;QAED,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC3C,8DAA8D;QAC9D,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,mBAAmB,OAAO,KAAK,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzD,iFAAiF;QACjF,qDAAqD;QACrD,MAAM,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAErE,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QAC1B,mFAAmF;QACnF,4DAA4D;QAC5D,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACvE,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,OAAO,IAAI,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;YACnC,KAAK,IAAI,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;QACD,+EAA+E;QAC/E,iFAAiF;QACjF,yCAAyC;QACzC,MAAM,UAAU,GAAG,GAAG,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;QACtF,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,YAAY,UAAU,EAAE,CAAC;QAC5E,MAAM,QAAQ,GACZ,MAAM,KAAK,CAAC;YACV,CAAC,CAAC,UAAU,KAAK,GAAG;YACpB,CAAC,CAAC,UAAU,KAAK,KAAK,MAAM,WAAW,GAAG,CAAC,KAAK,eAAe,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACvG,OAAO;YACL,MAAM,EACJ,GAAG,QAAQ,IAAI;gBACf,qFAAqF,MAAM,EAAE;YAC/F,OAAO,EAAE,UAAU,KAAK,MAAM,KAAK,EAAE;YACrC,MAAM,EAAE,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;YAC9C,UAAU,EAAE,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YACnE,UAAU,EAAE,MAAe;SAC5B,CAAC;IACJ,CAAC;CACF,CAAC"}
|
package/dist/tools/editRipple.js
CHANGED
|
@@ -72,13 +72,28 @@ export async function rippleTargets(ctx, edited) {
|
|
|
72
72
|
* which are different problems with different fixes.
|
|
73
73
|
*/
|
|
74
74
|
export function formatRippleNote(diags, editedSet, label) {
|
|
75
|
-
|
|
75
|
+
// Compared case- and slash-insensitively on Windows: diagnostics arrive with forward
|
|
76
|
+
// slashes and the edited paths with backslashes, so a plain comparison marked every
|
|
77
|
+
// diagnostic, the edited file's included, as a caller's.
|
|
78
|
+
const key = (p) => {
|
|
79
|
+
const s = p.split("\\").join("/");
|
|
80
|
+
return process.platform === "win32" ? s.toLowerCase() : s;
|
|
81
|
+
};
|
|
82
|
+
const edited = new Set([...editedSet].map(key));
|
|
83
|
+
const isEdited = (d) => edited.has(key(d.file));
|
|
84
|
+
// What is worth interrupting the model with: anything in a file it just edited, but only
|
|
85
|
+
// ERRORS in a caller (a warning over there is not something this edit caused), and never
|
|
86
|
+
// a server failing to load its own schema. In real sessions the only notes this check
|
|
87
|
+
// ever produced were such warnings from the JSON server about files the model had not
|
|
88
|
+
// touched, which sent it off to fix what was not broken.
|
|
89
|
+
const relevant = diags.filter((d) => !/\bschema\b.*\b(unable|could not|failed|ENOENT|not found)|\b(unable|could not|failed) to load schema/i.test(d.message) && (isEdited(d) || d.severity === "error"));
|
|
90
|
+
if (relevant.length === 0)
|
|
76
91
|
return "";
|
|
77
92
|
const rank = (d) => (d.severity === "error" ? 0 : 1);
|
|
78
|
-
const sorted = [...
|
|
93
|
+
const sorted = [...relevant].sort((a, b) => rank(a) - rank(b));
|
|
79
94
|
const shown = sorted.slice(0, MAX_REPORTED);
|
|
80
95
|
const lines = shown.map((d) => {
|
|
81
|
-
const where =
|
|
96
|
+
const where = isEdited(d) ? "" : " (caller)";
|
|
82
97
|
return `- ${label(d.file)}:${d.line}${where} ${d.severity}: ${d.message}`;
|
|
83
98
|
});
|
|
84
99
|
const hidden = sorted.length - shown.length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editRipple.js","sourceRoot":"","sources":["../../src/tools/editRipple.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;uEACuE;AACvE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAC5B;;mCAEmC;AACnC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,qFAAqF;AACrF,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAE/B,kEAAkE;AAClE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;AAElG;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CACzB,OAAuF,EACvF,OAA0C;IAE1C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QACtD,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC;QAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YAAE,SAAS;QACrD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAChC,IAAI,GAAG;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAgB,EAAE,MAAyB;IAC7E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,CAAC;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,IAAI,GAAsB,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,iFAAiF;YACjF,+EAA+E;YAC/E,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,cAAc;gBAAE,SAAS;YAC5D,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAgC,EAChC,SAA8B,EAC9B,KAA8B;IAE9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"editRipple.js","sourceRoot":"","sources":["../../src/tools/editRipple.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;uEACuE;AACvE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAC5B;;mCAEmC;AACnC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,qFAAqF;AACrF,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAE/B,kEAAkE;AAClE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;AAElG;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CACzB,OAAuF,EACvF,OAA0C;IAE1C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QACtD,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC;QAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YAAE,SAAS;QACrD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAChC,IAAI,GAAG;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAgB,EAAE,MAAyB;IAC7E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,CAAC;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,IAAI,GAAsB,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,iFAAiF;YACjF,+EAA+E;YAC/E,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,cAAc;gBAAE,SAAS;YAC5D,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAgC,EAChC,SAA8B,EAC9B,KAA8B;IAE9B,qFAAqF;IACrF,oFAAoF;IACpF,yDAAyD;IACzD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE;QACxB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,CAAC,CAAiB,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,yFAAyF;IACzF,yFAAyF;IACzF,sFAAsF;IACtF,sFAAsF;IACtF,yDAAyD;IACzD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,sGAAsG,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAC1K,CAAC;IACF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,CAAC,CAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAE5C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;QAC7C,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5E,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IAEnE,OAAO,CACL,yFAAyF;QACzF,0DAA0D,MAAM,QAAQ;QACxE,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO;QAClF,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,2BAA2B;QACrF,sFAAsF;QACtF,mFAAmF;QACnF,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CACrC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAgB,EAChB,OAAuF,EACvF,OAA0C;IAE1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,GAAG,GAAqB,EAAE,CAAC;QACjC,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACxB,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACzC,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,IAAI,CAAC;gBACH,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,wEAAwE;YAC1E,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QACF,OAAO,gBAAgB,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
package/dist/tools/editTarget.js
CHANGED
|
@@ -9,8 +9,9 @@
|
|
|
9
9
|
* failure ToolResult to hand straight back.
|
|
10
10
|
*/
|
|
11
11
|
import { promises as fs } from "node:fs";
|
|
12
|
-
import { foreignAgentReason,
|
|
13
|
-
import {
|
|
12
|
+
import { foreignAgentReason, guardedPathReason } from "./guard.js";
|
|
13
|
+
import { forbiddenRealPathReason } from "../governor/forbidden.js";
|
|
14
|
+
import { requestRunsLaterWrite } from "./runsLater.js";
|
|
14
15
|
import { requestAgentDataAccess, requestForbiddenLift, requestOutsideWorkspaceWrite } from "./approval.js";
|
|
15
16
|
import { resolvePath } from "./paths.js";
|
|
16
17
|
import { detectEol } from "./eol.js";
|
|
@@ -18,10 +19,10 @@ import { fail, failQuietly } from "./results.js";
|
|
|
18
19
|
// Re-exported because the edit tools reach for these alongside the gauntlet itself.
|
|
19
20
|
export { fail, failQuietly } from "./results.js";
|
|
20
21
|
/** Run the shared pre-edit checks for `rawPath`. `verb` names the action in
|
|
21
|
-
* messages (e.g. "editing"). */
|
|
22
|
-
export async function prepareEditTarget(ctx, rawPath, verb) {
|
|
22
|
+
* messages (e.g. "editing"); `preview` is the change, shown if the user is asked. */
|
|
23
|
+
export async function prepareEditTarget(ctx, rawPath, verb, preview = "") {
|
|
23
24
|
const filePath = resolvePath(ctx, rawPath);
|
|
24
|
-
const blocked =
|
|
25
|
+
const blocked = await guardedPathReason(filePath);
|
|
25
26
|
if (blocked)
|
|
26
27
|
return { ok: false, error: fail(`Refusing to edit ${rawPath}: it is ${blocked}.`) };
|
|
27
28
|
// Another tool's data. Writing to it is worse than reading it — we'd be editing
|
|
@@ -32,7 +33,7 @@ export async function prepareEditTarget(ctx, rawPath, verb) {
|
|
|
32
33
|
if (denied)
|
|
33
34
|
return { ok: false, error: denied };
|
|
34
35
|
}
|
|
35
|
-
const forbidden =
|
|
36
|
+
const forbidden = await forbiddenRealPathReason(ctx.governance?.forbidden, filePath, ctx.roots ?? []);
|
|
36
37
|
if (forbidden) {
|
|
37
38
|
const lift = await requestForbiddenLift(ctx, forbidden, `${verb} ${rawPath}`, `the user has forbidden touching '${forbidden}'.`);
|
|
38
39
|
if (lift)
|
|
@@ -43,6 +44,10 @@ export async function prepareEditTarget(ctx, rawPath, verb) {
|
|
|
43
44
|
const outside = await requestOutsideWorkspaceWrite(ctx, filePath, `${verb} ${rawPath}`);
|
|
44
45
|
if (outside)
|
|
45
46
|
return { ok: false, error: outside };
|
|
47
|
+
// A file that runs code later (an editor task, a hook, a workflow) asks first.
|
|
48
|
+
const later = await requestRunsLaterWrite(ctx, filePath, rawPath, preview);
|
|
49
|
+
if (later)
|
|
50
|
+
return { ok: false, error: later };
|
|
46
51
|
let stat;
|
|
47
52
|
try {
|
|
48
53
|
stat = await fs.stat(filePath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editTarget.js","sourceRoot":"","sources":["../../src/tools/editTarget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"editTarget.js","sourceRoot":"","sources":["../../src/tools/editTarget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC3G,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEjD,oFAAoF;AACpF,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAsBjD;sFACsF;AACtF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAgB,EAChB,OAAe,EACf,IAAY,EACZ,OAAO,GAAG,EAAE;IAEZ,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,oBAAoB,OAAO,WAAW,OAAO,GAAG,CAAC,EAAE,CAAC;IAEjG,gFAAgF;IAChF,gFAAgF;IAChF,MAAM,SAAS,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;QAClF,IAAI,MAAM;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACtG,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,MAAM,oBAAoB,CACrC,GAAG,EACH,SAAS,EACT,GAAG,IAAI,IAAI,OAAO,EAAE,EACpB,oCAAoC,SAAS,IAAI,CAClD,CAAC;QACF,IAAI,IAAI;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,0DAA0D;IACzG,CAAC;IAED,sFAAsF;IACtF,4CAA4C;IAC5C,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;IACxF,IAAI,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAElD,+EAA+E;IAC/E,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3E,IAAI,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAE9C,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,OAAO,kDAAkD,CAAC,EAAE,CAAC;IACvG,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,OAAO,8BAA8B,CAAC,EAAE,CAAC;IAEpG,iDAAiD;IACjD,EAAE;IACF,uFAAuF;IACvF,iFAAiF;IACjF,oFAAoF;IACpF,mFAAmF;IACnF,uFAAuF;IACvF,wEAAwE;IACxE,EAAE;IACF,iFAAiF;IACjF,oFAAoF;IACpF,qFAAqF;IACrF,mFAAmF;IACnF,sFAAsF;IACtF,yEAAyE;IACzE,qFAAqF;IACrF,mFAAmF;IACnF,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9D,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,kBAAkB,OAAO,KAAK,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;IACpF,CAAC;IAED,mDAAmD;IACnD,EAAE;IACF,oFAAoF;IACpF,qFAAqF;IACrF,qFAAqF;IACrF,kFAAkF;IAClF,yFAAyF;IACzF,EAAE;IACF,iFAAiF;IACjF,sFAAsF;IACtF,uFAAuF;IACvF,iDAAiD;IACjD,IAAI,IAAI,IAAI,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACzC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,WAAW,CAChB,GAAG,OAAO,4EAA4E;gBACpF,sGAAsG;gBACtG,6DAA6D,CAChE;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;AAC9F,CAAC;AAED;kFACkF;AAClF,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,IAAI,CACT,GAAG,OAAO,2EAA2E;QACnF,sDAAsD,CACzD,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAyC,EACzC,GAAsC;IAEtC,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACzE,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAClH,OAAO,KAAK,CAAC;AACf,CAAC;AAGD,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -8,13 +8,55 @@ import { failQuietly } from "./results.js";
|
|
|
8
8
|
function projectRoot(ctx) {
|
|
9
9
|
return ctx.governance?.forbidden.root ?? ctx.cwd;
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Ask the user before a change to what binds every later session: saving or dropping a
|
|
13
|
+
* rule, creating or deleting a skill, or lifting a protection. Returns null when they
|
|
14
|
+
* agreed, or the result to hand back instead.
|
|
15
|
+
*
|
|
16
|
+
* A rule is sent on every request as the user's own binding instruction, and a skill is
|
|
17
|
+
* followed as written. Without this, ONE injected instruction (a web page, a README, a
|
|
18
|
+
* tool result) could become a permanent rule every future session obeys as the user's,
|
|
19
|
+
* or quietly lift a path the user had forbidden. The tool's text always said the user
|
|
20
|
+
* decides; this is what makes that true. Adding a protection only restricts, so it does
|
|
21
|
+
* not ask. With nobody to ask (a sub-agent), the change is refused.
|
|
22
|
+
*/
|
|
23
|
+
async function confirmStanding(ctx, question, detail) {
|
|
24
|
+
if (!ctx.requestApproval) {
|
|
25
|
+
return failQuietly("Not done: this changes what applies to every later session, which needs the user's agreement, " +
|
|
26
|
+
"and there is no way to ask from here. Say what you would change in your result instead.");
|
|
27
|
+
}
|
|
28
|
+
const choice = await ctx.requestApproval(question, ["Yes", "No"], detail, "Standing change");
|
|
29
|
+
if (choice.startsWith("Yes"))
|
|
30
|
+
return null;
|
|
31
|
+
return { output: "The user declined; nothing was changed.", summary: "declined by the user" };
|
|
32
|
+
}
|
|
33
|
+
/** Most rules the agent may have proposed at once, and the longest one. */
|
|
34
|
+
export const MAX_AGENT_RULES = 20;
|
|
35
|
+
export const MAX_AGENT_RULE_CHARS = 1000;
|
|
11
36
|
async function doRememberRule(args, ctx) {
|
|
12
37
|
const body = typeof args.value === "string" ? args.value.trim() : "";
|
|
13
38
|
if (!body)
|
|
14
39
|
return failQuietly("`value` is required — the rule text.");
|
|
15
40
|
const name = (typeof args.name === "string" && args.name.trim()) || deriveRuleName(body);
|
|
16
41
|
const globs = parseGlobs(typeof args.globs === "string" ? args.globs : undefined);
|
|
17
|
-
const
|
|
42
|
+
const where = globs.length > 0 ? `files matching ${globs.join(", ")}` : "every request";
|
|
43
|
+
// Agent-made rules are capped in size and number: each one is read back as the user's binding instruction in
|
|
44
|
+
// every later session, so a runaway or injected stream of them must run out of room. A rule the user wrote by
|
|
45
|
+
// hand has no origin line and is not counted. Re-stating an existing rule (same slug) is not a new one.
|
|
46
|
+
if (body.length > MAX_AGENT_RULE_CHARS) {
|
|
47
|
+
return failQuietly(`Not saved: a rule is at most ${MAX_AGENT_RULE_CHARS} characters (this one is ${body.length}). Say it shorter.`);
|
|
48
|
+
}
|
|
49
|
+
const slugOfName = slugify(name);
|
|
50
|
+
const agentRules = (ctx.governance?.rules ?? []).filter((r) => r.origin && slugify(r.name) !== slugOfName);
|
|
51
|
+
if (agentRules.length >= MAX_AGENT_RULES) {
|
|
52
|
+
return failQuietly(`Not saved: there are already ${MAX_AGENT_RULES} rules you proposed. Ask the user which to drop, ` +
|
|
53
|
+
`or tell them to edit the rules folder themselves.`);
|
|
54
|
+
}
|
|
55
|
+
const declined = await confirmStanding(ctx, `Save this as a standing rule for this project? It will apply to ${where}, in this session and future ones.`, `${name}\n\n${body}`);
|
|
56
|
+
if (declined)
|
|
57
|
+
return declined;
|
|
58
|
+
const origin = `agent, confirmed by the user ${new Date().toISOString().slice(0, 10)}`;
|
|
59
|
+
const saved = await writeRule(projectRoot(ctx), name, body, "", globs, origin);
|
|
18
60
|
// Mirror into the live session so the rule is in the very next prompt.
|
|
19
61
|
//
|
|
20
62
|
// Deduplicate by SLUG, not by the display name. The rule FILE is `<slug>.md`, so
|
|
@@ -116,6 +158,9 @@ async function doForgetRule(args, ctx) {
|
|
|
116
158
|
const name = typeof args.value === "string" ? args.value.trim() : "";
|
|
117
159
|
if (!name)
|
|
118
160
|
return failQuietly("`value` is required — the rule's name.");
|
|
161
|
+
const declined = await confirmStanding(ctx, `Drop the standing rule '${name}' for this project?`, name);
|
|
162
|
+
if (declined)
|
|
163
|
+
return declined;
|
|
119
164
|
const gone = await removeRule(projectRoot(ctx), name);
|
|
120
165
|
// The live session drops it too, so the very next turn is built without it.
|
|
121
166
|
if (ctx.governance && gone) {
|
|
@@ -132,6 +177,9 @@ async function doUnforbidPath(args, ctx) {
|
|
|
132
177
|
const pattern = typeof args.value === "string" ? args.value.trim() : "";
|
|
133
178
|
if (!pattern)
|
|
134
179
|
return failQuietly("`value` is required — the forbidden path pattern to lift.");
|
|
180
|
+
const declinedPath = await confirmStanding(ctx, `Lift the protection on '${pattern}', so it can be edited again?`, pattern);
|
|
181
|
+
if (declinedPath)
|
|
182
|
+
return declinedPath;
|
|
135
183
|
const normalized = pattern.replace(/^\.\//, "").replace(/\/$/, "");
|
|
136
184
|
const gone = await removeForbiddenPath(projectRoot(ctx), pattern);
|
|
137
185
|
if (ctx.governance && gone) {
|
|
@@ -148,6 +196,9 @@ async function doUnforbidCommand(args, ctx) {
|
|
|
148
196
|
const pattern = typeof args.value === "string" ? args.value.trim() : "";
|
|
149
197
|
if (!pattern)
|
|
150
198
|
return failQuietly("`value` is required — the forbidden command to lift.");
|
|
199
|
+
const declined = await confirmStanding(ctx, `Allow the forbidden command '${pattern}' to run again?`, pattern);
|
|
200
|
+
if (declined)
|
|
201
|
+
return declined;
|
|
151
202
|
const gone = await removeForbiddenCommand(projectRoot(ctx), pattern);
|
|
152
203
|
if (ctx.governance && gone) {
|
|
153
204
|
ctx.governance.forbidden = {
|
|
@@ -163,6 +214,9 @@ async function doUnforbidMcpTool(args, ctx) {
|
|
|
163
214
|
const name = typeof args.value === "string" ? args.value.trim() : "";
|
|
164
215
|
if (!name)
|
|
165
216
|
return failQuietly("`value` is required — the full MCP tool name to lift.");
|
|
217
|
+
const declined = await confirmStanding(ctx, `Make the forbidden MCP tool '${name}' available again?`, name);
|
|
218
|
+
if (declined)
|
|
219
|
+
return declined;
|
|
166
220
|
const gone = await removeForbiddenMcpTool(projectRoot(ctx), name);
|
|
167
221
|
if (ctx.governance && gone) {
|
|
168
222
|
const mcpTools = (ctx.governance.forbidden.mcpTools ?? []).filter((t) => t !== name);
|
|
@@ -326,6 +380,9 @@ export const skillTool = {
|
|
|
326
380
|
if (!name)
|
|
327
381
|
return failQuietly("`name` is required.");
|
|
328
382
|
if (args.action === "delete") {
|
|
383
|
+
const declinedDelete = await confirmStanding(ctx, `Delete the skill '${slugify(name)}' from this project?`, name);
|
|
384
|
+
if (declinedDelete)
|
|
385
|
+
return declinedDelete;
|
|
329
386
|
const gone = await removeSkill(projectRoot(ctx), name);
|
|
330
387
|
// Out of the live catalog too, so /name stops offering it immediately.
|
|
331
388
|
if (ctx.governance && gone) {
|
|
@@ -338,6 +395,9 @@ export const skillTool = {
|
|
|
338
395
|
}
|
|
339
396
|
if (!body)
|
|
340
397
|
return failQuietly("`steps` is required — the skill needs a body.");
|
|
398
|
+
const declined = await confirmStanding(ctx, `Save this as the skill '/${slugify(name)}' for this project? A skill is followed as written whenever it runs.`, description ? `${description}\n\n${body}` : body);
|
|
399
|
+
if (declined)
|
|
400
|
+
return declined;
|
|
341
401
|
const saved = await writeSkill(projectRoot(ctx), {
|
|
342
402
|
name,
|
|
343
403
|
description,
|