zames_pro 2.82.61 → 2.82.63

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.63] - 2026-10-23
11
+
12
+ ### Fixed
13
+
14
+ - **tui:** truncateToWidth never cuts inside an ANSI escape
15
+
16
+ ## [2.82.62] - 2026-10-23
17
+
18
+ ### Fixed
19
+
20
+ - **attachments:** do not inline a binary @file reference as text
21
+
10
22
  ## [2.82.61] - 2026-10-23
11
23
 
12
24
  ### Fixed
@@ -6,6 +6,17 @@ import { extractAtFileRefs } from './path-token.js';
6
6
  // Extracted from src/index.ts so the logic is unit-testable without the whole
7
7
  // CLI. This module touches only the filesystem (no browser/terminal).
8
8
  const NL = String.fromCharCode(10);
9
+ // A NUL byte in the head is the classic binary signal (text files essentially
10
+ // never contain one). Only the head is scanned: a huge archive must not be
11
+ // walked byte-by-byte just to decide it is not text.
12
+ function isBinaryBuffer(buf) {
13
+ const n = Math.min(buf.length, 8000);
14
+ for (let i = 0; i < n; i++) {
15
+ if (buf[i] === 0)
16
+ return true;
17
+ }
18
+ return false;
19
+ }
9
20
  // Resolve a pasted string into a path to an EXISTING file. Handles quoted
10
21
  // paths (drag&drop from some file managers adds quotes) and paths relative to
11
22
  // the working directory. Returns null when nothing matches.
@@ -92,13 +103,21 @@ export async function inlineAtRefs(workdir, text) {
92
103
  const file = await resolveAttachPath(workdir, ref);
93
104
  if (!file)
94
105
  continue;
95
- let raw;
106
+ let buf;
96
107
  try {
97
- raw = await fs.readFile(file, 'utf-8');
108
+ buf = await fs.readFile(file);
98
109
  }
99
110
  catch {
100
111
  continue;
101
112
  }
113
+ // A BINARY file (an image, an archive, a compiled blob) read as UTF-8
114
+ // becomes replacement characters and NUL bytes in the prompt — the model
115
+ // cannot use that, and the reference was still counted as inlined. Leave
116
+ // it in the text as a plain `@path` reference (the same answer the Read
117
+ // tool gives for a binary file).
118
+ if (isBinaryBuffer(buf))
119
+ continue;
120
+ const raw = buf.toString('utf-8');
102
121
  let body = raw;
103
122
  let note = '';
104
123
  // The per-file cap alone lets the TOTAL budget be overshot: a file that
@@ -322,12 +322,29 @@ export function truncateToWidth(s, maxCols) {
322
322
  const budget = Math.max(0, width - 1);
323
323
  let used = 0;
324
324
  let out = '';
325
- for (const ch of text) {
326
- const w = charWidth(ch.codePointAt(0));
325
+ let i = 0;
326
+ while (i < text.length) {
327
+ // Copy an ANSI escape WHOLE (zero columns). Counting its code points
328
+ // consumed the budget and the cut landed inside the sequence
329
+ // (`\x1b[3…`), leaving a broken control sequence with no visible text.
330
+ if (text.charCodeAt(i) === 27 && text[i + 1] === '[') {
331
+ let j = i + 2;
332
+ while (j < text.length && !/[A-Za-z]/.test(text[j]))
333
+ j++;
334
+ const seq = text.slice(i, Math.min(j + 1, text.length));
335
+ // A sequence the budget cannot even finish is dropped, never split.
336
+ out += seq;
337
+ i += seq.length;
338
+ continue;
339
+ }
340
+ const cp = text.codePointAt(i);
341
+ const w = charWidth(cp);
327
342
  if (used + w > budget)
328
343
  break;
344
+ const ch = String.fromCodePoint(cp);
329
345
  out += ch;
330
346
  used += w;
347
+ i += ch.length;
331
348
  }
332
349
  return out + '…';
333
350
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "2.82.61",
3
+ "version": "2.82.63",
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": {