turbollm 1.5.1 → 1.5.2

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 +32 -7
  2. package/dist/webdist/assets/AgentsScreen-BISmGjbo.js +2 -0
  3. package/dist/webdist/assets/ChatScreen-CdGovrD_.js +57 -0
  4. package/dist/webdist/assets/{CustomizeScreen-uhKz3ulx.js → CustomizeScreen-vCdaeaYm.js} +1 -1
  5. package/dist/webdist/assets/{DeveloperScreen-C2117jSw.js → DeveloperScreen-DTDECTfQ.js} +1 -1
  6. package/dist/webdist/assets/{EnginesScreen-Dl1lF8qJ.js → EnginesScreen-BLqB4B4s.js} +1 -1
  7. package/dist/webdist/assets/ModelDetailDialog-CmcauyUd.js +1 -0
  8. package/dist/webdist/assets/{ModelDirs-iqZFpRga.js → ModelDirs-CVl421kH.js} +1 -1
  9. package/dist/webdist/assets/ModelsScreen-BsjQ-rXT.js +1 -0
  10. package/dist/webdist/assets/{SettingsScreen-QwzKX1gb.js → SettingsScreen-DZQ1lIIa.js} +1 -1
  11. package/dist/webdist/assets/{arc-BPL4VCUo.js → arc-BOg2ZUVv.js} +1 -1
  12. package/dist/webdist/assets/{architectureDiagram-3BPJPVTR-V8Zd2JHr.js → architectureDiagram-3BPJPVTR-JA6U-k6V.js} +1 -1
  13. package/dist/webdist/assets/{blockDiagram-GPEHLZMM-C6pGJDrs.js → blockDiagram-GPEHLZMM-CeFKl5gt.js} +1 -1
  14. package/dist/webdist/assets/{c4Diagram-AAUBKEIU-_hXk5ziz.js → c4Diagram-AAUBKEIU-NAYIvLue.js} +1 -1
  15. package/dist/webdist/assets/channel-R-Cc4MxS.js +1 -0
  16. package/dist/webdist/assets/check-BEf12PVV.js +1 -0
  17. package/dist/webdist/assets/{chunk-2J33WTMH-CGL1puVz.js → chunk-2J33WTMH-CZAFUB1n.js} +1 -1
  18. package/dist/webdist/assets/{chunk-4BX2VUAB-DrYe7x90.js → chunk-4BX2VUAB-BwDeI7tm.js} +1 -1
  19. package/dist/webdist/assets/{chunk-55IACEB6-CGuQ4vHT.js → chunk-55IACEB6-CrMcwFFf.js} +1 -1
  20. package/dist/webdist/assets/{chunk-727SXJPM-B8Wrrhxb.js → chunk-727SXJPM-B8pvS-2b.js} +1 -1
  21. package/dist/webdist/assets/{chunk-AQP2D5EJ-BbTLSwHS.js → chunk-AQP2D5EJ-4nG2xg8B.js} +1 -1
  22. package/dist/webdist/assets/{chunk-FMBD7UC4-CRaaHdZE.js → chunk-FMBD7UC4-4dS81TVH.js} +1 -1
  23. package/dist/webdist/assets/{chunk-ND2GUHAM-EDheV6SO.js → chunk-ND2GUHAM-BOND_2fr.js} +1 -1
  24. package/dist/webdist/assets/{chunk-QZHKN3VN-TQwy40rm.js → chunk-QZHKN3VN-uo5AhgZ_.js} +1 -1
  25. package/dist/webdist/assets/{circle-check-DW1zSzW1.js → circle-check-BM1U1LBh.js} +1 -1
  26. package/dist/webdist/assets/{circle-x-BVCygJX_.js → circle-x-BQVgQDWt.js} +1 -1
  27. package/dist/webdist/assets/classDiagram-4FO5ZUOK-Bo30oFs_.js +1 -0
  28. package/dist/webdist/assets/classDiagram-v2-Q7XG4LA2-Bo30oFs_.js +1 -0
  29. package/dist/webdist/assets/{common-BajDwLu1.js → common-CREyTFTu.js} +1 -1
  30. package/dist/webdist/assets/{copy-button-CcOL_21W.js → copy-button-CCE6xN9X.js} +1 -1
  31. package/dist/webdist/assets/{cose-bilkent-S5V4N54A-BDrO96pv.js → cose-bilkent-S5V4N54A-C2Hznw_T.js} +1 -1
  32. package/dist/webdist/assets/{dagre-BM42HDAG-CPU31zPQ.js → dagre-BM42HDAG-DfgRJcxi.js} +1 -1
  33. package/dist/webdist/assets/{diagram-2AECGRRQ-Bx8fkRjV.js → diagram-2AECGRRQ-B3NKQXs-.js} +1 -1
  34. package/dist/webdist/assets/{diagram-5GNKFQAL-BBYjy9Zt.js → diagram-5GNKFQAL-CsddCSIK.js} +1 -1
  35. package/dist/webdist/assets/{diagram-KO2AKTUF-Dos-X-ZR.js → diagram-KO2AKTUF-B-0Scyhf.js} +1 -1
  36. package/dist/webdist/assets/{diagram-LMA3HP47-wkj6OULt.js → diagram-LMA3HP47-zZMoAxon.js} +1 -1
  37. package/dist/webdist/assets/{diagram-OG6HWLK6-CmYjdk0L.js → diagram-OG6HWLK6-DkhKqVoh.js} +1 -1
  38. package/dist/webdist/assets/{dialog-hJPYu2Ov.js → dialog-Bu_dNoGl.js} +1 -1
  39. package/dist/webdist/assets/{erDiagram-TEJ5UH35-CsbNDTPD.js → erDiagram-TEJ5UH35-N3kX36Fb.js} +1 -1
  40. package/dist/webdist/assets/{flowDiagram-I6XJVG4X-BsFFxJiw.js → flowDiagram-I6XJVG4X-MBmSjZLW.js} +1 -1
  41. package/dist/webdist/assets/{ganttDiagram-6RSMTGT7-U9sAiXNQ.js → ganttDiagram-6RSMTGT7-BemcAo3u.js} +1 -1
  42. package/dist/webdist/assets/{gitGraphDiagram-PVQCEYII-CxJIMHUV.js → gitGraphDiagram-PVQCEYII-C3Z2MeCR.js} +1 -1
  43. package/dist/webdist/assets/html2canvas.esm-DXEQVQnt.js +5 -0
  44. package/dist/webdist/assets/{index-Cj_l2rh0.js → index-C07fQlaV.js} +2 -2
  45. package/dist/webdist/assets/index-FmTuHPCZ.css +1 -0
  46. package/dist/webdist/assets/{infoDiagram-5YYISTIA-D4lI1s8i.js → infoDiagram-5YYISTIA-CJ9bQKM4.js} +1 -1
  47. package/dist/webdist/assets/{ishikawaDiagram-YF4QCWOH-D4mglNig.js → ishikawaDiagram-YF4QCWOH-DAU8qHuy.js} +1 -1
  48. package/dist/webdist/assets/{journeyDiagram-JHISSGLW-CdEi7F6r.js → journeyDiagram-JHISSGLW-DYWLdObC.js} +1 -1
  49. package/dist/webdist/assets/{kanban-definition-UN3LZRKU-DVLhy_z6.js → kanban-definition-UN3LZRKU-SRRfAaYQ.js} +1 -1
  50. package/dist/webdist/assets/{linear-d5BrNoO6.js → linear-Cn3E4T4R.js} +1 -1
  51. package/dist/webdist/assets/{mermaid.core-fgLyIScK.js → mermaid.core-D0LNV0aO.js} +4 -4
  52. package/dist/webdist/assets/{mindmap-definition-RKZ34NQL-D8Ucx5YR.js → mindmap-definition-RKZ34NQL-4OzvUsMs.js} +1 -1
  53. package/dist/webdist/assets/{pencil-IA-fj275.js → pencil-Ds4UYumb.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-DnUMRqxT.js} +1 -1
  56. package/dist/webdist/assets/{plus-Ct3egKtH.js → plus-3UMxyIEk.js} +1 -1
  57. package/dist/webdist/assets/{quadrantDiagram-W4KKPZXB-5_Ip_nW9.js → quadrantDiagram-W4KKPZXB-CuGEtBna.js} +1 -1
  58. package/dist/webdist/assets/{refresh-cw-BBcxwtP-.js → refresh-cw-kd3J_RQJ.js} +1 -1
  59. package/dist/webdist/assets/{requirementDiagram-4Y6WPE33-XC0l0R7d.js → requirementDiagram-4Y6WPE33-D6JrM-I-.js} +1 -1
  60. package/dist/webdist/assets/{sankeyDiagram-5OEKKPKP-DJ-RNVjW.js → sankeyDiagram-5OEKKPKP-7SVXztDZ.js} +1 -1
  61. package/dist/webdist/assets/{save-BhQrytFt.js → save-CTNv_c8L.js} +1 -1
  62. package/dist/webdist/assets/{sequenceDiagram-3UESZ5HK-CNvMsl4g.js → sequenceDiagram-3UESZ5HK-DBPkd_Mz.js} +1 -1
  63. package/dist/webdist/assets/{skeleton-CW1R2F_M.js → skeleton-D4pn0jcp.js} +1 -1
  64. package/dist/webdist/assets/{stateDiagram-AJRCARHV-CN9hLd2j.js → stateDiagram-AJRCARHV-CeJn57NH.js} +1 -1
  65. package/dist/webdist/assets/stateDiagram-v2-BHNVJYJU-64xpB2-o.js +1 -0
  66. package/dist/webdist/assets/{timeline-definition-PNZ67QCA-D64WOfwg.js → timeline-definition-PNZ67QCA-4wGzSbT-.js} +1 -1
  67. package/dist/webdist/assets/{trash-2-BY2m3pE3.js → trash-2-Ct_313d6.js} +1 -1
  68. package/dist/webdist/assets/{vennDiagram-CIIHVFJN-FYpgKg2e.js → vennDiagram-CIIHVFJN-C07Iks1t.js} +1 -1
  69. package/dist/webdist/assets/{wardley-L42UT6IY-B4qclGl3.js → wardley-L42UT6IY-CkjQxAi3.js} +1 -1
  70. package/dist/webdist/assets/{wardleyDiagram-YWT4CUSO-CdYxwShW.js → wardleyDiagram-YWT4CUSO-CrfLbu_T.js} +1 -1
  71. package/dist/webdist/assets/{wrench-_vB8fZmT.js → wrench-CBGqccQu.js} +1 -1
  72. package/dist/webdist/assets/{xychartDiagram-2RQKCTM6-bI3ZqIAG.js → xychartDiagram-2RQKCTM6-VlKQgaXq.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));
