@nextclaw/ui 0.12.12 → 0.12.13

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 (44) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/assets/{api-DnPN4SyA.js → api-C51456xV.js} +1 -1
  3. package/dist/assets/{app-manager-provider-M7TngYxx.js → app-manager-provider-D_cKqqRG.js} +1 -1
  4. package/dist/assets/{app-navigation.config-B5YIdRju.js → app-navigation.config-Dve1W20Y.js} +1 -1
  5. package/dist/assets/{channels-list-page-Cm-Bbu6u.js → channels-list-page-WJ7d4zMI.js} +1 -1
  6. package/dist/assets/{chat-C0ZNZtS3.js → chat-DCi1-y8U.js} +1 -1
  7. package/dist/assets/{chat-page-CGHNhXaw.js → chat-page-CHKwiqPY.js} +1 -1
  8. package/dist/assets/{chunk-JZWAC4HX-BJer-fqD.js → chunk-JZWAC4HX-ptDyT_1C.js} +1 -1
  9. package/dist/assets/{desktop-update-config-Dfh-3uma.js → desktop-update-config-gnna2NaS.js} +1 -1
  10. package/dist/assets/{dialog-D-I7ONHQ.js → dialog-BHcaU6NE.js} +1 -1
  11. package/dist/assets/{dist-DreLBS93.js → dist-DtBFqZ6_.js} +1 -1
  12. package/dist/assets/{es2015-DMSUl3fm.js → es2015-BlNhrQUG.js} +1 -1
  13. package/dist/assets/{index-Bc6c1kIx.js → index-CxzW1dQ9.js} +2 -2
  14. package/dist/assets/marketplace-page-0sEdt5sA.js +1 -0
  15. package/dist/assets/{marketplace-page-BCrS-jH6.js → marketplace-page-DiqqX25V.js} +1 -1
  16. package/dist/assets/mcp-marketplace-page-B8vmu9xe.js +1 -0
  17. package/dist/assets/{mcp-marketplace-page-CjrxT6wI.js → mcp-marketplace-page-C_akqPwv.js} +1 -1
  18. package/dist/assets/{model-config-D4myteLK.js → model-config-B0L43HTL.js} +1 -1
  19. package/dist/assets/{notice-card-DX_NEZTQ.js → notice-card-C9PFAR67.js} +1 -1
  20. package/dist/assets/{popover-Dm_NQ3Cs.js → popover-B8msg2FQ.js} +1 -1
  21. package/dist/assets/{provider-scoped-model-input-BLHImwI5.js → provider-scoped-model-input-DeAo2Y65.js} +1 -1
  22. package/dist/assets/{providers-list-DsBFslNi.js → providers-list-5_VShcn7.js} +1 -1
  23. package/dist/assets/remote-pzp4oLcL.js +1 -0
  24. package/dist/assets/{runtime-config-page-Bz9r68Rf.js → runtime-config-page-BuWmH7fe.js} +1 -1
  25. package/dist/assets/{search-config-C-6KpgRQ.js → search-config-DJTm9Fno.js} +1 -1
  26. package/dist/assets/{secrets-config-MiMElvpm.js → secrets-config-DKFeFii1.js} +1 -1
  27. package/dist/assets/{select-RgeHgn_-.js → select-DRDejPLk.js} +1 -1
  28. package/dist/assets/{sessions-config-page-0KNW9QC_.js → sessions-config-page-DZrdd2zT.js} +1 -1
  29. package/dist/assets/{setting-row-vwm4XKv2.js → setting-row-BcF6eTW0.js} +1 -1
  30. package/dist/assets/{tag-chip-DGqz3TON.js → tag-chip-CVIqyMv7.js} +1 -1
  31. package/dist/assets/{theme-provider-CUppbOyN.js → theme-provider-dHqcWU-j.js} +1 -1
  32. package/dist/assets/{tooltip-DQlSKhZ_.js → tooltip-C6VPreZ7.js} +1 -1
  33. package/dist/assets/{use-config-CrsavfWZ.js → use-config-DFja1sda.js} +1 -1
  34. package/dist/assets/{use-confirm-dialog-D1AnLFlc.js → use-confirm-dialog-DvIbSUX3.js} +1 -1
  35. package/dist/assets/{use-infinite-scroll-loader-DZhv-rmv.js → use-infinite-scroll-loader-D8h0k-iL.js} +1 -1
  36. package/dist/assets/{use-viewport-layout-CytJAPWM.js → use-viewport-layout-D-pjxsyz.js} +1 -1
  37. package/dist/index.html +16 -16
  38. package/package.json +4 -4
  39. package/src/features/system-status/managers/system-status.manager.test.ts +26 -0
  40. package/src/features/system-status/managers/system-status.manager.ts +1 -3
  41. package/vite.config.ts +2 -42
  42. package/dist/assets/marketplace-page-DVrlpB68.js +0 -1
  43. package/dist/assets/mcp-marketplace-page-pQ_A38fH.js +0 -1
  44. package/dist/assets/remote-CQQykOYe.js +0 -1
