zames_pro 2.95.0 → 2.95.1

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.95.1] - 2026-11-03
11
+
12
+ ### Fixed
13
+
14
+ - **loop:** skip the stall path for a stale BashOutput poll
15
+
10
16
  ## [2.95.0] - 2026-11-03
11
17
 
12
18
  ### Added
@@ -523,6 +523,15 @@ export async function runAgentLoop({ browser, tools, task, workdir, maxIteration
523
523
  }
524
524
  }
525
525
  if (!parsed) {
526
+ // SILENT BACKGROUND POLL: {"tool": "BashOutput", "args": {...}} for a
527
+ // process that has ALREADY finished (the watchdog killed its promise,
528
+ // or the id is stale). The tool itself answers "no background process"
529
+ // and does not move the task forward, so an EMPTY model turn is not a
530
+ // stall worth a dev dump / a nudge - the loop simply re-asks quietly.
531
+ // Matching is DELIBERATELY narrow: only BashOutput with a plain id.
532
+ if (isEmptyPollCall(rawResponse)) {
533
+ continue;
534
+ }
526
535
  // The answer looks like a (possibly truncated) tool call. We catch not
527
536
  // only explicit JSON but also XML/DSML forms, "dirty" variants and
528
537
  // unclosed fragments: if such an answer is silently taken as final, the
@@ -1387,6 +1396,30 @@ let unparsedDumps = 0;
1387
1396
  const UNPARSED_DUMP_MAX = 20;
1388
1397
  const UNPARSED_DUMP_BYTES = 64 * 1024;
1389
1398
  /** Dev mode: save an unrecognized (but call-looking) answer for analysis. */
1399
+ /**
1400
+ * True when the raw answer is a bare `{"tool":"BashOutput","args":{"id":...}}`
1401
+ * (optionally wrapped in whitespace/fences). A finished background process is
1402
+ * polled by the model with such a call; the tool returns "no background
1403
+ * process with id ..." which does not advance the task. Used to skip the
1404
+ * stall nudge / dev dump for this one case only.
1405
+ */
1406
+ export function isEmptyPollCall(raw) {
1407
+ const t = String(raw || '').trim();
1408
+ if (!t || t.length > 400)
1409
+ return false;
1410
+ let obj;
1411
+ try {
1412
+ obj = JSON.parse(t);
1413
+ }
1414
+ catch {
1415
+ return false;
1416
+ }
1417
+ const o = obj;
1418
+ if (!o || o.tool !== 'BashOutput')
1419
+ return false;
1420
+ const a = o.args;
1421
+ return !!a && typeof a.id === 'string';
1422
+ }
1390
1423
  export async function dumpUnparsedCall(raw, meta) {
1391
1424
  if (unparsedDumps >= UNPARSED_DUMP_MAX)
1392
1425
  return '';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "2.95.0",
3
+ "version": "2.95.1",
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": {