turbollm 1.5.1 → 1.5.3

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 (84) hide show
  1. package/dist/cli.js +44 -8
  2. package/dist/webdist/assets/AgentsScreen-EiPT9y2w.js +2 -0
  3. package/dist/webdist/assets/ChatScreen-DUrkqMeC.js +57 -0
  4. package/dist/webdist/assets/{CustomizeScreen-uhKz3ulx.js → CustomizeScreen-D3gT5m17.js} +1 -1
  5. package/dist/webdist/assets/{DeveloperScreen-C2117jSw.js → DeveloperScreen-CrpBr1sb.js} +1 -1
  6. package/dist/webdist/assets/{EnginesScreen-Dl1lF8qJ.js → EnginesScreen-bg__-Fi5.js} +1 -1
  7. package/dist/webdist/assets/ModelDetailDialog-DJ7_7jXE.js +1 -0
  8. package/dist/webdist/assets/{ModelDirs-iqZFpRga.js → ModelDirs-D2fiDrlX.js} +1 -1
  9. package/dist/webdist/assets/ModelsScreen-_LBVdJl4.js +1 -0
  10. package/dist/webdist/assets/{SettingsScreen-QwzKX1gb.js → SettingsScreen-cFZbfIwT.js} +1 -1
  11. package/dist/webdist/assets/{arc-BPL4VCUo.js → arc-CkxesN47.js} +1 -1
  12. package/dist/webdist/assets/{architectureDiagram-3BPJPVTR-V8Zd2JHr.js → architectureDiagram-3BPJPVTR-095VL47n.js} +1 -1
  13. package/dist/webdist/assets/{blockDiagram-GPEHLZMM-C6pGJDrs.js → blockDiagram-GPEHLZMM-BvWCQJ88.js} +1 -1
  14. package/dist/webdist/assets/{c4Diagram-AAUBKEIU-_hXk5ziz.js → c4Diagram-AAUBKEIU-DMuOSoD7.js} +1 -1
  15. package/dist/webdist/assets/channel-DPr90gR6.js +1 -0
  16. package/dist/webdist/assets/check-C66UWSMM.js +1 -0
  17. package/dist/webdist/assets/{chunk-2J33WTMH-CGL1puVz.js → chunk-2J33WTMH-CDRuE0ZL.js} +1 -1
  18. package/dist/webdist/assets/{chunk-4BX2VUAB-DrYe7x90.js → chunk-4BX2VUAB-73mafPnW.js} +1 -1
  19. package/dist/webdist/assets/{chunk-55IACEB6-CGuQ4vHT.js → chunk-55IACEB6-QZcxum_K.js} +1 -1
  20. package/dist/webdist/assets/{chunk-727SXJPM-B8Wrrhxb.js → chunk-727SXJPM-CqmFodef.js} +1 -1
  21. package/dist/webdist/assets/{chunk-AQP2D5EJ-BbTLSwHS.js → chunk-AQP2D5EJ-CgXMhB73.js} +1 -1
  22. package/dist/webdist/assets/{chunk-FMBD7UC4-CRaaHdZE.js → chunk-FMBD7UC4-BJCFWImJ.js} +1 -1
  23. package/dist/webdist/assets/{chunk-ND2GUHAM-EDheV6SO.js → chunk-ND2GUHAM-iEKljTeu.js} +1 -1
  24. package/dist/webdist/assets/{chunk-QZHKN3VN-TQwy40rm.js → chunk-QZHKN3VN-VKpcy2sD.js} +1 -1
  25. package/dist/webdist/assets/{circle-check-DW1zSzW1.js → circle-check-C73Lr6Uy.js} +1 -1
  26. package/dist/webdist/assets/{circle-x-BVCygJX_.js → circle-x-vhvOc_s6.js} +1 -1
  27. package/dist/webdist/assets/classDiagram-4FO5ZUOK-CS-C7Cls.js +1 -0
  28. package/dist/webdist/assets/classDiagram-v2-Q7XG4LA2-CS-C7Cls.js +1 -0
  29. package/dist/webdist/assets/{common-BajDwLu1.js → common-DzMdqlCp.js} +1 -1
  30. package/dist/webdist/assets/{copy-button-CcOL_21W.js → copy-button-llYeGT-i.js} +1 -1
  31. package/dist/webdist/assets/{cose-bilkent-S5V4N54A-BDrO96pv.js → cose-bilkent-S5V4N54A-eGsFCV6V.js} +1 -1
  32. package/dist/webdist/assets/{dagre-BM42HDAG-CPU31zPQ.js → dagre-BM42HDAG-C2DRiz9O.js} +1 -1
  33. package/dist/webdist/assets/{diagram-2AECGRRQ-Bx8fkRjV.js → diagram-2AECGRRQ-FaJsb5ra.js} +1 -1
  34. package/dist/webdist/assets/{diagram-5GNKFQAL-BBYjy9Zt.js → diagram-5GNKFQAL-qAiWM4UF.js} +1 -1
  35. package/dist/webdist/assets/{diagram-KO2AKTUF-Dos-X-ZR.js → diagram-KO2AKTUF-bSkRUGWZ.js} +1 -1
  36. package/dist/webdist/assets/{diagram-LMA3HP47-wkj6OULt.js → diagram-LMA3HP47-pjs1A0Dk.js} +1 -1
  37. package/dist/webdist/assets/{diagram-OG6HWLK6-CmYjdk0L.js → diagram-OG6HWLK6-BqCMIsmf.js} +1 -1
  38. package/dist/webdist/assets/{dialog-hJPYu2Ov.js → dialog-DCS2uvxk.js} +1 -1
  39. package/dist/webdist/assets/{erDiagram-TEJ5UH35-CsbNDTPD.js → erDiagram-TEJ5UH35-Bv1h9dbW.js} +1 -1
  40. package/dist/webdist/assets/{flowDiagram-I6XJVG4X-BsFFxJiw.js → flowDiagram-I6XJVG4X-C-v71MLV.js} +1 -1
  41. package/dist/webdist/assets/{ganttDiagram-6RSMTGT7-U9sAiXNQ.js → ganttDiagram-6RSMTGT7-BV5AS1TO.js} +1 -1
  42. package/dist/webdist/assets/{gitGraphDiagram-PVQCEYII-CxJIMHUV.js → gitGraphDiagram-PVQCEYII-BxGo8YVL.js} +1 -1
  43. package/dist/webdist/assets/html2canvas.esm-DXEQVQnt.js +5 -0
  44. package/dist/webdist/assets/{index-Cj_l2rh0.js → index-DH6LUjzQ.js} +2 -2
  45. package/dist/webdist/assets/index-FmTuHPCZ.css +1 -0
  46. package/dist/webdist/assets/{infoDiagram-5YYISTIA-D4lI1s8i.js → infoDiagram-5YYISTIA-CYkfbi9v.js} +1 -1
  47. package/dist/webdist/assets/{ishikawaDiagram-YF4QCWOH-D4mglNig.js → ishikawaDiagram-YF4QCWOH-BnGF7ohg.js} +1 -1
  48. package/dist/webdist/assets/{journeyDiagram-JHISSGLW-CdEi7F6r.js → journeyDiagram-JHISSGLW-CdHcTbON.js} +1 -1
  49. package/dist/webdist/assets/{kanban-definition-UN3LZRKU-DVLhy_z6.js → kanban-definition-UN3LZRKU-C7cGcsQk.js} +1 -1
  50. package/dist/webdist/assets/{linear-d5BrNoO6.js → linear-CDPDzqam.js} +1 -1
  51. package/dist/webdist/assets/{mermaid.core-fgLyIScK.js → mermaid.core-Bkp248fX.js} +4 -4
  52. package/dist/webdist/assets/{mindmap-definition-RKZ34NQL-D8Ucx5YR.js → mindmap-definition-RKZ34NQL-D4GkC3GJ.js} +1 -1
  53. package/dist/webdist/assets/{pencil-IA-fj275.js → pencil-Cfn97uuD.js} +1 -1
  54. package/dist/webdist/assets/{personas-fLJwmnEe.js → personas-C4oTeImA.js} +2 -0
  55. package/dist/webdist/assets/{pieDiagram-4H26LBE5-BBnuZwji.js → pieDiagram-4H26LBE5-CXEAL2o0.js} +1 -1
  56. package/dist/webdist/assets/{plus-Ct3egKtH.js → plus-BSLbFnG4.js} +1 -1
  57. package/dist/webdist/assets/{quadrantDiagram-W4KKPZXB-5_Ip_nW9.js → quadrantDiagram-W4KKPZXB-qOQG3ciS.js} +1 -1
  58. package/dist/webdist/assets/{refresh-cw-BBcxwtP-.js → refresh-cw-D6_BcM7q.js} +1 -1
  59. package/dist/webdist/assets/{requirementDiagram-4Y6WPE33-XC0l0R7d.js → requirementDiagram-4Y6WPE33-DsKVmkow.js} +1 -1
  60. package/dist/webdist/assets/{sankeyDiagram-5OEKKPKP-DJ-RNVjW.js → sankeyDiagram-5OEKKPKP-BpGFJ3p6.js} +1 -1
  61. package/dist/webdist/assets/{save-BhQrytFt.js → save-CkZF-RBo.js} +1 -1
  62. package/dist/webdist/assets/{sequenceDiagram-3UESZ5HK-CNvMsl4g.js → sequenceDiagram-3UESZ5HK-BtTWta9u.js} +1 -1
  63. package/dist/webdist/assets/{skeleton-CW1R2F_M.js → skeleton-C8uO_3IS.js} +1 -1
  64. package/dist/webdist/assets/{stateDiagram-AJRCARHV-CN9hLd2j.js → stateDiagram-AJRCARHV-ClaR6bLX.js} +1 -1
  65. package/dist/webdist/assets/stateDiagram-v2-BHNVJYJU-D8QU94bs.js +1 -0
  66. package/dist/webdist/assets/{timeline-definition-PNZ67QCA-D64WOfwg.js → timeline-definition-PNZ67QCA-Dgl-tSbG.js} +1 -1
  67. package/dist/webdist/assets/{trash-2-BY2m3pE3.js → trash-2-CqQWzJ1Q.js} +1 -1
  68. package/dist/webdist/assets/{vennDiagram-CIIHVFJN-FYpgKg2e.js → vennDiagram-CIIHVFJN-BaUjNRiO.js} +1 -1
  69. package/dist/webdist/assets/{wardley-L42UT6IY-B4qclGl3.js → wardley-L42UT6IY-CK0qHrWX.js} +1 -1
  70. package/dist/webdist/assets/{wardleyDiagram-YWT4CUSO-CdYxwShW.js → wardleyDiagram-YWT4CUSO-D7I0ntRP.js} +1 -1
  71. package/dist/webdist/assets/{wrench-_vB8fZmT.js → wrench-BMZR8C90.js} +1 -1
  72. package/dist/webdist/assets/{xychartDiagram-2RQKCTM6-bI3ZqIAG.js → xychartDiagram-2RQKCTM6-DGpy17g3.js} +1 -1
  73. package/dist/webdist/index.html +2 -2
  74. package/package.json +1 -1
  75. package/dist/webdist/assets/AgentsScreen-oDn4ZkM1.js +0 -2
  76. package/dist/webdist/assets/ChatScreen-CX4ra3WN.js +0 -55
  77. package/dist/webdist/assets/ModelDetailDialog-Da2p6itL.js +0 -1
  78. package/dist/webdist/assets/ModelsScreen-BsS0TO6W.js +0 -1
  79. package/dist/webdist/assets/channel-YTLuIsBj.js +0 -1
  80. package/dist/webdist/assets/check-BwuGRwaM.js +0 -1
  81. package/dist/webdist/assets/classDiagram-4FO5ZUOK-CK-He-ZA.js +0 -1
  82. package/dist/webdist/assets/classDiagram-v2-Q7XG4LA2-CK-He-ZA.js +0 -1
  83. package/dist/webdist/assets/index-B52Brf0-.css +0 -1
  84. package/dist/webdist/assets/stateDiagram-v2-BHNVJYJU-CQwepdnn.js +0 -1