@@ -1 +1 @@
1
- import{_ as e,i as t,m as n,p as r}from"./i18n-BnNAQpVM.js";import{Bt as i,Ht as a,Lt as o,Ut as s,Vt as c}from"./api-DnPN4SyA.js";import{t as l}from"./createLucideIcon-C_GFKVuW.js";import{a as u,i as d,n as f,r as p,t as m}from"./select-RgeHgn_-.js";import{t as h}from"./skeleton-5Mg6vZHN.js";var g=class extends s{constructor(e,t){super(e,t)}bindMethods(){super.bindMethods(),this.fetchNextPage=this.fetchNextPage.bind(this),this.fetchPreviousPage=this.fetchPreviousPage.bind(this)}setOptions(e){super.setOptions({...e,behavior:a()})}getOptimisticResult(e){return e.behavior=a(),super.getOptimisticResult(e)}fetchNextPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`forward`}}})}fetchPreviousPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`backward`}}})}createResult(e,t){let{state:n}=e,r=super.createResult(e,t),{isFetching:a,isRefetching:o,isError:s,isRefetchError:l}=r,u=n.fetchMeta?.fetchMore?.direction,d=s&&u===`forward`,f=a&&u===`forward`,p=s&&u===`backward`,m=a&&u===`backward`;return{...r,fetchNextPage:this.fetchNextPage,fetchPreviousPage:this.fetchPreviousPage,hasNextPage:i(t,n.data),hasPreviousPage:c(t,n.data),isFetchNextPageError:d,isFetchingNextPage:f,isFetchPreviousPageError:p,isFetchingPreviousPage:m,isRefetchError:l&&!d&&!p,isRefetching:o&&!f&&!m}}};function _(e,t){return o(e,g,t)}var v=l(`PackageSearch`,[[`path`,{d:`M21 10V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l2-1.14`,key:`e7tb2h`}],[`path`,{d:`m7.5 4.27 9 5.15`,key:`1c824w`}],[`polyline`,{points:`3.29 7 12 12 20.71 7`,key:`ousv84`}],[`line`,{x1:`12`,x2:`12`,y1:`22`,y2:`12`,key:`a4e8g8`}],[`circle`,{cx:`18.5`,cy:`15.5`,r:`2.5`,key:`b5zd12`}],[`path`,{d:`M20.27 17.27 22 19`,key:`1l4muz`}]]);function y(e){if(!e||e.pages.length===0)return;let t=e.pages.flatMap(e=>e.items);return{...e.pages[e.pages.length-1],items:t,pages:e.pages,loadedItems:t.length,loadedPages:e.pages.length}}var b=r();function x({scope:e,searchText:n,searchPlaceholder:r,sort:i,onSearchTextChange:a,onSortChange:o}){return(0,b.jsx)(`div`,{className:`mb-4`,children:(0,b.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,b.jsxs)(`div`,{className:`relative min-w-0 flex-1`,children:[(0,b.jsx)(v,{className:`absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400`}),(0,b.jsx)(`input`,{value:n,onChange:e=>a(e.target.value),placeholder:r,className:`h-9 w-full rounded-xl border border-gray-200/80 pl-9 pr-3 text-sm focus:outline-none focus:ring-1 focus:ring-primary/40`})]}),e===`all`&&(0,b.jsxs)(m,{value:i,onValueChange:e=>o(e),children:[(0,b.jsx)(d,{className:`h-9 w-[150px] shrink-0 rounded-lg`,children:(0,b.jsx)(u,{})}),(0,b.jsxs)(f,{children:[(0,b.jsx)(p,{value:`relevance`,children:t(`marketplaceSortRelevance`)}),(0,b.jsx)(p,{value:`updated`,children:t(`marketplaceSortUpdated`)})]})]})]})})}function S({count:e}){return(0,b.jsx)(b.Fragment,{children:Array.from({length:e},(e,t)=>(0,b.jsx)(`article`,{className:`rounded-2xl border border-gray-200/40 bg-white px-5 py-4 shadow-sm`,children:(0,b.jsxs)(`div`,{className:`flex items-start justify-between gap-3.5`,children:[(0,b.jsxs)(`div`,{className:`flex min-w-0 flex-1 gap-3`,children:[(0,b.jsx)(h,{className:`h-10 w-10 shrink-0 rounded-xl`}),(0,b.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-2 pt-0.5`,children:[(0,b.jsx)(h,{className:`h-4 w-32 max-w-[70%]`}),(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(h,{className:`h-3 w-12`}),(0,b.jsx)(h,{className:`h-3 w-24`})]}),(0,b.jsx)(h,{className:`h-3 w-full`})]})]}),(0,b.jsx)(h,{className:`h-8 w-20 shrink-0 rounded-xl`})]})},`marketplace-skeleton-${t}`))})}function C({hasMore:e,loading:n,sentinelRef:r}){return!e&&!n?null:(0,b.jsxs)(`div`,{className:`py-4`,children:[e&&(0,b.jsx)(`div`,{ref:r,className:`h-1 w-full`,"aria-hidden":`true`}),n&&(0,b.jsx)(`div`,{"data-testid":`marketplace-loading-more`,className:`pt-3 text-center text-xs text-gray-500`,children:t(`loading`)})]})}function w(e){let t=e.trim().toLowerCase().replace(/_/g,`-`),n=[t,t.split(`-`)[0],`en`];return Array.from(new Set(n.filter(Boolean)))}function T(e){return e.trim().toLowerCase().replace(/_/g,`-`)}function E(e,t,n){if(e){let t=Object.entries(e).map(([e,t])=>({locale:T(e),text:typeof t==`string`?t.trim():``})).filter(e=>e.text.length>0);if(t.length>0){let e=new Map(t.map(e=>[e.locale,e.text]));for(let t of n){let n=T(t),r=e.get(n);if(r)return r}for(let e of n){let n=T(e).split(`-`)[0];if(!n)continue;let r=t.find(e=>e.locale===n||e.locale.startsWith(`${n}-`));if(r)return r.text}return t[0]?.text??``}}return t?.trim()??``}function D(e,t){if(!e)return``;for(let n of t)if(T(n).split(`-`)[0]===`zh`&&e.descriptionZh?.trim())return e.descriptionZh.trim();return e.description?.trim()?e.description.trim():e.descriptionZh?.trim()?e.descriptionZh.trim():``}var O=e(n(),1),k=160;function A(e){let t=(0,O.useRef)(null),n=(0,O.useRef)(null),r=(0,O.useRef)(e.onLoadMore),i=(0,O.useRef)(!1);return(0,O.useEffect)(()=>{r.current=e.onLoadMore},[e.onLoadMore]),(0,O.useEffect)(()=>{e.disabled&&(i.current=!1)},[e.disabled]),(0,O.useEffect)(()=>{let a=t.current,o=n.current,s=e.thresholdPx??k;if(e.disabled||!a||!o)return;let c=()=>{i.current||e.disabled||(i.current=!0,Promise.resolve(r.current()).finally(()=>{i.current=!1}))},l=()=>{o.getBoundingClientRect().top-a.getBoundingClientRect().bottom<=s&&c()};if(typeof IntersectionObserver==`function`){let e=new IntersectionObserver(e=>{e.some(e=>e.isIntersecting)&&c()},{root:a,rootMargin:`0px 0px ${s}px 0px`});return e.observe(o),l(),()=>{e.disconnect()}}return a.addEventListener(`scroll`,l,{passive:!0}),l(),()=>{a.removeEventListener(`scroll`,l)}},[e.disabled,e.thresholdPx,e.watchValue]),{containerRef:t,sentinelRef:n}}export{x as a,y as c,E as i,_ as l,w as n,C as o,D as r,S as s,A as t};
1
+ import{_ as e,i as t,m as n,p as r}from"./i18n-BnNAQpVM.js";import{Bt as i,Ht as a,Lt as o,Ut as s,Vt as c}from"./api-C51456xV.js";import{t as l}from"./createLucideIcon-C_GFKVuW.js";import{a as u,i as d,n as f,r as p,t as m}from"./select-DRDejPLk.js";import{t as h}from"./skeleton-5Mg6vZHN.js";var g=class extends s{constructor(e,t){super(e,t)}bindMethods(){super.bindMethods(),this.fetchNextPage=this.fetchNextPage.bind(this),this.fetchPreviousPage=this.fetchPreviousPage.bind(this)}setOptions(e){super.setOptions({...e,behavior:a()})}getOptimisticResult(e){return e.behavior=a(),super.getOptimisticResult(e)}fetchNextPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`forward`}}})}fetchPreviousPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`backward`}}})}createResult(e,t){let{state:n}=e,r=super.createResult(e,t),{isFetching:a,isRefetching:o,isError:s,isRefetchError:l}=r,u=n.fetchMeta?.fetchMore?.direction,d=s&&u===`forward`,f=a&&u===`forward`,p=s&&u===`backward`,m=a&&u===`backward`;return{...r,fetchNextPage:this.fetchNextPage,fetchPreviousPage:this.fetchPreviousPage,hasNextPage:i(t,n.data),hasPreviousPage:c(t,n.data),isFetchNextPageError:d,isFetchingNextPage:f,isFetchPreviousPageError:p,isFetchingPreviousPage:m,isRefetchError:l&&!d&&!p,isRefetching:o&&!f&&!m}}};function _(e,t){return o(e,g,t)}var v=l(`PackageSearch`,[[`path`,{d:`M21 10V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l2-1.14`,key:`e7tb2h`}],[`path`,{d:`m7.5 4.27 9 5.15`,key:`1c824w`}],[`polyline`,{points:`3.29 7 12 12 20.71 7`,key:`ousv84`}],[`line`,{x1:`12`,x2:`12`,y1:`22`,y2:`12`,key:`a4e8g8`}],[`circle`,{cx:`18.5`,cy:`15.5`,r:`2.5`,key:`b5zd12`}],[`path`,{d:`M20.27 17.27 22 19`,key:`1l4muz`}]]);function y(e){if(!e||e.pages.length===0)return;let t=e.pages.flatMap(e=>e.items);return{...e.pages[e.pages.length-1],items:t,pages:e.pages,loadedItems:t.length,loadedPages:e.pages.length}}var b=r();function x({scope:e,searchText:n,searchPlaceholder:r,sort:i,onSearchTextChange:a,onSortChange:o}){return(0,b.jsx)(`div`,{className:`mb-4`,children:(0,b.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,b.jsxs)(`div`,{className:`relative min-w-0 flex-1`,children:[(0,b.jsx)(v,{className:`absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400`}),(0,b.jsx)(`input`,{value:n,onChange:e=>a(e.target.value),placeholder:r,className:`h-9 w-full rounded-xl border border-gray-200/80 pl-9 pr-3 text-sm focus:outline-none focus:ring-1 focus:ring-primary/40`})]}),e===`all`&&(0,b.jsxs)(m,{value:i,onValueChange:e=>o(e),children:[(0,b.jsx)(d,{className:`h-9 w-[150px] shrink-0 rounded-lg`,children:(0,b.jsx)(u,{})}),(0,b.jsxs)(f,{children:[(0,b.jsx)(p,{value:`relevance`,children:t(`marketplaceSortRelevance`)}),(0,b.jsx)(p,{value:`updated`,children:t(`marketplaceSortUpdated`)})]})]})]})})}function S({count:e}){return(0,b.jsx)(b.Fragment,{children:Array.from({length:e},(e,t)=>(0,b.jsx)(`article`,{className:`rounded-2xl border border-gray-200/40 bg-white px-5 py-4 shadow-sm`,children:(0,b.jsxs)(`div`,{className:`flex items-start justify-between gap-3.5`,children:[(0,b.jsxs)(`div`,{className:`flex min-w-0 flex-1 gap-3`,children:[(0,b.jsx)(h,{className:`h-10 w-10 shrink-0 rounded-xl`}),(0,b.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-2 pt-0.5`,children:[(0,b.jsx)(h,{className:`h-4 w-32 max-w-[70%]`}),(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(h,{className:`h-3 w-12`}),(0,b.jsx)(h,{className:`h-3 w-24`})]}),(0,b.jsx)(h,{className:`h-3 w-full`})]})]}),(0,b.jsx)(h,{className:`h-8 w-20 shrink-0 rounded-xl`})]})},`marketplace-skeleton-${t}`))})}function C({hasMore:e,loading:n,sentinelRef:r}){return!e&&!n?null:(0,b.jsxs)(`div`,{className:`py-4`,children:[e&&(0,b.jsx)(`div`,{ref:r,className:`h-1 w-full`,"aria-hidden":`true`}),n&&(0,b.jsx)(`div`,{"data-testid":`marketplace-loading-more`,className:`pt-3 text-center text-xs text-gray-500`,children:t(`loading`)})]})}function w(e){let t=e.trim().toLowerCase().replace(/_/g,`-`),n=[t,t.split(`-`)[0],`en`];return Array.from(new Set(n.filter(Boolean)))}function T(e){return e.trim().toLowerCase().replace(/_/g,`-`)}function E(e,t,n){if(e){let t=Object.entries(e).map(([e,t])=>({locale:T(e),text:typeof t==`string`?t.trim():``})).filter(e=>e.text.length>0);if(t.length>0){let e=new Map(t.map(e=>[e.locale,e.text]));for(let t of n){let n=T(t),r=e.get(n);if(r)return r}for(let e of n){let n=T(e).split(`-`)[0];if(!n)continue;let r=t.find(e=>e.locale===n||e.locale.startsWith(`${n}-`));if(r)return r.text}return t[0]?.text??``}}return t?.trim()??``}function D(e,t){if(!e)return``;for(let n of t)if(T(n).split(`-`)[0]===`zh`&&e.descriptionZh?.trim())return e.descriptionZh.trim();return e.description?.trim()?e.description.trim():e.descriptionZh?.trim()?e.descriptionZh.trim():``}var O=e(n(),1),k=160;function A(e){let t=(0,O.useRef)(null),n=(0,O.useRef)(null),r=(0,O.useRef)(e.onLoadMore),i=(0,O.useRef)(!1);return(0,O.useEffect)(()=>{r.current=e.onLoadMore},[e.onLoadMore]),(0,O.useEffect)(()=>{e.disabled&&(i.current=!1)},[e.disabled]),(0,O.useEffect)(()=>{let a=t.current,o=n.current,s=e.thresholdPx??k;if(e.disabled||!a||!o)return;let c=()=>{i.current||e.disabled||(i.current=!0,Promise.resolve(r.current()).finally(()=>{i.current=!1}))},l=()=>{o.getBoundingClientRect().top-a.getBoundingClientRect().bottom<=s&&c()};if(typeof IntersectionObserver==`function`){let e=new IntersectionObserver(e=>{e.some(e=>e.isIntersecting)&&c()},{root:a,rootMargin:`0px 0px ${s}px 0px`});return e.observe(o),l(),()=>{e.disconnect()}}return a.addEventListener(`scroll`,l,{passive:!0}),l(),()=>{a.removeEventListener(`scroll`,l)}},[e.disabled,e.thresholdPx,e.watchValue]),{containerRef:t,sentinelRef:n}}export{x as a,y as c,E as i,_ as l,w as n,C as o,D as r,S as s,A as t};
@@ -1 +1 @@
1
- import{_ as e,m as t}from"./i18n-BnNAQpVM.js";import{bt as n}from"./api-DnPN4SyA.js";function r(e){return typeof e!=`number`||!Number.isFinite(e)?`desktop`:e<=767?`mobile`:`desktop`}function i(){let e=typeof window>`u`?null:window.innerWidth??null;return{mode:r(e),width:e}}var a=n(()=>i()),o=new class{constructor(){this.consumerCount=0,this.started=!1,this.attach=()=>(this.consumerCount+=1,this.consumerCount===1&&this.start(),()=>{this.consumerCount=Math.max(0,this.consumerCount-1),this.consumerCount===0&&this.stop()}),this.start=()=>{this.started||typeof window>`u`||(this.started=!0,window.addEventListener(`resize`,this.handleViewportChange),window.addEventListener(`orientationchange`,this.handleViewportChange),this.syncFromWindow())},this.stop=()=>{!this.started||typeof window>`u`||(window.removeEventListener(`resize`,this.handleViewportChange),window.removeEventListener(`orientationchange`,this.handleViewportChange),this.started=!1)},this.getSnapshot=()=>a.getState(),this.resetForTests=()=>{this.consumerCount=0,this.stop(),a.setState(i())},this.handleViewportChange=()=>{this.syncFromWindow()},this.syncFromWindow=()=>{if(typeof window>`u`)return;let e=window.innerWidth??null;a.setState({width:e,mode:r(e)})}}},s=e(t(),1);function c(){(0,s.useEffect)(()=>o.attach(),[]);let e=a(e=>e.mode);return{mode:e,isMobile:e===`mobile`,isDesktop:e===`desktop`}}export{o as n,c as t};
1
+ import{_ as e,m as t}from"./i18n-BnNAQpVM.js";import{bt as n}from"./api-C51456xV.js";function r(e){return typeof e!=`number`||!Number.isFinite(e)?`desktop`:e<=767?`mobile`:`desktop`}function i(){let e=typeof window>`u`?null:window.innerWidth??null;return{mode:r(e),width:e}}var a=n(()=>i()),o=new class{constructor(){this.consumerCount=0,this.started=!1,this.attach=()=>(this.consumerCount+=1,this.consumerCount===1&&this.start(),()=>{this.consumerCount=Math.max(0,this.consumerCount-1),this.consumerCount===0&&this.stop()}),this.start=()=>{this.started||typeof window>`u`||(this.started=!0,window.addEventListener(`resize`,this.handleViewportChange),window.addEventListener(`orientationchange`,this.handleViewportChange),this.syncFromWindow())},this.stop=()=>{!this.started||typeof window>`u`||(window.removeEventListener(`resize`,this.handleViewportChange),window.removeEventListener(`orientationchange`,this.handleViewportChange),this.started=!1)},this.getSnapshot=()=>a.getState(),this.resetForTests=()=>{this.consumerCount=0,this.stop(),a.setState(i())},this.handleViewportChange=()=>{this.syncFromWindow()},this.syncFromWindow=()=>{if(typeof window>`u`)return;let e=window.innerWidth??null;a.setState({width:e,mode:r(e)})}}},s=e(t(),1);function c(){(0,s.useEffect)(()=>o.attach(),[]);let e=a(e=>e.mode);return{mode:e,isMobile:e===`mobile`,isDesktop:e===`desktop`}}export{o as n,c as t};
package/dist/index.html CHANGED
@@ -78,20 +78,20 @@
78
78
  })();
