zames_pro 2.90.0 → 2.90.2

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.90.2] - 2026-10-28
11
+
12
+ ### Fixed
13
+
14
+ - **web:** treat the IPv4-translated ::ffff:0:a.b.c.d literal as private
15
+
16
+ ## [2.90.1] - 2026-10-28
17
+
18
+ ### Fixed
19
+
20
+ - **tui:** fit the turn rule and agent answers to the pane width, not the terminal
21
+
10
22
  ## [2.90.0] - 2026-10-28
11
23
 
12
24
  ### Added
@@ -431,7 +443,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
431
443
 
432
444
  ### Fixed
433
445
 
434
- - **mcp:** a schema property named __proto__ becomes a real parameter
446
+ - **mcp:** a schema property named **proto** becomes a real parameter
435
447
 
436
448
  ## [2.82.123] - 2026-10-24
437
449
 
@@ -1480,7 +1492,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1480
1492
 
1481
1493
  ### Fixed
1482
1494
 
1483
- - **commands:** keep an unsupplied position as written in a custom command
1495
+ - **commands:** keep an unsupplied position as written in a custom command
1484
1496
  - **subagent:** count a subagent run only once it actually starts
1485
1497
  - **attach:** do not cut an inlined @file inside a surrogate pair
1486
1498
  - **checkpoint:** a bare out-of-range rewind index no longer matches a stamp prefix
@@ -1600,7 +1612,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1600
1612
  - **changelog:** keep drafted group headings on their own line
1601
1613
  - **tui:** decode modified and release wheel reports correctly
1602
1614
  - **shell:** normalize an invalid Bash timeout instead of crashing the tool
1603
- - **cost:** keep per-tool stats safe for __proto__/constructor tool names
1615
+ - **cost:** keep per-tool stats safe for **proto**/constructor tool names
1604
1616
  - **tui:** mark blocked/aborted tool calls as errors in the result icon
1605
1617
  - **mcp:** do not split a surrogate pair when truncating an MCP result
1606
1618
  - **context:** discover skills at the documented 3 levels deep
@@ -21,8 +21,8 @@ import { TuiApp } from './TuiApp.js';
21
21
  import { FullScreenApp } from './FullScreenApp.js';
22
22
  import { AttachmentStore } from '../attachments.js';
23
23
  import { translate } from '../i18n.js';
24
- import { expandPastes, formatTokenStatus, tokenStatusLevel, wrapToWidth, truncateToWidth, } from '../input/layout.js';
25
- import { contentWidth } from '../width.js';
24
+ import { expandPastes, formatTokenStatus, tokenStatusLevel, wrapToWidth, truncateToWidth, screenInnerCols, } from '../input/layout.js';
25
+ import { contentWidth, setContentWidth } from '../width.js';
26
26
  import { theme } from '../theme.js';
27
27
  import { renderMarkdown } from '../markdown.js';
28
28
  import { summarizeToolCall, looksLikeToolError } from '../tool-summary.js';
@@ -257,7 +257,11 @@ export class TuiEditor {
257
257
  this.attachments.reset();
258
258
  // A turn separator + a BAR-marked, clearly-colored operator message, so an
259
259
  // operator turn never blends with the model's answer (operator request).
260
- this.printAbove(theme.turnRule('─'.repeat(contentWidth())));
260
+ // The turn rule must fit the PANE, not the terminal: the root keeps a
261
+ // gutter on both sides (screenGutter) and Ink wraps a longer line onto a
262
+ // second row, which looked like a stray line above the message.
263
+ // `screenInnerCols` ALREADY subtracts the gutter on both sides.
264
+ this.printAbove(theme.turnRule('─'.repeat(screenInnerCols(process.stdout.columns || 80))));
261
265
  // The BAR is a per-row marker, drawn by LogView (entry.bar), so every
262
266
  // visual row of a long message starts with `▌` instead of only the first.
263
267
  this.store.pushLog('user', wrapToWidth(display, contentWidth() - 2), false, { bar: true });
@@ -484,7 +488,20 @@ export class TuiEditor {
484
488
  }
485
489
  assistant(msg) {
486
490
  this.stop();
487
- const rendered = renderMarkdown(msg);
491
+ // renderMarkdown wraps to width.ts's CONTENT width, which defaults to the
492
+ // terminal width. Inside the TUI the pane is narrower (the root pads by
493
+ // the gutter), so an answer wrapped to the terminal width overflowed the
494
+ // gutter and wrapped again. Point width.ts at the pane for this render.
495
+ const pane = screenInnerCols(process.stdout.columns || 80);
496
+ const prev = contentWidth();
497
+ setContentWidth(pane);
498
+ let rendered;
499
+ try {
500
+ rendered = renderMarkdown(msg);
501
+ }
502
+ finally {
503
+ setContentWidth(prev);
504
+ }
488
505
  this.printAbove('\n' + theme.assistant(translate(this.locale)('editor.answer')));
489
506
  this.printAbove(rendered);
490
507
  this.printAbove('\n');
package/dist/web.js CHANGED
@@ -263,6 +263,20 @@ export function isPrivateIp(ip) {
263
263
  '.' +
264
264
  (v6[7] & 0xff));
265
265
  }
266
+ // IPv4-TRANSLATED ::ffff:0:a.b.c.d (RFC 2765): the embedded IPv4 sits in
267
+ // the LAST two groups with one extra zero group between `ffff` and it.
268
+ // Only the mapped form above was judged, so `::ffff:0:7f00:1` (= 127.0.0.1)
269
+ // stayed "public" and WebFetch could reach localhost/metadata through it.
270
+ const translatedV4 = v6.slice(0, 4).every((g) => g === 0) && v6[4] === 0xffff && v6[5] === 0;
271
+ if (translatedV4) {
272
+ return isPrivateIp((v6[6] >> 8) +
273
+ '.' +
274
+ (v6[6] & 0xff) +
275
+ '.' +
276
+ (v6[7] >> 8) +
277
+ '.' +
278
+ (v6[7] & 0xff));
279
+ }
266
280
  }
267
281
  if (low === '::1' || low === '::')
268
282
  return true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "2.90.0",
3
+ "version": "2.90.2",
4
4
  "description": "Terminal coding agent that drives a real browser to chat with DeepSeek, Qwen or GLM — 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": {