zames_pro 2.81.15 → 2.81.17

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.81.17] - 2026-10-21
11
+
12
+ ### Fixed
13
+
14
+ - **tools:** Read past EOF explains the empty window
15
+
16
+ ## [2.81.16] - 2026-10-21
17
+
18
+ ### Fixed
19
+
20
+ - **i18n:** /cost describes the context counter neutrally
21
+
10
22
  ## [2.81.15] - 2026-10-21
11
23
 
12
24
  ### Fixed
@@ -285,13 +285,16 @@ export const commonMessages = {
285
285
  en: 'Session renamed: {v}',
286
286
  },
287
287
  'cost.title': { ru: 'Статистика сессии:', en: 'Session stats:' },
288
+ // /cost runs on EVERY provider, so the counter is described neutrally:
289
+ // DeepSeek reports accumulated_token_usage, Qwen input_tokens, GLM
290
+ // prompt_tokens - naming one backend made the other two look broken.
288
291
  'cost.context_known': {
289
- ru: ' контекст: ~{n} токенов (DeepSeek accumulated_token_usage)',
290
- en: ' context: ~{n} tokens (DeepSeek accumulated_token_usage)',
292
+ ru: ' контекст: ~{n} токенов (счётчик провайдера)',
293
+ en: ' context: ~{n} tokens (the provider counter)',
291
294
  },
292
295
  'cost.context_unknown': {
293
- ru: ' контекст: неизвестно (DeepSeek сообщит после первого ответа в чате)',
294
- en: ' context: unknown (DeepSeek reports it after the first answer in a chat)',
296
+ ru: ' контекст: неизвестно (провайдер сообщит после первого ответа в чате)',
297
+ en: ' context: unknown (the provider reports it after the first answer in a chat)',
295
298
  },
296
299
  'cost.tasks': { ru: ' задач: {n}', en: ' tasks: {n}' },
297
300
  'cost.tool_calls': {
package/dist/tools.js CHANGED
@@ -127,6 +127,14 @@ export function createTools(workdir, { undo, todos, readOnly = false, subagents
127
127
  const start = off - 1;
128
128
  const lim = Math.floor(Number(limit));
129
129
  const end = Number.isFinite(lim) && lim > 0 ? start + lim : lines.length;
130
+ // An offset PAST the end returned an empty string, which the model
131
+ // reads as "the file is empty" instead of "your window does not
132
+ // exist" - it then re-read from the start or gave up. Say so, with
133
+ // the real line count.
134
+ if (start >= lines.length) {
135
+ return (`(offset ${off} is past the end of ${p}: the file has ` +
136
+ `${lines.length} line${lines.length === 1 ? '' : 's'})`);
137
+ }
130
138
  const slice = lines.slice(start, end);
131
139
  const clip = (l) => l.length > 2000 ? clipLine(l, 2000) + ' …[line truncated]' : l;
132
140
  if (!numbered)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "2.81.15",
3
+ "version": "2.81.17",
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": {