libre-webui 0.37.1 → 0.37.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/backend/dist/services/agentCliService.d.ts.map +1 -1
  2. package/backend/dist/services/agentCliService.js +3 -0
  3. package/backend/dist/services/agentCliService.js.map +1 -1
  4. package/backend/dist/utils/pluginDefinitionTrust.js +1 -1
  5. package/backend/package.json +1 -1
  6. package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
  7. package/frontend/dist/assets/index-DWLnkKwj.js +16 -0
  8. package/frontend/dist/index.html +17 -17
  9. package/frontend/dist/js/{ArtifactContainer-B1-GVzVf.js → ArtifactContainer-D4v4l15L.js} +1 -1
  10. package/frontend/dist/js/{ArtifactDemoPage-goftRHdk.js → ArtifactDemoPage-B2uaVpsi.js} +1 -1
  11. package/frontend/dist/js/{ArtifactSandboxFrame-_8RA8_JV.js → ArtifactSandboxFrame-DlWJHI-r.js} +1 -1
  12. package/frontend/dist/js/{ArtifactSlideOutPanel-DlkOZI5N.js → ArtifactSlideOutPanel-laZ98QKB.js} +1 -1
  13. package/frontend/dist/js/{AutomationModal-BaaxZF1M.js → AutomationModal-CjjiEZFA.js} +1 -1
  14. package/frontend/dist/js/{AutomationsPage-DY2x7zVm.js → AutomationsPage-jnWmD58y.js} +1 -1
  15. package/frontend/dist/js/{AvatarUpload-CH_n1Ef0.js → AvatarUpload-KaBaTKoG.js} +1 -1
  16. package/frontend/dist/js/{CalendarPage-DLo5nm3Q.js → CalendarPage-Dc7r-86c.js} +1 -1
  17. package/frontend/dist/js/{ChannelsPage-DnQI7mzq.js → ChannelsPage-DHPabX1e.js} +1 -1
  18. package/frontend/dist/js/{ChatPage-BaDkJnEC.js → ChatPage-ZvGp-iqV.js} +1 -1
  19. package/frontend/dist/js/{ConnectModels-B4dGb5yc.js → ConnectModels-aUTD6s9B.js} +1 -1
  20. package/frontend/dist/js/{CordisPage-CPiYn2Bx.js → CordisPage-DZKcpPVj.js} +1 -1
  21. package/frontend/dist/js/{EvaluationsPage-DpdGpd7x.js → EvaluationsPage-BB7sPhIR.js} +1 -1
  22. package/frontend/dist/js/{FirstTimeSetup-By8OE1JS.js → FirstTimeSetup-elqSi9JH.js} +1 -1
  23. package/frontend/dist/js/{GalleryPage-ByZyIhZQ.js → GalleryPage-CrlNRnkn.js} +1 -1
  24. package/frontend/dist/js/{HomePage-Btc-Mvin.js → HomePage-lR9h7_a1.js} +1 -1
  25. package/frontend/dist/js/{LanguageSwitcher-B3CxRW6J.js → LanguageSwitcher-CWkbzpxT.js} +1 -1
  26. package/frontend/dist/js/{LibreClawPage-3Sonm1gu.js → LibreClawPage-P19FnNlu.js} +1 -1
  27. package/frontend/dist/js/{NotesPage-lFhfjMqJ.js → NotesPage-DopG0M4B.js} +1 -1
  28. package/frontend/dist/js/{PersonasPage-nOThOpXp.js → PersonasPage-CIJINcQK.js} +1 -1
  29. package/frontend/dist/js/{PluginUsagePage-BRbHeRf7.js → PluginUsagePage-Cj0mUxD8.js} +1 -1
  30. package/frontend/dist/js/RichMessageContent-BZndQSJU.js +1 -0
  31. package/frontend/dist/js/{RichMessageContent-BZ7KKJKK.js → RichMessageContent-DxCHlUlY.js} +1 -1
  32. package/frontend/dist/js/{SettingsModal-VpsAx2Ns.js → SettingsModal-wAuFQOE4.js} +3 -3
  33. package/frontend/dist/js/{ShareDialog-CnxPGPb_.js → ShareDialog-Bhpt_Y1N.js} +1 -1
  34. package/frontend/dist/js/{SystemPage-D2ikvhDp.js → SystemPage-BfhVXqar.js} +1 -1
  35. package/frontend/dist/js/{UserManagementPanel-vxpiyiTZ.js → UserManagementPanel-BU95ZPOv.js} +1 -1
  36. package/frontend/dist/js/{WhatsNewModal-DAAFzY0d.js → WhatsNewModal-Dl69bG2T.js} +1 -1
  37. package/frontend/dist/js/{WorkPage-BYpYD9mr.js → WorkPage-CSderbeT.js} +1 -1
  38. package/frontend/dist/js/api-CU-JXx2u.js +1 -0
  39. package/frontend/dist/js/{api-CVUaOaq4.js → api-DPXCtanG.js} +1 -1
  40. package/frontend/dist/js/{appNavigation-CqtrZ9bm.js → appNavigation-R8iKverf.js} +1 -1
  41. package/frontend/dist/js/{appStore-Biw63DtJ.js → appStore-BD70bvas.js} +2 -2
  42. package/frontend/dist/js/appVersion-C7sxqgMd.js +1 -0
  43. package/frontend/dist/js/{authStore-C5qKrmn4.js → authStore-D8fc-Hl0.js} +3 -3
  44. package/frontend/dist/js/authStore-FNKLFUQp.js +1 -0
  45. package/frontend/dist/js/{chatStore-DQhEqb9F.js → chatStore-CK5ojwft.js} +3 -3
  46. package/frontend/dist/js/{client-gf5bjBrn.js → client-BeJbHHWx.js} +2 -2
  47. package/frontend/dist/js/{config-CNvgxwAm.js → config-D6Kcp5n3.js} +1 -1
  48. package/frontend/dist/js/{cordisApi-BYjA4EOQ.js → cordisApi-BS8QMSV4.js} +1 -1
  49. package/frontend/dist/js/{evaluationsApi-Bg12ekHo.js → evaluationsApi-2YwZBPk5.js} +1 -1
  50. package/frontend/dist/js/{messageCodeStyles-DJZ4QMVq.js → messageCodeStyles-D4haBw80.js} +1 -1
  51. package/frontend/dist/js/{teamEventStream-PXiwR5Kr.js → teamEventStream-omPy51va.js} +1 -1
  52. package/frontend/dist/js/{ui-DDMjO5dd.js → ui-D5-4niRk.js} +2 -2
  53. package/frontend/dist/js/{useChat-DaIZ2Dbu.js → useChat-DnGClJeX.js} +1 -1
  54. package/frontend/dist/js/{useDictation-BXyX1U8r.js → useDictation-D7zVBjDJ.js} +1 -1
  55. package/frontend/dist/js/{workApi-C3Td_lFD.js → workApi-C5InfT8x.js} +1 -1
  56. package/frontend/dist/js/workApi-FV75LKJn.js +1 -0
  57. package/package.json +1 -1
  58. package/plugins/codex-oauth.json +2 -0
  59. package/frontend/dist/assets/index-BrDSO609.js +0 -20
  60. package/frontend/dist/js/RichMessageContent-oyydJjgc.js +0 -1
  61. package/frontend/dist/js/api-C0ligMmL.js +0 -1
  62. package/frontend/dist/js/appVersion-D78eXAb-.js +0 -1
  63. package/frontend/dist/js/authStore-2DsDTcIu.js +0 -1
  64. package/frontend/dist/js/workApi-BIS9RxRi.js +0 -1
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["js/workApi-BIS9RxRi.js","js/workApi-C3Td_lFD.js","js/config-CNvgxwAm.js","js/logger-BR4forr_.js","js/client-gf5bjBrn.js"])))=>i.map(i=>d[i]);
2
- import{a as e,o as t,t as n}from"./logger-BR4forr_.js";import{t as r,v as i}from"./chatStore-DQhEqb9F.js";import{i as a,t as o}from"./utils-vendor-DISWt2y9.js";import{t as s}from"./client-gf5bjBrn.js";import{u as c,y as l}from"./api-CVUaOaq4.js";import{t as u}from"./workApi-C3Td_lFD.js";import{t as d}from"./appStore-Biw63DtJ.js";var f=1e5,p=`[Earlier live output omitted]
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["js/workApi-FV75LKJn.js","js/workApi-C5InfT8x.js","js/config-D6Kcp5n3.js","js/logger-BR4forr_.js","js/client-BeJbHHWx.js"])))=>i.map(i=>d[i]);
2
+ import{a as e,o as t,t as n}from"./logger-BR4forr_.js";import{t as r,v as i}from"./chatStore-CK5ojwft.js";import{i as a,t as o}from"./utils-vendor-DISWt2y9.js";import{t as s}from"./client-BeJbHHWx.js";import{u as c,y as l}from"./api-DPXCtanG.js";import{t as u}from"./workApi-C5InfT8x.js";import{t as d}from"./appStore-BD70bvas.js";var f=1e5,p=`[Earlier live output omitted]
3
3
 
