zames_pro 1.2.0 → 2.0.0

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.
Files changed (57) hide show
  1. package/dist/agent-loop.js +652 -0
  2. package/dist/agent-loop.js.map +1 -0
  3. package/dist/browser.js +573 -0
  4. package/dist/browser.js.map +1 -0
  5. package/dist/config.js +74 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/confirm.js +82 -0
  8. package/dist/confirm.js.map +1 -0
  9. package/dist/diff.js +38 -0
  10. package/dist/diff.js.map +1 -0
  11. package/dist/gitTools.js +219 -0
  12. package/dist/gitTools.js.map +1 -0
  13. package/dist/index.js +1365 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/input.js +524 -0
  16. package/dist/input.js.map +1 -0
  17. package/dist/markdown.js +48 -0
  18. package/dist/markdown.js.map +1 -0
  19. package/dist/self-review.js +281 -0
  20. package/dist/self-review.js.map +1 -0
  21. package/dist/sessions.js +123 -0
  22. package/dist/sessions.js.map +1 -0
  23. package/dist/spinner.js +138 -0
  24. package/dist/spinner.js.map +1 -0
  25. package/{src → dist}/system-prompt.js +10 -14
  26. package/dist/system-prompt.js.map +1 -0
  27. package/{src → dist}/theme.js +17 -19
  28. package/dist/theme.js.map +1 -0
  29. package/dist/tools.js +189 -0
  30. package/dist/tools.js.map +1 -0
  31. package/dist/transcript.js +51 -0
  32. package/dist/transcript.js.map +1 -0
  33. package/dist/types.js +4 -0
  34. package/dist/types.js.map +1 -0
  35. package/dist/undo.js +100 -0
  36. package/dist/undo.js.map +1 -0
  37. package/dist/web.js +220 -0
  38. package/dist/web.js.map +1 -0
  39. package/dist/xml-toolcall.js +68 -0
  40. package/dist/xml-toolcall.js.map +1 -0
  41. package/package.json +13 -5
  42. package/src/agent-loop.js +0 -575
  43. package/src/browser.js +0 -627
  44. package/src/config.js +0 -81
  45. package/src/confirm.js +0 -85
  46. package/src/diff.js +0 -32
  47. package/src/gitTools.js +0 -256
  48. package/src/index.js +0 -1461
  49. package/src/input.js +0 -447
  50. package/src/markdown.js +0 -49
  51. package/src/self-review.js +0 -319
  52. package/src/spinner.js +0 -144
  53. package/src/tools.js +0 -206
  54. package/src/transcript.js +0 -46
  55. package/src/undo.js +0 -101
  56. package/src/web.js +0 -266
  57. package/src/xml-toolcall.js +0 -69
