@cosmicstack/mercury-agent 1.1.13 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +9 -6
  2. package/dist/index.js +27245 -21727
  3. package/dist/index.js.map +1 -1
  4. package/dist/web/ui/assets/Chat-CajL8sV3.js +27 -0
  5. package/dist/web/ui/assets/{Dashboard-1rlAqQ-Y.js → Dashboard-ClnaDoDG.js} +1 -2
  6. package/dist/web/ui/assets/{Goals-CgSUAXLH.js → Goals-Rm3s3OGd.js} +1 -2
  7. package/dist/web/ui/assets/{Graph-DnlOWkay.js → Graph-hYGmN5vp.js} +1 -2
  8. package/dist/web/ui/assets/{Kanban-DRlNiNRF.js → Kanban-BK_Oi6am.js} +1 -2
  9. package/dist/web/ui/assets/{Login-BP5524pC.js → Login-Bl8tq7KA.js} +1 -2
  10. package/dist/web/ui/assets/MarkdownRenderer-DKGKZih7.js +21 -0
  11. package/dist/web/ui/assets/{Memory-BOQEY0H8.js → Memory-kKRHTUyC.js} +1 -2
  12. package/dist/web/ui/assets/{Permissions-jbFH-toa.js → Permissions-CDRBOdMO.js} +1 -2
  13. package/dist/web/ui/assets/{PersonDetail-Ca8B9io8.js → PersonDetail-DLbZBUS0.js} +1 -2
  14. package/dist/web/ui/assets/{Persons-epdmUeBM.js → Persons-C-GjzdmT.js} +1 -2
  15. package/dist/web/ui/assets/{Providers-Bm8sZNZo.js → Providers-L32issLd.js} +1 -2
  16. package/dist/web/ui/assets/{Schedules-BZKhm9R7.js → Schedules-BvGLrPPD.js} +1 -2
  17. package/dist/web/ui/assets/{Settings-Hii-5oku.js → Settings-BP9_1JW3.js} +1 -2
  18. package/dist/web/ui/assets/{Skills-BHJp2CgD.js → Skills-CvXlgjZK.js} +1 -2
  19. package/dist/web/ui/assets/{Tasks-D36pqkro.js → Tasks-XcAVd2Ff.js} +1 -2
  20. package/dist/web/ui/assets/{Usage-CmjaYrsT.js → Usage--2hxK31f.js} +1 -2
  21. package/dist/web/ui/assets/{Workspace-BYLf-wTJ.js → Workspace-BPChIyBc.js} +11 -12
  22. package/dist/web/ui/assets/{activity-MOTqH8zM.js → activity-CDTOZzUZ.js} +1 -2
  23. package/dist/web/ui/assets/{alert-dialog-MbYSbZx5.js → alert-dialog-B3JUwsIN.js} +1 -2
  24. package/dist/web/ui/assets/{arrow-left-CtqQsBC6.js → arrow-left-CkDXNwR2.js} +1 -2
  25. package/dist/web/ui/assets/{avatar-BIYaY7pR.js → avatar-NU204zr9.js} +1 -2
  26. package/dist/web/ui/assets/{badge-CUJiWF1y.js → badge-DpVeNL8j.js} +1 -2
  27. package/dist/web/ui/assets/{button-CNasMlFE.js → button-V3Fu7_kO.js} +1 -2
  28. package/dist/web/ui/assets/{card-BdsEOP7t.js → card-CjAvp22k.js} +1 -2
  29. package/dist/web/ui/assets/{chevron-down-CB9J_vvZ.js → chevron-down-C66c9kfo.js} +1 -2
  30. package/dist/web/ui/assets/{circle-check-DvGSe1uZ.js → circle-check-Cch4Kwja.js} +1 -2
  31. package/dist/web/ui/assets/{circle-x-CyaGJ_BM.js → circle-x-DK0DQPGB.js} +1 -2
  32. package/dist/web/ui/assets/collapsible-BU_K9n8f.js +0 -1
  33. package/dist/web/ui/assets/{dialog-Bd1rELXb.js → dialog-FHqlAspv.js} +1 -2
  34. package/dist/web/ui/assets/{download-C8RvlFqO.js → download-D73EX-Ki.js} +1 -2
  35. package/dist/web/ui/assets/{eye-BJ0NucMz.js → eye-CxEb5_L8.js} +1 -2
  36. package/dist/web/ui/assets/{file-text-BWWBuD_N.js → file-text-CDTjVG9h.js} +1 -2
  37. package/dist/web/ui/assets/{folder-open-BwjemFy7.js → folder-open-CF5wm-xS.js} +1 -2
  38. package/dist/web/ui/assets/{git-branch-D9JVASpC.js → git-branch-CYWJZoQx.js} +1 -2
  39. package/dist/web/ui/assets/{index-C3YiF4qv.js → index-B1xAjISP.js} +4 -5
  40. package/dist/web/ui/assets/{index-CaqLZNof.js → index-CufYpqmV.js} +1 -2
  41. package/dist/web/ui/assets/{input-CH3dmo9r.js → input-CF6e2HL4.js} +1 -2
  42. package/dist/web/ui/assets/{loader-circle-DbYKk0_Q.js → loader-circle-CJko6bz6.js} +1 -2
  43. package/dist/web/ui/assets/{pencil-gNDEMhav.js → pencil-DGvW-dl_.js} +1 -2
  44. package/dist/web/ui/assets/{plus-7rbHkByr.js → plus-DhHrgqcD.js} +1 -2
  45. package/dist/web/ui/assets/{power-BS7gCDWs.js → power-BFKfrVvI.js} +1 -2
  46. package/dist/web/ui/assets/{progress-ZzhsBV2v.js → progress-CsRtYJ3t.js} +1 -2
  47. package/dist/web/ui/assets/{search-BZsbhO0B.js → search-BwE8vRR_.js} +1 -2
  48. package/dist/web/ui/assets/{select-vRSgBrHz.js → select-Xy3UJnp-.js} +1 -2
  49. package/dist/web/ui/assets/{send-BkyTIUtJ.js → send-DHy23R-c.js} +1 -2
  50. package/dist/web/ui/assets/{sparkles-DcP24GEL.js → sparkles-wNQvP7So.js} +1 -2
  51. package/dist/web/ui/assets/{switch-LRN9wWy2.js → switch-CGgMESDf.js} +1 -2
  52. package/dist/web/ui/assets/{terminal-CWG62zdD.js → terminal-BvZc6N0C.js} +1 -2
  53. package/dist/web/ui/assets/{textarea-CXh3tmJ1.js → textarea-BTxEQ_C2.js} +1 -2
  54. package/dist/web/ui/assets/vendor-dnd-DRBSMxXo.js +0 -1
  55. package/dist/web/ui/assets/vendor-markdown-DwTbvico.js +0 -1
  56. package/dist/web/ui/assets/vendor-motion-Dwx3-JO5.js +0 -1
  57. package/dist/web/ui/assets/vendor-radix-3UdfCgs_.js +0 -1
  58. package/dist/web/ui/assets/vendor-react-C7pctHW3.js +0 -1
  59. package/dist/web/ui/assets/vendor-syntax-xZUI6Op9.js +0 -1
  60. package/dist/web/ui/assets/{zap-BEfqVtvZ.js → zap-CK8xUBKc.js} +1 -2
  61. package/dist/web/ui/index.html +1 -1
  62. package/dist/web/ui/workbox-0bb07689.js +1 -0
  63. package/package.json +3 -1
  64. package/dist/web/ui/assets/Chat-DXSn2dY8.js +0 -28
  65. package/dist/web/ui/assets/Chat-DXSn2dY8.js.map +0 -1
  66. package/dist/web/ui/assets/Dashboard-1rlAqQ-Y.js.map +0 -1
  67. package/dist/web/ui/assets/Goals-CgSUAXLH.js.map +0 -1
  68. package/dist/web/ui/assets/Graph-DnlOWkay.js.map +0 -1
  69. package/dist/web/ui/assets/Kanban-DRlNiNRF.js.map +0 -1
  70. package/dist/web/ui/assets/Login-BP5524pC.js.map +0 -1
  71. package/dist/web/ui/assets/MarkdownRenderer-B9KGVD0X.js +0 -22
  72. package/dist/web/ui/assets/MarkdownRenderer-B9KGVD0X.js.map +0 -1
  73. package/dist/web/ui/assets/Memory-BOQEY0H8.js.map +0 -1
  74. package/dist/web/ui/assets/Permissions-jbFH-toa.js.map +0 -1
  75. package/dist/web/ui/assets/PersonDetail-Ca8B9io8.js.map +0 -1
  76. package/dist/web/ui/assets/Persons-epdmUeBM.js.map +0 -1
  77. package/dist/web/ui/assets/Providers-Bm8sZNZo.js.map +0 -1
  78. package/dist/web/ui/assets/Schedules-BZKhm9R7.js.map +0 -1
  79. package/dist/web/ui/assets/Settings-Hii-5oku.js.map +0 -1
  80. package/dist/web/ui/assets/Skills-BHJp2CgD.js.map +0 -1
  81. package/dist/web/ui/assets/Tasks-D36pqkro.js.map +0 -1
  82. package/dist/web/ui/assets/Usage-CmjaYrsT.js.map +0 -1
  83. package/dist/web/ui/assets/Workspace-BYLf-wTJ.js.map +0 -1
  84. package/dist/web/ui/assets/activity-MOTqH8zM.js.map +0 -1
  85. package/dist/web/ui/assets/alert-dialog-MbYSbZx5.js.map +0 -1
  86. package/dist/web/ui/assets/arrow-left-CtqQsBC6.js.map +0 -1
  87. package/dist/web/ui/assets/avatar-BIYaY7pR.js.map +0 -1
  88. package/dist/web/ui/assets/badge-CUJiWF1y.js.map +0 -1
  89. package/dist/web/ui/assets/button-CNasMlFE.js.map +0 -1
  90. package/dist/web/ui/assets/card-BdsEOP7t.js.map +0 -1
  91. package/dist/web/ui/assets/chevron-down-CB9J_vvZ.js.map +0 -1
  92. package/dist/web/ui/assets/circle-check-DvGSe1uZ.js.map +0 -1
  93. package/dist/web/ui/assets/circle-x-CyaGJ_BM.js.map +0 -1
  94. package/dist/web/ui/assets/collapsible-BU_K9n8f.js.map +0 -1
  95. package/dist/web/ui/assets/dialog-Bd1rELXb.js.map +0 -1
  96. package/dist/web/ui/assets/download-C8RvlFqO.js.map +0 -1
  97. package/dist/web/ui/assets/eye-BJ0NucMz.js.map +0 -1
  98. package/dist/web/ui/assets/file-text-BWWBuD_N.js.map +0 -1
  99. package/dist/web/ui/assets/folder-open-BwjemFy7.js.map +0 -1
  100. package/dist/web/ui/assets/git-branch-D9JVASpC.js.map +0 -1
  101. package/dist/web/ui/assets/index-C3YiF4qv.js.map +0 -1
  102. package/dist/web/ui/assets/index-CaqLZNof.js.map +0 -1
  103. package/dist/web/ui/assets/input-CH3dmo9r.js.map +0 -1
  104. package/dist/web/ui/assets/loader-circle-DbYKk0_Q.js.map +0 -1
  105. package/dist/web/ui/assets/pencil-gNDEMhav.js.map +0 -1
  106. package/dist/web/ui/assets/plus-7rbHkByr.js.map +0 -1
  107. package/dist/web/ui/assets/power-BS7gCDWs.js.map +0 -1
  108. package/dist/web/ui/assets/progress-ZzhsBV2v.js.map +0 -1
  109. package/dist/web/ui/assets/search-BZsbhO0B.js.map +0 -1
  110. package/dist/web/ui/assets/select-vRSgBrHz.js.map +0 -1
  111. package/dist/web/ui/assets/send-BkyTIUtJ.js.map +0 -1
  112. package/dist/web/ui/assets/sparkles-DcP24GEL.js.map +0 -1
  113. package/dist/web/ui/assets/switch-LRN9wWy2.js.map +0 -1
  114. package/dist/web/ui/assets/terminal-CWG62zdD.js.map +0 -1
  115. package/dist/web/ui/assets/textarea-CXh3tmJ1.js.map +0 -1
  116. package/dist/web/ui/assets/vendor-dnd-DRBSMxXo.js.map +0 -1
  117. package/dist/web/ui/assets/vendor-markdown-DwTbvico.js.map +0 -1
  118. package/dist/web/ui/assets/vendor-motion-Dwx3-JO5.js.map +0 -1
  119. package/dist/web/ui/assets/vendor-radix-3UdfCgs_.js.map +0 -1
  120. package/dist/web/ui/assets/vendor-react-C7pctHW3.js.map +0 -1
  121. package/dist/web/ui/assets/vendor-syntax-xZUI6Op9.js.map +0 -1
  122. package/dist/web/ui/assets/zap-BEfqVtvZ.js.map +0 -1
@@ -1,7 +1,6 @@
1
- import{e as a}from"./index-C3YiF4qv.js";/**
1
+ import{e as a}from"./index-B1xAjISP.js";/**
2
2
  * @license lucide-react v0.511.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
6
  */const o=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],c=a("zap",o);export{c as Z};
7
- //# sourceMappingURL=zap-BEfqVtvZ.js.map
@@ -11,7 +11,7 @@
11
11
  <link rel="icon" type="image/png" href="/logo-dark.png" />
12
12
  <link rel="apple-touch-icon" href="/logo-dark.png" />
13
13
  <title>Mercury</title>
14
- <script type="module" crossorigin src="/assets/index-C3YiF4qv.js"></script>
14
+ <script type="module" crossorigin src="/assets/index-B1xAjISP.js"></script>
15
15
  <link rel="modulepreload" crossorigin href="/assets/vendor-react-C7pctHW3.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/vendor-motion-Dwx3-JO5.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/vendor-syntax-xZUI6Op9.js">
