beast-agent 2.6.6 → 2.6.7

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "beast-agent",
3
3
  "productName": "Beast Agent",
4
- "version": "2.6.6",
4
+ "version": "2.6.7",
5
5
  "description": "Ultra-fast local agent shell for Windows.",
6
6
  "author": "algokodcom (AlgoKod)",
7
7
  "license": "MIT",
@@ -23,6 +23,8 @@
23
23
  tip_net_offline: 'İnternet: yok — bağlantı dönünce işler otomatik sürer',
24
24
  sess_drag: 'Sürükleyerek sırayı değiştir',
25
25
  sess_del_confirm: 'Bu sohbet oturumunu silmek istediğine emin misin?',
26
+ cf_ok: 'Evet, sil',
27
+ cf_cancel: 'Vazgeç',
26
28
  tipWatch: 'İzleyiciler (Watchers)',
27
29
  tipCron: 'Cron Görevler',
28
30
  tip_light: 'Açık tema',
@@ -653,6 +655,8 @@
653
655
  tip_net_online: 'Internet: connected',
654
656
  tip_net_offline: 'Internet: offline — work resumes automatically once the connection returns',
655
657
  sess_drag: 'Drag to reorder',
658
+ cf_ok: 'Yes, delete',
659
+ cf_cancel: 'Cancel',
656
660
  tipWatch: 'Watchers',
657
661
  tipCron: 'Cron Jobs',
658
662
  tip_light: 'Light theme',
@@ -452,6 +452,18 @@
452
452
 
453
453
  <div id="fileCtxMenu" hidden></div>
454
454
 
455
+ <!-- in-app onay penceresi: window.confirm Electron/Windows'ta input focus'unu
456
+ bozuyor (electron#31917) — native dialog YOK, hepsi bu modaldan döner -->
457
+ <div id="confirmOverlay" class="mini-overlay" hidden>
458
+ <div class="confirm-dialog">
459
+ <div id="confirmText" class="confirm-text"></div>
460
+ <div class="confirm-btns">
461
+ <button id="confirmCancel" class="btn ghost"></button>
462
+ <button id="confirmOk" class="btn danger"></button>
463
+ </div>
464
+ </div>
465
+ </div>
466
+
455
467
  <input type="file" id="fileInput" multiple hidden
456
468
  accept="image/*,.txt,.md,.json,.csv,.log,.js,.ts,.py,.ps1,.bat,.cmd,.html,.css,.yaml,.yml,.xml,.ini" />
457
469
 
@@ -362,6 +362,33 @@ function toast(msg) {
362
362
  }, 2200);
363
363
  }
364
364
 
365
+ /* IN-APP CONFIRM: window.confirm Electron/Windows'ta kapanınca input focus'unu
366
+ bozuyor (electron#31917 — yazma kabul etmez, klavye ölür). Native dialog
367
+ HİÇ açılmaz; bu modal söz verir (promise) ve kapanınca odağı geri verir. */
368
+ let confirmResolve = null;
369
+ function uiConfirm(msg, okLabel, cancelLabel) {
370
+ return new Promise((resolve) => {
371
+ const ov = $('#confirmOverlay');
372
+ if (!ov) { resolve(window.confirm(msg)); return; }
373
+ $('#confirmText').textContent = String(msg || '');
374
+ $('#confirmOk').textContent = okLabel || _t('cf_ok');
375
+ $('#confirmCancel').textContent = cancelLabel || _t('cf_cancel');
376
+ ov.hidden = false;
377
+ confirmResolve = resolve;
378
+ $('#confirmOk').focus();
379
+ });
380
+ }
381
+ function closeConfirm(result) {
382
+ const ov = $('#confirmOverlay');
383
+ if (ov) ov.hidden = true;
384
+ if (confirmResolve) {
385
+ const r = confirmResolve;
386
+ confirmResolve = null;
387
+ r(result);
388
+ els.input.focus(); /* odayı input'a geri ver — yazma asla kilitli kalmasın */
389
+ }
390
+ }
391
+
365
392
  /* ---------------- messages ---------------- */
366
393
 