79
79
  </script>
80
80
  <title>NextClaw</title>
81
- <script type="module" crossorigin src="/assets/index-Bc6c1kIx.js"></script>
81
+ <script type="module" crossorigin src="/assets/index-CxzW1dQ9.js"></script>
82
82
  <link rel="modulepreload" crossorigin href="/assets/i18n-BnNAQpVM.js">
83
- <link rel="modulepreload" crossorigin href="/assets/api-DnPN4SyA.js">
84
- <link rel="modulepreload" crossorigin href="/assets/es2015-DMSUl3fm.js">
83
+ <link rel="modulepreload" crossorigin href="/assets/api-C51456xV.js">
84
+ <link rel="modulepreload" crossorigin href="/assets/es2015-BlNhrQUG.js">
85
85
  <link rel="modulepreload" crossorigin href="/assets/createLucideIcon-C_GFKVuW.js">
86
- <link rel="modulepreload" crossorigin href="/assets/select-RgeHgn_-.js">
87
- <link rel="modulepreload" crossorigin href="/assets/dist-DreLBS93.js">
86
+ <link rel="modulepreload" crossorigin href="/assets/select-DRDejPLk.js">
87
+ <link rel="modulepreload" crossorigin href="/assets/dist-DtBFqZ6_.js">
88
88
  <link rel="modulepreload" crossorigin href="/assets/x-BjMO7v8q.js">
