zames_pro 2.72.5 → 2.72.7

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,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.72.7] - 2026-10-09
11
+
12
+ ### Fixed
13
+
14
+ - **ui:** show a queued-message banner for EVERY queued message
15
+
16
+ ### Fixed
17
+
18
+ - **ui:** show a queued-message banner for EVERY queued message
19
+
20
+ ## [2.72.6] - 2026-10-09
21
+
22
+ ### Fixed
23
+
24
+ - **browser:** detect the property form of quasi_status (Stopped/FINISHED hang)
25
+
26
+ ### Fixed
27
+
28
+ - **browser:** detect the property form of quasi_status (Stopped/FINISHED hang)
29
+
10
30
  ## [2.72.5] - 2026-10-09
11
31
 
12
32
  ### Changed
@@ -213,11 +213,18 @@ export const RATE_LIMIT_RE = /(messages? too frequent|too many requests|rate lim
213
213
  export const SERVER_BUSY_RE = /(server (is )?busy|server error|service (is )?unavailable|temporarily unavailable|internal server error|502|503|504|server overloaded|сервер занят|сервер перегружен|сервис недоступен|внутренняя ошибка|попробуйте позже)/i;
214
214
  // ---------- network protocol (SSE) ----------
215
215
  export const GENERATION_ERR_RE = /"finish_reason":\s*"generation_err"/i;
216
- export const INCOMPLETE_STATUS_RE = /"quasi_status","v":"INCOMPLETE"/i;
216
+ // DeepSeek emits the generation status in TWO shapes: the initial message as a
217
+ // JSON property (`"quasi_status":"FINISHED"` inside v.response) and later
218
+ // BATCH updates (`{"p":"quasi_status","v":"FINISHED"}`). The old regex only
219
+ // matched the BATCH form, so a FINISHED-without-answer turn that came in the
220
+ // PROPERTY form (the real "Server is temporarily unavailable" case) was NOT
221
+ // detected — the agent hung on "Stopped" until the timeout. Match both.
222
+ export const INCOMPLETE_STATUS_RE = /"quasi_status"(?::|,"v":)"INCOMPLETE"/i;
217
223
  // A turn that ENDED (`quasi_status: FINISHED`) but produced NO answer text —
218
224
  // the reasoning was generated and the model stopped WITHOUT a RESPONSE
219
- // fragment. The UI shows Stopped + Continue.
220
- export const FINISHED_STATUS_RE = /"quasi_status","v":"FINISHED"/i;
225
+ // fragment. The UI shows Stopped + Continue. Matches both the JSON-property
226
+ // and the BATCH shape (see INCOMPLETE_STATUS_RE).
227
+ export const FINISHED_STATUS_RE = /"quasi_status"(?::|,"v":)"FINISHED"/i;
221
228
  export const RESPONSE_CONTENT_RE = /"type":"RESPONSE","content":"[^"]/;
222
229
  // Only a completion/continue turn carries a real answer. Gating the capture
223
230
  // assignment to these URLs keeps a future endpoint (which happens to return a
@@ -154,6 +154,12 @@ export const commonMessages = {
154
154
  en: '⏹ Ctrl+C — aborting generation...',
155
155
  },
156
156
  'msg.queued': { ru: '📨 В очередь ({n}): ', en: '📨 Queued ({n}): ' },
157
+ // TTY variant: the editor already echoed the message text, so only the
158
+ // count is shown (no repeated text).
159
+ 'msg.queued_badge': {
160
+ ru: '📨 В очередь ({n})',
161
+ en: '📨 Queued ({n})',
162
+ },
157
163
  // Shown ONCE per session, the first time a message is queued while the
158
164
  // agent is working. It explains what happens (sent after the current task)
159
165
  // and how to inspect/clear the queue, so the operator knows nothing is lost.
package/dist/index.js CHANGED
@@ -1321,12 +1321,17 @@ async function main() {
1321
1321
  const msg = { text, attachments };
1322
1322
  pendingQueue.push(msg);
1323
1323
  // The operator typed this WHILE the agent was working, so the message is
1324
- // queued and only sent after the current task. Explain that once per
1325
- // session (via the editor's own status area) so it is clear nothing was
1326
- // lost; later queued messages stay as the compact msg.queued banner only.
1327
- if (ed.busy && !queueHintShown) {
1328
- queueHintShown = true;
1329
- ed.printAbove(theme.dim(t('msg.queued_hint')));
1324
+ // queued and only sent after the current task. In TTY the editor ALREADY
1325
+ // echoed the message text (❯ …) above the input, so we add only a compact
1326
+ // COUNT line (no repeated text) for EVERY queued message — so it is always
1327
+ // clear the message was accepted and not lost. The FIRST one additionally
1328
+ // explains what the queue is and how to inspect/clear it.
1329
+ if (ed.busy) {
1330
+ if (!queueHintShown) {
1331
+ queueHintShown = true;
1332
+ ed.printAbove(theme.dim(t('msg.queued_hint')));
1333
+ }
1334
+ ed.printAbove(theme.user(t('msg.queued_badge', { n: pendingQueue.length })));
1330
1335
  }
1331
1336
  if (waiter) {
1332
1337
  const r = waiter;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "2.72.5",
3
+ "version": "2.72.7",
4
4
  "description": "Terminal coding agent that drives chat.deepseek.com through Playwright — 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": {