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.
- package/dist/cli.js +32 -7
- package/dist/webdist/assets/AgentsScreen-BISmGjbo.js +2 -0
- package/dist/webdist/assets/ChatScreen-CdGovrD_.js +57 -0
- package/dist/webdist/assets/{CustomizeScreen-uhKz3ulx.js → CustomizeScreen-vCdaeaYm.js} +1 -1
- package/dist/webdist/assets/{DeveloperScreen-C2117jSw.js → DeveloperScreen-DTDECTfQ.js} +1 -1
- package/dist/webdist/assets/{EnginesScreen-Dl1lF8qJ.js → EnginesScreen-BLqB4B4s.js} +1 -1
- package/dist/webdist/assets/ModelDetailDialog-CmcauyUd.js +1 -0
- package/dist/webdist/assets/{ModelDirs-iqZFpRga.js → ModelDirs-CVl421kH.js} +1 -1
- package/dist/webdist/assets/ModelsScreen-BsjQ-rXT.js +1 -0
- package/dist/webdist/assets/{SettingsScreen-QwzKX1gb.js → SettingsScreen-DZQ1lIIa.js} +1 -1
- package/dist/webdist/assets/{arc-BPL4VCUo.js → arc-BOg2ZUVv.js} +1 -1
- package/dist/webdist/assets/{architectureDiagram-3BPJPVTR-V8Zd2JHr.js → architectureDiagram-3BPJPVTR-JA6U-k6V.js} +1 -1
- package/dist/webdist/assets/{blockDiagram-GPEHLZMM-C6pGJDrs.js → blockDiagram-GPEHLZMM-CeFKl5gt.js} +1 -1
- package/dist/webdist/assets/{c4Diagram-AAUBKEIU-_hXk5ziz.js → c4Diagram-AAUBKEIU-NAYIvLue.js} +1 -1
- package/dist/webdist/assets/channel-R-Cc4MxS.js +1 -0
- package/dist/webdist/assets/check-BEf12PVV.js +1 -0
- package/dist/webdist/assets/{chunk-2J33WTMH-CGL1puVz.js → chunk-2J33WTMH-CZAFUB1n.js} +1 -1
- package/dist/webdist/assets/{chunk-4BX2VUAB-DrYe7x90.js → chunk-4BX2VUAB-BwDeI7tm.js} +1 -1
- package/dist/webdist/assets/{chunk-55IACEB6-CGuQ4vHT.js → chunk-55IACEB6-CrMcwFFf.js} +1 -1
- package/dist/webdist/assets/{chunk-727SXJPM-B8Wrrhxb.js → chunk-727SXJPM-B8pvS-2b.js} +1 -1
- package/dist/webdist/assets/{chunk-AQP2D5EJ-BbTLSwHS.js → chunk-AQP2D5EJ-4nG2xg8B.js} +1 -1
- package/dist/webdist/assets/{chunk-FMBD7UC4-CRaaHdZE.js → chunk-FMBD7UC4-4dS81TVH.js} +1 -1
- package/dist/webdist/assets/{chunk-ND2GUHAM-EDheV6SO.js → chunk-ND2GUHAM-BOND_2fr.js} +1 -1
- package/dist/webdist/assets/{chunk-QZHKN3VN-TQwy40rm.js → chunk-QZHKN3VN-uo5AhgZ_.js} +1 -1
- package/dist/webdist/assets/{circle-check-DW1zSzW1.js → circle-check-BM1U1LBh.js} +1 -1
- package/dist/webdist/assets/{circle-x-BVCygJX_.js → circle-x-BQVgQDWt.js} +1 -1
- package/dist/webdist/assets/classDiagram-4FO5ZUOK-Bo30oFs_.js +1 -0
- package/dist/webdist/assets/classDiagram-v2-Q7XG4LA2-Bo30oFs_.js +1 -0
- package/dist/webdist/assets/{common-BajDwLu1.js → common-CREyTFTu.js} +1 -1
- package/dist/webdist/assets/{copy-button-CcOL_21W.js → copy-button-CCE6xN9X.js} +1 -1
- package/dist/webdist/assets/{cose-bilkent-S5V4N54A-BDrO96pv.js → cose-bilkent-S5V4N54A-C2Hznw_T.js} +1 -1
- package/dist/webdist/assets/{dagre-BM42HDAG-CPU31zPQ.js → dagre-BM42HDAG-DfgRJcxi.js} +1 -1
- package/dist/webdist/assets/{diagram-2AECGRRQ-Bx8fkRjV.js → diagram-2AECGRRQ-B3NKQXs-.js} +1 -1
- package/dist/webdist/assets/{diagram-5GNKFQAL-BBYjy9Zt.js → diagram-5GNKFQAL-CsddCSIK.js} +1 -1
- package/dist/webdist/assets/{diagram-KO2AKTUF-Dos-X-ZR.js → diagram-KO2AKTUF-B-0Scyhf.js} +1 -1
- package/dist/webdist/assets/{diagram-LMA3HP47-wkj6OULt.js → diagram-LMA3HP47-zZMoAxon.js} +1 -1
- package/dist/webdist/assets/{diagram-OG6HWLK6-CmYjdk0L.js → diagram-OG6HWLK6-DkhKqVoh.js} +1 -1
- package/dist/webdist/assets/{dialog-hJPYu2Ov.js → dialog-Bu_dNoGl.js} +1 -1
- package/dist/webdist/assets/{erDiagram-TEJ5UH35-CsbNDTPD.js → erDiagram-TEJ5UH35-N3kX36Fb.js} +1 -1
- package/dist/webdist/assets/{flowDiagram-I6XJVG4X-BsFFxJiw.js → flowDiagram-I6XJVG4X-MBmSjZLW.js} +1 -1
- package/dist/webdist/assets/{ganttDiagram-6RSMTGT7-U9sAiXNQ.js → ganttDiagram-6RSMTGT7-BemcAo3u.js} +1 -1
- package/dist/webdist/assets/{gitGraphDiagram-PVQCEYII-CxJIMHUV.js → gitGraphDiagram-PVQCEYII-C3Z2MeCR.js} +1 -1
- package/dist/webdist/assets/html2canvas.esm-DXEQVQnt.js +5 -0
- package/dist/webdist/assets/{index-Cj_l2rh0.js → index-C07fQlaV.js} +2 -2
- package/dist/webdist/assets/index-FmTuHPCZ.css +1 -0
- package/dist/webdist/assets/{infoDiagram-5YYISTIA-D4lI1s8i.js → infoDiagram-5YYISTIA-CJ9bQKM4.js} +1 -1
- package/dist/webdist/assets/{ishikawaDiagram-YF4QCWOH-D4mglNig.js → ishikawaDiagram-YF4QCWOH-DAU8qHuy.js} +1 -1
- package/dist/webdist/assets/{journeyDiagram-JHISSGLW-CdEi7F6r.js → journeyDiagram-JHISSGLW-DYWLdObC.js} +1 -1
- package/dist/webdist/assets/{kanban-definition-UN3LZRKU-DVLhy_z6.js → kanban-definition-UN3LZRKU-SRRfAaYQ.js} +1 -1
- package/dist/webdist/assets/{linear-d5BrNoO6.js → linear-Cn3E4T4R.js} +1 -1
- package/dist/webdist/assets/{mermaid.core-fgLyIScK.js → mermaid.core-D0LNV0aO.js} +4 -4
- package/dist/webdist/assets/{mindmap-definition-RKZ34NQL-D8Ucx5YR.js → mindmap-definition-RKZ34NQL-4OzvUsMs.js} +1 -1
- package/dist/webdist/assets/{pencil-IA-fj275.js → pencil-Ds4UYumb.js} +1 -1
- package/dist/webdist/assets/{personas-fLJwmnEe.js → personas-C4oTeImA.js} +2 -0
- package/dist/webdist/assets/{pieDiagram-4H26LBE5-BBnuZwji.js → pieDiagram-4H26LBE5-DnUMRqxT.js} +1 -1
- package/dist/webdist/assets/{plus-Ct3egKtH.js → plus-3UMxyIEk.js} +1 -1
- package/dist/webdist/assets/{quadrantDiagram-W4KKPZXB-5_Ip_nW9.js → quadrantDiagram-W4KKPZXB-CuGEtBna.js} +1 -1
- package/dist/webdist/assets/{refresh-cw-BBcxwtP-.js → refresh-cw-kd3J_RQJ.js} +1 -1
- package/dist/webdist/assets/{requirementDiagram-4Y6WPE33-XC0l0R7d.js → requirementDiagram-4Y6WPE33-D6JrM-I-.js} +1 -1
- package/dist/webdist/assets/{sankeyDiagram-5OEKKPKP-DJ-RNVjW.js → sankeyDiagram-5OEKKPKP-7SVXztDZ.js} +1 -1
- package/dist/webdist/assets/{save-BhQrytFt.js → save-CTNv_c8L.js} +1 -1
- package/dist/webdist/assets/{sequenceDiagram-3UESZ5HK-CNvMsl4g.js → sequenceDiagram-3UESZ5HK-DBPkd_Mz.js} +1 -1
- package/dist/webdist/assets/{skeleton-CW1R2F_M.js → skeleton-D4pn0jcp.js} +1 -1
- package/dist/webdist/assets/{stateDiagram-AJRCARHV-CN9hLd2j.js → stateDiagram-AJRCARHV-CeJn57NH.js} +1 -1
- package/dist/webdist/assets/stateDiagram-v2-BHNVJYJU-64xpB2-o.js +1 -0
- package/dist/webdist/assets/{timeline-definition-PNZ67QCA-D64WOfwg.js → timeline-definition-PNZ67QCA-4wGzSbT-.js} +1 -1
- package/dist/webdist/assets/{trash-2-BY2m3pE3.js → trash-2-Ct_313d6.js} +1 -1
- package/dist/webdist/assets/{vennDiagram-CIIHVFJN-FYpgKg2e.js → vennDiagram-CIIHVFJN-C07Iks1t.js} +1 -1
- package/dist/webdist/assets/{wardley-L42UT6IY-B4qclGl3.js → wardley-L42UT6IY-CkjQxAi3.js} +1 -1
- package/dist/webdist/assets/{wardleyDiagram-YWT4CUSO-CdYxwShW.js → wardleyDiagram-YWT4CUSO-CrfLbu_T.js} +1 -1
- package/dist/webdist/assets/{wrench-_vB8fZmT.js → wrench-CBGqccQu.js} +1 -1
- package/dist/webdist/assets/{xychartDiagram-2RQKCTM6-bI3ZqIAG.js → xychartDiagram-2RQKCTM6-VlKQgaXq.js} +1 -1
- package/dist/webdist/index.html +2 -2
- package/package.json +1 -1
- package/dist/webdist/assets/AgentsScreen-oDn4ZkM1.js +0 -2
- package/dist/webdist/assets/ChatScreen-CX4ra3WN.js +0 -55
- package/dist/webdist/assets/ModelDetailDialog-Da2p6itL.js +0 -1
- package/dist/webdist/assets/ModelsScreen-BsS0TO6W.js +0 -1
- package/dist/webdist/assets/channel-YTLuIsBj.js +0 -1
- package/dist/webdist/assets/check-BwuGRwaM.js +0 -1
- package/dist/webdist/assets/classDiagram-4FO5ZUOK-CK-He-ZA.js +0 -1
- package/dist/webdist/assets/classDiagram-v2-Q7XG4LA2-CK-He-ZA.js +0 -1
- package/dist/webdist/assets/index-B52Brf0-.css +0 -1
- 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
|
-
|
|
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.
|
|
7474
|
-
|
|
7475
|
-
|
|
7476
|
-
|
|
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};
|