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 +12 -0
- package/README.md +13 -11
- package/package.json +1 -1
- package/scripts/render-how-it-works.mts +77 -41
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
|
|
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
|
|
398
|
-
`accumulated_token_usage` and is
|
|
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
|
-
Чтобы войти руками (например, если
|
|
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
|
|
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.
|
|
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 +
|
|
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 +
|
|
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, '&').replace(/</g, '<').replace(/>/g, '>')
|
|
57
64
|
|
|
58
65
|
const nodeSvg = (n: Node): string => {
|
|
59
|
-
const y =
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
y
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
130
|
+
CY +
|
|
117
131
|
' L' +
|
|
118
132
|
x2 +
|
|
119
133
|
' ' +
|
|
120
|
-
|
|
134
|
+
CY +
|
|
121
135
|
'" fill="none" stroke="' +
|
|
122
136
|
TEXT +
|
|
123
|
-
'" stroke-width="1.6" marker-end="url(#' +
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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
|
|