zames_pro 2.90.10 → 2.90.12
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 +12 -0
- package/dist/input.js +33 -11
- package/package.json +1 -1
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.12] - 2026-10-29
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **input:** keep the legacy reverse-search position when the query is refined
|
|
15
|
+
|
|
16
|
+
## [2.90.11] - 2026-10-29
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- **input:** stop legacy word movement and deletion at a newline
|
|
21
|
+
|
|
10
22
|
## [2.90.10] - 2026-10-29
|
|
11
23
|
|
|
12
24
|
### Fixed
|
package/dist/input.js
CHANGED
|
@@ -1421,9 +1421,12 @@ export class LineEditor {
|
|
|
1421
1421
|
_wordLeft() {
|
|
1422
1422
|
const chars = Array.from(this.buf);
|
|
1423
1423
|
let i = this.cursor;
|
|
1424
|
-
|
|
1424
|
+
// A NEWLINE is a hard boundary, like in the TUI's edit.ts: the caret must
|
|
1425
|
+
// not jump to the previous LINE's word (the two engines must behave the
|
|
1426
|
+
// same).
|
|
1427
|
+
while (i > 0 && chars[i - 1] !== NL && /\s/.test(chars[i - 1]))
|
|
1425
1428
|
i--;
|
|
1426
|
-
while (i > 0 && !/\s/.test(chars[i - 1]))
|
|
1429
|
+
while (i > 0 && chars[i - 1] !== NL && !/\s/.test(chars[i - 1]))
|
|
1427
1430
|
i--;
|
|
1428
1431
|
this.cursor = i;
|
|
1429
1432
|
}
|
|
@@ -1431,9 +1434,10 @@ export class LineEditor {
|
|
|
1431
1434
|
_wordRight() {
|
|
1432
1435
|
const chars = Array.from(this.buf);
|
|
1433
1436
|
let i = this.cursor;
|
|
1434
|
-
|
|
1437
|
+
// Stop at a NEWLINE (mirrors _wordLeft and the TUI's edit.ts).
|
|
1438
|
+
while (i < chars.length && chars[i] !== NL && /\s/.test(chars[i]))
|
|
1435
1439
|
i++;
|
|
1436
|
-
while (i < chars.length && !/\s/.test(chars[i]))
|
|
1440
|
+
while (i < chars.length && chars[i] !== NL && !/\s/.test(chars[i]))
|
|
1437
1441
|
i++;
|
|
1438
1442
|
this.cursor = i;
|
|
1439
1443
|
}
|
|
@@ -1441,9 +1445,10 @@ export class LineEditor {
|
|
|
1441
1445
|
_deleteWordLeft() {
|
|
1442
1446
|
const chars = Array.from(this.buf);
|
|
1443
1447
|
let i = this.cursor;
|
|
1444
|
-
|
|
1448
|
+
// Never eat the line break (see _wordLeft).
|
|
1449
|
+
while (i > 0 && chars[i - 1] !== NL && /\s/.test(chars[i - 1]))
|
|
1445
1450
|
i--;
|
|
1446
|
-
while (i > 0 && !/\s/.test(chars[i - 1]))
|
|
1451
|
+
while (i > 0 && chars[i - 1] !== NL && !/\s/.test(chars[i - 1]))
|
|
1447
1452
|
i--;
|
|
1448
1453
|
chars.splice(i, this.cursor - i);
|
|
1449
1454
|
this.buf = chars.join('');
|
|
@@ -1455,9 +1460,10 @@ export class LineEditor {
|
|
|
1455
1460
|
_deleteWordRight() {
|
|
1456
1461
|
const chars = Array.from(this.buf);
|
|
1457
1462
|
let i = this.cursor;
|
|
1458
|
-
|
|
1463
|
+
// Stop at a NEWLINE (see _wordRight).
|
|
1464
|
+
while (i < chars.length && chars[i] !== NL && /\s/.test(chars[i]))
|
|
1459
1465
|
i++;
|
|
1460
|
-
while (i < chars.length && !/\s/.test(chars[i]))
|
|
1466
|
+
while (i < chars.length && chars[i] !== NL && !/\s/.test(chars[i]))
|
|
1461
1467
|
i++;
|
|
1462
1468
|
chars.splice(this.cursor, i - this.cursor);
|
|
1463
1469
|
this.buf = chars.join('');
|
|
@@ -1506,12 +1512,24 @@ export class LineEditor {
|
|
|
1506
1512
|
const q = this._searchQuery;
|
|
1507
1513
|
if (resetToNewest)
|
|
1508
1514
|
this._searchIndex = this.history.length - 1;
|
|
1509
|
-
|
|
1515
|
+
const from = this._searchIndex;
|
|
1516
|
+
for (let i = from; i >= 0; i--) {
|
|
1510
1517
|
if (q === '' || this.history[i].toLowerCase().includes(q.toLowerCase())) {
|
|
1511
1518
|
this._searchIndex = i;
|
|
1512
1519
|
return;
|
|
1513
1520
|
}
|
|
1514
1521
|
}
|
|
1522
|
+
// Nothing at or ABOVE the current match: a query that only matches a NEWER
|
|
1523
|
+
// entry is still found (an empty query always matches, so this only runs
|
|
1524
|
+
// for a real query).
|
|
1525
|
+
if (q !== '' && from >= 0) {
|
|
1526
|
+
for (let i = from + 1; i < this.history.length; i++) {
|
|
1527
|
+
if (this.history[i].toLowerCase().includes(q.toLowerCase())) {
|
|
1528
|
+
this._searchIndex = i;
|
|
1529
|
+
return;
|
|
1530
|
+
}
|
|
1531
|
+
}
|
|
1532
|
+
}
|
|
1515
1533
|
// No match from here: signal it and leave the buffer as-is.
|
|
1516
1534
|
this._searchIndex = -1;
|
|
1517
1535
|
}
|
|
@@ -1562,14 +1580,18 @@ export class LineEditor {
|
|
|
1562
1580
|
// A character typed during search extends the query; Backspace trims it.
|
|
1563
1581
|
_searchInput(ch) {
|
|
1564
1582
|
this._searchQuery += ch;
|
|
1565
|
-
|
|
1583
|
+
// Refine from the CURRENT match: resetting to the newest entry made the
|
|
1584
|
+
// search jump FORWARD after `_searchNext` walked back, so the operator
|
|
1585
|
+
// lost the place they were browsing (the TUI was already fixed).
|
|
1586
|
+
this._searchRefresh(false);
|
|
1566
1587
|
this._searchStatus();
|
|
1567
1588
|
}
|
|
1568
1589
|
_searchBackspace() {
|
|
1569
1590
|
if (!this._searchQuery.length)
|
|
1570
1591
|
return;
|
|
1571
1592
|
this._searchQuery = this._searchQuery.slice(0, -1);
|
|
1572
|
-
|
|
1593
|
+
// Same rule as _searchInput: keep the current position.
|
|
1594
|
+
this._searchRefresh(false);
|
|
1573
1595
|
this._searchStatus();
|
|
1574
1596
|
}
|
|
1575
1597
|
_handle(data) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zames_pro",
|
|
3
|
-
"version": "2.90.
|
|
3
|
+
"version": "2.90.12",
|
|
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": {
|