fix: include pre-built dist in repo (no server-side build)

This commit is contained in:
Dorian
2026-03-17 03:40:20 +00:00
parent d88d3a0f74
commit 62664ac9da
214 changed files with 1612 additions and 1 deletions

1
neode-ui/.gitignore vendored
View File

@@ -8,7 +8,6 @@ pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local

BIN
neode-ui/dist/.DS_Store vendored Normal file

Binary file not shown.

BIN
neode-ui/dist/assets/.DS_Store vendored Normal file

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.modal-enter-active[data-v-46d35a3e],.modal-leave-active[data-v-46d35a3e]{transition:opacity .3s ease}.modal-enter-active .glass-card[data-v-46d35a3e],.modal-leave-active .glass-card[data-v-46d35a3e]{transition:transform .3s ease,opacity .3s ease}.modal-enter-from[data-v-46d35a3e],.modal-leave-to[data-v-46d35a3e]{opacity:0}.modal-enter-from .glass-card[data-v-46d35a3e],.modal-leave-to .glass-card[data-v-46d35a3e]{transform:scale(.95);opacity:0}.fade-enter-active[data-v-46d35a3e],.fade-leave-active[data-v-46d35a3e]{transition:opacity .3s ease}.fade-enter-from[data-v-46d35a3e],.fade-leave-to[data-v-46d35a3e]{opacity:0}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.app-session-root[data-v-6994c7f2]{width:100%;height:100%}.app-session-backdrop-inline[data-v-6994c7f2]{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#0006;padding:0}.app-session-inline[data-v-6994c7f2]{display:flex;flex-direction:column;overflow:hidden;width:100%;height:100%;border-radius:0}@media(min-width:768px){.app-session-backdrop-inline[data-v-6994c7f2]{padding:1.5rem}.app-session-inline[data-v-6994c7f2]{border-radius:1rem;max-width:calc(100% - 1rem);max-height:calc(100vh - 6rem);box-shadow:0 25px 50px -12px #00000080}}.app-session-backdrop-overlay[data-v-6994c7f2]{position:fixed;inset:0;z-index:2400;display:flex;align-items:center;justify-content:center;padding:0;background:#0009;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}@media(min-width:768px){.app-session-backdrop-overlay[data-v-6994c7f2]{padding:2.5rem}}.app-session-overlay[data-v-6994c7f2]{position:relative;z-index:10;display:flex;flex-direction:column;overflow:hidden;width:100%;height:100%;border-radius:0;box-shadow:0 25px 50px -12px #0009}@media(min-width:768px){.app-session-overlay[data-v-6994c7f2]{max-width:calc(100vw - 5rem);max-height:calc(100vh - 5rem);border-radius:1rem}}.app-session-fullscreen[data-v-6994c7f2]{display:flex;flex-direction:column;overflow:hidden;width:100%;height:100%;border-radius:0!important;max-width:none!important;max-height:none!important}.app-session-btn[data-v-6994c7f2]{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:8px;color:#ffffffb3;transition:all .15s ease;flex-shrink:0}.app-session-btn[data-v-6994c7f2]:hover{background:#ffffff26;color:#fff}.app-session-btn[data-v-6994c7f2]:disabled{opacity:.5}.mode-option[data-v-6994c7f2]{display:flex;align-items:center;gap:8px;width:100%;padding:10px 14px;font-size:13px;color:#ffffffb3;transition:all .15s ease;text-align:left}.mode-option[data-v-6994c7f2]:hover{background:#ffffff14;color:#fff}.mode-option-active[data-v-6994c7f2]{color:#fb923c;background:#fb923c14}.menu-fade-enter-active[data-v-6994c7f2],.menu-fade-leave-active[data-v-6994c7f2]{transition:opacity .15s ease,transform .15s ease}.menu-fade-enter-from[data-v-6994c7f2],.menu-fade-leave-to[data-v-6994c7f2]{opacity:0;transform:translateY(-4px)}.content-fade-enter-active[data-v-6994c7f2],.content-fade-leave-active[data-v-6994c7f2]{transition:opacity .2s ease}.content-fade-enter-from[data-v-6994c7f2],.content-fade-leave-to[data-v-6994c7f2]{opacity:0}

7
neode-ui/dist/assets/Apps-JbZuzA3H.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.modal-enter-active[data-v-5129aeb7],.modal-leave-active[data-v-5129aeb7]{transition:opacity .3s ease}.modal-enter-active .glass-card[data-v-5129aeb7],.modal-leave-active .glass-card[data-v-5129aeb7]{transition:transform .3s ease,opacity .3s ease}.modal-enter-from[data-v-5129aeb7],.modal-leave-to[data-v-5129aeb7]{opacity:0}.modal-enter-from .glass-card[data-v-5129aeb7],.modal-leave-to .glass-card[data-v-5129aeb7]{transform:scale(.95);opacity:0}

1
neode-ui/dist/assets/Chat-BLEXivD6.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.chat-loading[data-v-18b2b408]{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;z-index:10}.chat-loading-spinner[data-v-18b2b408]{width:32px;height:32px;border:3px solid rgba(255,255,255,.1);border-top-color:#fb923c;border-radius:50%;animation:spin-18b2b408 .8s linear infinite}@keyframes spin-18b2b408{to{transform:rotate(360deg)}}.fade-enter-active[data-v-18b2b408],.fade-leave-active[data-v-18b2b408]{transition:opacity .3s ease}.fade-enter-from[data-v-18b2b408],.fade-leave-to[data-v-18b2b408]{opacity:0}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{d as t,a8 as o,E as n,c as s,N as c,G as i,q as l}from"./index-DnbYEqLr.js";const a={key:0,class:"flex items-center gap-2 px-3 py-2 rounded-lg bg-white/5 border border-white/10",title:"Controller connected - use arrows & Enter to navigate"},x=t({__name:"ControllerIndicator",setup(d){const r=o();return(h,e)=>n(r).isActive?(l(),s("div",a,[...e[0]||(e[0]=[c('<svg class="w-5 h-5 text-amber-400/90 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><rect x="4" y="8" width="16" height="10" rx="2" stroke-width="2"></rect><circle cx="9" cy="13" r="1.5" fill="currentColor"></circle><circle cx="15" cy="13" r="1.5" fill="currentColor"></circle><path stroke-linecap="round" stroke-width="2" d="M12 10v2M11 11h2"></path></svg><span class="text-xs text-white/70 hidden sm:inline">Controller</span>',2)])])):i("",!0)}});export{x as _};

View File

@@ -0,0 +1 @@
.credential-input[data-v-1283cbe7]{background:#ffffff0d;border:1px solid rgba(255,255,255,.15);border-radius:.5rem;padding:.5rem .75rem;color:#ffffffe6;font-size:.875rem;outline:none;transition:border-color .2s ease}.credential-input[data-v-1283cbe7]:focus{border-color:#ffffff4d}.credential-input[data-v-1283cbe7]::-moz-placeholder{color:#ffffff4d}.credential-input[data-v-1283cbe7]::placeholder{color:#ffffff4d}select.credential-input[data-v-1283cbe7]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='rgba(255,255,255,0.5)' d='M6 8L1 3h10z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .75rem center;padding-right:2rem}select.credential-input option[data-v-1283cbe7]{background:#1a1a2e;color:#fff}textarea.credential-input[data-v-1283cbe7]{resize:vertical;min-height:4rem}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.network-map-container[data-v-0e9c18d1]{background:#0009;-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);border-radius:.75rem;border:1px solid rgba(255,255,255,.1);box-shadow:inset 0 1px #ffffff38;min-height:400px;width:100%}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.fade-enter-active[data-v-35eaa724],.fade-leave-active[data-v-35eaa724]{transition:opacity .3s ease}.fade-enter-from[data-v-35eaa724],.fade-leave-to[data-v-35eaa724]{opacity:0}

1
neode-ui/dist/assets/Home-BM_tfGHm.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.typing-caret[data-v-ed7f5b36]:after{content:"";display:inline-block;width:3px;height:1.1em;background:#fbbf24;margin-left:2px;vertical-align:text-bottom;animation:caret-blink-ed7f5b36 .7s step-end infinite}@keyframes caret-blink-ed7f5b36{0%,to{opacity:1}50%{opacity:0}}.grid>.home-card[data-v-ed7f5b36]{min-height:280px}.home-card-shell[data-v-ed7f5b36]{background-color:#000000a6;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);border-radius:1rem;overflow:hidden;box-shadow:0 8px 24px #00000073;border:1px solid transparent;height:100%}.home-card-animate .home-card-shell[data-v-ed7f5b36]{animation:card-fly-in-ed7f5b36 1.2s cubic-bezier(.25,.46,.45,.94) forwards;animation-delay:calc(var(--card-stagger) * .18s);opacity:0;transform:translateY(50px) scale(.92)}@keyframes card-fly-in-ed7f5b36{0%{opacity:0;transform:translateY(50px) scale(.92);border-color:transparent}75%{opacity:1;transform:translateY(0) scale(1);border-color:transparent}to{opacity:1;transform:translateY(0) scale(1);border-color:#ffffff2e}}.home-card-inner[data-v-ed7f5b36]{overflow:hidden;opacity:0}.home-card-animate .home-card-inner[data-v-ed7f5b36]{animation:inner-draw-ed7f5b36 .8s cubic-bezier(.25,.46,.45,.94) forwards;animation-delay:calc(var(--card-stagger) * .18s + .9s)}@keyframes inner-draw-ed7f5b36{0%{opacity:0;clip-path:inset(0 100% 0 0)}15%{opacity:1}to{opacity:1;clip-path:inset(0 0 0 0)}}.home-card-text[data-v-ed7f5b36],.home-card-stats[data-v-ed7f5b36]{overflow:hidden}.home-card-btn[data-v-ed7f5b36]{opacity:0;transform:scale(.5);border-color:transparent;min-height:44px;padding-top:10px;padding-bottom:10px}.home-card-animate .home-card-btn[data-v-ed7f5b36]{animation:btn-pop-ed7f5b36 .5s cubic-bezier(.34,1.56,.64,1) forwards;animation-delay:calc(var(--card-stagger) * .18s + 1.5s)}@keyframes btn-pop-ed7f5b36{0%{opacity:0;transform:scale(.5);border-color:transparent}85%{opacity:1;transform:scale(1);border-color:transparent}to{opacity:1;transform:scale(1);border-color:#ffffff2e}}.home-card:not(.home-card-animate) .home-card-inner[data-v-ed7f5b36],.home-card:not(.home-card-animate) .home-card-btn[data-v-ed7f5b36]{opacity:1;animation:none;clip-path:none;transform:none;border-color:#ffffff2e}.home-card:not(.home-card-animate) .home-card-shell[data-v-ed7f5b36]{border-color:#ffffff2e}

View File

@@ -0,0 +1,84 @@
# Replace Intro & Dashboard Backgrounds
To change the intro splash and dashboard tab backgrounds **without touching any code**, overwrite these files with your own assets. Use the exact names and locations below.
**Location:** All images go in `neode-ui/public/assets/img/`
**Format:** JPG recommended. Portrait or landscape; they use `background-size: cover` and `center center`.
---
## Intro Background
| Filename | Used for |
|----------|----------|
| **`bg-intro.jpg`** | Intro splash (alien typing + video poster + fallback), Dashboard default |
---
## Intro Video
| Filename | Where | Used for |
|----------|-------|----------|
| **`video-intro.mp4`** | `neode-ui/public/assets/video/` | Welcome Noderunner + logo, onboarding, login |
**Format:** MP4 (H.264). Keep under ~5MB for web. See `VIDEO_COMPRESSION_GUIDE.md` for optimization.
---
---
## Dashboard Tab Backgrounds
| Filename | Tab |
|----------|-----|
| **`bg-home.jpg`** | Home |
| **`bg-web5.jpg`** | Web5 |
| **`bg-network.jpg`** | Server / Network |
| **`bg-settings.jpg`** | Settings |
| **`bg-myapps.jpg`** | My Apps |
| **`bg-appstore.jpg`** | App Store / Marketplace |
| **`bg-cloud.jpg`** | Cloud |
| **`bg-intro.jpg`** | Default (also intro) |
| **`bg-intro-3.jpg`** | Alternate layer during transitions |
---
## Intro Flow Backgrounds (onboarding)
| Filename | Used for |
|----------|----------|
| **`bg-intro-1.jpg`** | Onboarding done, login |
| **`bg-intro-2.jpg`** | Onboarding verify |
| **`bg-intro-3.jpg`** | Onboarding path, dashboard transition layer |
| **`bg-intro-4.jpg`** | Onboarding options |
| **`bg-intro-5.jpg`** | Onboarding did |
| **`bg-intro-6.jpg`** | Onboarding backup |
---
## Quick Reference
| Asset | Full path |
|-------|-----------|
| Intro image | `neode-ui/public/assets/img/bg-intro.jpg` |
| Intro video | `neode-ui/public/assets/video/video-intro.mp4` |
| Home | `neode-ui/public/assets/img/bg-home.jpg` |
| Web5 | `neode-ui/public/assets/img/bg-web5.jpg` |
| Network | `neode-ui/public/assets/img/bg-network.jpg` |
| Settings | `neode-ui/public/assets/img/bg-settings.jpg` |
| My Apps | `neode-ui/public/assets/img/bg-myapps.jpg` |
| App Store | `neode-ui/public/assets/img/bg-appstore.jpg` |
| Cloud | `neode-ui/public/assets/img/bg-cloud.jpg` |
| Default | `neode-ui/public/assets/img/bg-intro.jpg` |
| Transition | `neode-ui/public/assets/img/bg-intro-3.jpg` |
| Intro 16 | `neode-ui/public/assets/img/bg-intro-1.jpg``bg-intro-6.jpg` |
---
## Steps to Replace
1. Put your images in `neode-ui/public/assets/img/` with the exact filenames above.
2. Put your video in `neode-ui/public/assets/video/video-intro.mp4`.
3. Run `npm run build` (or deploy) so the new assets are included.
No code changes required.

View File

@@ -0,0 +1 @@
.kiosk-root[data-v-4bc5ca3f]{position:fixed;inset:0;background:#000;outline:none;overflow:hidden;z-index:9999}.kiosk-launcher[data-v-4bc5ca3f]{height:100vh;display:flex;flex-direction:column;padding:2rem 3rem;background:linear-gradient(180deg,#0a0a12,#000)}.kiosk-header[data-v-4bc5ca3f]{display:flex;justify-content:space-between;align-items:center;padding-bottom:2rem;border-bottom:1px solid rgba(255,255,255,.08);margin-bottom:2rem}.kiosk-status-pill[data-v-4bc5ca3f]{display:flex;align-items:center;gap:.5rem;padding:.375rem .75rem;border-radius:9999px;font-size:.875rem;font-weight:500}.kiosk-grid[data-v-4bc5ca3f]{flex:1;display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:1.5rem;align-content:start;overflow-y:auto;padding:.5rem}.kiosk-app-tile[data-v-4bc5ca3f]{display:flex;flex-direction:column;align-items:center;gap:.75rem;padding:1.25rem .75rem;border-radius:1rem;background:#ffffff0a;border:1px solid rgba(255,255,255,.06);transition:all .25s ease;cursor:pointer}.kiosk-app-tile[data-v-4bc5ca3f]:hover,.kiosk-app-tile[data-v-4bc5ca3f]:focus-visible{background:#ffffff1a;border-color:#fb923c66;transform:scale(1.05);box-shadow:0 0 30px #fb923c26;outline:none}.kiosk-app-icon-wrap[data-v-4bc5ca3f]{position:relative;width:64px;height:64px}.kiosk-app-icon[data-v-4bc5ca3f]{width:64px;height:64px;border-radius:16px;-o-object-fit:cover;object-fit:cover;background:#ffffff0d}.kiosk-app-status[data-v-4bc5ca3f]{position:absolute;bottom:-2px;right:-2px;width:14px;height:14px;border-radius:50%;border:3px solid #000}.kiosk-app-label[data-v-4bc5ca3f]{font-size:.8125rem;font-weight:500;color:#ffffffd9;text-align:center;line-height:1.2;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kiosk-footer[data-v-4bc5ca3f]{padding-top:1.5rem;text-align:center;border-top:1px solid rgba(255,255,255,.06);margin-top:1.5rem}

View File

@@ -0,0 +1 @@
import{d as I,y as L,z as S,Q as j,o as z,O as B,c as d,a as t,D as l,f as k,J as D,E as m,F as E,P as F,r as x,j as b,q as g,t as K}from"./index-DnbYEqLr.js";const N={class:"kiosk-launcher"},O={class:"kiosk-header"},R={class:"flex items-center gap-4"},T={class:"text-sm text-white/50"},M={class:"flex items-center gap-3"},V={class:"kiosk-grid"},$=["onClick"],q={class:"kiosk-app-icon-wrap"},H=["src","alt"],J={class:"kiosk-app-label"},P={class:"kiosk-footer"},Q={class:"text-white/30 text-sm"},U=I({__name:"Kiosk",setup(W){const{t:r}=L(),i=S(),y=j(),h=x(null),c="/assets/img/favico.png",f=x(""),p=b(()=>i.isConnected),w=b(()=>{const n=i.data?.["package-data"]||{},o=[],s={"bitcoin-knots":"/app/bitcoin-ui/",lnd:"/app/lnd/",mempool:"/app/mempool/","btcpay-server":"/app/btcpay/",homeassistant:"/app/homeassistant/",grafana:"/app/grafana/",jellyfin:"/app/jellyfin/",nextcloud:"/app/nextcloud/",immich:"/app/immich/",photoprism:"/app/photoprism/",vaultwarden:"/app/vaultwarden/",filebrowser:"/app/filebrowser/",searxng:"/app/searxng/",ollama:"/app/ollama/",penpot:"/app/penpot/",onlyoffice:"/app/onlyoffice/",portainer:"/app/portainer/","uptime-kuma":"/app/uptime-kuma/","nginx-proxy-manager":"/app/nginx-proxy-manager/",tailscale:"/app/tailscale/",fedimint:"/app/fedimint/","fedimint-gateway":"/app/fedimint-gateway/",dwn:"/app/dwn/","nostr-rs-relay":"/app/nostr-rs-relay/",indeedhub:"http://localhost:8190",botfights:"https://botfights.net",nwnn:"https://nwnn.l484.com","484-kitchen":"https://484.kitchen","call-the-operator":"https://cta.tx1138.com","arch-presentation":"https://present.l484.com","syntropy-institute":"https://syntropy.institute","t-zero":"https://teeminuszero.net"};for(const[e,a]of Object.entries(n)){const v=s[e];if(!v)continue;const A=a.state==="running"||a.installed?.status==="running";o.push({id:e,title:a.manifest?.title||e,icon:a["static-files"]?.icon||c,url:v,running:A})}return o.sort((e,a)=>e.running!==a.running?e.running?-1:1:e.title.localeCompare(a.title))});function C(n){y.open({url:n.url,title:n.title})}let u;function _(){const n=new Date;f.value=n.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}return z(()=>{_(),u=setInterval(_,3e4),h.value?.focus(),i.isConnected||i.connectWebSocket().catch(()=>{})}),B(()=>{u&&clearInterval(u)}),(n,o)=>(g(),d("div",{class:"kiosk-root",tabindex:"0",ref_key:"kioskRoot",ref:h},[t("div",N,[t("div",O,[t("div",R,[t("img",{src:c,alt:"Archipelago",class:"w-10 h-10"}),t("div",null,[o[1]||(o[1]=t("h1",{class:"text-2xl font-bold text-white font-archipelago"},"Archipelago",-1)),t("p",T,l(f.value),1)])]),t("div",M,[t("div",{class:k(["kiosk-status-pill",p.value?"bg-green-500/20 text-green-400":"bg-red-500/20 text-red-400"])},[t("div",{class:k(["w-2 h-2 rounded-full",p.value?"bg-green-400":"bg-red-400"])},null,2),D(" "+l(p.value?m(r)("kiosk.online"):m(r)("kiosk.offline")),1)],2)])]),t("div",V,[(g(!0),d(E,null,F(w.value,s=>(g(),d("button",{key:s.id,class:"kiosk-app-tile",onClick:e=>C(s),"data-controller-focusable":!0},[t("div",q,[t("img",{src:s.icon,alt:s.title,class:"kiosk-app-icon",onError:o[0]||(o[0]=e=>e.target.src=c)},null,40,H),t("div",{class:k(["kiosk-app-status",s.running?"bg-green-400":"bg-white/30"])},null,2)]),t("span",J,l(s.title),1)],8,$))),128))]),t("div",P,[t("span",Q,l(m(r)("kiosk.navHint")),1)])])],512))}}),X=K(U,[["__scopeId","data-v-4bc5ca3f"]]);export{X as default};

View File

@@ -0,0 +1 @@
import{d as w,y,o as R,c as h,a as e,D as t,E as o,G as x,f as g,r as c,j as C,x as j,q as m}from"./index-DnbYEqLr.js";const S={class:"min-h-screen bg-black flex items-center justify-center p-6"},T={class:"glass-card p-8 w-full max-w-lg"},U={class:"text-center mb-6"},q={class:"text-2xl font-bold text-white mb-1"},D={class:"text-sm text-white/50"},A={class:"bg-white/5 rounded-lg p-4 mb-4"},B={class:"text-xs text-white/50 mb-1"},I={class:"text-lg font-mono text-white font-medium"},L={key:0,class:"text-xs text-white/40 mt-1"},N={key:0,class:"bg-white/5 rounded-lg p-4 mb-4 flex flex-col items-center"},$={class:"text-xs text-white/50 mb-2"},z={class:"bg-white p-3 rounded-lg inline-block"},E=["src"],F={class:"space-y-2 mb-6"},M={class:"flex items-center justify-between bg-white/5 rounded-lg p-3"},O={class:"text-sm text-white/70"},P={class:"flex items-center gap-2"},V={class:"flex items-center justify-between bg-white/5 rounded-lg p-3"},G={class:"text-sm text-white/70"},H={class:"text-sm text-white font-medium"},J={class:"flex items-center justify-between bg-white/5 rounded-lg p-3"},K={class:"text-sm text-white/70"},Q={class:"text-sm text-white font-medium"},W={class:"flex gap-3"},X={class:"text-center mt-4"},Y={class:"text-xs text-white/30"},te=w({__name:"KioskRecovery",setup(Z){const p=j(),{t:s}=y(),n=c(""),a=c(!1),d=c("—"),r=c("—"),_=c("—"),f=C(()=>{if(!n.value)return"";const i=`http://${n.value}`;return`https://api.qrserver.com/v1/create-qr-code/?size=128x128&data=${encodeURIComponent(i)}`});async function v(){_.value=new Date().toLocaleTimeString(),n.value=window.location.hostname!=="localhost"?window.location.hostname:"127.0.0.1";try{const i=await fetch("/health",{signal:AbortSignal.timeout(5e3)});a.value=i.ok}catch{a.value=!1}if(a.value)try{const l=await(await fetch("/rpc/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({method:"system.stats"}),signal:AbortSignal.timeout(5e3)})).json();if(l.result){const u=l.result.disk;if(u){const b=(u.used/u.total*100).toFixed(0);r.value=`${b}% used`}d.value=String(l.result.containers?.running??"—")}}catch{d.value="—",r.value="—"}}function k(){p.push("/login")}return R(()=>{v()}),(i,l)=>(m(),h("div",S,[e("div",T,[e("div",U,[e("h1",q,t(o(s)("kioskRecovery.title")),1),e("p",D,t(o(s)("kioskRecovery.subtitle")),1)]),e("div",A,[e("div",B,t(o(s)("kioskRecovery.serverAddress")),1),e("div",I,t(n.value||o(s)("common.loading")),1),n.value?(m(),h("div",L,t(o(s)("kioskRecovery.webUi",{address:n.value})),1)):x("",!0)]),n.value?(m(),h("div",N,[e("div",$,t(o(s)("kioskRecovery.scanForMobile")),1),e("div",z,[e("img",{src:f.value,alt:"QR Code",class:"w-32 h-32"},null,8,E)])])):x("",!0),e("div",F,[e("div",M,[e("span",O,t(o(s)("kioskRecovery.backend")),1),e("div",P,[e("div",{class:g(["w-2 h-2 rounded-full",a.value?"bg-green-400":"bg-red-400"])},null,2),e("span",{class:g(["text-sm",a.value?"text-green-400":"text-red-400"])},t(a.value?o(s)("common.healthy"):o(s)("kioskRecovery.unreachable")),3)])]),e("div",V,[e("span",G,t(o(s)("kioskRecovery.containers")),1),e("span",H,t(d.value),1)]),e("div",J,[e("span",K,t(o(s)("monitoring.diskUsage")),1),e("span",Q,t(r.value),1)])]),e("div",W,[e("button",{onClick:v,class:"glass-button px-4 py-2 rounded-lg text-sm flex-1"},t(o(s)("common.refresh")),1),e("button",{onClick:k,class:"glass-button px-4 py-2 rounded-lg text-sm flex-1 bg-orange-500/20 border-orange-500/30"},t(o(s)("kioskRecovery.goToLogin")),1)]),e("div",X,[e("p",Y,t(o(s)("kioskRecovery.lastChecked",{time:_.value})),1)])])]))}});export{te as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.startup-progress-track[data-v-a59fcd7f]{height:4px;background:#ffffff14;border-radius:2px;overflow:hidden}.startup-progress-bar[data-v-a59fcd7f]{height:100%;background:linear-gradient(90deg,#fb923c,#f59e0b);border-radius:2px;transition:width .5s ease-out;box-shadow:0 0 8px #fb923c66}.login-fly-perspective[data-v-a59fcd7f]{perspective:1200px;perspective-origin:center center}.login-card[data-v-a59fcd7f]{transform-style:preserve-3d;transition:transform .5s cubic-bezier(.25,.46,.45,.94),opacity .5s cubic-bezier(.25,.46,.45,.94),filter .5s ease-out}.login-fly-towards[data-v-a59fcd7f]{animation:login-fly-towards-a59fcd7f .5s cubic-bezier(.25,.46,.45,.94) forwards}@keyframes login-fly-towards-a59fcd7f{0%{transform:translateZ(0) scale(1);opacity:1;filter:blur(0)}60%{transform:translateZ(180px) scale(1.4);opacity:.95;filter:blur(2px)}to{transform:translateZ(400px) scale(2);opacity:0;filter:blur(8px)}}

View File

@@ -0,0 +1 @@
.line-clamp-3[data-v-f5eafd6d]{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.modal-enter-active[data-v-f5eafd6d],.modal-leave-active[data-v-f5eafd6d]{transition:opacity .3s ease}.modal-enter-from[data-v-f5eafd6d],.modal-leave-to[data-v-f5eafd6d]{opacity:0}.modal-enter-active .glass-card[data-v-f5eafd6d],.modal-leave-active .glass-card[data-v-f5eafd6d]{transition:transform .3s ease}.modal-enter-from .glass-card[data-v-f5eafd6d],.modal-leave-to .glass-card[data-v-f5eafd6d]{transform:scale(.95)}.marketplace-container[data-v-f5eafd6d] ::-webkit-scrollbar{width:8px}.marketplace-container[data-v-f5eafd6d] ::-webkit-scrollbar-track{background:#ffffff0d;border-radius:4px}.marketplace-container[data-v-f5eafd6d] ::-webkit-scrollbar-thumb{background:#fff3;border-radius:4px;-webkit-transition:background .3s ease;transition:background .3s ease}.marketplace-container[data-v-f5eafd6d] ::-webkit-scrollbar-thumb:hover{background:#ffffff4d}.marketplace-container[data-v-f5eafd6d]{scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.2) rgba(255,255,255,.05)}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
neode-ui/dist/assets/Mesh-CPUFszgS.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{d as s,c as a,a as e,h as o,i as n,E as r,U as d,J as l,q as i}from"./index-DnbYEqLr.js";const x={class:"min-h-screen flex items-center justify-center px-4"},c={class:"glass-card px-8 py-10 text-center max-w-md"},f=s({__name:"NotFound",setup(p){return(m,t)=>(i(),a("div",x,[e("div",c,[t[1]||(t[1]=e("h1",{class:"text-6xl font-bold text-white/30 mb-4"},"404",-1)),t[2]||(t[2]=e("p",{class:"text-lg text-white/70 mb-6"},"Page not found",-1)),o(r(d),{to:"/dashboard",class:"glass-button inline-block px-6 py-3"},{default:n(()=>[...t[0]||(t[0]=[l(" Back to Dashboard ",-1)])]),_:1})])]))}});export{f as default};

View File

@@ -0,0 +1 @@
import{d as w,c as s,a as e,D as y,G as b,g,H as _,J as u,r,B,x as C,q as a}from"./index-DnbYEqLr.js";const j={class:"min-h-full flex items-center justify-center p-3 sm:p-4 md:p-6"},D={class:"max-w-[800px] w-full relative z-10 path-glass-container onb-scroll-container"},S={class:"flex flex-col items-center gap-4 sm:gap-6 mb-4 sm:mb-6 px-3 sm:px-4"},V={class:"w-full max-w-[600px] space-y-4 sm:space-y-6"},z={key:0,class:"text-orange-400/80 text-sm"},L={key:1,class:"text-red-400 text-sm"},M={class:"path-option-card cursor-default px-4 py-4 sm:px-6 sm:py-6"},N={class:"text-left w-full"},R={class:"relative"},U=["disabled"],E={key:0},O={key:1,class:"flex items-center justify-center gap-2"},F={key:2,class:"flex items-center justify-center gap-2"},H={key:2,class:"text-center"},T={class:"flex gap-3 sm:gap-4 max-w-[600px] mx-auto flex-shrink-0 px-3 sm:px-4 pb-4 sm:pb-6"},Y=["disabled"],P=w({__name:"OnboardingBackup",setup(I){const m=C(),l=r(""),i=r(!1),c=r(!1),p=r(""),x=r(!1);async function f(){if(l.value){i.value=!0,p.value="";try{const o=await B.createBackup(l.value),t=JSON.stringify(o,null,2),d=new Blob([t],{type:"application/json"}),h=URL.createObjectURL(d),n=document.createElement("a");n.href=h,n.download="archipelago-did-backup.json",n.style.display="none",document.body.appendChild(n),n.click(),setTimeout(()=>{document.body.removeChild(n),URL.revokeObjectURL(h)},1e3),c.value=!0,localStorage.setItem("neode_backup_created","1")}catch(o){const t=o instanceof Error?o.message:String(o);/502|503|504|timeout|fetch|network|Failed to fetch/i.test(t)?x.value=!0:p.value=t||"Failed to create backup. Please try again."}finally{i.value=!1}}}function v(){m.push("/onboarding/verify").catch(()=>{})}function k(){m.push("/onboarding/verify").catch(()=>{})}return(o,t)=>(a(),s("div",j,[e("div",D,[t[7]||(t[7]=e("div",{class:"text-center mb-4 sm:mb-6 flex-shrink-0 px-3 sm:px-4 pt-4 sm:pt-6"},[e("h1",{class:"text-xl sm:text-2xl md:text-[26px] font-semibold text-white/96 mb-2 drop-shadow-[0_2px_6px_rgba(0,0,0,0.4)]"}," Backup Your Identity "),e("p",{class:"text-sm sm:text-base md:text-[20px] text-white/75 leading-relaxed max-w-[600px] mx-auto"}," Create a secure backup of your identity. Set a passphrase and download your encrypted backup file. ")],-1)),e("div",S,[e("div",V,[x.value?(a(),s("p",z,"Server is still starting up. You can try again shortly or skip this step.")):p.value?(a(),s("p",L,y(p.value),1)):b("",!0),e("div",M,[e("div",N,[t[2]||(t[2]=e("label",{class:"block text-xs sm:text-sm font-semibold text-white/80 mb-2 sm:mb-3 uppercase tracking-wide"}," Backup Passphrase ",-1)),e("div",R,[t[1]||(t[1]=e("div",{class:"absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none"},[e("svg",{class:"w-5 h-5 text-white/60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})])],-1)),g(e("input",{"onUpdate:modelValue":t[0]||(t[0]=d=>l.value=d),type:"password",placeholder:"Enter a strong passphrase",class:"w-full bg-black/40 border border-white/10 rounded-lg px-4 py-3 pl-12 text-white/95 placeholder-white/40 focus:outline-none focus:border-white/30 focus:bg-black/50 transition-all"},null,512),[[_,l.value]])]),t[3]||(t[3]=e("p",{class:"text-xs sm:text-sm md:text-base text-white/60 mt-2 sm:mt-3"}," Keep this passphrase safe. You'll need it to restore your identity from backup. ",-1))])]),e("button",{onClick:f,disabled:!l.value||i.value,class:"path-action-button path-action-button--continue w-full"},[!i.value&&!c.value?(a(),s("span",E,"Download Backup")):i.value?(a(),s("span",O,[...t[4]||(t[4]=[e("svg",{class:"animate-spin h-5 w-5",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1),u(" Downloading... ",-1)])])):(a(),s("span",F,[...t[5]||(t[5]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 13l4 4L19 7"})],-1),u(" Downloaded ",-1)])]))],8,U),c.value?(a(),s("div",H,[...t[6]||(t[6]=[e("p",{class:"text-sm text-white/70"},[u(" Backup saved as "),e("span",{class:"font-mono text-white/90"},"archipelago-did-backup.json")],-1)])])):b("",!0)])]),e("div",T,[e("button",{onClick:k,class:"path-action-button path-action-button--skip"}," Skip "),e("button",{onClick:v,disabled:!c.value,class:"path-action-button path-action-button--continue disabled:opacity-50"}," Continue ",8,Y)])])]))}});export{P as default};

View File

@@ -0,0 +1 @@
.onb-lock-spin[data-v-8e98e431]{animation:onb-lock-pulse-8e98e431 1.2s ease-in-out infinite}@keyframes onb-lock-pulse-8e98e431{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.08);opacity:.7}}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{d as a,c as n,a as t,N as r,x as i,q as l}from"./index-DnbYEqLr.js";const c={class:"min-h-full flex items-center justify-center p-3 sm:p-4 md:p-6"},u=a({__name:"OnboardingDone",setup(d){const o=i();function s(){o.push("/login").catch(()=>{})}return(p,e)=>(l(),n("div",c,[t("div",{class:"max-w-[800px] w-full relative z-10 path-glass-container onb-scroll-container"},[t("div",{class:"text-center space-y-4 sm:space-y-6 px-3 sm:px-4 py-4 sm:py-6"},[e[0]||(e[0]=r('<div class="flex justify-center mb-4 sm:mb-6"><div class="path-option-card cursor-default w-16 h-16 sm:w-20 sm:h-20 rounded-full flex items-center justify-center"><svg class="w-10 h-10 text-black" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="3"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"></path></svg></div></div><p class="text-sm sm:text-base md:text-[20px] text-white/80 leading-relaxed max-w-[600px] mx-auto mb-6 sm:mb-8"> Your sovereign identity is ready. You can now log in and start your journey as a noderunner. </p><div class="grid grid-cols-1 md:grid-cols-3 gap-3 sm:gap-4 mb-6 sm:mb-8 max-w-[700px] mx-auto"><div class="path-option-card cursor-default py-6"><svg class="w-10 h-10 mx-auto mb-3 text-white/80" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"></path></svg><h3 class="text-sm font-semibold text-white/90">Sovereign Identity</h3></div><div class="path-option-card cursor-default py-6"><svg class="w-10 h-10 mx-auto mb-3 text-white/80" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"></path></svg><h3 class="text-sm font-semibold text-white/90">Encrypted Backup</h3></div><div class="path-option-card cursor-default py-6"><svg class="w-10 h-10 mx-auto mb-3 text-white/80" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z"></path></svg><h3 class="text-sm font-semibold text-white/90">Ready to Use</h3></div></div>',3)),t("button",{onClick:s,class:"path-action-button path-action-button--continue mx-auto"}," Go to Login ")])])]))}});export{u as default};

View File

@@ -0,0 +1 @@
import{d as g,c as o,a as e,g as y,H as w,F as _,P as k,D as p,G as C,r as n,B as P,x as S,f as x,q as l}from"./index-DnbYEqLr.js";const B={class:"min-h-full flex items-center justify-center p-3 sm:p-4 md:p-6"},E={class:"max-w-[800px] w-full relative z-10 path-glass-container onb-scroll-container"},N={class:"flex flex-col items-center gap-4 sm:gap-6 mb-4 sm:mb-6 px-3 sm:px-4"},z={class:"w-full max-w-[600px] space-y-4 sm:space-y-6"},F={class:"path-option-card cursor-default px-4 py-4 sm:px-6 sm:py-6"},M={class:"path-option-card cursor-default px-4 py-4 sm:px-6 sm:py-6"},j={class:"grid grid-cols-1 sm:grid-cols-3 gap-3"},D=["onClick"],I={class:"flex items-center gap-2 mb-1"},V={class:"font-medium text-sm"},G={class:"text-xs text-white/50 ml-7"},Y={key:0,class:"text-center mb-4 px-3"},q={key:1,class:"text-red-400 text-sm text-center mb-4"},A={class:"flex gap-3 sm:gap-4 max-w-[600px] mx-auto flex-shrink-0 px-3 sm:px-4 pb-4 sm:pb-6"},H=["disabled"],L={key:0},O={key:1},$=g({__name:"OnboardingIdentity",setup(R){const m=S(),c=n("Personal"),d=n("personal"),i=n(!1),r=n(""),u=n(!1),b=[{value:"personal",label:"Personal",desc:"Everyday use",color:"bg-blue-500/30 text-blue-400"},{value:"business",label:"Business",desc:"Professional",color:"bg-orange-500/30 text-orange-400"},{value:"anonymous",label:"Anonymous",desc:"Private",color:"bg-purple-500/30 text-purple-400"}];function h(s){const t=s instanceof Error?s.message:String(s);return/502|503|504|timeout|fetch|network|Failed to fetch/i.test(t)}async function v(){i.value=!0,r.value="",u.value=!1;try{await P.call({method:"identity.create",params:{name:c.value||"Personal",purpose:d.value}}),m.push("/onboarding/backup").catch(()=>{})}catch(s){h(s)?u.value=!0:r.value=s instanceof Error?s.message:"Failed to create identity"}finally{i.value=!1}}function f(){m.push("/onboarding/backup").catch(()=>{})}return(s,t)=>(l(),o("div",B,[e("div",E,[t[5]||(t[5]=e("div",{class:"text-center flex-shrink-0 px-3 sm:px-4 pt-4 sm:pt-6"},[e("h1",{class:"text-xl sm:text-2xl md:text-[26px] font-semibold text-white/96 mb-2 sm:mb-4 drop-shadow-[0_2px_6px_rgba(0,0,0,0.4)]"}," Name your identity "),e("p",{class:"text-sm sm:text-base md:text-[20px] text-white/75 leading-relaxed max-w-[600px] mx-auto mb-4 sm:mb-6"}," Give your first identity a name and choose how you'll use it. You can create more identities later. ")],-1)),e("div",N,[e("div",z,[e("div",F,[t[1]||(t[1]=e("label",{class:"block text-sm font-semibold text-white/80 mb-3 uppercase tracking-wide"},"Identity Name",-1)),y(e("input",{"onUpdate:modelValue":t[0]||(t[0]=a=>c.value=a),type:"text",placeholder:"Personal",class:"w-full bg-black/40 border border-white/10 rounded-lg px-4 py-3 text-white/95 placeholder-white/40 focus:outline-none focus:border-white/30 focus:bg-black/50 transition-all"},null,512),[[w,c.value]])]),e("div",M,[t[3]||(t[3]=e("label",{class:"block text-sm font-semibold text-white/80 mb-3 uppercase tracking-wide"},"Purpose",-1)),e("div",j,[(l(),o(_,null,k(b,a=>e("button",{key:a.value,onClick:T=>d.value=a.value,class:x(["px-4 py-3 rounded-lg border text-left transition-all",d.value===a.value?"bg-white/15 border-white/30 text-white":"bg-black/20 border-white/10 text-white/60 hover:bg-white/10 hover:text-white/80"])},[e("div",I,[e("div",{class:x(["w-5 h-5 rounded-full flex items-center justify-center shrink-0",a.color])},[...t[2]||(t[2]=[e("svg",{class:"w-3 h-3",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"})],-1)])],2),e("span",V,p(a.label),1)]),e("p",G,p(a.desc),1)],10,D)),64))])])])]),u.value?(l(),o("div",Y,[...t[4]||(t[4]=[e("p",{class:"text-orange-400/80 text-sm"},"Server is still starting up. Your identity will be saved once it's ready.",-1)])])):r.value?(l(),o("p",q,p(r.value),1)):C("",!0),e("div",A,[e("button",{onClick:f,class:"path-action-button path-action-button--skip"}," Skip "),e("button",{onClick:v,disabled:i.value,class:"path-action-button path-action-button--continue"},[i.value?(l(),o("span",L,"Creating...")):(l(),o("span",O,"Continue"))],8,H)])])]))}});export{$ as default};

View File

@@ -0,0 +1 @@
import{d as w,c as u,a as e,h as y,C as k,g as _,H as C,D as b,G as f,r as l,B as R,x as B,q as c,t as I}from"./index-DnbYEqLr.js";const N={class:"min-h-full flex items-center justify-center p-4 sm:p-6"},O={class:"max-w-2xl w-full"},S={class:"glass-card p-8 pt-16 sm:p-12 sm:pt-20 text-center relative overflow-visible onb-card"},T={class:"absolute -top-8 sm:-top-10 left-0 right-0 flex justify-center z-10 onb-logo"},V={class:"logo-gradient-border w-16 h-16 sm:w-20 sm:h-20"},j={key:0,class:"mt-6 glass-card px-6 py-6 text-left"},A={key:0,class:"text-red-400 text-xs mb-2"},D={key:1,class:"text-green-400 text-xs mb-2"},E={class:"flex gap-3"},F=["disabled"],L=w({__name:"OnboardingIntro",setup(U){const m=B();function v(){m.push("/onboarding/path").catch(()=>{})}const d=l(!1),a=l(null),r=l(""),i=l(!1),s=l(""),x=l(!1);function g(n){const o=n.target.files?.[0];if(!o)return;const p=new FileReader;p.onload=()=>{try{a.value=JSON.parse(p.result),s.value=""}catch{s.value="Invalid backup file format",a.value=null}},p.readAsText(o)}async function h(){if(!(!a.value||!r.value)){i.value=!0,s.value="";try{await R.call({method:"backup.restore-identity",params:{backup:a.value,passphrase:r.value}}),x.value=!0,setTimeout(()=>{m.push("/onboarding/did")},1500)}catch(n){s.value=n instanceof Error?n.message:"Restore failed"}finally{i.value=!1}}}return(n,t)=>(c(),u("div",N,[e("div",O,[e("div",S,[e("div",T,[e("div",V,[y(k,{"no-border":"",fit:""})])]),t[4]||(t[4]=e("h1",{class:"text-2xl sm:text-4xl font-bold text-white mb-3 sm:mb-4 onb-title"}," Welcome to Archipelago ",-1)),t[5]||(t[5]=e("p",{class:"text-base sm:text-xl text-white/80 mb-8 sm:mb-12 max-w-2xl mx-auto onb-tagline"}," Your personal server for a sovereign digital life ",-1)),e("button",{onClick:v,class:"glass-button px-6 py-3 sm:px-8 sm:py-4 rounded-lg text-base sm:text-lg font-medium transition-all hover:bg-black/70 hover:border-white/30 onb-cta"}," Unlock your sovereignty → "),e("a",{class:"text-white/50 hover:text-white/80 underline text-sm cursor-pointer mt-4 block text-center onb-cta",onClick:t[0]||(t[0]=o=>d.value=!0)}," Restore from backup "),d.value?(c(),u("div",j,[t[3]||(t[3]=e("h3",{class:"text-sm font-semibold text-white/80 mb-3 uppercase tracking-wide"},"Restore Identity from Backup",-1)),e("input",{type:"file",accept:".json",class:"block w-full text-sm text-white/60 file:mr-4 file:py-2 file:px-4 file:rounded file:border-0 file:text-sm file:bg-white/10 file:text-white/80 hover:file:bg-white/20 mb-3",onChange:g},null,32),_(e("input",{"onUpdate:modelValue":t[1]||(t[1]=o=>r.value=o),type:"password",placeholder:"Backup passphrase",class:"w-full px-4 py-2 bg-white/10 border border-white/20 rounded-lg text-white text-sm focus:outline-none focus:border-white/40 mb-3"},null,512),[[C,r.value]]),s.value?(c(),u("p",A,b(s.value),1)):f("",!0),x.value?(c(),u("p",D,"Identity restored successfully!")):f("",!0),e("div",E,[e("button",{class:"glass-button text-sm px-4 py-2",onClick:t[2]||(t[2]=o=>d.value=!1)},"Cancel"),e("button",{class:"glass-button text-sm px-4 py-2",disabled:!a.value||!r.value||i.value,onClick:h},b(i.value?"Restoring...":"Restore"),9,F)])])):f("",!0)])])]))}}),q=I(L,[["__scopeId","data-v-da05f75f"]]);export{q as default};

View File

@@ -0,0 +1 @@
.onb-card[data-v-da05f75f]{opacity:0;animation:onb-card-in-da05f75f .6s cubic-bezier(.25,.46,.45,.94) .1s forwards}.onb-logo[data-v-da05f75f]{opacity:0;animation:onb-scale-in-da05f75f .5s cubic-bezier(.25,.46,.45,.94) .3s forwards}.onb-title[data-v-da05f75f]{opacity:0;animation:onb-slide-up-da05f75f .5s cubic-bezier(.25,.46,.45,.94) .7s forwards}.onb-tagline[data-v-da05f75f]{opacity:0;animation:onb-slide-up-da05f75f .5s cubic-bezier(.25,.46,.45,.94) 1s forwards}.onb-cta[data-v-da05f75f]{opacity:0;animation:onb-fade-in-da05f75f .6s ease 1.4s forwards}@keyframes onb-card-in-da05f75f{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@keyframes onb-scale-in-da05f75f{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}@keyframes onb-slide-up-da05f75f{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes onb-fade-in-da05f75f{0%{opacity:0}to{opacity:1}}

View File

@@ -0,0 +1 @@
import{d as r,o as m,c,a as s,N as i,f as d,r as x,x as p,q as h}from"./index-DnbYEqLr.js";import{completeOnboarding as u}from"./useOnboarding-BgpIyX9l.js";const v="/assets/icon/favico-black-v2.svg",w={class:"min-h-full flex items-center justify-center p-3 sm:p-4 md:p-6"},b={class:"max-w-[1200px] w-full relative z-10 path-glass-container onb-scroll-container"},f={class:"grid grid-cols-1 md:grid-cols-3 gap-3 sm:gap-6 px-3 sm:px-4"},j=r({__name:"OnboardingOptions",setup(g){const n=p(),e=x(null);m(()=>{e.value="fresh"});function l(o){e.value=o}async function a(){try{await u()}catch{}n.push("/login").catch(()=>{})}return(o,t)=>(h(),c("div",w,[s("div",b,[t[3]||(t[3]=i('<div class="text-center mb-4 sm:mb-6 flex-shrink-0 px-3 sm:px-4 pt-4 sm:pt-6"><div class="logo-gradient-border inline-block mb-4 sm:mb-6"><img src="'+v+'" alt="Archipelago" class="w-16 h-16 sm:w-20 sm:h-20"></div><h1 class="text-2xl sm:text-4xl font-bold text-white mb-2 sm:mb-4">Choose Your Setup</h1><p class="text-base sm:text-xl text-white/80">How would you like to get started?</p></div>',1)),s("div",f,[s("button",{onClick:t[0]||(t[0]=k=>l("fresh")),class:d(["path-option-card text-center",{"path-option-card--selected":e.value==="fresh"}])},[...t[1]||(t[1]=[i('<div class="mb-3 sm:mb-4"><div class="w-12 h-12 sm:w-16 sm:h-16 mx-auto bg-white/10 rounded-full flex items-center justify-center"><svg class="w-6 h-6 sm:w-8 sm:h-8 text-white/60" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"></path></svg></div></div><h3 class="text-lg sm:text-xl font-semibold text-white mb-1 sm:mb-2">Fresh Start</h3><p class="text-white/70 text-xs sm:text-sm"> Set up a new server from scratch </p>',3)])],2),t[2]||(t[2]=i('<div class="path-option-card text-center opacity-40 cursor-not-allowed"><div class="mb-3 sm:mb-4"><div class="w-12 h-12 sm:w-16 sm:h-16 mx-auto bg-white/10 rounded-full flex items-center justify-center"><svg class="w-6 h-6 sm:w-8 sm:h-8 text-white/60" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12"></path></svg></div></div><h3 class="text-lg sm:text-xl font-semibold text-white mb-1 sm:mb-2">Restore Backup</h3><p class="text-white/70 text-xs sm:text-sm"> Restore from a previous backup </p><span class="text-xs text-white/50 mt-1 block">(Coming Soon)</span></div><div class="path-option-card text-center opacity-40 cursor-not-allowed"><div class="mb-3 sm:mb-4"><div class="w-12 h-12 sm:w-16 sm:h-16 mx-auto bg-white/10 rounded-full flex items-center justify-center"><svg class="w-6 h-6 sm:w-8 sm:h-8 text-white/60" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"></path></svg></div></div><h3 class="text-lg sm:text-xl font-semibold text-white mb-1 sm:mb-2">Connect Existing</h3><p class="text-white/70 text-xs sm:text-sm"> Connect to an existing Archipelago server </p><span class="text-xs text-white/50 mt-1 block">(Coming Soon)</span></div>',2))]),s("div",{class:"flex justify-center flex-shrink-0 px-3 sm:px-4 pb-4 sm:pb-6 mt-4 sm:mt-8"},[s("button",{onClick:a,class:"path-action-button path-action-button--continue"}," Continue ")])])]))}});export{j as default};

View File

@@ -0,0 +1 @@
import{d as a,c as i,a as t,N as n,x as r,q as l}from"./index-DnbYEqLr.js";const d={class:"min-h-full flex items-center justify-center p-3 sm:p-4 md:p-6 relative"},m=a({__name:"OnboardingPath",setup(c){const o=r();function s(){o.push("/onboarding/did").catch(()=>{})}return(p,e)=>(l(),i("div",d,[t("div",{class:"max-w-[1200px] w-full relative z-10 path-glass-container onb-scroll-container"},[e[0]||(e[0]=n('<div class="text-center mb-4 md:mb-6 flex-shrink-0 px-3 sm:px-4 pt-4 sm:pt-6"><h1 class="text-xl md:text-[26px] font-semibold text-white/96 mb-2 drop-shadow-[0_2px_6px_rgba(0,0,0,0.4)]">Your Node, Your Possibilities</h1><p class="text-xs md:text-sm text-white/75 leading-relaxed">Archipelago gives you the tools to build your sovereign digital life. All of these capabilities are available from your dashboard.</p></div><div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3 md:gap-4 flex-shrink-0 mb-4 md:mb-6 px-3 sm:px-4"><div class="path-option-card"><div class="icon-wrapper transition-all duration-300"><svg class="w-10 h-10 text-white/90" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"></path></svg></div><h3 class="text-lg font-semibold text-white/96 mb-1.5">Self Sovereignty</h3><p class="text-sm text-white/75 leading-snug"> Data, files, ownership, property of my data estate. Own, manage, edit, and even sell your personal data. </p></div><div class="path-option-card"><svg class="w-12 h-12 mb-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"></path></svg><h3 class="text-xl font-semibold text-white/96 mb-2">Community Commerce</h3><p class="text-[15px] text-white/75 leading-snug"> Self contained and owned ecommerce system built on bitcoin and mesh networks. Trade freely without intermediaries. </p></div><div class="path-option-card"><svg class="w-12 h-12 mb-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 13.255A23.931 23.931 0 0112 15c-3.183 0-6.22-.62-9-1.745M16 6V4a2 2 0 00-2-2h-4a2 2 0 00-2 2v2m4 6h.01M5 20h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path></svg><h3 class="text-xl font-semibold text-white/96 mb-2">Sovereign Projects</h3><p class="text-[15px] text-white/75 leading-snug"> Logistics and project management self owned with privacy control. Collaborate without surveillance. </p></div><div class="path-option-card"><svg class="w-12 h-12 mb-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8.111 16.404a5.5 5.5 0 017.778 0M12 20h.01m-7.08-7.071c3.904-3.905 10.236-3.905 14.141 0M1.394 9.393c5.857-5.857 15.355-5.857 21.213 0"></path></svg><h3 class="text-xl font-semibold text-white/96 mb-2">Data Transmitter</h3><p class="text-[15px] text-white/75 leading-snug"> Assist the new sovereign net with relay points and networking where you get paid for your value. </p></div><div class="path-option-card"><svg class="w-12 h-12 mb-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4"></path></svg><h3 class="text-xl font-semibold text-white/96 mb-2">Hoster</h3><p class="text-[15px] text-white/75 leading-snug"> Host services and content, archives, and more to others for micro bitcoin payments. Earn while you serve. </p></div><div class="path-option-card"><svg class="w-12 h-12 mb-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z"></path></svg><h3 class="text-xl font-semibold text-white/96 mb-2">Sovereign AI</h3><p class="text-[15px] text-white/75 leading-snug"> Run AI models locally on your hardware. No cloud surveillance, complete privacy, full control over your AI assistant. </p></div></div>',2)),t("div",{class:"flex justify-center max-w-[600px] mx-auto flex-shrink-0 px-3 sm:px-4 pb-4 sm:pb-6"},[t("button",{onClick:s,class:"path-action-button path-action-button--continue"}," Continue ")])])]))}});export{m as default};

View File

@@ -0,0 +1 @@
import{d as C,c as s,a as t,G as c,D as g,J as S,N as V,r as i,B as f,x as B,q as a}from"./index-DnbYEqLr.js";import{completeOnboarding as v}from"./useOnboarding-BgpIyX9l.js";const N={class:"min-h-full flex items-center justify-center p-3 sm:p-4 md:p-6"},j={class:"max-w-[800px] w-full relative z-10 path-glass-container onb-scroll-container"},z={key:0,class:"text-center mb-4 sm:mb-6 flex-shrink-0 px-3 sm:px-4 pt-4 sm:pt-6"},F={class:"flex flex-col items-center gap-6 mb-6"},Y={key:0,class:"text-orange-400/80 text-sm"},M={key:1,class:"text-red-400 text-sm"},R=["disabled"],A={key:0},D={key:1,class:"flex items-center gap-2"},E={key:3,class:"w-full max-w-[600px]"},I={class:"path-option-card cursor-default px-6 py-6"},O={class:"text-left"},T={class:"bg-black/40 rounded-lg p-4 backdrop-blur-sm border border-white/10"},q={class:"text-white/95 font-mono text-xs break-all leading-relaxed"},G={class:"flex gap-3 sm:gap-4 max-w-[600px] mx-auto flex-shrink-0 px-3 sm:px-4 pb-4 sm:pb-6"},P=C({__name:"OnboardingVerify",setup(H){const x=B(),n=i(!1),l=i(!1),m=i(""),p=i(""),d=i(""),h=i(!1);function b(){const o=new Uint8Array(32);return crypto.getRandomValues(o),btoa(String.fromCharCode(...o))}async function y(){l.value=!0,d.value="";for(let o=0;o<3;o++)try{p.value=b();const{signature:e}=await f.signChallenge(p.value);m.value=e,l.value=!1;const r=localStorage.getItem("neode_did");if(r){const u=await f.call({method:"identity.verify",params:{did:r,message:p.value,signature:e}});n.value=u.valid!==!1}else n.value=!0;return}catch(e){const r=e instanceof Error?e.message:"",u=/502|503|504|timeout|fetch|network|Failed to fetch/i.test(r);!u||o===2?u?h.value=!0:d.value=r||"Failed to sign challenge. You can retry or skip this step.":await new Promise(k=>setTimeout(k,1e3*(o+1)))}l.value=!1}async function w(){try{await v()}catch{}x.push("/onboarding/done").catch(()=>{})}async function _(){try{await v()}catch{}x.push("/onboarding/done").catch(()=>{})}return(o,e)=>(a(),s("div",N,[t("div",j,[n.value?c("",!0):(a(),s("div",z,[...e[0]||(e[0]=[t("h1",{class:"text-xl sm:text-2xl md:text-[26px] font-semibold text-white/96 mb-2 drop-shadow-[0_2px_6px_rgba(0,0,0,0.4)]"}," Verify Your Identity ",-1),t("p",{class:"text-sm sm:text-base md:text-[20px] text-white/75 leading-relaxed max-w-[600px] mx-auto"}," Sign a challenge to verify your decentralized identity is working correctly. ",-1)])])),t("div",F,[h.value?(a(),s("p",Y,"Server is still starting up. You can try again shortly or skip this step.")):d.value?(a(),s("p",M,g(d.value),1)):c("",!0),n.value?c("",!0):(a(),s("button",{key:2,onClick:y,disabled:l.value,class:"path-action-button path-action-button--continue"},[l.value?(a(),s("span",D,[...e[1]||(e[1]=[t("svg",{class:"animate-spin h-5 w-5",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[t("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),t("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1),S(" Signing... ",-1)])])):(a(),s("span",A,"Sign Challenge"))],8,R)),n.value?(a(),s("div",E,[e[3]||(e[3]=V('<div class="text-center mb-6"><div class="flex justify-center mb-6"><div class="path-option-card cursor-default w-20 h-20 rounded-full flex items-center justify-center"><svg class="w-10 h-10 text-black" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="3"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"></path></svg></div></div><p class="text-[20px] text-white/80 leading-relaxed max-w-[600px] mx-auto mb-6"> Your identity has been successfully verified and is ready to use. </p></div>',1)),t("div",I,[t("div",O,[e[2]||(e[2]=t("h3",{class:"text-sm font-semibold text-white/80 mb-2 uppercase tracking-wide"},"Signature",-1)),t("div",T,[t("p",q,g(m.value),1)])])])])):c("",!0)]),t("div",G,[t("button",{onClick:_,class:"path-action-button path-action-button--skip"}," Skip "),n.value?(a(),s("button",{key:0,onClick:w,class:"path-action-button path-action-button--continue"}," Finish ")):c("",!0)])])]))}});export{P as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.root-redirect-fade[data-v-e4035a68]{animation:root-fade-in-e4035a68 .3s ease .5s forwards}@keyframes root-fade-in-e4035a68{to{opacity:1}}

View File

@@ -0,0 +1 @@
import{d as r,o as c,c as l,a as t,x as n,q as i,t as p}from"./index-DnbYEqLr.js";import{isOnboardingComplete as m}from"./useOnboarding-BgpIyX9l.js";const d={class:"min-h-full flex items-center justify-center"},f=r({__name:"RootRedirect",setup(u){const o=n();return c(async()=>{if(localStorage.getItem("neode_onboarding_complete")==="1"){o.replace("/login").catch(()=>{});return}let e=!1;try{e=await Promise.race([m(),new Promise(a=>setTimeout(()=>a(!1),3e3))])}catch{e=!1}o.replace(e?"/login":"/onboarding/intro").catch(()=>{})}),(s,e)=>(i(),l("div",d,[...e[0]||(e[0]=[t("div",{class:"flex flex-col items-center gap-4 opacity-0 root-redirect-fade"},[t("svg",{class:"animate-spin h-8 w-8 text-white/60",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[t("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),t("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})])],-1)])]))}}),h=p(f,[["__scopeId","data-v-e4035a68"]]);export{h as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
neode-ui/dist/assets/Web5-DcuUNKso.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{$ as b,r as S,j as o}from"./index-DnbYEqLr.js";const n="archipelago-ai-permissions",s=[{id:"apps",label:"Installed Apps",description:"App names, status, and health — no credentials or config details",icon:"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z",group:"Node Data"},{id:"system",label:"System Stats",description:"CPU, RAM, disk usage — no file paths or IP addresses",icon:"M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z",group:"Node Data"},{id:"network",label:"Network Status",description:"Connection status, peer count — no IP addresses or keys",icon:"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01",group:"Node Data"},{id:"bitcoin",label:"Bitcoin Node",description:"Block height, sync progress, mempool stats — no wallet keys",icon:"M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z",group:"Node Data"},{id:"media",label:"Media Libraries",description:"Local media libraries — film, music, podcast titles and metadata, no file paths",icon:"M7 4v16M17 4v16M3 8h4m10 0h4M3 12h18M3 16h4m10 0h4M4 20h16a1 1 0 001-1V5a1 1 0 00-1-1H4a1 1 0 00-1 1v14a1 1 0 001 1z",group:"Media & Files"},{id:"files",label:"File Names",description:"Folder and file names in Cloud — no file contents",icon:"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z",group:"Media & Files"},{id:"notes",label:"Documents & Notes",description:"Document and note titles — no contents",icon:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z",group:"Media & Files"},{id:"search",label:"Web Search",description:"Web search via your private SearXNG instance",icon:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z",group:"AI & Search"},{id:"ai-local",label:"Local AI Models",description:"Local AI models via Ollama — model names and availability",icon:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z",group:"AI & Search"},{id:"wallet",label:"Wallet Overview",description:"Balance, channel count — no private keys, seeds, or addresses",icon:"M17 9V7a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2m2 4h10a2 2 0 002-2v-6a2 2 0 00-2-2H9a2 2 0 00-2 2v6a2 2 0 002 2zm7-5a2 2 0 11-4 0 2 2 0 014 0z",group:"Financial"}],f=b("aiPermissions",()=>{const a=S(t());function t(){try{const e=localStorage.getItem(n);if(e){const v=JSON.parse(e);return new Set(v.filter(p=>s.some(M=>M.id===p)))}}catch{}return new Set}function i(){localStorage.setItem(n,JSON.stringify([...a.value]))}function l(e){return a.value.has(e)}function r(e){a.value.has(e)?a.value.delete(e):a.value.add(e),a.value=new Set(a.value),i()}function c(){a.value=new Set(s.map(e=>e.id)),i()}function d(){a.value=new Set,i()}const h=o(()=>[...a.value]),m=o(()=>a.value.size===s.length),u=o(()=>a.value.size===0);return{enabled:a,isEnabled:l,toggle:r,enableAll:c,disableAll:d,enabledCategories:h,allEnabled:m,noneEnabled:u}});export{s as A,f as u};

1
neode-ui/dist/assets/api-CHkUAu4g.js vendored Normal file
View File

@@ -0,0 +1 @@
const n={Installing:"installing",Stopping:"stopping",Stopped:"stopped",Starting:"starting",Running:"running",Restarting:"restarting"},t={Stopped:"stopped",Running:"running"};export{n as P,t as S};

View File

@@ -0,0 +1,23 @@
# Welcome Noderunner Speech
The intro plays a sci-fi female voice saying "Welcome Noderunner" as the text types in.
## Generate the audio (ElevenLabs)
1. Get a free API key at [elevenlabs.io](https://elevenlabs.io) (free tier: 10k chars/month)
2. Run:
```bash
cd neode-ui
ELEVENLABS_API_KEY=your_key npm run generate-welcome-speech
```
3. Commit `welcome-noderunner.mp3` to the repo
## Custom sci-fi voice
Browse [ElevenLabs Voice Library](https://elevenlabs.io/voice-library) and search for "sci-fi", "AI", "robot", or "character". Copy the voice ID from the URL or voice settings, then:
```bash
ELEVENLABS_API_KEY=your_key ELEVENLABS_VOICE_ID=voice_id npm run generate-welcome-speech
```
Recommended: "The Digital Oracle", "The Friendly AI Assistant", or similar character voices from the Synthetic/Character categories.

BIN
neode-ui/dist/assets/audio/arrows.mp3 vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
neode-ui/dist/assets/audio/enter.mp3 vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
neode-ui/dist/assets/audio/pop.mp3 vendored Normal file

Binary file not shown.

BIN
neode-ui/dist/assets/audio/typing.mp3 vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
neode-ui/dist/assets/audio/woosh.mp3 vendored Normal file

Binary file not shown.

File diff suppressed because one or more lines are too long

1
neode-ui/dist/assets/es-BeSu-8Qq.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
function n(h){const t=h.split("/").filter(Boolean),s=[];for(const e of t)e!=="."&&(e===".."?s.pop():s.push(e));return"/"+s.join("/")}class c{token=null;baseUrl;constructor(){this.baseUrl=`${window.location.origin}/app/filebrowser`}get isAuthenticated(){return this.token!==null}async login(t="admin",s="admin"){try{const e=await fetch(`${this.baseUrl}/api/login`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:t,password:s})});if(!e.ok)return!1;const o=await e.text();return this.token=o.replace(/^"|"$/g,""),document.cookie=`auth=${this.token}; path=/app/filebrowser; SameSite=Strict`,!0}catch{return!1}}headers(){const t={};return this.token&&(t["X-Auth"]=this.token),t}async listDirectory(t){const s=n(t),e=await fetch(`${this.baseUrl}/api/resources${s}`,{headers:this.headers()});if(!e.ok)throw new Error(`Failed to list directory: ${e.status}`);return((await e.json()).items||[]).map(a=>({...a,extension:a.name.includes(".")?a.name.split(".").pop().toLowerCase():""}))}downloadUrl(t){const s=n(t);return`${this.baseUrl}/api/raw${s}`}async fetchBlobUrl(t){const s=n(t),e=await fetch(`${this.baseUrl}/api/raw${s}`,{headers:this.headers()});if(!e.ok)throw new Error(`Failed to fetch file: ${e.status}`);const o=await e.blob();return URL.createObjectURL(o)}async downloadFile(t){const s=await this.fetchBlobUrl(t),e=t.split("/").pop()||"download",o=document.createElement("a");o.href=s,o.download=e,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(s)}async upload(t,s){const e=n(t),o=e.endsWith("/")?e:`${e}/`,a=encodeURIComponent(s.name),i=await fetch(`${this.baseUrl}/api/resources${o}${a}?override=true`,{method:"POST",headers:this.headers(),body:s});if(!i.ok){const r=await i.text().catch(()=>"");throw new Error(`Upload failed (${i.status}): ${r}`)}}async createFolder(t,s){const e=n(t),o=e.endsWith("/")?e:`${e}/`,a=s.replace(/\.\./g,"").replace(/\//g,""),i=await fetch(`${this.baseUrl}/api/resources${o}${a}/`,{method:"POST",headers:this.headers()});if(!i.ok)throw new Error(`Create folder failed: ${i.status}`)}async deleteItem(t){const s=n(t),e=await fetch(`${this.baseUrl}/api/resources${s}`,{method:"DELETE",headers:this.headers()});if(!e.ok)throw new Error(`Delete failed: ${e.status}`)}async getUsage(){if(!this.isAuthenticated&&!await this.login())return{totalSize:0,folderCount:0,fileCount:0};const t=await fetch(`${this.baseUrl}/api/resources/`,{headers:this.headers()});if(!t.ok)return{totalSize:0,folderCount:0,fileCount:0};const e=(await t.json()).items||[],o=e.filter(r=>r.isDir).length,a=e.filter(r=>!r.isDir).length;return{totalSize:e.reduce((r,l)=>r+(l.size||0),0),folderCount:o,fileCount:a}}static TEXT_EXTENSIONS=new Set(["txt","md","json","csv","log","conf","yaml","yml","toml","xml","html","css","js","ts","py","sh","bash","env","ini","cfg","sql","rs","go","java","c","h","cpp","hpp","rb","php","dockerfile","makefile","gitignore","editorconfig"]);isTextFile(t){const s=t.includes(".")?t.split(".").pop().toLowerCase():"",e=t.split("/").pop()?.toLowerCase()||"";return c.TEXT_EXTENSIONS.has(s)||c.TEXT_EXTENSIONS.has(e)}async readFileAsText(t,s=102400){if(!this.isAuthenticated&&!await this.login())throw new Error("FileBrowser authentication failed");if(!this.isTextFile(t))throw new Error(`Cannot read binary file: ${t}`);const e=n(t),o=await fetch(`${this.baseUrl}/api/raw${e}`,{headers:this.headers()});if(!o.ok)throw new Error(`Failed to read file: ${o.status}`);const a=await o.blob(),i=a.size,r=i>s;return{content:await(r?a.slice(0,s):a).text(),truncated:r,size:i}}async rename(t,s){const e=n(t),o=e.substring(0,e.lastIndexOf("/")+1),a=s.replace(/\.\./g,"").replace(/\//g,""),i=await fetch(`${this.baseUrl}/api/resources${e}`,{method:"PATCH",headers:{...this.headers(),"Content-Type":"application/json"},body:JSON.stringify({destination:`${o}${a}`})});if(!i.ok)throw new Error(`Rename failed: ${i.status}`)}}const u=new c;export{u as f};

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,93 @@
Copyright 2011 The Montserrat Project Authors (https://github.com/JulietaUla/Montserrat)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View File

@@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More