hermes-web-ui 0.4.5 → 0.4.6

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 (74) hide show
  1. package/README.md +11 -0
  2. package/dist/client/assets/{Add-DnSsGBZy.js → Add-D7GrQ-Em.js} +1 -1
  3. package/dist/client/assets/{Button-6kn5x8wB.js → Button-XML6qzjK.js} +1 -1
  4. package/dist/client/assets/{ChannelsView-BQaQ41b8.js → ChannelsView-B8rre6Vi.js} +1 -1
  5. package/dist/client/assets/{ChatView-Crbl3WuM.js → ChatView-CVcqUhM9.js} +1 -1
  6. package/dist/client/assets/{Close--rdg4fyH.js → Close-CVswUl20.js} +1 -1
  7. package/dist/client/assets/{Dropdown-C3W_MZAx.js → Dropdown-PWEJ7U74.js} +1 -1
  8. package/dist/client/assets/{Empty-CO5atRZx.js → Empty-D2AE_ZlK.js} +1 -1
  9. package/dist/client/assets/{FilesView-D_IAXsWt.js → FilesView-CYbVjetd.js} +1 -1
  10. package/dist/client/assets/{FormItem-cCAlzrYv.js → FormItem-DryuDiWg.js} +1 -1
  11. package/dist/client/assets/{GatewaysView-B7jVPJm1.js → GatewaysView-BM8MVoUJ.js} +1 -1
  12. package/dist/client/assets/{GroupChatView-CMYjNyhW.js → GroupChatView-mALkeZI8.js} +1 -1
  13. package/dist/client/assets/{Input-DOn-NDi-.js → Input-DWLw7VSO.js} +1 -1
  14. package/dist/client/assets/{InputNumber-CEwvr7we.js → InputNumber-DWU7lpWO.js} +1 -1
  15. package/dist/client/assets/{JobsView-BVkx_mtz.js → JobsView-DPcCqfeg.js} +2 -2
  16. package/dist/client/assets/{LoginView-DOqEhm1e.js → LoginView-Didr-64F.js} +1 -1
  17. package/dist/client/assets/{LogsView-CckftzzR.js → LogsView-BPL2WKzs.js} +1 -1
  18. package/dist/client/assets/{MarkdownRenderer-WDZUw_r0.js → MarkdownRenderer-Dzf2i2R9.js} +1 -1
  19. package/dist/client/assets/{MemoryView-9IrcgpHt.js → MemoryView-B5zb27Cz.js} +1 -1
  20. package/dist/client/assets/{Modal-Ct66o3O5.js → Modal-CcDwIOab.js} +1 -1
  21. package/dist/client/assets/{ModelsView-blUeTbrG.js → ModelsView-DCWQ4JAD.js} +1 -1
  22. package/dist/client/assets/{Popconfirm-DNWpYtil.js → Popconfirm-zfNVjMed.js} +1 -1
  23. package/dist/client/assets/{Popover-upoiJRFk.js → Popover-Df4h1K87.js} +1 -1
  24. package/dist/client/assets/{ProfilesView-CUkMLIWp.js → ProfilesView-DtJPNWxS.js} +1 -1
  25. package/dist/client/assets/{Select-C96PU4NS.js → Select-CN-VEjPp.js} +1 -1
  26. package/dist/client/assets/{SettingRow-DLje7tBG.js → SettingRow-Cm8BWHc8.js} +1 -1
  27. package/dist/client/assets/{SettingsView-C6M8z2mR.js → SettingsView-Dx7VgzgQ.js} +1 -1
  28. package/dist/client/assets/{SkillsView-wqPd5oak.js → SkillsView-Cqqjs5MV.js} +1 -1
  29. package/dist/client/assets/{Space-XC9pMFNY.js → Space-C979miZ6.js} +1 -1
  30. package/dist/client/assets/{Spin-CNWMVtvF.js → Spin-DicuilvT.js} +1 -1
  31. package/dist/client/assets/{Suffix-BMy3yeNM.js → Suffix-D03EcSpG.js} +1 -1
  32. package/dist/client/assets/{Switch-BIgwRax1.js → Switch-_uewFg1w.js} +1 -1
  33. package/dist/client/assets/{Tag-DNHVnryL.js → Tag-DdDsBGRV.js} +1 -1
  34. package/dist/client/assets/{TerminalView-D-ypEEEb.js → TerminalView-C1kOE48Y.js} +1 -1
  35. package/dist/client/assets/{Tooltip-MYN2D0HZ.js → Tooltip-CB3bMMbn.js} +1 -1
  36. package/dist/client/assets/{Upload-CyjCHVmT.js → Upload-BRboVHlo.js} +1 -1
  37. package/dist/client/assets/{UsageView-Nuq5z2DT.js → UsageView-C1gY07x9.js} +1 -1
  38. package/dist/client/assets/{Warning-cHbjPxlH.js → Warning-Dme2hdHB.js} +1 -1
  39. package/dist/client/assets/{_plugin-vue_export-helper-BA1W5EEO.js → _plugin-vue_export-helper-9xP-z52L.js} +1 -1
  40. package/dist/client/assets/app-Bye4afa9.js +1 -0
  41. package/dist/client/assets/app-DpVwxn5E.js +1 -0
  42. package/dist/client/assets/{auth-DKa161qW.js → auth-BE7p-Kmu.js} +1 -1
  43. package/dist/client/assets/{browser-BIv3pBug.js → browser-CRTDc_Be.js} +1 -1
  44. package/dist/client/assets/{chat-COI--6cJ.js → chat-CIiy7Gwo.js} +2 -2
  45. package/dist/client/assets/composables-BjmZducA.js +1 -0
  46. package/dist/client/assets/{fade-in-height-expand.cssr-CJZoRQPB.js → fade-in-height-expand.cssr-Di-q1YGm.js} +1 -1
  47. package/dist/client/assets/{fade-in.cssr-BvBFOzvO.js → fade-in.cssr-ZKfQkQl9.js} +1 -1
  48. package/dist/client/assets/{index-BBxmX-_2.js → index-D61jARAv.js} +1 -1
  49. package/dist/client/assets/jobs-D-9ea8_u.js +1 -0
  50. package/dist/client/assets/{jobs-kBilk6_x.js → jobs-DhMMkH9o.js} +1 -1
  51. package/dist/client/assets/{light-D4vpAk8k.js → light--dc4fdXI.js} +1 -1
  52. package/dist/client/assets/{light-C4XaZN5a.js → light-BOJpHLZr.js} +1 -1
  53. package/dist/client/assets/{light-DCznx22W.js → light-C3LBcWfs.js} +1 -1
  54. package/dist/client/assets/{light-OgGmbeuv.js → light-D-8ypucm.js} +1 -1
  55. package/dist/client/assets/{light-C2mxSkxV.js → light-DS_k1uOd.js} +1 -1
  56. package/dist/client/assets/{light-CNs4B0mO.js → light-DbAu3UYZ.js} +1 -1
  57. package/dist/client/assets/{light-vSRhMiQi.js → light-Dewn_gGV.js} +1 -1
  58. package/dist/client/assets/{light-DalFWniD.js → light-PgWU0EWW.js} +1 -1
  59. package/dist/client/assets/{models-C0y2ql6-.js → models-B2A46pRJ.js} +1 -1
  60. package/dist/client/assets/{pinia-DRC0gpqt.js → pinia-UrA63qkH.js} +1 -1
  61. package/dist/client/assets/{profiles-COfldPiC.js → profiles-Dk45I0q1.js} +1 -1
  62. package/dist/client/assets/{router-BDvjwA-_.js → router-Deam6ffd.js} +2 -2
  63. package/dist/client/assets/{session-browser-prefs-LlrIrhBd.js → session-browser-prefs-Wo3XFysm.js} +1 -1
  64. package/dist/client/assets/{sessions-BUqqfXt4.js → sessions-BDXdWl17.js} +1 -1
  65. package/dist/client/assets/{skills-hi1CfGAH.js → skills-dEDjBsEe.js} +1 -1
  66. package/dist/client/assets/{use-message-x3IR-EsB.js → use-message-sJtQsIMH.js} +1 -1
  67. package/dist/client/assets/{useTheme-DSy5LWpW.js → useTheme-BH5wkcEo.js} +1 -1
  68. package/dist/client/index.html +32 -32
  69. package/dist/server/index.js +2 -2
  70. package/package.json +1 -1
  71. package/dist/client/assets/app-CQp0_YLA.js +0 -1
  72. package/dist/client/assets/app-Cu9UcSB8.js +0 -1
  73. package/dist/client/assets/composables-DNiaqO4T.js +0 -1
  74. package/dist/client/assets/jobs-hrnPO3Z3.js +0 -1