89
- <link rel="modulepreload" crossorigin href="/assets/dialog-D-I7ONHQ.js">
90
- <link rel="modulepreload" crossorigin href="/assets/popover-Dm_NQ3Cs.js">
91
- <link rel="modulepreload" crossorigin href="/assets/tooltip-DQlSKhZ_.js">
92
- <link rel="modulepreload" crossorigin href="/assets/chunk-JZWAC4HX-BJer-fqD.js">
93
- <link rel="modulepreload" crossorigin href="/assets/use-config-CrsavfWZ.js">
94
- <link rel="modulepreload" crossorigin href="/assets/theme-provider-CUppbOyN.js">
89
+ <link rel="modulepreload" crossorigin href="/assets/dialog-BHcaU6NE.js">
90
+ <link rel="modulepreload" crossorigin href="/assets/popover-B8msg2FQ.js">
91
+ <link rel="modulepreload" crossorigin href="/assets/tooltip-C6VPreZ7.js">
92
+ <link rel="modulepreload" crossorigin href="/assets/chunk-JZWAC4HX-ptDyT_1C.js">
93
+ <link rel="modulepreload" crossorigin href="/assets/use-config-DFja1sda.js">
94
+ <link rel="modulepreload" crossorigin href="/assets/theme-provider-dHqcWU-j.js">
95
95
  <link rel="modulepreload" crossorigin href="/assets/search-DZSNKEGp.js">
