zames_pro 2.82.113 → 2.82.115

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.115] - 2026-10-24
11
+
12
+ ### Fixed
13
+
14
+ - **hooks:** a big Write is not blocked by a hook's env size limit
15
+
16
+ ## [2.82.114] - 2026-10-24
17
+
18
+ ### Fixed
19
+
20
+ - **scheduler:** a multi-line job task cannot fake a /jobs line
21
+
10
22
  ## [2.82.113] - 2026-10-24
11
23
 
12
24
  ### Fixed
package/dist/hooks.js CHANGED
@@ -104,12 +104,21 @@ function runHook(entry, event, tool, args, workdir, result) {
104
104
  args: args ?? {},
105
105
  ...(result === undefined ? {} : { result }),
106
106
  };
107
+ // The env copies are SHORT on purpose: a Write/Edit carries the whole file
108
+ // in `content`, which exceeds the OS per-variable limit (~128 KB) and made
109
+ // the spawn fail — a PreToolUse guard then BLOCKED the very call it was
110
+ // meant to allow. The FULL call is already fed on stdin (below), which has
111
+ // no such limit, so the env copy is only a convenience for small hooks.
112
+ const ENV_CAP = 60_000;
113
+ const clipEnv = (v) => v.length <= ENV_CAP ? v : v.slice(0, ENV_CAP - 1) + '…';
107
114
  const env = {
108
115
  ...process.env,
109
116
  ZAMES_HOOK_EVENT: event,
110
117
  ZAMES_TOOL_NAME: tool,
111
- ZAMES_TOOL_ARGS: JSON.stringify(args ?? {}),
112
- ...(result === undefined ? {} : { ZAMES_TOOL_RESULT: result }),
118
+ ZAMES_TOOL_ARGS: clipEnv(JSON.stringify(args ?? {})),
119
+ ...(result === undefined
120
+ ? {}
121
+ : { ZAMES_TOOL_RESULT: clipEnv(String(result)) }),
113
122
  };
114
123
  let child;
115
124
  try {
package/dist/scheduler.js CHANGED
@@ -175,18 +175,23 @@ export function nextCronTime(expr, fromMs) {
175
175
  // One listing line for a job: "#3 [every 10m, next ~5m] run the tests". Pure,
176
176
  // so the /jobs formatting is unit-tested without a live scheduler.
177
177
  export function formatJobLine(job, now) {
178
+ // The TASK and the CRON expression are operator text and must stay on ONE
179
+ // line: a newline would start a new /jobs row and could fake another
180
+ // report's line. Collapse whitespace in both.
181
+ const oneLine = (v) => String(v ?? '').replace(/\s+/g, ' ');
178
182
  const when = job.kind === 'loop'
179
183
  ? 'every ' + formatInterval(job.intervalMs || 0)
180
- : job.cron || '';
184
+ : oneLine(job.cron || '');
185
+ const task = oneLine(job.task);
181
186
  // A cron job whose next fire could not be computed stores Infinity (see
182
187
  // due()). "next ~-" (formatInterval maps a non-finite value to '-') read
183
188
  // like a normal schedule, so the job looked healthy while it could never
184
189
  // fire again.
185
190
  if (!Number.isFinite(job.nextAt)) {
186
- return ' #' + job.id + ' [' + when + ', NEVER fires again] ' + job.task;
191
+ return ' #' + job.id + ' [' + when + ', NEVER fires again] ' + task;
187
192
  }
188
193
  const nextIn = formatInterval(Math.max(0, job.nextAt - now));
189
- return ' #' + job.id + ' [' + when + ', next ~' + nextIn + '] ' + job.task;
194
+ return ' #' + job.id + ' [' + when + ', next ~' + nextIn + '] ' + task;
190
195
  }
191
196
  // Holds the scheduled jobs. Pure: no timers here. index.ts drives it with a
192
197
  // 1-second tick and enqueues the tasks that `due()` returns.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "2.82.113",
3
+ "version": "2.82.115",
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": {