zames_pro 2.73.4 → 2.73.5

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.73.5] - 2026-10-12
11
+
12
+ ### Changed
13
+
14
+ - docs(readme): route the how-it-works back-edges below the boxes
15
+
10
16
  ## [2.73.4] - 2026-10-11
11
17
 
12
18
  ### Changed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "2.73.4",
3
+ "version": "2.73.5",
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