package/dist/cli.js CHANGED
@@ -658,9 +658,24 @@ async function ensureMlxEnv(root, onProgress, upgrade = false) {
658
658
  const uv = await ensureUv(root, onProgress);
659
659
  const envDir = join3(root, "mlx", "venv");
660
660
  const py = venvPython(envDir);
661
+ if (existsSync3(py)) {
662
+ let compatible = false;
663
+ try {
664
+ const { stdout } = await execFileP2(py, ["--version"], { timeout: 5e3 });
665
+ const m = stdout.match(/Python 3\.(\d+)/);
666
+ if (m) {
667
+ const minor = Number(m[1]);
668
+ compatible = minor >= 10 && minor <= 13;
669
+ }
670
+ } catch {
671
+ }
672
+ if (!compatible) rmSync2(envDir, { recursive: true, force: true });
673
+ }
661
674
  if (!existsSync3(py)) {
662
675
  onProgress?.({ phase: "extracting", pct: -1 });
663
- await execFileP2(uv, ["venv", envDir], { cwd: root });
676
+ const PINNED_PYTHON = "cpython-3.12-macos-aarch64";
677
+ const venvArgs = ["venv", "--python", PINNED_PYTHON, ...existsSync3(envDir) ? ["--clear"] : [], envDir];
678
+ await execFileP2(uv, venvArgs, { cwd: root });
664
679
  }
665
680
  onProgress?.({ phase: "extracting", pct: -1 });
666
681
  const installArgs = ["pip", "install", "--python", py, ...upgrade ? ["--upgrade"] : [], "mlx-lm"];
@@ -3661,6 +3676,8 @@ function profileToArgs(p, m, caps, cores = 0) {
3661
3676
  const threads = p.threads > 0 ? p.threads : cores > 0 ? Math.max(1, Math.floor(cores / 2)) : 0;
3662
3677
  if (threads > 0) a.push("--threads", String(threads));
3663
3678
  if (p.threadsBatch > 0) a.push("--threads-batch", String(p.threadsBatch));
3679
+ if (p.batchSize && p.batchSize > 0 && has("--batch-size")) a.push("--batch-size", String(p.batchSize));
3680
+ if (p.uBatchSize && p.uBatchSize > 0 && has("--ubatch-size")) a.push("--ubatch-size", String(p.uBatchSize));
3664
3681
  if (m.vision && p.useMmproj && m.mmprojPath) a.push("--mmproj", m.mmprojPath);
3665
3682
  if (m.vision && p.useMmproj && !p.mmprojGpu && has("--no-mmproj-offload")) a.push("--no-mmproj-offload");
3666
3683
  if (p.imageMaxTokens > 0 && has("--image-max-tokens")) a.push("--image-max-tokens", String(p.imageMaxTokens));
@@ -4321,10 +4338,10 @@ var DownloadManager = class {
4321
4338
  let url;
4322
4339
  let filename;
4323
4340
  if (input.url) {
4324
- const u = input.url.trim();
4341
+ const u = normalizeHfBlobUrl(input.url.trim());
4325
4342
  if (!/^https?:\/\//i.test(u)) throw new DownloadError("invalid_url", "URL must start with http:// or https://.");
4326
4343
  const path = safePathname(u);
4327
- if (!subdir && !/\.gguf$/i.test(path) && !HF_BLOB_RE.test(u)) {
4344
+ if (!subdir && !/\.gguf$/i.test(path) && !HF_BLOB_RE.test(u.split("?")[0])) {
4328
4345
  throw new DownloadError("invalid_url", "URL must point to a .gguf file.");
4329
4346
  }
4330
4347
  filename = basename2(path);
@@ -4595,6 +4612,17 @@ var DownloadManager = class {
4595
4612
  function gb(bytes) {
4596
4613
  return (bytes / 1e9).toFixed(1);
4597
4614
  }
4615
+ function normalizeHfBlobUrl(u) {
4616
+ try {
4617
+ const parsed = new URL(u);
4618
+ if (parsed.hostname === "huggingface.co") {
4619
+ parsed.pathname = parsed.pathname.replace(/\/blob\//, "/resolve/");
4620
+ }
4621
+ return parsed.toString();
4622
+ } catch {
4623
+ return u;
4624
+ }
4625
+ }
4598
4626
  function safePathname(u) {
4599
4627
  try {
4600
4628
  return new URL(u).pathname;
@@ -7393,6 +7421,7 @@ var AgentRunner = class {
7393
7421
  acs = /* @__PURE__ */ new Map();
7394
7422
  queue = [];
7395
7423
  active = null;
7424
+ interruptedIds = /* @__PURE__ */ new Set();
7396
7425
  constructor(d) {
7397
7426
  this.d = d;
7398
7427
  }
@@ -7470,11 +7499,13 @@ var AgentRunner = class {
7470
7499
  this.d.db.updateAgentRun?.(pending.id, { status: "done", endedAt: (/* @__PURE__ */ new Date()).toISOString() });
7471
7500
  } catch (e) {
7472
7501
  const isAbort = e?.name === "AbortError";
7473
- this.d.db.updateAgentRun?.(pending.id, {
7474
- status: isAbort ? "cancelled" : "failed",
7475
- error: isAbort ? void 0 : e.message,
7476
- endedAt: (/* @__PURE__ */ new Date()).toISOString()
7477
- });
7502
+ if (!this.interruptedIds.delete(pending.id)) {
7503
+ this.d.db.updateAgentRun?.(pending.id, {
7504
+ status: isAbort ? "cancelled" : "failed",
7505
+ error: isAbort ? void 0 : e.message,
7506
+ endedAt: (/* @__PURE__ */ new Date()).toISOString()
7507
+ });
7508
+ }
7478
7509
  } finally {
7479
7510
  this.finish(pending.id);
7480
7511
  }
@@ -7483,6 +7514,10 @@ var AgentRunner = class {
7483
7514
  this.emitters.get(id)?.emit("done");
7484
7515
  this.acs.delete(id);
7485
7516
  this.active = null;
7517
+ setTimeout(() => {
7518
+ this.buffers.delete(id);
7519
+ this.emitters.delete(id);
7520
+ }, 5e3);
7486
7521
  void this.processNext();
7487
7522
  }
7488
7523
  cancel(id) {
@@ -7503,6 +7538,7 @@ var AgentRunner = class {
7503
7538
  /** Called by the engine manager when the active model is evicted. */
7504
7539
  interruptActive() {
7505
7540
  if (!this.active) return;
7541
+ this.interruptedIds.add(this.active);
7506
7542
  this.acs.get(this.active)?.abort();
7507
7543
  this.d.db.updateAgentRun?.(this.active, { status: "interrupted", endedAt: (/* @__PURE__ */ new Date()).toISOString() });
7508
7544
  }
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./radix-4XwKfE88.js";import{r as u}from"./vendor-CKtmMAvG.js";import{c as w,d as k,A as T,e as v,L as h,f as S,b,g as C,h as q,X as A}from"./index-DH6LUjzQ.js";import{P as N}from"./plus-BSLbFnG4.js";import{C as y}from"./circle-x-vhvOc_s6.js";import{C as O}from"./circle-check-C73Lr6Uy.js";import{W as E}from"./wrench-BMZR8C90.js";const _=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}]],D=w("circle-dot",_);const L=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 6v6l4 2",key:"mmk7yg"}]],P=w("clock",L),p={all:["agent-runs"],list:()=>[...p.all,"list"],detail:t=>[...p.all,"detail",t]};async function g(t,a){const l={Accept:"application/json",...k(),...a?.headers??{}},i=await fetch(t,{...a,headers:l});if(i.status===204)return;const r=await i.text(),o=r?JSON.parse(r):void 0;if(!i.ok){const d=o;throw new T(d?.error?.code??"http_error",d?.error?.message??`Request failed with status ${i.status}.`,i.status)}return o}async function $(){return g("/api/v1/agents/runs")}async function I(t){return g(`/api/v1/agents/runs/${t}`)}async function Q(t){return g("/api/v1/agents/runs",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})}async function K(t){await g(`/api/v1/agents/runs/${t}`,{method:"DELETE"})}async function*F(t,a=0,l){const i=`/api/v1/agents/runs/${t}/stream?fromSeq=${a}`,r=await fetch(i,{headers:{Accept:"text/event-stream",...k()},signal:l});if(!r.ok||!r.body)throw new Error(`Stream error: ${r.status}`);const o=r.body.getReader(),d=new TextDecoder;let m="";try{for(;;){const{done:s,value:x}=await o.read();if(s)break;m+=d.decode(x,{stream:!0});const c=m.split(`
2
+ `);m=c.pop()??"";let n="message";for(const f of c){if(f.startsWith("event: ")){n=f.slice(7).trim();continue}if(f.startsWith("data: ")){const j=f.slice(6).trim();if(j==="[DONE]")return;try{const R=JSON.parse(j);if(yield{event:n,data:R},n==="done"||n==="error")return}catch{}n="message"}}}}finally{o.cancel()}}const J={queued:e.jsx(P,{size:12}),running:e.jsx(h,{size:12,className:"animate-spin"}),done:e.jsx(O,{size:12}),failed:e.jsx(y,{size:12}),cancelled:e.jsx(y,{size:12}),interrupted:e.jsx(y,{size:12})},M={queued:"text-muted",running:"text-accent",done:"text-green-500",failed:"text-red-500",cancelled:"text-muted",interrupted:"text-orange-500"};function z({status:t}){return e.jsxs("span",{className:b("flex items-center gap-1 text-[11px] capitalize",M[t]),children:[J[t],t]})}function W(t){const a=Date.now()-new Date(t).getTime();return a<6e4?"just now":a<36e5?`${Math.floor(a/6e4)}m ago`:a<864e5?`${Math.floor(a/36e5)}h ago`:new Date(t).toLocaleDateString()}const U=[{id:"web_search",label:"Web search",hint:"Search the web (needs a provider configured in Settings)"},{id:"fetch_url",label:"Fetch URL",hint:"Read the contents of a web page"},{id:"run_code",label:"Run code",hint:"Execute JS in a sandbox — no mid-run confirmation, opt in only if you trust the task"}];function B({onClose:t,onCreated:a}){const[l,i]=u.useState(""),[r,o]=u.useState(""),[d,m]=u.useState({web_search:!0,fetch_url:!0,run_code:!1}),s=C(),x=n=>m(f=>({...f,[n]:!f[n]})),c=q({mutationFn:()=>Q({title:l.slice(0,60)||"Agent run",systemPrompt:r||void 0,userMessage:l,allowedTools:Object.entries(d).filter(([,n])=>n).map(([n])=>n)}),onSuccess:n=>{s.invalidateQueries({queryKey:p.list()}),a(n.id),t()}});return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/40",onClick:t,children:e.jsxs("div",{className:"w-full max-w-lg rounded-xl border border-border bg-panel p-5 shadow-xl",onClick:n=>n.stopPropagation(),children:[e.jsxs("div",{className:"mb-4 flex items-center justify-between",children:[e.jsx("h2",{className:"text-[15px] font-semibold",children:"New agent run"}),e.jsx("button",{type:"button",onClick:t,className:"text-faint hover:text-ink",children:e.jsx(A,{size:16})})]}),e.jsx("label",{className:"mb-1 block text-[12px] text-muted",children:"Task"}),e.jsx("textarea",{autoFocus:!0,value:l,onChange:n=>i(n.target.value),placeholder:"Describe what the agent should do…",rows:4,className:"mb-3 w-full resize-none rounded-lg border border-border bg-input px-3 py-2 text-[13px] text-ink placeholder:text-faint focus:border-accent focus:outline-none"}),e.jsxs("label",{className:"mb-1 block text-[12px] text-muted",children:["System prompt ",e.jsx("span",{className:"text-faint",children:"(optional)"})]}),e.jsx("textarea",{value:r,onChange:n=>o(n.target.value),placeholder:"You are a helpful assistant…",rows:2,className:"mb-4 w-full resize-none rounded-lg border border-border bg-input px-3 py-2 text-[13px] text-ink placeholder:text-faint focus:border-accent focus:outline-none"}),e.jsx("label",{className:"mb-1.5 block text-[12px] text-muted",children:"Tools"}),e.jsx("div",{className:"mb-4 space-y-1.5",children:U.map(n=>e.jsxs("label",{className:"flex cursor-pointer items-start gap-2 rounded-lg border border-border px-2.5 py-2 hover:bg-panel-2",children:[e.jsx("input",{type:"checkbox",checked:d[n.id],onChange:()=>x(n.id),className:"mt-0.5 accent-[var(--accent)]"}),e.jsxs("span",{className:"min-w-0",children:[e.jsx("span",{className:"block text-[13px] font-medium text-ink",children:n.label}),e.jsx("span",{className:"block text-[11px] leading-snug text-faint",children:n.hint})]})]},n.id))}),e.jsxs("div",{className:"flex items-center justify-end gap-2",children:[e.jsx("button",{type:"button",onClick:t,className:"rounded-lg px-3 py-1.5 text-[13px] text-muted hover:text-ink",children:"Cancel"}),e.jsxs("button",{type:"button",disabled:!l.trim()||c.isPending,onClick:()=>c.mutate(),className:"flex items-center gap-1.5 rounded-lg bg-accent px-3 py-1.5 text-[13px] font-medium text-white disabled:opacity-50",children:[c.isPending?e.jsx(h,{size:13,className:"animate-spin"}):e.jsx(S,{size:13}),"Run agent"]})]}),c.isError&&e.jsx("p",{className:"mt-2 text-[12px]",style:{color:"var(--err)"},children:c.error.message})]})})}function X({call:t}){const[a,l]=u.useState(!1),i=typeof t.args?.query=="string"?t.args.query:typeof t.args?.url=="string"?t.args.url:JSON.stringify(t.args??{});return e.jsxs("div",{className:"w-full max-w-[85%] rounded-lg border border-border bg-panel px-2.5 py-1.5 text-[12px]",children:[e.jsxs("button",{type:"button",onClick:()=>l(r=>!r),className:"flex w-full items-center gap-1.5 text-left text-muted hover:text-ink",children:[e.jsx(E,{size:12,className:"shrink-0 text-accent"}),e.jsx("span",{className:"font-medium text-ink",children:t.name}),e.jsx("span",{className:"truncate text-faint",children:i})]}),a&&e.jsx("pre",{className:"mt-1.5 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded bg-panel-2 p-2 text-[11px] text-muted",children:t.result})]})}function H({run:t}){const a=C(),l=u.useRef(null),[i,r]=u.useState(""),o=u.useRef(null),d=q({mutationFn:()=>K(t.id),onSuccess:()=>{a.invalidateQueries({queryKey:p.list()})}});u.useEffect(()=>{if(t.status!=="running"&&t.status!=="queued")return;const s=new AbortController;l.current=s;let x="";return(async()=>{try{for await(const c of F(t.id,0,s.signal))if(c.event==="delta")x+=c.data.delta,r(x);else if(c.event==="done"||c.event==="error"){r(""),a.invalidateQueries({queryKey:p.detail(t.id)}),a.invalidateQueries({queryKey:p.list()});break}}catch{}})(),()=>{s.abort(),l.current=null}},[t.id,t.status,a]),u.useEffect(()=>{o.current?.scrollIntoView({behavior:"smooth"})},[i,t.messages?.length]);const m=t.messages??[];return e.jsxs("div",{className:"flex h-full flex-col",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border px-4 py-2.5",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[14px] font-medium text-ink",children:t.title}),e.jsx(z,{status:t.status})]}),(t.status==="running"||t.status==="queued")&&e.jsx("button",{type:"button",onClick:()=>d.mutate(),className:"rounded-lg border border-border px-3 py-1 text-[12px] text-muted transition-colors hover:border-red-400 hover:text-red-500",children:d.isPending?e.jsx(h,{size:12,className:"inline animate-spin"}):"Cancel"})]}),e.jsxs("div",{className:"flex-1 space-y-3 overflow-y-auto p-4",children:[m.map(s=>e.jsxs("div",{className:b("flex flex-col gap-1.5",s.role==="user"?"items-end":"items-start"),children:[s.toolCalls?.map(x=>e.jsx(X,{call:x},x.id)),(s.content||s.role==="user"||t.status==="running")&&e.jsx("div",{className:b("max-w-[85%] rounded-xl px-3 py-2 text-[13px] leading-relaxed",s.role==="user"?"bg-accent/15 text-ink":"bg-panel-2 text-ink"),children:e.jsx("p",{className:"whitespace-pre-wrap break-words",children:s.content||(s.role==="assistant"&&t.status==="running"?"…":"")})})]},s.id)),i&&e.jsx("div",{className:"flex gap-2",children:e.jsx("div",{className:"max-w-[85%] rounded-xl bg-panel-2 px-3 py-2 text-[13px] leading-relaxed text-ink",children:e.jsx("p",{className:"whitespace-pre-wrap break-words",children:i})})}),t.error&&e.jsxs("div",{className:"rounded-lg bg-red-500/10 px-3 py-2 text-[12px] text-red-500",children:["Error: ",t.error]}),e.jsx("div",{ref:o})]})]})}function ne(){const[t,a]=u.useState(null),[l,i]=u.useState(!1),r=v({queryKey:p.list(),queryFn:$,refetchInterval:s=>(s.state.data??[]).some(n=>n.status==="queued"||n.status==="running")?3e3:!1}),o=v({queryKey:p.detail(t??""),queryFn:()=>I(t),enabled:!!t,refetchInterval:s=>{const x=s.state.data;return x?.status==="queued"||x?.status==="running"?5e3:!1}}),d=r.data??[],m=o.data;return e.jsxs("div",{className:"flex h-full",children:[e.jsxs("div",{className:"flex w-64 shrink-0 flex-col border-r border-border",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border px-3 py-2.5",children:[e.jsx("span",{className:"text-[13px] font-semibold text-ink",children:"Agents"}),e.jsxs("button",{type:"button",title:"New agent run",onClick:()=>i(!0),className:"flex items-center gap-1 rounded-lg bg-accent px-2 py-1 text-[11px] font-medium text-white transition-opacity hover:opacity-90",children:[e.jsx(N,{size:11})," New"]})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto",children:[r.isLoading&&e.jsx("div",{className:"flex h-20 items-center justify-center",children:e.jsx(h,{size:16,className:"animate-spin text-faint"})}),d.length===0&&!r.isLoading&&e.jsxs("div",{className:"px-4 py-8 text-center",children:[e.jsx(S,{size:28,className:"mx-auto mb-2 text-faint"}),e.jsx("p",{className:"text-[12px] text-muted",children:"No agent runs yet."}),e.jsx("p",{className:"mt-0.5 text-[11px] text-faint",children:"Click “New” to start one."})]}),d.map(s=>e.jsxs("button",{type:"button",onClick:()=>a(s.id),className:b("w-full border-b border-border px-3 py-2.5 text-left transition-colors hover:bg-panel-2",t===s.id&&"bg-panel-2"),children:[e.jsx("p",{className:"mb-0.5 truncate text-[13px] font-medium text-ink",children:s.title}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(z,{status:s.status}),e.jsx("span",{className:"text-[10px] text-faint",children:W(s.createdAt)})]})]},s.id))]})]}),e.jsx("div",{className:"flex min-w-0 flex-1 flex-col",children:t?o.isLoading?e.jsx("div",{className:"flex h-full items-center justify-center",children:e.jsx(h,{size:20,className:"animate-spin text-faint"})}):m?e.jsx(H,{run:m}):null:e.jsxs("div",{className:"flex h-full flex-col items-center justify-center text-center",children:[e.jsx(D,{size:32,className:"mb-3 text-faint"}),e.jsx("p",{className:"text-[14px] font-medium text-ink",children:"Select a run"}),e.jsx("p",{className:"mt-1 text-[12px] text-muted",children:"or create a new agent run to get started"}),e.jsxs("button",{type:"button",onClick:()=>i(!0),className:"mt-4 flex items-center gap-1.5 rounded-lg bg-accent px-3 py-1.5 text-[13px] font-medium text-white hover:opacity-90",children:[e.jsx(N,{size:13})," New agent run"]})]})}),l&&e.jsx(B,{onClose:()=>i(!1),onCreated:s=>{a(s),r.refetch()}})]})}export{ne as AgentsScreen};