libre-webui 0.39.0 → 0.40.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 (198) hide show
  1. package/backend/dist/persistence/extensionTypes.d.ts +2 -0
  2. package/backend/dist/persistence/extensionTypes.d.ts.map +1 -1
  3. package/backend/dist/persistence/extensionTypes.js.map +1 -1
  4. package/backend/dist/persistence/postgresExtensionRepositories.d.ts.map +1 -1
  5. package/backend/dist/persistence/postgresExtensionRepositories.js +6 -0
  6. package/backend/dist/persistence/postgresExtensionRepositories.js.map +1 -1
  7. package/backend/dist/persistence/sqliteExtensionRepositories.d.ts.map +1 -1
  8. package/backend/dist/persistence/sqliteExtensionRepositories.js +7 -0
  9. package/backend/dist/persistence/sqliteExtensionRepositories.js.map +1 -1
  10. package/backend/dist/routes/email.d.ts.map +1 -1
  11. package/backend/dist/routes/email.js +51 -1
  12. package/backend/dist/routes/email.js.map +1 -1
  13. package/backend/dist/routes/tts.d.ts.map +1 -1
  14. package/backend/dist/routes/tts.js +6 -1
  15. package/backend/dist/routes/tts.js.map +1 -1
  16. package/backend/dist/services/agentCliService.d.ts.map +1 -1
  17. package/backend/dist/services/agentCliService.js +1 -0
  18. package/backend/dist/services/agentCliService.js.map +1 -1
  19. package/backend/dist/services/emailService.d.ts +17 -3
  20. package/backend/dist/services/emailService.d.ts.map +1 -1
  21. package/backend/dist/services/emailService.js +73 -11
  22. package/backend/dist/services/emailService.js.map +1 -1
  23. package/backend/dist/services/pluginCredentialsService.d.ts +3 -0
  24. package/backend/dist/services/pluginCredentialsService.d.ts.map +1 -1
  25. package/backend/dist/services/pluginCredentialsService.js +18 -5
  26. package/backend/dist/services/pluginCredentialsService.js.map +1 -1
  27. package/backend/dist/services/pluginService.d.ts +9 -0
  28. package/backend/dist/services/pluginService.d.ts.map +1 -1
  29. package/backend/dist/services/pluginService.js +31 -14
  30. package/backend/dist/services/pluginService.js.map +1 -1
  31. package/backend/dist/services/workRuntimeService.d.ts +5 -0
  32. package/backend/dist/services/workRuntimeService.d.ts.map +1 -1
  33. package/backend/dist/services/workRuntimeService.js +243 -84
  34. package/backend/dist/services/workRuntimeService.js.map +1 -1
  35. package/backend/dist/utils/emailMarkdown.js +3 -3
  36. package/backend/dist/utils/emailMarkdown.js.map +1 -1
  37. package/backend/dist/utils/pluginDefinitionTrust.d.ts +7 -0
  38. package/backend/dist/utils/pluginDefinitionTrust.d.ts.map +1 -1
  39. package/backend/dist/utils/pluginDefinitionTrust.js +49 -1
  40. package/backend/dist/utils/pluginDefinitionTrust.js.map +1 -1
  41. package/backend/package.json +1 -1
  42. package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
  43. package/frontend/dist/artifact-runtime/mermaid.js +366 -366
  44. package/frontend/dist/assets/index-DLfU_qNT.js +75 -0
  45. package/frontend/dist/assets/index-DtS3qhdq.css +2 -0
  46. package/frontend/dist/assets/xterm-B1njb2Cr.css +1 -0
  47. package/frontend/dist/index.html +27 -26
  48. package/frontend/dist/js/ArtifactContainer-BjzltfdU.js +1 -0
  49. package/frontend/dist/js/{ArtifactDemoPage-Ddpy2O_v.js → ArtifactDemoPage-DWua6xj9.js} +1 -1
  50. package/frontend/dist/js/{ArtifactSandboxFrame-CdsAqv8H.js → ArtifactSandboxFrame-CR9ghP0A.js} +1 -1
  51. package/frontend/dist/js/ArtifactSlideOutPanel-DX2nL3AS.js +1 -0
  52. package/frontend/dist/js/AutomationModal-DZe-C2jN.js +1 -0
  53. package/frontend/dist/js/AutomationsPage-CrCcnTyk.js +1 -0
  54. package/frontend/dist/js/AvatarUpload-nPS0QHod.js +1 -0
  55. package/frontend/dist/js/Button-Dh2UJA-B.js +1 -0
  56. package/frontend/dist/js/CalendarPage-D2WiWglM.js +1 -0
  57. package/frontend/dist/js/ChannelsPage-COp2T8FQ.js +1 -0
  58. package/frontend/dist/js/ChatPage-CUfAlpdt.js +14 -0
  59. package/frontend/dist/js/ConnectModels-emc3dv4A.js +1 -0
  60. package/frontend/dist/js/EvaluationsPage-CbyeDkz_.js +2 -0
  61. package/frontend/dist/js/FirstTimeSetup-C4ffQRMN.js +1 -0
  62. package/frontend/dist/js/GalleryPage-D4Ci_3dv.js +1 -0
  63. package/frontend/dist/js/HomePage-C3IhEERN.js +1 -0
  64. package/frontend/dist/js/LanguageSwitcher-BQqDJPwm.js +1 -0
  65. package/frontend/dist/js/ModelManagerModals-DhY8Rme6.js +1 -0
  66. package/frontend/dist/js/NotesPage-j812I1BN.js +3 -0
  67. package/frontend/dist/js/PasswordStrengthMeter-BSEtQBJp.js +1 -0
  68. package/frontend/dist/js/PersonasPage--YWoThqF.js +13 -0
  69. package/frontend/dist/js/PluginUsagePage-CZiMdmjI.js +1 -0
  70. package/frontend/dist/js/{RichMessageContent-BfYbVBFz.js → RichMessageContent-BLI0hhzR.js} +2 -2
  71. package/frontend/dist/js/RichMessageContent-BXv5baJ_.js +1 -0
  72. package/frontend/dist/js/SettingsModal-C6aVzSI-.js +19 -0
  73. package/frontend/dist/js/SettingsToggle-CkLLtFbz.js +1 -0
  74. package/frontend/dist/js/ShareDialog-DQskc17d.js +1 -0
  75. package/frontend/dist/js/StrandsPage-DENhVKcz.js +1 -0
  76. package/frontend/dist/js/SystemPage-C86ypXG4.js +1 -0
  77. package/frontend/dist/js/UserManagementPanel-D1CS0KPn.js +1 -0
  78. package/frontend/dist/js/WhatsNewModal-B31A_UQY.js +1 -0
  79. package/frontend/dist/js/WorkPage-DEXBL5J7.js +7 -0
  80. package/frontend/dist/js/api-DRAKhdz7.js +1 -0
  81. package/frontend/dist/js/{api-BrHW-VGd.js → api-Dcz1G4Ib.js} +4 -2
  82. package/frontend/dist/js/{appNavigation-B6xYIgLi.js → appNavigation-C5A9BF_G.js} +1 -1
  83. package/frontend/dist/js/appStore-0_qlwS8f.js +2 -0
  84. package/frontend/dist/js/appVersion-D5lk_2zb.js +1 -0
  85. package/frontend/dist/js/ar-BZntyucf.js +2 -0
  86. package/frontend/dist/js/authStore-C4dzH1NY.js +1 -0
  87. package/frontend/dist/js/{authStore-DjAsRpNL.js → authStore-COgKeTRv.js} +3 -3
  88. package/frontend/dist/js/bn-BDCaFQu-.js +2 -0
  89. package/frontend/dist/js/chatStore-CVTbkZyb.js +3 -0
  90. package/frontend/dist/js/{client-DppLngAs.js → client-jaxZzn-I.js} +2 -2
  91. package/frontend/dist/js/{composerStyles-C83jssgZ.js → composerStyles-BEx0XAp6.js} +1 -1
  92. package/frontend/dist/js/{config-4_s8hdqO.js → config-Da1yh9sC.js} +1 -1
  93. package/frontend/dist/js/confirmStore-CKkUtP9c.js +1 -0
  94. package/frontend/dist/js/cs-BCmN--jQ.js +2 -0
  95. package/frontend/dist/js/da-B895dAyV.js +2 -0
  96. package/frontend/dist/js/de-B0ZhC0dm.js +2 -0
  97. package/frontend/dist/js/es-D7eaw4_W.js +2 -0
  98. package/frontend/dist/js/{evaluationsApi-DyuW7IJ_.js → evaluationsApi-BwaxBVpl.js} +1 -1
  99. package/frontend/dist/js/fr-DsB0gLW4.js +2 -0
  100. package/frontend/dist/js/hi-CLeU3ung.js +2 -0
  101. package/frontend/dist/js/id-Cdq6tOTi.js +2 -0
  102. package/frontend/dist/js/is-DJ1tHaAT.js +2 -0
  103. package/frontend/dist/js/it-9K1R4CeT.js +2 -0
  104. package/frontend/dist/js/ja-BYP_3M5M.js +2 -0
  105. package/frontend/dist/js/ko-CNtjlaDm.js +2 -0
  106. package/frontend/dist/js/liveAnnouncerStore-B6mS-JWC.js +1 -0
  107. package/frontend/dist/js/messageCodeStyles-D3cWF9XO.js +2 -0
  108. package/frontend/dist/js/ms-A_IVO_qt.js +2 -0
  109. package/frontend/dist/js/nl-CrKWO3ea.js +2 -0
  110. package/frontend/dist/js/pl-BrpSuyDP.js +2 -0
  111. package/frontend/dist/js/pt-BHbpB5BM.js +2 -0
  112. package/frontend/dist/js/ru-DzLsS9zY.js +2 -0
  113. package/frontend/dist/js/{strandsApi-BFbeEpAY.js → strandsApi-COxSPh_5.js} +1 -1
  114. package/frontend/dist/js/sv-VU2CjzNj.js +2 -0
  115. package/frontend/dist/js/{teamEventStream-DsAS6P4m.js → teamEventStream-RNJYm84u.js} +1 -1
  116. package/frontend/dist/js/th-DV2hNXXc.js +2 -0
  117. package/frontend/dist/js/tr-DvVZ9jxF.js +2 -0
  118. package/frontend/dist/js/ui-CI0OdG9q.js +2 -0
  119. package/frontend/dist/js/ui-vendor-6S05F84J.js +1 -0
  120. package/frontend/dist/js/uk-MFFDRo2m.js +2 -0
  121. package/frontend/dist/js/useChat-BSkqxHnH.js +13 -0
  122. package/frontend/dist/js/useDictation-D9whH12W.js +1 -0
  123. package/frontend/dist/js/vi-CfZ-U8Cw.js +2 -0
  124. package/frontend/dist/js/{work-CdbmBok5.js → work-C7MYlv5S.js} +1 -1
  125. package/frontend/dist/js/{workModels-BM2Zyiba.js → workAnnouncements-CAsI8P7c.js} +1 -1
  126. package/frontend/dist/js/workApi-BJfbaV6k.js +1 -0
  127. package/frontend/dist/js/{workApi-UPxumrEF.js → workApi-Ck8nTlJn.js} +1 -1
  128. package/frontend/dist/js/zh-CTl_raYa.js +2 -0
  129. package/package.json +3 -2
  130. package/plugins/codex-oauth.json +1 -0
  131. package/frontend/dist/assets/index-D99DS5c6.js +0 -57
  132. package/frontend/dist/assets/index-Dz1JufgZ.css +0 -1
  133. package/frontend/dist/assets/xterm-B8QFf3JU.css +0 -1
  134. package/frontend/dist/js/ArtifactContainer-Cn7X9HGm.js +0 -1
  135. package/frontend/dist/js/ArtifactSlideOutPanel-cVd9X80o.js +0 -1
  136. package/frontend/dist/js/AutomationModal-B4UaWjkk.js +0 -1
  137. package/frontend/dist/js/AutomationsPage-huCrvLUp.js +0 -1
  138. package/frontend/dist/js/AvatarUpload-CG-w6Mpt.js +0 -1
  139. package/frontend/dist/js/Button-j68Q8KVh.js +0 -1
  140. package/frontend/dist/js/CalendarPage-CZXT1w99.js +0 -1
  141. package/frontend/dist/js/ChannelsPage-DbtdHnSL.js +0 -1
  142. package/frontend/dist/js/ChatPage-BZE65kiq.js +0 -14
  143. package/frontend/dist/js/ConnectModels-DD4bLgdq.js +0 -1
  144. package/frontend/dist/js/EvaluationsPage-Dq53LaXd.js +0 -2
  145. package/frontend/dist/js/FirstTimeSetup-BoJIfuQT.js +0 -1
  146. package/frontend/dist/js/GalleryPage-DKwqeB2A.js +0 -1
  147. package/frontend/dist/js/HomePage-C8bCJfls.js +0 -1
  148. package/frontend/dist/js/LanguageSwitcher-B_YyU5JG.js +0 -1
  149. package/frontend/dist/js/ModelManagerModals-BzjZ-QwL.js +0 -1
  150. package/frontend/dist/js/NotesPage-CnaAp_w_.js +0 -3
  151. package/frontend/dist/js/PasswordStrengthMeter-DI4RDv67.js +0 -1
  152. package/frontend/dist/js/PersonasPage-CH3GUKph.js +0 -13
  153. package/frontend/dist/js/PluginUsagePage-d54K2gAj.js +0 -1
  154. package/frontend/dist/js/RichMessageContent-CDxxs3Tt.js +0 -1
  155. package/frontend/dist/js/SettingsModal-BvtJcvow.js +0 -19
  156. package/frontend/dist/js/SettingsToggle-DrJ0Bapi.js +0 -1
  157. package/frontend/dist/js/ShareDialog-DaSxkTKS.js +0 -1
  158. package/frontend/dist/js/StrandsPage-BQwz0mWq.js +0 -1
  159. package/frontend/dist/js/SystemPage-BqNZoFxR.js +0 -1
  160. package/frontend/dist/js/UserManagementPanel-C3T1ReJJ.js +0 -1
  161. package/frontend/dist/js/WhatsNewModal-CLcU2Ugk.js +0 -1
  162. package/frontend/dist/js/WorkPage-BpjGn--1.js +0 -8
  163. package/frontend/dist/js/api-K_hhqPdx.js +0 -1
  164. package/frontend/dist/js/appStore-DkRdQQeY.js +0 -2
  165. package/frontend/dist/js/appVersion-BVtSqLVj.js +0 -1
  166. package/frontend/dist/js/ar-XTZGEtBr.js +0 -2
  167. package/frontend/dist/js/authStore-DBS6Kbvh.js +0 -1
  168. package/frontend/dist/js/bn-JiK7ZWmy.js +0 -2
  169. package/frontend/dist/js/chatStore-DpVxt9VX.js +0 -3
  170. package/frontend/dist/js/cs-D8ju18CO.js +0 -2
  171. package/frontend/dist/js/da-BJWcAoUc.js +0 -2
  172. package/frontend/dist/js/de-CLJLmy69.js +0 -2
  173. package/frontend/dist/js/es-BvqHEL-3.js +0 -2
  174. package/frontend/dist/js/fr-B8ZoZomI.js +0 -2
  175. package/frontend/dist/js/goober.modern-BaHbaW3_.js +0 -1
  176. package/frontend/dist/js/hi-AzJLALo-.js +0 -2
  177. package/frontend/dist/js/id-DZYGQhvC.js +0 -2
  178. package/frontend/dist/js/is-Da_kvtzW.js +0 -2
  179. package/frontend/dist/js/it-B90zSlqn.js +0 -2
  180. package/frontend/dist/js/ja-DU_K1GOr.js +0 -2
  181. package/frontend/dist/js/ko-DicfoO-e.js +0 -2
  182. package/frontend/dist/js/messageCodeStyles-CuQPkfEK.js +0 -2
  183. package/frontend/dist/js/ms-CfH7wjUY.js +0 -2
  184. package/frontend/dist/js/nl-ELlOz-B3.js +0 -2
  185. package/frontend/dist/js/pl-33dayyUk.js +0 -2
  186. package/frontend/dist/js/pt-aIXSQPCT.js +0 -2
  187. package/frontend/dist/js/ru-BSvGtBtW.js +0 -2
  188. package/frontend/dist/js/sv-B7KOz81W.js +0 -2
  189. package/frontend/dist/js/th-DgpjGxvA.js +0 -2
  190. package/frontend/dist/js/tr-BQTbl2h-.js +0 -2
  191. package/frontend/dist/js/ui-Aq8MP7Ph.js +0 -2
  192. package/frontend/dist/js/ui-vendor-DVTj_sKN.js +0 -1
  193. package/frontend/dist/js/uk-JLymloot.js +0 -2
  194. package/frontend/dist/js/useChat-D3ZAGz70.js +0 -10
  195. package/frontend/dist/js/useDictation-B6l8QzeM.js +0 -1
  196. package/frontend/dist/js/vi-BXdLOJ8q.js +0 -2
  197. package/frontend/dist/js/workApi-D1xtiG3Q.js +0 -1
  198. package/frontend/dist/js/zh-gdUf9sXa.js +0 -2
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["js/workApi-D1xtiG3Q.js","js/workApi-UPxumrEF.js","js/config-4_s8hdqO.js","js/logger-BR4forr_.js","js/client-DppLngAs.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-DpVxt9VX.js";import{n as a,t as o}from"./utils-vendor-DPJG-EG_.js";import{t as s}from"./client-DppLngAs.js";import{u as c,y as l}from"./api-BrHW-VGd.js";import{t as u}from"./workApi-UPxumrEF.js";import{t as d}from"./appStore-DkRdQQeY.js";var f=1e5,p=`[Earlier live output omitted]
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["js/workApi-BJfbaV6k.js","js/workApi-Ck8nTlJn.js","js/config-Da1yh9sC.js","js/logger-BR4forr_.js","js/client-jaxZzn-I.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-CVTbkZyb.js";import{t as a}from"./appStore-0_qlwS8f.js";import{n as o,t as s}from"./utils-vendor-DPJG-EG_.js";import{t as c}from"./client-jaxZzn-I.js";import{u as l,y as u}from"./api-Dcz1G4Ib.js";import{t as d}from"./workApi-Ck8nTlJn.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},canUseStrands:()=>{let{systemInfo:e,user:t}=i(),n=e?.strandsAccess??`disabled`;return n===`disabled`?!1:e?.requiresAuth===!1?!0:n===`all-users`?!!t:t?.role===`admin`},refreshWorkAccess:async()=>{try{let{workApi:e}=await t(async()=>{let{workApi:e}=await import(`./workApi-D1xtiG3Q.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=o((e,t)=>{let n=0,r=0,i=0,a=0,o=0,s=null,c=0,l=0,u=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,u+=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 d.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,u=o;t||(i=l,m.add(l),e({loadingTasks:!0,error:null}));try{let t=await d.listTasks();if(y(c),!t.success||!t.data)throw M(`Could not load Work tasks.`,t);let n=F(t.data);if(l<=a||u!==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&&u===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 d.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 d.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(()=>d.createTask(e),`Could not create the Work task.`,null),updateTask:(e,t)=>k(()=>d.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})),d.markTaskSeen(t).catch(()=>void 0)},deleteTask:async r=>{let i=n,a=w(r);try{let n=await d.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 d.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 d.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 d.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=++u,s=_(r,i);f=s;let c=x();try{let n=await d.getFile(r,i);if(y(a),!n.success||!n.data)throw M(`Could not open this workspace file.`,n);if(o!==u||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===u&&v(a)&&t().selectedTaskId===r&&e({error:i}),Error(i)}finally{S(c,a,r)}},clearSelectedFile:()=>{u+=1,f=null,e({selectedFile:null})},saveFile:async(r,i,a,o)=>{let s=n,c=w(r),l=_(r,i);f===l&&(u+=1,f=null);try{let n=await d.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&&(u+=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(()=>d.startPreview(e,t,n),`Could not start the workspace preview.`,e),stopPreview:e=>k(()=>d.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=o((e,t)=>({plugins:[],pluginStatus:[],pluginVariables:{},isLoading:!1,isUploading:!1,error:null,loadPlugins:async()=>{e({isLoading:!0,error:null});try{let t=await l.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 l.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 l.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 l.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 l.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,l.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 l.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 l.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 l.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 l.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 l.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 l.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 c.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=o()(s((n,i)=>({user:null,token:null,systemInfo:null,workAccess:null,isAuthenticated:!1,isLoading:!1,login:(t,o,s)=>{let c=i().user?.id===t.id;localStorage.setItem(`auth-token`,o);let l=r.getState();l.clearAllState&&l.clearAllState(),z.getState().clearAllState(),c||(G(),a.getState().clearUserState()),n({user:t,token:o,systemInfo:s,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 u.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=a.getState();await Promise.all([l.loadModels(),l.loadSessions(),l.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(),a.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},canUseStrands:()=>{let{systemInfo:e,user:t}=i(),n=e?.strandsAccess??`disabled`;return n===`disabled`?!1:e?.requiresAuth===!1?!0:n===`all-users`?!!t:t?.role===`admin`},refreshWorkAccess:async()=>{try{let{workApi:e}=await t(async()=>{let{workApi:e}=await import(`./workApi-BJfbaV6k.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};