@@ -0,0 +1 @@
1
+ define(["exports"],function(t){"use strict";try{self["workbox:core:7.4.0"]&&_()}catch(t){}const e=(t,...e)=>{let s=t;return e.length>0&&(s+=` :: ${JSON.stringify(e)}`),s};class s extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}try{self["workbox:routing:7.4.0"]&&_()}catch(t){}const n=t=>t&&"object"==typeof t?t:{handle:t};class i{constructor(t,e,s="GET"){this.handler=n(e),this.match=t,this.method=s}setCatchHandler(t){this.catchHandler=n(t)}}class r extends i{constructor(t,e,s){super(({url:e})=>{const s=t.exec(e.href);if(s&&(e.origin===location.origin||0===s.index))return s.slice(1)},e,s)}}class o{constructor(){this.t=new Map,this.i=new Map}get routes(){return this.t}addFetchListener(){self.addEventListener("fetch",t=>{const{request:e}=t,s=this.handleRequest({request:e,event:t});s&&t.respondWith(s)})}addCacheListener(){self.addEventListener("message",t=>{if(t.data&&"CACHE_URLS"===t.data.type){const{payload:e}=t.data,s=Promise.all(e.urlsToCache.map(e=>{"string"==typeof e&&(e=[e]);const s=new Request(...e);return this.handleRequest({request:s,event:t})}));t.waitUntil(s),t.ports&&t.ports[0]&&s.then(()=>t.ports[0].postMessage(!0))}})}handleRequest({request:t,event:e}){const s=new URL(t.url,location.href);if(!s.protocol.startsWith("http"))return;const n=s.origin===location.origin,{params:i,route:r}=this.findMatchingRoute({event:e,request:t,sameOrigin:n,url:s});let o=r&&r.handler;const c=t.method;if(!o&&this.i.has(c)&&(o=this.i.get(c)),!o)return;let a;try{a=o.handle({url:s,request:t,event:e,params:i})}catch(t){a=Promise.reject(t)}const h=r&&r.catchHandler;return a instanceof Promise&&(this.o||h)&&(a=a.catch(async n=>{if(h)try{return await h.handle({url:s,request:t,event:e,params:i})}catch(t){t instanceof Error&&(n=t)}if(this.o)return this.o.handle({url:s,request:t,event:e});throw n})),a}findMatchingRoute({url:t,sameOrigin:e,request:s,event:n}){const i=this.t.get(s.method)||[];for(const r of i){let i;const o=r.match({url:t,sameOrigin:e,request:s,event:n});if(o)return i=o,(Array.isArray(i)&&0===i.length||o.constructor===Object&&0===Object.keys(o).length||"boolean"==typeof o)&&(i=void 0),{route:r,params:i}}return{}}setDefaultHandler(t,e="GET"){this.i.set(e,n(t))}setCatchHandler(t){this.o=n(t)}registerRoute(t){this.t.has(t.method)||this.t.set(t.method,[]),this.t.get(t.method).push(t)}unregisterRoute(t){if(!this.t.has(t.method))throw new s("unregister-route-but-not-found-with-method",{method:t.method});const e=this.t.get(t.method).indexOf(t);if(!(e>-1))throw new s("unregister-route-route-not-registered");this.t.get(t.method).splice(e,1)}}let c;const a={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},h=t=>[a.prefix,t,a.suffix].filter(t=>t&&t.length>0).join("-"),u=t=>t||h(a.precache),l=t=>t||h(a.runtime);function f(t,e){const s=e();return t.waitUntil(s),s}try{self["workbox:precaching:7.4.0"]&&_()}catch(t){}function w(t){if(!t)throw new s("add-to-cache-list-unexpected-type",{entry:t});if("string"==typeof t){const e=new URL(t,location.href);return{cacheKey:e.href,url:e.href}}const{revision:e,url:n}=t;if(!n)throw new s("add-to-cache-list-unexpected-type",{entry:t});if(!e){const t=new URL(n,location.href);return{cacheKey:t.href,url:t.href}}const i=new URL(n,location.href),r=new URL(n,location.href);return i.searchParams.set("__WB_REVISION__",e),{cacheKey:i.href,url:r.href}}class d{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:t,state:e})=>{e&&(e.originalRequest=t)},this.cachedResponseWillBeUsed=async({event:t,state:e,cachedResponse:s})=>{if("install"===t.type&&e&&e.originalRequest&&e.originalRequest instanceof Request){const t=e.originalRequest.url;s?this.notUpdatedURLs.push(t):this.updatedURLs.push(t)}return s}}}class p{constructor({precacheController:t}){this.cacheKeyWillBeUsed=async({request:t,params:e})=>{const s=(null==e?void 0:e.cacheKey)||this.h.getCacheKeyForURL(t.url);return s?new Request(s,{headers:t.headers}):t},this.h=t}}let y;async function g(t,e){let n=null;if(t.url){n=new URL(t.url).origin}if(n!==self.location.origin)throw new s("cross-origin-copy-response",{origin:n});const i=t.clone(),r={headers:new Headers(i.headers),status:i.status,statusText:i.statusText},o=function(){if(void 0===y){const t=new Response("");if("body"in t)try{new Response(t.body),y=!0}catch(t){y=!1}y=!1}return y}()?i.body:await i.blob();return new Response(o,r)}function R(t,e){const s=new URL(t);for(const t of e)s.searchParams.delete(t);return s.href}class m{constructor(){this.promise=new Promise((t,e)=>{this.resolve=t,this.reject=e})}}const v=new Set;try{self["workbox:strategies:7.4.0"]&&_()}catch(t){}function q(t){return"string"==typeof t?new Request(t):t}class U{constructor(t,e){this.u={},Object.assign(this,e),this.event=e.event,this.l=t,this.p=new m,this.R=[],this.m=[...t.plugins],this.v=new Map;for(const t of this.m)this.v.set(t,{});this.event.waitUntil(this.p.promise)}async fetch(t){const{event:e}=this;let n=q(t);if("navigate"===n.mode&&e instanceof FetchEvent&&e.preloadResponse){const t=await e.preloadResponse;if(t)return t}const i=this.hasCallback("fetchDidFail")?n.clone():null;try{for(const t of this.iterateCallbacks("requestWillFetch"))n=await t({request:n.clone(),event:e})}catch(t){if(t instanceof Error)throw new s("plugin-error-request-will-fetch",{thrownErrorMessage:t.message})}const r=n.clone();try{let t;t=await fetch(n,"navigate"===n.mode?void 0:this.l.fetchOptions);for(const s of this.iterateCallbacks("fetchDidSucceed"))t=await s({event:e,request:r,response:t});return t}catch(t){throw i&&await this.runCallbacks("fetchDidFail",{error:t,event:e,originalRequest:i.clone(),request:r.clone()}),t}}async fetchAndCachePut(t){const e=await this.fetch(t),s=e.clone();return this.waitUntil(this.cachePut(t,s)),e}async cacheMatch(t){const e=q(t);let s;const{cacheName:n,matchOptions:i}=this.l,r=await this.getCacheKey(e,"read"),o=Object.assign(Object.assign({},i),{cacheName:n});s=await caches.match(r,o);for(const t of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await t({cacheName:n,matchOptions:i,cachedResponse:s,request:r,event:this.event})||void 0;return s}async cachePut(t,e){const n=q(t);var i;await(i=0,new Promise(t=>setTimeout(t,i)));const r=await this.getCacheKey(n,"write");if(!e)throw new s("cache-put-with-no-response",{url:(o=r.url,new URL(String(o),location.href).href.replace(new RegExp(`^${location.origin}`),""))});var o;const c=await this.q(e);if(!c)return!1;const{cacheName:a,matchOptions:h}=this.l,u=await self.caches.open(a),l=this.hasCallback("cacheDidUpdate"),f=l?await async function(t,e,s,n){const i=R(e.url,s);if(e.url===i)return t.match(e,n);const r=Object.assign(Object.assign({},n),{ignoreSearch:!0}),o=await t.keys(e,r);for(const e of o)if(i===R(e.url,s))return t.match(e,n)}(u,r.clone(),["__WB_REVISION__"],h):null;try{await u.put(r,l?c.clone():c)}catch(t){if(t instanceof Error)throw"QuotaExceededError"===t.name&&await async function(){for(const t of v)await t()}(),t}for(const t of this.iterateCallbacks("cacheDidUpdate"))await t({cacheName:a,oldResponse:f,newResponse:c.clone(),request:r,event:this.event});return!0}async getCacheKey(t,e){const s=`${t.url} | ${e}`;if(!this.u[s]){let n=t;for(const t of this.iterateCallbacks("cacheKeyWillBeUsed"))n=q(await t({mode:e,request:n,event:this.event,params:this.params}));this.u[s]=n}return this.u[s]}hasCallback(t){for(const e of this.l.plugins)if(t in e)return!0;return!1}async runCallbacks(t,e){for(const s of this.iterateCallbacks(t))await s(e)}*iterateCallbacks(t){for(const e of this.l.plugins)if("function"==typeof e[t]){const s=this.v.get(e),n=n=>{const i=Object.assign(Object.assign({},n),{state:s});return e[t](i)};yield n}}waitUntil(t){return this.R.push(t),t}async doneWaiting(){for(;this.R.length;){const t=this.R.splice(0),e=(await Promise.allSettled(t)).find(t=>"rejected"===t.status);if(e)throw e.reason}}destroy(){this.p.resolve(null)}async q(t){let e=t,s=!1;for(const t of this.iterateCallbacks("cacheWillUpdate"))if(e=await t({request:this.request,response:e,event:this.event})||void 0,s=!0,!e)break;return s||e&&200!==e.status&&(e=void 0),e}}class L{constructor(t={}){this.cacheName=l(t.cacheName),this.plugins=t.plugins||[],this.fetchOptions=t.fetchOptions,this.matchOptions=t.matchOptions}handle(t){const[e]=this.handleAll(t);return e}handleAll(t){t instanceof FetchEvent&&(t={event:t,request:t.request});const e=t.event,s="string"==typeof t.request?new Request(t.request):t.request,n="params"in t?t.params:void 0,i=new U(this,{event:e,request:s,params:n}),r=this.U(i,s,e);return[r,this.L(r,i,s,e)]}async U(t,e,n){let i;await t.runCallbacks("handlerWillStart",{event:n,request:e});try{if(i=await this._(e,t),!i||"error"===i.type)throw new s("no-response",{url:e.url})}catch(s){if(s instanceof Error)for(const r of t.iterateCallbacks("handlerDidError"))if(i=await r({error:s,event:n,request:e}),i)break;if(!i)throw s}for(const s of t.iterateCallbacks("handlerWillRespond"))i=await s({event:n,request:e,response:i});return i}async L(t,e,s,n){let i,r;try{i=await t}catch(r){}try{await e.runCallbacks("handlerDidRespond",{event:n,request:s,response:i}),await e.doneWaiting()}catch(t){t instanceof Error&&(r=t)}if(await e.runCallbacks("handlerDidComplete",{event:n,request:s,response:i,error:r}),e.destroy(),r)throw r}}class b extends L{constructor(t={}){t.cacheName=u(t.cacheName),super(t),this.C=!1!==t.fallbackToNetwork,this.plugins.push(b.copyRedirectedCacheableResponsesPlugin)}async _(t,e){const s=await e.cacheMatch(t);return s||(e.event&&"install"===e.event.type?await this.O(t,e):await this.N(t,e))}async N(t,e){let n;const i=e.params||{};if(!this.C)throw new s("missing-precache-entry",{cacheName:this.cacheName,url:t.url});{const s=i.integrity,r=t.integrity,o=!r||r===s;n=await e.fetch(new Request(t,{integrity:"no-cors"!==t.mode?r||s:void 0})),s&&o&&"no-cors"!==t.mode&&(this.P(),await e.cachePut(t,n.clone()))}return n}async O(t,e){this.P();const n=await e.fetch(t);if(!await e.cachePut(t,n.clone()))throw new s("bad-precaching-response",{url:t.url,status:n.status});return n}P(){let t=null,e=0;for(const[s,n]of this.plugins.entries())n!==b.copyRedirectedCacheableResponsesPlugin&&(n===b.defaultPrecacheCacheabilityPlugin&&(t=s),n.cacheWillUpdate&&e++);0===e?this.plugins.push(b.defaultPrecacheCacheabilityPlugin):e>1&&null!==t&&this.plugins.splice(t,1)}}b.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:t})=>!t||t.status>=400?null:t},b.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:t})=>t.redirected?await g(t):t};class C{constructor({cacheName:t,plugins:e=[],fallbackToNetwork:s=!0}={}){this.j=new Map,this.k=new Map,this.K=new Map,this.l=new b({cacheName:u(t),plugins:[...e,new p({precacheController:this})],fallbackToNetwork:s}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this.l}precache(t){this.addToCacheList(t),this.T||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this.T=!0)}addToCacheList(t){const e=[];for(const n of t){"string"==typeof n?e.push(n):n&&void 0===n.revision&&e.push(n.url);const{cacheKey:t,url:i}=w(n),r="string"!=typeof n&&n.revision?"reload":"default";if(this.j.has(i)&&this.j.get(i)!==t)throw new s("add-to-cache-list-conflicting-entries",{firstEntry:this.j.get(i),secondEntry:t});if("string"!=typeof n&&n.integrity){if(this.K.has(t)&&this.K.get(t)!==n.integrity)throw new s("add-to-cache-list-conflicting-integrities",{url:i});this.K.set(t,n.integrity)}if(this.j.set(i,t),this.k.set(i,r),e.length>0){const t=`Workbox is precaching URLs without revision info: ${e.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(t)}}}install(t){return f(t,async()=>{const e=new d;this.strategy.plugins.push(e);for(const[e,s]of this.j){const n=this.K.get(s),i=this.k.get(e),r=new Request(e,{integrity:n,cache:i,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:s},request:r,event:t}))}const{updatedURLs:s,notUpdatedURLs:n}=e;return{updatedURLs:s,notUpdatedURLs:n}})}activate(t){return f(t,async()=>{const t=await self.caches.open(this.strategy.cacheName),e=await t.keys(),s=new Set(this.j.values()),n=[];for(const i of e)s.has(i.url)||(await t.delete(i),n.push(i.url));return{deletedURLs:n}})}getURLsToCacheKeys(){return this.j}getCachedURLs(){return[...this.j.keys()]}getCacheKeyForURL(t){const e=new URL(t,location.href);return this.j.get(e.href)}getIntegrityForCacheKey(t){return this.K.get(t)}async matchPrecache(t){const e=t instanceof Request?t.url:t,s=this.getCacheKeyForURL(e);if(s){return(await self.caches.open(this.strategy.cacheName)).match(s)}}createHandlerBoundToURL(t){const e=this.getCacheKeyForURL(t);if(!e)throw new s("non-precached-url",{url:t});return s=>(s.request=new Request(t),s.params=Object.assign({cacheKey:e},s.params),this.strategy.handle(s))}}let E;const O=()=>(E||(E=new C),E);class x extends i{constructor(t,e){super(({request:s})=>{const n=t.getURLsToCacheKeys();for(const i of function*(t,{ignoreURLParametersMatching:e=[/^utm_/,/^fbclid$/],directoryIndex:s="index.html",cleanURLs:n=!0,urlManipulation:i}={}){const r=new URL(t,location.href);r.hash="",yield r.href;const o=function(t,e=[]){for(const s of[...t.searchParams.keys()])e.some(t=>t.test(s))&&t.searchParams.delete(s);return t}(r,e);if(yield o.href,s&&o.pathname.endsWith("/")){const t=new URL(o.href);t.pathname+=s,yield t.href}if(n){const t=new URL(o.href);t.pathname+=".html",yield t.href}if(i){const t=i({url:r});for(const e of t)yield e.href}}(s.url,e)){const e=n.get(i);if(e){return{cacheKey:e,integrity:t.getIntegrityForCacheKey(e)}}}},t.strategy)}}function N(t){const e=O();!function(t,e,n){let a;if("string"==typeof t){const s=new URL(t,location.href);a=new i(({url:t})=>t.href===s.href,e,n)}else if(t instanceof RegExp)a=new r(t,e,n);else if("function"==typeof t)a=new i(t,e,n);else{if(!(t instanceof i))throw new s("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});a=t}(c||(c=new o,c.addFetchListener(),c.addCacheListener()),c).registerRoute(a)}(new x(e,t))}t.cleanupOutdatedCaches=function(){self.addEventListener("activate",t=>{const e=u();t.waitUntil((async(t,e="-precache-")=>{const s=(await self.caches.keys()).filter(s=>s.includes(e)&&s.includes(self.registration.scope)&&s!==t);return await Promise.all(s.map(t=>self.caches.delete(t))),s})(e).then(t=>{}))})},t.clientsClaim=function(){self.addEventListener("activate",()=>self.clients.claim())},t.precacheAndRoute=function(t,e){!function(t){O().precache(t)}(t),N(e)}});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cosmicstack/mercury-agent",
3
- "version": "1.1.13",
3
+ "version": "1.2.1",
4
4
  "description": "Soul-driven AI agent with Second Brain memory, permission-hardened tools, token budgets, and multi-channel access. Runs 24/7 from CLI or Telegram.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -66,6 +66,7 @@
66
66
  "@grammyjs/auto-retry": "^2.0.2",
67
67
  "@hono/node-server": "^2.0.0",
68
68
  "@slack/bolt": "^4.7.3",
69
+ "@types/ws": "^8.18.1",
69
70
  "ai": "^6.0.168",
70
71
  "bcryptjs": "^3.0.3",
71
72
  "chalk": "^5.4.0",
@@ -82,6 +83,7 @@
82
83
  "qrcode-terminal": "^0.12.0",
83
84
  "react": "^18.3.1",
84
85
  "sql.js": "^1.14.1",
86
+ "ws": "^8.21.0",
85
87
  "yaml": "^2.7.0",
86
88
  "zod": "^3.25.76"
87
89
  },
@@ -1,28 +0,0 @@
1
- import{j as e,m as A,A as $}from"./vendor-motion-Dwx3-JO5.js";import{r as d,j as pe,e as fe}from"./vendor-react-C7pctHW3.js";import{e as E,S as V,M as X,c as j,a as k,X as Z,g as J,u as Y,h as ge,i as be}from"./index-C3YiF4qv.js";import{B as C}from"./button-CNasMlFE.js";import{P as ye}from"./progress-ZzhsBV2v.js";import{A as je,F as ve,o as we,u as y,M as Q,C as Ne,a as ke,b as Se}from"./MarkdownRenderer-B9KGVD0X.js";import{A as Ce,a as Te,b as De,c as Me,d as Ae,e as Pe,f as Le,g as Be,T as ze}from"./alert-dialog-MbYSbZx5.js";import{P as $e}from"./plus-7rbHkByr.js";import{L as M}from"./loader-circle-DbYKk0_Q.js";import{h as Ee}from"./vendor-syntax-xZUI6Op9.js";import{B as Ie}from"./badge-CUJiWF1y.js";import{f as Oe,g as Re,h as Fe,i as ee}from"./vendor-radix-3UdfCgs_.js";import{C as Ue,a as R}from"./chevron-down-CB9J_vvZ.js";import{C as We,a as _e,b as qe}from"./collapsible-BU_K9n8f.js";import{C as He}from"./circle-x-CyaGJ_BM.js";import{C as Ge}from"./circle-check-DvGSe1uZ.js";import{F as Ke}from"./folder-open-BwjemFy7.js";import{Z as Ve}from"./zap-BEfqVtvZ.js";import{S as Xe}from"./send-BkyTIUtJ.js";import"./index-CaqLZNof.js";import"./vendor-markdown-DwTbvico.js";/**
2
- * @license lucide-react v0.511.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const Ze=[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}]],Je=E("file",Ze);/**
7
- * @license lucide-react v0.511.0 - ISC
8
- *
9
- * This source code is licensed under the ISC license.
10
- * See the LICENSE file in the root directory of this source tree.
11
- */const Ye=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"m16 15-3-3 3-3",key:"14y99z"}]],Qe=E("panel-left-close",Ye);/**
12
- * @license lucide-react v0.511.0 - ISC
13
- *
14
- * This source code is licensed under the ISC license.
15
- * See the LICENSE file in the root directory of this source tree.
16
- */const et=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"m14 9 3 3-3 3",key:"8010ee"}]],tt=E("panel-left-open",et);/**
17
- * @license lucide-react v0.511.0 - ISC
18
- *
19
- * This source code is licensed under the ISC license.
20
- * See the LICENSE file in the root directory of this source tree.
21
- */const st=[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",key:"cbrjhi"}]],at=E("wrench",st);function G({threads:t,activeThreadId:i,onSelect:r,onDelete:c,onNew:a,onExport:l}){const[o,m]=d.useState(null);function p(h){const f=new Date(h),w=new Date().getTime()-f.getTime(),N=Math.floor(w/(1e3*60*60*24));return N===0?f.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):N===1?"Yesterday":N<7?`${N} days ago`:f.toLocaleDateString(void 0,{month:"short",day:"numeric"})}return e.jsxs("div",{className:"flex h-full flex-col",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border px-4 py-3",children:[e.jsx("h2",{className:"text-sm font-semibold text-foreground",children:"Conversations"}),e.jsxs(C,{size:"sm",onClick:a,className:"h-7 gap-1 px-2 text-xs",children:[e.jsx($e,{className:"h-3.5 w-3.5"}),"New Chat"]})]}),e.jsx(V,{className:"flex-1",children:t.length===0?e.jsxs("div",{className:"flex flex-col items-center justify-center gap-2 px-4 py-12 text-center",children:[e.jsx(X,{className:"h-8 w-8 text-muted-foreground/40"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"No conversations yet"})]}):e.jsx("div",{className:"p-2",children:t.map(h=>{const f=h.id===i;return e.jsx(rt,{thread:h,isActive:f,formatDate:p,onSelect:()=>r(h.id),onDelete:()=>m(h.id),onExport:()=>l(h.id)},h.id)})})}),e.jsx(Ce,{open:o!==null,onOpenChange:h=>{h||m(null)},children:e.jsxs(Te,{children:[e.jsxs(De,{children:[e.jsx(Me,{children:"Delete conversation?"}),e.jsx(Ae,{children:"This will permanently remove this conversation and all its messages. This action cannot be undone."})]}),e.jsxs(Pe,{children:[e.jsx(Le,{children:"Cancel"}),e.jsx(Be,{className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",onClick:()=>{o&&(c(o),m(null))},children:"Delete"})]})]})})]})}function rt({thread:t,isActive:i,formatDate:r,onSelect:c,onDelete:a,onExport:l}){return e.jsxs("div",{onClick:c,className:j("group flex w-full cursor-pointer items-center rounded-lg pl-2 pr-1 py-2 text-left transition-all duration-150",i?"border-l-2 border-l-primary bg-primary/10 text-foreground":"border-l-2 border-l-transparent hover:bg-muted/60 text-foreground/80"),children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"truncate text-sm font-medium leading-snug text-left",children:t.title||"New conversation"}),e.jsx("div",{className:"text-xs text-muted-foreground text-left",children:r(t.createdAt)})]}),e.jsx("button",{onClick:o=>{o.stopPropagation(),a()},className:j("shrink-0 rounded-md p-1 text-red-500 hover:bg-red-500/10 hover:text-red-600 transition-opacity",i?"opacity-100":"opacity-0 group-hover:opacity-100"),title:"Delete",children:e.jsx(ze,{className:"h-3.5 w-3.5"})})]})}const nt={ts:"typescript",tsx:"tsx",js:"javascript",jsx:"jsx",py:"python",go:"go",rs:"rust",json:"json",yaml:"yaml",yml:"yaml",md:"markdown",css:"css",html:"html",sh:"bash",bash:"bash",sql:"sql",toml:"toml",xml:"xml",dockerfile:"docker"};function ot(t){return nt[t.toLowerCase().replace(/^\./,"")]||"text"}function K(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function lt({open:t,onClose:i}){const[r,c]=d.useState(null),[a,l]=d.useState(null),[o,m]=d.useState(!1),[p,h]=d.useState(!1),[f,S]=d.useState(null),w=d.useCallback(async u=>{m(!0),S(null),l(null);try{const g=await k.workspace.tree(u);c(g)}catch(g){S(g instanceof Error?g.message:"Failed to load workspace")}finally{m(!1)}},[]),N=d.useCallback(async u=>{h(!0);try{const g=await k.workspace.file(u);l(g)}catch(g){S(g instanceof Error?g.message:"Failed to load file")}finally{h(!1)}},[]),[D,x]=d.useState(!1);if(t&&!D&&(x(!0),w()),!t&&D&&x(!1),!t)return null;const n=[];if(r){const u=r.currentPath.replace(r.root,"").replace(/^\//,"");if(u){const g=u.split("/");let T="";for(const P of g)T=T?`${T}/${P}`:P,n.push({label:P,path:T})}}function b(){if(!r)return;const g=r.currentPath.replace(r.root,"").replace(/^\//,"").split("/").filter(Boolean);g.length<=1?w():(g.pop(),w(g.join("/")))}return e.jsxs("div",{className:"flex h-full w-full flex-col border-l border-border bg-background",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border px-4 py-3",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("h2",{className:"text-sm font-semibold text-foreground",children:"Workspace"}),r&&e.jsx("p",{className:"truncate text-xs text-muted-foreground",children:r.root})]}),e.jsx(C,{variant:"ghost",size:"icon",onClick:i,className:"h-7 w-7 shrink-0",children:e.jsx(Z,{className:"h-4 w-4"})})]}),r&&n.length>0&&e.jsxs("div",{className:"flex items-center gap-1 border-b border-border px-4 py-2 text-xs",children:[e.jsx("button",{onClick:()=>w(),className:"text-primary hover:underline",children:"root"}),n.map(u=>e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(J,{className:"h-3 w-3 text-muted-foreground"}),e.jsx("button",{onClick:()=>w(u.path),className:"text-primary hover:underline",children:u.label})]},u.path))]}),e.jsx(V,{className:"flex-1",children:o?e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(M,{className:"h-5 w-5 animate-spin text-primary"})}):f?e.jsx("div",{className:"px-4 py-8 text-center text-sm text-destructive",children:f}):e.jsxs("div",{className:"flex flex-col",children:[r&&e.jsxs("div",{className:"border-b border-border",children:[n.length>0&&e.jsxs("button",{onClick:b,className:"flex w-full items-center gap-2 px-4 py-2 text-sm text-muted-foreground hover:bg-muted/50 transition-colors",children:[e.jsx(je,{className:"h-4 w-4"}),e.jsx("span",{children:".."})]}),r.items.map(u=>e.jsxs("button",{onClick:()=>{if(u.type==="directory"){const g=r.currentPath.replace(r.root,"").replace(/^\//,""),T=g?`${g}/${u.name}`:u.name;w(T)}else{const g=r.currentPath.replace(r.root,"").replace(/^\//,""),T=g?`${g}/${u.name}`:u.name;N(T)}},className:j("flex w-full items-center gap-2 px-4 py-2 text-sm transition-colors hover:bg-muted/50",u.type==="directory"?"text-foreground":"text-foreground/80"),children:[u.type==="directory"?e.jsx(ve,{className:"h-4 w-4 shrink-0 text-primary/70"}):e.jsx(Je,{className:"h-4 w-4 shrink-0 text-muted-foreground"}),e.jsx("span",{className:"truncate",children:u.name}),u.size!==void 0&&u.type==="file"&&e.jsx("span",{className:"ml-auto shrink-0 text-xs text-muted-foreground",children:K(u.size)})]},u.name)),r.items.length===0&&e.jsx("p",{className:"px-4 py-6 text-center text-sm text-muted-foreground",children:"Empty directory"})]}),p&&e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx(M,{className:"h-5 w-5 animate-spin text-primary"})}),a&&!p&&e.jsxs("div",{className:"flex flex-col",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border px-4 py-2",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"truncate text-sm font-medium text-foreground",children:a.name}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[K(a.size),a.truncated&&" (truncated)"]})]}),e.jsx(C,{variant:"ghost",size:"sm",onClick:()=>l(null),className:"h-6 text-xs",children:"Close"})]}),e.jsx("div",{className:"overflow-auto text-xs",children:e.jsx(Ee,{language:ot(a.ext),style:we,customStyle:{margin:0,borderRadius:0,fontSize:"0.75rem",lineHeight:"1.5"},showLineNumbers:!0,wrapLongLines:!0,children:a.content})})]})]})})]})}const it=Oe,ct=Re,te=d.forwardRef(({className:t,align:i="center",sideOffset:r=4,...c},a)=>e.jsx(Fe,{children:e.jsx(ee,{ref:a,align:i,sideOffset:r,className:j("z-50 w-72 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",t),...c})}));te.displayName=ee.displayName;function dt({currentProvider:t,currentModel:i}){const[r,c]=d.useState(!1),[a,l]=d.useState(null),[o,m]=d.useState(!1),[p,h]=d.useState(null),f=y(x=>x.setProvider),S=y(x=>x.setModel),w=d.useCallback(async()=>{if(!a){m(!0);try{const x=await k.chat.models.list();l(x)}catch{}finally{m(!1)}}},[a]);async function N(x){h(x);try{await k.chat.models.switch(x);const n=await k.chat.models.list();l(n);const b=n.providers.find(u=>u.name===x);b&&(f(b.name),S(b.model)),c(!1)}catch{}finally{h(null)}}const D=i.length>24?i.slice(0,22)+"...":i||t||"Model";return e.jsxs(it,{open:r,onOpenChange:x=>{c(x),x&&w()},children:[e.jsx(ct,{asChild:!0,children:e.jsxs(C,{variant:"ghost",size:"sm",className:"h-7 gap-1 px-2 text-xs font-medium text-muted-foreground hover:text-foreground",children:[e.jsx("span",{className:"max-w-[140px] truncate",children:D}),e.jsx(Ue,{className:"h-3 w-3"})]})}),e.jsxs(te,{align:"start",className:"w-72 p-2",children:[e.jsx("p",{className:"px-2 pb-2 text-xs font-semibold text-muted-foreground uppercase tracking-wider",children:"Providers"}),o?e.jsx("div",{className:"flex items-center justify-center py-4",children:e.jsx(M,{className:"h-4 w-4 animate-spin text-primary"})}):a?e.jsx("div",{className:"flex flex-col gap-0.5",children:a.providers.map(x=>{const n=x.name===t,b=p===x.name;return e.jsxs("button",{disabled:!x.available||b,onClick:()=>{!n&&x.available&&N(x.name)},className:j("flex items-center gap-2 rounded-md px-2 py-2 text-left text-sm transition-colors",x.available?"hover:bg-muted/60":"cursor-not-allowed opacity-40",n&&"bg-primary/10"),children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-foreground",children:x.name}),n&&e.jsx(R,{className:"h-3.5 w-3.5 text-primary"})]}),e.jsx("p",{className:"truncate text-xs text-muted-foreground",children:x.model})]}),b?e.jsx(M,{className:"h-3.5 w-3.5 shrink-0 animate-spin text-primary"}):e.jsx(Ie,{variant:x.available?"success":"secondary",className:"shrink-0 text-[10px] px-1.5 py-0",children:x.available?"Ready":"Unavailable"})]},x.name)})}):e.jsx("p",{className:"px-2 py-4 text-center text-sm text-muted-foreground",children:"No providers found"})]})]})}const mt=[{value:"off",label:"Off"},{value:"plan",label:"Plan"},{value:"execute",label:"Exec"}];function ut(){const[t,i]=d.useState(null),[r,c]=d.useState(!1),a=d.useCallback(async()=>{try{const o=await k.code.status();i(o)}catch{}},[]);d.useEffect(()=>{a()},[a]);async function l(o){if(!(!t||r||o===t.state)){c(!0);try{const m=await k.code.set(o);i(p=>p&&{...p,state:m.state,active:m.active})}catch{}finally{c(!1)}}}return t!=null&&t.available?e.jsx("div",{className:"flex items-center rounded-lg border border-border bg-muted/40 p-0.5",children:mt.map(o=>{const m=t.state===o.value;return e.jsx("button",{disabled:r,onClick:()=>l(o.value),className:j("rounded-md px-2.5 py-1 text-xs font-medium transition-all duration-150",m?o.value==="plan"?"bg-amber-500/15 text-amber-600 dark:text-amber-400 shadow-sm":o.value==="execute"?"bg-emerald-500/15 text-emerald-600 dark:text-emerald-400 shadow-sm":"bg-background text-muted-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:o.label},o.value)})}):null}const xt={running:{icon:M,label:"Running...",color:"text-mercury-500",border:"border-l-mercury-500",iconClass:"animate-spin"},done:{icon:Ge,label:"Complete",color:"text-emerald-500",border:"border-l-emerald-500",iconClass:""},error:{icon:He,label:"Failed",color:"text-red-500",border:"border-l-red-500",iconClass:""}};function se({tool:t,status:i,result:r}){const[c,a]=d.useState(!1),l=xt[i],o=l.icon;return e.jsx(We,{open:c,onOpenChange:a,children:e.jsxs("div",{className:j("my-1.5 overflow-hidden rounded-md border border-border/60 border-l-2 bg-muted/30",l.border),children:[e.jsxs(_e,{className:"flex w-full items-center gap-2 px-3 py-2 text-xs transition-colors hover:bg-muted/50",children:[e.jsx(J,{className:j("h-3 w-3 text-muted-foreground transition-transform",c&&"rotate-90")}),e.jsx(at,{className:"h-3 w-3 text-muted-foreground"}),e.jsx("span",{className:"font-medium",children:t}),e.jsxs("div",{className:"ml-auto flex items-center gap-1.5",children:[e.jsx(o,{className:j("h-3.5 w-3.5",l.color,l.iconClass)}),e.jsx("span",{className:j("text-[0.6875rem]",l.color),children:l.label})]})]}),e.jsx(qe,{children:r&&e.jsx("div",{className:"max-h-40 overflow-auto border-t border-border/40 bg-background/50 px-3 py-2",children:e.jsx("pre",{className:"whitespace-pre-wrap font-mono text-[0.75rem] leading-relaxed text-muted-foreground",children:r})})})]})})}function ht({message:t,isLast:i}){var m;const[r,c]=d.useState(!1),a=t.role==="user",l=Y(p=>p.resolved),o=d.useCallback(()=>{navigator.clipboard.writeText(t.content),c(!0),setTimeout(()=>c(!1),2e3)},[t.content]);return e.jsxs(A.div,{initial:{opacity:0,y:6},animate:{opacity:1,y:0},transition:{duration:.25,ease:"easeOut"},className:j("group flex gap-3",a?"flex-row-reverse":"flex-row"),children:[e.jsx("div",{className:j("flex h-7 w-7 shrink-0 items-center justify-center overflow-hidden rounded-full text-xs font-semibold",a?"bg-primary text-primary-foreground":"bg-card"),children:a?"U":e.jsx("img",{src:l==="dark"?"/logo-dark.png":"/logo-light.png",alt:"Mercury",className:"h-full w-full object-contain"})}),e.jsxs("div",{className:j("relative max-w-[80%] space-y-1",a?"items-end":"items-start"),children:[(m=t.steps)==null?void 0:m.map((p,h)=>e.jsx(se,{tool:p.tool,status:p.status,result:p.result},`${t.id}-step-${h}`)),e.jsxs("div",{className:j("relative rounded-2xl px-4 py-2.5",a?"rounded-br-sm bg-mercury-500 text-white":"rounded-bl-sm border border-border/60 bg-card text-card-foreground"),children:[a?e.jsx("p",{className:"whitespace-pre-wrap text-sm leading-relaxed",children:t.content}):e.jsx(Q,{content:t.content}),e.jsx("div",{className:j("absolute -top-3 flex items-center gap-1 rounded-md border border-border bg-popover px-1 py-0.5 opacity-0 shadow-sm transition-opacity group-hover:opacity-100",a?"right-0":"left-0"),children:e.jsx("button",{onClick:o,className:"rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground",children:r?e.jsx(R,{className:"h-3 w-3 text-emerald-500"}):e.jsx(Ne,{className:"h-3 w-3"})})})]}),e.jsx("p",{className:j("px-1 text-[0.6875rem] text-muted-foreground",a?"text-right":"text-left"),children:ge(t.timestamp)})]})]})}function pt({text:t,steps:i}){const r=!t,c=Y(a=>a.resolved);return e.jsxs("div",{className:"flex gap-3",children:[e.jsx("div",{className:"flex h-7 w-7 shrink-0 items-center justify-center overflow-hidden rounded-full bg-card",children:e.jsx("img",{src:c==="dark"?"/logo-dark.png":"/logo-light.png",alt:"Mercury",className:"h-full w-full object-contain"})}),e.jsxs("div",{className:"max-w-[80%] space-y-1",children:[i==null?void 0:i.map((a,l)=>e.jsx(se,{tool:a.tool,status:a.status},`stream-step-${l}`)),e.jsx("div",{className:"rounded-2xl rounded-bl-sm border border-border/60 bg-card px-4 py-2.5 text-card-foreground",children:r?e.jsxs("div",{className:"flex items-center gap-1 text-sm text-muted-foreground",children:[e.jsx("span",{children:"Thinking"}),e.jsx("span",{className:"inline-flex w-5",children:e.jsx("span",{className:"animate-pulse",children:"..."})})]}):e.jsxs("div",{className:"inline",children:[e.jsx(Q,{content:t}),e.jsx("span",{className:"ml-0.5 inline-block h-4 w-[3px] translate-y-[2px] rounded-sm bg-mercury-500 animate-cursor-blink"})]})})]})]})}function ft(){const t=y(o=>o.setThreads),i=y(o=>o.threads),r=y(o=>o.threadVersion),[c,a]=d.useState(!0),l=d.useCallback(async()=>{try{const o=await k.chat.threads.list();t(o.threads)}catch{}finally{a(!1)}},[t]);return d.useEffect(()=>{l()},[l,r]),{threads:i,loading:c,reload:l}}function gt(t){const i=d.useRef(null),[r,c]=d.useState(!0),a=d.useRef(!1),l=d.useCallback(()=>{const m=i.current;m&&(m.scrollTop=m.scrollHeight,a.current=!1,c(!0))},[]);d.useEffect(()=>{a.current||l()},t);const o=d.useCallback(()=>{const m=i.current;if(!m)return;const h=m.scrollHeight-m.scrollTop-m.clientHeight<80;c(h),h?a.current=!1:a.current=!0},[]);return{containerRef:i,atBottom:r,scrollToBottom:l,handleScroll:o}}function bt(){return e.jsx("div",{className:"flex w-full justify-start",children:e.jsxs("div",{className:"flex items-center gap-2 rounded-2xl bg-muted px-4 py-3 text-sm text-muted-foreground",children:[e.jsx(M,{className:"h-4 w-4 animate-spin text-primary"}),"Thinking..."]})})}function yt({data:t}){const[i,r]=d.useState(!1);async function c(a){r(!0);try{await k.chat.permission(t.id,a)}catch{}finally{r(!1)}}return e.jsx("div",{className:"flex w-full justify-start",children:e.jsxs("div",{className:"max-w-[85%] rounded-2xl border border-amber-500/30 bg-amber-500/5 px-4 py-3",children:[e.jsxs("div",{className:"flex items-center gap-2 text-sm font-medium text-amber-600 dark:text-amber-400",children:[e.jsx(Ve,{className:"h-4 w-4"}),"Permission Required"]}),t.tool&&e.jsxs("p",{className:"mt-1 text-xs text-muted-foreground",children:["Tool: ",e.jsx("span",{className:"font-medium text-foreground",children:t.tool})]}),t.description&&e.jsx("p",{className:"mt-1 text-sm text-foreground",children:t.description}),e.jsxs("div",{className:"mt-3 flex items-center gap-2",children:[e.jsxs(C,{size:"sm",className:"h-7 gap-1 text-xs",disabled:i,onClick:()=>c("allow"),children:[i?e.jsx(M,{className:"h-3 w-3 animate-spin"}):e.jsx(R,{className:"h-3 w-3"}),"Allow"]}),e.jsxs(C,{size:"sm",variant:"outline",className:"h-7 gap-1 text-xs",disabled:i,onClick:()=>c("deny"),children:[e.jsx(Z,{className:"h-3 w-3"}),"Deny"]})]})]})})}const ae=[{command:"/help",description:"Show all available commands",category:"General"},{command:"/progress",description:"Show current task progress",category:"General"},{command:"/halt",description:"Stop all sub-agents",category:"General"},{command:"/stop",description:"Stop all agents and clear tasks",category:"General"},{command:"/agents",description:"List active sub-agents and status",category:"Agents"},{command:"/agents kill",description:"Kill a specific sub-agent",category:"Agents"},{command:"/bg",description:"Run a shell command in background",category:"Background"},{command:"/bg:",description:"Delegate an LLM task to background",category:"Background"},{command:"/bg list",description:"Show all background tasks",category:"Background"},{command:"/bg current",description:"Move active task to background",category:"Background"},{command:"/bg stop",description:"Stop a background task",category:"Background"},{command:"/bg killall",description:"Stop all background tasks",category:"Background"},{command:"/bg clear",description:"Prune completed background tasks",category:"Background"},{command:"/models",description:"List available models",category:"Models"},{command:"/models use",description:"Switch to a different model",category:"Models"},{command:"/code",description:"Toggle programming mode",category:"Code"},{command:"/code plan",description:"Set plan-only mode",category:"Code"},{command:"/code execute",description:"Set execute mode",category:"Code"},{command:"/code off",description:"Disable programming mode",category:"Code"},{command:"/spotify",description:"Spotify status and controls",category:"Spotify"},{command:"/spotify play",description:"Play or search for music",category:"Spotify"},{command:"/spotify pause",description:"Pause playback",category:"Spotify"},{command:"/spotify next",description:"Skip to next track",category:"Spotify"},{command:"/spotify prev",description:"Previous track",category:"Spotify"},{command:"/spotify queue",description:"Show play queue",category:"Spotify"},{command:"/budget",description:"Show token budget status",category:"Budget"},{command:"/budget override",description:"Override budget for next request",category:"Budget"},{command:"/budget reset",description:"Reset daily usage counter",category:"Budget"},{command:"/budget set",description:"Set new daily budget limit",category:"Budget"},{command:"/memory",description:"Manage second-brain memory",category:"Memory"},{command:"/permissions",description:"Toggle permission mode",category:"General"},{command:"/ws",description:"Workspace file operations",category:"Workspace"},{command:"/exit",description:"Shutdown Mercury",category:"General"}];function jt({filter:t,selectedIndex:i,onSelect:r}){const c=ae.filter(a=>a.command.startsWith(t.toLowerCase()));return c.length===0?null:e.jsx(A.div,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},exit:{opacity:0,y:8},transition:{duration:.15},className:"absolute bottom-full left-0 right-0 mb-2 max-h-64 overflow-y-auto rounded-xl border border-border bg-popover shadow-xl",children:e.jsx("div",{className:"p-1",children:c.map((a,l)=>e.jsxs("button",{onMouseDown:o=>{o.preventDefault(),r(a.command)},className:j("flex w-full items-center gap-3 rounded-lg px-3 py-2 text-left text-sm transition-colors",l===i?"bg-primary/10 text-primary":"text-foreground hover:bg-muted"),children:[e.jsx("span",{className:"font-mono font-medium text-xs shrink-0",children:a.command}),e.jsx("span",{className:"text-muted-foreground text-xs truncate",children:a.description}),e.jsx("span",{className:"ml-auto text-[10px] text-muted-foreground/60 shrink-0",children:a.category})]},a.command))})})}function vt({onSend:t,disabled:i}){const[r,c]=d.useState(""),[a,l]=d.useState(!1),[o,m]=d.useState(0),p=d.useRef(null),h=a?r.split(`
22
- `)[0]:"",f=ae.filter(n=>n.command.startsWith(h.toLowerCase()));function S(){const n=r.trim();!n||i||(l(!1),t(n),c(""),p.current&&(p.current.style.height="auto"))}function w(n){var u;const b=["/bg","/bg:","/bg stop","/models use","/agents kill","/spotify play","/budget set"].includes(n);c(b?n+" ":n),l(!1),m(0),(u=p.current)==null||u.focus()}function N(n){if(a&&f.length>0){if(n.key==="ArrowDown"){n.preventDefault(),m(b=>Math.min(b+1,f.length-1));return}if(n.key==="ArrowUp"){n.preventDefault(),m(b=>Math.max(b-1,0));return}if(n.key==="Tab"||n.key==="Enter"&&!n.shiftKey){n.preventDefault(),w(f[o].command);return}if(n.key==="Escape"){n.preventDefault(),l(!1);return}}n.key==="Enter"&&!n.shiftKey&&(n.preventDefault(),S())}function D(n){c(n);const b=n.split(`
23
- `)[0];b.startsWith("/")&&!b.includes(" ")||b.startsWith("/")&&b.split(" ").length<=2?(l(!0),m(0)):l(!1)}function x(){const n=p.current;n&&(n.style.height="auto",n.style.height=Math.min(n.scrollHeight,200)+"px")}return e.jsx("div",{className:"border-t border-border bg-background/80 backdrop-blur-xl px-4 py-3",children:e.jsxs("div",{className:"mx-auto flex max-w-3xl items-end gap-2",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx($,{children:a&&f.length>0&&e.jsx(jt,{filter:h,selectedIndex:o,onSelect:w})}),e.jsx("textarea",{ref:p,value:r,onChange:n=>{D(n.target.value),x()},onKeyDown:N,onBlur:()=>{setTimeout(()=>l(!1),200)},placeholder:"Send a message... (type / for commands)",rows:1,className:j("w-full resize-none rounded-xl border border-border bg-muted/40 px-4 py-3 pr-12 text-sm text-foreground placeholder:text-muted-foreground","focus:outline-none focus:ring-2 focus:ring-primary/40 focus:border-primary/40","transition-all duration-150"),style:{maxHeight:200}})]}),e.jsx(C,{size:"icon",disabled:i||!r.trim(),onClick:S,className:"h-10 w-10 shrink-0 rounded-xl",children:e.jsx(Xe,{className:"h-4 w-4"})})]})})}function _t(){const{threadId:t}=pe(),i=fe(),{connected:r}=ke(),{threads:c,loading:a,reload:l}=ft(),o=y(s=>s.messages),m=y(s=>s.streamingText),p=y(s=>s.isStreaming),h=y(s=>s.waiting),f=y(s=>s.activeThreadId),S=y(s=>s.provider),w=y(s=>s.model),N=y(s=>s.totalSteps),D=y(s=>s.completedSteps),x=y(s=>s.currentStepTool),n=y(s=>s.setActiveThread),b=y(s=>s.addMessage),u=y(s=>s.clearMessages),g=y(s=>s.setWaiting),T=y(s=>s.clearStreaming),P=y(s=>s.resetSteps),re=y(s=>s.bumpThreadVersion);d.useEffect(()=>{t&&t!==f&&n(t)},[t]);const[L,B]=d.useState(!0),[I,F]=d.useState(!1),{containerRef:ne,atBottom:oe,scrollToBottom:le,handleScroll:ie}=gt([o,m,h]);d.useEffect(()=>{if(!f){u();return}(async()=>{try{const s=await k.chat.threads.get(f);u(),s.messages&&s.messages.length>0&&s.messages.forEach(v=>b(v))}catch{u()}})()},[f]);async function ce(s){let v=f;v||(v=`web:${Date.now()}_${Math.random().toString(36).slice(2,8)}`,n(v)),b({id:crypto.randomUUID(),role:"user",content:s,timestamp:new Date().toISOString()}),g(!0),k.chat.threads.addMessage(v,"user",s).then(()=>re()).catch(()=>{});try{await k.chat.send(s,v),l()}catch{g(!1),T(),P(),b({id:crypto.randomUUID(),role:"system",content:"Failed to send message. Please try again.",timestamp:new Date().toISOString()})}}async function U(s){try{await k.chat.threads.delete(s),f===s&&(n(null),u()),l()}catch{}}function W(){const s=`web:${Date.now()}_${Math.random().toString(36).slice(2,8)}`;n(s),u(),l(),i(`/chat/${s}`)}function _(s){n(s),i(`/chat/${s}`)}function q(s){const v=c.find(z=>z.id===s);if(!v)return;const xe=v.messages.map(z=>`[${z.role}] ${z.content}`).join(`
24
-
25
- ---
26
-
27
- `),he=new Blob([xe],{type:"text/plain"}),H=URL.createObjectURL(he),O=document.createElement("a");O.href=H,O.download=`${v.title||"conversation"}-${s.slice(0,8)}.txt`,O.click(),URL.revokeObjectURL(H)}const de=p||h,me=N>0,ue=N>0?D/N*100:0;return e.jsxs("div",{className:"flex h-full w-full overflow-hidden",children:[e.jsx("div",{className:j("hidden h-full shrink-0 border-r border-border bg-background transition-[width] duration-200 ease-in-out md:block overflow-hidden",L?"w-[240px]":"w-0 border-r-0"),children:e.jsx("div",{className:"h-full w-[240px]",children:e.jsx(G,{threads:c,activeThreadId:f,onSelect:_,onDelete:U,onNew:W,onExport:q})})}),e.jsx($,{children:L&&e.jsxs(e.Fragment,{children:[e.jsx(A.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},className:"fixed inset-0 z-40 bg-black/50 backdrop-blur-sm md:hidden",onClick:()=>B(!1)}),e.jsx(A.div,{initial:{x:-260},animate:{x:0},exit:{x:-260},transition:{duration:.2,ease:"easeInOut"},className:"fixed inset-y-0 left-0 z-50 w-[260px] bg-background shadow-xl md:hidden",children:e.jsx(G,{threads:c,activeThreadId:f,onSelect:s=>{_(s),B(!1)},onDelete:U,onNew:()=>{W(),B(!1)},onExport:q})})]})}),e.jsxs("div",{className:"flex min-w-0 flex-1 flex-col",children:[e.jsxs("header",{className:"flex h-12 items-center gap-2 border-b border-border bg-background/80 backdrop-blur-xl px-3",children:[e.jsx(C,{variant:"ghost",size:"icon",className:"h-8 w-8",onClick:()=>B(!L),children:L?e.jsx(Qe,{className:"h-4 w-4"}):e.jsx(tt,{className:"h-4 w-4"})}),e.jsx("span",{className:"hidden text-sm font-bold mercury-gradient-text sm:inline",children:"Mercury"}),e.jsx("div",{className:"mx-1 h-4 w-px bg-border"}),e.jsx(dt,{currentProvider:S,currentModel:w}),e.jsx("div",{className:"flex-1"}),e.jsx(ut,{}),e.jsx("div",{className:j("h-2 w-2 rounded-full",r?"bg-emerald-500":"bg-destructive"),title:r?"Connected":"Disconnected"}),e.jsx(C,{variant:"ghost",size:"icon",className:"h-8 w-8",onClick:()=>F(!I),children:e.jsx(Ke,{className:"h-4 w-4"})}),e.jsx(C,{variant:"ghost",size:"icon",className:"h-8 w-8 hidden md:inline-flex",onClick:()=>window.location.href="/settings",children:e.jsx(be,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"relative flex-1 min-h-0",children:[e.jsx("div",{ref:ne,onScroll:ie,className:"h-full overflow-y-auto",children:e.jsx("div",{className:"mx-auto max-w-3xl space-y-4 px-4 py-6",children:a&&o.length===0?e.jsx("div",{className:"flex flex-col items-center justify-center py-24",children:e.jsx(M,{className:"h-6 w-6 animate-spin text-primary"})}):o.length===0&&!p&&!h?e.jsxs("div",{className:"flex flex-col items-center justify-center gap-3 py-24 text-center",children:[e.jsx("div",{className:"rounded-2xl bg-primary/10 p-4",children:e.jsx(X,{className:"h-8 w-8 text-primary"})}),e.jsx("h3",{className:"text-lg font-semibold text-foreground",children:"Start a conversation"}),e.jsx("p",{className:"max-w-sm text-sm text-muted-foreground",children:"Send a message to begin. Mercury is ready to assist you."})]}):e.jsxs(e.Fragment,{children:[o.map(s=>{if(s.role==="system")try{const v=JSON.parse(s.content);if(v.id&&(v.tool||v.description))return e.jsx(yt,{data:v},s.id)}catch{}return e.jsx(ht,{message:s},s.id)}),p&&m&&e.jsx(pt,{text:m}),h&&!p&&e.jsx(bt,{})]})})}),e.jsx($,{children:!oe&&e.jsx(A.div,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},exit:{opacity:0,y:10},className:"absolute bottom-4 right-4",children:e.jsx(C,{variant:"outline",size:"icon",className:"h-9 w-9 rounded-full shadow-lg border-border bg-background/90 backdrop-blur-sm",onClick:le,children:e.jsx(Se,{className:"h-4 w-4"})})})})]}),me&&e.jsx("div",{className:"px-4 py-1.5",children:e.jsxs("div",{className:"mx-auto max-w-3xl",children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground mb-1",children:[e.jsx(M,{className:"h-3 w-3 animate-spin text-primary"}),e.jsxs("span",{children:["Step ",D," of ",N,x&&e.jsxs("span",{className:"ml-1 text-foreground font-medium",children:["— ",x]})]})]}),e.jsx(ye,{value:ue,className:"h-1"})]})}),e.jsx(vt,{onSend:ce,disabled:de})]}),e.jsx($,{mode:"wait",children:I&&e.jsx(A.div,{initial:{width:0,opacity:0},animate:{width:320,opacity:1},exit:{width:0,opacity:0},transition:{duration:.2,ease:"easeInOut"},className:"hidden h-full shrink-0 overflow-hidden md:block",children:e.jsx("div",{className:"h-full w-[320px]",children:e.jsx(lt,{open:I,onClose:()=>F(!1)})})})})]})}export{_t as ChatPage};
28
- //# sourceMappingURL=Chat-DXSn2dY8.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Chat-DXSn2dY8.js","sources":["../../node_modules/lucide-react/dist/esm/icons/file.js","../../node_modules/lucide-react/dist/esm/icons/panel-left-close.js","../../node_modules/lucide-react/dist/esm/icons/panel-left-open.js","../../node_modules/lucide-react/dist/esm/icons/wrench.js","../../src/components/chat/ThreadList.tsx","../../src/components/chat/WorkspacePanel.tsx","../../src/components/ui/popover.tsx","../../src/components/chat/ModelSwitcher.tsx","../../src/components/chat/CodeModeToggle.tsx","../../src/components/chat/ToolCallCard.tsx","../../src/components/chat/MessageBubble.tsx","../../src/components/chat/StreamingMessage.tsx","../../src/pages/Chat.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\", key: \"1rqfz7\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }]\n];\nconst File = createLucideIcon(\"file\", __iconNode);\n\nexport { __iconNode, File as default };\n//# sourceMappingURL=file.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M9 3v18\", key: \"fh3hqa\" }],\n [\"path\", { d: \"m16 15-3-3 3-3\", key: \"14y99z\" }]\n];\nconst PanelLeftClose = createLucideIcon(\"panel-left-close\", __iconNode);\n\nexport { __iconNode, PanelLeftClose as default };\n//# sourceMappingURL=panel-left-close.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M9 3v18\", key: \"fh3hqa\" }],\n [\"path\", { d: \"m14 9 3 3-3 3\", key: \"8010ee\" }]\n];\nconst PanelLeftOpen = createLucideIcon(\"panel-left-open\", __iconNode);\n\nexport { __iconNode, PanelLeftOpen as default };\n//# sourceMappingURL=panel-left-open.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\",\n key: \"cbrjhi\"\n }\n ]\n];\nconst Wrench = createLucideIcon(\"wrench\", __iconNode);\n\nexport { __iconNode, Wrench as default };\n//# sourceMappingURL=wrench.js.map\n","import { useState } from \"react\";\nimport { Plus, Trash2, Download, MessageSquare } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"@/components/ui/button\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"@/components/ui/alert-dialog\";\nimport type { ChatThread } from \"@/lib/api\";\n\ninterface ThreadListProps {\n threads: ChatThread[];\n activeThreadId: string | null;\n onSelect: (id: string) => void;\n onDelete: (id: string) => void;\n onNew: () => void;\n onExport: (id: string) => void;\n}\n\nexport function ThreadList({\n threads,\n activeThreadId,\n onSelect,\n onDelete,\n onNew,\n onExport,\n}: ThreadListProps) {\n const [deleteTarget, setDeleteTarget] = useState<string | null>(null);\n\n function formatDate(iso: string): string {\n const d = new Date(iso);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) {\n return d.toLocaleTimeString(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n }\n if (diffDays === 1) return \"Yesterday\";\n if (diffDays < 7) return `${diffDays} days ago`;\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n });\n }\n\n return (\n <div className=\"flex h-full flex-col\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-border px-4 py-3\">\n <h2 className=\"text-sm font-semibold text-foreground\">Conversations</h2>\n <Button size=\"sm\" onClick={onNew} className=\"h-7 gap-1 px-2 text-xs\">\n <Plus className=\"h-3.5 w-3.5\" />\n New Chat\n </Button>\n </div>\n\n {/* Thread list */}\n <ScrollArea className=\"flex-1\">\n {threads.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center gap-2 px-4 py-12 text-center\">\n <MessageSquare className=\"h-8 w-8 text-muted-foreground/40\" />\n <p className=\"text-sm text-muted-foreground\">\n No conversations yet\n </p>\n </div>\n ) : (\n <div className=\"p-2\">\n {threads.map((thread) => {\n const isActive = thread.id === activeThreadId;\n return (\n <ThreadItem\n key={thread.id}\n thread={thread}\n isActive={isActive}\n formatDate={formatDate}\n onSelect={() => onSelect(thread.id)}\n onDelete={() => setDeleteTarget(thread.id)}\n onExport={() => onExport(thread.id)}\n />\n );\n })}\n </div>\n )}\n </ScrollArea>\n\n {/* Delete confirmation */}\n <AlertDialog\n open={deleteTarget !== null}\n onOpenChange={(open) => {\n if (!open) setDeleteTarget(null);\n }}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete conversation?</AlertDialogTitle>\n <AlertDialogDescription>\n This will permanently remove this conversation and all its\n messages. This action cannot be undone.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n onClick={() => {\n if (deleteTarget) {\n onDelete(deleteTarget);\n setDeleteTarget(null);\n }\n }}\n >\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n\nfunction ThreadItem({\n thread,\n isActive,\n formatDate,\n onSelect,\n onDelete,\n onExport,\n}: {\n thread: ChatThread;\n isActive: boolean;\n formatDate: (iso: string) => string;\n onSelect: () => void;\n onDelete: () => void;\n onExport: () => void;\n}) {\n return (\n <div\n onClick={onSelect}\n className={cn(\n \"group flex w-full cursor-pointer items-center rounded-lg pl-2 pr-1 py-2 text-left transition-all duration-150\",\n isActive\n ? \"border-l-2 border-l-primary bg-primary/10 text-foreground\"\n : \"border-l-2 border-l-transparent hover:bg-muted/60 text-foreground/80\"\n )}\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium leading-snug text-left\">\n {thread.title || \"New conversation\"}\n </div>\n <div className=\"text-xs text-muted-foreground text-left\">\n {formatDate(thread.createdAt)}\n </div>\n </div>\n\n {/* Delete button */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n className={cn(\n \"shrink-0 rounded-md p-1 text-red-500 hover:bg-red-500/10 hover:text-red-600 transition-opacity\",\n isActive ? \"opacity-100\" : \"opacity-0 group-hover:opacity-100\"\n )}\n title=\"Delete\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n );\n}\n","import { useState, useCallback } from \"react\";\nimport {\n X,\n Folder,\n File,\n ChevronRight,\n ArrowUp,\n Loader2,\n} from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"@/components/ui/button\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\nimport api from \"@/lib/api\";\nimport type { WorkspaceTree, WorkspaceFile } from \"@/lib/api\";\nimport { Prism as SyntaxHighlighter } from \"react-syntax-highlighter\";\nimport { oneDark } from \"react-syntax-highlighter/dist/esm/styles/prism\";\n\ninterface WorkspacePanelProps {\n open: boolean;\n onClose: () => void;\n}\n\nconst EXT_LANG_MAP: Record<string, string> = {\n ts: \"typescript\",\n tsx: \"tsx\",\n js: \"javascript\",\n jsx: \"jsx\",\n py: \"python\",\n go: \"go\",\n rs: \"rust\",\n json: \"json\",\n yaml: \"yaml\",\n yml: \"yaml\",\n md: \"markdown\",\n css: \"css\",\n html: \"html\",\n sh: \"bash\",\n bash: \"bash\",\n sql: \"sql\",\n toml: \"toml\",\n xml: \"xml\",\n dockerfile: \"docker\",\n};\n\nfunction getLanguage(ext: string): string {\n return EXT_LANG_MAP[ext.toLowerCase().replace(/^\\./, \"\")] || \"text\";\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function WorkspacePanel({ open, onClose }: WorkspacePanelProps) {\n const [tree, setTree] = useState<WorkspaceTree | null>(null);\n const [file, setFile] = useState<WorkspaceFile | null>(null);\n const [loading, setLoading] = useState(false);\n const [fileLoading, setFileLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const loadTree = useCallback(async (path?: string) => {\n setLoading(true);\n setError(null);\n setFile(null);\n try {\n const data = await api.workspace.tree(path);\n setTree(data);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load workspace\");\n } finally {\n setLoading(false);\n }\n }, []);\n\n const loadFile = useCallback(async (path: string) => {\n setFileLoading(true);\n try {\n const data = await api.workspace.file(path);\n setFile(data);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load file\");\n } finally {\n setFileLoading(false);\n }\n }, []);\n\n // Load tree on first open\n const [initialized, setInitialized] = useState(false);\n if (open && !initialized) {\n setInitialized(true);\n loadTree();\n }\n if (!open && initialized) {\n setInitialized(false);\n }\n\n if (!open) return null;\n\n // Build breadcrumb segments\n const breadcrumbs: { label: string; path: string }[] = [];\n if (tree) {\n const relative = tree.currentPath.replace(tree.root, \"\").replace(/^\\//, \"\");\n if (relative) {\n const parts = relative.split(\"/\");\n let accumulated = \"\";\n for (const part of parts) {\n accumulated = accumulated ? `${accumulated}/${part}` : part;\n breadcrumbs.push({ label: part, path: accumulated });\n }\n }\n }\n\n function navigateUp() {\n if (!tree) return;\n const rel = tree.currentPath.replace(tree.root, \"\").replace(/^\\//, \"\");\n const parts = rel.split(\"/\").filter(Boolean);\n if (parts.length <= 1) {\n loadTree();\n } else {\n parts.pop();\n loadTree(parts.join(\"/\"));\n }\n }\n\n return (\n <div className=\"flex h-full w-full flex-col border-l border-border bg-background\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-border px-4 py-3\">\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"text-sm font-semibold text-foreground\">Workspace</h2>\n {tree && (\n <p className=\"truncate text-xs text-muted-foreground\">\n {tree.root}\n </p>\n )}\n </div>\n <Button variant=\"ghost\" size=\"icon\" onClick={onClose} className=\"h-7 w-7 shrink-0\">\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n\n {/* Breadcrumbs */}\n {tree && breadcrumbs.length > 0 && (\n <div className=\"flex items-center gap-1 border-b border-border px-4 py-2 text-xs\">\n <button\n onClick={() => loadTree()}\n className=\"text-primary hover:underline\"\n >\n root\n </button>\n {breadcrumbs.map((bc) => (\n <span key={bc.path} className=\"flex items-center gap-1\">\n <ChevronRight className=\"h-3 w-3 text-muted-foreground\" />\n <button\n onClick={() => loadTree(bc.path)}\n className=\"text-primary hover:underline\"\n >\n {bc.label}\n </button>\n </span>\n ))}\n </div>\n )}\n\n <ScrollArea className=\"flex-1\">\n {loading ? (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"h-5 w-5 animate-spin text-primary\" />\n </div>\n ) : error ? (\n <div className=\"px-4 py-8 text-center text-sm text-destructive\">\n {error}\n </div>\n ) : (\n <div className=\"flex flex-col\">\n {/* File tree */}\n {tree && (\n <div className=\"border-b border-border\">\n {/* Up button */}\n {breadcrumbs.length > 0 && (\n <button\n onClick={navigateUp}\n className=\"flex w-full items-center gap-2 px-4 py-2 text-sm text-muted-foreground hover:bg-muted/50 transition-colors\"\n >\n <ArrowUp className=\"h-4 w-4\" />\n <span>..</span>\n </button>\n )}\n\n {tree.items.map((item) => (\n <button\n key={item.name}\n onClick={() => {\n if (item.type === \"directory\") {\n const rel = tree.currentPath\n .replace(tree.root, \"\")\n .replace(/^\\//, \"\");\n const newPath = rel\n ? `${rel}/${item.name}`\n : item.name;\n loadTree(newPath);\n } else {\n const rel = tree.currentPath\n .replace(tree.root, \"\")\n .replace(/^\\//, \"\");\n const filePath = rel\n ? `${rel}/${item.name}`\n : item.name;\n loadFile(filePath);\n }\n }}\n className={cn(\n \"flex w-full items-center gap-2 px-4 py-2 text-sm transition-colors hover:bg-muted/50\",\n item.type === \"directory\"\n ? \"text-foreground\"\n : \"text-foreground/80\"\n )}\n >\n {item.type === \"directory\" ? (\n <Folder className=\"h-4 w-4 shrink-0 text-primary/70\" />\n ) : (\n <File className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n )}\n <span className=\"truncate\">{item.name}</span>\n {item.size !== undefined && item.type === \"file\" && (\n <span className=\"ml-auto shrink-0 text-xs text-muted-foreground\">\n {formatSize(item.size)}\n </span>\n )}\n </button>\n ))}\n\n {tree.items.length === 0 && (\n <p className=\"px-4 py-6 text-center text-sm text-muted-foreground\">\n Empty directory\n </p>\n )}\n </div>\n )}\n\n {/* File preview */}\n {fileLoading && (\n <div className=\"flex items-center justify-center py-8\">\n <Loader2 className=\"h-5 w-5 animate-spin text-primary\" />\n </div>\n )}\n\n {file && !fileLoading && (\n <div className=\"flex flex-col\">\n <div className=\"flex items-center justify-between border-b border-border px-4 py-2\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-foreground\">\n {file.name}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {formatSize(file.size)}\n {file.truncated && \" (truncated)\"}\n </p>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setFile(null)}\n className=\"h-6 text-xs\"\n >\n Close\n </Button>\n </div>\n <div className=\"overflow-auto text-xs\">\n <SyntaxHighlighter\n language={getLanguage(file.ext)}\n style={oneDark}\n customStyle={{\n margin: 0,\n borderRadius: 0,\n fontSize: \"0.75rem\",\n lineHeight: \"1.5\",\n }}\n showLineNumbers\n wrapLongLines\n >\n {file.content}\n </SyntaxHighlighter>\n </div>\n </div>\n )}\n </div>\n )}\n </ScrollArea>\n </div>\n );\n}\n","import * as React from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { cn } from \"@/lib/utils\";\n\nconst Popover = PopoverPrimitive.Root;\nconst PopoverTrigger = PopoverPrimitive.Trigger;\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n));\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };\n","import { useState, useCallback } from \"react\";\nimport { ChevronDown, Loader2, Check } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"@/components/ui/button\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/components/ui/popover\";\nimport api from \"@/lib/api\";\nimport type { ModelsResponse } from \"@/lib/api\";\nimport { useChatStore } from \"@/stores/chat\";\n\ninterface ModelSwitcherProps {\n currentProvider: string;\n currentModel: string;\n}\n\nexport function ModelSwitcher({\n currentProvider,\n currentModel,\n}: ModelSwitcherProps) {\n const [open, setOpen] = useState(false);\n const [models, setModels] = useState<ModelsResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [switching, setSwitching] = useState<string | null>(null);\n\n const setProvider = useChatStore((s) => s.setProvider);\n const setModel = useChatStore((s) => s.setModel);\n\n const loadModels = useCallback(async () => {\n if (models) return;\n setLoading(true);\n try {\n const data = await api.chat.models.list();\n setModels(data);\n } catch {\n // silently fail\n } finally {\n setLoading(false);\n }\n }, [models]);\n\n async function handleSwitch(providerName: string) {\n setSwitching(providerName);\n try {\n await api.chat.models.switch(providerName);\n // Refresh model list to get new current\n const data = await api.chat.models.list();\n setModels(data);\n\n // Find the provider to get the model name\n const p = data.providers.find((pr) => pr.name === providerName);\n if (p) {\n setProvider(p.name);\n setModel(p.model);\n }\n setOpen(false);\n } catch {\n // silently fail\n } finally {\n setSwitching(null);\n }\n }\n\n const displayName =\n currentModel.length > 24\n ? currentModel.slice(0, 22) + \"...\"\n : currentModel || currentProvider || \"Model\";\n\n return (\n <Popover\n open={open}\n onOpenChange={(o) => {\n setOpen(o);\n if (o) loadModels();\n }}\n >\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 gap-1 px-2 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n <span className=\"max-w-[140px] truncate\">{displayName}</span>\n <ChevronDown className=\"h-3 w-3\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-72 p-2\">\n <p className=\"px-2 pb-2 text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n Providers\n </p>\n\n {loading ? (\n <div className=\"flex items-center justify-center py-4\">\n <Loader2 className=\"h-4 w-4 animate-spin text-primary\" />\n </div>\n ) : models ? (\n <div className=\"flex flex-col gap-0.5\">\n {models.providers.map((p) => {\n const isActive = p.name === currentProvider;\n const isSwitching = switching === p.name;\n return (\n <button\n key={p.name}\n disabled={!p.available || isSwitching}\n onClick={() => {\n if (!isActive && p.available) handleSwitch(p.name);\n }}\n className={cn(\n \"flex items-center gap-2 rounded-md px-2 py-2 text-left text-sm transition-colors\",\n p.available\n ? \"hover:bg-muted/60\"\n : \"cursor-not-allowed opacity-40\",\n isActive && \"bg-primary/10\"\n )}\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"font-medium text-foreground\">\n {p.name}\n </span>\n {isActive && (\n <Check className=\"h-3.5 w-3.5 text-primary\" />\n )}\n </div>\n <p className=\"truncate text-xs text-muted-foreground\">\n {p.model}\n </p>\n </div>\n {isSwitching ? (\n <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin text-primary\" />\n ) : (\n <Badge\n variant={p.available ? \"success\" : \"secondary\"}\n className=\"shrink-0 text-[10px] px-1.5 py-0\"\n >\n {p.available ? \"Ready\" : \"Unavailable\"}\n </Badge>\n )}\n </button>\n );\n })}\n </div>\n ) : (\n <p className=\"px-2 py-4 text-center text-sm text-muted-foreground\">\n No providers found\n </p>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport api from \"@/lib/api\";\nimport type { CodeStatus } from \"@/lib/api\";\n\ntype CodeState = \"off\" | \"plan\" | \"execute\";\n\nconst STATES: { value: CodeState; label: string }[] = [\n { value: \"off\", label: \"Off\" },\n { value: \"plan\", label: \"Plan\" },\n { value: \"execute\", label: \"Exec\" },\n];\n\nexport function CodeModeToggle() {\n const [status, setStatus] = useState<CodeStatus | null>(null);\n const [switching, setSwitching] = useState(false);\n\n const loadStatus = useCallback(async () => {\n try {\n const data = await api.code.status();\n setStatus(data);\n } catch {\n // not available\n }\n }, []);\n\n useEffect(() => {\n loadStatus();\n }, [loadStatus]);\n\n async function handleSet(state: CodeState) {\n if (!status || switching || state === status.state) return;\n setSwitching(true);\n try {\n const result = await api.code.set(state);\n setStatus((prev) =>\n prev\n ? {\n ...prev,\n state: result.state as CodeState,\n active: result.active,\n }\n : prev\n );\n } catch {\n // silently fail\n } finally {\n setSwitching(false);\n }\n }\n\n if (!status?.available) return null;\n\n return (\n <div className=\"flex items-center rounded-lg border border-border bg-muted/40 p-0.5\">\n {STATES.map((s) => {\n const isActive = status.state === s.value;\n return (\n <button\n key={s.value}\n disabled={switching}\n onClick={() => handleSet(s.value)}\n className={cn(\n \"rounded-md px-2.5 py-1 text-xs font-medium transition-all duration-150\",\n isActive\n ? s.value === \"plan\"\n ? \"bg-amber-500/15 text-amber-600 dark:text-amber-400 shadow-sm\"\n : s.value === \"execute\"\n ? \"bg-emerald-500/15 text-emerald-600 dark:text-emerald-400 shadow-sm\"\n : \"bg-background text-muted-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\"\n )}\n >\n {s.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Wrench, Loader2, CheckCircle2, XCircle, ChevronRight } from \"lucide-react\";\nimport {\n Collapsible,\n CollapsibleTrigger,\n CollapsibleContent,\n} from \"@/components/ui/collapsible\";\nimport { cn } from \"@/lib/utils\";\n\ninterface ToolCallCardProps {\n tool: string;\n status: \"running\" | \"done\" | \"error\";\n result?: string;\n}\n\nconst statusConfig = {\n running: {\n icon: Loader2,\n label: \"Running...\",\n color: \"text-mercury-500\",\n border: \"border-l-mercury-500\",\n iconClass: \"animate-spin\",\n },\n done: {\n icon: CheckCircle2,\n label: \"Complete\",\n color: \"text-emerald-500\",\n border: \"border-l-emerald-500\",\n iconClass: \"\",\n },\n error: {\n icon: XCircle,\n label: \"Failed\",\n color: \"text-red-500\",\n border: \"border-l-red-500\",\n iconClass: \"\",\n },\n} as const;\n\nexport function ToolCallCard({ tool, status, result }: ToolCallCardProps) {\n const [open, setOpen] = useState(false);\n const config = statusConfig[status];\n const StatusIcon = config.icon;\n\n return (\n <Collapsible open={open} onOpenChange={setOpen}>\n <div\n className={cn(\n \"my-1.5 overflow-hidden rounded-md border border-border/60 border-l-2 bg-muted/30\",\n config.border\n )}\n >\n <CollapsibleTrigger className=\"flex w-full items-center gap-2 px-3 py-2 text-xs transition-colors hover:bg-muted/50\">\n <ChevronRight\n className={cn(\n \"h-3 w-3 text-muted-foreground transition-transform\",\n open && \"rotate-90\"\n )}\n />\n <Wrench className=\"h-3 w-3 text-muted-foreground\" />\n <span className=\"font-medium\">{tool}</span>\n <div className=\"ml-auto flex items-center gap-1.5\">\n <StatusIcon\n className={cn(\"h-3.5 w-3.5\", config.color, config.iconClass)}\n />\n <span className={cn(\"text-[0.6875rem]\", config.color)}>\n {config.label}\n </span>\n </div>\n </CollapsibleTrigger>\n\n <CollapsibleContent>\n {result && (\n <div className=\"max-h-40 overflow-auto border-t border-border/40 bg-background/50 px-3 py-2\">\n <pre className=\"whitespace-pre-wrap font-mono text-[0.75rem] leading-relaxed text-muted-foreground\">\n {result}\n </pre>\n </div>\n )}\n </CollapsibleContent>\n </div>\n </Collapsible>\n );\n}\n","import { useState, useCallback } from \"react\";\nimport { motion } from \"framer-motion\";\nimport { Copy, Check } from \"lucide-react\";\nimport type { ChatMessage } from \"@/lib/api\";\nimport { cn, formatDate } from \"@/lib/utils\";\nimport { useThemeStore } from \"@/stores/theme\";\nimport { MarkdownRenderer } from \"./MarkdownRenderer\";\nimport { ToolCallCard } from \"./ToolCallCard\";\n\ninterface MessageBubbleProps {\n message: ChatMessage;\n isLast?: boolean;\n}\n\nexport function MessageBubble({ message, isLast }: MessageBubbleProps) {\n const [copied, setCopied] = useState(false);\n const isUser = message.role === \"user\";\n const resolved = useThemeStore((s) => s.resolved);\n\n const handleCopy = useCallback(() => {\n navigator.clipboard.writeText(message.content);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [message.content]);\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 6 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.25, ease: \"easeOut\" }}\n className={cn(\n \"group flex gap-3\",\n isUser ? \"flex-row-reverse\" : \"flex-row\"\n )}\n >\n {/* Avatar */}\n <div\n className={cn(\n \"flex h-7 w-7 shrink-0 items-center justify-center overflow-hidden rounded-full text-xs font-semibold\",\n isUser\n ? \"bg-primary text-primary-foreground\"\n : \"bg-card\"\n )}\n >\n {isUser ? (\n \"U\"\n ) : (\n <img\n src={resolved === \"dark\" ? \"/logo-dark.png\" : \"/logo-light.png\"}\n alt=\"Mercury\"\n className=\"h-full w-full object-contain\"\n />\n )}\n </div>\n\n {/* Content column */}\n <div\n className={cn(\n \"relative max-w-[80%] space-y-1\",\n isUser ? \"items-end\" : \"items-start\"\n )}\n >\n {/* Tool steps */}\n {message.steps?.map((step, i) => (\n <ToolCallCard\n key={`${message.id}-step-${i}`}\n tool={step.tool}\n status={step.status}\n result={step.result}\n />\n ))}\n\n {/* Bubble */}\n <div\n className={cn(\n \"relative rounded-2xl px-4 py-2.5\",\n isUser\n ? \"rounded-br-sm bg-mercury-500 text-white\"\n : \"rounded-bl-sm border border-border/60 bg-card text-card-foreground\"\n )}\n >\n {isUser ? (\n <p className=\"whitespace-pre-wrap text-sm leading-relaxed\">\n {message.content}\n </p>\n ) : (\n <MarkdownRenderer content={message.content} />\n )}\n\n {/* Hover actions */}\n <div\n className={cn(\n \"absolute -top-3 flex items-center gap-1 rounded-md border border-border bg-popover px-1 py-0.5 opacity-0 shadow-sm transition-opacity group-hover:opacity-100\",\n isUser ? \"right-0\" : \"left-0\"\n )}\n >\n <button\n onClick={handleCopy}\n className=\"rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n {copied ? (\n <Check className=\"h-3 w-3 text-emerald-500\" />\n ) : (\n <Copy className=\"h-3 w-3\" />\n )}\n </button>\n </div>\n </div>\n\n {/* Timestamp */}\n <p\n className={cn(\n \"px-1 text-[0.6875rem] text-muted-foreground\",\n isUser ? \"text-right\" : \"text-left\"\n )}\n >\n {formatDate(message.timestamp)}\n </p>\n </div>\n </motion.div>\n );\n}\n","import { MarkdownRenderer } from \"./MarkdownRenderer\";\nimport { ToolCallCard } from \"./ToolCallCard\";\nimport { useThemeStore } from \"@/stores/theme\";\n\ninterface StreamingMessageProps {\n text: string;\n steps?: { tool: string; status: string }[];\n}\n\nexport function StreamingMessage({ text, steps }: StreamingMessageProps) {\n const isThinking = !text;\n const resolved = useThemeStore((s) => s.resolved);\n\n return (\n <div className=\"flex gap-3\">\n {/* Avatar */}\n <div className=\"flex h-7 w-7 shrink-0 items-center justify-center overflow-hidden rounded-full bg-card\">\n <img\n src={resolved === \"dark\" ? \"/logo-dark.png\" : \"/logo-light.png\"}\n alt=\"Mercury\"\n className=\"h-full w-full object-contain\"\n />\n </div>\n\n {/* Content */}\n <div className=\"max-w-[80%] space-y-1\">\n {/* Tool steps */}\n {steps?.map((step, i) => (\n <ToolCallCard\n key={`stream-step-${i}`}\n tool={step.tool}\n status={step.status as \"running\" | \"done\" | \"error\"}\n />\n ))}\n\n {/* Bubble */}\n <div className=\"rounded-2xl rounded-bl-sm border border-border/60 bg-card px-4 py-2.5 text-card-foreground\">\n {isThinking ? (\n <div className=\"flex items-center gap-1 text-sm text-muted-foreground\">\n <span>Thinking</span>\n <span className=\"inline-flex w-5\">\n <span className=\"animate-pulse\">...</span>\n </span>\n </div>\n ) : (\n <div className=\"inline\">\n <MarkdownRenderer content={text} />\n <span className=\"ml-0.5 inline-block h-4 w-[3px] translate-y-[2px] rounded-sm bg-mercury-500 animate-cursor-blink\" />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useEffect, useRef, useCallback } from \"react\";\nimport { useParams, useNavigate } from \"react-router-dom\";\nimport {\n PanelLeftClose,\n PanelLeftOpen,\n FolderOpen,\n Settings,\n ArrowDown,\n Send,\n Loader2,\n MessageSquare,\n Check,\n X,\n Zap,\n} from \"lucide-react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"@/components/ui/button\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\nimport { Progress } from \"@/components/ui/progress\";\nimport { useChatStore } from \"@/stores/chat\";\nimport { useSSE } from \"@/hooks/useSSE\";\nimport api from \"@/lib/api\";\nimport type { ChatMessage, ChatThread } from \"@/lib/api\";\n\nimport { ThreadList } from \"@/components/chat/ThreadList\";\nimport { WorkspacePanel } from \"@/components/chat/WorkspacePanel\";\nimport { ModelSwitcher } from \"@/components/chat/ModelSwitcher\";\nimport { CodeModeToggle } from \"@/components/chat/CodeModeToggle\";\nimport { MessageBubble as MessageBubbleComponent } from \"@/components/chat/MessageBubble\";\nimport { StreamingMessage } from \"@/components/chat/StreamingMessage\";\n\n// ─── Hooks ───────────────────────────────────────────────────\n\nfunction useThreads() {\n const setThreads = useChatStore((s) => s.setThreads);\n const threads = useChatStore((s) => s.threads);\n const threadVersion = useChatStore((s) => s.threadVersion);\n const [loading, setLoading] = useState(true);\n\n const load = useCallback(async () => {\n try {\n const data = await api.chat.threads.list();\n setThreads(data.threads);\n } catch {\n // ignore\n } finally {\n setLoading(false);\n }\n }, [setThreads]);\n\n useEffect(() => {\n load();\n }, [load, threadVersion]);\n\n return { threads, loading, reload: load };\n}\n\nfunction useAutoScroll(deps: unknown[]) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [atBottom, setAtBottom] = useState(true);\n const userScrolledUp = useRef(false);\n\n const scrollToBottom = useCallback(() => {\n const el = containerRef.current;\n if (el) {\n el.scrollTop = el.scrollHeight;\n userScrolledUp.current = false;\n setAtBottom(true);\n }\n }, []);\n\n useEffect(() => {\n if (!userScrolledUp.current) {\n scrollToBottom();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n\n const handleScroll = useCallback(() => {\n const el = containerRef.current;\n if (!el) return;\n const threshold = 80;\n const isAtBottom =\n el.scrollHeight - el.scrollTop - el.clientHeight < threshold;\n setAtBottom(isAtBottom);\n if (!isAtBottom) {\n userScrolledUp.current = true;\n } else {\n userScrolledUp.current = false;\n }\n }, []);\n\n return { containerRef, atBottom, scrollToBottom, handleScroll };\n}\n\n// ─── Sub-components ──────────────────────────────────────────\n\nfunction WaitingIndicator() {\n return (\n <div className=\"flex w-full justify-start\">\n <div className=\"flex items-center gap-2 rounded-2xl bg-muted px-4 py-3 text-sm text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin text-primary\" />\n Thinking...\n </div>\n </div>\n );\n}\n\nfunction PermissionPrompt({\n data,\n}: {\n data: { id: string; tool?: string; description?: string };\n}) {\n const [resolving, setResolving] = useState(false);\n\n async function handle(action: string) {\n setResolving(true);\n try {\n await api.chat.permission(data.id, action);\n } catch {\n // ignore\n } finally {\n setResolving(false);\n }\n }\n\n return (\n <div className=\"flex w-full justify-start\">\n <div className=\"max-w-[85%] rounded-2xl border border-amber-500/30 bg-amber-500/5 px-4 py-3\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-amber-600 dark:text-amber-400\">\n <Zap className=\"h-4 w-4\" />\n Permission Required\n </div>\n {data.tool && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Tool: <span className=\"font-medium text-foreground\">{data.tool}</span>\n </p>\n )}\n {data.description && (\n <p className=\"mt-1 text-sm text-foreground\">{data.description}</p>\n )}\n <div className=\"mt-3 flex items-center gap-2\">\n <Button\n size=\"sm\"\n className=\"h-7 gap-1 text-xs\"\n disabled={resolving}\n onClick={() => handle(\"allow\")}\n >\n {resolving ? (\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n <Check className=\"h-3 w-3\" />\n )}\n Allow\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 gap-1 text-xs\"\n disabled={resolving}\n onClick={() => handle(\"deny\")}\n >\n <X className=\"h-3 w-3\" />\n Deny\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\n// ─── Slash Commands ──────────────────────────────────────────\n\ninterface SlashCommand {\n command: string;\n description: string;\n category: string;\n}\n\nconst SLASH_COMMANDS: SlashCommand[] = [\n { command: \"/help\", description: \"Show all available commands\", category: \"General\" },\n { command: \"/progress\", description: \"Show current task progress\", category: \"General\" },\n { command: \"/halt\", description: \"Stop all sub-agents\", category: \"General\" },\n { command: \"/stop\", description: \"Stop all agents and clear tasks\", category: \"General\" },\n { command: \"/agents\", description: \"List active sub-agents and status\", category: \"Agents\" },\n { command: \"/agents kill\", description: \"Kill a specific sub-agent\", category: \"Agents\" },\n { command: \"/bg\", description: \"Run a shell command in background\", category: \"Background\" },\n { command: \"/bg:\", description: \"Delegate an LLM task to background\", category: \"Background\" },\n { command: \"/bg list\", description: \"Show all background tasks\", category: \"Background\" },\n { command: \"/bg current\", description: \"Move active task to background\", category: \"Background\" },\n { command: \"/bg stop\", description: \"Stop a background task\", category: \"Background\" },\n { command: \"/bg killall\", description: \"Stop all background tasks\", category: \"Background\" },\n { command: \"/bg clear\", description: \"Prune completed background tasks\", category: \"Background\" },\n { command: \"/models\", description: \"List available models\", category: \"Models\" },\n { command: \"/models use\", description: \"Switch to a different model\", category: \"Models\" },\n { command: \"/code\", description: \"Toggle programming mode\", category: \"Code\" },\n { command: \"/code plan\", description: \"Set plan-only mode\", category: \"Code\" },\n { command: \"/code execute\", description: \"Set execute mode\", category: \"Code\" },\n { command: \"/code off\", description: \"Disable programming mode\", category: \"Code\" },\n { command: \"/spotify\", description: \"Spotify status and controls\", category: \"Spotify\" },\n { command: \"/spotify play\", description: \"Play or search for music\", category: \"Spotify\" },\n { command: \"/spotify pause\", description: \"Pause playback\", category: \"Spotify\" },\n { command: \"/spotify next\", description: \"Skip to next track\", category: \"Spotify\" },\n { command: \"/spotify prev\", description: \"Previous track\", category: \"Spotify\" },\n { command: \"/spotify queue\", description: \"Show play queue\", category: \"Spotify\" },\n { command: \"/budget\", description: \"Show token budget status\", category: \"Budget\" },\n { command: \"/budget override\", description: \"Override budget for next request\", category: \"Budget\" },\n { command: \"/budget reset\", description: \"Reset daily usage counter\", category: \"Budget\" },\n { command: \"/budget set\", description: \"Set new daily budget limit\", category: \"Budget\" },\n { command: \"/memory\", description: \"Manage second-brain memory\", category: \"Memory\" },\n { command: \"/permissions\", description: \"Toggle permission mode\", category: \"General\" },\n { command: \"/ws\", description: \"Workspace file operations\", category: \"Workspace\" },\n { command: \"/exit\", description: \"Shutdown Mercury\", category: \"General\" },\n];\n\nfunction SlashCommandMenu({\n filter,\n selectedIndex,\n onSelect,\n}: {\n filter: string;\n selectedIndex: number;\n onSelect: (cmd: string) => void;\n}) {\n const filtered = SLASH_COMMANDS.filter((c) =>\n c.command.startsWith(filter.toLowerCase())\n );\n\n if (filtered.length === 0) return null;\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 8 }}\n transition={{ duration: 0.15 }}\n className=\"absolute bottom-full left-0 right-0 mb-2 max-h-64 overflow-y-auto rounded-xl border border-border bg-popover shadow-xl\"\n >\n <div className=\"p-1\">\n {filtered.map((cmd, i) => (\n <button\n key={cmd.command}\n onMouseDown={(e) => {\n e.preventDefault();\n onSelect(cmd.command);\n }}\n className={cn(\n \"flex w-full items-center gap-3 rounded-lg px-3 py-2 text-left text-sm transition-colors\",\n i === selectedIndex\n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:bg-muted\"\n )}\n >\n <span className=\"font-mono font-medium text-xs shrink-0\">\n {cmd.command}\n </span>\n <span className=\"text-muted-foreground text-xs truncate\">\n {cmd.description}\n </span>\n <span className=\"ml-auto text-[10px] text-muted-foreground/60 shrink-0\">\n {cmd.category}\n </span>\n </button>\n ))}\n </div>\n </motion.div>\n );\n}\n\nfunction ChatInput({\n onSend,\n disabled,\n}: {\n onSend: (text: string) => void;\n disabled: boolean;\n}) {\n const [text, setText] = useState(\"\");\n const [showSlash, setShowSlash] = useState(false);\n const [slashIndex, setSlashIndex] = useState(0);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // Compute filtered commands for index bounds\n const slashFilter = showSlash ? text.split(\"\\n\")[0] : \"\";\n const filteredCommands = SLASH_COMMANDS.filter((c) =>\n c.command.startsWith(slashFilter.toLowerCase())\n );\n\n function handleSubmit() {\n const trimmed = text.trim();\n if (!trimmed || disabled) return;\n setShowSlash(false);\n onSend(trimmed);\n setText(\"\");\n if (textareaRef.current) {\n textareaRef.current.style.height = \"auto\";\n }\n }\n\n function selectSlashCommand(cmd: string) {\n // If the command typically takes arguments, add a trailing space\n const needsArg = [\"/bg\", \"/bg:\", \"/bg stop\", \"/models use\", \"/agents kill\", \"/spotify play\", \"/budget set\"].includes(cmd);\n setText(needsArg ? cmd + \" \" : cmd);\n setShowSlash(false);\n setSlashIndex(0);\n textareaRef.current?.focus();\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (showSlash && filteredCommands.length > 0) {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setSlashIndex((prev) => Math.min(prev + 1, filteredCommands.length - 1));\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setSlashIndex((prev) => Math.max(prev - 1, 0));\n return;\n }\n if (e.key === \"Tab\" || (e.key === \"Enter\" && !e.shiftKey)) {\n e.preventDefault();\n selectSlashCommand(filteredCommands[slashIndex].command);\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n setShowSlash(false);\n return;\n }\n }\n\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n }\n\n function handleChange(value: string) {\n setText(value);\n\n // Show slash menu when text starts with / and is a single line of just the command\n const firstLine = value.split(\"\\n\")[0];\n if (firstLine.startsWith(\"/\") && !firstLine.includes(\" \")) {\n setShowSlash(true);\n setSlashIndex(0);\n } else if (firstLine.startsWith(\"/\") && firstLine.split(\" \").length <= 2) {\n // Allow filtering for two-word commands like \"/bg list\"\n setShowSlash(true);\n setSlashIndex(0);\n } else {\n setShowSlash(false);\n }\n }\n\n function handleInput() {\n const el = textareaRef.current;\n if (el) {\n el.style.height = \"auto\";\n el.style.height = Math.min(el.scrollHeight, 200) + \"px\";\n }\n }\n\n return (\n <div className=\"border-t border-border bg-background/80 backdrop-blur-xl px-4 py-3\">\n <div className=\"mx-auto flex max-w-3xl items-end gap-2\">\n <div className=\"relative flex-1\">\n <AnimatePresence>\n {showSlash && filteredCommands.length > 0 && (\n <SlashCommandMenu\n filter={slashFilter}\n selectedIndex={slashIndex}\n onSelect={selectSlashCommand}\n />\n )}\n </AnimatePresence>\n <textarea\n ref={textareaRef}\n value={text}\n onChange={(e) => {\n handleChange(e.target.value);\n handleInput();\n }}\n onKeyDown={handleKeyDown}\n onBlur={() => {\n // Delay to allow click on menu item\n setTimeout(() => setShowSlash(false), 200);\n }}\n placeholder=\"Send a message... (type / for commands)\"\n rows={1}\n className={cn(\n \"w-full resize-none rounded-xl border border-border bg-muted/40 px-4 py-3 pr-12 text-sm text-foreground placeholder:text-muted-foreground\",\n \"focus:outline-none focus:ring-2 focus:ring-primary/40 focus:border-primary/40\",\n \"transition-all duration-150\"\n )}\n style={{ maxHeight: 200 }}\n />\n </div>\n <Button\n size=\"icon\"\n disabled={disabled || !text.trim()}\n onClick={handleSubmit}\n className=\"h-10 w-10 shrink-0 rounded-xl\"\n >\n <Send className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n );\n}\n\n// ─── Main Page ───────────────────────────────────────────────\n\nexport function ChatPage() {\n const { threadId: urlThreadId } = useParams<{ threadId?: string }>();\n const navigate = useNavigate();\n const { connected } = useSSE();\n const { threads, loading: threadsLoading, reload: reloadThreads } = useThreads();\n\n // Store state\n const messages = useChatStore((s) => s.messages);\n const streamingText = useChatStore((s) => s.streamingText);\n const isStreaming = useChatStore((s) => s.isStreaming);\n const waiting = useChatStore((s) => s.waiting);\n const activeThreadId = useChatStore((s) => s.activeThreadId);\n const provider = useChatStore((s) => s.provider);\n const model = useChatStore((s) => s.model);\n const totalSteps = useChatStore((s) => s.totalSteps);\n const completedSteps = useChatStore((s) => s.completedSteps);\n const currentStepTool = useChatStore((s) => s.currentStepTool);\n const setActiveThread = useChatStore((s) => s.setActiveThread);\n const addMessage = useChatStore((s) => s.addMessage);\n const clearMessages = useChatStore((s) => s.clearMessages);\n const setWaiting = useChatStore((s) => s.setWaiting);\n const clearStreaming = useChatStore((s) => s.clearStreaming);\n const resetSteps = useChatStore((s) => s.resetSteps);\n const bumpThreadVersion = useChatStore((s) => s.bumpThreadVersion);\n\n // Sync URL param → active thread\n useEffect(() => {\n if (urlThreadId && urlThreadId !== activeThreadId) {\n setActiveThread(urlThreadId);\n }\n }, [urlThreadId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Panel state\n const [sidebarOpen, setSidebarOpen] = useState(true);\n const [workspaceOpen, setWorkspaceOpen] = useState(false);\n\n // Auto-scroll\n const { containerRef, atBottom, scrollToBottom, handleScroll } =\n useAutoScroll([messages, streamingText, waiting]);\n\n // Load thread messages when switching\n useEffect(() => {\n if (!activeThreadId) {\n clearMessages();\n return;\n }\n (async () => {\n try {\n const thread = await api.chat.threads.get(activeThreadId);\n clearMessages();\n if (thread.messages && thread.messages.length > 0) {\n thread.messages.forEach((m) => addMessage(m));\n }\n } catch {\n // Thread doesn't exist yet (new thread) — just clear\n clearMessages();\n }\n })();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeThreadId]);\n\n async function handleSend(content: string) {\n // Ensure we have a thread ID — create one if needed\n let threadId = activeThreadId;\n if (!threadId) {\n threadId = `web:${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n setActiveThread(threadId);\n }\n\n // Optimistic user message\n addMessage({\n id: crypto.randomUUID(),\n role: \"user\",\n content,\n timestamp: new Date().toISOString(),\n });\n\n // Immediately show waiting state\n setWaiting(true);\n\n // Persist user message to backend thread\n api.chat.threads.addMessage(threadId, \"user\", content)\n .then(() => bumpThreadVersion())\n .catch(() => {});\n\n try {\n await api.chat.send(content, threadId);\n // Reload threads in background to pick up new thread\n reloadThreads();\n } catch {\n setWaiting(false);\n clearStreaming();\n resetSteps();\n addMessage({\n id: crypto.randomUUID(),\n role: \"system\",\n content: \"Failed to send message. Please try again.\",\n timestamp: new Date().toISOString(),\n });\n }\n }\n\n async function handleDeleteThread(id: string) {\n try {\n await api.chat.threads.delete(id);\n if (activeThreadId === id) {\n setActiveThread(null);\n clearMessages();\n }\n reloadThreads();\n } catch {\n // ignore\n }\n }\n\n function handleNewThread() {\n const newId = `web:${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n setActiveThread(newId);\n clearMessages();\n reloadThreads();\n navigate(`/chat/${newId}`);\n }\n\n function handleSelectThread(id: string) {\n setActiveThread(id);\n navigate(`/chat/${id}`);\n }\n\n function handleExportThread(id: string) {\n const thread = threads.find((t) => t.id === id);\n if (!thread) return;\n const content = thread.messages\n .map((m) => `[${m.role}] ${m.content}`)\n .join(\"\\n\\n---\\n\\n\");\n const blob = new Blob([content], { type: \"text/plain\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${thread.title || \"conversation\"}-${id.slice(0, 8)}.txt`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n const isBusy = isStreaming || waiting;\n const hasSteps = totalSteps > 0;\n const stepProgress =\n totalSteps > 0 ? (completedSteps / totalSteps) * 100 : 0;\n\n return (\n <div className=\"flex h-full w-full overflow-hidden\">\n {/* ── Thread Sidebar (desktop) ── */}\n <div\n className={cn(\n \"hidden h-full shrink-0 border-r border-border bg-background transition-[width] duration-200 ease-in-out md:block overflow-hidden\",\n sidebarOpen ? \"w-[240px]\" : \"w-0 border-r-0\"\n )}\n >\n <div className=\"h-full w-[240px]\">\n <ThreadList\n threads={threads}\n activeThreadId={activeThreadId}\n onSelect={handleSelectThread}\n onDelete={handleDeleteThread}\n onNew={handleNewThread}\n onExport={handleExportThread}\n />\n </div>\n </div>\n\n {/* ── Mobile sidebar overlay ── */}\n <AnimatePresence>\n {sidebarOpen && (\n <>\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 z-40 bg-black/50 backdrop-blur-sm md:hidden\"\n onClick={() => setSidebarOpen(false)}\n />\n <motion.div\n initial={{ x: -260 }}\n animate={{ x: 0 }}\n exit={{ x: -260 }}\n transition={{ duration: 0.2, ease: \"easeInOut\" }}\n className=\"fixed inset-y-0 left-0 z-50 w-[260px] bg-background shadow-xl md:hidden\"\n >\n <ThreadList\n threads={threads}\n activeThreadId={activeThreadId}\n onSelect={(id) => {\n handleSelectThread(id);\n setSidebarOpen(false);\n }}\n onDelete={handleDeleteThread}\n onNew={() => {\n handleNewThread();\n setSidebarOpen(false);\n }}\n onExport={handleExportThread}\n />\n </motion.div>\n </>\n )}\n </AnimatePresence>\n\n {/* ── Main Chat Area ── */}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n {/* Header */}\n <header className=\"flex h-12 items-center gap-2 border-b border-border bg-background/80 backdrop-blur-xl px-3\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => setSidebarOpen(!sidebarOpen)}\n >\n {sidebarOpen ? (\n <PanelLeftClose className=\"h-4 w-4\" />\n ) : (\n <PanelLeftOpen className=\"h-4 w-4\" />\n )}\n </Button>\n\n {/* Logo */}\n <span className=\"hidden text-sm font-bold mercury-gradient-text sm:inline\">\n Mercury\n </span>\n\n <div className=\"mx-1 h-4 w-px bg-border\" />\n\n <ModelSwitcher currentProvider={provider} currentModel={model} />\n\n <div className=\"flex-1\" />\n\n <CodeModeToggle />\n\n {/* Connection indicator */}\n <div\n className={cn(\n \"h-2 w-2 rounded-full\",\n connected ? \"bg-emerald-500\" : \"bg-destructive\"\n )}\n title={connected ? \"Connected\" : \"Disconnected\"}\n />\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => setWorkspaceOpen(!workspaceOpen)}\n >\n <FolderOpen className=\"h-4 w-4\" />\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 hidden md:inline-flex\"\n onClick={() => (window.location.href = \"/settings\")}\n >\n <Settings className=\"h-4 w-4\" />\n </Button>\n </header>\n\n {/* Messages */}\n <div className=\"relative flex-1 min-h-0\">\n <div\n ref={containerRef}\n onScroll={handleScroll}\n className=\"h-full overflow-y-auto\"\n >\n <div className=\"mx-auto max-w-3xl space-y-4 px-4 py-6\">\n {threadsLoading && messages.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-24\">\n <Loader2 className=\"h-6 w-6 animate-spin text-primary\" />\n </div>\n ) : messages.length === 0 && !isStreaming && !waiting ? (\n <div className=\"flex flex-col items-center justify-center gap-3 py-24 text-center\">\n <div className=\"rounded-2xl bg-primary/10 p-4\">\n <MessageSquare className=\"h-8 w-8 text-primary\" />\n </div>\n <h3 className=\"text-lg font-semibold text-foreground\">\n Start a conversation\n </h3>\n <p className=\"max-w-sm text-sm text-muted-foreground\">\n Send a message to begin. Mercury is ready to assist you.\n </p>\n </div>\n ) : (\n <>\n {messages.map((msg) => {\n // Permission prompt detection for system messages\n if (msg.role === \"system\") {\n try {\n const parsed = JSON.parse(msg.content);\n if (parsed.id && (parsed.tool || parsed.description)) {\n return <PermissionPrompt key={msg.id} data={parsed} />;\n }\n } catch {\n // not a permission prompt, render as regular message\n }\n }\n return <MessageBubbleComponent key={msg.id} message={msg} />;\n })}\n {isStreaming && streamingText && (\n <StreamingMessage text={streamingText} />\n )}\n {waiting && !isStreaming && <WaitingIndicator />}\n </>\n )}\n </div>\n </div>\n\n {/* Scroll-to-bottom */}\n <AnimatePresence>\n {!atBottom && (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n className=\"absolute bottom-4 right-4\"\n >\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-9 w-9 rounded-full shadow-lg border-border bg-background/90 backdrop-blur-sm\"\n onClick={scrollToBottom}\n >\n <ArrowDown className=\"h-4 w-4\" />\n </Button>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n\n {/* Step progress */}\n {hasSteps && (\n <div className=\"px-4 py-1.5\">\n <div className=\"mx-auto max-w-3xl\">\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground mb-1\">\n <Loader2 className=\"h-3 w-3 animate-spin text-primary\" />\n <span>\n Step {completedSteps} of {totalSteps}\n {currentStepTool && (\n <span className=\"ml-1 text-foreground font-medium\">\n — {currentStepTool}\n </span>\n )}\n </span>\n </div>\n <Progress value={stepProgress} className=\"h-1\" />\n </div>\n </div>\n )}\n\n {/* Chat input */}\n <ChatInput onSend={handleSend} disabled={isBusy} />\n </div>\n\n {/* ── Workspace Panel ── */}\n <AnimatePresence mode=\"wait\">\n {workspaceOpen && (\n <motion.div\n initial={{ width: 0, opacity: 0 }}\n animate={{ width: 320, opacity: 1 }}\n exit={{ width: 0, opacity: 0 }}\n transition={{ duration: 0.2, ease: \"easeInOut\" }}\n className=\"hidden h-full shrink-0 overflow-hidden md:block\"\n >\n <div className=\"h-full w-[320px]\">\n <WorkspacePanel\n open={workspaceOpen}\n onClose={() => setWorkspaceOpen(false)}\n />\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n"],"names":["__iconNode","File","createLucideIcon","PanelLeftClose","PanelLeftOpen","Wrench","ThreadList","threads","activeThreadId","onSelect","onDelete","onNew","onExport","deleteTarget","setDeleteTarget","useState","formatDate","iso","d","diffMs","diffDays","jsxs","jsx","Button","Plus","ScrollArea","MessageSquare","thread","isActive","ThreadItem","AlertDialog","open","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","cn","e","Trash2","EXT_LANG_MAP","getLanguage","ext","formatSize","bytes","WorkspacePanel","onClose","tree","setTree","file","setFile","loading","setLoading","fileLoading","setFileLoading","error","setError","loadTree","useCallback","path","data","api","err","loadFile","initialized","setInitialized","breadcrumbs","relative","parts","accumulated","part","navigateUp","X","bc","ChevronRight","Loader2","ArrowUp","item","rel","newPath","filePath","Folder","SyntaxHighlighter","oneDark","Popover","PopoverPrimitive.Root","PopoverTrigger","PopoverPrimitive.Trigger","PopoverContent","React.forwardRef","className","align","sideOffset","props","ref","PopoverPrimitive.Portal","PopoverPrimitive.Content","ModelSwitcher","currentProvider","currentModel","setOpen","models","setModels","switching","setSwitching","setProvider","useChatStore","s","setModel","loadModels","handleSwitch","providerName","p","pr","displayName","o","ChevronDown","isSwitching","Check","Badge","STATES","CodeModeToggle","status","setStatus","loadStatus","useEffect","handleSet","state","result","prev","statusConfig","CheckCircle2","XCircle","ToolCallCard","tool","config","StatusIcon","Collapsible","CollapsibleTrigger","CollapsibleContent","MessageBubble","message","isLast","copied","setCopied","isUser","resolved","useThemeStore","handleCopy","motion","_a","step","i","MarkdownRenderer","Copy","StreamingMessage","text","steps","isThinking","useThreads","setThreads","threadVersion","load","useAutoScroll","deps","containerRef","useRef","atBottom","setAtBottom","userScrolledUp","scrollToBottom","el","handleScroll","isAtBottom","WaitingIndicator","PermissionPrompt","resolving","setResolving","handle","action","Zap","SLASH_COMMANDS","SlashCommandMenu","filter","selectedIndex","filtered","c","cmd","ChatInput","onSend","disabled","setText","showSlash","setShowSlash","slashIndex","setSlashIndex","textareaRef","slashFilter","filteredCommands","handleSubmit","trimmed","selectSlashCommand","needsArg","handleKeyDown","handleChange","value","firstLine","handleInput","AnimatePresence","Send","ChatPage","urlThreadId","useParams","navigate","useNavigate","connected","useSSE","threadsLoading","reloadThreads","messages","streamingText","isStreaming","waiting","provider","model","totalSteps","completedSteps","currentStepTool","setActiveThread","addMessage","clearMessages","setWaiting","clearStreaming","resetSteps","bumpThreadVersion","sidebarOpen","setSidebarOpen","workspaceOpen","setWorkspaceOpen","m","handleSend","content","threadId","handleDeleteThread","id","handleNewThread","newId","handleSelectThread","handleExportThread","t","blob","url","a","isBusy","hasSteps","stepProgress","Fragment","FolderOpen","Settings","msg","parsed","MessageBubbleComponent","ArrowDown","Progress"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Dashboard-1rlAqQ-Y.js","sources":["../../src/pages/Dashboard.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { motion } from \"framer-motion\";\nimport {\n Activity,\n Zap,\n Brain,\n Cpu,\n Clock,\n CheckCircle2,\n XCircle,\n} from \"lucide-react\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Progress } from \"@/components/ui/progress\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { cn } from \"@/lib/utils\";\nimport { formatUptime, formatTokens } from \"@/lib/utils\";\nimport api, { type AgentStatus } from \"@/lib/api\";\n\nconst fadeUp = {\n hidden: { opacity: 0, y: 12 },\n visible: (i: number) => ({\n opacity: 1,\n y: 0,\n transition: { delay: i * 0.07, duration: 0.35, ease: \"easeOut\" as const },\n }),\n};\n\nfunction Skeleton({ className }: { className?: string }) {\n return (\n <div\n className={cn(\n \"animate-pulse rounded-lg bg-muted\",\n className\n )}\n />\n );\n}\n\nfunction StatCard({\n icon: Icon,\n label,\n children,\n index,\n glow,\n}: {\n icon: React.ElementType;\n label: string;\n children: React.ReactNode;\n index: number;\n glow?: boolean;\n}) {\n return (\n <motion.div\n custom={index}\n variants={fadeUp}\n initial=\"hidden\"\n animate=\"visible\"\n >\n <Card className={cn(glow && \"mercury-glow-sm\")}>\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"text-sm font-medium text-muted-foreground\">\n {label}\n </CardTitle>\n <Icon className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>{children}</CardContent>\n </Card>\n </motion.div>\n );\n}\n\nexport function DashboardPage() {\n const [data, setData] = useState<AgentStatus | null>(null);\n const [error, setError] = useState(\"\");\n\n useEffect(() => {\n api.status\n .get()\n .then(setData)\n .catch((err: Error) => setError(err.message));\n }, []);\n\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center p-8\">\n <p className=\"text-sm text-destructive\">{error}</p>\n </div>\n );\n }\n\n if (!data) {\n return (\n <div className=\"space-y-6 p-6 lg:p-8\">\n <div className=\"space-y-1\">\n <Skeleton className=\"h-8 w-40\" />\n <Skeleton className=\"h-4 w-56\" />\n </div>\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {Array.from({ length: 4 }).map((_, i) => (\n <Skeleton key={i} className=\"h-[120px]\" />\n ))}\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Skeleton className=\"h-[200px]\" />\n <Skeleton className=\"h-[200px]\" />\n </div>\n </div>\n );\n }\n\n const tokenPct = data.tokens.dailyBudget\n ? Math.min(\n Math.round((data.tokens.dailyUsed / data.tokens.dailyBudget) * 100),\n 100\n )\n : 0;\n\n const providerEntries = Object.entries(data.providers);\n const activeProviders = providerEntries.filter(([, v]) => v.enabled).length;\n const memoryTypes = Object.entries(data.memory.byType);\n\n return (\n <div className=\"space-y-6 p-6 lg:p-8\">\n {/* Header */}\n <motion.div\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n >\n <h1 className=\"text-2xl font-bold tracking-tight\">Status</h1>\n <p className=\"text-sm text-muted-foreground\">\n Agent is{\" \"}\n <span\n className={cn(\n \"font-medium\",\n data.running ? \"text-emerald-500\" : \"text-muted-foreground\"\n )}\n >\n {data.state}\n </span>\n </p>\n </motion.div>\n\n {/* Hero Stats */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard icon={Clock} label=\"Uptime\" index={0} glow>\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatUptime(data.uptime)}\n </p>\n </StatCard>\n\n <StatCard icon={Zap} label=\"Tokens Used\" index={1}>\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatTokens(data.tokens.dailyUsed)}\n <span className=\"ml-1 text-sm font-normal text-muted-foreground\">\n / {formatTokens(data.tokens.dailyBudget)}\n </span>\n </p>\n <Progress value={tokenPct} className=\"mt-3\" />\n </StatCard>\n\n <StatCard icon={Brain} label=\"Total Memories\" index={2}>\n <p className=\"text-2xl font-bold tabular-nums\">\n {data.memory.total.toLocaleString()}\n </p>\n </StatCard>\n\n <StatCard icon={Cpu} label=\"Active Providers\" index={3}>\n <p className=\"text-2xl font-bold tabular-nums\">\n {activeProviders}\n <span className=\"ml-1 text-sm font-normal text-muted-foreground\">\n / {providerEntries.length}\n </span>\n </p>\n </StatCard>\n </div>\n\n {/* Detail Cards */}\n <div className=\"grid gap-4 md:grid-cols-2\">\n {/* Memory by Type */}\n <motion.div\n custom={4}\n variants={fadeUp}\n initial=\"hidden\"\n animate=\"visible\"\n >\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Brain className=\"h-4 w-4\" />\n Memory by Type\n </CardTitle>\n </CardHeader>\n <CardContent>\n {memoryTypes.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No memories stored yet.\n </p>\n ) : (\n <div className=\"flex flex-col gap-3\">\n {memoryTypes.map(([type, count]) => (\n <div\n key={type}\n className=\"flex items-center justify-between\"\n >\n <Badge variant=\"secondary\" className=\"capitalize\">\n {type}\n </Badge>\n <span className=\"text-sm font-medium tabular-nums\">\n {count.toLocaleString()}\n </span>\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </motion.div>\n\n {/* Provider Status */}\n <motion.div\n custom={5}\n variants={fadeUp}\n initial=\"hidden\"\n animate=\"visible\"\n >\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Activity className=\"h-4 w-4\" />\n Providers\n </CardTitle>\n </CardHeader>\n <CardContent>\n {providerEntries.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No providers configured.\n </p>\n ) : (\n <div className=\"flex flex-col gap-3\">\n {providerEntries.map(([name, info]) => (\n <div\n key={name}\n className=\"flex items-center justify-between\"\n >\n <span className=\"text-sm font-medium\">{name}</span>\n {info.enabled ? (\n <Badge variant=\"success\" className=\"gap-1\">\n <CheckCircle2 className=\"h-3 w-3\" />\n Enabled\n </Badge>\n ) : (\n <Badge variant=\"outline\" className=\"gap-1 text-muted-foreground\">\n <XCircle className=\"h-3 w-3\" />\n Disabled\n </Badge>\n )}\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </motion.div>\n </div>\n </div>\n );\n}\n"],"names":["fadeUp","i","Skeleton","className","jsx","cn","StatCard","Icon","label","children","index","glow","motion","Card","jsxs","CardHeader","CardTitle","CardContent","DashboardPage","data","setData","useState","error","setError","useEffect","api","err","_","tokenPct","providerEntries","activeProviders","v","memoryTypes","Clock","Zap","formatTokens","Progress","Brain","Cpu","type","count","Badge","Activity","name","info","CheckCircle2","XCircle"],"mappings":"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"}