wormclaude 1.0.127 → 1.0.129
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/dist/inlinetools.js +125 -2
- package/dist/theme.js +1 -1
- package/dist/tools.js +13 -3
- package/package.json +1 -1
package/dist/inlinetools.js
CHANGED
|
@@ -10,6 +10,97 @@ const ARG_KEYS = ['arguments', 'parameters', 'input', 'args', 'params'];
|
|
|
10
10
|
// Model araç adını JSON DIŞINA koyabiliyor: `Bash {"command":...}` / `Write {"file_path":...}`.
|
|
11
11
|
const _TOOLS = 'Bash|PowerShell|Read|Write|Edit|Glob|Grep|WebFetch|WebSearch|Sleep|TaskOutput';
|
|
12
12
|
const TOOL_PREFIX_RE = new RegExp('(?:^|[\\n>*`\\s])(' + _TOOLS + ')\\s*\\{');
|
|
13
|
+
// Fonksiyon-çağrı pseudo-syntax'i: `Write(file_path="...", content="""...""")`.
|
|
14
|
+
const TOOL_PAREN_RE = new RegExp('(' + _TOOLS + ')\\s*\\(');
|
|
15
|
+
// `key="val"` / `key='val'` / `key="""val"""` argümanlarını çözer (content çok-satırlı olabilir).
|
|
16
|
+
function _parseKwCall(s) {
|
|
17
|
+
const unesc = (str) => str.replace(/\\(["'\\/nrt])/g, (_m, c) => (c === 'n' ? '\n' : c === 'r' ? '\r' : c === 't' ? '\t' : c));
|
|
18
|
+
const args = {};
|
|
19
|
+
let i = 0;
|
|
20
|
+
const n = s.length;
|
|
21
|
+
let guard = 0;
|
|
22
|
+
while (i < n && guard++ < 20) {
|
|
23
|
+
while (i < n && /[\s,]/.test(s[i]))
|
|
24
|
+
i++;
|
|
25
|
+
if (i >= n || s[i] === ')')
|
|
26
|
+
break;
|
|
27
|
+
const km = /^([a-zA-Z_]\w*)\s*[:=]\s*/.exec(s.slice(i));
|
|
28
|
+
if (!km)
|
|
29
|
+
break;
|
|
30
|
+
i += km[0].length;
|
|
31
|
+
const key = km[1];
|
|
32
|
+
if (s.startsWith('"""', i)) {
|
|
33
|
+
const e = s.indexOf('"""', i + 3);
|
|
34
|
+
if (e < 0)
|
|
35
|
+
break;
|
|
36
|
+
args[key] = s.slice(i + 3, e);
|
|
37
|
+
i = e + 3;
|
|
38
|
+
}
|
|
39
|
+
else if (s.startsWith("'''", i)) {
|
|
40
|
+
const e = s.indexOf("'''", i + 3);
|
|
41
|
+
if (e < 0)
|
|
42
|
+
break;
|
|
43
|
+
args[key] = s.slice(i + 3, e);
|
|
44
|
+
i = e + 3;
|
|
45
|
+
}
|
|
46
|
+
else if (s[i] === '"' || s[i] === "'") {
|
|
47
|
+
const q = s[i];
|
|
48
|
+
i++;
|
|
49
|
+
let v = '';
|
|
50
|
+
while (i < n && s[i] !== q) {
|
|
51
|
+
if (s[i] === '\\' && i + 1 < n) {
|
|
52
|
+
v += s.slice(i, i + 2);
|
|
53
|
+
i += 2;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
v += s[i];
|
|
57
|
+
i++;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
i++;
|
|
61
|
+
args[key] = unesc(v);
|
|
62
|
+
}
|
|
63
|
+
else
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
return Object.keys(args).length ? args : null;
|
|
67
|
+
}
|
|
68
|
+
// `ToolName(` açılışından eşleşen `)`'ye kadar (string/triple-quote duyarlı) bitiş indexi.
|
|
69
|
+
function _findCallEnd(s, open) {
|
|
70
|
+
let depth = 0, i = open;
|
|
71
|
+
while (i < s.length) {
|
|
72
|
+
if (s.startsWith('"""', i)) {
|
|
73
|
+
const e = s.indexOf('"""', i + 3);
|
|
74
|
+
i = e < 0 ? s.length : e + 3;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (s.startsWith("'''", i)) {
|
|
78
|
+
const e = s.indexOf("'''", i + 3);
|
|
79
|
+
i = e < 0 ? s.length : e + 3;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const c = s[i];
|
|
83
|
+
if (c === '"' || c === "'") {
|
|
84
|
+
i++;
|
|
85
|
+
while (i < s.length && s[i] !== c) {
|
|
86
|
+
if (s[i] === '\\')
|
|
87
|
+
i++;
|
|
88
|
+
i++;
|
|
89
|
+
}
|
|
90
|
+
i++;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (c === '(')
|
|
94
|
+
depth++;
|
|
95
|
+
else if (c === ')') {
|
|
96
|
+
depth--;
|
|
97
|
+
if (depth === 0)
|
|
98
|
+
return i + 1;
|
|
99
|
+
}
|
|
100
|
+
i++;
|
|
101
|
+
}
|
|
102
|
+
return -1;
|
|
103
|
+
}
|
|
13
104
|
function toToolCall(obj, i) {
|
|
14
105
|
if (!obj || typeof obj !== 'object')
|
|
15
106
|
return null;
|
|
@@ -76,8 +167,8 @@ function extractTopLevelJsonObjects(text) {
|
|
|
76
167
|
* (<tool_call>, ```json) veya mesajın TAMAMI tek JSON çağrısıysa onu alır. */
|
|
77
168
|
export function recoverInlineToolCalls(text) {
|
|
78
169
|
const t = (text || '').trim();
|
|
79
|
-
// JSON/prose/ToolName{…} çağrısı yoksa erken çık.
|
|
80
|
-
if (!t || (!t.includes('"name"') && !t.includes('"tool"') && !t.includes('"function"') && !/AskUserQuestion/i.test(t) && !TOOL_PREFIX_RE.test(t)))
|
|
170
|
+
// JSON/prose/ToolName{…}/ToolName(…) çağrısı yoksa erken çık.
|
|
171
|
+
if (!t || (!t.includes('"name"') && !t.includes('"tool"') && !t.includes('"function"') && !/AskUserQuestion/i.test(t) && !TOOL_PREFIX_RE.test(t) && !TOOL_PAREN_RE.test(t)))
|
|
81
172
|
return [];
|
|
82
173
|
const out = [];
|
|
83
174
|
const seen = new Set();
|
|
@@ -143,6 +234,22 @@ export function recoverInlineToolCalls(text) {
|
|
|
143
234
|
}
|
|
144
235
|
}
|
|
145
236
|
}
|
|
237
|
+
// 6) "ToolName(key=...)" fonksiyon-çağrı pseudo-syntax'i (Write(file_path="...", content="""...""")).
|
|
238
|
+
if (!out.length) {
|
|
239
|
+
const re = new RegExp('(' + _TOOLS + ')\\s*\\(', 'g');
|
|
240
|
+
let mm;
|
|
241
|
+
while ((mm = re.exec(t)) !== null) {
|
|
242
|
+
const open = mm.index + mm[0].length - 1; // '(' konumu
|
|
243
|
+
const end = _findCallEnd(t, open);
|
|
244
|
+
if (end < 0)
|
|
245
|
+
continue;
|
|
246
|
+
const args = _parseKwCall(t.slice(open + 1, end - 1));
|
|
247
|
+
if (args) {
|
|
248
|
+
push({ name: mm[1], arguments: args });
|
|
249
|
+
re.lastIndex = end;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
146
253
|
return out;
|
|
147
254
|
}
|
|
148
255
|
/** Modelin komut/çıktıyı TEKRAR yazdığı kod-bloklarını siler (```plaintext/bash/http/console…).
|
|
@@ -207,5 +314,21 @@ export function stripInlineToolCalls(text) {
|
|
|
207
314
|
for (let i = spans.length - 1; i >= 0; i--)
|
|
208
315
|
s = s.slice(0, spans[i][0]) + s.slice(spans[i][1]);
|
|
209
316
|
}
|
|
317
|
+
// ToolName(…) biçimi (Write(file_path="...", content="""...""")) — adı + () bloğunu sil.
|
|
318
|
+
{
|
|
319
|
+
const re = new RegExp('(' + _TOOLS + ')\\s*\\(', 'g');
|
|
320
|
+
let mm;
|
|
321
|
+
const spans = [];
|
|
322
|
+
while ((mm = re.exec(s)) !== null) {
|
|
323
|
+
const open = mm.index + mm[0].length - 1;
|
|
324
|
+
const end = _findCallEnd(s, open);
|
|
325
|
+
if (end > 0) {
|
|
326
|
+
spans.push([mm.index, end]);
|
|
327
|
+
re.lastIndex = end;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
for (let i = spans.length - 1; i >= 0; i--)
|
|
331
|
+
s = s.slice(0, spans[i][0]) + s.slice(spans[i][1]);
|
|
332
|
+
}
|
|
210
333
|
return s.trim();
|
|
211
334
|
}
|
package/dist/theme.js
CHANGED
package/dist/tools.js
CHANGED
|
@@ -43,6 +43,9 @@ export function resolveWs(fp) {
|
|
|
43
43
|
return fp;
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
+
// WebFetch önbelleği: model aynı URL'i bir cevap içinde defalarca (7×) çekiyordu (farklı prompt'larla
|
|
47
|
+
// ama sayfa aynı) → israf + kafa karışıklığı. Aynı URL 2 dk içinde tekrar istenirse cache'den döner.
|
|
48
|
+
const _webFetchCache = new Map();
|
|
46
49
|
// Komutu çalıştırır ve sonrasında cwd değişikliğini (cd) yakalayıp bashCwd'yi günceller.
|
|
47
50
|
// POSIX: pwd'yi temp dosyaya yazan, çıkış kodunu KORUYAN sarmalayıcı (hata propagasyonu bozulmaz).
|
|
48
51
|
// Windows: komutu olduğu gibi çalıştır, sonra baştaki `cd <hedef>`'i regex ile yakala (best-effort).
|
|
@@ -1225,6 +1228,12 @@ export async function executeTool(name, args) {
|
|
|
1225
1228
|
let url = String(args.url);
|
|
1226
1229
|
if (url.startsWith('http://'))
|
|
1227
1230
|
url = 'https://' + url.slice(7);
|
|
1231
|
+
const header = args.prompt ? `[prompt: ${String(args.prompt).slice(0, 200)}]\n\n` : '';
|
|
1232
|
+
// Aynı URL bu oturumda 2 dk içinde çekildiyse → önbellekten (model 7× aynı sayfayı çekmesin).
|
|
1233
|
+
const _c = _webFetchCache.get(url);
|
|
1234
|
+
if (_c && Date.now() - _c.t < 120000) {
|
|
1235
|
+
return { ok: true, output: header + '[bu URL bu cevapta ZATEN çekildi — aşağıdaki içerikten OKU, tekrar çekme]\n\n' + _c.text };
|
|
1236
|
+
}
|
|
1228
1237
|
const res = await fetch(url, { signal: AbortSignal.timeout(20000) });
|
|
1229
1238
|
let txt = await res.text();
|
|
1230
1239
|
txt = txt
|
|
@@ -1232,9 +1241,10 @@ export async function executeTool(name, args) {
|
|
|
1232
1241
|
.replace(/<style[\s\S]*?<\/style>/gi, '')
|
|
1233
1242
|
.replace(/<[^>]+>/g, ' ')
|
|
1234
1243
|
.replace(/\s+/g, ' ')
|
|
1235
|
-
.trim()
|
|
1236
|
-
|
|
1237
|
-
|
|
1244
|
+
.trim()
|
|
1245
|
+
.slice(0, 15000);
|
|
1246
|
+
_webFetchCache.set(url, { text: txt, t: Date.now() });
|
|
1247
|
+
return { ok: true, output: header + (txt || '(empty)') };
|
|
1238
1248
|
}
|
|
1239
1249
|
if (name === 'WebSearch') {
|
|
1240
1250
|
// Once gateway arama proxy'sini dene (Tavily anahtari sunucuda ayarliysa onu kullanir; anahtar istemciye gelmez)
|