96
96
  <link rel="modulepreload" crossorigin href="/assets/book-open-B4mOKdz8.js">
97
97
  <link rel="modulepreload" crossorigin href="/assets/external-link-DP2IJ7AM.js">
@@ -106,16 +106,16 @@
106
106
  <link rel="modulepreload" crossorigin href="/assets/doc-browser-context-Dib9sS83.js">
107
107
  <link rel="modulepreload" crossorigin href="/assets/doc-browser-CoKIUCJj.js">
108
108
  <link rel="modulepreload" crossorigin href="/assets/doc-browser-CwgI7ipB.js">
109
- <link rel="modulepreload" crossorigin href="/assets/use-viewport-layout-CytJAPWM.js">
109
+ <link rel="modulepreload" crossorigin href="/assets/use-viewport-layout-D-pjxsyz.js">
110
110
  <link rel="modulepreload" crossorigin href="/assets/logo-badge-uB4SwANR.js">
111
111
  <link rel="modulepreload" crossorigin href="/assets/skeleton-5Mg6vZHN.js">
112
- <link rel="modulepreload" crossorigin href="/assets/chat-C0ZNZtS3.js">
112
+ <link rel="modulepreload" crossorigin href="/assets/chat-DCi1-y8U.js">
113
113
  <link rel="modulepreload" crossorigin href="/assets/key-round-BQXmPSxD.js">