4
- `,m=e=>e&&typeof e==`object`&&!Array.isArray(e)?e:void 0,h=(e,...t)=>{for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t}},g=(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}},_=(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},v=(e,t)=>{let n=h(t,`total`);if(n!==void 0)return y(n);let r=h(t,`text`,`content`,`delta`,`reasoning`)||``;return t.replace===!0||t.cumulative===!0?y(r):y(e+r)},y=e=>{let t=e.startsWith(p),n=t?e.slice(31):e;return!t&&n.length<=f?n:t&&n.length<=99969?p+n:p+n.slice(-99969)},b=(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:y(a.text+i)}]:[...e,{kind:t,text:y(i)}]}return[...e.filter(e=>e.kind!==t),{kind:t,text:r}]},x=(e,t)=>e.some(e=>e.kind===`tool`&&e.toolId===t)?e:[...e,{kind:`tool`,toolId:t}],S=(e,t)=>{let n=m(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=g(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},C=(e,t)=>{let n=m(e.skill)||e,r=h(n,`name`,`title`,`skill`)||`Skill`;return{id:h(n,`id`,`skillId`,`skill_id`)||`${r}-${t}`,name:r,description:h(n,`description`,`summary`)}},w=(e,t,n)=>{let r=m(e.tool)||e,i=m(r.message),a=i?m(i.metadata):void 0,o=a?{...a,...r}:r,s=h(o,`name`,`toolName`,`tool_name`,`function`)||`tool`;return{id:h(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:m(o.metadata)||a,startedAt:g(o,`startedAt`,`started_at`,`timestamp`)||t}},T=(e,t)=>Array.isArray(e)?e.flatMap((e,n)=>{let r=m(e);if(!r)return[];let i=w(r,t,n),a=h(r,`output`,`content`,`result`),o=_(r.status,`using_tool`);return[{...i,status:r.isError===!0||r.is_error===!0?`error`:o===`completed`?`completed`:i.status,output:a,finishedAt:g(r,`finishedAt`,`finished_at`),durationMs:g(r,`durationMs`,`duration_ms`)}]}):[],E=(e,t,n)=>({taskId:e,runId:t,connection:`idle`,phase:`queued`,lastEventId:0,reasoning:``,response:``,timeline:[],tools:[],skills:[],startedAt:n,terminal:!1}),D=(e,t)=>{let n=m(t.data.liveRun)||m(t.data.live_run)||m(t.data.run)||t.data,r=m(t.data.task)||m(t.data.detail),i=r?m(r.activeRun):void 0,a=h(n,`reasoning`,`thinking`),o=h(n,`response`,`assistant`,`content`),s=_(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=T(n.tools??n.toolActivities??n.tool_activities,t.timestamp),u=n.skills,d=Array.isArray(u)?u.flatMap((e,t)=>{let n=m(e);return n?[C(n,t)]:[]}):e.skills,f=n.terminal===!0||c===`completed`||c===`needs_input`||c===`failed`||c===`cancelled`,p=a===void 0?e.reasoning:y(a),v=o===void 0?e.response:y(o),w=l.length>0?l:e.tools,E=b(e.timeline,`reasoning`,e.reasoning,p);for(let e of w)E=x(E,e.id);return E=b(E,`response`,e.response,v),{...e,phase:c,reasoning:p,response:v,timeline:E,tools:w,skills:d,usage:m(n.usage)?S(n,e.usage):e.usage,round:g(n,`round`,`roundIndex`,`round_index`)??e.round,roundLimit:g(n,`roundLimit`,`round_limit`)??e.roundLimit,startedAt:g(n,`startedAt`,`started_at`)??(i?g(i,`startedAt`,`started_at`):void 0)??e.startedAt,finishedAt:g(n,`finishedAt`,`finished_at`)??e.finishedAt,error:h(n,`error`,`message`)??e.error,terminal:f,budgetReason:h(n,`budgetReason`,`budget_reason`)??e.budgetReason,loopStats:k(n.loopStats)??e.loopStats,pendingApproval:f?void 0:m(n.pendingApproval??n.pending_approval)?A(m(n.pendingApproval??n.pending_approval)??{}):e.pendingApproval}},O=[`rounds`,`toolCalls`,`screenshots`,`fences`,`expectationsPassed`,`expectationsPending`,`stallNudges`,`ambiguityNudges`],k=e=>{let t=m(e);if(!t)return;let n={};for(let e of O){let r=t[e];typeof r==`number`&&Number.isFinite(r)&&(n[e]=r)}return Object.keys(n).length>0?n:void 0},A=e=>{let t=h(e,`approvalId`,`approval_id`),n=h(e,`toolCallId`,`tool_call_id`),r=h(e,`name`,`toolName`,`tool_name`);if(!t||!n||!r)return;let i=h(e,`status`);return{approvalId:t,toolCallId:n,name:r,summary:m(e.summary),status:i===`approved`||i===`denied`||i===`expired`?i:`pending`,expiresAt:g(e,`expiresAt`,`expires_at`)}},j=(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},ee=(e,t)=>{let n=e?.taskId===t.taskId&&e.runId===t.runId?e:E(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=D(r,t);else if(t.type===`run_state`){let e=_(t.data.phase??t.data.status??t.data.state,r.phase);r={...r,phase:e,round:g(t.data,`round`,`roundIndex`,`round_index`)??r.round,roundLimit:g(t.data,`roundLimit`,`round_limit`)??r.roundLimit,startedAt:g(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=v(r.reasoning,t.data);r={...r,phase:`thinking`,reasoning:e,timeline:b(r.timeline,`reasoning`,r.reasoning,e)}}else if(t.type===`assistant_delta`){let e=v(r.response,t.data);r={...r,phase:`responding`,response:e,timeline:b(r.timeline,`response`,r.response,e)}}else if(t.type===`tool_call`){let e=w(t.data,t.timestamp,r.tools.length);r={...r,phase:`using_tool`,tools:j(r.tools,e),timeline:x(r.timeline,e.id)}}else if(t.type===`tool_result`){let e=w(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:j(r.tools,{...n,...e,status:i?`error`:`completed`,arguments:n?.arguments??e.arguments,startedAt:n?.startedAt??e.startedAt,output:h(t.data,`output`,`content`,`result`,`message`)||``,finishedAt:g(t.data,`finishedAt`,`finished_at`)||t.timestamp,durationMs:g(t.data,`durationMs`,`duration_ms`)}),pendingApproval:r.pendingApproval?.toolCallId===e.id?void 0:r.pendingApproval}}else if(t.type===`approval`){let e=A(t.data);e&&(r=e.status===`pending`?{...r,pendingApproval:e}:r.pendingApproval?.approvalId===e.approvalId?{...r,pendingApproval:void 0}:r)}else if(t.type===`usage`)r={...r,usage:S(t.data,r.usage)};else if(t.type===`skill_loaded`){let e=C(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:h(t.data,`message`,`error`)||`The Work run stopped unexpectedly.`,finishedAt:g(t.data,`finishedAt`,`finished_at`)||t.timestamp,terminal:t.data.terminal!==!1,pendingApproval:void 0};else if(t.type===`done`){let e=_(t.data.status??t.data.state??t.data.phase,`completed`);r={...r,phase:e,error:h(t.data,`error`,`message`)??r.error,usage:m(t.data.usage)?S(t.data,r.usage):r.usage,finishedAt:g(t.data,`finishedAt`,`finished_at`)||t.timestamp,terminal:!0,budgetReason:h(t.data,`budgetReason`,`budget_reason`)??r.budgetReason,loopStats:k(t.data.loopStats)??r.loopStats,pendingApproval:void 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},te=e=>typeof e==`object`&&!!e&&`response`in e&&e.response?.status===409,ne=2500,re=24,P=new Map,F=e=>[...e].sort((e,t)=>t.updatedAt-e.updatedAt||t.createdAt-e.createdAt||e.id.localeCompare(t.id)),ie=({messages:e,messageCursor:t,hasMoreMessages:n,...r})=>r,I=(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))},L=(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:I(e.messages,t.messages),messageCursor:a?t.messageCursor:e.messageCursor,hasMoreMessages:a?t.hasMoreMessages:e.hasMoreMessages}},R=(e,t)=>{let n=e.find(e=>e.id===t.id);if(n&&n.updatedAt>t.updatedAt)return e;let r=ie(t),i=e.findIndex(e=>e.id===t.id);if(i===-1)return[r,...e];let a=[...e];return a[i]=r,a},ae=(e,t)=>{let n=new Map(t.map(e=>[e.id,e])),r=new Set(e.map(e=>e.id)),i=F(t.filter(e=>!r.has(e.id))),a=e.flatMap(e=>{let t=n.get(e.id);if(!t)return[];let r=e.updatedAt>t.updatedAt?e:t,i=Math.max(e.lastSeenAt??0,t.lastSeenAt??0);return[i>0?{...r,lastSeenAt:i}:r]});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)})},D=(t,n,r)=>{v(n)&&C(t)&&e({error:r})},O=(t,r=n,i=!1)=>{v(r)&&(i&&(o+=1),e(e=>({tasks:R(e.tasks,t),selectedTask:e.selectedTaskId===t.id?L(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 O(n.data,i,!0),n.data}catch(e){let n=N(e,t);throw D(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=F(t.data);if(l<=a||d!==o)return;a=l,e(e=>{let t=ae(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 O(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:I(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),markTaskSeen:t=>{let n=Date.now();e(e=>({tasks:e.tasks.map(e=>e.id===t?{...e,lastSeenAt:n}:e),selectedTask:e.selectedTask?.id===t?{...e.selectedTask,lastSeenAt:n}:e.selectedTask})),u.markTaskSeen(t).catch(()=>void 0)},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 D(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 O(n.data,r,!0),n.data}catch(t){let n=N(t,`Could not start the Work run.`);throw D(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?(O(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 D(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}:E(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]=ee(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=R(r,o),e.selectedTaskId===o.id&&(i=L(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&&(P.delete(r),e({files:n.data})),n.data}catch(n){let s=o===l&&v(a)&&t().selectedTaskId===r;if(te(n)){let e=P.get(r)??0;return s&&e<re&&(P.set(r,e+1),setTimeout(()=>{o===l&&v(a)&&t().selectedTaskId===r&&t().loadFiles(r,i).catch(()=>void 0)},ne)),t().files}let c=N(n,`Could not load workspace files.`);throw s&&e({error:c}),Error(c)}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 D(r,s,t),Error(t)}finally{T(c,s)}},startPreview:(e,t,n)=>k(()=>u.startPreview(e,t,n),`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})}}}),oe=async(e,t,n)=>{let r=await t(e);return r.success&&await n(),r},B=n(`store:plugin-store`),V=a((e,t)=>({plugins:[],pluginStatus:[],pluginVariables:{},isLoading:!1,isUploading:!1,error:null,loadPlugins:async()=>{e({isLoading:!0,error:null});try{let t=await c.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 c.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 c.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 c.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 c.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 oe(n,c.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 c.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 c.getPluginStatus();t.success&&t.data&&e({pluginStatus:t.data})}catch(e){B.error(`Failed to load plugin status:`,e)}},exportPlugin:async t=>{e({isLoading:!0,error:null});try{let e=await c.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 c.getVariables(t);n.success&&n.data&&e(e=>({pluginVariables:{...e.pluginVariables,[t]:n.data}}))}catch(e){B.error(`Failed to fetch plugin variables:`,e)}},updatePluginVariables:async(e,n,r=[])=>{try{return(await c.setVariables(e,n,r)).success?(await t().fetchPluginVariables(e),!0):!1}catch(e){return B.error(`Failed to update plugin variables:`,e),!1}},resetPluginVariables:async t=>{try{let n=await c.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 B.error(`Failed to reset plugin variables:`,e),!1}},clearError:()=>e({error:null}),setError:t=>e({error:t})})),H=`libre-webui:work-draft:`,U=(e,t)=>`${H}${e}:${t}`,se=(e,t)=>{try{let n=window.sessionStorage.getItem(U(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}},ce=(e,t,n)=>{try{return window.sessionStorage.setItem(U(e,t),JSON.stringify(n)),!0}catch{return!1}},W=(e,t)=>{try{window.sessionStorage.removeItem(U(e,t))}catch{}},le=e=>{let t=`${H}${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(H)&&window.sessionStorage.removeItem(t)}}catch{}},ue=`/ws/work-terminal`,de=`/ws/work-screen`,fe=`/ws/work-audio`;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 pe(e){return q(K(e,`VITE_WS_BASE_URL`,[`ws:`,`wss:`]).toString())}function me(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 pe(t);if(e.protocol===`file:`)return`ws://localhost:3001`;let n=e.apiBaseUrl?.trim();return n?me(n):`${e.protocol===`https:`?`wss:`:`ws:`}//${e.host}`}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 he(e,t){return Y(`/ws`,t,{ticket:e})}function ge(e,t,n){return Y(de,n,{taskId:e,ticket:t})}function _e(e,t,n){return Y(fe,n,{taskId:e,ticket:t})}function ve(e,t,n){return Y(ue,n,{taskId:e,ticket:t})}var X=n(`websocket`),Z=e=>{if(e instanceof Error&&e.message===`Session expired`)return!0;let t=e?.response?.status;return t===401||t===403},Q=new class{ws=null;urlEnvironment;reconnectAttempts=0;reconnectDelay=1e3;maxReconnectDelay=3e4;reconnectTimer=null;messageHandlers=new Map;connectPromise=null;shouldReconnect=!1;connectionEpoch=0;constructor(){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(e())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.clearReconnectTimer(),this.shouldReconnect=!0;let t=++this.connectionEpoch,n=this.openWithTicket(t).catch(e=>{if(this.shouldReconnect&&t===this.connectionEpoch)throw Z(e)?(this.shouldReconnect=!1,this.clearReconnectTimer()):this.attemptReconnect(t),e}).finally(()=>{this.connectPromise===n&&(this.connectPromise=null)});return this.connectPromise=n,n}async openWithTicket(e){let t=(await s.post(`/auth/websocket-ticket`,{audience:`chat`})).data.data?.ticket;if(!t)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((n,r)=>{try{let i=he(t,this.urlEnvironment);X.debug(`WebSocket: Connecting with a one-use ticket`);let a=new WebSocket(i),o=!1;this.ws=a,a.onopen=()=>{if(!this.shouldReconnect||e!==this.connectionEpoch){a.close(),n();return}X.debug(`WebSocket connected successfully`),o=!0,this.reconnectAttempts=0,this.clearReconnectTimer(),n()},a.onmessage=t=>{if(this.shouldReconnect&&e===this.connectionEpoch)try{let e=JSON.parse(t.data),n=this.messageHandlers.get(e.type);n?n(e.data):e.type===`connected`?X.debug(`WebSocket: Server confirmed connection`):X.warn(`WebSocket: No handler for message type:`,e.type)}catch(e){X.error(`Failed to parse WebSocket message:`,e)}},a.onclose=()=>{if(X.debug(`WebSocket disconnected`),this.ws===a&&(this.ws=null),e!==this.connectionEpoch){n();return}o?this.shouldReconnect&&this.attemptReconnect(e):r(Error(`WebSocket closed before opening`))},a.onerror=t=>{if(e!==this.connectionEpoch){n();return}X.error(`WebSocket error:`,t),r(t)}}catch(e){r(e)}})}disconnect(){this.shouldReconnect=!1,this.connectionEpoch+=1,this.clearReconnectTimer(),this.reconnectAttempts=0,this.connectPromise=null;let e=this.ws;e&&(this.ws=null,e.readyState!==WebSocket.CONNECTING&&e.close())}reconnect(){return this.disconnect(),this.connect()}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)}clearReconnectTimer(){this.reconnectTimer!==null&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null}attemptReconnect(t){if(e()||!this.shouldReconnect||t!==this.connectionEpoch||this.reconnectTimer!==null)return;let n=Math.min(this.reconnectDelay*2**this.reconnectAttempts,this.maxReconnectDelay);this.reconnectAttempts=Math.min(this.reconnectAttempts+1,5),X.debug(`Reconnecting WebSocket in ${n}ms`),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.shouldReconnect&&t===this.connectionEpoch&&this.connect().catch(()=>{})},n)}get isConnected(){return this.ws?.readyState===WebSocket.OPEN}},$=n(`auth-store`),ye=a()(o((n,i)=>({user:null,token:null,systemInfo:null,workAccess:null,isAuthenticated:!1,isLoading:!1,login:(t,a,o)=>{let s=i().user?.id===t.id;localStorage.setItem(`auth-token`,a);let c=r.getState();c.clearAllState&&c.clearAllState(),z.getState().clearAllState(),s||(G(),d.getState().clearUserState()),n({user:t,token:a,systemInfo:o,isAuthenticated:!0,isLoading:!1}),setTimeout(async()=>{try{let t=V.getState();$.debug(`Reinitializing app after login...`),$.debug(`Reconnecting WebSocket with auth token...`);try{await Q.reconnect()}catch(e){$.warn(`WebSocket reconnect after login failed; continuing app initialization:`,e)}try{!(await l.checkHealth()).success&&!e()&&$.warn(`Ollama service not available after login`)}catch(e){$.warn(`Ollama health check failed after login; continuing provider initialization:`,e)}let n=d.getState();await Promise.all([c.loadModels(),c.loadSessions(),c.loadPreferences(),n.loadPreferences(),t.loadPlugins(),i().refreshWorkAccess()]),$.debug(`Reinitialized app after login`)}catch(e){$.error(`Failed to reinitialize app after login:`,e)}},100)},logout:()=>{localStorage.removeItem(`auth-token`),$.debug(`Disconnecting WebSocket on logout...`),Q.disconnect();let e=r.getState();e.clearAllState&&e.clearAllState(),z.getState().clearAllState(),G(),d.getState().clearUserState(),n({user:null,token:null,workAccess:null,isAuthenticated:!1,isLoading:!1})},setUser:e=>{n({user:e})},setSystemInfo:e=>{n({systemInfo:e})},setLoading:e=>{n({isLoading:e})},isAdmin:()=>{let{user:e}=i();return e?.role===`admin`},requiresAuth:()=>{let{systemInfo:e}=i();return e?.requiresAuth??!1},canUseWork:()=>{let{systemInfo:e,user:t,workAccess:n}=i();return e?.requiresAuth===!1||t?.role===`admin`||n?.allowed===!0},canUseAgents:()=>{let{systemInfo:e,user:t}=i();return e?.agentsEnabled===!0?e?.requiresAuth===!1||t?.role===`admin`:!1},canUseCordis:()=>{let{systemInfo:e,user:t}=i();return e?.cordisEnabled===!0?e?.requiresAuth===!1||t?.role===`admin`:!1},refreshWorkAccess:async()=>{try{let{workApi:e}=await t(async()=>{let{workApi:e}=await import(`./workApi-BIS9RxRi.js`);return{workApi:e}},__vite__mapDeps([0,1,2,3,4])),r=await e.access();r.success&&r.data&&n({workAccess:r.data})}catch(e){$.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{ve as a,se as c,z as d,k as f,ge as i,ce as l,Q as n,W as o,_e as r,le as s,ye as t,V as u};
4
+ `,m=e=>e&&typeof e==`object`&&!Array.isArray(e)?e:void 0,h=(e,...t)=>{for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t}},g=(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}},_=(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},v=(e,t)=>{let n=h(t,`total`);if(n!==void 0)return y(n);let r=h(t,`text`,`content`,`delta`,`reasoning`)||``;return t.replace===!0||t.cumulative===!0?y(r):y(e+r)},y=e=>{let t=e.startsWith(p),n=t?e.slice(31):e;return!t&&n.length<=f?n:t&&n.length<=99969?p+n:p+n.slice(-99969)},b=(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:y(a.text+i)}]:[...e,{kind:t,text:y(i)}]}return[...e.filter(e=>e.kind!==t),{kind:t,text:r}]},x=(e,t)=>e.some(e=>e.kind===`tool`&&e.toolId===t)?e:[...e,{kind:`tool`,toolId:t}],S=(e,t)=>{let n=m(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=g(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},C=(e,t)=>{let n=m(e.skill)||e,r=h(n,`name`,`title`,`skill`)||`Skill`;return{id:h(n,`id`,`skillId`,`skill_id`)||`${r}-${t}`,name:r,description:h(n,`description`,`summary`)}},w=(e,t,n)=>{let r=m(e.tool)||e,i=m(r.message),a=i?m(i.metadata):void 0,o=a?{...a,...r}:r,s=h(o,`name`,`toolName`,`tool_name`,`function`)||`tool`;return{id:h(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:m(o.metadata)||a,startedAt:g(o,`startedAt`,`started_at`,`timestamp`)||t}},T=(e,t)=>Array.isArray(e)?e.flatMap((e,n)=>{let r=m(e);if(!r)return[];let i=w(r,t,n),a=h(r,`output`,`content`,`result`),o=_(r.status,`using_tool`);return[{...i,status:r.isError===!0||r.is_error===!0?`error`:o===`completed`?`completed`:i.status,output:a,finishedAt:g(r,`finishedAt`,`finished_at`),durationMs:g(r,`durationMs`,`duration_ms`)}]}):[],E=(e,t,n)=>({taskId:e,runId:t,connection:`idle`,phase:`queued`,lastEventId:0,reasoning:``,response:``,timeline:[],tools:[],skills:[],startedAt:n,terminal:!1}),D=(e,t)=>{let n=m(t.data.liveRun)||m(t.data.live_run)||m(t.data.run)||t.data,r=m(t.data.task)||m(t.data.detail),i=r?m(r.activeRun):void 0,a=h(n,`reasoning`,`thinking`),o=h(n,`response`,`assistant`,`content`),s=_(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=T(n.tools??n.toolActivities??n.tool_activities,t.timestamp),u=n.skills,d=Array.isArray(u)?u.flatMap((e,t)=>{let n=m(e);return n?[C(n,t)]:[]}):e.skills,f=n.terminal===!0||c===`completed`||c===`needs_input`||c===`failed`||c===`cancelled`,p=a===void 0?e.reasoning:y(a),v=o===void 0?e.response:y(o),w=l.length>0?l:e.tools,E=b(e.timeline,`reasoning`,e.reasoning,p);for(let e of w)E=x(E,e.id);return E=b(E,`response`,e.response,v),{...e,phase:c,reasoning:p,response:v,timeline:E,tools:w,skills:d,usage:m(n.usage)?S(n,e.usage):e.usage,round:g(n,`round`,`roundIndex`,`round_index`)??e.round,roundLimit:g(n,`roundLimit`,`round_limit`)??e.roundLimit,startedAt:g(n,`startedAt`,`started_at`)??(i?g(i,`startedAt`,`started_at`):void 0)??e.startedAt,finishedAt:g(n,`finishedAt`,`finished_at`)??e.finishedAt,error:h(n,`error`,`message`)??e.error,terminal:f,budgetReason:h(n,`budgetReason`,`budget_reason`)??e.budgetReason,loopStats:k(n.loopStats)??e.loopStats,pendingApproval:f?void 0:m(n.pendingApproval??n.pending_approval)?A(m(n.pendingApproval??n.pending_approval)??{}):e.pendingApproval}},O=[`rounds`,`toolCalls`,`screenshots`,`fences`,`expectationsPassed`,`expectationsPending`,`stallNudges`,`ambiguityNudges`],k=e=>{let t=m(e);if(!t)return;let n={};for(let e of O){let r=t[e];typeof r==`number`&&Number.isFinite(r)&&(n[e]=r)}return Object.keys(n).length>0?n:void 0},A=e=>{let t=h(e,`approvalId`,`approval_id`),n=h(e,`toolCallId`,`tool_call_id`),r=h(e,`name`,`toolName`,`tool_name`);if(!t||!n||!r)return;let i=h(e,`status`);return{approvalId:t,toolCallId:n,name:r,summary:m(e.summary),status:i===`approved`||i===`denied`||i===`expired`?i:`pending`,expiresAt:g(e,`expiresAt`,`expires_at`)}},j=(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},ee=(e,t)=>{let n=e?.taskId===t.taskId&&e.runId===t.runId?e:E(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=D(r,t);else if(t.type===`run_state`){let e=_(t.data.phase??t.data.status??t.data.state,r.phase);r={...r,phase:e,round:g(t.data,`round`,`roundIndex`,`round_index`)??r.round,roundLimit:g(t.data,`roundLimit`,`round_limit`)??r.roundLimit,startedAt:g(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=v(r.reasoning,t.data);r={...r,phase:`thinking`,reasoning:e,timeline:b(r.timeline,`reasoning`,r.reasoning,e)}}else if(t.type===`assistant_delta`){let e=v(r.response,t.data);r={...r,phase:`responding`,response:e,timeline:b(r.timeline,`response`,r.response,e)}}else if(t.type===`tool_call`){let e=w(t.data,t.timestamp,r.tools.length);r={...r,phase:`using_tool`,tools:j(r.tools,e),timeline:x(r.timeline,e.id)}}else if(t.type===`tool_result`){let e=w(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:j(r.tools,{...n,...e,status:i?`error`:`completed`,arguments:n?.arguments??e.arguments,startedAt:n?.startedAt??e.startedAt,output:h(t.data,`output`,`content`,`result`,`message`)||``,finishedAt:g(t.data,`finishedAt`,`finished_at`)||t.timestamp,durationMs:g(t.data,`durationMs`,`duration_ms`)}),pendingApproval:r.pendingApproval?.toolCallId===e.id?void 0:r.pendingApproval}}else if(t.type===`approval`){let e=A(t.data);e&&(r=e.status===`pending`?{...r,pendingApproval:e}:r.pendingApproval?.approvalId===e.approvalId?{...r,pendingApproval:void 0}:r)}else if(t.type===`usage`)r={...r,usage:S(t.data,r.usage)};else if(t.type===`skill_loaded`){let e=C(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:h(t.data,`message`,`error`)||`The Work run stopped unexpectedly.`,finishedAt:g(t.data,`finishedAt`,`finished_at`)||t.timestamp,terminal:t.data.terminal!==!1,pendingApproval:void 0};else if(t.type===`done`){let e=_(t.data.status??t.data.state??t.data.phase,`completed`);r={...r,phase:e,error:h(t.data,`error`,`message`)??r.error,usage:m(t.data.usage)?S(t.data,r.usage):r.usage,finishedAt:g(t.data,`finishedAt`,`finished_at`)||t.timestamp,terminal:!0,budgetReason:h(t.data,`budgetReason`,`budget_reason`)??r.budgetReason,loopStats:k(t.data.loopStats)??r.loopStats,pendingApproval:void 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},te=e=>typeof e==`object`&&!!e&&`response`in e&&e.response?.status===409,ne=2500,re=24,P=new Map,F=e=>[...e].sort((e,t)=>t.updatedAt-e.updatedAt||t.createdAt-e.createdAt||e.id.localeCompare(t.id)),ie=({messages:e,messageCursor:t,hasMoreMessages:n,...r})=>r,I=(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))},L=(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:I(e.messages,t.messages),messageCursor:a?t.messageCursor:e.messageCursor,hasMoreMessages:a?t.hasMoreMessages:e.hasMoreMessages}},R=(e,t)=>{let n=e.find(e=>e.id===t.id);if(n&&n.updatedAt>t.updatedAt)return e;let r=ie(t),i=e.findIndex(e=>e.id===t.id);if(i===-1)return[r,...e];let a=[...e];return a[i]=r,a},ae=(e,t)=>{let n=new Map(t.map(e=>[e.id,e])),r=new Set(e.map(e=>e.id)),i=F(t.filter(e=>!r.has(e.id))),a=e.flatMap(e=>{let t=n.get(e.id);if(!t)return[];let r=e.updatedAt>t.updatedAt?e:t,i=Math.max(e.lastSeenAt??0,t.lastSeenAt??0);return[i>0?{...r,lastSeenAt:i}:r]});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)})},D=(t,n,r)=>{v(n)&&C(t)&&e({error:r})},O=(t,r=n,i=!1)=>{v(r)&&(i&&(o+=1),e(e=>({tasks:R(e.tasks,t),selectedTask:e.selectedTaskId===t.id?L(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 O(n.data,i,!0),n.data}catch(e){let n=N(e,t);throw D(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=F(t.data);if(l<=a||d!==o)return;a=l,e(e=>{let t=ae(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 O(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:I(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),markTaskSeen:t=>{let n=Date.now();e(e=>({tasks:e.tasks.map(e=>e.id===t?{...e,lastSeenAt:n}:e),selectedTask:e.selectedTask?.id===t?{...e.selectedTask,lastSeenAt:n}:e.selectedTask})),u.markTaskSeen(t).catch(()=>void 0)},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 D(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 O(n.data,r,!0),n.data}catch(t){let n=N(t,`Could not start the Work run.`);throw D(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?(O(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 D(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}:E(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]=ee(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=R(r,o),e.selectedTaskId===o.id&&(i=L(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&&(P.delete(r),e({files:n.data})),n.data}catch(n){let s=o===l&&v(a)&&t().selectedTaskId===r;if(te(n)){let e=P.get(r)??0;return s&&e<re&&(P.set(r,e+1),setTimeout(()=>{o===l&&v(a)&&t().selectedTaskId===r&&t().loadFiles(r,i).catch(()=>void 0)},ne)),t().files}let c=N(n,`Could not load workspace files.`);throw s&&e({error:c}),Error(c)}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 D(r,s,t),Error(t)}finally{T(c,s)}},startPreview:(e,t,n)=>k(()=>u.startPreview(e,t,n),`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})}}}),oe=async(e,t,n)=>{let r=await t(e);return r.success&&await n(),r},B=n(`store:plugin-store`),V=a((e,t)=>({plugins:[],pluginStatus:[],pluginVariables:{},isLoading:!1,isUploading:!1,error:null,loadPlugins:async()=>{e({isLoading:!0,error:null});try{let t=await c.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 c.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 c.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 c.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 c.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 oe(n,c.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 c.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 c.getPluginStatus();t.success&&t.data&&e({pluginStatus:t.data})}catch(e){B.error(`Failed to load plugin status:`,e)}},exportPlugin:async t=>{e({isLoading:!0,error:null});try{let e=await c.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 c.getVariables(t);n.success&&n.data&&e(e=>({pluginVariables:{...e.pluginVariables,[t]:n.data}}))}catch(e){B.error(`Failed to fetch plugin variables:`,e)}},updatePluginVariables:async(e,n,r=[])=>{try{return(await c.setVariables(e,n,r)).success?(await t().fetchPluginVariables(e),!0):!1}catch(e){return B.error(`Failed to update plugin variables:`,e),!1}},resetPluginVariables:async t=>{try{let n=await c.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 B.error(`Failed to reset plugin variables:`,e),!1}},clearError:()=>e({error:null}),setError:t=>e({error:t})})),H=`libre-webui:work-draft:`,U=(e,t)=>`${H}${e}:${t}`,se=(e,t)=>{try{let n=window.sessionStorage.getItem(U(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}},ce=(e,t,n)=>{try{return window.sessionStorage.setItem(U(e,t),JSON.stringify(n)),!0}catch{return!1}},W=(e,t)=>{try{window.sessionStorage.removeItem(U(e,t))}catch{}},le=e=>{let t=`${H}${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(H)&&window.sessionStorage.removeItem(t)}}catch{}},ue=`/ws/work-terminal`,de=`/ws/work-screen`,fe=`/ws/work-audio`;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 pe(e){return q(K(e,`VITE_WS_BASE_URL`,[`ws:`,`wss:`]).toString())}function me(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 pe(t);if(e.protocol===`file:`)return`ws://localhost:3001`;let n=e.apiBaseUrl?.trim();return n?me(n):`${e.protocol===`https:`?`wss:`:`ws:`}//${e.host}`}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 he(e,t){return Y(`/ws`,t,{ticket:e})}function ge(e,t,n){return Y(de,n,{taskId:e,ticket:t})}function _e(e,t,n){return Y(fe,n,{taskId:e,ticket:t})}function ve(e,t,n){return Y(ue,n,{taskId:e,ticket:t})}var X=n(`websocket`),Z=e=>{if(e instanceof Error&&e.message===`Session expired`)return!0;let t=e?.response?.status;return t===401||t===403},Q=new class{ws=null;urlEnvironment;reconnectAttempts=0;reconnectDelay=1e3;maxReconnectDelay=3e4;reconnectTimer=null;messageHandlers=new Map;connectPromise=null;shouldReconnect=!1;connectionEpoch=0;constructor(){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(e())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.clearReconnectTimer(),this.shouldReconnect=!0;let t=++this.connectionEpoch,n=this.openWithTicket(t).catch(e=>{if(this.shouldReconnect&&t===this.connectionEpoch)throw Z(e)?(this.shouldReconnect=!1,this.clearReconnectTimer()):this.attemptReconnect(t),e}).finally(()=>{this.connectPromise===n&&(this.connectPromise=null)});return this.connectPromise=n,n}async openWithTicket(e){let t=(await s.post(`/auth/websocket-ticket`,{audience:`chat`})).data.data?.ticket;if(!t)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((n,r)=>{try{let i=he(t,this.urlEnvironment);X.debug(`WebSocket: Connecting with a one-use ticket`);let a=new WebSocket(i),o=!1;this.ws=a,a.onopen=()=>{if(!this.shouldReconnect||e!==this.connectionEpoch){a.close(),n();return}X.debug(`WebSocket connected successfully`),o=!0,this.reconnectAttempts=0,this.clearReconnectTimer(),n()},a.onmessage=t=>{if(this.shouldReconnect&&e===this.connectionEpoch)try{let e=JSON.parse(t.data),n=this.messageHandlers.get(e.type);n?n(e.data):e.type===`connected`?X.debug(`WebSocket: Server confirmed connection`):X.warn(`WebSocket: No handler for message type:`,e.type)}catch(e){X.error(`Failed to parse WebSocket message:`,e)}},a.onclose=()=>{if(X.debug(`WebSocket disconnected`),this.ws===a&&(this.ws=null),e!==this.connectionEpoch){n();return}o?this.shouldReconnect&&this.attemptReconnect(e):r(Error(`WebSocket closed before opening`))},a.onerror=t=>{if(e!==this.connectionEpoch){n();return}X.error(`WebSocket error:`,t),r(t)}}catch(e){r(e)}})}disconnect(){this.shouldReconnect=!1,this.connectionEpoch+=1,this.clearReconnectTimer(),this.reconnectAttempts=0,this.connectPromise=null;let e=this.ws;e&&(this.ws=null,e.readyState!==WebSocket.CONNECTING&&e.close())}reconnect(){return this.disconnect(),this.connect()}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)}clearReconnectTimer(){this.reconnectTimer!==null&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null}attemptReconnect(t){if(e()||!this.shouldReconnect||t!==this.connectionEpoch||this.reconnectTimer!==null)return;let n=Math.min(this.reconnectDelay*2**this.reconnectAttempts,this.maxReconnectDelay);this.reconnectAttempts=Math.min(this.reconnectAttempts+1,5),X.debug(`Reconnecting WebSocket in ${n}ms`),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.shouldReconnect&&t===this.connectionEpoch&&this.connect().catch(()=>{})},n)}get isConnected(){return this.ws?.readyState===WebSocket.OPEN}},$=n(`auth-store`),ye=a()(o((n,i)=>({user:null,token:null,systemInfo:null,workAccess:null,isAuthenticated:!1,isLoading:!1,login:(t,a,o)=>{let s=i().user?.id===t.id;localStorage.setItem(`auth-token`,a);let c=r.getState();c.clearAllState&&c.clearAllState(),z.getState().clearAllState(),s||(G(),d.getState().clearUserState()),n({user:t,token:a,systemInfo:o,isAuthenticated:!0,isLoading:!1}),setTimeout(async()=>{try{let t=V.getState();$.debug(`Reinitializing app after login...`),$.debug(`Reconnecting WebSocket with auth token...`);try{await Q.reconnect()}catch(e){$.warn(`WebSocket reconnect after login failed; continuing app initialization:`,e)}try{!(await l.checkHealth()).success&&!e()&&$.warn(`Ollama service not available after login`)}catch(e){$.warn(`Ollama health check failed after login; continuing provider initialization:`,e)}let n=d.getState();await Promise.all([c.loadModels(),c.loadSessions(),c.loadPreferences(),n.loadPreferences(),t.loadPlugins(),i().refreshWorkAccess()]),$.debug(`Reinitialized app after login`)}catch(e){$.error(`Failed to reinitialize app after login:`,e)}},100)},logout:()=>{localStorage.removeItem(`auth-token`),$.debug(`Disconnecting WebSocket on logout...`),Q.disconnect();let e=r.getState();e.clearAllState&&e.clearAllState(),z.getState().clearAllState(),G(),d.getState().clearUserState(),n({user:null,token:null,workAccess:null,isAuthenticated:!1,isLoading:!1})},setUser:e=>{n({user:e})},setSystemInfo:e=>{n({systemInfo:e})},setLoading:e=>{n({isLoading:e})},isAdmin:()=>{let{user:e}=i();return e?.role===`admin`},requiresAuth:()=>{let{systemInfo:e}=i();return e?.requiresAuth??!1},canUseWork:()=>{let{systemInfo:e,user:t,workAccess:n}=i();return e?.requiresAuth===!1||t?.role===`admin`||n?.allowed===!0},canUseAgents:()=>{let{systemInfo:e,user:t}=i();return e?.agentsEnabled===!0?e?.requiresAuth===!1||t?.role===`admin`:!1},canUseCordis:()=>{let{systemInfo:e,user:t}=i();return e?.cordisEnabled===!0?e?.requiresAuth===!1||t?.role===`admin`:!1},refreshWorkAccess:async()=>{try{let{workApi:e}=await t(async()=>{let{workApi:e}=await import(`./workApi-FV75LKJn.js`);return{workApi:e}},__vite__mapDeps([0,1,2,3,4])),r=await e.access();r.success&&r.data&&n({workAccess:r.data})}catch(e){$.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{ve as a,se as c,z as d,k as f,ge as i,ce as l,Q as n,W as o,_e as r,le as s,ye as t,V as u};
@@ -0,0 +1 @@
1
+ import{t as e}from"./authStore-D8fc-Hl0.js";export{e as useAuthStore};