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.
- package/dist/cli.js +44 -8
- package/dist/webdist/assets/AgentsScreen-EiPT9y2w.js +2 -0
- package/dist/webdist/assets/ChatScreen-DUrkqMeC.js +57 -0
- package/dist/webdist/assets/{CustomizeScreen-uhKz3ulx.js → CustomizeScreen-D3gT5m17.js} +1 -1
- package/dist/webdist/assets/{DeveloperScreen-C2117jSw.js → DeveloperScreen-CrpBr1sb.js} +1 -1
- package/dist/webdist/assets/{EnginesScreen-Dl1lF8qJ.js → EnginesScreen-bg__-Fi5.js} +1 -1
- package/dist/webdist/assets/ModelDetailDialog-DJ7_7jXE.js +1 -0
- package/dist/webdist/assets/{ModelDirs-iqZFpRga.js → ModelDirs-D2fiDrlX.js} +1 -1
- package/dist/webdist/assets/ModelsScreen-_LBVdJl4.js +1 -0
- package/dist/webdist/assets/{SettingsScreen-QwzKX1gb.js → SettingsScreen-cFZbfIwT.js} +1 -1
- package/dist/webdist/assets/{arc-BPL4VCUo.js → arc-CkxesN47.js} +1 -1
- package/dist/webdist/assets/{architectureDiagram-3BPJPVTR-V8Zd2JHr.js → architectureDiagram-3BPJPVTR-095VL47n.js} +1 -1
- package/dist/webdist/assets/{blockDiagram-GPEHLZMM-C6pGJDrs.js → blockDiagram-GPEHLZMM-BvWCQJ88.js} +1 -1
- package/dist/webdist/assets/{c4Diagram-AAUBKEIU-_hXk5ziz.js → c4Diagram-AAUBKEIU-DMuOSoD7.js} +1 -1
- package/dist/webdist/assets/channel-DPr90gR6.js +1 -0
- package/dist/webdist/assets/check-C66UWSMM.js +1 -0
- package/dist/webdist/assets/{chunk-2J33WTMH-CGL1puVz.js → chunk-2J33WTMH-CDRuE0ZL.js} +1 -1
- package/dist/webdist/assets/{chunk-4BX2VUAB-DrYe7x90.js → chunk-4BX2VUAB-73mafPnW.js} +1 -1
- package/dist/webdist/assets/{chunk-55IACEB6-CGuQ4vHT.js → chunk-55IACEB6-QZcxum_K.js} +1 -1
- package/dist/webdist/assets/{chunk-727SXJPM-B8Wrrhxb.js → chunk-727SXJPM-CqmFodef.js} +1 -1
- package/dist/webdist/assets/{chunk-AQP2D5EJ-BbTLSwHS.js → chunk-AQP2D5EJ-CgXMhB73.js} +1 -1
- package/dist/webdist/assets/{chunk-FMBD7UC4-CRaaHdZE.js → chunk-FMBD7UC4-BJCFWImJ.js} +1 -1
- package/dist/webdist/assets/{chunk-ND2GUHAM-EDheV6SO.js → chunk-ND2GUHAM-iEKljTeu.js} +1 -1
- package/dist/webdist/assets/{chunk-QZHKN3VN-TQwy40rm.js → chunk-QZHKN3VN-VKpcy2sD.js} +1 -1
- package/dist/webdist/assets/{circle-check-DW1zSzW1.js → circle-check-C73Lr6Uy.js} +1 -1
- package/dist/webdist/assets/{circle-x-BVCygJX_.js → circle-x-vhvOc_s6.js} +1 -1
- package/dist/webdist/assets/classDiagram-4FO5ZUOK-CS-C7Cls.js +1 -0
- package/dist/webdist/assets/classDiagram-v2-Q7XG4LA2-CS-C7Cls.js +1 -0
- package/dist/webdist/assets/{common-BajDwLu1.js → common-DzMdqlCp.js} +1 -1
- package/dist/webdist/assets/{copy-button-CcOL_21W.js → copy-button-llYeGT-i.js} +1 -1
- package/dist/webdist/assets/{cose-bilkent-S5V4N54A-BDrO96pv.js → cose-bilkent-S5V4N54A-eGsFCV6V.js} +1 -1
- package/dist/webdist/assets/{dagre-BM42HDAG-CPU31zPQ.js → dagre-BM42HDAG-C2DRiz9O.js} +1 -1
- package/dist/webdist/assets/{diagram-2AECGRRQ-Bx8fkRjV.js → diagram-2AECGRRQ-FaJsb5ra.js} +1 -1
- package/dist/webdist/assets/{diagram-5GNKFQAL-BBYjy9Zt.js → diagram-5GNKFQAL-qAiWM4UF.js} +1 -1
- package/dist/webdist/assets/{diagram-KO2AKTUF-Dos-X-ZR.js → diagram-KO2AKTUF-bSkRUGWZ.js} +1 -1
- package/dist/webdist/assets/{diagram-LMA3HP47-wkj6OULt.js → diagram-LMA3HP47-pjs1A0Dk.js} +1 -1
- package/dist/webdist/assets/{diagram-OG6HWLK6-CmYjdk0L.js → diagram-OG6HWLK6-BqCMIsmf.js} +1 -1
- package/dist/webdist/assets/{dialog-hJPYu2Ov.js → dialog-DCS2uvxk.js} +1 -1
- package/dist/webdist/assets/{erDiagram-TEJ5UH35-CsbNDTPD.js → erDiagram-TEJ5UH35-Bv1h9dbW.js} +1 -1
- package/dist/webdist/assets/{flowDiagram-I6XJVG4X-BsFFxJiw.js → flowDiagram-I6XJVG4X-C-v71MLV.js} +1 -1
- package/dist/webdist/assets/{ganttDiagram-6RSMTGT7-U9sAiXNQ.js → ganttDiagram-6RSMTGT7-BV5AS1TO.js} +1 -1
- package/dist/webdist/assets/{gitGraphDiagram-PVQCEYII-CxJIMHUV.js → gitGraphDiagram-PVQCEYII-BxGo8YVL.js} +1 -1
- package/dist/webdist/assets/html2canvas.esm-DXEQVQnt.js +5 -0
- package/dist/webdist/assets/{index-Cj_l2rh0.js → index-DH6LUjzQ.js} +2 -2
- package/dist/webdist/assets/index-FmTuHPCZ.css +1 -0
- package/dist/webdist/assets/{infoDiagram-5YYISTIA-D4lI1s8i.js → infoDiagram-5YYISTIA-CYkfbi9v.js} +1 -1
- package/dist/webdist/assets/{ishikawaDiagram-YF4QCWOH-D4mglNig.js → ishikawaDiagram-YF4QCWOH-BnGF7ohg.js} +1 -1
- package/dist/webdist/assets/{journeyDiagram-JHISSGLW-CdEi7F6r.js → journeyDiagram-JHISSGLW-CdHcTbON.js} +1 -1
- package/dist/webdist/assets/{kanban-definition-UN3LZRKU-DVLhy_z6.js → kanban-definition-UN3LZRKU-C7cGcsQk.js} +1 -1
- package/dist/webdist/assets/{linear-d5BrNoO6.js → linear-CDPDzqam.js} +1 -1
- package/dist/webdist/assets/{mermaid.core-fgLyIScK.js → mermaid.core-Bkp248fX.js} +4 -4
- package/dist/webdist/assets/{mindmap-definition-RKZ34NQL-D8Ucx5YR.js → mindmap-definition-RKZ34NQL-D4GkC3GJ.js} +1 -1
- package/dist/webdist/assets/{pencil-IA-fj275.js → pencil-Cfn97uuD.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-CXEAL2o0.js} +1 -1
- package/dist/webdist/assets/{plus-Ct3egKtH.js → plus-BSLbFnG4.js} +1 -1
- package/dist/webdist/assets/{quadrantDiagram-W4KKPZXB-5_Ip_nW9.js → quadrantDiagram-W4KKPZXB-qOQG3ciS.js} +1 -1
- package/dist/webdist/assets/{refresh-cw-BBcxwtP-.js → refresh-cw-D6_BcM7q.js} +1 -1
- package/dist/webdist/assets/{requirementDiagram-4Y6WPE33-XC0l0R7d.js → requirementDiagram-4Y6WPE33-DsKVmkow.js} +1 -1
- package/dist/webdist/assets/{sankeyDiagram-5OEKKPKP-DJ-RNVjW.js → sankeyDiagram-5OEKKPKP-BpGFJ3p6.js} +1 -1
- package/dist/webdist/assets/{save-BhQrytFt.js → save-CkZF-RBo.js} +1 -1
- package/dist/webdist/assets/{sequenceDiagram-3UESZ5HK-CNvMsl4g.js → sequenceDiagram-3UESZ5HK-BtTWta9u.js} +1 -1
- package/dist/webdist/assets/{skeleton-CW1R2F_M.js → skeleton-C8uO_3IS.js} +1 -1
- package/dist/webdist/assets/{stateDiagram-AJRCARHV-CN9hLd2j.js → stateDiagram-AJRCARHV-ClaR6bLX.js} +1 -1
- package/dist/webdist/assets/stateDiagram-v2-BHNVJYJU-D8QU94bs.js +1 -0
- package/dist/webdist/assets/{timeline-definition-PNZ67QCA-D64WOfwg.js → timeline-definition-PNZ67QCA-Dgl-tSbG.js} +1 -1
- package/dist/webdist/assets/{trash-2-BY2m3pE3.js → trash-2-CqQWzJ1Q.js} +1 -1
- package/dist/webdist/assets/{vennDiagram-CIIHVFJN-FYpgKg2e.js → vennDiagram-CIIHVFJN-BaUjNRiO.js} +1 -1
- package/dist/webdist/assets/{wardley-L42UT6IY-B4qclGl3.js → wardley-L42UT6IY-CK0qHrWX.js} +1 -1
- package/dist/webdist/assets/{wardleyDiagram-YWT4CUSO-CdYxwShW.js → wardleyDiagram-YWT4CUSO-D7I0ntRP.js} +1 -1
- package/dist/webdist/assets/{wrench-_vB8fZmT.js → wrench-BMZR8C90.js} +1 -1
- package/dist/webdist/assets/{xychartDiagram-2RQKCTM6-bI3ZqIAG.js → xychartDiagram-2RQKCTM6-DGpy17g3.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));
|
|
@@ -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.
|
|
7474
|
-
|
|
7475
|
-
|
|
7476
|
-
|
|
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};
|