zames_pro 2.82.98 → 2.82.100

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.100] - 2026-10-24
11
+
12
+ ### Fixed
13
+
14
+ - **i18n:** localize the untitled label of a scraped chat row
15
+
16
+ ## [2.82.99] - 2026-10-24
17
+
18
+ ### Fixed
19
+
20
+ - **send-runtime:** record the block duration on the successful retry
21
+
10
22
  ## [2.82.98] - 2026-10-24
11
23
 
12
24
  ### Fixed
@@ -101,8 +101,10 @@ export function scrapeChatList(limit) {
101
101
  const titleEl = a.querySelector('[class*="title"], [class*="text"]');
102
102
  let title = (titleEl ? titleEl.textContent : a.textContent) || '';
103
103
  title = title.trim().replace(/\s+/g, ' ');
104
- if (!title)
105
- title = '(без названия)';
104
+ // NO prose here: this function runs inside the page and does not know the
105
+ // operator's locale. An empty title is localized by the caller
106
+ // (`chats.untitled`); a hardcoded Russian fallback leaked into the English
107
+ // UI and could not be translated.
106
108
  out.push({ id, title, href });
107
109
  if (out.length >= limit)
108
110
  break;
@@ -120,6 +120,12 @@ export const selfReviewMessages = {
120
120
  ru: 'Чатов не найдено. Возможно, сайдбар свёрнут или селекторы устарели.',
121
121
  en: 'No chats found. The sidebar may be collapsed or the selectors are outdated.',
122
122
  },
123
+ // The chat list is scraped INSIDE the page, which has no locale: a row with
124
+ // no text is left as an empty title and the CALLER localizes it here.
125
+ 'chats.untitled': {
126
+ ru: '(без названия)',
127
+ en: '(untitled)',
128
+ },
123
129
  'chats.fetch_error': {
124
130
  ru: 'Не удалось получить список:',
125
131
  en: 'Failed to fetch the list:',
package/dist/index.js CHANGED
@@ -2580,7 +2580,15 @@ async function main() {
2580
2580
  // Hide subagent chats: they are real DeepSeek chats, but they are
2581
2581
  // internal context-isolation artifacts whose report already lives in
2582
2582
  // the parent chat, so resuming one is never what the operator wants.
2583
- lastChats = all.filter((c) => !isInternalChat(c.id));
2583
+ // The scraper runs inside the page and cannot localize: a row without
2584
+ // text comes back with an EMPTY title, so the label is applied HERE
2585
+ // (one place, in the operator's language) instead of a hardcoded one.
2586
+ lastChats = all
2587
+ .filter((c) => !isInternalChat(c.id))
2588
+ .map((c) => ({
2589
+ ...c,
2590
+ title: c.title && c.title.trim() ? c.title : t('chats.untitled'),
2591
+ }));
2584
2592
  spin.stop();
2585
2593
  // An optional query filters by title (substring, case-insensitive),
2586
2594
  // so a long chat list does not have to be scanned by eye.
@@ -78,6 +78,19 @@ export class SendRuntime {
78
78
  if (typeof extra.retryAfterMs === 'number') {
79
79
  e.retryAfterMs = extra.retryAfterMs;
80
80
  }
81
+ // A SUCCESS after a rate limit IS the lift of that block. onBlockLifted()
82
+ // was the only producer of `blockMs`, but no provider's ask() calls it (a
83
+ // rate limit is retried IN PLACE and the retry simply succeeds), and the
84
+ // fold below clears `blockedAt` first. The measured duration is therefore
85
+ // taken HERE, before the state is folded; it is attached to the SAME event
86
+ // line, so one block still yields exactly one sample.
87
+ let blockMs;
88
+ if (outcome === 'ok' &&
89
+ this.state.blockedAt &&
90
+ this.now() > this.state.blockedAt) {
91
+ blockMs = this.now() - this.state.blockedAt;
92
+ e.blockMs = blockMs;
93
+ }
81
94
  if (this.opts.adaptive) {
82
95
  this.state = applySendEvent(this.state, e, this.cfg, this.now());
83
96
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "2.82.98",
3
+ "version": "2.82.100",
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": {