wormclaude 1.0.136 → 1.0.138

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.
@@ -9,7 +9,8 @@ import { safeJsonParse } from './safejson.js';
9
9
  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
- const TOOL_PREFIX_RE = new RegExp('(?:^|[\\n>*`\\s])(' + _TOOLS + ')\\s*\\{');
12
+ // name ile `{` arasında opsiyonel `,`/`:` olabilir: `Write {`, `Write,{`, `Write, {`, `Write: {`.
13
+ const TOOL_PREFIX_RE = new RegExp('(?:^|[\\n>*`\\s])(' + _TOOLS + ')\\s*[,:]?\\s*\\{');
13
14
  // Fonksiyon-çağrı pseudo-syntax'i: `Write(file_path="...", content="""...""")`.
14
15
  const TOOL_PAREN_RE = new RegExp('(' + _TOOLS + ')\\s*\\(');
15
16
  // `key="val"` / `key='val'` / `key="""val"""` argümanlarını çözer (content çok-satırlı olabilir).
@@ -236,10 +237,11 @@ export function recoverInlineToolCalls(text) {
236
237
  // 5) "ToolName { ...args... }" — model araç adını JSON DIŞINA koyuyor (Bash {"command":...}).
237
238
  // Args doğrudan obje (arguments sarmalı yok) → {name: ToolName, arguments: {...}}.
238
239
  if (!out.length) {
239
- const re = new RegExp('(' + _TOOLS + ')\\s*(\\{)', 'g');
240
+ const re = new RegExp('(' + _TOOLS + ')\\s*[,:]?\\s*(\\{)', 'g');
240
241
  let mm;
241
242
  while ((mm = re.exec(t)) !== null) {
242
- const objs = extractTopLevelJsonObjects(t.slice(mm.index + mm[1].length));
243
+ // mm[2] = '{' konumu; name'den { 'a kadar olan kısmı (virgül/boşluk) atla.
244
+ const objs = extractTopLevelJsonObjects(t.slice(mm.index + mm[0].length - 1));
243
245
  if (objs.length) {
244
246
  const args = safeJsonParse(objs[0], null);
245
247
  if (args && typeof args === 'object' && !Array.isArray(args))
@@ -293,7 +295,7 @@ export function stripInlineToolCalls(text) {
293
295
  s = s.replace(/AskUserQuestion[\s\S]*?\[[^\]]*\]\s*/gi, '');
294
296
  // ToolName {…} biçimi (Bash {"command":...}) — adı + ardından gelen dengeli {…} bloğunu sil.
295
297
  {
296
- const re = new RegExp('(' + _TOOLS + ')\\s*\\{', 'g');
298
+ const re = new RegExp('(' + _TOOLS + ')\\s*[,:]?\\s*\\{', 'g');
297
299
  let mm;
298
300
  const spans = [];
299
301
  while ((mm = re.exec(s)) !== null) {
package/dist/theme.js CHANGED
@@ -16,4 +16,4 @@ export const theme = {
16
16
  synType: '#a78bfa', // tip/sınıf adları, sabitler
17
17
  synProp: '#e0e0e0', // özellik/anahtar adları
18
18
  };
19
- export const VERSION = '1.0.136';
19
+ export const VERSION = '1.0.138';
package/dist/tui.js CHANGED
@@ -394,8 +394,13 @@ export async function runTui() {
394
394
  if (toolCalls.length)
395
395
  am.tool_calls = toolCalls.map((t) => ({ id: t.id, type: 'function', function: { name: t.name, arguments: t.args || '{}' } }));
396
396
  history.push(am);
397
- if (answer)
398
- lastAnswer = answer; // gösterim akışta yapıldı; tekrar printItem YOK (duplikasyon olmaz)
397
+ if (answer) {
398
+ lastAnswer = answer;
399
+ // RESIZE FIX: gösterim akışta stdout'a yapıldı ama displayItems'a da KAYDET ki resize/redraw
400
+ // sonrası cevap kaybolmasın. printItem YOK (stdout'a tekrar yazmaz → akışta duplikasyon olmaz),
401
+ // sadece diziye ekle → redrawAll() onu geri çizebilir.
402
+ displayItems.push({ kind: 'assistant', text: answer });
403
+ }
399
404
  if (!toolCalls.length)
400
405
  break;
401
406
  // takılma koruması: aynı araç-çağrısı 3 kez üst üste → dur
@@ -475,6 +480,10 @@ export async function runTui() {
475
480
  process.stdout.write('\x1b[?1000l\x1b[?1002l\x1b[?1003l\x1b[?1006l\x1b[?1015l\x1b[?1007l');
476
481
  }
477
482
  catch { }
483
+ try {
484
+ process.stdout.write('\x1b[?2004h');
485
+ }
486
+ catch { } // bracketed paste AÇ (çok-satırlı yapıştırma)
478
487
  process.stdout.write('\x1b[?25l'); // gerçek imleci gizle (kendi ▌ bloğumuzu çiziyoruz)
479
488
  redrawAll();
480
489
  // Açılış: Claude tarzı GÜVEN ekranı — trust metni (içerik) + ok-tuşlu Evet/Hayır seçici (ask modal).
@@ -502,13 +511,45 @@ export async function runTui() {
502
511
  } }).catch(() => { });
503
512
  connectMcpServers().then((srv) => { if (srv && srv.length)
504
513
  printItem({ kind: 'note', text: t('tui.mcpConnected', srv.length) }); }).catch(() => { }); // MCP araçları (varsa)
505
- const quit = () => { process.stdout.write('\x1b[r\x1b[?25h\x1b[2J\x1b[3J\x1b[H'); process.exit(0); };
514
+ const quit = () => { process.stdout.write('\x1b[?2004l\x1b[r\x1b[?25h\x1b[2J\x1b[3J\x1b[H'); process.exit(0); };
506
515
  process.on('exit', () => { try {
507
- process.stdout.write('\x1b[r\x1b[?25h');
516
+ process.stdout.write('\x1b[?2004l\x1b[r\x1b[?25h');
508
517
  }
509
518
  catch { } });
510
519
  let ctrlcAt = 0;
520
+ let pasting = false; // bracketed-paste içinde miyiz (ESC[200~ … ESC[201~)
511
521
  process.stdin.on('keypress', (str, key) => {
522
+ // ── BRACKETED PASTE ────────────────────────────────────────────────────
523
+ // Terminal yapıştırmayı ESC[200~ … ESC[201~ ile sarar. İşaretçiler arasında
524
+ // gelen 'return' = SATIR SONU (submit DEĞİL) → çok-satırlı metin tek seferde
525
+ // input'a girer. Enter'a SADECE gerçek işaretçi gelince dokunur; işaretçi yoksa
526
+ // normal Enter davranışı AYNEN korunur (asla bozulmaz).
527
+ const _seq = (key && key.sequence) || str || '';
528
+ if (_seq.indexOf('[200~') !== -1) {
529
+ pasting = true;
530
+ return;
531
+ }
532
+ if (_seq.indexOf('[201~') !== -1) {
533
+ pasting = false;
534
+ scheduleFooter();
535
+ return;
536
+ }
537
+ if (pasting) {
538
+ if (key && (key.name === 'return' || key.name === 'enter')) {
539
+ inputBuf = inputBuf.slice(0, inputCur) + '\n' + inputBuf.slice(inputCur);
540
+ inputCur++;
541
+ cmdSel = 0;
542
+ scheduleFooter();
543
+ return;
544
+ }
545
+ if (str && !str.startsWith('\x1b') && !/[\x00-\x08\x0e-\x1f]/.test(str)) {
546
+ inputBuf = inputBuf.slice(0, inputCur) + str + inputBuf.slice(inputCur);
547
+ inputCur += str.length;
548
+ cmdSel = 0;
549
+ scheduleFooter();
550
+ }
551
+ return; // paste sırasında diğer tüm tuş işlemlerini atla
552
+ }
512
553
  // Soru dialogu (AskUserQuestion) aktifse: ↑↓ / 1-9 seç, Enter onayla, Esc/Ctrl+C ilk seçenek
513
554
  if (ask) {
514
555
  const n = ask.options.length;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wormclaude",
3
- "version": "1.0.136",
3
+ "version": "1.0.138",
4
4
  "description": "WormClaude CLI - uncensored security+code assistant (ink TUI, Claude-style)",
5
5
  "type": "module",
6
6
  "bin": {