114
114
  <link rel="modulepreload" crossorigin href="/assets/message-square-CLVODA23.js">
115
- <link rel="modulepreload" crossorigin href="/assets/app-navigation.config-B5YIdRju.js">
116
- <link rel="modulepreload" crossorigin href="/assets/notice-card-DX_NEZTQ.js">
115
+ <link rel="modulepreload" crossorigin href="/assets/app-navigation.config-Dve1W20Y.js">
116
+ <link rel="modulepreload" crossorigin href="/assets/notice-card-C9PFAR67.js">
117
117
  <link rel="modulepreload" crossorigin href="/assets/status-dot-aQU9Mia4.js">
118
- <link rel="modulepreload" crossorigin href="/assets/app-manager-provider-M7TngYxx.js">
118
+ <link rel="modulepreload" crossorigin href="/assets/app-manager-provider-D_cKqqRG.js">
119
119
  <link rel="stylesheet" crossorigin href="/assets/index-mRmSAB-e.css">
120
120
  </head>
121
121
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextclaw/ui",
3
- "version": "0.12.12",
3
+ "version": "0.12.13",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -28,11 +28,11 @@
28
28
  "tailwind-merge": "^2.5.4",
29
29
  "zod": "^3.23.8",
30
30
  "zustand": "^5.0.2",
