diff --git a/internal/dashboard/assets/react/assets/index-DQhVjlL6.js b/internal/dashboard/assets/react/assets/index-BVYd6qTL.js similarity index 63% rename from internal/dashboard/assets/react/assets/index-DQhVjlL6.js rename to internal/dashboard/assets/react/assets/index-BVYd6qTL.js index fefad25..023553f 100644 --- a/internal/dashboard/assets/react/assets/index-DQhVjlL6.js +++ b/internal/dashboard/assets/react/assets/index-BVYd6qTL.js @@ -1,4 +1,4 @@ -var Hf=Object.defineProperty;var Jf=(r,i,o)=>i in r?Hf(r,i,{enumerable:!0,configurable:!0,writable:!0,value:o}):r[i]=o;var as=(r,i,o)=>Jf(r,typeof i!="symbol"?i+"":i,o);(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const f of document.querySelectorAll('link[rel="modulepreload"]'))c(f);new MutationObserver(f=>{for(const p of f)if(p.type==="childList")for(const y of p.addedNodes)y.tagName==="LINK"&&y.rel==="modulepreload"&&c(y)}).observe(document,{childList:!0,subtree:!0});function o(f){const p={};return f.integrity&&(p.integrity=f.integrity),f.referrerPolicy&&(p.referrerPolicy=f.referrerPolicy),f.crossOrigin==="use-credentials"?p.credentials="include":f.crossOrigin==="anonymous"?p.credentials="omit":p.credentials="same-origin",p}function c(f){if(f.ep)return;f.ep=!0;const p=o(f);fetch(f.href,p)}})();function _c(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var ba={exports:{}},kr={},Sa={exports:{}},ke={};/** +var Gf=Object.defineProperty;var Yf=(r,i,o)=>i in r?Gf(r,i,{enumerable:!0,configurable:!0,writable:!0,value:o}):r[i]=o;var as=(r,i,o)=>Yf(r,typeof i!="symbol"?i+"":i,o);(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const f of document.querySelectorAll('link[rel="modulepreload"]'))c(f);new MutationObserver(f=>{for(const p of f)if(p.type==="childList")for(const y of p.addedNodes)y.tagName==="LINK"&&y.rel==="modulepreload"&&c(y)}).observe(document,{childList:!0,subtree:!0});function o(f){const p={};return f.integrity&&(p.integrity=f.integrity),f.referrerPolicy&&(p.referrerPolicy=f.referrerPolicy),f.crossOrigin==="use-credentials"?p.credentials="include":f.crossOrigin==="anonymous"?p.credentials="omit":p.credentials="same-origin",p}function c(f){if(f.ep)return;f.ep=!0;const p=o(f);fetch(f.href,p)}})();function Bc(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var ba={exports:{}},kr={},Sa={exports:{}},ke={};/** * @license React * react.production.min.js * @@ -6,7 +6,7 @@ var Hf=Object.defineProperty;var Jf=(r,i,o)=>i in r?Hf(r,i,{enumerable:!0,config * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var mc;function Wf(){if(mc)return ke;mc=1;var r=Symbol.for("react.element"),i=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),c=Symbol.for("react.strict_mode"),f=Symbol.for("react.profiler"),p=Symbol.for("react.provider"),y=Symbol.for("react.context"),v=Symbol.for("react.forward_ref"),b=Symbol.for("react.suspense"),N=Symbol.for("react.memo"),C=Symbol.for("react.lazy"),w=Symbol.iterator;function L(x){return x===null||typeof x!="object"?null:(x=w&&x[w]||x["@@iterator"],typeof x=="function"?x:null)}var E={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},D=Object.assign,T={};function U(x,R,ae){this.props=x,this.context=R,this.refs=T,this.updater=ae||E}U.prototype.isReactComponent={},U.prototype.setState=function(x,R){if(typeof x!="object"&&typeof x!="function"&&x!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,x,R,"setState")},U.prototype.forceUpdate=function(x){this.updater.enqueueForceUpdate(this,x,"forceUpdate")};function V(){}V.prototype=U.prototype;function se(x,R,ae){this.props=x,this.context=R,this.refs=T,this.updater=ae||E}var q=se.prototype=new V;q.constructor=se,D(q,U.prototype),q.isPureReactComponent=!0;var me=Array.isArray,Se=Object.prototype.hasOwnProperty,Ce={current:null},J={key:!0,ref:!0,__self:!0,__source:!0};function oe(x,R,ae){var ce,ve={},A=null,pe=null;if(R!=null)for(ce in R.ref!==void 0&&(pe=R.ref),R.key!==void 0&&(A=""+R.key),R)Se.call(R,ce)&&!J.hasOwnProperty(ce)&&(ve[ce]=R[ce]);var ee=arguments.length-2;if(ee===1)ve.children=ae;else if(1i in r?Hf(r,i,{enumerable:!0,config * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var yc;function Gf(){if(yc)return kr;yc=1;var r=$a(),i=Symbol.for("react.element"),o=Symbol.for("react.fragment"),c=Object.prototype.hasOwnProperty,f=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};function y(v,b,N){var C,w={},L=null,E=null;N!==void 0&&(L=""+N),b.key!==void 0&&(L=""+b.key),b.ref!==void 0&&(E=b.ref);for(C in b)c.call(b,C)&&!p.hasOwnProperty(C)&&(w[C]=b[C]);if(v&&v.defaultProps)for(C in b=v.defaultProps,b)w[C]===void 0&&(w[C]=b[C]);return{$$typeof:i,type:v,key:L,ref:E,props:w,_owner:f.current}}return kr.Fragment=o,kr.jsx=y,kr.jsxs=y,kr}var gc;function Yf(){return gc||(gc=1,ba.exports=Gf()),ba.exports}var n=Yf(),h=$a();const Xf=_c(h);var _l={},wa={exports:{}},Ct={},Na={exports:{}},ka={};/** + */var yc;function Zf(){if(yc)return kr;yc=1;var r=$a(),i=Symbol.for("react.element"),o=Symbol.for("react.fragment"),c=Object.prototype.hasOwnProperty,f=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};function y(j,b,N){var k,S={},L=null,E=null;N!==void 0&&(L=""+N),b.key!==void 0&&(L=""+b.key),b.ref!==void 0&&(E=b.ref);for(k in b)c.call(b,k)&&!p.hasOwnProperty(k)&&(S[k]=b[k]);if(j&&j.defaultProps)for(k in b=j.defaultProps,b)S[k]===void 0&&(S[k]=b[k]);return{$$typeof:i,type:j,key:L,ref:E,props:S,_owner:f.current}}return kr.Fragment=o,kr.jsx=y,kr.jsxs=y,kr}var gc;function ep(){return gc||(gc=1,ba.exports=Zf()),ba.exports}var n=ep(),h=$a();const tp=Bc(h);var _l={},wa={exports:{}},Ct={},Na={exports:{}},ka={};/** * @license React * scheduler.production.min.js * @@ -22,7 +22,7 @@ var Hf=Object.defineProperty;var Jf=(r,i,o)=>i in r?Hf(r,i,{enumerable:!0,config * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var xc;function Zf(){return xc||(xc=1,(function(r){function i(O,F){var M=O.length;O.push(F);e:for(;0>>1,R=O[x];if(0>>1;xf(ve,M))Af(pe,ve)?(O[x]=pe,O[A]=M,x=A):(O[x]=ve,O[ce]=M,x=ce);else if(Af(pe,M))O[x]=pe,O[A]=M,x=A;else break e}}return F}function f(O,F){var M=O.sortIndex-F.sortIndex;return M!==0?M:O.id-F.id}if(typeof performance=="object"&&typeof performance.now=="function"){var p=performance;r.unstable_now=function(){return p.now()}}else{var y=Date,v=y.now();r.unstable_now=function(){return y.now()-v}}var b=[],N=[],C=1,w=null,L=3,E=!1,D=!1,T=!1,U=typeof setTimeout=="function"?setTimeout:null,V=typeof clearTimeout=="function"?clearTimeout:null,se=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function q(O){for(var F=o(N);F!==null;){if(F.callback===null)c(N);else if(F.startTime<=O)c(N),F.sortIndex=F.expirationTime,i(b,F);else break;F=o(N)}}function me(O){if(T=!1,q(O),!D)if(o(b)!==null)D=!0,we(Se);else{var F=o(N);F!==null&&he(me,F.startTime-O)}}function Se(O,F){D=!1,T&&(T=!1,V(oe),oe=-1),E=!0;var M=L;try{for(q(F),w=o(b);w!==null&&(!(w.expirationTime>F)||O&&!ie());){var x=w.callback;if(typeof x=="function"){w.callback=null,L=w.priorityLevel;var R=x(w.expirationTime<=F);F=r.unstable_now(),typeof R=="function"?w.callback=R:w===o(b)&&c(b),q(F)}else c(b);w=o(b)}if(w!==null)var ae=!0;else{var ce=o(N);ce!==null&&he(me,ce.startTime-F),ae=!1}return ae}finally{w=null,L=M,E=!1}}var Ce=!1,J=null,oe=-1,be=5,De=-1;function ie(){return!(r.unstable_now()-DeO||125x?(O.sortIndex=M,i(N,O),o(b)===null&&O===o(N)&&(T?(V(oe),oe=-1):T=!0,he(me,M-x))):(O.sortIndex=R,i(b,O),D||E||(D=!0,we(Se))),O},r.unstable_shouldYield=ie,r.unstable_wrapCallback=function(O){var F=L;return function(){var M=L;L=F;try{return O.apply(this,arguments)}finally{L=M}}}})(ka)),ka}var jc;function ep(){return jc||(jc=1,Na.exports=Zf()),Na.exports}/** + */var xc;function np(){return xc||(xc=1,(function(r){function i(O,F){var M=O.length;O.push(F);e:for(;0>>1,R=O[x];if(0>>1;xf(ve,M))Af(pe,ve)?(O[x]=pe,O[A]=M,x=A):(O[x]=ve,O[ce]=M,x=ce);else if(Af(pe,M))O[x]=pe,O[A]=M,x=A;else break e}}return F}function f(O,F){var M=O.sortIndex-F.sortIndex;return M!==0?M:O.id-F.id}if(typeof performance=="object"&&typeof performance.now=="function"){var p=performance;r.unstable_now=function(){return p.now()}}else{var y=Date,j=y.now();r.unstable_now=function(){return y.now()-j}}var b=[],N=[],k=1,S=null,L=3,E=!1,D=!1,T=!1,U=typeof setTimeout=="function"?setTimeout:null,V=typeof clearTimeout=="function"?clearTimeout:null,se=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function q(O){for(var F=o(N);F!==null;){if(F.callback===null)c(N);else if(F.startTime<=O)c(N),F.sortIndex=F.expirationTime,i(b,F);else break;F=o(N)}}function me(O){if(T=!1,q(O),!D)if(o(b)!==null)D=!0,we(Se);else{var F=o(N);F!==null&&he(me,F.startTime-O)}}function Se(O,F){D=!1,T&&(T=!1,V(oe),oe=-1),E=!0;var M=L;try{for(q(F),S=o(b);S!==null&&(!(S.expirationTime>F)||O&&!ie());){var x=S.callback;if(typeof x=="function"){S.callback=null,L=S.priorityLevel;var R=x(S.expirationTime<=F);F=r.unstable_now(),typeof R=="function"?S.callback=R:S===o(b)&&c(b),q(F)}else c(b);S=o(b)}if(S!==null)var ae=!0;else{var ce=o(N);ce!==null&&he(me,ce.startTime-F),ae=!1}return ae}finally{S=null,L=M,E=!1}}var Ce=!1,J=null,oe=-1,be=5,De=-1;function ie(){return!(r.unstable_now()-DeO||125x?(O.sortIndex=M,i(N,O),o(b)===null&&O===o(N)&&(T?(V(oe),oe=-1):T=!0,he(me,M-x))):(O.sortIndex=R,i(b,O),D||E||(D=!0,we(Se))),O},r.unstable_shouldYield=ie,r.unstable_wrapCallback=function(O){var F=L;return function(){var M=L;L=F;try{return O.apply(this,arguments)}finally{L=M}}}})(ka)),ka}var jc;function sp(){return jc||(jc=1,Na.exports=np()),Na.exports}/** * @license React * react-dom.production.min.js * @@ -30,16 +30,16 @@ var Hf=Object.defineProperty;var Jf=(r,i,o)=>i in r?Hf(r,i,{enumerable:!0,config * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var vc;function tp(){if(vc)return Ct;vc=1;var r=$a(),i=ep();function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,s=1;s"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),b=Object.prototype.hasOwnProperty,N=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,C={},w={};function L(e){return b.call(w,e)?!0:b.call(C,e)?!1:N.test(e)?w[e]=!0:(C[e]=!0,!1)}function E(e,t,s,l){if(s!==null&&s.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return l?!1:s!==null?!s.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function D(e,t,s,l){if(t===null||typeof t>"u"||E(e,t,s,l))return!0;if(l)return!1;if(s!==null)switch(s.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function T(e,t,s,l,a,u,d){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=l,this.attributeNamespace=a,this.mustUseProperty=s,this.propertyName=e,this.type=t,this.sanitizeURL=u,this.removeEmptyString=d}var U={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){U[e]=new T(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];U[t]=new T(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){U[e]=new T(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){U[e]=new T(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){U[e]=new T(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){U[e]=new T(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){U[e]=new T(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){U[e]=new T(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){U[e]=new T(e,5,!1,e.toLowerCase(),null,!1,!1)});var V=/[\-:]([a-z])/g;function se(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(V,se);U[t]=new T(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(V,se);U[t]=new T(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(V,se);U[t]=new T(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){U[e]=new T(e,1,!1,e.toLowerCase(),null,!1,!1)}),U.xlinkHref=new T("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){U[e]=new T(e,1,!1,e.toLowerCase(),null,!0,!0)});function q(e,t,s,l){var a=U.hasOwnProperty(t)?U[t]:null;(a!==null?a.type!==0:l||!(2"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),b=Object.prototype.hasOwnProperty,N=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,k={},S={};function L(e){return b.call(S,e)?!0:b.call(k,e)?!1:N.test(e)?S[e]=!0:(k[e]=!0,!1)}function E(e,t,s,l){if(s!==null&&s.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return l?!1:s!==null?!s.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function D(e,t,s,l){if(t===null||typeof t>"u"||E(e,t,s,l))return!0;if(l)return!1;if(s!==null)switch(s.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function T(e,t,s,l,a,u,d){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=l,this.attributeNamespace=a,this.mustUseProperty=s,this.propertyName=e,this.type=t,this.sanitizeURL=u,this.removeEmptyString=d}var U={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){U[e]=new T(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];U[t]=new T(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){U[e]=new T(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){U[e]=new T(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){U[e]=new T(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){U[e]=new T(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){U[e]=new T(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){U[e]=new T(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){U[e]=new T(e,5,!1,e.toLowerCase(),null,!1,!1)});var V=/[\-:]([a-z])/g;function se(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(V,se);U[t]=new T(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(V,se);U[t]=new T(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(V,se);U[t]=new T(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){U[e]=new T(e,1,!1,e.toLowerCase(),null,!1,!1)}),U.xlinkHref=new T("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){U[e]=new T(e,1,!1,e.toLowerCase(),null,!0,!0)});function q(e,t,s,l){var a=U.hasOwnProperty(t)?U[t]:null;(a!==null?a.type!==0:l||!(2m||a[d]!==u[m]){var g=` -`+a[d].replace(" at new "," at ");return e.displayName&&g.includes("")&&(g=g.replace("",e.displayName)),g}while(1<=d&&0<=m);break}}}finally{ae=!1,Error.prepareStackTrace=s}return(e=e?e.displayName||e.name:"")?R(e):""}function ve(e){switch(e.tag){case 5:return R(e.type);case 16:return R("Lazy");case 13:return R("Suspense");case 19:return R("SuspenseList");case 0:case 2:case 15:return e=ce(e.type,!1),e;case 11:return e=ce(e.type.render,!1),e;case 1:return e=ce(e.type,!0),e;default:return""}}function A(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case J:return"Fragment";case Ce:return"Portal";case be:return"Profiler";case oe:return"StrictMode";case X:return"Suspense";case K:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case ie:return(e.displayName||"Context")+".Consumer";case De:return(e._context.displayName||"Context")+".Provider";case z:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case ye:return t=e.displayName||null,t!==null?t:A(e.type)||"Memo";case we:t=e._payload,e=e._init;try{return A(e(t))}catch{}}return null}function pe(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return A(t);case 8:return t===oe?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function ee(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function ge(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Pe(e){var t=ge(e)?"checked":"value",s=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),l=""+e[t];if(!e.hasOwnProperty(t)&&typeof s<"u"&&typeof s.get=="function"&&typeof s.set=="function"){var a=s.get,u=s.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(d){l=""+d,u.call(this,d)}}),Object.defineProperty(e,t,{enumerable:s.enumerable}),{getValue:function(){return l},setValue:function(d){l=""+d},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function _e(e){e._valueTracker||(e._valueTracker=Pe(e))}function vt(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var s=t.getValue(),l="";return e&&(l=ge(e)?e.checked?"true":"false":e.value),e=l,e!==s?(t.setValue(e),!0):!1}function te(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Ie(e,t){var s=t.checked;return M({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:s??e._wrapperState.initialChecked})}function Ee(e,t){var s=t.defaultValue==null?"":t.defaultValue,l=t.checked!=null?t.checked:t.defaultChecked;s=ee(t.value!=null?t.value:s),e._wrapperState={initialChecked:l,initialValue:s,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Be(e,t){t=t.checked,t!=null&&q(e,"checked",t,!1)}function st(e,t){Be(e,t);var s=ee(t.value),l=t.type;if(s!=null)l==="number"?(s===0&&e.value===""||e.value!=s)&&(e.value=""+s):e.value!==""+s&&(e.value=""+s);else if(l==="submit"||l==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?dn(e,t.type,s):t.hasOwnProperty("defaultValue")&&dn(e,t.type,ee(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Lt(e,t,s){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var l=t.type;if(!(l!=="submit"&&l!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,s||t===e.value||(e.value=t),e.defaultValue=t}s=e.name,s!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,s!==""&&(e.name=s)}function dn(e,t,s){(t!=="number"||te(e.ownerDocument)!==e)&&(s==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+s&&(e.defaultValue=""+s))}var Xt=Array.isArray;function $t(e,t,s,l){if(e=e.options,t){t={};for(var a=0;a"+t.valueOf().toString()+"",t=yt.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Ae(e,t){if(t){var s=e.firstChild;if(s&&s===e.lastChild&&s.nodeType===3){s.nodeValue=t;return}}e.textContent=t}var gt={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},ds=["Webkit","ms","Moz","O"];Object.keys(gt).forEach(function(e){ds.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),gt[t]=gt[e]})});function dt(e,t,s){return t==null||typeof t=="boolean"||t===""?"":s||typeof t!="number"||t===0||gt.hasOwnProperty(e)&>[e]?(""+t).trim():t+"px"}function Qt(e,t){e=e.style;for(var s in t)if(t.hasOwnProperty(s)){var l=s.indexOf("--")===0,a=dt(s,t[s],l);s==="float"&&(s="cssFloat"),l?e.setProperty(s,a):e[s]=a}}var Ut=M({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Ge(e,t){if(t){if(Ut[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(o(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(o(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(o(61))}if(t.style!=null&&typeof t.style!="object")throw Error(o(62))}}function Zt(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var en=null;function qt(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var tn=null,nn=null,sn=null;function fs(e){if(e=cr(e)){if(typeof tn!="function")throw Error(o(280));var t=e.stateNode;t&&(t=Xr(t),tn(e.stateNode,e.type,t))}}function ps(e){nn?sn?sn.push(e):sn=[e]:nn=e}function je(){if(nn){var e=nn,t=sn;if(sn=nn=null,fs(e),t)for(e=0;e>>=0,e===0?32:31-(od(e)/ud|0)|0}var Pr=64,Mr=4194304;function Ks(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Or(e,t){var s=e.pendingLanes;if(s===0)return 0;var l=0,a=e.suspendedLanes,u=e.pingedLanes,d=s&268435455;if(d!==0){var m=d&~a;m!==0?l=Ks(m):(u&=d,u!==0&&(l=Ks(u)))}else d=s&~a,d!==0?l=Ks(d):u!==0&&(l=Ks(u));if(l===0)return 0;if(t!==0&&t!==l&&(t&a)===0&&(a=l&-l,u=t&-t,a>=u||a===16&&(u&4194240)!==0))return t;if((l&4)!==0&&(l|=s&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=l;0s;s++)t.push(e);return t}function Hs(e,t,s){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Vt(t),e[t]=s}function pd(e,t){var s=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var l=e.eventTimes;for(e=e.expirationTimes;0=tr),io=" ",ao=!1;function oo(e,t){switch(e){case"keyup":return Fd.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function uo(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var vs=!1;function Ud(e,t){switch(e){case"compositionend":return uo(t);case"keypress":return t.which!==32?null:(ao=!0,io);case"textInput":return e=t.data,e===io&&ao?null:e;default:return null}}function qd(e,t){if(vs)return e==="compositionend"||!ti&&oo(e,t)?(e=eo(),Fr=Wl=Rn=null,vs=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:s,offset:t-e};e=l}e:{for(;s;){if(s.nextSibling){s=s.nextSibling;break e}s=s.parentNode}s=void 0}s=go(s)}}function jo(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?jo(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function vo(){for(var e=window,t=te();t instanceof e.HTMLIFrameElement;){try{var s=typeof t.contentWindow.location.href=="string"}catch{s=!1}if(s)e=t.contentWindow;else break;t=te(e.document)}return t}function ri(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Zd(e){var t=vo(),s=e.focusedElem,l=e.selectionRange;if(t!==s&&s&&s.ownerDocument&&jo(s.ownerDocument.documentElement,s)){if(l!==null&&ri(s)){if(t=l.start,e=l.end,e===void 0&&(e=t),"selectionStart"in s)s.selectionStart=t,s.selectionEnd=Math.min(e,s.value.length);else if(e=(t=s.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var a=s.textContent.length,u=Math.min(l.start,a);l=l.end===void 0?u:Math.min(l.end,a),!e.extend&&u>l&&(a=l,l=u,u=a),a=xo(s,u);var d=xo(s,l);a&&d&&(e.rangeCount!==1||e.anchorNode!==a.node||e.anchorOffset!==a.offset||e.focusNode!==d.node||e.focusOffset!==d.offset)&&(t=t.createRange(),t.setStart(a.node,a.offset),e.removeAllRanges(),u>l?(e.addRange(t),e.extend(d.node,d.offset)):(t.setEnd(d.node,d.offset),e.addRange(t)))}}for(t=[],e=s;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof s.focus=="function"&&s.focus(),s=0;s=document.documentMode,bs=null,li=null,lr=null,ii=!1;function bo(e,t,s){var l=s.window===s?s.document:s.nodeType===9?s:s.ownerDocument;ii||bs==null||bs!==te(l)||(l=bs,"selectionStart"in l&&ri(l)?l={start:l.selectionStart,end:l.selectionEnd}:(l=(l.ownerDocument&&l.ownerDocument.defaultView||window).getSelection(),l={anchorNode:l.anchorNode,anchorOffset:l.anchorOffset,focusNode:l.focusNode,focusOffset:l.focusOffset}),lr&&rr(lr,l)||(lr=l,l=Wr(li,"onSelect"),0Cs||(e.current=xi[Cs],xi[Cs]=null,Cs--)}function Fe(e,t){Cs++,xi[Cs]=e.current,e.current=t}var $n={},ft=Ln($n),bt=Ln(!1),Gn=$n;function Es(e,t){var s=e.type.contextTypes;if(!s)return $n;var l=e.stateNode;if(l&&l.__reactInternalMemoizedUnmaskedChildContext===t)return l.__reactInternalMemoizedMaskedChildContext;var a={},u;for(u in s)a[u]=t[u];return l&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function St(e){return e=e.childContextTypes,e!=null}function Zr(){Ue(bt),Ue(ft)}function Oo(e,t,s){if(ft.current!==$n)throw Error(o(168));Fe(ft,t),Fe(bt,s)}function _o(e,t,s){var l=e.stateNode;if(t=t.childContextTypes,typeof l.getChildContext!="function")return s;l=l.getChildContext();for(var a in l)if(!(a in t))throw Error(o(108,pe(e)||"Unknown",a));return M({},s,l)}function el(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||$n,Gn=ft.current,Fe(ft,e),Fe(bt,bt.current),!0}function Bo(e,t,s){var l=e.stateNode;if(!l)throw Error(o(169));s?(e=_o(e,t,Gn),l.__reactInternalMemoizedMergedChildContext=e,Ue(bt),Ue(ft),Fe(ft,e)):Ue(bt),Fe(bt,s)}var pn=null,tl=!1,ji=!1;function Ao(e){pn===null?pn=[e]:pn.push(e)}function ff(e){tl=!0,Ao(e)}function Pn(){if(!ji&&pn!==null){ji=!0;var e=0,t=Oe;try{var s=pn;for(Oe=1;e>=d,a-=d,mn=1<<32-Vt(t)+a|s<xe?(it=fe,fe=null):it=fe.sibling;var Le=$(S,fe,k[xe],B);if(Le===null){fe===null&&(fe=it);break}e&&fe&&Le.alternate===null&&t(S,fe),j=u(Le,j,xe),de===null?le=Le:de.sibling=Le,de=Le,fe=it}if(xe===k.length)return s(S,fe),Ve&&Xn(S,xe),le;if(fe===null){for(;xexe?(it=fe,fe=null):it=fe.sibling;var Un=$(S,fe,Le.value,B);if(Un===null){fe===null&&(fe=it);break}e&&fe&&Un.alternate===null&&t(S,fe),j=u(Un,j,xe),de===null?le=Un:de.sibling=Un,de=Un,fe=it}if(Le.done)return s(S,fe),Ve&&Xn(S,xe),le;if(fe===null){for(;!Le.done;xe++,Le=k.next())Le=_(S,Le.value,B),Le!==null&&(j=u(Le,j,xe),de===null?le=Le:de.sibling=Le,de=Le);return Ve&&Xn(S,xe),le}for(fe=l(S,fe);!Le.done;xe++,Le=k.next())Le=H(fe,S,xe,Le.value,B),Le!==null&&(e&&Le.alternate!==null&&fe.delete(Le.key===null?xe:Le.key),j=u(Le,j,xe),de===null?le=Le:de.sibling=Le,de=Le);return e&&fe.forEach(function(Kf){return t(S,Kf)}),Ve&&Xn(S,xe),le}function Xe(S,j,k,B){if(typeof k=="object"&&k!==null&&k.type===J&&k.key===null&&(k=k.props.children),typeof k=="object"&&k!==null){switch(k.$$typeof){case Se:e:{for(var le=k.key,de=j;de!==null;){if(de.key===le){if(le=k.type,le===J){if(de.tag===7){s(S,de.sibling),j=a(de,k.props.children),j.return=S,S=j;break e}}else if(de.elementType===le||typeof le=="object"&&le!==null&&le.$$typeof===we&&Vo(le)===de.type){s(S,de.sibling),j=a(de,k.props),j.ref=dr(S,de,k),j.return=S,S=j;break e}s(S,de);break}else t(S,de);de=de.sibling}k.type===J?(j=is(k.props.children,S.mode,B,k.key),j.return=S,S=j):(B=Rl(k.type,k.key,k.props,null,S.mode,B),B.ref=dr(S,j,k),B.return=S,S=B)}return d(S);case Ce:e:{for(de=k.key;j!==null;){if(j.key===de)if(j.tag===4&&j.stateNode.containerInfo===k.containerInfo&&j.stateNode.implementation===k.implementation){s(S,j.sibling),j=a(j,k.children||[]),j.return=S,S=j;break e}else{s(S,j);break}else t(S,j);j=j.sibling}j=ya(k,S.mode,B),j.return=S,S=j}return d(S);case we:return de=k._init,Xe(S,j,de(k._payload),B)}if(Xt(k))return Z(S,j,k,B);if(F(k))return ne(S,j,k,B);ll(S,k)}return typeof k=="string"&&k!==""||typeof k=="number"?(k=""+k,j!==null&&j.tag===6?(s(S,j.sibling),j=a(j,k),j.return=S,S=j):(s(S,j),j=ha(k,S.mode,B),j.return=S,S=j),d(S)):s(S,j)}return Xe}var Ts=Ko(!0),Ho=Ko(!1),il=Ln(null),al=null,Ls=null,ki=null;function Ci(){ki=Ls=al=null}function Ei(e){var t=il.current;Ue(il),e._currentValue=t}function Ii(e,t,s){for(;e!==null;){var l=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,l!==null&&(l.childLanes|=t)):l!==null&&(l.childLanes&t)!==t&&(l.childLanes|=t),e===s)break;e=e.return}}function $s(e,t){al=e,ki=Ls=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(wt=!0),e.firstContext=null)}function _t(e){var t=e._currentValue;if(ki!==e)if(e={context:e,memoizedValue:t,next:null},Ls===null){if(al===null)throw Error(o(308));Ls=e,al.dependencies={lanes:0,firstContext:e}}else Ls=Ls.next=e;return t}var Zn=null;function Ri(e){Zn===null?Zn=[e]:Zn.push(e)}function Jo(e,t,s,l){var a=t.interleaved;return a===null?(s.next=s,Ri(t)):(s.next=a.next,a.next=s),t.interleaved=s,yn(e,l)}function yn(e,t){e.lanes|=t;var s=e.alternate;for(s!==null&&(s.lanes|=t),s=e,e=e.return;e!==null;)e.childLanes|=t,s=e.alternate,s!==null&&(s.childLanes|=t),s=e,e=e.return;return s.tag===3?s.stateNode:null}var Mn=!1;function Di(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Wo(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function gn(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function On(e,t,s){var l=e.updateQueue;if(l===null)return null;if(l=l.shared,(Te&2)!==0){var a=l.pending;return a===null?t.next=t:(t.next=a.next,a.next=t),l.pending=t,yn(e,s)}return a=l.interleaved,a===null?(t.next=t,Ri(l)):(t.next=a.next,a.next=t),l.interleaved=t,yn(e,s)}function ol(e,t,s){if(t=t.updateQueue,t!==null&&(t=t.shared,(s&4194240)!==0)){var l=t.lanes;l&=e.pendingLanes,s|=l,t.lanes=s,ql(e,s)}}function Go(e,t){var s=e.updateQueue,l=e.alternate;if(l!==null&&(l=l.updateQueue,s===l)){var a=null,u=null;if(s=s.firstBaseUpdate,s!==null){do{var d={eventTime:s.eventTime,lane:s.lane,tag:s.tag,payload:s.payload,callback:s.callback,next:null};u===null?a=u=d:u=u.next=d,s=s.next}while(s!==null);u===null?a=u=t:u=u.next=t}else a=u=t;s={baseState:l.baseState,firstBaseUpdate:a,lastBaseUpdate:u,shared:l.shared,effects:l.effects},e.updateQueue=s;return}e=s.lastBaseUpdate,e===null?s.firstBaseUpdate=t:e.next=t,s.lastBaseUpdate=t}function ul(e,t,s,l){var a=e.updateQueue;Mn=!1;var u=a.firstBaseUpdate,d=a.lastBaseUpdate,m=a.shared.pending;if(m!==null){a.shared.pending=null;var g=m,I=g.next;g.next=null,d===null?u=I:d.next=I,d=g;var P=e.alternate;P!==null&&(P=P.updateQueue,m=P.lastBaseUpdate,m!==d&&(m===null?P.firstBaseUpdate=I:m.next=I,P.lastBaseUpdate=g))}if(u!==null){var _=a.baseState;d=0,P=I=g=null,m=u;do{var $=m.lane,H=m.eventTime;if((l&$)===$){P!==null&&(P=P.next={eventTime:H,lane:0,tag:m.tag,payload:m.payload,callback:m.callback,next:null});e:{var Z=e,ne=m;switch($=t,H=s,ne.tag){case 1:if(Z=ne.payload,typeof Z=="function"){_=Z.call(H,_,$);break e}_=Z;break e;case 3:Z.flags=Z.flags&-65537|128;case 0:if(Z=ne.payload,$=typeof Z=="function"?Z.call(H,_,$):Z,$==null)break e;_=M({},_,$);break e;case 2:Mn=!0}}m.callback!==null&&m.lane!==0&&(e.flags|=64,$=a.effects,$===null?a.effects=[m]:$.push(m))}else H={eventTime:H,lane:$,tag:m.tag,payload:m.payload,callback:m.callback,next:null},P===null?(I=P=H,g=_):P=P.next=H,d|=$;if(m=m.next,m===null){if(m=a.shared.pending,m===null)break;$=m,m=$.next,$.next=null,a.lastBaseUpdate=$,a.shared.pending=null}}while(!0);if(P===null&&(g=_),a.baseState=g,a.firstBaseUpdate=I,a.lastBaseUpdate=P,t=a.shared.interleaved,t!==null){a=t;do d|=a.lane,a=a.next;while(a!==t)}else u===null&&(a.shared.lanes=0);ns|=d,e.lanes=d,e.memoizedState=_}}function Yo(e,t,s){if(e=t.effects,t.effects=null,e!==null)for(t=0;ts?s:4,e(!0);var l=Mi.transition;Mi.transition={};try{e(!1),t()}finally{Oe=s,Mi.transition=l}}function yu(){return Bt().memoizedState}function yf(e,t,s){var l=zn(e);if(s={lane:l,action:s,hasEagerState:!1,eagerState:null,next:null},gu(e))xu(t,s);else if(s=Jo(e,t,s,l),s!==null){var a=jt();Yt(s,e,l,a),ju(s,t,l)}}function gf(e,t,s){var l=zn(e),a={lane:l,action:s,hasEagerState:!1,eagerState:null,next:null};if(gu(e))xu(t,a);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var d=t.lastRenderedState,m=u(d,s);if(a.hasEagerState=!0,a.eagerState=m,Kt(m,d)){var g=t.interleaved;g===null?(a.next=a,Ri(t)):(a.next=g.next,g.next=a),t.interleaved=a;return}}catch{}finally{}s=Jo(e,t,a,l),s!==null&&(a=jt(),Yt(s,e,l,a),ju(s,t,l))}}function gu(e){var t=e.alternate;return e===He||t!==null&&t===He}function xu(e,t){hr=fl=!0;var s=e.pending;s===null?t.next=t:(t.next=s.next,s.next=t),e.pending=t}function ju(e,t,s){if((s&4194240)!==0){var l=t.lanes;l&=e.pendingLanes,s|=l,t.lanes=s,ql(e,s)}}var hl={readContext:_t,useCallback:pt,useContext:pt,useEffect:pt,useImperativeHandle:pt,useInsertionEffect:pt,useLayoutEffect:pt,useMemo:pt,useReducer:pt,useRef:pt,useState:pt,useDebugValue:pt,useDeferredValue:pt,useTransition:pt,useMutableSource:pt,useSyncExternalStore:pt,useId:pt,unstable_isNewReconciler:!1},xf={readContext:_t,useCallback:function(e,t){return on().memoizedState=[e,t===void 0?null:t],e},useContext:_t,useEffect:ou,useImperativeHandle:function(e,t,s){return s=s!=null?s.concat([e]):null,pl(4194308,4,du.bind(null,t,e),s)},useLayoutEffect:function(e,t){return pl(4194308,4,e,t)},useInsertionEffect:function(e,t){return pl(4,2,e,t)},useMemo:function(e,t){var s=on();return t=t===void 0?null:t,e=e(),s.memoizedState=[e,t],e},useReducer:function(e,t,s){var l=on();return t=s!==void 0?s(t):t,l.memoizedState=l.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},l.queue=e,e=e.dispatch=yf.bind(null,He,e),[l.memoizedState,e]},useRef:function(e){var t=on();return e={current:e},t.memoizedState=e},useState:iu,useDebugValue:Qi,useDeferredValue:function(e){return on().memoizedState=e},useTransition:function(){var e=iu(!1),t=e[0];return e=hf.bind(null,e[1]),on().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,s){var l=He,a=on();if(Ve){if(s===void 0)throw Error(o(407));s=s()}else{if(s=t(),lt===null)throw Error(o(349));(ts&30)!==0||tu(l,t,s)}a.memoizedState=s;var u={value:s,getSnapshot:t};return a.queue=u,ou(su.bind(null,l,u,e),[e]),l.flags|=2048,xr(9,nu.bind(null,l,u,s,t),void 0,null),s},useId:function(){var e=on(),t=lt.identifierPrefix;if(Ve){var s=hn,l=mn;s=(l&~(1<<32-Vt(l)-1)).toString(32)+s,t=":"+t+"R"+s,s=yr++,0")&&(g=g.replace("",e.displayName)),g}while(1<=d&&0<=m);break}}}finally{ae=!1,Error.prepareStackTrace=s}return(e=e?e.displayName||e.name:"")?R(e):""}function ve(e){switch(e.tag){case 5:return R(e.type);case 16:return R("Lazy");case 13:return R("Suspense");case 19:return R("SuspenseList");case 0:case 2:case 15:return e=ce(e.type,!1),e;case 11:return e=ce(e.type.render,!1),e;case 1:return e=ce(e.type,!0),e;default:return""}}function A(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case J:return"Fragment";case Ce:return"Portal";case be:return"Profiler";case oe:return"StrictMode";case X:return"Suspense";case K:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case ie:return(e.displayName||"Context")+".Consumer";case De:return(e._context.displayName||"Context")+".Provider";case z:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case ye:return t=e.displayName||null,t!==null?t:A(e.type)||"Memo";case we:t=e._payload,e=e._init;try{return A(e(t))}catch{}}return null}function pe(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return A(t);case 8:return t===oe?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function ee(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function ge(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Pe(e){var t=ge(e)?"checked":"value",s=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),l=""+e[t];if(!e.hasOwnProperty(t)&&typeof s<"u"&&typeof s.get=="function"&&typeof s.set=="function"){var a=s.get,u=s.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(d){l=""+d,u.call(this,d)}}),Object.defineProperty(e,t,{enumerable:s.enumerable}),{getValue:function(){return l},setValue:function(d){l=""+d},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function _e(e){e._valueTracker||(e._valueTracker=Pe(e))}function vt(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var s=t.getValue(),l="";return e&&(l=ge(e)?e.checked?"true":"false":e.value),e=l,e!==s?(t.setValue(e),!0):!1}function te(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Ie(e,t){var s=t.checked;return M({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:s??e._wrapperState.initialChecked})}function Ee(e,t){var s=t.defaultValue==null?"":t.defaultValue,l=t.checked!=null?t.checked:t.defaultChecked;s=ee(t.value!=null?t.value:s),e._wrapperState={initialChecked:l,initialValue:s,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Be(e,t){t=t.checked,t!=null&&q(e,"checked",t,!1)}function st(e,t){Be(e,t);var s=ee(t.value),l=t.type;if(s!=null)l==="number"?(s===0&&e.value===""||e.value!=s)&&(e.value=""+s):e.value!==""+s&&(e.value=""+s);else if(l==="submit"||l==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?dn(e,t.type,s):t.hasOwnProperty("defaultValue")&&dn(e,t.type,ee(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Lt(e,t,s){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var l=t.type;if(!(l!=="submit"&&l!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,s||t===e.value||(e.value=t),e.defaultValue=t}s=e.name,s!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,s!==""&&(e.name=s)}function dn(e,t,s){(t!=="number"||te(e.ownerDocument)!==e)&&(s==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+s&&(e.defaultValue=""+s))}var Xt=Array.isArray;function $t(e,t,s,l){if(e=e.options,t){t={};for(var a=0;a"+t.valueOf().toString()+"",t=yt.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Ae(e,t){if(t){var s=e.firstChild;if(s&&s===e.lastChild&&s.nodeType===3){s.nodeValue=t;return}}e.textContent=t}var gt={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},ds=["Webkit","ms","Moz","O"];Object.keys(gt).forEach(function(e){ds.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),gt[t]=gt[e]})});function dt(e,t,s){return t==null||typeof t=="boolean"||t===""?"":s||typeof t!="number"||t===0||gt.hasOwnProperty(e)&>[e]?(""+t).trim():t+"px"}function Qt(e,t){e=e.style;for(var s in t)if(t.hasOwnProperty(s)){var l=s.indexOf("--")===0,a=dt(s,t[s],l);s==="float"&&(s="cssFloat"),l?e.setProperty(s,a):e[s]=a}}var Ut=M({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Ge(e,t){if(t){if(Ut[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(o(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(o(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(o(61))}if(t.style!=null&&typeof t.style!="object")throw Error(o(62))}}function Zt(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var en=null;function qt(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var tn=null,nn=null,sn=null;function fs(e){if(e=cr(e)){if(typeof tn!="function")throw Error(o(280));var t=e.stateNode;t&&(t=Xr(t),tn(e.stateNode,e.type,t))}}function ps(e){nn?sn?sn.push(e):sn=[e]:nn=e}function je(){if(nn){var e=nn,t=sn;if(sn=nn=null,fs(e),t)for(e=0;e>>=0,e===0?32:31-(dd(e)/fd|0)|0}var Pr=64,Mr=4194304;function Ks(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Or(e,t){var s=e.pendingLanes;if(s===0)return 0;var l=0,a=e.suspendedLanes,u=e.pingedLanes,d=s&268435455;if(d!==0){var m=d&~a;m!==0?l=Ks(m):(u&=d,u!==0&&(l=Ks(u)))}else d=s&~a,d!==0?l=Ks(d):u!==0&&(l=Ks(u));if(l===0)return 0;if(t!==0&&t!==l&&(t&a)===0&&(a=l&-l,u=t&-t,a>=u||a===16&&(u&4194240)!==0))return t;if((l&4)!==0&&(l|=s&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=l;0s;s++)t.push(e);return t}function Hs(e,t,s){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Vt(t),e[t]=s}function yd(e,t){var s=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var l=e.eventTimes;for(e=e.expirationTimes;0=tr),io=" ",ao=!1;function oo(e,t){switch(e){case"keyup":return qd.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function uo(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var vs=!1;function Kd(e,t){switch(e){case"compositionend":return uo(t);case"keypress":return t.which!==32?null:(ao=!0,io);case"textInput":return e=t.data,e===io&&ao?null:e;default:return null}}function Hd(e,t){if(vs)return e==="compositionend"||!ti&&oo(e,t)?(e=eo(),Fr=Wl=Rn=null,vs=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:s,offset:t-e};e=l}e:{for(;s;){if(s.nextSibling){s=s.nextSibling;break e}s=s.parentNode}s=void 0}s=go(s)}}function jo(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?jo(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function vo(){for(var e=window,t=te();t instanceof e.HTMLIFrameElement;){try{var s=typeof t.contentWindow.location.href=="string"}catch{s=!1}if(s)e=t.contentWindow;else break;t=te(e.document)}return t}function ri(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function nf(e){var t=vo(),s=e.focusedElem,l=e.selectionRange;if(t!==s&&s&&s.ownerDocument&&jo(s.ownerDocument.documentElement,s)){if(l!==null&&ri(s)){if(t=l.start,e=l.end,e===void 0&&(e=t),"selectionStart"in s)s.selectionStart=t,s.selectionEnd=Math.min(e,s.value.length);else if(e=(t=s.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var a=s.textContent.length,u=Math.min(l.start,a);l=l.end===void 0?u:Math.min(l.end,a),!e.extend&&u>l&&(a=l,l=u,u=a),a=xo(s,u);var d=xo(s,l);a&&d&&(e.rangeCount!==1||e.anchorNode!==a.node||e.anchorOffset!==a.offset||e.focusNode!==d.node||e.focusOffset!==d.offset)&&(t=t.createRange(),t.setStart(a.node,a.offset),e.removeAllRanges(),u>l?(e.addRange(t),e.extend(d.node,d.offset)):(t.setEnd(d.node,d.offset),e.addRange(t)))}}for(t=[],e=s;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof s.focus=="function"&&s.focus(),s=0;s=document.documentMode,bs=null,li=null,lr=null,ii=!1;function bo(e,t,s){var l=s.window===s?s.document:s.nodeType===9?s:s.ownerDocument;ii||bs==null||bs!==te(l)||(l=bs,"selectionStart"in l&&ri(l)?l={start:l.selectionStart,end:l.selectionEnd}:(l=(l.ownerDocument&&l.ownerDocument.defaultView||window).getSelection(),l={anchorNode:l.anchorNode,anchorOffset:l.anchorOffset,focusNode:l.focusNode,focusOffset:l.focusOffset}),lr&&rr(lr,l)||(lr=l,l=Wr(li,"onSelect"),0Cs||(e.current=xi[Cs],xi[Cs]=null,Cs--)}function Fe(e,t){Cs++,xi[Cs]=e.current,e.current=t}var $n={},ft=Ln($n),bt=Ln(!1),Gn=$n;function Es(e,t){var s=e.type.contextTypes;if(!s)return $n;var l=e.stateNode;if(l&&l.__reactInternalMemoizedUnmaskedChildContext===t)return l.__reactInternalMemoizedMaskedChildContext;var a={},u;for(u in s)a[u]=t[u];return l&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function St(e){return e=e.childContextTypes,e!=null}function Zr(){Ue(bt),Ue(ft)}function Oo(e,t,s){if(ft.current!==$n)throw Error(o(168));Fe(ft,t),Fe(bt,s)}function _o(e,t,s){var l=e.stateNode;if(t=t.childContextTypes,typeof l.getChildContext!="function")return s;l=l.getChildContext();for(var a in l)if(!(a in t))throw Error(o(108,pe(e)||"Unknown",a));return M({},s,l)}function el(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||$n,Gn=ft.current,Fe(ft,e),Fe(bt,bt.current),!0}function Bo(e,t,s){var l=e.stateNode;if(!l)throw Error(o(169));s?(e=_o(e,t,Gn),l.__reactInternalMemoizedMergedChildContext=e,Ue(bt),Ue(ft),Fe(ft,e)):Ue(bt),Fe(bt,s)}var pn=null,tl=!1,ji=!1;function Ao(e){pn===null?pn=[e]:pn.push(e)}function hf(e){tl=!0,Ao(e)}function Pn(){if(!ji&&pn!==null){ji=!0;var e=0,t=Oe;try{var s=pn;for(Oe=1;e>=d,a-=d,mn=1<<32-Vt(t)+a|s<xe?(it=fe,fe=null):it=fe.sibling;var Le=$(w,fe,C[xe],B);if(Le===null){fe===null&&(fe=it);break}e&&fe&&Le.alternate===null&&t(w,fe),v=u(Le,v,xe),de===null?le=Le:de.sibling=Le,de=Le,fe=it}if(xe===C.length)return s(w,fe),Ve&&Xn(w,xe),le;if(fe===null){for(;xexe?(it=fe,fe=null):it=fe.sibling;var Un=$(w,fe,Le.value,B);if(Un===null){fe===null&&(fe=it);break}e&&fe&&Un.alternate===null&&t(w,fe),v=u(Un,v,xe),de===null?le=Un:de.sibling=Un,de=Un,fe=it}if(Le.done)return s(w,fe),Ve&&Xn(w,xe),le;if(fe===null){for(;!Le.done;xe++,Le=C.next())Le=_(w,Le.value,B),Le!==null&&(v=u(Le,v,xe),de===null?le=Le:de.sibling=Le,de=Le);return Ve&&Xn(w,xe),le}for(fe=l(w,fe);!Le.done;xe++,Le=C.next())Le=H(fe,w,xe,Le.value,B),Le!==null&&(e&&Le.alternate!==null&&fe.delete(Le.key===null?xe:Le.key),v=u(Le,v,xe),de===null?le=Le:de.sibling=Le,de=Le);return e&&fe.forEach(function(Wf){return t(w,Wf)}),Ve&&Xn(w,xe),le}function Xe(w,v,C,B){if(typeof C=="object"&&C!==null&&C.type===J&&C.key===null&&(C=C.props.children),typeof C=="object"&&C!==null){switch(C.$$typeof){case Se:e:{for(var le=C.key,de=v;de!==null;){if(de.key===le){if(le=C.type,le===J){if(de.tag===7){s(w,de.sibling),v=a(de,C.props.children),v.return=w,w=v;break e}}else if(de.elementType===le||typeof le=="object"&&le!==null&&le.$$typeof===we&&Vo(le)===de.type){s(w,de.sibling),v=a(de,C.props),v.ref=dr(w,de,C),v.return=w,w=v;break e}s(w,de);break}else t(w,de);de=de.sibling}C.type===J?(v=is(C.props.children,w.mode,B,C.key),v.return=w,w=v):(B=Rl(C.type,C.key,C.props,null,w.mode,B),B.ref=dr(w,v,C),B.return=w,w=B)}return d(w);case Ce:e:{for(de=C.key;v!==null;){if(v.key===de)if(v.tag===4&&v.stateNode.containerInfo===C.containerInfo&&v.stateNode.implementation===C.implementation){s(w,v.sibling),v=a(v,C.children||[]),v.return=w,w=v;break e}else{s(w,v);break}else t(w,v);v=v.sibling}v=ya(C,w.mode,B),v.return=w,w=v}return d(w);case we:return de=C._init,Xe(w,v,de(C._payload),B)}if(Xt(C))return Z(w,v,C,B);if(F(C))return ne(w,v,C,B);ll(w,C)}return typeof C=="string"&&C!==""||typeof C=="number"?(C=""+C,v!==null&&v.tag===6?(s(w,v.sibling),v=a(v,C),v.return=w,w=v):(s(w,v),v=ha(C,w.mode,B),v.return=w,w=v),d(w)):s(w,v)}return Xe}var Ts=Ko(!0),Ho=Ko(!1),il=Ln(null),al=null,Ls=null,ki=null;function Ci(){ki=Ls=al=null}function Ei(e){var t=il.current;Ue(il),e._currentValue=t}function Ii(e,t,s){for(;e!==null;){var l=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,l!==null&&(l.childLanes|=t)):l!==null&&(l.childLanes&t)!==t&&(l.childLanes|=t),e===s)break;e=e.return}}function $s(e,t){al=e,ki=Ls=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(wt=!0),e.firstContext=null)}function _t(e){var t=e._currentValue;if(ki!==e)if(e={context:e,memoizedValue:t,next:null},Ls===null){if(al===null)throw Error(o(308));Ls=e,al.dependencies={lanes:0,firstContext:e}}else Ls=Ls.next=e;return t}var Zn=null;function Ri(e){Zn===null?Zn=[e]:Zn.push(e)}function Jo(e,t,s,l){var a=t.interleaved;return a===null?(s.next=s,Ri(t)):(s.next=a.next,a.next=s),t.interleaved=s,yn(e,l)}function yn(e,t){e.lanes|=t;var s=e.alternate;for(s!==null&&(s.lanes|=t),s=e,e=e.return;e!==null;)e.childLanes|=t,s=e.alternate,s!==null&&(s.childLanes|=t),s=e,e=e.return;return s.tag===3?s.stateNode:null}var Mn=!1;function Di(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Wo(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function gn(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function On(e,t,s){var l=e.updateQueue;if(l===null)return null;if(l=l.shared,(Te&2)!==0){var a=l.pending;return a===null?t.next=t:(t.next=a.next,a.next=t),l.pending=t,yn(e,s)}return a=l.interleaved,a===null?(t.next=t,Ri(l)):(t.next=a.next,a.next=t),l.interleaved=t,yn(e,s)}function ol(e,t,s){if(t=t.updateQueue,t!==null&&(t=t.shared,(s&4194240)!==0)){var l=t.lanes;l&=e.pendingLanes,s|=l,t.lanes=s,ql(e,s)}}function Go(e,t){var s=e.updateQueue,l=e.alternate;if(l!==null&&(l=l.updateQueue,s===l)){var a=null,u=null;if(s=s.firstBaseUpdate,s!==null){do{var d={eventTime:s.eventTime,lane:s.lane,tag:s.tag,payload:s.payload,callback:s.callback,next:null};u===null?a=u=d:u=u.next=d,s=s.next}while(s!==null);u===null?a=u=t:u=u.next=t}else a=u=t;s={baseState:l.baseState,firstBaseUpdate:a,lastBaseUpdate:u,shared:l.shared,effects:l.effects},e.updateQueue=s;return}e=s.lastBaseUpdate,e===null?s.firstBaseUpdate=t:e.next=t,s.lastBaseUpdate=t}function ul(e,t,s,l){var a=e.updateQueue;Mn=!1;var u=a.firstBaseUpdate,d=a.lastBaseUpdate,m=a.shared.pending;if(m!==null){a.shared.pending=null;var g=m,I=g.next;g.next=null,d===null?u=I:d.next=I,d=g;var P=e.alternate;P!==null&&(P=P.updateQueue,m=P.lastBaseUpdate,m!==d&&(m===null?P.firstBaseUpdate=I:m.next=I,P.lastBaseUpdate=g))}if(u!==null){var _=a.baseState;d=0,P=I=g=null,m=u;do{var $=m.lane,H=m.eventTime;if((l&$)===$){P!==null&&(P=P.next={eventTime:H,lane:0,tag:m.tag,payload:m.payload,callback:m.callback,next:null});e:{var Z=e,ne=m;switch($=t,H=s,ne.tag){case 1:if(Z=ne.payload,typeof Z=="function"){_=Z.call(H,_,$);break e}_=Z;break e;case 3:Z.flags=Z.flags&-65537|128;case 0:if(Z=ne.payload,$=typeof Z=="function"?Z.call(H,_,$):Z,$==null)break e;_=M({},_,$);break e;case 2:Mn=!0}}m.callback!==null&&m.lane!==0&&(e.flags|=64,$=a.effects,$===null?a.effects=[m]:$.push(m))}else H={eventTime:H,lane:$,tag:m.tag,payload:m.payload,callback:m.callback,next:null},P===null?(I=P=H,g=_):P=P.next=H,d|=$;if(m=m.next,m===null){if(m=a.shared.pending,m===null)break;$=m,m=$.next,$.next=null,a.lastBaseUpdate=$,a.shared.pending=null}}while(!0);if(P===null&&(g=_),a.baseState=g,a.firstBaseUpdate=I,a.lastBaseUpdate=P,t=a.shared.interleaved,t!==null){a=t;do d|=a.lane,a=a.next;while(a!==t)}else u===null&&(a.shared.lanes=0);ns|=d,e.lanes=d,e.memoizedState=_}}function Yo(e,t,s){if(e=t.effects,t.effects=null,e!==null)for(t=0;ts?s:4,e(!0);var l=Mi.transition;Mi.transition={};try{e(!1),t()}finally{Oe=s,Mi.transition=l}}function yu(){return Bt().memoizedState}function jf(e,t,s){var l=zn(e);if(s={lane:l,action:s,hasEagerState:!1,eagerState:null,next:null},gu(e))xu(t,s);else if(s=Jo(e,t,s,l),s!==null){var a=jt();Yt(s,e,l,a),ju(s,t,l)}}function vf(e,t,s){var l=zn(e),a={lane:l,action:s,hasEagerState:!1,eagerState:null,next:null};if(gu(e))xu(t,a);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var d=t.lastRenderedState,m=u(d,s);if(a.hasEagerState=!0,a.eagerState=m,Kt(m,d)){var g=t.interleaved;g===null?(a.next=a,Ri(t)):(a.next=g.next,g.next=a),t.interleaved=a;return}}catch{}finally{}s=Jo(e,t,a,l),s!==null&&(a=jt(),Yt(s,e,l,a),ju(s,t,l))}}function gu(e){var t=e.alternate;return e===He||t!==null&&t===He}function xu(e,t){hr=fl=!0;var s=e.pending;s===null?t.next=t:(t.next=s.next,s.next=t),e.pending=t}function ju(e,t,s){if((s&4194240)!==0){var l=t.lanes;l&=e.pendingLanes,s|=l,t.lanes=s,ql(e,s)}}var hl={readContext:_t,useCallback:pt,useContext:pt,useEffect:pt,useImperativeHandle:pt,useInsertionEffect:pt,useLayoutEffect:pt,useMemo:pt,useReducer:pt,useRef:pt,useState:pt,useDebugValue:pt,useDeferredValue:pt,useTransition:pt,useMutableSource:pt,useSyncExternalStore:pt,useId:pt,unstable_isNewReconciler:!1},bf={readContext:_t,useCallback:function(e,t){return on().memoizedState=[e,t===void 0?null:t],e},useContext:_t,useEffect:ou,useImperativeHandle:function(e,t,s){return s=s!=null?s.concat([e]):null,pl(4194308,4,du.bind(null,t,e),s)},useLayoutEffect:function(e,t){return pl(4194308,4,e,t)},useInsertionEffect:function(e,t){return pl(4,2,e,t)},useMemo:function(e,t){var s=on();return t=t===void 0?null:t,e=e(),s.memoizedState=[e,t],e},useReducer:function(e,t,s){var l=on();return t=s!==void 0?s(t):t,l.memoizedState=l.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},l.queue=e,e=e.dispatch=jf.bind(null,He,e),[l.memoizedState,e]},useRef:function(e){var t=on();return e={current:e},t.memoizedState=e},useState:iu,useDebugValue:Qi,useDeferredValue:function(e){return on().memoizedState=e},useTransition:function(){var e=iu(!1),t=e[0];return e=xf.bind(null,e[1]),on().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,s){var l=He,a=on();if(Ve){if(s===void 0)throw Error(o(407));s=s()}else{if(s=t(),lt===null)throw Error(o(349));(ts&30)!==0||tu(l,t,s)}a.memoizedState=s;var u={value:s,getSnapshot:t};return a.queue=u,ou(su.bind(null,l,u,e),[e]),l.flags|=2048,xr(9,nu.bind(null,l,u,s,t),void 0,null),s},useId:function(){var e=on(),t=lt.identifierPrefix;if(Ve){var s=hn,l=mn;s=(l&~(1<<32-Vt(l)-1)).toString(32)+s,t=":"+t+"R"+s,s=yr++,0<\/script>",e=e.removeChild(e.firstChild)):typeof l.is=="string"?e=d.createElement(s,{is:l.is}):(e=d.createElement(s),s==="select"&&(d=e,l.multiple?d.multiple=!0:l.size&&(d.size=l.size))):e=d.createElementNS(e,s),e[ln]=t,e[ur]=l,Au(e,t,!1,!1),t.stateNode=e;e:{switch(d=Zt(s,l),s){case"dialog":Qe("cancel",e),Qe("close",e),a=l;break;case"iframe":case"object":case"embed":Qe("load",e),a=l;break;case"video":case"audio":for(a=0;aBs&&(t.flags|=128,l=!0,jr(u,!1),t.lanes=4194304)}else{if(!l)if(e=cl(d),e!==null){if(t.flags|=128,l=!0,s=e.updateQueue,s!==null&&(t.updateQueue=s,t.flags|=4),jr(u,!0),u.tail===null&&u.tailMode==="hidden"&&!d.alternate&&!Ve)return mt(t),null}else 2*Ye()-u.renderingStartTime>Bs&&s!==1073741824&&(t.flags|=128,l=!0,jr(u,!1),t.lanes=4194304);u.isBackwards?(d.sibling=t.child,t.child=d):(s=u.last,s!==null?s.sibling=d:t.child=d,u.last=d)}return u.tail!==null?(t=u.tail,u.rendering=t,u.tail=t.sibling,u.renderingStartTime=Ye(),t.sibling=null,s=Ke.current,Fe(Ke,l?s&1|2:s&1),t):(mt(t),null);case 22:case 23:return fa(),l=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==l&&(t.flags|=8192),l&&(t.mode&1)!==0?(Tt&1073741824)!==0&&(mt(t),t.subtreeFlags&6&&(t.flags|=8192)):mt(t),null;case 24:return null;case 25:return null}throw Error(o(156,t.tag))}function Cf(e,t){switch(bi(t),t.tag){case 1:return St(t.type)&&Zr(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Ps(),Ue(bt),Ue(ft),Pi(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Li(t),null;case 13:if(Ue(Ke),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(o(340));Ds()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ue(Ke),null;case 4:return Ps(),null;case 10:return Ei(t.type._context),null;case 22:case 23:return fa(),null;case 24:return null;default:return null}}var jl=!1,ht=!1,Ef=typeof WeakSet=="function"?WeakSet:Set,Y=null;function Os(e,t){var s=e.ref;if(s!==null)if(typeof s=="function")try{s(null)}catch(l){We(e,t,l)}else s.current=null}function ea(e,t,s){try{s()}catch(l){We(e,t,l)}}var Qu=!1;function If(e,t){if(fi=Ar,e=vo(),ri(e)){if("selectionStart"in e)var s={start:e.selectionStart,end:e.selectionEnd};else e:{s=(s=e.ownerDocument)&&s.defaultView||window;var l=s.getSelection&&s.getSelection();if(l&&l.rangeCount!==0){s=l.anchorNode;var a=l.anchorOffset,u=l.focusNode;l=l.focusOffset;try{s.nodeType,u.nodeType}catch{s=null;break e}var d=0,m=-1,g=-1,I=0,P=0,_=e,$=null;t:for(;;){for(var H;_!==s||a!==0&&_.nodeType!==3||(m=d+a),_!==u||l!==0&&_.nodeType!==3||(g=d+l),_.nodeType===3&&(d+=_.nodeValue.length),(H=_.firstChild)!==null;)$=_,_=H;for(;;){if(_===e)break t;if($===s&&++I===a&&(m=d),$===u&&++P===l&&(g=d),(H=_.nextSibling)!==null)break;_=$,$=_.parentNode}_=H}s=m===-1||g===-1?null:{start:m,end:g}}else s=null}s=s||{start:0,end:0}}else s=null;for(pi={focusedElem:e,selectionRange:s},Ar=!1,Y=t;Y!==null;)if(t=Y,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Y=e;else for(;Y!==null;){t=Y;try{var Z=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(Z!==null){var ne=Z.memoizedProps,Xe=Z.memoizedState,S=t.stateNode,j=S.getSnapshotBeforeUpdate(t.elementType===t.type?ne:Jt(t.type,ne),Xe);S.__reactInternalSnapshotBeforeUpdate=j}break;case 3:var k=t.stateNode.containerInfo;k.nodeType===1?k.textContent="":k.nodeType===9&&k.documentElement&&k.removeChild(k.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(o(163))}}catch(B){We(t,t.return,B)}if(e=t.sibling,e!==null){e.return=t.return,Y=e;break}Y=t.return}return Z=Qu,Qu=!1,Z}function vr(e,t,s){var l=t.updateQueue;if(l=l!==null?l.lastEffect:null,l!==null){var a=l=l.next;do{if((a.tag&e)===e){var u=a.destroy;a.destroy=void 0,u!==void 0&&ea(t,s,u)}a=a.next}while(a!==l)}}function vl(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var s=t=t.next;do{if((s.tag&e)===e){var l=s.create;s.destroy=l()}s=s.next}while(s!==t)}}function ta(e){var t=e.ref;if(t!==null){var s=e.stateNode;switch(e.tag){case 5:e=s;break;default:e=s}typeof t=="function"?t(e):t.current=e}}function Uu(e){var t=e.alternate;t!==null&&(e.alternate=null,Uu(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[ln],delete t[ur],delete t[gi],delete t[cf],delete t[df])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function qu(e){return e.tag===5||e.tag===3||e.tag===4}function Vu(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||qu(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function na(e,t,s){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?s.nodeType===8?s.parentNode.insertBefore(e,t):s.insertBefore(e,t):(s.nodeType===8?(t=s.parentNode,t.insertBefore(e,s)):(t=s,t.appendChild(e)),s=s._reactRootContainer,s!=null||t.onclick!==null||(t.onclick=Yr));else if(l!==4&&(e=e.child,e!==null))for(na(e,t,s),e=e.sibling;e!==null;)na(e,t,s),e=e.sibling}function sa(e,t,s){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?s.insertBefore(e,t):s.appendChild(e);else if(l!==4&&(e=e.child,e!==null))for(sa(e,t,s),e=e.sibling;e!==null;)sa(e,t,s),e=e.sibling}var ot=null,Wt=!1;function _n(e,t,s){for(s=s.child;s!==null;)Ku(e,t,s),s=s.sibling}function Ku(e,t,s){if(rn&&typeof rn.onCommitFiberUnmount=="function")try{rn.onCommitFiberUnmount($r,s)}catch{}switch(s.tag){case 5:ht||Os(s,t);case 6:var l=ot,a=Wt;ot=null,_n(e,t,s),ot=l,Wt=a,ot!==null&&(Wt?(e=ot,s=s.stateNode,e.nodeType===8?e.parentNode.removeChild(s):e.removeChild(s)):ot.removeChild(s.stateNode));break;case 18:ot!==null&&(Wt?(e=ot,s=s.stateNode,e.nodeType===8?yi(e.parentNode,s):e.nodeType===1&&yi(e,s),Xs(e)):yi(ot,s.stateNode));break;case 4:l=ot,a=Wt,ot=s.stateNode.containerInfo,Wt=!0,_n(e,t,s),ot=l,Wt=a;break;case 0:case 11:case 14:case 15:if(!ht&&(l=s.updateQueue,l!==null&&(l=l.lastEffect,l!==null))){a=l=l.next;do{var u=a,d=u.destroy;u=u.tag,d!==void 0&&((u&2)!==0||(u&4)!==0)&&ea(s,t,d),a=a.next}while(a!==l)}_n(e,t,s);break;case 1:if(!ht&&(Os(s,t),l=s.stateNode,typeof l.componentWillUnmount=="function"))try{l.props=s.memoizedProps,l.state=s.memoizedState,l.componentWillUnmount()}catch(m){We(s,t,m)}_n(e,t,s);break;case 21:_n(e,t,s);break;case 22:s.mode&1?(ht=(l=ht)||s.memoizedState!==null,_n(e,t,s),ht=l):_n(e,t,s);break;default:_n(e,t,s)}}function Hu(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var s=e.stateNode;s===null&&(s=e.stateNode=new Ef),t.forEach(function(l){var a=_f.bind(null,e,l);s.has(l)||(s.add(l),l.then(a,a))})}}function Gt(e,t){var s=t.deletions;if(s!==null)for(var l=0;la&&(a=d),l&=~u}if(l=a,l=Ye()-l,l=(120>l?120:480>l?480:1080>l?1080:1920>l?1920:3e3>l?3e3:4320>l?4320:1960*Df(l/1960))-l,10e?16:e,An===null)var l=!1;else{if(e=An,An=null,kl=0,(Te&6)!==0)throw Error(o(331));var a=Te;for(Te|=4,Y=e.current;Y!==null;){var u=Y,d=u.child;if((Y.flags&16)!==0){var m=u.deletions;if(m!==null){for(var g=0;gYe()-ia?rs(e,0):la|=s),kt(e,t)}function ic(e,t){t===0&&((e.mode&1)===0?t=1:(t=Mr,Mr<<=1,(Mr&130023424)===0&&(Mr=4194304)));var s=jt();e=yn(e,t),e!==null&&(Hs(e,t,s),kt(e,s))}function Of(e){var t=e.memoizedState,s=0;t!==null&&(s=t.retryLane),ic(e,s)}function _f(e,t){var s=0;switch(e.tag){case 13:var l=e.stateNode,a=e.memoizedState;a!==null&&(s=a.retryLane);break;case 19:l=e.stateNode;break;default:throw Error(o(314))}l!==null&&l.delete(t),ic(e,s)}var ac;ac=function(e,t,s){if(e!==null)if(e.memoizedProps!==t.pendingProps||bt.current)wt=!0;else{if((e.lanes&s)===0&&(t.flags&128)===0)return wt=!1,Nf(e,t,s);wt=(e.flags&131072)!==0}else wt=!1,Ve&&(t.flags&1048576)!==0&&zo(t,sl,t.index);switch(t.lanes=0,t.tag){case 2:var l=t.type;xl(e,t),e=t.pendingProps;var a=Es(t,ft.current);$s(t,s),a=_i(null,t,l,e,a,s);var u=Bi();return t.flags|=1,typeof a=="object"&&a!==null&&typeof a.render=="function"&&a.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,St(l)?(u=!0,el(t)):u=!1,t.memoizedState=a.state!==null&&a.state!==void 0?a.state:null,Di(t),a.updater=yl,t.stateNode=a,a._reactInternals=t,qi(t,l,e,s),t=Ji(null,t,l,!0,u,s)):(t.tag=0,Ve&&u&&vi(t),xt(null,t,a,s),t=t.child),t;case 16:l=t.elementType;e:{switch(xl(e,t),e=t.pendingProps,a=l._init,l=a(l._payload),t.type=l,a=t.tag=Af(l),e=Jt(l,e),a){case 0:t=Hi(null,t,l,e,s);break e;case 1:t=$u(null,t,l,e,s);break e;case 11:t=Iu(null,t,l,e,s);break e;case 14:t=Ru(null,t,l,Jt(l.type,e),s);break e}throw Error(o(306,l,""))}return t;case 0:return l=t.type,a=t.pendingProps,a=t.elementType===l?a:Jt(l,a),Hi(e,t,l,a,s);case 1:return l=t.type,a=t.pendingProps,a=t.elementType===l?a:Jt(l,a),$u(e,t,l,a,s);case 3:e:{if(Pu(t),e===null)throw Error(o(387));l=t.pendingProps,u=t.memoizedState,a=u.element,Wo(e,t),ul(t,l,null,s);var d=t.memoizedState;if(l=d.element,u.isDehydrated)if(u={element:l,isDehydrated:!1,cache:d.cache,pendingSuspenseBoundaries:d.pendingSuspenseBoundaries,transitions:d.transitions},t.updateQueue.baseState=u,t.memoizedState=u,t.flags&256){a=Ms(Error(o(423)),t),t=Mu(e,t,l,s,a);break e}else if(l!==a){a=Ms(Error(o(424)),t),t=Mu(e,t,l,s,a);break e}else for(Dt=Tn(t.stateNode.containerInfo.firstChild),Rt=t,Ve=!0,Ht=null,s=Ho(t,null,l,s),t.child=s;s;)s.flags=s.flags&-3|4096,s=s.sibling;else{if(Ds(),l===a){t=xn(e,t,s);break e}xt(e,t,l,s)}t=t.child}return t;case 5:return Xo(t),e===null&&wi(t),l=t.type,a=t.pendingProps,u=e!==null?e.memoizedProps:null,d=a.children,mi(l,a)?d=null:u!==null&&mi(l,u)&&(t.flags|=32),Lu(e,t),xt(e,t,d,s),t.child;case 6:return e===null&&wi(t),null;case 13:return Ou(e,t,s);case 4:return Ti(t,t.stateNode.containerInfo),l=t.pendingProps,e===null?t.child=Ts(t,null,l,s):xt(e,t,l,s),t.child;case 11:return l=t.type,a=t.pendingProps,a=t.elementType===l?a:Jt(l,a),Iu(e,t,l,a,s);case 7:return xt(e,t,t.pendingProps,s),t.child;case 8:return xt(e,t,t.pendingProps.children,s),t.child;case 12:return xt(e,t,t.pendingProps.children,s),t.child;case 10:e:{if(l=t.type._context,a=t.pendingProps,u=t.memoizedProps,d=a.value,Fe(il,l._currentValue),l._currentValue=d,u!==null)if(Kt(u.value,d)){if(u.children===a.children&&!bt.current){t=xn(e,t,s);break e}}else for(u=t.child,u!==null&&(u.return=t);u!==null;){var m=u.dependencies;if(m!==null){d=u.child;for(var g=m.firstContext;g!==null;){if(g.context===l){if(u.tag===1){g=gn(-1,s&-s),g.tag=2;var I=u.updateQueue;if(I!==null){I=I.shared;var P=I.pending;P===null?g.next=g:(g.next=P.next,P.next=g),I.pending=g}}u.lanes|=s,g=u.alternate,g!==null&&(g.lanes|=s),Ii(u.return,s,t),m.lanes|=s;break}g=g.next}}else if(u.tag===10)d=u.type===t.type?null:u.child;else if(u.tag===18){if(d=u.return,d===null)throw Error(o(341));d.lanes|=s,m=d.alternate,m!==null&&(m.lanes|=s),Ii(d,s,t),d=u.sibling}else d=u.child;if(d!==null)d.return=u;else for(d=u;d!==null;){if(d===t){d=null;break}if(u=d.sibling,u!==null){u.return=d.return,d=u;break}d=d.return}u=d}xt(e,t,a.children,s),t=t.child}return t;case 9:return a=t.type,l=t.pendingProps.children,$s(t,s),a=_t(a),l=l(a),t.flags|=1,xt(e,t,l,s),t.child;case 14:return l=t.type,a=Jt(l,t.pendingProps),a=Jt(l.type,a),Ru(e,t,l,a,s);case 15:return Du(e,t,t.type,t.pendingProps,s);case 17:return l=t.type,a=t.pendingProps,a=t.elementType===l?a:Jt(l,a),xl(e,t),t.tag=1,St(l)?(e=!0,el(t)):e=!1,$s(t,s),bu(t,l,a),qi(t,l,a,s),Ji(null,t,l,!0,e,s);case 19:return Bu(e,t,s);case 22:return Tu(e,t,s)}throw Error(o(156,t.tag))};function oc(e,t){return za(e,t)}function Bf(e,t,s,l){this.tag=e,this.key=s,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=l,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function zt(e,t,s,l){return new Bf(e,t,s,l)}function ma(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Af(e){if(typeof e=="function")return ma(e)?1:0;if(e!=null){if(e=e.$$typeof,e===z)return 11;if(e===ye)return 14}return 2}function Qn(e,t){var s=e.alternate;return s===null?(s=zt(e.tag,t,e.key,e.mode),s.elementType=e.elementType,s.type=e.type,s.stateNode=e.stateNode,s.alternate=e,e.alternate=s):(s.pendingProps=t,s.type=e.type,s.flags=0,s.subtreeFlags=0,s.deletions=null),s.flags=e.flags&14680064,s.childLanes=e.childLanes,s.lanes=e.lanes,s.child=e.child,s.memoizedProps=e.memoizedProps,s.memoizedState=e.memoizedState,s.updateQueue=e.updateQueue,t=e.dependencies,s.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},s.sibling=e.sibling,s.index=e.index,s.ref=e.ref,s}function Rl(e,t,s,l,a,u){var d=2;if(l=e,typeof e=="function")ma(e)&&(d=1);else if(typeof e=="string")d=5;else e:switch(e){case J:return is(s.children,a,u,t);case oe:d=8,a|=8;break;case be:return e=zt(12,s,t,a|2),e.elementType=be,e.lanes=u,e;case X:return e=zt(13,s,t,a),e.elementType=X,e.lanes=u,e;case K:return e=zt(19,s,t,a),e.elementType=K,e.lanes=u,e;case he:return Dl(s,a,u,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case De:d=10;break e;case ie:d=9;break e;case z:d=11;break e;case ye:d=14;break e;case we:d=16,l=null;break e}throw Error(o(130,e==null?e:typeof e,""))}return t=zt(d,s,t,a),t.elementType=e,t.type=l,t.lanes=u,t}function is(e,t,s,l){return e=zt(7,e,l,t),e.lanes=s,e}function Dl(e,t,s,l){return e=zt(22,e,l,t),e.elementType=he,e.lanes=s,e.stateNode={isHidden:!1},e}function ha(e,t,s){return e=zt(6,e,null,t),e.lanes=s,e}function ya(e,t,s){return t=zt(4,e.children!==null?e.children:[],e.key,t),t.lanes=s,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function zf(e,t,s,l,a){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Ul(0),this.expirationTimes=Ul(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Ul(0),this.identifierPrefix=l,this.onRecoverableError=a,this.mutableSourceEagerHydrationData=null}function ga(e,t,s,l,a,u,d,m,g){return e=new zf(e,t,s,m,g),t===1?(t=1,u===!0&&(t|=8)):t=0,u=zt(3,null,null,t),e.current=u,u.stateNode=e,u.memoizedState={element:l,isDehydrated:s,cache:null,transitions:null,pendingSuspenseBoundaries:null},Di(u),e}function Ff(e,t,s){var l=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(r)}catch(i){console.error(i)}}return r(),wa.exports=tp(),wa.exports}var Sc;function sp(){if(Sc)return _l;Sc=1;var r=np();return _l.createRoot=r.createRoot,_l.hydrateRoot=r.hydrateRoot,_l}var rp=sp();const lp=_c(rp);class Bl extends Error{constructor(i,o,c){super(i),this.code=o,this.status=c,this.name="DashboardRequestError"}}const Da=new Set;let Rr;function ip(){return Rr}function ap(r){return Da.add(r),Rr&&r(Rr),()=>{Da.delete(r)}}async function W(r,i={}){return Pa(r,o=>o.json(),i)}async function op(r,i={}){return Pa(r,o=>o.text(),i)}async function us(r,i={}){return Pa(r,async()=>{},i)}async function Pa(r,i,o={}){const c=o.timeoutMs??5e3,f=o.method??"GET",p=new AbortController,y=window.setTimeout(()=>p.abort(),c),v={Accept:"application/json"};o.body!==void 0&&(v["Content-Type"]="application/json");try{Cr({path:r,status:"pending"});const b=await fetch(r,{headers:v,body:o.body===void 0?void 0:JSON.stringify(o.body),method:f,signal:p.signal});if(!b.ok){const C=await up(b);throw Cr({path:r,status:"error",statusCode:b.status,message:C}),new Bl(C,b.status===503?"disabled":"http",b.status)}const N=await i(b);return Cr({path:r,status:"success",statusCode:b.status}),N}catch(b){if(b instanceof Bl)throw b;if(b instanceof DOMException&&b.name==="AbortError")throw Cr({path:r,status:"error",message:"Dashboard request timed out"}),new Bl("Dashboard request timed out","timeout");const N=b instanceof Error?b.message:"Dashboard request failed";throw Cr({path:r,status:"error",message:N}),new Bl(N,"network")}finally{window.clearTimeout(y)}}function Cr(r){Rr={...r,at:new Date().toISOString()},Da.forEach(i=>i(Rr))}async function up(r){if((r.headers.get("Content-Type")??"").includes("application/json")){const c=await r.json().catch(()=>{}),f=(c==null?void 0:c.error)??(c==null?void 0:c.message);if(typeof f=="string"&&f.trim()!=="")return f}const o=await r.text().catch(()=>"");return o.trim()!==""?o.trim():`Dashboard request failed with status ${r.status}`}async function cp(r=5e3){return W("/api/dashboard/services",{timeoutMs:r})}let qn=Bc();function Bc(){return{status:"pending",promise:cp().then(i=>{qn={status:"success",value:i}}).catch(i=>{qn={status:"error",error:i}})}}function dp(){if(qn.status==="pending")throw qn.promise;if(qn.status==="error")throw qn.error;return qn.value}function fp(){qn=Bc()}function ue({children:r,className:i,type:o="button",...c}){return n.jsx("button",{className:i?`button ${i}`:"button",type:o,...c,children:r})}function Q({title:r,description:i,actionLabel:o,onAction:c}){return n.jsxs("div",{className:"empty-state",children:[n.jsx("strong",{children:r}),n.jsx("p",{children:i}),o&&c?n.jsx(ue,{onClick:c,children:o}):null]})}function Ne({title:r,children:i}){return n.jsxs("section",{className:"panel",children:[r?n.jsx("header",{className:"panel-head",children:n.jsx("h2",{children:r})}):null,n.jsx("div",{className:"panel-body",children:i})]})}const vn="/dashboard";function Ir(r){return r===vn||r===`${vn}/`?"/":r.startsWith(`${vn}/`)?r.slice(vn.length)||"/":r}function Al(r,i=window.location.pathname){return r===vn||r.startsWith(`${vn}/`)||!i.startsWith(vn)?r:r==="/"?`${vn}/`:`${vn}${r}`}function pp({services:r}){const i=r.filter(c=>c.status==="running").length,o=r.filter(c=>c.status==="disabled").length;return r.length===0?n.jsx("section",{className:"service-index-page","aria-label":"Services",children:n.jsx(Q,{title:"No dashboard services",description:"Configured services will appear here when they are available."})}):n.jsxs("section",{className:"service-index-page","aria-label":"Services",children:[n.jsxs("header",{className:"service-index-summary",children:[n.jsxs("div",{children:[n.jsx("h1",{children:"Services"}),n.jsx("p",{children:"Local dashboard registry from /api/dashboard/services."})]}),n.jsxs("dl",{className:"health-summary","aria-label":"Service health summary",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"Running"}),n.jsx("dd",{children:i})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Disabled"}),n.jsx("dd",{children:o})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Total"}),n.jsx("dd",{children:r.length})]})]})]}),n.jsx("div",{className:"service-index",children:r.map(c=>n.jsx("a",{className:"service-card",href:Al(c.path),children:n.jsxs(Ne,{children:[n.jsxs("div",{className:"service-card-head",children:[n.jsx("h2",{children:c.name}),n.jsx("span",{className:`service-status ${c.status}`,children:c.status})]}),n.jsx("p",{children:c.description}),c.endpoint?n.jsxs("dl",{className:"endpoint-summary",children:[n.jsx("dt",{children:"Endpoint"}),n.jsx("dd",{children:n.jsx("code",{children:c.endpoint})})]}):null]})},c.id))})]})}const Ac=h.createContext(null);function mp({children:r}){const[i,o]=h.useState(null),c=h.useCallback(p=>new Promise(y=>{o({options:p,resolve:y})}),[]),f=h.useCallback(p=>{o(y=>(y==null||y.resolve(p),null))},[]);return n.jsxs(Ac.Provider,{value:c,children:[r,i?n.jsx(hp,{options:i.options,onCancel:()=>f(!1),onConfirm:()=>f(!0)}):null]})}function Dr(){const r=h.useContext(Ac);if(!r)throw new Error("useConfirm must be called inside ");return r}function hp({options:r,onCancel:i,onConfirm:o}){const c=h.useId(),f=h.useId(),p=h.useId(),y=r.confirmLabel??"Confirm",v=r.cancelLabel??"Cancel",b=r.tone??"default",N=r.requirePhrase??"",[C,w]=h.useState(""),L=h.useRef(null),E=N===""||C===N;h.useEffect(()=>{w("")},[r]),h.useEffect(()=>{N!==""&&L.current&&L.current.focus()},[N]),h.useEffect(()=>{function T(U){if(U.key==="Escape")U.preventDefault(),i();else if(U.key==="Enter"&&E){const V=U.target;if((V==null?void 0:V.tagName)==="TEXTAREA")return;U.preventDefault(),o()}}return document.addEventListener("keydown",T),()=>document.removeEventListener("keydown",T)},[i,o,E]);function D(T){T.target===T.currentTarget&&i()}return n.jsx("div",{className:"confirm-backdrop",onMouseDown:D,role:"presentation",children:n.jsxs("section",{"aria-describedby":r.description||r.detail?f:void 0,"aria-labelledby":c,"aria-modal":"true",className:`confirm-dialog tone-${b}`,role:"alertdialog",children:[n.jsx("h2",{className:"confirm-title",id:c,children:r.title}),r.description||r.detail?n.jsxs("div",{className:"confirm-body",id:f,children:[r.description?n.jsx("p",{className:"confirm-description",children:r.description}):null,r.detail?n.jsx("p",{className:"confirm-detail",children:r.detail}):null]}):null,N!==""?n.jsxs("div",{className:"confirm-phrase",children:[n.jsx("label",{htmlFor:p,children:r.requirePhraseLabel??n.jsxs(n.Fragment,{children:["Type ",n.jsx("code",{children:N})," to confirm"]})}),n.jsx("input",{autoComplete:"off",autoCorrect:"off",className:"confirm-phrase-input",id:p,onChange:T=>w(T.target.value),ref:L,spellCheck:!1,type:"text",value:C})]}):null,n.jsxs("div",{className:"confirm-actions",children:[n.jsx(ue,{onClick:i,type:"button",children:v}),n.jsx(ue,{autoFocus:N==="",className:b==="danger"?"danger primary":"primary",disabled:!E,onClick:o,type:"button",children:y})]})]})})}function bn(r){return{title:r.title,description:r.description,detail:n.jsxs(n.Fragment,{children:["Target: ",n.jsx("code",{children:r.target})]}),confirmLabel:r.confirmLabel??"Delete",tone:"danger",requirePhrase:r.target}}const wc=[1e3,2e3,4e3,8e3,16e3,3e4];function yp(){return`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/api/events`}class gp{constructor(){as(this,"ws",null);as(this,"listeners",new Map);as(this,"nextID",0);as(this,"retryIndex",0);as(this,"retryTimeout",null)}subscribe(i,o){const c=this.nextID;this.nextID+=1,this.listeners.set(c,{topics:new Set(i),cb:o}),this.ensureOpen();let f=!1;return()=>{f||(f=!0,this.listeners.delete(c),this.listeners.size===0&&this.close())}}ensureOpen(){this.ws||this.connect()}connect(){if(typeof WebSocket>"u")return;let i;try{i=new WebSocket(yp())}catch{this.scheduleReconnect();return}this.ws=i,i.onopen=()=>{this.retryIndex=0},i.onmessage=c=>{try{const f=JSON.parse(c.data);if(f.type==="ready")return;this.dispatch(f)}catch{}};const o=()=>{this.ws===i&&(this.ws=null,this.listeners.size!==0&&this.scheduleReconnect())};i.onerror=o,i.onclose=o}scheduleReconnect(){if(this.retryTimeout!==null)return;const i=wc[Math.min(this.retryIndex,wc.length-1)];this.retryIndex+=1,this.retryTimeout=window.setTimeout(()=>{this.retryTimeout=null,this.listeners.size>0&&!this.ws&&this.connect()},i)}dispatch(i){for(const o of this.listeners.values())if(!(o.topics.size>0&&!o.topics.has(i.service)))try{o.cb(i)}catch{}}close(){if(this.retryTimeout!==null&&(window.clearTimeout(this.retryTimeout),this.retryTimeout=null),this.ws){this.ws.onerror=null,this.ws.onclose=null;try{this.ws.close(1e3,"no listeners")}catch{}}this.ws=null,this.retryIndex=0}}const xp=new gp;function jp(r,i){return xp.subscribe(r,i)}function cn({topics:r,onEvent:i,enabled:o=!0}){const c=h.useRef(i);h.useEffect(()=>{c.current=i},[i]);const f=r.slice().sort().join(",");h.useEffect(()=>{if(!o)return;const p=f?f.split(","):[];return jp(p,v=>{c.current(v)})},[f,o])}async function vp(){return W("/api/messages")}async function bp(r){return W(`/api/messages/${encodeURIComponent(r)}`)}async function Sp(r){return op(`/api/messages/${encodeURIComponent(r)}/raw`)}async function wp(){return us("/api/messages",{method:"DELETE"})}function cs(r){return!r||r.indexOf("=?")===-1?r:r.replace(/=\?([^?]+)\?([BbQq])\?([^?]*)\?=(\s+(?==\?))?/g,(i,o,c,f)=>{try{const p=c.toUpperCase()==="B"?Np(f):kp(f);return new TextDecoder(Cp(o)).decode(p)}catch{return i}})}function Sn(r){return r?cs(r).trim():""}function Np(r){const i=atob(r.replace(/\s+/g,"")),o=new Uint8Array(i.length);for(let c=0;c{if(b){c({status:"success",messages:[]});return}c({status:"loading"}),vp().then(({messages:D})=>{c({status:"success",messages:D}),p(T=>{var U;return T??((U=D[0])==null?void 0:U.id)})}).catch(D=>{c({status:"error",message:D.message})})},[b]);cn({topics:["mail"],onEvent:N,enabled:!b});async function C(){b||!await i(bn({title:"Clear inbox",description:"Delete all stored Mail messages from this local devcloud inbox.",target:"CLEAR INBOX",confirmLabel:"Clear inbox"}))||(c({status:"loading"}),wp().then(()=>{p(void 0),c({status:"success",messages:[]})}).catch(T=>{c({status:"error",message:T.message})}))}h.useEffect(()=>{N()},[N]);const w=o.status==="success"?o.messages:[],L=h.useMemo(()=>Pp(w,y),[w,y]),E=L.find(D=>D.id===f)??L[0]??(y.trim()===""?w[0]:void 0);return b?n.jsx(Ne,{title:"Mail",children:n.jsx(Q,{title:"Mail is disabled",description:"Enable services.mail.enabled in .devcloud/config.yaml to inspect received messages."})}):n.jsxs("div",{className:"mail-shell",children:[n.jsxs(Ne,{title:"Inbox",children:[n.jsxs("div",{className:"mail-inbox-toolbar",children:[n.jsxs("label",{className:"mail-inbox-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter messages",onChange:D=>v(D.target.value),placeholder:"sender, recipient, subject",type:"search",value:y})]}),n.jsxs("div",{className:"mail-inbox-actions",children:[n.jsx(ue,{onClick:N,children:"Refresh"}),n.jsx(ue,{className:"danger",disabled:w.length===0,onClick:C,children:"Clear all"})]})]}),o.status==="loading"?n.jsx(Q,{title:"Loading messages",description:"Reading the local Mail inbox."}):null,o.status==="error"?n.jsx(Q,{title:"Mail messages unavailable",description:o.message,actionLabel:"Retry",onAction:N}):null,o.status==="success"?n.jsx(Ip,{messages:L,selectedID:E==null?void 0:E.id,totalMessages:w.length,onSelectMessage:p}):null]}),n.jsx(Ne,{title:"Message",children:n.jsx(Rp,{message:E})})]})}function Ip({messages:r,selectedID:i,totalMessages:o,onSelectMessage:c}){return o===0?n.jsx(Q,{title:"Inbox is empty",description:"Send mail to localhost:1025 (relaxed SMTP AUTH) and refresh."}):r.length===0?n.jsx(Q,{title:"No matches",description:"Try a different filter or clear the search."}):n.jsx("ul",{className:"mail-inbox-list","aria-label":"Messages",children:r.map(f=>{const p=f.id===i,y=cs(f.subject)||"(No subject)",v=Sn(f.from)||"(unknown sender)",b=zc(f);return n.jsx("li",{children:n.jsxs("button",{"aria-current":p?"true":void 0,className:p?"mail-inbox-row active":"mail-inbox-row",onClick:()=>c(f.id),type:"button",children:[n.jsxs("span",{className:"mail-inbox-row-top",children:[n.jsx("span",{className:"mail-inbox-sender",children:v}),n.jsx("time",{className:"mail-inbox-time",dateTime:f.receivedAt,title:Ta(f.receivedAt),children:Fc(f.receivedAt)})]}),n.jsx("span",{className:"mail-inbox-subject",children:y}),b?n.jsx("span",{className:"mail-inbox-snippet",children:b}):null]})},f.id)})})}function Rp({message:r}){const[i,o]=h.useState("preview"),[c,f]=h.useState(!1);if(h.useEffect(()=>{o("preview"),f(!1)},[r==null?void 0:r.id]),!r)return n.jsx(Q,{title:"Select a message",description:"Messages accepted via SMTP appear here. Pick a row on the left to inspect."});const p=cs(r.subject)||"(No subject)",y=Sn(r.from),v=r.to.map(Sn).filter(Boolean),b=Ca(r.headers,"Cc"),N=Ca(r.headers,"Bcc"),C=Ca(r.headers,"Reply-To"),w=r.attachments??[],L=r.textBody||r.htmlBody||r.parseError||"",E=L.trim().length>0,D=[{id:"preview",label:"Preview"},{id:"attachments",label:"Attachments",count:w.length},{id:"raw",label:"Raw"}];return n.jsxs("article",{className:"mail-inspector",children:[n.jsxs("header",{className:"mail-inspector-header",children:[n.jsx("h1",{className:"mail-subject",children:p}),n.jsxs("dl",{className:"mail-recipients",children:[n.jsx(Er,{label:"From",values:y?[y]:["(unknown sender)"]}),n.jsx(Er,{label:"To",values:v.length>0?v:["(no recipients)"]}),b.length>0?n.jsx(Er,{label:"Cc",values:b}):null,N.length>0?n.jsx(Er,{label:"Bcc",values:N}):null,C.length>0?n.jsx(Er,{label:"Reply-To",values:C}):null,n.jsxs("div",{className:"mail-recipients-row",children:[n.jsx("dt",{children:"Date"}),n.jsxs("dd",{children:[n.jsx("time",{dateTime:r.receivedAt,title:Ta(r.receivedAt),children:Ta(r.receivedAt)}),n.jsxs("span",{className:"mail-recipients-aux",children:["· ",Fc(r.receivedAt)]})]})]})]})]}),n.jsx("nav",{className:"mail-tabs",role:"tablist","aria-label":"Message view",children:D.map(T=>n.jsxs("button",{role:"tab","aria-selected":i===T.id,className:i===T.id?"mail-tab active":"mail-tab",onClick:()=>o(T.id),type:"button",children:[T.label,T.count!==void 0&&T.count>0?n.jsx("span",{className:"mail-tab-count",children:T.count}):null]},T.id))}),i==="preview"?n.jsx(Dp,{body:L,hasBody:E,parseError:r.parseError}):null,i==="attachments"?n.jsx(Tp,{attachments:w}):null,i==="raw"?n.jsx(Lp,{messageID:r.id}):null,n.jsxs("details",{className:"mail-headers",open:c,onToggle:T=>f(T.target.open),children:[n.jsxs("summary",{children:[n.jsx("span",{children:"Headers"}),n.jsx("span",{className:"mail-headers-count",children:Object.keys(r.headers??{}).length})]}),n.jsx($p,{headers:r.headers??{}})]})]})}function Er({label:r,values:i}){return n.jsxs("div",{className:"mail-recipients-row",children:[n.jsx("dt",{children:r}),n.jsx("dd",{children:i.join(", ")})]})}function Dp({body:r,hasBody:i,parseError:o}){return!i&&!o?n.jsx(Q,{title:"No body",description:"The message contains no decoded text content."}):o&&!i?n.jsxs("div",{className:"mail-preview-error",children:[n.jsx("span",{className:"mail-eyebrow",children:"Parse error"}),n.jsx("p",{children:o})]}):n.jsx("div",{className:"mail-preview",lang:"auto",children:Op(r)})}function Tp({attachments:r}){return r.length===0?n.jsx(Q,{title:"No attachments",description:"This message has no parsed attachments."}):n.jsx("ul",{className:"mail-attachment-list","aria-label":"Attachments",children:r.map(i=>n.jsxs("li",{className:"mail-attachment-item",children:[n.jsx("span",{className:"mail-attachment-icon","aria-hidden":"true",children:_p(i.contentType)}),n.jsxs("div",{className:"mail-attachment-body",children:[n.jsx("span",{className:"mail-attachment-name",children:i.fileName||i.id}),n.jsxs("span",{className:"mail-attachment-meta",children:[i.contentType||"application/octet-stream"," · ",Bp(i.size)]})]})]},i.id))})}function Lp({messageID:r}){const[i,o]=h.useState({status:"loading"});if(h.useEffect(()=>{let p=!1;return o({status:"loading"}),Sp(r).then(y=>{p||o({status:"success",raw:y})}).catch(y=>{p||o({status:"error",message:y.message})}),()=>{p=!0}},[r]),i.status==="loading")return n.jsx(Q,{title:"Loading raw source",description:"Reading the stored RFC 822 message."});if(i.status==="error")return n.jsx(Q,{title:"Raw source unavailable",description:i.message});const c=i.raw;function f(){navigator.clipboard&&navigator.clipboard.writeText(c).catch(()=>{})}return n.jsxs("div",{className:"mail-raw",children:[n.jsxs("div",{className:"mail-raw-toolbar",children:[n.jsxs("span",{className:"mail-raw-meta",children:[c.length.toLocaleString()," bytes"]}),n.jsx("button",{className:"mail-raw-copy",onClick:f,type:"button",children:"Copy"})]}),n.jsx("pre",{className:"mail-raw-pre",children:c||"(empty)"})]})}function $p({headers:r}){const i=Object.entries(r).sort(([o],[c])=>o.localeCompare(c));return i.length===0?n.jsx("p",{className:"mail-headers-empty",children:"No parsed headers."}):n.jsx("table",{className:"mail-headers-table",children:n.jsx("tbody",{children:i.map(([o,c])=>n.jsxs("tr",{children:[n.jsx("th",{scope:"row",children:o}),n.jsx("td",{children:c.map(cs).join(", ")})]},o))})})}function Pp(r,i){const o=i.trim().toLowerCase();return o===""?r:r.filter(c=>[cs(c.subject),Sn(c.from),...c.to.map(Sn),zc(c)].join(" ").toLowerCase().includes(o))}function zc(r){return(r.textBody||r.htmlBody||r.parseError||"").replace(/\s+/g," ").trim()}function Ca(r,i){if(!r)return[];const o=i.toLowerCase();for(const[c,f]of Object.entries(r))if(c.toLowerCase()===o)return f.flatMap(p=>Mp(p)).map(Sn).filter(Boolean);return[]}function Mp(r){return r.split(/,(?![^<]*>)/).map(i=>i.trim()).filter(i=>i.length>0)}function Op(r){const i=[],o=/(https?:\/\/[^\s<>"']+)|((?:[a-zA-Z0-9._%+-]+)@(?:[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}))/g;let c=0,f=0,p=o.exec(r);for(;p!==null;){const v=r.slice(c,p.index);v&&(f+=1,i.push(n.jsx("span",{children:v},`t-${f}`))),f+=1,p[1]?i.push(n.jsx("a",{href:p[1],rel:"noopener noreferrer",target:"_blank",children:p[1]},`l-${f}`)):i.push(n.jsx("a",{href:`mailto:${p[2]}`,children:p[2]},`m-${f}`)),c=o.lastIndex,p=o.exec(r)}const y=r.slice(c);return y&&(f+=1,i.push(n.jsx("span",{children:y},`t-${f}`))),i}function _p(r){if(!r)return"📎";const i=r.toLowerCase();return i.startsWith("image/")?"🖼":i==="application/pdf"?"📄":i.startsWith("audio/")?"🎵":i.startsWith("video/")?"🎬":i.includes("zip")||i.includes("tar")||i.includes("gzip")?"🗜":i.startsWith("text/")?"📝":"📎"}function Ta(r){const i=new Date(r);return Number.isNaN(i.getTime())?r||"unknown":i.toLocaleString()}function Fc(r){const i=new Date(r);if(Number.isNaN(i.getTime()))return r||"unknown";const o=Date.now()-i.getTime();if(o<0)return"in the future";const c=Math.floor(o/1e3);if(c<60)return"just now";const f=Math.floor(c/60);if(f<60)return`${f}m ago`;const p=Math.floor(f/60);if(p<24)return`${p}h ago`;const y=Math.floor(p/24);return y<7?`${y}d ago`:i.toLocaleDateString()}function Bp(r){if(!Number.isFinite(r)||r<0)return"unknown";if(r<1024)return`${r} B`;const i=["KB","MB","GB","TB"];let o=r/1024,c=0;for(;o>=1024&&c=10?0:1)} ${i[c]}`}function Ap({buckets:r,activeBucket:i,disabled:o,onDeleteBucket:c,onSelectBucket:f}){return r.length===0?n.jsx(Q,{title:"No buckets",description:"Buckets created through the S3 API will appear here."}):n.jsx("ul",{className:"s3-bucket-list","aria-label":"S3 buckets",children:r.map(p=>{const y=p.name===i,v=qp(p.creationDate),b=Qp(p.objectCount),N=`${p.name} -${b} · created ${Up(p.creationDate)}`;return n.jsxs("li",{className:y?"s3-bucket-row active":"s3-bucket-row",title:N,children:[n.jsxs("button",{className:"s3-bucket-select",onClick:()=>f(p.name),title:N,type:"button",children:[n.jsx("span",{className:"s3-bucket-icon","aria-hidden":!0,children:n.jsx(zp,{})}),n.jsxs("span",{className:"s3-bucket-info",children:[n.jsx("span",{className:"s3-bucket-name",title:p.name,children:p.name}),n.jsxs("span",{className:"s3-bucket-meta",children:[b," · ",v]})]})]}),n.jsx("button",{"aria-label":`Delete bucket ${p.name}`,className:"s3-icon-button danger s3-bucket-delete",disabled:o,onClick:()=>c(p.name),type:"button",children:n.jsx(Fp,{})})]},p.name)})})}function zp(){return n.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M2.5 4.5h11l-1 8.5a1 1 0 0 1-1 .9H4.5a1 1 0 0 1-1-.9z"}),n.jsx("path",{d:"M2.5 4.5L4 2.5h8l1.5 2"}),n.jsx("path",{d:"M6 7v4"}),n.jsx("path",{d:"M10 7v4"})]})}function Fp(){return n.jsxs("svg",{"aria-hidden":!0,width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M2.5 4h11"}),n.jsx("path",{d:"M6 4V2.5h4V4"}),n.jsx("path",{d:"M4 4l.7 9.2a1 1 0 0 0 1 .9h4.6a1 1 0 0 0 1-.9L12 4"}),n.jsx("path",{d:"M6.5 7v5"}),n.jsx("path",{d:"M9.5 7v5"})]})}function Qp(r){return!Number.isFinite(r)||r<0?"— objects":r===1?"1 object":`${r} objects`}function Up(r){const i=new Date(r);return Number.isNaN(i.getTime())?r||"unknown":i.toLocaleString()}function qp(r){const i=new Date(r);if(Number.isNaN(i.getTime()))return"created —";const o=Date.now()-i.getTime(),c=60*1e3,f=60*c,p=24*f,y=7*p,v=30*p,b=365*p;return o"")).trim()||`S3 mutation failed with status ${r.status}`}function tm({bucketName:r,activeObjectKey:i,disabled:o,refreshNonce:c,onClearObject:f,onDeleteObject:p,onUploadObject:y,onSelectObject:v}){const[b,N]=h.useState(""),[C,w]=h.useState({status:"idle"});if(h.useEffect(()=>{if(f(),!r){w({status:"idle"});return}let E=!1;return w({status:"loading"}),Jp(r,b.trim()).then(({objects:D})=>{E||w({status:"success",objects:D})}).catch(D=>{E||w({status:"error",message:D.message})}),()=>{E=!0}},[r,f,b,c]),!r)return n.jsx(Q,{title:"Select a bucket",description:"Choose a bucket to browse its objects."});const L=C.status==="success"?C.objects:[];return n.jsxs("div",{className:"s3-browser",children:[n.jsxs("div",{className:"s3-browser-toolbar",children:[n.jsx(sm,{prefix:b,onChange:N}),n.jsx(rm,{disabled:o,onUploadObject:y})]}),n.jsx(nm,{bucketName:r,disabled:o}),C.status==="loading"?n.jsx(Q,{title:"Loading objects",description:`Reading objects in ${r}.`}):null,C.status==="error"?n.jsx(Q,{title:"Objects unavailable",description:C.message}):null,C.status==="success"&&L.length===0?n.jsx(Q,{title:"No objects",description:b.trim()===""?`Objects uploaded to ${r} will appear here.`:`No objects in ${r} match this prefix.`}):null,C.status==="success"&&L.length>0?n.jsx("div",{className:"s3-object-table-wrap",children:n.jsxs("table",{className:"s3-object-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Key"}),n.jsx("th",{scope:"col",children:"Size"}),n.jsx("th",{scope:"col",children:"Modified"}),n.jsx("th",{scope:"col",children:"Type"}),n.jsx("th",{"aria-label":"Row actions",className:"s3-object-actions-head",scope:"col"})]})}),n.jsx("tbody",{children:L.map(E=>{const D=E.key===i;return n.jsxs("tr",{className:D?"s3-object-row active":"s3-object-row",children:[n.jsx("td",{children:n.jsx("button",{className:"s3-object-key",onClick:()=>v(E),title:E.key,type:"button",children:E.key})}),n.jsx("td",{className:"s3-object-numeric",children:im(E.size)}),n.jsx("td",{className:"s3-object-numeric",children:Uc(E.lastModified)}),n.jsx("td",{className:"s3-object-type",children:E.contentType||"application/octet-stream"}),n.jsxs("td",{className:"s3-object-actions",children:[n.jsx("a",{"aria-label":`Download ${E.key}`,className:"s3-icon-button neutral",href:am(E.downloadUrl),title:"Download",children:n.jsx(cm,{})}),n.jsx("button",{"aria-label":`Delete ${E.key}`,className:"s3-icon-button danger",disabled:o,onClick:()=>p(E),title:"Delete",type:"button",children:n.jsx(dm,{})})]})]},E.key)})})]})}):null]})}function nm({bucketName:r,disabled:i}){const[o,c]=h.useState({status:"loading"}),[f,p]=h.useState(0),[y,v]=h.useState(""),b=Dr();h.useEffect(()=>{let C=!1;return c({status:"loading"}),Gp(r).then(({uploads:w})=>{C||c({status:"success",uploads:w})}).catch(w=>{C||c({status:"error",message:w.message})}),()=>{C=!0}},[r,f]);async function N(C){if(!(i||y!==""||!await b(bn({title:"Abort multipart upload",description:"Pending parts will be discarded and the upload will be unrecoverable.",target:C.uploadId,confirmLabel:"Abort upload"})))){v(C.uploadId);try{await Yp(r,C.uploadId),p(L=>L+1)}finally{v("")}}}return o.status!=="success"||o.uploads.length===0?null:n.jsxs("details",{className:"s3-multipart-details",children:[n.jsxs("summary",{children:[n.jsx("span",{children:"Incomplete multipart uploads"}),n.jsx("span",{className:"s3-multipart-count",children:o.uploads.length})]}),n.jsx("ul",{className:"s3-multipart-list",children:o.uploads.map(C=>n.jsxs("li",{className:"s3-multipart-item",children:[n.jsxs("div",{className:"s3-multipart-meta",children:[n.jsx("strong",{children:C.key}),n.jsx("code",{children:C.uploadId}),n.jsx("span",{children:Uc(C.initiated)})]}),n.jsx(ue,{"aria-label":`Abort multipart upload ${C.uploadId} with confirmation`,className:"danger",disabled:i||y!=="",onClick:()=>void N(C),children:y===C.uploadId?"Aborting":"Abort"})]},C.uploadId))})]})}function sm({prefix:r,onChange:i}){return n.jsxs("label",{className:"s3-search",children:[n.jsx(om,{}),n.jsx("input",{"aria-label":"Filter objects by prefix",onChange:o=>i(o.target.value),placeholder:"Filter by prefix (e.g. docs/)",type:"search",value:r})]})}function rm({disabled:r,onUploadObject:i}){const o=h.useRef(null),[c,f]=h.useState(""),[p,y]=h.useState(""),[v,b]=h.useState(""),[N,C]=h.useState(!1),w=h.useRef(null);async function L(E){var T,U;E.preventDefault();const D=(U=(T=o.current)==null?void 0:T.files)==null?void 0:U[0];if(!(r||N||c.trim()===""||!D)){C(!0);try{await i({key:c.trim(),file:D,contentType:p.trim()||D.type||"application/octet-stream",metadata:lm(v)}),f(""),y(""),b(""),o.current&&(o.current.value=""),w.current&&(w.current.open=!1)}finally{C(!1)}}}return n.jsxs("details",{className:"s3-upload-details",ref:w,children:[n.jsxs("summary",{children:[n.jsx(um,{}),n.jsx("span",{children:"Upload object"})]}),n.jsxs("form",{className:"s3-upload-form",onSubmit:L,children:[n.jsxs("label",{className:"s3-field",children:[n.jsx("span",{children:"Key"}),n.jsx("input",{"aria-label":"S3 upload object key",className:"s3-text-input",disabled:r||N,onChange:E=>f(E.target.value),placeholder:"docs/readme.txt",value:c})]}),n.jsxs("label",{className:"s3-field",children:[n.jsx("span",{children:"Content-Type"}),n.jsx("input",{"aria-label":"S3 upload content type",className:"s3-text-input",disabled:r||N,onChange:E=>y(E.target.value),placeholder:"text/plain",value:p})]}),n.jsxs("label",{className:"s3-field s3-field-full",children:[n.jsx("span",{children:"File"}),n.jsx("input",{"aria-label":"S3 upload file",className:"s3-file-input",disabled:r||N,ref:o,type:"file"})]}),n.jsxs("label",{className:"s3-field s3-field-full",children:[n.jsx("span",{children:"Metadata (x-amz-meta)"}),n.jsx("textarea",{"aria-label":"S3 upload metadata",className:"s3-text-input",disabled:r||N,onChange:E=>b(E.target.value),placeholder:`source=dashboard -purpose=local-test`,rows:2,value:v})]}),n.jsx("div",{className:"s3-upload-actions",children:n.jsx(ue,{disabled:r||N||c.trim()==="",type:"submit",children:N?"Uploading…":"Upload"})})]})]})}function lm(r){return r.split(/\r?\n/).reduce((i,o)=>{const c=o.trim();if(c==="")return i;const[f,...p]=c.split("="),y=f.trim(),v=p.join("=").trim();return y!==""&&(i[y]=v),i},{})}function im(r){if(!Number.isFinite(r)||r<0)return"unknown";if(r<1024)return`${r} B`;const i=["KB","MB","GB","TB"];let o=r/1024,c=0;for(;o>=1024&&c=10?0:1)} ${i[c]}`}function Uc(r){const i=new Date(r);return Number.isNaN(i.getTime())?r||"unknown":i.toLocaleString()}function am(r){return r.startsWith("/api/s3/")?r:"#"}function om(){return n.jsxs("svg",{"aria-hidden":!0,width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("circle",{cx:"7",cy:"7",r:"4.5"}),n.jsx("path",{d:"M13.5 13.5L10.5 10.5"})]})}function um(){return n.jsxs("svg",{"aria-hidden":!0,width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",children:[n.jsx("path",{d:"M8 3v10"}),n.jsx("path",{d:"M3 8h10"})]})}function cm(){return n.jsxs("svg",{"aria-hidden":!0,width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M8 2.5v8"}),n.jsx("path",{d:"M4.5 7L8 10.5 11.5 7"}),n.jsx("path",{d:"M3 13h10"})]})}function dm(){return n.jsxs("svg",{"aria-hidden":!0,width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M2.5 4h11"}),n.jsx("path",{d:"M6 4V2.5h4V4"}),n.jsx("path",{d:"M4 4l.7 9.2a1 1 0 0 0 1 .9h4.6a1 1 0 0 0 1-.9L12 4"}),n.jsx("path",{d:"M6.5 7v5"}),n.jsx("path",{d:"M9.5 7v5"})]})}function fm({bucketName:r,disabled:i,object:o,onCopyObject:c}){if(!o)return n.jsxs("div",{className:"s3-inspector-empty",children:[n.jsx(gm,{}),n.jsx("p",{className:"s3-inspector-empty-title",children:"No object selected"}),n.jsx("p",{className:"s3-inspector-empty-body",children:r?`Pick an object in ${r} to see metadata, copy, and download actions.`:"Select a bucket first, then click an object to inspect it here."})]});const f=Object.entries(o.metadata??{});return n.jsxs("div",{className:"s3-inspector",children:[n.jsxs("div",{className:"s3-inspector-section",children:[n.jsx("span",{className:"s3-field-label",children:"Object"}),n.jsx("code",{className:"s3-inspector-key",title:o.key,children:o.key}),n.jsx("code",{className:"s3-inspector-uri",title:o.s3Uri,children:o.s3Uri})]}),n.jsxs("dl",{className:"s3-inspector-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"Size"}),n.jsx("dd",{children:mm(o.size)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Content type"}),n.jsx("dd",{children:o.contentType||"application/octet-stream"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Last modified"}),n.jsx("dd",{children:hm(o.lastModified)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"ETag"}),n.jsx("dd",{children:n.jsx("code",{children:o.etag||"unknown"})})]})]}),n.jsxs("div",{className:"s3-inspector-section",children:[n.jsx("span",{className:"s3-field-label",children:"Metadata"}),f.length===0?n.jsx("p",{className:"s3-inspector-muted",children:"No user metadata."}):n.jsx("dl",{className:"s3-inspector-metadata",children:f.map(([p,y])=>n.jsxs("div",{children:[n.jsx("dt",{children:p}),n.jsx("dd",{children:y})]},p))})]}),n.jsxs("a",{className:"s3-inspector-download",href:ym(o.downloadUrl),children:[n.jsx(xm,{}),n.jsx("span",{children:"Download object"})]}),n.jsx(pm,{disabled:i,object:o,onCopyObject:c})]})}function pm({disabled:r,object:i,onCopyObject:o}){const[c,f]=h.useState(`${i.key}.copy`),[p,y]=h.useState(!1);h.useEffect(()=>{f(`${i.key}.copy`)},[i.key]);async function v(b){b.preventDefault();const N=c.trim();if(!(r||p||N==="")){y(!0);try{await o(N)}finally{y(!1)}}}return n.jsxs("form",{className:"s3-inspector-copy",onSubmit:v,children:[n.jsxs("label",{className:"s3-field",children:[n.jsx("span",{children:"Copy to key"}),n.jsx("input",{"aria-label":"S3 copy destination key",className:"s3-text-input",disabled:r||p,onChange:b=>f(b.target.value),value:c})]}),n.jsx(ue,{disabled:r||p||c.trim()==="",type:"submit",children:p?"Copying…":"Copy"})]})}function mm(r){if(!Number.isFinite(r)||r<0)return"unknown";if(r<1024)return`${r} B`;const i=["KB","MB","GB","TB"];let o=r/1024,c=0;for(;o>=1024&&c=10?0:1)} ${i[c]}`}function hm(r){const i=new Date(r);return Number.isNaN(i.getTime())?r||"unknown":i.toLocaleString()}function ym(r){return r.startsWith("/api/s3/")?r:"#"}function gm(){return n.jsxs("svg",{"aria-hidden":!0,width:"36",height:"36",viewBox:"0 0 36 36",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M7 11l11-6 11 6v14L18 31 7 25z"}),n.jsx("path",{d:"M7 11l11 6 11-6"}),n.jsx("path",{d:"M18 17v14"})]})}function xm(){return n.jsxs("svg",{"aria-hidden":!0,width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M8 2.5v8"}),n.jsx("path",{d:"M4.5 7L8 10.5 11.5 7"}),n.jsx("path",{d:"M3 13h10"})]})}function jm({service:r}){var ie;const[i,o]=h.useState({status:"loading"}),[c,f]=h.useState(),[p,y]=h.useState(),[v,b]=h.useState(""),[N,C]=h.useState(""),[w,L]=h.useState(0),E=(r==null?void 0:r.status)==="disabled",D=Dr(),T=h.useCallback(()=>{if(E){o({status:"success",buckets:[]}),f(void 0),y(void 0);return}o({status:"loading"}),Vp().then(({buckets:z})=>{o({status:"success",buckets:z}),f(X=>{var K;return X&&z.some(ye=>ye.name===X)?X:(K=z[0])==null?void 0:K.name})}).catch(z=>{o({status:"error",message:z.message})})},[E]);h.useEffect(()=>{T()},[T]);const U=h.useCallback(z=>{T(),z.type.startsWith("s3.object.")&&L(X=>X+1)},[T]);cn({topics:["s3"],onEvent:U,enabled:!E});const V=i.status==="success"?i.buckets:[],se=(ie=V.find(z=>z.name===c))==null?void 0:ie.name,q=p&&se?p:void 0,me=h.useCallback(()=>{y(void 0)},[]);if(E)return n.jsx(Ne,{title:"S3",children:n.jsx(Q,{title:"S3 is disabled",description:"Enable the S3 service in devcloud config to browse buckets and objects."})});function Se(z){f(z),y(void 0)}function Ce(){const z=v.trim();E||z===""||Kp(z).then(X=>{C(`Created bucket ${X.name}`),b(""),f(X.name),T()}).catch(X=>C(X.message))}async function J(z){E||!await D(bn({title:"Delete bucket",description:"All objects and metadata in this bucket will be removed. This cannot be undone.",target:z}))||Hp(z).then(()=>{C(`Deleted bucket ${z}`),f(K=>K===z?void 0:K),y(void 0),T()}).catch(K=>C(K.message))}async function oe(z){!se||E||!await D(bn({title:"Delete object",description:"This object will be permanently removed from the bucket.",target:z.key}))||Wp(se,z.key).then(()=>{C(`Deleted object ${z.s3Uri}`),y(void 0),L(K=>K+1),T()}).catch(K=>C(K.message))}async function be(z){if(!(!se||E))try{const X=await Xp({bucketName:se,objectKey:z.key,body:z.file,contentType:z.contentType,metadata:z.metadata});C(`Uploaded object ${X.s3Uri}`),y(X),L(K=>K+1),T()}catch(X){throw C(X instanceof Error?X.message:"S3 upload failed"),X}}async function De(z){if(!(!se||!q||E))try{const X=await Zp({sourceBucketName:se,sourceObjectKey:q.key,destinationBucketName:se,destinationObjectKey:z});C(`Copied object ${q.s3Uri} to ${X.s3Uri}`),y(X),L(K=>K+1),T()}catch(X){throw C(X instanceof Error?X.message:"S3 copy failed"),X}}return n.jsxs("div",{className:"s3-workspace",children:[n.jsxs(Ne,{title:"Buckets",children:[n.jsxs("div",{className:"s3-bucket-toolbar",children:[n.jsx("span",{className:"s3-bucket-count",children:V.length===1?"1 bucket":`${V.length} buckets`}),n.jsx("button",{"aria-label":"Refresh buckets",className:"s3-icon-button neutral",onClick:T,type:"button",children:n.jsx(bm,{})})]}),n.jsx(vm,{bucketName:v,disabled:E,onChange:b,onCreate:Ce}),i.status==="loading"?n.jsx(Q,{title:"Loading buckets",description:"Reading the local S3 bucket registry."}):null,i.status==="error"?n.jsx(Q,{title:"S3 buckets unavailable",description:i.message,actionLabel:"Retry",onAction:T}):null,i.status==="success"?n.jsx(Ap,{buckets:V,activeBucket:se,disabled:E,onDeleteBucket:J,onSelectBucket:Se}):null]}),n.jsx(Ne,{title:se?`Objects · ${se}`:"Objects",children:n.jsx(tm,{bucketName:se,activeObjectKey:q==null?void 0:q.key,disabled:E,refreshNonce:w,onClearObject:me,onDeleteObject:oe,onUploadObject:be,onSelectObject:y})}),n.jsx(Ne,{title:"Inspector",children:n.jsx(fm,{bucketName:se,disabled:E,object:q,onCopyObject:De})}),N?n.jsx("p",{className:"s3-status-banner",children:N}):null]})}function vm({bucketName:r,disabled:i,onChange:o,onCreate:c}){return n.jsxs("form",{className:"s3-bucket-create",onSubmit:f=>{f.preventDefault(),c()},children:[n.jsx("input",{"aria-label":"New bucket name",className:"s3-text-input",disabled:i,onChange:f=>o(f.target.value),placeholder:"New bucket name",value:r}),n.jsx(ue,{disabled:i||r.trim()==="",type:"submit",children:"Create"})]})}function bm(){return n.jsxs("svg",{"aria-hidden":!0,width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M13.5 8a5.5 5.5 0 1 1-1.61-3.89"}),n.jsx("path",{d:"M13.5 3v3h-3"})]})}async function Sm(){return W("/api/dynamodb/status")}async function wm(){return W("/api/dynamodb/tables")}async function Nm(r){return W("/api/dynamodb/tables",{method:"POST",body:{input:r}})}async function km(r,i=100){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/items?limit=${encodeURIComponent(String(i))}`)}async function Cm(r,i){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/items`,{method:"POST",body:{input:i}})}async function Em(r,i){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/items/update`,{method:"POST",body:{input:i}})}async function Im(r,i,o){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/items/delete`,{method:"POST",body:{input:i,confirmation:o}})}async function Rm(r,i){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/query`,{method:"POST",body:{input:i}})}async function Dm(r,i){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/scan`,{method:"POST",body:{input:i}})}async function Tm(r){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}`)}async function Lm(r){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/indexes`)}async function $m(r){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/ttl`)}async function Pm(r,i){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/ttl`,{method:"POST",body:{input:i}})}async function Mm(r,i,o){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/delete`,{method:"POST",body:{input:i,confirmation:o}})}async function Om(r){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/streams`)}const La="devcloud.dynamodb.recentOperations.v1",Ma=10,_m=`{ +`+u.stack}return{value:e,source:t,stack:a,digest:null}}function Vi(e,t,s){return{value:e,source:null,stack:s??null,digest:t??null}}function Ki(e,t){try{console.error(t.value)}catch(s){setTimeout(function(){throw s})}}var Nf=typeof WeakMap=="function"?WeakMap:Map;function wu(e,t,s){s=gn(-1,s),s.tag=3,s.payload={element:null};var l=t.value;return s.callback=function(){wl||(wl=!0,aa=l),Ki(e,t)},s}function Nu(e,t,s){s=gn(-1,s),s.tag=3;var l=e.type.getDerivedStateFromError;if(typeof l=="function"){var a=t.value;s.payload=function(){return l(a)},s.callback=function(){Ki(e,t)}}var u=e.stateNode;return u!==null&&typeof u.componentDidCatch=="function"&&(s.callback=function(){Ki(e,t),typeof l!="function"&&(Bn===null?Bn=new Set([this]):Bn.add(this));var d=t.stack;this.componentDidCatch(t.value,{componentStack:d!==null?d:""})}),s}function ku(e,t,s){var l=e.pingCache;if(l===null){l=e.pingCache=new Nf;var a=new Set;l.set(t,a)}else a=l.get(t),a===void 0&&(a=new Set,l.set(t,a));a.has(s)||(a.add(s),e=Bf.bind(null,e,t,s),t.then(e,e))}function Cu(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function Eu(e,t,s,l,a){return(e.mode&1)===0?(e===t?e.flags|=65536:(e.flags|=128,s.flags|=131072,s.flags&=-52805,s.tag===1&&(s.alternate===null?s.tag=17:(t=gn(-1,1),t.tag=2,On(s,t,1))),s.lanes|=1),e):(e.flags|=65536,e.lanes=a,e)}var kf=me.ReactCurrentOwner,wt=!1;function xt(e,t,s,l){t.child=e===null?Ho(t,null,s,l):Ts(t,e.child,s,l)}function Iu(e,t,s,l,a){s=s.render;var u=t.ref;return $s(t,a),l=_i(e,t,s,l,u,a),s=Bi(),e!==null&&!wt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~a,xn(e,t,a)):(Ve&&s&&vi(t),t.flags|=1,xt(e,t,l,a),t.child)}function Ru(e,t,s,l,a){if(e===null){var u=s.type;return typeof u=="function"&&!ma(u)&&u.defaultProps===void 0&&s.compare===null&&s.defaultProps===void 0?(t.tag=15,t.type=u,Du(e,t,u,l,a)):(e=Rl(s.type,null,l,t,t.mode,a),e.ref=t.ref,e.return=t,t.child=e)}if(u=e.child,(e.lanes&a)===0){var d=u.memoizedProps;if(s=s.compare,s=s!==null?s:rr,s(d,l)&&e.ref===t.ref)return xn(e,t,a)}return t.flags|=1,e=Qn(u,l),e.ref=t.ref,e.return=t,t.child=e}function Du(e,t,s,l,a){if(e!==null){var u=e.memoizedProps;if(rr(u,l)&&e.ref===t.ref)if(wt=!1,t.pendingProps=l=u,(e.lanes&a)!==0)(e.flags&131072)!==0&&(wt=!0);else return t.lanes=e.lanes,xn(e,t,a)}return Hi(e,t,s,l,a)}function Tu(e,t,s){var l=t.pendingProps,a=l.children,u=e!==null?e.memoizedState:null;if(l.mode==="hidden")if((t.mode&1)===0)t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Fe(_s,Tt),Tt|=s;else{if((s&1073741824)===0)return e=u!==null?u.baseLanes|s:s,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,Fe(_s,Tt),Tt|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},l=u!==null?u.baseLanes:s,Fe(_s,Tt),Tt|=l}else u!==null?(l=u.baseLanes|s,t.memoizedState=null):l=s,Fe(_s,Tt),Tt|=l;return xt(e,t,a,s),t.child}function Lu(e,t){var s=t.ref;(e===null&&s!==null||e!==null&&e.ref!==s)&&(t.flags|=512,t.flags|=2097152)}function Hi(e,t,s,l,a){var u=St(s)?Gn:ft.current;return u=Es(t,u),$s(t,a),s=_i(e,t,s,l,u,a),l=Bi(),e!==null&&!wt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~a,xn(e,t,a)):(Ve&&l&&vi(t),t.flags|=1,xt(e,t,s,a),t.child)}function $u(e,t,s,l,a){if(St(s)){var u=!0;el(t)}else u=!1;if($s(t,a),t.stateNode===null)xl(e,t),bu(t,s,l),qi(t,s,l,a),l=!0;else if(e===null){var d=t.stateNode,m=t.memoizedProps;d.props=m;var g=d.context,I=s.contextType;typeof I=="object"&&I!==null?I=_t(I):(I=St(s)?Gn:ft.current,I=Es(t,I));var P=s.getDerivedStateFromProps,_=typeof P=="function"||typeof d.getSnapshotBeforeUpdate=="function";_||typeof d.UNSAFE_componentWillReceiveProps!="function"&&typeof d.componentWillReceiveProps!="function"||(m!==l||g!==I)&&Su(t,d,l,I),Mn=!1;var $=t.memoizedState;d.state=$,ul(t,l,d,a),g=t.memoizedState,m!==l||$!==g||bt.current||Mn?(typeof P=="function"&&(Ui(t,s,P,l),g=t.memoizedState),(m=Mn||vu(t,s,m,l,$,g,I))?(_||typeof d.UNSAFE_componentWillMount!="function"&&typeof d.componentWillMount!="function"||(typeof d.componentWillMount=="function"&&d.componentWillMount(),typeof d.UNSAFE_componentWillMount=="function"&&d.UNSAFE_componentWillMount()),typeof d.componentDidMount=="function"&&(t.flags|=4194308)):(typeof d.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=l,t.memoizedState=g),d.props=l,d.state=g,d.context=I,l=m):(typeof d.componentDidMount=="function"&&(t.flags|=4194308),l=!1)}else{d=t.stateNode,Wo(e,t),m=t.memoizedProps,I=t.type===t.elementType?m:Jt(t.type,m),d.props=I,_=t.pendingProps,$=d.context,g=s.contextType,typeof g=="object"&&g!==null?g=_t(g):(g=St(s)?Gn:ft.current,g=Es(t,g));var H=s.getDerivedStateFromProps;(P=typeof H=="function"||typeof d.getSnapshotBeforeUpdate=="function")||typeof d.UNSAFE_componentWillReceiveProps!="function"&&typeof d.componentWillReceiveProps!="function"||(m!==_||$!==g)&&Su(t,d,l,g),Mn=!1,$=t.memoizedState,d.state=$,ul(t,l,d,a);var Z=t.memoizedState;m!==_||$!==Z||bt.current||Mn?(typeof H=="function"&&(Ui(t,s,H,l),Z=t.memoizedState),(I=Mn||vu(t,s,I,l,$,Z,g)||!1)?(P||typeof d.UNSAFE_componentWillUpdate!="function"&&typeof d.componentWillUpdate!="function"||(typeof d.componentWillUpdate=="function"&&d.componentWillUpdate(l,Z,g),typeof d.UNSAFE_componentWillUpdate=="function"&&d.UNSAFE_componentWillUpdate(l,Z,g)),typeof d.componentDidUpdate=="function"&&(t.flags|=4),typeof d.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof d.componentDidUpdate!="function"||m===e.memoizedProps&&$===e.memoizedState||(t.flags|=4),typeof d.getSnapshotBeforeUpdate!="function"||m===e.memoizedProps&&$===e.memoizedState||(t.flags|=1024),t.memoizedProps=l,t.memoizedState=Z),d.props=l,d.state=Z,d.context=g,l=I):(typeof d.componentDidUpdate!="function"||m===e.memoizedProps&&$===e.memoizedState||(t.flags|=4),typeof d.getSnapshotBeforeUpdate!="function"||m===e.memoizedProps&&$===e.memoizedState||(t.flags|=1024),l=!1)}return Ji(e,t,s,l,u,a)}function Ji(e,t,s,l,a,u){Lu(e,t);var d=(t.flags&128)!==0;if(!l&&!d)return a&&Bo(t,s,!1),xn(e,t,u);l=t.stateNode,kf.current=t;var m=d&&typeof s.getDerivedStateFromError!="function"?null:l.render();return t.flags|=1,e!==null&&d?(t.child=Ts(t,e.child,null,u),t.child=Ts(t,null,m,u)):xt(e,t,m,u),t.memoizedState=l.state,a&&Bo(t,s,!0),t.child}function Pu(e){var t=e.stateNode;t.pendingContext?Oo(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Oo(e,t.context,!1),Ti(e,t.containerInfo)}function Mu(e,t,s,l,a){return Ds(),Ni(a),t.flags|=256,xt(e,t,s,l),t.child}var Wi={dehydrated:null,treeContext:null,retryLane:0};function Gi(e){return{baseLanes:e,cachePool:null,transitions:null}}function Ou(e,t,s){var l=t.pendingProps,a=Ke.current,u=!1,d=(t.flags&128)!==0,m;if((m=d)||(m=e!==null&&e.memoizedState===null?!1:(a&2)!==0),m?(u=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(a|=1),Fe(Ke,a&1),e===null)return wi(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?((t.mode&1)===0?t.lanes=1:e.data==="$!"?t.lanes=8:t.lanes=1073741824,null):(d=l.children,e=l.fallback,u?(l=t.mode,u=t.child,d={mode:"hidden",children:d},(l&1)===0&&u!==null?(u.childLanes=0,u.pendingProps=d):u=Dl(d,l,0,null),e=is(e,l,s,null),u.return=t,e.return=t,u.sibling=e,t.child=u,t.child.memoizedState=Gi(s),t.memoizedState=Wi,e):Yi(t,d));if(a=e.memoizedState,a!==null&&(m=a.dehydrated,m!==null))return Cf(e,t,d,l,m,a,s);if(u){u=l.fallback,d=t.mode,a=e.child,m=a.sibling;var g={mode:"hidden",children:l.children};return(d&1)===0&&t.child!==a?(l=t.child,l.childLanes=0,l.pendingProps=g,t.deletions=null):(l=Qn(a,g),l.subtreeFlags=a.subtreeFlags&14680064),m!==null?u=Qn(m,u):(u=is(u,d,s,null),u.flags|=2),u.return=t,l.return=t,l.sibling=u,t.child=l,l=u,u=t.child,d=e.child.memoizedState,d=d===null?Gi(s):{baseLanes:d.baseLanes|s,cachePool:null,transitions:d.transitions},u.memoizedState=d,u.childLanes=e.childLanes&~s,t.memoizedState=Wi,l}return u=e.child,e=u.sibling,l=Qn(u,{mode:"visible",children:l.children}),(t.mode&1)===0&&(l.lanes=s),l.return=t,l.sibling=null,e!==null&&(s=t.deletions,s===null?(t.deletions=[e],t.flags|=16):s.push(e)),t.child=l,t.memoizedState=null,l}function Yi(e,t){return t=Dl({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function gl(e,t,s,l){return l!==null&&Ni(l),Ts(t,e.child,null,s),e=Yi(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function Cf(e,t,s,l,a,u,d){if(s)return t.flags&256?(t.flags&=-257,l=Vi(Error(o(422))),gl(e,t,d,l)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(u=l.fallback,a=t.mode,l=Dl({mode:"visible",children:l.children},a,0,null),u=is(u,a,d,null),u.flags|=2,l.return=t,u.return=t,l.sibling=u,t.child=l,(t.mode&1)!==0&&Ts(t,e.child,null,d),t.child.memoizedState=Gi(d),t.memoizedState=Wi,u);if((t.mode&1)===0)return gl(e,t,d,null);if(a.data==="$!"){if(l=a.nextSibling&&a.nextSibling.dataset,l)var m=l.dgst;return l=m,u=Error(o(419)),l=Vi(u,l,void 0),gl(e,t,d,l)}if(m=(d&e.childLanes)!==0,wt||m){if(l=lt,l!==null){switch(d&-d){case 4:a=2;break;case 16:a=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:a=32;break;case 536870912:a=268435456;break;default:a=0}a=(a&(l.suspendedLanes|d))!==0?0:a,a!==0&&a!==u.retryLane&&(u.retryLane=a,yn(e,a),Yt(l,e,a,-1))}return pa(),l=Vi(Error(o(421))),gl(e,t,d,l)}return a.data==="$?"?(t.flags|=128,t.child=e.child,t=Af.bind(null,e),a._reactRetry=t,null):(e=u.treeContext,Dt=Tn(a.nextSibling),Rt=t,Ve=!0,Ht=null,e!==null&&(Mt[Ot++]=mn,Mt[Ot++]=hn,Mt[Ot++]=Yn,mn=e.id,hn=e.overflow,Yn=t),t=Yi(t,l.children),t.flags|=4096,t)}function _u(e,t,s){e.lanes|=t;var l=e.alternate;l!==null&&(l.lanes|=t),Ii(e.return,t,s)}function Xi(e,t,s,l,a){var u=e.memoizedState;u===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:l,tail:s,tailMode:a}:(u.isBackwards=t,u.rendering=null,u.renderingStartTime=0,u.last=l,u.tail=s,u.tailMode=a)}function Bu(e,t,s){var l=t.pendingProps,a=l.revealOrder,u=l.tail;if(xt(e,t,l.children,s),l=Ke.current,(l&2)!==0)l=l&1|2,t.flags|=128;else{if(e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&_u(e,s,t);else if(e.tag===19)_u(e,s,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}l&=1}if(Fe(Ke,l),(t.mode&1)===0)t.memoizedState=null;else switch(a){case"forwards":for(s=t.child,a=null;s!==null;)e=s.alternate,e!==null&&cl(e)===null&&(a=s),s=s.sibling;s=a,s===null?(a=t.child,t.child=null):(a=s.sibling,s.sibling=null),Xi(t,!1,a,s,u);break;case"backwards":for(s=null,a=t.child,t.child=null;a!==null;){if(e=a.alternate,e!==null&&cl(e)===null){t.child=a;break}e=a.sibling,a.sibling=s,s=a,a=e}Xi(t,!0,s,null,u);break;case"together":Xi(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function xl(e,t){(t.mode&1)===0&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function xn(e,t,s){if(e!==null&&(t.dependencies=e.dependencies),ns|=t.lanes,(s&t.childLanes)===0)return null;if(e!==null&&t.child!==e.child)throw Error(o(153));if(t.child!==null){for(e=t.child,s=Qn(e,e.pendingProps),t.child=s,s.return=t;e.sibling!==null;)e=e.sibling,s=s.sibling=Qn(e,e.pendingProps),s.return=t;s.sibling=null}return t.child}function Ef(e,t,s){switch(t.tag){case 3:Pu(t),Ds();break;case 5:Xo(t);break;case 1:St(t.type)&&el(t);break;case 4:Ti(t,t.stateNode.containerInfo);break;case 10:var l=t.type._context,a=t.memoizedProps.value;Fe(il,l._currentValue),l._currentValue=a;break;case 13:if(l=t.memoizedState,l!==null)return l.dehydrated!==null?(Fe(Ke,Ke.current&1),t.flags|=128,null):(s&t.child.childLanes)!==0?Ou(e,t,s):(Fe(Ke,Ke.current&1),e=xn(e,t,s),e!==null?e.sibling:null);Fe(Ke,Ke.current&1);break;case 19:if(l=(s&t.childLanes)!==0,(e.flags&128)!==0){if(l)return Bu(e,t,s);t.flags|=128}if(a=t.memoizedState,a!==null&&(a.rendering=null,a.tail=null,a.lastEffect=null),Fe(Ke,Ke.current),l)break;return null;case 22:case 23:return t.lanes=0,Tu(e,t,s)}return xn(e,t,s)}var Au,Zi,zu,Fu;Au=function(e,t){for(var s=t.child;s!==null;){if(s.tag===5||s.tag===6)e.appendChild(s.stateNode);else if(s.tag!==4&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break;for(;s.sibling===null;){if(s.return===null||s.return===t)return;s=s.return}s.sibling.return=s.return,s=s.sibling}},Zi=function(){},zu=function(e,t,s,l){var a=e.memoizedProps;if(a!==l){e=t.stateNode,es(an.current);var u=null;switch(s){case"input":a=Ie(e,a),l=Ie(e,l),u=[];break;case"select":a=M({},a,{value:void 0}),l=M({},l,{value:void 0}),u=[];break;case"textarea":a=Ze(e,a),l=Ze(e,l),u=[];break;default:typeof a.onClick!="function"&&typeof l.onClick=="function"&&(e.onclick=Yr)}Ge(s,l);var d;s=null;for(I in a)if(!l.hasOwnProperty(I)&&a.hasOwnProperty(I)&&a[I]!=null)if(I==="style"){var m=a[I];for(d in m)m.hasOwnProperty(d)&&(s||(s={}),s[d]="")}else I!=="dangerouslySetInnerHTML"&&I!=="children"&&I!=="suppressContentEditableWarning"&&I!=="suppressHydrationWarning"&&I!=="autoFocus"&&(f.hasOwnProperty(I)?u||(u=[]):(u=u||[]).push(I,null));for(I in l){var g=l[I];if(m=a!=null?a[I]:void 0,l.hasOwnProperty(I)&&g!==m&&(g!=null||m!=null))if(I==="style")if(m){for(d in m)!m.hasOwnProperty(d)||g&&g.hasOwnProperty(d)||(s||(s={}),s[d]="");for(d in g)g.hasOwnProperty(d)&&m[d]!==g[d]&&(s||(s={}),s[d]=g[d])}else s||(u||(u=[]),u.push(I,s)),s=g;else I==="dangerouslySetInnerHTML"?(g=g?g.__html:void 0,m=m?m.__html:void 0,g!=null&&m!==g&&(u=u||[]).push(I,g)):I==="children"?typeof g!="string"&&typeof g!="number"||(u=u||[]).push(I,""+g):I!=="suppressContentEditableWarning"&&I!=="suppressHydrationWarning"&&(f.hasOwnProperty(I)?(g!=null&&I==="onScroll"&&Qe("scroll",e),u||m===g||(u=[])):(u=u||[]).push(I,g))}s&&(u=u||[]).push("style",s);var I=u;(t.updateQueue=I)&&(t.flags|=4)}},Fu=function(e,t,s,l){s!==l&&(t.flags|=4)};function jr(e,t){if(!Ve)switch(e.tailMode){case"hidden":t=e.tail;for(var s=null;t!==null;)t.alternate!==null&&(s=t),t=t.sibling;s===null?e.tail=null:s.sibling=null;break;case"collapsed":s=e.tail;for(var l=null;s!==null;)s.alternate!==null&&(l=s),s=s.sibling;l===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:l.sibling=null}}function mt(e){var t=e.alternate!==null&&e.alternate.child===e.child,s=0,l=0;if(t)for(var a=e.child;a!==null;)s|=a.lanes|a.childLanes,l|=a.subtreeFlags&14680064,l|=a.flags&14680064,a.return=e,a=a.sibling;else for(a=e.child;a!==null;)s|=a.lanes|a.childLanes,l|=a.subtreeFlags,l|=a.flags,a.return=e,a=a.sibling;return e.subtreeFlags|=l,e.childLanes=s,t}function If(e,t,s){var l=t.pendingProps;switch(bi(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return mt(t),null;case 1:return St(t.type)&&Zr(),mt(t),null;case 3:return l=t.stateNode,Ps(),Ue(bt),Ue(ft),Pi(),l.pendingContext&&(l.context=l.pendingContext,l.pendingContext=null),(e===null||e.child===null)&&(rl(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,Ht!==null&&(ca(Ht),Ht=null))),Zi(e,t),mt(t),null;case 5:Li(t);var a=es(mr.current);if(s=t.type,e!==null&&t.stateNode!=null)zu(e,t,s,l,a),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!l){if(t.stateNode===null)throw Error(o(166));return mt(t),null}if(e=es(an.current),rl(t)){l=t.stateNode,s=t.type;var u=t.memoizedProps;switch(l[ln]=t,l[ur]=u,e=(t.mode&1)!==0,s){case"dialog":Qe("cancel",l),Qe("close",l);break;case"iframe":case"object":case"embed":Qe("load",l);break;case"video":case"audio":for(a=0;a<\/script>",e=e.removeChild(e.firstChild)):typeof l.is=="string"?e=d.createElement(s,{is:l.is}):(e=d.createElement(s),s==="select"&&(d=e,l.multiple?d.multiple=!0:l.size&&(d.size=l.size))):e=d.createElementNS(e,s),e[ln]=t,e[ur]=l,Au(e,t,!1,!1),t.stateNode=e;e:{switch(d=Zt(s,l),s){case"dialog":Qe("cancel",e),Qe("close",e),a=l;break;case"iframe":case"object":case"embed":Qe("load",e),a=l;break;case"video":case"audio":for(a=0;aBs&&(t.flags|=128,l=!0,jr(u,!1),t.lanes=4194304)}else{if(!l)if(e=cl(d),e!==null){if(t.flags|=128,l=!0,s=e.updateQueue,s!==null&&(t.updateQueue=s,t.flags|=4),jr(u,!0),u.tail===null&&u.tailMode==="hidden"&&!d.alternate&&!Ve)return mt(t),null}else 2*Ye()-u.renderingStartTime>Bs&&s!==1073741824&&(t.flags|=128,l=!0,jr(u,!1),t.lanes=4194304);u.isBackwards?(d.sibling=t.child,t.child=d):(s=u.last,s!==null?s.sibling=d:t.child=d,u.last=d)}return u.tail!==null?(t=u.tail,u.rendering=t,u.tail=t.sibling,u.renderingStartTime=Ye(),t.sibling=null,s=Ke.current,Fe(Ke,l?s&1|2:s&1),t):(mt(t),null);case 22:case 23:return fa(),l=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==l&&(t.flags|=8192),l&&(t.mode&1)!==0?(Tt&1073741824)!==0&&(mt(t),t.subtreeFlags&6&&(t.flags|=8192)):mt(t),null;case 24:return null;case 25:return null}throw Error(o(156,t.tag))}function Rf(e,t){switch(bi(t),t.tag){case 1:return St(t.type)&&Zr(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Ps(),Ue(bt),Ue(ft),Pi(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Li(t),null;case 13:if(Ue(Ke),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(o(340));Ds()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ue(Ke),null;case 4:return Ps(),null;case 10:return Ei(t.type._context),null;case 22:case 23:return fa(),null;case 24:return null;default:return null}}var jl=!1,ht=!1,Df=typeof WeakSet=="function"?WeakSet:Set,Y=null;function Os(e,t){var s=e.ref;if(s!==null)if(typeof s=="function")try{s(null)}catch(l){We(e,t,l)}else s.current=null}function ea(e,t,s){try{s()}catch(l){We(e,t,l)}}var Qu=!1;function Tf(e,t){if(fi=Ar,e=vo(),ri(e)){if("selectionStart"in e)var s={start:e.selectionStart,end:e.selectionEnd};else e:{s=(s=e.ownerDocument)&&s.defaultView||window;var l=s.getSelection&&s.getSelection();if(l&&l.rangeCount!==0){s=l.anchorNode;var a=l.anchorOffset,u=l.focusNode;l=l.focusOffset;try{s.nodeType,u.nodeType}catch{s=null;break e}var d=0,m=-1,g=-1,I=0,P=0,_=e,$=null;t:for(;;){for(var H;_!==s||a!==0&&_.nodeType!==3||(m=d+a),_!==u||l!==0&&_.nodeType!==3||(g=d+l),_.nodeType===3&&(d+=_.nodeValue.length),(H=_.firstChild)!==null;)$=_,_=H;for(;;){if(_===e)break t;if($===s&&++I===a&&(m=d),$===u&&++P===l&&(g=d),(H=_.nextSibling)!==null)break;_=$,$=_.parentNode}_=H}s=m===-1||g===-1?null:{start:m,end:g}}else s=null}s=s||{start:0,end:0}}else s=null;for(pi={focusedElem:e,selectionRange:s},Ar=!1,Y=t;Y!==null;)if(t=Y,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Y=e;else for(;Y!==null;){t=Y;try{var Z=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(Z!==null){var ne=Z.memoizedProps,Xe=Z.memoizedState,w=t.stateNode,v=w.getSnapshotBeforeUpdate(t.elementType===t.type?ne:Jt(t.type,ne),Xe);w.__reactInternalSnapshotBeforeUpdate=v}break;case 3:var C=t.stateNode.containerInfo;C.nodeType===1?C.textContent="":C.nodeType===9&&C.documentElement&&C.removeChild(C.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(o(163))}}catch(B){We(t,t.return,B)}if(e=t.sibling,e!==null){e.return=t.return,Y=e;break}Y=t.return}return Z=Qu,Qu=!1,Z}function vr(e,t,s){var l=t.updateQueue;if(l=l!==null?l.lastEffect:null,l!==null){var a=l=l.next;do{if((a.tag&e)===e){var u=a.destroy;a.destroy=void 0,u!==void 0&&ea(t,s,u)}a=a.next}while(a!==l)}}function vl(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var s=t=t.next;do{if((s.tag&e)===e){var l=s.create;s.destroy=l()}s=s.next}while(s!==t)}}function ta(e){var t=e.ref;if(t!==null){var s=e.stateNode;switch(e.tag){case 5:e=s;break;default:e=s}typeof t=="function"?t(e):t.current=e}}function Uu(e){var t=e.alternate;t!==null&&(e.alternate=null,Uu(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[ln],delete t[ur],delete t[gi],delete t[pf],delete t[mf])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function qu(e){return e.tag===5||e.tag===3||e.tag===4}function Vu(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||qu(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function na(e,t,s){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?s.nodeType===8?s.parentNode.insertBefore(e,t):s.insertBefore(e,t):(s.nodeType===8?(t=s.parentNode,t.insertBefore(e,s)):(t=s,t.appendChild(e)),s=s._reactRootContainer,s!=null||t.onclick!==null||(t.onclick=Yr));else if(l!==4&&(e=e.child,e!==null))for(na(e,t,s),e=e.sibling;e!==null;)na(e,t,s),e=e.sibling}function sa(e,t,s){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?s.insertBefore(e,t):s.appendChild(e);else if(l!==4&&(e=e.child,e!==null))for(sa(e,t,s),e=e.sibling;e!==null;)sa(e,t,s),e=e.sibling}var ot=null,Wt=!1;function _n(e,t,s){for(s=s.child;s!==null;)Ku(e,t,s),s=s.sibling}function Ku(e,t,s){if(rn&&typeof rn.onCommitFiberUnmount=="function")try{rn.onCommitFiberUnmount($r,s)}catch{}switch(s.tag){case 5:ht||Os(s,t);case 6:var l=ot,a=Wt;ot=null,_n(e,t,s),ot=l,Wt=a,ot!==null&&(Wt?(e=ot,s=s.stateNode,e.nodeType===8?e.parentNode.removeChild(s):e.removeChild(s)):ot.removeChild(s.stateNode));break;case 18:ot!==null&&(Wt?(e=ot,s=s.stateNode,e.nodeType===8?yi(e.parentNode,s):e.nodeType===1&&yi(e,s),Xs(e)):yi(ot,s.stateNode));break;case 4:l=ot,a=Wt,ot=s.stateNode.containerInfo,Wt=!0,_n(e,t,s),ot=l,Wt=a;break;case 0:case 11:case 14:case 15:if(!ht&&(l=s.updateQueue,l!==null&&(l=l.lastEffect,l!==null))){a=l=l.next;do{var u=a,d=u.destroy;u=u.tag,d!==void 0&&((u&2)!==0||(u&4)!==0)&&ea(s,t,d),a=a.next}while(a!==l)}_n(e,t,s);break;case 1:if(!ht&&(Os(s,t),l=s.stateNode,typeof l.componentWillUnmount=="function"))try{l.props=s.memoizedProps,l.state=s.memoizedState,l.componentWillUnmount()}catch(m){We(s,t,m)}_n(e,t,s);break;case 21:_n(e,t,s);break;case 22:s.mode&1?(ht=(l=ht)||s.memoizedState!==null,_n(e,t,s),ht=l):_n(e,t,s);break;default:_n(e,t,s)}}function Hu(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var s=e.stateNode;s===null&&(s=e.stateNode=new Df),t.forEach(function(l){var a=zf.bind(null,e,l);s.has(l)||(s.add(l),l.then(a,a))})}}function Gt(e,t){var s=t.deletions;if(s!==null)for(var l=0;la&&(a=d),l&=~u}if(l=a,l=Ye()-l,l=(120>l?120:480>l?480:1080>l?1080:1920>l?1920:3e3>l?3e3:4320>l?4320:1960*$f(l/1960))-l,10e?16:e,An===null)var l=!1;else{if(e=An,An=null,kl=0,(Te&6)!==0)throw Error(o(331));var a=Te;for(Te|=4,Y=e.current;Y!==null;){var u=Y,d=u.child;if((Y.flags&16)!==0){var m=u.deletions;if(m!==null){for(var g=0;gYe()-ia?rs(e,0):la|=s),kt(e,t)}function ic(e,t){t===0&&((e.mode&1)===0?t=1:(t=Mr,Mr<<=1,(Mr&130023424)===0&&(Mr=4194304)));var s=jt();e=yn(e,t),e!==null&&(Hs(e,t,s),kt(e,s))}function Af(e){var t=e.memoizedState,s=0;t!==null&&(s=t.retryLane),ic(e,s)}function zf(e,t){var s=0;switch(e.tag){case 13:var l=e.stateNode,a=e.memoizedState;a!==null&&(s=a.retryLane);break;case 19:l=e.stateNode;break;default:throw Error(o(314))}l!==null&&l.delete(t),ic(e,s)}var ac;ac=function(e,t,s){if(e!==null)if(e.memoizedProps!==t.pendingProps||bt.current)wt=!0;else{if((e.lanes&s)===0&&(t.flags&128)===0)return wt=!1,Ef(e,t,s);wt=(e.flags&131072)!==0}else wt=!1,Ve&&(t.flags&1048576)!==0&&zo(t,sl,t.index);switch(t.lanes=0,t.tag){case 2:var l=t.type;xl(e,t),e=t.pendingProps;var a=Es(t,ft.current);$s(t,s),a=_i(null,t,l,e,a,s);var u=Bi();return t.flags|=1,typeof a=="object"&&a!==null&&typeof a.render=="function"&&a.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,St(l)?(u=!0,el(t)):u=!1,t.memoizedState=a.state!==null&&a.state!==void 0?a.state:null,Di(t),a.updater=yl,t.stateNode=a,a._reactInternals=t,qi(t,l,e,s),t=Ji(null,t,l,!0,u,s)):(t.tag=0,Ve&&u&&vi(t),xt(null,t,a,s),t=t.child),t;case 16:l=t.elementType;e:{switch(xl(e,t),e=t.pendingProps,a=l._init,l=a(l._payload),t.type=l,a=t.tag=Qf(l),e=Jt(l,e),a){case 0:t=Hi(null,t,l,e,s);break e;case 1:t=$u(null,t,l,e,s);break e;case 11:t=Iu(null,t,l,e,s);break e;case 14:t=Ru(null,t,l,Jt(l.type,e),s);break e}throw Error(o(306,l,""))}return t;case 0:return l=t.type,a=t.pendingProps,a=t.elementType===l?a:Jt(l,a),Hi(e,t,l,a,s);case 1:return l=t.type,a=t.pendingProps,a=t.elementType===l?a:Jt(l,a),$u(e,t,l,a,s);case 3:e:{if(Pu(t),e===null)throw Error(o(387));l=t.pendingProps,u=t.memoizedState,a=u.element,Wo(e,t),ul(t,l,null,s);var d=t.memoizedState;if(l=d.element,u.isDehydrated)if(u={element:l,isDehydrated:!1,cache:d.cache,pendingSuspenseBoundaries:d.pendingSuspenseBoundaries,transitions:d.transitions},t.updateQueue.baseState=u,t.memoizedState=u,t.flags&256){a=Ms(Error(o(423)),t),t=Mu(e,t,l,s,a);break e}else if(l!==a){a=Ms(Error(o(424)),t),t=Mu(e,t,l,s,a);break e}else for(Dt=Tn(t.stateNode.containerInfo.firstChild),Rt=t,Ve=!0,Ht=null,s=Ho(t,null,l,s),t.child=s;s;)s.flags=s.flags&-3|4096,s=s.sibling;else{if(Ds(),l===a){t=xn(e,t,s);break e}xt(e,t,l,s)}t=t.child}return t;case 5:return Xo(t),e===null&&wi(t),l=t.type,a=t.pendingProps,u=e!==null?e.memoizedProps:null,d=a.children,mi(l,a)?d=null:u!==null&&mi(l,u)&&(t.flags|=32),Lu(e,t),xt(e,t,d,s),t.child;case 6:return e===null&&wi(t),null;case 13:return Ou(e,t,s);case 4:return Ti(t,t.stateNode.containerInfo),l=t.pendingProps,e===null?t.child=Ts(t,null,l,s):xt(e,t,l,s),t.child;case 11:return l=t.type,a=t.pendingProps,a=t.elementType===l?a:Jt(l,a),Iu(e,t,l,a,s);case 7:return xt(e,t,t.pendingProps,s),t.child;case 8:return xt(e,t,t.pendingProps.children,s),t.child;case 12:return xt(e,t,t.pendingProps.children,s),t.child;case 10:e:{if(l=t.type._context,a=t.pendingProps,u=t.memoizedProps,d=a.value,Fe(il,l._currentValue),l._currentValue=d,u!==null)if(Kt(u.value,d)){if(u.children===a.children&&!bt.current){t=xn(e,t,s);break e}}else for(u=t.child,u!==null&&(u.return=t);u!==null;){var m=u.dependencies;if(m!==null){d=u.child;for(var g=m.firstContext;g!==null;){if(g.context===l){if(u.tag===1){g=gn(-1,s&-s),g.tag=2;var I=u.updateQueue;if(I!==null){I=I.shared;var P=I.pending;P===null?g.next=g:(g.next=P.next,P.next=g),I.pending=g}}u.lanes|=s,g=u.alternate,g!==null&&(g.lanes|=s),Ii(u.return,s,t),m.lanes|=s;break}g=g.next}}else if(u.tag===10)d=u.type===t.type?null:u.child;else if(u.tag===18){if(d=u.return,d===null)throw Error(o(341));d.lanes|=s,m=d.alternate,m!==null&&(m.lanes|=s),Ii(d,s,t),d=u.sibling}else d=u.child;if(d!==null)d.return=u;else for(d=u;d!==null;){if(d===t){d=null;break}if(u=d.sibling,u!==null){u.return=d.return,d=u;break}d=d.return}u=d}xt(e,t,a.children,s),t=t.child}return t;case 9:return a=t.type,l=t.pendingProps.children,$s(t,s),a=_t(a),l=l(a),t.flags|=1,xt(e,t,l,s),t.child;case 14:return l=t.type,a=Jt(l,t.pendingProps),a=Jt(l.type,a),Ru(e,t,l,a,s);case 15:return Du(e,t,t.type,t.pendingProps,s);case 17:return l=t.type,a=t.pendingProps,a=t.elementType===l?a:Jt(l,a),xl(e,t),t.tag=1,St(l)?(e=!0,el(t)):e=!1,$s(t,s),bu(t,l,a),qi(t,l,a,s),Ji(null,t,l,!0,e,s);case 19:return Bu(e,t,s);case 22:return Tu(e,t,s)}throw Error(o(156,t.tag))};function oc(e,t){return za(e,t)}function Ff(e,t,s,l){this.tag=e,this.key=s,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=l,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function zt(e,t,s,l){return new Ff(e,t,s,l)}function ma(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Qf(e){if(typeof e=="function")return ma(e)?1:0;if(e!=null){if(e=e.$$typeof,e===z)return 11;if(e===ye)return 14}return 2}function Qn(e,t){var s=e.alternate;return s===null?(s=zt(e.tag,t,e.key,e.mode),s.elementType=e.elementType,s.type=e.type,s.stateNode=e.stateNode,s.alternate=e,e.alternate=s):(s.pendingProps=t,s.type=e.type,s.flags=0,s.subtreeFlags=0,s.deletions=null),s.flags=e.flags&14680064,s.childLanes=e.childLanes,s.lanes=e.lanes,s.child=e.child,s.memoizedProps=e.memoizedProps,s.memoizedState=e.memoizedState,s.updateQueue=e.updateQueue,t=e.dependencies,s.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},s.sibling=e.sibling,s.index=e.index,s.ref=e.ref,s}function Rl(e,t,s,l,a,u){var d=2;if(l=e,typeof e=="function")ma(e)&&(d=1);else if(typeof e=="string")d=5;else e:switch(e){case J:return is(s.children,a,u,t);case oe:d=8,a|=8;break;case be:return e=zt(12,s,t,a|2),e.elementType=be,e.lanes=u,e;case X:return e=zt(13,s,t,a),e.elementType=X,e.lanes=u,e;case K:return e=zt(19,s,t,a),e.elementType=K,e.lanes=u,e;case he:return Dl(s,a,u,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case De:d=10;break e;case ie:d=9;break e;case z:d=11;break e;case ye:d=14;break e;case we:d=16,l=null;break e}throw Error(o(130,e==null?e:typeof e,""))}return t=zt(d,s,t,a),t.elementType=e,t.type=l,t.lanes=u,t}function is(e,t,s,l){return e=zt(7,e,l,t),e.lanes=s,e}function Dl(e,t,s,l){return e=zt(22,e,l,t),e.elementType=he,e.lanes=s,e.stateNode={isHidden:!1},e}function ha(e,t,s){return e=zt(6,e,null,t),e.lanes=s,e}function ya(e,t,s){return t=zt(4,e.children!==null?e.children:[],e.key,t),t.lanes=s,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Uf(e,t,s,l,a){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Ul(0),this.expirationTimes=Ul(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Ul(0),this.identifierPrefix=l,this.onRecoverableError=a,this.mutableSourceEagerHydrationData=null}function ga(e,t,s,l,a,u,d,m,g){return e=new Uf(e,t,s,m,g),t===1?(t=1,u===!0&&(t|=8)):t=0,u=zt(3,null,null,t),e.current=u,u.stateNode=e,u.memoizedState={element:l,isDehydrated:s,cache:null,transitions:null,pendingSuspenseBoundaries:null},Di(u),e}function qf(e,t,s){var l=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(r)}catch(i){console.error(i)}}return r(),wa.exports=rp(),wa.exports}var Sc;function ip(){if(Sc)return _l;Sc=1;var r=lp();return _l.createRoot=r.createRoot,_l.hydrateRoot=r.hydrateRoot,_l}var ap=ip();const op=Bc(ap);class Bl extends Error{constructor(i,o,c){super(i),this.code=o,this.status=c,this.name="DashboardRequestError"}}const Da=new Set;let Rr;function up(){return Rr}function cp(r){return Da.add(r),Rr&&r(Rr),()=>{Da.delete(r)}}async function W(r,i={}){return Pa(r,o=>o.json(),i)}async function dp(r,i={}){return Pa(r,o=>o.text(),i)}async function us(r,i={}){return Pa(r,async()=>{},i)}async function Pa(r,i,o={}){const c=o.timeoutMs??5e3,f=o.method??"GET",p=new AbortController,y=window.setTimeout(()=>p.abort(),c),j={Accept:"application/json"};o.body!==void 0&&(j["Content-Type"]="application/json");try{Cr({path:r,status:"pending"});const b=await fetch(r,{headers:j,body:o.body===void 0?void 0:JSON.stringify(o.body),method:f,signal:p.signal});if(!b.ok){const k=await fp(b);throw Cr({path:r,status:"error",statusCode:b.status,message:k}),new Bl(k,b.status===503?"disabled":"http",b.status)}const N=await i(b);return Cr({path:r,status:"success",statusCode:b.status}),N}catch(b){if(b instanceof Bl)throw b;if(b instanceof DOMException&&b.name==="AbortError")throw Cr({path:r,status:"error",message:"Dashboard request timed out"}),new Bl("Dashboard request timed out","timeout");const N=b instanceof Error?b.message:"Dashboard request failed";throw Cr({path:r,status:"error",message:N}),new Bl(N,"network")}finally{window.clearTimeout(y)}}function Cr(r){Rr={...r,at:new Date().toISOString()},Da.forEach(i=>i(Rr))}async function fp(r){if((r.headers.get("Content-Type")??"").includes("application/json")){const c=await r.json().catch(()=>{}),f=(c==null?void 0:c.error)??(c==null?void 0:c.message);if(typeof f=="string"&&f.trim()!=="")return f}const o=await r.text().catch(()=>"");return o.trim()!==""?o.trim():`Dashboard request failed with status ${r.status}`}async function pp(r=5e3){return W("/api/dashboard/services",{timeoutMs:r})}let qn=Ac();function Ac(){return{status:"pending",promise:pp().then(i=>{qn={status:"success",value:i}}).catch(i=>{qn={status:"error",error:i}})}}function mp(){if(qn.status==="pending")throw qn.promise;if(qn.status==="error")throw qn.error;return qn.value}function hp(){qn=Ac()}function ue({children:r,className:i,type:o="button",...c}){return n.jsx("button",{className:i?`button ${i}`:"button",type:o,...c,children:r})}function Q({title:r,description:i,actionLabel:o,onAction:c}){return n.jsxs("div",{className:"empty-state",children:[n.jsx("strong",{children:r}),n.jsx("p",{children:i}),o&&c?n.jsx(ue,{onClick:c,children:o}):null]})}function Ne({title:r,children:i}){return n.jsxs("section",{className:"panel",children:[r?n.jsx("header",{className:"panel-head",children:n.jsx("h2",{children:r})}):null,n.jsx("div",{className:"panel-body",children:i})]})}const vn="/dashboard";function Ir(r){return r===vn||r===`${vn}/`?"/":r.startsWith(`${vn}/`)?r.slice(vn.length)||"/":r}function Al(r,i=window.location.pathname){return r===vn||r.startsWith(`${vn}/`)||!i.startsWith(vn)?r:r==="/"?`${vn}/`:`${vn}${r}`}function yp({services:r}){const i=r.filter(c=>c.status==="running").length,o=r.filter(c=>c.status==="disabled").length;return r.length===0?n.jsx("section",{className:"service-index-page","aria-label":"Services",children:n.jsx(Q,{title:"No dashboard services",description:"Configured services will appear here when they are available."})}):n.jsxs("section",{className:"service-index-page","aria-label":"Services",children:[n.jsxs("header",{className:"service-index-summary",children:[n.jsxs("div",{children:[n.jsx("h1",{children:"Services"}),n.jsx("p",{children:"Local dashboard registry from /api/dashboard/services."})]}),n.jsxs("dl",{className:"health-summary","aria-label":"Service health summary",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"Running"}),n.jsx("dd",{children:i})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Disabled"}),n.jsx("dd",{children:o})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Total"}),n.jsx("dd",{children:r.length})]})]})]}),n.jsx("div",{className:"service-index",children:r.map(c=>n.jsx("a",{className:"service-card",href:Al(c.path),children:n.jsxs(Ne,{children:[n.jsxs("div",{className:"service-card-head",children:[n.jsx("h2",{children:c.name}),n.jsx("span",{className:`service-status ${c.status}`,children:c.status})]}),n.jsx("p",{children:c.description}),c.endpoint?n.jsxs("dl",{className:"endpoint-summary",children:[n.jsx("dt",{children:"Endpoint"}),n.jsx("dd",{children:n.jsx("code",{children:c.endpoint})})]}):null]})},c.id))})]})}const zc=h.createContext(null);function gp({children:r}){const[i,o]=h.useState(null),c=h.useCallback(p=>new Promise(y=>{o({options:p,resolve:y})}),[]),f=h.useCallback(p=>{o(y=>(y==null||y.resolve(p),null))},[]);return n.jsxs(zc.Provider,{value:c,children:[r,i?n.jsx(xp,{options:i.options,onCancel:()=>f(!1),onConfirm:()=>f(!0)}):null]})}function Dr(){const r=h.useContext(zc);if(!r)throw new Error("useConfirm must be called inside ");return r}function xp({options:r,onCancel:i,onConfirm:o}){const c=h.useId(),f=h.useId(),p=h.useId(),y=r.confirmLabel??"Confirm",j=r.cancelLabel??"Cancel",b=r.tone??"default",N=r.requirePhrase??"",[k,S]=h.useState(""),L=h.useRef(null),E=N===""||k===N;h.useEffect(()=>{S("")},[r]),h.useEffect(()=>{N!==""&&L.current&&L.current.focus()},[N]),h.useEffect(()=>{function T(U){if(U.key==="Escape")U.preventDefault(),i();else if(U.key==="Enter"&&E){const V=U.target;if((V==null?void 0:V.tagName)==="TEXTAREA")return;U.preventDefault(),o()}}return document.addEventListener("keydown",T),()=>document.removeEventListener("keydown",T)},[i,o,E]);function D(T){T.target===T.currentTarget&&i()}return n.jsx("div",{className:"confirm-backdrop",onMouseDown:D,role:"presentation",children:n.jsxs("section",{"aria-describedby":r.description||r.detail?f:void 0,"aria-labelledby":c,"aria-modal":"true",className:`confirm-dialog tone-${b}`,role:"alertdialog",children:[n.jsx("h2",{className:"confirm-title",id:c,children:r.title}),r.description||r.detail?n.jsxs("div",{className:"confirm-body",id:f,children:[r.description?n.jsx("p",{className:"confirm-description",children:r.description}):null,r.detail?n.jsx("p",{className:"confirm-detail",children:r.detail}):null]}):null,N!==""?n.jsxs("div",{className:"confirm-phrase",children:[n.jsx("label",{htmlFor:p,children:r.requirePhraseLabel??n.jsxs(n.Fragment,{children:["Type ",n.jsx("code",{children:N})," to confirm"]})}),n.jsx("input",{autoComplete:"off",autoCorrect:"off",className:"confirm-phrase-input",id:p,onChange:T=>S(T.target.value),ref:L,spellCheck:!1,type:"text",value:k})]}):null,n.jsxs("div",{className:"confirm-actions",children:[n.jsx(ue,{onClick:i,type:"button",children:j}),n.jsx(ue,{autoFocus:N==="",className:b==="danger"?"danger primary":"primary",disabled:!E,onClick:o,type:"button",children:y})]})]})})}function bn(r){return{title:r.title,description:r.description,detail:n.jsxs(n.Fragment,{children:["Target: ",n.jsx("code",{children:r.target})]}),confirmLabel:r.confirmLabel??"Delete",tone:"danger",requirePhrase:r.target}}const wc=[1e3,2e3,4e3,8e3,16e3,3e4];function jp(){return`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/api/events`}class vp{constructor(){as(this,"ws",null);as(this,"listeners",new Map);as(this,"nextID",0);as(this,"retryIndex",0);as(this,"retryTimeout",null)}subscribe(i,o){const c=this.nextID;this.nextID+=1,this.listeners.set(c,{topics:new Set(i),cb:o}),this.ensureOpen();let f=!1;return()=>{f||(f=!0,this.listeners.delete(c),this.listeners.size===0&&this.close())}}ensureOpen(){this.ws||this.connect()}connect(){if(typeof WebSocket>"u")return;let i;try{i=new WebSocket(jp())}catch{this.scheduleReconnect();return}this.ws=i,i.onopen=()=>{this.retryIndex=0},i.onmessage=c=>{try{const f=JSON.parse(c.data);if(f.type==="ready")return;this.dispatch(f)}catch{}};const o=()=>{this.ws===i&&(this.ws=null,this.listeners.size!==0&&this.scheduleReconnect())};i.onerror=o,i.onclose=o}scheduleReconnect(){if(this.retryTimeout!==null)return;const i=wc[Math.min(this.retryIndex,wc.length-1)];this.retryIndex+=1,this.retryTimeout=window.setTimeout(()=>{this.retryTimeout=null,this.listeners.size>0&&!this.ws&&this.connect()},i)}dispatch(i){for(const o of this.listeners.values())if(!(o.topics.size>0&&!o.topics.has(i.service)))try{o.cb(i)}catch{}}close(){if(this.retryTimeout!==null&&(window.clearTimeout(this.retryTimeout),this.retryTimeout=null),this.ws){this.ws.onerror=null,this.ws.onclose=null;try{this.ws.close(1e3,"no listeners")}catch{}}this.ws=null,this.retryIndex=0}}const bp=new vp;function Sp(r,i){return bp.subscribe(r,i)}function cn({topics:r,onEvent:i,enabled:o=!0}){const c=h.useRef(i);h.useEffect(()=>{c.current=i},[i]);const f=r.slice().sort().join(",");h.useEffect(()=>{if(!o)return;const p=f?f.split(","):[];return Sp(p,j=>{c.current(j)})},[f,o])}async function wp(){return W("/api/messages")}async function Np(r){return W(`/api/messages/${encodeURIComponent(r)}`)}async function kp(r){return dp(`/api/messages/${encodeURIComponent(r)}/raw`)}async function Cp(){return us("/api/messages",{method:"DELETE"})}function cs(r){return!r||r.indexOf("=?")===-1?r:r.replace(/=\?([^?]+)\?([BbQq])\?([^?]*)\?=(\s+(?==\?))?/g,(i,o,c,f)=>{try{const p=c.toUpperCase()==="B"?Ep(f):Ip(f);return new TextDecoder(Rp(o)).decode(p)}catch{return i}})}function Sn(r){return r?cs(r).trim():""}function Ep(r){const i=atob(r.replace(/\s+/g,"")),o=new Uint8Array(i.length);for(let c=0;c{if(b){c({status:"success",messages:[]});return}c({status:"loading"}),wp().then(({messages:D})=>{c({status:"success",messages:D}),p(T=>{var U;return T??((U=D[0])==null?void 0:U.id)})}).catch(D=>{c({status:"error",message:D.message})})},[b]);cn({topics:["mail"],onEvent:N,enabled:!b});async function k(){b||!await i(bn({title:"Clear inbox",description:"Delete all stored Mail messages from this local devcloud inbox.",target:"CLEAR INBOX",confirmLabel:"Clear inbox"}))||(c({status:"loading"}),Cp().then(()=>{p(void 0),c({status:"success",messages:[]})}).catch(T=>{c({status:"error",message:T.message})}))}h.useEffect(()=>{N()},[N]);const S=o.status==="success"?o.messages:[],L=h.useMemo(()=>_p(S,y),[S,y]),E=L.find(D=>D.id===f)??L[0]??(y.trim()===""?S[0]:void 0);return b?n.jsx(Ne,{title:"Mail",children:n.jsx(Q,{title:"Mail is disabled",description:"Enable services.mail.enabled in .devcloud/config.yaml to inspect received messages."})}):n.jsxs("div",{className:"mail-shell",children:[n.jsxs(Ne,{title:"Inbox",children:[n.jsxs("div",{className:"mail-inbox-toolbar",children:[n.jsxs("label",{className:"mail-inbox-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter messages",onChange:D=>j(D.target.value),placeholder:"sender, recipient, subject",type:"search",value:y})]}),n.jsxs("div",{className:"mail-inbox-actions",children:[n.jsx(ue,{onClick:N,children:"Refresh"}),n.jsx(ue,{className:"danger",disabled:S.length===0,onClick:k,children:"Clear all"})]})]}),o.status==="loading"?n.jsx(Q,{title:"Loading messages",description:"Reading the local Mail inbox."}):null,o.status==="error"?n.jsx(Q,{title:"Mail messages unavailable",description:o.message,actionLabel:"Retry",onAction:N}):null,o.status==="success"?n.jsx(Tp,{messages:L,selectedID:E==null?void 0:E.id,totalMessages:S.length,onSelectMessage:p}):null]}),n.jsx(Ne,{title:"Message",children:n.jsx(Lp,{message:E})})]})}function Tp({messages:r,selectedID:i,totalMessages:o,onSelectMessage:c}){return o===0?n.jsx(Q,{title:"Inbox is empty",description:"Send mail to localhost:1025 (relaxed SMTP AUTH) and refresh."}):r.length===0?n.jsx(Q,{title:"No matches",description:"Try a different filter or clear the search."}):n.jsx("ul",{className:"mail-inbox-list","aria-label":"Messages",children:r.map(f=>{const p=f.id===i,y=cs(f.subject)||"(No subject)",j=Sn(f.from)||"(unknown sender)",b=Fc(f);return n.jsx("li",{children:n.jsxs("button",{"aria-current":p?"true":void 0,className:p?"mail-inbox-row active":"mail-inbox-row",onClick:()=>c(f.id),type:"button",children:[n.jsxs("span",{className:"mail-inbox-row-top",children:[n.jsx("span",{className:"mail-inbox-sender",children:j}),n.jsx("time",{className:"mail-inbox-time",dateTime:f.receivedAt,title:Ta(f.receivedAt),children:Qc(f.receivedAt)})]}),n.jsx("span",{className:"mail-inbox-subject",children:y}),b?n.jsx("span",{className:"mail-inbox-snippet",children:b}):null]})},f.id)})})}function Lp({message:r}){const[i,o]=h.useState("preview"),[c,f]=h.useState(!1);if(h.useEffect(()=>{o("preview"),f(!1)},[r==null?void 0:r.id]),!r)return n.jsx(Q,{title:"Select a message",description:"Messages accepted via SMTP appear here. Pick a row on the left to inspect."});const p=cs(r.subject)||"(No subject)",y=Sn(r.from),j=r.to.map(Sn).filter(Boolean),b=Ca(r.headers,"Cc"),N=Ca(r.headers,"Bcc"),k=Ca(r.headers,"Reply-To"),S=r.attachments??[],L=r.textBody||r.htmlBody||r.parseError||"",E=L.trim().length>0,D=[{id:"preview",label:"Preview"},{id:"attachments",label:"Attachments",count:S.length},{id:"raw",label:"Raw"}];return n.jsxs("article",{className:"mail-inspector",children:[n.jsxs("header",{className:"mail-inspector-header",children:[n.jsx("h1",{className:"mail-subject",children:p}),n.jsxs("dl",{className:"mail-recipients",children:[n.jsx(Er,{label:"From",values:y?[y]:["(unknown sender)"]}),n.jsx(Er,{label:"To",values:j.length>0?j:["(no recipients)"]}),b.length>0?n.jsx(Er,{label:"Cc",values:b}):null,N.length>0?n.jsx(Er,{label:"Bcc",values:N}):null,k.length>0?n.jsx(Er,{label:"Reply-To",values:k}):null,n.jsxs("div",{className:"mail-recipients-row",children:[n.jsx("dt",{children:"Date"}),n.jsxs("dd",{children:[n.jsx("time",{dateTime:r.receivedAt,title:Ta(r.receivedAt),children:Ta(r.receivedAt)}),n.jsxs("span",{className:"mail-recipients-aux",children:["· ",Qc(r.receivedAt)]})]})]})]})]}),n.jsx("nav",{className:"mail-tabs",role:"tablist","aria-label":"Message view",children:D.map(T=>n.jsxs("button",{role:"tab","aria-selected":i===T.id,className:i===T.id?"mail-tab active":"mail-tab",onClick:()=>o(T.id),type:"button",children:[T.label,T.count!==void 0&&T.count>0?n.jsx("span",{className:"mail-tab-count",children:T.count}):null]},T.id))}),i==="preview"?n.jsx($p,{body:L,hasBody:E,parseError:r.parseError}):null,i==="attachments"?n.jsx(Pp,{attachments:S}):null,i==="raw"?n.jsx(Mp,{messageID:r.id}):null,n.jsxs("details",{className:"mail-headers",open:c,onToggle:T=>f(T.target.open),children:[n.jsxs("summary",{children:[n.jsx("span",{children:"Headers"}),n.jsx("span",{className:"mail-headers-count",children:Object.keys(r.headers??{}).length})]}),n.jsx(Op,{headers:r.headers??{}})]})]})}function Er({label:r,values:i}){return n.jsxs("div",{className:"mail-recipients-row",children:[n.jsx("dt",{children:r}),n.jsx("dd",{children:i.join(", ")})]})}function $p({body:r,hasBody:i,parseError:o}){return!i&&!o?n.jsx(Q,{title:"No body",description:"The message contains no decoded text content."}):o&&!i?n.jsxs("div",{className:"mail-preview-error",children:[n.jsx("span",{className:"mail-eyebrow",children:"Parse error"}),n.jsx("p",{children:o})]}):n.jsx("div",{className:"mail-preview",lang:"auto",children:Ap(r)})}function Pp({attachments:r}){return r.length===0?n.jsx(Q,{title:"No attachments",description:"This message has no parsed attachments."}):n.jsx("ul",{className:"mail-attachment-list","aria-label":"Attachments",children:r.map(i=>n.jsxs("li",{className:"mail-attachment-item",children:[n.jsx("span",{className:"mail-attachment-icon","aria-hidden":"true",children:zp(i.contentType)}),n.jsxs("div",{className:"mail-attachment-body",children:[n.jsx("span",{className:"mail-attachment-name",children:i.fileName||i.id}),n.jsxs("span",{className:"mail-attachment-meta",children:[i.contentType||"application/octet-stream"," · ",Fp(i.size)]})]})]},i.id))})}function Mp({messageID:r}){const[i,o]=h.useState({status:"loading"});if(h.useEffect(()=>{let p=!1;return o({status:"loading"}),kp(r).then(y=>{p||o({status:"success",raw:y})}).catch(y=>{p||o({status:"error",message:y.message})}),()=>{p=!0}},[r]),i.status==="loading")return n.jsx(Q,{title:"Loading raw source",description:"Reading the stored RFC 822 message."});if(i.status==="error")return n.jsx(Q,{title:"Raw source unavailable",description:i.message});const c=i.raw;function f(){navigator.clipboard&&navigator.clipboard.writeText(c).catch(()=>{})}return n.jsxs("div",{className:"mail-raw",children:[n.jsxs("div",{className:"mail-raw-toolbar",children:[n.jsxs("span",{className:"mail-raw-meta",children:[c.length.toLocaleString()," bytes"]}),n.jsx("button",{className:"mail-raw-copy",onClick:f,type:"button",children:"Copy"})]}),n.jsx("pre",{className:"mail-raw-pre",children:c||"(empty)"})]})}function Op({headers:r}){const i=Object.entries(r).sort(([o],[c])=>o.localeCompare(c));return i.length===0?n.jsx("p",{className:"mail-headers-empty",children:"No parsed headers."}):n.jsx("table",{className:"mail-headers-table",children:n.jsx("tbody",{children:i.map(([o,c])=>n.jsxs("tr",{children:[n.jsx("th",{scope:"row",children:o}),n.jsx("td",{children:c.map(cs).join(", ")})]},o))})})}function _p(r,i){const o=i.trim().toLowerCase();return o===""?r:r.filter(c=>[cs(c.subject),Sn(c.from),...c.to.map(Sn),Fc(c)].join(" ").toLowerCase().includes(o))}function Fc(r){return(r.textBody||r.htmlBody||r.parseError||"").replace(/\s+/g," ").trim()}function Ca(r,i){if(!r)return[];const o=i.toLowerCase();for(const[c,f]of Object.entries(r))if(c.toLowerCase()===o)return f.flatMap(p=>Bp(p)).map(Sn).filter(Boolean);return[]}function Bp(r){return r.split(/,(?![^<]*>)/).map(i=>i.trim()).filter(i=>i.length>0)}function Ap(r){const i=[],o=/(https?:\/\/[^\s<>"']+)|((?:[a-zA-Z0-9._%+-]+)@(?:[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}))/g;let c=0,f=0,p=o.exec(r);for(;p!==null;){const j=r.slice(c,p.index);j&&(f+=1,i.push(n.jsx("span",{children:j},`t-${f}`))),f+=1,p[1]?i.push(n.jsx("a",{href:p[1],rel:"noopener noreferrer",target:"_blank",children:p[1]},`l-${f}`)):i.push(n.jsx("a",{href:`mailto:${p[2]}`,children:p[2]},`m-${f}`)),c=o.lastIndex,p=o.exec(r)}const y=r.slice(c);return y&&(f+=1,i.push(n.jsx("span",{children:y},`t-${f}`))),i}function zp(r){if(!r)return"📎";const i=r.toLowerCase();return i.startsWith("image/")?"🖼":i==="application/pdf"?"📄":i.startsWith("audio/")?"🎵":i.startsWith("video/")?"🎬":i.includes("zip")||i.includes("tar")||i.includes("gzip")?"🗜":i.startsWith("text/")?"📝":"📎"}function Ta(r){const i=new Date(r);return Number.isNaN(i.getTime())?r||"unknown":i.toLocaleString()}function Qc(r){const i=new Date(r);if(Number.isNaN(i.getTime()))return r||"unknown";const o=Date.now()-i.getTime();if(o<0)return"in the future";const c=Math.floor(o/1e3);if(c<60)return"just now";const f=Math.floor(c/60);if(f<60)return`${f}m ago`;const p=Math.floor(f/60);if(p<24)return`${p}h ago`;const y=Math.floor(p/24);return y<7?`${y}d ago`:i.toLocaleDateString()}function Fp(r){if(!Number.isFinite(r)||r<0)return"unknown";if(r<1024)return`${r} B`;const i=["KB","MB","GB","TB"];let o=r/1024,c=0;for(;o>=1024&&c=10?0:1)} ${i[c]}`}function Qp({buckets:r,activeBucket:i,disabled:o,onDeleteBucket:c,onSelectBucket:f}){return r.length===0?n.jsx(Q,{title:"No buckets",description:"Buckets created through the S3 API will appear here."}):n.jsx("ul",{className:"s3-bucket-list","aria-label":"S3 buckets",children:r.map(p=>{const y=p.name===i,j=Hp(p.creationDate),b=Vp(p.objectCount),N=`${p.name} +${b} · created ${Kp(p.creationDate)}`;return n.jsxs("li",{className:y?"s3-bucket-row active":"s3-bucket-row",title:N,children:[n.jsxs("button",{className:"s3-bucket-select",onClick:()=>f(p.name),title:N,type:"button",children:[n.jsx("span",{className:"s3-bucket-icon","aria-hidden":!0,children:n.jsx(Up,{})}),n.jsxs("span",{className:"s3-bucket-info",children:[n.jsx("span",{className:"s3-bucket-name",title:p.name,children:p.name}),n.jsxs("span",{className:"s3-bucket-meta",children:[b," · ",j]})]})]}),n.jsx("button",{"aria-label":`Delete bucket ${p.name}`,className:"s3-icon-button danger s3-bucket-delete",disabled:o,onClick:()=>c(p.name),type:"button",children:n.jsx(qp,{})})]},p.name)})})}function Up(){return n.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M2.5 4.5h11l-1 8.5a1 1 0 0 1-1 .9H4.5a1 1 0 0 1-1-.9z"}),n.jsx("path",{d:"M2.5 4.5L4 2.5h8l1.5 2"}),n.jsx("path",{d:"M6 7v4"}),n.jsx("path",{d:"M10 7v4"})]})}function qp(){return n.jsxs("svg",{"aria-hidden":!0,width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M2.5 4h11"}),n.jsx("path",{d:"M6 4V2.5h4V4"}),n.jsx("path",{d:"M4 4l.7 9.2a1 1 0 0 0 1 .9h4.6a1 1 0 0 0 1-.9L12 4"}),n.jsx("path",{d:"M6.5 7v5"}),n.jsx("path",{d:"M9.5 7v5"})]})}function Vp(r){return!Number.isFinite(r)||r<0?"— objects":r===1?"1 object":`${r} objects`}function Kp(r){const i=new Date(r);return Number.isNaN(i.getTime())?r||"unknown":i.toLocaleString()}function Hp(r){const i=new Date(r);if(Number.isNaN(i.getTime()))return"created —";const o=Date.now()-i.getTime(),c=60*1e3,f=60*c,p=24*f,y=7*p,j=30*p,b=365*p;return o"")).trim()||`S3 mutation failed with status ${r.status}`}function rm({bucketName:r,activeObjectKey:i,disabled:o,refreshNonce:c,onClearObject:f,onDeleteObject:p,onUploadObject:y,onSelectObject:j}){const[b,N]=h.useState(""),[k,S]=h.useState({status:"idle"});if(h.useEffect(()=>{if(f(),!r){S({status:"idle"});return}let E=!1;return S({status:"loading"}),Yp(r,b.trim()).then(({objects:D})=>{E||S({status:"success",objects:D})}).catch(D=>{E||S({status:"error",message:D.message})}),()=>{E=!0}},[r,f,b,c]),!r)return n.jsx(Q,{title:"Select a bucket",description:"Choose a bucket to browse its objects."});const L=k.status==="success"?k.objects:[];return n.jsxs("div",{className:"s3-browser",children:[n.jsxs("div",{className:"s3-browser-toolbar",children:[n.jsx(im,{prefix:b,onChange:N}),n.jsx(am,{disabled:o,onUploadObject:y})]}),n.jsx(lm,{bucketName:r,disabled:o}),k.status==="loading"?n.jsx(Q,{title:"Loading objects",description:`Reading objects in ${r}.`}):null,k.status==="error"?n.jsx(Q,{title:"Objects unavailable",description:k.message}):null,k.status==="success"&&L.length===0?n.jsx(Q,{title:"No objects",description:b.trim()===""?`Objects uploaded to ${r} will appear here.`:`No objects in ${r} match this prefix.`}):null,k.status==="success"&&L.length>0?n.jsx("div",{className:"s3-object-table-wrap",children:n.jsxs("table",{className:"s3-object-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Key"}),n.jsx("th",{scope:"col",children:"Size"}),n.jsx("th",{scope:"col",children:"Modified"}),n.jsx("th",{scope:"col",children:"Type"}),n.jsx("th",{"aria-label":"Row actions",className:"s3-object-actions-head",scope:"col"})]})}),n.jsx("tbody",{children:L.map(E=>{const D=E.key===i;return n.jsxs("tr",{className:D?"s3-object-row active":"s3-object-row",children:[n.jsx("td",{children:n.jsx("button",{className:"s3-object-key",onClick:()=>j(E),title:E.key,type:"button",children:E.key})}),n.jsx("td",{className:"s3-object-numeric",children:um(E.size)}),n.jsx("td",{className:"s3-object-numeric",children:qc(E.lastModified)}),n.jsx("td",{className:"s3-object-type",children:E.contentType||"application/octet-stream"}),n.jsxs("td",{className:"s3-object-actions",children:[n.jsx("a",{"aria-label":`Download ${E.key}`,className:"s3-icon-button neutral",href:cm(E.downloadUrl),title:"Download",children:n.jsx(pm,{})}),n.jsx("button",{"aria-label":`Delete ${E.key}`,className:"s3-icon-button danger",disabled:o,onClick:()=>p(E),title:"Delete",type:"button",children:n.jsx(mm,{})})]})]},E.key)})})]})}):null]})}function lm({bucketName:r,disabled:i}){const[o,c]=h.useState({status:"loading"}),[f,p]=h.useState(0),[y,j]=h.useState(""),b=Dr();h.useEffect(()=>{let k=!1;return c({status:"loading"}),Zp(r).then(({uploads:S})=>{k||c({status:"success",uploads:S})}).catch(S=>{k||c({status:"error",message:S.message})}),()=>{k=!0}},[r,f]);async function N(k){if(!(i||y!==""||!await b(bn({title:"Abort multipart upload",description:"Pending parts will be discarded and the upload will be unrecoverable.",target:k.uploadId,confirmLabel:"Abort upload"})))){j(k.uploadId);try{await em(r,k.uploadId),p(L=>L+1)}finally{j("")}}}return o.status!=="success"||o.uploads.length===0?null:n.jsxs("details",{className:"s3-multipart-details",children:[n.jsxs("summary",{children:[n.jsx("span",{children:"Incomplete multipart uploads"}),n.jsx("span",{className:"s3-multipart-count",children:o.uploads.length})]}),n.jsx("ul",{className:"s3-multipart-list",children:o.uploads.map(k=>n.jsxs("li",{className:"s3-multipart-item",children:[n.jsxs("div",{className:"s3-multipart-meta",children:[n.jsx("strong",{children:k.key}),n.jsx("code",{children:k.uploadId}),n.jsx("span",{children:qc(k.initiated)})]}),n.jsx(ue,{"aria-label":`Abort multipart upload ${k.uploadId} with confirmation`,className:"danger",disabled:i||y!=="",onClick:()=>void N(k),children:y===k.uploadId?"Aborting":"Abort"})]},k.uploadId))})]})}function im({prefix:r,onChange:i}){return n.jsxs("label",{className:"s3-search",children:[n.jsx(dm,{}),n.jsx("input",{"aria-label":"Filter objects by prefix",onChange:o=>i(o.target.value),placeholder:"Filter by prefix (e.g. docs/)",type:"search",value:r})]})}function am({disabled:r,onUploadObject:i}){const o=h.useRef(null),[c,f]=h.useState(""),[p,y]=h.useState(""),[j,b]=h.useState(""),[N,k]=h.useState(!1),S=h.useRef(null);async function L(E){var T,U;E.preventDefault();const D=(U=(T=o.current)==null?void 0:T.files)==null?void 0:U[0];if(!(r||N||c.trim()===""||!D)){k(!0);try{await i({key:c.trim(),file:D,contentType:p.trim()||D.type||"application/octet-stream",metadata:om(j)}),f(""),y(""),b(""),o.current&&(o.current.value=""),S.current&&(S.current.open=!1)}finally{k(!1)}}}return n.jsxs("details",{className:"s3-upload-details",ref:S,children:[n.jsxs("summary",{children:[n.jsx(fm,{}),n.jsx("span",{children:"Upload object"})]}),n.jsxs("form",{className:"s3-upload-form",onSubmit:L,children:[n.jsxs("label",{className:"s3-field",children:[n.jsx("span",{children:"Key"}),n.jsx("input",{"aria-label":"S3 upload object key",className:"s3-text-input",disabled:r||N,onChange:E=>f(E.target.value),placeholder:"docs/readme.txt",value:c})]}),n.jsxs("label",{className:"s3-field",children:[n.jsx("span",{children:"Content-Type"}),n.jsx("input",{"aria-label":"S3 upload content type",className:"s3-text-input",disabled:r||N,onChange:E=>y(E.target.value),placeholder:"text/plain",value:p})]}),n.jsxs("label",{className:"s3-field s3-field-full",children:[n.jsx("span",{children:"File"}),n.jsx("input",{"aria-label":"S3 upload file",className:"s3-file-input",disabled:r||N,ref:o,type:"file"})]}),n.jsxs("label",{className:"s3-field s3-field-full",children:[n.jsx("span",{children:"Metadata (x-amz-meta)"}),n.jsx("textarea",{"aria-label":"S3 upload metadata",className:"s3-text-input",disabled:r||N,onChange:E=>b(E.target.value),placeholder:`source=dashboard +purpose=local-test`,rows:2,value:j})]}),n.jsx("div",{className:"s3-upload-actions",children:n.jsx(ue,{disabled:r||N||c.trim()==="",type:"submit",children:N?"Uploading…":"Upload"})})]})]})}function om(r){return r.split(/\r?\n/).reduce((i,o)=>{const c=o.trim();if(c==="")return i;const[f,...p]=c.split("="),y=f.trim(),j=p.join("=").trim();return y!==""&&(i[y]=j),i},{})}function um(r){if(!Number.isFinite(r)||r<0)return"unknown";if(r<1024)return`${r} B`;const i=["KB","MB","GB","TB"];let o=r/1024,c=0;for(;o>=1024&&c=10?0:1)} ${i[c]}`}function qc(r){const i=new Date(r);return Number.isNaN(i.getTime())?r||"unknown":i.toLocaleString()}function cm(r){return r.startsWith("/api/s3/")?r:"#"}function dm(){return n.jsxs("svg",{"aria-hidden":!0,width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("circle",{cx:"7",cy:"7",r:"4.5"}),n.jsx("path",{d:"M13.5 13.5L10.5 10.5"})]})}function fm(){return n.jsxs("svg",{"aria-hidden":!0,width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",children:[n.jsx("path",{d:"M8 3v10"}),n.jsx("path",{d:"M3 8h10"})]})}function pm(){return n.jsxs("svg",{"aria-hidden":!0,width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M8 2.5v8"}),n.jsx("path",{d:"M4.5 7L8 10.5 11.5 7"}),n.jsx("path",{d:"M3 13h10"})]})}function mm(){return n.jsxs("svg",{"aria-hidden":!0,width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M2.5 4h11"}),n.jsx("path",{d:"M6 4V2.5h4V4"}),n.jsx("path",{d:"M4 4l.7 9.2a1 1 0 0 0 1 .9h4.6a1 1 0 0 0 1-.9L12 4"}),n.jsx("path",{d:"M6.5 7v5"}),n.jsx("path",{d:"M9.5 7v5"})]})}function hm({bucketName:r,disabled:i,object:o,onCopyObject:c}){if(!o)return n.jsxs("div",{className:"s3-inspector-empty",children:[n.jsx(vm,{}),n.jsx("p",{className:"s3-inspector-empty-title",children:"No object selected"}),n.jsx("p",{className:"s3-inspector-empty-body",children:r?`Pick an object in ${r} to see metadata, copy, and download actions.`:"Select a bucket first, then click an object to inspect it here."})]});const f=Object.entries(o.metadata??{});return n.jsxs("div",{className:"s3-inspector",children:[n.jsxs("div",{className:"s3-inspector-section",children:[n.jsx("span",{className:"s3-field-label",children:"Object"}),n.jsx("code",{className:"s3-inspector-key",title:o.key,children:o.key}),n.jsx("code",{className:"s3-inspector-uri",title:o.s3Uri,children:o.s3Uri})]}),n.jsxs("dl",{className:"s3-inspector-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"Size"}),n.jsx("dd",{children:gm(o.size)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Content type"}),n.jsx("dd",{children:o.contentType||"application/octet-stream"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Last modified"}),n.jsx("dd",{children:xm(o.lastModified)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"ETag"}),n.jsx("dd",{children:n.jsx("code",{children:o.etag||"unknown"})})]})]}),n.jsxs("div",{className:"s3-inspector-section",children:[n.jsx("span",{className:"s3-field-label",children:"Metadata"}),f.length===0?n.jsx("p",{className:"s3-inspector-muted",children:"No user metadata."}):n.jsx("dl",{className:"s3-inspector-metadata",children:f.map(([p,y])=>n.jsxs("div",{children:[n.jsx("dt",{children:p}),n.jsx("dd",{children:y})]},p))})]}),n.jsxs("a",{className:"s3-inspector-download",href:jm(o.downloadUrl),children:[n.jsx(bm,{}),n.jsx("span",{children:"Download object"})]}),n.jsx(ym,{disabled:i,object:o,onCopyObject:c})]})}function ym({disabled:r,object:i,onCopyObject:o}){const[c,f]=h.useState(`${i.key}.copy`),[p,y]=h.useState(!1);h.useEffect(()=>{f(`${i.key}.copy`)},[i.key]);async function j(b){b.preventDefault();const N=c.trim();if(!(r||p||N==="")){y(!0);try{await o(N)}finally{y(!1)}}}return n.jsxs("form",{className:"s3-inspector-copy",onSubmit:j,children:[n.jsxs("label",{className:"s3-field",children:[n.jsx("span",{children:"Copy to key"}),n.jsx("input",{"aria-label":"S3 copy destination key",className:"s3-text-input",disabled:r||p,onChange:b=>f(b.target.value),value:c})]}),n.jsx(ue,{disabled:r||p||c.trim()==="",type:"submit",children:p?"Copying…":"Copy"})]})}function gm(r){if(!Number.isFinite(r)||r<0)return"unknown";if(r<1024)return`${r} B`;const i=["KB","MB","GB","TB"];let o=r/1024,c=0;for(;o>=1024&&c=10?0:1)} ${i[c]}`}function xm(r){const i=new Date(r);return Number.isNaN(i.getTime())?r||"unknown":i.toLocaleString()}function jm(r){return r.startsWith("/api/s3/")?r:"#"}function vm(){return n.jsxs("svg",{"aria-hidden":!0,width:"36",height:"36",viewBox:"0 0 36 36",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M7 11l11-6 11 6v14L18 31 7 25z"}),n.jsx("path",{d:"M7 11l11 6 11-6"}),n.jsx("path",{d:"M18 17v14"})]})}function bm(){return n.jsxs("svg",{"aria-hidden":!0,width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M8 2.5v8"}),n.jsx("path",{d:"M4.5 7L8 10.5 11.5 7"}),n.jsx("path",{d:"M3 13h10"})]})}function Sm({service:r}){var ie;const[i,o]=h.useState({status:"loading"}),[c,f]=h.useState(),[p,y]=h.useState(),[j,b]=h.useState(""),[N,k]=h.useState(""),[S,L]=h.useState(0),E=(r==null?void 0:r.status)==="disabled",D=Dr(),T=h.useCallback(()=>{if(E){o({status:"success",buckets:[]}),f(void 0),y(void 0);return}o({status:"loading"}),Jp().then(({buckets:z})=>{o({status:"success",buckets:z}),f(X=>{var K;return X&&z.some(ye=>ye.name===X)?X:(K=z[0])==null?void 0:K.name})}).catch(z=>{o({status:"error",message:z.message})})},[E]);h.useEffect(()=>{T()},[T]);const U=h.useCallback(z=>{T(),z.type.startsWith("s3.object.")&&L(X=>X+1)},[T]);cn({topics:["s3"],onEvent:U,enabled:!E});const V=i.status==="success"?i.buckets:[],se=(ie=V.find(z=>z.name===c))==null?void 0:ie.name,q=p&&se?p:void 0,me=h.useCallback(()=>{y(void 0)},[]);if(E)return n.jsx(Ne,{title:"S3",children:n.jsx(Q,{title:"S3 is disabled",description:"Enable the S3 service in devcloud config to browse buckets and objects."})});function Se(z){f(z),y(void 0)}function Ce(){const z=j.trim();E||z===""||Wp(z).then(X=>{k(`Created bucket ${X.name}`),b(""),f(X.name),T()}).catch(X=>k(X.message))}async function J(z){E||!await D(bn({title:"Delete bucket",description:"All objects and metadata in this bucket will be removed. This cannot be undone.",target:z}))||Gp(z).then(()=>{k(`Deleted bucket ${z}`),f(K=>K===z?void 0:K),y(void 0),T()}).catch(K=>k(K.message))}async function oe(z){!se||E||!await D(bn({title:"Delete object",description:"This object will be permanently removed from the bucket.",target:z.key}))||Xp(se,z.key).then(()=>{k(`Deleted object ${z.s3Uri}`),y(void 0),L(K=>K+1),T()}).catch(K=>k(K.message))}async function be(z){if(!(!se||E))try{const X=await tm({bucketName:se,objectKey:z.key,body:z.file,contentType:z.contentType,metadata:z.metadata});k(`Uploaded object ${X.s3Uri}`),y(X),L(K=>K+1),T()}catch(X){throw k(X instanceof Error?X.message:"S3 upload failed"),X}}async function De(z){if(!(!se||!q||E))try{const X=await nm({sourceBucketName:se,sourceObjectKey:q.key,destinationBucketName:se,destinationObjectKey:z});k(`Copied object ${q.s3Uri} to ${X.s3Uri}`),y(X),L(K=>K+1),T()}catch(X){throw k(X instanceof Error?X.message:"S3 copy failed"),X}}return n.jsxs("div",{className:"s3-workspace",children:[n.jsxs(Ne,{title:"Buckets",children:[n.jsxs("div",{className:"s3-bucket-toolbar",children:[n.jsx("span",{className:"s3-bucket-count",children:V.length===1?"1 bucket":`${V.length} buckets`}),n.jsx("button",{"aria-label":"Refresh buckets",className:"s3-icon-button neutral",onClick:T,type:"button",children:n.jsx(Nm,{})})]}),n.jsx(wm,{bucketName:j,disabled:E,onChange:b,onCreate:Ce}),i.status==="loading"?n.jsx(Q,{title:"Loading buckets",description:"Reading the local S3 bucket registry."}):null,i.status==="error"?n.jsx(Q,{title:"S3 buckets unavailable",description:i.message,actionLabel:"Retry",onAction:T}):null,i.status==="success"?n.jsx(Qp,{buckets:V,activeBucket:se,disabled:E,onDeleteBucket:J,onSelectBucket:Se}):null]}),n.jsx(Ne,{title:se?`Objects · ${se}`:"Objects",children:n.jsx(rm,{bucketName:se,activeObjectKey:q==null?void 0:q.key,disabled:E,refreshNonce:S,onClearObject:me,onDeleteObject:oe,onUploadObject:be,onSelectObject:y})}),n.jsx(Ne,{title:"Inspector",children:n.jsx(hm,{bucketName:se,disabled:E,object:q,onCopyObject:De})}),N?n.jsx("p",{className:"s3-status-banner",children:N}):null]})}function wm({bucketName:r,disabled:i,onChange:o,onCreate:c}){return n.jsxs("form",{className:"s3-bucket-create",onSubmit:f=>{f.preventDefault(),c()},children:[n.jsx("input",{"aria-label":"New bucket name",className:"s3-text-input",disabled:i,onChange:f=>o(f.target.value),placeholder:"New bucket name",value:r}),n.jsx(ue,{disabled:i||r.trim()==="",type:"submit",children:"Create"})]})}function Nm(){return n.jsxs("svg",{"aria-hidden":!0,width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[n.jsx("path",{d:"M13.5 8a5.5 5.5 0 1 1-1.61-3.89"}),n.jsx("path",{d:"M13.5 3v3h-3"})]})}async function km(){return W("/api/dynamodb/status")}async function Cm(){return W("/api/dynamodb/tables")}async function Em(r){return W("/api/dynamodb/tables",{method:"POST",body:{input:r}})}async function Im(r,i=100){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/items?limit=${encodeURIComponent(String(i))}`)}async function Rm(r,i){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/items`,{method:"POST",body:{input:i}})}async function Dm(r,i){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/items/update`,{method:"POST",body:{input:i}})}async function Tm(r,i,o){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/items/delete`,{method:"POST",body:{input:i,confirmation:o}})}async function Lm(r,i){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/query`,{method:"POST",body:{input:i}})}async function $m(r,i){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/scan`,{method:"POST",body:{input:i}})}async function Pm(r){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}`)}async function Mm(r){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/indexes`)}async function Om(r){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/ttl`)}async function _m(r,i){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/ttl`,{method:"POST",body:{input:i}})}async function Bm(r,i,o){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/delete`,{method:"POST",body:{input:i,confirmation:o}})}async function Am(r){return W(`/api/dynamodb/tables/${encodeURIComponent(r)}/streams`)}const La="devcloud.dynamodb.recentOperations.v1",Ma=10,zm=`{ "TableName": "Demo", "AttributeDefinitions": [ { "AttributeName": "pk", "AttributeType": "S" } @@ -48,12 +48,12 @@ purpose=local-test`,rows:2,value:v})]}),n.jsx("div",{className:"s3-upload-action { "AttributeName": "pk", "KeyType": "HASH" } ], "BillingMode": "PAY_PER_REQUEST" -}`,Bm=`{ +}`,Fm=`{ "Item": { "pk": { "S": "user#1" }, "name": { "S": "Ada" } } -}`,Am=`{ +}`,Qm=`{ "Key": { "pk": { "S": "user#1" } }, @@ -64,19 +64,19 @@ purpose=local-test`,rows:2,value:v})]}),n.jsx("div",{className:"s3-upload-action "ExpressionAttributeValues": { ":name": { "S": "Grace" } } -}`,zm=`{ +}`,Um=`{ "Key": { "pk": { "S": "user#1" } } -}`,Fm=`{ +}`,qm=`{ "TimeToLiveSpecification": { "Enabled": true, "AttributeName": "expiresAt" } -}`,Qm=`{ +}`,Vm=`{ ":pk": { "S": "user#1" } -}`;function Um(r){return{status:"disabled",running:!1,endpoint:(r==null?void 0:r.endpoint)??"http://127.0.0.1:8000",region:"us-east-1",storagePath:(r==null?void 0:r.storagePath)??".devcloud/data/dynamodb",tableCount:0}}function Oa(r){const i=r.keySchema??[];return i.length===0?"No key schema":i.map(o=>`${o.AttributeName} ${o.KeyType}`).join(" / ")}function qm(r){return(r.globalSecondaryIndexes??[]).length+(r.localSecondaryIndexes??[]).length}function Vm(r){const i=r.attributeDefinitions??[];return i.length===0?"none":i.map(o=>`${o.AttributeName} ${o.AttributeType}`).join(", ")}function Km(r){const i=r.timeToLiveDescription;return!i||i.TimeToLiveStatus===""?"not configured":i.AttributeName?`${i.TimeToLiveStatus} on ${i.AttributeName}`:i.TimeToLiveStatus}function Hm(r){var o;if(!r.streamEnabled)return"disabled";const i=((o=r.streamSpecification)==null?void 0:o.StreamViewType)??"enabled";return r.latestStreamLabel?`${i} (${r.latestStreamLabel})`:i}function Ea(r){const i=Number.parseInt(r,10);return!Number.isFinite(i)||i<=0?100:Math.min(i,1e3)}function os(r){try{const i=JSON.parse(r);return!i||Array.isArray(i)||typeof i!="object"?{ok:!1,message:"Input must be a JSON object."}:{ok:!0,value:i}}catch(i){return{ok:!1,message:i instanceof Error?i.message:"Input must be valid JSON."}}}function Jm(r){if(r.trim()==="")return{ok:!0};const i=os(r);return i.ok?{ok:!0,value:i.value}:i}function Wm(r){return r==null?"null":typeof r=="object"?JSON.stringify(r):String(r)}function Gm(r){return r==null?"":typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"?String(r):JSON.stringify(r)}function Ym(r){return!Number.isFinite(r)||r<0?"unknown":r<1024?`${r} B`:`${(r/1024).toFixed(1)} KB`}function Xm(){if(typeof window>"u")return[];try{const r=window.localStorage.getItem(La);if(!r)return[];const i=JSON.parse(r);return Array.isArray(i)?i.filter(eh).slice(0,Ma):[]}catch{return[]}}function Zm(r){if(!(typeof window>"u"))try{if(r.length===0){window.localStorage.removeItem(La);return}window.localStorage.setItem(La,JSON.stringify(r.slice(0,Ma)))}catch{}}function eh(r){if(!r||Array.isArray(r)||typeof r!="object")return!1;const i=r;return(i.operation==="Query"||i.operation==="Scan")&&typeof i.id=="string"&&typeof i.tableName=="string"&&typeof i.limit=="number"&&typeof i.expressionSummary=="string"&&typeof i.count=="number"&&typeof i.scannedCount=="number"&&typeof i.page=="number"&&typeof i.hasMore=="boolean"&&typeof i.createdAt=="string"}function th(r){return{id:`${Date.now()}-${r.mode}-${r.tableName}-${r.page}`,operation:r.mode,tableName:r.tableName,indexName:r.indexName.trim()||void 0,limit:r.limit,expressionSummary:r.usesExpressionAttributeValues?"expression values present":"no expression values",count:r.count,scannedCount:r.scannedCount,page:r.page,hasMore:r.hasMore,createdAt:new Date().toISOString()}}function nh(r){const i=new Date(r);return Number.isNaN(i.getTime())?"unknown":i.toLocaleString()}function sh({activeIndex:r,items:i,itemsState:o,onSelectIndex:c,tableName:f}){return f?o.status==="loading"?n.jsx(Q,{title:"Loading items",description:`Reading items from ${f}.`}):o.status==="error"?n.jsx(Q,{title:"DynamoDB items unavailable",description:o.message}):i.length===0?n.jsx(Q,{title:"No items",description:`No loaded items in ${f} match the current filter.`}):n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Key"}),n.jsx("th",{scope:"col",children:"Attributes"}),n.jsx("th",{scope:"col",children:"Size"})]})}),n.jsx("tbody",{children:i.map((p,y)=>n.jsxs("tr",{className:y===r?"item-row active":"item-row",onClick:()=>c(y),children:[n.jsx("td",{children:n.jsx("code",{children:JSON.stringify(p.key)})}),n.jsx("td",{children:n.jsx(qc,{item:p.item})}),n.jsx("td",{children:Ym(JSON.stringify(p.item).length)})]},`${JSON.stringify(p.key)}-${y}`))})]})}):n.jsx(Q,{title:"No table selected",description:"Choose a table to inspect its stored items."})}function qc({item:r}){const i=Object.entries(r).filter(([o])=>o!=="pk"&&o!=="sk").slice(0,6);return i.length===0?n.jsx("span",{className:"service-status",children:"key only"}):n.jsx("span",{className:"attribute-preview",children:i.map(([o,c])=>n.jsxs("span",{className:"attribute-chip",children:[o,": ",Wm(c)]},o))})}function rh({message:r,onFind:i,onUpdateValue:o,table:c,values:f}){const p=(c==null?void 0:c.keySchema)??[];return!c||p.length===0?null:n.jsxs("div",{className:"dynamodb-key-lookup",children:[n.jsx("span",{className:"inspector-label",children:"Key lookup"}),n.jsxs("div",{className:"pubsub-action-row",children:[p.map(y=>n.jsxs("label",{className:"compact-filter",children:[n.jsxs("span",{children:[y.AttributeName," ",y.KeyType]}),n.jsx("input",{"aria-label":`DynamoDB key lookup ${y.AttributeName}`,onChange:v=>o(y.AttributeName,v.target.value),placeholder:y.AttributeName,value:f[y.AttributeName]??""})]},y.AttributeName)),n.jsx(ue,{onClick:i,children:"Find loaded item"})]}),r?n.jsx("p",{className:"inspector-muted",children:r}):null]})}function lh({activeTableName:r,busyOperation:i,createTableJSON:o,putItemJSON:c,updateItemJSON:f,deleteItemJSON:p,ttlJSON:y,deleteTableJSON:v,deleteItemConfirmation:b,deleteTableConfirmation:N,deleteItemAcknowledged:C,deleteTableAcknowledged:w,onCreateTable:L,onPutItem:E,onUpdateItem:D,onDeleteItem:T,onUpdateTTL:U,onDeleteTable:V,setCreateTableJSON:se,setPutItemJSON:q,setUpdateItemJSON:me,setDeleteItemJSON:Se,setTTLJSON:Ce,setDeleteTableJSON:J,setDeleteItemConfirmation:oe,setDeleteTableConfirmation:be,setDeleteItemAcknowledged:De,setDeleteTableAcknowledged:ie}){const z=!r;return n.jsxs("div",{className:"dynamodb-operation-stack",children:[n.jsx(zs,{buttonLabel:"Create table",disabled:i==="create-table",json:o,label:"CreateTable input",onChange:se,onSubmit:L}),n.jsx(zs,{buttonLabel:"Put item",disabled:z||i==="put-item",json:c,label:"PutItem input",onChange:q,onSubmit:E}),n.jsx(zs,{buttonLabel:"Update item",disabled:z||i==="update-item",json:f,label:"UpdateItem input",onChange:me,onSubmit:D}),n.jsx(zs,{buttonLabel:"Update TTL",disabled:z||i==="ttl",json:y,label:"UpdateTimeToLive input",onChange:Ce,onSubmit:U}),n.jsx(zs,{buttonClassName:"danger",buttonLabel:"Delete item",confirmation:b,destructiveAcknowledgement:C,destructiveAcknowledgementLabel:"Step 1: I understand this deletes the item identified by the JSON key.",confirmationLabel:`Type ${r??"table name"} to delete item`,disabled:z||!C||b!==r||i==="delete-item",json:p,label:"DeleteItem input",onChange:Se,onDestructiveAcknowledgementChange:De,onConfirmationChange:oe,onSubmit:T}),n.jsx(zs,{buttonClassName:"danger",buttonLabel:"Delete table",confirmation:N,destructiveAcknowledgement:w,destructiveAcknowledgementLabel:"Step 1: I understand this deletes the selected table and its local items.",confirmationLabel:`Type ${r??"table name"} to delete table`,disabled:z||!w||N!==r||i==="delete-table",json:v,label:"DeleteTable input",onChange:J,onDestructiveAcknowledgementChange:ie,onConfirmationChange:be,onSubmit:V})]})}function zs({buttonClassName:r,buttonLabel:i,confirmation:o,confirmationLabel:c,destructiveAcknowledgement:f,destructiveAcknowledgementLabel:p,disabled:y,json:v,label:b,onChange:N,onConfirmationChange:C,onDestructiveAcknowledgementChange:w,onSubmit:L}){return n.jsxs("form",{className:"dynamodb-operation-form",onSubmit:L,children:[n.jsxs("label",{className:"redshift-sql-editor",children:[n.jsx("span",{children:b}),n.jsx("textarea",{"aria-label":b,onChange:E=>N(E.target.value),spellCheck:!1,value:v})]}),w?n.jsxs("label",{className:"destructive-confirmation",children:[n.jsx("input",{"aria-label":p,checked:!!f,onChange:E=>w(E.target.checked),type:"checkbox"}),n.jsx("span",{children:p})]}):null,C?n.jsxs("label",{className:"compact-filter",children:[n.jsxs("span",{children:["Step 2: ",c]}),n.jsx("input",{"aria-label":c,onChange:E=>C(E.target.value),value:o??""})]}):null,n.jsx(ue,{className:r,disabled:y,type:"submit",children:i})]})}function ih({activeTableName:r,busyOperation:i,error:o,expressionAttributeValues:c,filterExpression:f,indexName:p,keyConditionExpression:y,limit:v,message:b,mode:N,onNextPage:C,onPreviousPage:w,onSubmit:L,pageIndex:E,result:D,selectedItemIndex:T,setExpressionAttributeValues:U,setFilterExpression:V,setIndexName:se,setKeyConditionExpression:q,setLimit:me,setMode:Se,setSelectedItemIndex:Ce}){const J=!r||i==="query"||i==="scan",oe=(D==null?void 0:D.Items)??[],be=E>0,De=!!(D!=null&&D.LastEvaluatedKey),ie=oe[Math.min(T,Math.max(oe.length-1,0))];return n.jsxs("div",{className:"dynamodb-query-scan",children:[o?n.jsx("p",{className:"operation-message error",children:o}):null,b?n.jsx("p",{className:"operation-message success",children:b}):null,n.jsxs("form",{className:"dynamodb-query-scan-form",onSubmit:L,children:[n.jsxs("div",{className:"segmented-control","aria-label":"DynamoDB read operation",children:[n.jsx("button",{className:N==="Query"?"active":"",onClick:()=>Se("Query"),type:"button",children:"Query"}),n.jsx("button",{className:N==="Scan"?"active":"",onClick:()=>Se("Scan"),type:"button",children:"Scan"})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"TableName"}),n.jsx("input",{"aria-label":"DynamoDB Query Scan table name",disabled:!0,value:r??""})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"IndexName"}),n.jsx("input",{"aria-label":"DynamoDB Query Scan index name",onChange:z=>se(z.target.value),placeholder:"optional",value:p})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Limit"}),n.jsx("input",{"aria-label":"DynamoDB Query Scan limit",inputMode:"numeric",onChange:z=>me(z.target.value),value:v})]}),N==="Query"?n.jsxs("label",{className:"compact-filter wide",children:[n.jsx("span",{children:"KeyConditionExpression"}),n.jsx("input",{"aria-label":"DynamoDB Query key condition expression",onChange:z=>q(z.target.value),placeholder:"pk = :pk",value:y})]}):n.jsxs("label",{className:"compact-filter wide",children:[n.jsx("span",{children:"FilterExpression"}),n.jsx("input",{"aria-label":"DynamoDB Scan filter expression",onChange:z=>V(z.target.value),placeholder:"optional",value:f})]}),n.jsxs("label",{className:"redshift-sql-editor",children:[n.jsx("span",{children:"ExpressionAttributeValues JSON"}),n.jsx("textarea",{"aria-label":"DynamoDB Query Scan expression attribute values JSON",onChange:z=>U(z.target.value),spellCheck:!1,value:c})]}),n.jsxs(ue,{disabled:J,type:"submit",children:["Run ",N]})]}),D?n.jsxs("div",{className:"redshift-query-result",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsxs("span",{className:"toolbar-count",children:["Page ",E+1," / Count ",D.Count??oe.length," / Scanned ",D.ScannedCount??0]}),n.jsx("span",{className:"toolbar-count",children:De?"More results available":"End of results"}),n.jsxs("div",{className:"pubsub-action-row",children:[n.jsx(ue,{disabled:J||!be,onClick:w,type:"button",children:"Previous page"}),n.jsx(ue,{disabled:J||!De,onClick:C,type:"button",children:"Next page"})]})]}),oe.length>0?n.jsxs("div",{className:"dynamodb-query-result-grid",children:[n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table compact",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"#"}),n.jsx("th",{scope:"col",children:"Item preview"})]})}),n.jsx("tbody",{children:oe.map((z,X)=>n.jsxs("tr",{className:X===T?"item-row active":"item-row",onClick:()=>Ce(X),children:[n.jsx("td",{children:X+1}),n.jsx("td",{children:n.jsx(qc,{item:z})})]},`${E}-${X}-${JSON.stringify(z).length}`))})]})}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Selected result item JSON"}),n.jsx("pre",{className:"mail-preview",children:JSON.stringify(ie,null,2)})]})]}):n.jsx("p",{className:"inspector-muted",children:"No items returned."})]}):null]})}function ah({operations:r,onClear:i}){return n.jsxs("section",{className:"dynamodb-recent-operations",children:[n.jsxs("div",{className:"inspector-heading",children:[n.jsxs("div",{children:[n.jsx("span",{className:"inspector-label",children:"Recent operation history"}),n.jsx("p",{className:"inspector-muted",children:"Stored locally without item payloads, credentials, or pagination keys."})]}),n.jsx(ue,{disabled:r.length===0,onClick:i,type:"button",children:"Clear"})]}),r.length===0?n.jsx("p",{className:"inspector-muted",children:"Run Query or Scan to record local operation metadata."}):n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table compact",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"When"}),n.jsx("th",{scope:"col",children:"Operation"}),n.jsx("th",{scope:"col",children:"Table"}),n.jsx("th",{scope:"col",children:"Result"})]})}),n.jsx("tbody",{children:r.map(o=>n.jsxs("tr",{children:[n.jsx("td",{children:nh(o.createdAt)}),n.jsx("td",{children:n.jsxs("span",{className:"attribute-preview",children:[n.jsx("span",{className:"attribute-chip",children:o.operation}),n.jsxs("span",{className:"attribute-chip",children:["page ",o.page]}),o.indexName?n.jsxs("span",{className:"attribute-chip",children:["index: ",o.indexName]}):null]})}),n.jsx("td",{children:n.jsx("code",{children:o.tableName})}),n.jsx("td",{children:n.jsxs("span",{className:"attribute-preview",children:[n.jsxs("span",{className:"attribute-chip",children:["count: ",o.count]}),n.jsxs("span",{className:"attribute-chip",children:["scanned: ",o.scannedCount]}),n.jsxs("span",{className:"attribute-chip",children:["limit: ",o.limit]}),n.jsx("span",{className:"attribute-chip",children:o.hasMore?"has next page":"last page"}),n.jsx("span",{className:"attribute-chip",children:o.expressionSummary})]})})]},o.id))})]})})]})}function oh({detailState:r,table:i,item:o,onRefreshDetail:c,status:f}){var C;if(!i)return n.jsx(Q,{title:"Inspector",description:"Table schema and selected item JSON will appear here."});const p=r.status==="success"?r.table:i,y=r.status==="success"?r.globalSecondaryIndexes:i.globalSecondaryIndexes??[],v=r.status==="success"?r.localSecondaryIndexes:i.localSecondaryIndexes??[],b=r.status==="success"?r.ttl:i.timeToLiveDescription,N=r.status==="success"?r.streams:{tableName:i.tableName,streamEnabled:((C=i.streamSpecification)==null?void 0:C.StreamEnabled)??!1,latestStreamArn:i.latestStreamArn,latestStreamLabel:i.latestStreamLabel,streamSpecification:i.streamSpecification};return n.jsxs("div",{className:"dynamodb-inspector",children:[n.jsxs("section",{children:[n.jsxs("div",{className:"inspector-heading",children:[n.jsxs("div",{children:[n.jsx("span",{className:"inspector-label",children:"Table"}),n.jsx("h3",{children:p.tableName})]}),n.jsx(ue,{onClick:c,children:"Refresh detail"})]}),r.status==="loading"?n.jsx("p",{className:"inspector-muted",children:"Loading detail metadata."}):null,r.status==="error"?n.jsx("p",{className:"operation-message error",children:r.message}):null,n.jsxs("dl",{className:"inspector-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"Status"}),n.jsx("dd",{children:p.tableStatus})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Endpoint"}),n.jsx("dd",{children:n.jsx("code",{children:(f==null?void 0:f.endpoint)??"unknown"})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Region"}),n.jsx("dd",{children:(f==null?void 0:f.region)??"unknown"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Key schema"}),n.jsx("dd",{children:Oa(p)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Attributes"}),n.jsx("dd",{children:Vm(p)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"TTL"}),n.jsx("dd",{children:Km({...p,timeToLiveDescription:b})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Streams"}),n.jsx("dd",{children:Hm(N)})]})]})]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Indexes"}),n.jsx(uh,{globalSecondaryIndexes:y,localSecondaryIndexes:v})]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Streams"}),n.jsx("pre",{className:"mail-preview",children:JSON.stringify(N,null,2)})]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Selected item"}),o?n.jsx("pre",{className:"mail-preview",children:JSON.stringify(o.item,null,2)}):n.jsx("p",{className:"inspector-muted",children:"Select an item row to inspect JSON."})]})]})}function uh({globalSecondaryIndexes:r,localSecondaryIndexes:i}){const o=[...r.map(c=>({...c,type:"GSI"})),...i.map(c=>({...c,type:"LSI"}))];return o.length===0?n.jsx("p",{className:"inspector-muted",children:"No secondary indexes."}):n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table compact",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Type"}),n.jsx("th",{scope:"col",children:"Name"}),n.jsx("th",{scope:"col",children:"Key schema"}),n.jsx("th",{scope:"col",children:"Items"})]})}),n.jsx("tbody",{children:o.map(c=>n.jsxs("tr",{children:[n.jsx("td",{children:c.type}),n.jsx("td",{children:c.IndexName}),n.jsx("td",{children:Oa({tableName:c.IndexName,keySchema:c.KeySchema})}),n.jsx("td",{children:c.ItemCount??0})]},`${c.type}-${c.IndexName}`))})]})})}function ch({tables:r,activeTableName:i,onSelectTable:o}){return r.length===0?n.jsx(Q,{title:"No tables",description:"Tables created through the DynamoDB API will appear here."}):n.jsx("div",{className:"dynamodb-table-list","aria-label":"DynamoDB tables",children:r.map(c=>{var f;return n.jsxs("button",{className:c.tableName===i?"dynamodb-table-row active":"dynamodb-table-row",onClick:()=>o(c.tableName),children:[n.jsxs("span",{className:"table-row-top",children:[n.jsx("span",{className:"table-row-name",children:c.tableName}),n.jsx("span",{className:"count-pill",children:c.itemCount})]}),n.jsx("span",{className:"table-row-meta",children:Oa(c)}),n.jsxs("span",{className:"table-row-tags",children:[n.jsx("span",{children:c.tableStatus}),n.jsxs("span",{children:[qm(c)," indexes"]}),n.jsx("span",{children:(f=c.streamSpecification)!=null&&f.StreamEnabled?"streams on":"streams off"})]})]},c.tableName)})})}function dh({service:r}){const[i,o]=h.useState({status:"loading"}),[c,f]=h.useState({status:"idle"}),[p,y]=h.useState({status:"idle"}),[v,b]=h.useState(),[N,C]=h.useState(0),[w,L]=h.useState(""),[E,D]=h.useState(""),[T,U]=h.useState("100"),[V,se]=h.useState({}),[q,me]=h.useState(""),[Se,Ce]=h.useState(_m),[J,oe]=h.useState(Bm),[be,De]=h.useState(Am),[ie,z]=h.useState(zm),[X,K]=h.useState(Fm),[ye,we]=h.useState("{}"),[he,O]=h.useState(""),[F,M]=h.useState(""),[x,R]=h.useState(!1),[ae,ce]=h.useState(!1),[ve,A]=h.useState(""),[pe,ee]=h.useState(""),[ge,Pe]=h.useState(),[_e,vt]=h.useState("Query"),[te,Ie]=h.useState(""),[Ee,Be]=h.useState("25"),[st,Lt]=h.useState("pk = :pk"),[dn,Xt]=h.useState(""),[$t,Ze]=h.useState(Qm),[Ft,wn]=h.useState(""),[Vn,Pt]=h.useState(""),[at,yt]=h.useState(),[ct,Ae]=h.useState({pageHistory:[void 0],pageIndex:0,selectedItemIndex:0}),[gt,ds]=h.useState(Xm),dt=(r==null?void 0:r.status)==="disabled";h.useEffect(()=>{Zm(gt)},[gt]);const Qt=h.useCallback(()=>{if(dt){o({status:"success",statusPayload:Um(r),tables:[]}),f({status:"idle"}),y({status:"idle"}),b(void 0);return}o({status:"loading"}),Promise.all([Sm(),wm()]).then(([G,{tables:re}])=>{o({status:"success",statusPayload:G,tables:re}),b($e=>{var Je;return $e&&re.some(ze=>ze.tableName===$e)?$e:(Je=re[0])==null?void 0:Je.tableName})}).catch(G=>{o({status:"error",message:G.message})})},[dt,r]);h.useEffect(()=>{Qt()},[Qt]),cn({topics:["dynamodb"],onEvent:Qt,enabled:!dt});const Ut=i.status==="success"?i.tables:[],Ge=Ut.find(G=>G.tableName===v),Zt=h.useCallback(()=>{if(!v||dt){f({status:"idle"});return}f({status:"loading"}),km(v,Ea(T)).then(({items:G})=>{C(0),f({status:"success",items:G})}).catch(G=>{f({status:"error",message:G.message})})},[v,dt,T]);h.useEffect(()=>{Zt()},[Zt]);const en=h.useCallback(()=>{if(!v||dt){y({status:"idle"});return}y({status:"loading"}),Promise.all([Tm(v),Lm(v),$m(v),Om(v)]).then(([G,re,$e,Je])=>{y({status:"success",table:G.table,globalSecondaryIndexes:re.globalSecondaryIndexes??[],localSecondaryIndexes:re.localSecondaryIndexes??[],ttl:$e.timeToLiveDescription,streams:Je})}).catch(G=>{y({status:"error",message:G.message})})},[v,dt]);h.useEffect(()=>{en()},[en]);const qt=h.useMemo(()=>{const G=w.trim().toLowerCase();return G===""?Ut:Ut.filter(re=>re.tableName.toLowerCase().includes(G))},[Ut,w]),tn=h.useMemo(()=>{const G=c.status==="success"?c.items:[],re=E.trim().toLowerCase();return re===""?G:G.filter($e=>JSON.stringify($e).toLowerCase().includes(re))},[c,E]),nn=tn[Math.min(N,Math.max(tn.length-1,0))];if(dt)return n.jsx(Ne,{title:"DynamoDB",children:n.jsx(Q,{title:"DynamoDB is disabled",description:"Enable the DynamoDB service in devcloud config to inspect tables and items."})});function sn(G){b(G),C(0),D(""),se({}),me(""),R(!1),ce(!1),O(""),M("")}function fs(G,re){se($e=>({...$e,[G]:re})),me("")}function ps(){var Je;if(!Ge||c.status!=="success"){me("Load table items before using key lookup.");return}const re=(((Je=Ge.keySchema)==null?void 0:Je.map(ze=>ze.AttributeName))??[]).map(ze=>{var qe;return[ze,((qe=V[ze])==null?void 0:qe.trim())??""]}).filter(([,ze])=>ze!=="");if(re.length===0){me("Enter at least one key value.");return}const $e=c.items.findIndex(ze=>re.every(([qe,gs])=>Gm(ze.item[qe])===gs));if($e<0){me(`No loaded item matched ${re.map(([ze])=>ze).join(" / ")}.`);return}D(""),C($e),me(`Selected loaded item ${$e+1}.`)}async function je(G,re){Pe(G),ee(""),A("");try{const $e=await re();A($e),Qt(),Zt(),en()}catch($e){ee($e instanceof Error?$e.message:"DynamoDB operation failed")}finally{Pe(void 0)}}function Re(G){G.preventDefault();const re=os(Se);if(!re.ok){ee(re.message);return}const $e=typeof re.value.TableName=="string"?re.value.TableName:"";if($e.trim()===""){ee("CreateTable input requires TableName.");return}je("create-table",async()=>(await Nm(re.value),b($e),`Created table ${$e}.`))}function Me(G){if(G.preventDefault(),!v){ee("Select a table before putting an item.");return}const re=os(J);if(!re.ok){ee(re.message);return}je("put-item",async()=>(await Cm(v,re.value),`Put item in ${v}.`))}function Nn(G){if(G.preventDefault(),!v){ee("Select a table before updating an item.");return}const re=os(be);if(!re.ok){ee(re.message);return}je("update-item",async()=>(await Em(v,re.value),`Updated item in ${v}.`))}function ms(G){if(G.preventDefault(),!v){ee("Select a table before deleting an item.");return}if(!x){ee("Acknowledge the DeleteItem destructive action before confirming the table name.");return}if(he!==v){ee("DeleteItem confirmation must match the selected table name.");return}const re=os(ie);if(!re.ok){ee(re.message);return}je("delete-item",async()=>(await Im(v,re.value,he),O(""),R(!1),`Deleted item from ${v}.`))}function Kn(G){if(G.preventDefault(),!v){ee("Select a table before updating TTL.");return}const re=os(X);if(!re.ok){ee(re.message);return}je("ttl",async()=>(await Pm(v,re.value),`Updated TTL for ${v}.`))}function qs(G){if(G.preventDefault(),!v){ee("Select a table before deleting it.");return}if(!ae){ee("Acknowledge the DeleteTable destructive action before confirming the table name.");return}if(F!==v){ee("DeleteTable confirmation must match the selected table name.");return}const re=os(ye);if(!re.ok){ee(re.message);return}je("delete-table",async()=>(await Mm(v,re.value,F),M(""),ce(!1),b(void 0),`Deleted table ${v}.`))}function Hn(G){if(!v)return{ok:!1,message:"Select a table before running Query or Scan."};const re=Ea(Ee),$e=Jm($t);if(!$e.ok)return{ok:!1,message:$e.message};const Je={Limit:re},ze=te.trim();if(ze!==""&&(Je.IndexName=ze),$e.value&&(Je.ExpressionAttributeValues=$e.value),_e==="Query"){const qe=st.trim();if(qe==="")return{ok:!1,message:"Query requires KeyConditionExpression."};Je.KeyConditionExpression=qe}else{const qe=dn.trim();qe!==""&&(Je.FilterExpression=qe)}return G&&(Je.ExclusiveStartKey=G),{ok:!0,value:Je}}async function Vs(G,re,$e){var ze;if(!v){Pt("Select a table before running Query or Scan.");return}const Je=Hn(G);if(!Je.ok){Pt(Je.message);return}Pe(_e.toLowerCase()),Pt(""),wn(""),yt(void 0);try{const qe=_e==="Query"?await Rm(v,Je.value):await Dm(v,Je.value);yt(qe),Ae({pageHistory:$e,pageIndex:re,selectedItemIndex:0}),ds(gs=>{var Tr;return[th({count:qe.Count??((Tr=qe.Items)==null?void 0:Tr.length)??0,hasMore:!!qe.LastEvaluatedKey,indexName:te,limit:Ea(Ee),mode:_e,page:re+1,scannedCount:qe.ScannedCount??0,tableName:v,usesExpressionAttributeValues:!!Je.value.ExpressionAttributeValues}),...gs].slice(0,Ma)}),wn(`${_e} page ${re+1} returned ${qe.Count??((ze=qe.Items)==null?void 0:ze.length)??0} item(s).`)}catch(qe){Pt(qe instanceof Error?qe.message:`${_e} failed`)}finally{Pe(void 0)}}async function Jn(G){G.preventDefault(),await Vs(void 0,0,[void 0])}function hs(){if(!(at!=null&&at.LastEvaluatedKey))return;const G=ct.pageIndex+1,re=ct.pageHistory.slice(0,G);re[G]=at.LastEvaluatedKey,Vs(at.LastEvaluatedKey,G,re)}function ys(){if(ct.pageIndex<=0)return;const G=ct.pageIndex-1,re=ct.pageHistory[G];Vs(re,G,ct.pageHistory)}return n.jsxs("div",{className:"dynamodb-workspace",children:[n.jsxs(Ne,{title:"Tables",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter DynamoDB tables",onChange:G=>L(G.target.value),placeholder:"table name",type:"search",value:w})]}),n.jsx(ue,{onClick:Qt,children:"Refresh"})]}),i.status==="loading"?n.jsx(Q,{title:"Loading tables",description:"Reading local DynamoDB table metadata."}):null,i.status==="error"?n.jsx(Q,{title:"DynamoDB tables unavailable",description:i.message,actionLabel:"Retry",onAction:Qt}):null,i.status==="success"?n.jsx(ch,{tables:qt,activeTableName:v,onSelectTable:sn}):null]}),n.jsxs(Ne,{title:"Items",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"toolbar-count",children:Ge?`${tn.length} shown / ${Ge.itemCount} reported`:"Select a table"}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter DynamoDB items",disabled:!Ge,onChange:G=>{C(0),D(G.target.value)},placeholder:"attribute value",type:"search",value:E})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Limit"}),n.jsx("input",{"aria-label":"Limit DynamoDB items",disabled:!Ge,inputMode:"numeric",onChange:G=>U(G.target.value),value:T})]}),n.jsx(ue,{disabled:!Ge,onClick:Zt,children:"Refresh"})]}),n.jsx(sh,{activeIndex:N,items:tn,itemsState:c,onSelectIndex:C,tableName:v}),n.jsx(rh,{message:q,onFind:ps,onUpdateValue:fs,table:Ge,values:V})]}),n.jsxs(Ne,{title:"Operations",children:[pe?n.jsx("p",{className:"operation-message error",children:pe}):null,ve?n.jsx("p",{className:"operation-message success",children:ve}):null,n.jsx(lh,{activeTableName:v,busyOperation:ge,createTableJSON:Se,deleteItemConfirmation:he,deleteItemAcknowledged:x,deleteItemJSON:ie,deleteTableConfirmation:F,deleteTableAcknowledged:ae,deleteTableJSON:ye,onCreateTable:Re,onDeleteItem:ms,onDeleteTable:qs,onPutItem:Me,onUpdateItem:Nn,onUpdateTTL:Kn,putItemJSON:J,setCreateTableJSON:Ce,setDeleteItemConfirmation:O,setDeleteItemAcknowledged:R,setDeleteItemJSON:z,setDeleteTableConfirmation:M,setDeleteTableAcknowledged:ce,setDeleteTableJSON:we,setPutItemJSON:oe,setTTLJSON:K,setUpdateItemJSON:De,ttlJSON:X,updateItemJSON:be})]}),n.jsxs(Ne,{title:"Query / Scan",children:[n.jsx(ih,{activeTableName:v,busyOperation:ge,expressionAttributeValues:$t,filterExpression:dn,indexName:te,keyConditionExpression:st,limit:Ee,message:Ft,mode:_e,onNextPage:hs,onPreviousPage:ys,onSubmit:G=>{Jn(G)},pageIndex:ct.pageIndex,result:at,selectedItemIndex:ct.selectedItemIndex,setExpressionAttributeValues:Ze,setFilterExpression:Xt,setIndexName:Ie,setKeyConditionExpression:Lt,setLimit:Be,setMode:vt,setSelectedItemIndex:G=>Ae(re=>({...re,selectedItemIndex:G})),error:Vn}),n.jsx(ah,{operations:gt,onClear:()=>ds([])})]}),n.jsx(Ne,{title:"Inspector",children:n.jsx(oh,{detailState:p,item:nn,onRefreshDetail:en,status:i.status==="success"?i.statusPayload:void 0,table:Ge})})]})}async function fh(){return W("/api/bigquery/status")}async function ph(){return W("/api/bigquery/projects")}async function mh(r){return W(`/api/bigquery/projects/${encodeURIComponent(r)}/datasets`)}async function hh(r,i,o,c=100){return W(`/api/bigquery/projects/${encodeURIComponent(r)}/datasets/${encodeURIComponent(i)}/tables/${encodeURIComponent(o)}/rows?limit=${encodeURIComponent(String(c))}`)}async function yh(r){return W(`/api/bigquery/projects/${encodeURIComponent(r)}/jobs`)}async function gh(r,i){return W(`/api/bigquery/projects/${encodeURIComponent(r)}/jobs/${encodeURIComponent(i)}`)}async function xh(r,i){return W(`/api/bigquery/projects/${encodeURIComponent(r)}/queries`,{method:"POST",body:i,timeoutMs:15e3})}async function jh(r,i){return W(`/api/bigquery/projects/${encodeURIComponent(r)}/datasets`,{method:"POST",body:i})}async function vh(r,i,o){return W(`/api/bigquery/projects/${encodeURIComponent(r)}/datasets/${encodeURIComponent(i)}/tables`,{method:"POST",body:o})}async function bh(r,i,o,c){return W(`/api/bigquery/projects/${encodeURIComponent(r)}/datasets/${encodeURIComponent(i)}/tables/${encodeURIComponent(o)}/insertAll`,{method:"POST",body:c})}function Sh({activeDatasetId:r,activeTableId:i,datasets:o,onSelectDataset:c,onSelectTable:f}){return o.length===0?n.jsx(Q,{title:"No datasets",description:"Datasets created through the BigQuery API will appear here."}):n.jsx("div",{className:"dynamodb-table-list","aria-label":"BigQuery datasets",children:o.map(p=>n.jsxs("section",{className:p.datasetId===r?"dynamodb-table-row active":"dynamodb-table-row",children:[n.jsxs("button",{className:"object-select",onClick:()=>c(p),children:[n.jsxs("span",{className:"table-row-top",children:[n.jsx("span",{className:"table-row-name",children:p.datasetId}),n.jsx("span",{className:"count-pill",children:p.tables.length})]}),n.jsxs("span",{className:"table-row-meta",children:[p.location||"default location"," dataset"]})]}),n.jsxs("span",{className:"table-row-tags",children:[p.tables.length===0?n.jsx("span",{children:"no tables"}):null,p.tables.map(y=>n.jsxs("button",{className:"attribute-chip",onClick:()=>f(y),type:"button",children:[y.tableId===i?">":""," ",y.tableId," (",y.numRows,")"]},y.tableId))]})]},p.datasetId))})}function wh(r){return{status:"disabled",running:!1,endpoint:(r==null?void 0:r.endpoint)??"http://127.0.0.1:9050",project:"devcloud",location:"US",authMode:"relaxed",storagePath:(r==null?void 0:r.storagePath)??".devcloud/data/bigquery",datasetCount:0,jobCount:0}}function Nh(r){const i=r.fields??[];return i.length===0?"No schema fields":i.map(o=>`${o.name} ${o.type??"STRING"} ${o.mode??"NULLABLE"}`).join(" / ")}function kh(r){return[...r].sort((i,o)=>Nc(o)-Nc(i)).slice(0,8)}function Nc(r){var c,f;const i=(f=(c=r.job)==null?void 0:c.statistics)==null?void 0:f.creationTime;if(!i)return 0;const o=Number.parseInt(i,10);return Number.isFinite(o)?o:0}function Ch(r){var p,y;const i=(y=(p=r.job)==null?void 0:p.statistics)==null?void 0:y.query,o=(i==null?void 0:i.totalRows)??"0",c=i!=null&&i.dryRun?"dry run":"executed",f=i!=null&&i.cacheHit?"cache hit":"cache miss";return`${c} / ${o} rows / ${f}`}function Eh(r){const i=r.job??r,o=JSON.parse(JSON.stringify(i)),c=o.configuration;return Us(c)&&Us(c.query)&&delete c.query.queryParameters,o}function Ih(r,i){return i?i.f.reduce((o,c,f)=>{var p;return o[((p=r[f])==null?void 0:p.name)??`column_${f+1}`]=c.v,o},{}):{}}function kc(r,i){try{const o=JSON.parse(r);return Us(o)?o:new Error(`${i} must be a JSON object.`)}catch{return new Error(`${i} has a JSON validation error.`)}}function Rh(r){const i=r.split(` -`).map(c=>c.trim()).filter(Boolean).map(c=>{const[f,p="STRING",y]=c.split(":").map(v=>v.trim());return f?{name:f,type:p||"STRING",mode:y||void 0}:new Error("Schema field names are required.")}),o=i.find(c=>c instanceof Error);return o||{fields:i}}function Dh(r,i){let o;try{o=JSON.parse(r)}catch{return new Error("Row JSON has a JSON validation error.")}if(Array.isArray(o)){const c=[];for(const[f,p]of o.entries()){if(!Us(p))return new Error(`Row ${f+1} must be a JSON object.`);c.push({json:p})}return c}return Us(o)?[{insertId:i||void 0,json:o}]:new Error("Row JSON must be a JSON object or an array of JSON objects.")}function Cc(r,i){let o=r;for(const c of i){if(!Us(o))return;o=o[c]}return typeof o=="string"&&o.trim()!==""?o.trim():void 0}function Us(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function Vc(r){return r==null?"null":typeof r=="object"?JSON.stringify(r):String(r)}function Th({dataset:r,jobs:i,project:o,row:c,status:f,table:p}){const[y,v]=h.useState(),[b,N]=h.useState({status:"idle"}),C=h.useMemo(()=>kh(i),[i]);return h.useEffect(()=>{if(i.length===0){v(void 0),N({status:"idle"});return}v(w=>w&&i.some(L=>L.jobId===w)?w:i[0].jobId)},[i]),h.useEffect(()=>{if(!y){N({status:"idle"});return}N({status:"loading",jobId:y}),gh(o,y).then(w=>{N({status:"success",job:w.job})}).catch(w=>{N({status:"error",message:w.message})})},[o,y]),r?n.jsxs("div",{className:"dynamodb-inspector",children:[n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Catalog"}),n.jsx("h3",{children:p?`${r.datasetId}.${p.tableId}`:r.datasetId}),n.jsxs("dl",{className:"inspector-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"Project"}),n.jsx("dd",{children:o})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Endpoint"}),n.jsx("dd",{children:n.jsx("code",{children:(f==null?void 0:f.endpoint)??"unknown"})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Location"}),n.jsx("dd",{children:(f==null?void 0:f.location)??r.location??"unknown"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Rows"}),n.jsx("dd",{children:(p==null?void 0:p.numRows)??"select a table"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Schema"}),n.jsx("dd",{children:p?Nh(p.schema):"select a table"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Jobs"}),n.jsx("dd",{children:i.length===0?"none":i.map(w=>`${w.jobId} ${w.state}`).join(", ")})]})]})]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Recent query metadata"}),C.length===0?n.jsx("p",{className:"inspector-muted",children:"Query jobs will appear after running SQL."}):n.jsx("div",{className:"dynamodb-table-list compact-list","aria-label":"BigQuery recent query jobs",children:C.map(w=>n.jsxs("button",{className:w.jobId===y?"object-select active":"object-select",onClick:()=>v(w.jobId),type:"button",children:[n.jsxs("span",{className:"table-row-top",children:[n.jsx("span",{className:"table-row-name",children:w.jobId}),n.jsx("span",{className:"count-pill",children:w.state})]}),n.jsx("span",{className:"table-row-meta",children:Ch(w)})]},w.jobId))})]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Selected job JSON"}),b.status==="loading"?n.jsx("p",{className:"inspector-muted",children:"Loading job detail."}):null,b.status==="error"?n.jsx("p",{className:"operation-message error",children:b.message}):null,b.status==="success"?n.jsx("pre",{className:"mail-preview",children:JSON.stringify(Eh(b.job),null,2)}):null]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Selected row"}),c?n.jsx("pre",{className:"mail-preview",children:JSON.stringify(c.json,null,2)}):n.jsx("p",{className:"inspector-muted",children:"Select a row to inspect JSON."})]})]}):n.jsx(Q,{title:"Inspector",description:"Dataset, table schema, selected row, and jobs will appear here."})}function Lh({activeDatasetId:r,activeTableId:i,disabled:o,onMutationSuccess:c,projectId:f}){var ve;const[p,y]=h.useState(""),[v,b]=h.useState("US"),[N,C]=h.useState(""),[w,L]=h.useState(!1),[E,D]=h.useState(`{ +}`;function Km(r){return{status:"disabled",running:!1,endpoint:(r==null?void 0:r.endpoint)??"http://127.0.0.1:8000",region:"us-east-1",storagePath:(r==null?void 0:r.storagePath)??".devcloud/data/dynamodb",tableCount:0}}function Oa(r){const i=r.keySchema??[];return i.length===0?"No key schema":i.map(o=>`${o.AttributeName} ${o.KeyType}`).join(" / ")}function Hm(r){return(r.globalSecondaryIndexes??[]).length+(r.localSecondaryIndexes??[]).length}function Jm(r){const i=r.attributeDefinitions??[];return i.length===0?"none":i.map(o=>`${o.AttributeName} ${o.AttributeType}`).join(", ")}function Wm(r){const i=r.timeToLiveDescription;return!i||i.TimeToLiveStatus===""?"not configured":i.AttributeName?`${i.TimeToLiveStatus} on ${i.AttributeName}`:i.TimeToLiveStatus}function Gm(r){var o;if(!r.streamEnabled)return"disabled";const i=((o=r.streamSpecification)==null?void 0:o.StreamViewType)??"enabled";return r.latestStreamLabel?`${i} (${r.latestStreamLabel})`:i}function Ea(r){const i=Number.parseInt(r,10);return!Number.isFinite(i)||i<=0?100:Math.min(i,1e3)}function os(r){try{const i=JSON.parse(r);return!i||Array.isArray(i)||typeof i!="object"?{ok:!1,message:"Input must be a JSON object."}:{ok:!0,value:i}}catch(i){return{ok:!1,message:i instanceof Error?i.message:"Input must be valid JSON."}}}function Ym(r){if(r.trim()==="")return{ok:!0};const i=os(r);return i.ok?{ok:!0,value:i.value}:i}function Xm(r){return r==null?"null":typeof r=="object"?JSON.stringify(r):String(r)}function Zm(r){return r==null?"":typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"?String(r):JSON.stringify(r)}function eh(r){return!Number.isFinite(r)||r<0?"unknown":r<1024?`${r} B`:`${(r/1024).toFixed(1)} KB`}function th(){if(typeof window>"u")return[];try{const r=window.localStorage.getItem(La);if(!r)return[];const i=JSON.parse(r);return Array.isArray(i)?i.filter(sh).slice(0,Ma):[]}catch{return[]}}function nh(r){if(!(typeof window>"u"))try{if(r.length===0){window.localStorage.removeItem(La);return}window.localStorage.setItem(La,JSON.stringify(r.slice(0,Ma)))}catch{}}function sh(r){if(!r||Array.isArray(r)||typeof r!="object")return!1;const i=r;return(i.operation==="Query"||i.operation==="Scan")&&typeof i.id=="string"&&typeof i.tableName=="string"&&typeof i.limit=="number"&&typeof i.expressionSummary=="string"&&typeof i.count=="number"&&typeof i.scannedCount=="number"&&typeof i.page=="number"&&typeof i.hasMore=="boolean"&&typeof i.createdAt=="string"}function rh(r){return{id:`${Date.now()}-${r.mode}-${r.tableName}-${r.page}`,operation:r.mode,tableName:r.tableName,indexName:r.indexName.trim()||void 0,limit:r.limit,expressionSummary:r.usesExpressionAttributeValues?"expression values present":"no expression values",count:r.count,scannedCount:r.scannedCount,page:r.page,hasMore:r.hasMore,createdAt:new Date().toISOString()}}function lh(r){const i=new Date(r);return Number.isNaN(i.getTime())?"unknown":i.toLocaleString()}function ih({activeIndex:r,items:i,itemsState:o,onSelectIndex:c,tableName:f}){return f?o.status==="loading"?n.jsx(Q,{title:"Loading items",description:`Reading items from ${f}.`}):o.status==="error"?n.jsx(Q,{title:"DynamoDB items unavailable",description:o.message}):i.length===0?n.jsx(Q,{title:"No items",description:`No loaded items in ${f} match the current filter.`}):n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Key"}),n.jsx("th",{scope:"col",children:"Attributes"}),n.jsx("th",{scope:"col",children:"Size"})]})}),n.jsx("tbody",{children:i.map((p,y)=>n.jsxs("tr",{className:y===r?"item-row active":"item-row",onClick:()=>c(y),children:[n.jsx("td",{children:n.jsx("code",{children:JSON.stringify(p.key)})}),n.jsx("td",{children:n.jsx(Vc,{item:p.item})}),n.jsx("td",{children:eh(JSON.stringify(p.item).length)})]},`${JSON.stringify(p.key)}-${y}`))})]})}):n.jsx(Q,{title:"No table selected",description:"Choose a table to inspect its stored items."})}function Vc({item:r}){const i=Object.entries(r).filter(([o])=>o!=="pk"&&o!=="sk").slice(0,6);return i.length===0?n.jsx("span",{className:"service-status",children:"key only"}):n.jsx("span",{className:"attribute-preview",children:i.map(([o,c])=>n.jsxs("span",{className:"attribute-chip",children:[o,": ",Xm(c)]},o))})}function ah({message:r,onFind:i,onUpdateValue:o,table:c,values:f}){const p=(c==null?void 0:c.keySchema)??[];return!c||p.length===0?null:n.jsxs("div",{className:"dynamodb-key-lookup",children:[n.jsx("span",{className:"inspector-label",children:"Key lookup"}),n.jsxs("div",{className:"pubsub-action-row",children:[p.map(y=>n.jsxs("label",{className:"compact-filter",children:[n.jsxs("span",{children:[y.AttributeName," ",y.KeyType]}),n.jsx("input",{"aria-label":`DynamoDB key lookup ${y.AttributeName}`,onChange:j=>o(y.AttributeName,j.target.value),placeholder:y.AttributeName,value:f[y.AttributeName]??""})]},y.AttributeName)),n.jsx(ue,{onClick:i,children:"Find loaded item"})]}),r?n.jsx("p",{className:"inspector-muted",children:r}):null]})}function oh({activeTableName:r,busyOperation:i,createTableJSON:o,putItemJSON:c,updateItemJSON:f,deleteItemJSON:p,ttlJSON:y,deleteTableJSON:j,deleteItemConfirmation:b,deleteTableConfirmation:N,deleteItemAcknowledged:k,deleteTableAcknowledged:S,onCreateTable:L,onPutItem:E,onUpdateItem:D,onDeleteItem:T,onUpdateTTL:U,onDeleteTable:V,setCreateTableJSON:se,setPutItemJSON:q,setUpdateItemJSON:me,setDeleteItemJSON:Se,setTTLJSON:Ce,setDeleteTableJSON:J,setDeleteItemConfirmation:oe,setDeleteTableConfirmation:be,setDeleteItemAcknowledged:De,setDeleteTableAcknowledged:ie}){const z=!r;return n.jsxs("div",{className:"dynamodb-operation-stack",children:[n.jsx(zs,{buttonLabel:"Create table",disabled:i==="create-table",json:o,label:"CreateTable input",onChange:se,onSubmit:L}),n.jsx(zs,{buttonLabel:"Put item",disabled:z||i==="put-item",json:c,label:"PutItem input",onChange:q,onSubmit:E}),n.jsx(zs,{buttonLabel:"Update item",disabled:z||i==="update-item",json:f,label:"UpdateItem input",onChange:me,onSubmit:D}),n.jsx(zs,{buttonLabel:"Update TTL",disabled:z||i==="ttl",json:y,label:"UpdateTimeToLive input",onChange:Ce,onSubmit:U}),n.jsx(zs,{buttonClassName:"danger",buttonLabel:"Delete item",confirmation:b,destructiveAcknowledgement:k,destructiveAcknowledgementLabel:"Step 1: I understand this deletes the item identified by the JSON key.",confirmationLabel:`Type ${r??"table name"} to delete item`,disabled:z||!k||b!==r||i==="delete-item",json:p,label:"DeleteItem input",onChange:Se,onDestructiveAcknowledgementChange:De,onConfirmationChange:oe,onSubmit:T}),n.jsx(zs,{buttonClassName:"danger",buttonLabel:"Delete table",confirmation:N,destructiveAcknowledgement:S,destructiveAcknowledgementLabel:"Step 1: I understand this deletes the selected table and its local items.",confirmationLabel:`Type ${r??"table name"} to delete table`,disabled:z||!S||N!==r||i==="delete-table",json:j,label:"DeleteTable input",onChange:J,onDestructiveAcknowledgementChange:ie,onConfirmationChange:be,onSubmit:V})]})}function zs({buttonClassName:r,buttonLabel:i,confirmation:o,confirmationLabel:c,destructiveAcknowledgement:f,destructiveAcknowledgementLabel:p,disabled:y,json:j,label:b,onChange:N,onConfirmationChange:k,onDestructiveAcknowledgementChange:S,onSubmit:L}){return n.jsxs("form",{className:"dynamodb-operation-form",onSubmit:L,children:[n.jsxs("label",{className:"redshift-sql-editor",children:[n.jsx("span",{children:b}),n.jsx("textarea",{"aria-label":b,onChange:E=>N(E.target.value),spellCheck:!1,value:j})]}),S?n.jsxs("label",{className:"destructive-confirmation",children:[n.jsx("input",{"aria-label":p,checked:!!f,onChange:E=>S(E.target.checked),type:"checkbox"}),n.jsx("span",{children:p})]}):null,k?n.jsxs("label",{className:"compact-filter",children:[n.jsxs("span",{children:["Step 2: ",c]}),n.jsx("input",{"aria-label":c,onChange:E=>k(E.target.value),value:o??""})]}):null,n.jsx(ue,{className:r,disabled:y,type:"submit",children:i})]})}function uh({activeTableName:r,busyOperation:i,error:o,expressionAttributeValues:c,filterExpression:f,indexName:p,keyConditionExpression:y,limit:j,message:b,mode:N,onNextPage:k,onPreviousPage:S,onSubmit:L,pageIndex:E,result:D,selectedItemIndex:T,setExpressionAttributeValues:U,setFilterExpression:V,setIndexName:se,setKeyConditionExpression:q,setLimit:me,setMode:Se,setSelectedItemIndex:Ce}){const J=!r||i==="query"||i==="scan",oe=(D==null?void 0:D.Items)??[],be=E>0,De=!!(D!=null&&D.LastEvaluatedKey),ie=oe[Math.min(T,Math.max(oe.length-1,0))];return n.jsxs("div",{className:"dynamodb-query-scan",children:[o?n.jsx("p",{className:"operation-message error",children:o}):null,b?n.jsx("p",{className:"operation-message success",children:b}):null,n.jsxs("form",{className:"dynamodb-query-scan-form",onSubmit:L,children:[n.jsxs("div",{className:"segmented-control","aria-label":"DynamoDB read operation",children:[n.jsx("button",{className:N==="Query"?"active":"",onClick:()=>Se("Query"),type:"button",children:"Query"}),n.jsx("button",{className:N==="Scan"?"active":"",onClick:()=>Se("Scan"),type:"button",children:"Scan"})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"TableName"}),n.jsx("input",{"aria-label":"DynamoDB Query Scan table name",disabled:!0,value:r??""})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"IndexName"}),n.jsx("input",{"aria-label":"DynamoDB Query Scan index name",onChange:z=>se(z.target.value),placeholder:"optional",value:p})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Limit"}),n.jsx("input",{"aria-label":"DynamoDB Query Scan limit",inputMode:"numeric",onChange:z=>me(z.target.value),value:j})]}),N==="Query"?n.jsxs("label",{className:"compact-filter wide",children:[n.jsx("span",{children:"KeyConditionExpression"}),n.jsx("input",{"aria-label":"DynamoDB Query key condition expression",onChange:z=>q(z.target.value),placeholder:"pk = :pk",value:y})]}):n.jsxs("label",{className:"compact-filter wide",children:[n.jsx("span",{children:"FilterExpression"}),n.jsx("input",{"aria-label":"DynamoDB Scan filter expression",onChange:z=>V(z.target.value),placeholder:"optional",value:f})]}),n.jsxs("label",{className:"redshift-sql-editor",children:[n.jsx("span",{children:"ExpressionAttributeValues JSON"}),n.jsx("textarea",{"aria-label":"DynamoDB Query Scan expression attribute values JSON",onChange:z=>U(z.target.value),spellCheck:!1,value:c})]}),n.jsxs(ue,{disabled:J,type:"submit",children:["Run ",N]})]}),D?n.jsxs("div",{className:"redshift-query-result",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsxs("span",{className:"toolbar-count",children:["Page ",E+1," / Count ",D.Count??oe.length," / Scanned ",D.ScannedCount??0]}),n.jsx("span",{className:"toolbar-count",children:De?"More results available":"End of results"}),n.jsxs("div",{className:"pubsub-action-row",children:[n.jsx(ue,{disabled:J||!be,onClick:S,type:"button",children:"Previous page"}),n.jsx(ue,{disabled:J||!De,onClick:k,type:"button",children:"Next page"})]})]}),oe.length>0?n.jsxs("div",{className:"dynamodb-query-result-grid",children:[n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table compact",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"#"}),n.jsx("th",{scope:"col",children:"Item preview"})]})}),n.jsx("tbody",{children:oe.map((z,X)=>n.jsxs("tr",{className:X===T?"item-row active":"item-row",onClick:()=>Ce(X),children:[n.jsx("td",{children:X+1}),n.jsx("td",{children:n.jsx(Vc,{item:z})})]},`${E}-${X}-${JSON.stringify(z).length}`))})]})}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Selected result item JSON"}),n.jsx("pre",{className:"mail-preview",children:JSON.stringify(ie,null,2)})]})]}):n.jsx("p",{className:"inspector-muted",children:"No items returned."})]}):null]})}function ch({operations:r,onClear:i}){return n.jsxs("section",{className:"dynamodb-recent-operations",children:[n.jsxs("div",{className:"inspector-heading",children:[n.jsxs("div",{children:[n.jsx("span",{className:"inspector-label",children:"Recent operation history"}),n.jsx("p",{className:"inspector-muted",children:"Stored locally without item payloads, credentials, or pagination keys."})]}),n.jsx(ue,{disabled:r.length===0,onClick:i,type:"button",children:"Clear"})]}),r.length===0?n.jsx("p",{className:"inspector-muted",children:"Run Query or Scan to record local operation metadata."}):n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table compact",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"When"}),n.jsx("th",{scope:"col",children:"Operation"}),n.jsx("th",{scope:"col",children:"Table"}),n.jsx("th",{scope:"col",children:"Result"})]})}),n.jsx("tbody",{children:r.map(o=>n.jsxs("tr",{children:[n.jsx("td",{children:lh(o.createdAt)}),n.jsx("td",{children:n.jsxs("span",{className:"attribute-preview",children:[n.jsx("span",{className:"attribute-chip",children:o.operation}),n.jsxs("span",{className:"attribute-chip",children:["page ",o.page]}),o.indexName?n.jsxs("span",{className:"attribute-chip",children:["index: ",o.indexName]}):null]})}),n.jsx("td",{children:n.jsx("code",{children:o.tableName})}),n.jsx("td",{children:n.jsxs("span",{className:"attribute-preview",children:[n.jsxs("span",{className:"attribute-chip",children:["count: ",o.count]}),n.jsxs("span",{className:"attribute-chip",children:["scanned: ",o.scannedCount]}),n.jsxs("span",{className:"attribute-chip",children:["limit: ",o.limit]}),n.jsx("span",{className:"attribute-chip",children:o.hasMore?"has next page":"last page"}),n.jsx("span",{className:"attribute-chip",children:o.expressionSummary})]})})]},o.id))})]})})]})}function dh({detailState:r,table:i,item:o,onRefreshDetail:c,status:f}){var k;if(!i)return n.jsx(Q,{title:"Inspector",description:"Table schema and selected item JSON will appear here."});const p=r.status==="success"?r.table:i,y=r.status==="success"?r.globalSecondaryIndexes:i.globalSecondaryIndexes??[],j=r.status==="success"?r.localSecondaryIndexes:i.localSecondaryIndexes??[],b=r.status==="success"?r.ttl:i.timeToLiveDescription,N=r.status==="success"?r.streams:{tableName:i.tableName,streamEnabled:((k=i.streamSpecification)==null?void 0:k.StreamEnabled)??!1,latestStreamArn:i.latestStreamArn,latestStreamLabel:i.latestStreamLabel,streamSpecification:i.streamSpecification};return n.jsxs("div",{className:"dynamodb-inspector",children:[n.jsxs("section",{children:[n.jsxs("div",{className:"inspector-heading",children:[n.jsxs("div",{children:[n.jsx("span",{className:"inspector-label",children:"Table"}),n.jsx("h3",{children:p.tableName})]}),n.jsx(ue,{onClick:c,children:"Refresh detail"})]}),r.status==="loading"?n.jsx("p",{className:"inspector-muted",children:"Loading detail metadata."}):null,r.status==="error"?n.jsx("p",{className:"operation-message error",children:r.message}):null,n.jsxs("dl",{className:"inspector-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"Status"}),n.jsx("dd",{children:p.tableStatus})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Endpoint"}),n.jsx("dd",{children:n.jsx("code",{children:(f==null?void 0:f.endpoint)??"unknown"})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Region"}),n.jsx("dd",{children:(f==null?void 0:f.region)??"unknown"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Key schema"}),n.jsx("dd",{children:Oa(p)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Attributes"}),n.jsx("dd",{children:Jm(p)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"TTL"}),n.jsx("dd",{children:Wm({...p,timeToLiveDescription:b})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Streams"}),n.jsx("dd",{children:Gm(N)})]})]})]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Indexes"}),n.jsx(fh,{globalSecondaryIndexes:y,localSecondaryIndexes:j})]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Streams"}),n.jsx("pre",{className:"mail-preview",children:JSON.stringify(N,null,2)})]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Selected item"}),o?n.jsx("pre",{className:"mail-preview",children:JSON.stringify(o.item,null,2)}):n.jsx("p",{className:"inspector-muted",children:"Select an item row to inspect JSON."})]})]})}function fh({globalSecondaryIndexes:r,localSecondaryIndexes:i}){const o=[...r.map(c=>({...c,type:"GSI"})),...i.map(c=>({...c,type:"LSI"}))];return o.length===0?n.jsx("p",{className:"inspector-muted",children:"No secondary indexes."}):n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table compact",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Type"}),n.jsx("th",{scope:"col",children:"Name"}),n.jsx("th",{scope:"col",children:"Key schema"}),n.jsx("th",{scope:"col",children:"Items"})]})}),n.jsx("tbody",{children:o.map(c=>n.jsxs("tr",{children:[n.jsx("td",{children:c.type}),n.jsx("td",{children:c.IndexName}),n.jsx("td",{children:Oa({tableName:c.IndexName,keySchema:c.KeySchema})}),n.jsx("td",{children:c.ItemCount??0})]},`${c.type}-${c.IndexName}`))})]})})}function ph({tables:r,activeTableName:i,onSelectTable:o}){return r.length===0?n.jsx(Q,{title:"No tables",description:"Tables created through the DynamoDB API will appear here."}):n.jsx("div",{className:"dynamodb-table-list","aria-label":"DynamoDB tables",children:r.map(c=>{var f;return n.jsxs("button",{className:c.tableName===i?"dynamodb-table-row active":"dynamodb-table-row",onClick:()=>o(c.tableName),children:[n.jsxs("span",{className:"table-row-top",children:[n.jsx("span",{className:"table-row-name",children:c.tableName}),n.jsx("span",{className:"count-pill",children:c.itemCount})]}),n.jsx("span",{className:"table-row-meta",children:Oa(c)}),n.jsxs("span",{className:"table-row-tags",children:[n.jsx("span",{children:c.tableStatus}),n.jsxs("span",{children:[Hm(c)," indexes"]}),n.jsx("span",{children:(f=c.streamSpecification)!=null&&f.StreamEnabled?"streams on":"streams off"})]})]},c.tableName)})})}function mh({service:r}){const[i,o]=h.useState({status:"loading"}),[c,f]=h.useState({status:"idle"}),[p,y]=h.useState({status:"idle"}),[j,b]=h.useState(),[N,k]=h.useState(0),[S,L]=h.useState(""),[E,D]=h.useState(""),[T,U]=h.useState("100"),[V,se]=h.useState({}),[q,me]=h.useState(""),[Se,Ce]=h.useState(zm),[J,oe]=h.useState(Fm),[be,De]=h.useState(Qm),[ie,z]=h.useState(Um),[X,K]=h.useState(qm),[ye,we]=h.useState("{}"),[he,O]=h.useState(""),[F,M]=h.useState(""),[x,R]=h.useState(!1),[ae,ce]=h.useState(!1),[ve,A]=h.useState(""),[pe,ee]=h.useState(""),[ge,Pe]=h.useState(),[_e,vt]=h.useState("Query"),[te,Ie]=h.useState(""),[Ee,Be]=h.useState("25"),[st,Lt]=h.useState("pk = :pk"),[dn,Xt]=h.useState(""),[$t,Ze]=h.useState(Vm),[Ft,wn]=h.useState(""),[Vn,Pt]=h.useState(""),[at,yt]=h.useState(),[ct,Ae]=h.useState({pageHistory:[void 0],pageIndex:0,selectedItemIndex:0}),[gt,ds]=h.useState(th),dt=(r==null?void 0:r.status)==="disabled";h.useEffect(()=>{nh(gt)},[gt]);const Qt=h.useCallback(()=>{if(dt){o({status:"success",statusPayload:Km(r),tables:[]}),f({status:"idle"}),y({status:"idle"}),b(void 0);return}o({status:"loading"}),Promise.all([km(),Cm()]).then(([G,{tables:re}])=>{o({status:"success",statusPayload:G,tables:re}),b($e=>{var Je;return $e&&re.some(ze=>ze.tableName===$e)?$e:(Je=re[0])==null?void 0:Je.tableName})}).catch(G=>{o({status:"error",message:G.message})})},[dt,r]);h.useEffect(()=>{Qt()},[Qt]),cn({topics:["dynamodb"],onEvent:Qt,enabled:!dt});const Ut=i.status==="success"?i.tables:[],Ge=Ut.find(G=>G.tableName===j),Zt=h.useCallback(()=>{if(!j||dt){f({status:"idle"});return}f({status:"loading"}),Im(j,Ea(T)).then(({items:G})=>{k(0),f({status:"success",items:G})}).catch(G=>{f({status:"error",message:G.message})})},[j,dt,T]);h.useEffect(()=>{Zt()},[Zt]);const en=h.useCallback(()=>{if(!j||dt){y({status:"idle"});return}y({status:"loading"}),Promise.all([Pm(j),Mm(j),Om(j),Am(j)]).then(([G,re,$e,Je])=>{y({status:"success",table:G.table,globalSecondaryIndexes:re.globalSecondaryIndexes??[],localSecondaryIndexes:re.localSecondaryIndexes??[],ttl:$e.timeToLiveDescription,streams:Je})}).catch(G=>{y({status:"error",message:G.message})})},[j,dt]);h.useEffect(()=>{en()},[en]);const qt=h.useMemo(()=>{const G=S.trim().toLowerCase();return G===""?Ut:Ut.filter(re=>re.tableName.toLowerCase().includes(G))},[Ut,S]),tn=h.useMemo(()=>{const G=c.status==="success"?c.items:[],re=E.trim().toLowerCase();return re===""?G:G.filter($e=>JSON.stringify($e).toLowerCase().includes(re))},[c,E]),nn=tn[Math.min(N,Math.max(tn.length-1,0))];if(dt)return n.jsx(Ne,{title:"DynamoDB",children:n.jsx(Q,{title:"DynamoDB is disabled",description:"Enable the DynamoDB service in devcloud config to inspect tables and items."})});function sn(G){b(G),k(0),D(""),se({}),me(""),R(!1),ce(!1),O(""),M("")}function fs(G,re){se($e=>({...$e,[G]:re})),me("")}function ps(){var Je;if(!Ge||c.status!=="success"){me("Load table items before using key lookup.");return}const re=(((Je=Ge.keySchema)==null?void 0:Je.map(ze=>ze.AttributeName))??[]).map(ze=>{var qe;return[ze,((qe=V[ze])==null?void 0:qe.trim())??""]}).filter(([,ze])=>ze!=="");if(re.length===0){me("Enter at least one key value.");return}const $e=c.items.findIndex(ze=>re.every(([qe,gs])=>Zm(ze.item[qe])===gs));if($e<0){me(`No loaded item matched ${re.map(([ze])=>ze).join(" / ")}.`);return}D(""),k($e),me(`Selected loaded item ${$e+1}.`)}async function je(G,re){Pe(G),ee(""),A("");try{const $e=await re();A($e),Qt(),Zt(),en()}catch($e){ee($e instanceof Error?$e.message:"DynamoDB operation failed")}finally{Pe(void 0)}}function Re(G){G.preventDefault();const re=os(Se);if(!re.ok){ee(re.message);return}const $e=typeof re.value.TableName=="string"?re.value.TableName:"";if($e.trim()===""){ee("CreateTable input requires TableName.");return}je("create-table",async()=>(await Em(re.value),b($e),`Created table ${$e}.`))}function Me(G){if(G.preventDefault(),!j){ee("Select a table before putting an item.");return}const re=os(J);if(!re.ok){ee(re.message);return}je("put-item",async()=>(await Rm(j,re.value),`Put item in ${j}.`))}function Nn(G){if(G.preventDefault(),!j){ee("Select a table before updating an item.");return}const re=os(be);if(!re.ok){ee(re.message);return}je("update-item",async()=>(await Dm(j,re.value),`Updated item in ${j}.`))}function ms(G){if(G.preventDefault(),!j){ee("Select a table before deleting an item.");return}if(!x){ee("Acknowledge the DeleteItem destructive action before confirming the table name.");return}if(he!==j){ee("DeleteItem confirmation must match the selected table name.");return}const re=os(ie);if(!re.ok){ee(re.message);return}je("delete-item",async()=>(await Tm(j,re.value,he),O(""),R(!1),`Deleted item from ${j}.`))}function Kn(G){if(G.preventDefault(),!j){ee("Select a table before updating TTL.");return}const re=os(X);if(!re.ok){ee(re.message);return}je("ttl",async()=>(await _m(j,re.value),`Updated TTL for ${j}.`))}function qs(G){if(G.preventDefault(),!j){ee("Select a table before deleting it.");return}if(!ae){ee("Acknowledge the DeleteTable destructive action before confirming the table name.");return}if(F!==j){ee("DeleteTable confirmation must match the selected table name.");return}const re=os(ye);if(!re.ok){ee(re.message);return}je("delete-table",async()=>(await Bm(j,re.value,F),M(""),ce(!1),b(void 0),`Deleted table ${j}.`))}function Hn(G){if(!j)return{ok:!1,message:"Select a table before running Query or Scan."};const re=Ea(Ee),$e=Ym($t);if(!$e.ok)return{ok:!1,message:$e.message};const Je={Limit:re},ze=te.trim();if(ze!==""&&(Je.IndexName=ze),$e.value&&(Je.ExpressionAttributeValues=$e.value),_e==="Query"){const qe=st.trim();if(qe==="")return{ok:!1,message:"Query requires KeyConditionExpression."};Je.KeyConditionExpression=qe}else{const qe=dn.trim();qe!==""&&(Je.FilterExpression=qe)}return G&&(Je.ExclusiveStartKey=G),{ok:!0,value:Je}}async function Vs(G,re,$e){var ze;if(!j){Pt("Select a table before running Query or Scan.");return}const Je=Hn(G);if(!Je.ok){Pt(Je.message);return}Pe(_e.toLowerCase()),Pt(""),wn(""),yt(void 0);try{const qe=_e==="Query"?await Lm(j,Je.value):await $m(j,Je.value);yt(qe),Ae({pageHistory:$e,pageIndex:re,selectedItemIndex:0}),ds(gs=>{var Tr;return[rh({count:qe.Count??((Tr=qe.Items)==null?void 0:Tr.length)??0,hasMore:!!qe.LastEvaluatedKey,indexName:te,limit:Ea(Ee),mode:_e,page:re+1,scannedCount:qe.ScannedCount??0,tableName:j,usesExpressionAttributeValues:!!Je.value.ExpressionAttributeValues}),...gs].slice(0,Ma)}),wn(`${_e} page ${re+1} returned ${qe.Count??((ze=qe.Items)==null?void 0:ze.length)??0} item(s).`)}catch(qe){Pt(qe instanceof Error?qe.message:`${_e} failed`)}finally{Pe(void 0)}}async function Jn(G){G.preventDefault(),await Vs(void 0,0,[void 0])}function hs(){if(!(at!=null&&at.LastEvaluatedKey))return;const G=ct.pageIndex+1,re=ct.pageHistory.slice(0,G);re[G]=at.LastEvaluatedKey,Vs(at.LastEvaluatedKey,G,re)}function ys(){if(ct.pageIndex<=0)return;const G=ct.pageIndex-1,re=ct.pageHistory[G];Vs(re,G,ct.pageHistory)}return n.jsxs("div",{className:"dynamodb-workspace",children:[n.jsxs(Ne,{title:"Tables",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter DynamoDB tables",onChange:G=>L(G.target.value),placeholder:"table name",type:"search",value:S})]}),n.jsx(ue,{onClick:Qt,children:"Refresh"})]}),i.status==="loading"?n.jsx(Q,{title:"Loading tables",description:"Reading local DynamoDB table metadata."}):null,i.status==="error"?n.jsx(Q,{title:"DynamoDB tables unavailable",description:i.message,actionLabel:"Retry",onAction:Qt}):null,i.status==="success"?n.jsx(ph,{tables:qt,activeTableName:j,onSelectTable:sn}):null]}),n.jsxs(Ne,{title:"Items",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"toolbar-count",children:Ge?`${tn.length} shown / ${Ge.itemCount} reported`:"Select a table"}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter DynamoDB items",disabled:!Ge,onChange:G=>{k(0),D(G.target.value)},placeholder:"attribute value",type:"search",value:E})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Limit"}),n.jsx("input",{"aria-label":"Limit DynamoDB items",disabled:!Ge,inputMode:"numeric",onChange:G=>U(G.target.value),value:T})]}),n.jsx(ue,{disabled:!Ge,onClick:Zt,children:"Refresh"})]}),n.jsx(ih,{activeIndex:N,items:tn,itemsState:c,onSelectIndex:k,tableName:j}),n.jsx(ah,{message:q,onFind:ps,onUpdateValue:fs,table:Ge,values:V})]}),n.jsxs(Ne,{title:"Operations",children:[pe?n.jsx("p",{className:"operation-message error",children:pe}):null,ve?n.jsx("p",{className:"operation-message success",children:ve}):null,n.jsx(oh,{activeTableName:j,busyOperation:ge,createTableJSON:Se,deleteItemConfirmation:he,deleteItemAcknowledged:x,deleteItemJSON:ie,deleteTableConfirmation:F,deleteTableAcknowledged:ae,deleteTableJSON:ye,onCreateTable:Re,onDeleteItem:ms,onDeleteTable:qs,onPutItem:Me,onUpdateItem:Nn,onUpdateTTL:Kn,putItemJSON:J,setCreateTableJSON:Ce,setDeleteItemConfirmation:O,setDeleteItemAcknowledged:R,setDeleteItemJSON:z,setDeleteTableConfirmation:M,setDeleteTableAcknowledged:ce,setDeleteTableJSON:we,setPutItemJSON:oe,setTTLJSON:K,setUpdateItemJSON:De,ttlJSON:X,updateItemJSON:be})]}),n.jsxs(Ne,{title:"Query / Scan",children:[n.jsx(uh,{activeTableName:j,busyOperation:ge,expressionAttributeValues:$t,filterExpression:dn,indexName:te,keyConditionExpression:st,limit:Ee,message:Ft,mode:_e,onNextPage:hs,onPreviousPage:ys,onSubmit:G=>{Jn(G)},pageIndex:ct.pageIndex,result:at,selectedItemIndex:ct.selectedItemIndex,setExpressionAttributeValues:Ze,setFilterExpression:Xt,setIndexName:Ie,setKeyConditionExpression:Lt,setLimit:Be,setMode:vt,setSelectedItemIndex:G=>Ae(re=>({...re,selectedItemIndex:G})),error:Vn}),n.jsx(ch,{operations:gt,onClear:()=>ds([])})]}),n.jsx(Ne,{title:"Inspector",children:n.jsx(dh,{detailState:p,item:nn,onRefreshDetail:en,status:i.status==="success"?i.statusPayload:void 0,table:Ge})})]})}async function hh(){return W("/api/bigquery/status")}async function yh(){return W("/api/bigquery/projects")}async function gh(r){return W(`/api/bigquery/projects/${encodeURIComponent(r)}/datasets`)}async function xh(r,i,o,c=100){return W(`/api/bigquery/projects/${encodeURIComponent(r)}/datasets/${encodeURIComponent(i)}/tables/${encodeURIComponent(o)}/rows?limit=${encodeURIComponent(String(c))}`)}async function jh(r){return W(`/api/bigquery/projects/${encodeURIComponent(r)}/jobs`)}async function vh(r,i){return W(`/api/bigquery/projects/${encodeURIComponent(r)}/jobs/${encodeURIComponent(i)}`)}async function bh(r,i){return W(`/api/bigquery/projects/${encodeURIComponent(r)}/queries`,{method:"POST",body:i,timeoutMs:15e3})}async function Sh(r,i){return W(`/api/bigquery/projects/${encodeURIComponent(r)}/datasets`,{method:"POST",body:i})}async function wh(r,i,o){return W(`/api/bigquery/projects/${encodeURIComponent(r)}/datasets/${encodeURIComponent(i)}/tables`,{method:"POST",body:o})}async function Nh(r,i,o,c){return W(`/api/bigquery/projects/${encodeURIComponent(r)}/datasets/${encodeURIComponent(i)}/tables/${encodeURIComponent(o)}/insertAll`,{method:"POST",body:c})}function kh({activeDatasetId:r,activeTableId:i,datasets:o,onSelectDataset:c,onSelectTable:f}){return o.length===0?n.jsx(Q,{title:"No datasets",description:"Datasets created through the BigQuery API will appear here."}):n.jsx("div",{className:"dynamodb-table-list","aria-label":"BigQuery datasets",children:o.map(p=>n.jsxs("section",{className:p.datasetId===r?"dynamodb-table-row active":"dynamodb-table-row",children:[n.jsxs("button",{className:"object-select",onClick:()=>c(p),children:[n.jsxs("span",{className:"table-row-top",children:[n.jsx("span",{className:"table-row-name",children:p.datasetId}),n.jsx("span",{className:"count-pill",children:p.tables.length})]}),n.jsxs("span",{className:"table-row-meta",children:[p.location||"default location"," dataset"]})]}),n.jsxs("span",{className:"table-row-tags",children:[p.tables.length===0?n.jsx("span",{children:"no tables"}):null,p.tables.map(y=>n.jsxs("button",{className:"attribute-chip",onClick:()=>f(y),type:"button",children:[y.tableId===i?">":""," ",y.tableId," (",y.numRows,")"]},y.tableId))]})]},p.datasetId))})}function Ch(r){return{status:"disabled",running:!1,endpoint:(r==null?void 0:r.endpoint)??"http://127.0.0.1:9050",project:"devcloud",location:"US",authMode:"relaxed",storagePath:(r==null?void 0:r.storagePath)??".devcloud/data/bigquery",datasetCount:0,jobCount:0}}function Eh(r){const i=r.fields??[];return i.length===0?"No schema fields":i.map(o=>`${o.name} ${o.type??"STRING"} ${o.mode??"NULLABLE"}`).join(" / ")}function Ih(r){return[...r].sort((i,o)=>Nc(o)-Nc(i)).slice(0,8)}function Nc(r){var c,f;const i=(f=(c=r.job)==null?void 0:c.statistics)==null?void 0:f.creationTime;if(!i)return 0;const o=Number.parseInt(i,10);return Number.isFinite(o)?o:0}function Rh(r){var p,y;const i=(y=(p=r.job)==null?void 0:p.statistics)==null?void 0:y.query,o=(i==null?void 0:i.totalRows)??"0",c=i!=null&&i.dryRun?"dry run":"executed",f=i!=null&&i.cacheHit?"cache hit":"cache miss";return`${c} / ${o} rows / ${f}`}function Dh(r){const i=r.job??r,o=JSON.parse(JSON.stringify(i)),c=o.configuration;return Us(c)&&Us(c.query)&&delete c.query.queryParameters,o}function Th(r,i){return i?i.f.reduce((o,c,f)=>{var p;return o[((p=r[f])==null?void 0:p.name)??`column_${f+1}`]=c.v,o},{}):{}}function kc(r,i){try{const o=JSON.parse(r);return Us(o)?o:new Error(`${i} must be a JSON object.`)}catch{return new Error(`${i} has a JSON validation error.`)}}function Lh(r){const i=r.split(` +`).map(c=>c.trim()).filter(Boolean).map(c=>{const[f,p="STRING",y]=c.split(":").map(j=>j.trim());return f?{name:f,type:p||"STRING",mode:y||void 0}:new Error("Schema field names are required.")}),o=i.find(c=>c instanceof Error);return o||{fields:i}}function $h(r,i){let o;try{o=JSON.parse(r)}catch{return new Error("Row JSON has a JSON validation error.")}if(Array.isArray(o)){const c=[];for(const[f,p]of o.entries()){if(!Us(p))return new Error(`Row ${f+1} must be a JSON object.`);c.push({json:p})}return c}return Us(o)?[{insertId:i||void 0,json:o}]:new Error("Row JSON must be a JSON object or an array of JSON objects.")}function Cc(r,i){let o=r;for(const c of i){if(!Us(o))return;o=o[c]}return typeof o=="string"&&o.trim()!==""?o.trim():void 0}function Us(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function Kc(r){return r==null?"null":typeof r=="object"?JSON.stringify(r):String(r)}function Ph({dataset:r,jobs:i,project:o,row:c,status:f,table:p}){const[y,j]=h.useState(),[b,N]=h.useState({status:"idle"}),k=h.useMemo(()=>Ih(i),[i]);return h.useEffect(()=>{if(i.length===0){j(void 0),N({status:"idle"});return}j(S=>S&&i.some(L=>L.jobId===S)?S:i[0].jobId)},[i]),h.useEffect(()=>{if(!y){N({status:"idle"});return}N({status:"loading",jobId:y}),vh(o,y).then(S=>{N({status:"success",job:S.job})}).catch(S=>{N({status:"error",message:S.message})})},[o,y]),r?n.jsxs("div",{className:"dynamodb-inspector",children:[n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Catalog"}),n.jsx("h3",{children:p?`${r.datasetId}.${p.tableId}`:r.datasetId}),n.jsxs("dl",{className:"inspector-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"Project"}),n.jsx("dd",{children:o})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Endpoint"}),n.jsx("dd",{children:n.jsx("code",{children:(f==null?void 0:f.endpoint)??"unknown"})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Location"}),n.jsx("dd",{children:(f==null?void 0:f.location)??r.location??"unknown"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Rows"}),n.jsx("dd",{children:(p==null?void 0:p.numRows)??"select a table"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Schema"}),n.jsx("dd",{children:p?Eh(p.schema):"select a table"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Jobs"}),n.jsx("dd",{children:i.length===0?"none":i.map(S=>`${S.jobId} ${S.state}`).join(", ")})]})]})]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Recent query metadata"}),k.length===0?n.jsx("p",{className:"inspector-muted",children:"Query jobs will appear after running SQL."}):n.jsx("div",{className:"dynamodb-table-list compact-list","aria-label":"BigQuery recent query jobs",children:k.map(S=>n.jsxs("button",{className:S.jobId===y?"object-select active":"object-select",onClick:()=>j(S.jobId),type:"button",children:[n.jsxs("span",{className:"table-row-top",children:[n.jsx("span",{className:"table-row-name",children:S.jobId}),n.jsx("span",{className:"count-pill",children:S.state})]}),n.jsx("span",{className:"table-row-meta",children:Rh(S)})]},S.jobId))})]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Selected job JSON"}),b.status==="loading"?n.jsx("p",{className:"inspector-muted",children:"Loading job detail."}):null,b.status==="error"?n.jsx("p",{className:"operation-message error",children:b.message}):null,b.status==="success"?n.jsx("pre",{className:"mail-preview",children:JSON.stringify(Dh(b.job),null,2)}):null]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Selected row"}),c?n.jsx("pre",{className:"mail-preview",children:JSON.stringify(c.json,null,2)}):n.jsx("p",{className:"inspector-muted",children:"Select a row to inspect JSON."})]})]}):n.jsx(Q,{title:"Inspector",description:"Dataset, table schema, selected row, and jobs will appear here."})}function Mh({activeDatasetId:r,activeTableId:i,disabled:o,onMutationSuccess:c,projectId:f}){var ve;const[p,y]=h.useState(""),[j,b]=h.useState("US"),[N,k]=h.useState(""),[S,L]=h.useState(!1),[E,D]=h.useState(`{ "datasetReference": { "datasetId": "dashboard_ops" }, @@ -95,14 +95,14 @@ payload:STRING`),[J,oe]=h.useState(!1),[be,De]=h.useState(`{ }`),[ie,z]=h.useState(""),[X,K]=h.useState(""),[ye,we]=h.useState(""),[he,O]=h.useState(`{ "event_id": "evt-1", "payload": "local test" -}`),[F,M]=h.useState({status:"idle"});h.useEffect(()=>{r&&(U(A=>A||r),z(A=>A||r))},[r]),h.useEffect(()=>{i&&K(A=>A||i)},[i]);const x=o||F.status==="running";function R(A){A.preventDefault();const pe=w?kc(E,"Dataset raw JSON"):{datasetReference:{datasetId:p.trim()},location:v.trim()||void 0,description:N.trim()||void 0};if(pe instanceof Error){M({status:"error",message:pe.message});return}if(!Cc(pe,["datasetReference","datasetId"])){M({status:"error",message:"Dataset ID is required."});return}M({status:"running",label:"Creating dataset"}),jh(f,pe).then(ge=>{M({status:"success",message:`Created dataset ${ge.datasetReference.datasetId}.`}),U(ge.datasetReference.datasetId),z(ge.datasetReference.datasetId),c()}).catch(ge=>{M({status:"error",message:ge.message})})}function ae(A){A.preventDefault();const pe=T.trim()||r;if(!pe){M({status:"error",message:"Choose a dataset before creating a table."});return}const ee=J?void 0:Rh(Se);if(ee instanceof Error){M({status:"error",message:ee.message});return}const ge=J?kc(be,"Table raw JSON"):{tableReference:{tableId:V.trim()},schema:ee,description:q.trim()||void 0};if(ge instanceof Error){M({status:"error",message:ge.message});return}if(!Cc(ge,["tableReference","tableId"])){M({status:"error",message:"Table ID is required."});return}M({status:"running",label:"Creating table"}),vh(f,pe,ge).then(_e=>{M({status:"success",message:`Created table ${pe}.${_e.tableReference.tableId}.`}),z(pe),K(_e.tableReference.tableId),c()}).catch(_e=>{M({status:"error",message:_e.message})})}function ce(A){A.preventDefault();const pe=ie.trim()||r,ee=X.trim()||i;if(!pe||!ee){M({status:"error",message:"Choose a dataset and table before inserting rows."});return}const ge=Dh(he,ye.trim());if(ge instanceof Error){M({status:"error",message:ge.message});return}M({status:"running",label:"Inserting rows"}),bh(f,pe,ee,{rows:ge}).then(Pe=>{var vt;const _e=(vt=Pe.insertErrors)==null?void 0:vt.map(te=>{const Ie=te.errors.map(Ee=>Ee.message).join("; ");return`row ${te.index}: ${Ie}`});M({status:"success",message:_e!=null&&_e.length?"Insert completed with partial insert errors.":"Inserted row data.",insertErrors:_e}),c()}).catch(Pe=>{M({status:"error",message:Pe.message})})}return n.jsxs("section",{className:"redshift-query-runner","aria-label":"BigQuery management controls",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"inspector-label",children:"Local management"}),n.jsx("span",{className:"toolbar-count",children:"datasets.insert / tables.insert / tabledata.insertAll"})]}),o?n.jsx("p",{className:"inspector-muted",children:"BigQuery management controls are disabled until the service is active."}):null,F.status==="running"?n.jsxs("p",{className:"operation-message",children:[F.label,"."]}):null,F.status==="success"?n.jsxs("div",{className:"operation-message success",children:[F.message,(ve=F.insertErrors)!=null&&ve.length?n.jsx("ul",{children:F.insertErrors.map(A=>n.jsx("li",{children:A},A))}):null]}):null,F.status==="error"?n.jsx("p",{className:"operation-message error",children:F.message}):null,n.jsxs("form",{className:"dynamodb-operation-form",onSubmit:R,children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"inspector-label",children:"Create dataset"}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"raw JSON"}),n.jsx("input",{"aria-label":"Use raw JSON for BigQuery dataset",checked:w,disabled:x,onChange:A=>L(A.target.checked),type:"checkbox"})]})]}),w?n.jsxs("label",{className:"redshift-sql-editor",children:[n.jsx("span",{children:"Dataset raw JSON"}),n.jsx("textarea",{"aria-label":"BigQuery dataset raw JSON",disabled:x,onChange:A=>D(A.target.value),rows:7,spellCheck:!1,value:E})]}):n.jsxs("div",{className:"pubsub-action-row",children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Dataset ID"}),n.jsx("input",{"aria-label":"BigQuery dataset ID",disabled:x,onChange:A=>y(A.target.value),placeholder:"dashboard_ops",value:p})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Location"}),n.jsx("input",{"aria-label":"BigQuery dataset location",disabled:x,onChange:A=>b(A.target.value),placeholder:"US",value:v})]}),n.jsxs("label",{className:"compact-filter wide",children:[n.jsx("span",{children:"Description"}),n.jsx("input",{"aria-label":"BigQuery dataset description",disabled:x,onChange:A=>C(A.target.value),placeholder:"local dashboard dataset",value:N})]})]}),n.jsx(ue,{disabled:x,type:"submit",children:"Create dataset"})]}),n.jsxs("form",{className:"dynamodb-operation-form",onSubmit:ae,children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"inspector-label",children:"Create table"}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"raw JSON"}),n.jsx("input",{"aria-label":"Use raw JSON for BigQuery table",checked:J,disabled:x,onChange:A=>oe(A.target.checked),type:"checkbox"})]})]}),n.jsxs("div",{className:"pubsub-action-row",children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Dataset ID"}),n.jsx("input",{"aria-label":"BigQuery table dataset ID",disabled:x,onChange:A=>U(A.target.value),placeholder:r??"dataset",value:T})]}),J?null:n.jsxs(n.Fragment,{children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Table ID"}),n.jsx("input",{"aria-label":"BigQuery table ID",disabled:x,onChange:A=>se(A.target.value),placeholder:"events",value:V})]}),n.jsxs("label",{className:"compact-filter wide",children:[n.jsx("span",{children:"Description"}),n.jsx("input",{"aria-label":"BigQuery table description",disabled:x,onChange:A=>me(A.target.value),placeholder:"local events table",value:q})]})]})]}),J?n.jsxs("label",{className:"redshift-sql-editor",children:[n.jsx("span",{children:"Table raw JSON"}),n.jsx("textarea",{"aria-label":"BigQuery table raw JSON",disabled:x,onChange:A=>De(A.target.value),rows:9,spellCheck:!1,value:be})]}):n.jsxs("label",{className:"redshift-sql-editor",children:[n.jsx("span",{children:"Schema fields"}),n.jsx("textarea",{"aria-label":"BigQuery table schema fields",disabled:x,onChange:A=>Ce(A.target.value),rows:4,spellCheck:!1,value:Se})]}),n.jsx(ue,{disabled:x,type:"submit",children:"Create table"})]}),n.jsxs("form",{className:"dynamodb-operation-form",onSubmit:ce,children:[n.jsx("span",{className:"inspector-label",children:"Insert row"}),n.jsxs("div",{className:"pubsub-action-row",children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Dataset ID"}),n.jsx("input",{"aria-label":"BigQuery insert dataset ID",disabled:x,onChange:A=>z(A.target.value),placeholder:r??"dataset",value:ie})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Table ID"}),n.jsx("input",{"aria-label":"BigQuery insert table ID",disabled:x,onChange:A=>K(A.target.value),placeholder:i??"table",value:X})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Insert ID"}),n.jsx("input",{"aria-label":"BigQuery insert ID",disabled:x,onChange:A=>we(A.target.value),placeholder:"optional",value:ye})]})]}),n.jsxs("label",{className:"redshift-sql-editor",children:[n.jsx("span",{children:"Row JSON"}),n.jsx("textarea",{"aria-label":"BigQuery insert row JSON",disabled:x,onChange:A=>O(A.target.value),rows:6,spellCheck:!1,value:he})]}),n.jsx("p",{className:"inspector-muted",children:"JSON validation runs locally before tabledata.insertAll. Row payloads are not written to logs."}),n.jsx(ue,{disabled:x,type:"submit",children:"Insert row"})]})]})}function $h({disabled:r,projectId:i,onQuerySuccess:o}){const[c,f]=h.useState("SELECT * FROM `analytics.people` LIMIT 10"),[p,y]=h.useState("25"),[v,b]=h.useState(!1),[N,C]=h.useState({status:"idle"}),[w,L]=h.useState(0),E=N.status==="success"?N.response:void 0,D=(E==null?void 0:E.rows)??[],T=D[Math.min(w,Math.max(D.length-1,0))];function U(V){V.preventDefault();const se=c.trim();if(se===""){C({status:"error",message:"Query text is required."});return}const q=Number.parseInt(p,10);if(!Number.isInteger(q)||q<1||q>1e3){C({status:"error",message:"Max results must be between 1 and 1000."});return}C({status:"running"}),xh(i,{query:se,maxResults:q,dryRun:v,useLegacySql:!1}).then(me=>{L(0),C({status:"success",response:me}),o()}).catch(me=>{C({status:"error",message:me.message})})}return n.jsxs("section",{className:"redshift-query-runner","aria-label":"BigQuery SQL query runner",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"inspector-label",children:"SQL query runner"}),n.jsx("span",{className:"toolbar-count",children:E?`${E.totalRows} rows / ${E.jobReference.jobId}`:"useLegacySql=false"})]}),n.jsxs("form",{className:"redshift-query-form",onSubmit:U,children:[n.jsxs("label",{className:"redshift-sql-editor",children:[n.jsx("span",{children:"Query text"}),n.jsx("textarea",{"aria-label":"BigQuery SQL query text",disabled:r||N.status==="running",onChange:V=>f(V.target.value),rows:5,spellCheck:!1,value:c})]}),n.jsxs("div",{className:"pubsub-action-row",children:[n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Max results"}),n.jsx("input",{"aria-label":"BigQuery query max results",disabled:r||N.status==="running",max:1e3,min:1,onChange:V=>y(V.target.value),type:"number",value:p})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Dry run"}),n.jsx("input",{"aria-label":"BigQuery dry run",checked:v,disabled:r||N.status==="running",onChange:V=>b(V.target.checked),type:"checkbox"})]}),n.jsx(ue,{disabled:r||N.status==="running",type:"submit",children:N.status==="running"?"Running":v?"Dry run":"Run query"})]})]}),r?n.jsx("p",{className:"inspector-muted",children:"BigQuery query controls are disabled until the service is active."}):null,N.status==="error"?n.jsx("p",{className:"operation-message error",children:N.message}):null,E?n.jsx(Ph,{response:E,selectedRow:T,selectedRowIndex:w,onSelectRow:L}):null]})}function Ph({onSelectRow:r,response:i,selectedRow:o,selectedRowIndex:c}){var b,N;const f=((b=i.schema)==null?void 0:b.fields)??[],p=i.rows??[],y=Math.max(f.length,((N=p[0])==null?void 0:N.f.length)??0),v=Array.from({length:y},(C,w)=>{var L,E;return{name:((L=f[w])==null?void 0:L.name)??`column_${w+1}`,type:((E=f[w])==null?void 0:E.type)??"UNKNOWN"}});return n.jsxs("div",{className:"redshift-query-result",children:[n.jsxs("div",{className:"attribute-preview","aria-label":"BigQuery query summary",children:[n.jsx("span",{className:"attribute-chip",children:i.jobComplete?"complete":"running"}),n.jsx("span",{className:"attribute-chip",children:i.cacheHit?"cache hit":"cache miss"}),n.jsxs("span",{className:"attribute-chip",children:[i.totalRows," rows"]}),n.jsx("span",{className:"attribute-chip",children:i.jobReference.jobId})]}),p.length===0?n.jsx("p",{className:"inspector-muted",children:"Query completed without loaded result rows."}):n.jsxs("div",{className:"dynamodb-query-result-grid",children:[n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table compact",children:[n.jsx("thead",{children:n.jsx("tr",{children:v.map(C=>n.jsxs("th",{scope:"col",children:[C.name,n.jsx("span",{className:"query-column-type",children:C.type})]},C.name))})}),n.jsx("tbody",{children:p.map((C,w)=>n.jsx("tr",{className:w===c?"item-row active":"item-row",onClick:()=>r(w),children:v.map((L,E)=>{var D;return n.jsx("td",{children:Vc((D=C.f[E])==null?void 0:D.v)},L.name)})},`${i.jobReference.jobId}-${w}`))})]})}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Selected result JSON"}),n.jsx("pre",{className:"mail-preview",children:JSON.stringify(Ih(f,o),null,2)})]})]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Job reference"}),n.jsx("pre",{className:"mail-preview",children:JSON.stringify(i.jobReference,null,2)})]})]})}function Mh({activeIndex:r,rows:i,rowsState:o,tableName:c,onSelectIndex:f}){return c?o.status==="loading"?n.jsx(Q,{title:"Loading rows",description:`Reading rows from ${c}.`}):o.status==="error"?n.jsx(Q,{title:"BigQuery rows unavailable",description:o.message}):i.length===0?n.jsx(Q,{title:"No rows",description:`No loaded rows in ${c} match the current filter.`}):n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Insert ID"}),n.jsx("th",{scope:"col",children:"Values"}),n.jsx("th",{scope:"col",children:"Inserted"})]})}),n.jsx("tbody",{children:i.map((p,y)=>n.jsxs("tr",{className:y===r?"item-row active":"item-row",onClick:()=>f(y),children:[n.jsx("td",{children:n.jsx("code",{children:p.insertId??y+1})}),n.jsx("td",{children:n.jsx(Oh,{item:p.json})}),n.jsx("td",{children:p.insertedAt??"unknown"})]},`${p.insertId??"row"}-${y}`))})]})}):n.jsx(Q,{title:"No table selected",description:"Choose a BigQuery table to inspect stored rows."})}function Oh({item:r}){const i=Object.entries(r).slice(0,6);return i.length===0?n.jsx("span",{className:"service-status",children:"empty row"}):n.jsx("span",{className:"attribute-preview",children:i.map(([o,c])=>n.jsxs("span",{className:"attribute-chip",children:[o,": ",Vc(c)]},o))})}function _h({service:r}){const[i,o]=h.useState({status:"loading"}),[c,f]=h.useState({status:"idle"}),[p,y]=h.useState(),[v,b]=h.useState(),[N,C]=h.useState(0),[w,L]=h.useState(""),[E,D]=h.useState(""),T=(r==null?void 0:r.status)==="disabled",U=h.useCallback(()=>{if(T){o({status:"success",statusPayload:wh(r),datasets:[],jobs:[]}),f({status:"idle"}),y(void 0),b(void 0);return}o({status:"loading"}),Promise.all([fh(),ph()]).then(async([ie,z])=>{const X=z.projects[0],K=(X==null?void 0:X.projectId)??ie.project,[{datasets:ye},{jobs:we}]=await Promise.all([mh(K),yh(K)]);o({status:"success",statusPayload:ie,datasets:ye,jobs:we}),y(he=>{var O;return he&&ye.some(F=>F.datasetId===he)?he:(O=ye[0])==null?void 0:O.datasetId}),b(he=>{var F;const O=ye.find(M=>M.datasetId===p)??ye[0];return he&&(O!=null&&O.tables.some(M=>M.tableId===he))?he:(F=O==null?void 0:O.tables[0])==null?void 0:F.tableId})}).catch(ie=>{o({status:"error",message:ie.message})})},[p,T,r]);h.useEffect(()=>{U()},[U]),cn({topics:["bigquery"],onEvent:U,enabled:!T});const V=i.status==="success"?i.datasets:[],se=V.find(ie=>ie.datasetId===p),q=se==null?void 0:se.tables.find(ie=>ie.tableId===v),me=i.status==="success"?i.statusPayload.project:r==null?void 0:r.endpoint,Se=h.useCallback(()=>{if(!se||!q||i.status!=="success"||T){f({status:"idle"});return}f({status:"loading"}),hh(i.statusPayload.project,se.datasetId,q.tableId).then(({rows:ie})=>{C(0),f({status:"success",rows:ie})}).catch(ie=>{f({status:"error",message:ie.message})})},[se,q,i,T]);h.useEffect(()=>{Se()},[Se]);const Ce=h.useMemo(()=>{const ie=w.trim().toLowerCase();return ie===""?V:V.filter(z=>z.datasetId.toLowerCase().includes(ie))},[V,w]),J=h.useMemo(()=>{const ie=c.status==="success"?c.rows:[],z=E.trim().toLowerCase();return z===""?ie:ie.filter(X=>JSON.stringify(X).toLowerCase().includes(z))},[c,E]),oe=J[Math.min(N,Math.max(J.length-1,0))];if(T)return n.jsx(Ne,{title:"BigQuery",children:n.jsx(Q,{title:"BigQuery is disabled",description:"Enable the BigQuery service in devcloud config to inspect projects, datasets, tables, rows, and jobs."})});function be(ie){var z;y(ie.datasetId),b((z=ie.tables[0])==null?void 0:z.tableId),C(0),D("")}function De(ie){b(ie.tableId),C(0),D("")}return n.jsxs("div",{className:"dynamodb-workspace",children:[n.jsxs(Ne,{title:"Datasets",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter BigQuery datasets",onChange:ie=>L(ie.target.value),placeholder:"dataset id",type:"search",value:w})]}),n.jsx(ue,{onClick:U,children:"Refresh"})]}),i.status==="loading"?n.jsx(Q,{title:"Loading datasets",description:"Reading local BigQuery catalog metadata."}):null,i.status==="error"?n.jsx(Q,{title:"BigQuery catalog unavailable",description:i.message,actionLabel:"Retry",onAction:U}):null,i.status==="success"?n.jsx(Sh,{activeDatasetId:p,activeTableId:v,datasets:Ce,onSelectDataset:be,onSelectTable:De}):null]}),n.jsxs(Ne,{title:"Rows",children:[n.jsx($h,{disabled:T||i.status!=="success",projectId:me??"devcloud",onQuerySuccess:U}),n.jsx(Lh,{activeDatasetId:se==null?void 0:se.datasetId,activeTableId:q==null?void 0:q.tableId,disabled:T||i.status!=="success",projectId:me??"devcloud",onMutationSuccess:()=>{U(),Se()}}),n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"toolbar-count",children:q?`${J.length} shown / ${q.numRows} reported`:"Select a table"}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter BigQuery rows",disabled:!q,onChange:ie=>{C(0),D(ie.target.value)},placeholder:"row value",type:"search",value:E})]}),n.jsx(ue,{disabled:!q,onClick:Se,children:"Refresh"})]}),n.jsx(Mh,{activeIndex:N,rows:J,rowsState:c,tableName:q==null?void 0:q.tableId,onSelectIndex:C})]}),n.jsx(Ne,{title:"Inspector",children:n.jsx(Th,{dataset:se,jobs:i.status==="success"?i.jobs:[],project:me??"unknown",row:oe,status:i.status==="success"?i.statusPayload:void 0,table:q})})]})}async function Bh(){return W("/api/redshift/status")}async function Ah(){return W("/api/redshift/clusters")}async function zh(){return W("/api/redshift/catalog")}async function Fh(){return W("/api/redshift/statements")}async function Qh(r){return W("/api/redshift/query",{method:"POST",body:r,timeoutMs:15e3})}function Uh({service:r}){const[i,o]=h.useState({status:"loading"}),[c,f]=h.useState(),[p,y]=h.useState(""),v=(r==null?void 0:r.status)==="disabled",b=h.useCallback(()=>{if(v){o({status:"success",statusPayload:Wh(r),clusters:[],catalog:{database:"dev",schemas:[],tables:[],columns:[]},statements:[]}),f(void 0);return}o({status:"loading"}),Promise.all([Bh(),Ah(),zh(),Fh()]).then(([D,T,U,V])=>{const se=U.catalog.tables;o({status:"success",statusPayload:D,clusters:T.clusters,catalog:U.catalog,statements:V.statements}),f(q=>q&&se.some(me=>Fs(me)===q)?q:Fs(se[0]))}).catch(D=>{o({status:"error",message:D.message})})},[v,r]);h.useEffect(()=>{b()},[b]),cn({topics:["redshift"],onEvent:b,enabled:!v});const N=i.status==="success"?i.catalog:void 0,C=(N==null?void 0:N.tables)??[],w=h.useMemo(()=>{const D=p.trim().toLowerCase();return D===""?C:C.filter(T=>`${T.schema}.${T.name}`.toLowerCase().includes(D))},[p,C]),L=C.find(D=>Fs(D)===c),E=(N==null?void 0:N.columns.filter(D=>L&&D.schema===L.schema&&D.table===L.name))??[];return v?n.jsx(Ne,{title:"Redshift",children:n.jsx(Q,{title:"Redshift is disabled",description:"Enable the Redshift service in devcloud config to inspect clusters, catalog metadata, and statements."})}):n.jsxs("div",{className:"dynamodb-workspace",children:[n.jsxs(Ne,{title:"Clusters",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"toolbar-count",children:i.status==="success"?`${i.clusters.length} clusters`:"Loading"}),n.jsx(ue,{onClick:b,children:"Refresh"})]}),i.status==="loading"?n.jsx(Q,{title:"Loading Redshift",description:"Reading local Redshift metadata."}):null,i.status==="error"?n.jsx(Q,{title:"Redshift unavailable",description:i.message,actionLabel:"Retry",onAction:b}):null,i.status==="success"?n.jsx(qh,{clusters:i.clusters,status:i.statusPayload}):null]}),n.jsxs(Ne,{title:"Catalog",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"toolbar-count",children:`${w.length} shown / ${C.length} tables`}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter Redshift tables",onChange:D=>y(D.target.value),placeholder:"schema or table",type:"search",value:p})]})]}),n.jsx(Vh,{activeTableKey:c,tables:w,onSelectTable:D=>f(Fs(D))})]}),n.jsx(Ne,{title:"Inspector",children:n.jsx(Kh,{columns:E,onQuerySuccess:b,statements:i.status==="success"?i.statements:[],status:i.status==="success"?i.statusPayload:void 0,table:L})})]})}function qh({clusters:r,status:i}){return r.length===0?n.jsx(Q,{title:"No clusters",description:"Local Redshift cluster metadata will appear here."}):n.jsx("div",{className:"dynamodb-table-list","aria-label":"Redshift clusters",children:r.map(o=>n.jsxs("section",{className:"dynamodb-table-row",children:[n.jsxs("span",{className:"table-row-top",children:[n.jsx("span",{className:"table-row-name",children:o.clusterIdentifier}),n.jsx("span",{className:"count-pill",children:o.clusterStatus})]}),n.jsxs("span",{className:"table-row-meta",children:[o.databaseName," on ",o.endpoint.address,":",o.endpoint.port]}),n.jsxs("span",{className:"table-row-tags",children:[n.jsx("span",{children:o.nodeType}),n.jsxs("span",{children:[o.numberOfNodes," node"]}),n.jsx("span",{children:i.region})]})]},o.clusterIdentifier))})}function Vh({activeTableKey:r,tables:i,onSelectTable:o}){return i.length===0?n.jsx(Q,{title:"No tables",description:"Tables created through Redshift SQL or Data API clients will appear here."}):n.jsx("div",{className:"dynamodb-table-list","aria-label":"Redshift tables",children:i.map(c=>n.jsxs("button",{className:Fs(c)===r?"dynamodb-table-row active":"dynamodb-table-row",onClick:()=>o(c),type:"button",children:[n.jsxs("span",{className:"table-row-top",children:[n.jsx("span",{className:"table-row-name",children:c.name}),n.jsx("span",{className:"count-pill",children:c.rowCount})]}),n.jsxs("span",{className:"table-row-meta",children:[c.schema," schema"]}),n.jsxs("span",{className:"table-row-tags",children:[n.jsxs("span",{children:[c.columnCount," columns"]}),c.distKey?n.jsxs("span",{children:["distkey ",c.distKey]}):null,c.sortKeys.length>0?n.jsxs("span",{children:["sortkey ",c.sortKeys.join(", ")]}):null]})]},Fs(c)))})}function Kh({columns:r,onQuerySuccess:i,statements:o,status:c,table:f}){return n.jsxs("div",{className:"dynamodb-inspector",children:[n.jsx(Hh,{onQuerySuccess:i}),f?null:n.jsx(Q,{title:"Inspector",description:"Table columns and recent statements will appear here."}),f?n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Table"}),n.jsx("h3",{children:`${f.schema}.${f.name}`}),n.jsxs("dl",{className:"inspector-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"SQL endpoint"}),n.jsx("dd",{children:n.jsx("code",{children:(c==null?void 0:c.sqlEndpoint)??"127.0.0.1:5439"})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"API endpoint"}),n.jsx("dd",{children:n.jsx("code",{children:(c==null?void 0:c.apiEndpoint)??"http://127.0.0.1:9099"})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Rows"}),n.jsx("dd",{children:f.rowCount})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Distribution"}),n.jsxs("dd",{children:[f.distStyle||"auto"," ",f.distKey?`on ${f.distKey}`:""]})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Sort keys"}),n.jsx("dd",{children:f.sortKeys.length>0?f.sortKeys.join(", "):"none"})]})]})]}):null,f?n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Columns"}),r.length===0?n.jsx("p",{className:"inspector-muted",children:"No column metadata recorded."}):n.jsx("div",{className:"attribute-preview",children:r.map(p=>n.jsxs("span",{className:"attribute-chip",children:[p.name," ",p.dataType,p.encoding?` encode ${p.encoding}`:"",p.identity?" identity":""]},`${p.table}-${p.name}`))})]}):null,n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Recent statements"}),o.length===0?n.jsx("p",{className:"inspector-muted",children:"No Redshift statements recorded."}):n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"ID"}),n.jsx("th",{scope:"col",children:"Status"}),n.jsx("th",{scope:"col",children:"Rows"}),n.jsx("th",{scope:"col",children:"SQL"})]})}),n.jsx("tbody",{children:o.slice(0,8).map(p=>n.jsxs("tr",{className:"item-row",children:[n.jsx("td",{children:n.jsx("code",{children:p.redshiftQueryId})}),n.jsx("td",{children:p.status}),n.jsx("td",{children:p.resultRows}),n.jsxs("td",{children:[p.queryPreview,p.queryRedacted||p.queryTruncated?n.jsx("span",{className:"attribute-chip",children:p.queryRedacted?"redacted":"truncated"}):null]})]},p.id))})]})})]})]})}function Hh({onQuerySuccess:r}){const[i,o]=h.useState("select 1"),[c,f]=h.useState("100"),[p,y]=h.useState(),[v,b]=h.useState(),[N,C]=h.useState(),[w,L]=h.useState(!1),E=D=>{if(D.preventDefault(),i.trim()===""){y(void 0),C(void 0),b("SQL is required.");return}const T=Number.parseInt(c,10),U=Number.isFinite(T)?Math.max(1,T):100;f(String(U)),L(!0),b(void 0),C(void 0),Qh({sql:i,maxRows:U}).then(V=>{y(V.result),C(`${V.result.statement.status}: ${V.result.commandTag||"statement completed"}`),r()}).catch(()=>{y(void 0),C(void 0),b("Query failed. Check SQL syntax and local Redshift state.")}).finally(()=>L(!1))};return n.jsxs("section",{className:"redshift-query-runner","aria-label":"Redshift query runner",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"inspector-label",children:"Query runner"}),n.jsx("span",{className:"toolbar-count",children:p?`${p.rowCount} rows`:"Ready"})]}),n.jsxs("form",{className:"redshift-query-form",onSubmit:E,children:[n.jsxs("label",{className:"redshift-sql-editor",children:[n.jsx("span",{children:"SQL"}),n.jsx("textarea",{"aria-label":"Redshift SQL",onChange:D=>o(D.target.value),rows:5,spellCheck:!1,value:i})]}),n.jsxs("div",{className:"pubsub-action-row",children:[n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Max rows"}),n.jsx("input",{min:1,onChange:D=>f(D.target.value),type:"number",value:c})]}),n.jsx(ue,{disabled:w,type:"submit",children:w?"Running":"Run query"})]})]}),v?n.jsx("p",{className:"operation-message error",children:v}):null,N?n.jsx("p",{className:"operation-message success",children:N}):null,p?n.jsx(Jh,{queryResult:p}):null]})}function Jh({queryResult:r}){return n.jsxs("div",{className:"redshift-query-result",children:[n.jsxs("div",{className:"attribute-preview","aria-label":"Redshift query summary",children:[n.jsx("span",{className:"attribute-chip",children:r.statement.status}),n.jsx("span",{className:"attribute-chip",children:r.commandTag}),n.jsxs("span",{className:"attribute-chip",children:[r.rowCount," rows"]})]}),r.columns.length===0?n.jsx("p",{className:"inspector-muted",children:"Statement completed without a result set."}):n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table",children:[n.jsx("thead",{children:n.jsx("tr",{children:r.columns.map(i=>n.jsxs("th",{scope:"col",children:[i.name,n.jsx("span",{className:"query-column-type",children:i.typeName})]},i.name))})}),n.jsx("tbody",{children:r.rows.length===0?n.jsx("tr",{children:n.jsx("td",{colSpan:r.columns.length,children:"No rows returned."})}):r.rows.map((i,o)=>n.jsx("tr",{className:"item-row",children:r.columns.map((c,f)=>n.jsx("td",{children:String(i[f]??"")},`${o}-${c.name}`))},o))})]})})]})}function Wh(r){return{service:"redshift",status:"disabled",running:!1,sqlEndpoint:"127.0.0.1:5439",apiEndpoint:(r==null?void 0:r.endpoint)??"http://127.0.0.1:9099",region:"us-east-1",clusterCount:0,storagePath:(r==null?void 0:r.storagePath)??".devcloud/data/redshift",backendKind:"postgres",backendMode:"managed"}}function Fs(r){if(r)return`${r.schema}.${r.name}`}async function Gh(){return W("/api/redis/status")}async function Ec(r=0,i="*",o=100){const c=new URLSearchParams({cursor:String(r),match:i,count:String(o)});return W(`/api/redis/keys?${c.toString()}`)}async function Ic(r){return W(`/api/redis/keys/${encodeURIComponent(r)}`)}async function Yh(r){return W("/api/redis/command",{method:"POST",body:r})}async function Xh(r){return W(`/api/redis/keys/${encodeURIComponent(r)}`,{method:"DELETE"})}async function Zh(r,i){return W(`/api/redis/keys/${encodeURIComponent(r)}/expire`,{method:"POST",body:{ttlSeconds:i}})}async function ey(){return W("/api/redis/keys?confirm=FLUSHDB",{method:"DELETE"})}const ty=8;function ny({service:r}){const i=Dr(),[o,c]=h.useState({status:"loading"}),[f,p]=h.useState(),[y,v]=h.useState(),[b,N]=h.useState(),[C,w]=h.useState("*"),[L,E]=h.useState(),D=(r==null?void 0:r.status)==="disabled",T=h.useCallback(()=>{if(D){c({status:"success",statusPayload:jy(r),keys:[],nextCursor:0}),p(void 0),v(void 0);return}c({status:"loading"}),Promise.all([Gh(),Ec(0,C)]).then(([J,oe])=>{c({status:"success",statusPayload:J,keys:oe.keys,nextCursor:oe.nextCursor}),p(be=>{var De;return be&&oe.keys.some(ie=>ie.key===be)?be:(De=oe.keys[0])==null?void 0:De.key})}).catch(J=>c({status:"error",message:J.message}))},[D,C,r]),U=h.useCallback(()=>{o.status!=="success"||o.nextCursor===0||D||Ec(o.nextCursor,C).then(J=>{c(oe=>oe.status!=="success"?oe:{...oe,keys:[...oe.keys,...J.keys],nextCursor:J.nextCursor})}).catch(J=>E({tone:"error",text:J.message}))},[D,C,o]);h.useEffect(()=>{T()},[T]),cn({topics:["redis"],onEvent:T,enabled:!D}),h.useEffect(()=>{if(!f||D){v(void 0),N(void 0);return}let J=!1;return N(void 0),Ic(f).then(oe=>{J||v(oe)}).catch(oe=>{J||(v(void 0),N(oe.message))}),()=>{J=!0}},[f,D]);const V=o.status==="success"?o.keys:[],se=o.status==="success"?o.nextCursor:0,q=o.status==="success"?o.statusPayload:void 0;async function me(J){await i(bn({title:"Delete Redis key",description:"This key will be permanently removed from the selected Redis database.",target:J}))&&Xh(J).then(be=>{E({tone:"success",text:`Deleted ${J} (${be.deleted} key)`}),p(void 0),v(void 0),T()}).catch(be=>E({tone:"error",text:be.message}))}function Se(J,oe){Zh(J,oe).then(be=>{E({tone:be.updated?"success":"warning",text:be.updated?`Set TTL on ${J} to ${oe}s`:`TTL not updated on ${J} (key may be missing)`}),Ic(J).then(v).catch(()=>{}),T()}).catch(be=>E({tone:"error",text:be.message}))}async function Ce(){await i(bn({title:"Flush Redis DB",description:"This removes every key from the selected Redis database. FLUSHALL is never used.",target:"FLUSHDB",confirmLabel:"Flush DB"}))&&ey().then(oe=>{E({tone:"success",text:`FLUSHDB ${oe.result}`}),p(void 0),v(void 0),T()}).catch(oe=>E({tone:"error",text:oe.message}))}return D?n.jsx(Ne,{title:"Redis",children:n.jsx(Q,{title:"Redis is disabled",description:"Enable services.redis.enabled in .devcloud/config.yaml and restart devcloud."})}):n.jsxs("div",{className:"redis-shell",children:[n.jsx(ly,{status:q,loading:o.status==="loading",error:o.status==="error"?o.message:void 0}),n.jsxs("div",{className:"redis-workspace",children:[n.jsxs(Ne,{title:"Keys",children:[n.jsxs("div",{className:"redis-keys-toolbar",children:[n.jsx(ry,{loading:o.status==="loading",keys:V.length,total:q==null?void 0:q.db0Keys}),n.jsxs("div",{className:"redis-toolbar-actions",children:[n.jsx(ue,{onClick:T,children:"Refresh"}),n.jsx(ue,{disabled:o.status!=="success"||se===0,onClick:U,children:"Load more"}),n.jsx(ue,{className:"danger",disabled:V.length===0,onClick:Ce,children:"Flush DB"})]})]}),n.jsxs("label",{className:"redis-match-field",children:[n.jsx("span",{children:"Match pattern"}),n.jsx("input",{"aria-label":"Match Redis keys",onChange:J=>w(J.target.value),placeholder:"* | prefix:* | exact-key",spellCheck:!1,type:"search",value:C})]}),L?n.jsx(sy,{message:L,onDismiss:()=>E(void 0)}):null,o.status==="loading"?n.jsx(Q,{title:"Loading Redis",description:"Reading key metadata via SCAN."}):null,o.status==="error"?n.jsx(Q,{title:"Redis unavailable",description:o.message,actionLabel:"Retry",onAction:T}):null,o.status==="success"?n.jsx(iy,{activeKey:f,keys:V,onSelectKey:p}):null]}),n.jsx(Ne,{title:"Inspector",children:n.jsx(ay,{detail:y,error:b,onDeleteKey:me,onApplyTTL:Se})}),n.jsx(Ne,{title:"Command Runner",children:n.jsx(xy,{})})]})]})}function sy({message:r,onDismiss:i}){return n.jsxs("div",{className:`redis-message redis-message-${r.tone}`,role:"status",children:[n.jsx("span",{children:r.text}),n.jsx("button",{"aria-label":"Dismiss",className:"redis-message-close",onClick:i,type:"button",children:"×"})]})}function ry({keys:r,total:i,loading:o}){if(o)return n.jsx("span",{className:"redis-keys-count",children:"Loading…"});const c=i!==void 0&&i>=0?` / ${i}`:"";return n.jsxs("span",{className:"redis-keys-count",children:[n.jsx("strong",{children:r}),n.jsxs("span",{className:"redis-keys-count-total",children:[c," key",r===1?"":"s"]})]})}function ly({status:r,loading:i,error:o}){return i&&!r?n.jsx("header",{className:"redis-status-bar redis-status-bar-loading",children:n.jsx("span",{children:"Connecting to Redis…"})}):o&&!r?n.jsxs("header",{className:"redis-status-bar redis-status-bar-error",role:"alert",children:[n.jsxs("span",{className:"redis-status-cell",children:[n.jsx("span",{className:"cell-label",children:"State"}),n.jsx("span",{className:"cell-value",children:"unreachable"})]}),n.jsxs("span",{className:"redis-status-cell redis-status-cell-wide",children:[n.jsx("span",{className:"cell-label",children:"Reason"}),n.jsx("span",{className:"cell-value",children:o})]})]}):r?n.jsxs("header",{className:"redis-status-bar",children:[n.jsxs("span",{className:`redis-status-cell redis-mode-pill redis-mode-${r.mode||"unknown"}`,children:[n.jsx("span",{className:"cell-label",children:"Mode"}),n.jsx("span",{className:"cell-value",children:r.mode||"unknown"})]}),n.jsxs("span",{className:"redis-status-cell",children:[n.jsx("span",{className:"cell-label",children:"Address"}),n.jsx("code",{children:r.address||"—"})]}),n.jsxs("span",{className:"redis-status-cell",children:[n.jsx("span",{className:"cell-label",children:"Server"}),n.jsx("span",{className:"cell-value",children:r.serverVersion||"—"})]}),n.jsxs("span",{className:"redis-status-cell",children:[n.jsx("span",{className:"cell-label",children:"Clients"}),n.jsx("span",{className:"cell-value",children:r.connectedClients})]}),n.jsxs("span",{className:"redis-status-cell",children:[n.jsx("span",{className:"cell-label",children:"Memory"}),n.jsx("span",{className:"cell-value",children:r.usedMemoryHuman||"—"})]}),n.jsxs("span",{className:"redis-status-cell",children:[n.jsx("span",{className:"cell-label",children:"Keys (db0)"}),n.jsx("span",{className:"cell-value",children:r.db0Keys})]})]}):n.jsx("header",{className:"redis-status-bar redis-status-bar-loading",children:n.jsx("span",{children:"—"})})}function iy({activeKey:r,keys:i,onSelectKey:o}){return i.length===0?n.jsx(Q,{title:"No keys",description:"Send SET / HSET / LPUSH from a Redis client and refresh."}):n.jsx("ul",{className:"redis-key-list","aria-label":"Redis keys",children:i.map(c=>{const f=c.key===r;return n.jsx("li",{children:n.jsxs("button",{"aria-current":f?"true":void 0,className:f?"redis-key-row active":"redis-key-row",onClick:()=>o(c.key),title:c.key,type:"button",children:[n.jsxs("span",{className:"redis-key-row-top",children:[n.jsx(Kc,{type:c.type}),n.jsx(Hc,{ttlSeconds:c.ttlSeconds,compact:!0})]}),n.jsx("span",{className:"redis-key-row-name",children:c.key})]})},c.key)})})}function ay({detail:r,error:i,onApplyTTL:o,onDeleteKey:c}){return i?n.jsx(Q,{title:"Key unavailable",description:i}):r?n.jsxs("div",{className:"redis-inspector",children:[n.jsx(oy,{detail:r}),n.jsx(uy,{detail:r}),n.jsx(yy,{detail:r,onApplyTTL:o,onDeleteKey:c})]}):n.jsx(Q,{title:"Select a key",description:"Choose a key on the left to inspect its type, TTL, and value."})}function oy({detail:r}){const[i,o]=h.useState(!1);function c(){navigator.clipboard&&navigator.clipboard.writeText(r.key).then(()=>{o(!0),window.setTimeout(()=>o(!1),1500)}).catch(()=>{})}return n.jsxs("header",{className:"redis-inspector-header",children:[n.jsx("span",{className:"redis-inspector-eyebrow",children:"Key"}),n.jsxs("div",{className:"redis-key-title-row",children:[n.jsx("code",{className:"redis-key-title",children:r.key}),n.jsx("button",{className:"redis-copy-button",onClick:c,title:"Copy key",type:"button",children:i?"copied":"copy"})]}),n.jsxs("div",{className:"redis-key-badges",children:[n.jsx(Kc,{type:r.type}),n.jsx(Hc,{ttlSeconds:r.ttlSeconds}),n.jsx(gy,{detail:r})]})]})}function uy({detail:r}){return!r.preview||r.preview.length===0?n.jsxs("section",{className:"redis-inspector-section",children:[n.jsx("span",{className:"redis-inspector-eyebrow",children:"Value"}),n.jsx(Q,{title:"Empty value",description:"The key exists but has no previewable content in this slice."})]}):n.jsxs("section",{className:"redis-inspector-section",children:[n.jsx("header",{className:"redis-section-head",children:n.jsx("span",{className:"redis-inspector-eyebrow",children:"Value"})}),cy(r)]})}function cy(r){switch(r.type){case"string":return n.jsx(dy,{raw:r.preview[0]??""});case"list":return n.jsx(fy,{items:r.preview});case"hash":return n.jsx(py,{entries:r.preview});case"set":return n.jsx(my,{members:r.preview});case"zset":return n.jsx(hy,{items:r.preview});default:return n.jsx("pre",{className:"redis-value-pre",children:r.preview.join(` -`)})}}function dy({raw:r}){const i=h.useMemo(()=>vy(r),[r]),[o,c]=h.useState(i?"pretty":"raw"),f=o==="pretty"&&i?i:r;return n.jsxs("div",{className:"redis-value-string",children:[n.jsxs("div",{className:"redis-value-toolbar",children:[n.jsxs("span",{className:"redis-value-meta",children:[r.length.toLocaleString()," char",r.length===1?"":"s"]}),i?n.jsxs("div",{role:"tablist","aria-label":"Value format",className:"redis-segmented",children:[n.jsx("button",{type:"button",role:"tab","aria-selected":o==="pretty",className:o==="pretty"?"active":void 0,onClick:()=>c("pretty"),children:"Pretty"}),n.jsx("button",{type:"button",role:"tab","aria-selected":o==="raw",className:o==="raw"?"active":void 0,onClick:()=>c("raw"),children:"Raw"})]}):null]}),n.jsx("pre",{className:"redis-value-pre",children:f})]})}function fy({items:r}){return n.jsx("ol",{className:"redis-list-view",children:r.map((i,o)=>n.jsxs("li",{children:[n.jsx("span",{className:"redis-list-index",children:o}),n.jsx("code",{className:"redis-list-value",children:i})]},o))})}function py({entries:r}){return n.jsxs("table",{className:"redis-hash-table","aria-label":"Hash fields",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Field"}),n.jsx("th",{scope:"col",children:"Value"})]})}),n.jsx("tbody",{children:r.map((i,o)=>{const[c,f]=Jc(i,": ");return n.jsxs("tr",{children:[n.jsx("th",{scope:"row",children:n.jsx("code",{children:c})}),n.jsx("td",{children:n.jsx("code",{children:f})})]},o)})})]})}function my({members:r}){return n.jsx("ul",{className:"redis-set-view","aria-label":"Set members",children:r.map((i,o)=>n.jsx("li",{children:n.jsx("code",{children:i})},o))})}function hy({items:r}){return n.jsxs("table",{className:"redis-zset-table","aria-label":"Sorted set members",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Member"}),n.jsx("th",{scope:"col",children:"Score"})]})}),n.jsx("tbody",{children:r.map((i,o)=>{const[c,f]=Jc(i,": ");return n.jsxs("tr",{children:[n.jsx("th",{scope:"row",children:n.jsx("code",{children:c})}),n.jsx("td",{className:"redis-zset-score",children:f})]},o)})})]})}function yy({detail:r,onApplyTTL:i,onDeleteKey:o}){const[c,f]=h.useState("60"),p=Number(c),y=Number.isInteger(p)&&p>0;function v(N){N.preventDefault(),y&&i(r.key,p)}function b(){i(r.key,-1)}return n.jsxs("section",{className:"redis-inspector-section",children:[n.jsx("header",{className:"redis-section-head",children:n.jsx("span",{className:"redis-inspector-eyebrow",children:"Actions"})}),n.jsxs("form",{className:"redis-ttl-form",onSubmit:v,children:[n.jsxs("label",{children:[n.jsx("span",{children:"TTL seconds"}),n.jsx("input",{"aria-label":"TTL seconds",min:1,onChange:N=>f(N.target.value),type:"number",value:c})]}),n.jsx(ue,{disabled:!y,type:"submit",children:"Set TTL"}),n.jsx(ue,{className:"ghost",onClick:b,type:"button",children:"Persist (no TTL)"})]}),n.jsx("div",{className:"redis-danger-row",children:n.jsx(ue,{className:"danger",onClick:()=>o(r.key),type:"button",children:"Delete key"})})]})}function Kc({type:r}){const i=(r||"unknown").toLowerCase();return n.jsx("span",{className:`redis-badge redis-type-${i}`,children:i})}function Hc({ttlSeconds:r,compact:i}){return r===-2?n.jsx("span",{className:"redis-badge redis-ttl-missing",children:i?"✕":"missing"}):r===-1?n.jsx("span",{className:"redis-badge redis-ttl-persistent",children:i?"∞":"persistent"}):n.jsx("span",{className:"redis-badge redis-ttl-active",title:`${r}s`,children:i?`${Dc(r)}`:`TTL ${Dc(r)}`})}function gy({detail:r}){if(!r.preview||r.preview.length===0)return null;const i=r.preview.length;let o;switch(r.type){case"string":o=`${(r.preview[0]??"").length} char${(r.preview[0]??"").length===1?"":"s"}`;break;case"list":o=`${i} item${i===1?"":"s"}`;break;case"hash":o=`${i} field${i===1?"":"s"}`;break;case"set":o=`${i} member${i===1?"":"s"}`;break;case"zset":o=`${i} entr${i===1?"y":"ies"}`;break;default:o=`${i}`}return n.jsx("span",{className:"redis-badge redis-size",children:o})}function xy(){const[r,i]=h.useState("GET your-key"),[o,c]=h.useState([]),f=h.useRef(0),p=h.useMemo(()=>Rc(r),[r]);function y(w){f.current+=1;const L=f.current;c(E=>[{id:L,...w},...E].slice(0,ty))}function v(w,L){if(!w.command){y({input:L,outcome:"error",detail:"No command supplied"});return}Yh(w).then(E=>{y({input:L,outcome:"success",detail:`${E.command} (${E.class})`,rows:E.rows??[]})}).catch(E=>{y({input:L,outcome:"error",detail:E.message})})}function b(w){w.preventDefault(),v(p,r)}function N(w){(w.metaKey||w.ctrlKey)&&w.key==="Enter"&&(w.preventDefault(),v(p,r))}function C(w){i(w),v(Rc(w),w)}return n.jsxs("div",{className:"redis-runner",children:[n.jsxs("form",{className:"redis-runner-form",onSubmit:b,children:[n.jsxs("label",{className:"redis-runner-label",children:[n.jsx("span",{children:"Command"}),n.jsx("textarea",{"aria-label":"Redis command",onChange:w=>i(w.target.value),onKeyDown:N,rows:3,spellCheck:!1,value:r})]}),n.jsxs("div",{className:"redis-runner-toolbar",children:[n.jsxs("span",{className:"redis-runner-hint",children:["Allowlisted commands only · ",n.jsx("kbd",{children:"⌘"}),"/",n.jsx("kbd",{children:"Ctrl"}),"+",n.jsx("kbd",{children:"Enter"})," to run"]}),n.jsx(ue,{type:"submit",children:"Run"})]})]}),o.length===0?n.jsx(Q,{title:"No commands yet",description:"Try GET, HGETALL, LRANGE, SCAN 0 MATCH * COUNT 50, or TYPE."}):null,o.length>0?n.jsx("ol",{className:"redis-runner-history","aria-label":"Command history",children:o.map(w=>n.jsxs("li",{className:`redis-runner-entry redis-runner-${w.outcome}`,children:[n.jsxs("header",{className:"redis-runner-entry-head",children:[n.jsx("code",{className:"redis-runner-input",children:w.input}),n.jsx("button",{className:"redis-runner-rerun",onClick:()=>C(w.input),title:"Run again",type:"button",children:"rerun"})]}),n.jsxs("p",{className:"redis-runner-detail",children:[n.jsx("span",{className:"redis-runner-tag",children:w.outcome==="success"?"OK":"ERR"}),n.jsx("span",{children:w.detail})]}),w.rows&&w.rows.length>0?n.jsx("pre",{className:"redis-runner-result",children:w.rows.join(` -`)}):null]},w.id))}):null]})}function jy(r){var i;return{service:"redis",status:"disabled",running:!1,mode:"managed",address:((i=r==null?void 0:r.endpoint)==null?void 0:i.replace(/^redis:\/\//,""))??"127.0.0.1:6379",serverVersion:"",connectedClients:0,usedMemoryHuman:"",db0Keys:0,storagePath:(r==null?void 0:r.storagePath)??".devcloud/data/redis"}}function Rc(r){const i=r.trim().split(/\s+/).filter(f=>f.length>0),[o="",...c]=i;return{command:o,args:c}}function vy(r){const i=r.trim();if(!(i===""||i[0]!=="{"&&i[0]!=="["&&i[0]!=='"'))try{return JSON.stringify(JSON.parse(i),null,2)}catch{return}}function Jc(r,i){const o=r.indexOf(i);return o===-1?[r,""]:[r.slice(0,o),r.slice(o+i.length)]}function Dc(r){return r<60?`${r}s`:r<3600?`${Math.floor(r/60)}m`:r<86400?`${Math.floor(r/3600)}h`:`${Math.floor(r/86400)}d`}async function by(){return W("/api/sqs/status")}async function Sy(){return W("/api/sqs/queues")}async function wy(r){return W("/api/sqs/queues",{method:"POST",body:{input:r}})}async function Ny(r){return W(`/api/sqs/queues/${encodeURIComponent(r)}/messages`)}async function ky(r,i){return W(`/api/sqs/queues/${encodeURIComponent(r)}/messages`,{method:"POST",body:{input:i}})}async function Cy(r,i){return W(`/api/sqs/queues/${encodeURIComponent(r)}/receive`,{method:"POST",body:{input:i}})}async function Ey(r,i){await W(`/api/sqs/queues/${encodeURIComponent(r)}/delete`,{method:"POST",body:{input:i}})}async function Iy(r,i){await W(`/api/sqs/queues/${encodeURIComponent(r)}/visibility`,{method:"POST",body:{input:i}})}async function Ry(r){return W(`/api/sqs/queues/${encodeURIComponent(r)}/leases`)}async function Dy(r){return W(`/api/sqs/queues/${encodeURIComponent(r)}/dlq`)}async function Ty(r){const i=await fetch(`/api/sqs/queues/${encodeURIComponent(r)}/purge`,{method:"POST"});if(!i.ok){const o=await i.text();throw new Error(o||`Request failed with ${i.status}`)}}function Ly({busyAction:r,newQueueName:i,newQueueKind:o,newQueueVisibility:c,newQueueDelay:f,onSubmit:p,setNewQueueName:y,setNewQueueKind:v,setNewQueueVisibility:b,setNewQueueDelay:N}){return n.jsxs("form",{className:"pubsub-action-form stacked",onSubmit:p,children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Queue name"}),n.jsx("input",{"aria-label":"New SQS queue name",onChange:C=>y(C.target.value),placeholder:o==="fifo"?"jobs.fifo":"jobs",value:i})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Type"}),n.jsxs("select",{"aria-label":"New SQS queue type",onChange:C=>v(C.target.value==="fifo"?"fifo":"standard"),value:o,children:[n.jsx("option",{value:"standard",children:"Standard"}),n.jsx("option",{value:"fifo",children:"FIFO"})]})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Visibility"}),n.jsx("input",{"aria-label":"New SQS queue visibility timeout seconds",inputMode:"numeric",onChange:C=>b(C.target.value),value:c})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Delay"}),n.jsx("input",{"aria-label":"New SQS queue delay seconds",inputMode:"numeric",onChange:C=>N(C.target.value),value:f})]}),n.jsx(ue,{disabled:r==="create-queue",type:"submit",children:"Create"})]})}function $y(r){return{service:"sqs",status:"disabled",running:!1,endpoint:(r==null?void 0:r.endpoint)??"http://127.0.0.1:9324",region:"us-east-1",authMode:"relaxed",storagePath:(r==null?void 0:r.storagePath)??".devcloud/data/sqs",queueCount:0}}function Tc(r){const i=Number.parseInt(r,10);if(!(!Number.isFinite(i)||i<0))return String(i)}function Lc(r){const i=Number.parseInt(r,10);if(!(!Number.isFinite(i)||i<=0))return i}function Ia(r){const i=Number.parseInt(r,10);if(!(!Number.isFinite(i)||i<0))return i}function Py(r){return Object.fromEntries(Object.entries(r).filter(i=>typeof i[1]=="string"))}function My(r){const i=r.trim();if(i==="")return;let o;try{o=JSON.parse(i)}catch{return new Error("Message attributes JSON is invalid")}if(!zl(o))return new Error("Message attributes must be a JSON object");for(const[c,f]of Object.entries(o))if(!zl(f)||typeof f.DataType!="string"||f.DataType.trim()==="")return new Error(`Message attribute ${c} must include DataType`);return o}function $c(r){const i=r.split(",").map(o=>o.trim()).filter(Boolean);return i.length>0?i:void 0}function Oy(r){if(r)try{const i=JSON.parse(r);if(!zl(i))return;const o=i.deadLetterTargetArn,c=i.maxReceiveCount;return typeof o!="string"?void 0:{deadLetterTargetArn:o,maxReceiveCount:typeof c=="string"?c:String(c??"")}}catch{return}}function _y(r){if(r)try{const i=JSON.parse(r);return!zl(i)||typeof i.redrivePermission!="string"?void 0:{redrivePermission:i.redrivePermission}}catch{return}}function Wc(r){return r.length<=12?r===""?"":"...":`${r.slice(0,6)}...${r.slice(-6)}`}function zl(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function By({activeQueue:r,busyAction:i,purgeConfirmation:o,onSubmit:c,setPurgeConfirmation:f}){return n.jsxs("form",{className:"pubsub-action-form stacked",onSubmit:c,children:[n.jsx("span",{className:"toolbar-count",children:r?r.name:"No queue selected"}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Purge confirmation"}),n.jsx("input",{"aria-label":"Confirm SQS purge queue",disabled:!r,onChange:p=>f(p.target.value),placeholder:(r==null?void 0:r.name)??"queue name",value:o})]}),n.jsx(ue,{className:"danger",disabled:!r||o!==r.name||i==="purge-queue",type:"submit",children:"Purge"})]})}function Ay({activeQueue:r,busyAction:i,selectedReceiptHandle:o,visibilityTimeout:c,visibilityConfirmation:f,onSubmit:p,setVisibilityTimeout:y,setVisibilityConfirmation:v}){const b=!r||o==="";return n.jsxs("form",{className:"pubsub-action-form stacked",onSubmit:p,children:[n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Visibility timeout"}),n.jsx("input",{"aria-label":"SQS change visibility timeout seconds",disabled:b,inputMode:"numeric",onChange:N=>y(N.target.value),value:c})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Confirm"}),n.jsx("input",{"aria-label":"Confirm SQS change message visibility",disabled:b,onChange:N=>v(N.target.value),placeholder:"visibility",value:f})]}),n.jsx(ue,{disabled:b||f!=="visibility"||i==="change-visibility",type:"submit",children:"Change visibility"})]})}function zy({activeQueue:r,busyAction:i,selectedReceivedMessage:o,selectedReceiptHandle:c,pastedReceiptHandle:f,deleteConfirmation:p,onSubmit:y,setPastedReceiptHandle:v,setDeleteConfirmation:b}){return n.jsxs("form",{className:"pubsub-action-form stacked",onSubmit:y,children:[n.jsxs("label",{className:"compact-filter wide",children:[n.jsx("span",{children:"Receipt handle"}),n.jsx("input",{"aria-label":"SQS delete receipt handle",disabled:!r,onChange:N=>v(N.target.value),placeholder:o?Wc(o.ReceiptHandle):"paste receipt handle or select received message",value:f})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Confirm"}),n.jsx("input",{"aria-label":"Confirm SQS delete message",disabled:!r||c==="",onChange:N=>b(N.target.value),placeholder:"delete",value:p})]}),n.jsx(ue,{className:"danger",disabled:!r||c===""||p!=="delete"||i==="delete-message",type:"submit",children:"Delete"})]})}function Fy({activeIndex:r,detailState:i,messages:o,onSelectIndex:c,queueName:f}){return f?i.status==="loading"?n.jsx(Q,{title:"Loading messages",description:`Reading messages from ${f}.`}):i.status==="error"?n.jsx(Q,{title:"SQS messages unavailable",description:i.message}):o.length===0?n.jsx(Q,{title:"No messages",description:`No retained messages in ${f} match the current filter.`}):n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"State"}),n.jsx("th",{scope:"col",children:"Body"}),n.jsx("th",{scope:"col",children:"Receive"})]})}),n.jsx("tbody",{children:o.map((p,y)=>n.jsxs("tr",{className:y===r?"item-row active":"item-row",onClick:()=>c(y),children:[n.jsx("td",{children:p.state}),n.jsx("td",{children:n.jsx(Qy,{message:p})}),n.jsx("td",{children:p.receiveCount})]},`${p.messageId}-${y}`))})]})}):n.jsx(Q,{title:"No queue selected",description:"Choose a queue to inspect retained messages."})}function Qy({message:r}){return n.jsxs("span",{className:"attribute-preview",children:[n.jsx("span",{className:"attribute-chip",children:r.body||"(empty body)"}),r.messageGroupId?n.jsxs("span",{className:"attribute-chip",children:["group: ",r.messageGroupId]}):null,r.sequenceNumber?n.jsxs("span",{className:"attribute-chip",children:["seq: ",r.sequenceNumber]}):null]})}function Uy({activeQueue:r,busyAction:i,sendBody:o,sendDelay:c,sendAttributesJSON:f,sendGroupId:p,sendDeduplicationId:y,onSubmit:v,setSendBody:b,setSendDelay:N,setSendAttributesJSON:C,setSendGroupId:w,setSendDeduplicationId:L}){return n.jsxs("form",{className:"pubsub-action-form stacked",onSubmit:v,children:[n.jsxs("label",{className:"compact-filter wide",children:[n.jsx("span",{children:"Message body"}),n.jsx("textarea",{"aria-label":"SQS message body",disabled:!r,onChange:E=>b(E.target.value),placeholder:"message body",rows:3,value:o})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Delay"}),n.jsx("input",{"aria-label":"SQS message delay seconds",disabled:!r,inputMode:"numeric",onChange:E=>N(E.target.value),value:c})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Attributes JSON"}),n.jsx("input",{"aria-label":"SQS message attributes JSON",disabled:!r,onChange:E=>C(E.target.value),placeholder:'{"kind":{"DataType":"String","StringValue":"test"}}',value:f})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Group"}),n.jsx("input",{"aria-label":"SQS FIFO message group ID",disabled:!r,onChange:E=>w(E.target.value),placeholder:"FIFO only",value:p})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Dedup"}),n.jsx("input",{"aria-label":"SQS FIFO message deduplication ID",disabled:!r,onChange:E=>L(E.target.value),placeholder:"optional",value:y})]}),n.jsx(ue,{disabled:!r||i==="send-message",type:"submit",children:"Send"})]})}function qy({activeQueue:r,busyAction:i,receiveMaxMessages:o,receiveVisibilityTimeout:c,receiveWaitTime:f,receiveAttributeNames:p,receiveMessageAttributeNames:y,onSubmit:v,setReceiveMaxMessages:b,setReceiveVisibilityTimeout:N,setReceiveWaitTime:C,setReceiveAttributeNames:w,setReceiveMessageAttributeNames:L}){return n.jsxs("form",{className:"pubsub-action-form stacked",onSubmit:v,children:[n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Max"}),n.jsx("input",{"aria-label":"SQS receive max messages",disabled:!r,inputMode:"numeric",onChange:E=>b(E.target.value),value:o})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Visibility"}),n.jsx("input",{"aria-label":"SQS receive visibility timeout seconds",disabled:!r,inputMode:"numeric",onChange:E=>N(E.target.value),value:c})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Wait"}),n.jsx("input",{"aria-label":"SQS receive wait time seconds",disabled:!r,inputMode:"numeric",onChange:E=>C(E.target.value),value:f})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Attrs"}),n.jsx("input",{"aria-label":"SQS receive attribute names",disabled:!r,onChange:E=>w(E.target.value),placeholder:"All or comma-separated names",value:p})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Msg attrs"}),n.jsx("input",{"aria-label":"SQS receive message attribute names",disabled:!r,onChange:E=>L(E.target.value),placeholder:"All or comma-separated names",value:y})]}),n.jsx(ue,{disabled:!r||i==="receive-message",type:"submit",children:"Receive"})]})}function Vy({activeQueueName:r,onSelectQueue:i,queues:o}){return o.length===0?n.jsx(Q,{title:"No queues",description:"Queues created through the SQS API will appear here."}):n.jsx("div",{className:"dynamodb-table-list","aria-label":"SQS queues",children:o.map(c=>n.jsxs("button",{className:c.name===r?"dynamodb-table-row active":"dynamodb-table-row",onClick:()=>i(c.name),children:[n.jsxs("span",{className:"table-row-top",children:[n.jsx("span",{className:"table-row-name",children:c.name}),n.jsx("span",{className:"count-pill",children:c.totalRetainedMessages})]}),n.jsx("span",{className:"table-row-meta",children:c.url}),n.jsxs("span",{className:"table-row-tags",children:[n.jsxs("span",{children:[c.visibleMessages," visible"]}),n.jsxs("span",{children:[c.notVisibleMessages," in flight"]}),n.jsxs("span",{children:[c.delayedMessages," delayed"]})]})]},c.name))})}function Ky({messages:r,onSelectIndex:i,selectedIndex:o}){return r.length===0?null:n.jsx("div",{className:"dynamodb-item-table-wrap","aria-label":"Received SQS messages",children:n.jsxs("table",{className:"dynamodb-item-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Use"}),n.jsx("th",{scope:"col",children:"Message"}),n.jsx("th",{scope:"col",children:"Receipt handle"})]})}),n.jsx("tbody",{children:r.map((c,f)=>n.jsxs("tr",{className:f===o?"item-row active":"item-row",onClick:()=>i(f),children:[n.jsx("td",{children:f===o?"selected":"select"}),n.jsx("td",{children:n.jsxs("span",{className:"attribute-preview",children:[n.jsx("span",{className:"attribute-chip",children:c.Body||"(empty body)"}),n.jsx("span",{className:"attribute-chip",children:c.MessageId})]})}),n.jsx("td",{children:n.jsx("code",{children:Wc(c.ReceiptHandle)})})]},`${c.MessageId}-${f}`))})]})})}function Hy({detailState:r,message:i,queue:o,status:c}){var b;if(!o)return n.jsx(Q,{title:"Inspector",description:"Queue attributes and selected message JSON will appear here."});const f=r.status==="success"?r.leases:[],p=r.status==="success"?r.dlq:void 0,y=Oy(o.attributes.RedrivePolicy),v=_y(o.attributes.RedriveAllowPolicy);return n.jsxs("div",{className:"dynamodb-inspector",children:[n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Queue"}),n.jsx("h3",{children:o.name}),n.jsxs("dl",{className:"inspector-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"Endpoint"}),n.jsx("dd",{children:n.jsx("code",{children:(c==null?void 0:c.endpoint)??"unknown"})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Region"}),n.jsx("dd",{children:(c==null?void 0:c.region)??"unknown"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"ARN"}),n.jsx("dd",{children:n.jsx("code",{children:o.arn})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Visibility"}),n.jsxs("dd",{children:[o.attributes.VisibilityTimeout??"unknown","s"]})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Leases"}),n.jsx("dd",{children:f.length})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"DLQ sources"}),n.jsx("dd",{children:(p==null?void 0:p.deadLetterSourceQueues.map(N=>N.name).join(", "))||"none"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"DLQ target"}),n.jsx("dd",{children:((b=p==null?void 0:p.deadLetterQueue)==null?void 0:b.name)??(y==null?void 0:y.deadLetterTargetArn)??"none"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Redrive"}),n.jsxs("dd",{children:[y?`maxReceiveCount ${y.maxReceiveCount}`:"none",v?`, allow ${v.redrivePermission}`:""]})]})]})]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Selected message"}),i?n.jsx("pre",{className:"mail-preview",children:JSON.stringify(i,null,2)}):n.jsx("p",{className:"inspector-muted",children:"Select a message row to inspect JSON."})]})]})}function Jy({service:r}){const[i,o]=h.useState({status:"loading"}),[c,f]=h.useState({status:"idle"}),[p,y]=h.useState(),[v,b]=h.useState(0),[N,C]=h.useState(""),[w,L]=h.useState(""),[E,D]=h.useState(""),[T,U]=h.useState("standard"),[V,se]=h.useState("30"),[q,me]=h.useState("0"),[Se,Ce]=h.useState(""),[J,oe]=h.useState("0"),[be,De]=h.useState(""),[ie,z]=h.useState(""),[X,K]=h.useState(""),[ye,we]=h.useState("1"),[he,O]=h.useState("30"),[F,M]=h.useState("0"),[x,R]=h.useState("All"),[ae,ce]=h.useState("All"),[ve,A]=h.useState([]),[pe,ee]=h.useState(0),[ge,Pe]=h.useState(""),[_e,vt]=h.useState(""),[te,Ie]=h.useState("0"),[Ee,Be]=h.useState(""),[st,Lt]=h.useState(""),[dn,Xt]=h.useState(""),[$t,Ze]=h.useState(""),[Ft,wn]=h.useState(),[Vn,Pt]=h.useState(),at=(r==null?void 0:r.status)==="disabled",yt=h.useCallback(()=>{if(at){o({status:"success",statusPayload:$y(r),queues:[]}),f({status:"idle"}),y(void 0);return}o({status:"loading"}),Promise.all([by(),Sy()]).then(([je,{queues:Re}])=>{o({status:"success",statusPayload:je,queues:Re}),y(Me=>{var Nn;return Me&&Re.some(ms=>ms.name===Me)?Me:(Nn=Re[0])==null?void 0:Nn.name})}).catch(je=>{o({status:"error",message:je.message})})},[at,r]);h.useEffect(()=>{yt()},[yt]),cn({topics:["sqs"],onEvent:yt,enabled:!at});const ct=i.status==="success"?i.queues:[],Ae=ct.find(je=>je.name===p),gt=h.useCallback(()=>{if(!p||at){f({status:"idle"});return}f({status:"loading"}),Promise.all([Ny(p),Ry(p),Dy(p)]).then(([je,Re,Me])=>{b(0),f({status:"success",messages:je.messages,leases:Re.leases,dlq:Me})}).catch(je=>{f({status:"error",message:je.message})})},[p,at]);h.useEffect(()=>{gt()},[gt]);const ds=h.useMemo(()=>{const je=N.trim().toLowerCase();return je===""?ct:ct.filter(Re=>Re.name.toLowerCase().includes(je))},[ct,N]),dt=h.useMemo(()=>{const je=c.status==="success"?c.messages:[],Re=w.trim().toLowerCase();return Re===""?je:je.filter(Me=>JSON.stringify(Me).toLowerCase().includes(Re))},[c,w]),Qt=dt[Math.min(v,Math.max(dt.length-1,0))],Ut=ve[Math.min(pe,Math.max(ve.length-1,0))],Ge=ge.trim()||(Ut==null?void 0:Ut.ReceiptHandle)||"";if(at)return n.jsx(Ne,{title:"SQS",children:n.jsx(Q,{title:"SQS is disabled",description:"Enable the SQS service in devcloud config to inspect queues and messages."})});function Zt(je){y(je),b(0),A([]),ee(0),Pe(""),vt(""),Be(""),Lt(""),L(""),Pt(void 0)}function en(je){if(je.preventDefault(),!!p){if(st!==p){Pt("Type the queue name to confirm purge confirmation");return}Pt(void 0),Ty(p).then(()=>{Lt(""),yt(),gt()}).catch(Re=>{Pt(Re.message)})}}async function qt(je,Re){wn(je),Ze(""),Xt("");try{const Me=await Re();Xt(Me),yt(),gt()}catch(Me){Ze(Me instanceof Error?Me.message:"SQS operation failed")}finally{wn(void 0)}}function tn(je){je.preventDefault();const Re=E.trim();if(Re===""){Ze("Queue name is required");return}const Me=T==="fifo"&&!Re.endsWith(".fifo")?`${Re}.fifo`:Re;qt("create-queue",async()=>(await wy({QueueName:Me,Attributes:Py({VisibilityTimeout:Tc(V),DelaySeconds:Tc(q),FifoQueue:T==="fifo"?"true":void 0,ContentBasedDeduplication:T==="fifo"?"true":void 0}),Tags:{source:"dashboard"}}),D(""),y(Me),`Created queue ${Me}`))}function nn(je){if(je.preventDefault(),!Ae){Ze("Queue is required");return}if(Se===""){Ze("Message body is required");return}const Re=My(be);if(Re instanceof Error){Ze(Re.message);return}qt("send-message",async()=>{const Me=await ky(Ae.name,{MessageBody:Se,DelaySeconds:Lc(J),MessageAttributes:Re,MessageGroupId:ie.trim()||void 0,MessageDeduplicationId:X.trim()||void 0});return Ce(""),De(""),`Sent message ${Me.MessageId}`})}function sn(je){if(je.preventDefault(),!Ae){Ze("Queue is required");return}qt("receive-message",async()=>{const Me=(await Cy(Ae.name,{MaxNumberOfMessages:Lc(ye),VisibilityTimeout:Ia(he),WaitTimeSeconds:Ia(F),AttributeNames:$c(x),MessageAttributeNames:$c(ae)})).Messages??[];return A(Me),ee(0),Pe(""),vt(""),Me.length===1?"Received 1 message":`Received ${Me.length} messages`})}function fs(je){if(je.preventDefault(),!Ae){Ze("Queue is required");return}if(Ge===""){Ze("Receipt handle is required");return}if(_e!=="delete"){Ze("Type delete to confirm DeleteMessage");return}qt("delete-message",async()=>(await Ey(Ae.name,{ReceiptHandle:Ge}),A(Re=>Re.filter(Me=>Me.ReceiptHandle!==Ge)),ee(0),Pe(""),vt(""),Be(""),"Deleted message for the selected receipt handle"))}function ps(je){if(je.preventDefault(),!Ae){Ze("Queue is required");return}if(Ge===""){Ze("Receipt handle is required");return}if(Ee!=="visibility"){Ze("Type visibility to confirm ChangeMessageVisibility");return}const Re=Ia(te);if(typeof Re!="number"){Ze("Visibility timeout must be a non-negative number");return}qt("change-visibility",async()=>(await Iy(Ae.name,{ReceiptHandle:Ge,VisibilityTimeout:Re}),Be(""),`Changed visibility timeout to ${Re}s`))}return n.jsxs("div",{className:"dynamodb-workspace",children:[n.jsxs(Ne,{title:"Queues",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter SQS queues",onChange:je=>C(je.target.value),placeholder:"queue name",type:"search",value:N})]}),n.jsx(ue,{onClick:yt,children:"Refresh"})]}),n.jsx(Ly,{busyAction:Ft,newQueueDelay:q,newQueueKind:T,newQueueName:E,newQueueVisibility:V,onSubmit:tn,setNewQueueDelay:me,setNewQueueKind:U,setNewQueueName:D,setNewQueueVisibility:se}),i.status==="loading"?n.jsx(Q,{title:"Loading queues",description:"Reading local SQS queue metadata."}):null,i.status==="error"?n.jsx(Q,{title:"SQS queues unavailable",description:i.message,actionLabel:"Retry",onAction:yt}):null,i.status==="success"?n.jsx(Vy,{activeQueueName:p,onSelectQueue:Zt,queues:ds}):null]}),n.jsxs(Ne,{title:"Messages",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"toolbar-count",children:Ae?`${dt.length} shown / ${Ae.totalRetainedMessages} retained`:"Select a queue"}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter SQS messages",disabled:!Ae,onChange:je=>{b(0),L(je.target.value)},placeholder:"body or attribute",type:"search",value:w})]}),n.jsx(ue,{disabled:!Ae,onClick:gt,children:"Refresh"})]}),n.jsx(Uy,{activeQueue:!!Ae,busyAction:Ft,onSubmit:nn,sendAttributesJSON:be,sendBody:Se,sendDeduplicationId:X,sendDelay:J,sendGroupId:ie,setSendAttributesJSON:De,setSendBody:Ce,setSendDeduplicationId:K,setSendDelay:oe,setSendGroupId:z}),n.jsx(Fy,{activeIndex:v,detailState:c,messages:dt,onSelectIndex:b,queueName:p}),n.jsx(qy,{activeQueue:!!Ae,busyAction:Ft,onSubmit:sn,receiveAttributeNames:x,receiveMaxMessages:ye,receiveMessageAttributeNames:ae,receiveVisibilityTimeout:he,receiveWaitTime:F,setReceiveAttributeNames:R,setReceiveMaxMessages:we,setReceiveMessageAttributeNames:ce,setReceiveVisibilityTimeout:O,setReceiveWaitTime:M}),n.jsx(Ky,{messages:ve,onSelectIndex:ee,selectedIndex:pe})]}),n.jsxs(Ne,{title:"Inspector",children:[$t?n.jsx("p",{className:"operation-message error",children:$t}):null,dn?n.jsx("p",{className:"operation-message success",children:dn}):null,n.jsx(By,{activeQueue:Ae,busyAction:Ft,onSubmit:en,purgeConfirmation:st,setPurgeConfirmation:Lt}),Vn?n.jsx("p",{className:"inspector-muted",children:Vn}):null,n.jsx(Ay,{activeQueue:!!Ae,busyAction:Ft,onSubmit:ps,selectedReceiptHandle:Ge,setVisibilityConfirmation:Be,setVisibilityTimeout:Ie,visibilityConfirmation:Ee,visibilityTimeout:te}),n.jsx(zy,{activeQueue:!!Ae,busyAction:Ft,deleteConfirmation:_e,onSubmit:fs,pastedReceiptHandle:ge,selectedReceiptHandle:Ge,selectedReceivedMessage:Ut,setDeleteConfirmation:vt,setPastedReceiptHandle:Pe}),n.jsx(Hy,{detailState:c,message:Qt,queue:Ae,status:i.status==="success"?i.statusPayload:void 0})]})]})}async function Wy(){return W("/api/pubsub/status")}async function Gy(){return W("/api/pubsub/topics")}async function Yy(r){return W("/api/pubsub/topics",{method:"POST",body:{topicId:r}})}async function Xy(){return W("/api/pubsub/subscriptions")}async function Zy(r){return W("/api/pubsub/subscriptions",{method:"POST",body:r})}async function eg(r){return W(`/api/pubsub/topics/${encodeURIComponent(r.topicId)}/publish`,{method:"POST",body:{messages:[{data:r.data,attributes:r.attributes,orderingKey:r.orderingKey}]}})}async function tg(r,i){return W(`/api/pubsub/subscriptions/${encodeURIComponent(r)}/pull`,{method:"POST",body:{maxMessages:i}})}async function ng(r,i){await W(`/api/pubsub/subscriptions/${encodeURIComponent(r)}/ack`,{method:"POST",body:{ackIds:i}})}function sg({service:r}){const[i,o]=h.useState({status:"loading"}),[c,f]=h.useState(),[p,y]=h.useState(),[v,b]=h.useState(""),[N,C]=h.useState(""),[w,L]=h.useState(""),[E,D]=h.useState(""),[T,U]=h.useState(""),[V,se]=h.useState("10"),[q,me]=h.useState(""),[Se,Ce]=h.useState(""),[J,oe]=h.useState("1"),[be,De]=h.useState([]),[ie,z]=h.useState(""),[X,K]=h.useState(""),[ye,we]=h.useState(""),[he,O]=h.useState(),F=(r==null?void 0:r.status)==="disabled",M=h.useCallback(()=>{if(F){o({status:"success",statusPayload:dg(r),topics:[],subscriptions:[]}),y(void 0);return}o({status:"loading"}),Promise.all([Wy(),Gy(),Xy()]).then(([te,Ie,Ee])=>{o({status:"success",statusPayload:te,topics:Ie.topics,subscriptions:Ee.subscriptions}),f(Be=>{var st;return Be&&Ie.topics.some(Lt=>Lt.name===Be)?Be:(st=Ie.topics[0])==null?void 0:st.name}),U(Be=>{var st;return Be||Et(((st=Ie.topics[0])==null?void 0:st.name)??"")}),y(Be=>{var st;return Be&&Ee.subscriptions.some(Lt=>Lt.name===Be)?Be:(st=Ee.subscriptions[0])==null?void 0:st.name})}).catch(te=>{o({status:"error",message:te.message})})},[F,r]);h.useEffect(()=>{M()},[M]),cn({topics:["pubsub"],onEvent:M,enabled:!F});const x=i.status==="success"?i.topics:[],R=i.status==="success"?i.subscriptions:[],ae=x.find(te=>te.name===c),ce=R.find(te=>te.name===p),ve=h.useMemo(()=>{const te=v.trim().toLowerCase();return te===""?x:x.filter(Ie=>Ie.name.toLowerCase().includes(te))},[x,v]),A=h.useMemo(()=>{const te=N.trim().toLowerCase();return te===""?R:R.filter(Ie=>JSON.stringify(Ie).toLowerCase().includes(te))},[R,N]);async function pe(te,Ie){O(te),we(""),K("");try{const Ee=await Ie();K(Ee),M()}catch(Ee){we(Ee instanceof Error?Ee.message:"Pub/Sub operation failed")}finally{O(void 0)}}function ee(te){te.preventDefault();const Ie=w.trim();if(Ie===""){we("Topic ID is required");return}pe("create-topic",async()=>{const Ee=await Yy(Ie);return L(""),f(Ee.name),U(Et(Ee.name)),`Created topic ${Et(Ee.name)}`})}function ge(te){te.preventDefault();const Ie=E.trim(),Ee=T.trim()||Et((ae==null?void 0:ae.name)??"");if(Ie===""||Ee===""){we("Subscription ID and topic are required");return}pe("create-subscription",async()=>{const Be=await Zy({subscriptionId:Ie,topicId:Ee,ackDeadlineSeconds:Number.parseInt(V,10)||void 0});return D(""),y(Be.name),`Created subscription ${Et(Be.name)}`})}function Pe(te){te.preventDefault();const Ie=Et((ae==null?void 0:ae.name)??"");if(Ie===""||q===""){we("Topic and message are required");return}pe("publish",async()=>{const Ee=await eg({topicId:Ie,data:ag(q),attributes:{source:"dashboard"},orderingKey:Se.trim()||void 0});return me(""),Ce(""),`Published ${Ee.messageIds.length} message`})}function _e(){const te=Et((ce==null?void 0:ce.name)??"");if(te===""){we("Subscription is required");return}pe("pull",async()=>{var Be;const Ee=(await tg(te,Number.parseInt(J,10)||1)).receivedMessages??[];return De(Ee),z(((Be=Ee[0])==null?void 0:Be.ackId)??""),`Pulled ${Ee.length} message`})}function vt(){const te=Et((ce==null?void 0:ce.name)??""),Ie=ie?[ie]:be.map(Ee=>Ee.ackId).filter(Boolean);if(te===""||Ie.length===0){we("Ack ID is required");return}pe("ack",async()=>(await ng(te,Ie),De(Ee=>Ee.filter(Be=>!Ie.includes(Be.ackId))),z(""),`Acknowledged ${Ie.length} message`))}return F?n.jsx(Ne,{title:"Pub/Sub",children:n.jsx(Q,{title:"Pub/Sub is disabled",description:"Enable the Pub/Sub service in devcloud config to inspect topics and subscriptions."})}):n.jsxs("div",{className:"dynamodb-workspace",children:[n.jsxs(Ne,{title:"Topics",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter Pub/Sub topics",onChange:te=>b(te.target.value),placeholder:"topic name",type:"search",value:v})]}),n.jsx(ue,{onClick:M,children:"Refresh"})]}),n.jsxs("form",{className:"pubsub-action-form",onSubmit:ee,children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Topic ID"}),n.jsx("input",{"aria-label":"New Pub/Sub topic ID",onChange:te=>L(te.target.value),placeholder:"orders",value:w})]}),n.jsx(ue,{disabled:he==="create-topic",type:"submit",children:"Create"})]}),i.status==="loading"?n.jsx(Q,{title:"Loading topics",description:"Reading local Pub/Sub resource metadata."}):null,i.status==="error"?n.jsx(Q,{title:"Pub/Sub unavailable",description:i.message,actionLabel:"Retry",onAction:M}):null,i.status==="success"?n.jsx(rg,{activeTopicName:c,onSelectTopic:f,topics:ve}):null,n.jsxs("form",{className:"pubsub-action-form stacked",onSubmit:Pe,children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Message"}),n.jsx("input",{"aria-label":"Pub/Sub publish message",disabled:!ae,onChange:te=>me(te.target.value),placeholder:"message body",value:q})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Ordering key"}),n.jsx("input",{"aria-label":"Pub/Sub publish ordering key",disabled:!ae,onChange:te=>Ce(te.target.value),placeholder:"optional",value:Se})]}),n.jsx(ue,{disabled:!ae||he==="publish",type:"submit",children:"Publish"})]})]}),n.jsxs(Ne,{title:"Subscriptions",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"toolbar-count",children:i.status==="success"?`${A.length} shown / ${R.length} subscriptions`:"Loading"}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter Pub/Sub subscriptions",onChange:te=>C(te.target.value),placeholder:"subscription or topic",type:"search",value:N})]})]}),n.jsxs("form",{className:"pubsub-action-form",onSubmit:ge,children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Subscription ID"}),n.jsx("input",{"aria-label":"New Pub/Sub subscription ID",onChange:te=>D(te.target.value),placeholder:"orders-sub",value:E})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Topic"}),n.jsxs("select",{"aria-label":"Topic for new Pub/Sub subscription",onChange:te=>U(te.target.value),value:T,children:[n.jsx("option",{value:"",children:"Select topic"}),x.map(te=>n.jsx("option",{value:Et(te.name),children:Et(te.name)},te.name))]})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Ack deadline"}),n.jsx("input",{"aria-label":"New Pub/Sub subscription ack deadline seconds",inputMode:"numeric",onChange:te=>se(te.target.value),value:V})]}),n.jsx(ue,{disabled:he==="create-subscription",type:"submit",children:"Create"})]}),i.status==="success"?n.jsx(lg,{activeSubscriptionName:p,onSelectSubscription:y,subscriptions:A}):null]}),n.jsxs(Ne,{title:"Inspector",children:[ye?n.jsx("p",{className:"operation-message error",children:ye}):null,X?n.jsx("p",{className:"operation-message success",children:X}):null,n.jsx(ig,{busyAction:he,onAck:vt,onPull:_e,pulledMessages:be,pullMaxMessages:J,selectedAckId:ie,setPullMaxMessages:oe,setSelectedAckId:z,status:i.status==="success"?i.statusPayload:void 0,subscription:ce,topicCount:x.length})]})]})}function rg({activeTopicName:r,onSelectTopic:i,topics:o}){return o.length===0?n.jsx(Q,{title:"No topics",description:"Topics created through Pub/Sub REST or SDK clients will appear here."}):n.jsx("div",{className:"dynamodb-table-list","aria-label":"Pub/Sub topics",children:o.map(c=>n.jsxs("button",{className:c.name===r?"dynamodb-table-row active":"dynamodb-table-row",onClick:()=>i(c.name),children:[n.jsxs("span",{className:"table-row-top",children:[n.jsx("span",{className:"table-row-name",children:Et(c.name)}),n.jsx("span",{className:"count-pill",children:c.subscriptionCount})]}),n.jsx("span",{className:"table-row-meta",children:c.name}),n.jsx("span",{className:"table-row-tags",children:n.jsxs("span",{children:[c.subscriptionCount," subscriptions"]})})]},c.name))})}function lg({activeSubscriptionName:r,onSelectSubscription:i,subscriptions:o}){return o.length===0?n.jsx(Q,{title:"No subscriptions",description:"Subscriptions created through Pub/Sub REST or SDK clients will appear here."}):n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Subscription"}),n.jsx("th",{scope:"col",children:"Backlog"}),n.jsx("th",{scope:"col",children:"In flight"}),n.jsx("th",{scope:"col",children:"Attempts"})]})}),n.jsx("tbody",{children:o.map(c=>n.jsxs("tr",{className:c.name===r?"item-row active":"item-row",onClick:()=>i(c.name),children:[n.jsx("td",{children:n.jsxs("span",{className:"attribute-preview",children:[n.jsx("span",{className:"attribute-chip",children:Et(c.name)}),n.jsx("span",{className:"attribute-chip",children:Et(c.topic)})]})}),n.jsx("td",{children:c.backlogMessages}),n.jsx("td",{children:c.inFlightMessages}),n.jsx("td",{children:c.maxDeliveryAttemptSeen})]},c.name))})]})})}function ig({busyAction:r,onAck:i,onPull:o,pulledMessages:c,pullMaxMessages:f,selectedAckId:p,setPullMaxMessages:y,setSelectedAckId:v,status:b,subscription:N,topicCount:C}){return N?n.jsxs("div",{className:"dynamodb-inspector",children:[n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Service"}),n.jsx("h3",{children:Et(N.name)}),n.jsxs("dl",{className:"inspector-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"REST"}),n.jsx("dd",{children:n.jsx("code",{children:(b==null?void 0:b.restEndpoint)??"unknown"})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"gRPC"}),n.jsx("dd",{children:n.jsx("code",{children:(b==null?void 0:b.grpcEndpoint)??"unknown"})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Project"}),n.jsx("dd",{children:(b==null?void 0:b.project)??"unknown"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Topics"}),n.jsx("dd",{children:C})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Ack deadline"}),n.jsxs("dd",{children:[N.ackDeadlineSeconds,"s"]})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Retained"}),n.jsx("dd",{children:N.totalRetainedMessages})]})]})]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Actions"}),n.jsxs("div",{className:"pubsub-action-row",children:[n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Pull max"}),n.jsx("input",{"aria-label":"Pub/Sub pull max messages",inputMode:"numeric",onChange:w=>y(w.target.value),value:f})]}),n.jsx(ue,{disabled:r==="pull",onClick:o,children:"Pull"}),n.jsx(ue,{disabled:c.length===0||r==="ack",onClick:i,children:"Ack"})]}),c.length>0?n.jsx("div",{className:"pulled-message-list",children:c.map(w=>n.jsxs("label",{className:"pulled-message",children:[n.jsx("input",{checked:p===w.ackId,name:"pubsub-ack-id",onChange:()=>v(w.ackId),type:"radio"}),n.jsxs("span",{children:[n.jsx("strong",{children:w.message.messageId??"pulled message"}),n.jsx("code",{children:og(w.message.data??"")})]})]},w.ackId))}):null]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Recent deliveries"}),N.recentDeliveries&&N.recentDeliveries.length>0?n.jsx(ug,{deliveries:N.recentDeliveries}):n.jsx("p",{className:"inspector-muted",children:"No retained delivery records for this subscription."})]})]}):n.jsx(Q,{title:"Inspector",description:"Subscription backlog, leases, and recent deliveries will appear here."})}function ag(r){return window.btoa(unescape(encodeURIComponent(r)))}function og(r){if(r==="")return"";try{return decodeURIComponent(escape(window.atob(r)))}catch{return r}}function ug({deliveries:r}){return n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Message"}),n.jsx("th",{scope:"col",children:"State"}),n.jsx("th",{scope:"col",children:"Attempt"}),n.jsx("th",{scope:"col",children:"Ready"})]})}),n.jsx("tbody",{children:r.map(i=>n.jsxs("tr",{className:"item-row",children:[n.jsx("td",{children:n.jsxs("span",{className:"attribute-preview",children:[n.jsx("span",{className:"attribute-chip",children:i.messageId}),i.orderingKey?n.jsx("span",{className:"attribute-chip",children:i.orderingKey}):null]})}),n.jsx("td",{children:i.state}),n.jsx("td",{children:i.deliveryAttempt}),n.jsx("td",{children:cg(i)})]},`${i.messageId}-${i.deliveryAttempt}-${i.state}`))})]})})}function cg(r){return r.leaseDeadline?`lease until ${Ra(r.leaseDeadline)}`:r.nextDeliveryTime?`retry at ${Ra(r.nextDeliveryTime)}`:r.publishTime?`published ${Ra(r.publishTime)}`:"available"}function dg(r){return{service:"pubsub",status:"disabled",running:!1,grpcEndpoint:"127.0.0.1:8085",restEndpoint:(r==null?void 0:r.endpoint)??"http://127.0.0.1:8086",project:"devcloud",storagePath:(r==null?void 0:r.storagePath)??".devcloud/data/pubsub",topicCount:0,subscriptionCount:0}}function Et(r){return r.split("/").pop()??r}function Ra(r){const i=new Date(r);return Number.isNaN(i.getTime())?r:i.toLocaleString()}async function fg(){return W("/api/gcs/status")}async function pg(){return W("/api/gcs/buckets")}async function mg(r){return W("/api/gcs/buckets",{method:"POST",body:{name:r}})}async function hg(r){return us(`/api/gcs/buckets/${encodeURIComponent(r)}`,{method:"DELETE"})}async function Gc(r,i=""){const o=new URLSearchParams;i!==""&&o.set("prefix",i);const c=o.toString();return W(`/api/gcs/buckets/${encodeURIComponent(r)}/objects${c?`?${c}`:""}`)}async function yg(r,i){return W(`/api/gcs/buckets/${encodeURIComponent(r)}/objects/${encodeURIComponent(i)}`)}async function gg(r,i){return us(`/api/gcs/buckets/${encodeURIComponent(r)}/objects/${encodeURIComponent(i)}`,{method:"DELETE"})}async function xg(){return W("/api/gcs/upload-sessions")}async function jg(r){return us(`/api/gcs/uploads/${encodeURIComponent(r)}`,{method:"DELETE"})}function vg({service:r}){const[i,o]=h.useState({status:"loading"}),[c,f]=h.useState({status:"idle"}),[p,y]=h.useState(),[v,b]=h.useState(),[N,C]=h.useState(""),[w,L]=h.useState(""),[E,D]=h.useState(),[T,U]=h.useState(0),V=(r==null?void 0:r.status)==="disabled",se=Dr(),q=h.useCallback(()=>{if(V){o({status:"success",statusPayload:Mc(r),buckets:[],sessions:[]}),f({status:"idle"}),y(void 0),b(void 0);return}o({status:"loading"}),Promise.all([fg(),pg(),xg()]).then(([K,ye,we])=>{o({status:"success",statusPayload:K,buckets:ye.buckets,sessions:we.sessions}),y(he=>{var O;return he&&ye.buckets.some(F=>F.name===he)?he:(O=ye.buckets[0])==null?void 0:O.name})}).catch(K=>{o({status:"error",message:K.message})})},[V,r]);h.useEffect(()=>{q()},[q]);const me=h.useCallback(K=>{q(),K.type.startsWith("gcs.object.")&&U(ye=>ye+1)},[q]);cn({topics:["gcs"],onEvent:me,enabled:!V}),h.useEffect(()=>{if(b(void 0),!p||V){f({status:"idle"});return}let K=!1;return f({status:"loading"}),Gc(p,N.trim()).then(({objects:ye})=>{K||f({status:"success",objects:ye})}).catch(ye=>{K||f({status:"error",message:ye.message})}),()=>{K=!0}},[p,V,N,T]);const Se=i.status==="success"?i.buckets:[],Ce=i.status==="success"?i.sessions:[],J=i.status==="success"?i.statusPayload:void 0;function oe(K){y(K),b(void 0)}function be(K){p&&yg(p,K.name).then(b).catch(ye=>D(ye.message))}function De(){const K=w.trim();!K||V||mg(K).then(()=>{L(""),D(`Created bucket ${K}`),q()}).catch(ye=>D(ye.message))}async function ie(K){V||!await se(bn({title:"Delete bucket",description:"All objects and metadata in this bucket will be removed. This cannot be undone.",target:K}))||hg(K).then(()=>{D(`Deleted bucket ${K}`),q()}).catch(we=>D(we.message))}async function z(K){!p||V||!await se(bn({title:"Delete object",description:"This object will be permanently removed from the bucket.",target:K.name}))||gg(p,K.name).then(()=>{D(`Deleted object ${K.gcsUri}`),b(void 0),C(we=>we),Cg(p,N,f)}).catch(we=>D(we.message))}async function X(K){V||!await se(bn({title:"Delete upload session",description:"In-progress upload state will be discarded.",target:K.id}))||jg(K.id).then(()=>{D(`Deleted upload session ${K.id}`),q()}).catch(we=>D(we.message))}return V?n.jsxs(Ne,{title:"devcloud GCS",children:[n.jsx(Q,{title:"GCS is disabled",description:"Enable the GCS service in devcloud config to inspect local buckets and objects."}),n.jsx(Pc,{status:J??Mc(r)})]}):n.jsxs("div",{className:"gcs-workspace",children:[n.jsxs(Ne,{title:"devcloud GCS",children:[n.jsxs("div",{className:"s3-toolbar",children:[n.jsxs("span",{children:[Se.length," buckets"]}),n.jsx(ue,{onClick:q,children:"Refresh"})]}),i.status==="loading"?n.jsx(Q,{title:"Loading GCS",description:"Reading local GCS status."}):null,i.status==="error"?n.jsx(Q,{title:"GCS unavailable",description:i.message,actionLabel:"Retry",onAction:q}):null,i.status==="success"?n.jsxs("div",{className:"gcs-sidebar",children:[n.jsx(Pc,{status:i.statusPayload}),n.jsx(bg,{bucketName:w,disabled:V,onChange:L,onCreate:De}),n.jsx(Sg,{activeBucket:p,buckets:Se,disabled:V,onDeleteBucket:ie,onSelectBucket:oe})]}):null]}),n.jsx(Ne,{title:"Objects",children:n.jsx(wg,{activeObjectName:v==null?void 0:v.name,bucketName:p,disabled:V,objectsState:c,onDeleteObject:z,onInspectObject:be,onPrefixChange:C,prefix:N})}),n.jsx(Ne,{title:"Inspector",children:n.jsx(Ng,{bucketName:p,object:v})}),n.jsx(Ne,{title:"Upload sessions",children:n.jsx(kg,{disabled:V,onDeleteSession:X,sessions:Ce})}),E?n.jsx("p",{className:"inspector-muted gcs-message",children:E}):null]})}function Pc({status:r}){return n.jsxs("dl",{className:"inspector-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"Status"}),n.jsx("dd",{children:r.running?"running":"disabled"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Project"}),n.jsx("dd",{children:r.project})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Endpoint"}),n.jsx("dd",{children:n.jsx("code",{children:r.endpoint})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Upload sessions"}),n.jsx("dd",{children:n.jsx("code",{children:r.uploadSessionPath})})]})]})}function bg({bucketName:r,disabled:i,onChange:o,onCreate:c}){return n.jsxs("div",{className:"gcs-create-bucket",children:[n.jsxs("label",{className:"prefix-filter",children:[n.jsx("span",{children:"Create bucket"}),n.jsx("input",{"aria-label":"GCS bucket name",disabled:i,onChange:f=>o(f.target.value),placeholder:"local-bucket",value:r})]}),n.jsx(ue,{disabled:i||r.trim()==="",onClick:c,children:"Create"})]})}function Sg({activeBucket:r,buckets:i,disabled:o,onDeleteBucket:c,onSelectBucket:f}){return i.length===0?n.jsx(Q,{title:"No buckets",description:"Buckets created through the GCS API will appear here."}):n.jsx("div",{className:"bucket-list",children:i.map(p=>n.jsxs("div",{className:p.name===r?"bucket-item active gcs-bucket-row":"bucket-item gcs-bucket-row",children:[n.jsxs("button",{className:"object-select",onClick:()=>f(p.name),children:[n.jsx("span",{className:"bucket-name",children:p.name}),n.jsx("span",{className:"bucket-meta",children:p.gcsUri}),n.jsxs("span",{className:"bucket-meta",children:["Created ",_a(p.timeCreated)]})]}),n.jsx("span",{className:"count-pill",children:p.objectCount}),n.jsx(ue,{className:"danger",disabled:o,onClick:()=>c(p.name),children:"Delete bucket"})]},p.name))})}function wg({activeObjectName:r,bucketName:i,disabled:o,objectsState:c,onDeleteObject:f,onInspectObject:p,onPrefixChange:y,prefix:v}){return i?n.jsxs("div",{className:"object-browser",children:[n.jsxs("label",{className:"prefix-filter",children:[n.jsx("span",{children:"Prefix"}),n.jsx("input",{"aria-label":"Filter GCS objects by prefix",onChange:b=>y(b.target.value),placeholder:"docs/",type:"search",value:v})]}),c.status==="loading"?n.jsx(Q,{title:"Loading objects",description:`Reading objects in ${i}.`}):null,c.status==="error"?n.jsx(Q,{title:"Objects unavailable",description:c.message}):null,c.status==="success"&&c.objects.length===0?n.jsx(Q,{title:"No objects",description:`No objects in ${i} match the current prefix.`}):null,c.status==="success"&&c.objects.length>0?n.jsx("div",{className:"object-table-wrap",children:n.jsxs("table",{className:"object-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Name"}),n.jsx("th",{scope:"col",children:"Size"}),n.jsx("th",{scope:"col",children:"Updated"}),n.jsx("th",{scope:"col",children:"Class"}),n.jsx("th",{scope:"col",children:"Actions"})]})}),n.jsx("tbody",{children:c.objects.map(b=>n.jsxs("tr",{className:b.name===r?"object-row active":"object-row",children:[n.jsxs("td",{children:[n.jsx("button",{className:"object-select",onClick:()=>p(b),children:n.jsx("span",{className:"object-key",children:b.name})}),n.jsx("code",{children:b.gcsUri})]}),n.jsx("td",{children:Yc(b.size)}),n.jsx("td",{children:_a(b.updated)}),n.jsx("td",{children:b.storageClass||"STANDARD"}),n.jsxs("td",{children:[n.jsx("a",{className:"object-action",href:Xc(b.downloadUrl),children:"Download"}),n.jsx(ue,{className:"danger",disabled:o,onClick:()=>f(b),children:"Delete object"})]})]},b.name))})]})}):null]}):n.jsx(Q,{title:"Select a bucket",description:"Choose a bucket to browse objects and metadata."})}function Ng({bucketName:r,object:i}){if(!i)return n.jsx(Q,{title:"Inspector",description:r?`Select an object in ${r} to inspect GCS metadata.`:"Object metadata, generation, and download links will appear here."});const o=Object.entries(i.metadata??{});return n.jsxs("div",{className:"object-inspector",children:[n.jsxs("div",{children:[n.jsx("span",{className:"inspector-label",children:"gs:// URI"}),n.jsx("code",{children:i.gcsUri})]}),n.jsxs("dl",{className:"inspector-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"generation"}),n.jsx("dd",{children:i.generation})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"metageneration"}),n.jsx("dd",{children:i.metageneration})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"storageClass"}),n.jsx("dd",{children:i.storageClass||"STANDARD"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"crc32c"}),n.jsx("dd",{children:i.crc32c||"unknown"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"contentType"}),n.jsx("dd",{children:i.contentType||"application/octet-stream"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"ETag"}),n.jsx("dd",{children:n.jsx("code",{children:i.etag||"unknown"})})]})]}),n.jsxs("div",{children:[n.jsx("span",{className:"inspector-label",children:"metadata"}),o.length===0?n.jsx("p",{className:"inspector-muted",children:"No user metadata."}):n.jsx("dl",{className:"metadata-list",children:o.map(([c,f])=>n.jsxs("div",{children:[n.jsx("dt",{children:c}),n.jsx("dd",{children:f})]},c))})]}),n.jsx("a",{className:"compat-link inspector-download",href:Xc(i.downloadUrl),children:"Download object"})]})}function kg({disabled:r,onDeleteSession:i,sessions:o}){return o.length===0?n.jsx(Q,{title:"No upload sessions",description:"Active resumable upload sessions will appear here."}):n.jsx("div",{className:"object-table-wrap",children:n.jsxs("table",{className:"object-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Session"}),n.jsx("th",{scope:"col",children:"Object"}),n.jsx("th",{scope:"col",children:"Received"}),n.jsx("th",{scope:"col",children:"Created"}),n.jsx("th",{scope:"col",children:"Action"})]})}),n.jsx("tbody",{children:o.map(c=>n.jsxs("tr",{children:[n.jsx("td",{children:n.jsx("code",{children:c.id})}),n.jsxs("td",{children:[n.jsx("span",{className:"object-key",children:c.name}),n.jsx("code",{children:`gs://${c.bucket}/${c.name}`})]}),n.jsx("td",{children:Yc(c.receivedBytes)}),n.jsx("td",{children:_a(c.createdAt)}),n.jsx("td",{children:n.jsx(ue,{className:"danger",disabled:r,onClick:()=>i(c),children:"Delete session"})})]},c.id))})]})})}function Cg(r,i,o){o({status:"loading"}),Gc(r,i.trim()).then(({objects:c})=>o({status:"success",objects:c})).catch(c=>o({status:"error",message:c.message}))}function Mc(r){return{status:"disabled",running:!1,endpoint:(r==null?void 0:r.endpoint)??"http://127.0.0.1:4443",project:"devcloud",storagePath:(r==null?void 0:r.storagePath)??".devcloud/data/s3",uploadSessionPath:".devcloud/data/gcs/upload_sessions"}}function Yc(r){if(!Number.isFinite(r)||r<0)return"unknown";if(r<1024)return`${r} B`;const i=["KB","MB","GB","TB"];let o=r/1024,c=0;for(;o>=1024&&c=10?0:1)} ${i[c]}`}function _a(r){const i=new Date(r);return Number.isNaN(i.getTime())?r||"unknown":i.toLocaleString()}function Xc(r){return r.startsWith("/api/gcs/")?r:"#"}function Eg({services:r,path:i}){return i==="/mail"?n.jsx(Ep,{service:r.find(o=>o.id==="mail")}):i==="/s3"?n.jsx(jm,{service:r.find(o=>o.id==="s3")}):i==="/gcs"?n.jsx(vg,{service:r.find(o=>o.id==="gcs")}):i==="/dynamodb"?n.jsx(dh,{service:r.find(o=>o.id==="dynamodb")}):i==="/bigquery"?n.jsx(_h,{service:r.find(o=>o.id==="bigquery")}):i==="/redshift"?n.jsx(Uh,{service:r.find(o=>o.id==="redshift")}):i==="/redis"?n.jsx(ny,{service:r.find(o=>o.id==="redis")}):i==="/sqs"?n.jsx(Jy,{service:r.find(o=>o.id==="sqs")}):i==="/pubsub"?n.jsx(sg,{service:r.find(o=>o.id==="pubsub")}):n.jsx(pp,{services:r})}function Ig({services:r}){const i=Ir(window.location.pathname);return n.jsxs("nav",{className:"service-switcher","aria-label":"Services",children:[n.jsx("a",{"aria-current":i==="/"?"page":void 0,className:i==="/"?"active":void 0,href:Al("/"),children:"Services"}),r.map(o=>n.jsxs("a",{"aria-current":i===Ir(o.path)?"page":void 0,"aria-label":`${o.name}: ${o.status}`,className:i===Ir(o.path)?"active":void 0,href:Al(o.path),children:[n.jsx("span",{children:o.name}),n.jsxs("span",{className:`switcher-status ${Rg(o.status)}`,children:[n.jsx("span",{className:"status-dot"}),o.status]})]},o.id))]})}function Rg(r){return r==="running"?"running":"disabled"}function Dg({services:r}){const i=r.filter(f=>f.status==="running").length,o=`${i}/${r.length} running`,c=r.length>0&&i===r.length?"running":"attention";return n.jsxs("div",{className:`status-pill ${c}`,"aria-label":`Service status: ${o}`,children:[n.jsx("span",{className:"status-dot"}),o]})}function Tg({services:r}){const i=Ir(window.location.pathname),o=r.find(p=>p.path===i),[c,f]=h.useState(()=>ip());return h.useEffect(()=>ap(f),[]),n.jsxs("footer",{className:"activity-footer",children:[n.jsxs("span",{children:["Last request: ",(c==null?void 0:c.path)??"/api/dashboard/services"]}),n.jsxs("span",{children:["Active: ",(o==null?void 0:o.name)??"Service index"]}),n.jsxs("span",{children:["API status: ",n.jsx(Lg,{activity:c,fallback:(o==null?void 0:o.status)??"running"})]}),n.jsxs("span",{children:["Storage: ",(o==null?void 0:o.storagePath)??"registry"]})]})}function Lg({activity:r,fallback:i}){if(!r)return n.jsx("span",{children:i});const o=r.status==="success"&&r.statusCode?`${r.status} ${r.statusCode}`:r.status;return n.jsx("span",{className:`activity-status ${r.status}`,title:r.message,children:o})}function $g({notifications:r}){const{permission:i,enabled:o,setEnabled:c,requestPermission:f}=r;return i==="unsupported"?null:i==="default"?n.jsx(ue,{className:"notifications-toggle",onClick:()=>{f()},title:"Show desktop notifications when local services emit events",children:"Enable notifications"}):i==="denied"?n.jsx(ue,{className:"notifications-toggle is-disabled",disabled:!0,title:"Notifications are blocked. Allow them in your browser site settings to enable.",children:"Notifications blocked"}):n.jsx(ue,{"aria-pressed":o,className:o?"notifications-toggle is-on":"notifications-toggle",onClick:()=>c(!o),title:o?"Click to mute desktop notifications":"Click to enable desktop notifications",children:o?"Notifications: on":"Notifications: off"})}const Zc="devcloud.notifications.enabled";function Oc(){return typeof window>"u"||typeof Notification>"u"?"unsupported":Notification.permission}function Pg(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(Zc)==="1"}catch{return!1}}function Mg(r){if(!(typeof window>"u"))try{window.localStorage.setItem(Zc,r?"1":"0")}catch{}}function Og(){const[r,i]=h.useState(()=>Oc()),[o,c]=h.useState(()=>Pg()),f=h.useCallback(y=>{c(y),Mg(y)},[]),p=h.useCallback(async()=>{if(typeof Notification>"u")return"unsupported";try{const v=await Notification.requestPermission();return i(v),v==="granted"&&f(!0),v}catch{return Oc()}},[f]);return{permission:r,enabled:o,setEnabled:f,requestPermission:p}}const _g={mail:"Mail",s3:"S3",gcs:"GCS",redis:"Redis",dynamodb:"DynamoDB",bigquery:"BigQuery",sqs:"SQS",pubsub:"Pub/Sub",redshift:"Redshift"};function Bg(r){return _g[r]??r}function Qs(r,i){const o=r==null?void 0:r[i];if(typeof o=="string")return o;if(typeof o=="number"&&Number.isFinite(o))return String(o)}function ed(r,i){const o=r==null?void 0:r[i];return Array.isArray(o)?o.filter(c=>typeof c=="string"):[]}function td(r){return r.map(i=>Sn(i)).filter(i=>i.length>0).join(", ")}function Ag(r){if(r===void 0)return;const i=Number(r);if(!(!Number.isFinite(i)||i<0))return i<1024?`${i} B`:i<1024*1024?`${(i/1024).toFixed(1)} KB`:i<1024*1024*1024?`${(i/1024/1024).toFixed(1)} MB`:`${(i/1024/1024/1024).toFixed(2)} GB`}const zg=180;function Fg(r){return r.replace(/<(script|style)[\s\S]*?<\/\1>/gi," ").replace(/<[^>]+>/g," ").replace(/ /gi," ").replace(/&/gi,"&").replace(/</gi,"<").replace(/>/gi,">").replace(/"/gi,'"').replace(/'/gi,"'").replace(/\s+/g," ").trim()}function Qg(r,i){const o=r.replace(/\r/g,"").replace(/\n{3,}/g,` +}`),[F,M]=h.useState({status:"idle"});h.useEffect(()=>{r&&(U(A=>A||r),z(A=>A||r))},[r]),h.useEffect(()=>{i&&K(A=>A||i)},[i]);const x=o||F.status==="running";function R(A){A.preventDefault();const pe=S?kc(E,"Dataset raw JSON"):{datasetReference:{datasetId:p.trim()},location:j.trim()||void 0,description:N.trim()||void 0};if(pe instanceof Error){M({status:"error",message:pe.message});return}if(!Cc(pe,["datasetReference","datasetId"])){M({status:"error",message:"Dataset ID is required."});return}M({status:"running",label:"Creating dataset"}),Sh(f,pe).then(ge=>{M({status:"success",message:`Created dataset ${ge.datasetReference.datasetId}.`}),U(ge.datasetReference.datasetId),z(ge.datasetReference.datasetId),c()}).catch(ge=>{M({status:"error",message:ge.message})})}function ae(A){A.preventDefault();const pe=T.trim()||r;if(!pe){M({status:"error",message:"Choose a dataset before creating a table."});return}const ee=J?void 0:Lh(Se);if(ee instanceof Error){M({status:"error",message:ee.message});return}const ge=J?kc(be,"Table raw JSON"):{tableReference:{tableId:V.trim()},schema:ee,description:q.trim()||void 0};if(ge instanceof Error){M({status:"error",message:ge.message});return}if(!Cc(ge,["tableReference","tableId"])){M({status:"error",message:"Table ID is required."});return}M({status:"running",label:"Creating table"}),wh(f,pe,ge).then(_e=>{M({status:"success",message:`Created table ${pe}.${_e.tableReference.tableId}.`}),z(pe),K(_e.tableReference.tableId),c()}).catch(_e=>{M({status:"error",message:_e.message})})}function ce(A){A.preventDefault();const pe=ie.trim()||r,ee=X.trim()||i;if(!pe||!ee){M({status:"error",message:"Choose a dataset and table before inserting rows."});return}const ge=$h(he,ye.trim());if(ge instanceof Error){M({status:"error",message:ge.message});return}M({status:"running",label:"Inserting rows"}),Nh(f,pe,ee,{rows:ge}).then(Pe=>{var vt;const _e=(vt=Pe.insertErrors)==null?void 0:vt.map(te=>{const Ie=te.errors.map(Ee=>Ee.message).join("; ");return`row ${te.index}: ${Ie}`});M({status:"success",message:_e!=null&&_e.length?"Insert completed with partial insert errors.":"Inserted row data.",insertErrors:_e}),c()}).catch(Pe=>{M({status:"error",message:Pe.message})})}return n.jsxs("section",{className:"redshift-query-runner","aria-label":"BigQuery management controls",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"inspector-label",children:"Local management"}),n.jsx("span",{className:"toolbar-count",children:"datasets.insert / tables.insert / tabledata.insertAll"})]}),o?n.jsx("p",{className:"inspector-muted",children:"BigQuery management controls are disabled until the service is active."}):null,F.status==="running"?n.jsxs("p",{className:"operation-message",children:[F.label,"."]}):null,F.status==="success"?n.jsxs("div",{className:"operation-message success",children:[F.message,(ve=F.insertErrors)!=null&&ve.length?n.jsx("ul",{children:F.insertErrors.map(A=>n.jsx("li",{children:A},A))}):null]}):null,F.status==="error"?n.jsx("p",{className:"operation-message error",children:F.message}):null,n.jsxs("form",{className:"dynamodb-operation-form",onSubmit:R,children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"inspector-label",children:"Create dataset"}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"raw JSON"}),n.jsx("input",{"aria-label":"Use raw JSON for BigQuery dataset",checked:S,disabled:x,onChange:A=>L(A.target.checked),type:"checkbox"})]})]}),S?n.jsxs("label",{className:"redshift-sql-editor",children:[n.jsx("span",{children:"Dataset raw JSON"}),n.jsx("textarea",{"aria-label":"BigQuery dataset raw JSON",disabled:x,onChange:A=>D(A.target.value),rows:7,spellCheck:!1,value:E})]}):n.jsxs("div",{className:"pubsub-action-row",children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Dataset ID"}),n.jsx("input",{"aria-label":"BigQuery dataset ID",disabled:x,onChange:A=>y(A.target.value),placeholder:"dashboard_ops",value:p})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Location"}),n.jsx("input",{"aria-label":"BigQuery dataset location",disabled:x,onChange:A=>b(A.target.value),placeholder:"US",value:j})]}),n.jsxs("label",{className:"compact-filter wide",children:[n.jsx("span",{children:"Description"}),n.jsx("input",{"aria-label":"BigQuery dataset description",disabled:x,onChange:A=>k(A.target.value),placeholder:"local dashboard dataset",value:N})]})]}),n.jsx(ue,{disabled:x,type:"submit",children:"Create dataset"})]}),n.jsxs("form",{className:"dynamodb-operation-form",onSubmit:ae,children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"inspector-label",children:"Create table"}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"raw JSON"}),n.jsx("input",{"aria-label":"Use raw JSON for BigQuery table",checked:J,disabled:x,onChange:A=>oe(A.target.checked),type:"checkbox"})]})]}),n.jsxs("div",{className:"pubsub-action-row",children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Dataset ID"}),n.jsx("input",{"aria-label":"BigQuery table dataset ID",disabled:x,onChange:A=>U(A.target.value),placeholder:r??"dataset",value:T})]}),J?null:n.jsxs(n.Fragment,{children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Table ID"}),n.jsx("input",{"aria-label":"BigQuery table ID",disabled:x,onChange:A=>se(A.target.value),placeholder:"events",value:V})]}),n.jsxs("label",{className:"compact-filter wide",children:[n.jsx("span",{children:"Description"}),n.jsx("input",{"aria-label":"BigQuery table description",disabled:x,onChange:A=>me(A.target.value),placeholder:"local events table",value:q})]})]})]}),J?n.jsxs("label",{className:"redshift-sql-editor",children:[n.jsx("span",{children:"Table raw JSON"}),n.jsx("textarea",{"aria-label":"BigQuery table raw JSON",disabled:x,onChange:A=>De(A.target.value),rows:9,spellCheck:!1,value:be})]}):n.jsxs("label",{className:"redshift-sql-editor",children:[n.jsx("span",{children:"Schema fields"}),n.jsx("textarea",{"aria-label":"BigQuery table schema fields",disabled:x,onChange:A=>Ce(A.target.value),rows:4,spellCheck:!1,value:Se})]}),n.jsx(ue,{disabled:x,type:"submit",children:"Create table"})]}),n.jsxs("form",{className:"dynamodb-operation-form",onSubmit:ce,children:[n.jsx("span",{className:"inspector-label",children:"Insert row"}),n.jsxs("div",{className:"pubsub-action-row",children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Dataset ID"}),n.jsx("input",{"aria-label":"BigQuery insert dataset ID",disabled:x,onChange:A=>z(A.target.value),placeholder:r??"dataset",value:ie})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Table ID"}),n.jsx("input",{"aria-label":"BigQuery insert table ID",disabled:x,onChange:A=>K(A.target.value),placeholder:i??"table",value:X})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Insert ID"}),n.jsx("input",{"aria-label":"BigQuery insert ID",disabled:x,onChange:A=>we(A.target.value),placeholder:"optional",value:ye})]})]}),n.jsxs("label",{className:"redshift-sql-editor",children:[n.jsx("span",{children:"Row JSON"}),n.jsx("textarea",{"aria-label":"BigQuery insert row JSON",disabled:x,onChange:A=>O(A.target.value),rows:6,spellCheck:!1,value:he})]}),n.jsx("p",{className:"inspector-muted",children:"JSON validation runs locally before tabledata.insertAll. Row payloads are not written to logs."}),n.jsx(ue,{disabled:x,type:"submit",children:"Insert row"})]})]})}function Oh({disabled:r,projectId:i,onQuerySuccess:o}){const[c,f]=h.useState("SELECT * FROM `analytics.people` LIMIT 10"),[p,y]=h.useState("25"),[j,b]=h.useState(!1),[N,k]=h.useState({status:"idle"}),[S,L]=h.useState(0),E=N.status==="success"?N.response:void 0,D=(E==null?void 0:E.rows)??[],T=D[Math.min(S,Math.max(D.length-1,0))];function U(V){V.preventDefault();const se=c.trim();if(se===""){k({status:"error",message:"Query text is required."});return}const q=Number.parseInt(p,10);if(!Number.isInteger(q)||q<1||q>1e3){k({status:"error",message:"Max results must be between 1 and 1000."});return}k({status:"running"}),bh(i,{query:se,maxResults:q,dryRun:j,useLegacySql:!1}).then(me=>{L(0),k({status:"success",response:me}),o()}).catch(me=>{k({status:"error",message:me.message})})}return n.jsxs("section",{className:"redshift-query-runner","aria-label":"BigQuery SQL query runner",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"inspector-label",children:"SQL query runner"}),n.jsx("span",{className:"toolbar-count",children:E?`${E.totalRows} rows / ${E.jobReference.jobId}`:"useLegacySql=false"})]}),n.jsxs("form",{className:"redshift-query-form",onSubmit:U,children:[n.jsxs("label",{className:"redshift-sql-editor",children:[n.jsx("span",{children:"Query text"}),n.jsx("textarea",{"aria-label":"BigQuery SQL query text",disabled:r||N.status==="running",onChange:V=>f(V.target.value),rows:5,spellCheck:!1,value:c})]}),n.jsxs("div",{className:"pubsub-action-row",children:[n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Max results"}),n.jsx("input",{"aria-label":"BigQuery query max results",disabled:r||N.status==="running",max:1e3,min:1,onChange:V=>y(V.target.value),type:"number",value:p})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Dry run"}),n.jsx("input",{"aria-label":"BigQuery dry run",checked:j,disabled:r||N.status==="running",onChange:V=>b(V.target.checked),type:"checkbox"})]}),n.jsx(ue,{disabled:r||N.status==="running",type:"submit",children:N.status==="running"?"Running":j?"Dry run":"Run query"})]})]}),r?n.jsx("p",{className:"inspector-muted",children:"BigQuery query controls are disabled until the service is active."}):null,N.status==="error"?n.jsx("p",{className:"operation-message error",children:N.message}):null,E?n.jsx(_h,{response:E,selectedRow:T,selectedRowIndex:S,onSelectRow:L}):null]})}function _h({onSelectRow:r,response:i,selectedRow:o,selectedRowIndex:c}){var b,N;const f=((b=i.schema)==null?void 0:b.fields)??[],p=i.rows??[],y=Math.max(f.length,((N=p[0])==null?void 0:N.f.length)??0),j=Array.from({length:y},(k,S)=>{var L,E;return{name:((L=f[S])==null?void 0:L.name)??`column_${S+1}`,type:((E=f[S])==null?void 0:E.type)??"UNKNOWN"}});return n.jsxs("div",{className:"redshift-query-result",children:[n.jsxs("div",{className:"attribute-preview","aria-label":"BigQuery query summary",children:[n.jsx("span",{className:"attribute-chip",children:i.jobComplete?"complete":"running"}),n.jsx("span",{className:"attribute-chip",children:i.cacheHit?"cache hit":"cache miss"}),n.jsxs("span",{className:"attribute-chip",children:[i.totalRows," rows"]}),n.jsx("span",{className:"attribute-chip",children:i.jobReference.jobId})]}),p.length===0?n.jsx("p",{className:"inspector-muted",children:"Query completed without loaded result rows."}):n.jsxs("div",{className:"dynamodb-query-result-grid",children:[n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table compact",children:[n.jsx("thead",{children:n.jsx("tr",{children:j.map(k=>n.jsxs("th",{scope:"col",children:[k.name,n.jsx("span",{className:"query-column-type",children:k.type})]},k.name))})}),n.jsx("tbody",{children:p.map((k,S)=>n.jsx("tr",{className:S===c?"item-row active":"item-row",onClick:()=>r(S),children:j.map((L,E)=>{var D;return n.jsx("td",{children:Kc((D=k.f[E])==null?void 0:D.v)},L.name)})},`${i.jobReference.jobId}-${S}`))})]})}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Selected result JSON"}),n.jsx("pre",{className:"mail-preview",children:JSON.stringify(Th(f,o),null,2)})]})]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Job reference"}),n.jsx("pre",{className:"mail-preview",children:JSON.stringify(i.jobReference,null,2)})]})]})}function Bh({activeIndex:r,rows:i,rowsState:o,tableName:c,onSelectIndex:f}){return c?o.status==="loading"?n.jsx(Q,{title:"Loading rows",description:`Reading rows from ${c}.`}):o.status==="error"?n.jsx(Q,{title:"BigQuery rows unavailable",description:o.message}):i.length===0?n.jsx(Q,{title:"No rows",description:`No loaded rows in ${c} match the current filter.`}):n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Insert ID"}),n.jsx("th",{scope:"col",children:"Values"}),n.jsx("th",{scope:"col",children:"Inserted"})]})}),n.jsx("tbody",{children:i.map((p,y)=>n.jsxs("tr",{className:y===r?"item-row active":"item-row",onClick:()=>f(y),children:[n.jsx("td",{children:n.jsx("code",{children:p.insertId??y+1})}),n.jsx("td",{children:n.jsx(Ah,{item:p.json})}),n.jsx("td",{children:p.insertedAt??"unknown"})]},`${p.insertId??"row"}-${y}`))})]})}):n.jsx(Q,{title:"No table selected",description:"Choose a BigQuery table to inspect stored rows."})}function Ah({item:r}){const i=Object.entries(r).slice(0,6);return i.length===0?n.jsx("span",{className:"service-status",children:"empty row"}):n.jsx("span",{className:"attribute-preview",children:i.map(([o,c])=>n.jsxs("span",{className:"attribute-chip",children:[o,": ",Kc(c)]},o))})}function zh({service:r}){const[i,o]=h.useState({status:"loading"}),[c,f]=h.useState({status:"idle"}),[p,y]=h.useState(),[j,b]=h.useState(),[N,k]=h.useState(0),[S,L]=h.useState(""),[E,D]=h.useState(""),T=(r==null?void 0:r.status)==="disabled",U=h.useCallback(()=>{if(T){o({status:"success",statusPayload:Ch(r),datasets:[],jobs:[]}),f({status:"idle"}),y(void 0),b(void 0);return}o({status:"loading"}),Promise.all([hh(),yh()]).then(async([ie,z])=>{const X=z.projects[0],K=(X==null?void 0:X.projectId)??ie.project,[{datasets:ye},{jobs:we}]=await Promise.all([gh(K),jh(K)]);o({status:"success",statusPayload:ie,datasets:ye,jobs:we}),y(he=>{var O;return he&&ye.some(F=>F.datasetId===he)?he:(O=ye[0])==null?void 0:O.datasetId}),b(he=>{var F;const O=ye.find(M=>M.datasetId===p)??ye[0];return he&&(O!=null&&O.tables.some(M=>M.tableId===he))?he:(F=O==null?void 0:O.tables[0])==null?void 0:F.tableId})}).catch(ie=>{o({status:"error",message:ie.message})})},[p,T,r]);h.useEffect(()=>{U()},[U]),cn({topics:["bigquery"],onEvent:U,enabled:!T});const V=i.status==="success"?i.datasets:[],se=V.find(ie=>ie.datasetId===p),q=se==null?void 0:se.tables.find(ie=>ie.tableId===j),me=i.status==="success"?i.statusPayload.project:r==null?void 0:r.endpoint,Se=h.useCallback(()=>{if(!se||!q||i.status!=="success"||T){f({status:"idle"});return}f({status:"loading"}),xh(i.statusPayload.project,se.datasetId,q.tableId).then(({rows:ie})=>{k(0),f({status:"success",rows:ie})}).catch(ie=>{f({status:"error",message:ie.message})})},[se,q,i,T]);h.useEffect(()=>{Se()},[Se]);const Ce=h.useMemo(()=>{const ie=S.trim().toLowerCase();return ie===""?V:V.filter(z=>z.datasetId.toLowerCase().includes(ie))},[V,S]),J=h.useMemo(()=>{const ie=c.status==="success"?c.rows:[],z=E.trim().toLowerCase();return z===""?ie:ie.filter(X=>JSON.stringify(X).toLowerCase().includes(z))},[c,E]),oe=J[Math.min(N,Math.max(J.length-1,0))];if(T)return n.jsx(Ne,{title:"BigQuery",children:n.jsx(Q,{title:"BigQuery is disabled",description:"Enable the BigQuery service in devcloud config to inspect projects, datasets, tables, rows, and jobs."})});function be(ie){var z;y(ie.datasetId),b((z=ie.tables[0])==null?void 0:z.tableId),k(0),D("")}function De(ie){b(ie.tableId),k(0),D("")}return n.jsxs("div",{className:"dynamodb-workspace",children:[n.jsxs(Ne,{title:"Datasets",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter BigQuery datasets",onChange:ie=>L(ie.target.value),placeholder:"dataset id",type:"search",value:S})]}),n.jsx(ue,{onClick:U,children:"Refresh"})]}),i.status==="loading"?n.jsx(Q,{title:"Loading datasets",description:"Reading local BigQuery catalog metadata."}):null,i.status==="error"?n.jsx(Q,{title:"BigQuery catalog unavailable",description:i.message,actionLabel:"Retry",onAction:U}):null,i.status==="success"?n.jsx(kh,{activeDatasetId:p,activeTableId:j,datasets:Ce,onSelectDataset:be,onSelectTable:De}):null]}),n.jsxs(Ne,{title:"Rows",children:[n.jsx(Oh,{disabled:T||i.status!=="success",projectId:me??"devcloud",onQuerySuccess:U}),n.jsx(Mh,{activeDatasetId:se==null?void 0:se.datasetId,activeTableId:q==null?void 0:q.tableId,disabled:T||i.status!=="success",projectId:me??"devcloud",onMutationSuccess:()=>{U(),Se()}}),n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"toolbar-count",children:q?`${J.length} shown / ${q.numRows} reported`:"Select a table"}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter BigQuery rows",disabled:!q,onChange:ie=>{k(0),D(ie.target.value)},placeholder:"row value",type:"search",value:E})]}),n.jsx(ue,{disabled:!q,onClick:Se,children:"Refresh"})]}),n.jsx(Bh,{activeIndex:N,rows:J,rowsState:c,tableName:q==null?void 0:q.tableId,onSelectIndex:k})]}),n.jsx(Ne,{title:"Inspector",children:n.jsx(Ph,{dataset:se,jobs:i.status==="success"?i.jobs:[],project:me??"unknown",row:oe,status:i.status==="success"?i.statusPayload:void 0,table:q})})]})}async function Fh(){return W("/api/redshift/status")}async function Qh(){return W("/api/redshift/clusters")}async function Uh(){return W("/api/redshift/catalog")}async function qh(){return W("/api/redshift/statements")}async function Vh(r){return W("/api/redshift/query",{method:"POST",body:r,timeoutMs:15e3})}function Kh({service:r}){const[i,o]=h.useState({status:"loading"}),[c,f]=h.useState(),[p,y]=h.useState(""),j=(r==null?void 0:r.status)==="disabled",b=h.useCallback(()=>{if(j){o({status:"success",statusPayload:Xh(r),clusters:[],catalog:{database:"dev",schemas:[],tables:[],columns:[]},statements:[]}),f(void 0);return}o({status:"loading"}),Promise.all([Fh(),Qh(),Uh(),qh()]).then(([D,T,U,V])=>{const se=U.catalog.tables;o({status:"success",statusPayload:D,clusters:T.clusters,catalog:U.catalog,statements:V.statements}),f(q=>q&&se.some(me=>Fs(me)===q)?q:Fs(se[0]))}).catch(D=>{o({status:"error",message:D.message})})},[j,r]);h.useEffect(()=>{b()},[b]),cn({topics:["redshift"],onEvent:b,enabled:!j});const N=i.status==="success"?i.catalog:void 0,k=(N==null?void 0:N.tables)??[],S=h.useMemo(()=>{const D=p.trim().toLowerCase();return D===""?k:k.filter(T=>`${T.schema}.${T.name}`.toLowerCase().includes(D))},[p,k]),L=k.find(D=>Fs(D)===c),E=(N==null?void 0:N.columns.filter(D=>L&&D.schema===L.schema&&D.table===L.name))??[];return j?n.jsx(Ne,{title:"Redshift",children:n.jsx(Q,{title:"Redshift is disabled",description:"Enable the Redshift service in devcloud config to inspect clusters, catalog metadata, and statements."})}):n.jsxs("div",{className:"redshift-workspace",children:[n.jsxs(Ne,{title:"Clusters",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"toolbar-count",children:i.status==="success"?`${i.clusters.length} clusters`:"Loading"}),n.jsx(ue,{onClick:b,children:"Refresh"})]}),i.status==="loading"?n.jsx(Q,{title:"Loading Redshift",description:"Reading local Redshift metadata."}):null,i.status==="error"?n.jsx(Q,{title:"Redshift unavailable",description:i.message,actionLabel:"Retry",onAction:b}):null,i.status==="success"?n.jsx(Hh,{clusters:i.clusters,status:i.statusPayload}):null]}),n.jsxs(Ne,{title:"Catalog",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"toolbar-count",children:`${S.length} shown / ${k.length} tables`}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter Redshift tables",onChange:D=>y(D.target.value),placeholder:"schema or table",type:"search",value:p})]})]}),n.jsx(Jh,{activeTableKey:c,tables:S,onSelectTable:D=>f(Fs(D))})]}),n.jsx(Ne,{title:"Inspector",children:n.jsx(Wh,{columns:E,onQuerySuccess:b,statements:i.status==="success"?i.statements:[],status:i.status==="success"?i.statusPayload:void 0,table:L})})]})}function Hh({clusters:r,status:i}){return r.length===0?n.jsx(Q,{title:"No clusters",description:"Local Redshift cluster metadata will appear here."}):n.jsx("div",{className:"dynamodb-table-list","aria-label":"Redshift clusters",children:r.map(o=>n.jsxs("section",{className:"dynamodb-table-row",children:[n.jsxs("span",{className:"table-row-top",children:[n.jsx("span",{className:"table-row-name",children:o.clusterIdentifier}),n.jsx("span",{className:"count-pill",children:o.clusterStatus})]}),n.jsxs("span",{className:"table-row-meta",children:[o.databaseName," on ",o.endpoint.address,":",o.endpoint.port]}),n.jsxs("span",{className:"table-row-tags",children:[n.jsx("span",{children:o.nodeType}),n.jsxs("span",{children:[o.numberOfNodes," node"]}),n.jsx("span",{children:i.region})]})]},o.clusterIdentifier))})}function Jh({activeTableKey:r,tables:i,onSelectTable:o}){return i.length===0?n.jsx(Q,{title:"No tables",description:"Tables created through Redshift SQL or Data API clients will appear here."}):n.jsx("div",{className:"dynamodb-table-list","aria-label":"Redshift tables",children:i.map(c=>n.jsxs("button",{className:Fs(c)===r?"dynamodb-table-row active":"dynamodb-table-row",onClick:()=>o(c),type:"button",children:[n.jsxs("span",{className:"table-row-top",children:[n.jsx("span",{className:"table-row-name",children:c.name}),n.jsx("span",{className:"count-pill",children:c.rowCount})]}),n.jsxs("span",{className:"table-row-meta",children:[c.schema," schema"]}),n.jsxs("span",{className:"table-row-tags",children:[n.jsxs("span",{children:[c.columnCount," columns"]}),c.distKey?n.jsxs("span",{children:["distkey ",c.distKey]}):null,c.sortKeys.length>0?n.jsxs("span",{children:["sortkey ",c.sortKeys.join(", ")]}):null]})]},Fs(c)))})}function Wh({columns:r,onQuerySuccess:i,statements:o,status:c,table:f}){return n.jsxs("div",{className:"dynamodb-inspector",children:[n.jsx(Gh,{onQuerySuccess:i}),f?null:n.jsx(Q,{title:"Inspector",description:"Table columns and recent statements will appear here."}),f?n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Table"}),n.jsx("h3",{children:`${f.schema}.${f.name}`}),n.jsxs("dl",{className:"inspector-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"SQL endpoint"}),n.jsx("dd",{children:n.jsx("code",{children:(c==null?void 0:c.sqlEndpoint)??"127.0.0.1:5439"})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"API endpoint"}),n.jsx("dd",{children:n.jsx("code",{children:(c==null?void 0:c.apiEndpoint)??"http://127.0.0.1:9099"})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Rows"}),n.jsx("dd",{children:f.rowCount})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Distribution"}),n.jsxs("dd",{children:[f.distStyle||"auto"," ",f.distKey?`on ${f.distKey}`:""]})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Sort keys"}),n.jsx("dd",{children:f.sortKeys.length>0?f.sortKeys.join(", "):"none"})]})]})]}):null,f?n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Columns"}),r.length===0?n.jsx("p",{className:"inspector-muted",children:"No column metadata recorded."}):n.jsx("div",{className:"attribute-preview",children:r.map(p=>n.jsxs("span",{className:"attribute-chip",children:[p.name," ",p.dataType,p.encoding?` encode ${p.encoding}`:"",p.identity?" identity":""]},`${p.table}-${p.name}`))})]}):null,n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Recent statements"}),o.length===0?n.jsx("p",{className:"inspector-muted",children:"No Redshift statements recorded."}):n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"ID"}),n.jsx("th",{scope:"col",children:"Status"}),n.jsx("th",{scope:"col",children:"Rows"}),n.jsx("th",{scope:"col",children:"SQL"})]})}),n.jsx("tbody",{children:o.slice(0,8).map(p=>n.jsxs("tr",{className:"item-row",children:[n.jsx("td",{children:n.jsx("code",{children:p.redshiftQueryId})}),n.jsx("td",{children:p.status}),n.jsx("td",{children:p.resultRows}),n.jsxs("td",{children:[p.queryPreview,p.queryRedacted||p.queryTruncated?n.jsx("span",{className:"attribute-chip",children:p.queryRedacted?"redacted":"truncated"}):null]})]},p.id))})]})})]})]})}function Gh({onQuerySuccess:r}){const[i,o]=h.useState("select 1"),[c,f]=h.useState("100"),[p,y]=h.useState(),[j,b]=h.useState(),[N,k]=h.useState(),[S,L]=h.useState(!1),E=D=>{if(D.preventDefault(),i.trim()===""){y(void 0),k(void 0),b("SQL is required.");return}const T=Number.parseInt(c,10),U=Number.isFinite(T)?Math.max(1,T):100;f(String(U)),L(!0),b(void 0),k(void 0),Vh({sql:i,maxRows:U}).then(V=>{y(V.result),k(`${V.result.statement.status}: ${V.result.commandTag||"statement completed"}`),r()}).catch(()=>{y(void 0),k(void 0),b("Query failed. Check SQL syntax and local Redshift state.")}).finally(()=>L(!1))};return n.jsxs("section",{className:"redshift-query-runner","aria-label":"Redshift query runner",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"inspector-label",children:"Query runner"}),n.jsx("span",{className:"toolbar-count",children:p?`${p.rowCount} rows`:"Ready"})]}),n.jsxs("form",{className:"redshift-query-form",onSubmit:E,children:[n.jsxs("label",{className:"redshift-sql-editor",children:[n.jsx("span",{children:"SQL"}),n.jsx("textarea",{"aria-label":"Redshift SQL",onChange:D=>o(D.target.value),rows:5,spellCheck:!1,value:i})]}),n.jsxs("div",{className:"pubsub-action-row",children:[n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Max rows"}),n.jsx("input",{min:1,onChange:D=>f(D.target.value),type:"number",value:c})]}),n.jsx(ue,{disabled:S,type:"submit",children:S?"Running":"Run query"})]})]}),j?n.jsx("p",{className:"operation-message error",children:j}):null,N?n.jsx("p",{className:"operation-message success",children:N}):null,p?n.jsx(Yh,{queryResult:p}):null]})}function Yh({queryResult:r}){return n.jsxs("div",{className:"redshift-query-result",children:[n.jsxs("div",{className:"attribute-preview","aria-label":"Redshift query summary",children:[n.jsx("span",{className:"attribute-chip",children:r.statement.status}),n.jsx("span",{className:"attribute-chip",children:r.commandTag}),n.jsxs("span",{className:"attribute-chip",children:[r.rowCount," rows"]})]}),r.columns.length===0?n.jsx("p",{className:"inspector-muted",children:"Statement completed without a result set."}):n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table",children:[n.jsx("thead",{children:n.jsx("tr",{children:r.columns.map(i=>n.jsxs("th",{scope:"col",children:[i.name,n.jsx("span",{className:"query-column-type",children:i.typeName})]},i.name))})}),n.jsx("tbody",{children:r.rows.length===0?n.jsx("tr",{children:n.jsx("td",{colSpan:r.columns.length,children:"No rows returned."})}):r.rows.map((i,o)=>n.jsx("tr",{className:"item-row",children:r.columns.map((c,f)=>n.jsx("td",{children:String(i[f]??"")},`${o}-${c.name}`))},o))})]})})]})}function Xh(r){return{service:"redshift",status:"disabled",running:!1,sqlEndpoint:"127.0.0.1:5439",apiEndpoint:(r==null?void 0:r.endpoint)??"http://127.0.0.1:9099",region:"us-east-1",clusterCount:0,storagePath:(r==null?void 0:r.storagePath)??".devcloud/data/redshift",backendKind:"postgres",backendMode:"managed"}}function Fs(r){if(r)return`${r.schema}.${r.name}`}async function Zh(){return W("/api/redis/status")}async function Ec(r=0,i="*",o=100){const c=new URLSearchParams({cursor:String(r),match:i,count:String(o)});return W(`/api/redis/keys?${c.toString()}`)}async function Ic(r){return W(`/api/redis/keys/${encodeURIComponent(r)}`)}async function ey(r){return W("/api/redis/command",{method:"POST",body:r})}async function ty(r){return W(`/api/redis/keys/${encodeURIComponent(r)}`,{method:"DELETE"})}async function ny(r,i){return W(`/api/redis/keys/${encodeURIComponent(r)}/expire`,{method:"POST",body:{ttlSeconds:i}})}async function sy(){return W("/api/redis/keys?confirm=FLUSHDB",{method:"DELETE"})}const Rc=/("(?:\\.|[^"\\])*")(\s*:)?|(\b(?:true|false|null)\b)|(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)/g;function Hc(r){const i=[];let o=0,c=0;Rc.lastIndex=0;let f;for(;(f=Rc.exec(r))!==null;){const[p,y,j,b,N]=f,k=f.index;if(k>o&&i.push(r.slice(o,k)),y!==void 0){const S=j!==void 0;i.push(n.jsx("span",{className:S?"json-token-key":"json-token-string",children:y},`t${c++}`)),j&&i.push(j)}else if(b!==void 0){const S=b==="null"?"json-token-null":"json-token-bool";i.push(n.jsx("span",{className:S,children:b},`t${c++}`))}else N!==void 0?i.push(n.jsx("span",{className:"json-token-number",children:N},`t${c++}`)):i.push(p);o=k+p.length}return o{if(D){c({status:"success",statusPayload:wy(r),keys:[],nextCursor:0}),p(void 0),j(void 0);return}c({status:"loading"}),Promise.all([Zh(),Ec(0,k)]).then(([J,oe])=>{c({status:"success",statusPayload:J,keys:oe.keys,nextCursor:oe.nextCursor}),p(be=>{var De;return be&&oe.keys.some(ie=>ie.key===be)?be:(De=oe.keys[0])==null?void 0:De.key})}).catch(J=>c({status:"error",message:J.message}))},[D,k,r]),U=h.useCallback(()=>{o.status!=="success"||o.nextCursor===0||D||Ec(o.nextCursor,k).then(J=>{c(oe=>oe.status!=="success"?oe:{...oe,keys:[...oe.keys,...J.keys],nextCursor:J.nextCursor})}).catch(J=>E({tone:"error",text:J.message}))},[D,k,o]);h.useEffect(()=>{T()},[T]),cn({topics:["redis"],onEvent:T,enabled:!D}),h.useEffect(()=>{if(!f||D){j(void 0),N(void 0);return}let J=!1;return N(void 0),Ic(f).then(oe=>{J||j(oe)}).catch(oe=>{J||(j(void 0),N(oe.message))}),()=>{J=!0}},[f,D]);const V=o.status==="success"?o.keys:[],se=o.status==="success"?o.nextCursor:0,q=o.status==="success"?o.statusPayload:void 0;async function me(J){await i(bn({title:"Delete Redis key",description:"This key will be permanently removed from the selected Redis database.",target:J}))&&ty(J).then(be=>{E({tone:"success",text:`Deleted ${J} (${be.deleted} key)`}),p(void 0),j(void 0),T()}).catch(be=>E({tone:"error",text:be.message}))}function Se(J,oe){ny(J,oe).then(be=>{E({tone:be.updated?"success":"warning",text:be.updated?`Set TTL on ${J} to ${oe}s`:`TTL not updated on ${J} (key may be missing)`}),Ic(J).then(j).catch(()=>{}),T()}).catch(be=>E({tone:"error",text:be.message}))}async function Ce(){await i(bn({title:"Flush Redis DB",description:"This removes every key from the selected Redis database. FLUSHALL is never used.",target:"FLUSHDB",confirmLabel:"Flush DB"}))&&sy().then(oe=>{E({tone:"success",text:`FLUSHDB ${oe.result}`}),p(void 0),j(void 0),T()}).catch(oe=>E({tone:"error",text:oe.message}))}return D?n.jsx(Ne,{title:"Redis",children:n.jsx(Q,{title:"Redis is disabled",description:"Enable services.redis.enabled in .devcloud/config.yaml and restart devcloud."})}):n.jsxs("div",{className:"redis-shell",children:[n.jsx(oy,{status:q,loading:o.status==="loading",error:o.status==="error"?o.message:void 0}),n.jsxs("div",{className:"redis-workspace",children:[n.jsxs(Ne,{title:"Keys",children:[n.jsxs("div",{className:"redis-keys-toolbar",children:[n.jsx(ay,{loading:o.status==="loading",keys:V.length,total:q==null?void 0:q.db0Keys}),n.jsxs("div",{className:"redis-toolbar-actions",children:[n.jsx(ue,{onClick:T,children:"Refresh"}),n.jsx(ue,{disabled:o.status!=="success"||se===0,onClick:U,children:"Load more"}),n.jsx(ue,{className:"danger",disabled:V.length===0,onClick:Ce,children:"Flush DB"})]})]}),n.jsxs("label",{className:"redis-match-field",children:[n.jsx("span",{children:"Match pattern"}),n.jsx("input",{"aria-label":"Match Redis keys",onChange:J=>S(J.target.value),placeholder:"* | prefix:* | exact-key",spellCheck:!1,type:"search",value:k})]}),L?n.jsx(iy,{message:L,onDismiss:()=>E(void 0)}):null,o.status==="loading"?n.jsx(Q,{title:"Loading Redis",description:"Reading key metadata via SCAN."}):null,o.status==="error"?n.jsx(Q,{title:"Redis unavailable",description:o.message,actionLabel:"Retry",onAction:T}):null,o.status==="success"?n.jsx(uy,{activeKey:f,keys:V,onSelectKey:p}):null]}),n.jsx(Ne,{title:"Inspector",children:n.jsx(cy,{detail:y,error:b,onDeleteKey:me,onApplyTTL:Se})}),n.jsx(Ne,{title:"Command Runner",children:n.jsx(Sy,{})})]})]})}function iy({message:r,onDismiss:i}){return n.jsxs("div",{className:`redis-message redis-message-${r.tone}`,role:"status",children:[n.jsx("span",{children:r.text}),n.jsx("button",{"aria-label":"Dismiss",className:"redis-message-close",onClick:i,type:"button",children:"×"})]})}function ay({keys:r,total:i,loading:o}){if(o)return n.jsx("span",{className:"redis-keys-count",children:"Loading…"});const c=i!==void 0&&i>=0?` / ${i}`:"";return n.jsxs("span",{className:"redis-keys-count",children:[n.jsx("strong",{children:r}),n.jsxs("span",{className:"redis-keys-count-total",children:[c," key",r===1?"":"s"]})]})}function oy({status:r,loading:i,error:o}){return i&&!r?n.jsx("header",{className:"redis-status-bar redis-status-bar-loading",children:n.jsx("span",{children:"Connecting to Redis…"})}):o&&!r?n.jsxs("header",{className:"redis-status-bar redis-status-bar-error",role:"alert",children:[n.jsxs("span",{className:"redis-status-cell",children:[n.jsx("span",{className:"cell-label",children:"State"}),n.jsx("span",{className:"cell-value",children:"unreachable"})]}),n.jsxs("span",{className:"redis-status-cell redis-status-cell-wide",children:[n.jsx("span",{className:"cell-label",children:"Reason"}),n.jsx("span",{className:"cell-value",children:o})]})]}):r?n.jsxs("header",{className:"redis-status-bar",children:[n.jsxs("span",{className:`redis-status-cell redis-mode-pill redis-mode-${r.mode||"unknown"}`,children:[n.jsx("span",{className:"cell-label",children:"Mode"}),n.jsx("span",{className:"cell-value",children:r.mode||"unknown"})]}),n.jsxs("span",{className:"redis-status-cell",children:[n.jsx("span",{className:"cell-label",children:"Address"}),n.jsx("code",{children:r.address||"—"})]}),n.jsxs("span",{className:"redis-status-cell",children:[n.jsx("span",{className:"cell-label",children:"Server"}),n.jsx("span",{className:"cell-value",children:r.serverVersion||"—"})]}),n.jsxs("span",{className:"redis-status-cell",children:[n.jsx("span",{className:"cell-label",children:"Clients"}),n.jsx("span",{className:"cell-value",children:r.connectedClients})]}),n.jsxs("span",{className:"redis-status-cell",children:[n.jsx("span",{className:"cell-label",children:"Memory"}),n.jsx("span",{className:"cell-value",children:r.usedMemoryHuman||"—"})]}),n.jsxs("span",{className:"redis-status-cell",children:[n.jsx("span",{className:"cell-label",children:"Keys (db0)"}),n.jsx("span",{className:"cell-value",children:r.db0Keys})]})]}):n.jsx("header",{className:"redis-status-bar redis-status-bar-loading",children:n.jsx("span",{children:"—"})})}function uy({activeKey:r,keys:i,onSelectKey:o}){return i.length===0?n.jsx(Q,{title:"No keys",description:"Send SET / HSET / LPUSH from a Redis client and refresh."}):n.jsx("ul",{className:"redis-key-list","aria-label":"Redis keys",children:i.map(c=>{const f=c.key===r;return n.jsx("li",{children:n.jsxs("button",{"aria-current":f?"true":void 0,className:f?"redis-key-row active":"redis-key-row",onClick:()=>o(c.key),title:c.key,type:"button",children:[n.jsxs("span",{className:"redis-key-row-top",children:[n.jsx(Wc,{type:c.type}),n.jsx(Gc,{ttlSeconds:c.ttlSeconds,compact:!0})]}),n.jsx("span",{className:"redis-key-row-name",children:c.key})]})},c.key)})})}function cy({detail:r,error:i,onApplyTTL:o,onDeleteKey:c}){return i?n.jsx(Q,{title:"Key unavailable",description:i}):r?n.jsxs("div",{className:"redis-inspector",children:[n.jsx(dy,{detail:r}),n.jsx(fy,{detail:r}),n.jsx(vy,{detail:r,onApplyTTL:o,onDeleteKey:c})]}):n.jsx(Q,{title:"Select a key",description:"Choose a key on the left to inspect its type, TTL, and value."})}function dy({detail:r}){const[i,o]=h.useState(!1);function c(){navigator.clipboard&&navigator.clipboard.writeText(r.key).then(()=>{o(!0),window.setTimeout(()=>o(!1),1500)}).catch(()=>{})}return n.jsxs("header",{className:"redis-inspector-header",children:[n.jsx("span",{className:"redis-inspector-eyebrow",children:"Key"}),n.jsxs("div",{className:"redis-key-title-row",children:[n.jsx("code",{className:"redis-key-title",children:r.key}),n.jsx("button",{className:"redis-copy-button",onClick:c,title:"Copy key",type:"button",children:i?"copied":"copy"})]}),n.jsxs("div",{className:"redis-key-badges",children:[n.jsx(Wc,{type:r.type}),n.jsx(Gc,{ttlSeconds:r.ttlSeconds}),n.jsx(by,{detail:r})]})]})}function fy({detail:r}){return!r.preview||r.preview.length===0?n.jsxs("section",{className:"redis-inspector-section",children:[n.jsx("span",{className:"redis-inspector-eyebrow",children:"Value"}),n.jsx(Q,{title:"Empty value",description:"The key exists but has no previewable content in this slice."})]}):n.jsxs("section",{className:"redis-inspector-section",children:[n.jsx("header",{className:"redis-section-head",children:n.jsx("span",{className:"redis-inspector-eyebrow",children:"Value"})}),py(r)]})}function py(r){switch(r.type){case"string":return n.jsx(my,{raw:r.preview[0]??""});case"list":return n.jsx(hy,{items:r.preview});case"hash":return n.jsx(yy,{entries:r.preview});case"set":return n.jsx(xy,{members:r.preview});case"zset":return n.jsx(jy,{items:r.preview});default:return n.jsx("pre",{className:"redis-value-pre",children:r.preview.join(` +`)})}}function my({raw:r}){const i=h.useMemo(()=>Jc(r),[r]),[o,c]=h.useState(i?"pretty":"raw"),f=o==="pretty"&&i!==void 0;return n.jsxs("div",{className:"redis-value-string",children:[n.jsxs("div",{className:"redis-value-toolbar",children:[n.jsxs("span",{className:"redis-value-meta",children:[r.length.toLocaleString()," char",r.length===1?"":"s"]}),i?n.jsxs("div",{role:"tablist","aria-label":"Value format",className:"redis-segmented",children:[n.jsx("button",{type:"button",role:"tab","aria-selected":o==="pretty",className:o==="pretty"?"active":void 0,onClick:()=>c("pretty"),children:"Pretty"}),n.jsx("button",{type:"button",role:"tab","aria-selected":o==="raw",className:o==="raw"?"active":void 0,onClick:()=>c("raw"),children:"Raw"})]}):null]}),n.jsx("pre",{className:"redis-value-pre json-code",children:f?Hc(i):r})]})}function hy({items:r}){return n.jsx("ol",{className:"redis-list-view",children:r.map((i,o)=>n.jsxs("li",{children:[n.jsx("span",{className:"redis-list-index",children:o}),n.jsx("code",{className:"redis-list-value",children:i})]},o))})}function yy({entries:r}){return n.jsxs("table",{className:"redis-hash-table","aria-label":"Hash fields",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Field"}),n.jsx("th",{scope:"col",children:"Value"})]})}),n.jsx("tbody",{children:r.map((i,o)=>{const[c,f]=Yc(i,": ");return n.jsxs("tr",{children:[n.jsx("th",{scope:"row",children:n.jsx("code",{children:c})}),n.jsx("td",{children:n.jsx(gy,{raw:f})})]},o)})})]})}function gy({raw:r}){const i=h.useMemo(()=>Jc(r),[r]);return i===void 0?n.jsx("code",{children:r}):n.jsx("pre",{className:"redis-value-pre json-code redis-value-pre-inline",children:Hc(i)})}function xy({members:r}){return n.jsx("ul",{className:"redis-set-view","aria-label":"Set members",children:r.map((i,o)=>n.jsx("li",{children:n.jsx("code",{children:i})},o))})}function jy({items:r}){return n.jsxs("table",{className:"redis-zset-table","aria-label":"Sorted set members",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Member"}),n.jsx("th",{scope:"col",children:"Score"})]})}),n.jsx("tbody",{children:r.map((i,o)=>{const[c,f]=Yc(i,": ");return n.jsxs("tr",{children:[n.jsx("th",{scope:"row",children:n.jsx("code",{children:c})}),n.jsx("td",{className:"redis-zset-score",children:f})]},o)})})]})}function vy({detail:r,onApplyTTL:i,onDeleteKey:o}){const[c,f]=h.useState("60"),p=Number(c),y=Number.isInteger(p)&&p>0;function j(N){N.preventDefault(),y&&i(r.key,p)}function b(){i(r.key,-1)}return n.jsxs("section",{className:"redis-inspector-section",children:[n.jsx("header",{className:"redis-section-head",children:n.jsx("span",{className:"redis-inspector-eyebrow",children:"Actions"})}),n.jsxs("form",{className:"redis-ttl-form",onSubmit:j,children:[n.jsxs("label",{children:[n.jsx("span",{children:"TTL seconds"}),n.jsx("input",{"aria-label":"TTL seconds",min:1,onChange:N=>f(N.target.value),type:"number",value:c})]}),n.jsx(ue,{disabled:!y,type:"submit",children:"Set TTL"}),n.jsx(ue,{className:"ghost",onClick:b,type:"button",children:"Persist (no TTL)"})]}),n.jsx("div",{className:"redis-danger-row",children:n.jsx(ue,{className:"danger",onClick:()=>o(r.key),type:"button",children:"Delete key"})})]})}function Wc({type:r}){const i=(r||"unknown").toLowerCase();return n.jsx("span",{className:`redis-badge redis-type-${i}`,children:i})}function Gc({ttlSeconds:r,compact:i}){return r===-2?n.jsx("span",{className:"redis-badge redis-ttl-missing",children:i?"✕":"missing"}):r===-1?n.jsx("span",{className:"redis-badge redis-ttl-persistent",children:i?"∞":"persistent"}):n.jsx("span",{className:"redis-badge redis-ttl-active",title:`${r}s`,children:i?`${Tc(r)}`:`TTL ${Tc(r)}`})}function by({detail:r}){if(!r.preview||r.preview.length===0)return null;const i=r.preview.length;let o;switch(r.type){case"string":o=`${(r.preview[0]??"").length} char${(r.preview[0]??"").length===1?"":"s"}`;break;case"list":o=`${i} item${i===1?"":"s"}`;break;case"hash":o=`${i} field${i===1?"":"s"}`;break;case"set":o=`${i} member${i===1?"":"s"}`;break;case"zset":o=`${i} entr${i===1?"y":"ies"}`;break;default:o=`${i}`}return n.jsx("span",{className:"redis-badge redis-size",children:o})}function Sy(){const[r,i]=h.useState("GET your-key"),[o,c]=h.useState([]),f=h.useRef(0),p=h.useMemo(()=>Dc(r),[r]);function y(S){f.current+=1;const L=f.current;c(E=>[{id:L,...S},...E].slice(0,ry))}function j(S,L){if(!S.command){y({input:L,outcome:"error",detail:"No command supplied"});return}ey(S).then(E=>{y({input:L,outcome:"success",detail:`${E.command} (${E.class})`,rows:E.rows??[]})}).catch(E=>{y({input:L,outcome:"error",detail:E.message})})}function b(S){S.preventDefault(),j(p,r)}function N(S){(S.metaKey||S.ctrlKey)&&S.key==="Enter"&&(S.preventDefault(),j(p,r))}function k(S){i(S),j(Dc(S),S)}return n.jsxs("div",{className:"redis-runner",children:[n.jsxs("form",{className:"redis-runner-form",onSubmit:b,children:[n.jsxs("label",{className:"redis-runner-label",children:[n.jsx("span",{children:"Command"}),n.jsx("textarea",{"aria-label":"Redis command",onChange:S=>i(S.target.value),onKeyDown:N,rows:3,spellCheck:!1,value:r})]}),n.jsxs("div",{className:"redis-runner-toolbar",children:[n.jsxs("span",{className:"redis-runner-hint",children:["Allowlisted commands only · ",n.jsx("kbd",{children:"⌘"}),"/",n.jsx("kbd",{children:"Ctrl"}),"+",n.jsx("kbd",{children:"Enter"})," to run"]}),n.jsx(ue,{type:"submit",children:"Run"})]})]}),o.length===0?n.jsx(Q,{title:"No commands yet",description:"Try GET, HGETALL, LRANGE, SCAN 0 MATCH * COUNT 50, or TYPE."}):null,o.length>0?n.jsx("ol",{className:"redis-runner-history","aria-label":"Command history",children:o.map(S=>n.jsxs("li",{className:`redis-runner-entry redis-runner-${S.outcome}`,children:[n.jsxs("header",{className:"redis-runner-entry-head",children:[n.jsx("code",{className:"redis-runner-input",children:S.input}),n.jsx("button",{className:"redis-runner-rerun",onClick:()=>k(S.input),title:"Run again",type:"button",children:"rerun"})]}),n.jsxs("p",{className:"redis-runner-detail",children:[n.jsx("span",{className:"redis-runner-tag",children:S.outcome==="success"?"OK":"ERR"}),n.jsx("span",{children:S.detail})]}),S.rows&&S.rows.length>0?n.jsx("pre",{className:"redis-runner-result",children:S.rows.join(` +`)}):null]},S.id))}):null]})}function wy(r){var i;return{service:"redis",status:"disabled",running:!1,mode:"managed",address:((i=r==null?void 0:r.endpoint)==null?void 0:i.replace(/^redis:\/\//,""))??"127.0.0.1:6379",serverVersion:"",connectedClients:0,usedMemoryHuman:"",db0Keys:0,storagePath:(r==null?void 0:r.storagePath)??".devcloud/data/redis"}}function Dc(r){const i=r.trim().split(/\s+/).filter(f=>f.length>0),[o="",...c]=i;return{command:o,args:c}}function Yc(r,i){const o=r.indexOf(i);return o===-1?[r,""]:[r.slice(0,o),r.slice(o+i.length)]}function Tc(r){return r<60?`${r}s`:r<3600?`${Math.floor(r/60)}m`:r<86400?`${Math.floor(r/3600)}h`:`${Math.floor(r/86400)}d`}async function Ny(){return W("/api/sqs/status")}async function ky(){return W("/api/sqs/queues")}async function Cy(r){return W("/api/sqs/queues",{method:"POST",body:{input:r}})}async function Ey(r){return W(`/api/sqs/queues/${encodeURIComponent(r)}/messages`)}async function Iy(r,i){return W(`/api/sqs/queues/${encodeURIComponent(r)}/messages`,{method:"POST",body:{input:i}})}async function Ry(r,i){return W(`/api/sqs/queues/${encodeURIComponent(r)}/receive`,{method:"POST",body:{input:i}})}async function Dy(r,i){await W(`/api/sqs/queues/${encodeURIComponent(r)}/delete`,{method:"POST",body:{input:i}})}async function Ty(r,i){await W(`/api/sqs/queues/${encodeURIComponent(r)}/visibility`,{method:"POST",body:{input:i}})}async function Ly(r){return W(`/api/sqs/queues/${encodeURIComponent(r)}/leases`)}async function $y(r){return W(`/api/sqs/queues/${encodeURIComponent(r)}/dlq`)}async function Py(r){const i=await fetch(`/api/sqs/queues/${encodeURIComponent(r)}/purge`,{method:"POST"});if(!i.ok){const o=await i.text();throw new Error(o||`Request failed with ${i.status}`)}}function My({busyAction:r,newQueueName:i,newQueueKind:o,newQueueVisibility:c,newQueueDelay:f,onSubmit:p,setNewQueueName:y,setNewQueueKind:j,setNewQueueVisibility:b,setNewQueueDelay:N}){return n.jsxs("form",{className:"pubsub-action-form stacked",onSubmit:p,children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Queue name"}),n.jsx("input",{"aria-label":"New SQS queue name",onChange:k=>y(k.target.value),placeholder:o==="fifo"?"jobs.fifo":"jobs",value:i})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Type"}),n.jsxs("select",{"aria-label":"New SQS queue type",onChange:k=>j(k.target.value==="fifo"?"fifo":"standard"),value:o,children:[n.jsx("option",{value:"standard",children:"Standard"}),n.jsx("option",{value:"fifo",children:"FIFO"})]})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Visibility"}),n.jsx("input",{"aria-label":"New SQS queue visibility timeout seconds",inputMode:"numeric",onChange:k=>b(k.target.value),value:c})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Delay"}),n.jsx("input",{"aria-label":"New SQS queue delay seconds",inputMode:"numeric",onChange:k=>N(k.target.value),value:f})]}),n.jsx(ue,{disabled:r==="create-queue",type:"submit",children:"Create"})]})}function Oy(r){return{service:"sqs",status:"disabled",running:!1,endpoint:(r==null?void 0:r.endpoint)??"http://127.0.0.1:9324",region:"us-east-1",authMode:"relaxed",storagePath:(r==null?void 0:r.storagePath)??".devcloud/data/sqs",queueCount:0}}function Lc(r){const i=Number.parseInt(r,10);if(!(!Number.isFinite(i)||i<0))return String(i)}function $c(r){const i=Number.parseInt(r,10);if(!(!Number.isFinite(i)||i<=0))return i}function Ia(r){const i=Number.parseInt(r,10);if(!(!Number.isFinite(i)||i<0))return i}function _y(r){return Object.fromEntries(Object.entries(r).filter(i=>typeof i[1]=="string"))}function By(r){const i=r.trim();if(i==="")return;let o;try{o=JSON.parse(i)}catch{return new Error("Message attributes JSON is invalid")}if(!zl(o))return new Error("Message attributes must be a JSON object");for(const[c,f]of Object.entries(o))if(!zl(f)||typeof f.DataType!="string"||f.DataType.trim()==="")return new Error(`Message attribute ${c} must include DataType`);return o}function Pc(r){const i=r.split(",").map(o=>o.trim()).filter(Boolean);return i.length>0?i:void 0}function Ay(r){if(r)try{const i=JSON.parse(r);if(!zl(i))return;const o=i.deadLetterTargetArn,c=i.maxReceiveCount;return typeof o!="string"?void 0:{deadLetterTargetArn:o,maxReceiveCount:typeof c=="string"?c:String(c??"")}}catch{return}}function zy(r){if(r)try{const i=JSON.parse(r);return!zl(i)||typeof i.redrivePermission!="string"?void 0:{redrivePermission:i.redrivePermission}}catch{return}}function Xc(r){return r.length<=12?r===""?"":"...":`${r.slice(0,6)}...${r.slice(-6)}`}function zl(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function Fy({activeQueue:r,busyAction:i,purgeConfirmation:o,onSubmit:c,setPurgeConfirmation:f}){return n.jsxs("form",{className:"pubsub-action-form stacked",onSubmit:c,children:[n.jsx("span",{className:"toolbar-count",children:r?r.name:"No queue selected"}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Purge confirmation"}),n.jsx("input",{"aria-label":"Confirm SQS purge queue",disabled:!r,onChange:p=>f(p.target.value),placeholder:(r==null?void 0:r.name)??"queue name",value:o})]}),n.jsx(ue,{className:"danger",disabled:!r||o!==r.name||i==="purge-queue",type:"submit",children:"Purge"})]})}function Qy({activeQueue:r,busyAction:i,selectedReceiptHandle:o,visibilityTimeout:c,visibilityConfirmation:f,onSubmit:p,setVisibilityTimeout:y,setVisibilityConfirmation:j}){const b=!r||o==="";return n.jsxs("form",{className:"pubsub-action-form stacked",onSubmit:p,children:[n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Visibility timeout"}),n.jsx("input",{"aria-label":"SQS change visibility timeout seconds",disabled:b,inputMode:"numeric",onChange:N=>y(N.target.value),value:c})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Confirm"}),n.jsx("input",{"aria-label":"Confirm SQS change message visibility",disabled:b,onChange:N=>j(N.target.value),placeholder:"visibility",value:f})]}),n.jsx(ue,{disabled:b||f!=="visibility"||i==="change-visibility",type:"submit",children:"Change visibility"})]})}function Uy({activeQueue:r,busyAction:i,selectedReceivedMessage:o,selectedReceiptHandle:c,pastedReceiptHandle:f,deleteConfirmation:p,onSubmit:y,setPastedReceiptHandle:j,setDeleteConfirmation:b}){return n.jsxs("form",{className:"pubsub-action-form stacked",onSubmit:y,children:[n.jsxs("label",{className:"compact-filter wide",children:[n.jsx("span",{children:"Receipt handle"}),n.jsx("input",{"aria-label":"SQS delete receipt handle",disabled:!r,onChange:N=>j(N.target.value),placeholder:o?Xc(o.ReceiptHandle):"paste receipt handle or select received message",value:f})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Confirm"}),n.jsx("input",{"aria-label":"Confirm SQS delete message",disabled:!r||c==="",onChange:N=>b(N.target.value),placeholder:"delete",value:p})]}),n.jsx(ue,{className:"danger",disabled:!r||c===""||p!=="delete"||i==="delete-message",type:"submit",children:"Delete"})]})}function qy({activeIndex:r,detailState:i,messages:o,onSelectIndex:c,queueName:f}){return f?i.status==="loading"?n.jsx(Q,{title:"Loading messages",description:`Reading messages from ${f}.`}):i.status==="error"?n.jsx(Q,{title:"SQS messages unavailable",description:i.message}):o.length===0?n.jsx(Q,{title:"No messages",description:`No retained messages in ${f} match the current filter.`}):n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"State"}),n.jsx("th",{scope:"col",children:"Body"}),n.jsx("th",{scope:"col",children:"Receive"})]})}),n.jsx("tbody",{children:o.map((p,y)=>n.jsxs("tr",{className:y===r?"item-row active":"item-row",onClick:()=>c(y),children:[n.jsx("td",{children:p.state}),n.jsx("td",{children:n.jsx(Vy,{message:p})}),n.jsx("td",{children:p.receiveCount})]},`${p.messageId}-${y}`))})]})}):n.jsx(Q,{title:"No queue selected",description:"Choose a queue to inspect retained messages."})}function Vy({message:r}){return n.jsxs("span",{className:"attribute-preview",children:[n.jsx("span",{className:"attribute-chip",children:r.body||"(empty body)"}),r.messageGroupId?n.jsxs("span",{className:"attribute-chip",children:["group: ",r.messageGroupId]}):null,r.sequenceNumber?n.jsxs("span",{className:"attribute-chip",children:["seq: ",r.sequenceNumber]}):null]})}function Ky({activeQueue:r,busyAction:i,sendBody:o,sendDelay:c,sendAttributesJSON:f,sendGroupId:p,sendDeduplicationId:y,onSubmit:j,setSendBody:b,setSendDelay:N,setSendAttributesJSON:k,setSendGroupId:S,setSendDeduplicationId:L}){return n.jsxs("form",{className:"pubsub-action-form stacked",onSubmit:j,children:[n.jsxs("label",{className:"compact-filter wide",children:[n.jsx("span",{children:"Message body"}),n.jsx("textarea",{"aria-label":"SQS message body",disabled:!r,onChange:E=>b(E.target.value),placeholder:"message body",rows:3,value:o})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Delay"}),n.jsx("input",{"aria-label":"SQS message delay seconds",disabled:!r,inputMode:"numeric",onChange:E=>N(E.target.value),value:c})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Attributes JSON"}),n.jsx("input",{"aria-label":"SQS message attributes JSON",disabled:!r,onChange:E=>k(E.target.value),placeholder:'{"kind":{"DataType":"String","StringValue":"test"}}',value:f})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Group"}),n.jsx("input",{"aria-label":"SQS FIFO message group ID",disabled:!r,onChange:E=>S(E.target.value),placeholder:"FIFO only",value:p})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Dedup"}),n.jsx("input",{"aria-label":"SQS FIFO message deduplication ID",disabled:!r,onChange:E=>L(E.target.value),placeholder:"optional",value:y})]}),n.jsx(ue,{disabled:!r||i==="send-message",type:"submit",children:"Send"})]})}function Hy({activeQueue:r,busyAction:i,receiveMaxMessages:o,receiveVisibilityTimeout:c,receiveWaitTime:f,receiveAttributeNames:p,receiveMessageAttributeNames:y,onSubmit:j,setReceiveMaxMessages:b,setReceiveVisibilityTimeout:N,setReceiveWaitTime:k,setReceiveAttributeNames:S,setReceiveMessageAttributeNames:L}){return n.jsxs("form",{className:"pubsub-action-form stacked",onSubmit:j,children:[n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Max"}),n.jsx("input",{"aria-label":"SQS receive max messages",disabled:!r,inputMode:"numeric",onChange:E=>b(E.target.value),value:o})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Visibility"}),n.jsx("input",{"aria-label":"SQS receive visibility timeout seconds",disabled:!r,inputMode:"numeric",onChange:E=>N(E.target.value),value:c})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Wait"}),n.jsx("input",{"aria-label":"SQS receive wait time seconds",disabled:!r,inputMode:"numeric",onChange:E=>k(E.target.value),value:f})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Attrs"}),n.jsx("input",{"aria-label":"SQS receive attribute names",disabled:!r,onChange:E=>S(E.target.value),placeholder:"All or comma-separated names",value:p})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Msg attrs"}),n.jsx("input",{"aria-label":"SQS receive message attribute names",disabled:!r,onChange:E=>L(E.target.value),placeholder:"All or comma-separated names",value:y})]}),n.jsx(ue,{disabled:!r||i==="receive-message",type:"submit",children:"Receive"})]})}function Jy({activeQueueName:r,onSelectQueue:i,queues:o}){return o.length===0?n.jsx(Q,{title:"No queues",description:"Queues created through the SQS API will appear here."}):n.jsx("div",{className:"dynamodb-table-list","aria-label":"SQS queues",children:o.map(c=>n.jsxs("button",{className:c.name===r?"dynamodb-table-row active":"dynamodb-table-row",onClick:()=>i(c.name),children:[n.jsxs("span",{className:"table-row-top",children:[n.jsx("span",{className:"table-row-name",children:c.name}),n.jsx("span",{className:"count-pill",children:c.totalRetainedMessages})]}),n.jsx("span",{className:"table-row-meta",children:c.url}),n.jsxs("span",{className:"table-row-tags",children:[n.jsxs("span",{children:[c.visibleMessages," visible"]}),n.jsxs("span",{children:[c.notVisibleMessages," in flight"]}),n.jsxs("span",{children:[c.delayedMessages," delayed"]})]})]},c.name))})}function Wy({messages:r,onSelectIndex:i,selectedIndex:o}){return r.length===0?null:n.jsx("div",{className:"dynamodb-item-table-wrap","aria-label":"Received SQS messages",children:n.jsxs("table",{className:"dynamodb-item-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Use"}),n.jsx("th",{scope:"col",children:"Message"}),n.jsx("th",{scope:"col",children:"Receipt handle"})]})}),n.jsx("tbody",{children:r.map((c,f)=>n.jsxs("tr",{className:f===o?"item-row active":"item-row",onClick:()=>i(f),children:[n.jsx("td",{children:f===o?"selected":"select"}),n.jsx("td",{children:n.jsxs("span",{className:"attribute-preview",children:[n.jsx("span",{className:"attribute-chip",children:c.Body||"(empty body)"}),n.jsx("span",{className:"attribute-chip",children:c.MessageId})]})}),n.jsx("td",{children:n.jsx("code",{children:Xc(c.ReceiptHandle)})})]},`${c.MessageId}-${f}`))})]})})}function Gy({detailState:r,message:i,queue:o,status:c}){var b;if(!o)return n.jsx(Q,{title:"Inspector",description:"Queue attributes and selected message JSON will appear here."});const f=r.status==="success"?r.leases:[],p=r.status==="success"?r.dlq:void 0,y=Ay(o.attributes.RedrivePolicy),j=zy(o.attributes.RedriveAllowPolicy);return n.jsxs("div",{className:"dynamodb-inspector",children:[n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Queue"}),n.jsx("h3",{children:o.name}),n.jsxs("dl",{className:"inspector-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"Endpoint"}),n.jsx("dd",{children:n.jsx("code",{children:(c==null?void 0:c.endpoint)??"unknown"})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Region"}),n.jsx("dd",{children:(c==null?void 0:c.region)??"unknown"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"ARN"}),n.jsx("dd",{children:n.jsx("code",{children:o.arn})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Visibility"}),n.jsxs("dd",{children:[o.attributes.VisibilityTimeout??"unknown","s"]})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Leases"}),n.jsx("dd",{children:f.length})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"DLQ sources"}),n.jsx("dd",{children:(p==null?void 0:p.deadLetterSourceQueues.map(N=>N.name).join(", "))||"none"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"DLQ target"}),n.jsx("dd",{children:((b=p==null?void 0:p.deadLetterQueue)==null?void 0:b.name)??(y==null?void 0:y.deadLetterTargetArn)??"none"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Redrive"}),n.jsxs("dd",{children:[y?`maxReceiveCount ${y.maxReceiveCount}`:"none",j?`, allow ${j.redrivePermission}`:""]})]})]})]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Selected message"}),i?n.jsx("pre",{className:"mail-preview",children:JSON.stringify(i,null,2)}):n.jsx("p",{className:"inspector-muted",children:"Select a message row to inspect JSON."})]})]})}function Yy({service:r}){const[i,o]=h.useState({status:"loading"}),[c,f]=h.useState({status:"idle"}),[p,y]=h.useState(),[j,b]=h.useState(0),[N,k]=h.useState(""),[S,L]=h.useState(""),[E,D]=h.useState(""),[T,U]=h.useState("standard"),[V,se]=h.useState("30"),[q,me]=h.useState("0"),[Se,Ce]=h.useState(""),[J,oe]=h.useState("0"),[be,De]=h.useState(""),[ie,z]=h.useState(""),[X,K]=h.useState(""),[ye,we]=h.useState("1"),[he,O]=h.useState("30"),[F,M]=h.useState("0"),[x,R]=h.useState("All"),[ae,ce]=h.useState("All"),[ve,A]=h.useState([]),[pe,ee]=h.useState(0),[ge,Pe]=h.useState(""),[_e,vt]=h.useState(""),[te,Ie]=h.useState("0"),[Ee,Be]=h.useState(""),[st,Lt]=h.useState(""),[dn,Xt]=h.useState(""),[$t,Ze]=h.useState(""),[Ft,wn]=h.useState(),[Vn,Pt]=h.useState(),at=(r==null?void 0:r.status)==="disabled",yt=h.useCallback(()=>{if(at){o({status:"success",statusPayload:Oy(r),queues:[]}),f({status:"idle"}),y(void 0);return}o({status:"loading"}),Promise.all([Ny(),ky()]).then(([je,{queues:Re}])=>{o({status:"success",statusPayload:je,queues:Re}),y(Me=>{var Nn;return Me&&Re.some(ms=>ms.name===Me)?Me:(Nn=Re[0])==null?void 0:Nn.name})}).catch(je=>{o({status:"error",message:je.message})})},[at,r]);h.useEffect(()=>{yt()},[yt]),cn({topics:["sqs"],onEvent:yt,enabled:!at});const ct=i.status==="success"?i.queues:[],Ae=ct.find(je=>je.name===p),gt=h.useCallback(()=>{if(!p||at){f({status:"idle"});return}f({status:"loading"}),Promise.all([Ey(p),Ly(p),$y(p)]).then(([je,Re,Me])=>{b(0),f({status:"success",messages:je.messages,leases:Re.leases,dlq:Me})}).catch(je=>{f({status:"error",message:je.message})})},[p,at]);h.useEffect(()=>{gt()},[gt]);const ds=h.useMemo(()=>{const je=N.trim().toLowerCase();return je===""?ct:ct.filter(Re=>Re.name.toLowerCase().includes(je))},[ct,N]),dt=h.useMemo(()=>{const je=c.status==="success"?c.messages:[],Re=S.trim().toLowerCase();return Re===""?je:je.filter(Me=>JSON.stringify(Me).toLowerCase().includes(Re))},[c,S]),Qt=dt[Math.min(j,Math.max(dt.length-1,0))],Ut=ve[Math.min(pe,Math.max(ve.length-1,0))],Ge=ge.trim()||(Ut==null?void 0:Ut.ReceiptHandle)||"";if(at)return n.jsx(Ne,{title:"SQS",children:n.jsx(Q,{title:"SQS is disabled",description:"Enable the SQS service in devcloud config to inspect queues and messages."})});function Zt(je){y(je),b(0),A([]),ee(0),Pe(""),vt(""),Be(""),Lt(""),L(""),Pt(void 0)}function en(je){if(je.preventDefault(),!!p){if(st!==p){Pt("Type the queue name to confirm purge confirmation");return}Pt(void 0),Py(p).then(()=>{Lt(""),yt(),gt()}).catch(Re=>{Pt(Re.message)})}}async function qt(je,Re){wn(je),Ze(""),Xt("");try{const Me=await Re();Xt(Me),yt(),gt()}catch(Me){Ze(Me instanceof Error?Me.message:"SQS operation failed")}finally{wn(void 0)}}function tn(je){je.preventDefault();const Re=E.trim();if(Re===""){Ze("Queue name is required");return}const Me=T==="fifo"&&!Re.endsWith(".fifo")?`${Re}.fifo`:Re;qt("create-queue",async()=>(await Cy({QueueName:Me,Attributes:_y({VisibilityTimeout:Lc(V),DelaySeconds:Lc(q),FifoQueue:T==="fifo"?"true":void 0,ContentBasedDeduplication:T==="fifo"?"true":void 0}),Tags:{source:"dashboard"}}),D(""),y(Me),`Created queue ${Me}`))}function nn(je){if(je.preventDefault(),!Ae){Ze("Queue is required");return}if(Se===""){Ze("Message body is required");return}const Re=By(be);if(Re instanceof Error){Ze(Re.message);return}qt("send-message",async()=>{const Me=await Iy(Ae.name,{MessageBody:Se,DelaySeconds:$c(J),MessageAttributes:Re,MessageGroupId:ie.trim()||void 0,MessageDeduplicationId:X.trim()||void 0});return Ce(""),De(""),`Sent message ${Me.MessageId}`})}function sn(je){if(je.preventDefault(),!Ae){Ze("Queue is required");return}qt("receive-message",async()=>{const Me=(await Ry(Ae.name,{MaxNumberOfMessages:$c(ye),VisibilityTimeout:Ia(he),WaitTimeSeconds:Ia(F),AttributeNames:Pc(x),MessageAttributeNames:Pc(ae)})).Messages??[];return A(Me),ee(0),Pe(""),vt(""),Me.length===1?"Received 1 message":`Received ${Me.length} messages`})}function fs(je){if(je.preventDefault(),!Ae){Ze("Queue is required");return}if(Ge===""){Ze("Receipt handle is required");return}if(_e!=="delete"){Ze("Type delete to confirm DeleteMessage");return}qt("delete-message",async()=>(await Dy(Ae.name,{ReceiptHandle:Ge}),A(Re=>Re.filter(Me=>Me.ReceiptHandle!==Ge)),ee(0),Pe(""),vt(""),Be(""),"Deleted message for the selected receipt handle"))}function ps(je){if(je.preventDefault(),!Ae){Ze("Queue is required");return}if(Ge===""){Ze("Receipt handle is required");return}if(Ee!=="visibility"){Ze("Type visibility to confirm ChangeMessageVisibility");return}const Re=Ia(te);if(typeof Re!="number"){Ze("Visibility timeout must be a non-negative number");return}qt("change-visibility",async()=>(await Ty(Ae.name,{ReceiptHandle:Ge,VisibilityTimeout:Re}),Be(""),`Changed visibility timeout to ${Re}s`))}return n.jsxs("div",{className:"dynamodb-workspace",children:[n.jsxs(Ne,{title:"Queues",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter SQS queues",onChange:je=>k(je.target.value),placeholder:"queue name",type:"search",value:N})]}),n.jsx(ue,{onClick:yt,children:"Refresh"})]}),n.jsx(My,{busyAction:Ft,newQueueDelay:q,newQueueKind:T,newQueueName:E,newQueueVisibility:V,onSubmit:tn,setNewQueueDelay:me,setNewQueueKind:U,setNewQueueName:D,setNewQueueVisibility:se}),i.status==="loading"?n.jsx(Q,{title:"Loading queues",description:"Reading local SQS queue metadata."}):null,i.status==="error"?n.jsx(Q,{title:"SQS queues unavailable",description:i.message,actionLabel:"Retry",onAction:yt}):null,i.status==="success"?n.jsx(Jy,{activeQueueName:p,onSelectQueue:Zt,queues:ds}):null]}),n.jsxs(Ne,{title:"Messages",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"toolbar-count",children:Ae?`${dt.length} shown / ${Ae.totalRetainedMessages} retained`:"Select a queue"}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter SQS messages",disabled:!Ae,onChange:je=>{b(0),L(je.target.value)},placeholder:"body or attribute",type:"search",value:S})]}),n.jsx(ue,{disabled:!Ae,onClick:gt,children:"Refresh"})]}),n.jsx(Ky,{activeQueue:!!Ae,busyAction:Ft,onSubmit:nn,sendAttributesJSON:be,sendBody:Se,sendDeduplicationId:X,sendDelay:J,sendGroupId:ie,setSendAttributesJSON:De,setSendBody:Ce,setSendDeduplicationId:K,setSendDelay:oe,setSendGroupId:z}),n.jsx(qy,{activeIndex:j,detailState:c,messages:dt,onSelectIndex:b,queueName:p}),n.jsx(Hy,{activeQueue:!!Ae,busyAction:Ft,onSubmit:sn,receiveAttributeNames:x,receiveMaxMessages:ye,receiveMessageAttributeNames:ae,receiveVisibilityTimeout:he,receiveWaitTime:F,setReceiveAttributeNames:R,setReceiveMaxMessages:we,setReceiveMessageAttributeNames:ce,setReceiveVisibilityTimeout:O,setReceiveWaitTime:M}),n.jsx(Wy,{messages:ve,onSelectIndex:ee,selectedIndex:pe})]}),n.jsxs(Ne,{title:"Inspector",children:[$t?n.jsx("p",{className:"operation-message error",children:$t}):null,dn?n.jsx("p",{className:"operation-message success",children:dn}):null,n.jsx(Fy,{activeQueue:Ae,busyAction:Ft,onSubmit:en,purgeConfirmation:st,setPurgeConfirmation:Lt}),Vn?n.jsx("p",{className:"inspector-muted",children:Vn}):null,n.jsx(Qy,{activeQueue:!!Ae,busyAction:Ft,onSubmit:ps,selectedReceiptHandle:Ge,setVisibilityConfirmation:Be,setVisibilityTimeout:Ie,visibilityConfirmation:Ee,visibilityTimeout:te}),n.jsx(Uy,{activeQueue:!!Ae,busyAction:Ft,deleteConfirmation:_e,onSubmit:fs,pastedReceiptHandle:ge,selectedReceiptHandle:Ge,selectedReceivedMessage:Ut,setDeleteConfirmation:vt,setPastedReceiptHandle:Pe}),n.jsx(Gy,{detailState:c,message:Qt,queue:Ae,status:i.status==="success"?i.statusPayload:void 0})]})]})}async function Xy(){return W("/api/pubsub/status")}async function Zy(){return W("/api/pubsub/topics")}async function eg(r){return W("/api/pubsub/topics",{method:"POST",body:{topicId:r}})}async function tg(){return W("/api/pubsub/subscriptions")}async function ng(r){return W("/api/pubsub/subscriptions",{method:"POST",body:r})}async function sg(r){return W(`/api/pubsub/topics/${encodeURIComponent(r.topicId)}/publish`,{method:"POST",body:{messages:[{data:r.data,attributes:r.attributes,orderingKey:r.orderingKey}]}})}async function rg(r,i){return W(`/api/pubsub/subscriptions/${encodeURIComponent(r)}/pull`,{method:"POST",body:{maxMessages:i}})}async function lg(r,i){await W(`/api/pubsub/subscriptions/${encodeURIComponent(r)}/ack`,{method:"POST",body:{ackIds:i}})}function ig({service:r}){const[i,o]=h.useState({status:"loading"}),[c,f]=h.useState(),[p,y]=h.useState(),[j,b]=h.useState(""),[N,k]=h.useState(""),[S,L]=h.useState(""),[E,D]=h.useState(""),[T,U]=h.useState(""),[V,se]=h.useState("10"),[q,me]=h.useState(""),[Se,Ce]=h.useState(""),[J,oe]=h.useState("1"),[be,De]=h.useState([]),[ie,z]=h.useState(""),[X,K]=h.useState(""),[ye,we]=h.useState(""),[he,O]=h.useState(),F=(r==null?void 0:r.status)==="disabled",M=h.useCallback(()=>{if(F){o({status:"success",statusPayload:mg(r),topics:[],subscriptions:[]}),y(void 0);return}o({status:"loading"}),Promise.all([Xy(),Zy(),tg()]).then(([te,Ie,Ee])=>{o({status:"success",statusPayload:te,topics:Ie.topics,subscriptions:Ee.subscriptions}),f(Be=>{var st;return Be&&Ie.topics.some(Lt=>Lt.name===Be)?Be:(st=Ie.topics[0])==null?void 0:st.name}),U(Be=>{var st;return Be||Et(((st=Ie.topics[0])==null?void 0:st.name)??"")}),y(Be=>{var st;return Be&&Ee.subscriptions.some(Lt=>Lt.name===Be)?Be:(st=Ee.subscriptions[0])==null?void 0:st.name})}).catch(te=>{o({status:"error",message:te.message})})},[F,r]);h.useEffect(()=>{M()},[M]),cn({topics:["pubsub"],onEvent:M,enabled:!F});const x=i.status==="success"?i.topics:[],R=i.status==="success"?i.subscriptions:[],ae=x.find(te=>te.name===c),ce=R.find(te=>te.name===p),ve=h.useMemo(()=>{const te=j.trim().toLowerCase();return te===""?x:x.filter(Ie=>Ie.name.toLowerCase().includes(te))},[x,j]),A=h.useMemo(()=>{const te=N.trim().toLowerCase();return te===""?R:R.filter(Ie=>JSON.stringify(Ie).toLowerCase().includes(te))},[R,N]);async function pe(te,Ie){O(te),we(""),K("");try{const Ee=await Ie();K(Ee),M()}catch(Ee){we(Ee instanceof Error?Ee.message:"Pub/Sub operation failed")}finally{O(void 0)}}function ee(te){te.preventDefault();const Ie=S.trim();if(Ie===""){we("Topic ID is required");return}pe("create-topic",async()=>{const Ee=await eg(Ie);return L(""),f(Ee.name),U(Et(Ee.name)),`Created topic ${Et(Ee.name)}`})}function ge(te){te.preventDefault();const Ie=E.trim(),Ee=T.trim()||Et((ae==null?void 0:ae.name)??"");if(Ie===""||Ee===""){we("Subscription ID and topic are required");return}pe("create-subscription",async()=>{const Be=await ng({subscriptionId:Ie,topicId:Ee,ackDeadlineSeconds:Number.parseInt(V,10)||void 0});return D(""),y(Be.name),`Created subscription ${Et(Be.name)}`})}function Pe(te){te.preventDefault();const Ie=Et((ae==null?void 0:ae.name)??"");if(Ie===""||q===""){we("Topic and message are required");return}pe("publish",async()=>{const Ee=await sg({topicId:Ie,data:cg(q),attributes:{source:"dashboard"},orderingKey:Se.trim()||void 0});return me(""),Ce(""),`Published ${Ee.messageIds.length} message`})}function _e(){const te=Et((ce==null?void 0:ce.name)??"");if(te===""){we("Subscription is required");return}pe("pull",async()=>{var Be;const Ee=(await rg(te,Number.parseInt(J,10)||1)).receivedMessages??[];return De(Ee),z(((Be=Ee[0])==null?void 0:Be.ackId)??""),`Pulled ${Ee.length} message`})}function vt(){const te=Et((ce==null?void 0:ce.name)??""),Ie=ie?[ie]:be.map(Ee=>Ee.ackId).filter(Boolean);if(te===""||Ie.length===0){we("Ack ID is required");return}pe("ack",async()=>(await lg(te,Ie),De(Ee=>Ee.filter(Be=>!Ie.includes(Be.ackId))),z(""),`Acknowledged ${Ie.length} message`))}return F?n.jsx(Ne,{title:"Pub/Sub",children:n.jsx(Q,{title:"Pub/Sub is disabled",description:"Enable the Pub/Sub service in devcloud config to inspect topics and subscriptions."})}):n.jsxs("div",{className:"dynamodb-workspace",children:[n.jsxs(Ne,{title:"Topics",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter Pub/Sub topics",onChange:te=>b(te.target.value),placeholder:"topic name",type:"search",value:j})]}),n.jsx(ue,{onClick:M,children:"Refresh"})]}),n.jsxs("form",{className:"pubsub-action-form",onSubmit:ee,children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Topic ID"}),n.jsx("input",{"aria-label":"New Pub/Sub topic ID",onChange:te=>L(te.target.value),placeholder:"orders",value:S})]}),n.jsx(ue,{disabled:he==="create-topic",type:"submit",children:"Create"})]}),i.status==="loading"?n.jsx(Q,{title:"Loading topics",description:"Reading local Pub/Sub resource metadata."}):null,i.status==="error"?n.jsx(Q,{title:"Pub/Sub unavailable",description:i.message,actionLabel:"Retry",onAction:M}):null,i.status==="success"?n.jsx(ag,{activeTopicName:c,onSelectTopic:f,topics:ve}):null,n.jsxs("form",{className:"pubsub-action-form stacked",onSubmit:Pe,children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Message"}),n.jsx("input",{"aria-label":"Pub/Sub publish message",disabled:!ae,onChange:te=>me(te.target.value),placeholder:"message body",value:q})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Ordering key"}),n.jsx("input",{"aria-label":"Pub/Sub publish ordering key",disabled:!ae,onChange:te=>Ce(te.target.value),placeholder:"optional",value:Se})]}),n.jsx(ue,{disabled:!ae||he==="publish",type:"submit",children:"Publish"})]})]}),n.jsxs(Ne,{title:"Subscriptions",children:[n.jsxs("div",{className:"dynamodb-toolbar",children:[n.jsx("span",{className:"toolbar-count",children:i.status==="success"?`${A.length} shown / ${R.length} subscriptions`:"Loading"}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Filter"}),n.jsx("input",{"aria-label":"Filter Pub/Sub subscriptions",onChange:te=>k(te.target.value),placeholder:"subscription or topic",type:"search",value:N})]})]}),n.jsxs("form",{className:"pubsub-action-form",onSubmit:ge,children:[n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Subscription ID"}),n.jsx("input",{"aria-label":"New Pub/Sub subscription ID",onChange:te=>D(te.target.value),placeholder:"orders-sub",value:E})]}),n.jsxs("label",{className:"compact-filter",children:[n.jsx("span",{children:"Topic"}),n.jsxs("select",{"aria-label":"Topic for new Pub/Sub subscription",onChange:te=>U(te.target.value),value:T,children:[n.jsx("option",{value:"",children:"Select topic"}),x.map(te=>n.jsx("option",{value:Et(te.name),children:Et(te.name)},te.name))]})]}),n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Ack deadline"}),n.jsx("input",{"aria-label":"New Pub/Sub subscription ack deadline seconds",inputMode:"numeric",onChange:te=>se(te.target.value),value:V})]}),n.jsx(ue,{disabled:he==="create-subscription",type:"submit",children:"Create"})]}),i.status==="success"?n.jsx(og,{activeSubscriptionName:p,onSelectSubscription:y,subscriptions:A}):null]}),n.jsxs(Ne,{title:"Inspector",children:[ye?n.jsx("p",{className:"operation-message error",children:ye}):null,X?n.jsx("p",{className:"operation-message success",children:X}):null,n.jsx(ug,{busyAction:he,onAck:vt,onPull:_e,pulledMessages:be,pullMaxMessages:J,selectedAckId:ie,setPullMaxMessages:oe,setSelectedAckId:z,status:i.status==="success"?i.statusPayload:void 0,subscription:ce,topicCount:x.length})]})]})}function ag({activeTopicName:r,onSelectTopic:i,topics:o}){return o.length===0?n.jsx(Q,{title:"No topics",description:"Topics created through Pub/Sub REST or SDK clients will appear here."}):n.jsx("div",{className:"dynamodb-table-list","aria-label":"Pub/Sub topics",children:o.map(c=>n.jsxs("button",{className:c.name===r?"dynamodb-table-row active":"dynamodb-table-row",onClick:()=>i(c.name),children:[n.jsxs("span",{className:"table-row-top",children:[n.jsx("span",{className:"table-row-name",children:Et(c.name)}),n.jsx("span",{className:"count-pill",children:c.subscriptionCount})]}),n.jsx("span",{className:"table-row-meta",children:c.name}),n.jsx("span",{className:"table-row-tags",children:n.jsxs("span",{children:[c.subscriptionCount," subscriptions"]})})]},c.name))})}function og({activeSubscriptionName:r,onSelectSubscription:i,subscriptions:o}){return o.length===0?n.jsx(Q,{title:"No subscriptions",description:"Subscriptions created through Pub/Sub REST or SDK clients will appear here."}):n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Subscription"}),n.jsx("th",{scope:"col",children:"Backlog"}),n.jsx("th",{scope:"col",children:"In flight"}),n.jsx("th",{scope:"col",children:"Attempts"})]})}),n.jsx("tbody",{children:o.map(c=>n.jsxs("tr",{className:c.name===r?"item-row active":"item-row",onClick:()=>i(c.name),children:[n.jsx("td",{children:n.jsxs("span",{className:"attribute-preview",children:[n.jsx("span",{className:"attribute-chip",children:Et(c.name)}),n.jsx("span",{className:"attribute-chip",children:Et(c.topic)})]})}),n.jsx("td",{children:c.backlogMessages}),n.jsx("td",{children:c.inFlightMessages}),n.jsx("td",{children:c.maxDeliveryAttemptSeen})]},c.name))})]})})}function ug({busyAction:r,onAck:i,onPull:o,pulledMessages:c,pullMaxMessages:f,selectedAckId:p,setPullMaxMessages:y,setSelectedAckId:j,status:b,subscription:N,topicCount:k}){return N?n.jsxs("div",{className:"dynamodb-inspector",children:[n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Service"}),n.jsx("h3",{children:Et(N.name)}),n.jsxs("dl",{className:"inspector-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"REST"}),n.jsx("dd",{children:n.jsx("code",{children:(b==null?void 0:b.restEndpoint)??"unknown"})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"gRPC"}),n.jsx("dd",{children:n.jsx("code",{children:(b==null?void 0:b.grpcEndpoint)??"unknown"})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Project"}),n.jsx("dd",{children:(b==null?void 0:b.project)??"unknown"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Topics"}),n.jsx("dd",{children:k})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Ack deadline"}),n.jsxs("dd",{children:[N.ackDeadlineSeconds,"s"]})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Retained"}),n.jsx("dd",{children:N.totalRetainedMessages})]})]})]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Actions"}),n.jsxs("div",{className:"pubsub-action-row",children:[n.jsxs("label",{className:"compact-filter small",children:[n.jsx("span",{children:"Pull max"}),n.jsx("input",{"aria-label":"Pub/Sub pull max messages",inputMode:"numeric",onChange:S=>y(S.target.value),value:f})]}),n.jsx(ue,{disabled:r==="pull",onClick:o,children:"Pull"}),n.jsx(ue,{disabled:c.length===0||r==="ack",onClick:i,children:"Ack"})]}),c.length>0?n.jsx("div",{className:"pulled-message-list",children:c.map(S=>n.jsxs("label",{className:"pulled-message",children:[n.jsx("input",{checked:p===S.ackId,name:"pubsub-ack-id",onChange:()=>j(S.ackId),type:"radio"}),n.jsxs("span",{children:[n.jsx("strong",{children:S.message.messageId??"pulled message"}),n.jsx("code",{children:dg(S.message.data??"")})]})]},S.ackId))}):null]}),n.jsxs("section",{children:[n.jsx("span",{className:"inspector-label",children:"Recent deliveries"}),N.recentDeliveries&&N.recentDeliveries.length>0?n.jsx(fg,{deliveries:N.recentDeliveries}):n.jsx("p",{className:"inspector-muted",children:"No retained delivery records for this subscription."})]})]}):n.jsx(Q,{title:"Inspector",description:"Subscription backlog, leases, and recent deliveries will appear here."})}function cg(r){return window.btoa(unescape(encodeURIComponent(r)))}function dg(r){if(r==="")return"";try{return decodeURIComponent(escape(window.atob(r)))}catch{return r}}function fg({deliveries:r}){return n.jsx("div",{className:"dynamodb-item-table-wrap",children:n.jsxs("table",{className:"dynamodb-item-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Message"}),n.jsx("th",{scope:"col",children:"State"}),n.jsx("th",{scope:"col",children:"Attempt"}),n.jsx("th",{scope:"col",children:"Ready"})]})}),n.jsx("tbody",{children:r.map(i=>n.jsxs("tr",{className:"item-row",children:[n.jsx("td",{children:n.jsxs("span",{className:"attribute-preview",children:[n.jsx("span",{className:"attribute-chip",children:i.messageId}),i.orderingKey?n.jsx("span",{className:"attribute-chip",children:i.orderingKey}):null]})}),n.jsx("td",{children:i.state}),n.jsx("td",{children:i.deliveryAttempt}),n.jsx("td",{children:pg(i)})]},`${i.messageId}-${i.deliveryAttempt}-${i.state}`))})]})})}function pg(r){return r.leaseDeadline?`lease until ${Ra(r.leaseDeadline)}`:r.nextDeliveryTime?`retry at ${Ra(r.nextDeliveryTime)}`:r.publishTime?`published ${Ra(r.publishTime)}`:"available"}function mg(r){return{service:"pubsub",status:"disabled",running:!1,grpcEndpoint:"127.0.0.1:8085",restEndpoint:(r==null?void 0:r.endpoint)??"http://127.0.0.1:8086",project:"devcloud",storagePath:(r==null?void 0:r.storagePath)??".devcloud/data/pubsub",topicCount:0,subscriptionCount:0}}function Et(r){return r.split("/").pop()??r}function Ra(r){const i=new Date(r);return Number.isNaN(i.getTime())?r:i.toLocaleString()}async function hg(){return W("/api/gcs/status")}async function yg(){return W("/api/gcs/buckets")}async function gg(r){return W("/api/gcs/buckets",{method:"POST",body:{name:r}})}async function xg(r){return us(`/api/gcs/buckets/${encodeURIComponent(r)}`,{method:"DELETE"})}async function Zc(r,i=""){const o=new URLSearchParams;i!==""&&o.set("prefix",i);const c=o.toString();return W(`/api/gcs/buckets/${encodeURIComponent(r)}/objects${c?`?${c}`:""}`)}async function jg(r,i){return W(`/api/gcs/buckets/${encodeURIComponent(r)}/objects/${encodeURIComponent(i)}`)}async function vg(r,i){return us(`/api/gcs/buckets/${encodeURIComponent(r)}/objects/${encodeURIComponent(i)}`,{method:"DELETE"})}async function bg(){return W("/api/gcs/upload-sessions")}async function Sg(r){return us(`/api/gcs/uploads/${encodeURIComponent(r)}`,{method:"DELETE"})}function wg({service:r}){const[i,o]=h.useState({status:"loading"}),[c,f]=h.useState({status:"idle"}),[p,y]=h.useState(),[j,b]=h.useState(),[N,k]=h.useState(""),[S,L]=h.useState(""),[E,D]=h.useState(),[T,U]=h.useState(0),V=(r==null?void 0:r.status)==="disabled",se=Dr(),q=h.useCallback(()=>{if(V){o({status:"success",statusPayload:Oc(r),buckets:[],sessions:[]}),f({status:"idle"}),y(void 0),b(void 0);return}o({status:"loading"}),Promise.all([hg(),yg(),bg()]).then(([K,ye,we])=>{o({status:"success",statusPayload:K,buckets:ye.buckets,sessions:we.sessions}),y(he=>{var O;return he&&ye.buckets.some(F=>F.name===he)?he:(O=ye.buckets[0])==null?void 0:O.name})}).catch(K=>{o({status:"error",message:K.message})})},[V,r]);h.useEffect(()=>{q()},[q]);const me=h.useCallback(K=>{q(),K.type.startsWith("gcs.object.")&&U(ye=>ye+1)},[q]);cn({topics:["gcs"],onEvent:me,enabled:!V}),h.useEffect(()=>{if(b(void 0),!p||V){f({status:"idle"});return}let K=!1;return f({status:"loading"}),Zc(p,N.trim()).then(({objects:ye})=>{K||f({status:"success",objects:ye})}).catch(ye=>{K||f({status:"error",message:ye.message})}),()=>{K=!0}},[p,V,N,T]);const Se=i.status==="success"?i.buckets:[],Ce=i.status==="success"?i.sessions:[],J=i.status==="success"?i.statusPayload:void 0;function oe(K){y(K),b(void 0)}function be(K){p&&jg(p,K.name).then(b).catch(ye=>D(ye.message))}function De(){const K=S.trim();!K||V||gg(K).then(()=>{L(""),D(`Created bucket ${K}`),q()}).catch(ye=>D(ye.message))}async function ie(K){V||!await se(bn({title:"Delete bucket",description:"All objects and metadata in this bucket will be removed. This cannot be undone.",target:K}))||xg(K).then(()=>{D(`Deleted bucket ${K}`),q()}).catch(we=>D(we.message))}async function z(K){!p||V||!await se(bn({title:"Delete object",description:"This object will be permanently removed from the bucket.",target:K.name}))||vg(p,K.name).then(()=>{D(`Deleted object ${K.gcsUri}`),b(void 0),k(we=>we),Rg(p,N,f)}).catch(we=>D(we.message))}async function X(K){V||!await se(bn({title:"Delete upload session",description:"In-progress upload state will be discarded.",target:K.id}))||Sg(K.id).then(()=>{D(`Deleted upload session ${K.id}`),q()}).catch(we=>D(we.message))}return V?n.jsxs(Ne,{title:"devcloud GCS",children:[n.jsx(Q,{title:"GCS is disabled",description:"Enable the GCS service in devcloud config to inspect local buckets and objects."}),n.jsx(Mc,{status:J??Oc(r)})]}):n.jsxs("div",{className:"gcs-workspace",children:[n.jsxs(Ne,{title:"devcloud GCS",children:[n.jsxs("div",{className:"s3-toolbar",children:[n.jsxs("span",{children:[Se.length," buckets"]}),n.jsx(ue,{onClick:q,children:"Refresh"})]}),i.status==="loading"?n.jsx(Q,{title:"Loading GCS",description:"Reading local GCS status."}):null,i.status==="error"?n.jsx(Q,{title:"GCS unavailable",description:i.message,actionLabel:"Retry",onAction:q}):null,i.status==="success"?n.jsxs("div",{className:"gcs-sidebar",children:[n.jsx(Mc,{status:i.statusPayload}),n.jsx(Ng,{bucketName:S,disabled:V,onChange:L,onCreate:De}),n.jsx(kg,{activeBucket:p,buckets:Se,disabled:V,onDeleteBucket:ie,onSelectBucket:oe})]}):null]}),n.jsx(Ne,{title:"Objects",children:n.jsx(Cg,{activeObjectName:j==null?void 0:j.name,bucketName:p,disabled:V,objectsState:c,onDeleteObject:z,onInspectObject:be,onPrefixChange:k,prefix:N})}),n.jsx(Ne,{title:"Inspector",children:n.jsx(Eg,{bucketName:p,object:j})}),n.jsx(Ne,{title:"Upload sessions",children:n.jsx(Ig,{disabled:V,onDeleteSession:X,sessions:Ce})}),E?n.jsx("p",{className:"inspector-muted gcs-message",children:E}):null]})}function Mc({status:r}){return n.jsxs("dl",{className:"inspector-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"Status"}),n.jsx("dd",{children:r.running?"running":"disabled"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Project"}),n.jsx("dd",{children:r.project})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Endpoint"}),n.jsx("dd",{children:n.jsx("code",{children:r.endpoint})})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"Upload sessions"}),n.jsx("dd",{children:n.jsx("code",{children:r.uploadSessionPath})})]})]})}function Ng({bucketName:r,disabled:i,onChange:o,onCreate:c}){return n.jsxs("div",{className:"gcs-create-bucket",children:[n.jsxs("label",{className:"prefix-filter",children:[n.jsx("span",{children:"Create bucket"}),n.jsx("input",{"aria-label":"GCS bucket name",disabled:i,onChange:f=>o(f.target.value),placeholder:"local-bucket",value:r})]}),n.jsx(ue,{disabled:i||r.trim()==="",onClick:c,children:"Create"})]})}function kg({activeBucket:r,buckets:i,disabled:o,onDeleteBucket:c,onSelectBucket:f}){return i.length===0?n.jsx(Q,{title:"No buckets",description:"Buckets created through the GCS API will appear here."}):n.jsx("div",{className:"bucket-list",children:i.map(p=>n.jsxs("div",{className:p.name===r?"bucket-item active gcs-bucket-row":"bucket-item gcs-bucket-row",children:[n.jsxs("button",{className:"object-select",onClick:()=>f(p.name),children:[n.jsx("span",{className:"bucket-name",children:p.name}),n.jsx("span",{className:"bucket-meta",children:p.gcsUri}),n.jsxs("span",{className:"bucket-meta",children:["Created ",_a(p.timeCreated)]})]}),n.jsx("span",{className:"count-pill",children:p.objectCount}),n.jsx(ue,{className:"danger",disabled:o,onClick:()=>c(p.name),children:"Delete bucket"})]},p.name))})}function Cg({activeObjectName:r,bucketName:i,disabled:o,objectsState:c,onDeleteObject:f,onInspectObject:p,onPrefixChange:y,prefix:j}){return i?n.jsxs("div",{className:"object-browser",children:[n.jsxs("label",{className:"prefix-filter",children:[n.jsx("span",{children:"Prefix"}),n.jsx("input",{"aria-label":"Filter GCS objects by prefix",onChange:b=>y(b.target.value),placeholder:"docs/",type:"search",value:j})]}),c.status==="loading"?n.jsx(Q,{title:"Loading objects",description:`Reading objects in ${i}.`}):null,c.status==="error"?n.jsx(Q,{title:"Objects unavailable",description:c.message}):null,c.status==="success"&&c.objects.length===0?n.jsx(Q,{title:"No objects",description:`No objects in ${i} match the current prefix.`}):null,c.status==="success"&&c.objects.length>0?n.jsx("div",{className:"object-table-wrap",children:n.jsxs("table",{className:"object-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Name"}),n.jsx("th",{scope:"col",children:"Size"}),n.jsx("th",{scope:"col",children:"Updated"}),n.jsx("th",{scope:"col",children:"Class"}),n.jsx("th",{scope:"col",children:"Actions"})]})}),n.jsx("tbody",{children:c.objects.map(b=>n.jsxs("tr",{className:b.name===r?"object-row active":"object-row",children:[n.jsxs("td",{children:[n.jsx("button",{className:"object-select",onClick:()=>p(b),children:n.jsx("span",{className:"object-key",children:b.name})}),n.jsx("code",{children:b.gcsUri})]}),n.jsx("td",{children:ed(b.size)}),n.jsx("td",{children:_a(b.updated)}),n.jsx("td",{children:b.storageClass||"STANDARD"}),n.jsxs("td",{children:[n.jsx("a",{className:"object-action",href:td(b.downloadUrl),children:"Download"}),n.jsx(ue,{className:"danger",disabled:o,onClick:()=>f(b),children:"Delete object"})]})]},b.name))})]})}):null]}):n.jsx(Q,{title:"Select a bucket",description:"Choose a bucket to browse objects and metadata."})}function Eg({bucketName:r,object:i}){if(!i)return n.jsx(Q,{title:"Inspector",description:r?`Select an object in ${r} to inspect GCS metadata.`:"Object metadata, generation, and download links will appear here."});const o=Object.entries(i.metadata??{});return n.jsxs("div",{className:"object-inspector",children:[n.jsxs("div",{children:[n.jsx("span",{className:"inspector-label",children:"gs:// URI"}),n.jsx("code",{children:i.gcsUri})]}),n.jsxs("dl",{className:"inspector-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:"generation"}),n.jsx("dd",{children:i.generation})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"metageneration"}),n.jsx("dd",{children:i.metageneration})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"storageClass"}),n.jsx("dd",{children:i.storageClass||"STANDARD"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"crc32c"}),n.jsx("dd",{children:i.crc32c||"unknown"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"contentType"}),n.jsx("dd",{children:i.contentType||"application/octet-stream"})]}),n.jsxs("div",{children:[n.jsx("dt",{children:"ETag"}),n.jsx("dd",{children:n.jsx("code",{children:i.etag||"unknown"})})]})]}),n.jsxs("div",{children:[n.jsx("span",{className:"inspector-label",children:"metadata"}),o.length===0?n.jsx("p",{className:"inspector-muted",children:"No user metadata."}):n.jsx("dl",{className:"metadata-list",children:o.map(([c,f])=>n.jsxs("div",{children:[n.jsx("dt",{children:c}),n.jsx("dd",{children:f})]},c))})]}),n.jsx("a",{className:"compat-link inspector-download",href:td(i.downloadUrl),children:"Download object"})]})}function Ig({disabled:r,onDeleteSession:i,sessions:o}){return o.length===0?n.jsx(Q,{title:"No upload sessions",description:"Active resumable upload sessions will appear here."}):n.jsx("div",{className:"object-table-wrap",children:n.jsxs("table",{className:"object-table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{scope:"col",children:"Session"}),n.jsx("th",{scope:"col",children:"Object"}),n.jsx("th",{scope:"col",children:"Received"}),n.jsx("th",{scope:"col",children:"Created"}),n.jsx("th",{scope:"col",children:"Action"})]})}),n.jsx("tbody",{children:o.map(c=>n.jsxs("tr",{children:[n.jsx("td",{children:n.jsx("code",{children:c.id})}),n.jsxs("td",{children:[n.jsx("span",{className:"object-key",children:c.name}),n.jsx("code",{children:`gs://${c.bucket}/${c.name}`})]}),n.jsx("td",{children:ed(c.receivedBytes)}),n.jsx("td",{children:_a(c.createdAt)}),n.jsx("td",{children:n.jsx(ue,{className:"danger",disabled:r,onClick:()=>i(c),children:"Delete session"})})]},c.id))})]})})}function Rg(r,i,o){o({status:"loading"}),Zc(r,i.trim()).then(({objects:c})=>o({status:"success",objects:c})).catch(c=>o({status:"error",message:c.message}))}function Oc(r){return{status:"disabled",running:!1,endpoint:(r==null?void 0:r.endpoint)??"http://127.0.0.1:4443",project:"devcloud",storagePath:(r==null?void 0:r.storagePath)??".devcloud/data/s3",uploadSessionPath:".devcloud/data/gcs/upload_sessions"}}function ed(r){if(!Number.isFinite(r)||r<0)return"unknown";if(r<1024)return`${r} B`;const i=["KB","MB","GB","TB"];let o=r/1024,c=0;for(;o>=1024&&c=10?0:1)} ${i[c]}`}function _a(r){const i=new Date(r);return Number.isNaN(i.getTime())?r||"unknown":i.toLocaleString()}function td(r){return r.startsWith("/api/gcs/")?r:"#"}function Dg({services:r,path:i}){return i==="/mail"?n.jsx(Dp,{service:r.find(o=>o.id==="mail")}):i==="/s3"?n.jsx(Sm,{service:r.find(o=>o.id==="s3")}):i==="/gcs"?n.jsx(wg,{service:r.find(o=>o.id==="gcs")}):i==="/dynamodb"?n.jsx(mh,{service:r.find(o=>o.id==="dynamodb")}):i==="/bigquery"?n.jsx(zh,{service:r.find(o=>o.id==="bigquery")}):i==="/redshift"?n.jsx(Kh,{service:r.find(o=>o.id==="redshift")}):i==="/redis"?n.jsx(ly,{service:r.find(o=>o.id==="redis")}):i==="/sqs"?n.jsx(Yy,{service:r.find(o=>o.id==="sqs")}):i==="/pubsub"?n.jsx(ig,{service:r.find(o=>o.id==="pubsub")}):n.jsx(yp,{services:r})}function Tg({services:r}){const i=Ir(window.location.pathname);return n.jsxs("nav",{className:"service-switcher","aria-label":"Services",children:[n.jsx("a",{"aria-current":i==="/"?"page":void 0,className:i==="/"?"active":void 0,href:Al("/"),children:"Services"}),r.map(o=>n.jsxs("a",{"aria-current":i===Ir(o.path)?"page":void 0,"aria-label":`${o.name}: ${o.status}`,className:i===Ir(o.path)?"active":void 0,href:Al(o.path),children:[n.jsx("span",{children:o.name}),n.jsxs("span",{className:`switcher-status ${Lg(o.status)}`,children:[n.jsx("span",{className:"status-dot"}),o.status]})]},o.id))]})}function Lg(r){return r==="running"?"running":"disabled"}function $g({services:r}){const i=r.filter(f=>f.status==="running").length,o=`${i}/${r.length} running`,c=r.length>0&&i===r.length?"running":"attention";return n.jsxs("div",{className:`status-pill ${c}`,"aria-label":`Service status: ${o}`,children:[n.jsx("span",{className:"status-dot"}),o]})}function Pg({services:r}){const i=Ir(window.location.pathname),o=r.find(p=>p.path===i),[c,f]=h.useState(()=>up());return h.useEffect(()=>cp(f),[]),n.jsxs("footer",{className:"activity-footer",children:[n.jsxs("span",{children:["Last request: ",(c==null?void 0:c.path)??"/api/dashboard/services"]}),n.jsxs("span",{children:["Active: ",(o==null?void 0:o.name)??"Service index"]}),n.jsxs("span",{children:["API status: ",n.jsx(Mg,{activity:c,fallback:(o==null?void 0:o.status)??"running"})]}),n.jsxs("span",{children:["Storage: ",(o==null?void 0:o.storagePath)??"registry"]})]})}function Mg({activity:r,fallback:i}){if(!r)return n.jsx("span",{children:i});const o=r.status==="success"&&r.statusCode?`${r.status} ${r.statusCode}`:r.status;return n.jsx("span",{className:`activity-status ${r.status}`,title:r.message,children:o})}function Og({notifications:r}){const{permission:i,enabled:o,setEnabled:c,requestPermission:f}=r;return i==="unsupported"?null:i==="default"?n.jsx(ue,{className:"notifications-toggle",onClick:()=>{f()},title:"Show desktop notifications when local services emit events",children:"Enable notifications"}):i==="denied"?n.jsx(ue,{className:"notifications-toggle is-disabled",disabled:!0,title:"Notifications are blocked. Allow them in your browser site settings to enable.",children:"Notifications blocked"}):n.jsx(ue,{"aria-pressed":o,className:o?"notifications-toggle is-on":"notifications-toggle",onClick:()=>c(!o),title:o?"Click to mute desktop notifications":"Click to enable desktop notifications",children:o?"Notifications: on":"Notifications: off"})}const nd="devcloud.notifications.enabled";function _c(){return typeof window>"u"||typeof Notification>"u"?"unsupported":Notification.permission}function _g(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(nd)==="1"}catch{return!1}}function Bg(r){if(!(typeof window>"u"))try{window.localStorage.setItem(nd,r?"1":"0")}catch{}}function Ag(){const[r,i]=h.useState(()=>_c()),[o,c]=h.useState(()=>_g()),f=h.useCallback(y=>{c(y),Bg(y)},[]),p=h.useCallback(async()=>{if(typeof Notification>"u")return"unsupported";try{const j=await Notification.requestPermission();return i(j),j==="granted"&&f(!0),j}catch{return _c()}},[f]);return{permission:r,enabled:o,setEnabled:f,requestPermission:p}}const zg={mail:"Mail",s3:"S3",gcs:"GCS",redis:"Redis",dynamodb:"DynamoDB",bigquery:"BigQuery",sqs:"SQS",pubsub:"Pub/Sub",redshift:"Redshift"};function Fg(r){return zg[r]??r}function Qs(r,i){const o=r==null?void 0:r[i];if(typeof o=="string")return o;if(typeof o=="number"&&Number.isFinite(o))return String(o)}function sd(r,i){const o=r==null?void 0:r[i];return Array.isArray(o)?o.filter(c=>typeof c=="string"):[]}function rd(r){return r.map(i=>Sn(i)).filter(i=>i.length>0).join(", ")}function Qg(r){if(r===void 0)return;const i=Number(r);if(!(!Number.isFinite(i)||i<0))return i<1024?`${i} B`:i<1024*1024?`${(i/1024).toFixed(1)} KB`:i<1024*1024*1024?`${(i/1024/1024).toFixed(1)} MB`:`${(i/1024/1024/1024).toFixed(2)} GB`}const Ug=180;function qg(r){return r.replace(/<(script|style)[\s\S]*?<\/\1>/gi," ").replace(/<[^>]+>/g," ").replace(/ /gi," ").replace(/&/gi,"&").replace(/</gi,"<").replace(/>/gi,">").replace(/"/gi,'"').replace(/'/gi,"'").replace(/\s+/g," ").trim()}function Vg(r,i){const o=r.replace(/\r/g,"").replace(/\n{3,}/g,` -`).trim();return o.length<=i?o:`${o.slice(0,i).trimEnd()}…`}function nd(r){const i=Qs(r.payload,"from")??"(unknown sender)",o=Qs(r.payload,"subject")??"",c=Sn(i)||i,f=td(ed(r.payload,"to")),p=cs(o).trim()||"(no subject)",y=Qs(r.payload,"messageID"),v=[`From: ${c}`];return f&&v.push(`To: ${f}`),{title:p,body:v.join(` -`),tag:`mail.received:${y??p}`}}async function Ug(r){var c,f;if(typeof Notification>"u")return;const i=Qs(r.payload,"messageID");let o=nd(r);if(i)try{const p=await bp(i),y=cs(p.subject??"").trim()||"(no subject)",v=((c=p.from)==null?void 0:c.trim())||Qs(r.payload,"from")||"(unknown sender)",b=Sn(v)||v,N=td(p.to??ed(r.payload,"to")),C=((f=p.textBody)==null?void 0:f.trim())||Fg(p.htmlBody??""),w=C?Qg(C,zg):"",L=N?`From: ${b} -To: ${N}`:`From: ${b}`;o={title:y,body:w?`${L} +`).trim();return o.length<=i?o:`${o.slice(0,i).trimEnd()}…`}function ld(r){const i=Qs(r.payload,"from")??"(unknown sender)",o=Qs(r.payload,"subject")??"",c=Sn(i)||i,f=rd(sd(r.payload,"to")),p=cs(o).trim()||"(no subject)",y=Qs(r.payload,"messageID"),j=[`From: ${c}`];return f&&j.push(`To: ${f}`),{title:p,body:j.join(` +`),tag:`mail.received:${y??p}`}}async function Kg(r){var c,f;if(typeof Notification>"u")return;const i=Qs(r.payload,"messageID");let o=ld(r);if(i)try{const p=await Np(i),y=cs(p.subject??"").trim()||"(no subject)",j=((c=p.from)==null?void 0:c.trim())||Qs(r.payload,"from")||"(unknown sender)",b=Sn(j)||j,N=rd(p.to??sd(r.payload,"to")),k=((f=p.textBody)==null?void 0:f.trim())||qg(p.htmlBody??""),S=k?Vg(k,Ug):"",L=N?`From: ${b} +To: ${N}`:`From: ${b}`;o={title:y,body:S?`${L} -${w}`:L,tag:`mail.received:${i}`}}catch{}try{new Notification(o.title,{body:o.body,tag:o.tag})}catch{}}function qg(r){const i=r.payload,o=f=>Qs(i,f),c=Bg(r.service);switch(r.type){case"mail.received":return nd(r);case"mail.deleted":return{title:"Mail message deleted",body:"A message was removed from the inbox.",tag:`mail.deleted:${o("messageID")??r.timestamp}`};case"mail.cleared":return{title:"Mail inbox cleared",body:"All messages were removed.",tag:"mail.cleared"};case"s3.object.put":case"gcs.object.put":{const f=o("bucket")??"?",p=o("key")??"?",y=Ag(o("contentLength")),v=y?`${f}/${p} -${y}`:`${f}/${p}`;return{title:`${c} object uploaded`,body:v,tag:`${r.type}:${f}/${p}`}}case"s3.object.deleted":case"gcs.object.deleted":{const f=o("bucket")??"?",p=o("key")??"?";return{title:`${c} object deleted`,body:`${f}/${p}`,tag:`${r.type}:${f}/${p}`}}case"s3.bucket.created":case"gcs.bucket.created":{const f=o("bucket")??"?";return{title:`${c} bucket created`,body:f,tag:`${r.type}:${f}`}}case"s3.bucket.deleted":case"gcs.bucket.deleted":{const f=o("bucket")??"?";return{title:`${c} bucket deleted`,body:f,tag:`${r.type}:${f}`}}case"dynamodb.table.created":case"dynamodb.table.deleted":{const f=o("table")??"?";return{title:`DynamoDB table ${r.type.endsWith(".created")?"created":"deleted"}`,body:f,tag:`${r.type}:${f}`}}case"dynamodb.item.put":case"dynamodb.item.updated":case"dynamodb.item.deleted":{const f=o("table")??"?";return{title:`DynamoDB item ${r.type.split(".").pop()??"changed"}`,body:`Table: ${f}`,tag:`${r.type}:${f}`}}case"bigquery.dataset.created":case"bigquery.dataset.deleted":{const f=o("project")??"?",p=o("dataset")??"?";return{title:`BigQuery dataset ${r.type.endsWith(".created")?"created":"deleted"}`,body:`${f}.${p}`,tag:`${r.type}:${f}.${p}`}}case"bigquery.table.created":case"bigquery.table.deleted":{const f=o("project")??"?",p=o("dataset")??"?",y=o("table")??"?";return{title:`BigQuery table ${r.type.endsWith(".created")?"created":"deleted"}`,body:`${f}.${p}.${y}`,tag:`${r.type}:${f}.${p}.${y}`}}case"bigquery.job.inserted":{const f=o("project")??"?",p=o("jobType")??"job";return{title:`BigQuery ${p} job started`,body:`Project: ${f}`,tag:`bigquery.job.inserted:${f}:${p}:${r.timestamp}`}}case"sqs.message.sent":case"sqs.message.deleted":{const f=o("queue")??"?",p=o("count"),y=r.type.endsWith(".sent")?"sent":"deleted",v=p?`Queue: ${f} (${p} message${p==="1"?"":"s"})`:`Queue: ${f}`;return{title:`SQS message ${y}`,body:v,tag:`${r.type}:${f}:${r.timestamp}`}}case"pubsub.topic.created":case"pubsub.topic.deleted":{const f=o("topic")??"?";return{title:`Pub/Sub topic ${r.type.endsWith(".created")?"created":"deleted"}`,body:f,tag:`${r.type}:${f}`}}case"pubsub.subscription.created":{const f=o("subscription")??"?",p=o("topic")??"?";return{title:"Pub/Sub subscription created",body:`${f} -on topic ${p}`,tag:`${r.type}:${f}`}}case"pubsub.message.published":{const f=o("topic")??"?",p=o("count")??"1";return{title:"Pub/Sub message published",body:`${p} message${p==="1"?"":"s"} → ${f}`,tag:`${r.type}:${f}:${r.timestamp}`}}case"pubsub.message.pulled":{const f=o("subscription")??"?";return{title:"Pub/Sub messages pulled",body:`${o("count")??"0"} from ${f}`,tag:`${r.type}:${f}:${r.timestamp}`}}case"redshift.statement.executed":case"redshift.statement.batch_executed":{const f=o("statementID")??"?";return{title:`Redshift ${(r.type.endsWith(".batch_executed")?"Batch statement":"Statement").toLowerCase()} executed`,body:`ID: ${f}`,tag:`${r.type}:${f}`}}case"redis.command.mutation":{const f=o("command")??"?",p=o("key");return{title:`Redis ${f}`,body:p?`Key: ${p}`:"Mutation executed",tag:`redis.command.mutation:${f}:${p??""}:${r.timestamp}`}}default:return{title:`${c} event`,body:r.type,tag:`${r.type}:${r.timestamp}`}}}function Vg({enabled:r,permission:i,suppressWhileVisible:o=!1}){const c=r&&i==="granted",f=h.useCallback(p=>{if(typeof Notification>"u"||o&&typeof document<"u"&&document.visibilityState==="visible")return;if(p.type==="mail.received"){Ug(p);return}const y=qg(p);if(y)try{new Notification(y.title,{body:y.body,tag:y.tag})}catch{}},[o]);cn({topics:[],onEvent:f,enabled:c})}function Kg({services:r,children:i}){const o=Og();return Vg({enabled:o.enabled,permission:o.permission}),n.jsxs("div",{className:"app-shell",children:[n.jsxs("header",{className:"top-bar",children:[n.jsxs("div",{className:"brand-block",children:[n.jsx("a",{className:"brand-title",href:Al("/"),children:"devcloud"}),n.jsx(Dg,{services:r})]}),n.jsxs("div",{className:"top-actions",children:[n.jsx($g,{notifications:o}),n.jsx(Ig,{services:r}),n.jsx(ue,{onClick:()=>window.location.reload(),children:"Refresh"})]})]}),n.jsx("main",{className:"service-surface",children:i}),n.jsx(Tg,{services:r})]})}class Hg extends h.Component{constructor(){super(...arguments);as(this,"state",{})}static getDerivedStateFromError(o){return{error:o}}render(){return this.state.error?n.jsx(Q,{title:"Dashboard request failed",description:this.state.error.message,actionLabel:"Retry",onAction:()=>{fp(),this.setState({error:void 0})}}):this.props.children}}function Jg(){const{services:r}=dp(),i=Ir(window.location.pathname);return n.jsx(Kg,{services:r,children:Eg({services:r,path:i})})}function Wg(){return n.jsx(Hg,{children:n.jsx(h.Suspense,{fallback:n.jsx(Q,{title:"Loading dashboard",description:"Checking local service status."}),children:n.jsx(mp,{children:n.jsx(Jg,{})})})})}lp.createRoot(document.getElementById("root")).render(n.jsx(Xf.StrictMode,{children:n.jsx(Wg,{})})); +${S}`:L,tag:`mail.received:${i}`}}catch{}try{new Notification(o.title,{body:o.body,tag:o.tag})}catch{}}function Hg(r){const i=r.payload,o=f=>Qs(i,f),c=Fg(r.service);switch(r.type){case"mail.received":return ld(r);case"mail.deleted":return{title:"Mail message deleted",body:"A message was removed from the inbox.",tag:`mail.deleted:${o("messageID")??r.timestamp}`};case"mail.cleared":return{title:"Mail inbox cleared",body:"All messages were removed.",tag:"mail.cleared"};case"s3.object.put":case"gcs.object.put":{const f=o("bucket")??"?",p=o("key")??"?",y=Qg(o("contentLength")),j=y?`${f}/${p} +${y}`:`${f}/${p}`;return{title:`${c} object uploaded`,body:j,tag:`${r.type}:${f}/${p}`}}case"s3.object.deleted":case"gcs.object.deleted":{const f=o("bucket")??"?",p=o("key")??"?";return{title:`${c} object deleted`,body:`${f}/${p}`,tag:`${r.type}:${f}/${p}`}}case"s3.bucket.created":case"gcs.bucket.created":{const f=o("bucket")??"?";return{title:`${c} bucket created`,body:f,tag:`${r.type}:${f}`}}case"s3.bucket.deleted":case"gcs.bucket.deleted":{const f=o("bucket")??"?";return{title:`${c} bucket deleted`,body:f,tag:`${r.type}:${f}`}}case"dynamodb.table.created":case"dynamodb.table.deleted":{const f=o("table")??"?";return{title:`DynamoDB table ${r.type.endsWith(".created")?"created":"deleted"}`,body:f,tag:`${r.type}:${f}`}}case"dynamodb.item.put":case"dynamodb.item.updated":case"dynamodb.item.deleted":{const f=o("table")??"?";return{title:`DynamoDB item ${r.type.split(".").pop()??"changed"}`,body:`Table: ${f}`,tag:`${r.type}:${f}`}}case"bigquery.dataset.created":case"bigquery.dataset.deleted":{const f=o("project")??"?",p=o("dataset")??"?";return{title:`BigQuery dataset ${r.type.endsWith(".created")?"created":"deleted"}`,body:`${f}.${p}`,tag:`${r.type}:${f}.${p}`}}case"bigquery.table.created":case"bigquery.table.deleted":{const f=o("project")??"?",p=o("dataset")??"?",y=o("table")??"?";return{title:`BigQuery table ${r.type.endsWith(".created")?"created":"deleted"}`,body:`${f}.${p}.${y}`,tag:`${r.type}:${f}.${p}.${y}`}}case"bigquery.job.inserted":{const f=o("project")??"?",p=o("jobType")??"job";return{title:`BigQuery ${p} job started`,body:`Project: ${f}`,tag:`bigquery.job.inserted:${f}:${p}:${r.timestamp}`}}case"sqs.message.sent":case"sqs.message.deleted":{const f=o("queue")??"?",p=o("count"),y=r.type.endsWith(".sent")?"sent":"deleted",j=p?`Queue: ${f} (${p} message${p==="1"?"":"s"})`:`Queue: ${f}`;return{title:`SQS message ${y}`,body:j,tag:`${r.type}:${f}:${r.timestamp}`}}case"pubsub.topic.created":case"pubsub.topic.deleted":{const f=o("topic")??"?";return{title:`Pub/Sub topic ${r.type.endsWith(".created")?"created":"deleted"}`,body:f,tag:`${r.type}:${f}`}}case"pubsub.subscription.created":{const f=o("subscription")??"?",p=o("topic")??"?";return{title:"Pub/Sub subscription created",body:`${f} +on topic ${p}`,tag:`${r.type}:${f}`}}case"pubsub.message.published":{const f=o("topic")??"?",p=o("count")??"1";return{title:"Pub/Sub message published",body:`${p} message${p==="1"?"":"s"} → ${f}`,tag:`${r.type}:${f}:${r.timestamp}`}}case"pubsub.message.pulled":{const f=o("subscription")??"?";return{title:"Pub/Sub messages pulled",body:`${o("count")??"0"} from ${f}`,tag:`${r.type}:${f}:${r.timestamp}`}}case"redshift.statement.executed":case"redshift.statement.batch_executed":{const f=o("statementID")??"?";return{title:`Redshift ${(r.type.endsWith(".batch_executed")?"Batch statement":"Statement").toLowerCase()} executed`,body:`ID: ${f}`,tag:`${r.type}:${f}`}}case"redis.command.mutation":{const f=o("command")??"?",p=o("key");return{title:`Redis ${f}`,body:p?`Key: ${p}`:"Mutation executed",tag:`redis.command.mutation:${f}:${p??""}:${r.timestamp}`}}default:return{title:`${c} event`,body:r.type,tag:`${r.type}:${r.timestamp}`}}}function Jg({enabled:r,permission:i,suppressWhileVisible:o=!1}){const c=r&&i==="granted",f=h.useCallback(p=>{if(typeof Notification>"u"||o&&typeof document<"u"&&document.visibilityState==="visible")return;if(p.type==="mail.received"){Kg(p);return}const y=Hg(p);if(y)try{new Notification(y.title,{body:y.body,tag:y.tag})}catch{}},[o]);cn({topics:[],onEvent:f,enabled:c})}function Wg({services:r,children:i}){const o=Ag();return Jg({enabled:o.enabled,permission:o.permission}),n.jsxs("div",{className:"app-shell",children:[n.jsxs("header",{className:"top-bar",children:[n.jsxs("div",{className:"brand-block",children:[n.jsx("a",{className:"brand-title",href:Al("/"),children:"devcloud"}),n.jsx($g,{services:r})]}),n.jsxs("div",{className:"top-actions",children:[n.jsx(Og,{notifications:o}),n.jsx(Tg,{services:r}),n.jsx(ue,{onClick:()=>window.location.reload(),children:"Refresh"})]})]}),n.jsx("main",{className:"service-surface",children:i}),n.jsx(Pg,{services:r})]})}class Gg extends h.Component{constructor(){super(...arguments);as(this,"state",{})}static getDerivedStateFromError(o){return{error:o}}render(){return this.state.error?n.jsx(Q,{title:"Dashboard request failed",description:this.state.error.message,actionLabel:"Retry",onAction:()=>{hp(),this.setState({error:void 0})}}):this.props.children}}function Yg(){const{services:r}=mp(),i=Ir(window.location.pathname);return n.jsx(Wg,{services:r,children:Dg({services:r,path:i})})}function Xg(){return n.jsx(Gg,{children:n.jsx(h.Suspense,{fallback:n.jsx(Q,{title:"Loading dashboard",description:"Checking local service status."}),children:n.jsx(gp,{children:n.jsx(Yg,{})})})})}op.createRoot(document.getElementById("root")).render(n.jsx(tp.StrictMode,{children:n.jsx(Xg,{})})); diff --git a/internal/dashboard/assets/react/assets/index-DNopBGB_.css b/internal/dashboard/assets/react/assets/index-DNopBGB_.css new file mode 100644 index 0000000..ed43e61 --- /dev/null +++ b/internal/dashboard/assets/react/assets/index-DNopBGB_.css @@ -0,0 +1 @@ +:root{color-scheme:light;--surface-base: #f7f8f5;--surface-panel: #ffffff;--surface-panel-muted: #fbfcf9;--surface-subtle: #eef1ec;--surface-active: #f3faf6;--surface-overlay: rgba(255, 255, 255, .86);--surface-scrim: rgba(16, 21, 17, .32);--surface-success-soft: #ddefe7;--surface-warning-soft: #f4ece2;--surface-error-soft: #f8e7e3;--surface-danger-soft: #fff8f6;--surface-segment-active: #e7f3ec;--text-primary: #1d211c;--text-secondary: #5f675d;--border-default: #d9ded5;--border-active: #9fb6a7;--border-empty: #c8d1c2;--border-danger: #e3b8b3;--border-danger-soft: #e0b4ab;--accent-primary: #176b4d;--accent-object: #245b8f;--accent-warning: #9a5b13;--accent-danger: #b42318;--code-background: #101511;--code-text: #e8efe7;--radius-md: 8px;--shadow-panel: 0 1px 2px rgba(20, 28, 18, .05), 0 14px 34px rgba(20, 28, 18, .08);--focus-ring-color: #cfe5d9}*{box-sizing:border-box}html,body,#root{min-height:100%}body{margin:0;background:var(--surface-base);color:var(--text-primary);font:14px/1.45 system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}button,input,select,textarea{font:inherit}a{color:inherit}code{display:inline-block;max-width:100%;overflow:hidden;color:var(--accent-object);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;text-overflow:ellipsis;white-space:nowrap}.app-shell{display:grid;grid-template-rows:auto minmax(0,1fr) auto;min-height:100vh}.top-bar,.activity-footer{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 20px;border-bottom:1px solid var(--border-default);background:var(--surface-overlay)}.activity-footer{border-top:1px solid var(--border-default);border-bottom:0;color:var(--text-secondary);font-size:12px;flex-wrap:wrap}.activity-status{font-weight:800}.activity-status.pending{color:var(--accent-object)}.activity-status.success{color:var(--accent-primary)}.activity-status.error{color:var(--accent-danger)}.service-surface{padding:16px}.brand-block,.top-actions,.service-card-head{display:flex;align-items:center;gap:12px;min-width:0}.brand-title{color:var(--text-primary);font-size:18px;font-weight:700;text-decoration:none}.status-pill,.service-status{display:inline-flex;align-items:center;gap:6px;border-radius:999px;padding:4px 10px;background:var(--surface-success-soft);color:var(--accent-primary);font-size:12px;font-weight:700}.status-pill.attention,.service-status.disabled{background:var(--surface-warning-soft);color:var(--accent-warning)}.status-dot{width:7px;height:7px;border-radius:50%;background:currentColor}.count-pill{border-radius:999px;padding:3px 8px;background:var(--surface-success-soft);color:var(--accent-primary);font-size:12px;font-weight:800}.service-switcher,.tabs{display:inline-flex;gap:2px;padding:3px;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-subtle)}.service-switcher a{display:inline-flex;align-items:center;justify-content:center;gap:7px;min-width:48px;padding:6px 10px;border-radius:6px;color:var(--text-secondary);font-weight:700;text-align:center;text-decoration:none}.service-switcher a.active,.tabs button.active{background:var(--surface-panel);color:var(--accent-primary)}.switcher-status{display:inline-flex;align-items:center;gap:4px;color:var(--text-secondary);font-size:11px;font-weight:800}.switcher-status.disabled{color:var(--accent-warning)}.segmented-control{display:inline-flex;align-self:end;border:1px solid var(--border-default);border-radius:var(--radius-md);overflow:hidden}.segmented-control button{border:0;border-right:1px solid var(--border-default);padding:9px 12px;background:var(--surface-panel);color:var(--text-secondary);font-weight:800;cursor:pointer}.segmented-control button:last-child{border-right:0}.segmented-control button.active{background:var(--surface-segment-active);color:var(--accent-primary)}.service-index-page{display:grid;gap:14px}.service-index-summary{display:flex;align-items:end;justify-content:space-between;gap:16px}.service-index-summary h1{margin:0;font-size:22px;line-height:28px}.service-index-summary p{margin:4px 0 0;color:var(--text-secondary)}.health-summary{display:grid;grid-template-columns:repeat(3,minmax(72px,1fr));gap:8px;margin:0}.health-summary div{min-width:0;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:8px 10px;background:var(--surface-panel)}.health-summary dt{color:var(--text-secondary);font-size:11px;font-weight:700;text-transform:uppercase}.health-summary dd{margin:2px 0 0;font-size:18px;font-weight:800}.service-index,.s3-workspace,.gcs-workspace,.dynamodb-workspace,.mail-workspace{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}.mail-workspace{grid-template-columns:minmax(280px,420px) minmax(320px,1fr);align-items:start}.s3-workspace{grid-template-columns:minmax(260px,320px) minmax(360px,1fr) minmax(280px,360px);align-items:start;gap:14px}.gcs-workspace{grid-template-columns:minmax(240px,320px) minmax(360px,1fr) minmax(260px,340px);align-items:start}.dynamodb-workspace{grid-template-columns:minmax(260px,340px) minmax(360px,1fr) minmax(260px,360px);align-items:start}.redshift-workspace{display:grid;grid-template-columns:minmax(260px,340px) minmax(320px,1fr);align-items:start;gap:12px}.redshift-workspace>.panel:nth-of-type(3){grid-column:1 / -1}.service-card{color:inherit;text-decoration:none}.service-card h2,.panel-head h2{margin:0;font-size:14px;line-height:20px}.panel{min-width:0;overflow:hidden;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-panel);box-shadow:var(--shadow-panel)}.panel-head{padding:12px 14px;border-bottom:1px solid var(--border-default);background:var(--surface-panel-muted)}.panel-body{padding:14px}.panel p,.empty-state p{margin:6px 0 0;color:var(--text-secondary)}.empty-state{border:1px dashed var(--border-empty);border-radius:var(--radius-md);padding:18px;background:var(--surface-panel-muted)}.placeholder-grid{display:grid;gap:12px}.button,.tabs button,.compat-link{min-height:34px;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:7px 10px;background:var(--surface-panel);color:var(--text-primary);font-weight:700;text-decoration:none}.button{cursor:pointer}.button.danger{border-color:var(--border-danger);color:var(--accent-danger)}.button:disabled{cursor:not-allowed;opacity:.58}.notifications-toggle.is-on{border-color:var(--border-accent, var(--border-strong, currentColor));color:var(--accent-primary, currentColor)}.notifications-toggle.is-disabled{opacity:.58}.prefix-filter,.mail-filter,.compact-filter{display:grid;gap:6px}.compact-filter{min-width:180px}.compact-filter.small{min-width:96px}.compact-filter.wide{min-width:280px}.prefix-filter span,.mail-filter span,.compact-filter span,.redshift-sql-editor span,.inspector-label,.inspector-list dt,.metadata-list dt{color:var(--text-secondary);font-size:11px;font-weight:800;text-transform:uppercase}.prefix-filter input,.prefix-filter textarea,.mail-filter input,.compact-filter input,.compact-filter select,.compact-filter textarea{width:100%;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:9px 10px;background:var(--surface-panel);color:var(--text-primary)}.prefix-filter textarea,.compact-filter textarea{resize:vertical}.prefix-filter textarea{min-height:72px}.compact-filter textarea{min-height:86px}.prefix-filter input:focus,.prefix-filter textarea:focus,.mail-filter input:focus,.compact-filter input:focus,.compact-filter select:focus,.compact-filter textarea:focus,.redshift-sql-editor textarea:focus{border-color:var(--accent-primary);outline:2px solid var(--focus-ring-color);outline-offset:1px}.prefix-filter input:disabled,.prefix-filter textarea:disabled,.compact-filter input:disabled,.compact-filter select:disabled,.compact-filter textarea:disabled{background:var(--surface-subtle);color:var(--text-secondary)}.endpoint-summary{display:grid;gap:6px;margin:14px 0 0;padding-top:12px;border-top:1px solid var(--border-default)}.endpoint-summary dt{margin:0;color:var(--text-secondary);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.endpoint-summary dd{margin:0;min-width:0}.endpoint-summary dd code{font-size:13px}.inspector-list,.metadata-list{display:grid;gap:8px;margin:0}.inspector-list div,.metadata-list div{min-width:0}.inspector-list dd,.metadata-list dd{margin:2px 0 0;overflow-wrap:anywhere}.inspector-muted{margin:4px 0 0;color:var(--text-secondary)}.inspector-download{justify-self:start}.inspector-heading{display:flex;align-items:start;justify-content:space-between;gap:10px}.inspector-heading h3{margin:0}.object-table-wrap,.dynamodb-item-table-wrap{max-width:100%;overflow-x:auto}.object-table,.dynamodb-item-table{width:100%;border-collapse:collapse}.object-table{min-width:640px}.dynamodb-item-table{min-width:680px}.dynamodb-item-table.compact{min-width:520px}.object-table th,.object-table td,.dynamodb-item-table th,.dynamodb-item-table td{padding:10px;border-bottom:1px solid var(--border-default);text-align:left;vertical-align:top;overflow-wrap:anywhere;word-break:break-word}.object-table th,.dynamodb-item-table th{color:var(--text-secondary);font-size:11px;text-transform:uppercase}.object-table td,.dynamodb-item-table td{color:var(--text-secondary)}.object-row.active td,.item-row.active td{background:var(--surface-active)}.item-row{cursor:pointer}.object-select{display:block;max-width:100%;border:0;padding:0;background:transparent;text-align:left;cursor:pointer}.object-select:hover .object-key,.object-select:focus-visible .object-key{color:var(--accent-primary);text-decoration:underline}.object-key{display:block;max-width:320px;overflow:hidden;color:var(--text-primary);font-weight:800;text-overflow:ellipsis;white-space:nowrap}.object-action{color:var(--accent-object);font-weight:800;text-decoration:none}.object-inspector,.dynamodb-inspector{display:grid;gap:14px}.bucket-list,.dynamodb-table-list{display:grid;gap:8px}.mail-list,.mail-inspector{display:grid;gap:10px}.bucket-item,.dynamodb-table-row,.mail-row{width:100%;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:10px;background:var(--surface-panel);color:var(--text-primary);text-align:left;cursor:pointer}.bucket-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:start}.dynamodb-table-row{display:grid;gap:6px}.mail-row{display:grid;gap:5px}.bucket-item:hover,.bucket-item.active,.dynamodb-table-row:hover,.dynamodb-table-row.active,.mail-row:hover,.mail-row.active{border-color:var(--border-active);background:var(--surface-active)}.bucket-name,.bucket-meta{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bucket-name{font-weight:800}.bucket-meta{margin-top:3px;color:var(--text-secondary);font-size:12px}.s3-toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px}.s3-toolbar span,.toolbar-count{color:var(--text-secondary);font-size:12px;font-weight:800}.s3-object-form{display:grid;grid-template-columns:minmax(160px,1fr) minmax(140px,.8fr) minmax(160px,1fr) auto;gap:10px;align-items:end;border-bottom:1px solid var(--border-default);padding-bottom:12px}.s3-metadata-input{grid-column:1 / -2}.s3-copy-form{display:grid;gap:10px;border-top:1px solid var(--border-default);padding-top:12px}.multipart-upload-list{display:grid;gap:8px;border-bottom:1px solid var(--border-default);padding-bottom:12px}.multipart-upload-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:start;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:10px;background:var(--surface-subtle)}.multipart-upload-row div{display:grid;min-width:0;gap:3px}.multipart-upload-row strong,.multipart-upload-row span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.multipart-upload-row span{color:var(--text-secondary);font-size:12px}.object-browser,.gcs-sidebar,.gcs-create-bucket{display:grid;gap:12px}.gcs-create-bucket{grid-template-columns:minmax(0,1fr) auto;align-items:end}.gcs-bucket-row{grid-template-columns:minmax(0,1fr) auto auto}.gcs-message{grid-column:1 / -1}.pubsub-action-form,.pubsub-action-row{display:flex;align-items:end;gap:8px;flex-wrap:wrap;margin:0 0 12px}.pubsub-action-form.stacked{margin:12px 0 0;padding-top:12px;border-top:1px solid var(--border-default)}.operation-message{margin:0 0 12px;border-radius:var(--radius-md);padding:8px 10px;font-weight:750}.operation-message.success{background:var(--surface-success-soft);color:var(--accent-primary)}.operation-message.error{background:var(--surface-error-soft);color:var(--accent-danger)}.pulled-message-list{display:grid;gap:8px;margin:10px 0 14px}.pulled-message{display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px;align-items:start;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:8px;background:var(--surface-subtle)}.pulled-message strong,.pulled-message code{display:block}.dynamodb-toolbar{display:flex;align-items:end;justify-content:space-between;gap:10px;margin-bottom:12px;flex-wrap:wrap}.table-row-top,.table-row-tags{display:flex;align-items:center;justify-content:space-between;gap:8px}.table-row-name,.table-row-meta{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.table-row-name{font-weight:800}.table-row-meta,.table-row-tags{color:var(--text-secondary);font-size:12px}.table-row-tags{justify-content:flex-start;flex-wrap:wrap;font-weight:700}.attribute-preview{display:flex;flex-wrap:wrap;gap:5px}.attribute-chip{max-width:220px;overflow:hidden;border:1px solid var(--border-default);border-radius:999px;padding:2px 7px;color:var(--text-secondary);font-size:12px;text-overflow:ellipsis;white-space:nowrap}.dynamodb-key-lookup{display:grid;gap:8px;margin-top:12px;border-top:1px solid var(--border-default);padding-top:12px}.dynamodb-operation-stack,.dynamodb-query-scan{display:grid;gap:12px}.dynamodb-operation-form{display:grid;gap:8px;border-bottom:1px solid var(--border-default);padding-bottom:12px}.dynamodb-operation-form:last-child{border-bottom:0;padding-bottom:0}.dynamodb-operation-form textarea{min-height:118px}.destructive-confirmation{display:flex;align-items:flex-start;gap:8px;border:1px solid var(--border-danger-soft);border-radius:var(--radius-md);padding:9px 10px;background:var(--surface-danger-soft);color:var(--accent-danger);font-size:12px;font-weight:800}.destructive-confirmation input{margin-top:2px}.dynamodb-query-scan-form{display:flex;align-items:end;gap:10px;flex-wrap:wrap}.dynamodb-query-scan-form .redshift-sql-editor{min-width:min(100%,420px);flex:1 1 420px}.dynamodb-query-scan-form textarea{min-height:92px}.dynamodb-query-result-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(280px,.9fr);gap:12px;align-items:start}.dynamodb-recent-operations{display:grid;gap:10px;border-top:1px solid var(--border-default);padding-top:12px}.redshift-query-runner{display:grid;gap:10px;border-bottom:1px solid var(--border-default);padding-bottom:14px}.redshift-query-form,.redshift-query-result{display:grid;gap:10px}.redshift-sql-editor{display:grid;gap:6px}.redshift-sql-editor textarea{width:100%;min-height:120px;resize:vertical;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:10px;background:var(--surface-panel);color:var(--text-primary);font:13px/1.45 ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace}.query-column-type{display:block;margin-top:2px;color:var(--text-secondary);font-size:10px;font-weight:700;text-transform:none}.mail-toolbar{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:10px;align-items:end;margin-bottom:12px}.mail-row-top{display:flex;justify-content:space-between;gap:10px;color:var(--text-secondary);font-size:12px}.mail-from,.mail-subject,.mail-snippet{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mail-from,.mail-subject{color:var(--text-primary);font-weight:800}.mail-snippet{color:var(--text-secondary)}.mail-inspector h3{margin:0;font-size:18px;line-height:24px}.mail-inspector p{margin:4px 0 0;color:var(--text-secondary)}.mail-preview{max-height:360px;overflow:auto;border-radius:var(--radius-md);padding:12px;background:var(--code-background);color:var(--code-text);white-space:pre-wrap}.attachment-list{display:grid;gap:6px;margin:6px 0 0;padding:0;list-style:none}.attachment-list li{display:grid;gap:2px;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:8px}.attachment-list span:last-child{color:var(--text-secondary);font-size:12px}.dialog-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;padding:16px;background:var(--surface-scrim)}.dialog{width:min(480px,100%);border:1px solid var(--border-default);border-radius:var(--radius-md);padding:16px;background:var(--surface-panel)}.dialog-head{display:flex;align-items:center;justify-content:space-between;gap:12px}.dialog-copy{margin:12px 0 0;color:var(--text-secondary)}.dialog-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:16px}@media(max-width:720px){.top-bar,.brand-block,.top-actions,.service-index-summary{align-items:stretch;flex-direction:column}.health-summary{grid-template-columns:repeat(3,minmax(0,1fr))}.service-switcher{overflow-x:auto}.s3-workspace,.gcs-workspace,.dynamodb-workspace,.redshift-workspace,.mail-workspace,.s3-object-form,.gcs-create-bucket,.gcs-bucket-row{grid-template-columns:1fr}.s3-metadata-input{grid-column:auto}.mail-toolbar,.dynamodb-query-result-grid{grid-template-columns:1fr}}.s3-bucket-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:10px}.s3-bucket-count{color:var(--text-secondary);font-size:12px;font-weight:700}.s3-bucket-create{display:flex;gap:8px;margin-bottom:12px}.s3-bucket-list{display:grid;gap:2px;margin:0;padding:0;list-style:none}.s3-bucket-row{position:relative;display:flex;align-items:stretch;gap:4px;padding:2px 6px 2px 10px;border:1px solid transparent;border-radius:var(--radius-md)}.s3-bucket-row:before{content:"";position:absolute;top:8px;bottom:8px;left:2px;width:3px;border-radius:999px;background:transparent;transition:background .12s ease-out}.s3-bucket-row:hover{background:var(--surface-subtle)}.s3-bucket-row.active{background:var(--surface-active);border-color:var(--border-active)}.s3-bucket-row.active:before{background:var(--accent-primary)}.s3-bucket-select{display:flex;flex:1;min-width:0;align-items:center;gap:10px;padding:8px 0;border:0;background:transparent;color:var(--text-primary);text-align:left;cursor:pointer}.s3-bucket-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;background:var(--surface-success-soft);color:var(--accent-primary)}.s3-bucket-row.active .s3-bucket-icon{background:var(--surface-panel);color:var(--accent-primary)}.s3-bucket-info{display:grid;flex:1;min-width:0;gap:2px}.s3-bucket-name{min-width:0;font-size:13px;font-weight:700;line-height:1.3;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.s3-bucket-meta{color:var(--text-secondary);font-size:11px;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.s3-bucket-delete{align-self:center;opacity:0;transition:opacity .12s ease-out}.s3-bucket-row:hover .s3-bucket-delete,.s3-bucket-row.active .s3-bucket-delete,.s3-bucket-delete:focus-visible{opacity:1}.s3-browser{display:grid;gap:12px}.s3-browser-toolbar{display:flex;align-items:stretch;gap:8px}.s3-search{position:relative;display:flex;align-items:center;flex:1;min-width:0}.s3-search svg{position:absolute;left:10px;color:var(--text-secondary);pointer-events:none}.s3-search input{flex:1;min-width:0;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:8px 12px 8px 30px;background:var(--surface-panel);color:var(--text-primary);font:inherit}.s3-search input::-webkit-search-cancel-button{-webkit-appearance:none;-moz-appearance:none;appearance:none}.s3-search input:focus{border-color:var(--accent-primary);outline:2px solid var(--focus-ring-color);outline-offset:1px}.s3-text-input{width:100%;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:7px 10px;background:var(--surface-panel);color:var(--text-primary);font:inherit}.s3-text-input:focus{border-color:var(--accent-primary);outline:2px solid var(--focus-ring-color);outline-offset:1px}textarea.s3-text-input{min-height:56px;resize:vertical;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px}.s3-file-input{width:100%;padding:6px 0}.s3-upload-details{flex:none;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-panel)}.s3-upload-details summary{list-style:none;display:inline-flex;align-items:center;gap:6px;padding:8px 12px;cursor:pointer;color:var(--text-primary);font-weight:700;font-size:13px}.s3-upload-details summary::-webkit-details-marker{display:none}.s3-upload-details[open] summary{border-bottom:1px solid var(--border-default)}.s3-upload-form{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px;padding:12px}.s3-field{display:grid;gap:4px;min-width:0}.s3-field span,.s3-field-label{color:var(--text-secondary);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.s3-field-full{grid-column:1 / -1}.s3-upload-actions{grid-column:1 / -1;display:flex;justify-content:flex-end}.s3-object-table-wrap{max-width:100%;overflow-x:auto;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-panel)}.s3-object-table{width:100%;min-width:600px;border-collapse:collapse}.s3-object-table thead th{position:sticky;top:0;z-index:1;padding:10px 12px;background:var(--surface-panel-muted);border-bottom:1px solid var(--border-default);color:var(--text-secondary);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;text-align:left}.s3-object-table tbody td{padding:10px 12px;border-bottom:1px solid var(--border-default);color:var(--text-secondary);vertical-align:middle;white-space:nowrap}.s3-object-table tbody tr:last-child td{border-bottom:0}.s3-object-table tbody tr:hover td{background:var(--surface-subtle)}.s3-object-table tbody tr.active td{background:var(--surface-active)}.s3-object-key{max-width:320px;display:inline-block;border:0;padding:0;background:transparent;color:var(--text-primary);font:inherit;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.s3-object-key:hover,.s3-object-key:focus-visible{color:var(--accent-primary);text-decoration:underline}.s3-object-numeric,.s3-object-type{font-variant-numeric:tabular-nums}.s3-object-actions-head{width:72px}.s3-object-actions{text-align:right}.s3-object-actions>*+*{margin-left:2px}.s3-icon-button{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:0;border-radius:6px;background:transparent;color:var(--text-secondary);cursor:pointer;transition:background .12s ease-out,color .12s ease-out}.s3-icon-button:hover,.s3-icon-button:focus-visible{background:var(--surface-subtle)}.s3-icon-button.neutral{color:var(--accent-object)}.s3-icon-button.danger{color:var(--accent-danger)}.s3-icon-button.danger:hover,.s3-icon-button.danger:focus-visible{background:var(--surface-error-soft)}.s3-icon-button:disabled{cursor:not-allowed;opacity:.45}.s3-multipart-details{border:1px solid var(--border-empty);border-radius:var(--radius-md);background:var(--surface-panel-muted)}.s3-multipart-details summary{display:flex;align-items:center;gap:8px;padding:8px 12px;cursor:pointer;color:var(--text-secondary);font-size:12px;font-weight:700;list-style:none}.s3-multipart-details summary::-webkit-details-marker{display:none}.s3-multipart-count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;padding:0 6px;border-radius:999px;background:var(--surface-warning-soft);color:var(--accent-warning);font-size:11px;font-weight:800}.s3-multipart-list{margin:0;padding:0 12px 12px;list-style:none;display:grid;gap:8px}.s3-multipart-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:center;padding:8px 10px;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-panel)}.s3-multipart-meta{display:grid;gap:2px;min-width:0}.s3-multipart-meta strong,.s3-multipart-meta code,.s3-multipart-meta span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.s3-multipart-meta span{color:var(--text-secondary);font-size:12px}.s3-inspector{display:grid;gap:14px}.s3-inspector-section{display:grid;gap:4px;min-width:0}.s3-inspector-key{display:block;padding:6px 10px;border-radius:var(--radius-md);background:var(--surface-active);color:var(--text-primary);font-size:13px;font-weight:700;overflow-wrap:anywhere;white-space:normal}.s3-inspector-uri{display:block;padding:6px 10px;border-radius:var(--radius-md);background:var(--surface-subtle);color:var(--text-secondary);font-size:12px;overflow-wrap:anywhere;white-space:normal}.s3-inspector-list{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:8px 12px;margin:0}.s3-inspector-list div{min-width:0}.s3-inspector-list dt{color:var(--text-secondary);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.s3-inspector-list dd{margin:2px 0 0;color:var(--text-primary);overflow-wrap:anywhere}.s3-inspector-metadata{display:grid;gap:6px;margin:0}.s3-inspector-metadata div{display:grid;grid-template-columns:minmax(0,.4fr) minmax(0,1fr);gap:8px;padding:4px 0;border-bottom:1px dashed var(--border-empty)}.s3-inspector-metadata div:last-child{border-bottom:0}.s3-inspector-metadata dt{color:var(--text-secondary);font-size:12px;font-weight:700}.s3-inspector-metadata dd{margin:0;color:var(--text-primary);overflow-wrap:anywhere}.s3-inspector-muted{margin:0;color:var(--text-secondary);font-size:12px}.s3-inspector-download{display:inline-flex;align-items:center;gap:6px;align-self:start;padding:7px 12px;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-panel);color:var(--accent-object);font-weight:700;text-decoration:none}.s3-inspector-download:hover{background:var(--surface-subtle)}.s3-inspector-copy{display:grid;gap:8px;padding-top:12px;border-top:1px solid var(--border-default)}.s3-inspector-copy .button{justify-self:end}.s3-inspector-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;padding:32px 16px;color:var(--text-secondary);text-align:center}.s3-inspector-empty svg{color:var(--border-active)}.s3-inspector-empty-title{margin:6px 0 0;color:var(--text-primary);font-weight:700}.s3-inspector-empty-body{margin:0;font-size:13px}.s3-status-banner{grid-column:1 / -1;margin:0;padding:8px 12px;border:1px solid var(--border-empty);border-radius:var(--radius-md);background:var(--surface-success-soft);color:var(--accent-primary);font-size:12px;font-weight:700}@media(max-width:1000px){.s3-upload-form,.s3-inspector-list{grid-template-columns:1fr}}.confirm-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;display:grid;place-items:center;padding:16px;background:var(--surface-scrim);animation:confirm-fade .12s ease-out}.confirm-dialog{width:min(440px,100%);border:1px solid var(--border-default);border-radius:var(--radius-md);padding:18px 20px 16px;background:var(--surface-panel);box-shadow:0 18px 48px #141c122e,0 2px 6px #141c1214;animation:confirm-pop .14s ease-out}.confirm-dialog.tone-danger{border-color:var(--border-danger)}.confirm-title{margin:0;font-size:16px;line-height:22px;font-weight:700}.confirm-body{display:grid;gap:6px;margin:10px 0 0}.confirm-description{margin:0;color:var(--text-secondary);font-size:13px;line-height:1.5}.confirm-detail{margin:0;color:var(--text-primary);font-size:12px;overflow-wrap:anywhere}.confirm-detail code{font-size:12px}.confirm-phrase{display:grid;gap:6px;margin-top:14px}.confirm-phrase label{color:var(--text-secondary);font-size:12px}.confirm-phrase label code{padding:1px 6px;border-radius:4px;background:var(--surface-subtle);color:var(--text-primary);font-size:12px}.confirm-phrase-input{width:100%;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:8px 10px;background:var(--surface-panel);color:var(--text-primary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px}.confirm-phrase-input:focus{border-color:var(--accent-primary);outline:2px solid var(--focus-ring-color);outline-offset:1px}.confirm-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:18px}.confirm-actions .button.primary{border-color:var(--accent-primary);background:var(--accent-primary);color:var(--surface-panel)}.confirm-actions .button.primary:hover:not(:disabled){background:var(--text-primary);border-color:var(--text-primary)}.confirm-actions .button.danger.primary{border-color:var(--accent-danger);background:var(--accent-danger);color:var(--surface-panel)}.confirm-actions .button.danger.primary:hover:not(:disabled){background:#921b13;border-color:#921b13}@keyframes confirm-fade{0%{opacity:0}to{opacity:1}}@keyframes confirm-pop{0%{transform:translateY(6px) scale(.98);opacity:0}to{transform:translateY(0) scale(1);opacity:1}}.redis-shell{display:grid;grid-template-rows:auto minmax(0,1fr);gap:14px;min-width:0}.redis-status-bar{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;padding:12px 14px;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-panel);box-shadow:var(--shadow-panel)}.redis-status-bar-loading{display:flex;justify-content:center;color:var(--text-secondary);font-size:13px}.redis-status-bar-error{border-color:var(--border-danger);background:var(--surface-error-soft)}.redis-status-cell{display:flex;flex-direction:column;gap:2px;min-width:0}.redis-status-cell-wide{grid-column:span 2}.redis-status-cell .cell-label{color:var(--text-secondary);font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.redis-status-cell .cell-value,.redis-status-cell code{color:var(--text-primary);font-size:13px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.redis-status-cell code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.redis-mode-pill{position:relative}.redis-mode-pill .cell-value{display:inline-flex;align-items:center;gap:6px;padding:2px 8px;border-radius:999px;background:var(--surface-segment-active);color:var(--accent-primary);font-size:12px}.redis-mode-external .cell-value{background:var(--surface-warning-soft);color:var(--accent-warning)}.redis-workspace{display:grid;grid-template-columns:minmax(320px,460px) minmax(360px,1fr) minmax(280px,360px);gap:14px;align-items:start}@media(max-width:1280px){.redis-workspace{grid-template-columns:minmax(300px,1fr) minmax(280px,1fr)}.redis-workspace>:nth-child(3){grid-column:1 / -1}}@media(max-width:880px){.redis-workspace{grid-template-columns:1fr}.redis-workspace>:nth-child(3){grid-column:auto}}.redis-keys-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 0 8px;flex-wrap:wrap}.redis-toolbar-actions{display:inline-flex;gap:6px}.redis-keys-count{display:inline-flex;align-items:baseline;gap:4px;font-size:13px}.redis-keys-count strong{font-size:16px;font-weight:600}.redis-keys-count-total{color:var(--text-secondary);font-size:12px}.redis-match-field{display:flex;flex-direction:column;gap:4px;margin-bottom:10px;font-size:12px;color:var(--text-secondary)}.redis-match-field input{padding:6px 10px;border:1px solid var(--border-default);border-radius:6px;background:var(--surface-panel);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.redis-match-field input:focus{outline:none;border-color:var(--border-active);box-shadow:0 0 0 3px var(--focus-ring-color)}.redis-message{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 0 10px;padding:8px 12px;border-radius:6px;font-size:13px}.redis-message-success{background:var(--surface-success-soft);color:var(--accent-primary)}.redis-message-warning{background:var(--surface-warning-soft);color:var(--accent-warning)}.redis-message-error{background:var(--surface-error-soft);color:var(--accent-danger)}.redis-message-close{border:0;background:transparent;color:inherit;cursor:pointer;font-size:16px;line-height:1}.redis-key-list{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:4px;max-height:64vh;overflow-y:auto}.redis-key-row{width:100%;display:grid;gap:4px;padding:8px 10px;border:1px solid var(--border-default);border-radius:6px;background:var(--surface-panel);color:inherit;cursor:pointer;text-align:left}.redis-key-row:hover{border-color:var(--border-active);background:var(--surface-panel-muted)}.redis-key-row.active{border-color:var(--border-active);background:var(--surface-active)}.redis-key-row-top{display:inline-flex;align-items:center;gap:6px}.redis-key-row-name{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.4;color:var(--text-primary);word-break:break-all;overflow-wrap:anywhere;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.redis-inspector{display:flex;flex-direction:column;gap:16px;min-width:0}.redis-inspector-header{display:flex;flex-direction:column;gap:8px;padding-bottom:12px;border-bottom:1px solid var(--border-default)}.redis-inspector-eyebrow{font-size:11px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--text-secondary)}.redis-key-title-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.redis-key-title{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:15px;font-weight:600;color:var(--text-primary);word-break:break-all;white-space:normal;max-width:100%;overflow:visible}.redis-copy-button{border:1px solid var(--border-default);border-radius:4px;background:var(--surface-panel);color:var(--text-secondary);cursor:pointer;font-size:11px;padding:2px 6px}.redis-copy-button:hover{border-color:var(--border-active);color:var(--text-primary)}.redis-key-badges{display:inline-flex;align-items:center;flex-wrap:wrap;gap:6px}.redis-badge{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:999px;font-size:11px;font-weight:600;letter-spacing:.02em;background:var(--surface-segment-active);color:var(--accent-primary)}.redis-type-string{background:#e6effa;color:var(--accent-object)}.redis-type-list{background:#f0e9f5;color:#6c2c84}.redis-type-hash{background:var(--surface-segment-active);color:var(--accent-primary)}.redis-type-set{background:#fbebd6;color:var(--accent-warning)}.redis-type-zset{background:#fbe2dd;color:var(--accent-danger)}.redis-type-stream{background:#ddefe7;color:var(--accent-primary)}.redis-type-none,.redis-type-unknown{background:var(--surface-subtle);color:var(--text-secondary)}.redis-ttl-active{background:var(--surface-segment-active);color:var(--accent-primary)}.redis-ttl-persistent{background:var(--surface-subtle);color:var(--text-secondary)}.redis-ttl-missing{background:var(--surface-error-soft);color:var(--accent-danger)}.redis-size{background:var(--surface-subtle);color:var(--text-secondary)}.redis-inspector-section{display:flex;flex-direction:column;gap:8px;min-width:0}.redis-section-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.redis-value-string{display:flex;flex-direction:column;gap:6px}.redis-value-toolbar{display:flex;justify-content:space-between;align-items:center;gap:8px;font-size:12px;color:var(--text-secondary)}.redis-segmented{display:inline-flex;border:1px solid var(--border-default);border-radius:6px;overflow:hidden}.redis-segmented button{border:0;padding:3px 10px;background:var(--surface-panel);color:var(--text-secondary);cursor:pointer;font-size:11px}.redis-segmented button.active{background:var(--surface-segment-active);color:var(--accent-primary);font-weight:600}.redis-value-pre{margin:0;padding:12px;border:1px solid var(--border-default);border-radius:6px;background:var(--code-background);color:var(--code-text);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.5;max-height:360px;overflow:auto;white-space:pre-wrap;word-break:break-word}.redis-list-view{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:4px;max-height:360px;overflow-y:auto}.redis-list-view li{display:grid;grid-template-columns:40px 1fr;gap:8px;align-items:baseline;padding:6px 10px;border:1px solid var(--border-default);border-radius:6px;background:var(--surface-panel-muted)}.redis-list-index{color:var(--text-secondary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;text-align:right}.redis-list-value{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;word-break:break-all}.redis-hash-table,.redis-zset-table{width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px}.redis-hash-table th,.redis-hash-table td,.redis-zset-table th,.redis-zset-table td{padding:6px 10px;text-align:left;border-bottom:1px solid var(--border-default);vertical-align:top;word-break:break-all;overflow-wrap:anywhere;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px}.redis-hash-table th:first-child,.redis-hash-table td:first-child{width:34%}.redis-zset-table th:last-child,.redis-zset-table td:last-child{width:96px}.redis-hash-table code,.redis-zset-table code{display:inline-block;max-width:100%;overflow:visible;white-space:normal;text-overflow:clip;word-break:break-all;overflow-wrap:anywhere}.redis-value-pre-inline{margin:0;max-height:240px;font-size:12px;line-height:1.5}.json-code{color:var(--code-text)}.json-code .json-token-key{color:#9ad1ff;font-weight:600}.json-code .json-token-string{color:#b6e7a8}.json-code .json-token-number{color:#f2c97d}.json-code .json-token-bool{color:#f4a8c2}.json-code .json-token-null{color:#b6bec8;font-style:italic}.redis-hash-table thead th,.redis-zset-table thead th{background:var(--surface-panel-muted);color:var(--text-secondary);font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.redis-zset-score{font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap}.redis-set-view{margin:0;padding:0;list-style:none;display:flex;flex-wrap:wrap;gap:6px}.redis-set-view li{padding:4px 10px;border:1px solid var(--border-default);border-radius:999px;background:var(--surface-panel-muted);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px}.redis-ttl-form{display:flex;align-items:flex-end;gap:8px;flex-wrap:wrap}.redis-ttl-form label{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--text-secondary)}.redis-ttl-form input{padding:6px 10px;border:1px solid var(--border-default);border-radius:6px;background:var(--surface-panel);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;width:120px}.redis-ttl-form input:focus{outline:none;border-color:var(--border-active);box-shadow:0 0 0 3px var(--focus-ring-color)}.redis-danger-row{display:flex;justify-content:flex-end;padding-top:8px;border-top:1px dashed var(--border-default)}.redis-runner{display:flex;flex-direction:column;gap:12px}.redis-runner-form{display:flex;flex-direction:column;gap:8px}.redis-runner-label{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--text-secondary)}.redis-runner-label textarea{padding:8px 10px;border:1px solid var(--border-default);border-radius:6px;background:var(--surface-panel);color:var(--text-primary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;line-height:1.5;resize:vertical}.redis-runner-label textarea:focus{outline:none;border-color:var(--border-active);box-shadow:0 0 0 3px var(--focus-ring-color)}.redis-runner-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px}.redis-runner-hint{color:var(--text-secondary);font-size:11.5px}.redis-runner-hint kbd{display:inline-block;padding:1px 5px;border:1px solid var(--border-default);border-radius:4px;background:var(--surface-panel-muted);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:10.5px}.redis-runner-history{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:8px}.redis-runner-entry{border:1px solid var(--border-default);border-radius:6px;padding:8px 10px;background:var(--surface-panel)}.redis-runner-success{border-left:3px solid var(--accent-primary)}.redis-runner-error{border-left:3px solid var(--accent-danger)}.redis-runner-entry-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.redis-runner-input{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:var(--text-primary);word-break:break-all}.redis-runner-rerun{border:1px solid var(--border-default);border-radius:4px;background:var(--surface-panel);color:var(--text-secondary);cursor:pointer;font-size:11px;padding:2px 8px}.redis-runner-rerun:hover{border-color:var(--border-active);color:var(--text-primary)}.redis-runner-detail{display:flex;align-items:center;gap:6px;margin:6px 0 0;font-size:12px;color:var(--text-secondary)}.redis-runner-tag{display:inline-block;padding:1px 6px;border-radius:4px;font-size:10.5px;font-weight:600;letter-spacing:.04em}.redis-runner-success .redis-runner-tag{background:var(--surface-success-soft);color:var(--accent-primary)}.redis-runner-error .redis-runner-tag{background:var(--surface-error-soft);color:var(--accent-danger)}.redis-runner-result{margin:8px 0 0;padding:8px 10px;border-radius:4px;background:var(--code-background);color:var(--code-text);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.5;max-height:200px;overflow:auto;white-space:pre-wrap;word-break:break-word}.mail-shell{display:grid;grid-template-columns:minmax(320px,420px) minmax(360px,1fr);gap:14px;align-items:start}@media(max-width:960px){.mail-shell{grid-template-columns:1fr}}.mail-inbox-toolbar{display:flex;align-items:flex-end;justify-content:space-between;gap:8px;margin-bottom:12px;flex-wrap:wrap}.mail-inbox-filter{display:flex;flex-direction:column;gap:4px;flex:1;min-width:180px;color:var(--text-secondary);font-size:12px}.mail-inbox-filter input{padding:6px 10px;border:1px solid var(--border-default);border-radius:6px;background:var(--surface-panel);color:var(--text-primary)}.mail-inbox-filter input:focus{outline:none;border-color:var(--border-active);box-shadow:0 0 0 3px var(--focus-ring-color)}.mail-inbox-actions{display:inline-flex;gap:6px}.mail-inbox-list{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:4px;max-height:70vh;overflow-y:auto}.mail-inbox-row{width:100%;display:grid;gap:4px;padding:10px 12px;border:1px solid var(--border-default);border-left:3px solid transparent;border-radius:6px;background:var(--surface-panel);color:inherit;cursor:pointer;text-align:left}.mail-inbox-row:hover{border-color:var(--border-active);background:var(--surface-panel-muted)}.mail-inbox-row.active{border-color:var(--border-active);border-left-color:var(--accent-primary);background:var(--surface-active)}.mail-inbox-row-top{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.mail-inbox-sender{font-weight:600;font-size:13px;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.mail-inbox-time{color:var(--text-secondary);font-size:11.5px;white-space:nowrap}.mail-inbox-subject{font-size:13px;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mail-inbox-snippet{color:var(--text-secondary);font-size:12px;line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.mail-inspector{display:flex;flex-direction:column;gap:14px;min-width:0}.mail-inspector-header{display:flex;flex-direction:column;gap:8px;padding-bottom:10px;border-bottom:1px solid var(--border-default)}.mail-subject{margin:0;font-size:18px;font-weight:600;line-height:1.35;color:var(--text-primary);word-break:break-word}.mail-recipients{margin:0;display:grid;grid-template-columns:1fr;gap:4px;font-size:13px}.mail-recipients-row{display:grid;grid-template-columns:72px 1fr;gap:10px;align-items:baseline}.mail-recipients-row dt{margin:0;font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--text-secondary)}.mail-recipients-row dd{margin:0;color:var(--text-primary);word-break:break-all}.mail-recipients-aux{margin-left:6px;color:var(--text-secondary);font-size:12px}.mail-eyebrow{font-size:11px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--text-secondary)}.mail-tabs{display:inline-flex;gap:4px;padding:4px;border:1px solid var(--border-default);border-radius:8px;background:var(--surface-panel-muted);align-self:flex-start}.mail-tab{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border:0;border-radius:6px;background:transparent;color:var(--text-secondary);cursor:pointer;font-size:12.5px;font-weight:500}.mail-tab:hover{color:var(--text-primary)}.mail-tab.active{background:var(--surface-panel);color:var(--text-primary);box-shadow:0 1px 2px #141c120f}.mail-tab-count{display:inline-block;padding:0 6px;border-radius:999px;background:var(--surface-segment-active);color:var(--accent-primary);font-size:11px;font-weight:600}.mail-preview{padding:16px 18px;border:1px solid var(--border-default);border-radius:8px;background:var(--surface-panel);color:var(--text-primary);font:14px/1.6 system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Hiragino Sans,Noto Sans JP,sans-serif;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;max-height:60vh;overflow-y:auto}.mail-preview a{color:var(--accent-object);text-decoration:underline;word-break:break-all}.mail-preview-error{display:flex;flex-direction:column;gap:4px;padding:12px 14px;border:1px solid var(--border-danger);border-radius:8px;background:var(--surface-error-soft);color:var(--accent-danger);font-size:13px}.mail-preview-error p{margin:0}.mail-attachment-list{margin:0;padding:0;list-style:none;display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px}.mail-attachment-item{display:grid;grid-template-columns:36px 1fr;gap:10px;align-items:center;padding:10px 12px;border:1px solid var(--border-default);border-radius:8px;background:var(--surface-panel)}.mail-attachment-icon{font-size:24px;line-height:1;text-align:center}.mail-attachment-body{display:flex;flex-direction:column;gap:2px;min-width:0}.mail-attachment-name{font-size:13px;font-weight:500;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mail-attachment-meta{font-size:11.5px;color:var(--text-secondary)}.mail-raw{display:flex;flex-direction:column;gap:6px}.mail-raw-toolbar{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--text-secondary)}.mail-raw-copy{border:1px solid var(--border-default);border-radius:4px;background:var(--surface-panel);color:var(--text-secondary);cursor:pointer;font-size:11px;padding:2px 8px}.mail-raw-copy:hover{border-color:var(--border-active);color:var(--text-primary)}.mail-raw-pre{margin:0;padding:12px;border:1px solid var(--border-default);border-radius:8px;background:var(--code-background);color:var(--code-text);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.55;max-height:60vh;overflow:auto;white-space:pre-wrap;word-break:break-word}.mail-headers{border:1px solid var(--border-default);border-radius:8px;background:var(--surface-panel-muted)}.mail-headers>summary{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;cursor:pointer;font-size:12.5px;color:var(--text-secondary);font-weight:600;letter-spacing:.03em;text-transform:uppercase}.mail-headers[open]>summary{border-bottom:1px solid var(--border-default)}.mail-headers-count{padding:1px 8px;border-radius:999px;background:var(--surface-segment-active);color:var(--accent-primary);font-size:11px;letter-spacing:0;text-transform:none}.mail-headers-empty{margin:0;padding:12px 14px;color:var(--text-secondary);font-size:13px}.mail-headers-table{width:100%;border-collapse:collapse;font-size:12.5px}.mail-headers-table th,.mail-headers-table td{padding:8px 14px;text-align:left;vertical-align:top;border-bottom:1px solid var(--border-default);word-break:break-all}.mail-headers-table th{width:200px;color:var(--text-secondary);font-weight:600;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px}.mail-headers-table tr:last-child th,.mail-headers-table tr:last-child td{border-bottom:0} diff --git a/internal/dashboard/assets/react/assets/index-RiEXN4Qh.css b/internal/dashboard/assets/react/assets/index-RiEXN4Qh.css deleted file mode 100644 index de1cd47..0000000 --- a/internal/dashboard/assets/react/assets/index-RiEXN4Qh.css +++ /dev/null @@ -1 +0,0 @@ -:root{color-scheme:light;--surface-base: #f7f8f5;--surface-panel: #ffffff;--surface-panel-muted: #fbfcf9;--surface-subtle: #eef1ec;--surface-active: #f3faf6;--surface-overlay: rgba(255, 255, 255, .86);--surface-scrim: rgba(16, 21, 17, .32);--surface-success-soft: #ddefe7;--surface-warning-soft: #f4ece2;--surface-error-soft: #f8e7e3;--surface-danger-soft: #fff8f6;--surface-segment-active: #e7f3ec;--text-primary: #1d211c;--text-secondary: #5f675d;--border-default: #d9ded5;--border-active: #9fb6a7;--border-empty: #c8d1c2;--border-danger: #e3b8b3;--border-danger-soft: #e0b4ab;--accent-primary: #176b4d;--accent-object: #245b8f;--accent-warning: #9a5b13;--accent-danger: #b42318;--code-background: #101511;--code-text: #e8efe7;--radius-md: 8px;--shadow-panel: 0 1px 2px rgba(20, 28, 18, .05), 0 14px 34px rgba(20, 28, 18, .08);--focus-ring-color: #cfe5d9}*{box-sizing:border-box}html,body,#root{min-height:100%}body{margin:0;background:var(--surface-base);color:var(--text-primary);font:14px/1.45 system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}button,input,select,textarea{font:inherit}a{color:inherit}code{display:inline-block;max-width:100%;overflow:hidden;color:var(--accent-object);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;text-overflow:ellipsis;white-space:nowrap}.app-shell{display:grid;grid-template-rows:auto minmax(0,1fr) auto;min-height:100vh}.top-bar,.activity-footer{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 20px;border-bottom:1px solid var(--border-default);background:var(--surface-overlay)}.activity-footer{border-top:1px solid var(--border-default);border-bottom:0;color:var(--text-secondary);font-size:12px;flex-wrap:wrap}.activity-status{font-weight:800}.activity-status.pending{color:var(--accent-object)}.activity-status.success{color:var(--accent-primary)}.activity-status.error{color:var(--accent-danger)}.service-surface{padding:16px}.brand-block,.top-actions,.service-card-head{display:flex;align-items:center;gap:12px;min-width:0}.brand-title{color:var(--text-primary);font-size:18px;font-weight:700;text-decoration:none}.status-pill,.service-status{display:inline-flex;align-items:center;gap:6px;border-radius:999px;padding:4px 10px;background:var(--surface-success-soft);color:var(--accent-primary);font-size:12px;font-weight:700}.status-pill.attention,.service-status.disabled{background:var(--surface-warning-soft);color:var(--accent-warning)}.status-dot{width:7px;height:7px;border-radius:50%;background:currentColor}.count-pill{border-radius:999px;padding:3px 8px;background:var(--surface-success-soft);color:var(--accent-primary);font-size:12px;font-weight:800}.service-switcher,.tabs{display:inline-flex;gap:2px;padding:3px;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-subtle)}.service-switcher a{display:inline-flex;align-items:center;justify-content:center;gap:7px;min-width:48px;padding:6px 10px;border-radius:6px;color:var(--text-secondary);font-weight:700;text-align:center;text-decoration:none}.service-switcher a.active,.tabs button.active{background:var(--surface-panel);color:var(--accent-primary)}.switcher-status{display:inline-flex;align-items:center;gap:4px;color:var(--text-secondary);font-size:11px;font-weight:800}.switcher-status.disabled{color:var(--accent-warning)}.segmented-control{display:inline-flex;align-self:end;border:1px solid var(--border-default);border-radius:var(--radius-md);overflow:hidden}.segmented-control button{border:0;border-right:1px solid var(--border-default);padding:9px 12px;background:var(--surface-panel);color:var(--text-secondary);font-weight:800;cursor:pointer}.segmented-control button:last-child{border-right:0}.segmented-control button.active{background:var(--surface-segment-active);color:var(--accent-primary)}.service-index-page{display:grid;gap:14px}.service-index-summary{display:flex;align-items:end;justify-content:space-between;gap:16px}.service-index-summary h1{margin:0;font-size:22px;line-height:28px}.service-index-summary p{margin:4px 0 0;color:var(--text-secondary)}.health-summary{display:grid;grid-template-columns:repeat(3,minmax(72px,1fr));gap:8px;margin:0}.health-summary div{min-width:0;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:8px 10px;background:var(--surface-panel)}.health-summary dt{color:var(--text-secondary);font-size:11px;font-weight:700;text-transform:uppercase}.health-summary dd{margin:2px 0 0;font-size:18px;font-weight:800}.service-index,.s3-workspace,.gcs-workspace,.dynamodb-workspace,.mail-workspace{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}.mail-workspace{grid-template-columns:minmax(280px,420px) minmax(320px,1fr);align-items:start}.s3-workspace{grid-template-columns:minmax(260px,320px) minmax(360px,1fr) minmax(280px,360px);align-items:start;gap:14px}.gcs-workspace{grid-template-columns:minmax(240px,320px) minmax(360px,1fr) minmax(260px,340px);align-items:start}.dynamodb-workspace{grid-template-columns:minmax(260px,340px) minmax(360px,1fr) minmax(260px,360px);align-items:start}.service-card{color:inherit;text-decoration:none}.service-card h2,.panel-head h2{margin:0;font-size:14px;line-height:20px}.panel{min-width:0;overflow:hidden;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-panel);box-shadow:var(--shadow-panel)}.panel-head{padding:12px 14px;border-bottom:1px solid var(--border-default);background:var(--surface-panel-muted)}.panel-body{padding:14px}.panel p,.empty-state p{margin:6px 0 0;color:var(--text-secondary)}.empty-state{border:1px dashed var(--border-empty);border-radius:var(--radius-md);padding:18px;background:var(--surface-panel-muted)}.placeholder-grid{display:grid;gap:12px}.button,.tabs button,.compat-link{min-height:34px;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:7px 10px;background:var(--surface-panel);color:var(--text-primary);font-weight:700;text-decoration:none}.button{cursor:pointer}.button.danger{border-color:var(--border-danger);color:var(--accent-danger)}.button:disabled{cursor:not-allowed;opacity:.58}.notifications-toggle.is-on{border-color:var(--border-accent, var(--border-strong, currentColor));color:var(--accent-primary, currentColor)}.notifications-toggle.is-disabled{opacity:.58}.prefix-filter,.mail-filter,.compact-filter{display:grid;gap:6px}.compact-filter{min-width:180px}.compact-filter.small{min-width:96px}.compact-filter.wide{min-width:280px}.prefix-filter span,.mail-filter span,.compact-filter span,.redshift-sql-editor span,.inspector-label,.inspector-list dt,.metadata-list dt{color:var(--text-secondary);font-size:11px;font-weight:800;text-transform:uppercase}.prefix-filter input,.prefix-filter textarea,.mail-filter input,.compact-filter input,.compact-filter select,.compact-filter textarea{width:100%;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:9px 10px;background:var(--surface-panel);color:var(--text-primary)}.prefix-filter textarea,.compact-filter textarea{resize:vertical}.prefix-filter textarea{min-height:72px}.compact-filter textarea{min-height:86px}.prefix-filter input:focus,.prefix-filter textarea:focus,.mail-filter input:focus,.compact-filter input:focus,.compact-filter select:focus,.compact-filter textarea:focus,.redshift-sql-editor textarea:focus{border-color:var(--accent-primary);outline:2px solid var(--focus-ring-color);outline-offset:1px}.prefix-filter input:disabled,.prefix-filter textarea:disabled,.compact-filter input:disabled,.compact-filter select:disabled,.compact-filter textarea:disabled{background:var(--surface-subtle);color:var(--text-secondary)}.endpoint-summary{display:grid;gap:6px;margin:14px 0 0;padding-top:12px;border-top:1px solid var(--border-default)}.endpoint-summary dt{margin:0;color:var(--text-secondary);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.endpoint-summary dd{margin:0;min-width:0}.endpoint-summary dd code{font-size:13px}.inspector-list,.metadata-list{display:grid;gap:8px;margin:0}.inspector-list div,.metadata-list div{min-width:0}.inspector-list dd,.metadata-list dd{margin:2px 0 0;overflow-wrap:anywhere}.inspector-muted{margin:4px 0 0;color:var(--text-secondary)}.inspector-download{justify-self:start}.inspector-heading{display:flex;align-items:start;justify-content:space-between;gap:10px}.inspector-heading h3{margin:0}.object-table-wrap,.dynamodb-item-table-wrap{max-width:100%;overflow-x:auto}.object-table,.dynamodb-item-table{width:100%;border-collapse:collapse}.object-table{min-width:640px}.dynamodb-item-table{min-width:680px}.dynamodb-item-table.compact{min-width:520px}.object-table th,.object-table td,.dynamodb-item-table th,.dynamodb-item-table td{padding:10px;border-bottom:1px solid var(--border-default);text-align:left;vertical-align:top}.object-table th,.dynamodb-item-table th{color:var(--text-secondary);font-size:11px;text-transform:uppercase}.object-table td,.dynamodb-item-table td{color:var(--text-secondary)}.object-row.active td,.item-row.active td{background:var(--surface-active)}.item-row{cursor:pointer}.object-select{display:block;max-width:100%;border:0;padding:0;background:transparent;text-align:left;cursor:pointer}.object-select:hover .object-key,.object-select:focus-visible .object-key{color:var(--accent-primary);text-decoration:underline}.object-key{display:block;max-width:320px;overflow:hidden;color:var(--text-primary);font-weight:800;text-overflow:ellipsis;white-space:nowrap}.object-action{color:var(--accent-object);font-weight:800;text-decoration:none}.object-inspector,.dynamodb-inspector{display:grid;gap:14px}.bucket-list,.dynamodb-table-list{display:grid;gap:8px}.mail-list,.mail-inspector{display:grid;gap:10px}.bucket-item,.dynamodb-table-row,.mail-row{width:100%;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:10px;background:var(--surface-panel);color:var(--text-primary);text-align:left;cursor:pointer}.bucket-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:start}.dynamodb-table-row{display:grid;gap:6px}.mail-row{display:grid;gap:5px}.bucket-item:hover,.bucket-item.active,.dynamodb-table-row:hover,.dynamodb-table-row.active,.mail-row:hover,.mail-row.active{border-color:var(--border-active);background:var(--surface-active)}.bucket-name,.bucket-meta{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bucket-name{font-weight:800}.bucket-meta{margin-top:3px;color:var(--text-secondary);font-size:12px}.s3-toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px}.s3-toolbar span,.toolbar-count{color:var(--text-secondary);font-size:12px;font-weight:800}.s3-object-form{display:grid;grid-template-columns:minmax(160px,1fr) minmax(140px,.8fr) minmax(160px,1fr) auto;gap:10px;align-items:end;border-bottom:1px solid var(--border-default);padding-bottom:12px}.s3-metadata-input{grid-column:1 / -2}.s3-copy-form{display:grid;gap:10px;border-top:1px solid var(--border-default);padding-top:12px}.multipart-upload-list{display:grid;gap:8px;border-bottom:1px solid var(--border-default);padding-bottom:12px}.multipart-upload-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:start;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:10px;background:var(--surface-subtle)}.multipart-upload-row div{display:grid;min-width:0;gap:3px}.multipart-upload-row strong,.multipart-upload-row span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.multipart-upload-row span{color:var(--text-secondary);font-size:12px}.object-browser,.gcs-sidebar,.gcs-create-bucket{display:grid;gap:12px}.gcs-create-bucket{grid-template-columns:minmax(0,1fr) auto;align-items:end}.gcs-bucket-row{grid-template-columns:minmax(0,1fr) auto auto}.gcs-message{grid-column:1 / -1}.pubsub-action-form,.pubsub-action-row{display:flex;align-items:end;gap:8px;flex-wrap:wrap;margin:0 0 12px}.pubsub-action-form.stacked{margin:12px 0 0;padding-top:12px;border-top:1px solid var(--border-default)}.operation-message{margin:0 0 12px;border-radius:var(--radius-md);padding:8px 10px;font-weight:750}.operation-message.success{background:var(--surface-success-soft);color:var(--accent-primary)}.operation-message.error{background:var(--surface-error-soft);color:var(--accent-danger)}.pulled-message-list{display:grid;gap:8px;margin:10px 0 14px}.pulled-message{display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px;align-items:start;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:8px;background:var(--surface-subtle)}.pulled-message strong,.pulled-message code{display:block}.dynamodb-toolbar{display:flex;align-items:end;justify-content:space-between;gap:10px;margin-bottom:12px;flex-wrap:wrap}.table-row-top,.table-row-tags{display:flex;align-items:center;justify-content:space-between;gap:8px}.table-row-name,.table-row-meta{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.table-row-name{font-weight:800}.table-row-meta,.table-row-tags{color:var(--text-secondary);font-size:12px}.table-row-tags{justify-content:flex-start;flex-wrap:wrap;font-weight:700}.attribute-preview{display:flex;flex-wrap:wrap;gap:5px}.attribute-chip{max-width:220px;overflow:hidden;border:1px solid var(--border-default);border-radius:999px;padding:2px 7px;color:var(--text-secondary);font-size:12px;text-overflow:ellipsis;white-space:nowrap}.dynamodb-key-lookup{display:grid;gap:8px;margin-top:12px;border-top:1px solid var(--border-default);padding-top:12px}.dynamodb-operation-stack,.dynamodb-query-scan{display:grid;gap:12px}.dynamodb-operation-form{display:grid;gap:8px;border-bottom:1px solid var(--border-default);padding-bottom:12px}.dynamodb-operation-form:last-child{border-bottom:0;padding-bottom:0}.dynamodb-operation-form textarea{min-height:118px}.destructive-confirmation{display:flex;align-items:flex-start;gap:8px;border:1px solid var(--border-danger-soft);border-radius:var(--radius-md);padding:9px 10px;background:var(--surface-danger-soft);color:var(--accent-danger);font-size:12px;font-weight:800}.destructive-confirmation input{margin-top:2px}.dynamodb-query-scan-form{display:flex;align-items:end;gap:10px;flex-wrap:wrap}.dynamodb-query-scan-form .redshift-sql-editor{min-width:min(100%,420px);flex:1 1 420px}.dynamodb-query-scan-form textarea{min-height:92px}.dynamodb-query-result-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(280px,.9fr);gap:12px;align-items:start}.dynamodb-recent-operations{display:grid;gap:10px;border-top:1px solid var(--border-default);padding-top:12px}.redshift-query-runner{display:grid;gap:10px;border-bottom:1px solid var(--border-default);padding-bottom:14px}.redshift-query-form,.redshift-query-result{display:grid;gap:10px}.redshift-sql-editor{display:grid;gap:6px}.redshift-sql-editor textarea{width:100%;min-height:120px;resize:vertical;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:10px;background:var(--surface-panel);color:var(--text-primary);font:13px/1.45 ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace}.query-column-type{display:block;margin-top:2px;color:var(--text-secondary);font-size:10px;font-weight:700;text-transform:none}.mail-toolbar{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:10px;align-items:end;margin-bottom:12px}.mail-row-top{display:flex;justify-content:space-between;gap:10px;color:var(--text-secondary);font-size:12px}.mail-from,.mail-subject,.mail-snippet{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mail-from,.mail-subject{color:var(--text-primary);font-weight:800}.mail-snippet{color:var(--text-secondary)}.mail-inspector h3{margin:0;font-size:18px;line-height:24px}.mail-inspector p{margin:4px 0 0;color:var(--text-secondary)}.mail-preview{max-height:360px;overflow:auto;border-radius:var(--radius-md);padding:12px;background:var(--code-background);color:var(--code-text);white-space:pre-wrap}.attachment-list{display:grid;gap:6px;margin:6px 0 0;padding:0;list-style:none}.attachment-list li{display:grid;gap:2px;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:8px}.attachment-list span:last-child{color:var(--text-secondary);font-size:12px}.dialog-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;padding:16px;background:var(--surface-scrim)}.dialog{width:min(480px,100%);border:1px solid var(--border-default);border-radius:var(--radius-md);padding:16px;background:var(--surface-panel)}.dialog-head{display:flex;align-items:center;justify-content:space-between;gap:12px}.dialog-copy{margin:12px 0 0;color:var(--text-secondary)}.dialog-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:16px}@media(max-width:720px){.top-bar,.brand-block,.top-actions,.service-index-summary{align-items:stretch;flex-direction:column}.health-summary{grid-template-columns:repeat(3,minmax(0,1fr))}.service-switcher{overflow-x:auto}.s3-workspace,.gcs-workspace,.dynamodb-workspace,.mail-workspace,.s3-object-form,.gcs-create-bucket,.gcs-bucket-row{grid-template-columns:1fr}.s3-metadata-input{grid-column:auto}.mail-toolbar,.dynamodb-query-result-grid{grid-template-columns:1fr}}.s3-bucket-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:10px}.s3-bucket-count{color:var(--text-secondary);font-size:12px;font-weight:700}.s3-bucket-create{display:flex;gap:8px;margin-bottom:12px}.s3-bucket-list{display:grid;gap:2px;margin:0;padding:0;list-style:none}.s3-bucket-row{position:relative;display:flex;align-items:stretch;gap:4px;padding:2px 6px 2px 10px;border:1px solid transparent;border-radius:var(--radius-md)}.s3-bucket-row:before{content:"";position:absolute;top:8px;bottom:8px;left:2px;width:3px;border-radius:999px;background:transparent;transition:background .12s ease-out}.s3-bucket-row:hover{background:var(--surface-subtle)}.s3-bucket-row.active{background:var(--surface-active);border-color:var(--border-active)}.s3-bucket-row.active:before{background:var(--accent-primary)}.s3-bucket-select{display:flex;flex:1;min-width:0;align-items:center;gap:10px;padding:8px 0;border:0;background:transparent;color:var(--text-primary);text-align:left;cursor:pointer}.s3-bucket-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;background:var(--surface-success-soft);color:var(--accent-primary)}.s3-bucket-row.active .s3-bucket-icon{background:var(--surface-panel);color:var(--accent-primary)}.s3-bucket-info{display:grid;flex:1;min-width:0;gap:2px}.s3-bucket-name{min-width:0;font-size:13px;font-weight:700;line-height:1.3;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.s3-bucket-meta{color:var(--text-secondary);font-size:11px;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.s3-bucket-delete{align-self:center;opacity:0;transition:opacity .12s ease-out}.s3-bucket-row:hover .s3-bucket-delete,.s3-bucket-row.active .s3-bucket-delete,.s3-bucket-delete:focus-visible{opacity:1}.s3-browser{display:grid;gap:12px}.s3-browser-toolbar{display:flex;align-items:stretch;gap:8px}.s3-search{position:relative;display:flex;align-items:center;flex:1;min-width:0}.s3-search svg{position:absolute;left:10px;color:var(--text-secondary);pointer-events:none}.s3-search input{flex:1;min-width:0;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:8px 12px 8px 30px;background:var(--surface-panel);color:var(--text-primary);font:inherit}.s3-search input::-webkit-search-cancel-button{-webkit-appearance:none;-moz-appearance:none;appearance:none}.s3-search input:focus{border-color:var(--accent-primary);outline:2px solid var(--focus-ring-color);outline-offset:1px}.s3-text-input{width:100%;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:7px 10px;background:var(--surface-panel);color:var(--text-primary);font:inherit}.s3-text-input:focus{border-color:var(--accent-primary);outline:2px solid var(--focus-ring-color);outline-offset:1px}textarea.s3-text-input{min-height:56px;resize:vertical;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px}.s3-file-input{width:100%;padding:6px 0}.s3-upload-details{flex:none;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-panel)}.s3-upload-details summary{list-style:none;display:inline-flex;align-items:center;gap:6px;padding:8px 12px;cursor:pointer;color:var(--text-primary);font-weight:700;font-size:13px}.s3-upload-details summary::-webkit-details-marker{display:none}.s3-upload-details[open] summary{border-bottom:1px solid var(--border-default)}.s3-upload-form{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px;padding:12px}.s3-field{display:grid;gap:4px;min-width:0}.s3-field span,.s3-field-label{color:var(--text-secondary);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.s3-field-full{grid-column:1 / -1}.s3-upload-actions{grid-column:1 / -1;display:flex;justify-content:flex-end}.s3-object-table-wrap{max-width:100%;overflow-x:auto;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-panel)}.s3-object-table{width:100%;min-width:600px;border-collapse:collapse}.s3-object-table thead th{position:sticky;top:0;z-index:1;padding:10px 12px;background:var(--surface-panel-muted);border-bottom:1px solid var(--border-default);color:var(--text-secondary);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;text-align:left}.s3-object-table tbody td{padding:10px 12px;border-bottom:1px solid var(--border-default);color:var(--text-secondary);vertical-align:middle;white-space:nowrap}.s3-object-table tbody tr:last-child td{border-bottom:0}.s3-object-table tbody tr:hover td{background:var(--surface-subtle)}.s3-object-table tbody tr.active td{background:var(--surface-active)}.s3-object-key{max-width:320px;display:inline-block;border:0;padding:0;background:transparent;color:var(--text-primary);font:inherit;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.s3-object-key:hover,.s3-object-key:focus-visible{color:var(--accent-primary);text-decoration:underline}.s3-object-numeric,.s3-object-type{font-variant-numeric:tabular-nums}.s3-object-actions-head{width:72px}.s3-object-actions{text-align:right}.s3-object-actions>*+*{margin-left:2px}.s3-icon-button{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:0;border-radius:6px;background:transparent;color:var(--text-secondary);cursor:pointer;transition:background .12s ease-out,color .12s ease-out}.s3-icon-button:hover,.s3-icon-button:focus-visible{background:var(--surface-subtle)}.s3-icon-button.neutral{color:var(--accent-object)}.s3-icon-button.danger{color:var(--accent-danger)}.s3-icon-button.danger:hover,.s3-icon-button.danger:focus-visible{background:var(--surface-error-soft)}.s3-icon-button:disabled{cursor:not-allowed;opacity:.45}.s3-multipart-details{border:1px solid var(--border-empty);border-radius:var(--radius-md);background:var(--surface-panel-muted)}.s3-multipart-details summary{display:flex;align-items:center;gap:8px;padding:8px 12px;cursor:pointer;color:var(--text-secondary);font-size:12px;font-weight:700;list-style:none}.s3-multipart-details summary::-webkit-details-marker{display:none}.s3-multipart-count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;padding:0 6px;border-radius:999px;background:var(--surface-warning-soft);color:var(--accent-warning);font-size:11px;font-weight:800}.s3-multipart-list{margin:0;padding:0 12px 12px;list-style:none;display:grid;gap:8px}.s3-multipart-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:center;padding:8px 10px;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-panel)}.s3-multipart-meta{display:grid;gap:2px;min-width:0}.s3-multipart-meta strong,.s3-multipart-meta code,.s3-multipart-meta span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.s3-multipart-meta span{color:var(--text-secondary);font-size:12px}.s3-inspector{display:grid;gap:14px}.s3-inspector-section{display:grid;gap:4px;min-width:0}.s3-inspector-key{display:block;padding:6px 10px;border-radius:var(--radius-md);background:var(--surface-active);color:var(--text-primary);font-size:13px;font-weight:700;overflow-wrap:anywhere;white-space:normal}.s3-inspector-uri{display:block;padding:6px 10px;border-radius:var(--radius-md);background:var(--surface-subtle);color:var(--text-secondary);font-size:12px;overflow-wrap:anywhere;white-space:normal}.s3-inspector-list{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:8px 12px;margin:0}.s3-inspector-list div{min-width:0}.s3-inspector-list dt{color:var(--text-secondary);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.s3-inspector-list dd{margin:2px 0 0;color:var(--text-primary);overflow-wrap:anywhere}.s3-inspector-metadata{display:grid;gap:6px;margin:0}.s3-inspector-metadata div{display:grid;grid-template-columns:minmax(0,.4fr) minmax(0,1fr);gap:8px;padding:4px 0;border-bottom:1px dashed var(--border-empty)}.s3-inspector-metadata div:last-child{border-bottom:0}.s3-inspector-metadata dt{color:var(--text-secondary);font-size:12px;font-weight:700}.s3-inspector-metadata dd{margin:0;color:var(--text-primary);overflow-wrap:anywhere}.s3-inspector-muted{margin:0;color:var(--text-secondary);font-size:12px}.s3-inspector-download{display:inline-flex;align-items:center;gap:6px;align-self:start;padding:7px 12px;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-panel);color:var(--accent-object);font-weight:700;text-decoration:none}.s3-inspector-download:hover{background:var(--surface-subtle)}.s3-inspector-copy{display:grid;gap:8px;padding-top:12px;border-top:1px solid var(--border-default)}.s3-inspector-copy .button{justify-self:end}.s3-inspector-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;padding:32px 16px;color:var(--text-secondary);text-align:center}.s3-inspector-empty svg{color:var(--border-active)}.s3-inspector-empty-title{margin:6px 0 0;color:var(--text-primary);font-weight:700}.s3-inspector-empty-body{margin:0;font-size:13px}.s3-status-banner{grid-column:1 / -1;margin:0;padding:8px 12px;border:1px solid var(--border-empty);border-radius:var(--radius-md);background:var(--surface-success-soft);color:var(--accent-primary);font-size:12px;font-weight:700}@media(max-width:1000px){.s3-upload-form,.s3-inspector-list{grid-template-columns:1fr}}.confirm-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;display:grid;place-items:center;padding:16px;background:var(--surface-scrim);animation:confirm-fade .12s ease-out}.confirm-dialog{width:min(440px,100%);border:1px solid var(--border-default);border-radius:var(--radius-md);padding:18px 20px 16px;background:var(--surface-panel);box-shadow:0 18px 48px #141c122e,0 2px 6px #141c1214;animation:confirm-pop .14s ease-out}.confirm-dialog.tone-danger{border-color:var(--border-danger)}.confirm-title{margin:0;font-size:16px;line-height:22px;font-weight:700}.confirm-body{display:grid;gap:6px;margin:10px 0 0}.confirm-description{margin:0;color:var(--text-secondary);font-size:13px;line-height:1.5}.confirm-detail{margin:0;color:var(--text-primary);font-size:12px;overflow-wrap:anywhere}.confirm-detail code{font-size:12px}.confirm-phrase{display:grid;gap:6px;margin-top:14px}.confirm-phrase label{color:var(--text-secondary);font-size:12px}.confirm-phrase label code{padding:1px 6px;border-radius:4px;background:var(--surface-subtle);color:var(--text-primary);font-size:12px}.confirm-phrase-input{width:100%;border:1px solid var(--border-default);border-radius:var(--radius-md);padding:8px 10px;background:var(--surface-panel);color:var(--text-primary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px}.confirm-phrase-input:focus{border-color:var(--accent-primary);outline:2px solid var(--focus-ring-color);outline-offset:1px}.confirm-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:18px}.confirm-actions .button.primary{border-color:var(--accent-primary);background:var(--accent-primary);color:var(--surface-panel)}.confirm-actions .button.primary:hover:not(:disabled){background:var(--text-primary);border-color:var(--text-primary)}.confirm-actions .button.danger.primary{border-color:var(--accent-danger);background:var(--accent-danger);color:var(--surface-panel)}.confirm-actions .button.danger.primary:hover:not(:disabled){background:#921b13;border-color:#921b13}@keyframes confirm-fade{0%{opacity:0}to{opacity:1}}@keyframes confirm-pop{0%{transform:translateY(6px) scale(.98);opacity:0}to{transform:translateY(0) scale(1);opacity:1}}.redis-shell{display:grid;grid-template-rows:auto minmax(0,1fr);gap:14px;min-width:0}.redis-status-bar{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;padding:12px 14px;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-panel);box-shadow:var(--shadow-panel)}.redis-status-bar-loading{display:flex;justify-content:center;color:var(--text-secondary);font-size:13px}.redis-status-bar-error{border-color:var(--border-danger);background:var(--surface-error-soft)}.redis-status-cell{display:flex;flex-direction:column;gap:2px;min-width:0}.redis-status-cell-wide{grid-column:span 2}.redis-status-cell .cell-label{color:var(--text-secondary);font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.redis-status-cell .cell-value,.redis-status-cell code{color:var(--text-primary);font-size:13px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.redis-status-cell code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.redis-mode-pill{position:relative}.redis-mode-pill .cell-value{display:inline-flex;align-items:center;gap:6px;padding:2px 8px;border-radius:999px;background:var(--surface-segment-active);color:var(--accent-primary);font-size:12px}.redis-mode-external .cell-value{background:var(--surface-warning-soft);color:var(--accent-warning)}.redis-workspace{display:grid;grid-template-columns:minmax(320px,460px) minmax(360px,1fr) minmax(280px,360px);gap:14px;align-items:start}@media(max-width:1280px){.redis-workspace{grid-template-columns:minmax(300px,1fr) minmax(280px,1fr)}.redis-workspace>:nth-child(3){grid-column:1 / -1}}@media(max-width:880px){.redis-workspace{grid-template-columns:1fr}.redis-workspace>:nth-child(3){grid-column:auto}}.redis-keys-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 0 8px;flex-wrap:wrap}.redis-toolbar-actions{display:inline-flex;gap:6px}.redis-keys-count{display:inline-flex;align-items:baseline;gap:4px;font-size:13px}.redis-keys-count strong{font-size:16px;font-weight:600}.redis-keys-count-total{color:var(--text-secondary);font-size:12px}.redis-match-field{display:flex;flex-direction:column;gap:4px;margin-bottom:10px;font-size:12px;color:var(--text-secondary)}.redis-match-field input{padding:6px 10px;border:1px solid var(--border-default);border-radius:6px;background:var(--surface-panel);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.redis-match-field input:focus{outline:none;border-color:var(--border-active);box-shadow:0 0 0 3px var(--focus-ring-color)}.redis-message{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 0 10px;padding:8px 12px;border-radius:6px;font-size:13px}.redis-message-success{background:var(--surface-success-soft);color:var(--accent-primary)}.redis-message-warning{background:var(--surface-warning-soft);color:var(--accent-warning)}.redis-message-error{background:var(--surface-error-soft);color:var(--accent-danger)}.redis-message-close{border:0;background:transparent;color:inherit;cursor:pointer;font-size:16px;line-height:1}.redis-key-list{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:4px;max-height:64vh;overflow-y:auto}.redis-key-row{width:100%;display:grid;gap:4px;padding:8px 10px;border:1px solid var(--border-default);border-radius:6px;background:var(--surface-panel);color:inherit;cursor:pointer;text-align:left}.redis-key-row:hover{border-color:var(--border-active);background:var(--surface-panel-muted)}.redis-key-row.active{border-color:var(--border-active);background:var(--surface-active)}.redis-key-row-top{display:inline-flex;align-items:center;gap:6px}.redis-key-row-name{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.4;color:var(--text-primary);word-break:break-all;overflow-wrap:anywhere;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.redis-inspector{display:flex;flex-direction:column;gap:16px}.redis-inspector-header{display:flex;flex-direction:column;gap:8px;padding-bottom:12px;border-bottom:1px solid var(--border-default)}.redis-inspector-eyebrow{font-size:11px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--text-secondary)}.redis-key-title-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.redis-key-title{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:15px;font-weight:600;color:var(--text-primary);word-break:break-all;white-space:normal;max-width:100%;overflow:visible}.redis-copy-button{border:1px solid var(--border-default);border-radius:4px;background:var(--surface-panel);color:var(--text-secondary);cursor:pointer;font-size:11px;padding:2px 6px}.redis-copy-button:hover{border-color:var(--border-active);color:var(--text-primary)}.redis-key-badges{display:inline-flex;align-items:center;flex-wrap:wrap;gap:6px}.redis-badge{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:999px;font-size:11px;font-weight:600;letter-spacing:.02em;background:var(--surface-segment-active);color:var(--accent-primary)}.redis-type-string{background:#e6effa;color:var(--accent-object)}.redis-type-list{background:#f0e9f5;color:#6c2c84}.redis-type-hash{background:var(--surface-segment-active);color:var(--accent-primary)}.redis-type-set{background:#fbebd6;color:var(--accent-warning)}.redis-type-zset{background:#fbe2dd;color:var(--accent-danger)}.redis-type-stream{background:#ddefe7;color:var(--accent-primary)}.redis-type-none,.redis-type-unknown{background:var(--surface-subtle);color:var(--text-secondary)}.redis-ttl-active{background:var(--surface-segment-active);color:var(--accent-primary)}.redis-ttl-persistent{background:var(--surface-subtle);color:var(--text-secondary)}.redis-ttl-missing{background:var(--surface-error-soft);color:var(--accent-danger)}.redis-size{background:var(--surface-subtle);color:var(--text-secondary)}.redis-inspector-section{display:flex;flex-direction:column;gap:8px}.redis-section-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.redis-value-string{display:flex;flex-direction:column;gap:6px}.redis-value-toolbar{display:flex;justify-content:space-between;align-items:center;gap:8px;font-size:12px;color:var(--text-secondary)}.redis-segmented{display:inline-flex;border:1px solid var(--border-default);border-radius:6px;overflow:hidden}.redis-segmented button{border:0;padding:3px 10px;background:var(--surface-panel);color:var(--text-secondary);cursor:pointer;font-size:11px}.redis-segmented button.active{background:var(--surface-segment-active);color:var(--accent-primary);font-weight:600}.redis-value-pre{margin:0;padding:12px;border:1px solid var(--border-default);border-radius:6px;background:var(--code-background);color:var(--code-text);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.5;max-height:360px;overflow:auto;white-space:pre-wrap;word-break:break-word}.redis-list-view{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:4px;max-height:360px;overflow-y:auto}.redis-list-view li{display:grid;grid-template-columns:40px 1fr;gap:8px;align-items:baseline;padding:6px 10px;border:1px solid var(--border-default);border-radius:6px;background:var(--surface-panel-muted)}.redis-list-index{color:var(--text-secondary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;text-align:right}.redis-list-value{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;word-break:break-all}.redis-hash-table,.redis-zset-table{width:100%;border-collapse:collapse;font-size:13px}.redis-hash-table th,.redis-hash-table td,.redis-zset-table th,.redis-zset-table td{padding:6px 10px;text-align:left;border-bottom:1px solid var(--border-default);vertical-align:top;word-break:break-all;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px}.redis-hash-table thead th,.redis-zset-table thead th{background:var(--surface-panel-muted);color:var(--text-secondary);font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.redis-zset-score{font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap}.redis-set-view{margin:0;padding:0;list-style:none;display:flex;flex-wrap:wrap;gap:6px}.redis-set-view li{padding:4px 10px;border:1px solid var(--border-default);border-radius:999px;background:var(--surface-panel-muted);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px}.redis-ttl-form{display:flex;align-items:flex-end;gap:8px;flex-wrap:wrap}.redis-ttl-form label{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--text-secondary)}.redis-ttl-form input{padding:6px 10px;border:1px solid var(--border-default);border-radius:6px;background:var(--surface-panel);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;width:120px}.redis-ttl-form input:focus{outline:none;border-color:var(--border-active);box-shadow:0 0 0 3px var(--focus-ring-color)}.redis-danger-row{display:flex;justify-content:flex-end;padding-top:8px;border-top:1px dashed var(--border-default)}.redis-runner{display:flex;flex-direction:column;gap:12px}.redis-runner-form{display:flex;flex-direction:column;gap:8px}.redis-runner-label{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--text-secondary)}.redis-runner-label textarea{padding:8px 10px;border:1px solid var(--border-default);border-radius:6px;background:var(--surface-panel);color:var(--text-primary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;line-height:1.5;resize:vertical}.redis-runner-label textarea:focus{outline:none;border-color:var(--border-active);box-shadow:0 0 0 3px var(--focus-ring-color)}.redis-runner-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px}.redis-runner-hint{color:var(--text-secondary);font-size:11.5px}.redis-runner-hint kbd{display:inline-block;padding:1px 5px;border:1px solid var(--border-default);border-radius:4px;background:var(--surface-panel-muted);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:10.5px}.redis-runner-history{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:8px}.redis-runner-entry{border:1px solid var(--border-default);border-radius:6px;padding:8px 10px;background:var(--surface-panel)}.redis-runner-success{border-left:3px solid var(--accent-primary)}.redis-runner-error{border-left:3px solid var(--accent-danger)}.redis-runner-entry-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.redis-runner-input{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:var(--text-primary);word-break:break-all}.redis-runner-rerun{border:1px solid var(--border-default);border-radius:4px;background:var(--surface-panel);color:var(--text-secondary);cursor:pointer;font-size:11px;padding:2px 8px}.redis-runner-rerun:hover{border-color:var(--border-active);color:var(--text-primary)}.redis-runner-detail{display:flex;align-items:center;gap:6px;margin:6px 0 0;font-size:12px;color:var(--text-secondary)}.redis-runner-tag{display:inline-block;padding:1px 6px;border-radius:4px;font-size:10.5px;font-weight:600;letter-spacing:.04em}.redis-runner-success .redis-runner-tag{background:var(--surface-success-soft);color:var(--accent-primary)}.redis-runner-error .redis-runner-tag{background:var(--surface-error-soft);color:var(--accent-danger)}.redis-runner-result{margin:8px 0 0;padding:8px 10px;border-radius:4px;background:var(--code-background);color:var(--code-text);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.5;max-height:200px;overflow:auto;white-space:pre-wrap;word-break:break-word}.mail-shell{display:grid;grid-template-columns:minmax(320px,420px) minmax(360px,1fr);gap:14px;align-items:start}@media(max-width:960px){.mail-shell{grid-template-columns:1fr}}.mail-inbox-toolbar{display:flex;align-items:flex-end;justify-content:space-between;gap:8px;margin-bottom:12px;flex-wrap:wrap}.mail-inbox-filter{display:flex;flex-direction:column;gap:4px;flex:1;min-width:180px;color:var(--text-secondary);font-size:12px}.mail-inbox-filter input{padding:6px 10px;border:1px solid var(--border-default);border-radius:6px;background:var(--surface-panel);color:var(--text-primary)}.mail-inbox-filter input:focus{outline:none;border-color:var(--border-active);box-shadow:0 0 0 3px var(--focus-ring-color)}.mail-inbox-actions{display:inline-flex;gap:6px}.mail-inbox-list{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:4px;max-height:70vh;overflow-y:auto}.mail-inbox-row{width:100%;display:grid;gap:4px;padding:10px 12px;border:1px solid var(--border-default);border-left:3px solid transparent;border-radius:6px;background:var(--surface-panel);color:inherit;cursor:pointer;text-align:left}.mail-inbox-row:hover{border-color:var(--border-active);background:var(--surface-panel-muted)}.mail-inbox-row.active{border-color:var(--border-active);border-left-color:var(--accent-primary);background:var(--surface-active)}.mail-inbox-row-top{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.mail-inbox-sender{font-weight:600;font-size:13px;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.mail-inbox-time{color:var(--text-secondary);font-size:11.5px;white-space:nowrap}.mail-inbox-subject{font-size:13px;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mail-inbox-snippet{color:var(--text-secondary);font-size:12px;line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.mail-inspector{display:flex;flex-direction:column;gap:14px;min-width:0}.mail-inspector-header{display:flex;flex-direction:column;gap:8px;padding-bottom:10px;border-bottom:1px solid var(--border-default)}.mail-subject{margin:0;font-size:18px;font-weight:600;line-height:1.35;color:var(--text-primary);word-break:break-word}.mail-recipients{margin:0;display:grid;grid-template-columns:1fr;gap:4px;font-size:13px}.mail-recipients-row{display:grid;grid-template-columns:72px 1fr;gap:10px;align-items:baseline}.mail-recipients-row dt{margin:0;font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--text-secondary)}.mail-recipients-row dd{margin:0;color:var(--text-primary);word-break:break-all}.mail-recipients-aux{margin-left:6px;color:var(--text-secondary);font-size:12px}.mail-eyebrow{font-size:11px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--text-secondary)}.mail-tabs{display:inline-flex;gap:4px;padding:4px;border:1px solid var(--border-default);border-radius:8px;background:var(--surface-panel-muted);align-self:flex-start}.mail-tab{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border:0;border-radius:6px;background:transparent;color:var(--text-secondary);cursor:pointer;font-size:12.5px;font-weight:500}.mail-tab:hover{color:var(--text-primary)}.mail-tab.active{background:var(--surface-panel);color:var(--text-primary);box-shadow:0 1px 2px #141c120f}.mail-tab-count{display:inline-block;padding:0 6px;border-radius:999px;background:var(--surface-segment-active);color:var(--accent-primary);font-size:11px;font-weight:600}.mail-preview{padding:16px 18px;border:1px solid var(--border-default);border-radius:8px;background:var(--surface-panel);color:var(--text-primary);font:14px/1.6 system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Hiragino Sans,Noto Sans JP,sans-serif;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;max-height:60vh;overflow-y:auto}.mail-preview a{color:var(--accent-object);text-decoration:underline;word-break:break-all}.mail-preview-error{display:flex;flex-direction:column;gap:4px;padding:12px 14px;border:1px solid var(--border-danger);border-radius:8px;background:var(--surface-error-soft);color:var(--accent-danger);font-size:13px}.mail-preview-error p{margin:0}.mail-attachment-list{margin:0;padding:0;list-style:none;display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px}.mail-attachment-item{display:grid;grid-template-columns:36px 1fr;gap:10px;align-items:center;padding:10px 12px;border:1px solid var(--border-default);border-radius:8px;background:var(--surface-panel)}.mail-attachment-icon{font-size:24px;line-height:1;text-align:center}.mail-attachment-body{display:flex;flex-direction:column;gap:2px;min-width:0}.mail-attachment-name{font-size:13px;font-weight:500;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mail-attachment-meta{font-size:11.5px;color:var(--text-secondary)}.mail-raw{display:flex;flex-direction:column;gap:6px}.mail-raw-toolbar{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--text-secondary)}.mail-raw-copy{border:1px solid var(--border-default);border-radius:4px;background:var(--surface-panel);color:var(--text-secondary);cursor:pointer;font-size:11px;padding:2px 8px}.mail-raw-copy:hover{border-color:var(--border-active);color:var(--text-primary)}.mail-raw-pre{margin:0;padding:12px;border:1px solid var(--border-default);border-radius:8px;background:var(--code-background);color:var(--code-text);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.55;max-height:60vh;overflow:auto;white-space:pre-wrap;word-break:break-word}.mail-headers{border:1px solid var(--border-default);border-radius:8px;background:var(--surface-panel-muted)}.mail-headers>summary{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;cursor:pointer;font-size:12.5px;color:var(--text-secondary);font-weight:600;letter-spacing:.03em;text-transform:uppercase}.mail-headers[open]>summary{border-bottom:1px solid var(--border-default)}.mail-headers-count{padding:1px 8px;border-radius:999px;background:var(--surface-segment-active);color:var(--accent-primary);font-size:11px;letter-spacing:0;text-transform:none}.mail-headers-empty{margin:0;padding:12px 14px;color:var(--text-secondary);font-size:13px}.mail-headers-table{width:100%;border-collapse:collapse;font-size:12.5px}.mail-headers-table th,.mail-headers-table td{padding:8px 14px;text-align:left;vertical-align:top;border-bottom:1px solid var(--border-default);word-break:break-all}.mail-headers-table th{width:200px;color:var(--text-secondary);font-weight:600;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px}.mail-headers-table tr:last-child th,.mail-headers-table tr:last-child td{border-bottom:0} diff --git a/internal/dashboard/assets/react/index.html b/internal/dashboard/assets/react/index.html index 0f6f9b5..d8a47e5 100644 --- a/internal/dashboard/assets/react/index.html +++ b/internal/dashboard/assets/react/index.html @@ -4,8 +4,8 @@ devcloud Dashboard - - + +
diff --git a/web/dashboard/src/app/services/redis/RedisDashboard.tsx b/web/dashboard/src/app/services/redis/RedisDashboard.tsx index 4ee40a9..8959468 100644 --- a/web/dashboard/src/app/services/redis/RedisDashboard.tsx +++ b/web/dashboard/src/app/services/redis/RedisDashboard.tsx @@ -15,6 +15,7 @@ import { listRedisKeys, runRedisCommand, } from './api' +import { highlightJSON, tryPrettyJSON } from './jsonHighlight' import type { RedisCommandResponse, RedisKeyDetail, RedisKeySummary, RedisStatus } from './types' const COMMAND_HISTORY_LIMIT = 8 @@ -504,9 +505,9 @@ function renderValueByType(detail: RedisKeyDetail): JSX.Element { } function StringValueView({ raw }: { raw: string }): JSX.Element { - const pretty = useMemo(() => tryFormatJSON(raw), [raw]) + const pretty = useMemo(() => tryPrettyJSON(raw), [raw]) const [mode, setMode] = useState<'pretty' | 'raw'>(pretty ? 'pretty' : 'raw') - const display = mode === 'pretty' && pretty ? pretty : raw + const showPretty = mode === 'pretty' && pretty !== undefined return (
@@ -534,7 +535,9 @@ function StringValueView({ raw }: { raw: string }): JSX.Element {
) : null}
-
{display}
+
+        {showPretty ? highlightJSON(pretty!) : raw}
+      
) } @@ -567,7 +570,7 @@ function HashValueView({ entries }: { entries: string[] }): JSX.Element { return ( {field} - {value} + ) })} @@ -576,6 +579,14 @@ function HashValueView({ entries }: { entries: string[] }): JSX.Element { ) } +function HashFieldValue({ raw }: { raw: string }): JSX.Element { + const pretty = useMemo(() => tryPrettyJSON(raw), [raw]) + if (pretty === undefined) { + return {raw} + } + return
{highlightJSON(pretty)}
+} + function SetValueView({ members }: { members: string[] }): JSX.Element { return (
    @@ -849,18 +860,6 @@ function parseCommand(value: string): { command: string; args: string[] } { return { command, args } } -function tryFormatJSON(value: string): string | undefined { - const trimmed = value.trim() - if (trimmed === '' || (trimmed[0] !== '{' && trimmed[0] !== '[' && trimmed[0] !== '"')) { - return undefined - } - try { - return JSON.stringify(JSON.parse(trimmed), null, 2) - } catch { - return undefined - } -} - function splitFirst(value: string, separator: string): [string, string] { const index = value.indexOf(separator) if (index === -1) { diff --git a/web/dashboard/src/app/services/redis/jsonHighlight.tsx b/web/dashboard/src/app/services/redis/jsonHighlight.tsx new file mode 100644 index 0000000..be2113e --- /dev/null +++ b/web/dashboard/src/app/services/redis/jsonHighlight.tsx @@ -0,0 +1,68 @@ +import type { ReactNode } from 'react' + +const TOKEN_PATTERN = + /("(?:\\.|[^"\\])*")(\s*:)?|(\b(?:true|false|null)\b)|(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)/g + +export function highlightJSON(source: string): ReactNode[] { + const nodes: ReactNode[] = [] + let lastIndex = 0 + let keyCounter = 0 + + TOKEN_PATTERN.lastIndex = 0 + let match: RegExpExecArray | null + while ((match = TOKEN_PATTERN.exec(source)) !== null) { + const [whole, stringLit, colonTail, keyword, number] = match + const start = match.index + + if (start > lastIndex) { + nodes.push(source.slice(lastIndex, start)) + } + + if (stringLit !== undefined) { + const isKey = colonTail !== undefined + nodes.push( + + {stringLit} + , + ) + if (colonTail) { + nodes.push(colonTail) + } + } else if (keyword !== undefined) { + const cls = keyword === 'null' ? 'json-token-null' : 'json-token-bool' + nodes.push( + + {keyword} + , + ) + } else if (number !== undefined) { + nodes.push( + + {number} + , + ) + } else { + nodes.push(whole) + } + + lastIndex = start + whole.length + } + + if (lastIndex < source.length) { + nodes.push(source.slice(lastIndex)) + } + + return nodes +} + +export function tryPrettyJSON(value: string): string | undefined { + const trimmed = value.trim() + if (trimmed === '' || (trimmed[0] !== '{' && trimmed[0] !== '[' && trimmed[0] !== '"')) { + return undefined + } + try { + return JSON.stringify(JSON.parse(trimmed), null, 2) + } catch { + return undefined + } +} diff --git a/web/dashboard/src/app/services/redshift/RedshiftDashboard.tsx b/web/dashboard/src/app/services/redshift/RedshiftDashboard.tsx index ab65ac2..62ce7f4 100644 --- a/web/dashboard/src/app/services/redshift/RedshiftDashboard.tsx +++ b/web/dashboard/src/app/services/redshift/RedshiftDashboard.tsx @@ -90,7 +90,7 @@ export function RedshiftDashboard({ service }: RedshiftDashboardProps): JSX.Elem } return ( -
    +
    {state.status === 'success' ? `${state.clusters.length} clusters` : 'Loading'} diff --git a/web/dashboard/src/styles/globals.css b/web/dashboard/src/styles/globals.css index 3267a25..8fecadb 100644 --- a/web/dashboard/src/styles/globals.css +++ b/web/dashboard/src/styles/globals.css @@ -284,6 +284,17 @@ code { align-items: start; } +.redshift-workspace { + display: grid; + grid-template-columns: minmax(260px, 340px) minmax(320px, 1fr); + align-items: start; + gap: 12px; +} + +.redshift-workspace > .panel:nth-of-type(3) { + grid-column: 1 / -1; +} + .service-card { color: inherit; text-decoration: none; @@ -545,6 +556,8 @@ code { border-bottom: 1px solid var(--border-default); text-align: left; vertical-align: top; + overflow-wrap: anywhere; + word-break: break-word; } .object-table th, @@ -1135,6 +1148,7 @@ code { .s3-workspace, .gcs-workspace, .dynamodb-workspace, + .redshift-workspace, .mail-workspace { grid-template-columns: 1fr; } @@ -2210,6 +2224,7 @@ textarea.s3-text-input { display: flex; flex-direction: column; gap: 16px; + min-width: 0; } .redis-inspector-header { @@ -2303,6 +2318,7 @@ textarea.s3-text-input { display: flex; flex-direction: column; gap: 8px; + min-width: 0; } .redis-section-head { @@ -2403,6 +2419,7 @@ textarea.s3-text-input { .redis-hash-table, .redis-zset-table { width: 100%; + table-layout: fixed; border-collapse: collapse; font-size: 13px; } @@ -2416,10 +2433,65 @@ textarea.s3-text-input { border-bottom: 1px solid var(--border-default); vertical-align: top; word-break: break-all; + overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12.5px; } +.redis-hash-table th:first-child, +.redis-hash-table td:first-child { + width: 34%; +} + +.redis-zset-table th:last-child, +.redis-zset-table td:last-child { + width: 96px; +} + +.redis-hash-table code, +.redis-zset-table code { + display: inline-block; + max-width: 100%; + overflow: visible; + white-space: normal; + text-overflow: clip; + word-break: break-all; + overflow-wrap: anywhere; +} + +.redis-value-pre-inline { + margin: 0; + max-height: 240px; + font-size: 12px; + line-height: 1.5; +} + +.json-code { + color: var(--code-text); +} + +.json-code .json-token-key { + color: #9ad1ff; + font-weight: 600; +} + +.json-code .json-token-string { + color: #b6e7a8; +} + +.json-code .json-token-number { + color: #f2c97d; +} + +.json-code .json-token-bool { + color: #f4a8c2; +} + +.json-code .json-token-null { + color: #b6bec8; + font-style: italic; +} + .redis-hash-table thead th, .redis-zset-table thead th { background: var(--surface-panel-muted);