@@ -1 +1 @@
1
- import{Y as e,st as t}from"./router-BDvjwA-_.js";import{n}from"./pinia-DRC0gpqt.js";import{t as r}from"./profiles-COfldPiC.js";var i=`hermes_session_pins_v1_`,a=`hermes_human_only_v1_`;function o(){try{return r().activeProfileName||localStorage.getItem(`hermes_active_profile_name`)||`default`}catch{return localStorage.getItem(`hermes_active_profile_name`)||`default`}}function s(e){return`${i}${e}`}function c(e){return`${a}${e}`}function l(e,t){try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch{return t}}function u(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch{}}function d(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var f=n(`session-browser-prefs`,()=>{let n=t(o()),i=t(l(s(n.value),[])),a=t(l(c(n.value),!0));function f(){n.value=o(),i.value=l(s(n.value),[]),a.value=l(c(n.value),!0)}function p(){u(s(n.value),i.value)}function m(){u(c(n.value),a.value)}function h(e){return i.value.includes(e)}function g(e){h(e)?i.value=i.value.filter(t=>t!==e):i.value=[...i.value,e],p()}function _(e){return h(e)?(i.value=i.value.filter(t=>t!==e),p(),!0):!1}function v(e){a.value!==e&&(a.value=e,m())}function y(e){if(e.length===0)return!1;let t=new Set(e),n=i.value.filter(e=>t.has(e));return d(n,i.value)?!1:(i.value=n,p(),!0)}return e(()=>r().activeProfileName,()=>f()),{profileName:n,pinnedIds:i,humanOnly:a,reload:f,isPinned:h,togglePinned:g,removePinned:_,setHumanOnly:v,pruneMissingSessions:y}});export{f as t};
1
+ import{Y as e,st as t}from"./router-Deam6ffd.js";import{n}from"./pinia-UrA63qkH.js";import{t as r}from"./profiles-Dk45I0q1.js";var i=`hermes_session_pins_v1_`,a=`hermes_human_only_v1_`;function o(){try{return r().activeProfileName||localStorage.getItem(`hermes_active_profile_name`)||`default`}catch{return localStorage.getItem(`hermes_active_profile_name`)||`default`}}function s(e){return`${i}${e}`}function c(e){return`${a}${e}`}function l(e,t){try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch{return t}}function u(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch{}}function d(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var f=n(`session-browser-prefs`,()=>{let n=t(o()),i=t(l(s(n.value),[])),a=t(l(c(n.value),!0));function f(){n.value=o(),i.value=l(s(n.value),[]),a.value=l(c(n.value),!0)}function p(){u(s(n.value),i.value)}function m(){u(c(n.value),a.value)}function h(e){return i.value.includes(e)}function g(e){h(e)?i.value=i.value.filter(t=>t!==e):i.value=[...i.value,e],p()}function _(e){return h(e)?(i.value=i.value.filter(t=>t!==e),p(),!0):!1}function v(e){a.value!==e&&(a.value=e,m())}function y(e){if(e.length===0)return!1;let t=new Set(e),n=i.value.filter(e=>t.has(e));return d(n,i.value)?!1:(i.value=n,p(),!0)}return e(()=>r().activeProfileName,()=>f()),{profileName:n,pinnedIds:i,humanOnly:a,reload:f,isPinned:h,togglePinned:g,removePinned:_,setHumanOnly:v,pruneMissingSessions:y}});export{f as t};
@@ -1 +1 @@
1
- import{a as e}from"./router-BDvjwA-_.js";async function t(t,n){let r=new URLSearchParams;t&&r.set(`source`,t),n&&r.set(`limit`,String(n));let i=r.toString();return(await e(`/api/hermes/sessions${i?`?${i}`:``}`)).sessions}async function n(t,n,r){let i=new URLSearchParams;return i.set(`q`,t),n&&i.set(`source`,n),r&&i.set(`limit`,String(r)),(await e(`/api/hermes/search/sessions?${i.toString()}`)).results}async function r(t){try{return(await e(`/api/hermes/sessions/${t}`)).session}catch{return null}}async function i(t){try{return await e(`/api/hermes/sessions/${t}`,{method:`DELETE`}),!0}catch{return!1}}async function a(t,n){try{return await e(`/api/hermes/sessions/${t}/rename`,{method:`POST`,body:JSON.stringify({title:n})}),!0}catch{return!1}}async function o(t){try{return await e(`/api/hermes/sessions/${t}/usage`)}catch{return null}}async function s(t){let n=new URLSearchParams;t&&n.set(`profile`,t);let r=n.toString();return(await e(`/api/hermes/sessions/context-length${r?`?${r}`:``}`)).context_length}export{t as a,o as i,s as n,a as o,r,n as s,i as t};
1
+ import{a as e}from"./router-Deam6ffd.js";async function t(t,n){let r=new URLSearchParams;t&&r.set(`source`,t),n&&r.set(`limit`,String(n));let i=r.toString();return(await e(`/api/hermes/sessions${i?`?${i}`:``}`)).sessions}async function n(t,n,r){let i=new URLSearchParams;return i.set(`q`,t),n&&i.set(`source`,n),r&&i.set(`limit`,String(r)),(await e(`/api/hermes/search/sessions?${i.toString()}`)).results}async function r(t){try{return(await e(`/api/hermes/sessions/${t}`)).session}catch{return null}}async function i(t){try{return await e(`/api/hermes/sessions/${t}`,{method:`DELETE`}),!0}catch{return!1}}async function a(t,n){try{return await e(`/api/hermes/sessions/${t}/rename`,{method:`POST`,body:JSON.stringify({title:n})}),!0}catch{return!1}}async function o(t){try{return await e(`/api/hermes/sessions/${t}/usage`)}catch{return null}}async function s(t){let n=new URLSearchParams;t&&n.set(`profile`,t);let r=n.toString();return(await e(`/api/hermes/sessions/context-length${r?`?${r}`:``}`)).context_length}export{t as a,o as i,s as n,a as o,r,n as s,i as t};
@@ -1 +1 @@
1
- import{a as e}from"./router-BDvjwA-_.js";async function t(){return(await e(`/api/hermes/skills`)).categories}async function n(t){return(await e(`/api/hermes/skills/${t}`)).content}async function r(t,n){return(await e(`/api/hermes/skills/${t}/${n}/files`)).files}async function i(){return e(`/api/hermes/memory`)}async function a(t,n){await e(`/api/hermes/memory`,{method:`POST`,body:JSON.stringify({section:t,content:n})})}async function o(t,n){await e(`/api/hermes/skills/toggle`,{method:`PUT`,body:JSON.stringify({name:t,enabled:n})})}export{a,t as i,n,o,r,i as t};
1
+ import{a as e}from"./router-Deam6ffd.js";async function t(){return(await e(`/api/hermes/skills`)).categories}async function n(t){return(await e(`/api/hermes/skills/${t}`)).content}async function r(t,n){return(await e(`/api/hermes/skills/${t}/${n}/files`)).files}async function i(){return e(`/api/hermes/memory`)}async function a(t,n){await e(`/api/hermes/memory`,{method:`POST`,body:JSON.stringify({section:t,content:n})})}async function o(t,n){await e(`/api/hermes/skills/toggle`,{method:`PUT`,body:JSON.stringify({name:t,enabled:n})})}export{a,t as i,n,o,r,i as t};
@@ -1 +1 @@
1
- import{P as e}from"./router-BDvjwA-_.js";import{X as t,et as n}from"./browser-BIv3pBug.js";var r=n(`n-message-api`),i=n(`n-message-provider`);function a(){let n=e(r,null);return n===null&&t(`use-message`,"No outer <n-message-provider /> founded. See prerequisite in https://www.naiveui.com/en-US/os-theme/components/message for more details. If you want to use `useMessage` outside setup, please check https://www.naiveui.com/zh-CN/os-theme/components/message#Q-&-A."),n}export{r as n,i as r,a as t};
1
+ import{P as e}from"./router-Deam6ffd.js";import{X as t,et as n}from"./browser-CRTDc_Be.js";var r=n(`n-message-api`),i=n(`n-message-provider`);function a(){let n=e(r,null);return n===null&&t(`use-message`,"No outer <n-message-provider /> founded. See prerequisite in https://www.naiveui.com/en-US/os-theme/components/message for more details. If you want to use `useMessage` outside setup, please check https://www.naiveui.com/zh-CN/os-theme/components/message#Q-&-A."),n}export{r as n,i as r,a as t};
@@ -1 +1 @@
1
- import{Y as e,st as t}from"./router-BDvjwA-_.js";var n=`hermes_theme`,r=t(localStorage.getItem(n)||`system`),i=t(!1);function a(e){i.value=e,document.documentElement.classList.toggle(`dark`,e)}function o(e){return e===`system`?window.matchMedia(`(prefers-color-scheme: dark)`).matches:e===`dark`}a(o(r.value)),window.matchMedia(`(prefers-color-scheme: dark)`).addEventListener(`change`,()=>{r.value===`system`&&a(o(`system`))}),e(r,e=>{localStorage.setItem(n,e),a(o(e))});function s(){function e(e){r.value=e}function t(){r.value=i.value?`light`:`dark`}return{mode:r,isDark:i,setMode:e,toggleTheme:t}}export{s as t};
1
+ import{Y as e,st as t}from"./router-Deam6ffd.js";var n=`hermes_theme`,r=t(localStorage.getItem(n)||`system`),i=t(!1);function a(e){i.value=e,document.documentElement.classList.toggle(`dark`,e)}function o(e){return e===`system`?window.matchMedia(`(prefers-color-scheme: dark)`).matches:e===`dark`}a(o(r.value)),window.matchMedia(`(prefers-color-scheme: dark)`).addEventListener(`change`,()=>{r.value===`system`&&a(o(`system`))}),e(r,e=>{localStorage.setItem(n,e),a(o(e))});function s(){function e(e){r.value=e}function t(){r.value=i.value?`light`:`dark`}return{mode:r,isDark:i,setMode:e,toggleTheme:t}}export{s as t};
@@ -6,43 +6,43 @@
6
6
  <link rel="icon" type="image/svg+xml" href="/favicon.ico" />
7
7
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
8
  <title>Hermes</title>
9
- <script type="module" crossorigin src="/assets/index-BBxmX-_2.js"></script>
9
+ <script type="module" crossorigin src="/assets/index-D61jARAv.js"></script>
10
10
  <link rel="modulepreload" crossorigin href="/assets/chunk-DECur_0Z.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-rov5CBGT.js">
12
- <link rel="modulepreload" crossorigin href="/assets/router-BDvjwA-_.js">
13
- <link rel="modulepreload" crossorigin href="/assets/_plugin-vue_export-helper-BA1W5EEO.js">
14
- <link rel="modulepreload" crossorigin href="/assets/browser-BIv3pBug.js">
15
- <link rel="modulepreload" crossorigin href="/assets/fade-in.cssr-BvBFOzvO.js">
16
- <link rel="modulepreload" crossorigin href="/assets/Suffix-BMy3yeNM.js">
17
- <link rel="modulepreload" crossorigin href="/assets/Close--rdg4fyH.js">
18
- <link rel="modulepreload" crossorigin href="/assets/Popover-upoiJRFk.js">
19
- <link rel="modulepreload" crossorigin href="/assets/Button-6kn5x8wB.js">
20
- <link rel="modulepreload" crossorigin href="/assets/Empty-CO5atRZx.js">
21
- <link rel="modulepreload" crossorigin href="/assets/Tag-DNHVnryL.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/router-Deam6ffd.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/_plugin-vue_export-helper-9xP-z52L.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/browser-CRTDc_Be.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/fade-in.cssr-ZKfQkQl9.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/Suffix-D03EcSpG.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/Close-CVswUl20.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/Popover-Df4h1K87.js">
19
+ <link rel="modulepreload" crossorigin href="/assets/Button-XML6qzjK.js">
20
+ <link rel="modulepreload" crossorigin href="/assets/Empty-D2AE_ZlK.js">
21
+ <link rel="modulepreload" crossorigin href="/assets/Tag-DdDsBGRV.js">
22
22
  <link rel="modulepreload" crossorigin href="/assets/create-DgSD0xTd.js">
23
- <link rel="modulepreload" crossorigin href="/assets/Select-C96PU4NS.js">
24
- <link rel="modulepreload" crossorigin href="/assets/Warning-cHbjPxlH.js">
25
- <link rel="modulepreload" crossorigin href="/assets/Modal-Ct66o3O5.js">
26
- <link rel="modulepreload" crossorigin href="/assets/Input-DOn-NDi-.js">
27
- <link rel="modulepreload" crossorigin href="/assets/fade-in-height-expand.cssr-CJZoRQPB.js">
28
- <link rel="modulepreload" crossorigin href="/assets/light-CNs4B0mO.js">
29
- <link rel="modulepreload" crossorigin href="/assets/light-DCznx22W.js">
30
- <link rel="modulepreload" crossorigin href="/assets/light-D4vpAk8k.js">
31
- <link rel="modulepreload" crossorigin href="/assets/light-C4XaZN5a.js">
32
- <link rel="modulepreload" crossorigin href="/assets/light-C2mxSkxV.js">
33
- <link rel="modulepreload" crossorigin href="/assets/use-message-x3IR-EsB.js">
34
- <link rel="modulepreload" crossorigin href="/assets/light-vSRhMiQi.js">
23
+ <link rel="modulepreload" crossorigin href="/assets/Select-CN-VEjPp.js">
24
+ <link rel="modulepreload" crossorigin href="/assets/Warning-Dme2hdHB.js">
25
+ <link rel="modulepreload" crossorigin href="/assets/Modal-CcDwIOab.js">
26
+ <link rel="modulepreload" crossorigin href="/assets/Input-DWLw7VSO.js">
27
+ <link rel="modulepreload" crossorigin href="/assets/fade-in-height-expand.cssr-Di-q1YGm.js">
28
+ <link rel="modulepreload" crossorigin href="/assets/light-DbAu3UYZ.js">
29
+ <link rel="modulepreload" crossorigin href="/assets/light-C3LBcWfs.js">
30
+ <link rel="modulepreload" crossorigin href="/assets/light--dc4fdXI.js">
31
+ <link rel="modulepreload" crossorigin href="/assets/light-BOJpHLZr.js">
32
+ <link rel="modulepreload" crossorigin href="/assets/light-DS_k1uOd.js">
33
+ <link rel="modulepreload" crossorigin href="/assets/use-message-sJtQsIMH.js">
34
+ <link rel="modulepreload" crossorigin href="/assets/light-Dewn_gGV.js">
35
35
  <link rel="modulepreload" crossorigin href="/assets/_common-DRFS3Rdv.js">
36
- <link rel="modulepreload" crossorigin href="/assets/Spin-CNWMVtvF.js">
36
+ <link rel="modulepreload" crossorigin href="/assets/Spin-DicuilvT.js">
37
37
  <link rel="modulepreload" crossorigin href="/assets/_common-BeOkYc8W.js">
38
- <link rel="modulepreload" crossorigin href="/assets/light-OgGmbeuv.js">
39
- <link rel="modulepreload" crossorigin href="/assets/light-DalFWniD.js">
40
- <link rel="modulepreload" crossorigin href="/assets/pinia-DRC0gpqt.js">
41
- <link rel="modulepreload" crossorigin href="/assets/profiles-COfldPiC.js">
42
- <link rel="modulepreload" crossorigin href="/assets/sessions-BUqqfXt4.js">
43
- <link rel="modulepreload" crossorigin href="/assets/app-CQp0_YLA.js">
44
- <link rel="modulepreload" crossorigin href="/assets/chat-COI--6cJ.js">
45
- <link rel="modulepreload" crossorigin href="/assets/useTheme-DSy5LWpW.js">
38
+ <link rel="modulepreload" crossorigin href="/assets/light-D-8ypucm.js">
39
+ <link rel="modulepreload" crossorigin href="/assets/light-PgWU0EWW.js">
40
+ <link rel="modulepreload" crossorigin href="/assets/pinia-UrA63qkH.js">
41
+ <link rel="modulepreload" crossorigin href="/assets/profiles-Dk45I0q1.js">
42
+ <link rel="modulepreload" crossorigin href="/assets/sessions-BDXdWl17.js">
43
+ <link rel="modulepreload" crossorigin href="/assets/app-Bye4afa9.js">
44
+ <link rel="modulepreload" crossorigin href="/assets/chat-CIiy7Gwo.js">
45
+ <link rel="modulepreload" crossorigin href="/assets/useTheme-BH5wkcEo.js">
46
46
  <link rel="modulepreload" crossorigin href="/assets/logo-D12u0f1i.js">
47
47
  <link rel="stylesheet" crossorigin href="/assets/index-TD-ctIGy.css">
48
48
  </head>
@@ -135,7 +135,7 @@ ${y}`),h.pop(),`{${T}}`}case"number":return isFinite(d)?String(d):t?t(d):"null";
135
135
  `).filter(Boolean),r=[];for(let n of t)try{let i=JSON.parse(n);r.push(i)}catch{}return r}async function Sg(e){let t=["sessions","export","-"];e&&t.push("--source",e);try{let{stdout:r}=await Le(ke,t,{maxBuffer:52428800,timeout:3e4,...Ie});return jR(r)}catch(r){throw E.error(r,"Hermes CLI: sessions export failed"),new Error(`Failed to list sessions: ${r.message}`)}}async function UR(e,t){let r=await Sg(e),n=[];for(let i of r){let s=i.title;if(!s&&i.messages){let o=i.messages.find(a=>a.role==="user");o?.content&&(s=String(o.content).slice(0,40)+(String(o.content).length>40?"...":""))}n.push({id:i.id,source:i.source,user_id:i.user_id,model:i.model,title:s,started_at:i.started_at,ended_at:i.ended_at,end_reason:i.end_reason,message_count:i.message_count,tool_call_count:i.tool_call_count,input_tokens:i.input_tokens,output_tokens:i.output_tokens,cache_read_tokens:i.cache_read_tokens||0,cache_write_tokens:i.cache_write_tokens||0,reasoning_tokens:i.reasoning_tokens||0,billing_provider:i.billing_provider,estimated_cost_usd:i.estimated_cost_usd,actual_cost_usd:i.actual_cost_usd??null,cost_status:i.cost_status||""})}return n.sort((i,s)=>s.started_at-i.started_at),t&&t>0?n.slice(0,t):n}async function $R(e){let t=["sessions","export","-","--session-id",e];try{let{stdout:r}=await Le(ke,t,{maxBuffer:52428800,timeout:3e4,...Ie}),n=jR(r);if(n.length===0)return null;let i=n[0];return{id:i.id,source:i.source,user_id:i.user_id,model:i.model,title:i.title,started_at:i.started_at,ended_at:i.ended_at,end_reason:i.end_reason,message_count:i.message_count,tool_call_count:i.tool_call_count,input_tokens:i.input_tokens,output_tokens:i.output_tokens,cache_read_tokens:i.cache_read_tokens||0,cache_write_tokens:i.cache_write_tokens||0,reasoning_tokens:i.reasoning_tokens||0,billing_provider:i.billing_provider,estimated_cost_usd:i.estimated_cost_usd,actual_cost_usd:i.actual_cost_usd??null,cost_status:i.cost_status||"",messages:i.messages}}catch(r){if(r.code===1||r.status===1)return null;throw E.error(r,"Hermes CLI: session export failed"),new Error(`Failed to get session: ${r.message}`)}}async function gn(e){try{return await Le(ke,["sessions","delete",e,"--yes"],{timeout:1e4,...Ie}),!0}catch(t){return E.error(t,"Hermes CLI: session delete failed"),!1}}async function HR(e,t){try{return await Le(ke,["sessions","rename",e,t],{timeout:1e4,...Ie}),!0}catch(r){return E.error(r,"Hermes CLI: session rename failed"),!1}}async function zR(){try{let{stdout:e}=await Le(ke,["--version"],{timeout:5e3,...Ie});return e.trim()}catch{return""}}async function HX(){let e=(0,Ol.spawn)(ke,["gateway","run"],{detached:!0,stdio:"ignore",windowsHide:!0});return e.unref(),e.pid??null}async function qr(){if(UX){try{await zX()}catch{}let r=await HX();return r?`Gateway restarted (PID: ${r})`:"Gateway restart triggered"}let{stdout:e,stderr:t}=await Le(ke,["gateway","restart"],{timeout:3e4,...Ie});return e||t}async function zX(){let{stdout:e,stderr:t}=await Le(ke,["gateway","stop"],{timeout:3e4,...Ie});return e||t}async function WR(){try{let{stdout:e}=await Le(ke,["logs","list"],{timeout:1e4,...Ie}),t=[],r=e.trim().split(`
136
136
  `).filter(n=>n.includes(".log"));for(let n of r){let i=n.match(/^\s+(\S+)\s+([\d.]+\w+)\s+(.+)$/);if(i){let o=i[1].replace(/\.log$/,"");["agent","errors","gateway"].includes(o)&&t.push({name:o,size:i[2],modified:i[3].trim()})}}return t}catch(e){return E.error(e,"Hermes CLI: logs list failed"),[]}}async function GR(e="agent",t=100,r,n,i){let s=["logs",e,"-n",String(t)];r&&s.push("--level",r),n&&s.push("--session",n),i&&s.push("--since",i);try{let{stdout:o}=await Le(ke,s,{maxBuffer:10485760,timeout:15e3,...Ie});return o}catch(o){throw E.error(o,"Hermes CLI: logs read failed"),new Error(`Failed to read logs: ${o.message}`)}}async function VR(){try{let{stdout:e}=await Le(ke,["profile","list"],{timeout:1e4,...Ie}),t=e.trim().split(`
137
137
  `).filter(Boolean),r=[];for(let n of t){if(n.startsWith(" Profile")||n.match(/^ ─/))continue;let i=n.match(/^\s+(◆)?(\S+)\s{2,}(\S+)\s{2,}(\S+)\s{2,}(.*)$/);i&&r.push({name:i[2],active:!!i[1],model:i[3],gateway:i[4],alias:i[5].trim()==="\u2014"?"":i[5].trim()})}return r}catch(e){throw E.error(e,"Hermes CLI: profile list failed"),new Error(`Failed to list profiles: ${e.message}`)}}async function Cg(e){try{let{stdout:t}=await Le(ke,["profile","show",e],{timeout:1e4,...Ie}),r={};for(let o of t.trim().split(`
138
- `)){let a=o.match(/^(\w[\w\s]*?):\s+(.+)$/);a&&(r[a[1].trim().toLowerCase().replace(/\s+/g,"_")]=a[2].trim())}let n=r.model||"",i=n.match(/\((.+)\)/),s=i?n.replace(/\s*\(.+\)/,"").trim():n;return{name:r.profile||e,path:r.path||"",model:s,provider:i?i[1]:"",gateway:r.gateway||"",skills:parseInt(r.skills||"0",10),hasEnv:r[".env"]==="exists",hasSoulMd:r.soul_md==="exists"}}catch(t){throw t.code===1||t.status===1?new Error(`Profile "${e}" not found`):(E.error(t,"Hermes CLI: profile show failed"),new Error(`Failed to get profile: ${t.message}`))}}async function KR(e,t){let r=["profile","create",e];t&&r.push("--clone");try{let{stdout:n,stderr:i}=await Le(ke,r,{timeout:15e3,...Ie});return n||i}catch(n){throw E.error(n,"Hermes CLI: profile create failed"),new Error(`Failed to create profile: ${n.message}`)}}async function YR(e){try{return await Le(ke,["profile","delete",e,"--yes"],{timeout:1e4,...Ie}),!0}catch(t){return E.error(t,"Hermes CLI: profile delete failed"),!1}}async function XR(e,t){try{return await Le(ke,["profile","rename",e,t],{timeout:1e4,...Ie}),!0}catch(r){return E.error(r,"Hermes CLI: profile rename failed"),!1}}async function JR(e){try{let{stdout:t,stderr:r}=await Le(ke,["profile","use",e],{timeout:1e4,...Ie});return t||r}catch(t){throw E.error(t,"Hermes CLI: profile use failed"),new Error(`Failed to switch profile: ${t.message}`)}}async function QR(e,t){let r=["profile","export",e];t&&r.push("--output",t);try{let{stdout:n,stderr:i}=await Le(ke,r,{timeout:6e4,...Ie});return n||i}catch(n){throw E.error(n,"Hermes CLI: profile export failed"),new Error(`Failed to export profile: ${n.message}`)}}async function ZR(){try{let{stdout:e,stderr:t}=await Le(ke,["setup","--non-interactive","--reset"],{timeout:3e4,...Ie});return e||t}catch(e){throw E.error(e,"Hermes CLI: setup reset failed"),new Error(`Failed to reset config: ${e.message}`)}}async function e2(e,t){let r=["profile","import",e];t&&r.push("--name",t);try{let{stdout:n,stderr:i}=await Le(ke,r,{timeout:6e4,...Ie});return n||i}catch(n){throw E.error(n,"Hermes CLI: profile import failed"),new Error(`Failed to import profile: ${n.message}`)}}var Rl="0.4.5",Cs="";async function t2(){try{let{readFileSync:e}=require("fs"),r=JSON.parse(e(require("path").join(__dirname,"../../package.json"),"utf-8")).name,n=await fetch(`https://registry.npmjs.org/${r}/latest`,{signal:AbortSignal.timeout(1e4)});n.ok&&(Cs=(await n.json()).version,Cs!==Rl&&console.log(`Update available: ${Rl} \u2192 ${Cs}`))}catch{}}function kg(){setTimeout(t2,5e3),setInterval(t2,1800*1e3)}async function r2(e){let r=(await zR()).split(`
138
+ `)){let a=o.match(/^(\w[\w\s]*?):\s+(.+)$/);a&&(r[a[1].trim().toLowerCase().replace(/\s+/g,"_")]=a[2].trim())}let n=r.model||"",i=n.match(/\((.+)\)/),s=i?n.replace(/\s*\(.+\)/,"").trim():n;return{name:r.profile||e,path:r.path||"",model:s,provider:i?i[1]:"",gateway:r.gateway||"",skills:parseInt(r.skills||"0",10),hasEnv:r[".env"]==="exists",hasSoulMd:r.soul_md==="exists"}}catch(t){throw t.code===1||t.status===1?new Error(`Profile "${e}" not found`):(E.error(t,"Hermes CLI: profile show failed"),new Error(`Failed to get profile: ${t.message}`))}}async function KR(e,t){let r=["profile","create",e];t&&r.push("--clone");try{let{stdout:n,stderr:i}=await Le(ke,r,{timeout:15e3,...Ie});return n||i}catch(n){throw E.error(n,"Hermes CLI: profile create failed"),new Error(`Failed to create profile: ${n.message}`)}}async function YR(e){try{return await Le(ke,["profile","delete",e,"--yes"],{timeout:1e4,...Ie}),!0}catch(t){return E.error(t,"Hermes CLI: profile delete failed"),!1}}async function XR(e,t){try{return await Le(ke,["profile","rename",e,t],{timeout:1e4,...Ie}),!0}catch(r){return E.error(r,"Hermes CLI: profile rename failed"),!1}}async function JR(e){try{let{stdout:t,stderr:r}=await Le(ke,["profile","use",e],{timeout:1e4,...Ie});return t||r}catch(t){throw E.error(t,"Hermes CLI: profile use failed"),new Error(`Failed to switch profile: ${t.message}`)}}async function QR(e,t){let r=["profile","export",e];t&&r.push("--output",t);try{let{stdout:n,stderr:i}=await Le(ke,r,{timeout:6e4,...Ie});return n||i}catch(n){throw E.error(n,"Hermes CLI: profile export failed"),new Error(`Failed to export profile: ${n.message}`)}}async function ZR(){try{let{stdout:e,stderr:t}=await Le(ke,["setup","--non-interactive","--reset"],{timeout:3e4,...Ie});return e||t}catch(e){throw E.error(e,"Hermes CLI: setup reset failed"),new Error(`Failed to reset config: ${e.message}`)}}async function e2(e,t){let r=["profile","import",e];t&&r.push("--name",t);try{let{stdout:n,stderr:i}=await Le(ke,r,{timeout:6e4,...Ie});return n||i}catch(n){throw E.error(n,"Hermes CLI: profile import failed"),new Error(`Failed to import profile: ${n.message}`)}}var Rl="0.4.6",Cs="";async function t2(){try{let{readFileSync:e}=require("fs"),r=JSON.parse(e(require("path").join(__dirname,"../../package.json"),"utf-8")).name,n=await fetch(`https://registry.npmjs.org/${r}/latest`,{signal:AbortSignal.timeout(1e4)});n.ok&&(Cs=(await n.json()).version,Cs!==Rl&&console.log(`Update available: ${Rl} \u2192 ${Cs}`))}catch{}}function kg(){setTimeout(t2,5e3),setInterval(t2,1800*1e3)}async function r2(e){let r=(await zR()).split(`
139
139
  `)[0].replace("Hermes Agent ","")||"",n=!1;try{let s=Pe()?.getUpstream()||ae.upstream;n=(await fetch(`${s.replace(/\/$/,"")}/health`,{signal:AbortSignal.timeout(5e3)})).ok}catch{}e.body={status:n?"ok":"error",platform:"hermes-agent",version:r,gateway:n?"running":"stopped",webui_version:Rl,webui_latest:Cs,webui_update_available:Cs&&Cs!==Rl,node_version:process.versions.node}}var Tg=new q;Tg.get("/health",r2);je();var wce=ae.upstream.replace(/\/$/,"");var GX=[];function n2(e){for(let t of GX){let r=t(e);r&&typeof r.catch=="function"&&r.catch(n=>E.error(n,"Webhook callback error"))}}je();async function i2(e){let t=e.request.body;if(!t||!t.event){e.status=400,e.body={error:"Missing event field"};return}E.info("Received webhook event: %s",t.event),n2(t),e.body={ok:!0}}var Ag=new q;Ag.post("/webhook",i2);var o2=require("crypto"),a2=require("fs/promises");var s2=50*1024*1024;async function c2(e){let t=e.get("content-type")||"";if(!t.startsWith("multipart/form-data")){e.status=400,e.body={error:"Expected multipart/form-data"};return}let r="--"+t.split("boundary=")[1];if(!r||r==="--undefined"){e.status=400,e.body={error:"Missing boundary"};return}let n=[],i=0;for await(let u of e.req){if(i+=u.length,i>s2){e.status=413,e.body={error:`File too large (max ${s2/1024/1024}MB)`};return}n.push(u)}let s=Buffer.concat(n),o=Buffer.from(r),a=KX(s,o),c=[];for(let u of a){let l=u.indexOf(Buffer.from(`\r
140
140
  \r
141
141
  `));if(l===-1)continue;let f=u.subarray(0,l).toString("utf-8"),m=u.subarray(l+4,u.length-2),d="",h=f.match(/filename\*=UTF-8''(.+)/i);if(h)d=decodeURIComponent(h[1]);else{let b=f.match(/filename="([^"]+)"/);if(!b)continue;d=b[1]}let g=d.includes(".")?"."+d.split(".").pop():"",v=(0,o2.randomBytes)(8).toString("hex")+g,y=`${ae.uploadDir}/${v}`;await(0,a2.writeFile)(y,m),c.push({name:d,path:y})}e.body={files:c}}function KX(e,t){let r=[],n=0;for(;;){let i=e.indexOf(t,n);if(i===-1)break;n>0&&r.push(e.subarray(n+2,i)),n=i+t.length}return r}var Og=new q;Og.post("/upload",c2);var ks=require("child_process"),fa=require("path");function p2(){return(0,fa.dirname)(process.execPath)}function u2(){return(0,fa.join)(p2(),process.platform==="win32"?"npm.cmd":"npm")}function l2(){return(0,fa.join)(p2(),process.platform==="win32"?"hermes-web-ui.cmd":"hermes-web-ui")}function f2(){return process.env.ComSpec||"cmd.exe"}function d2(e){return`"${e.replace(/"/g,'""')}"`}function XX(){return process.platform==="win32"?(0,ks.execFileSync)(f2(),["/d","/s","/c",`${d2(u2())} install -g hermes-web-ui@latest`],{encoding:"utf-8",timeout:12e4,stdio:["pipe","pipe","pipe"],windowsHide:!0}):(0,ks.execFileSync)(u2(),["install","-g","hermes-web-ui@latest"],{encoding:"utf-8",timeout:12e4,stdio:["pipe","pipe","pipe"]})}function JX(e){return process.platform==="win32"?(0,ks.spawn)(f2(),["/d","/s","/c",`${d2(l2())} restart --port ${e}`],{detached:!0,stdio:"ignore",windowsHide:!0}):(0,ks.spawn)(l2(),["restart","--port",e],{detached:!0,stdio:"ignore",windowsHide:!0})}async function m2(e){try{let t=XX();e.body={success:!0,message:t.trim()},setTimeout(()=>{JX(process.env.PORT||"8648").unref(),process.exit(0)},2e3)}catch(t){e.status=500,e.body={success:!1,message:t.stderr||t.message}}}var Rg=new q;Rg.post("/api/hermes/update",m2);var yn=require("fs/promises");var Pg=require("path"),h2=require("os"),Pl=require("node:crypto"),g2=(0,Pg.join)((0,h2.homedir)(),".hermes-web-ui"),Ng=(0,Pg.join)(g2,".credentials"),ZX={N:16384,r:8,p:1,maxmem:64*1024*1024};function y2(e,t){return(0,Pl.scryptSync)(e,t,64,ZX).toString("hex")}async function da(){try{let e=await(0,yn.readFile)(Ng,"utf-8");return JSON.parse(e)}catch{return null}}async function Nl(e,t){let r=(0,Pl.randomBytes)(16).toString("hex"),n=y2(t,r),i={username:e,password_hash:n,salt:r,created_at:Date.now()};return await(0,yn.mkdir)(g2,{recursive:!0}),await(0,yn.writeFile)(Ng,JSON.stringify(i,null,2),{mode:384}),i}async function v2(){try{await(0,yn.unlink)(Ng)}catch{}}async function Ll(e,t){let r=await da();return!r||r.username!==e?!1:y2(t,r.salt)===r.password_hash}async function b2(e){let t=await da();e.body={hasPasswordLogin:!!t,username:t?.username||null}}async function x2(e){let{username:t,password:r}=e.request.body;if(!t||!r){e.status=400,e.body={error:"Username and password are required"};return}if(!await Ll(t,r)){e.status=401,e.body={error:"Invalid username or password"};return}let i=await ar();if(!i){e.status=500,e.body={error:"Auth is disabled on this server"};return}e.body={token:i}}async function _2(e){let{username:t,password:r}=e.request.body;if(!t||!r){e.status=400,e.body={error:"Username and password are required"};return}if(t.length<2){e.status=400,e.body={error:"Username must be at least 2 characters"};return}if(r.length<6){e.status=400,e.body={error:"Password must be at least 6 characters"};return}await Nl(t,r),e.body={success:!0}}async function w2(e){let{currentPassword:t,newPassword:r}=e.request.body;if(!t||!r){e.status=400,e.body={error:"Current password and new password are required"};return}if(r.length<6){e.status=400,e.body={error:"New password must be at least 6 characters"};return}let n=await da();if(!n){e.status=400,e.body={error:"Password login not configured"};return}if(!await Ll(n.username,t)){e.status=400,e.body={error:"Current password is incorrect"};return}await Nl(n.username,r),e.body={success:!0}}async function E2(e){let{currentPassword:t,newUsername:r}=e.request.body;if(!t||!r){e.status=400,e.body={error:"Current password and new username are required"};return}if(r.length<2){e.status=400,e.body={error:"Username must be at least 2 characters"};return}let n=await da();if(!n){e.status=400,e.body={error:"Password login not configured"};return}if(!await Ll(n.username,t)){e.status=400,e.body={error:"Current password is incorrect"};return}await Nl(r,t),e.body={success:!0}}async function S2(e){await v2(),e.body={success:!0}}var Il=new q;Il.get("/api/auth/status",b2);Il.post("/api/auth/login",x2);var Ts=new q;Ts.post("/api/auth/setup",_2);Ts.post("/api/auth/change-password",w2);Ts.post("/api/auth/change-username",E2);Ts.delete("/api/auth/password",S2);var tJ=3,rJ=300,nJ=3e4,iJ=200,sJ=["[system:","you've reached the maximum number of tool-calling iterations allowed.","you have reached the maximum number of tool-calling iterations allowed."],C2=new Map;function oJ(e){return e||"__all__"}function jr(e){return typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):""}function Br(e){if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e))return e.map(s=>Br(s).trim()).filter(Boolean).join(`
@@ -404,7 +404,7 @@ ${s}`},{role:"assistant",content:"Understood, I will update the summary."});let
404
404
  `));if(p===-1)continue;let m=l.subarray(0,p).toString("utf-8"),d=l.subarray(p+4,l.length-2),h="",g=m.match(/filename\*=UTF-8''(.+)/i);if(g)h=decodeURIComponent(g[1]);else{let b=m.match(/filename="([^"]+)"/);if(!b)continue;h=b[1]}if(d.length>Jp){e.status=413,e.body={error:`File ${h} too large`,code:"file_too_large"};return}let v=t?`${t}/${h}`:h;if(pc(v)){e.status=403,e.body={error:`Cannot overwrite sensitive file: ${h}`,code:"permission_denied"};return}let y=lt(v);await c.writeFile(y,d),u.push({name:h,path:v})}e.body={files:u}});function Ane(e,t){let r=[],n=0;for(;;){let i=e.indexOf(t,n);if(i===-1)break;if(n>0){let s=n+2;r.push(e.subarray(s,i))}n=i+t.length}return r}var Qp=require("path");var f0=new q,One={".txt":"text/plain",".html":"text/html",".htm":"text/html",".css":"text/css",".js":"application/javascript",".json":"application/json",".xml":"application/xml",".csv":"text/csv",".md":"text/markdown",".pdf":"application/pdf",".zip":"application/zip",".gz":"application/gzip",".tar":"application/x-tar",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".webp":"image/webp",".mp3":"audio/mpeg",".wav":"audio/wav",".mp4":"video/mp4",".webm":"video/webm",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".ppt":"application/vnd.ms-powerpoint",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".py":"text/x-python",".ts":"text/typescript",".tsx":"text/typescript",".rs":"text/x-rust",".go":"text/x-go",".java":"text/x-java",".c":"text/x-c",".cpp":"text/x-c++",".h":"text/x-c",".sh":"text/x-shellscript",".yaml":"text/yaml",".yml":"text/yaml",".toml":"text/toml",".log":"text/plain"};function Rne(e){let t=(0,Qp.extname)(e).toLowerCase();return One[t]||"application/octet-stream"}f0.get("/api/hermes/download",async e=>{let t=e.query.path,r=e.query.name;if(!t){e.status=400,e.body={error:"Missing path parameter",code:"missing_path"};return}try{let n=t.startsWith("/")?M(t):lt(t),i;WI(n)?i=await GI.readFile(n):i=await(await Nt()).readFile(n);let s=r||(0,Qp.basename)(n),o=Rne(s);e.set("Content-Type",o),e.set("Content-Disposition",`attachment; filename="${encodeURIComponent(s)}"; filename*=UTF-8''${encodeURIComponent(s)}`),e.set("Content-Length",String(i.length)),e.set("Cache-Control","no-cache"),e.body=i}catch(n){let i=n.code||"unknown",s={missing_path:400,invalid_path:400,not_found:404,ENOENT:404,file_too_large:413,unsupported_backend:501,backend_error:502,backend_timeout:504};e.status=s[i]||500,e.body={error:n.message,code:i}}});function Pne(e){let t=Pe();return t?t.getUpstream(e):ae.upstream.replace(/\/$/,"")}function Nne(e){return Pe()?.getApiKey(e)??null}function Lne(e){return e.get("x-hermes-profile")||e.query.profile||"default"}function Ine(e){let t={"Content-Type":"application/json"},r=Nne(e);return r&&(t.Authorization=`Bearer ${r}`),t}var Mne=3e4;async function Pn(e,t,r){let n=Lne(e),i=Pne(n),s=new URLSearchParams(e.search||"");s.delete("token");let o=s.toString(),a=`${i}${t}${o?`?${o}`:""}`,c=Ine(n),u=e.req.method!=="GET"&&e.req.method!=="HEAD"?JSON.stringify(e.request.body||{}):void 0,l=await fetch(a,{method:r||e.req.method,headers:c,body:u,signal:AbortSignal.timeout(Mne)});if(!l.ok){e.status=502,e.set("Content-Type","application/json"),e.body={error:{message:`Upstream error: ${l.status} ${l.statusText}`}};return}e.status=l.status,e.set("Content-Type",l.headers.get("content-type")||"application/json"),e.body=await l.json()}async function VI(e){await Pn(e,"/api/jobs")}async function KI(e){await Pn(e,`/api/jobs/${e.params.id}`)}async function YI(e){await Pn(e,"/api/jobs")}async function XI(e){await Pn(e,`/api/jobs/${e.params.id}`)}async function JI(e){await Pn(e,`/api/jobs/${e.params.id}`)}async function QI(e){await Pn(e,`/api/jobs/${e.params.id}/pause`)}async function ZI(e){await Pn(e,`/api/jobs/${e.params.id}/resume`)}async function e3(e){await Pn(e,`/api/jobs/${e.params.id}/run`)}var Sr=new q;Sr.get("/api/hermes/jobs",VI);Sr.get("/api/hermes/jobs/:id",KI);Sr.post("/api/hermes/jobs",YI);Sr.patch("/api/hermes/jobs/:id",XI);Sr.delete("/api/hermes/jobs/:id",JI);Sr.post("/api/hermes/jobs/:id/pause",QI);Sr.post("/api/hermes/jobs/:id/resume",ZI);Sr.post("/api/hermes/jobs/:id/run",e3);Ul();function r3(){return Pe()}var d0=new Map;function Fne(e,t){d0.set(e,t),setTimeout(()=>d0.delete(e),1800*1e3)}function qne(e){return d0.get(e)}function Bne(e){let t=String(e?.message||""),r=String(e?.cause?.code||"");return r==="ECONNREFUSED"||r==="ECONNRESET"||/ECONNREFUSED|ECONNRESET|fetch failed|socket hang up/i.test(t)}async function jne(e,t=5e3){let r=Date.now()+t,n=`${e}/health`;for(;Date.now()<r;){try{if((await fetch(n,{method:"GET",signal:AbortSignal.timeout(1200)})).ok)return!0}catch{}await new Promise(i=>setTimeout(i,250))}return!1}function m0(e){return e.get("x-hermes-profile")||e.query.profile||"default"}function Une(e){let t=r3();if(t){let r=m0(e);return r&&r!=="default"?t.getUpstream(r):t.getUpstream()}return ae.upstream.replace(/\/$/,"")}function $ne(e,t){let r={};for(let[i,s]of Object.entries(e.headers)){if(s==null)continue;let o=i.toLowerCase();if(o==="host")r.host=new URL(t).host;else{if(o==="origin"||o==="referer"||o==="connection"||o==="authorization")continue;{let a=Array.isArray(s)?s[0]:s;a&&(r[i]=a)}}}let n=r3();if(n){let i=n.getApiKey(m0(e));i&&(r.authorization=`Bearer ${i}`)}return r}var Hne=/^\/v1\/runs\/([^/]+)\/events$/;function t3(e){let t=e.split(`
405
405
  `);for(let r of t)if(r.startsWith("data: "))try{let n=JSON.parse(r.slice(6));if(n.event==="run.completed"&&n.usage&&n.run_id){let i=qne(n.run_id);if(i)return Hg(i,n.usage.input_tokens,n.usage.output_tokens),n.run_id}}catch{}return null}async function zne(e,t){if(!t.body){e.res.end();return}let r=t.body.getReader(),n=new TextDecoder,i="";try{for(;;){let{done:s,value:o}=await r.read();if(s)break;e.res.write(o),i+=n.decode(o,{stream:!0});let a;for(;(a=i.indexOf(`
406
406
 
407
- `))!==-1;){let c=i.slice(0,a);i=i.slice(a+2),t3(c)}}i.trim()&&t3(i)}finally{e.res.end()}}async function Zp(e){let t=m0(e),r=Une(e),n=e.path.replace(/^\/api\/hermes\/v1/,"/v1").replace(/^\/api\/hermes/,"/api"),i=new URLSearchParams(e.search||"");i.delete("token");let s=i.toString(),o=`${r}${n}${s?`?${s}`:""}`,a=$ne(e,r);try{let c;if(e.req.method!=="GET"&&e.req.method!=="HEAD"){let f=e.request.body;typeof f=="string"?c=f:f&&typeof f=="object"&&(c=JSON.stringify(f))}let u={method:e.req.method,headers:a,body:c},l;try{l=await fetch(o,u)}catch(f){if(Bne(f)&&await jne(r))l=await fetch(o,u);else throw f}if(l.headers.forEach((f,m)=>{let d=m.toLowerCase();d!=="transfer-encoding"&&d!=="connection"&&e.set(m,f)}),e.status=l.status,e.req.method==="POST"&&/\/v1\/runs$/.test(n)&&c)try{let f=JSON.parse(c);if(f.session_id){let m=await l.text();e.res.write(m),e.res.end();try{let d=JSON.parse(m);d.run_id&&Fne(d.run_id,f.session_id)}catch{}return}}catch{}if(n.match(Hne)){await zne(e,l);return}if(l.body){let f=l.body.getReader();await(async()=>{for(;;){let{done:d,value:h}=await f.read();if(d)break;e.res.write(h)}e.res.end()})()}else e.res.end()}catch(c){e.res.headersSent?e.res.end():(e.status=502,e.set("Content-Type","application/json"),e.body={error:{message:`Proxy error: ${c.message}`}})}}var ef=new q;ef.all("/api/hermes/{*any}",Zp);ef.all("/v1/{*any}",Zp);async function n3(e,t){if(e.path.startsWith("/api/hermes/")||e.path.startsWith("/v1/"))return Zp(e);await t()}function i3(e,t){return e.use(Tg.routes()),e.use(Ag.routes()),e.use(Il.routes()),e.use(t),e.use(Ts.routes()),e.use(Og.routes()),e.use(Rg.routes()),e.use(mt.routes()),e.use(br.routes()),e.use(Js.routes()),e.use(kp.routes()),e.use(Ua.routes()),e.use($a.routes()),e.use(Ha.routes()),e.use(Pp.routes()),e.use(Wa.routes()),e.use(Va.routes()),e.use(eo.routes()),e.use(lc.routes()),e.use(dt.routes()),e.use(Yt.routes()),e.use(f0.routes()),e.use(Sr.routes()),e.use(ef.routes()),n3}je();var Wne="0.4.5";process.on("uncaughtException",e=>{E.fatal(e,"Uncaught exception"),process.exit(1)});process.on("unhandledRejection",e=>{E.error(e,"Unhandled rejection")});var ki=null;async function l3(){console.log(`hermes-web-ui v${Wne} starting...`),await(0,h0.mkdir)(ae.uploadDir,{recursive:!0}),await(0,h0.mkdir)(ae.dataDir,{recursive:!0});let e=await ar(),t=new u1;await gO(),console.log("[bootstrap] gateway manager initialized");let{initUsageStore:r}=await Promise.resolve().then(()=>(Ul(),u4));r(),console.log("[bootstrap] usage store initialized"),t.use((0,s3.default)({origin:ae.corsOrigins})),t.use(WS()),console.log("[bootstrap] cors + bodyParser registered");let n=i3(t,XC(e));t.use(n),console.log("[bootstrap] routes registered"),e&&(console.log(`Auth enabled \u2014 token: ${e}`),E.info("Auth enabled \u2014 token: %s",e));let i=(0,u3.resolve)(__dirname,"..","client");t.use((0,o3.default)(i)),t.use(async o=>{!o.path.startsWith("/api")&&o.path!=="/health"&&o.path!=="/upload"&&o.path!=="/webhook"&&await(0,a3.default)(o,"index.html",{root:i})}),console.log("[bootstrap] SPA fallback registered"),console.log(`[bootstrap] listening on port ${ae.port}`),ki=t.listen(ae.port,"0.0.0.0"),console.log("[bootstrap] app.listen called"),wR(ki),console.log("[bootstrap] terminal websocket setup");let s=new wp(ki);m4(s),s.setGatewayManager(Pe()),ki.on("upgrade",(o,a)=>{let c=new URL(o.url||"",`http://${o.headers.host}`);c.pathname!=="/api/hermes/terminal"&&!c.pathname.startsWith("/socket.io/")&&a.destroy()}),ki.on("listening",()=>{let o=c3.default.networkInterfaces(),a=Object.values(o).flat().find(c=>c?.family==="IPv4"&&!c?.internal)?.address||"localhost";console.log(`Server: http://localhost:${ae.port} (LAN: http://${a}:${ae.port})`),console.log(`Upstream: ${ae.upstream}`),console.log("Log: ~/.hermes-web-ui/logs/server.log"),E.info("Server: http://localhost:%d (LAN: http://%s:%d)",ae.port,a,ae.port),E.info("Upstream: %s",ae.upstream),s.restoreWhenReady()}),ki.on("error",o=>{console.error("[bootstrap] server error:",o.code||o.message),E.error({err:o},"Server error")}),yO(ki,s),kg()}l3();0&&(module.exports={bootstrap});
407
+ `))!==-1;){let c=i.slice(0,a);i=i.slice(a+2),t3(c)}}i.trim()&&t3(i)}finally{e.res.end()}}async function Zp(e){let t=m0(e),r=Une(e),n=e.path.replace(/^\/api\/hermes\/v1/,"/v1").replace(/^\/api\/hermes/,"/api"),i=new URLSearchParams(e.search||"");i.delete("token");let s=i.toString(),o=`${r}${n}${s?`?${s}`:""}`,a=$ne(e,r);try{let c;if(e.req.method!=="GET"&&e.req.method!=="HEAD"){let f=e.request.body;typeof f=="string"?c=f:f&&typeof f=="object"&&(c=JSON.stringify(f))}let u={method:e.req.method,headers:a,body:c},l;try{l=await fetch(o,u)}catch(f){if(Bne(f)&&await jne(r))l=await fetch(o,u);else throw f}if(l.headers.forEach((f,m)=>{let d=m.toLowerCase();d!=="transfer-encoding"&&d!=="connection"&&e.set(m,f)}),e.status=l.status,e.req.method==="POST"&&/\/v1\/runs$/.test(n)&&c)try{let f=JSON.parse(c);if(f.session_id){let m=await l.text();e.res.write(m),e.res.end();try{let d=JSON.parse(m);d.run_id&&Fne(d.run_id,f.session_id)}catch{}return}}catch{}if(n.match(Hne)){await zne(e,l);return}if(l.body){let f=l.body.getReader();await(async()=>{for(;;){let{done:d,value:h}=await f.read();if(d)break;e.res.write(h)}e.res.end()})()}else e.res.end()}catch(c){e.res.headersSent?e.res.end():(e.status=502,e.set("Content-Type","application/json"),e.body={error:{message:`Proxy error: ${c.message}`}})}}var ef=new q;ef.all("/api/hermes/{*any}",Zp);ef.all("/v1/{*any}",Zp);async function n3(e,t){if(e.path.startsWith("/api/hermes/")||e.path.startsWith("/v1/"))return Zp(e);await t()}function i3(e,t){return e.use(Tg.routes()),e.use(Ag.routes()),e.use(Il.routes()),e.use(t),e.use(Ts.routes()),e.use(Og.routes()),e.use(Rg.routes()),e.use(mt.routes()),e.use(br.routes()),e.use(Js.routes()),e.use(kp.routes()),e.use(Ua.routes()),e.use($a.routes()),e.use(Ha.routes()),e.use(Pp.routes()),e.use(Wa.routes()),e.use(Va.routes()),e.use(eo.routes()),e.use(lc.routes()),e.use(dt.routes()),e.use(Yt.routes()),e.use(f0.routes()),e.use(Sr.routes()),e.use(ef.routes()),n3}je();var Wne="0.4.6";process.on("uncaughtException",e=>{E.fatal(e,"Uncaught exception"),process.exit(1)});process.on("unhandledRejection",e=>{E.error(e,"Unhandled rejection")});var ki=null;async function l3(){console.log(`hermes-web-ui v${Wne} starting...`),await(0,h0.mkdir)(ae.uploadDir,{recursive:!0}),await(0,h0.mkdir)(ae.dataDir,{recursive:!0});let e=await ar(),t=new u1;await gO(),console.log("[bootstrap] gateway manager initialized");let{initUsageStore:r}=await Promise.resolve().then(()=>(Ul(),u4));r(),console.log("[bootstrap] usage store initialized"),t.use((0,s3.default)({origin:ae.corsOrigins})),t.use(WS()),console.log("[bootstrap] cors + bodyParser registered");let n=i3(t,XC(e));t.use(n),console.log("[bootstrap] routes registered"),e&&(console.log(`Auth enabled \u2014 token: ${e}`),E.info("Auth enabled \u2014 token: %s",e));let i=(0,u3.resolve)(__dirname,"..","client");t.use((0,o3.default)(i)),t.use(async o=>{!o.path.startsWith("/api")&&o.path!=="/health"&&o.path!=="/upload"&&o.path!=="/webhook"&&await(0,a3.default)(o,"index.html",{root:i})}),console.log("[bootstrap] SPA fallback registered"),console.log(`[bootstrap] listening on port ${ae.port}`),ki=t.listen(ae.port,"0.0.0.0"),console.log("[bootstrap] app.listen called"),wR(ki),console.log("[bootstrap] terminal websocket setup");let s=new wp(ki);m4(s),s.setGatewayManager(Pe()),ki.on("upgrade",(o,a)=>{let c=new URL(o.url||"",`http://${o.headers.host}`);c.pathname!=="/api/hermes/terminal"&&!c.pathname.startsWith("/socket.io/")&&a.destroy()}),ki.on("listening",()=>{let o=c3.default.networkInterfaces(),a=Object.values(o).flat().find(c=>c?.family==="IPv4"&&!c?.internal)?.address||"localhost";console.log(`Server: http://localhost:${ae.port} (LAN: http://${a}:${ae.port})`),console.log(`Upstream: ${ae.upstream}`),console.log("Log: ~/.hermes-web-ui/logs/server.log"),E.info("Server: http://localhost:%d (LAN: http://%s:%d)",ae.port,a,ae.port),E.info("Upstream: %s",ae.upstream),s.restoreWhenReady()}),ki.on("error",o=>{console.error("[bootstrap] server error:",o.code||o.message),E.error({err:o},"Server error")}),yO(ki,s),kg()}l3();0&&(module.exports={bootstrap});
408
408
  /*! Bundled license information:
409
409
 
410
410
  ee-first/index.js:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hermes-web-ui",
3
- "version": "0.4.5",
3
+ "version": "0.4.6",
4
4
  "description": "Self-hosted AI chat dashboard for Hermes Agent — multi-model (Claude, GPT, Gemini, DeepSeek) web UI with Telegram, Discord, Slack, WhatsApp integration",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1 +0,0 @@
1
- import{a as e,st as t}from"./router-BDvjwA-_.js";import{n}from"./pinia-DRC0gpqt.js";async function r(){return e(`/health`)}async function i(){return e(`/api/hermes/update`,{method:`POST`})}async function a(){return e(`/api/hermes/config/models`)}async function o(){return e(`/api/hermes/available-models`)}async function s(t){await e(`/api/hermes/config/model`,{method:`PUT`,body:JSON.stringify(t)})}async function c(t){await e(`/api/hermes/config/providers`,{method:`POST`,body:JSON.stringify(t)})}async function l(t){await e(`/api/hermes/config/providers/${encodeURIComponent(t)}`,{method:`DELETE`})}async function u(t,n){await e(`/api/hermes/config/providers/${encodeURIComponent(t)}`,{method:`PUT`,body:JSON.stringify(n)})}var d=`0.4.5`,f=`hermes_sidebar_collapsed`,p=n(`app`,()=>{let e=t(!1),n=t(localStorage.getItem(f)===`1`),o=t(!1),c=t(d),l=t(``),u=t(!1),p=t(!1),m=t([]),h=t(``),g=t(``),_=t({}),v=t(),y=t(``),b=t(!0),x=t(!0),S=t(4096);async function C(){p.value=!0;try{let e=await i();return e.success&&(u.value=!1,await w()),e.success}finally{p.value=!1}}async function w(){try{let e=await r();o.value=e.status===`ok`,e.webui_version&&(c.value=e.webui_version),e.webui_latest&&(l.value=e.webui_latest),u.value=!!e.webui_update_available,e.node_version&&(y.value=e.node_version)}catch{o.value=!1}}async function T(){try{let e=await a();m.value=e.groups.map(e=>({provider:e.provider,label:e.provider,base_url:``,models:e.models.map(e=>typeof e==`string`?e:e.id),api_key:``})),h.value=e.default,g.value=``}catch{}}async function E(e,t){try{let n=m.value.find(t=>t.models.includes(e)),r=t||n?.provider||``;await s({default:e,provider:r}),h.value=e,g.value=r||``,r&&!m.value.find(e=>e.provider===r)?.models.includes(e)&&(_.value[r]||(_.value[r]=[]),_.value[r].includes(e)||(_.value[r]=[..._.value[r],e]))}catch(e){console.error(`Failed to switch model:`,e)}}function D(e=3e4){O(),w(),v.value=setInterval(w,e)}function O(){v.value&&=(clearInterval(v.value),void 0)}function k(){e.value=!e.value}function A(){e.value=!1}function j(){n.value=!n.value;try{localStorage.setItem(f,n.value?`1`:`0`)}catch{}}return{sidebarOpen:e,sidebarCollapsed:n,toggleSidebar:k,closeSidebar:A,toggleSidebarCollapsed:j,connected:o,serverVersion:c,latestVersion:l,nodeVersion:y,updateAvailable:u,updating:p,doUpdate:C,modelGroups:m,customModels:_,selectedModel:h,selectedProvider:g,streamEnabled:b,sessionPersistence:x,maxTokens:S,checkConnection:w,loadModels:T,switchModel:E,startHealthPolling:D,stopHealthPolling:O}});export{s as a,l as i,c as n,u as o,o as r,p as t};
@@ -1 +0,0 @@
1
- import{t as e}from"./app-CQp0_YLA.js";export{e as useAppStore};
@@ -1 +0,0 @@
1
- import{P as e}from"./router-BDvjwA-_.js";import{X as t}from"./browser-BIv3pBug.js";import{s as n}from"./Modal-Ct66o3O5.js";function r(){let r=e(n,null);return r===null&&t(`use-dialog`,`No outer <n-dialog-provider /> founded.`),r}export{r as t};
@@ -1 +0,0 @@
1
- import{r as e}from"./jobs-kBilk6_x.js";export{e as getJob};