libre-webui 0.29.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/backend/dist/persistence/postgresAutomationWebhooksMigration.d.ts +9 -0
  2. package/backend/dist/persistence/postgresAutomationWebhooksMigration.d.ts.map +1 -0
  3. package/backend/dist/persistence/postgresAutomationWebhooksMigration.js +38 -0
  4. package/backend/dist/persistence/postgresAutomationWebhooksMigration.js.map +1 -0
  5. package/backend/dist/persistence/postgresMigrationRegistry.d.ts.map +1 -1
  6. package/backend/dist/persistence/postgresMigrationRegistry.js +4 -0
  7. package/backend/dist/persistence/postgresMigrationRegistry.js.map +1 -1
  8. package/backend/dist/persistence/postgresResourceRepositories.d.ts.map +1 -1
  9. package/backend/dist/persistence/postgresResourceRepositories.js +5 -0
  10. package/backend/dist/persistence/postgresResourceRepositories.js.map +1 -1
  11. package/backend/dist/persistence/postgresWorkApprovalsMigration.d.ts +13 -0
  12. package/backend/dist/persistence/postgresWorkApprovalsMigration.d.ts.map +1 -0
  13. package/backend/dist/persistence/postgresWorkApprovalsMigration.js +69 -0
  14. package/backend/dist/persistence/postgresWorkApprovalsMigration.js.map +1 -0
  15. package/backend/dist/persistence/resourceTypes.d.ts +4 -0
  16. package/backend/dist/persistence/resourceTypes.d.ts.map +1 -1
  17. package/backend/dist/persistence/resourceTypes.js.map +1 -1
  18. package/backend/dist/persistence/sqliteMigrations.d.ts +3 -0
  19. package/backend/dist/persistence/sqliteMigrations.d.ts.map +1 -1
  20. package/backend/dist/persistence/sqliteMigrations.js +149 -0
  21. package/backend/dist/persistence/sqliteMigrations.js.map +1 -1
  22. package/backend/dist/persistence/sqliteResourceRepositories.d.ts.map +1 -1
  23. package/backend/dist/persistence/sqliteResourceRepositories.js +7 -0
  24. package/backend/dist/persistence/sqliteResourceRepositories.js.map +1 -1
  25. package/backend/dist/persistence/sqliteToPostgresMigration.d.ts.map +1 -1
  26. package/backend/dist/persistence/sqliteToPostgresMigration.js +32 -1
  27. package/backend/dist/persistence/sqliteToPostgresMigration.js.map +1 -1
  28. package/backend/dist/platform/workPersistence/postgresWorkPersistence.d.ts +10 -1
  29. package/backend/dist/platform/workPersistence/postgresWorkPersistence.d.ts.map +1 -1
  30. package/backend/dist/platform/workPersistence/postgresWorkPersistence.js +85 -5
  31. package/backend/dist/platform/workPersistence/postgresWorkPersistence.js.map +1 -1
  32. package/backend/dist/platform/workPersistence/sqliteWorkPersistence.d.ts +10 -1
  33. package/backend/dist/platform/workPersistence/sqliteWorkPersistence.d.ts.map +1 -1
  34. package/backend/dist/platform/workPersistence/sqliteWorkPersistence.js +67 -7
  35. package/backend/dist/platform/workPersistence/sqliteWorkPersistence.js.map +1 -1
  36. package/backend/dist/platform/workPersistence/types.d.ts +37 -0
  37. package/backend/dist/platform/workPersistence/types.d.ts.map +1 -1
  38. package/backend/dist/platform/workPersistence/types.js.map +1 -1
  39. package/backend/dist/routes/automations.d.ts.map +1 -1
  40. package/backend/dist/routes/automations.js +83 -1
  41. package/backend/dist/routes/automations.js.map +1 -1
  42. package/backend/dist/routes/work.d.ts.map +1 -1
  43. package/backend/dist/routes/work.js +72 -0
  44. package/backend/dist/routes/work.js.map +1 -1
  45. package/backend/dist/services/automationService.d.ts +13 -1
  46. package/backend/dist/services/automationService.d.ts.map +1 -1
  47. package/backend/dist/services/automationService.js +31 -0
  48. package/backend/dist/services/automationService.js.map +1 -1
  49. package/backend/dist/services/notificationService.d.ts.map +1 -1
  50. package/backend/dist/services/notificationService.js +1 -0
  51. package/backend/dist/services/notificationService.js.map +1 -1
  52. package/backend/dist/services/workAgentGuidance.d.ts +11 -0
  53. package/backend/dist/services/workAgentGuidance.d.ts.map +1 -1
  54. package/backend/dist/services/workAgentGuidance.js +16 -2
  55. package/backend/dist/services/workAgentGuidance.js.map +1 -1
  56. package/backend/dist/services/workAgentService.d.ts +55 -0
  57. package/backend/dist/services/workAgentService.d.ts.map +1 -1
  58. package/backend/dist/services/workAgentService.js +425 -13
  59. package/backend/dist/services/workAgentService.js.map +1 -1
  60. package/backend/dist/services/workApprovalService.d.ts +67 -0
  61. package/backend/dist/services/workApprovalService.d.ts.map +1 -0
  62. package/backend/dist/services/workApprovalService.js +273 -0
  63. package/backend/dist/services/workApprovalService.js.map +1 -0
  64. package/backend/dist/services/workEventService.d.ts.map +1 -1
  65. package/backend/dist/services/workEventService.js +25 -0
  66. package/backend/dist/services/workEventService.js.map +1 -1
  67. package/backend/dist/services/workPolicyService.d.ts +4 -0
  68. package/backend/dist/services/workPolicyService.d.ts.map +1 -1
  69. package/backend/dist/services/workPolicyService.js +19 -0
  70. package/backend/dist/services/workPolicyService.js.map +1 -1
  71. package/backend/dist/services/workRuntimeShared.d.ts +2 -0
  72. package/backend/dist/services/workRuntimeShared.d.ts.map +1 -1
  73. package/backend/dist/services/workRuntimeShared.js.map +1 -1
  74. package/backend/dist/services/workTaskService.d.ts +3 -1
  75. package/backend/dist/services/workTaskService.d.ts.map +1 -1
  76. package/backend/dist/services/workTaskService.js +21 -4
  77. package/backend/dist/services/workTaskService.js.map +1 -1
  78. package/backend/dist/types/index.d.ts +3 -1
  79. package/backend/dist/types/index.d.ts.map +1 -1
  80. package/backend/dist/types/index.js.map +1 -1
  81. package/backend/dist/types/work.d.ts +32 -11
  82. package/backend/dist/types/work.d.ts.map +1 -1
  83. package/backend/package.json +1 -1
  84. package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
  85. package/frontend/dist/assets/{index-f1s6QpC5.js → index-C04eLDsy.js} +63 -78
  86. package/frontend/dist/index.html +15 -15
  87. package/frontend/dist/js/{ArtifactContainer-CTXxnWRo.js → ArtifactContainer-ivbLUiBh.js} +1 -1
  88. package/frontend/dist/js/{ArtifactDemoPage-CEYuIhJA.js → ArtifactDemoPage-BmOteTzj.js} +1 -1
  89. package/frontend/dist/js/{ArtifactSandboxFrame-DLOy2VOm.js → ArtifactSandboxFrame-CFIXhQGP.js} +1 -1
  90. package/frontend/dist/js/{ArtifactSlideOutPanel-DnTTc1VY.js → ArtifactSlideOutPanel-DTGX1bsD.js} +1 -1
  91. package/frontend/dist/js/AutomationModal-DWjiyu3B.js +1 -0
  92. package/frontend/dist/js/{AutomationsPage-D3v0Cra1.js → AutomationsPage-DA9uLEG2.js} +1 -1
  93. package/frontend/dist/js/{AvatarUpload-DzL00yOL.js → AvatarUpload-26z_BlGH.js} +1 -1
  94. package/frontend/dist/js/{CalendarPage-Bls3TBeZ.js → CalendarPage-CFU2zsFJ.js} +1 -1
  95. package/frontend/dist/js/{ChannelsPage-BnoCniNf.js → ChannelsPage-BqUJMmjD.js} +1 -1
  96. package/frontend/dist/js/ChatPage-D8I4CNtg.js +14 -0
  97. package/frontend/dist/js/{EvaluationsPage-DSgj9dT5.js → EvaluationsPage-jmb_F4xz.js} +1 -1
  98. package/frontend/dist/js/{FirstTimeSetup-BRysXCjP.js → FirstTimeSetup-DcOvjDh4.js} +1 -1
  99. package/frontend/dist/js/{GalleryPage-DUcM4dg0.js → GalleryPage-CFYgjwey.js} +1 -1
  100. package/frontend/dist/js/{HomePage-BebX3v-x.js → HomePage-DDt6s4Ya.js} +1 -1
  101. package/frontend/dist/js/{LibreClawPage-A37KF9_G.js → LibreClawPage-BqtLshHp.js} +1 -1
  102. package/frontend/dist/js/{NotesPage-CXSz7Hde.js → NotesPage-wdPw2owK.js} +1 -1
  103. package/frontend/dist/js/{PersonasPage-CiOBffF3.js → PersonasPage-DMJ3MioQ.js} +1 -1
  104. package/frontend/dist/js/{PluginUsagePage-jMrpL2Jb.js → PluginUsagePage-Di_B_DJQ.js} +1 -1
  105. package/frontend/dist/js/RichMessageContent-S1-4RhLW.js +1 -0
  106. package/frontend/dist/js/{RichMessageContent-CC9QZQKd.js → RichMessageContent-wk0Eyab_.js} +1 -1
  107. package/frontend/dist/js/{SettingsModal-DP_wKehV.js → SettingsModal-d7I_FVJY.js} +1 -1
  108. package/frontend/dist/js/{ShareDialog-BW8iGd_i.js → ShareDialog-buTN0EBc.js} +1 -1
  109. package/frontend/dist/js/{SystemPage-Drd1neLN.js → SystemPage-CmgxjTS5.js} +1 -1
  110. package/frontend/dist/js/{UserManagementPage-CquciWKV.js → UserManagementPage-u2r5f_uX.js} +1 -1
  111. package/frontend/dist/js/WorkPage-CYth3I8M.js +7 -0
  112. package/frontend/dist/js/{api-2DulPtq1.js → api-IiXPQ8se.js} +2 -2
  113. package/frontend/dist/js/api-gEytqqET.js +1 -0
  114. package/frontend/dist/js/{appNavigation-DAGh98Yj.js → appNavigation-Bsk9DwFY.js} +1 -1
  115. package/frontend/dist/js/{appStore-Ci1X0yA-.js → appStore-D_3JwBEY.js} +2 -2
  116. package/frontend/dist/js/appVersion-Chg_Ru57.js +1 -0
  117. package/frontend/dist/js/{ar-CpmN0TY8.js → ar-BKsbznj2.js} +1 -1
  118. package/frontend/dist/js/authStore-BiWhwkJN.js +1 -0
  119. package/frontend/dist/js/authStore-jbmnSGyL.js +4 -0
  120. package/frontend/dist/js/{bn-BwrMg_Oh.js → bn-DXd4s3g6.js} +1 -1
  121. package/frontend/dist/js/{chatStore-DkpmZLOG.js → chatStore-BXWiKI6E.js} +3 -3
  122. package/frontend/dist/js/{config-Ckn9cand.js → config-CtVytjAm.js} +1 -1
  123. package/frontend/dist/js/cs-CtvHHZ6D.js +2 -0
  124. package/frontend/dist/js/da-CRCQinmr.js +2 -0
  125. package/frontend/dist/js/de-DKjz-eJm.js +2 -0
  126. package/frontend/dist/js/es-K0j99jVL.js +2 -0
  127. package/frontend/dist/js/{evaluationsApi-Cu5PH_qi.js → evaluationsApi-CNcvUpmS.js} +1 -1
  128. package/frontend/dist/js/{fr-BY5aUofi.js → fr-BcQtHFjN.js} +1 -1
  129. package/frontend/dist/js/{hi-KCn9gIiT.js → hi-B69aSfMV.js} +1 -1
  130. package/frontend/dist/js/id-DlEUyPF3.js +2 -0
  131. package/frontend/dist/js/is-DhIcxuEq.js +2 -0
  132. package/frontend/dist/js/{it-CqaqWB8D.js → it-BE6UfTtm.js} +1 -1
  133. package/frontend/dist/js/ja-BNmjqYW2.js +2 -0
  134. package/frontend/dist/js/ko-bnvJ-aG1.js +2 -0
  135. package/frontend/dist/js/{messageCodeStyles-DKq3DH1W.js → messageCodeStyles-D1-WsF_0.js} +1 -1
  136. package/frontend/dist/js/ms-BHlYr228.js +2 -0
  137. package/frontend/dist/js/nl-B0dJJcU_.js +2 -0
  138. package/frontend/dist/js/pl-BQQOCUBv.js +2 -0
  139. package/frontend/dist/js/pt-CeCixlV6.js +2 -0
  140. package/frontend/dist/js/ru-CtbW6bcV.js +2 -0
  141. package/frontend/dist/js/sv-DvyO144q.js +2 -0
  142. package/frontend/dist/js/{teamEventStream-C4u_py2D.js → teamEventStream-B8hMmTgC.js} +1 -1
  143. package/frontend/dist/js/{th-dOxm2Hhl.js → th-Bsila0Wp.js} +1 -1
  144. package/frontend/dist/js/tr-CJ9yyiQZ.js +2 -0
  145. package/frontend/dist/js/{ui-DUzqxWMk.js → ui-BxB90kIo.js} +2 -2
  146. package/frontend/dist/js/{uk-Cl7Pk0Yf.js → uk-BZnidh3w.js} +1 -1
  147. package/frontend/dist/js/{useChat-6yDWZSTz.js → useChat-CP1Bi10i.js} +1 -1
  148. package/frontend/dist/js/useDictation-DF16QY6J.js +1 -0
  149. package/frontend/dist/js/vi-DgnSoExN.js +2 -0
  150. package/frontend/dist/js/{workApi-BwDBwG62.js → workApi-BUxESSmH.js} +3 -3
  151. package/frontend/dist/js/workApi-DrTI8jZw.js +1 -0
  152. package/frontend/dist/js/zh-C3NMIgKz.js +2 -0
  153. package/package.json +3 -3
  154. package/frontend/dist/js/AutomationModal-DB3lrK2K.js +0 -1
  155. package/frontend/dist/js/ChatPage-BMcigJWr.js +0 -14
  156. package/frontend/dist/js/ModelSelector-C1ipX-44.js +0 -1
  157. package/frontend/dist/js/RichMessageContent-CU6WTuOs.js +0 -1
  158. package/frontend/dist/js/WorkPage-BgASwAGs.js +0 -6
  159. package/frontend/dist/js/api-BmIdrQfK.js +0 -1
  160. package/frontend/dist/js/appVersion-BRMnr50t.js +0 -1
  161. package/frontend/dist/js/authStore-DIvsSaOt.js +0 -4
  162. package/frontend/dist/js/authStore-DoxafXFR.js +0 -1
  163. package/frontend/dist/js/cs-f72Fnxz3.js +0 -2
  164. package/frontend/dist/js/da-qp8lOgkJ.js +0 -2
  165. package/frontend/dist/js/de-CpcLHr97.js +0 -2
  166. package/frontend/dist/js/es-gZHsxjG4.js +0 -2
  167. package/frontend/dist/js/id-C7U6kS0J.js +0 -2
  168. package/frontend/dist/js/is-N9Ek-Usz.js +0 -2
  169. package/frontend/dist/js/ja-C5f9HAm1.js +0 -2
  170. package/frontend/dist/js/ko-BuoboDvb.js +0 -2
  171. package/frontend/dist/js/ms-Cu-UWc6j.js +0 -2
  172. package/frontend/dist/js/nl-nOUc4C_i.js +0 -2
  173. package/frontend/dist/js/pl-BKKwFhxj.js +0 -2
  174. package/frontend/dist/js/pt-B18-KYtS.js +0 -2
  175. package/frontend/dist/js/ru-DflEWNyb.js +0 -2
  176. package/frontend/dist/js/sv-CU-nPjr8.js +0 -2
  177. package/frontend/dist/js/tr-7ThM4F8q.js +0 -2
  178. package/frontend/dist/js/vi-eljYUBOk.js +0 -2
  179. package/frontend/dist/js/workApi-uXUZSjsf.js +0 -1
  180. package/frontend/dist/js/zh-B0sinUfQ.js +0 -2
