zames_pro 2.73.4 → 2.73.6

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.73.6] - 2026-10-12
11
+
12
+ ### Changed
13
+
14
+ - docs(readme): generalize the last DeepSeek-only mentions to both providers
15
+
16
+ ## [2.73.5] - 2026-10-12
17
+
18
+ ### Changed
19
+
20
+ - docs(readme): route the how-it-works back-edges below the boxes
21
+
10
22
  ## [2.73.4] - 2026-10-11
11
23
 
12
24
  ### Changed
package/README.md CHANGED
@@ -156,7 +156,7 @@ sign-in, zames:
156
156
  after a successful sign-in, remembers them for next time;
157
157
  4. otherwise falls back to a manual sign-in hint.
158
158
 
159
- To sign in by hand (for example, if DeepSeek shows a captcha), run with a
159
+ To sign in by hand (for example, if the site shows a captcha), run with a
160
160
  visible window:
161
161
 
162
162
  ```bash
@@ -347,7 +347,8 @@ Codex CLI:
347
347
  - /rename <title> — set the current session title (shown in /sessions).
348
348
  - /copy — copy the last assistant answer to the OS clipboard.
349
349
  - /cost (alias /usage) — session stats: tasks, tool calls, duration, and the
350
- context size in tokens (DeepSeek's `accumulated_token_usage`).
350
+ context size in tokens (DeepSeek's `accumulated_token_usage`; Qwen
351
+ reports `input_tokens`).
351
352
  - /export [file] — write the session transcript to a Markdown file
352
353
  (zames-export-<stamp>.md by default).
353
354
  - /doctor — diagnose node, git, config, browser, clipboard, MCP and the
@@ -394,8 +395,9 @@ tests`). /cron "<min> <hour> <dom> <month> <dow>" <task> — run on a schedule.
394
395
  The token context is also shown live: the status line above the input has the
395
396
  spinner/text on the left and the context on the right (e.g. `125k · 13%`,
396
397
  percent of a 1M context). It is COLORED by fill level: green below 50%,
397
- yellow 50-80%, red above 80%. It comes from DeepSeek's
398
- `accumulated_token_usage` and is hidden until the first answer delivers it.
398
+ yellow 50-80%, red above 80%. It comes from the provider's own token
399
+ counter (DeepSeek's `accumulated_token_usage`, Qwen's `input_tokens`) and is
400
+ hidden until the first answer delivers it.
399
401
 
400
402
  ## Project context, skills and memory
401
403
 
