libre-webui 0.22.0 → 0.22.1
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/backend/dist/main.js +2 -2
- package/backend/dist/main.js.map +1 -1
- package/backend/dist/platform/jobs/domainJobHandlers.d.ts.map +1 -1
- package/backend/dist/platform/jobs/domainJobHandlers.js +5 -0
- package/backend/dist/platform/jobs/domainJobHandlers.js.map +1 -1
- package/backend/dist/platform/storage/storageFactory.d.ts +2 -0
- package/backend/dist/platform/storage/storageFactory.d.ts.map +1 -1
- package/backend/dist/platform/storage/storageFactory.js +15 -3
- package/backend/dist/platform/storage/storageFactory.js.map +1 -1
- package/backend/dist/routes/jobs.d.ts.map +1 -1
- package/backend/dist/routes/jobs.js +9 -0
- package/backend/dist/routes/jobs.js.map +1 -1
- package/backend/dist/services/pluginService.d.ts.map +1 -1
- package/backend/dist/services/pluginService.js +35 -2
- package/backend/dist/services/pluginService.js.map +1 -1
- package/backend/dist/utils/pluginUpload.d.ts.map +1 -1
- package/backend/dist/utils/pluginUpload.js +10 -7
- package/backend/dist/utils/pluginUpload.js.map +1 -1
- package/backend/dist/worker.js +2 -2
- package/backend/dist/worker.js.map +1 -1
- package/backend/package.json +1 -1
- package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
- package/frontend/dist/assets/{index-CUhEG7E2.js → index-Jtx9Amhz.js} +11 -28
- package/frontend/dist/index.html +9 -9
- package/frontend/dist/js/{ArtifactContainer-BTEDhBnv.js → ArtifactContainer-fZegtmva.js} +1 -1
- package/frontend/dist/js/{ArtifactDemoPage-B0gN3YTl.js → ArtifactDemoPage-BDBXYv9l.js} +1 -1
- package/frontend/dist/js/{ArtifactSandboxFrame-CLBXQkZs.js → ArtifactSandboxFrame-BN16NtKe.js} +2 -2
- package/frontend/dist/js/{ArtifactSlideOutPanel-CfqHPFdE.js → ArtifactSlideOutPanel-x1fS85Ww.js} +1 -1
- package/frontend/dist/js/{ChatPage-DIkAXZWA.js → ChatPage-C_pXh7WN.js} +1 -1
- package/frontend/dist/js/{FirstTimeSetup-B8phXGNA.js → FirstTimeSetup-oRrlZnBm.js} +1 -1
- package/frontend/dist/js/{GalleryPage-W4uI043I.js → GalleryPage-CV_vbE7X.js} +1 -1
- package/frontend/dist/js/{HomePage-DlxehbyO.js → HomePage-P-e7Huco.js} +1 -1
- package/frontend/dist/js/{LibreClawPage-CgD0_G_F.js → LibreClawPage-Cee06SUM.js} +1 -1
- package/frontend/dist/js/{ModelSelector-BYxJU1UV.js → ModelSelector-DXucbvrz.js} +1 -1
- package/frontend/dist/js/{ModelsPage-C4XdCKP5.js → ModelsPage-C3_fZpMM.js} +1 -1
- package/frontend/dist/js/{NotesPage-CDECOl4V.js → NotesPage-rEIPWGIb.js} +1 -1
- package/frontend/dist/js/{PersonasPage-CjSLPrgS.js → PersonasPage-BXtepFuD.js} +1 -1
- package/frontend/dist/js/{PluginUsagePage-DJOXJuH4.js → PluginUsagePage-hhu8cxsu.js} +1 -1
- package/frontend/dist/js/{RichMessageContent-Debeh6bi.js → RichMessageContent-DkiEvdSg.js} +1 -1
- package/frontend/dist/js/{SettingsModal-cUqAeYUP.js → SettingsModal-BNxCtJ51.js} +1 -1
- package/frontend/dist/js/{SystemPage-DxPw0GS7.js → SystemPage-BvvKFuoG.js} +1 -1
- package/frontend/dist/js/{UserManagementPage-CEdYFe_Z.js → UserManagementPage-BccyR7si.js} +1 -1
- package/frontend/dist/js/{WorkPage-DDVeuG_9.js → WorkPage-BgxrvY3I.js} +3 -3
- package/frontend/dist/js/{api-IzobHGND.js → api-BvPDxsUQ.js} +1 -1
- package/frontend/dist/js/{appStore-DKwC2vgn.js → appStore-DRSSjaHn.js} +2 -2
- package/frontend/dist/js/{authStore-OaTuapL7.js → authStore-BVykIRec.js} +3 -3
- package/frontend/dist/js/{chatStore-DXGUVLXD.js → chatStore-UPp5TV_t.js} +3 -3
- package/frontend/dist/js/{config-DPEEuTAe.js → config-BTlPm-cZ.js} +1 -1
- package/frontend/dist/js/{estree-ChwJsD2w.js → estree-CfYahF_d.js} +1 -1
- package/frontend/dist/js/{html-DFrVjciF.js → html-BJsDX1UZ.js} +1 -1
- package/frontend/dist/js/{markdown-FLLx7b67.js → markdown-GLyuUNig.js} +1 -1
- package/frontend/dist/js/{messageCodeStyles-CBkkZY4n.js → messageCodeStyles-BHddEFP1.js} +1 -1
- package/frontend/dist/js/{standalone-i8-5bg5p.js → standalone-Dh56V0YW.js} +1 -1
- package/frontend/dist/js/{typescript-CQ3x-Uni.js → typescript-DRy7A9w4.js} +1 -1
- package/frontend/dist/js/{ui-BHhR3Vok.js → ui-CuY4IifA.js} +2 -2
- package/frontend/dist/js/{workApi-Czu69yWS.js → workApi-DHuYNHLf.js} +2 -2
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["js/workApi-
|
|
2
|
-
import{n as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,p as n}from"./router-vendor-CbPDks39.js";import{t as r,u as i}from"./chatStore-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["js/workApi-DHuYNHLf.js","js/rolldown-runtime-hePW80VL.js","js/router-vendor-CbPDks39.js","js/markdown-core-BmPPZiuD.js","js/utils-vendor-BBa8OxtB.js","js/logger-DSXjF4ye.js","js/config-BTlPm-cZ.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{n as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,p as n}from"./router-vendor-CbPDks39.js";import{t as r,u as i}from"./chatStore-UPp5TV_t.js";import{o as a,t as o}from"./utils-vendor-BBa8OxtB.js";import{i as s,t as c}from"./logger-DSXjF4ye.js";import{r as l,t as u}from"./workApi-DHuYNHLf.js";import{h as d,u as f}from"./api-BvPDxsUQ.js";import{t as p}from"./appStore-DRSSjaHn.js";var m=1e5,h=`[Earlier live output omitted]
|
|
3
3
|
|
|
4
|
-
`,g=e=>e&&typeof e==`object`&&!Array.isArray(e)?e:void 0,_=(e,...t)=>{for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t}},v=(e,...t)=>{for(let n of t){let t=e[n];if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t!=`string`||!t.trim())continue;let r=Number(t);if(Number.isFinite(r))return r}},y=(e,t)=>{let n=String(e||``).trim().toLowerCase().replace(/[\s-]+/g,`_`);return n===`queued`?`queued`:n===`preparing`||n===`starting`?`preparing`:n===`thinking`||n===`running`||n===`working`?`thinking`:n===`using_tool`||n===`tool`||n===`tool_call`?`using_tool`:n===`responding`||n===`streaming`||n===`assistant`?`responding`:n===`completed`||n===`complete`||n===`done`?`completed`:n===`needs_input`||n===`needsinput`||n===`blocked`?`needs_input`:n===`failed`||n===`error`?`failed`:n===`cancelled`||n===`canceled`||n===`stopped`?`cancelled`:t},b=(e,t)=>{let n=_(t,`total`);if(n!==void 0)return x(n);let r=_(t,`text`,`content`,`delta`,`reasoning`)||``;return t.replace===!0||t.cumulative===!0?x(r):x(e+r)},x=e=>{let t=e.startsWith(h),n=t?e.slice(31):e;return!t&&n.length<=m?n:t&&n.length<=99969?h+n:h+n.slice(-99969)},S=(e,t,n,r)=>{if(r===n)return e;if(r.startsWith(n)){let i=r.slice(n.length),a=e[e.length-1];return a&&a.kind===t?[...e.slice(0,-1),{kind:t,text:x(a.text+i)}]:[...e,{kind:t,text:x(i)}]}return[...e.filter(e=>e.kind!==t),{kind:t,text:r}]},C=(e,t)=>e.some(e=>e.kind===`tool`&&e.toolId===t)?e:[...e,{kind:`tool`,toolId:t}],w=(e,t)=>{let n=g(e.usage)||e,r={...t};for(let[e,t]of[[`inputTokens`,[`inputTokens`,`input_tokens`,`promptTokens`,`prompt_tokens`]],[`outputTokens`,[`outputTokens`,`output_tokens`,`completionTokens`,`completion_tokens`]],[`reasoningTokens`,[`reasoningTokens`,`reasoning_tokens`]],[`cachedTokens`,[`cachedTokens`,`cached_tokens`]],[`totalTokens`,[`totalTokens`,`total_tokens`]],[`tokensPerSecond`,[`tokensPerSecond`,`tokens_per_second`]],[`durationMs`,[`durationMs`,`duration_ms`]]]){let i=v(n,...t);i!==void 0&&(r[e]=i)}return r.totalTokens===void 0&&(r.inputTokens!==void 0||r.outputTokens!==void 0)&&(r.totalTokens=(r.inputTokens||0)+(r.outputTokens||0)),r},T=(e,t)=>{let n=g(e.skill)||e,r=_(n,`name`,`title`,`skill`)||`Skill`;return{id:_(n,`id`,`skillId`,`skill_id`)||`${r}-${t}`,name:r,description:_(n,`description`,`summary`)}},E=(e,t,n)=>{let r=g(e.tool)||e,i=g(r.message),a=i?g(i.metadata):void 0,o=a?{...a,...r}:r,s=_(o,`name`,`toolName`,`tool_name`,`function`)||`tool`;return{id:_(o,`id`,`toolCallId`,`tool_call_id`,`callId`)||`${s}-${n}`,name:s,status:o.isError===!0||o.is_error===!0?`error`:`running`,arguments:o.arguments??o.input??o.args??o.parameters??void 0,metadata:g(o.metadata)||a,startedAt:v(o,`startedAt`,`started_at`,`timestamp`)||t}},D=(e,t)=>Array.isArray(e)?e.flatMap((e,n)=>{let r=g(e);if(!r)return[];let i=E(r,t,n),a=_(r,`output`,`content`,`result`),o=y(r.status,`using_tool`);return[{...i,status:r.isError===!0||r.is_error===!0?`error`:o===`completed`?`completed`:i.status,output:a,finishedAt:v(r,`finishedAt`,`finished_at`),durationMs:v(r,`durationMs`,`duration_ms`)}]}):[],O=(e,t,n)=>({taskId:e,runId:t,connection:`idle`,phase:`queued`,lastEventId:0,reasoning:``,response:``,timeline:[],tools:[],skills:[],startedAt:n,terminal:!1}),k=(e,t)=>{let n=g(t.data.liveRun)||g(t.data.live_run)||g(t.data.run)||t.data,r=g(t.data.task)||g(t.data.detail),i=r?g(r.activeRun):void 0,a=_(n,`reasoning`,`thinking`),o=_(n,`response`,`assistant`,`content`),s=y(n.phase??n.status??i?.status??r?.status,e.phase),c=e.lastEventId>0&&s!==`completed`&&s!==`needs_input`&&s!==`failed`&&s!==`cancelled`&&n.phase===void 0?e.phase:s,l=D(n.tools??n.toolActivities??n.tool_activities,t.timestamp),u=n.skills,d=Array.isArray(u)?u.flatMap((e,t)=>{let n=g(e);return n?[T(n,t)]:[]}):e.skills,f=n.terminal===!0||c===`completed`||c===`needs_input`||c===`failed`||c===`cancelled`,p=a===void 0?e.reasoning:x(a),m=o===void 0?e.response:x(o),h=l.length>0?l:e.tools,b=S(e.timeline,`reasoning`,e.reasoning,p);for(let e of h)b=C(b,e.id);return b=S(b,`response`,e.response,m),{...e,phase:c,reasoning:p,response:m,timeline:b,tools:h,skills:d,usage:g(n.usage)?w(n,e.usage):e.usage,round:v(n,`round`,`roundIndex`,`round_index`)??e.round,roundLimit:v(n,`roundLimit`,`round_limit`)??e.roundLimit,startedAt:v(n,`startedAt`,`started_at`)??(i?v(i,`startedAt`,`started_at`):void 0)??e.startedAt,finishedAt:v(n,`finishedAt`,`finished_at`)??e.finishedAt,error:_(n,`error`,`message`)??e.error,terminal:f}},A=(e,t)=>{let n=e.findIndex(e=>e.id===t.id);if(n===-1)return[...e,t];let r=[...e];return r[n]={...e[n],...t},r},j=(e,t)=>{let n=e?.taskId===t.taskId&&e.runId===t.runId?e:O(t.taskId,t.runId,t.timestamp);if(t.type!==`snapshot`&&t.id<=n.lastEventId)return n;let r={...n,connection:`connected`,connectionError:void 0,lastEventId:Math.max(n.lastEventId,t.id)};if(t.type===`snapshot`)r=k(r,t);else if(t.type===`run_state`){let e=y(t.data.phase??t.data.status??t.data.state,r.phase);r={...r,phase:e,round:v(t.data,`round`,`roundIndex`,`round_index`)??r.round,roundLimit:v(t.data,`roundLimit`,`round_limit`)??r.roundLimit,startedAt:v(t.data,`startedAt`,`started_at`)??r.startedAt,terminal:r.terminal||e===`completed`||e===`needs_input`||e===`failed`||e===`cancelled`}}else if(t.type===`reasoning_delta`){let e=b(r.reasoning,t.data);r={...r,phase:`thinking`,reasoning:e,timeline:S(r.timeline,`reasoning`,r.reasoning,e)}}else if(t.type===`assistant_delta`){let e=b(r.response,t.data);r={...r,phase:`responding`,response:e,timeline:S(r.timeline,`response`,r.response,e)}}else if(t.type===`tool_call`){let e=E(t.data,t.timestamp,r.tools.length);r={...r,phase:`using_tool`,tools:A(r.tools,e),timeline:C(r.timeline,e.id)}}else if(t.type===`tool_result`){let e=E(t.data,t.timestamp,r.tools.length),n=r.tools.find(t=>t.id===e.id),i=t.data.isError===!0||t.data.is_error===!0||t.data.error===!0;r={...r,phase:`thinking`,tools:A(r.tools,{...n,...e,status:i?`error`:`completed`,arguments:n?.arguments??e.arguments,startedAt:n?.startedAt??e.startedAt,output:_(t.data,`output`,`content`,`result`,`message`)||``,finishedAt:v(t.data,`finishedAt`,`finished_at`)||t.timestamp,durationMs:v(t.data,`durationMs`,`duration_ms`)})}}else if(t.type===`usage`)r={...r,usage:w(t.data,r.usage)};else if(t.type===`skill_loaded`){let e=T(t.data,r.skills.length);r={...r,skills:r.skills.some(t=>t.id===e.id)?r.skills:[...r.skills,e]}}else if(t.type===`error`)r={...r,phase:`failed`,error:_(t.data,`message`,`error`)||`The Work run stopped unexpectedly.`,finishedAt:v(t.data,`finishedAt`,`finished_at`)||t.timestamp,terminal:t.data.terminal!==!1};else if(t.type===`done`){let e=y(t.data.status??t.data.state??t.data.phase,`completed`);r={...r,phase:e,error:_(t.data,`error`,`message`)??r.error,usage:g(t.data.usage)?w(t.data,r.usage):r.usage,finishedAt:v(t.data,`finishedAt`,`finished_at`)||t.timestamp,terminal:!0}}return r},M=(e,t)=>Error(t?.error||t?.message||e),N=(e,t)=>{if(typeof e==`object`&&e&&`response`in e){let t=e.response,n=t?.data?.error||t?.data?.message;if(n)return n}return e instanceof Error&&e.message?e.message:t},P=e=>[...e].sort((e,t)=>t.updatedAt-e.updatedAt||t.createdAt-e.createdAt||e.id.localeCompare(t.id)),ee=({messages:e,messageCursor:t,hasMoreMessages:n,...r})=>r,F=(e,t)=>{let n=new Map(e.map(e=>[e.id,e]));for(let e of t)n.set(e.id,e);return[...n.values()].sort((e,t)=>e.messageIndex-t.messageIndex||e.createdAt-t.createdAt||e.id.localeCompare(t.id))},I=(e,t)=>{if(!e||e.id!==t.id)return t;let n=e.updatedAt>t.updatedAt?{...t,...e}:{...e,...t};if(e.messages.length===0)return{...n,messages:t.messages,messageCursor:t.messageCursor,hasMoreMessages:t.hasMoreMessages};let r=Math.max(...e.messages.map(e=>e.messageIndex)),i=Math.min(...t.messages.map(e=>e.messageIndex)),a=t.messages.length>0&&r+1<i;return{...n,messages:F(e.messages,t.messages),messageCursor:a?t.messageCursor:e.messageCursor,hasMoreMessages:a?t.hasMoreMessages:e.hasMoreMessages}},L=(e,t)=>{let n=e.find(e=>e.id===t.id);if(n&&n.updatedAt>t.updatedAt)return e;let r=ee(t),i=e.findIndex(e=>e.id===t.id);if(i===-1)return[r,...e];let a=[...e];return a[i]=r,a},R=(e,t)=>{let n=new Map(t.map(e=>[e.id,e])),r=new Set(e.map(e=>e.id)),i=P(t.filter(e=>!r.has(e.id))),a=e.flatMap(e=>{let t=n.get(e.id);return t?[e.updatedAt>t.updatedAt?e:t]:[]});return[...i,...a]},z=a((e,t)=>{let n=0,r=0,i=0,a=0,o=0,s=null,c=0,l=0,d=0,f=null,p=0,m=new Set,h=new Set,g=new Map,_=(e,t)=>`${e}\u0000${t}`,v=e=>e===n,y=e=>{if(!v(e))throw Error(`Work session changed.`)},b=()=>{l+=1,d+=1,f=null,h.clear()},x=()=>{let t=++c;return h.add(t),e({loadingFiles:!0}),t},S=(n,r,i)=>{h.delete(n),v(r)&&t().selectedTaskId===i&&e({loadingFiles:h.size>0})},C=e=>t().selectedTaskId===e,w=t=>{let n=++p;return g.set(n,t),C(t)&&e({actionLoading:!0,error:null}),n},T=(n,r)=>{if(g.delete(n),!v(r))return;let i=t().selectedTaskId;e({actionLoading:[...g.values()].some(e=>e===i)})},E=(t,n,r)=>{v(n)&&C(t)&&e({error:r})},D=(t,r=n,i=!1)=>{v(r)&&(i&&(o+=1),e(e=>({tasks:L(e.tasks,t),selectedTask:e.selectedTaskId===t.id?I(e.selectedTask,t):e.selectedTask})))},k=async(e,t,r)=>{let i=n,a=w(r);try{let n=await e();if(y(i),!n.success||!n.data)throw M(t,n);return D(n.data,i,!0),n.data}catch(e){let n=N(e,t);throw E(r,i,n),Error(n)}finally{T(a,i)}};return{capabilities:null,tasks:[],selectedTaskId:null,selectedTask:null,files:[],selectedFile:null,liveRuns:{},loadingTasks:!1,loadingTask:!1,loadingOlderMessages:!1,loadingFiles:!1,actionLoading:!1,error:null,loadCapabilities:async()=>{let t=n;try{let n=await u.capabilities();if(y(t),!n.success||!n.data)throw M(`Could not inspect the Work runtime.`,n);e({capabilities:n.data})}catch(n){v(t)&&e({capabilities:{available:!1,runtime:`docker`,image:``,reason:N(n,`The Work runtime is unavailable.`)}})}},loadTasks:async(t=!1)=>{let c=n,l=++r,d=o;t||(i=l,m.add(l),e({loadingTasks:!0,error:null}));try{let t=await u.listTasks();if(y(c),!t.success||!t.data)throw M(`Could not load Work tasks.`,t);let n=P(t.data);if(l<=a||d!==o)return;a=l,e(e=>{let t=R(e.tasks,n),r=e.selectedTaskId?t.find(t=>t.id===e.selectedTaskId):void 0,i=r&&e.selectedTask?{...e.selectedTask,...r,messages:e.selectedTask.messages,messageCursor:e.selectedTask.messageCursor,hasMoreMessages:e.selectedTask.hasMoreMessages}:e.selectedTask,a=s,o=a!==null&&l>a.requestId;return o&&(s=null),{tasks:t,selectedTask:i,...o&&e.error===a.message?{error:null}:{}}})}catch(n){let r=N(n,`Could not load Work tasks.`);!t&&v(c)&&l===i&&l>a&&d===o&&(s={requestId:l,message:r},e({error:r}))}finally{m.delete(l),!t&&v(c)&&e({loadingTasks:m.size>0})}},selectTask:t=>{b(),e(e=>({selectedTaskId:t,selectedTask:t&&e.selectedTask?.id===t?e.selectedTask:null,files:[],selectedFile:null,loadingFiles:!1,loadingOlderMessages:!1,actionLoading:[...g.values()].some(e=>e===t),error:null}))},loadTask:async(t,r=!1)=>{let i=n;r||e({loadingTask:!0,error:null});try{let e=await u.getTask(t);if(y(i),!e.success||!e.data)throw M(`Could not load this Work task.`,e);return D(e.data,i),e.data}catch(t){let n=N(t,`Could not load this Work task.`);throw!r&&v(i)&&e({error:n}),Error(n)}finally{!r&&v(i)&&e({loadingTask:!1})}},loadOlderMessages:async r=>{let i=n,a=t().selectedTask,o=a?.id===r?a.messageCursor:void 0;if(!a||a.id!==r||!a.hasMoreMessages||o===void 0)return[];e({loadingOlderMessages:!0,error:null});try{let t=await u.getMessages(r,o);if(y(i),!t.success||!t.data)throw M(`Could not load older Work messages.`,t);let n=t.data;return e(e=>{if(e.selectedTask?.id!==r)return{};let t=e.selectedTask.messageCursor===o;return{selectedTask:{...e.selectedTask,messages:F(e.selectedTask.messages,n.messages),messageCursor:t?n.cursor:e.selectedTask.messageCursor,hasMoreMessages:t?n.hasMore:e.selectedTask.hasMoreMessages}}}),n.messages}catch(n){let a=N(n,`Could not load older Work messages.`);throw v(i)&&t().selectedTaskId===r&&e({error:a}),Error(a)}finally{v(i)&&t().selectedTaskId===r&&e({loadingOlderMessages:!1})}},createTask:e=>k(()=>u.createTask(e),`Could not create the Work task.`,null),updateTask:(e,t)=>k(()=>u.updateTask(e,t),`Could not update the Work task.`,e),deleteTask:async r=>{let i=n,a=w(r);try{let n=await u.deleteTask(r);if(y(i),!n.success)throw M(`Could not delete the Work task.`,n);t().selectedTaskId===r&&b(),o+=1,e(e=>({tasks:e.tasks.filter(e=>e.id!==r),selectedTaskId:e.selectedTaskId===r?null:e.selectedTaskId,selectedTask:e.selectedTaskId===r?null:e.selectedTask,files:e.selectedTaskId===r?[]:e.files,selectedFile:e.selectedTaskId===r?null:e.selectedFile,liveRuns:Object.fromEntries(Object.entries(e.liveRuns).filter(([e])=>e!==r))}))}catch(e){let t=N(e,`Could not delete the Work task.`);throw E(r,i,t),Error(t)}finally{T(a,i)}},startRun:async(e,t)=>{let r=n,i=w(e);try{let n=await u.startRun(e,t);if(y(r),!n.success||!n.data)throw M(`Could not start the Work run.`,n);return D(n.data,r,!0),n.data}catch(t){let n=N(t,`Could not start the Work run.`);throw E(e,r,n),Error(n)}finally{T(i,r)}},cancelRun:async e=>{let r=n,i=w(e);try{let n=await u.cancelRun(e);if(y(r),!n.success)throw M(`Could not cancel the Work run.`,n);return n.data?(D(n.data,r,!0),n.data):(o+=1,await t().loadTask(e,!0))}catch(t){let n=N(t,`Could not cancel the Work run.`);throw E(e,r,n),Error(n)}finally{T(i,r)}},beginLiveRun:(t,n,r)=>{e(e=>{let i=e.liveRuns[t];return{liveRuns:{...e.liveRuns,[t]:i?.runId===n?{...i,startedAt:i.startedAt??r}:O(t,n,r)}}})},applyRunEvent:e=>{t().applyRunEvents([e])},applyRunEvents:t=>{t.length!==0&&e(e=>{let n={...e.liveRuns},r=e.tasks,i=e.selectedTask;for(let a of t){n[a.taskId]=j(n[a.taskId],a);let t=a.type===`snapshot`?a.data.task??a.data.detail:void 0,o=t&&typeof t==`object`&&!Array.isArray(t)&&t.id===a.taskId&&Array.isArray(t.messages)?t:void 0;o&&(r=L(r,o),e.selectedTaskId===o.id&&(i=I(i,o)))}return{liveRuns:n,tasks:r,selectedTask:i}})},setLiveRunConnection:(t,n,r,i)=>{e(e=>{let a=e.liveRuns[t];return!a||a.runId!==n?{}:{liveRuns:{...e.liveRuns,[t]:{...a,connection:r,connectionError:i}}}})},clearLiveRun:(t,n)=>{e(e=>{if(n&&e.liveRuns[t]?.runId!==n)return{};let r={...e.liveRuns};return delete r[t],{liveRuns:r}})},loadFiles:async(r,i=``)=>{let a=n,o=++l,s=x();try{let n=await u.listFiles(r,i);if(y(a),!n.success||!n.data)throw M(`Could not load workspace files.`,n);return o===l&&t().selectedTaskId===r&&e({files:n.data}),n.data}catch(n){let i=N(n,`Could not load workspace files.`);throw o===l&&v(a)&&t().selectedTaskId===r&&e({error:i}),Error(i)}finally{S(s,a,r)}},loadFile:async(r,i)=>{let a=n,o=++d,s=_(r,i);f=s;let c=x();try{let n=await u.getFile(r,i);if(y(a),!n.success||!n.data)throw M(`Could not open this workspace file.`,n);if(o!==d||f!==s||!v(a)||t().selectedTaskId!==r)throw Error(`Work file request was superseded.`);return e({selectedFile:n.data}),n.data}catch(n){let i=N(n,`Could not open this file.`);throw o===d&&v(a)&&t().selectedTaskId===r&&e({error:i}),Error(i)}finally{S(c,a,r)}},clearSelectedFile:()=>{d+=1,f=null,e({selectedFile:null})},saveFile:async(r,i,a,o)=>{let s=n,c=w(r),l=_(r,i);f===l&&(d+=1,f=null);try{let n=await u.saveFile(r,i,a,o);if(y(s),!n.success||!n.data)throw M(`Could not save this workspace file.`,n);return t().selectedTaskId===r&&t().selectedFile?.path===i&&(f===l&&(d+=1,f=null),e({selectedFile:n.data})),n.data}catch(e){let t=N(e,`Could not save this file.`);throw E(r,s,t),Error(t)}finally{T(c,s)}},startPreview:(e,t)=>k(()=>u.startPreview(e,t),`Could not start the workspace preview.`,e),stopPreview:e=>k(()=>u.stopPreview(e),`Could not stop the workspace preview.`,e),clearError:()=>e({error:null}),clearAllState:()=>{n+=1,i=++r,a=i,o+=1,s=null,m.clear(),g.clear(),b(),e({capabilities:null,tasks:[],selectedTaskId:null,selectedTask:null,files:[],selectedFile:null,liveRuns:{},loadingTasks:!1,loadingTask:!1,loadingOlderMessages:!1,loadingFiles:!1,actionLoading:!1,error:null})}}}),B=async(e,t,n)=>{let r=await t(e);return r.success&&await n(),r},V=c(`store:plugin-store`),H=a((e,t)=>({plugins:[],pluginStatus:[],pluginVariables:{},isLoading:!1,isUploading:!1,error:null,loadPlugins:async()=>{e({isLoading:!0,error:null});try{let t=await f.getAllPlugins();t.success&&t.data?e({plugins:t.data}):e({error:t.error||`Failed to load plugins`})}catch(t){e({error:i(t,`Failed to load plugins`)})}finally{e({isLoading:!1})}},uploadPlugin:async n=>{e({isUploading:!0,error:null});try{let r=await f.uploadPlugin(n);r.success&&r.data?await t().loadPlugins():e({error:r.error||`Failed to upload plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to upload plugin`})}finally{e({isUploading:!1})}},installPlugin:async n=>{e({isLoading:!0,error:null});try{let r=await f.installPlugin(n);r.success&&r.data?await t().loadPlugins():e({error:r.error||`Failed to install plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to install plugin`})}finally{e({isLoading:!1})}},updatePlugin:async(n,r)=>{e({isLoading:!0,error:null});try{let i=await f.updatePlugin(n,r);i.success&&i.data?await t().loadPlugins():e({error:i.error||`Failed to update plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to update plugin`})}finally{e({isLoading:!1})}},deletePlugin:async n=>{e({isLoading:!0,error:null});try{let r=await f.deletePlugin(n);r.success?await t().loadPlugins():e({error:r.error||`Failed to delete plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to delete plugin`})}finally{e({isLoading:!1})}},activatePlugin:async n=>{e({isLoading:!0,error:null});try{let r=await B(n,f.activatePlugin,()=>t().loadPlugins());r.success||e({error:r.error||`Failed to activate plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to activate plugin`})}finally{e({isLoading:!1})}},deactivatePlugin:async n=>{e({isLoading:!0,error:null});try{let r=await f.deactivatePlugin(n);r.success?await t().loadPlugins():e({error:r.error||`Failed to deactivate plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to deactivate plugin`})}finally{e({isLoading:!1})}},loadPluginStatus:async()=>{try{let t=await f.getPluginStatus();t.success&&t.data&&e({pluginStatus:t.data})}catch(e){V.error(`Failed to load plugin status:`,e)}},exportPlugin:async t=>{e({isLoading:!0,error:null});try{let e=await f.exportPlugin(t),n=window.URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=`${t}.json`,document.body.appendChild(r),r.click(),document.body.removeChild(r),window.URL.revokeObjectURL(n)}catch(t){e({error:t instanceof Error?t.message:`Failed to export plugin`})}finally{e({isLoading:!1})}},fetchPluginVariables:async t=>{try{let n=await f.getVariables(t);n.success&&n.data&&e(e=>({pluginVariables:{...e.pluginVariables,[t]:n.data}}))}catch(e){V.error(`Failed to fetch plugin variables:`,e)}},updatePluginVariables:async(e,n,r=[])=>{try{return(await f.setVariables(e,n,r)).success?(await t().fetchPluginVariables(e),!0):!1}catch(e){return V.error(`Failed to update plugin variables:`,e),!1}},resetPluginVariables:async t=>{try{let n=await f.resetVariables(t);return n.success&&n.data===!0?(e(e=>{let n={...e.pluginVariables};return delete n[t],{pluginVariables:n}}),!0):!1}catch(e){return V.error(`Failed to reset plugin variables:`,e),!1}},clearError:()=>e({error:null}),setError:t=>e({error:t})})),U=`libre-webui:work-draft:`,W=(e,t)=>`${U}${e}:${t}`,te=(e,t)=>{try{let n=window.sessionStorage.getItem(W(e,t));if(!n)return null;let r=JSON.parse(n);return typeof r.content==`string`?{content:r.content,baseUpdatedAt:typeof r.baseUpdatedAt==`number`?r.baseUpdatedAt:void 0}:null}catch{return null}},ne=(e,t,n)=>{try{return window.sessionStorage.setItem(W(e,t),JSON.stringify(n)),!0}catch{return!1}},re=(e,t)=>{try{window.sessionStorage.removeItem(W(e,t))}catch{}},ie=e=>{let t=`${U}${e}:`;try{for(let e=window.sessionStorage.length-1;e>=0;e--){let n=window.sessionStorage.key(e);n?.startsWith(t)&&window.sessionStorage.removeItem(n)}}catch{}},G=()=>{try{for(let e=window.sessionStorage.length-1;e>=0;e--){let t=window.sessionStorage.key(e);t?.startsWith(U)&&window.sessionStorage.removeItem(t)}}catch{}},ae=`/ws/work-terminal`;function K(e,t,n){let r;try{r=new URL(e)}catch{throw Error(`${t} must be an absolute URL.`)}if(!n.includes(r.protocol))throw Error(`${t} must use ${n.join(` or `)}.`);if(r.username||r.password||r.search||r.hash)throw Error(`${t} must not contain credentials, a query, or a fragment.`);return r}function q(e){return e.replace(/\/+$/,``)}function oe(e){return q(K(e,`VITE_WS_BASE_URL`,[`ws:`,`wss:`]).toString())}function se(e){let t=K(e,`VITE_API_BASE_URL`,[`http:`,`https:`]);return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.pathname=t.pathname.replace(/\/api\/?$/,``),q(t.toString())}function J(e){let t=e.websocketBaseUrl?.trim();if(t)return oe(t);if(e.protocol===`file:`)return`ws://localhost:3001`;let n=e.apiBaseUrl?.trim();if(n)return se(n);let r=e.protocol===`https:`?`wss:`:`ws:`;return e.production?`${r}//${e.host}`:`${r}//${e.hostname}:3001`}function Y(e,t,n){let r=J(t),i=new URL(`${r}/${e.replace(/^\/+/,``)}`);for(let[e,t]of Object.entries(n))i.searchParams.set(e,t);return i.toString()}function ce(e,t){return Y(`/ws`,t,{ticket:e})}function le(e,t,n){return Y(ae,n,{taskId:e,ticket:t})}var X=c(`websocket`),Z=new class{constructor(){n(this,`ws`,null),n(this,`urlEnvironment`,void 0),n(this,`reconnectAttempts`,0),n(this,`maxReconnectAttempts`,5),n(this,`reconnectDelay`,1e3),n(this,`messageHandlers`,new Map),n(this,`connectPromise`,null),n(this,`shouldReconnect`,!1),n(this,`connectionEpoch`,0),this.urlEnvironment={protocol:window.location.protocol,host:window.location.host,hostname:window.location.hostname,apiBaseUrl:void 0,websocketBaseUrl:void 0,production:!0},X.debug(`WebSocket base URL resolved:`,J(this.urlEnvironment))}connect(){if(s())return X.debug(`Demo mode active: skipping WebSocket connection.`),Promise.resolve();if(this.ws?.readyState===WebSocket.OPEN)return Promise.resolve();if(this.connectPromise)return this.connectPromise;this.shouldReconnect=!0;let e=++this.connectionEpoch,t=this.openWithTicket(e).finally(()=>{this.connectPromise===t&&(this.connectPromise=null)});return this.connectPromise=t,t}async openWithTicket(e){let t;try{t=await l.post(`/auth/websocket-ticket`,{audience:`chat`})}catch(t){throw this.shouldReconnect&&e===this.connectionEpoch&&this.attemptReconnect(),t}let n=t.data.data?.ticket;if(!n)throw Error(`The server did not issue a WebSocket ticket.`);if(!(!this.shouldReconnect||e!==this.connectionEpoch))return X.debug(`WebSocket: Attempting to connect`),new Promise((t,r)=>{try{let i=ce(n,this.urlEnvironment);X.debug(`WebSocket: Connecting with a one-use ticket`);let a=new WebSocket(i);this.ws=a,a.onopen=()=>{if(!this.shouldReconnect||e!==this.connectionEpoch){a.close(),t();return}X.debug(`WebSocket connected successfully`),this.reconnectAttempts=0,t()},a.onmessage=e=>{try{let t=JSON.parse(e.data),n=this.messageHandlers.get(t.type);n?n(t.data):t.type===`connected`?X.debug(`WebSocket: Server confirmed connection`):X.warn(`WebSocket: No handler for message type:`,t.type)}catch(e){X.error(`Failed to parse WebSocket message:`,e)}},a.onclose=()=>{X.debug(`WebSocket disconnected`),this.ws===a&&(this.ws=null),this.shouldReconnect&&e===this.connectionEpoch&&this.attemptReconnect()},a.onerror=e=>{X.error(`WebSocket error:`,e),r(e)}}catch(e){r(e)}})}disconnect(){this.shouldReconnect=!1,this.connectionEpoch+=1,this.connectPromise=null,this.ws&&(this.ws.close(),this.ws=null)}send(e){return this.ws&&this.ws.readyState===WebSocket.OPEN?(X.debug(`WebSocket: Sending message:`,e),this.ws.send(JSON.stringify(e)),!0):(X.warn(`WebSocket is not connected. ReadyState:`,this.ws?.readyState),!1)}onMessage(e,t){this.messageHandlers.delete(e),this.messageHandlers.set(e,t)}offMessage(e){this.messageHandlers.delete(e)}dispatchMessage(e,t){this.messageHandlers.get(e)?.(t)}attemptReconnect(){if(s()){X.debug(`Demo mode active: skipping WebSocket reconnection.`);return}this.reconnectAttempts<this.maxReconnectAttempts?(this.reconnectAttempts++,X.debug(`Attempting to reconnect... (${this.reconnectAttempts}/${this.maxReconnectAttempts})`),setTimeout(()=>{this.shouldReconnect&&this.connect().catch(()=>{})},this.reconnectDelay*this.reconnectAttempts)):X.error(`Max reconnection attempts reached`)}get isConnected(){return this.ws?.readyState===WebSocket.OPEN}},ue=e({useAuthStore:()=>$}),Q=c(`auth-store`),$=a()(o((e,n)=>({user:null,token:null,systemInfo:null,workAccess:null,isAuthenticated:!1,isLoading:!1,login:(t,i,a)=>{let o=n().user?.id===t.id;localStorage.setItem(`auth-token`,i);let c=r.getState();c.clearAllState&&c.clearAllState(),z.getState().clearAllState(),o||(G(),p.getState().clearUserState()),e({user:t,token:i,systemInfo:a,isAuthenticated:!0,isLoading:!1}),setTimeout(async()=>{try{let e=H.getState();Q.debug(`Reinitializing app after login...`),Q.debug(`Reconnecting WebSocket with auth token...`),Z.disconnect(),await Z.connect();try{!(await d.checkHealth()).success&&!s()&&Q.warn(`Ollama service not available after login`)}catch(e){Q.warn(`Ollama health check failed after login; continuing provider initialization:`,e)}let t=p.getState();await Promise.all([c.loadModels(),c.loadSessions(),c.loadPreferences(),t.loadPreferences(),e.loadPlugins(),n().refreshWorkAccess()]),Q.debug(`Reinitialized app after login`)}catch(e){Q.error(`Failed to reinitialize app after login:`,e)}},100)},logout:()=>{localStorage.removeItem(`auth-token`),Q.debug(`Disconnecting WebSocket on logout...`),Z.disconnect();let t=r.getState();t.clearAllState&&t.clearAllState(),z.getState().clearAllState(),G(),p.getState().clearUserState(),e({user:null,token:null,workAccess:null,isAuthenticated:!1,isLoading:!1})},setUser:t=>{e({user:t})},setSystemInfo:t=>{e({systemInfo:t})},setLoading:t=>{e({isLoading:t})},isAdmin:()=>{let{user:e}=n();return e?.role===`admin`},requiresAuth:()=>{let{systemInfo:e}=n();return e?.requiresAuth??!1},canUseWork:()=>{let{systemInfo:e,user:t,workAccess:r}=n();return e?.requiresAuth===!1||t?.role===`admin`||r?.allowed===!0},canUseAgents:()=>{let{systemInfo:e,user:t}=n();return e?.agentsEnabled===!0?e?.requiresAuth===!1||t?.role===`admin`:!1},refreshWorkAccess:async()=>{try{let{workApi:n}=await t(async()=>{let{workApi:e}=await import(`./workApi-Czu69yWS.js`).then(e=>e.n);return{workApi:e}},__vite__mapDeps([0,1,2,3,4,5,6])),r=await n.access();r.success&&r.data&&e({workAccess:r.data})}catch(e){Q.debug(`Could not load Work access mode:`,e)}}}),{name:`auth-store`,partialize:e=>({user:e.user,token:e.token,systemInfo:e.systemInfo,workAccess:e.workAccess,isAuthenticated:e.isAuthenticated})}));export{re as a,ne as c,le as i,H as l,$ as n,ie as o,Z as r,te as s,ue as t,z as u};
|
|
4
|
+
`,g=e=>e&&typeof e==`object`&&!Array.isArray(e)?e:void 0,_=(e,...t)=>{for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t}},v=(e,...t)=>{for(let n of t){let t=e[n];if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t!=`string`||!t.trim())continue;let r=Number(t);if(Number.isFinite(r))return r}},y=(e,t)=>{let n=String(e||``).trim().toLowerCase().replace(/[\s-]+/g,`_`);return n===`queued`?`queued`:n===`preparing`||n===`starting`?`preparing`:n===`thinking`||n===`running`||n===`working`?`thinking`:n===`using_tool`||n===`tool`||n===`tool_call`?`using_tool`:n===`responding`||n===`streaming`||n===`assistant`?`responding`:n===`completed`||n===`complete`||n===`done`?`completed`:n===`needs_input`||n===`needsinput`||n===`blocked`?`needs_input`:n===`failed`||n===`error`?`failed`:n===`cancelled`||n===`canceled`||n===`stopped`?`cancelled`:t},b=(e,t)=>{let n=_(t,`total`);if(n!==void 0)return x(n);let r=_(t,`text`,`content`,`delta`,`reasoning`)||``;return t.replace===!0||t.cumulative===!0?x(r):x(e+r)},x=e=>{let t=e.startsWith(h),n=t?e.slice(31):e;return!t&&n.length<=m?n:t&&n.length<=99969?h+n:h+n.slice(-99969)},S=(e,t,n,r)=>{if(r===n)return e;if(r.startsWith(n)){let i=r.slice(n.length),a=e[e.length-1];return a&&a.kind===t?[...e.slice(0,-1),{kind:t,text:x(a.text+i)}]:[...e,{kind:t,text:x(i)}]}return[...e.filter(e=>e.kind!==t),{kind:t,text:r}]},C=(e,t)=>e.some(e=>e.kind===`tool`&&e.toolId===t)?e:[...e,{kind:`tool`,toolId:t}],w=(e,t)=>{let n=g(e.usage)||e,r={...t};for(let[e,t]of[[`inputTokens`,[`inputTokens`,`input_tokens`,`promptTokens`,`prompt_tokens`]],[`outputTokens`,[`outputTokens`,`output_tokens`,`completionTokens`,`completion_tokens`]],[`reasoningTokens`,[`reasoningTokens`,`reasoning_tokens`]],[`cachedTokens`,[`cachedTokens`,`cached_tokens`]],[`totalTokens`,[`totalTokens`,`total_tokens`]],[`tokensPerSecond`,[`tokensPerSecond`,`tokens_per_second`]],[`durationMs`,[`durationMs`,`duration_ms`]]]){let i=v(n,...t);i!==void 0&&(r[e]=i)}return r.totalTokens===void 0&&(r.inputTokens!==void 0||r.outputTokens!==void 0)&&(r.totalTokens=(r.inputTokens||0)+(r.outputTokens||0)),r},T=(e,t)=>{let n=g(e.skill)||e,r=_(n,`name`,`title`,`skill`)||`Skill`;return{id:_(n,`id`,`skillId`,`skill_id`)||`${r}-${t}`,name:r,description:_(n,`description`,`summary`)}},E=(e,t,n)=>{let r=g(e.tool)||e,i=g(r.message),a=i?g(i.metadata):void 0,o=a?{...a,...r}:r,s=_(o,`name`,`toolName`,`tool_name`,`function`)||`tool`;return{id:_(o,`id`,`toolCallId`,`tool_call_id`,`callId`)||`${s}-${n}`,name:s,status:o.isError===!0||o.is_error===!0?`error`:`running`,arguments:o.arguments??o.input??o.args??o.parameters??void 0,metadata:g(o.metadata)||a,startedAt:v(o,`startedAt`,`started_at`,`timestamp`)||t}},D=(e,t)=>Array.isArray(e)?e.flatMap((e,n)=>{let r=g(e);if(!r)return[];let i=E(r,t,n),a=_(r,`output`,`content`,`result`),o=y(r.status,`using_tool`);return[{...i,status:r.isError===!0||r.is_error===!0?`error`:o===`completed`?`completed`:i.status,output:a,finishedAt:v(r,`finishedAt`,`finished_at`),durationMs:v(r,`durationMs`,`duration_ms`)}]}):[],O=(e,t,n)=>({taskId:e,runId:t,connection:`idle`,phase:`queued`,lastEventId:0,reasoning:``,response:``,timeline:[],tools:[],skills:[],startedAt:n,terminal:!1}),k=(e,t)=>{let n=g(t.data.liveRun)||g(t.data.live_run)||g(t.data.run)||t.data,r=g(t.data.task)||g(t.data.detail),i=r?g(r.activeRun):void 0,a=_(n,`reasoning`,`thinking`),o=_(n,`response`,`assistant`,`content`),s=y(n.phase??n.status??i?.status??r?.status,e.phase),c=e.lastEventId>0&&s!==`completed`&&s!==`needs_input`&&s!==`failed`&&s!==`cancelled`&&n.phase===void 0?e.phase:s,l=D(n.tools??n.toolActivities??n.tool_activities,t.timestamp),u=n.skills,d=Array.isArray(u)?u.flatMap((e,t)=>{let n=g(e);return n?[T(n,t)]:[]}):e.skills,f=n.terminal===!0||c===`completed`||c===`needs_input`||c===`failed`||c===`cancelled`,p=a===void 0?e.reasoning:x(a),m=o===void 0?e.response:x(o),h=l.length>0?l:e.tools,b=S(e.timeline,`reasoning`,e.reasoning,p);for(let e of h)b=C(b,e.id);return b=S(b,`response`,e.response,m),{...e,phase:c,reasoning:p,response:m,timeline:b,tools:h,skills:d,usage:g(n.usage)?w(n,e.usage):e.usage,round:v(n,`round`,`roundIndex`,`round_index`)??e.round,roundLimit:v(n,`roundLimit`,`round_limit`)??e.roundLimit,startedAt:v(n,`startedAt`,`started_at`)??(i?v(i,`startedAt`,`started_at`):void 0)??e.startedAt,finishedAt:v(n,`finishedAt`,`finished_at`)??e.finishedAt,error:_(n,`error`,`message`)??e.error,terminal:f}},A=(e,t)=>{let n=e.findIndex(e=>e.id===t.id);if(n===-1)return[...e,t];let r=[...e];return r[n]={...e[n],...t},r},j=(e,t)=>{let n=e?.taskId===t.taskId&&e.runId===t.runId?e:O(t.taskId,t.runId,t.timestamp);if(t.type!==`snapshot`&&t.id<=n.lastEventId)return n;let r={...n,connection:`connected`,connectionError:void 0,lastEventId:Math.max(n.lastEventId,t.id)};if(t.type===`snapshot`)r=k(r,t);else if(t.type===`run_state`){let e=y(t.data.phase??t.data.status??t.data.state,r.phase);r={...r,phase:e,round:v(t.data,`round`,`roundIndex`,`round_index`)??r.round,roundLimit:v(t.data,`roundLimit`,`round_limit`)??r.roundLimit,startedAt:v(t.data,`startedAt`,`started_at`)??r.startedAt,terminal:r.terminal||e===`completed`||e===`needs_input`||e===`failed`||e===`cancelled`}}else if(t.type===`reasoning_delta`){let e=b(r.reasoning,t.data);r={...r,phase:`thinking`,reasoning:e,timeline:S(r.timeline,`reasoning`,r.reasoning,e)}}else if(t.type===`assistant_delta`){let e=b(r.response,t.data);r={...r,phase:`responding`,response:e,timeline:S(r.timeline,`response`,r.response,e)}}else if(t.type===`tool_call`){let e=E(t.data,t.timestamp,r.tools.length);r={...r,phase:`using_tool`,tools:A(r.tools,e),timeline:C(r.timeline,e.id)}}else if(t.type===`tool_result`){let e=E(t.data,t.timestamp,r.tools.length),n=r.tools.find(t=>t.id===e.id),i=t.data.isError===!0||t.data.is_error===!0||t.data.error===!0;r={...r,phase:`thinking`,tools:A(r.tools,{...n,...e,status:i?`error`:`completed`,arguments:n?.arguments??e.arguments,startedAt:n?.startedAt??e.startedAt,output:_(t.data,`output`,`content`,`result`,`message`)||``,finishedAt:v(t.data,`finishedAt`,`finished_at`)||t.timestamp,durationMs:v(t.data,`durationMs`,`duration_ms`)})}}else if(t.type===`usage`)r={...r,usage:w(t.data,r.usage)};else if(t.type===`skill_loaded`){let e=T(t.data,r.skills.length);r={...r,skills:r.skills.some(t=>t.id===e.id)?r.skills:[...r.skills,e]}}else if(t.type===`error`)r={...r,phase:`failed`,error:_(t.data,`message`,`error`)||`The Work run stopped unexpectedly.`,finishedAt:v(t.data,`finishedAt`,`finished_at`)||t.timestamp,terminal:t.data.terminal!==!1};else if(t.type===`done`){let e=y(t.data.status??t.data.state??t.data.phase,`completed`);r={...r,phase:e,error:_(t.data,`error`,`message`)??r.error,usage:g(t.data.usage)?w(t.data,r.usage):r.usage,finishedAt:v(t.data,`finishedAt`,`finished_at`)||t.timestamp,terminal:!0}}return r},M=(e,t)=>Error(t?.error||t?.message||e),N=(e,t)=>{if(typeof e==`object`&&e&&`response`in e){let t=e.response,n=t?.data?.error||t?.data?.message;if(n)return n}return e instanceof Error&&e.message?e.message:t},P=e=>[...e].sort((e,t)=>t.updatedAt-e.updatedAt||t.createdAt-e.createdAt||e.id.localeCompare(t.id)),ee=({messages:e,messageCursor:t,hasMoreMessages:n,...r})=>r,F=(e,t)=>{let n=new Map(e.map(e=>[e.id,e]));for(let e of t)n.set(e.id,e);return[...n.values()].sort((e,t)=>e.messageIndex-t.messageIndex||e.createdAt-t.createdAt||e.id.localeCompare(t.id))},I=(e,t)=>{if(!e||e.id!==t.id)return t;let n=e.updatedAt>t.updatedAt?{...t,...e}:{...e,...t};if(e.messages.length===0)return{...n,messages:t.messages,messageCursor:t.messageCursor,hasMoreMessages:t.hasMoreMessages};let r=Math.max(...e.messages.map(e=>e.messageIndex)),i=Math.min(...t.messages.map(e=>e.messageIndex)),a=t.messages.length>0&&r+1<i;return{...n,messages:F(e.messages,t.messages),messageCursor:a?t.messageCursor:e.messageCursor,hasMoreMessages:a?t.hasMoreMessages:e.hasMoreMessages}},L=(e,t)=>{let n=e.find(e=>e.id===t.id);if(n&&n.updatedAt>t.updatedAt)return e;let r=ee(t),i=e.findIndex(e=>e.id===t.id);if(i===-1)return[r,...e];let a=[...e];return a[i]=r,a},R=(e,t)=>{let n=new Map(t.map(e=>[e.id,e])),r=new Set(e.map(e=>e.id)),i=P(t.filter(e=>!r.has(e.id))),a=e.flatMap(e=>{let t=n.get(e.id);return t?[e.updatedAt>t.updatedAt?e:t]:[]});return[...i,...a]},z=a((e,t)=>{let n=0,r=0,i=0,a=0,o=0,s=null,c=0,l=0,d=0,f=null,p=0,m=new Set,h=new Set,g=new Map,_=(e,t)=>`${e}\u0000${t}`,v=e=>e===n,y=e=>{if(!v(e))throw Error(`Work session changed.`)},b=()=>{l+=1,d+=1,f=null,h.clear()},x=()=>{let t=++c;return h.add(t),e({loadingFiles:!0}),t},S=(n,r,i)=>{h.delete(n),v(r)&&t().selectedTaskId===i&&e({loadingFiles:h.size>0})},C=e=>t().selectedTaskId===e,w=t=>{let n=++p;return g.set(n,t),C(t)&&e({actionLoading:!0,error:null}),n},T=(n,r)=>{if(g.delete(n),!v(r))return;let i=t().selectedTaskId;e({actionLoading:[...g.values()].some(e=>e===i)})},E=(t,n,r)=>{v(n)&&C(t)&&e({error:r})},D=(t,r=n,i=!1)=>{v(r)&&(i&&(o+=1),e(e=>({tasks:L(e.tasks,t),selectedTask:e.selectedTaskId===t.id?I(e.selectedTask,t):e.selectedTask})))},k=async(e,t,r)=>{let i=n,a=w(r);try{let n=await e();if(y(i),!n.success||!n.data)throw M(t,n);return D(n.data,i,!0),n.data}catch(e){let n=N(e,t);throw E(r,i,n),Error(n)}finally{T(a,i)}};return{capabilities:null,tasks:[],selectedTaskId:null,selectedTask:null,files:[],selectedFile:null,liveRuns:{},loadingTasks:!1,loadingTask:!1,loadingOlderMessages:!1,loadingFiles:!1,actionLoading:!1,error:null,loadCapabilities:async()=>{let t=n;try{let n=await u.capabilities();if(y(t),!n.success||!n.data)throw M(`Could not inspect the Work runtime.`,n);e({capabilities:n.data})}catch(n){v(t)&&e({capabilities:{available:!1,runtime:`docker`,image:``,reason:N(n,`The Work runtime is unavailable.`)}})}},loadTasks:async(t=!1)=>{let c=n,l=++r,d=o;t||(i=l,m.add(l),e({loadingTasks:!0,error:null}));try{let t=await u.listTasks();if(y(c),!t.success||!t.data)throw M(`Could not load Work tasks.`,t);let n=P(t.data);if(l<=a||d!==o)return;a=l,e(e=>{let t=R(e.tasks,n),r=e.selectedTaskId?t.find(t=>t.id===e.selectedTaskId):void 0,i=r&&e.selectedTask?{...e.selectedTask,...r,messages:e.selectedTask.messages,messageCursor:e.selectedTask.messageCursor,hasMoreMessages:e.selectedTask.hasMoreMessages}:e.selectedTask,a=s,o=a!==null&&l>a.requestId;return o&&(s=null),{tasks:t,selectedTask:i,...o&&e.error===a.message?{error:null}:{}}})}catch(n){let r=N(n,`Could not load Work tasks.`);!t&&v(c)&&l===i&&l>a&&d===o&&(s={requestId:l,message:r},e({error:r}))}finally{m.delete(l),!t&&v(c)&&e({loadingTasks:m.size>0})}},selectTask:t=>{b(),e(e=>({selectedTaskId:t,selectedTask:t&&e.selectedTask?.id===t?e.selectedTask:null,files:[],selectedFile:null,loadingFiles:!1,loadingOlderMessages:!1,actionLoading:[...g.values()].some(e=>e===t),error:null}))},loadTask:async(t,r=!1)=>{let i=n;r||e({loadingTask:!0,error:null});try{let e=await u.getTask(t);if(y(i),!e.success||!e.data)throw M(`Could not load this Work task.`,e);return D(e.data,i),e.data}catch(t){let n=N(t,`Could not load this Work task.`);throw!r&&v(i)&&e({error:n}),Error(n)}finally{!r&&v(i)&&e({loadingTask:!1})}},loadOlderMessages:async r=>{let i=n,a=t().selectedTask,o=a?.id===r?a.messageCursor:void 0;if(!a||a.id!==r||!a.hasMoreMessages||o===void 0)return[];e({loadingOlderMessages:!0,error:null});try{let t=await u.getMessages(r,o);if(y(i),!t.success||!t.data)throw M(`Could not load older Work messages.`,t);let n=t.data;return e(e=>{if(e.selectedTask?.id!==r)return{};let t=e.selectedTask.messageCursor===o;return{selectedTask:{...e.selectedTask,messages:F(e.selectedTask.messages,n.messages),messageCursor:t?n.cursor:e.selectedTask.messageCursor,hasMoreMessages:t?n.hasMore:e.selectedTask.hasMoreMessages}}}),n.messages}catch(n){let a=N(n,`Could not load older Work messages.`);throw v(i)&&t().selectedTaskId===r&&e({error:a}),Error(a)}finally{v(i)&&t().selectedTaskId===r&&e({loadingOlderMessages:!1})}},createTask:e=>k(()=>u.createTask(e),`Could not create the Work task.`,null),updateTask:(e,t)=>k(()=>u.updateTask(e,t),`Could not update the Work task.`,e),deleteTask:async r=>{let i=n,a=w(r);try{let n=await u.deleteTask(r);if(y(i),!n.success)throw M(`Could not delete the Work task.`,n);t().selectedTaskId===r&&b(),o+=1,e(e=>({tasks:e.tasks.filter(e=>e.id!==r),selectedTaskId:e.selectedTaskId===r?null:e.selectedTaskId,selectedTask:e.selectedTaskId===r?null:e.selectedTask,files:e.selectedTaskId===r?[]:e.files,selectedFile:e.selectedTaskId===r?null:e.selectedFile,liveRuns:Object.fromEntries(Object.entries(e.liveRuns).filter(([e])=>e!==r))}))}catch(e){let t=N(e,`Could not delete the Work task.`);throw E(r,i,t),Error(t)}finally{T(a,i)}},startRun:async(e,t)=>{let r=n,i=w(e);try{let n=await u.startRun(e,t);if(y(r),!n.success||!n.data)throw M(`Could not start the Work run.`,n);return D(n.data,r,!0),n.data}catch(t){let n=N(t,`Could not start the Work run.`);throw E(e,r,n),Error(n)}finally{T(i,r)}},cancelRun:async e=>{let r=n,i=w(e);try{let n=await u.cancelRun(e);if(y(r),!n.success)throw M(`Could not cancel the Work run.`,n);return n.data?(D(n.data,r,!0),n.data):(o+=1,await t().loadTask(e,!0))}catch(t){let n=N(t,`Could not cancel the Work run.`);throw E(e,r,n),Error(n)}finally{T(i,r)}},beginLiveRun:(t,n,r)=>{e(e=>{let i=e.liveRuns[t];return{liveRuns:{...e.liveRuns,[t]:i?.runId===n?{...i,startedAt:i.startedAt??r}:O(t,n,r)}}})},applyRunEvent:e=>{t().applyRunEvents([e])},applyRunEvents:t=>{t.length!==0&&e(e=>{let n={...e.liveRuns},r=e.tasks,i=e.selectedTask;for(let a of t){n[a.taskId]=j(n[a.taskId],a);let t=a.type===`snapshot`?a.data.task??a.data.detail:void 0,o=t&&typeof t==`object`&&!Array.isArray(t)&&t.id===a.taskId&&Array.isArray(t.messages)?t:void 0;o&&(r=L(r,o),e.selectedTaskId===o.id&&(i=I(i,o)))}return{liveRuns:n,tasks:r,selectedTask:i}})},setLiveRunConnection:(t,n,r,i)=>{e(e=>{let a=e.liveRuns[t];return!a||a.runId!==n?{}:{liveRuns:{...e.liveRuns,[t]:{...a,connection:r,connectionError:i}}}})},clearLiveRun:(t,n)=>{e(e=>{if(n&&e.liveRuns[t]?.runId!==n)return{};let r={...e.liveRuns};return delete r[t],{liveRuns:r}})},loadFiles:async(r,i=``)=>{let a=n,o=++l,s=x();try{let n=await u.listFiles(r,i);if(y(a),!n.success||!n.data)throw M(`Could not load workspace files.`,n);return o===l&&t().selectedTaskId===r&&e({files:n.data}),n.data}catch(n){let i=N(n,`Could not load workspace files.`);throw o===l&&v(a)&&t().selectedTaskId===r&&e({error:i}),Error(i)}finally{S(s,a,r)}},loadFile:async(r,i)=>{let a=n,o=++d,s=_(r,i);f=s;let c=x();try{let n=await u.getFile(r,i);if(y(a),!n.success||!n.data)throw M(`Could not open this workspace file.`,n);if(o!==d||f!==s||!v(a)||t().selectedTaskId!==r)throw Error(`Work file request was superseded.`);return e({selectedFile:n.data}),n.data}catch(n){let i=N(n,`Could not open this file.`);throw o===d&&v(a)&&t().selectedTaskId===r&&e({error:i}),Error(i)}finally{S(c,a,r)}},clearSelectedFile:()=>{d+=1,f=null,e({selectedFile:null})},saveFile:async(r,i,a,o)=>{let s=n,c=w(r),l=_(r,i);f===l&&(d+=1,f=null);try{let n=await u.saveFile(r,i,a,o);if(y(s),!n.success||!n.data)throw M(`Could not save this workspace file.`,n);return t().selectedTaskId===r&&t().selectedFile?.path===i&&(f===l&&(d+=1,f=null),e({selectedFile:n.data})),n.data}catch(e){let t=N(e,`Could not save this file.`);throw E(r,s,t),Error(t)}finally{T(c,s)}},startPreview:(e,t)=>k(()=>u.startPreview(e,t),`Could not start the workspace preview.`,e),stopPreview:e=>k(()=>u.stopPreview(e),`Could not stop the workspace preview.`,e),clearError:()=>e({error:null}),clearAllState:()=>{n+=1,i=++r,a=i,o+=1,s=null,m.clear(),g.clear(),b(),e({capabilities:null,tasks:[],selectedTaskId:null,selectedTask:null,files:[],selectedFile:null,liveRuns:{},loadingTasks:!1,loadingTask:!1,loadingOlderMessages:!1,loadingFiles:!1,actionLoading:!1,error:null})}}}),B=async(e,t,n)=>{let r=await t(e);return r.success&&await n(),r},V=c(`store:plugin-store`),H=a((e,t)=>({plugins:[],pluginStatus:[],pluginVariables:{},isLoading:!1,isUploading:!1,error:null,loadPlugins:async()=>{e({isLoading:!0,error:null});try{let t=await f.getAllPlugins();t.success&&t.data?e({plugins:t.data}):e({error:t.error||`Failed to load plugins`})}catch(t){e({error:i(t,`Failed to load plugins`)})}finally{e({isLoading:!1})}},uploadPlugin:async n=>{e({isUploading:!0,error:null});try{let r=await f.uploadPlugin(n);r.success&&r.data?await t().loadPlugins():e({error:r.error||`Failed to upload plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to upload plugin`})}finally{e({isUploading:!1})}},installPlugin:async n=>{e({isLoading:!0,error:null});try{let r=await f.installPlugin(n);r.success&&r.data?await t().loadPlugins():e({error:r.error||`Failed to install plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to install plugin`})}finally{e({isLoading:!1})}},updatePlugin:async(n,r)=>{e({isLoading:!0,error:null});try{let i=await f.updatePlugin(n,r);i.success&&i.data?await t().loadPlugins():e({error:i.error||`Failed to update plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to update plugin`})}finally{e({isLoading:!1})}},deletePlugin:async n=>{e({isLoading:!0,error:null});try{let r=await f.deletePlugin(n);r.success?await t().loadPlugins():e({error:r.error||`Failed to delete plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to delete plugin`})}finally{e({isLoading:!1})}},activatePlugin:async n=>{e({isLoading:!0,error:null});try{let r=await B(n,f.activatePlugin,()=>t().loadPlugins());r.success||e({error:r.error||`Failed to activate plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to activate plugin`})}finally{e({isLoading:!1})}},deactivatePlugin:async n=>{e({isLoading:!0,error:null});try{let r=await f.deactivatePlugin(n);r.success?await t().loadPlugins():e({error:r.error||`Failed to deactivate plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to deactivate plugin`})}finally{e({isLoading:!1})}},loadPluginStatus:async()=>{try{let t=await f.getPluginStatus();t.success&&t.data&&e({pluginStatus:t.data})}catch(e){V.error(`Failed to load plugin status:`,e)}},exportPlugin:async t=>{e({isLoading:!0,error:null});try{let e=await f.exportPlugin(t),n=window.URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=`${t}.json`,document.body.appendChild(r),r.click(),document.body.removeChild(r),window.URL.revokeObjectURL(n)}catch(t){e({error:t instanceof Error?t.message:`Failed to export plugin`})}finally{e({isLoading:!1})}},fetchPluginVariables:async t=>{try{let n=await f.getVariables(t);n.success&&n.data&&e(e=>({pluginVariables:{...e.pluginVariables,[t]:n.data}}))}catch(e){V.error(`Failed to fetch plugin variables:`,e)}},updatePluginVariables:async(e,n,r=[])=>{try{return(await f.setVariables(e,n,r)).success?(await t().fetchPluginVariables(e),!0):!1}catch(e){return V.error(`Failed to update plugin variables:`,e),!1}},resetPluginVariables:async t=>{try{let n=await f.resetVariables(t);return n.success&&n.data===!0?(e(e=>{let n={...e.pluginVariables};return delete n[t],{pluginVariables:n}}),!0):!1}catch(e){return V.error(`Failed to reset plugin variables:`,e),!1}},clearError:()=>e({error:null}),setError:t=>e({error:t})})),U=`libre-webui:work-draft:`,W=(e,t)=>`${U}${e}:${t}`,te=(e,t)=>{try{let n=window.sessionStorage.getItem(W(e,t));if(!n)return null;let r=JSON.parse(n);return typeof r.content==`string`?{content:r.content,baseUpdatedAt:typeof r.baseUpdatedAt==`number`?r.baseUpdatedAt:void 0}:null}catch{return null}},ne=(e,t,n)=>{try{return window.sessionStorage.setItem(W(e,t),JSON.stringify(n)),!0}catch{return!1}},re=(e,t)=>{try{window.sessionStorage.removeItem(W(e,t))}catch{}},ie=e=>{let t=`${U}${e}:`;try{for(let e=window.sessionStorage.length-1;e>=0;e--){let n=window.sessionStorage.key(e);n?.startsWith(t)&&window.sessionStorage.removeItem(n)}}catch{}},G=()=>{try{for(let e=window.sessionStorage.length-1;e>=0;e--){let t=window.sessionStorage.key(e);t?.startsWith(U)&&window.sessionStorage.removeItem(t)}}catch{}},ae=`/ws/work-terminal`;function K(e,t,n){let r;try{r=new URL(e)}catch{throw Error(`${t} must be an absolute URL.`)}if(!n.includes(r.protocol))throw Error(`${t} must use ${n.join(` or `)}.`);if(r.username||r.password||r.search||r.hash)throw Error(`${t} must not contain credentials, a query, or a fragment.`);return r}function q(e){return e.replace(/\/+$/,``)}function oe(e){return q(K(e,`VITE_WS_BASE_URL`,[`ws:`,`wss:`]).toString())}function se(e){let t=K(e,`VITE_API_BASE_URL`,[`http:`,`https:`]);return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.pathname=t.pathname.replace(/\/api\/?$/,``),q(t.toString())}function J(e){let t=e.websocketBaseUrl?.trim();if(t)return oe(t);if(e.protocol===`file:`)return`ws://localhost:3001`;let n=e.apiBaseUrl?.trim();if(n)return se(n);let r=e.protocol===`https:`?`wss:`:`ws:`;return e.production?`${r}//${e.host}`:`${r}//${e.hostname}:3001`}function Y(e,t,n){let r=J(t),i=new URL(`${r}/${e.replace(/^\/+/,``)}`);for(let[e,t]of Object.entries(n))i.searchParams.set(e,t);return i.toString()}function ce(e,t){return Y(`/ws`,t,{ticket:e})}function le(e,t,n){return Y(ae,n,{taskId:e,ticket:t})}var X=c(`websocket`),Z=new class{constructor(){n(this,`ws`,null),n(this,`urlEnvironment`,void 0),n(this,`reconnectAttempts`,0),n(this,`maxReconnectAttempts`,5),n(this,`reconnectDelay`,1e3),n(this,`messageHandlers`,new Map),n(this,`connectPromise`,null),n(this,`shouldReconnect`,!1),n(this,`connectionEpoch`,0),this.urlEnvironment={protocol:window.location.protocol,host:window.location.host,hostname:window.location.hostname,apiBaseUrl:void 0,websocketBaseUrl:void 0,production:!0},X.debug(`WebSocket base URL resolved:`,J(this.urlEnvironment))}connect(){if(s())return X.debug(`Demo mode active: skipping WebSocket connection.`),Promise.resolve();if(this.ws?.readyState===WebSocket.OPEN)return Promise.resolve();if(this.connectPromise)return this.connectPromise;this.shouldReconnect=!0;let e=++this.connectionEpoch,t=this.openWithTicket(e).finally(()=>{this.connectPromise===t&&(this.connectPromise=null)});return this.connectPromise=t,t}async openWithTicket(e){let t;try{t=await l.post(`/auth/websocket-ticket`,{audience:`chat`})}catch(t){throw this.shouldReconnect&&e===this.connectionEpoch&&this.attemptReconnect(),t}let n=t.data.data?.ticket;if(!n)throw Error(`The server did not issue a WebSocket ticket.`);if(!(!this.shouldReconnect||e!==this.connectionEpoch))return X.debug(`WebSocket: Attempting to connect`),new Promise((t,r)=>{try{let i=ce(n,this.urlEnvironment);X.debug(`WebSocket: Connecting with a one-use ticket`);let a=new WebSocket(i);this.ws=a,a.onopen=()=>{if(!this.shouldReconnect||e!==this.connectionEpoch){a.close(),t();return}X.debug(`WebSocket connected successfully`),this.reconnectAttempts=0,t()},a.onmessage=e=>{try{let t=JSON.parse(e.data),n=this.messageHandlers.get(t.type);n?n(t.data):t.type===`connected`?X.debug(`WebSocket: Server confirmed connection`):X.warn(`WebSocket: No handler for message type:`,t.type)}catch(e){X.error(`Failed to parse WebSocket message:`,e)}},a.onclose=()=>{X.debug(`WebSocket disconnected`),this.ws===a&&(this.ws=null),this.shouldReconnect&&e===this.connectionEpoch&&this.attemptReconnect()},a.onerror=e=>{X.error(`WebSocket error:`,e),r(e)}}catch(e){r(e)}})}disconnect(){this.shouldReconnect=!1,this.connectionEpoch+=1,this.connectPromise=null,this.ws&&(this.ws.close(),this.ws=null)}send(e){return this.ws&&this.ws.readyState===WebSocket.OPEN?(X.debug(`WebSocket: Sending message:`,e),this.ws.send(JSON.stringify(e)),!0):(X.warn(`WebSocket is not connected. ReadyState:`,this.ws?.readyState),!1)}onMessage(e,t){this.messageHandlers.delete(e),this.messageHandlers.set(e,t)}offMessage(e){this.messageHandlers.delete(e)}dispatchMessage(e,t){this.messageHandlers.get(e)?.(t)}attemptReconnect(){if(s()){X.debug(`Demo mode active: skipping WebSocket reconnection.`);return}this.reconnectAttempts<this.maxReconnectAttempts?(this.reconnectAttempts++,X.debug(`Attempting to reconnect... (${this.reconnectAttempts}/${this.maxReconnectAttempts})`),setTimeout(()=>{this.shouldReconnect&&this.connect().catch(()=>{})},this.reconnectDelay*this.reconnectAttempts)):X.error(`Max reconnection attempts reached`)}get isConnected(){return this.ws?.readyState===WebSocket.OPEN}},ue=e({useAuthStore:()=>$}),Q=c(`auth-store`),$=a()(o((e,n)=>({user:null,token:null,systemInfo:null,workAccess:null,isAuthenticated:!1,isLoading:!1,login:(t,i,a)=>{let o=n().user?.id===t.id;localStorage.setItem(`auth-token`,i);let c=r.getState();c.clearAllState&&c.clearAllState(),z.getState().clearAllState(),o||(G(),p.getState().clearUserState()),e({user:t,token:i,systemInfo:a,isAuthenticated:!0,isLoading:!1}),setTimeout(async()=>{try{let e=H.getState();Q.debug(`Reinitializing app after login...`),Q.debug(`Reconnecting WebSocket with auth token...`),Z.disconnect(),await Z.connect();try{!(await d.checkHealth()).success&&!s()&&Q.warn(`Ollama service not available after login`)}catch(e){Q.warn(`Ollama health check failed after login; continuing provider initialization:`,e)}let t=p.getState();await Promise.all([c.loadModels(),c.loadSessions(),c.loadPreferences(),t.loadPreferences(),e.loadPlugins(),n().refreshWorkAccess()]),Q.debug(`Reinitialized app after login`)}catch(e){Q.error(`Failed to reinitialize app after login:`,e)}},100)},logout:()=>{localStorage.removeItem(`auth-token`),Q.debug(`Disconnecting WebSocket on logout...`),Z.disconnect();let t=r.getState();t.clearAllState&&t.clearAllState(),z.getState().clearAllState(),G(),p.getState().clearUserState(),e({user:null,token:null,workAccess:null,isAuthenticated:!1,isLoading:!1})},setUser:t=>{e({user:t})},setSystemInfo:t=>{e({systemInfo:t})},setLoading:t=>{e({isLoading:t})},isAdmin:()=>{let{user:e}=n();return e?.role===`admin`},requiresAuth:()=>{let{systemInfo:e}=n();return e?.requiresAuth??!1},canUseWork:()=>{let{systemInfo:e,user:t,workAccess:r}=n();return e?.requiresAuth===!1||t?.role===`admin`||r?.allowed===!0},canUseAgents:()=>{let{systemInfo:e,user:t}=n();return e?.agentsEnabled===!0?e?.requiresAuth===!1||t?.role===`admin`:!1},refreshWorkAccess:async()=>{try{let{workApi:n}=await t(async()=>{let{workApi:e}=await import(`./workApi-DHuYNHLf.js`).then(e=>e.n);return{workApi:e}},__vite__mapDeps([0,1,2,3,4,5,6])),r=await n.access();r.success&&r.data&&e({workAccess:r.data})}catch(e){Q.debug(`Could not load Work access mode:`,e)}}}),{name:`auth-store`,partialize:e=>({user:e.user,token:e.token,systemInfo:e.systemInfo,workAccess:e.workAccess,isAuthenticated:e.isAuthenticated})}));export{re as a,ne as c,le as i,H as l,$ as n,ie as o,Z as r,te as s,ue as t,z as u};
|