@@ -4324,7 +4341,7 @@ var DownloadManager = class {
4324
4341
  const u = 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);
@@ -7393,6 +7410,7 @@ var AgentRunner = class {
7393
7410
  acs = /* @__PURE__ */ new Map();
7394
7411
  queue = [];
7395
7412
  active = null;
7413
+ interruptedIds = /* @__PURE__ */ new Set();
7396
7414
  constructor(d) {
7397
7415
  this.d = d;
7398
7416
  }
@@ -7470,11 +7488,13 @@ var AgentRunner = class {
7470
7488
  this.d.db.updateAgentRun?.(pending.id, { status: "done", endedAt: (/* @__PURE__ */ new Date()).toISOString() });
7471
7489
  } catch (e) {
7472
7490
  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
- });
7491
+ if (!this.interruptedIds.delete(pending.id)) {
7492
+ this.d.db.updateAgentRun?.(pending.id, {
7493
+ status: isAbort ? "cancelled" : "failed",
7494
+ error: isAbort ? void 0 : e.message,
7495
+ endedAt: (/* @__PURE__ */ new Date()).toISOString()
7496
+ });
7497
+ }
7478
7498
  } finally {
7479
7499
  this.finish(pending.id);
7480
7500
  }
@@ -7483,6 +7503,10 @@ var AgentRunner = class {
7483
7503
  this.emitters.get(id)?.emit("done");
7484
7504
  this.acs.delete(id);
7485
7505
  this.active = null;
7506
+ setTimeout(() => {
7507
+ this.buffers.delete(id);
7508
+ this.emitters.delete(id);
7509
+ }, 5e3);
7486
7510
  void this.processNext();
7487
7511
  }
7488
7512
  cancel(id) {
@@ -7503,6 +7527,7 @@ var AgentRunner = class {
7503
7527
  /** Called by the engine manager when the active model is evicted. */
7504
7528
  interruptActive() {
7505
7529
  if (!this.active) return;
7530
+ this.interruptedIds.add(this.active);
7506
7531
  this.acs.get(this.active)?.abort();
7507
7532
  this.d.db.updateAgentRun?.(this.active, { status: "interrupted", endedAt: (/* @__PURE__ */ new Date()).toISOString() });
7508
7533
  }
@@ -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-C07fQlaV.js";import{P as N}from"./plus-3UMxyIEk.js";import{C as y}from"./circle-x-BQVgQDWt.js";import{C as O}from"./circle-check-BM1U1LBh.js";import{W as E}from"./wrench-CBGqccQu.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};