zames_pro 2.82.65 → 2.82.67

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.67] - 2026-10-24
11
+
12
+ ### Fixed
13
+
14
+ - **tui:** Up/Down in a wrapped input keeps the visual column
15
+
16
+ ## [2.82.66] - 2026-10-24
17
+
18
+ ### Fixed
19
+
20
+ - **tui:** append a space when Tab completion lands on a full command name
21
+
10
22
  ## [2.82.65] - 2026-10-24
11
23
 
12
24
  ### Fixed
@@ -118,5 +118,12 @@ export function completeSlashCommand(buf, sugg, selected) {
118
118
  return null;
119
119
  if (!prefix.toLowerCase().startsWith(typed))
120
120
  return null;
121
- return prefix.length > buf.length ? prefix : null;
121
+ if (prefix.length <= buf.length)
122
+ return null;
123
+ // The shared prefix may be a COMPLETE command name (`/config` between
124
+ // `/config` and `/configure`): appending the space makes it ready for its
125
+ // argument, exactly like a single-match completion. A prefix that only
126
+ // extends the typed text stays bare.
127
+ const complete = sugg.some((c) => c.name.toLowerCase() === prefix.toLowerCase());
128
+ return complete ? prefix + ' ' : prefix;
122
129
  }
package/dist/tui/edit.js CHANGED
@@ -177,14 +177,37 @@ export function moveVisualRows(s, delta, promptStr, cols) {
177
177
  return s;
178
178
  const row = lay.rows[target];
179
179
  const rowChars = Array.from(row.text);
180
- const promptW = visLen(row.prefix);
181
- const want = Math.max(0, lay.cursorCol - promptW);
180
+ // `cursorCol` is the column inside the CURRENT row (prompt + its text). The
181
+ // row above/below has a DIFFERENT indent (`row.start` differs), so the
182
+ // offset must be measured from the CURRENT row's own text, not as a raw
183
+ // `cursorCol - promptW` character count: on a wrapped line that put the
184
+ // caret past the target row's text and onto the NEXT row entirely.
185
+ const curRow = lay.rows[lay.cursorRow];
186
+ const curChars = Array.from(curRow.text);
187
+ let want = 0;
188
+ for (let k = 0; k < lay.cursorCol - visLen(curRow.prefix); k++) {
189
+ want += charWidth(curChars[k]?.codePointAt(0) ?? 32);
190
+ }
182
191
  let idx = row.start;
183
192
  let w = 0;
184
- while (idx < row.start + rowChars.length && w < want) {
185
- w += charWidth(rowChars[idx - row.start].codePointAt(0));
193
+ // Walk the target row and STOP on the first character that no longer fits.
194
+ // Landing exactly on `row.start + len` is the NEXT row's first character in
195
+ // the layout (`cur === row end` is only kept when it is a wrap boundary),
196
+ // so a caret at the end of a SHORT last row must stay on its last character.
197
+ while (idx < row.start + rowChars.length) {
198
+ const cw = charWidth(rowChars[idx - row.start].codePointAt(0));
199
+ if (w + cw > want)
200
+ break;
201
+ w += cw;
186
202
  idx++;
187
203
  }
204
+ // Keep the caret INSIDE the target row: the layout moves a caret that sits
205
+ // on the row end onto the next row, which is exactly the "Up jumps two
206
+ // rows" bug.
207
+ if (idx > row.start + rowChars.length)
208
+ idx = row.start + rowChars.length;
209
+ if (idx === row.start + rowChars.length && rowChars.length > 0)
210
+ idx--;
188
211
  return { ...s, cursor: idx };
189
212
  }
190
213
  /** Insert a newline; a trailing «\» before the cursor is removed first. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "2.82.65",
3
+ "version": "2.82.67",
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": {