367
394
  function addUserBubble(content, atts) {
@@ -829,12 +856,23 @@ async function renderSessions(list) {
829
856
  row.addEventListener('click', () => openSession(s.id));
830
857
  row.querySelector('.sess-del').addEventListener('click', async (e) => {
831
858
  e.stopPropagation();
832
- if (!window.confirm((_t('sess_del_confirm') || 'Bu sohbet oturumunu silmek istediğine emin misin?') + '\n\n' + (s.title || 'Yeni Sohbet'))) return;
859
+ const ok = await uiConfirm(
860
+ (_t('sess_del_confirm') || 'Bu sohbet oturumunu silmek istediğine emin misin?') + '\n\n' + (s.title || 'Yeni Sohbet')
861
+ );
862
+ if (!ok) return;
833
863
  await beast.deleteSession(s.id);
834
864
  if (s.id === activeId) {
865
+ /* aktif sohbet silindi: ÖLÜ UÇ bırakma — taze oturum aç, input yazılabilir
866
+ kalsın (activeId null kalırsa sendCurrent sessizce return eder) */
835
867
  activeId = null;
868
+ streamEl = null;
836
869
  els.msgs.innerHTML = '';
837
870
  showEmpty(true);
871
+ try {
872
+ const created = await beast.createSession();
873
+ await openSession(created.id);
874
+ } catch {}
875
+ els.input.focus();
838
876
  }
839
877
  sessionOrder = sessionOrder.filter((x) => x !== s.id);
840
878
  refreshSessions();
@@ -4400,8 +4438,8 @@ function renderBotSettings(pane, b) {
4400
4438
  else toast(r.error || _t('bot_save_fail'));
4401
4439
  });
4402
4440
  const delBtn = $('#bDel');
4403
- if (delBtn) delBtn.addEventListener('click', async () => {
4404
- if (!confirm(_ti('bot_confirm_del', b.name))) return;
4441
+ if (delBtn) delBtn.addEventListener('click', async () => {
4442
+ if (!(await uiConfirm(_ti('bot_confirm_del', b.name)))) return;
4405
4443
  const r = await beast.botsRemove(b.id);
4406
4444
  if (r.ok) {
4407
4445
  /* bot silme sonrası main otomatik restart atar — yeniden çizmeye kalkışma */
@@ -4943,7 +4981,13 @@ function onEvent(ev) {
4943
4981
  ingestAgentActivity(ev);
4944
4982
  return;
4945
4983
  }
4946
- if (ev.type === 'done' || ev.type === 'error') refreshSessions();
4984
+ if (ev.type === 'done' || ev.type === 'error') {
4985
+ /* başka oturumun işi bitti (silinen oturum dahil): busy'i de bırak —
4986
+ yoksa stopBtn görünür kalır, sonraki mesajlar 'kuyruğa eklendi'
4987
+ deyip sonsuza dek bekler (sohbet silince kilitlenme bu yüzden) */
4988
+ if (busy) setBusy(false);
4989
+ refreshSessions();
4990
+ }
4947
4991
  return;
4948
4992
  }
4949
4993
 
@@ -5791,11 +5835,30 @@ async function init() {
5791
5835
  }
5792
5836
 
5793
5837
  els.newChat.addEventListener('click', async () => {
5794
- const created = await beast.createSession();
5795
- await openSession(created.id);
5838
+ try {
5839
+ const created = await beast.createSession();
5840
+ await openSession(created.id);
5841
+ } catch (e) {
5842
+ toast('Yeni sohbet açılamadı: ' + ((e && e.message) || e));
5843
+ }
5796
5844
  els.input.focus();
5797
5845
  });
5798
5846
 
5847
+ /* in-app confirm modal düğmeleri + Enter/Esc kısayolları */
5848
+ {
5849
+ const ok = $('#confirmOk');
5850
+ const cancel = $('#confirmCancel');
5851
+ const ov = $('#confirmOverlay');
5852
+ if (ok && cancel && ov) {
5853
+ ok.addEventListener('click', () => closeConfirm(true));
5854
+ cancel.addEventListener('click', () => closeConfirm(false));
5855
+ ov.addEventListener('keydown', (e) => {
5856
+ if (e.key === 'Escape') { e.stopPropagation(); closeConfirm(false); }
5857
+ else if (e.key === 'Enter') { e.stopPropagation(); closeConfirm(true); }
5858
+ });
5859
+ }
5860
+ }
5861
+
5799
5862
  /* custom pencere butonları: küçült / büyüt / kapat — main'e window:ctrl ile gider.
5800
5863
  Büyüt ikonu maximize/unmaximize olayıyla senkron (□ / ❐). */
5801
5864
  const winMin = $('#winMin');
@@ -6052,7 +6115,7 @@ async function init() {
6052
6115
  });
6053
6116
  if (els.railClear) {
6054
6117
  els.railClear.addEventListener('click', async () => {
6055
- if (!confirm('TÜM paralel ajan geçmişi silinsin mi?\n(Çalışan ajanlar da iptal edilir — geri alınamaz)')) return;
6118
+ if (!(await uiConfirm('TÜM paralel ajan geçmişi silinsin mi?\n(Çalışan ajanlar da iptal edilir — geri alınamaz)'))) return;
6056
6119
  try {
6057
6120
  const r = await beast.agentsClearAll();
6058
6121
  if (r && r.ok) toast('Paralel ajan geçmişi silindi' + (r.removed ? ' — ' + r.removed + ' iş' : ''));
@@ -7616,15 +7679,16 @@ async function codeOpen(rel) {
7616
7679
  els.codeTa.focus();
7617
7680
  }
7618
7681
 
7619
- function codeClose(i) {
7682
+ async function codeClose(i) {
7620
7683
  if (i < 0 || i >= codeTabs.length) return;
7621
7684
  /* KAYIT DİSİPLİNİ: düzenlemeler yalnız Kaydet/Ctrl+S ile diske yazılır.
7622
7685
  Kaydedilmemiş sekme kapatılırken kullanıcıya sorulur — sessiz kayıp yok. */
7623
7686
  if (codeTabs[i].dirty) {
7624
- const ok = confirm(
7687
+ const ok = await uiConfirm(
7625
7688
  '"' + codeTabs[i].rel + '" kaydedilmedi.\n\n' +
7626
7689
  'Tamam = kaydetmeden kapat\n' +
7627
- 'İptal = editörde kal (kaydetmek için Ctrl+S)'
7690
+ 'İptal = editörde kal (kaydetmek için Ctrl+S)',
7691
+ 'Kaydetmeden kapat'
7628
7692
  );
7629
7693
  if (!ok) return;
7630
7694
  }
@@ -8217,7 +8281,7 @@ function bcResetPanel() {
8217
8281
  /* TEK oturum silme — onay sorulur */
8218
8282
  async function bcDeleteHistory(id, title) {
8219
8283
  if (!id) return;
8220
- if (!confirm('"' + (title || 'Beast Code oturumu') + '" silinsin mi?\n\nBu işlem geri alınamaz.')) return;
8284
+ if (!(await uiConfirm('"' + (title || 'Beast Code oturumu') + '" silinsin mi?\n\nBu işlem geri alınamaz.'))) return;
8221
8285
  const r = await beast.bcDelete(id).catch(() => null);
8222
8286
  if (!r || !r.ok) { toast((r && r.error) || 'silinemedi'); return; }
8223
8287
  if (bcSessionId === id) {
@@ -8234,7 +8298,7 @@ if (els.bcHistClear) els.bcHistClear.addEventListener('click', async () => {
8234
8298
  const r0 = await beast.bcHistory().catch(() => null);
8235
8299
  const n = r0 && r0.ok ? (r0.items || []).length : 0;
8236
8300
  if (!n) { toast('Silinecek oturum yok'); return; }
8237
- if (!confirm(n + ' Beast Code oturumunun TÜMÜ silinsin mi?\n\nBu işlem geri alınamaz.')) return;
8301
+ if (!(await uiConfirm(n + ' Beast Code oturumunun TÜMÜ silinsin mi?\n\nBu işlem geri alınamaz.'))) return;
8238
8302
  const r = await beast.bcDeleteAll().catch(() => null);
8239
8303
  if (!r || !r.ok) { toast((r && r.error) || 'silinemedi'); return; }
8240
8304
  /* aktif oturum da silindiyse panel tazelensin */
@@ -1575,6 +1575,23 @@ body.browser-open #settingsDialog { width: min(70vw, calc(100vw - var(--bw, 480p
1575
1575
  }
1576
1576
  .btn:hover { filter: brightness(1.08); }
1577
1577
  .btn.ghost { background: var(--panel2); color: var(--text); border: 1px solid var(--border); }
1578
+ .btn.danger { background: var(--err); color: var(--bg); }
1579
+
1580
+ /* in-app confirm (window.confirm Electron'ta input focus'unu bozuyor) */
1581
+ .confirm-dialog {
1582
+ width: min(420px, 88vw);
1583
+ background: var(--bg);
1584
+ border: 1px solid var(--border);
1585
+ border-radius: 14px;
1586
+ padding: 18px 20px 16px;
1587
+ box-shadow: 0 24px 64px rgba(0, 0, 0, 0.25);
1588
+ display: flex;
1589
+ flex-direction: column;
1590
+ gap: 14px;
1591
+ }
1592
+ .confirm-text { font-size: 13.5px; line-height: 1.5; white-space: pre-wrap; word-break: break-word; }
1593
+ .confirm-btns { display: flex; justify-content: flex-end; gap: 8px; }
1594
+ .confirm-btns .btn { margin-top: 0; }
1578
1595
 
1579
1596
  .inp {
1580
1597
  width: 100%;