shadow-claw 1.34.5 → 1.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.well-known/mcp/server-card.json +1 -1
- package/.well-known/mcp.json +1 -1
- package/README.md +5 -1
- package/dist/cli/chunk-BCLxzLO92.js +5 -0
- package/dist/cli/chunk-BHNCi3ui2.js +1 -0
- package/dist/cli/chunk-BMPhLSn8.js +1 -0
- package/dist/cli/chunk-BMW6QB5-2.js +27 -0
- package/dist/cli/chunk-BQCWtrzh.js +1 -0
- package/dist/cli/chunk-BQCWtrzh2.js +1 -0
- package/dist/cli/chunk-BdJUjMuz.js +1 -0
- package/dist/cli/chunk-C47WdxKx2.js +1 -0
- package/dist/cli/{chunk-D9dku_3t.js → chunk-CAqvQuGr.js} +1 -1
- package/dist/cli/{chunk-DoVxObGa2.js → chunk-CHzhUS1N2.js} +1 -1
- package/dist/cli/chunk-CUMlq7Jw2.js +263 -0
- package/dist/cli/chunk-CXi9LU9e2.js +110 -0
- package/dist/cli/chunk-ChefnX-r.js +110 -0
- package/dist/cli/{chunk-zvi71-77.js → chunk-D3JxbzjI2.js} +15 -15
- package/dist/cli/chunk-D7VYMl092.js +1 -0
- package/dist/cli/chunk-DNIduiJ82.js +91 -0
- package/dist/cli/{chunk-C4UfzPK4.js → chunk-DTbrldk_.js} +1 -1
- package/dist/cli/chunk-DZ8YBXax.js +969 -0
- package/dist/cli/chunk-DduRvw8B2.js +1 -0
- package/dist/cli/chunk-DnYxGjdu2.js +1 -0
- package/dist/cli/chunk-Ea7nXmgb2.js +1 -0
- package/dist/cli/{chunk-BRiGkTIi.js → chunk-EohNY8vW.js} +1 -1
- package/dist/cli/chunk-LIIpZlwP2.js +1 -0
- package/dist/cli/chunk-LIJZHJml2.js +1 -0
- package/dist/cli/chunk-MHBh2BgF2.js +91 -0
- package/dist/cli/{chunk-BQ7lHA7c.js → chunk-SKgLGyTY.js} +1 -1
- package/dist/cli/chunk-kcJSXcbq2.js +1 -0
- package/dist/cli/cli.js +12 -11
- package/dist/headless-agent.js +191 -187
- package/dist/lib/components/index.js +21 -21
- package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/settings/shadow-claw-git.js +1 -1
- package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
- package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
- package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
- package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
- package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/shadow-claw-channels.js +1 -1
- package/dist/lib/components/shadow-claw-chat.js +1 -1
- package/dist/lib/components/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/shadow-claw-conversations.js +1 -1
- package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
- package/dist/lib/components/shadow-claw-files.js +1 -1
- package/dist/lib/components/shadow-claw-git.js +1 -1
- package/dist/lib/components/shadow-claw-llm.js +1 -1
- package/dist/lib/components/shadow-claw-networking.js +1 -1
- package/dist/lib/components/shadow-claw-notifications.js +1 -1
- package/dist/lib/components/shadow-claw-pages.js +1 -1
- package/dist/lib/components/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/shadow-claw-settings.js +1 -1
- package/dist/lib/components/shadow-claw-storage.js +1 -1
- package/dist/lib/components/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/shadow-claw-tasks.js +1 -1
- package/dist/lib/components/shadow-claw-terminal.js +1 -1
- package/dist/lib/components/shadow-claw-tools.js +1 -1
- package/dist/lib/components/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw.js +1 -1
- package/dist/lib/{configurePeerJs-DSRcNp3v.js → configurePeerJs-CdPzmpyI.js} +2 -2
- package/dist/lib/{configurePeerJs-DSRcNp3v.js.map → configurePeerJs-CdPzmpyI.js.map} +1 -1
- package/dist/lib/index.js +21 -21
- package/dist/lib/{initControlPlane-CWfE_Oan.js → initControlPlane-BLymRW34.js} +7 -7
- package/dist/lib/{initControlPlane-CWfE_Oan.js.map → initControlPlane-BLymRW34.js.map} +1 -1
- package/dist/lib/{orchestrator-BEUug1TW.js → orchestrator-DZkhJj7f.js} +13 -2
- package/dist/lib/{orchestrator-BEUug1TW.js.map → orchestrator-DZkhJj7f.js.map} +1 -1
- package/dist/lib/{orchestrator-CGUzfGbE.js → orchestrator-ZsQTRknI.js} +5 -5
- package/dist/lib/{orchestrator-CGUzfGbE.js.map → orchestrator-ZsQTRknI.js.map} +1 -1
- package/dist/lib/{peerjs-BSD88rT3.js → peerjs-CJYfnR5V.js} +3 -3
- package/dist/lib/{peerjs-BSD88rT3.js.map → peerjs-CJYfnR5V.js.map} +1 -1
- package/dist/lib/{push-client-CC3qifgc.js → push-client-C9hIPqLZ.js} +2 -2
- package/dist/lib/{push-client-CC3qifgc.js.map → push-client-C9hIPqLZ.js.map} +1 -1
- package/dist/lib/{shadow-claw-BWS-UVnE.js → shadow-claw-8qL2-QoK.js} +4 -4
- package/dist/lib/{shadow-claw-BWS-UVnE.js.map → shadow-claw-8qL2-QoK.js.map} +1 -1
- package/dist/lib/{shadow-claw-channel-config-DwMn3nFJ.js → shadow-claw-channel-config-CvnbqGBy.js} +3 -3
- package/dist/lib/{shadow-claw-channel-config-DwMn3nFJ.js.map → shadow-claw-channel-config-CvnbqGBy.js.map} +1 -1
- package/dist/lib/{shadow-claw-channels-BdE4cUlx.js → shadow-claw-channels-CkCvjWn1.js} +2 -2
- package/dist/lib/{shadow-claw-channels-BdE4cUlx.js.map → shadow-claw-channels-CkCvjWn1.js.map} +1 -1
- package/dist/lib/{shadow-claw-chat-DqaMoE9C.js → shadow-claw-chat-B1YEHKN3.js} +3 -3
- package/dist/lib/{shadow-claw-chat-DqaMoE9C.js.map → shadow-claw-chat-B1YEHKN3.js.map} +1 -1
- package/dist/lib/{shadow-claw-control-plane-D3DUDO29.js → shadow-claw-control-plane-jjo789IE.js} +6 -6
- package/dist/lib/{shadow-claw-control-plane-D3DUDO29.js.map → shadow-claw-control-plane-jjo789IE.js.map} +1 -1
- package/dist/lib/{shadow-claw-conversations-XT-OXogj.js → shadow-claw-conversations-MMT7wYH3.js} +2 -2
- package/dist/lib/{shadow-claw-conversations-XT-OXogj.js.map → shadow-claw-conversations-MMT7wYH3.js.map} +1 -1
- package/dist/lib/{shadow-claw-file-viewer-DJqxyd97.js → shadow-claw-file-viewer-qSkD1RQK.js} +2 -2
- package/dist/lib/{shadow-claw-file-viewer-DJqxyd97.js.map → shadow-claw-file-viewer-qSkD1RQK.js.map} +1 -1
- package/dist/lib/{shadow-claw-files-CUEJlA1o.js → shadow-claw-files-Cg8ycQ_N.js} +2 -2
- package/dist/lib/{shadow-claw-files-CUEJlA1o.js.map → shadow-claw-files-Cg8ycQ_N.js.map} +1 -1
- package/dist/lib/{shadow-claw-git-D_iVcb86.js → shadow-claw-git-gaClz-ZC.js} +3 -3
- package/dist/lib/{shadow-claw-git-D_iVcb86.js.map → shadow-claw-git-gaClz-ZC.js.map} +1 -1
- package/dist/lib/{shadow-claw-llm-C2msAsyU.js → shadow-claw-llm-DyOz0qzT.js} +2 -2
- package/dist/lib/{shadow-claw-llm-C2msAsyU.js.map → shadow-claw-llm-DyOz0qzT.js.map} +1 -1
- package/dist/lib/{shadow-claw-networking-D2NvodC-.js → shadow-claw-networking-B2xx0UUR.js} +2 -2
- package/dist/lib/{shadow-claw-networking-D2NvodC-.js.map → shadow-claw-networking-B2xx0UUR.js.map} +1 -1
- package/dist/lib/{shadow-claw-notifications-BcvVn_vu.js → shadow-claw-notifications-BjKfZy0k.js} +2 -2
- package/dist/lib/{shadow-claw-notifications-BcvVn_vu.js.map → shadow-claw-notifications-BjKfZy0k.js.map} +1 -1
- package/dist/lib/{shadow-claw-pages-CTMXRhEX.js → shadow-claw-pages-CJ2tsMtL.js} +2 -2
- package/dist/lib/{shadow-claw-pages-CTMXRhEX.js.map → shadow-claw-pages-CJ2tsMtL.js.map} +1 -1
- package/dist/lib/{shadow-claw-peerjs-C2YvypqM.js → shadow-claw-peerjs-CazCkXQ1.js} +3 -3
- package/dist/lib/{shadow-claw-peerjs-C2YvypqM.js.map → shadow-claw-peerjs-CazCkXQ1.js.map} +1 -1
- package/dist/lib/{shadow-claw-settings-B0hiDwEt.js → shadow-claw-settings-qro6pO9I.js} +2 -2
- package/dist/lib/{shadow-claw-settings-B0hiDwEt.js.map → shadow-claw-settings-qro6pO9I.js.map} +1 -1
- package/dist/lib/{shadow-claw-storage-Dt4yg4Q4.js → shadow-claw-storage-ewDdvCGa.js} +2 -2
- package/dist/lib/{shadow-claw-storage-Dt4yg4Q4.js.map → shadow-claw-storage-ewDdvCGa.js.map} +1 -1
- package/dist/lib/{shadow-claw-task-server-B2gbZaz4.js → shadow-claw-task-server-DpqQcNIs.js} +2 -2
- package/dist/lib/{shadow-claw-task-server-B2gbZaz4.js.map → shadow-claw-task-server-DpqQcNIs.js.map} +1 -1
- package/dist/lib/{shadow-claw-tasks-Bxq-niuM.js → shadow-claw-tasks-B2fMF4qE.js} +2 -2
- package/dist/lib/{shadow-claw-tasks-Bxq-niuM.js.map → shadow-claw-tasks-B2fMF4qE.js.map} +1 -1
- package/dist/lib/{shadow-claw-terminal-BfbW3xtg.js → shadow-claw-terminal-B25kQJC3.js} +2 -2
- package/dist/lib/{shadow-claw-terminal-BfbW3xtg.js.map → shadow-claw-terminal-B25kQJC3.js.map} +1 -1
- package/dist/lib/{shadow-claw-tools-BNSAaK0Y.js → shadow-claw-tools-B0y8JzoA.js} +10 -3
- package/dist/lib/{shadow-claw-tools-BNSAaK0Y.js.map → shadow-claw-tools-B0y8JzoA.js.map} +1 -1
- package/dist/lib/{shadow-claw-webvm-Dc2KmEXq.js → shadow-claw-webvm-CoCedIza.js} +2 -2
- package/dist/lib/{shadow-claw-webvm-Dc2KmEXq.js.map → shadow-claw-webvm-CoCedIza.js.map} +1 -1
- package/dist/lib/{syncWebMcpRegistration-BIL83P0Q.js → syncWebMcpRegistration-JKLALq4e.js} +2 -2
- package/dist/lib/{syncWebMcpRegistration-BIL83P0Q.js.map → syncWebMcpRegistration-JKLALq4e.js.map} +1 -1
- package/dist/lib/worker/utils/sandboxedEval.d.ts +8 -0
- package/dist/public/.well-known/mcp/server-card.json +1 -1
- package/dist/public/.well-known/mcp.json +1 -1
- package/dist/public/AGENTS.md +1 -1
- package/dist/public/README.md +5 -1
- package/dist/public/agent.worker.js +1 -1
- package/dist/public/components/shadow-claw-tools/shadow-claw-tools.html +1 -1
- package/dist/public/{configurePeerJs-B925t9C7.js → configurePeerJs-BrHeJGw1.js} +1 -1
- package/dist/public/docs/decisions/headless-cli-agent-participant.md +1 -1
- package/dist/public/docs/example/article/index.html +1 -1
- package/dist/public/docs/publishing/index.html +1 -1
- package/dist/public/docs/skill-creator/index.html +1 -1
- package/dist/public/docs/subsystems/cli.md +33 -23
- package/dist/public/docs/subsystems/skills.md +17 -0
- package/dist/public/docs/subsystems/tools.md +1 -1
- package/dist/public/e2e/README.md +2 -2
- package/dist/public/{e2e-bridge-CE1xleGn.js → e2e-bridge-D_lyH__p.js} +1 -1
- package/dist/public/{executeTool-DtTrsZHV.js → executeTool-b6DnRhcv.js} +2 -1
- package/dist/public/{file-viewer-LEEStSq-.js → file-viewer-CKrQoxZi.js} +1 -1
- package/dist/public/index.html +1 -1
- package/dist/public/index.js +1 -1
- package/dist/public/{initControlPlane-e2JgxXEb.js → initControlPlane-Dn-XFuxg.js} +1 -1
- package/dist/public/llms.txt +2 -0
- package/dist/public/main/index.html +1 -1
- package/dist/public/main/memory/index.html +1 -1
- package/dist/public/{orchestrator-Baif6kmu.js → orchestrator-0BnBtxHO.js} +3 -2
- package/dist/public/{orchestrator-TndREZPL.js → orchestrator-C3GKZriH.js} +1 -1
- package/dist/public/{peerjs-DE6WF3h2.js → peerjs-CgfLEp2N.js} +1 -1
- package/dist/public/{push-client-B_IkTpNm.js → push-client-D6DLiY1s.js} +1 -1
- package/dist/public/service-worker.js +1 -1
- package/dist/public/{shadow-claw-channels-BCGz36Zl.js → shadow-claw-channels-DSijinZ9.js} +1 -1
- package/dist/public/{shadow-claw-chat-H9U9jbqD.js → shadow-claw-chat-BeHlAjnA.js} +1 -1
- package/dist/public/{shadow-claw-control-plane-CeKh64s2.js → shadow-claw-control-plane-BfF_AZSg.js} +2 -2
- package/dist/public/{shadow-claw-conversations-C26t1HXN.js → shadow-claw-conversations-Bb_2bVLJ.js} +1 -1
- package/dist/public/{shadow-claw-DBeXILmk.js → shadow-claw-f71DlRdV.js} +2 -2
- package/dist/public/{shadow-claw-file-viewer-DWUoTjkr.js → shadow-claw-file-viewer-B67000Mm.js} +1 -1
- package/dist/public/{shadow-claw-files-BQ8DSX-z.js → shadow-claw-files-DeZZYt01.js} +1 -1
- package/dist/public/{shadow-claw-git-CIXyISw-.js → shadow-claw-git-Ccy25LuW.js} +2 -2
- package/dist/public/{shadow-claw-llm-D_GpOSZE.js → shadow-claw-llm-XjYcTlXT.js} +1 -1
- package/dist/public/{shadow-claw-networking-BYp5K3B7.js → shadow-claw-networking-efXQtydQ.js} +1 -1
- package/dist/public/{shadow-claw-notifications-ZiXmPweY.js → shadow-claw-notifications-Cq2ZSeJa.js} +1 -1
- package/dist/public/{shadow-claw-pages-BHXwf3BD.js → shadow-claw-pages-BVFNSSb1.js} +1 -1
- package/dist/public/{shadow-claw-settings-BfvDvt9c.js → shadow-claw-settings-B3sHxPh9.js} +2 -2
- package/dist/public/{shadow-claw-storage-Bvn85DII.js → shadow-claw-storage-DNdlzCgC.js} +1 -1
- package/dist/public/{shadow-claw-task-server-DZL_d8FC.js → shadow-claw-task-server-BJq0rpju.js} +1 -1
- package/dist/public/{shadow-claw-tasks-Cy8jzd8q.js → shadow-claw-tasks-CkF1uMeZ.js} +1 -1
- package/dist/public/{shadow-claw-terminal-BgEXr82T.js → shadow-claw-terminal-CnHhcpA-.js} +1 -1
- package/dist/public/{shadow-claw-tools-BjnssRSi.js → shadow-claw-tools-iw0fljud.js} +8 -1
- package/dist/public/{shadow-claw-webvm-tZ1VDoVA.js → shadow-claw-webvm-Bliu4V__.js} +1 -1
- package/dist/public/{syncWebMcpRegistration-CLMvJ4kV.js → syncWebMcpRegistration-D91usEMu.js} +1 -1
- package/package.json +1 -1
- package/src/cli/cli.ts +26 -2
- package/src/cli/commands/agent.test.ts +421 -0
- package/src/cli/commands/agent.ts +270 -20
- package/src/components/shadow-claw-tools/shadow-claw-tools.html +7 -0
- package/src/worker/headless-agent.ts +14 -0
- package/src/worker/headless-types.ts +39 -0
- package/src/worker/utils/native-eval-executor.test.ts +36 -0
- package/src/worker/utils/native-eval-executor.ts +58 -0
- package/src/worker/utils/sandboxedEval.ts +36 -0
- package/dist/cli/chunk-1BmpU7jO2.js +0 -1
- package/dist/cli/chunk-54Euq8Ji2.js +0 -1
- package/dist/cli/chunk-BTitwCgT2.js +0 -88
- package/dist/cli/chunk-Bjh76Dai.js +0 -1081
- package/dist/cli/chunk-C2HeZQ6K.js +0 -1
- package/dist/cli/chunk-CxdpafWg.js +0 -1
- package/dist/cli/chunk-DEy72ZNV2.js +0 -88
- package/dist/cli/chunk-Da1BZyqf.js +0 -1
- package/dist/cli/chunk-FHsJD-Sf2.js +0 -27
- package/dist/cli/chunk-aWgoVB7x2.js +0 -1
- package/dist/cli/chunk-hOceZVB92.js +0 -371
- package/dist/cli/chunk-pwNc6VtC2.js +0 -1
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import{t as e}from"./chunk-DxIsgrAF.js";import{_ as t,b as n,g as r,l as i,r as a,s as o,y as s}from"./chunk-BkKN8FNP.js";import{a as c,i as l,n as u,o as d,r as f}from"./chunk-DFLqhyP_.js";import{t as p}from"./chunk-Dhh0lHO62.js";import{a as m,i as h,n as g,r as _,t as v}from"./chunk-BQCWtrzh2.js";import{S as y,b,d as x,f as S,g as C,i as w,n as T,r as E,t as D,w as O}from"./chunk-CXi9LU9e2.js";import{A as k,C as A,D as j,E as ee,M as te,O as M,S as N,T as P,_ as ne,a as re,b as ie,c as F,d as ae,f as I,g as oe,h as se,i as ce,j as le,k as L,l as R,m as ue,o as de,p as fe,s as pe,u as me,v as he,w as ge,x as _e,y as ve}from"./chunk-CUMlq7Jw2.js";import{C as ye,S as be,a as z,i as xe,n as Se,o as Ce,r as we,s as Te,v as Ee,w as B,y as De}from"./chunk-BMW6QB5-2.js";import{n as Oe,t as ke,u as Ae}from"./chunk-LIIpZlwP2.js";import{createRequire as je}from"node:module";import{constants as Me,existsSync as Ne}from"node:fs";import V from"node:path";import{fileURLToPath as Pe}from"node:url";import{env as Fe}from"node:process";import{exec as Ie,spawn as Le}from"node:child_process";import{access as Re,mkdir as ze,readFile as Be,readdir as Ve,rm as He,stat as Ue,unlink as We,writeFile as H}from"node:fs/promises";import{EventEmitter as Ge}from"node:events";import{isIP as Ke}from"node:net";import{runInNewContext as qe}from"node:vm";import{DatabaseSync as Je}from"node:sqlite";const Ye=({command:e,stdin:t,timeoutSec:n})=>new Promise(r=>{let i=Ie(e,{timeout:n*1e3,maxBuffer:10*1024*1024},(e,t,n)=>{let i=t||``;n&&(i+=(i?`
|
|
2
|
+
`:``)+n),e&&!i&&(i=e.message),r(i)});t&&i.stdin&&(i.stdin.write(t),i.stdin.end())});N(Ye),globalThis.__headlessBashExecutor=Ye;function Xe(e,t,n){let r=t.input_tokens||0,i=t.output_tokens||0,a=t.cache_read_input_tokens||0,o=t.cache_creation_input_tokens||0;return{type:`token-usage`,payload:{groupId:e,inputTokens:r,outputTokens:i,cacheReadTokens:a,cacheCreationTokens:o,totalTokens:r+i+a+o,contextLimit:n}}}function U(e,t,n,r){A(M(e,t,n,r))}async function*Ze(e,t){let n=e.getReader(),r=new TextDecoder,i=``;try{for(;!t?.aborted;){let{done:e,value:t}=await n.read();if(e)break;i+=r.decode(t,{stream:!0});let a=i.split(`
|
|
3
|
+
|
|
4
|
+
`);i=a.pop()||``;for(let e of a){let t=e.split(`
|
|
5
|
+
`);for(let e of t)if(!(!e||e.startsWith(`:`))&&e.startsWith(`data: `)){let t=e.slice(6).trim();if(t===`[DONE]`)continue;try{yield JSON.parse(t)}catch{}}}}}finally{n.releaseLock()}}const Qe=6e4,$e=new Map;function et(e){let t=$e.get(e);if(t)return t;let n={recentCalls:[],nextAllowedAt:0,remoteLimit:null,remoteRemaining:null,remoteResetAt:null};return $e.set(e,n),n}function W(){return Date.now()}function tt(e){if(!e)return null;let t=Number(e.trim());return Number.isFinite(t)?t:null}function nt(e){if(!e)return null;let t=e.trim(),n=Number(t);if(Number.isFinite(n))return n<=0?null:Math.round(n*1e3);let r=Date.parse(t);if(!Number.isFinite(r))return null;let i=r-W();return i>0?i:null}function rt(e){let t=tt(e);return t===null||t<=0?null:t>=0xe8d4a51000?Math.round(t):t>=1e9?Math.round(t*1e3):W()+Math.round(t*1e3)}async function it(e,t){e<=0||await new Promise((n,r)=>{let i=setTimeout(()=>{o(),n()},e),a=()=>{o(),r(new DOMException(`Aborted`,`AbortError`))},o=()=>{i&&=(clearTimeout(i),null),t?.removeEventListener(`abort`,a)};if(t?.aborted){a();return}t?.addEventListener(`abort`,a)})}function at(e,t){if(!Number.isFinite(t)||t<=0)return 0;let n=W();if(e.recentCalls=e.recentCalls.filter(e=>n-e<Qe),e.recentCalls.length<t)return 0;let r=e.recentCalls[0]||n;return Math.max(0,Qe-(n-r))}function ot(e){let t=W(),n=0;return e.nextAllowedAt>t&&(n=Math.max(n,e.nextAllowedAt-t)),e.remoteRemaining!==null&&e.remoteRemaining<=0&&e.remoteResetAt!==null&&e.remoteResetAt>t&&(n=Math.max(n,e.remoteResetAt-t)),n}async function st(e,t,n,r){let i=et(e);for(;;){let e=at(i,n.callsPerMinute),a=n.autoAdapt?ot(i):0,o=Math.max(e,a);if(o<=0){let e=W();if(n.callsPerMinute>0&&i.recentCalls.push(e),n.autoAdapt&&i.remoteRemaining!==null&&i.remoteRemaining>0&&i.remoteResetAt!==null&&i.remoteResetAt>e){let t=i.remoteResetAt-e,n=Math.max(1,i.remoteRemaining),r=Math.ceil(t/n);i.nextAllowedAt=Math.max(i.nextAllowedAt,e+r)}return}o>=1e3&&A({type:`thinking-log`,payload:{groupId:t,level:`info`,label:`Rate limiter`,message:`Waiting ${Math.ceil(o/1e3)}s before next provider call to avoid 429s.`,timestamp:Date.now()}}),await it(o,r)}}function ct(e,t,n){if(!n.autoAdapt||!t||typeof t.get!=`function`)return;let r=et(e),i=W(),a=tt(t.get(`x-ratelimit-limit`)),o=tt(t.get(`x-ratelimit-remaining`)),s=rt(t.get(`x-ratelimit-reset`));a!==null&&(r.remoteLimit=Math.max(0,Math.floor(a))),o!==null&&(r.remoteRemaining=Math.max(0,Math.floor(o))),s!==null&&(r.remoteResetAt=s);let c=nt(t.get(`retry-after`));c!==null&&(r.nextAllowedAt=Math.max(r.nextAllowedAt,i+c)),r.remoteRemaining!==null&&r.remoteRemaining<=0&&r.remoteResetAt!==null&&r.remoteResetAt>i&&(r.nextAllowedAt=Math.max(r.nextAllowedAt,r.remoteResetAt))}const lt={"litert-community/gemma-4-E2B-it-litert-lm":`https://huggingface.co/litert-community/gemma-4-E2B-it-litert-lm/resolve/main/gemma-4-E2B-it-web.litertlm`,"litert-community/gemma-4-E4B-it-litert-lm":`https://huggingface.co/litert-community/gemma-4-E4B-it-litert-lm/resolve/main/gemma-4-E4B-it-web.litertlm`},ut=Object.keys(lt);function dt(){return typeof navigator<`u`&&`gpu`in navigator&&typeof WebAssembly<`u`&&`Suspending`in WebAssembly}let G=null,ft=null,K=null,pt=null;const mt=ye;async function ht(e,t,n){return be(e,t,n,{cacheName:`shadow-claw-litertlm-models`,chunkSize:mt})}async function gt(e,t,n){if(ft===e&&G)return G;if(K&&pt===e)return K;pt=e,K=(async()=>{if(G){try{await G.delete?.()}catch{}G=null,ft=null}let r=lt[e];if(!r)throw Error(`LiteRT-LM: Model '${e} is not supported. Supported models: ${ut.join(`, `)}`);let i=await import(`./chunk-Y7LGPJy7.js`).catch(()=>{throw Error(`LiteRT-LM: The @litert-lm/core package is not installed. Run: npm install @litert-lm/core`)}),a=i.Engine??i.default?.Engine;if(typeof a?.create!=`function`)throw Error(`LiteRT-LM: Could not locate Engine.create in @litert-lm/core. Ensure you have the latest version installed.`);let o=await ht(r,t??(()=>{}),n),s=await a.create({model:o,mainExecutorSettings:{maxNumTokens:8192}});return G=s,ft=e,s})();try{return await K}finally{K=null,pt=null}}function _t(e){if(!e)return null;let t=e.match(/<\|tool_call>call:([A-Za-z0-9_]+)(\{[\s\S]*?)(?:<tool_call\|>|$)/);if(!t)return null;let n=t[1],r=t[2];r=r.replace(/<\|"\|>/g,`"`);function i(e){return e.replace(/([{,]\s*)([A-Za-z_$][A-Za-z0-9_$]*)(\s*:)/g,`$1"$2"$3`)}let a={},o=[r,i(r)];for(let e of o)try{let t=JSON.parse(e);if(t&&typeof t==`object`&&!Array.isArray(t)){a=t;break}}catch{}if(Object.keys(a).length===0){let e=r.indexOf(`{`),t=r.lastIndexOf(`}`);if(e>=0&&t>e){let n=r.slice(e,t+1);for(let e of[n,i(n)])try{let t=JSON.parse(e);if(t&&typeof t==`object`&&!Array.isArray(t)){a=t;break}}catch{}}}return{name:n,input:a}}function vt(e){let t=B(String(e||``),`litert_lm`).trim();if(!t)return null;let n=e=>{try{let t=JSON.parse(e);if(t&&typeof t==`object`&&(t.type===`tool_use`||t.type===`response`))return t.tools_calls&&!t.tool_calls&&(t.tool_calls=t.tools_calls),{...t,format:`json`}}catch{}return null},r=n(t);if(r)return r;let i=t.indexOf(`{`),a=t.lastIndexOf(`}`);if(i>=0&&a>i&&(r=n(t.slice(i,a+1)),r))return r;if(t.includes(`"tool_use"`)){let e=/"name"\s*:\s*"([^"]+)"/.exec(t);if(e){let n={},r=/"input"\s*:\s*(\{.*?\})\s*(?:]|\}|"|$)/s.exec(t);if(r)try{n=JSON.parse(r[1])}catch{}return{type:`tool_use`,format:`json`,tool_calls:[{id:`litert_${Date.now()}`,name:e[1],input:n}]}}}let o=_t(t);return o?{type:`tool_use`,format:`model_specific`,tool_calls:[{id:`litert_${Date.now()}`,name:o.name,input:o.input}]}:null}function yt(e,t,n){let r=[],i=e||``;if(n.length>0){let e=[``,`TOOL CALLING INSTRUCTIONS:`,`Return ONLY valid JSON (no markdown fences).`,`To call a tool: {"type":"tool_use","tool_calls":[{"name":"<tool>","input":{...}}]}`,`To reply: {"type":"response","response":"<your answer>"}`,`IMPORTANT: When you need to use a tool, output ONLY the JSON above — do NOT describe the call as text.`,``,`Available tools:`,n.map(e=>{let t=Object.keys(e.input_schema.properties||{}).join(`, `),n=e.description.split(`. `)[0];return`${e.name}(${t}): ${n}`}).join(`
|
|
6
|
+
`)].join(`
|
|
7
|
+
`);i=i?i+e:e}i&&r.push({role:`system`,content:i});let a=[];for(let e of t)if(e.role===`user`){let t=Array.isArray(e.content)?e.content.map(e=>e?.type===`text`?e.text:e?.type===`tool_result`?`[TOOL_RESULT ${e.tool_use_id}] ${String(e.content||``)}`:``).filter(Boolean).join(`
|
|
8
|
+
`):String(e.content||``);t&&a.push(t)}else e.role;return{preface:r,turns:a}}async function bt(e,t,n,r,i,a,o,s,c,l){if(!dt()){await a({type:`response`,payload:{groupId:t,text:`⚠️ LiteRT-LM requires WebGPU and WebAssembly.Suspending. These are not both available in this browser.`}});return}await a(M(t,`info`,`Starting`,`Provider: LiteRT-LM (Browser · WebGPU) · Model: ${s}`)),await a({type:`model-download-progress`,payload:{groupId:t,status:`running`,progress:0,message:`Loading LiteRT-LM model: ${s}…`}});let u=e=>(e/(1024*1024)).toFixed(0),d=-1,f=(e,n,r)=>{let i=n?e/n:null,o=i==null?-1:Math.floor(i*100);o===d&&!r||(d=o,a({type:`model-download-progress`,payload:{groupId:t,status:`running`,progress:i,message:r?`Loaded ${s} from cache (${u(e)} MB )`:n?`Downloading ${s}: ${u(e)} / ${u(n)} MB`:`Downloading ${s}: ${u(e)} MB`}}))},p;try{p=await gt(s,f,o)}catch(e){if(o?.aborted||e?.name===`AbortError`){await a({type:`model-download-progress`,payload:{groupId:t,status:`error`,progress:null,message:`LiteRT-LM model download cancelled.`}});return}await a({type:`model-download-progress`,payload:{groupId:t,status:`error`,progress:null,message:`LiteRT-LM model failed to load: ${e?.message??String(e)}`}}),await a({type:`response`,payload:{groupId:t,text:`⚠️ LiteRT-LM failed to initialize: ${e?.message??String(e)}`}});return}await a({type:`model-download-progress`,payload:{groupId:t,status:`done`,progress:1,message:`LiteRT-LM model ready.`}});let m=c??[],{preface:h,turns:g}=yt(n,r,m),_;try{_=await p.createConversation({preface:{messages:h}})}catch(e){await a({type:`response`,payload:{groupId:t,text:`⚠️ LiteRT-LM failed to create conversation: ${e?.message??String(e)}`}});return}let v=g.slice(0,-1),y=g[g.length-1]??`Hello.`;for(let e of v){if(o?.aborted)return;try{await _.sendMessage(e)}catch{}}if(o?.aborted)return;let b=y;for(let n=0;n<10;n++){if(o?.aborted)return;await a({type:`streaming-start`,payload:{groupId:t}});let n=``;try{let e=_.sendMessageStreaming(b);for await(let r of e){if(o?.aborted)break;let e=r?.content?.[0]?.text??``;if(e){let r=B(e,`litert_lm`);r&&(n+=r,await a({type:`streaming-chunk`,payload:{groupId:t,text:r}}))}}}catch(e){if(o?.aborted)return;await a({type:`response`,payload:{groupId:t,text:`⚠️ LiteRT-LM generation error: ${e?.message??String(e)}`}});return}let r=m.length>0?vt(n):null;if(r?.type===`tool_use`){await a({type:`streaming-end`,payload:{groupId:t}});let n=Array.isArray(r.tool_calls)?r.tool_calls:[];if(n.length===0){await a({type:`streaming-done`,payload:{groupId:t,text:`(no response)`}}),await a({type:`response`,payload:{groupId:t,text:`(no response)`}});return}let i=[],o=r.format===`model_specific`;for(let r of n){await a(j(t,r.name,`running`)),P(e=>{a(e)});let n;try{n=await F(e,r.name,r.input||{},t,{allowedTools:m,invokeContext:l})}catch(e){n=`Error: ${e?.message??String(e)}`}finally{P(null)}await a(j(t,r.name,`done`));let s=typeof n==`string`?n:JSON.stringify(n);o?i.push(`<|tool_response>${s}<|tool_response|>`):i.push(`[TOOL_RESULT ${r.id??r.name}] ${s}`)}if(o)b=i.join(`
|
|
9
|
+
`);else{let e=g[g.length-1]??``;b=[...i,``,`Based on the above tool results, please respond to the original request.`,e?`Original request: "${e}"`:``].filter(Boolean).join(`
|
|
10
|
+
`)}continue}let i;i=r?.type===`response`&&r.response?B(r.response,`litert_lm`):B(n,`litert_lm`),await a({type:`streaming-done`,payload:{groupId:t,text:i}}),await a({type:`response`,payload:{groupId:t,text:i}});return}await a({type:`response`,payload:{groupId:t,text:`⚠️ LiteRT-LM reached the maximum number of tool-calling iterations without producing a final response.`}})}const xt=new class{chunkCallbacks=new Map;loadRejects=new Map;loadResolves=new Map;pendingRejects=new Map;pendingResolves=new Map;progressCallbacks=new Map;thinkingCallbacks=new Map;worker=null;async generate(e,t,n,r,i,a){let o=this.getWorker();return new Promise((s,c)=>{this.pendingResolves.set(n,s),this.pendingRejects.set(n,c),this.chunkCallbacks.set(n,e=>r(e.text)),i&&this.thinkingCallbacks.set(n,i),o.postMessage({type:`generate`,payload:{messages:e,maxTokens:t,groupId:n,tools:a}})})}async load(e,t,n,r,i){let a=this.getWorker();return new Promise((o,s)=>{this.loadResolves.set(r,o),this.loadRejects.set(r,s),this.progressCallbacks.set(r,i),a.postMessage({type:`load`,payload:{modelId:e,device:t,dtypeStrategy:n,groupId:r}})})}cleanup(e){this.pendingResolves.delete(e),this.pendingRejects.delete(e),this.progressCallbacks.delete(e),this.chunkCallbacks.delete(e),this.thinkingCallbacks.delete(e)}getWorker(){return this.worker||(this.worker=new Worker(Ae(new URL(`./transformers-js.worker.js`,import.meta.url).href),{type:`module`}),this.worker.onmessage=e=>{let{type:t,payload:n}=e.data,r=n?.groupId;switch(t){case`progress`:this.progressCallbacks.get(r)?.(n),n.status===`done`&&(this.loadResolves.get(r)?.(),this.loadResolves.delete(r),this.loadRejects.delete(r));break;case`chunk`:this.chunkCallbacks.get(r)?.(n);break;case`thinking-chunk`:this.thinkingCallbacks.get(r)?.(n.text);break;case`done`:this.pendingResolves.get(r)?.(n.text),this.cleanup(r);break;case`error`:this.pendingRejects.get(r)?.(n.error),this.loadRejects.get(r)?.(n.error),this.cleanup(r),this.loadResolves.delete(r),this.loadRejects.delete(r);break}}),this.worker}};function St(e){return typeof e?.content==`string`?e.content:Array.isArray(e?.content)?e.content.map(e=>e?.type===`text`?e.text||``:e?.type===`tool_use`?`[TOOL_CALL ${e.name}] ${JSON.stringify(e.input||{})}`:e?.type===`tool_result`?`[TOOL_RESULT ${e.tool_use_id}] ${String(e.content||``)}`:e?.type===`attachment`?`[ATTACHMENT ${e.mediaType}] ${e.fileName} (${e.mimeType})`:``).filter(Boolean).join(`
|
|
11
|
+
`):``}function Ct(e){let t=B(String(e||``),`transformers_js`).trim();if(!t)return null;let n=t.match(/<tool_call>([\s\S]*?)<\/tool_call>/);if(n)try{let e=JSON.parse(n[1]);if(e.name)return{type:`tool_use`,tool_calls:[{name:e.name,input:e.arguments||e.parameters||{}}]}}catch{}try{return JSON.parse(t)}catch{let e=t.indexOf(`{`),n=t.lastIndexOf(`}`);if(e>=0&&n>e)try{return JSON.parse(t.slice(e,n+1))}catch{return null}return null}}async function wt(e,t,n,r,i,o,s,c,l,u){let d=c||[],f=await p(e,a.TRANSFORMERS_JS_BACKEND)||`auto`,m=await p(e,a.TRANSFORMERS_JS_DTYPE_STRATEGY)||`auto`;await o(M(t,`info`,`Starting`,`Provider: Transformers.js (Local Worker) · Model: ${l} · Backend: ${f} · Dtype: ${m}`)),await xt.load(l,f,m,t,e=>{o({type:`model-download-progress`,payload:e})});let h=[...r];for(let r=0;r<10;r++){let r=[{role:`system`,content:n},...h.map(e=>({role:e.role===`assistant`?`assistant`:`user`,content:St(e)}))];await o({type:`streaming-start`,payload:{groupId:t}});let a=``,s=``,c=await xt.generate(r,i,t,e=>{s+=e,o({type:`streaming-chunk`,payload:{groupId:t,text:e}})},e=>{a+=e,o(M(t,`text`,`Thinking`,a))},d);await o({type:`typing`,payload:{groupId:t}});let l=Ct(c);if(l?.type===`tool_use`?await o({type:`streaming-end`,payload:{groupId:t}}):await o({type:`streaming-done`,payload:{groupId:t,text:l?.response?B(l.response,`transformers_js`):B(c,`transformers_js`)}}),!l||l.type===`response`){await o({type:`response`,payload:{groupId:t,text:l?.response?B(l.response,`transformers_js`):B(c,`transformers_js`)}});return}let f=Array.isArray(l.tool_calls)?l.tool_calls:[];if(f.length===0){await o({type:`response`,payload:{groupId:t,text:B(l.response||c,`transformers_js`)}});return}let p=[];for(let n of f){await o(j(t,n.name,`running`)),P(e=>{o(e)});let r;try{r=await F(e,n.name,n.input||{},t,{allowedTools:d,invokeContext:u})}finally{P(null)}await o(j(t,n.name,`done`)),p.push({type:`tool_result`,tool_use_id:n.id||`call_${Date.now()}`,content:typeof r==`string`?r:JSON.stringify(r)})}h.push({role:`assistant`,content:[...l.response?[{type:`text`,text:l.response}]:[],...f.map(e=>({type:`tool_use`,id:e.id||`call_${Date.now()}_${Math.random()}`,name:e.name,input:e.input||{}}))]}),h.push({role:`user`,content:p})}}async function Tt(e,t,n){let r=t.provider,i=async e=>{A(e)};if(r===`transformers_js_browser`){await wt(e,t.groupId,t.systemPrompt,t.messages,t.maxTokens,i,n,t.enabledTools,t.model);return}if(r===`prompt_api`){if(!pe())throw Error(`Prompt API provider is not supported in this environment.`);await de(e,t.groupId,t.systemPrompt,t.messages,t.maxTokens,i,n,t.enabledTools);return}if(r===`litert_lm_browser`){if(!dt())throw Error(`Litert LM Browser provider is not supported in this environment.`);await bt(e,t.groupId,t.systemPrompt,t.messages,t.maxTokens,i,n,t.model,t.enabledTools);return}await Rt(e,t,n)}var Et=class{callbacks;contentBlocks=[];format;stopReason=`end_turn`;usage={input_tokens:0,output_tokens:0};#e=new Map;#t=``;#n=``;#r=new Map;constructor(e,t={}){this.format=e,this.callbacks=t}finalize(){return this.format===`openai`||this.format===`mesh-llm`?this.#a():this.#i()}push(e){this.format===`openai`||this.format===`mesh-llm`?this.#s(e):this.#o(e)}#i(){let e=[];for(let[,t]of[...this.#e.entries()].sort((e,t)=>e[0]-t[0]))if(t.type===`text`){let n=this.#c(t.text||``);n&&e.push({type:`text`,text:n})}else if(t.type===`tool_use`){let n;try{n=t.partialJson?JSON.parse(t.partialJson):{}}catch{n={}}e.push({type:`tool_use`,id:t.id||`call_${Date.now()}_${Math.random()}`,name:t.name,input:n})}else t.type===`thinking`?typeof t.text==`string`&&t.text.length>0&&e.push({type:`thinking`,thinking:t.text,...typeof t.id==`string`?{signature:t.id}:{}}):t.type===`redacted_thinking`&&typeof t.text==`string`&&t.text.length>0&&e.push({type:`redacted_thinking`,data:t.text});return{content:e,stop_reason:this.stopReason,usage:{...this.usage}}}#a(){let e=[];if(this.#n){let t=this.#c(this.#n);t&&e.push({type:`text`,text:t})}if(this.#t&&e.unshift({type:`thinking`,thinking:this.#t}),this.#r.size>0){this.stopReason=`tool_use`;for(let[,t]of[...this.#r.entries()].sort((e,t)=>e[0]-t[0])){let n;try{n=t.args?JSON.parse(t.args):{}}catch{n={}}e.push({type:`tool_use`,id:t.id||`call_${Date.now()}_${Math.random()}`,name:t.name,input:n})}}return{content:e,stop_reason:this.stopReason,usage:{...this.usage}}}#o(e){switch(e.type){case`message_start`:e.message?.usage&&(this.usage.input_tokens=e.message.usage.input_tokens||0,this.usage.cache_read_input_tokens=e.message.usage.cache_read_input_tokens||0,this.usage.cache_creation_input_tokens=e.message.usage.cache_creation_input_tokens||0);break;case`content_block_start`:{let t=e.index??this.#e.size,n=e.content_block||{};this.#e.set(t,{type:n.type||`text`,id:n.type===`thinking`?n.signature:n.id,name:n.name,text:n.text||n.thinking||n.data||``,partialJson:n.type===`tool_use`?``:void 0}),n.type===`tool_use`&&n.name&&this.callbacks.onToolStart?.(n.name);break}case`content_block_delta`:{let t=e.index??0,n=this.#e.get(t);if(!n){let r=e.delta?.type===`input_json_delta`?`tool_use`:`text`;n={type:r,text:r===`text`?``:void 0,partialJson:r===`tool_use`?``:void 0},this.#e.set(t,n)}let r=e.delta;if(!r)break;if(r.type===`text_delta`&&typeof r.text==`string`){let e=this.#c(r.text);if(!e)break;n.text=(n.text||``)+e,this.callbacks.onText?.(e)}r.type===`thinking_delta`&&typeof r.thinking==`string`&&(n.type=`thinking`,n.text=(n.text||``)+r.thinking,this.callbacks.onThinking?.(r.thinking)),r.type===`signature_delta`&&typeof r.signature==`string`&&(n.type=`thinking`,n.id=r.signature),r.type===`redacted_thinking_delta`&&typeof r.data==`string`&&(n.type=`redacted_thinking`,n.text=(n.text||``)+r.data),r.type===`input_json_delta`&&typeof r.partial_json==`string`&&(n.partialJson=(n.partialJson||``)+r.partial_json);break}case`content_block_stop`:break;case`message_delta`:e.delta?.stop_reason&&(this.stopReason=e.delta.stop_reason),e.usage&&(this.usage.output_tokens=e.usage.output_tokens||0,this.callbacks.onUsage?.(this.usage));break;case`message_stop`:break;default:break}}#s(e){e.usage&&(this.usage.input_tokens=e.usage.prompt_tokens||0,this.usage.output_tokens=e.usage.completion_tokens||0,this.usage.cache_read_input_tokens=e.usage.prompt_tokens_details?.cached_tokens||0,this.callbacks.onUsage?.(this.usage));let t=e.choices?.[0];if(!t)return;let n=t.delta;if(n){if(typeof n.content==`string`){let e=this.#c(n.content);e&&(this.#n+=e,this.callbacks.onText?.(e))}if(typeof n.reasoning==`string`)this.#t+=n.reasoning,this.callbacks.onThinking?.(n.reasoning);else if(n.reasoning&&typeof n.reasoning==`object`){let e=n.reasoning;typeof e.content==`string`?(this.#t+=e.content,this.callbacks.onThinking?.(e.content)):typeof e.text==`string`&&(this.#t+=e.text,this.callbacks.onThinking?.(e.text))}if(Array.isArray(n.tool_calls))for(let e of n.tool_calls){let t=e.index??0;this.#r.has(t)||(this.#r.set(t,{id:e.id||``,name:e.function?.name||``,args:``}),e.function?.name&&this.callbacks.onToolStart?.(e.function.name));let n=this.#r.get(t);n&&(e.id&&(n.id=e.id),e.function?.name&&(n.name=e.function.name),e.function?.arguments&&(n.args+=e.function.arguments))}t.finish_reason&&(t.finish_reason===`tool_calls`?this.stopReason=`tool_use`:t.finish_reason===`stop`?this.stopReason=`end_turn`:this.stopReason=t.finish_reason)}}#c(e){return B(e,this.callbacks.source??this.format)}};const Dt=new Map;function Ot(e){return Dt.get(e)}function kt(e){Dt.delete(e)}function At(e,t){let n=e.trim().match(/^\[tool_code\]([\s\S]*?)\[\/tool_code\]$/i);if(!n?.[1])return{toolBlocks:[],residualText:e};let r=n[1].trim(),i=r.match(/^print\s*\(\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\(\s*(.*?)\s*\)\s*\)$/s),a=r.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\s*\(\s*(.*?)\s*\)$/s),o=i||a;if(!o?.[1])return{toolBlocks:[],residualText:e};let s=o[1];if(!t.has(s))return{toolBlocks:[],residualText:e};let c=(o[2]||``).trim(),l={};if(c){if(!c.startsWith(`{`)||!c.endsWith(`}`))return{toolBlocks:[],residualText:e};try{let t=JSON.parse(c);if(!t||typeof t!=`object`||Array.isArray(t))return{toolBlocks:[],residualText:e};l=t}catch{return{toolBlocks:[],residualText:e}}}return{toolBlocks:[{type:`tool_use`,id:`tool_code_${Date.now()}_${Math.random()}`,name:s,input:l}],residualText:``}}function jt(e,t){if(!e||e.stop_reason===`tool_use`||!Array.isArray(e.content))return e;let n=new Set((t||[]).map(e=>typeof e?.name==`string`?e.name:``).filter(Boolean));if(n.size===0)return e;let r=[],i=!1;for(let t of e.content){if(t?.type!==`text`||typeof t.text!=`string`){r.push(t);continue}let e=At(t.text,n);if(e.toolBlocks.length>0){i=!0,e.residualText.trim()&&r.push({type:`text`,text:e.residualText}),r.push(...e.toolBlocks);continue}r.push(t)}return i?{...e,content:r,stop_reason:`tool_use`}:e}function Mt(e){let t=e.filter(e=>e?.type===`tool_result`).map(e=>typeof e.content==`string`?e.content.trim():Array.isArray(e.content)?e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
12
|
+
`).trim():JSON.stringify(e.content).trim()).filter(Boolean);return t.length===0?``:t.join(`
|
|
13
|
+
|
|
14
|
+
`).slice(0,1e4)}function Nt(e){let t=e.trim();return t?`Tool result:\n${t}`:``}let Pt=null;function Ft(e){Pt=e}let It=null;function Lt(e){It=e}async function Rt(t,r,i){let{apiKey:a,assistantName:o,contextCompression:s=!1,contextLimit:c,enabledTools:l,groupId:u,isScheduledTask:d=!1,maxIterations:f,maxTokens:p,memory:m,messages:h,model:v,provider:y,providerHeaders:b={},providerRuntimeOverrides:x,reasoning:C,rateLimitAutoAdapt:w=!0,rateLimitCallsPerMinute:T=0,storageHandle:E,streaming:D=!1,subagentModelSelectionMode:k,subagentMaxTokens:M,subagentPinnedModel:N,subagentPinnedProvider:P,systemPrompt:ne,workspaceGroupId:ie}=r,ae=!!r.subagentTask,I=ae?u.startsWith(`subagent:`)?u:`subagent:${e()}`:u,oe=ie||u;ae&&ge(I,[]);let se={autoAdapt:w!==!1,callsPerMinute:Number.isFinite(T)?Math.max(0,Math.floor(T)):0};E&&O(E);let ce=n(y);if(!ce){A({payload:{groupId:I,error:`Unknown provider: ${y}`},type:`error`});return}let L=ce,R=D&&L.supportsStreaming===!0&&L.format!==`prompt_api`;A({type:`typing`,payload:{groupId:I}}),U(I,`info`,`Starting`,`Provider: ${L.name} · Model: ${v} · Max tokens: ${p} · Streaming: ${R?`on`:`off`}${D&&!R?` (provider does not support streaming)`:``}`);try{let e=[...h],n=0,u=typeof f==`number`&&f>0?f:50,w=Array.isArray(l)?l:S;_()&&(w=g(w));let T=ne,D=``,O={apiKey:a,assistantName:o??``,db:t,enabledTools:w,invokeSubagent:e=>Tt(t,e,i),maxTokens:p,memory:m??``,model:v,provider:y,subagentModelSelectionMode:k,subagentMaxTokens:M,subagentPinnedProvider:P,subagentPinnedModel:N,providerHeaders:b,providerRuntimeOverrides:x,storageHandle:E,streaming:!1,systemPrompt:T??``},ee=[];for(;n<u;){n++;let l=Ot(I);l&&(w=l.enabledTools,T=re(o,m,w,l.systemPromptOverride,void 0,void 0,{groupId:I}));let u=c??z(v),f=te(T),{messages:h,estimatedTokens:g}=le(e,{contextLimit:u,maxOutputTokens:p,skimTop:s,systemPromptTokens:f}),x=g+f,S=Math.max(100,Math.min(p,u-x-500)),E=xe(L,h,w,{contextCompression:s,maxTokens:S,model:v,reasoning:C,system:T});U(I,`api-call`,`API call #${n}`,`${h.length} messages in context`);let k={...we(L,a),...b},M=L.baseUrl,N;_()&&y===`transformers_js_local`&&Pt?(R&&A({payload:{groupId:I},type:`streaming-start`}),N=Te(L,await Pt({modelId:v,messages:h,tools:w,maxTokens:S,abortSignal:i,verbose:!!r.verbose,onToken:e=>{R&&e&&A({payload:{groupId:I,text:e},type:`streaming-chunk`})},onProgress:e=>{if(e?.status===`progress`||e?.status===`progress_total`){let t=null;if(typeof e.progress==`number`){let n=e.progress<=1&&e.progress>0&&!e.total?e.progress*100:typeof e.loaded==`number`&&typeof e.total==`number`&&e.total>0?e.loaded/e.total*100:e.progress;t=Math.max(0,Math.min(100,Math.round(n)))}A({payload:{groupId:I,label:`Model Progress`,message:`${e.file||v}: ${t===null?`loading...`:`${t}%`}`},type:`status`})}}}))):_()&&y===`llamafile`&&It?(R&&A({payload:{groupId:I},type:`streaming-start`}),N=Te(L,await It({model:v,messages:h,maxTokens:S,abortSignal:i,verbose:!!r.verbose,onToken:e=>{R&&e&&A({payload:{groupId:I,text:e},type:`streaming-chunk`})}}))):N=R?await Bt(y,L,M,k,E,I,v,se,i):await zt(y,L,M,k,E,I,se,i),N=jt(N,w),N.usage&&A(Xe(I,N.usage,z(v)));for(let e of N.content)e.type===`text`&&e.text&&U(I,`text`,`Response text`,e.text.length>200?e.text.slice(0,200)+`…`:e.text);if(N.stop_reason===`tool_use`){let n=new Set(w.map(e=>typeof e?.name==`string`?e.name:``).filter(Boolean)),r=N.content.filter(e=>e.type===`text`).map(e=>e.text).join(``).replace(/<internal>[\s\S]*?<\/internal>/g,``).trim();r&&A({payload:{groupId:I,text:r},type:`intermediate-response`}),R&&A({payload:{groupId:I},type:`streaming-end`});let i=[];for(let e of N.content)if(e.type===`tool_use`){let r=n.has(e.name),a=`${e.name}:${JSON.stringify(e.input)}`,o=ee.filter(e=>e===a).length;if(ee.push(a),!r){let t=`SYSTEM ERROR: Tool '${e.name}' is disabled or unavailable for this request. Do not call it again. Try a different approach or ask the user for help.`;U(I,`warning`,`Tool blocked`,t),i.push({content:t,tool_use_id:e.id,type:`tool_result`});continue}let s=JSON.stringify(e.input),c=s.length>300?s.slice(0,300)+`…`:s;U(I,`tool-call`,`Tool: ${e.name}`,c),A(j(I,e.name,`running`));let l;o>=3?(l=`SYSTEM ERROR: You have repeatedly called this tool with the exact same input (${o+1} times). This is a rigid loop. STOP calling this tool with these arguments. Try a different approach, fix the underlying issue, or ask the user for help.`,console.warn(`[Worker] Blocked repetitive tool call:`,a)):l=await F(t,e.name,e.input,oe,{allowedTools:w,isScheduledTask:d,invokeContext:O});let u=typeof l==`string`?l:JSON.stringify(l),f=u.length>500?u.slice(0,500)+`…`:u;U(I,`tool-result`,`Result: ${e.name}`,f),A(j(I,e.name,`done`)),Array.isArray(l)?i.push({content:l,tool_use_id:e.id,type:`tool_result`}):i.push({content:typeof l==`string`?l.slice(0,1e5):JSON.stringify(l).slice(0,1e5),tool_use_id:e.id,type:`tool_result`})}D=Mt(i),e.push({role:`assistant`,content:N.content}),e.push({role:`user`,content:i}),A({type:`typing`,payload:{groupId:I}})}else{let e=N.content.filter(e=>e.type===`text`).map(e=>e.text).join(``).replace(/<internal>[\s\S]*?<\/internal>/g,``).trim(),t=(e.toLowerCase()===`(no response)`?``:e)||(D?Nt(D):`(no response)`);R&&A({payload:{groupId:I,text:t},type:`streaming-done`}),A({payload:{groupId:I,text:t},type:`response`});return}}A({payload:{text:`⚠️ Reached maximum tool-use iterations (${u}). Stopping to avoid excessive API usage.`,groupId:I},type:`response`})}catch(e){if(e instanceof Error&&e.name===`AbortError`)return;let t=e instanceof Error?e.message:String(e);R&&A({payload:{groupId:I,error:t},type:`streaming-error`}),A({type:`error`,payload:{groupId:I,error:t}})}finally{kt(I),ae&&ee(I)}}async function zt(e,t,n,r,i,a,o,s){return me(async()=>{await st(e,a,o,s);let c=await fetch(n,{body:JSON.stringify(i),headers:r,method:`POST`,signal:s});if(ct(e,c.headers,o),!c.ok){let e=await c.text(),n=Error(`${t.name} API error ${c.status}: ${e}`);throw n.status=c.status,n}return Te(t,await c.json())},{baseDelayMs:2e3,jitterFactor:.5,maxDelayMs:3e4,maxRetries:3,onRetry:(e,t,n,r)=>{let i=r instanceof Error?r.message:String(r);U(a,`warning`,`Retrying API call (${e}/${t})`,i),A({type:`show-toast`,payload:{message:`LLM API: Retrying (${e}/${t})… ${i.slice(0,120)}`,type:`warning`,duration:5e3}})},shouldRetry:e=>R(e),signal:s})}async function Bt(e,t,n,r,i,a,o,s,c){let l={...i,stream:!0,...(t.format===`openai`||t.format===`mesh-llm`)&&{stream_options:{include_usage:!0}}};await st(e,a,s,c);let u=await fetch(n,{body:JSON.stringify(l),headers:r,method:`POST`,signal:c});if(ct(e,u.headers,s),!u.ok){let e=await u.text(),n=Error(`${t.name} API error ${u.status}: ${e}`);throw n.status=u.status,n}if(!u.body)throw Error(`Streaming response has no body`);A({payload:{groupId:a},type:`streaming-start`});let d=0,f=``,p=0,m=``,h=(e=!1)=>{let t=Date.now();m&&(!e&&t-p<50||(U(a,`info`,`Reasoning`,m.length>400?`${m.slice(0,400)}…`:m),m=``,p=t))},g=new Et(t.format,{source:t.id,onText:e=>{let t=Date.now();f+=e,t-d>=50&&(A({payload:{groupId:a,text:f},type:`streaming-chunk`}),f=``,d=t)},onToolStart:e=>{A(j(a,e,`running`))},onUsage:e=>{A(Xe(a,e,z(o)))},onThinking:e=>{m+=e,h(!1)}});for await(let e of Ze(u.body,c))g.push(e);f&&A({payload:{groupId:a,text:f},type:`streaming-chunk`}),h(!0);let _=g.finalize();return t.format===`mesh-llm`&&(_=Ce(_)),_}process.env.SHADOWCLAW_USER_AGENT;function Vt(e){return Array.isArray(e)?e[0]||``:typeof e==`string`?e:``}function Ht(e,t){let n=Number.parseInt(e??``,10);return!Number.isFinite(n)||n<=0?t:n}function Ut(e){let t=e.trim();if(!t)return{};let n=[],r=``,i=null;for(let e=0;e<t.length;e+=1){let a=t[e];if((a===`"`||a===`'`)&&t[e-1]!==`\\`){i===a?i=null:i||=a,r+=a;continue}if(a===`,`&&!i){r.trim()&&n.push(r.trim()),r=``;continue}r+=a}r.trim()&&n.push(r.trim());let a={};for(let e of n){let t=e.indexOf(`:`),n=e.indexOf(`=`),r=t>0?t:n;if(r<=0)continue;let i=e.slice(0,r).trim().replace(/^['"]|['"]$/g,``),o=e.slice(r+1).trim();if(i){if(o.startsWith(`"`)&&o.endsWith(`"`)||o.startsWith(`'`)&&o.endsWith(`'`)){o=o.slice(1,-1),a[i]=o.replace(/\\(["'\\])/g,`$1`);continue}if(o===`true`){a[i]=!0;continue}if(o===`false`){a[i]=!1;continue}if(o===`null`){a[i]=null;continue}if(/^-?\d+(\.\d+)?$/.test(o)){a[i]=Number(o);continue}a[i]=o}}return a}function Wt(e){let t=e.trim();if(!t)return{};let n=[],r=``,i=null,a=0;for(let e=0;e<t.length;e+=1){let o=t[e];if((o===`"`||o===`'`)&&t[e-1]!==`\\`){i===o?i=null:i||=o,r+=o;continue}if(!i){if(o===`(`||o===`{`||o===`[`)a+=1;else if((o===`)`||o===`}`||o===`]`)&&a>0)--a;else if(o===`,`&&a===0){r.trim()&&n.push(r.trim()),r=``;continue}}r+=o}r.trim()&&n.push(r.trim());let o={};for(let e of n){if(e=e.trim(),!e)continue;let t=e.indexOf(`=`),n=e.indexOf(`:`),r=t>0?t:n;if(r<=0)continue;let i=e.slice(0,r).trim().replace(/^['"]|['"]$/g,``),a=e.slice(r+1).trim();if(!i)continue;if(a.startsWith(`"`)&&a.endsWith(`"`)||a.startsWith(`'`)&&a.endsWith(`'`)){a=a.slice(1,-1),o[i]=a.replace(/\\(["'\\])/g,`$1`);continue}if(a===`true`){o[i]=!0;continue}if(a===`false`){o[i]=!1;continue}if(a===`null`){o[i]=null;continue}let s=Number(a);if(!Number.isNaN(s)&&a!==``){o[i]=s;continue}o[i]=a}return o}const Gt=process.env.SHADOWCLAW_USER_AGENT||`ShadowClaw/1.0`,Kt=`onnx-community/Qwen3-0.6B-ONNX`,q=V.resolve(process.cwd(),`assets/cache/transformers.js/models.json`),J=V.resolve(process.cwd(),`assets/cache/transformers.js`),Y=V.resolve(process.cwd(),`assets/cache/transformers.js/models-discovery.json.part`),qt=[{id:Kt,name:`Qwen 3 0.6B (ONNX)`,context_length:32768,max_completion_tokens:8192,supports_tools:!0},{id:`onnx-community/gemma-4-E2B-it-ONNX`,name:`Gemma 4 E2B (ONNX)`,context_length:128e3,max_completion_tokens:8192,supports_tools:!0},{id:`onnx-community/gemma-4-E4B-it-ONNX`,name:`Gemma 4 E4B (ONNX)`,context_length:128e3,max_completion_tokens:8192,supports_tools:!0},{id:`onnx-community/gemma-4-E9B-it-ONNX`,name:`Gemma 4 E9B (ONNX)`,context_length:256e3,max_completion_tokens:8192,supports_tools:!0},{id:`onnx-community/gemma-4-E27B-it-ONNX`,name:`Gemma 4 E27B (ONNX)`,context_length:256e3,max_completion_tokens:8192,supports_tools:!0},{id:`onnx-community/gemma-4-12B-it-ONNX`,name:`Gemma 4 12B (ONNX)`,context_length:256e3,max_completion_tokens:8192,supports_tools:!0},{id:`onnx-community/gemma-4-E2B-it-qat-mobile-ONNX`,name:`Gemma 4 E2B QAT Mobile (ONNX)`,context_length:128e3,max_completion_tokens:8192,supports_tools:!0},{id:`onnx-community/gemma-4-E4B-it-qat-mobile-ONNX`,name:`Gemma 4 E4B QAT Mobile (ONNX)`,context_length:128e3,max_completion_tokens:8192,supports_tools:!0},{id:`onnx-community/gemma-4-12B-it-qat-mobile-ONNX`,name:`Gemma 4 12B QAT Mobile (ONNX)`,context_length:256e3,max_completion_tokens:8192,supports_tools:!0},{id:`onnx-community/gemma-3-1b-it-ONNX`,name:`Gemma 3 1B (ONNX)`,context_length:32e3,max_completion_tokens:4096,supports_tools:!0},{id:`onnx-community/gemma-3-1b-it-ONNX-GQA`,name:`Gemma 3 1B GQA (ONNX)`,context_length:32e3,max_completion_tokens:4096,supports_tools:!0}];function Jt(){let e=new Map,t=new Map,n=new Map,r=null,i={status:`idle`,progress:null,message:`Idle`,modelId:null,updatedAt:Date.now()};function a(e){Object.assign(i,e,{updatedAt:Date.now()})}function o(e){let t=n.get(e);t&&(clearTimeout(t),n.delete(e))}function s(e){o(e);let n=t.get(e)||0;t.set(e,n+1)}function c(e){let n=t.get(e)||0;if(n<=1){t.delete(e),l(e);return}t.set(e,n-1)}function l(e){o(e);let r=setTimeout(()=>{(t.get(e)||0)>0||u(e)},1e4);r.unref?.(),n.set(e,r)}async function u(n){o(n);let r=e.get(n);if(e.delete(n),t.delete(n),r)try{let e=await r;await Promise.resolve(e.model?.dispose?.()).catch(()=>{}),await Promise.resolve(e.processor?.dispose?.()).catch(()=>{})}catch{}}function d(e){let t=Error(e);return t.name=`AbortError`,t}function f(e){return(e instanceof DOMException||e instanceof Error)&&e.name===`AbortError`}async function p(e,t){let{modelId:n,phase:r,timeoutMs:o,abortSignal:s}=t;return!o||o<=0?e:await new Promise((t,c)=>{let l=!1,f=Math.max(25,Math.min(1e3,Math.floor(o/10))),p=null,m=r===`model load`&&i.modelId===n&&typeof i.progress==`number`?i.progress:null,h=Date.now(),g=()=>{let e=`Transformers.js ${r} timed out after ${o}ms for model '${n}'.`;a({status:`error`,progress:null,message:e,modelId:n}),r===`model load`&&u(n),c(Error(e))},_=()=>{l=!0,p!==null&&(r===`model load`?clearInterval(p):clearTimeout(p)),s?.removeEventListener(`abort`,v)},v=()=>{l||(_(),c(d(`Transformers.js request was aborted`)))};p=r===`model load`?setInterval(()=>{if(l)return;let e=i.modelId===n,t=i.progress;e&&typeof t==`number`&&(m===null||t>m)&&(m=t,h=Date.now()),Date.now()-h>=o&&(_(),g())},f):setTimeout(()=>{l||(_(),g())},o),s?.addEventListener(`abort`,v,{once:!0}),e.then(e=>{l||(_(),t(e))},e=>{l||(_(),c(e))})})}function m(){return Ht(Fe.TRANSFORMERS_JS_REQUEST_TIMEOUT_MS,3e5)}async function h(e){let t=Reflect.get(e,`env`);!t||typeof t!=`object`||(await ze(J,{recursive:!0}),Reflect.set(t,`useFSCache`,!0),Reflect.set(t,`useBrowserCache`,!1),Reflect.set(t,`cacheDir`,J))}async function g(e){try{return await Ue(e),!0}catch{return!1}}function _(e){return Math.max(1,Math.ceil(e.length/4))}function v(e){return e.replace(/<\s*turn\|>\s*|<\|end_of_turn\|>|<\|eot_id\|>/gi,``)}async function y(t,n,r){if(!qt.map(e=>e.id).includes(t)){let e=`Model '${t}' is not supported by Transformers.js. This provider only supports ONNX-converted models. Supported models: ${qt.map(e=>`${e.id} (${e.name})`).join(`, `)}`;throw a({status:`error`,progress:null,message:e,modelId:t}),Error(e)}let i=e.get(t);if(i)return i;let o=(async()=>{let e=await import(`@huggingface/transformers`);await h(e);let i=Reflect.get(e,`AutoProcessor`),o=Reflect.get(e,`AutoTokenizer`),s=Reflect.get(e,`Gemma4Processor`),c=Reflect.get(e,`Gemma4ForConditionalGeneration`),l=Reflect.get(e,`AutoModelForImageTextToText`),u=Reflect.get(e,`AutoModelForCausalLM`),d=Reflect.get(e,`TextStreamer`),f=t.toLowerCase().includes(`gemma-4`),p=[];if(f&&typeof c?.from_pretrained==`function`&&p.push({name:`Gemma4ForConditionalGeneration`,from_pretrained:(e,t)=>c.from_pretrained(e,t)}),!f&&typeof l?.from_pretrained==`function`&&p.push({name:`AutoModelForImageTextToText`,from_pretrained:(e,t)=>l.from_pretrained(e,t)}),!f&&typeof u?.from_pretrained==`function`&&p.push({name:`AutoModelForCausalLM`,from_pretrained:(e,t)=>u.from_pretrained(e,t)}),typeof i?.from_pretrained!=`function`&&typeof o?.from_pretrained!=`function`||p.length===0||typeof d!=`function`)throw Error(f?`Transformers.js runtime is unavailable for Gemma 4. Ensure @huggingface/transformers exports Gemma4Processor and Gemma4ForConditionalGeneration, then restart the server.`:`Transformers.js runtime is unavailable. Ensure @huggingface/transformers exports AutoProcessor or AutoTokenizer and at least one model loader.`);n&&console.log(`[Proxy] Loading Transformers.js model: ${t}`),a({status:`running`,progress:0,message:`Preparing model ${t}...`,modelId:t});let m=(e,n)=>{if(e?.status===`progress_total`){let r=Number(e.progress);a({status:`running`,progress:Number.isFinite(r)?Math.max(0,Math.min(1,r/100)):null,message:`Downloading ${t} (${n})...`,modelId:t})}try{r?.(e)}catch{}},g=null;if(f){let e=typeof s?.from_pretrained==`function`?s:i;if(typeof e?.from_pretrained==`function`)try{g=await e.from_pretrained(t,{progress_callback:e=>m(e,`processor`)})}catch(e){if(typeof o?.from_pretrained==`function`)n&&console.warn(`[Transformers.js] Processor failed for ${t}, falling back to AutoTokenizer:`,e),g=await o.from_pretrained(t,{progress_callback:e=>m(e,`tokenizer`)});else throw e}else typeof o?.from_pretrained==`function`&&(g=await o.from_pretrained(t,{progress_callback:e=>m(e,`tokenizer`)}))}else if(typeof i?.from_pretrained==`function`)try{g=await i.from_pretrained(t,{progress_callback:e=>m(e,`processor`)})}catch(e){if(typeof o?.from_pretrained==`function`)n&&console.warn(`[Transformers.js] AutoProcessor failed for ${t}, falling back to AutoTokenizer:`,e),g=await o.from_pretrained(t,{progress_callback:e=>m(e,`tokenizer`)});else throw e}else typeof o?.from_pretrained==`function`&&(g=await o.from_pretrained(t,{progress_callback:e=>m(e,`tokenizer`)}));let _=null,v=``,y=null;if(f)for(let e of[`q4`,`q4f16`,`fp16`])try{_=await c.from_pretrained(t,{dtype:e,device:`cpu`,progress_callback:t=>m(t,e)}),v=`Gemma4ForConditionalGeneration/${e}`;break}catch(e){y=e}else{let e=[`q4`,`q4f16`,`q8`,`fp16`];for(let n of p){for(let r of e)try{_=await n.from_pretrained?.(t,{dtype:r,device:`cpu`,progress_callback:e=>m(e,`${n.name}/${r}`)}),v=`${n.name}/${r}`;break}catch(e){y=e}if(_)break}}if(!_){let e=y instanceof Error?y.message:String(y||`unknown error`);throw a({status:`error`,progress:null,message:e,modelId:t}),Error(`No supported Transformers.js model loader could initialize '${t}'. Last error: ${e}`)}return a({status:`done`,progress:1,message:`Model ready: ${t}`,modelId:t}),{processor:g,model:_,TextStreamer:d,modelLoaderName:v}})().catch(n=>{throw e.delete(t),n});return e.set(t,o),o}function b(e){let t=e.replace(/^onnx-community\//,``),n=t.match(/gemma-4-([^-]+)-it-onnx/i),r=n?.[1]?`Gemma 4 ${n[1].toUpperCase()} (ONNX)`:t,i=e.toLowerCase(),a=32e3;return i.includes(`gemma-4-12b`)||i.includes(`gemma-4-26b`)||i.includes(`gemma-4-31b`)||i.includes(`gemma-4-e9b`)||i.includes(`gemma-4-e27b`)?a=256e3:i.includes(`gemma-4`)&&(a=128e3),{id:e,name:r,context_length:a,max_completion_tokens:8192,supports_tools:!0}}async function x(e){for(let t=0;t<2;t+=1){let n=t===0,r=0;if(n)try{let e=await Ue(Y);e.isFile()&&(r=e.size)}catch{r=0}let i={"User-Agent":Gt,Accept:`application/json`,"Accept-Encoding":`identity`};r>0&&(i.Range=`bytes=${r}-`);let a=await fetch(e,{headers:i});if(a.status===416&&n){await We(Y).catch(()=>{});continue}if(!a.ok)throw Error(`Failed to discover Transformers.js models (${a.status})`);if(r>0&&a.status===206||await H(Y,``,`utf8`),a.body){let e=a.body.getReader();try{for(;;){let{done:t,value:n}=await e.read();if(t)break;n&&n.length>0&&await H(Y,n,{flag:`a`})}}finally{e.releaseLock()}}else{let e=await a.text();await H(Y,e,{encoding:`utf8`,flag:`a`})}try{let e=await Be(Y,`utf8`),t=JSON.parse(e);return Array.isArray(t)?t:[]}catch(e){if(n&&r>0){await We(Y).catch(()=>{});continue}throw e}}throw Error(`Failed to download Transformers.js discovery catalog`)}return{async runChatCompletion(e){let{modelId:t,messages:n,tools:r,maxCompletionTokens:i,verbose:a,onToken:o,onProgress:l,abortSignal:u}=e,d=m();s(t);let h;try{h=await p(y(t,a,l),{modelId:t,phase:`model load`,timeoutMs:d,abortSignal:u})}catch(e){throw c(t),e}try{let e=Ee(n),a;if(typeof h.processor?.apply_chat_template==`function`)try{a=h.processor.apply_chat_template(e,{enable_thinking:!1,add_generation_prompt:!0,tokenize:!1,...r&&r.length>0&&{tools:r}})}catch{a=await De({modelName:t,messages:e,addGenerationPrompt:!0})}else if(typeof h.processor?.tokenizer?.apply_chat_template==`function`)try{a=h.processor.tokenizer.apply_chat_template(e,{enable_thinking:!1,add_generation_prompt:!0,tokenize:!1,...r&&r.length>0&&{tools:r}})}catch{a=await De({modelName:t,messages:e,addGenerationPrompt:!0})}else a=await De({modelName:t,messages:e,addGenerationPrompt:!0});let s=h.processor?.tokenizer||h.processor,c=h.processor?.tokenizer?await h.processor(a,null,null,{add_special_tokens:!1}):await h.processor(a,{add_special_tokens:!1}),l=[],f=await p(h.model.generate({...c,...u?{signal:u}:{},max_new_tokens:i,do_sample:!1,streamer:new h.TextStreamer(s,{skip_prompt:!0,skip_special_tokens:!0,callback_function:e=>{if(u?.aborted)return;let t=v(e);t&&(l.push(t),o?.(t))}})}),{modelId:t,phase:`generation`,timeoutMs:d,abortSignal:u}),m=v(l.join(``)).trim();if(!m){let e=typeof s?.batch_decode==`function`?s.batch_decode.bind(s):typeof h.processor?.batch_decode==`function`?h.processor.batch_decode.bind(h.processor):null,t=e?e(f.slice(null,[c.input_ids.dims.at(-1),null]),{skip_special_tokens:!0}):null;m=v(String(t?.[0]||``)).trim()}return{text:m,promptTokens:_(a),completionTokens:_(m)}}catch(e){throw f(e)&&u?.aborted,e}finally{c(t)}},async fetchDynamicModels(){if(r)return r.models;try{let e=await Be(q,`utf8`),t=JSON.parse(e);if(Array.isArray(t?.models))return r={models:t.models},t.models}catch{}let e=(await x(Fe.TRANSFORMERS_JS_MODELS_DISCOVERY_URL||`https://huggingface.co/api/models?author=onnx-community&limit=100`).catch(()=>[])).map(e=>typeof e?.id==`string`?e.id:``).filter(e=>e.toLowerCase().includes(`onnx`)),t=[...new Set(e)],n=qt.map(e=>e.id),i=[...new Set([...n,...t])];i.includes(`onnx-community/Qwen3-0.6B-ONNX`)||i.unshift(Kt);let a=new Map(qt.map(e=>[e.id,e])),o=i.sort((e,t)=>e.localeCompare(t)).map(e=>a.get(e)||b(e));r={models:o};try{await ze(V.dirname(q),{recursive:!0}),await H(q,JSON.stringify({models:o},null,2),`utf8`)}catch{}return o},getDownloadStatus(){return{...i}},async getDiskCacheStatus(){let[t,n]=await Promise.all([g(q),g(J)]),r=n?await Ve(J).catch(()=>[]):[];return{modelsCatalogPath:q,modelsCatalogExists:t,runtimeCacheDir:J,runtimeCacheDirExists:n,runtimeCacheEntryCount:r.length,runtimeCacheEntries:r,loadedRuntimeModels:[...e.keys()]}},async prewarmModel(e){let{modelId:t,verbose:n,onProgress:r}=e;return{modelId:t,loader:(await y(t,n,r)).modelLoaderName,cacheDir:J}},disposeRuntime:u,__setRuntimeForTests(t,n){o(t),e.set(t,Promise.resolve(n))},__setDownloadStatusForTests(e){a(e)},async __resetRuntimeForTests(){let r=new Set([...e.keys(),...n.keys(),...t.keys()]);await Promise.all([...r].map(e=>u(e)))}}}function Yt(e){let t=e.trim();if(!t)return{};let n=[],r=``,i=null,a=0;for(let e=0;e<t.length;e++){let o=t[e];if((o===`"`||o===`'`)&&t[e-1]!==`\\`){i===o?i=null:i||=o,r+=o;continue}if(!i){if(o===`(`||o===`{`||o===`[`)a++;else if((o===`)`||o===`}`||o===`]`)&&a>0)a--;else if(o===`,`&&a===0){r.trim()&&n.push(r.trim()),r=``;continue}}r+=o}r.trim()&&n.push(r.trim());let o={};for(let e of n){if(e=e.trim(),!e)continue;let t=e.indexOf(`:`),n=e.indexOf(`=`),r=t>0&&(n<=0||t<=n)?t:n;if(r<=0)continue;let i=e.slice(0,r).trim().replace(/^['"<|"|\>]|['"<|"|\>]$/g,``).trim(),a=e.slice(r+1).trim();if(!i)continue;if(a=a.replace(/^\s*<\|"\|\>\s*/,``).replace(/\s*<\|"\|\>\s*$/,``),a.startsWith(`"`)&&a.endsWith(`"`)||a.startsWith(`'`)&&a.endsWith(`'`)){o[i]=a.slice(1,-1).replace(/\\(["'\\])/g,`$1`);continue}if(a===`true`){o[i]=!0;continue}if(a===`false`){o[i]=!1;continue}if(a===`null`){o[i]=null;continue}let s=Number(a);if(!Number.isNaN(s)&&a!==``){o[i]=s;continue}o[i]=a}return o}function Xt(e){let t=e.trim();if(t.startsWith(`{`)&&t.endsWith(`}`)){try{let e=JSON.parse(t);if(e&&typeof e==`object`&&!Array.isArray(e))return e}catch{}return Yt(t.slice(1,-1))}return Yt(t)}function Zt(e){let t=e.replace(/<\s*turn\|>\s*|<\|end_of_turn\|>|<\|eot_id\|>/gi,``).replace(/<\|tool_call\|?>/gi,``).trim();if(!t)return null;let n=t.match(/^call\s*:\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\{([\s\S]*)\}\s*$/);if(n?.[1])return{name:n[1],input:Xt(`{${n[2]}}`)};let r=t.match(/^<\s*execute_tool\s*>\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\(([^)]*)\)\s*<\s*\/\s*execute_tool\s*>\s*$/i);if(r?.[1])return{name:r[1],input:Yt(r[2]??``)};let i=t.match(/^\[tool_code\]([\s\S]*?)\[\/tool_code\]$/i);if(i?.[1]){let e=i[1].trim(),t=e.match(/^print\s*\(\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\(\s*(.*?)\s*\)\s*\)$/s),n=e.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\s*\(\s*(.*?)\s*\)$/s),r=t??n;if(r?.[1]){let e=(r[2]??``).trim();if(!e.startsWith(`{`)||!e.endsWith(`}`))return null;try{let t=JSON.parse(e);if(t&&typeof t==`object`&&!Array.isArray(t))return{name:r[1],input:t}}catch{return null}}}return null}function Qt(e){return!Array.isArray(e)||e.length===0?[]:e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.input_schema??{}}}))}let $t=null;function en(){return $t||=Jt(),$t}async function tn(t){let{modelId:n,messages:r,tools:i,maxTokens:a=8192,verbose:o=!1,onToken:s,onProgress:c,abortSignal:l,service:u}=t,d=u||en(),f=Qt(i??[]),p=await d.runChatCompletion({modelId:n,messages:r,tools:f.length>0?f:void 0,maxCompletionTokens:a,verbose:o,onToken:s,onProgress:c,abortSignal:l}),m=Zt(p.text);return m?{id:`chatcmpl-${e()}`,object:`chat.completion`,created:Math.floor(Date.now()/1e3),model:n,choices:[{index:0,message:{role:`assistant`,content:null,tool_calls:[{id:`call_${e()}`,type:`function`,function:{name:m.name,arguments:JSON.stringify(m.input)}}]},finish_reason:`tool_calls`}],usage:{prompt_tokens:p.promptTokens,completion_tokens:p.completionTokens,total_tokens:p.promptTokens+p.completionTokens}}:{id:`chatcmpl-${e()}`,object:`chat.completion`,created:Math.floor(Date.now()/1e3),model:n,choices:[{index:0,message:{role:`assistant`,content:p.text},finish_reason:`stop`}],usage:{prompt_tokens:p.promptTokens,completion_tokens:p.completionTokens,total_tokens:p.promptTokens+p.completionTokens}}}Ft(tn);function nn(e,t,n){let r={id:`chatcmpl-${Date.now()}`,object:`chat.completion.chunk`,created:Math.floor(Date.now()/1e3),model:t,choices:[{index:0,delta:{content:n},finish_reason:null}]};e.write(`data: ${JSON.stringify(r)}\n\n`)}function rn(e,t,n){let r={id:`chatcmpl-${Date.now()}`,object:`chat.completion.chunk`,created:Math.floor(Date.now()/1e3),model:t,choices:[{index:0,delta:{tool_calls:[{index:0,id:`call_${Date.now()}_${Math.random()}`,type:`function`,function:{name:n.name,arguments:JSON.stringify(n.input||{})}}]},finish_reason:null}]};e.write(`data: ${JSON.stringify(r)}\n\n`)}function an(e,t,n=`stop`){let r={id:`chatcmpl-${Date.now()}`,object:`chat.completion.chunk`,created:Math.floor(Date.now()/1e3),model:t,choices:[{index:0,delta:{},finish_reason:n}]};e.write(`data: ${JSON.stringify(r)}\n\n`),e.write(`data: [DONE]
|
|
15
|
+
|
|
16
|
+
`)}const on=Pe(import.meta.url),sn=V.dirname(on),cn=je(import.meta.url),ln=`.llamafile`,un=parseInt(process.env.LLAMAFILE_CTX_SIZE||`8192`,10),dn=new Set([`localhost`,`127.0.0.1`,`::1`]),X=new Set;function fn(e,t){if(!(e.exitCode!==null||e.signalCode!==null||e.killed)){if(process.platform===`win32`){if(typeof e.pid==`number`)try{let t=cn("node:child_process");typeof t.execFileSync==`function`&&t.execFileSync(`taskkill`,[`/PID`,String(e.pid),`/T`,`/F`],{stdio:`ignore`,windowsHide:!0})}catch{}return}try{if(typeof e.pid==`number`){if(t)try{process.kill(-e.pid,`SIGKILL`)}catch{}try{process.kill(e.pid,`SIGKILL`)}catch{}}}catch{}}}function Z(){for(let e of X)try{e.killSync()}catch{}X.clear()}let pn=!1;function mn(){pn||(pn=!0,process.on(`exit`,()=>{Z()}),process.on(`SIGINT`,()=>{Z()}),process.on(`SIGTERM`,()=>{Z()}),process.platform!==`win32`&&process.on(`SIGHUP`,()=>{Z()}))}mn();function hn(e){return e===`server`?`server`:`cli`}function gn(e){let t=e.trim().toLowerCase();return dn.has(t)?!0:Ke(t)===4?t.startsWith(`127.`):Ke(t)===6&&t===`::1`}function _n(e){let t=(typeof e==`string`?e.trim():``)||`127.0.0.1`;if(process.env.LLAMAFILE_ALLOW_NON_LOOPBACK!==`true`&&!gn(t))throw Error(`Unsafe host '${t}'. Only loopback hosts are allowed unless LLAMAFILE_ALLOW_NON_LOOPBACK=true.`);return t}function vn(e){let t=typeof e==`number`?e:Number.parseInt(typeof e==`string`?e:``,10);return!Number.isFinite(t)||t<1||t>65535?8080:t}function yn(e){return typeof e==`boolean`?e:typeof e!=`string`||e!==`false`}function bn(e){let t={...e};return delete t.llamafile,t}function xn(e){let t=bn(e);return delete t.stream,delete t.stream_options,t}function Sn(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return``;let t=[];for(let n of e){if(typeof n==`string`){t.push(n);continue}if(!n||typeof n!=`object`)continue;let e=n;if(e.type===`text`&&typeof e.text==`string`){t.push(e.text);continue}if(e.type===`tool_result`&&typeof e.content==`string`){t.push(e.content);continue}if(e.type===`tool_use`&&e.name){let n=String(e.name),r=e.input&&typeof e.input==`object`?JSON.stringify(e.input):`{}`;t.push(`[tool_use:${n}] ${r}`)}}return t.join(`
|
|
17
|
+
`)}function Cn(e){let t=Array.isArray(e.messages)?e.messages:[];if(t.length===0)return``;let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=e,r=typeof t.role==`string`&&t.role.trim()?t.role.trim().toUpperCase():`USER`,i=Sn(t.content).trim();i&&n.push(`${r}: ${i}`)}return n.length===0?``:(n.push(`ASSISTANT:`),n.join(`
|
|
18
|
+
|
|
19
|
+
`))}function wn(e){let t=String(e||``).replace(/\r\n/g,`
|
|
20
|
+
`).trim(),n=``,r=t.length===0,i=!1,a=e=>{if(i||!e)return e;let t=e.replace(/^\s*ASSISTANT:\s*/i,``);return t!==e&&(i=!0),t};return{push(e){let i=String(e||``).replace(/\r\n/g,`
|
|
21
|
+
`);if(r)return a(i);n+=i;let o=n.trimStart();if(t.startsWith(o)&&o.length<t.length)return``;r=!0;let s=n,c=n.trimStart();return c.startsWith(t)&&(s=c.slice(t.length)),n=``,a(s)},flush(){if(r)return``;r=!0;let e=a(n);return n=``,e}}}function Tn(e){let t=e.replace(/<\s*turn\|>\s*|<\|end_of_turn\|>|<\|eot_id\|>/gi,``).trim(),n=t.match(/^call\s*:\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\{([\s\S]*)\}\s*$/);if(n?.[1])return{name:n[1],input:Ut(n[2]?.trim()||``)};let r=t.match(/^<\s*execute_tool\s*>\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\(([^)]*)\)\s*<\s*\/\s*execute_tool\s*>\s*$/i);return r?.[1]?{name:r[1],input:Wt(r[2]?.trim()||``)}:null}function En(){let e=new Map,t=new Map;function n(e,t){let n={child:e,runDetached:t,killSync:()=>fn(e,t)};X.add(n);let r=()=>{X.delete(n)};return e.once(`close`,r),e.once(`error`,r),e.once(`exit`,r),r}async function r(){let e=[V.resolve(sn,`../../../assets/cache/llamafile`),V.resolve(sn,`../../../../assets/cache/llamafile`),V.resolve(process.cwd(),`assets/cache/llamafile`)],t=``;for(let n of e)try{if((await Ue(n)).isDirectory()){t=n;break}}catch{}if(!t)throw Error(`Could not locate assets/cache/llamafile directory. Tried: ${e.join(`, `)}`);return(await Ve(t,{withFileTypes:!0})).filter(e=>e.isFile()&&e.name.endsWith(ln)).map(e=>{let n=e.name;return{fileName:n,id:n.slice(0,-10),absolutePath:V.resolve(t,n)}}).sort((e,t)=>e.fileName.localeCompare(t.fileName))}async function i(e){let t=await r(),n=e.trim(),i=t.find(e=>e.id===n||e.fileName===n||e.absolutePath===n);if(i)return i;let a=V.basename(n),o=a.endsWith(ln)?a.slice(0,-10):a,s=t.find(e=>e.id===n||e.fileName===n||e.fileName===a||e.id===o||e.fileName===`${o}${ln}`);if(!s)throw Error(`Model '${n}' not found under assets/cache/llamafile (*.llamafile).`);return s}function a(e,t){return Vt(e.headers[`x-shadowclaw-request-id`]).trim()||(typeof t?.requestId==`string`&&t.requestId.trim()?t.requestId.trim():(t?.llamafile&&typeof t.llamafile==`object`?String(t.llamafile.requestId||``).trim():``)||Vt(e.headers[`x-request-id`]).trim()||`req_${Date.now()}_${Math.random().toString(36).slice(2,8)}`)}function o(t,n){return e.set(t,n),()=>{e.get(t)===n&&e.delete(t)}}function s(t){let n=e.get(t);return n?(e.delete(t),n(),!0):!1}function c(e){let t=e.headers[`x-llamafile-mode`],n=e.headers[`x-llamafile-host`],r=e.headers[`x-llamafile-port`],i=e.headers[`x-llamafile-offline`],a=e.body&&typeof e.body==`object`&&e.body.llamafile&&typeof e.body.llamafile==`object`?e.body.llamafile:{};return{mode:hn(a.mode??t),host:_n(a.host??n),port:vn(a.port??r),offline:yn(a.offline??i)}}function l(e){let t=e&&typeof e==`object`?String(e.code??``):``,n=String(e&&typeof e==`object`?e.message??``:e??``);return t===`ENOEXEC`||n.includes(`ENOEXEC`)}async function u(e,t,n,r){let i=i=>i?(r&&console.log(`[Proxy] Shell fallback: /bin/sh -c 'exec "\$0" "\$@"' ${e} [${t.length} args]`),Le(`/bin/sh`,[`-c`,`exec "$0" "$@"`,e,...t],{cwd:n.cwd,env:n.env,stdio:[`ignore`,`pipe`,`pipe`],detached:n.detached})):Le(e,t,{cwd:n.cwd,env:n.env,stdio:[`ignore`,`pipe`,`pipe`],detached:n.detached}),a=async e=>{await new Promise((t,n)=>{let r=()=>{e.off(`error`,i),t()},i=t=>{e.off(`spawn`,r),n(t)};e.once(`spawn`,r),e.once(`error`,i)})},o;try{return o=i(!1),await a(o),o}catch(t){if(process.platform===`win32`||!l(t))throw t;return r&&console.warn(`[Proxy] Direct exec failed with ENOEXEC for ${V.basename(e)}. Retrying via /bin/sh.`),o=i(!0),await a(o),o}}async function d(e,r){let i=t.get(e);if(typeof i==`boolean`)return i;try{let r=process.platform!==`win32`,i=await u(e,[`--help`],{cwd:V.dirname(e),env:{...process.env},detached:r},!1);n(i,r);let a=``;i.stdout?.on(`data`,e=>{a+=e.toString(`utf8`)}),i.stderr?.on(`data`,e=>{a+=e.toString(`utf8`)}),await new Promise((e,t)=>{i.on(`error`,t),i.on(`close`,()=>e())});let o=/(^|\s)--offline(\s|[,.)]|$)/m.test(a);return t.size>=100&&t.clear(),t.set(e,o),o}catch(n){if(r){let t=n instanceof Error?n.message:String(n);console.warn(`[Proxy] Could not probe --offline support for ${V.basename(e)}: ${t}. Continuing without --offline.`)}return t.size>=100&&t.clear(),t.set(e,!1),!1}}return{listBinaries:r,resolveBinary:i,getLlamafileRequestId:a,cancelRequest:s,getLlamafileRuntimeOptions:c,async invokeCli(e,t,r,s,c){if(e.destroyed||e.aborted||e.socket?.destroyed)throw Error(`Request already closed or aborted`);let{absolutePath:l}=await i(s.model),f=a(e,r);try{await Re(l,Me.X_OK)}catch(e){let t=`Binary not executable or not found: ${l} (${e instanceof Error?e.message:String(e)})`;throw Error(t)}if(e.destroyed||e.aborted||e.socket?.destroyed)throw Error(`Request already closed or aborted`);let p=r.stream===!0,m=Cn(xn(r));if(!m)throw Error(`Llamafile CLI requires at least one text message in request payload.`);let h=typeof r.max_tokens==`number`&&Number.isFinite(r.max_tokens)?Math.floor(r.max_tokens):512,g=[`--n-predict`,String(Math.max(1,h)),`--ctx-size`,String(un),`--cli`,`-p`,m];s.offline&&await d(l,c)?g.unshift(`--offline`):s.offline&&c&&console.log(`[Proxy] Skipping unsupported --offline flag for ${V.basename(l)}.`);let _,v=process.platform!==`win32`;try{_=await u(l,g,{cwd:V.dirname(l),env:{...process.env},detached:v},c)}catch(e){throw Error(`Failed to spawn llamafile: ${e instanceof Error?e.message:String(e)}`)}if(n(_,v),e.destroyed||e.aborted||e.socket?.destroyed)throw fn(_,v),Error(`Request already closed or aborted`);if(!_.stdout||!_.stderr)throw fn(_,v),Error(`Failed to setup child process streams`);let y=``,b=``,x=``,S=!1,C=!1,w=null,T=wn(m),E=()=>{w&&=(clearTimeout(w),null)},D=(e=`SIGTERM`)=>{if(!(_.exitCode!==null||_.signalCode!==null||_.killed)){if(e===`SIGKILL`){fn(_,v);return}if(process.platform===`win32`){if(typeof _.pid!=`number`)return;try{let e=cn("node:child_process");if(typeof e.execFileSync==`function`){e.execFileSync(`taskkill`,[`/PID`,String(_.pid),`/T`,`/F`],{stdio:`ignore`,windowsHide:!0});return}}catch{}try{Le(`taskkill`,[`/PID`,String(_.pid),`/T`,`/F`],{stdio:`ignore`,windowsHide:!0}).unref()}catch{}return}try{if(v&&typeof _.pid==`number`)try{process.kill(-_.pid,e)}catch{}if(typeof _.pid==`number`)try{process.kill(_.pid,e)}catch{}}catch{}}},O=()=>{if(!(_.exitCode!==null||_.signalCode!==null||_.killed)){if(process.platform===`win32`){D(`SIGKILL`);return}D(`SIGTERM`),!w&&(w=setTimeout(()=>{_.exitCode!==null||_.signalCode!==null||_.killed||D(`SIGKILL`)},500))}},k=()=>{e.off(`aborted`,A),e.off(`close`,A),e.socket.off(`close`,A),t.off(`close`,A)},A=()=>{C||(C=!0,O())};e.once(`aborted`,A),e.once(`close`,A),e.socket.once(`close`,A),t.once(`close`,A);let j=o(f,A);return new Promise((e,n)=>{if(p){t.status(200),t.setHeader(`Content-Type`,`text/event-stream`),t.setHeader(`Cache-Control`,`no-cache`),t.setHeader(`Connection`,`keep-alive`),t.setHeader(`Access-Control-Allow-Origin`,`*`),t.flushHeaders(),_.stdout.on(`data`,e=>{if(C||t.writableEnded)return;let n=e.toString(`utf8`);b+=n;let r=T.push(n);r&&!C&&!t.writableEnded&&nn(t,s.model,r),x+=r}),_.stderr.on(`data`,e=>{y+=e.toString(`utf8`)}),_.on(`close`,n=>{if(k(),j(),E(),C||S){e();return}if(n!==0){let r=y.trim()||`llamafile exited with status ${n}`;t.write(`data: ${JSON.stringify({error:{type:`server_error`,message:r}})}\n\n`),t.write(`data: [DONE]
|
|
22
|
+
|
|
23
|
+
`),t.end(),e();return}let r=T.flush();x+=r;let i=Tn(x.trim());if(i){rn(t,s.model,i),an(t,s.model,`tool_calls`),t.end(),e();return}r&&!C&&!t.writableEnded&&nn(t,s.model,r),an(t,s.model),t.end(),e()}),_.on(`error`,n=>{if(S=!0,k(),j(),E(),C){e();return}let r=`Child process error: ${n instanceof Error?n.message:String(n)}`;if(!t.headersSent){t.status(500).json({error:`Failed to execute llamafile: ${r}`}),e();return}t.write(`data: ${JSON.stringify({error:{type:`server_error`,message:r}})}\n\n`),t.write(`data: [DONE]
|
|
24
|
+
|
|
25
|
+
`),t.end(),e()});return}_.stdout.on(`data`,e=>{b+=e.toString(`utf8`),x+=T.push(e.toString(`utf8`))}),_.stderr.on(`data`,e=>{y+=e.toString(`utf8`)}),_.on(`close`,n=>{if(k(),j(),E(),C){e();return}if(n!==0){let r=y.trim()||`llamafile exited with status ${n}`;t.status(500).json({error:r}),e();return}x+=T.flush();let r=x.trim(),i=Tn(r);t.json({id:`chatcmpl-llamafile-${Date.now()}`,object:`chat.completion`,created:Math.floor(Date.now()/1e3),model:s.model,choices:[{index:0,message:i?{role:`assistant`,content:null,tool_calls:[{id:`call_${Date.now()}_${Math.random()}`,type:`function`,function:{name:i.name,arguments:JSON.stringify(i.input||{})}}]}:{role:`assistant`,content:r||`(no response)`},finish_reason:i?`tool_calls`:`stop`}]}),e()}),_.on(`error`,n=>{if(S=!0,k(),j(),E(),C){e();return}t.status(500).json({error:`Child process error: ${n instanceof Error?n.message:String(n)}`}),e()})})},terminateAll(){for(let t of e.values())try{t()}catch{}Z()},__getOfflineSupportCache(){return t},__getActiveRequests(){return e},__getActiveProcesses(){return X}}}let Dn=null;function On(){return Dn||=En(),Dn}async function kn(t){let{model:n,messages:r,maxTokens:i=8192,verbose:a=!1,onToken:o,abortSignal:s,service:c}=t,l=c||On(),u=new Ge,d=new Ge,f=s?.aborted??!1,p=Object.assign(u,{headers:{},socket:d,destroyed:f,aborted:f,body:{model:n,messages:r,max_tokens:i,stream:!0}}),m=()=>{f=!0,p.destroyed=!0,p.aborted=!0,d.destroyed=!0,u.emit(`close`),u.emit(`aborted`),d.emit(`close`)};s&&(s.aborted?m():s.addEventListener(`abort`,m,{once:!0}));let h=``,g=null,_=[],v=`stop`,y=new Ge,b=!1;return new Promise((t,r)=>{let i=Object.assign(y,{headersSent:!1,writableEnded:!1,status(e){return this},setHeader(e,t){return this},flushHeaders(){},write(e){let t=(typeof e==`string`?e:e.toString(`utf8`)).split(`
|
|
26
|
+
`);for(let e of t){let t=e.trim();if(!t||!t.startsWith(`data:`))continue;let n=t.slice(5).trim();if(n!==`[DONE]`)try{let e=JSON.parse(n);e.error?.message&&(g=e.error.message);let t=e.choices?.[0]?.delta;t?.content&&(h+=t.content,o?.(t.content)),Array.isArray(t?.tool_calls)&&_.push(...t.tool_calls);let r=e.choices?.[0]?.finish_reason;r&&(v=r)}catch{}}return!0},end(){if(b)return;if(b=!0,this.writableEnded=!0,g){r(Error(g));return}let i={role:`assistant`,content:h};_.length>0&&(i.tool_calls=_),t({id:`chatcmpl-${e()}`,object:`chat.completion`,created:Math.floor(Date.now()/1e3),model:n,choices:[{index:0,message:i,finish_reason:v}],usage:{prompt_tokens:0,completion_tokens:0,total_tokens:0}})}});l.invokeCli(p,i,p.body,{model:n,offline:!1},a).catch(e=>{b||(b=!0,r(e))})})}Lt(kn);const An=async(e,t,n=!1,r)=>{try{let i={console,URL,TextEncoder,TextDecoder,JSON,Math,Date,parseInt,parseFloat,encodeURIComponent,decodeURIComponent,setTimeout,clearTimeout,data:r??``,$PIPE_DATA:r??``,fetch:n?globalThis.fetch:void 0},a=`(async () => {
|
|
27
|
+
"use strict";
|
|
28
|
+
${e}
|
|
29
|
+
})()`;return{ok:!0,value:await Promise.race([qe(a,i,{timeout:t}),new Promise((e,n)=>setTimeout(()=>n(Error(`Execution timed out after ${t/1e3}s`)),t))])}}catch(e){return{ok:!1,error:e&&e.message?e.message:String(e)}}};_e(An),globalThis.__headlessEvalExecutor=An;async function jn(e,t,n,r={}){let i=[],a=[];for(let o of n)try{r.onStep?.(o);let s=Mn(o.input||{},a,n),c=await F(e,o.name,s,t,{isScheduledTask:!r.isManual,isTaskExecution:r.isTaskExecution});a.push(c),o.suppressOutput||i.push(`**Tool \`${o.name}\`**: ${c}`)}catch(e){let t=e.message||String(e);a.push(t),o.suppressOutput||i.push(`**Tool \`${o.name}\` failed**: ${t}`)}return{rawOutputs:a,results:i}}function Mn(e,t,n){if(e&&typeof e==`object`){if(Array.isArray(e))return e.map(e=>Mn(e,t,n));if(`$pipe`in e){let r=e.$pipe,i=``;if(r===`prev`)i=t[t.length-1]??``;else if(typeof r==`number`)i=t[r]??``;else if(typeof r==`string`){for(let e=t.length-1;e>=0;e--)if(n[e]?.name===r){i=t[e];break}}return Nn(i)}let r={};for(let[i,a]of Object.entries(e))r[i]=Mn(a,t,n);return r}return e}function Nn(e){return typeof e==`string`?e:Array.isArray(e)?e.map(e=>e&&typeof e==`object`?`text`in e?String(e.text):`data`in e?String(e.data):JSON.stringify(e):String(e??``)).join(`
|
|
30
|
+
`):e&&typeof e==`object`?e:e??``}let Q=null;const $=(e,t,n,r)=>{try{e.exec(`ALTER TABLE ${t} ADD COLUMN ${n} ${r}`)}catch{}};function Pn(e=`database/agent.db`){if(Q)return Q;let t=new Je(e);return t.exec(`
|
|
31
|
+
CREATE TABLE IF NOT EXISTS messages (
|
|
32
|
+
id TEXT PRIMARY KEY,
|
|
33
|
+
groupId TEXT NOT NULL,
|
|
34
|
+
timestamp INTEGER NOT NULL,
|
|
35
|
+
content TEXT NOT NULL,
|
|
36
|
+
sender TEXT NOT NULL,
|
|
37
|
+
channel TEXT NOT NULL DEFAULT 'chat',
|
|
38
|
+
isFromMe INTEGER NOT NULL DEFAULT 0,
|
|
39
|
+
isTrigger INTEGER NOT NULL DEFAULT 0,
|
|
40
|
+
attachments TEXT,
|
|
41
|
+
a2uiAction TEXT,
|
|
42
|
+
a2uiEnvelopes TEXT,
|
|
43
|
+
freshContext INTEGER,
|
|
44
|
+
subagent INTEGER
|
|
45
|
+
)
|
|
46
|
+
`),t.exec(`
|
|
47
|
+
CREATE INDEX IF NOT EXISTS messages_by_group_time
|
|
48
|
+
ON messages (groupId, timestamp)
|
|
49
|
+
`),t.exec(`
|
|
50
|
+
CREATE INDEX IF NOT EXISTS messages_by_group
|
|
51
|
+
ON messages (groupId)
|
|
52
|
+
`),t.exec(`
|
|
53
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
54
|
+
groupId TEXT PRIMARY KEY,
|
|
55
|
+
messages TEXT NOT NULL DEFAULT '[]',
|
|
56
|
+
updatedAt INTEGER NOT NULL DEFAULT 0
|
|
57
|
+
)
|
|
58
|
+
`),t.exec(`
|
|
59
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
60
|
+
id TEXT PRIMARY KEY,
|
|
61
|
+
groupId TEXT NOT NULL,
|
|
62
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
63
|
+
schedule TEXT,
|
|
64
|
+
prompt TEXT NOT NULL DEFAULT '',
|
|
65
|
+
tools TEXT,
|
|
66
|
+
lastRun INTEGER,
|
|
67
|
+
createdAt INTEGER NOT NULL,
|
|
68
|
+
type TEXT,
|
|
69
|
+
freshContext INTEGER,
|
|
70
|
+
subagent INTEGER,
|
|
71
|
+
name TEXT,
|
|
72
|
+
task_order INTEGER
|
|
73
|
+
)
|
|
74
|
+
`),t.exec(`
|
|
75
|
+
CREATE INDEX IF NOT EXISTS tasks_by_group
|
|
76
|
+
ON tasks (groupId)
|
|
77
|
+
`),t.exec(`
|
|
78
|
+
CREATE INDEX IF NOT EXISTS tasks_by_enabled
|
|
79
|
+
ON tasks (enabled)
|
|
80
|
+
`),t.exec(`
|
|
81
|
+
CREATE TABLE IF NOT EXISTS config (
|
|
82
|
+
key TEXT PRIMARY KEY,
|
|
83
|
+
value TEXT NOT NULL
|
|
84
|
+
)
|
|
85
|
+
`),t.exec(`
|
|
86
|
+
CREATE TABLE IF NOT EXISTS pendingShares (
|
|
87
|
+
id TEXT PRIMARY KEY,
|
|
88
|
+
createdAt INTEGER NOT NULL,
|
|
89
|
+
data TEXT
|
|
90
|
+
)
|
|
91
|
+
`),$(t,`tasks`,`type`,`TEXT`),$(t,`tasks`,`freshContext`,`INTEGER`),$(t,`tasks`,`subagent`,`INTEGER`),$(t,`tasks`,`name`,`TEXT`),$(t,`tasks`,`task_order`,`INTEGER`),$(t,`messages`,`freshContext`,`INTEGER`),$(t,`messages`,`subagent`,`INTEGER`),Q=f(t),Q}function Fn(){Q&&=(Q.db.close(),null)}var In=class{kind=`file`;name;_path;constructor(e){this._path=e,this.name=V.basename(e)}async getFile(){let e=await Be(this._path);return{size:e.length,type:`application/octet-stream`,async text(){return e.toString(`utf8`)},async arrayBuffer(){return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength)}}}async createWritable(){let e=[],t=this._path;return{async write(t){typeof t==`string`?e.push(Buffer.from(t,`utf8`)):t instanceof Uint8Array?e.push(Buffer.from(t)):e.push(Buffer.from(new Uint8Array(t)))},async close(){let n=Buffer.concat(e);await H(t,n)}}}},Ln=class e{kind=`directory`;name;_path;constructor(e){this._path=e,this.name=V.basename(e)||e}async getDirectoryHandle(t,n){let r=V.join(this._path,t);if(n?.create)await ze(r,{recursive:!0});else if(!Ne(r)){let e=Error(`NotFoundError: ${r} does not exist`);throw e.name=`NotFoundError`,e}return new e(r)}async getFileHandle(e,t){let n=V.join(this._path,e);if(t?.create)Ne(n)||await H(n,``);else if(!Ne(n)){let e=Error(`NotFoundError: ${n} does not exist`);throw e.name=`NotFoundError`,e}return new In(n)}async*entries(){let t;try{t=await Ve(this._path)}catch{return}for(let n of t){let t=V.join(this._path,n);try{(await Ue(t)).isDirectory()?yield[n,new e(t)]:yield[n,new In(t)]}catch{}}}async removeEntry(e,t){await He(V.join(this._path,e),{recursive:t?.recursive??!1,force:!0})}};function Rn(e){O(new Ln(e))}globalThis.__setStorageRootFromPath=Rn,N(Ye),Ft(tn),Lt(kn),_e(An);export{v as BROWSER_ONLY_TOOLS,a as CONFIG_KEYS,L as DEFAULT_BUILTIN_PROFILE,o as DEFAULT_MAX_TOKENS,i as DEFAULT_SERVER_GROUP_ID,Ln as NodeFsDirectoryHandle,In as NodeFsFileHandle,S as TOOL_DEFINITIONS,Z as cleanupAllLlamafileProcesses,Fn as closeSqliteDatabase,Jt as createTransformersRuntimeService,ve as discoverSkills,ae as executeDetectLanguage,I as executeEmbedText,Se as executeNativeAiTask,tn as executeNodeTransformersCompletion,fe as executeProofreadText,ue as executeRewriteText,se as executeSummarizeText,F as executeTool,jn as executeToolChain,oe as executeTranslateText,ne as executeWriteText,ke as fetchDiscoveryManifest,g as filterHeadlessTools,r as getAvailableProviders,p as getConfig,z as getContextLimit,l as getDb,t as getDefaultProvider,s as getModelMaxTokens,n as getProvider,k as getRecentMessages,b as getStorageRoot,Rt as handleInvoke,D as importRemoteArtifacts,T as importRemoteScript,E as importRemoteSkill,w as importRemoteTool,y as invalidateStorageRoot,_ as isHeadlessMode,u as isSqliteDatabase,h as isToolHeadlessSafe,x as loadDeclarativeTools,ie as loadSkill,Ye as nativeBashExecutor,An as nativeEvalExecutor,Pn as openSqliteDatabase,A as post,c as resetDB,Oe as resolveDiscoveryUrl,ce as saveMessage,C as setConfig,d as setDB,N as setHeadlessBashExecutor,_e as setHeadlessEvalExecutor,m as setHeadlessMode,he as setNativeAiTaskHandler,P as setPostHandler,O as setStorageRoot,Rn as setStorageRootFromPath,f as wrapSqliteDatabase};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import e from"node:fs";import t from"node:path";import n from"node:process";import{Buffer as r}from"buffer";import i from"node:readline/promises";import a from"node:tty";function o(e,t=1){if(!Number.isFinite(e)||e<=0)return`0 B`;let n=1024,r=t<0?0:t,i=[`B`,`KB`,`MB`,`GB`,`TB`],a=Math.floor(Math.log(e)/Math.log(n)),o=Math.min(a,i.length-1);return`${parseFloat((e/n**o).toFixed(r))} ${i[o]}`}function s(e={}){let{modelId:t=`model`,stream:r=n.stderr,barWidth:i=24,isTTY:a=!!(r&&typeof r==`object`&&r.isTTY),enabled:s=!0}=e;if(!s)return{update:()=>{},finish:()=>{},fail:e=>{r?.write&&r.write(`${e||`✖ Failed to download ${t}.`}\n`)}};let c=[],l=new Map,u=!1;function d(e){let t=Math.round(Math.max(0,Math.min(1,e))*i),n=i-t;return`[`+`=`.repeat(t)+(t<i?`>`:``)+` `.repeat(Math.max(0,n-+(t<i)))+`]`}function f(e,t=0,n=0){let i=l.get(e);return i||(i={lineIndex:c.length,lastPct:-1,lastRenderedTime:0,loaded:t,total:n,isDone:!1},l.set(e,i),c.push(e),a&&c.length>1&&r?.write&&r.write(`
|
|
2
|
-
`)),i}function p(e,t){if(!a||!r?.write)return;let n=l.get(e);if(!n)return;let i=typeof r.columns==`number`&&r.columns>0?r.columns:null,o=i&&t.length>i-1?t.slice(0,i-1):t,s=c.length-1-n.lineIndex;s>0?r.write(`\x1b[${s}A\r\x1b[2K${o}\x1b[${s}B\r`):r.write(`\r\x1b[2K${o}`)}function m(e){if(u||!e)return;let n=e.file||(e.status===`progress_total`?`Total`:t);if(e.status===`initiate`){if(f(n),!a&&r?.write)r.write(`[Download] Starting ${t}${n?` (${n})`:``}...\n`);else if(a){let e=n?` [${n}]`:``;p(n,`Downloading ${t}${e} ${d(0)} 0.0%`)}return}if(e.status===`progress`||e.status===`progress_total`){let i=typeof e.progress==`number`?e.progress:0,s=Math.max(0,Math.min(100,i)),c=s/100,l=Number(e.loaded)||0,u=Number(e.total)||0,m=f(n,l,u),h=Date.now();if(a){if(h-m.lastRenderedTime<30&&s<100&&Math.abs(s-m.lastPct)<.5)return;m.lastRenderedTime=h,m.lastPct=s,m.loaded=l,m.total=u;let e=d(c),r=`${s.toFixed(1)}%`.padStart(6,` `),i=``;u>0?i=` (${o(l)} / ${o(u)})`:l>0&&(i=` (${o(l)})`);let a=n?` [${n}]`:``;p(n,`Downloading ${t}${a} ${e} ${r}${i}`)}else{let e=Math.floor(s/20)*20;if(e>m.lastPct&&(e>0||s===0)){m.lastPct=e;let i=u>0?` (${o(l)} / ${o(u)})`:``;r?.write&&r.write(`[Download] ${t}${n?` [${n}]`:``}: ${e}%${i}\n`)}}return}if(e.status===`done`){let i=l.get(n);if(i)if(i.isDone=!0,a){let e=d(1),r=i.total||i.loaded,a=r>0?` (${o(r)})`:``,s=n?` [${n}]`:``;p(n,`Downloading ${t}${s} ${e} 100.0%${a}`)}else r?.write&&r.write(`[Download] Finished file: ${n}\n`);else!a&&e.file&&r?.write&&r.write(`[Download] Finished file: ${e.file}\n`)}}function h(e){if(u)return;u=!0;let n=`✔ Model ${t} downloaded successfully.`;a&&r?.write?c.length>0?r.write(`\n${e||n}\n`):r.write(`${e||n}\n`):r?.write&&r.write(`${e||n}\n`)}function g(e){if(u)return;u=!0;let n=`✖ Failed to download ${t}.`;a&&r?.write?c.length>0?r.write(`\n${e||n}\n`):r.write(`${e||n}\n`):r?.write&&r.write(`${e||n}\n`)}return{update:m,finish:h,fail:g}}const c=[{id:`onnx-community/gemma-3-1b-it-ONNX-GQA`,name:`Gemma 3 1B GQA (ONNX)`,description:`Google Gemma 3 1B with Grouped Query Attention (Default)`,contextLength:32e3,supportsTools:!0,recommended:!0},{id:`onnx-community/gemma-4-E2B-it-ONNX`,name:`Gemma 4 E2B (ONNX)`,description:`Google Gemma 4 E2B instruction-tuned ONNX model`,contextLength:128e3,supportsTools:!0,recommended:!1},{id:`onnx-community/gemma-4-E4B-it-ONNX`,name:`Gemma 4 E4B (ONNX)`,description:`Google Gemma 4 E4B instruction-tuned ONNX model`,contextLength:128e3,supportsTools:!0,recommended:!1},{id:`onnx-community/Qwen3-0.6B-ONNX`,name:`Qwen 3 0.6B (ONNX)`,description:`Fast, compact, tool-calling supported 0.6B model`,contextLength:32768,supportsTools:!0,recommended:!1}],l=`onnx-community/gemma-3-1b-it-ONNX-GQA`,u=[{id:`mozilla-ai/gemma-4-E2B-it-Q5_K_M.llamafile`,name:`Gemma 4 E2B Q5_K_M (Llamafile)`,description:`Google Gemma 4 E2B instruction-tuned Llamafile (Q5_K_M)`,url:`https://huggingface.co/mozilla-ai/llamafile_0.10/resolve/main/gemma-4-E2B-it-Q5_K_M.llamafile`,fileName:`gemma-4-E2B-it-Q5_K_M.llamafile`,contextLength:128e3,supportsTools:!1},{id:`mozilla-ai/gemma-4-E4B-it-Q5_K_M.llamafile`,name:`Gemma 4 E4B Q5_K_M (Llamafile)`,description:`Google Gemma 4 E4B instruction-tuned Llamafile (Q5_K_M)`,url:`https://huggingface.co/mozilla-ai/llamafile_0.10/resolve/main/gemma-4-E4B-it-Q5_K_M.llamafile`,fileName:`gemma-4-E4B-it-Q5_K_M.llamafile`,contextLength:128e3,supportsTools:!1},{id:`mozilla-ai/Qwen3.5-0.8B-Q8_0.llamafile`,name:`Qwen 3.5 0.8B Q8_0 (Llamafile)`,description:`Alibaba Qwen 3.5 0.8B Llamafile (Q8_0)`,url:`https://huggingface.co/mozilla-ai/llamafile_0.10/resolve/main/Qwen3.5-0.8B-Q8_0.llamafile`,fileName:`Qwen3.5-0.8B-Q8_0.llamafile`,contextLength:32768,supportsTools:!1},{id:`mozilla-ai/Qwen3.5-2B-Q8_0.llamafile`,name:`Qwen 3.5 2B Q8_0 (Llamafile)`,description:`Alibaba Qwen 3.5 2B Llamafile (Q8_0)`,url:`https://huggingface.co/mozilla-ai/llamafile_0.10/resolve/main/Qwen3.5-2B-Q8_0.llamafile`,fileName:`Qwen3.5-2B-Q8_0.llamafile`,contextLength:32768,supportsTools:!1},{id:`mozilla-ai/Qwen3.5-4B-Q5_K_S.llamafile`,name:`Qwen 3.5 4B Q5_K_S (Llamafile)`,description:`Alibaba Qwen 3.5 4B Llamafile (Q5_K_S)`,url:`https://huggingface.co/mozilla-ai/llamafile_0.10/resolve/main/Qwen3.5-4B-Q5_K_S.llamafile`,fileName:`Qwen3.5-4B-Q5_K_S.llamafile`,contextLength:32768,supportsTools:!1},{id:`mozilla-ai/Qwen3.5-9B-Q5_K_S.llamafile`,name:`Qwen 3.5 9B Q5_K_S (Llamafile)`,description:`Alibaba Qwen 3.5 9B Llamafile (Q5_K_S)`,url:`https://huggingface.co/mozilla-ai/llamafile_0.10/resolve/main/Qwen3.5-9B-Q5_K_S.llamafile`,fileName:`Qwen3.5-9B-Q5_K_S.llamafile`,contextLength:32768,supportsTools:!1}];function d(e){return e?t.resolve(e):t.resolve(n.cwd(),`assets/cache/transformers.js`)}function f(e){return e?t.resolve(e,`llamafile`):t.resolve(n.cwd(),`assets/cache/llamafile`)}function p(e){return!e||typeof e!=`string`?!1:e.endsWith(`.llamafile`)||e.includes(`llamafile`)||u.some(n=>n.id===e||n.fileName===e||n.url===e||n.fileName===t.basename(e))}function m(n,r){let i=f(r);if(!e.existsSync(i))return!1;let a=t.basename(n),o=a.endsWith(`.llamafile`)?a:`${a}.llamafile`,s=t.join(i,o);try{if(e.existsSync(s))return e.statSync(s).size>0}catch{}return!1}function h(n,r){if(p(n))return m(n,r);let i=d(r);if(!e.existsSync(i))return!1;let a=[t.join(i,n),t.join(i,`models--${n.replace(/\//g,`--`)}`),t.join(i,n.split(`/`)[1]||n)];for(let t of a)try{if(e.existsSync(t)&&e.readdirSync(t).length>0)return!0}catch{}return!1}function g(e){return c.map(t=>({...t,cached:h(t.id,e)}))}function _(e){return u.map(t=>({...t,cached:m(t.fileName,e)}))}async function v(e={}){let t=e.endpoint||`https://huggingface.co/api/models?author=onnx-community&pipeline_tag=text-generation&limit=100`;try{let n=await fetch(t,{headers:{"User-Agent":`ShadowClaw-CLI`},signal:AbortSignal.timeout(e.timeoutMs||8e3)});if(!n.ok)return[];let r=await n.json();if(!Array.isArray(r))return[];let i=r.map(e=>typeof e?.id==`string`?e.id:``).filter(e=>e&&e.toLowerCase().includes(`onnx`));if(e.query){let t=e.query.toLowerCase();i=i.filter(e=>e.toLowerCase().includes(t))}return i.sort().map(t=>({id:t,name:t.replace(/^onnx-community\//,``),cached:h(t,e.cacheDir)}))}catch{return[]}}async function y(i,a={}){let{cacheDir:o,verbose:c=!1,isTTY:l,stream:d=n.stderr,progress:p,noProgress:m,abortSignal:h}=a,g=u.find(e=>e.id===i||e.fileName===i||e.fileName===t.basename(i)||e.url===i),_,v;g?(_=g.url,v=g.fileName):i.startsWith(`http://`)||i.startsWith(`https://`)?(_=i,v=t.basename(new URL(i).pathname)):(v=t.basename(i).endsWith(`.llamafile`)?t.basename(i):`${t.basename(i)}.llamafile`,_=`https://huggingface.co/mozilla-ai/llamafile_0.10/resolve/main/${v}`);let y=f(o);e.mkdirSync(y,{recursive:!0});let b=t.join(y,v),x=t.join(y,`${v}.downloading.${Date.now()}`),S=s({modelId:v,stream:d,isTTY:l,enabled:p!==!1&&!m});try{c&&d?.write&&d.write(`[Llamafile] Downloading ${_}...\n`);let t=await(a.fetch||globalThis.fetch)(_,{headers:{"User-Agent":`ShadowClaw-CLI`},redirect:`follow`,signal:h});if(!t.ok)throw Error(`Failed to download ${_}: HTTP ${t.status} ${t.statusText}`);let n=parseInt(t.headers?.get?.(`content-length`)||`0`,10),o=e.createWriteStream(x),s=0;if(t.body){let{Readable:e}=await import(`node:stream`),i;if(typeof e.fromWeb==`function`&&typeof t.body.getReader==`function`)i=e.fromWeb(t.body);else if(typeof t.body[Symbol.asyncIterator]==`function`)i=t.body;else{let e=r.from(await t.arrayBuffer());o.write(e),s=e.length}if(i)for await(let e of i){let t=r.isBuffer(e)?e:r.from(e);o.write(t),s+=t.length,S.update({status:`progress`,file:v,loaded:s,total:n,progress:n>0?s/n*100:void 0})}}o.end(),await new Promise((e,t)=>{o.on(`finish`,e),o.on(`error`,t)}),e.renameSync(x,b);try{e.chmodSync(b,493)}catch{}return S.finish(),{success:!0,modelId:i,path:b}}catch(t){try{e.existsSync(x)&&e.unlinkSync(x)}catch{}let n=t instanceof Error?t.message:String(t);return S.fail(`✖ Error downloading ${v}: ${n}`),{success:!1,modelId:i,error:n}}}async function b(e,t={}){if(p(e))return y(e,t);let{verbose:r=!1,isTTY:i,stream:a=n.stderr,service:o,progress:c,noProgress:l}=t,u=o;if(!u){let{getAgentCore:e}=await import(`./chunk-
|
|
2
|
+
`)),i}function p(e,t){if(!a||!r?.write)return;let n=l.get(e);if(!n)return;let i=typeof r.columns==`number`&&r.columns>0?r.columns:null,o=i&&t.length>i-1?t.slice(0,i-1):t,s=c.length-1-n.lineIndex;s>0?r.write(`\x1b[${s}A\r\x1b[2K${o}\x1b[${s}B\r`):r.write(`\r\x1b[2K${o}`)}function m(e){if(u||!e)return;let n=e.file||(e.status===`progress_total`?`Total`:t);if(e.status===`initiate`){if(f(n),!a&&r?.write)r.write(`[Download] Starting ${t}${n?` (${n})`:``}...\n`);else if(a){let e=n?` [${n}]`:``;p(n,`Downloading ${t}${e} ${d(0)} 0.0%`)}return}if(e.status===`progress`||e.status===`progress_total`){let i=typeof e.progress==`number`?e.progress:0,s=Math.max(0,Math.min(100,i)),c=s/100,l=Number(e.loaded)||0,u=Number(e.total)||0,m=f(n,l,u),h=Date.now();if(a){if(h-m.lastRenderedTime<30&&s<100&&Math.abs(s-m.lastPct)<.5)return;m.lastRenderedTime=h,m.lastPct=s,m.loaded=l,m.total=u;let e=d(c),r=`${s.toFixed(1)}%`.padStart(6,` `),i=``;u>0?i=` (${o(l)} / ${o(u)})`:l>0&&(i=` (${o(l)})`);let a=n?` [${n}]`:``;p(n,`Downloading ${t}${a} ${e} ${r}${i}`)}else{let e=Math.floor(s/20)*20;if(e>m.lastPct&&(e>0||s===0)){m.lastPct=e;let i=u>0?` (${o(l)} / ${o(u)})`:``;r?.write&&r.write(`[Download] ${t}${n?` [${n}]`:``}: ${e}%${i}\n`)}}return}if(e.status===`done`){let i=l.get(n);if(i)if(i.isDone=!0,a){let e=d(1),r=i.total||i.loaded,a=r>0?` (${o(r)})`:``,s=n?` [${n}]`:``;p(n,`Downloading ${t}${s} ${e} 100.0%${a}`)}else r?.write&&r.write(`[Download] Finished file: ${n}\n`);else!a&&e.file&&r?.write&&r.write(`[Download] Finished file: ${e.file}\n`)}}function h(e){if(u)return;u=!0;let n=`✔ Model ${t} downloaded successfully.`;a&&r?.write?c.length>0?r.write(`\n${e||n}\n`):r.write(`${e||n}\n`):r?.write&&r.write(`${e||n}\n`)}function g(e){if(u)return;u=!0;let n=`✖ Failed to download ${t}.`;a&&r?.write?c.length>0?r.write(`\n${e||n}\n`):r.write(`${e||n}\n`):r?.write&&r.write(`${e||n}\n`)}return{update:m,finish:h,fail:g}}const c=[{id:`onnx-community/gemma-3-1b-it-ONNX-GQA`,name:`Gemma 3 1B GQA (ONNX)`,description:`Google Gemma 3 1B with Grouped Query Attention (Default)`,contextLength:32e3,supportsTools:!0,recommended:!0},{id:`onnx-community/gemma-4-E2B-it-ONNX`,name:`Gemma 4 E2B (ONNX)`,description:`Google Gemma 4 E2B instruction-tuned ONNX model`,contextLength:128e3,supportsTools:!0,recommended:!1},{id:`onnx-community/gemma-4-E4B-it-ONNX`,name:`Gemma 4 E4B (ONNX)`,description:`Google Gemma 4 E4B instruction-tuned ONNX model`,contextLength:128e3,supportsTools:!0,recommended:!1},{id:`onnx-community/Qwen3-0.6B-ONNX`,name:`Qwen 3 0.6B (ONNX)`,description:`Fast, compact, tool-calling supported 0.6B model`,contextLength:32768,supportsTools:!0,recommended:!1}],l=`onnx-community/gemma-3-1b-it-ONNX-GQA`,u=[{id:`mozilla-ai/gemma-4-E2B-it-Q5_K_M.llamafile`,name:`Gemma 4 E2B Q5_K_M (Llamafile)`,description:`Google Gemma 4 E2B instruction-tuned Llamafile (Q5_K_M)`,url:`https://huggingface.co/mozilla-ai/llamafile_0.10/resolve/main/gemma-4-E2B-it-Q5_K_M.llamafile`,fileName:`gemma-4-E2B-it-Q5_K_M.llamafile`,contextLength:128e3,supportsTools:!1},{id:`mozilla-ai/gemma-4-E4B-it-Q5_K_M.llamafile`,name:`Gemma 4 E4B Q5_K_M (Llamafile)`,description:`Google Gemma 4 E4B instruction-tuned Llamafile (Q5_K_M)`,url:`https://huggingface.co/mozilla-ai/llamafile_0.10/resolve/main/gemma-4-E4B-it-Q5_K_M.llamafile`,fileName:`gemma-4-E4B-it-Q5_K_M.llamafile`,contextLength:128e3,supportsTools:!1},{id:`mozilla-ai/Qwen3.5-0.8B-Q8_0.llamafile`,name:`Qwen 3.5 0.8B Q8_0 (Llamafile)`,description:`Alibaba Qwen 3.5 0.8B Llamafile (Q8_0)`,url:`https://huggingface.co/mozilla-ai/llamafile_0.10/resolve/main/Qwen3.5-0.8B-Q8_0.llamafile`,fileName:`Qwen3.5-0.8B-Q8_0.llamafile`,contextLength:32768,supportsTools:!1},{id:`mozilla-ai/Qwen3.5-2B-Q8_0.llamafile`,name:`Qwen 3.5 2B Q8_0 (Llamafile)`,description:`Alibaba Qwen 3.5 2B Llamafile (Q8_0)`,url:`https://huggingface.co/mozilla-ai/llamafile_0.10/resolve/main/Qwen3.5-2B-Q8_0.llamafile`,fileName:`Qwen3.5-2B-Q8_0.llamafile`,contextLength:32768,supportsTools:!1},{id:`mozilla-ai/Qwen3.5-4B-Q5_K_S.llamafile`,name:`Qwen 3.5 4B Q5_K_S (Llamafile)`,description:`Alibaba Qwen 3.5 4B Llamafile (Q5_K_S)`,url:`https://huggingface.co/mozilla-ai/llamafile_0.10/resolve/main/Qwen3.5-4B-Q5_K_S.llamafile`,fileName:`Qwen3.5-4B-Q5_K_S.llamafile`,contextLength:32768,supportsTools:!1},{id:`mozilla-ai/Qwen3.5-9B-Q5_K_S.llamafile`,name:`Qwen 3.5 9B Q5_K_S (Llamafile)`,description:`Alibaba Qwen 3.5 9B Llamafile (Q5_K_S)`,url:`https://huggingface.co/mozilla-ai/llamafile_0.10/resolve/main/Qwen3.5-9B-Q5_K_S.llamafile`,fileName:`Qwen3.5-9B-Q5_K_S.llamafile`,contextLength:32768,supportsTools:!1}];function d(e){return e?t.resolve(e):t.resolve(n.cwd(),`assets/cache/transformers.js`)}function f(e){return e?t.resolve(e,`llamafile`):t.resolve(n.cwd(),`assets/cache/llamafile`)}function p(e){return!e||typeof e!=`string`?!1:e.endsWith(`.llamafile`)||e.includes(`llamafile`)||u.some(n=>n.id===e||n.fileName===e||n.url===e||n.fileName===t.basename(e))}function m(n,r){let i=f(r);if(!e.existsSync(i))return!1;let a=t.basename(n),o=a.endsWith(`.llamafile`)?a:`${a}.llamafile`,s=t.join(i,o);try{if(e.existsSync(s))return e.statSync(s).size>0}catch{}return!1}function h(n,r){if(p(n))return m(n,r);let i=d(r);if(!e.existsSync(i))return!1;let a=[t.join(i,n),t.join(i,`models--${n.replace(/\//g,`--`)}`),t.join(i,n.split(`/`)[1]||n)];for(let t of a)try{if(e.existsSync(t)&&e.readdirSync(t).length>0)return!0}catch{}return!1}function g(e){return c.map(t=>({...t,cached:h(t.id,e)}))}function _(e){return u.map(t=>({...t,cached:m(t.fileName,e)}))}async function v(e={}){let t=e.endpoint||`https://huggingface.co/api/models?author=onnx-community&pipeline_tag=text-generation&limit=100`;try{let n=await fetch(t,{headers:{"User-Agent":`ShadowClaw-CLI`},signal:AbortSignal.timeout(e.timeoutMs||8e3)});if(!n.ok)return[];let r=await n.json();if(!Array.isArray(r))return[];let i=r.map(e=>typeof e?.id==`string`?e.id:``).filter(e=>e&&e.toLowerCase().includes(`onnx`));if(e.query){let t=e.query.toLowerCase();i=i.filter(e=>e.toLowerCase().includes(t))}return i.sort().map(t=>({id:t,name:t.replace(/^onnx-community\//,``),cached:h(t,e.cacheDir)}))}catch{return[]}}async function y(i,a={}){let{cacheDir:o,verbose:c=!1,isTTY:l,stream:d=n.stderr,progress:p,noProgress:m,abortSignal:h}=a,g=u.find(e=>e.id===i||e.fileName===i||e.fileName===t.basename(i)||e.url===i),_,v;g?(_=g.url,v=g.fileName):i.startsWith(`http://`)||i.startsWith(`https://`)?(_=i,v=t.basename(new URL(i).pathname)):(v=t.basename(i).endsWith(`.llamafile`)?t.basename(i):`${t.basename(i)}.llamafile`,_=`https://huggingface.co/mozilla-ai/llamafile_0.10/resolve/main/${v}`);let y=f(o);e.mkdirSync(y,{recursive:!0});let b=t.join(y,v),x=t.join(y,`${v}.downloading.${Date.now()}`),S=s({modelId:v,stream:d,isTTY:l,enabled:p!==!1&&!m});try{c&&d?.write&&d.write(`[Llamafile] Downloading ${_}...\n`);let t=await(a.fetch||globalThis.fetch)(_,{headers:{"User-Agent":`ShadowClaw-CLI`},redirect:`follow`,signal:h});if(!t.ok)throw Error(`Failed to download ${_}: HTTP ${t.status} ${t.statusText}`);let n=parseInt(t.headers?.get?.(`content-length`)||`0`,10),o=e.createWriteStream(x),s=0;if(t.body){let{Readable:e}=await import(`node:stream`),i;if(typeof e.fromWeb==`function`&&typeof t.body.getReader==`function`)i=e.fromWeb(t.body);else if(typeof t.body[Symbol.asyncIterator]==`function`)i=t.body;else{let e=r.from(await t.arrayBuffer());o.write(e),s=e.length}if(i)for await(let e of i){let t=r.isBuffer(e)?e:r.from(e);o.write(t),s+=t.length,S.update({status:`progress`,file:v,loaded:s,total:n,progress:n>0?s/n*100:void 0})}}o.end(),await new Promise((e,t)=>{o.on(`finish`,e),o.on(`error`,t)}),e.renameSync(x,b);try{e.chmodSync(b,493)}catch{}return S.finish(),{success:!0,modelId:i,path:b}}catch(t){try{e.existsSync(x)&&e.unlinkSync(x)}catch{}let n=t instanceof Error?t.message:String(t);return S.fail(`✖ Error downloading ${v}: ${n}`),{success:!1,modelId:i,error:n}}}async function b(e,t={}){if(p(e))return y(e,t);let{verbose:r=!1,isTTY:i,stream:a=n.stderr,service:o,progress:c,noProgress:l}=t,u=o;if(!u){let{getAgentCore:e}=await import(`./chunk-BMPhLSn8.js`),t=await e();if(typeof t.createTransformersRuntimeService!=`function`)throw Error(`createTransformersRuntimeService is not available in agent core`);u=t.createTransformersRuntimeService()}let d=s({modelId:e,stream:a,isTTY:i,enabled:c!==!1&&!l});try{return r&&a?.write&&a.write(`[Transformers.js] Prewarming model ${e}...\n`),await u.prewarmModel({modelId:e,verbose:r,onProgress:e=>{d.update(e)}}),d.finish(),{success:!0,modelId:e}}catch(t){let n=t instanceof Error?t.message:String(t);return d.fail(`✖ Error downloading ${e}: ${n}`),{success:!1,modelId:e,error:n}}}async function x(r={}){let o=t.resolve(r.contentRoot||n.cwd()),s=t.resolve(r.workspaceDir||o),c=r.cacheDir,u=r.onExit||(e=>n.exit(e)),d=r.stdin||n.stdin,f=r.stdout||n.stderr,g=!1,_=null;if(d===n.stdin&&!n.stdin.isTTY&&!n.env.CI&&(n.stderr.isTTY||n.stdout.isTTY))try{let t=n.platform===`win32`?`CONIN$`:`/dev/tty`;_=e.openSync(t,`r`),d=new a.ReadStream(_),f=n.stderr.isTTY?n.stderr:n.stdout,g=!0}catch{try{let t=n.platform===`win32`?`CONIN$`:`/dev/tty`;d=e.createReadStream(t),f=n.stderr.isTTY?n.stderr:n.stdout,g=!0}catch{}}let x=i.createInterface({input:d,output:f}),S=!1,C=()=>{if(!S){S=!0,f.write(`
|
|
3
3
|
Operation cancelled.
|
|
4
4
|
`);try{x.close()}catch{}u(130)}};x.on(`SIGINT`,C),d&&typeof d.on==`function`&&d!==n.stdin&&d.on(`SIGINT`,C);let w=()=>C();n.on(`SIGINT`,w);let T=e=>{let t=typeof e==`string`?e:e.toString(`binary`);(t.includes(``)||t.includes(``))&&C()};d&&typeof d.on==`function`&&d.on(`data`,T);try{f.write(`
|
|
5
5
|
ShadowClaw CLI Agent — Model Selection:
|