31
- "@nextclaw/ncp": "0.5.5",
31
+ "@nextclaw/ncp-http-agent-client": "0.3.17",
32
32
  "@nextclaw/ncp-react": "0.4.25",
33
+ "@nextclaw/agent-chat": "0.1.10",
33
34
  "@nextclaw/agent-chat-ui": "0.3.9",
34
- "@nextclaw/ncp-http-agent-client": "0.3.17",
35
- "@nextclaw/agent-chat": "0.1.10"
35
+ "@nextclaw/ncp": "0.5.5"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@testing-library/react": "^16.3.0",
@@ -98,6 +98,19 @@ describe('systemStatusManager', () => {
98
98
  expect(refetchQueriesSpy).toHaveBeenCalledWith({ type: 'active' });
99
99
  });
100
100
 
101
+ it('keeps the last ready bootstrap status while recovering so websocket reopen can restore readiness', () => {
102
+ systemStatusManager.reportBootstrapStatus(readyBootstrapStatus);
103
+ systemStatusManager.handleConnectionInterrupted('websocket error');
104
+
105
+ expect(useSystemStatusStore.getState().state.bootstrapStatus).toEqual(
106
+ readyBootstrapStatus
107
+ );
108
+
109
+ systemStatusManager.handleConnectionRestored();
110
+
111
+ expect(useSystemStatusStore.getState().state.lifecyclePhase).toBe('ready');
112
+ });
113
+
101
114
  it('marks recovery as stalled after the timeout window elapses', async () => {
102
115
  systemStatusManager.reportBootstrapStatus(readyBootstrapStatus);
103
116
  systemStatusManager.handleConnectionInterrupted('websocket error');
@@ -131,6 +144,19 @@ describe('systemStatusManager', () => {
131
144
  ).toBeNull();
132
145
  });
133
146
 
147
+ it('restores readiness from stalled once the realtime connection reopens', async () => {
148
+ systemStatusManager.reportBootstrapStatus(readyBootstrapStatus);
149
+ systemStatusManager.handleConnectionInterrupted('websocket error');
150
+
151
+ await vi.advanceTimersByTimeAsync(30_000);
152
+
153
+ expect(useSystemStatusStore.getState().state.lifecyclePhase).toBe('stalled');
154
+
155
+ systemStatusManager.handleConnectionRestored();
156
+
157
+ expect(useSystemStatusStore.getState().state.lifecyclePhase).toBe('ready');
158
+ });
159
+
134
160
  it('keeps only transport-level failures in the recovery flow', () => {
135
161
  expect(isTransientRuntimeConnectionErrorMessage('Failed to fetch')).toBe(
136
162
  true
@@ -347,9 +347,7 @@ export class SystemStatusManager {
347
347
  lifecyclePhase:
348
348
  state.lifecyclePhase === 'stalled' ? 'stalled' : 'recovering',
349
349
  recoveryStartedAt: state.recoveryStartedAt ?? Date.now(),
350
- bootstrapStatus:
351
- bootstrapStatus ??
352
- (state.lifecyclePhase === 'ready' ? null : state.bootstrapStatus),
350
+ bootstrapStatus: bootstrapStatus ?? state.bootstrapStatus,
353
351
  lastError: errorMessage?.trim() || state.lastError,
354
352
  lastTransportError: errorMessage?.trim() || state.lastTransportError,
355
353
  });
package/vite.config.ts CHANGED
@@ -1,44 +1,10 @@
1
1
  import { defineConfig } from 'vite';
2
2
  import react from '@vitejs/plugin-react';
3
3
  import path from 'path';
4
- import type { IncomingMessage, ServerResponse } from 'node:http';
5
- import type { Socket } from 'node:net';
6
4
 
7
5
  const devProxyApiBase = process.env.VITE_DEV_PROXY_API_BASE ?? 'http://127.0.0.1:18792';
8
6
  const devProxyWsBase = devProxyApiBase.replace(/^http/i, 'ws');
9
7
 
10
- function isBackendNotReadyError(error: Error & { code?: string }): boolean {
11
- return error.code === 'ECONNREFUSED';
12
- }
13
-
14
- function writeBackendStartingResponse(res: ServerResponse): void {
15
- if (res.headersSent) {
16
- res.end();
17
- return;
18
- }
19
- res.writeHead(503, {
20
- 'content-type': 'application/json',
21
- });
22
- res.end(JSON.stringify({
23
- error: 'backend_starting',
24
- message: 'NextClaw backend is still starting. Please retry shortly.',
25
- }));
26
- }
27
-
28
- function handleDevProxyError(error: Error & { code?: string }, _req: IncomingMessage, res?: ServerResponse | Socket): void {
29
- if (!isBackendNotReadyError(error)) {
30
- console.warn(`[vite] proxy error: ${error.message}`);
31
- }
32
- if (!res) {
33
- return;
34
- }
35
- if ('writeHead' in res) {
36
- writeBackendStartingResponse(res);
37
- return;
38
- }
39
- res.destroy();
40
- }
41
-
42
8
  export default defineConfig({
43
9
  plugins: [react()],
44
10
  resolve: {
@@ -75,17 +41,11 @@ export default defineConfig({
75
41
  proxy: {
76
42
  '/api': {
77
43
  target: devProxyApiBase,
78
- changeOrigin: true,
79
- configure: (proxy) => {
80
- proxy.on('error', handleDevProxyError);
81
- }
44
+ changeOrigin: true
82
45
  },
83
46
  '/ws': {
84
47
  target: devProxyWsBase,
85
- ws: true,
86
- configure: (proxy) => {
87
- proxy.on('error', handleDevProxyError);
88
- }
48
+ ws: true
89
49
  }
90
50
  }
91
51
  }
@@ -1 +0,0 @@
1
- import{t as e}from"./marketplace-page-BCrS-jH6.js";export{e as MarketplacePage};
@@ -1 +0,0 @@
1
- import{t as e}from"./mcp-marketplace-page-CjrxT6wI.js";export{e as McpMarketplacePage};
@@ -1 +0,0 @@
1
- import{m as e}from"./app-manager-provider-M7TngYxx.js";export{e as RemoteAccessPage};