beast-agent 1.0.1 → 1.1.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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "beast-agent",
3
3
  "productName": "Beast Agent",
4
- "version": "1.0.1",
4
+ "version": "1.1.0",
5
5
  "description": "Ultra-fast local agent shell for Windows.",
6
6
  "author": "algokodcom (AlgoKod)",
7
7
  "license": "MIT",
@@ -1333,6 +1333,7 @@ class Engine {
1333
1333
  '3) EDİT: VAR OLAN dosyada önce edit_file kullan (old_string/new_string ile yalnız ilgili bölümü değiştir; birden çok eşleşme varsa bağlam ekle ya da replace_all); write_file yalnız YENİ dosya ya da tam yeniden yazım için. İlgisiz yeniden biçimleme/kayıt boşluk değişikliği YAPMA.\n' +
1334
1334
  '4) DOĞRULA: edit sonrası mümkünse derle/test et/lint çalıştır (run_command); hata varsa DÜZELT ve TEKRAR dene (en fazla 2 doğrulama turu) — kırmızı bırakma.\n' +
1335
1335
  '5) RAPOR: 1-3 satır — ne değişti + doğrulama sonucu (ör. "npm test ✓ 154/154"). Uzun açıklama yok.\n' +
1336
+ 'CANLI ÖNİZLEME: web sitesi/app üretirsen son adımda ÇALIŞIR halde bırak (dev server ayakta ya da index.html yazılmış) — panel iş bitince ürettiğin şeyi dahili tarayıcıda otomatik canlı açar.\n' +
1336
1337
  'HIZ KURALLARI:\n' +
1337
1338
  '- Kodu ve dosyaları DOĞRUDAN write_file ile yaz; basit dosya oluşturma/düzenleme için Python scripti yazma; python_run yalnız gerçek hesap/veri işleme gerekiyorsa.\n' +
1338
1339
  '- Bağımsız araç çağrılarını AYNI TURDA paralel ver (birden çok read_file tek turda).\n' +
@@ -2786,6 +2787,9 @@ class Engine {
2786
2787
  let usageTotal = 0; // en yüksek görülen total_tokens — compaction tetiği
2787
2788
  let compacted = false; // run başına en fazla 1 compaction
2788
2789
  const recentSigs = []; // doom-loop dedektörü: son araç imzaları
2790
+ /* Beast Code canlı önizleme: run boyunca üretilen eserleri topla —
2791
+ iş bitince dahili tarayıcıda CANLI açılır (site/dev server/HTML) */
2792
+ const bcArtifacts = session.bcCode ? { html: [], serverUrl: null } : null;
2789
2793
  for (let turn = 0; turn < MAX_TURNS; turn++) {
2790
2794
  /* SÜRE SINIRI YOK — ama sonsuz tur da yok: bg ajan son 3 tura gelirken
2791
2795
  "raporu yaz ve bitir" uyarısı alır; MAX_TURNS sert tavan olarak kalır. */
@@ -2872,6 +2876,20 @@ class Engine {
2872
2876
  this._clearCrash();
2873
2877
  this._maybeCompact(sid);
2874
2878
  this._pruneSession(session); // opencode port: eski araç çıktıları temizlenir (fork edilen prune)
2879
+ /* Beast Code canlı önizleme: iş bitince üretilen site/app dahili
2880
+ tarayıcıda otomatik açılır (dev server öncelikli, sonra HTML) */
2881
+ if (bcArtifacts && (bcArtifacts.serverUrl || bcArtifacts.html.length)) {
2882
+ const url =
2883
+ bcArtifacts.serverUrl ||
2884
+ 'file:///' +
2885
+ path
2886
+ .resolve(
2887
+ this._sessionWorkspace(sid),
2888
+ bcArtifacts.html[bcArtifacts.html.length - 1]
2889
+ )
2890
+ .replace(/\\/g, '/');
2891
+ emit({ type: 'bc-preview', url });
2892
+ }
2875
2893
  emit({ type: 'done', usage: res.usage || null, meta: res.meta || null });
2876
2894
  this._bgFinish(sid, 'done');
2877
2895
  this.flushPendingReports(sid);
@@ -2920,6 +2938,34 @@ class Engine {
2920
2938
  } else {
2921
2939
  out = await this._execTool(name, args, ctrl.signal, sid);
2922
2940
  }
2941
+ /* Beast Code eser takibi: yazılan HTML + başlatılan dev server */
2942
+ if (bcArtifacts) {
2943
+ try {
2944
+ if (
2945
+ (name === 'write_file' || name === 'edit_file') &&
2946
+ args && args.path && /\.html?$/i.test(String(args.path))
2947
+ ) {
2948
+ bcArtifacts.html.push(String(args.path));
2949
+ }
2950
+ if (name === 'run_command') {
2951
+ const cmdStr = String((args && args.command) || '');
2952
+ const hay = cmdStr + '\n' + String(out || '').slice(0, 6000);
2953
+ const m = /https?:\/\/(?:localhost|127\.0\.0\.1)(?::\d{2,5})?[^\s'"<>]*/i.exec(hay);
2954
+ if (m) {
2955
+ bcArtifacts.serverUrl = m[0].replace(/[)\].,;:'"]+$/, '');
2956
+ } else {
2957
+ let port = 0;
2958
+ const hs = /python\s+-m\s+http\.server(?:[^\n]*?(\d{2,5}))?/i.exec(cmdStr);
2959
+ if (hs) port = Number(hs[1]) || 8000;
2960
+ else if (/\bvite\b/i.test(cmdStr)) port = 5173;
2961
+ else if (/\bnext dev\b/i.test(cmdStr)) port = 3000;
2962
+ else if (/\bng serve\b/i.test(cmdStr)) port = 4200;
2963
+ else if (/\b(npm (run )?(dev|start)|npx serve|live-server)\b/i.test(cmdStr)) port = 3000;
2964
+ if (port) bcArtifacts.serverUrl = 'http://localhost:' + port;
2965
+ }
2966
+ }
2967
+ } catch {}
2968
+ }
2923
2969
  // Ekran görüntüsü gibi araçlar görseli sonraki tura enjekte eder
2924
2970
  let injectedImage = null;
2925
2971
  try {
package/src/main.js CHANGED
@@ -5607,6 +5607,26 @@ ipcMain.handle('ide:preview', () => { try {
5607
5607
  }
5608
5608
  });
5609
5609
 
5610
+ /* BEAST CODE otomatik canlı önizleme: iş bitince üretilen site/app dahili
5611
+ tarayıcıda GÖRÜNÜR açılır. Yalnız localhost + file:// kabul edilir —
5612
+ dış adresler güvenlik için reddedilir. */
5613
+ ipcMain.handle('ide:previewUrl', (_e, url) => {
5614
+ try {
5615
+ const u = String(url || '');
5616
+ const okUrl =
5617
+ /^https?:\/\/(?:localhost|127\.0\.0\.1)(?::\d{2,5})?(?:\/|$)/i.test(u) ||
5618
+ /^file:\/\/\//i.test(u);
5619
+ if (!okUrl) return { ok: false, error: 'yalnız localhost/file:// adresleri önizlenebilir' };
5620
+ /* forceVisible: preview'a basmaya gerek kalmasın — otomatik ve GÖRÜNÜR açılır */
5621
+ setBrowserOpen(true, true);
5622
+ browser.view.webContents.loadURL(u).catch(() => {});
5623
+ browserEmit({ open: true, width: browser.width, url: u });
5624
+ return { ok: true, url: u };
5625
+ } catch (e) {
5626
+ return { ok: false, error: String((e && e.message) || e) };
5627
+ }
5628
+ });
5629
+
5610
5630
  ipcMain.handle('custom:set', (_e, list) => {
5611
5631
  settings.customProviders = Array.isArray(list) ? list : [];
5612
5632
  saveSettings();
package/src/preload.js CHANGED
@@ -179,6 +179,7 @@ contextBridge.exposeInMainWorld('beast', {
179
179
  ideWrite: (rel, content) => ipcRenderer.invoke('ide:write', { rel, content }),
180
180
  idePreview: () => ipcRenderer.invoke('ide:preview'),
181
181
  idePreviewFile: (rel) => ipcRenderer.invoke('ide:previewFile', rel),
182
+ idePreviewUrl: (url) => ipcRenderer.invoke('ide:previewUrl', url),
182
183
  ideDelete: (rel) => ipcRenderer.invoke('ide:delete', rel),
183
184
  onWaEvent: (cb) => ipcRenderer.on('wa:event', (_e, ev) => cb(ev)),
184
185
  onEvent: (cb) => ipcRenderer.on('agent:event', (_e, ev) => cb(ev)),
@@ -6278,6 +6278,25 @@ function bcRefreshPreview() {
6278
6278
  beast.idePreview().catch(() => {});
6279
6279
  }
6280
6280
 
6281
+ /* BEAST CODE canlı önizleme: engine iş sonunda eser tespit ederse
6282
+ (dev server / HTML) dahili tarayıcı otomatik GÖRÜNÜR açılır —
6283
+ kullanıcı preview tuşuna basmak zorunda kalmaz */
6284
+ function bcAutoPreview(url) {
6285
+ const u = String(url || '');
6286
+ if (
6287
+ !u ||
6288
+ !(
6289
+ /^https?:\/\/(?:localhost|127\.0\.0\.1)(?::\d{2,5})?(?:\/|$)/i.test(u) ||
6290
+ /^file:\/\/\//i.test(u)
6291
+ )
6292
+ ) {
6293
+ return;
6294
+ }
6295
+ bcPrevAt = Date.now(); /* ardından gelen done/idle çift yenilemesin */
6296
+ beast.idePreviewUrl(u).catch(() => {});
6297
+ bcLine('t-dim', '[canlı önizleme açıldı — ' + u + ']');
6298
+ }
6299
+
6281
6300
  /* ---------- Beast Code araç kutuları ----------
6282
6301
  Ard arda gelen araç çağrıları TEK kutuda toplanır. Kural: engine mesajı
6283
6302
  tool_calls İÇERİYORSA (iş turu) grup AÇIK kalır — aradaki ara yazılar kutu
@@ -6457,6 +6476,10 @@ function bcIngest(ev) {
6457
6476
  codeReloadIfOpen(wp);
6458
6477
  }
6459
6478
  break;
6479
+ case 'bc-preview':
6480
+ /* iş bitince üretilen site/app dahili tarayıcıda CANLI açılır */
6481
+ bcAutoPreview(ev.url);
6482
+ break;
6460
6483
  case 'bc-mode':
6461
6484
  /* OpenCode disiplini çalışma modu: başlıkta rozet + panelde bilgi satırı */
6462
6485
  if (els.bcTitle) {