zames_pro 2.82.66 → 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,12 @@ 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
+
10
16
  ## [2.82.66] - 2026-10-24
11
17
 
12
18
  ### Fixed
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.66",
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": {