@@ -434,7 +436,7 @@ Skills and custom commands show up in the «/» completion list and in `/help`.
434
436
  zames can use tools from [MCP](https://modelcontextprotocol.io) servers.
435
437
  The flagship example is @playwright/mcp: it gives the agent a real browser
436
438
  (navigate, click, snapshot, type, ...) on top of the one zames already uses
437
- for the DeepSeek chat.
439
+ for the DeepSeek or Qwen chat.
438
440
 
439
441
  Drop a config file (same shape as Claude Code / Cursor):
440
442
 
@@ -692,7 +694,7 @@ zames не вызывает API модели. Он запускает headless C
692
694
  запоминает их для следующего раза;
693
695
  4. иначе показывает подсказку про ручной вход.
694
696
 
695
- Чтобы войти руками (например, если DeepSeek показывает капчу), запустите с
697
+ Чтобы войти руками (например, если сайт показывает капчу), запустите с
696
698
  видимым окном:
697
699
 
698
700
  ```bash
@@ -886,8 +888,8 @@ zames --task "..." --output-format jsonl \
886
888
  - /rename <title> — задать заголовок текущей сессии (виден в /sessions).
887
889
  - /copy — скопировать последний ответ ассистента в буфер обмена ОС.
888
890
  - /cost (алиас /usage) — статистика сессии: задачи, вызовы инструментов,
889
- длительность и размер контекста в токенах (DeepSeek
890
- `accumulated_token_usage`).
891
+ длительность и размер контекста в токенах (у DeepSeek —
892
+ `accumulated_token_usage`, у Qwen — `input_tokens`).
891
893
  - /export [file] — записать транскрипт сессии в Markdown-файл
892
894
  (по умолчанию zames-export-<stamp>.md).
893
895
  - /doctor — диагностика node, git, конфига, браузера, буфера обмена, MCP и
@@ -936,8 +938,8 @@ zames --task "..." --output-format jsonl \
936
938
  Контекст в токенах показывается и вживую: в строке статуса над вводом слева
937
939
  спиннер/текст, справа — контекст (например, `125k · 13%`, процент от 1M
938
940
  контекста). Он ОКРАШЕН по уровню заполнения: зелёный ниже 50%, жёлтый 50-80%,
939
- красный выше 80%. Значение приходит из DeepSeek `accumulated_token_usage` и
940
- скрыто до первого ответа.
941
+ красный выше 80%. Значение приходит из счётчика токенов провайдера (у DeepSeek —
942
+ `accumulated_token_usage`, у Qwen — `input_tokens`) и скрыто до первого ответа.
941
943
 
942
944
  ## Контекст проекта, навыки и память
943
945
 
@@ -977,7 +979,7 @@ zames --task "..." --output-format jsonl \
977
979
  zames может использовать инструменты с серверов [MCP](https://modelcontextprotocol.io).
978
980
  Главный пример — @playwright/mcp: он даёт агенту настоящий браузер
979
981
  (navigate, click, snapshot, type, ...) поверх того, который zames уже
980
- использует для чата DeepSeek.
982
+ использует для чата DeepSeek или Qwen.
981
983
 
982
984
  Положите файл конфига (той же формы, что в Claude Code / Cursor):
983
985
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "2.73.4",
3
+ "version": "2.73.6",
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": {
@@ -5,6 +5,11 @@
5
5
  // the model node now shows BOTH supported backends (chat.deepseek.com /
6
6
  // chat.qwen.ai) instead of only chat.deepseek.com.
7
7
  //
8
+ // Layout matches mermaid LR: FORWARD edges (the request) run through the node
9
+ // centerline left->right; BACK edges (the answers) are routed BELOW the boxes
10
+ // with a short vertical stub on each side, so forward and back arrows are
11
+ // clearly separated instead of overlapping.
12
+ //
8
13
  // Run: npm run render-how (tsx scripts/render-how-it-works.mts)
9
14
  //
10
15
  // Isolation: chromium.launch() uses a THROWAWAY context, never
@@ -24,14 +29,16 @@ const TEXT = '#333333'
24
29
  const FONT = 'trebuchet ms, verdana, arial, sans-serif'
25
30
 
26
31
  const W = 1120
27
- const H = 150
28
32
  const NODE_W = 250
29
33
  const NODE_H = 70
30
- const CY = H / 2
31
34
  const PAD = 30
35
+ const TOP = 34
36
+ const CY = TOP + NODE_H / 2
37
+ // The back edges run below the boxes; leave room for them + their labels.
38
+ const BACK_Y = TOP + NODE_H + 46
39
+ const H = BACK_Y + 30
40
+ const GAP = 150
32
41
 
33
- // A left-to-right chain with the SAME three steps as the original diagram;
34
- // only the last node gained a second line (the two supported backends).
35
42
  interface Node {
36
43
  x: number
37
44
  w: number
@@ -41,12 +48,12 @@ interface Node {
41
48
  const nodes: Node[] = [
42
49
  { x: PAD, w: NODE_W, lines: ['terminal (you)'] },
43
50
  {
44
- x: PAD + NODE_W + 150,
51
+ x: PAD + NODE_W + GAP,
45
52
  w: 260,
46
53
  lines: ['zames', 'parse tool-call · run tool'],
47
54
  },
48
55
  {
49
- x: PAD + NODE_W + 150 + 260 + 150,
56
+ x: PAD + NODE_W + GAP + 260 + GAP,
50
57
  w: 260,
51
58
  lines: ['chat.deepseek.com', 'chat.qwen.ai'],
52
59
  },
@@ -56,7 +63,7 @@ const esc = (s: string): string =>
56
63
  s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
57
64
 
58
65
  const nodeSvg = (n: Node): string => {
59
- const y = CY - NODE_H / 2
66
+ const y = TOP
60
67
  const rx = 12
61
68
  const lh = 20
62
69
  const startY = CY - ((n.lines.length - 1) * lh) / 2 + 5
@@ -99,41 +106,69 @@ const nodeSvg = (n: Node): string => {
99
106
  )
100
107
  }
101
108
 
102
- // A horizontal edge from x1 to x2 at height y, with a centered label above it.
103
- const edge = (
104
- x1: number,
105
- x2: number,
106
- y: number,
107
- label: string,
108
- dir: 'r' | 'l',
109
- ): string => {
109
+ const label = (x: number, y: number, text: string): string =>
110
+ '<text x="' +
111
+ x +
112
+ '" y="' +
113
+ y +
114
+ '" text-anchor="middle" font-family="' +
115
+ FONT +
116
+ '" font-size="12" fill="' +
117
+ TEXT +
118
+ '">' +
119
+ esc(text) +
120
+ '</text>'
121
+
122
+ // A FORWARD edge: a straight horizontal arrow at the node centerline, going
123
+ // left->right, with the label just above the line.
124
+ const forward = (x1: number, x2: number, text: string): string => {
110
125
  const mid = (x1 + x2) / 2
111
- const marker = dir === 'r' ? 'ar' : 'al'
112
126
  return (
113
127
  '<path d="M' +
114
128
  x1 +
115
129
  ' ' +
116
- y +
130
+ CY +
117
131
  ' L' +
118
132
  x2 +
119
133
  ' ' +
120
- y +
134
+ CY +
121
135
  '" fill="none" stroke="' +
122
136
  TEXT +
123
- '" stroke-width="1.6" marker-end="url(#' +
124
- marker +
125
- ')"/>' +
126
- '<text x="' +
127
- mid +
128
- '" y="' +
129
- (y - 8) +
130
- '" text-anchor="middle" font-family="' +
131
- FONT +
132
- '" font-size="12" fill="' +
137
+ '" stroke-width="1.6" marker-end="url(#ar)"/>' +
138
+ label(mid, CY - 9, text)
139
+ )
140
+ }
141
+
142
+ // A BACK edge: from the RIGHT box's bottom edge, DOWN to BACK_Y, LEFT, then UP
143
+ // into the LEFT box's bottom edge, with the arrowhead pointing up-left into it.
144
+ const back = (leftX: number, rightX: number, text: string): string => {
145
+ // leftX = right edge of the LEFT node; rightX = left edge of the RIGHT node.
146
+ const ly = TOP + NODE_H
147
+ const d =
148
+ 'M' +
149
+ rightX +
150
+ ' ' +
151
+ ly +
152
+ ' L' +
153
+ rightX +
154
+ ' ' +
155
+ BACK_Y +
156
+ ' L' +
157
+ leftX +
158
+ ' ' +
159
+ BACK_Y +
160
+ ' L' +
161
+ leftX +
162
+ ' ' +
163
+ ly
164
+ const mid = (leftX + rightX) / 2
165
+ return (
166
+ '<path d="' +
167
+ d +
168
+ '" fill="none" stroke="' +
133
169
  TEXT +
134
- '">' +
135
- esc(label) +
136
- '</text>'
170
+ '" stroke-width="1.6" marker-end="url(#au)"/>' +
171
+ label(mid, BACK_Y - 6, text)
137
172
  )
138
173
  }
139
174
 
@@ -141,9 +176,6 @@ const a = nodes[0]
141
176
  const z = nodes[1]
142
177
  const m = nodes[2]
143
178
 
144
- const reqY = CY - 16
145
- const ansY = CY + 20
146
-
147
179
  const svg =
148
180
  '<svg xmlns="http://www.w3.org/2000/svg" width="' +
149
181
  W +
@@ -155,20 +187,24 @@ const svg =
155
187
  H +
156
188
  '">' +
157
189
  '<defs>' +
190
+ // right-pointing arrowhead
158
191
  '<marker id="ar" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L9,3 L0,6 z" fill="' +
159
192
  TEXT +
160
193
  '"/></marker>' +
161
- '<marker id="al" markerWidth="10" markerHeight="10" refX="1" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M9,0 L0,3 L9,6 z" fill="' +
194
+ // up-pointing arrowhead (for the back edges arriving at a bottom edge)
195
+ '<marker id="au" markerWidth="10" markerHeight="10" refX="3" refY="2" orient="auto" markerUnits="strokeWidth"><path d="M0,6 L3,0 L6,6 z" fill="' +
162
196
  TEXT +
163
197
  '"/></marker>' +
164
198
  '</defs>' +
165
199
  '<rect width="100%" height="100%" fill="#ffffff"/>' +
166
- // request edges (top, left -> right)
167
- edge(a.x + a.w, z.x, reqY, 'task', 'r') +
168
- edge(z.x + z.w, m.x, reqY, 'system prompt + task', 'r') +
169
- // answer edges (bottom, right -> left)
170
- edge(m.x, z.x + z.w, ansY, 'model answers (raw SSE)', 'l') +
171
- edge(z.x, a.x + a.w, ansY, 'answer', 'l') +
200
+ // back edges first (drawn under the forward edges / nodes).
201
+ // back(leftEdgeRightX, rightEdgeLeftX, label): the arrow starts at the RIGHT
202
+ // box's bottom, runs down-left, and points up into the LEFT box's bottom.
203
+ back(z.x + z.w, m.x, 'model answers (raw SSE)') +
204
+ back(a.x + a.w, z.x, 'answer') +
205
+ // forward edges
206
+ forward(a.x + a.w, z.x, 'task') +
207
+ forward(z.x + z.w, m.x, 'system prompt + task') +
172
208
  nodes.map(nodeSvg).join('') +
173
209
  '</svg>'
174
210