package/dist/web.js ADDED
@@ -0,0 +1,220 @@
1
+ import { chromium } from 'playwright';
2
+ const DEFAULT_TIMEOUT = 20_000;
3
+ const MAX_TEXT = 12_000;
4
+ // Убирает скрипты, стили, и превращает HTML в читабельный текст.
5
+ function htmlToText(html) {
6
+ // Удаляем блоки, которые не нужны
7
+ let s = html
8
+ .replace(/<script[\s\S]*?<\/script>/gi, '')
9
+ .replace(/<style[\s\S]*?<\/style>/gi, '')
10
+ .replace(/<noscript[\s\S]*?<\/noscript>/gi, '')
11
+ .replace(/<svg[\s\S]*?<\/svg>/gi, '')
12
+ .replace(/<!--[\s\S]*?-->/g, '');
13
+ // Ссылки: <a href="URL">text</a> → text (URL)
14
+ s = s.replace(/<a\b[^>]*href=["']([^"']+)["'][^>]*>([\s\S]*?)<\/a>/gi, (_, href, text) => {
15
+ const t = text.replace(/<[^>]+>/g, '').trim();
16
+ return t ? `${t} (${href})` : href;
17
+ });
18
+ // Заголовки, параграфы, BR → переводы строк
19
+ s = s
20
+ .replace(/<\/(h[1-6]|p|div|li|tr|section|article)>/gi, '\n')
21
+ .replace(/<br\s*\/?>/gi, '\n')
22
+ .replace(/<li[^>]*>/gi, '- ')
23
+ .replace(/<[^>]+>/g, '');
24
+ // HTML entities — базовые
25
+ s = s
26
+ .replace(/&nbsp;/g, ' ')
27
+ .replace(/&amp;/g, '&')
28
+ .replace(/&lt;/g, '<')
29
+ .replace(/&gt;/g, '>')
30
+ .replace(/&quot;/g, '"')
31
+ .replace(/&#39;/g, "'")
32
+ .replace(/&mdash;/g, '—')
33
+ .replace(/&ndash;/g, '–')
34
+ .replace(/&hellip;/g, '…')
35
+ .replace(/&#(\d+);/g, (_, n) => String.fromCodePoint(Number(n)))
36
+ .replace(/&#x([0-9a-f]+);/gi, (_, n) => String.fromCodePoint(parseInt(n, 16)));
37
+ // Сжимаем пустые строки
38
+ s = s
39
+ .split('\n')
40
+ .map((l) => l.replace(/[ \t]+/g, ' ').trim())
41
+ .filter(Boolean)
42
+ .join('\n');
43
+ return s;
44
+ }
45
+ // fetch с редиректами и таймаутом
46
+ async function httpFetch(url, { timeout = DEFAULT_TIMEOUT, headers = {} } = {}) {
47
+ const ctrl = new AbortController();
48
+ const t = setTimeout(() => ctrl.abort(), timeout);
49
+ try {
50
+ const res = await fetch(url, {
51
+ signal: ctrl.signal,
52
+ redirect: 'follow',
53
+ headers: {
54
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ds-agent/1.0',
55
+ 'Accept-Language': 'en-US,en;q=0.9,ru;q=0.8',
56
+ ...headers,
57
+ },
58
+ });
59
+ const ct = res.headers.get('content-type') || '';
60
+ const body = await res.text();
61
+ return { status: res.status, url: res.url, contentType: ct, body };
62
+ }
63
+ finally {
64
+ clearTimeout(t);
65
+ }
66
+ }
67
+ // Отдельный headless-браузер для JS-страниц.
68
+ // Ленивая инициализация, чтобы не тратить ресурсы впустую.
69
+ let _headless = null;
70
+ async function getHeadless() {
71
+ if (_headless)
72
+ return _headless;
73
+ _headless = await chromium.launch({
74
+ headless: true,
75
+ args: ['--disable-blink-features=AutomationControlled'],
76
+ });
77
+ return _headless;
78
+ }
79
+ export async function closeWeb() {
80
+ if (_headless) {
81
+ try {
82
+ await _headless.close();
83
+ }
84
+ catch { }
85
+ _headless = null;
86
+ }
87
+ }
88
+ async function renderWithHeadless(url, { timeout = DEFAULT_TIMEOUT } = {}) {
89
+ const browser = await getHeadless();
90
+ const ctx = await browser.newContext({
91
+ userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
92
+ });
93
+ const page = await ctx.newPage();
94
+ try {
95
+ const resp = await page.goto(url, {
96
+ waitUntil: 'domcontentloaded',
97
+ timeout,
98
+ });
99
+ // Дать JS немного времени дорисовать
100
+ await page.waitForTimeout(1500);
101
+ const html = await page.content();
102
+ const status = resp ? resp.status() : 0;
103
+ const finalUrl = page.url();
104
+ return { status, url: finalUrl, html };
105
+ }
106
+ finally {
107
+ await ctx.close();
108
+ }
109
+ }
110
+ // ---------- инструменты ----------
111
+ export function createWebTools() {
112
+ return [
113
+ {
114
+ name: 'WebFetch',
115
+ description: 'Загрузить URL и вернуть очищенный текст страницы (без HTML-тегов). ' +
116
+ 'Используй для чтения документации, статей, README на GitHub. ' +
117
+ 'Если страница рендерится JavaScript-ом и текст пустой — попробуй ещё раз с render=true.',
118
+ parameters: {
119
+ url: 'string',
120
+ render: 'boolean?',
121
+ maxChars: 'number?',
122
+ },
123
+ fn: async ({ url, render, maxChars }) => {
124
+ if (!/^https?:\/\//i.test(String(url))) {
125
+ return `Ошибка: URL должен начинаться с http:// или https://`;
126
+ }
127
+ const limit = Math.min(Number(maxChars) || MAX_TEXT, 60_000);
128
+ try {
129
+ if (render) {
130
+ const r = await renderWithHeadless(String(url));
131
+ const text = htmlToText(r.html);
132
+ return formatResult(r.status, r.url, text, limit);
133
+ }
134
+ const r = await httpFetch(String(url));
135
+ // Если это JSON/plain text — вернуть как есть
136
+ if (/application\/json|text\/plain|text\/markdown/i.test(r.contentType)) {
137
+ const trimmed = r.body.slice(0, limit);
138
+ return `HTTP ${r.status} ${r.url}\nContent-Type: ${r.contentType}\n\n${trimmed}`;
139
+ }
140
+ // HTML — почистить
141
+ const text = htmlToText(r.body);
142
+ // Если текста почти нет — вероятно JS-страница, дать намёк
143
+ if (text.length < 200) {
144
+ return (`HTTP ${r.status} ${r.url}\n` +
145
+ `Content-Type: ${r.contentType}\n\n` +
146
+ `Страница почти пустая в сыром HTML (${text.length} символов). ` +
147
+ `Похоже, контент рендерится JavaScript-ом. ` +
148
+ `Повтори вызов с render=true.\n\n---\n${text}`);
149
+ }
150
+ return formatResult(r.status, r.url, text, limit);
151
+ }
152
+ catch (e) {
153
+ return `Ошибка загрузки ${url}: ${e.message}`;
154
+ }
155
+ },
156
+ },
157
+ {
158
+ name: 'WebSearch',
159
+ description: 'Поиск в интернете через DuckDuckGo HTML (без API-ключа). ' +
160
+ 'Возвращает список результатов: заголовок, URL, краткое описание.',
161
+ parameters: {
162
+ query: 'string',
163
+ maxResults: 'number?',
164
+ },
165
+ fn: async ({ query, maxResults }) => {
166
+ const q = encodeURIComponent(String(query || ''));
167
+ if (!q)
168
+ return 'Ошибка: query пустой.';
169
+ const limit = Math.min(Math.max(Number(maxResults) || 8, 1), 20);
170
+ try {
171
+ const r = await httpFetch(`https://html.duckduckgo.com/html/?q=${q}`, {
172
+ timeout: 25_000,
173
+ headers: {
174
+ Accept: 'text/html,application/xhtml+xml',
175
+ },
176
+ });
177
+ if (r.status !== 200) {
178
+ return `DuckDuckGo вернул HTTP ${r.status}`;
179
+ }
180
+ // Парсим простыми регексами. Формат html.duckduckgo.com стабильный.
181
+ const results = [];
182
+ const re = /<a[^>]*class="[^"]*result__a[^"]*"[^>]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a>[\s\S]*?(?:<a[^>]*class="[^"]*result__snippet[^"]*"[^>]*>([\s\S]*?)<\/a>)?/gi;
183
+ let m;
184
+ while ((m = re.exec(r.body)) && results.length < limit) {
185
+ let href = m[1];
186
+ // DuckDuckGo заворачивает ссылки в редирект вида /l/?uddg=...
187
+ const uddgMatch = href.match(/[?&]uddg=([^&]+)/);
188
+ if (uddgMatch)
189
+ href = decodeURIComponent(uddgMatch[1]);
190
+ const title = htmlToText(m[2] || '').trim();
191
+ const snippet = htmlToText(m[3] || '').trim();
192
+ if (!title || !href)
193
+ continue;
194
+ results.push({ title, url: href, snippet });
195
+ }
196
+ if (!results.length) {
197
+ return `Результатов не найдено. Возможно, изменился формат выдачи DuckDuckGo.`;
198
+ }
199
+ const lines = results.map((r, i) => `${i + 1}. ${r.title}\n ${r.url}` +
200
+ (r.snippet ? `\n ${r.snippet}` : ''));
201
+ return lines.join('\n\n');
202
+ }
203
+ catch (e) {
204
+ return `Ошибка поиска: ${e.message}`;
205
+ }
206
+ },
207
+ },
208
+ ];
209
+ }
210
+ function formatResult(status, url, text, limit) {
211
+ let out = text;
212
+ let truncated = false;
213
+ if (out.length > limit) {
214
+ out = out.slice(0, limit);
215
+ truncated = true;
216
+ }
217
+ return (`HTTP ${status} ${url}\n\n${out}` +
218
+ (truncated ? `\n\n[...обрезано на ${limit} символах]` : ''));
219
+ }
220
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ function unescapeXml(s) {
2
+ const A = String.fromCharCode(38); // ampersand
3
+ return String(s)
4
+ .split(A + 'lt;').join(String.fromCharCode(60))
5
+ .split(A + 'gt;').join(String.fromCharCode(62))
6
+ .split(A + 'quot;').join(String.fromCharCode(34))
7
+ .split(A + 'apos;').join(String.fromCharCode(39))
8
+ .split(A + 'amp;').join(A);
9
+ }
10
+ function readAttr(attrs, name) {
11
+ const Q = String.fromCharCode(34);
12
+ const re = new RegExp(name + '[ ]*=[ ]*([' + Q + ']([^' + Q + ']*)[' + Q + '])');
13
+ const m = attrs.match(re);
14
+ return m ? m[2] : null;
15
+ }
16
+ export function parseXmlToolCalls(text) {
17
+ if (!text || typeof text !== 'string')
18
+ return null;
19
+ if (!/<[^>]*invoke/i.test(text))
20
+ return null;
21
+ const invokeRe = /<[^>]*?invoke([^>]*)>/gi;
22
+ const calls = [];
23
+ let m;
24
+ while ((m = invokeRe.exec(text)) !== null) {
25
+ const attrs = m[1] || '';
26
+ const name = readAttr(attrs, 'name');
27
+ if (!name)
28
+ continue;
29
+ const rest = text.slice(invokeRe.lastIndex);
30
+ const closeRe = /<\/[^>]*?invoke[^>]*>/i;
31
+ const closeMatch = closeRe.exec(rest);
32
+ const body = closeMatch ? rest.slice(0, closeMatch.index) : rest;
33
+ const args = {};
34
+ const paramRe = /<[^>]*?parameter([^>]*)>([\s\S]*?)<\/[^>]*?parameter[^>]*>/gi;
35
+ let p;
36
+ while ((p = paramRe.exec(body)) !== null) {
37
+ const pname = readAttr(p[1] || '', 'name');
38
+ if (!pname)
39
+ continue;
40
+ const isString = /string[ ]*=[ ]*"?true"?/i.test(p[1] || '');
41
+ let value = unescapeXml(p[2]);
42
+ if (!isString) {
43
+ try {
44
+ value = JSON.parse(value);
45
+ }
46
+ catch { }
47
+ }
48
+ args[pname] = value;
49
+ }
50
+ // Некоторые модели кладут весь JSON-объект аргументов в один
51
+ // parameter с именем args. Разворачиваем, чтобы не было
52
+ // {args: {args: {...}}}.
53
+ let finalArgs = args;
54
+ const keys = Object.keys(args);
55
+ if (keys.length === 1 &&
56
+ keys[0] === 'args' &&
57
+ args.args &&
58
+ typeof args.args === 'object' &&
59
+ !Array.isArray(args.args)) {
60
+ finalArgs = args.args;
61
+ }
62
+ calls.push({ tool: name, args: finalArgs });
63
+ }
64
+ if (!calls.length)
65
+ return null;
66
+ return calls.length === 1 ? calls[0] : calls;
67
+ }
68
+ //# sourceMappingURL=xml-toolcall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml-toolcall.js","sourceRoot":"","sources":["../src/xml-toolcall.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,20 +1,23 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "1.2.0",
3
+ "version": "2.0.0",
4
4
  "description": "Terminal coding agent over chat.deepseek.com via Playwright",
5
5
  "type": "module",
6
6
  "bin": {
7
- "zames": "src/index.js"
7
+ "zames": "dist/index.js"
8
8
  },
9
9
  "files": [
10
- "src",
10
+ "dist",
11
11
  "README.md",
12
12
  "LICENSE",
13
13
  "logo.png"
14
14
  ],
15
15
  "scripts": {
16
- "start": "node ./src/index.js",
17
- "dev": "node ./src/index.js --dev"
16
+ "start": "node ./dist/index.js",
17
+ "dev": "tsx ./src/index.ts --dev",
18
+ "build": "tsc",
19
+ "typecheck": "tsc --noEmit",
20
+ "prepublishOnly": "npm run build"
18
21
  },
19
22
  "keywords": [
20
23
  "agent",
@@ -45,5 +48,10 @@
45
48
  "homepage": "https://github.com/Viqto0r/zames_pro#readme",
46
49
  "bugs": {
47
50
  "url": "https://github.com/Viqto0r/zames_pro/issues"
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "^26.6.2",
54
+ "tsx": "^4.23.15",
55
+ "typescript": "^7.0.2"
48
56
  }
49
57
  }