zames_pro 2.82.37 → 2.82.40

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,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.82.40] - 2026-10-22
11
+
12
+ ### Fixed
13
+
14
+ - **transcript:** cap a single logged payload
15
+
16
+ ## [2.82.39] - 2026-10-22
17
+
18
+ ### Fixed
19
+
20
+ - **config:** do not mask a whitespace-only password
21
+
22
+ ## [2.82.38] - 2026-10-22
23
+
24
+ ### Fixed
25
+
26
+ - **config:** dispatch /config subcommands after the command name
27
+
10
28
  ## [2.82.37] - 2026-10-22
11
29
 
12
30
  ### Fixed
@@ -17,10 +17,17 @@ import { configGetValue, configValueHint } from './config-commands.js';
17
17
  export async function handleConfigCommand(input, deps) {
18
18
  const { t, print, printErr, getValue, setValue, resetField, showList, openMenu, currentLocale, normalizeLocale, localeDisplayName, homeConfigPath, projectConfigPath, } = deps;
19
19
  const schema = deps.schema;
20
- const parts = input.trim().split(/\s+/);
20
+ // Accept BOTH spellings: the main loop passes the whole typed line
21
+ // (`/config get ui.locale`), while tests and other callers pass the text
22
+ // after the command (`get ui.locale`). Reading parts[1] blindly made the
23
+ // second form treat `get` as the subcommand.
24
+ const all = input.trim().split(/\s+/).filter(Boolean);
25
+ const parts = /^\/config(\s|$)/i.test(input.trim())
26
+ ? all
27
+ : ['/config', ...all];
21
28
  const sub = (parts[1] || '').toLowerCase();
22
29
  // With no subcommand - the menu (or a text list in non-TTY).
23
- if (!sub || sub === 'menu' || sub === 'ui') {
30
+ if (!sub || sub === 'menu') {
24
31
  await openMenu();
25
32
  return;
26
33
  }
@@ -26,8 +26,11 @@ export function configListValue(field, value, t) {
26
26
  export function configGetValue(path, value, t) {
27
27
  if (value === undefined)
28
28
  return t('cfg.menu.default');
29
- if (/password/i.test(path) && String(value).length > 0)
29
+ // Mask a real secret, but NOT a whitespace-only one: it cannot log in, and
30
+ // hiding it makes `/config get` look like a password is configured.
31
+ if (/password/i.test(path) && String(value).trim().length > 0) {
30
32
  return '********';
33
+ }
31
34
  return JSON.stringify(value);
32
35
  }
33
36
  /**
@@ -34,6 +34,8 @@ export function rotateTranscripts(dir, keep = MAX_TRANSCRIPT_FILES) {
34
34
  function transcriptErrorLine(e) {
35
35
  return `transcript: failed to create file: ${e.message}`;
36
36
  }
37
+ /** Hard cap on one transcript line (a single `log` payload). */
38
+ export const TRANSCRIPT_LINE_CAP = 100_000;
37
39
  export class Transcript {
38
40
  enabled;
39
41
  file;
@@ -84,7 +86,19 @@ export class Transcript {
84
86
  type,
85
87
  ...data,
86
88
  };
87
- const line = JSON.stringify(entry) + String.fromCharCode(10);
89
+ let line = JSON.stringify(entry) + String.fromCharCode(10);
90
+ // One `log` call may carry a tool result, a page dump or a fetched
91
+ // document; an uncapped line makes the transcript grow by megabytes per
92
+ // event, and /cost + /export then load it all into memory. Keep the
93
+ // transcript a LOG: cap each line with a marker (never splitting a
94
+ // surrogate pair).
95
+ if (line.length > TRANSCRIPT_LINE_CAP) {
96
+ let cut = TRANSCRIPT_LINE_CAP - 2;
97
+ const last = line.charCodeAt(cut - 1);
98
+ if (last >= 0xd800 && last <= 0xdbff)
99
+ cut--;
100
+ line = line.slice(0, cut) + '…' + String.fromCharCode(10);
101
+ }
88
102
  // The mirror runs even when the file is disabled (jsonl mode).
89
103
  if (this.onLine) {
90
104
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "2.82.37",
3
+ "version": "2.82.40",
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": {