@@ -0,0 +1 @@
1
+ import{t as e}from"./authStore-jbmnSGyL.js";export{e as useAuthStore};
@@ -0,0 +1,4 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["js/workApi-DrTI8jZw.js","js/workApi-BUxESSmH.js","js/router-vendor-BGP0k6Y2.js","js/rolldown-runtime-hePW80VL.js","js/markdown-core-CsTEqgp1.js","js/utils-vendor-DtsgPwcz.js","js/logger-CpCQz3Vi.js","js/config-CtVytjAm.js"])))=>i.map(i=>d[i]);
2
+ import{a as e,g as t}from"./router-vendor-BGP0k6Y2.js";import{t as n,v as r}from"./chatStore-BXWiKI6E.js";import{a as i,t as a}from"./utils-vendor-DtsgPwcz.js";import{a as o,t as s}from"./logger-CpCQz3Vi.js";import{n as c,t as l}from"./workApi-BUxESSmH.js";import{u,y as d}from"./api-IiXPQ8se.js";import{t as f}from"./appStore-D_3JwBEY.js";var p=1e5,m=`[Earlier live output omitted]
3
+
4
+ `,h=e=>e&&typeof e==`object`&&!Array.isArray(e)?e:void 0,g=(e,...t)=>{for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t}},_=(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}},v=(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},y=(e,t)=>{let n=g(t,`total`);if(n!==void 0)return b(n);let r=g(t,`text`,`content`,`delta`,`reasoning`)||``;return t.replace===!0||t.cumulative===!0?b(r):b(e+r)},b=e=>{let t=e.startsWith(m),n=t?e.slice(31):e;return!t&&n.length<=p?n:t&&n.length<=99969?m+n:m+n.slice(-99969)},x=(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:b(a.text+i)}]:[...e,{kind:t,text:b(i)}]}return[...e.filter(e=>e.kind!==t),{kind:t,text:r}]},S=(e,t)=>e.some(e=>e.kind===`tool`&&e.toolId===t)?e:[...e,{kind:`tool`,toolId:t}],C=(e,t)=>{let n=h(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=_(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},w=(e,t)=>{let n=h(e.skill)||e,r=g(n,`name`,`title`,`skill`)||`Skill`;return{id:g(n,`id`,`skillId`,`skill_id`)||`${r}-${t}`,name:r,description:g(n,`description`,`summary`)}},T=(e,t,n)=>{let r=h(e.tool)||e,i=h(r.message),a=i?h(i.metadata):void 0,o=a?{...a,...r}:r,s=g(o,`name`,`toolName`,`tool_name`,`function`)||`tool`;return{id:g(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:h(o.metadata)||a,startedAt:_(o,`startedAt`,`started_at`,`timestamp`)||t}},E=(e,t)=>Array.isArray(e)?e.flatMap((e,n)=>{let r=h(e);if(!r)return[];let i=T(r,t,n),a=g(r,`output`,`content`,`result`),o=v(r.status,`using_tool`);return[{...i,status:r.isError===!0||r.is_error===!0?`error`:o===`completed`?`completed`:i.status,output:a,finishedAt:_(r,`finishedAt`,`finished_at`),durationMs:_(r,`durationMs`,`duration_ms`)}]}):[],D=(e,t,n)=>({taskId:e,runId:t,connection:`idle`,phase:`queued`,lastEventId:0,reasoning:``,response:``,timeline:[],tools:[],skills:[],startedAt:n,terminal:!1}),O=(e,t)=>{let n=h(t.data.liveRun)||h(t.data.live_run)||h(t.data.run)||t.data,r=h(t.data.task)||h(t.data.detail),i=r?h(r.activeRun):void 0,a=g(n,`reasoning`,`thinking`),o=g(n,`response`,`assistant`,`content`),s=v(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=E(n.tools??n.toolActivities??n.tool_activities,t.timestamp),u=n.skills,d=Array.isArray(u)?u.flatMap((e,t)=>{let n=h(e);return n?[w(n,t)]:[]}):e.skills,f=n.terminal===!0||c===`completed`||c===`needs_input`||c===`failed`||c===`cancelled`,p=a===void 0?e.reasoning:b(a),m=o===void 0?e.response:b(o),y=l.length>0?l:e.tools,T=x(e.timeline,`reasoning`,e.reasoning,p);for(let e of y)T=S(T,e.id);return T=x(T,`response`,e.response,m),{...e,phase:c,reasoning:p,response:m,timeline:T,tools:y,skills:d,usage:h(n.usage)?C(n,e.usage):e.usage,round:_(n,`round`,`roundIndex`,`round_index`)??e.round,roundLimit:_(n,`roundLimit`,`round_limit`)??e.roundLimit,startedAt:_(n,`startedAt`,`started_at`)??(i?_(i,`startedAt`,`started_at`):void 0)??e.startedAt,finishedAt:_(n,`finishedAt`,`finished_at`)??e.finishedAt,error:g(n,`error`,`message`)??e.error,terminal:f,budgetReason:g(n,`budgetReason`,`budget_reason`)??e.budgetReason,loopStats:A(n.loopStats)??e.loopStats,pendingApproval:f?void 0:h(n.pendingApproval??n.pending_approval)?j(h(n.pendingApproval??n.pending_approval)??{}):e.pendingApproval}},k=[`rounds`,`toolCalls`,`screenshots`,`fences`,`expectationsPassed`,`expectationsPending`,`stallNudges`,`ambiguityNudges`],A=e=>{let t=h(e);if(!t)return;let n={};for(let e of k){let r=t[e];typeof r==`number`&&Number.isFinite(r)&&(n[e]=r)}return Object.keys(n).length>0?n:void 0},j=e=>{let t=g(e,`approvalId`,`approval_id`),n=g(e,`toolCallId`,`tool_call_id`),r=g(e,`name`,`toolName`,`tool_name`);if(!t||!n||!r)return;let i=g(e,`status`);return{approvalId:t,toolCallId:n,name:r,summary:h(e.summary),status:i===`approved`||i===`denied`||i===`expired`?i:`pending`,expiresAt:_(e,`expiresAt`,`expires_at`)}},M=(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:D(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=O(r,t);else if(t.type===`run_state`){let e=v(t.data.phase??t.data.status??t.data.state,r.phase);r={...r,phase:e,round:_(t.data,`round`,`roundIndex`,`round_index`)??r.round,roundLimit:_(t.data,`roundLimit`,`round_limit`)??r.roundLimit,startedAt:_(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=y(r.reasoning,t.data);r={...r,phase:`thinking`,reasoning:e,timeline:x(r.timeline,`reasoning`,r.reasoning,e)}}else if(t.type===`assistant_delta`){let e=y(r.response,t.data);r={...r,phase:`responding`,response:e,timeline:x(r.timeline,`response`,r.response,e)}}else if(t.type===`tool_call`){let e=T(t.data,t.timestamp,r.tools.length);r={...r,phase:`using_tool`,tools:M(r.tools,e),timeline:S(r.timeline,e.id)}}else if(t.type===`tool_result`){let e=T(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:M(r.tools,{...n,...e,status:i?`error`:`completed`,arguments:n?.arguments??e.arguments,startedAt:n?.startedAt??e.startedAt,output:g(t.data,`output`,`content`,`result`,`message`)||``,finishedAt:_(t.data,`finishedAt`,`finished_at`)||t.timestamp,durationMs:_(t.data,`durationMs`,`duration_ms`)}),pendingApproval:r.pendingApproval?.toolCallId===e.id?void 0:r.pendingApproval}}else if(t.type===`approval`){let e=j(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:C(t.data,r.usage)};else if(t.type===`skill_loaded`){let e=w(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:g(t.data,`message`,`error`)||`The Work run stopped unexpectedly.`,finishedAt:_(t.data,`finishedAt`,`finished_at`)||t.timestamp,terminal:t.data.terminal!==!1,pendingApproval:void 0};else if(t.type===`done`){let e=v(t.data.status??t.data.state??t.data.phase,`completed`);r={...r,phase:e,error:g(t.data,`error`,`message`)??r.error,usage:h(t.data.usage)?C(t.data,r.usage):r.usage,finishedAt:_(t.data,`finishedAt`,`finished_at`)||t.timestamp,terminal:!0,budgetReason:g(t.data,`budgetReason`,`budget_reason`)??r.budgetReason,loopStats:A(t.data.loopStats)??r.loopStats,pendingApproval:void 0}}return r},N=(e,t)=>Error(t?.error||t?.message||e),P=(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,F=new Map,I=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,L=(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))},R=(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:L(e.messages,t.messages),messageCursor:a?t.messageCursor:e.messageCursor,hasMoreMessages:a?t.hasMoreMessages:e.hasMoreMessages}},z=(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},B=(e,t)=>{let n=new Map(t.map(e=>[e.id,e])),r=new Set(e.map(e=>e.id)),i=I(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]},V=i((e,t)=>{let n=0,r=0,i=0,a=0,o=0,s=null,c=0,u=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=()=>{u+=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})},O=(t,r=n,i=!1)=>{v(r)&&(i&&(o+=1),e(e=>({tasks:z(e.tasks,t),selectedTask:e.selectedTaskId===t.id?R(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 N(t,n);return O(n.data,i,!0),n.data}catch(e){let n=P(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 l.capabilities();if(y(t),!n.success||!n.data)throw N(`Could not inspect the Work runtime.`,n);e({capabilities:n.data})}catch(n){v(t)&&e({capabilities:{available:!1,runtime:`docker`,image:``,reason:P(n,`The Work runtime is unavailable.`)}})}},loadTasks:async(t=!1)=>{let c=n,u=++r,d=o;t||(i=u,m.add(u),e({loadingTasks:!0,error:null}));try{let t=await l.listTasks();if(y(c),!t.success||!t.data)throw N(`Could not load Work tasks.`,t);let n=I(t.data);if(u<=a||d!==o)return;a=u,e(e=>{let t=B(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&&u>a.requestId;return o&&(s=null),{tasks:t,selectedTask:i,...o&&e.error===a.message?{error:null}:{}}})}catch(n){let r=P(n,`Could not load Work tasks.`);!t&&v(c)&&u===i&&u>a&&d===o&&(s={requestId:u,message:r},e({error:r}))}finally{m.delete(u),!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 l.getTask(t);if(y(i),!e.success||!e.data)throw N(`Could not load this Work task.`,e);return O(e.data,i),e.data}catch(t){let n=P(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 l.getMessages(r,o);if(y(i),!t.success||!t.data)throw N(`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:L(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=P(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(()=>l.createTask(e),`Could not create the Work task.`,null),updateTask:(e,t)=>k(()=>l.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})),l.markTaskSeen(t).catch(()=>void 0)},deleteTask:async r=>{let i=n,a=w(r);try{let n=await l.deleteTask(r);if(y(i),!n.success)throw N(`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=P(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 l.startRun(e,t);if(y(r),!n.success||!n.data)throw N(`Could not start the Work run.`,n);return O(n.data,r,!0),n.data}catch(t){let n=P(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 l.cancelRun(e);if(y(r),!n.success)throw N(`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=P(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}:D(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=z(r,o),e.selectedTaskId===o.id&&(i=R(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=++u,s=x();try{let n=await l.listFiles(r,i);if(y(a),!n.success||!n.data)throw N(`Could not load workspace files.`,n);return o===u&&t().selectedTaskId===r&&(F.delete(r),e({files:n.data})),n.data}catch(n){let s=o===u&&v(a)&&t().selectedTaskId===r;if(te(n)){let e=F.get(r)??0;return s&&e<re&&(F.set(r,e+1),setTimeout(()=>{o===u&&v(a)&&t().selectedTaskId===r&&t().loadFiles(r,i).catch(()=>void 0)},ne)),t().files}let c=P(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 l.getFile(r,i);if(y(a),!n.success||!n.data)throw N(`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=P(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),u=_(r,i);f===u&&(d+=1,f=null);try{let n=await l.saveFile(r,i,a,o);if(y(s),!n.success||!n.data)throw N(`Could not save this workspace file.`,n);return t().selectedTaskId===r&&t().selectedFile?.path===i&&(f===u&&(d+=1,f=null),e({selectedFile:n.data})),n.data}catch(e){let t=P(e,`Could not save this file.`);throw E(r,s,t),Error(t)}finally{T(c,s)}},startPreview:(e,t)=>k(()=>l.startPreview(e,t),`Could not start the workspace preview.`,e),stopPreview:e=>k(()=>l.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})}}}),ae=async(e,t,n)=>{let r=await t(e);return r.success&&await n(),r},H=s(`store:plugin-store`),U=i((e,t)=>({plugins:[],pluginStatus:[],pluginVariables:{},isLoading:!1,isUploading:!1,error:null,loadPlugins:async()=>{e({isLoading:!0,error:null});try{let t=await u.getAllPlugins();t.success&&t.data?e({plugins:t.data}):e({error:t.error||`Failed to load plugins`})}catch(t){e({error:r(t,`Failed to load plugins`)})}finally{e({isLoading:!1})}},uploadPlugin:async n=>{e({isUploading:!0,error:null});try{let r=await u.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 u.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 u.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 u.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 ae(n,u.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 u.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 u.getPluginStatus();t.success&&t.data&&e({pluginStatus:t.data})}catch(e){H.error(`Failed to load plugin status:`,e)}},exportPlugin:async t=>{e({isLoading:!0,error:null});try{let e=await u.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 u.getVariables(t);n.success&&n.data&&e(e=>({pluginVariables:{...e.pluginVariables,[t]:n.data}}))}catch(e){H.error(`Failed to fetch plugin variables:`,e)}},updatePluginVariables:async(e,n,r=[])=>{try{return(await u.setVariables(e,n,r)).success?(await t().fetchPluginVariables(e),!0):!1}catch(e){return H.error(`Failed to update plugin variables:`,e),!1}},resetPluginVariables:async t=>{try{let n=await u.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 H.error(`Failed to reset plugin variables:`,e),!1}},clearError:()=>e({error:null}),setError:t=>e({error:t})})),W=`libre-webui:work-draft:`,G=(e,t)=>`${W}${e}:${t}`,oe=(e,t)=>{try{let n=window.sessionStorage.getItem(G(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}},se=(e,t,n)=>{try{return window.sessionStorage.setItem(G(e,t),JSON.stringify(n)),!0}catch{return!1}},ce=(e,t)=>{try{window.sessionStorage.removeItem(G(e,t))}catch{}},le=e=>{let t=`${W}${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{}},K=()=>{try{for(let e=window.sessionStorage.length-1;e>=0;e--){let t=window.sessionStorage.key(e);t?.startsWith(W)&&window.sessionStorage.removeItem(t)}}catch{}},ue=`/ws/work-terminal`,de=`/ws/work-screen`,fe=`/ws/work-audio`;function q(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 J(e){return e.replace(/\/+$/,``)}function pe(e){return J(q(e,`VITE_WS_BASE_URL`,[`ws:`,`wss:`]).toString())}function me(e){let t=q(e,`VITE_API_BASE_URL`,[`http:`,`https:`]);return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.pathname=t.pathname.replace(/\/api\/?$/,``),J(t.toString())}function Y(e){let t=e.websocketBaseUrl?.trim();if(t)return pe(t);if(e.protocol===`file:`)return`ws://localhost:3001`;let n=e.apiBaseUrl?.trim();if(n)return me(n);let r=e.protocol===`https:`?`wss:`:`ws:`;return e.production?`${r}//${e.host}`:`${r}//${e.hostname}:3001`}function X(e,t,n){let r=Y(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 X(`/ws`,t,{ticket:e})}function ge(e,t,n){return X(de,n,{taskId:e,ticket:t})}function _e(e,t,n){return X(fe,n,{taskId:e,ticket:t})}function ve(e,t,n){return X(ue,n,{taskId:e,ticket:t})}var Z=s(`websocket`),Q=new class{constructor(){t(this,`ws`,null),t(this,`urlEnvironment`,void 0),t(this,`reconnectAttempts`,0),t(this,`maxReconnectAttempts`,5),t(this,`reconnectDelay`,1e3),t(this,`messageHandlers`,new Map),t(this,`connectPromise`,null),t(this,`shouldReconnect`,!1),t(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},Z.debug(`WebSocket base URL resolved:`,Y(this.urlEnvironment))}connect(){if(o())return Z.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 c.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 Z.debug(`WebSocket: Attempting to connect`),new Promise((t,r)=>{try{let i=he(n,this.urlEnvironment);Z.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}Z.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`?Z.debug(`WebSocket: Server confirmed connection`):Z.warn(`WebSocket: No handler for message type:`,t.type)}catch(e){Z.error(`Failed to parse WebSocket message:`,e)}},a.onclose=()=>{if(Z.debug(`WebSocket disconnected`),this.ws===a&&(this.ws=null),e!==this.connectionEpoch){t();return}this.shouldReconnect&&this.attemptReconnect()},a.onerror=n=>{if(e!==this.connectionEpoch){t();return}Z.error(`WebSocket error:`,n),r(n)}}catch(e){r(e)}})}disconnect(){this.shouldReconnect=!1,this.connectionEpoch+=1,this.connectPromise=null,this.ws&&(this.ws.close(),this.ws=null)}reconnect(){return this.disconnect(),this.connect()}send(e){return this.ws&&this.ws.readyState===WebSocket.OPEN?(Z.debug(`WebSocket: Sending message:`,e),this.ws.send(JSON.stringify(e)),!0):(Z.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(o()){Z.debug(`Demo mode active: skipping WebSocket reconnection.`);return}this.reconnectAttempts<this.maxReconnectAttempts?(this.reconnectAttempts++,Z.debug(`Attempting to reconnect... (${this.reconnectAttempts}/${this.maxReconnectAttempts})`),setTimeout(()=>{this.shouldReconnect&&this.connect().catch(()=>{})},this.reconnectDelay*this.reconnectAttempts)):Z.error(`Max reconnection attempts reached`)}get isConnected(){return this.ws?.readyState===WebSocket.OPEN}},$=s(`auth-store`),ye=i()(a((t,r)=>({user:null,token:null,systemInfo:null,workAccess:null,isAuthenticated:!1,isLoading:!1,login:(e,i,a)=>{let s=r().user?.id===e.id;localStorage.setItem(`auth-token`,i);let c=n.getState();c.clearAllState&&c.clearAllState(),V.getState().clearAllState(),s||(K(),f.getState().clearUserState()),t({user:e,token:i,systemInfo:a,isAuthenticated:!0,isLoading:!1}),setTimeout(async()=>{try{let e=U.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 d.checkHealth()).success&&!o()&&$.warn(`Ollama service not available after login`)}catch(e){$.warn(`Ollama health check failed after login; continuing provider initialization:`,e)}let t=f.getState();await Promise.all([c.loadModels(),c.loadSessions(),c.loadPreferences(),t.loadPreferences(),e.loadPlugins(),r().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=n.getState();e.clearAllState&&e.clearAllState(),V.getState().clearAllState(),K(),f.getState().clearUserState(),t({user:null,token:null,workAccess:null,isAuthenticated:!1,isLoading:!1})},setUser:e=>{t({user:e})},setSystemInfo:e=>{t({systemInfo:e})},setLoading:e=>{t({isLoading:e})},isAdmin:()=>{let{user:e}=r();return e?.role===`admin`},requiresAuth:()=>{let{systemInfo:e}=r();return e?.requiresAuth??!1},canUseWork:()=>{let{systemInfo:e,user:t,workAccess:n}=r();return e?.requiresAuth===!1||t?.role===`admin`||n?.allowed===!0},canUseAgents:()=>{let{systemInfo:e,user:t}=r();return e?.agentsEnabled===!0?e?.requiresAuth===!1||t?.role===`admin`:!1},refreshWorkAccess:async()=>{try{let{workApi:n}=await e(async()=>{let{workApi:e}=await import(`./workApi-DrTI8jZw.js`);return{workApi:e}},__vite__mapDeps([0,1,2,3,4,5,6,7])),r=await n.access();r.success&&r.data&&t({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,oe as c,V as d,A as f,ge as i,se as l,Q as n,ce as o,_e as r,le as s,ye as t,U as u};