zames_pro 2.82.58 → 2.82.60

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/CHANGELOG.md CHANGED
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.82.60] - 2026-10-23
11
+
12
+ ### Fixed
13
+
14
+ - **permissions:** scan nested path arguments for every tool, not only MCP
15
+
16
+ ## [2.82.59] - 2026-10-23
17
+
18
+ ### Fixed
19
+
20
+ - **commands:** /diffstat hides the padded no-output sentinel
21
+
10
22
  ## [2.82.58] - 2026-10-23
11
23
 
12
24
  ### Fixed
package/dist/commands.js CHANGED
@@ -46,7 +46,10 @@ export function formatDiffStat(statText, opts = {}, t = translate('en')) {
46
46
  .split(CR + NL)
47
47
  .join(NL)
48
48
  .trimEnd();
49
- if (!trimmed || trimmed === '(command produced no output)') {
49
+ // Compare the TRIMMED text: the runner's sentinel reaches this function
50
+ // with its own padding, and a raw comparison then printed the internal
51
+ // marker to the operator (formatDiff already trims).
52
+ if (!trimmed || trimmed.trim() === '(command produced no output)') {
50
53
  return t('diff.no_changes');
51
54
  }
52
55
  const lines = trimmed.split(NL);
@@ -123,7 +123,13 @@ export function collectPathCandidates(tool, args) {
123
123
  // free to nest (`{file: {path}}`) or take `argv: ['cat', '/etc/x']`. Only
124
124
  // values that clearly look like paths are taken (depth-bounded to avoid a
125
125
  // pathological payload).
126
- if (tool.includes('__')) {
126
+ //
127
+ // This runs for EVERY tool, not only MCP ones: a model that invents an
128
+ // argument shape (`{file: {path}}`, `{files: [...]}`) on a built-in tool
129
+ // used to slip past a `path` deny rule, silently widening the operator's
130
+ // policy. Path-looking values of a built-in's own arguments are exactly what
131
+ // such a rule is meant to match.
132
+ {
127
133
  const walk = (v, depth) => {
128
134
  if (depth > 4 || v === null || v === undefined)
129
135
  return;
@@ -146,7 +152,9 @@ export function collectPathCandidates(tool, args) {
146
152
  for (const v of Object.values(a))
147
153
  walk(v, 0);
148
154
  }
149
- return out;
155
+ // De-duplicate: a known key (`path`) is now also reached by the generic
156
+ // nested walk, and callers compare the candidate LIST (`deepEqual`).
157
+ return Array.from(new Set(out));
150
158
  }
151
159
  export function decidePermission(policy, tool, args) {
152
160
  if (!policy)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "2.82.58",
3
+ "version": "2.82.60",
4
4
  "description": "Terminal coding agent that drives a real browser to chat with DeepSeek, Qwen and other web LLMs — no API key required. Reads and edits files, runs commands, commits to git, like Claude Code / Codex CLI.",
5
5
  "type": "module",
6
6
  "bin": {