feat: demo deployment with AIUI chat, SSH key auth, Quick Start fix
- Add AIUI pre-built dist to demo/ for Portainer deployment - Add nginx-demo.conf with Claude API proxy (envsubst for API key) - Add docker-entrypoint.sh for runtime API key injection - Update Dockerfile.web to include AIUI and Claude proxy - Update docker-compose.demo.yml with ANTHROPIC_API_KEY env var - Switch deploy script from sshpass to SSH key auth - Fix Quick Start Goals animating before other cards (stagger 5, opacity guard) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
BIN
demo/aiui/apple-touch-icon-180x180.png
Normal file
|
After Width: | Height: | Size: 6.0 KiB |
2
demo/aiui/assets/BrowsePage-IaSGp-tG.js
Normal file
258
demo/aiui/assets/ChatPage-C05pM21P.js
Normal file
1
demo/aiui/assets/ChatPage-sAXrmq0w.css
Normal file
@ -0,0 +1 @@
|
|||||||
|
.magazine[data-v-02741b8c]{font-family:Georgia,Times New Roman,Times,serif}.magazine-light[data-v-02741b8c]{background-color:#faf9f6}.magazine-dark[data-v-02741b8c]{background-color:#0a0a0a}iframe[data-v-0f5111f5]::-webkit-scrollbar{display:none}.code-detail table[data-v-7f40c0bc]{font-variant-numeric:tabular-nums}.animate-cell-pulse[data-v-f8eb31f3]{animation:cell-pulse-f8eb31f3 1.8s cubic-bezier(.4,0,.2,1) infinite}.animate-shimmer-sweep[data-v-f8eb31f3]{animation:shimmer-sweep-f8eb31f3 2.2s cubic-bezier(.4,0,.2,1) infinite}.animate-progress-sweep[data-v-f8eb31f3]{animation:progress-sweep-f8eb31f3 1.6s cubic-bezier(.4,0,.2,1) infinite}@keyframes cell-pulse-f8eb31f3{0%,to{opacity:.6;transform:scale(.96)}50%{opacity:1;transform:scale(1.02)}}@keyframes shimmer-sweep-f8eb31f3{0%{transform:translate(-100%)}60%{transform:translate(200%)}to{transform:translate(200%)}}@keyframes progress-sweep-f8eb31f3{0%{width:0;margin-left:0}45%{width:60%;margin-left:20%}90%{width:0;margin-left:100%}to{width:0;margin-left:0}}.content-fade-enter-active[data-v-a57bffe4],.content-fade-leave-active[data-v-a57bffe4]{transition:opacity .2s ease}.content-fade-enter-from[data-v-a57bffe4],.content-fade-leave-to[data-v-a57bffe4]{opacity:0}.detail-active[data-v-a57bffe4]{border-color:transparent!important}.detail-persistent[data-v-a57bffe4] button[class*=absolute][class*=top-3][class*=left-3]{display:none!important}
|
||||||
1
demo/aiui/assets/ChatWindow-CwFp9jEi.css
Normal file
@ -0,0 +1 @@
|
|||||||
|
.picker-enter-active[data-v-2abf766d]{transition:all .2s cubic-bezier(.22,1,.36,1)}.picker-leave-active[data-v-2abf766d]{transition:all .15s ease-in}.picker-enter-from[data-v-2abf766d],.picker-leave-to[data-v-2abf766d]{opacity:0;transform:translateY(-8px)}.context-menu-enter-active[data-v-13d6c372]{transition:all .15s cubic-bezier(.22,1,.36,1)}.context-menu-leave-active[data-v-13d6c372]{transition:all .1s ease-in}.context-menu-enter-from[data-v-13d6c372],.context-menu-leave-to[data-v-13d6c372]{opacity:0;transform:scale(.95)}.settings-modal-enter-active[data-v-c97db749]{transition:opacity .2s ease-out}.settings-modal-enter-active .glass-card[data-v-c97db749]{transition:all .25s cubic-bezier(.22,1,.36,1)}.settings-modal-leave-active[data-v-c97db749]{transition:opacity .15s ease-in}.settings-modal-enter-from[data-v-c97db749],.settings-modal-leave-to[data-v-c97db749]{opacity:0}
|
||||||
4
demo/aiui/assets/ConversationViewerPage-C6xLQlBZ.js
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import{a as S,D as V,c as r,e as s,E as y,G as g,t as c,F as p,H as h,i as b,g as j,I as B,r as u,k as T,J as U,b as l,n as k}from"./index-CqBtvLD5.js";import{useNostr as E}from"./useNostr-CZatyrb1.js";const F={class:"min-h-screen bg-[#0a0a0a] text-white"},H={class:"sticky top-0 z-10 glass border-b border-white/5"},L={class:"max-w-3xl mx-auto px-4 py-3 flex items-center gap-3"},R={class:"flex-1 min-w-0"},z={class:"text-sm font-semibold text-white/90 truncate"},G={class:"text-xs text-white/40"},P={key:0,class:"flex items-center justify-center h-64"},J={key:1,class:"max-w-3xl mx-auto px-4 py-12 text-center"},Y={class:"text-white/40 text-sm"},q={key:2,class:"max-w-3xl mx-auto px-4 py-6 space-y-4"},K={class:"flex items-center gap-2 mb-2"},O=["textContent"],Z=S({__name:"ConversationViewerPage",setup(Q){const C=B(),{connect:N,fetchNote:A}=E(),v=u(!0),i=u(null),f=u("Shared Conversation"),x=u(null),d=u(null),w=u([]),I=T(()=>d.value?new Date(d.value*1e3).toLocaleDateString("en-US",{year:"numeric",month:"long",day:"numeric"}):"");function D(n){const t=[],o=n.split(`
|
||||||
|
`);let e="",a=[];for(const m of o){const _=m.match(/^##?\s*(?:Human|User|You)/),M=m.match(/^##?\s*(?:Assistant|AI|Claude)/);_||M?(e&&a.length>0&&t.push({role:e,content:a.join(`
|
||||||
|
`).trim()}),e=_?"user":"assistant",a=[]):a.push(m)}return e&&a.length>0&&t.push({role:e,content:a.join(`
|
||||||
|
`).trim()}),t.length===0&&n.trim()&&t.push({role:"assistant",content:n.trim()}),t}return V(async()=>{try{const n=C.params.nostrAddr;if(!n){i.value="No Nostr address provided.";return}await N();let t=null;try{const e=atob(n).split(":");e.length>=2&&(t={dTag:e[0],pubkey:e[1]})}catch{}if(t){const o=await A(t.dTag);if(o){const e=o.tags.find(a=>a[0]==="title");e&&(f.value=e[1]),x.value=o.authorName??null,d.value=o.created_at,w.value=D(o.content)}else i.value="Conversation not found on relays."}else i.value="Invalid Nostr address format."}catch(n){i.value=n instanceof Error?n.message:"Failed to load conversation."}finally{v.value=!1}}),(n,t)=>{const o=U("router-link");return l(),r("div",F,[s("header",H,[s("div",L,[y(o,{to:"/",class:"text-white/40 hover:text-white/70 transition-colors"},{default:g(()=>[...t[0]||(t[0]=[s("svg",{class:"w-5 h-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor","stroke-width":"2"},[s("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M10 19l-7-7m0 0l7-7m-7 7h18"})],-1)])]),_:1}),s("div",R,[s("h1",z,c(f.value),1),s("p",G,[x.value?(l(),r(p,{key:0},[h("by "+c(x.value),1)],64)):b("",!0),d.value?(l(),r(p,{key:1},[h(" · "+c(I.value),1)],64)):b("",!0)])]),t[1]||(t[1]=s("span",{class:"text-xs px-2 py-1 rounded-full bg-white/5 text-white/40"},"Read-only",-1))])]),v.value?(l(),r("div",P,[...t[2]||(t[2]=[s("div",{class:"w-6 h-6 rounded-full border-2 border-accent/30 border-t-accent animate-spin"},null,-1)])])):i.value?(l(),r("div",J,[s("p",Y,c(i.value),1),y(o,{to:"/",class:"mt-4 inline-block text-accent text-sm hover:underline"},{default:g(()=>[...t[3]||(t[3]=[h(" Go to AIUI ",-1)])]),_:1})])):(l(),r("main",q,[(l(!0),r(p,null,j(w.value,(e,a)=>(l(),r("div",{key:a,class:k(["rounded-xl p-4",e.role==="user"?"bg-white/[0.03] border border-white/5 ml-8":"mr-8"])},[s("div",K,[s("span",{class:k(["text-xs font-bold uppercase tracking-wider",e.role==="user"?"text-accent/70":"text-white/30"])},c(e.role==="user"?"Human":"Assistant"),3)]),s("div",{class:"text-sm text-white/80 leading-relaxed whitespace-pre-wrap break-words",textContent:c(e.content)},null,8,O)],2))),128))])),t[4]||(t[4]=s("footer",{class:"max-w-3xl mx-auto px-4 py-8 text-center"},[s("p",{class:"text-xs text-white/20"}," Shared via AIUI · Powered by Nostr ")],-1))])}}});export{Z as default};
|
||||||
1
demo/aiui/assets/FilmDetail-DTcHMuvD.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{_ as m}from"./FilmDetail.vue_vue_type_script_setup_true_lang-Ckw7Dobw.js";import"./index-CqBtvLD5.js";export{m as default};
|
||||||
1
demo/aiui/assets/FilmGrid-DE3h3PKy.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{_ as o}from"./FilmGrid.vue_vue_type_script_setup_true_lang-Cl2ukq8v.js";import"./index-CqBtvLD5.js";import"./useContentImages-CXWJDBMs.js";export{o as default};
|
||||||
@ -0,0 +1 @@
|
|||||||
|
import{a as F,b as a,c as r,e as s,n as d,u as l,t as c,f as L,w as S,v as j,F as v,g as m,h as U,i as x,j as E,r as y,k as w,l as z,m as B,p as D}from"./index-CqBtvLD5.js";import{u as G}from"./useContentImages-CXWJDBMs.js";const N={class:"h-full flex flex-col"},V={class:"flex items-center justify-between gap-2"},I={class:"flex items-center gap-2 shrink-0"},M={class:"flex flex-wrap gap-1.5"},R=["onClick"],T={class:"flex-1 overflow-y-auto custom-scrollbar px-4 pt-4 pb-16"},q={class:"grid grid-cols-2 sm:grid-cols-3 gap-4"},P=["aria-label","onClick"],A={class:"poster-card flex-1 min-h-0"},H={key:0,class:"absolute inset-0 animate-shimmer"},J=["src","alt","onError"],K=["src","alt"],O={key:3,class:"absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-transparent pointer-events-none"},Q={class:"absolute bottom-0 left-0 right-0 p-2"},W={class:"text-xs font-semibold text-white/90 leading-tight truncate"},X={class:"flex items-center gap-1 mt-0.5"},Y={class:"text-xs text-accent font-bold"},Z={class:"text-xs text-white/40"},ee={class:"absolute top-1.5 right-1.5 flex gap-0.5"},te={key:0,class:"flex items-center justify-center py-12"},le=F({__name:"FilmGrid",props:{films:{},title:{default:"Recommended Films"}},emits:["selectFilm"],setup(f){const b=f,{isDark:n}=E(),h=y(""),u=y(null),{coverSrc:p,fallbackSrc:k,onError:C,isLoading:_}=G({items:D(b,"films"),id:t=>t.id,existingUrl:t=>t.posterUrl||t.backdropUrl,fetch:t=>B(t.title,t.year).then(o=>o.posterUrl),fallback:t=>z(t.title,t.year)}),$=w(()=>{const t=new Map;for(const o of b.films)for(const e of o.genres)t.set(e,(t.get(e)??0)+1);return[...t.entries()].sort((o,e)=>e[1]-o[1]).slice(0,8).map(([o])=>o)}),g=w(()=>{let t=b.films;if(h.value){const o=h.value.toLowerCase();t=t.filter(e=>e.title.toLowerCase().includes(o)||e.director.toLowerCase().includes(o)||e.cast.some(i=>i.toLowerCase().includes(o)))}return u.value&&(t=t.filter(o=>o.genres.includes(u.value))),t});return(t,o)=>(a(),r("div",N,[s("div",{class:"p-4 space-y-3",style:U(l(n)?"border-bottom: 1px solid rgba(255, 255, 255, 0.08)":"border-bottom: 1px solid rgba(0, 0, 0, 0.06)")},[s("div",V,[s("h3",{class:d(["text-sm font-bold",l(n)?"text-white/90":"text-gray-900"])},c(f.title),3),s("div",I,[s("span",{class:d(["text-xs font-mono",l(n)?"text-white/30":"text-gray-400"])},c(g.value.length)+" films ",3),L(t.$slots,"header-actions")])]),S(s("input",{"onUpdate:modelValue":o[0]||(o[0]=e=>h.value=e),type:"text",placeholder:"Search films...",class:d(["w-full px-3 py-2 rounded-lg text-base outline-none transition-colors",l(n)?"bg-white/5 text-white/80 placeholder:text-white/25 focus:bg-white/10":"bg-black/3 text-gray-800 placeholder:text-gray-400 focus:bg-black/5"])},null,2),[[j,h.value]]),s("div",M,[(a(!0),r(v,null,m($.value,e=>(a(),r("button",{key:e,class:d(["text-xs px-2 py-1 rounded-md transition-all duration-150",u.value===e?"nav-tab-active":l(n)?"text-white/40 hover:text-white/70 hover:bg-white/5":"text-gray-500 hover:text-gray-800 hover:bg-black/5"]),onClick:i=>u.value=u.value===e?null:e},c(e),11,R))),128))])],4),s("div",T,[s("div",q,[(a(!0),r(v,null,m(g.value,e=>(a(),r("button",{key:e.id,class:"group flex flex-col items-stretch text-left w-full path-glass-bubble rounded-2xl overflow-hidden transition-all duration-200 hover:brightness-105","aria-label":`${e.title} (${e.year})`,onClick:i=>t.$emit("selectFilm",e)},[s("div",A,[s("div",{class:d(["aspect-[2/3] relative w-full overflow-hidden rounded-[10px]",l(p)(e)?"":l(n)?"bg-white/[0.06]":"bg-black/[0.04]"])},[l(_)(e)?(a(),r("div",H)):x("",!0),l(p)(e)?(a(),r("img",{key:1,src:l(p)(e),alt:`${e.title} (${e.year}) directed by ${e.director}`,class:"w-full h-full object-cover transition-transform duration-300 group-hover:scale-110",loading:"lazy",onError:i=>l(C)(e)},null,40,J)):l(_)(e)?x("",!0):(a(),r("img",{key:2,src:l(k)(e),alt:e.title,class:"w-full h-full object-cover"},null,8,K)),l(p)(e)?(a(),r("div",O)):x("",!0),s("div",Q,[s("p",W,c(e.title),1),s("div",X,[s("span",Y,"★ "+c(e.rating),1),s("span",Z,c(e.year),1)])]),s("div",ee,[(a(!0),r(v,null,m(e.sources.slice(0,2),i=>(a(),r("span",{key:i.type,class:"text-xs px-1 py-0.5 rounded bg-black/60 text-white/70 backdrop-blur-sm"},c(i.type),1))),128))])],2)])],8,P))),128))]),g.value.length===0?(a(),r("div",te,[s("p",{class:d(["text-sm",l(n)?"text-white/30":"text-gray-400"])}," No films match your search ",2)])):x("",!0)])]))}});export{le as _};
|
||||||
1
demo/aiui/assets/GuidePage-CSUy4HaR.js
Normal file
1
demo/aiui/assets/GuidePage-iT99cF_4.css
Normal file
@ -0,0 +1 @@
|
|||||||
|
.guide-page[data-v-a3ad5999]{min-height:100vh;background:#0a0a0a;color:#ffffffe6;font-family:Inter,-apple-system,BlinkMacSystemFont,sans-serif}.guide-header[data-v-a3ad5999]{position:sticky;top:0;z-index:10;display:flex;align-items:center;gap:12px;padding:16px 20px;background:#0009;backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border-bottom:1px solid rgba(255,255,255,.08)}.back-btn[data-v-a3ad5999]{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:10px;border:1px solid rgba(255,255,255,.12);background:#ffffff0f;color:#ffffffb3;cursor:pointer;transition:all .2s ease}.back-btn[data-v-a3ad5999]:hover{background:#ffffff1a;color:#fff}.guide-title[data-v-a3ad5999]{font-size:18px;font-weight:600;flex:1}.guide-version[data-v-a3ad5999]{font-size:12px;color:#fff6;padding:2px 8px;border-radius:6px;background:#ffffff0f}.guide-content[data-v-a3ad5999]{max-width:680px;margin:0 auto;padding:24px 20px 80px}.guide-intro[data-v-a3ad5999]{font-size:15px;line-height:1.7;color:#ffffffb3}.guide-section[data-v-a3ad5999]{margin-bottom:36px}.section-title[data-v-a3ad5999]{display:flex;align-items:center;gap:10px;font-size:17px;font-weight:600;margin-bottom:12px;color:#fffffff2}.section-icon[data-v-a3ad5999]{font-size:20px}.section-desc[data-v-a3ad5999]{font-size:14px;line-height:1.7;color:#fff9;margin-bottom:16px}.section-desc code[data-v-a3ad5999]{background:#ffffff14;padding:2px 6px;border-radius:4px;font-size:13px;font-family:Menlo,monospace;color:#fffc}.example-box[data-v-a3ad5999]{display:flex;flex-direction:column;gap:8px;margin-bottom:12px}.example-prompt[data-v-a3ad5999]{padding:10px 14px;background:#ffffff0a;border:1px solid rgba(255,255,255,.08);border-radius:10px;font-size:13px;color:#ffffffbf;font-style:italic}.info-note[data-v-a3ad5999]{padding:12px 16px;background:#f7931a14;border:1px solid rgba(247,147,26,.2);border-radius:10px;font-size:13px;line-height:1.6;color:#fff9}.feature-grid[data-v-a3ad5999]{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}.feature-card[data-v-a3ad5999]{padding:16px;background:#ffffff0a;border:1px solid rgba(255,255,255,.08);border-radius:12px}.feature-card h3[data-v-a3ad5999]{font-size:14px;font-weight:600;margin-bottom:6px;color:#ffffffe6}.feature-card p[data-v-a3ad5999]{font-size:13px;line-height:1.5;color:#ffffff80}.tips-list[data-v-a3ad5999]{list-style:none;padding:0;display:flex;flex-direction:column;gap:10px}.tips-list li[data-v-a3ad5999]{padding:10px 14px 10px 28px;position:relative;background:#ffffff08;border:1px solid rgba(255,255,255,.06);border-radius:10px;font-size:13px;line-height:1.5;color:#fff9}.tips-list li[data-v-a3ad5999]:before{content:"•";position:absolute;left:14px;color:#f7931a}.demo-button[data-v-a3ad5999]{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;padding:14px 20px;border-radius:12px;border:1px solid rgba(247,147,26,.3);background:#f7931a1a;color:#f7931a;font-size:15px;font-weight:600;cursor:pointer;transition:all .2s ease}.demo-button[data-v-a3ad5999]:hover:not(:disabled){background:#f7931a2e;border-color:#f7931a80;transform:translateY(-1px)}.demo-button[data-v-a3ad5999]:disabled{opacity:.6;cursor:not-allowed}.demo-spinner[data-v-a3ad5999]{width:18px;height:18px;border:2px solid rgba(247,147,26,.3);border-top-color:#f7931a;border-radius:50%;animation:spin-a3ad5999 .8s linear infinite}@keyframes spin-a3ad5999{to{transform:rotate(360deg)}}
|
||||||
1
demo/aiui/assets/SongDetail-DOTXy0Qj.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{_ as m}from"./SongDetail.vue_vue_type_script_setup_true_lang-D619ywdc.js";import"./index-CqBtvLD5.js";export{m as default};
|
||||||
1
demo/aiui/assets/SongGrid-BPm5eVyu.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{_ as o}from"./SongGrid.vue_vue_type_script_setup_true_lang-Bx4BvItY.js";import"./index-CqBtvLD5.js";import"./useContentImages-CXWJDBMs.js";export{o as default};
|
||||||
@ -0,0 +1 @@
|
|||||||
|
import{a as z,q as M,x as B,y as E,p as q,b as o,c as r,e as s,n as c,u as a,t as u,f as D,w as F,v as G,F as v,g as m,h as N,i as f,z as U,j as V,r as _,k}from"./index-CqBtvLD5.js";import{u as P}from"./useContentImages-CXWJDBMs.js";const R={class:"h-full flex flex-col"},T={class:"flex items-center justify-between gap-2"},I={class:"flex items-center gap-2 shrink-0"},A={class:"flex flex-wrap gap-1.5"},H=["onClick"],J={class:"flex-1 overflow-y-auto custom-scrollbar px-4 pt-4 pb-16"},K={class:"grid grid-cols-2 sm:grid-cols-3 gap-4"},O=["aria-label","onClick"],Q={class:"cover-card flex-1 min-h-0 relative flex items-center justify-center"},W={key:0,class:"absolute inset-0 animate-shimmer"},X=["onClick"],Y=["src","alt","onError"],Z=["src","alt"],tt={key:3,class:"absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-transparent pointer-events-none"},et={class:"absolute bottom-0 left-0 right-0 p-2"},st={class:"text-xs font-semibold text-white/90 leading-tight truncate"},lt={class:"text-xs text-white/40 truncate mt-0.5"},at={class:"absolute top-1.5 right-1.5 flex gap-0.5 flex-wrap justify-end max-w-[60%]"},ot={key:0,class:"flex items-center justify-center py-12"},nt=z({__name:"SongGrid",props:{songs:{},title:{default:"Recommended Songs"}},emits:["selectSong"],setup(g,{emit:C}){const x=g,y=C,{isDark:i}=V(),{play:S}=M(),h=_(""),d=_(null),{coverSrc:p,fallbackSrc:j,onError:$,isLoading:w}=P({items:q(x,"songs"),id:e=>e.id,existingUrl:e=>e.coverUrl,fetch:e=>E(e.title,e.artist,e.album),fallback:e=>B(e.title,e.artist)}),L=k(()=>{const e=new Map;for(const l of x.songs)for(const t of l.genres??[])e.set(t,(e.get(t)??0)+1);return[...e.entries()].sort((l,t)=>t[1]-l[1]).slice(0,8).map(([l])=>l)}),b=k(()=>{let e=x.songs;if(h.value){const l=h.value.toLowerCase();e=e.filter(t=>t.title.toLowerCase().includes(l)||t.artist.toLowerCase().includes(l)||(t.album??"").toLowerCase().includes(l))}return d.value&&(e=e.filter(l=>(l.genres??[]).includes(d.value))),e});return(e,l)=>(o(),r("div",R,[s("div",{class:"p-4 space-y-3",style:N(a(i)?"border-bottom: 1px solid rgba(255, 255, 255, 0.08)":"border-bottom: 1px solid rgba(0, 0, 0, 0.06)")},[s("div",T,[s("h3",{class:c(["text-sm font-bold",a(i)?"text-white/90":"text-gray-900"])},u(g.title),3),s("div",I,[s("span",{class:c(["text-xs font-mono",a(i)?"text-white/30":"text-gray-400"])},u(b.value.length)+" songs ",3),D(e.$slots,"header-actions")])]),F(s("input",{"onUpdate:modelValue":l[0]||(l[0]=t=>h.value=t),type:"text",placeholder:"Search songs...",class:c(["w-full px-3 py-2 rounded-lg text-base outline-none transition-colors",a(i)?"bg-white/5 text-white/80 placeholder:text-white/25 focus:bg-white/10":"bg-black/3 text-gray-800 placeholder:text-gray-400 focus:bg-black/5"])},null,2),[[G,h.value]]),s("div",A,[(o(!0),r(v,null,m(L.value,t=>(o(),r("button",{key:t,class:c(["text-xs px-2 py-1 rounded-md transition-all duration-150",d.value===t?"nav-tab-active":a(i)?"text-white/40 hover:text-white/70 hover:bg-white/5":"text-gray-500 hover:text-gray-800 hover:bg-black/5"]),onClick:n=>d.value=d.value===t?null:t},u(t),11,H))),128))])],4),s("div",J,[s("div",K,[(o(!0),r(v,null,m(b.value,t=>(o(),r("button",{key:t.id,class:"group flex flex-col items-stretch text-left w-full path-glass-bubble rounded-2xl overflow-hidden transition-all duration-200 hover:brightness-105","aria-label":`${t.title} by ${t.artist}`,onClick:n=>y("selectSong",t)},[s("div",Q,[s("div",{class:c(["aspect-square relative w-full overflow-hidden rounded-[10px]",a(p)(t)?"":a(i)?"bg-white/[0.06]":"bg-black/[0.04]"])},[a(w)(t)?(o(),r("div",W)):f("",!0),s("button",{class:"absolute inset-0 flex items-center justify-center z-10 backdrop-blur-sm bg-black/30 opacity-0 group-hover:opacity-100 transition-all duration-200","aria-label":"Play",onClick:U(n=>{a(S)(t),y("selectSong",t)},["stop"])},[...l[1]||(l[1]=[s("span",{class:"w-16 h-16 rounded-full flex items-center justify-center path-glass-icon"},[s("svg",{class:"w-8 h-8 text-white",fill:"currentColor",viewBox:"0 0 24 24"},[s("path",{d:"M8 5v14l11-7L8 5z"})])],-1)])],8,X),a(p)(t)?(o(),r("img",{key:1,src:a(p)(t),alt:`${t.title} by ${t.artist}`,class:"w-full h-full object-cover transition-transform duration-300 group-hover:scale-110",loading:"lazy",onError:n=>a($)(t)},null,40,Y)):a(w)(t)?f("",!0):(o(),r("img",{key:2,src:a(j)(t),alt:t.title,class:"w-full h-full object-cover"},null,8,Z)),a(p)(t)?(o(),r("div",tt)):f("",!0),s("div",et,[s("p",st,u(t.title),1),s("p",lt,u(t.artist),1)]),s("div",at,[(o(!0),r(v,null,m((t.sources??[]).slice(0,2),n=>(o(),r("span",{key:n.type,class:"text-xs px-1 py-0.5 rounded bg-black/60 text-white/70 backdrop-blur-sm"},u(n.type),1))),128))])],2)])],8,O))),128))]),b.value.length===0?(o(),r("div",ot,[s("p",{class:c(["text-sm",a(i)?"text-white/30":"text-gray-400"])}," No songs match your search ",2)])):f("",!0)])]))}});export{nt as _};
|
||||||
1
demo/aiui/assets/ThreadNode-B0koBP1i.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{a as h,J as m,b as d,c as r,e as t,t as s,F as u,g as p,Q as x,h as f}from"./index-CqBtvLD5.js";const g={class:"rounded-lg bg-white/[0.03] border border-white/5 p-2.5 mb-1"},b={class:"flex items-center gap-1.5 mb-1"},w={class:"w-5 h-5 rounded-full shrink-0 flex items-center justify-center text-xs font-bold bg-purple-500/20 text-purple-400"},y={class:"text-xs font-semibold text-white/70"},v={class:"text-xs ml-auto text-white/20"},k={class:"text-xs text-white/60 leading-relaxed whitespace-pre-wrap"},T=h({__name:"ThreadNode",props:{node:{},depth:{}},emits:["reply"],setup(e){function i(o){return new Date(o*1e3).toLocaleTimeString("en",{hour:"2-digit",minute:"2-digit"})}return(o,n)=>{const l=m("ThreadNode",!0);return d(),r("div",{style:f({paddingLeft:`${Math.min(e.depth,4)*16}px`})},[t("div",g,[t("div",b,[t("div",w,s(e.node.note.authorName?.charAt(0)?.toUpperCase()??"?"),1),t("span",y,s(e.node.note.authorName??"anon"),1),t("span",v,s(i(e.node.note.created_at)),1)]),t("p",k,s(e.node.note.content),1),t("button",{class:"text-xs text-white/25 hover:text-accent/60 mt-1 transition-colors",onClick:n[0]||(n[0]=a=>o.$emit("reply",e.node.note))}," Reply ")]),(d(!0),r(u,null,p(e.node.children,a=>(d(),x(l,{key:a.note.id,node:a,depth:e.depth+1,onReply:n[1]||(n[1]=c=>o.$emit("reply",c))},null,8,["node","depth"]))),128))],4)}}});export{T as default};
|
||||||
1
demo/aiui/assets/WidgetDemoPage-BSWX2CxO.css
Normal file
@ -0,0 +1 @@
|
|||||||
|
.widget-enter-active[data-v-1c052c90]{transition:all .25s cubic-bezier(.16,1,.3,1)}.widget-leave-active[data-v-1c052c90]{transition:all .2s ease-in}.widget-enter-from[data-v-1c052c90],.widget-leave-to[data-v-1c052c90]{opacity:0;transform:scale(.9) translateY(20px)}
|
||||||
32
demo/aiui/assets/WidgetDemoPage-D_rupeyB.js
Normal file
1
demo/aiui/assets/_basePickBy-C3OIVi4e.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{e as x,c as O,g as m,k as P,h as p,j as w,l as c,m as A,n as I,t as N,o as E}from"./_baseUniq-D68iWsEk.js";import{aR as g,ar as F,aS as M,aT as T,aU as _,aV as l,aW as $,aX as B,aY as S,aZ as y}from"./mermaid.core-CAd6zjbx.js";var R=/\s/;function G(n){for(var r=n.length;r--&&R.test(n.charAt(r)););return r}var H=/^\s+/;function L(n){return n&&n.slice(0,G(n)+1).replace(H,"")}var o=NaN,W=/^[-+]0x[0-9a-f]+$/i,X=/^0b[01]+$/i,Y=/^0o[0-7]+$/i,q=parseInt;function z(n){if(typeof n=="number")return n;if(x(n))return o;if(g(n)){var r=typeof n.valueOf=="function"?n.valueOf():n;n=g(r)?r+"":r}if(typeof n!="string")return n===0?n:+n;n=L(n);var t=X.test(n);return t||Y.test(n)?q(n.slice(2),t?2:8):W.test(n)?o:+n}var v=1/0,C=17976931348623157e292;function K(n){if(!n)return n===0?n:0;if(n=z(n),n===v||n===-v){var r=n<0?-1:1;return r*C}return n===n?n:0}function U(n){var r=K(n),t=r%1;return r===r?t?r-t:r:0}function fn(n){var r=n==null?0:n.length;return r?O(n):[]}var b=Object.prototype,Z=b.hasOwnProperty,dn=F(function(n,r){n=Object(n);var t=-1,i=r.length,a=i>2?r[2]:void 0;for(a&&M(r[0],r[1],a)&&(i=1);++t<i;)for(var f=r[t],e=T(f),s=-1,d=e.length;++s<d;){var u=e[s],h=n[u];(h===void 0||_(h,b[u])&&!Z.call(n,u))&&(n[u]=f[u])}return n});function un(n){var r=n==null?0:n.length;return r?n[r-1]:void 0}function D(n){return function(r,t,i){var a=Object(r);if(!l(r)){var f=m(t);r=P(r),t=function(s){return f(a[s],s,a)}}var e=n(r,t,i);return e>-1?a[f?r[e]:e]:void 0}}var J=Math.max;function Q(n,r,t){var i=n==null?0:n.length;if(!i)return-1;var a=t==null?0:U(t);return a<0&&(a=J(i+a,0)),p(n,m(r),a)}var hn=D(Q);function V(n,r){var t=-1,i=l(n)?Array(n.length):[];return w(n,function(a,f,e){i[++t]=r(a,f,e)}),i}function gn(n,r){var t=$(n)?c:V;return t(n,m(r))}var j=Object.prototype,k=j.hasOwnProperty;function nn(n,r){return n!=null&&k.call(n,r)}function mn(n,r){return n!=null&&A(n,r,nn)}function rn(n,r){return n<r}function tn(n,r,t){for(var i=-1,a=n.length;++i<a;){var f=n[i],e=r(f);if(e!=null&&(s===void 0?e===e&&!x(e):t(e,s)))var s=e,d=f}return d}function on(n){return n&&n.length?tn(n,B,rn):void 0}function an(n,r,t,i){if(!g(n))return n;r=I(r,n);for(var a=-1,f=r.length,e=f-1,s=n;s!=null&&++a<f;){var d=N(r[a]),u=t;if(d==="__proto__"||d==="constructor"||d==="prototype")return n;if(a!=e){var h=s[d];u=void 0,u===void 0&&(u=g(h)?h:S(r[a+1])?[]:{})}y(s,d,u),s=s[d]}return n}function vn(n,r,t){for(var i=-1,a=r.length,f={};++i<a;){var e=r[i],s=E(n,e);t(s,e)&&an(f,I(e,n),s)}return f}export{rn as a,tn as b,V as c,vn as d,on as e,fn as f,hn as g,mn as h,dn as i,U as j,un as l,gn as m,K as t};
|
||||||
1
demo/aiui/assets/_baseUniq-D68iWsEk.js
Normal file
1
demo/aiui/assets/arc-BxlWYvsk.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{N as ln,O as an,P as Z,Q as O,R as V,S as un,T as y,V as tn,W as z,X as _,Y as rn,Z as o,$ as on,a0 as sn,a1 as fn}from"./mermaid.core-CAd6zjbx.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,D,S,v,R,W,a){var E=D-l,i=S-h,n=W-v,d=a-R,u=d*E-n*i;if(!(u*u<y))return u=(n*(h-R)-d*(l-v))/u,[l+u*E,h+u*i]}function J(l,h,D,S,v,R,W){var a=l-D,E=h-S,i=(W?R:-R)/z(a*a+E*E),n=i*E,d=-i*a,u=l+n,s=h+d,f=D+n,c=S+d,X=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,A=m*m+g*g,T=v-R,P=u*c-f*s,I=(g<0?-1:1)*z(on(0,T*T*A-P*P)),N=(P*g-m*I)/A,Q=(-P*m-g*I)/A,w=(P*g+m*I)/A,p=(-P*m+g*I)/A,x=N-X,e=Q-t,r=w-X,Y=p-t;return x*x+e*e>r*r+Y*Y&&(N=w,Q=p),{cx:N,cy:Q,x01:-n,y01:-d,x11:N*(v/T-1),y11:Q*(v/T-1)}}function hn(){var l=cn,h=yn,D=V(0),S=null,v=gn,R=dn,W=mn,a=null,E=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=R.apply(this,arguments)-un,X=rn(c-f),t=c>f;if(a||(a=n=E()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(X>tn-y)a.moveTo(s*Z(f),s*O(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*Z(c),u*O(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,A=f,T=c,P=X,I=X,N=W.apply(this,arguments)/2,Q=N>y&&(S?+S.apply(this,arguments):z(u*u+s*s)),w=_(rn(s-u)/2,+D.apply(this,arguments)),p=w,x=w,e,r;if(Q>y){var Y=sn(Q/u*O(N)),B=sn(Q/s*O(N));(P-=Y*2)>y?(Y*=t?1:-1,A+=Y,T-=Y):(P=0,A=T=(f+c)/2),(I-=B*2)>y?(B*=t?1:-1,m+=B,g-=B):(I=0,m=g=(f+c)/2)}var $=s*Z(m),j=s*O(m),C=u*Z(T),F=u*O(T);if(w>y){var G=s*Z(g),H=s*O(g),K=u*Z(A),L=u*O(A),q;if(X<an)if(q=pn($,j,K,L,G,H,C,F)){var M=$-q[0],U=j-q[1],k=G-q[0],b=H-q[1],nn=1/O(fn((M*k+U*b)/(z(M*M+U*U)*z(k*k+b*b)))/2),en=z(q[0]*q[0]+q[1]*q[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}I>y?x>y?(e=J(K,L,$,j,s,x,t),r=J(G,H,C,F,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo($,j),a.arc(0,0,s,m,g,!t)):a.moveTo($,j),!(u>y)||!(P>y)?a.lineTo(C,F):p>y?(e=J(C,F,G,H,u,-p,t),r=J($,j,K,L,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,A,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +R.apply(this,arguments))/2-an/2;return[Z(d)*n,O(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:V(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:V(+n),i):h},i.cornerRadius=function(n){return arguments.length?(D=typeof n=="function"?n:V(+n),i):D},i.padRadius=function(n){return arguments.length?(S=n==null?null:typeof n=="function"?n:V(+n),i):S},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:V(+n),i):v},i.endAngle=function(n){return arguments.length?(R=typeof n=="function"?n:V(+n),i):R},i.padAngle=function(n){return arguments.length?(W=typeof n=="function"?n:V(+n),i):W},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
|
||||||
36
demo/aiui/assets/architectureDiagram-VXUJARFQ-C167KCx-.js
Normal file
122
demo/aiui/assets/blockDiagram-VD42YOAC-C2UEeRHJ.js
Normal file
10
demo/aiui/assets/c4Diagram-YG6GDRKO-EsJfvo04.js
Normal file
1
demo/aiui/assets/channel-B3uAZwi0.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{U as a,M as n}from"./mermaid.core-CAd6zjbx.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
|
||||||
1
demo/aiui/assets/chat-D6vURcTH.js
Normal file
1
demo/aiui/assets/chunk-4BX2VUAB-DvKtsWyW.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{_ as i}from"./mermaid.core-CAd6zjbx.js";function t(c,e){c.accDescr&&e.setAccDescription?.(c.accDescr),c.accTitle&&e.setAccTitle?.(c.accTitle),c.title&&e.setDiagramTitle?.(c.title)}i(t,"populateCommonDb");export{t as p};
|
||||||
1
demo/aiui/assets/chunk-55IACEB6-wvCzuWU8.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{_ as a,d as o}from"./mermaid.core-CAd6zjbx.js";var d=a((t,e)=>{let n;return e==="sandbox"&&(n=o("#i"+t)),(e==="sandbox"?o(n.nodes()[0].contentDocument.body):o("body")).select(`[id="${t}"]`)},"getDiagramElement");export{d as g};
|
||||||
165
demo/aiui/assets/chunk-B4BG7PRW-Xp_L3JSR.js
Normal file
220
demo/aiui/assets/chunk-DI55MBZ5-Cjkj4Ju9.js
Normal file
15
demo/aiui/assets/chunk-FMBD7UC4-Ckq4i3s7.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import{_ as e}from"./mermaid.core-CAd6zjbx.js";var l=e(()=>`
|
||||||
|
/* Font Awesome icon styling - consolidated */
|
||||||
|
.label-icon {
|
||||||
|
display: inline-block;
|
||||||
|
height: 1em;
|
||||||
|
overflow: visible;
|
||||||
|
vertical-align: -0.125em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node .label-icon path {
|
||||||
|
fill: currentColor;
|
||||||
|
stroke: revert;
|
||||||
|
stroke-width: revert;
|
||||||
|
}
|
||||||
|
`,"getIconStyles");export{l as g};
|
||||||
1
demo/aiui/assets/chunk-QN33PNHL-DwbD-drI.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{_ as a,e as w,l as x}from"./mermaid.core-CAd6zjbx.js";var d=a((e,t,i,r)=>{e.attr("class",i);const{width:o,height:h,x:n,y:c}=u(e,t);w(e,h,o,r);const s=l(n,c,o,h,t);e.attr("viewBox",s),x.debug(`viewBox configured: ${s} with padding: ${t}`)},"setupViewPortForSVG"),u=a((e,t)=>{const i=e.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:i.width+t*2,height:i.height+t*2,x:i.x,y:i.y}},"calculateDimensionsWithPadding"),l=a((e,t,i,r,o)=>`${e-o} ${t-o} ${i} ${r}`,"createViewBox");export{d as s};
|
||||||
1
demo/aiui/assets/chunk-QZHKN3VN-p5JjbARs.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{_ as s}from"./mermaid.core-CAd6zjbx.js";var t,e=(t=class{constructor(i){this.init=i,this.records=this.init()}reset(){this.records=this.init()}},s(t,"ImperativeState"),t);export{e as I};
|
||||||
1
demo/aiui/assets/chunk-TZMSLE5B-Cs9qm4uf.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{_ as n,L as o,j as l}from"./mermaid.core-CAd6zjbx.js";var x=n((s,t)=>{const e=s.append("rect");if(e.attr("x",t.x),e.attr("y",t.y),e.attr("fill",t.fill),e.attr("stroke",t.stroke),e.attr("width",t.width),e.attr("height",t.height),t.name&&e.attr("name",t.name),t.rx&&e.attr("rx",t.rx),t.ry&&e.attr("ry",t.ry),t.attrs!==void 0)for(const r in t.attrs)e.attr(r,t.attrs[r]);return t.class&&e.attr("class",t.class),e},"drawRect"),d=n((s,t)=>{const e={x:t.startx,y:t.starty,width:t.stopx-t.startx,height:t.stopy-t.starty,fill:t.fill,stroke:t.stroke,class:"rect"};x(s,e).lower()},"drawBackgroundRect"),g=n((s,t)=>{const e=t.text.replace(o," "),r=s.append("text");r.attr("x",t.x),r.attr("y",t.y),r.attr("class","legend"),r.style("text-anchor",t.anchor),t.class&&r.attr("class",t.class);const a=r.append("tspan");return a.attr("x",t.x+t.textMargin*2),a.text(e),r},"drawText"),h=n((s,t,e,r)=>{const a=s.append("image");a.attr("x",t),a.attr("y",e);const i=l.sanitizeUrl(r);a.attr("xlink:href",i)},"drawImage"),m=n((s,t,e,r)=>{const a=s.append("use");a.attr("x",t),a.attr("y",e);const i=l.sanitizeUrl(r);a.attr("xlink:href",`#${i}`)},"drawEmbeddedImage"),y=n(()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),"getNoteRect"),p=n(()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),"getTextObj");export{d as a,p as b,m as c,x as d,h as e,g as f,y as g};
|
||||||
1
demo/aiui/assets/classDiagram-2ON5EDUG-BR9StYyX.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{s as a,c as s,a as e,C as t}from"./chunk-B4BG7PRW-Xp_L3JSR.js";import{_ as i}from"./mermaid.core-CAd6zjbx.js";import"./chunk-FMBD7UC4-Ckq4i3s7.js";import"./chunk-55IACEB6-wvCzuWU8.js";import"./chunk-QN33PNHL-DwbD-drI.js";import"./index-CqBtvLD5.js";var u={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{u as diagram};
|
||||||
1
demo/aiui/assets/classDiagram-v2-WZHVMYZB-BR9StYyX.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{s as a,c as s,a as e,C as t}from"./chunk-B4BG7PRW-Xp_L3JSR.js";import{_ as i}from"./mermaid.core-CAd6zjbx.js";import"./chunk-FMBD7UC4-Ckq4i3s7.js";import"./chunk-55IACEB6-wvCzuWU8.js";import"./chunk-QN33PNHL-DwbD-drI.js";import"./index-CqBtvLD5.js";var u={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{u as diagram};
|
||||||
2
demo/aiui/assets/claude-provider-DbzPoW6j.js
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
const x="/aiui/",y=`${x}api/claude/v1/messages`;async function*h(r,o,g){const s={model:o.model,messages:r.filter(e=>e.role!=="system").map(e=>({role:e.role,content:typeof e.content=="string"?e.content:e.content.map(c=>c.text??"").join("")})),stream:o.stream??!0},n=r.find(e=>e.role==="system");n&&(s.system=typeof n.content=="string"?n.content:n.content.map(e=>e.text??"").join("")),o.maxTokens&&(s.max_tokens=o.maxTokens),o.temperature!==void 0&&(s.temperature=o.temperature);const a=await fetch(y,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});if(!a.ok){const e=await a.text().catch(()=>"Could not read error body");yield{type:"error",error:`Claude proxy error ${a.status}: ${e}`};return}const i=a.body?.getReader();if(!i){yield{type:"error",error:"No response body"};return}const m=new TextDecoder;let d="";try{for(;;){const{done:e,value:c}=await i.read();if(e)break;d+=m.decode(c,{stream:!0});const p=d.split(`
|
||||||
|
`);d=p.pop()??"";for(const f of p){const u=f.trim();if(!u||!u.startsWith("data: "))continue;const l=u.slice(6);if(l==="[DONE]"){yield{type:"done"};return}try{const t=JSON.parse(l);t.type==="content_block_delta"&&t.delta?.text?yield{type:"text",text:t.delta.text}:t.type==="message_stop"?yield{type:"done",usage:t.usage?{promptTokens:t.usage.input_tokens??0,completionTokens:t.usage.output_tokens??0}:void 0}:t.type==="error"&&(yield{type:"error",error:t.error?.message??"Claude stream error"})}catch{}}}}finally{i.cancel().catch(()=>{})}yield{type:"done"}}const k={id:"claude",name:"Claude (Anthropic)",version:"1.0.0",type:"ai-provider",description:"Anthropic Claude AI via proxy server",supportsStreaming:!0,supportsVision:!0,supportsTools:!0,async init(r){},async destroy(){},async isAvailable(){try{const r=await fetch(y,{method:"OPTIONS"});return r.ok||r.status===405}catch{return!1}},chat(r,o){return h(r,o)},async models(){return[{id:"claude-haiku-4.5",name:"Claude 4.5 Haiku",provider:"claude",supportsVision:!0,supportsTools:!0,contextWindow:2e5},{id:"claude-sonnet-4",name:"Claude Sonnet 4",provider:"claude",supportsVision:!0,supportsTools:!0,contextWindow:2e5},{id:"claude-opus-4",name:"Claude Opus 4",provider:"claude",supportsVision:!0,supportsTools:!0,contextWindow:2e5}]}};export{k as claudeProvider};
|
||||||
1
demo/aiui/assets/clone-CtrcJUWv.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{b as r}from"./_baseUniq-D68iWsEk.js";var e=4;function a(o){return r(o,e)}export{a as c};
|
||||||
1
demo/aiui/assets/cose-bilkent-S5V4N54A-DPVOUiB5.js
Normal file
321
demo/aiui/assets/cytoscape.esm-5J0xJHOV.js
Normal file
4
demo/aiui/assets/dagre-6UL2VRFP-PYv2B6Ic.js
Normal file
1
demo/aiui/assets/defaultLocale-DX6XiGOO.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
function J(n){return Math.abs(n=Math.round(n))>=1e21?n.toLocaleString("en").replace(/,/g,""):n.toString(10)}function j(n,t){if(!isFinite(n)||n===0)return null;var e=(n=t?n.toExponential(t-1):n.toExponential()).indexOf("e"),i=n.slice(0,e);return[i.length>1?i[0]+i.slice(2):i,+n.slice(e+1)]}function K(n){return n=j(Math.abs(n)),n?n[1]:NaN}function Q(n,t){return function(e,i){for(var o=e.length,a=[],c=0,h=n[0],M=0;o>0&&h>0&&(M+h+1>i&&(h=Math.max(1,i-M)),a.push(e.substring(o-=h,o+h)),!((M+=h+1)>i));)h=n[c=(c+1)%n.length];return a.reverse().join(t)}}function V(n){return function(t){return t.replace(/[0-9]/g,function(e){return n[+e]})}}var W=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function $(n){if(!(t=W.exec(n)))throw new Error("invalid format: "+n);var t;return new L({fill:t[1],align:t[2],sign:t[3],symbol:t[4],zero:t[5],width:t[6],comma:t[7],precision:t[8]&&t[8].slice(1),trim:t[9],type:t[10]})}$.prototype=L.prototype;function L(n){this.fill=n.fill===void 0?" ":n.fill+"",this.align=n.align===void 0?">":n.align+"",this.sign=n.sign===void 0?"-":n.sign+"",this.symbol=n.symbol===void 0?"":n.symbol+"",this.zero=!!n.zero,this.width=n.width===void 0?void 0:+n.width,this.comma=!!n.comma,this.precision=n.precision===void 0?void 0:+n.precision,this.trim=!!n.trim,this.type=n.type===void 0?"":n.type+""}L.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function _(n){n:for(var t=n.length,e=1,i=-1,o;e<t;++e)switch(n[e]){case".":i=o=e;break;case"0":i===0&&(i=e),o=e;break;default:if(!+n[e])break n;i>0&&(i=0);break}return i>0?n.slice(0,i)+n.slice(o+1):n}var N;function v(n,t){var e=j(n,t);if(!e)return N=void 0,n.toPrecision(t);var i=e[0],o=e[1],a=o-(N=Math.max(-8,Math.min(8,Math.floor(o/3)))*3)+1,c=i.length;return a===c?i:a>c?i+new Array(a-c+1).join("0"):a>0?i.slice(0,a)+"."+i.slice(a):"0."+new Array(1-a).join("0")+j(n,Math.max(0,t+a-1))[0]}function X(n,t){var e=j(n,t);if(!e)return n+"";var i=e[0],o=e[1];return o<0?"0."+new Array(-o).join("0")+i:i.length>o+1?i.slice(0,o+1)+"."+i.slice(o+1):i+new Array(o-i.length+2).join("0")}const O={"%":(n,t)=>(n*100).toFixed(t),b:n=>Math.round(n).toString(2),c:n=>n+"",d:J,e:(n,t)=>n.toExponential(t),f:(n,t)=>n.toFixed(t),g:(n,t)=>n.toPrecision(t),o:n=>Math.round(n).toString(8),p:(n,t)=>X(n*100,t),r:X,s:v,X:n=>Math.round(n).toString(16).toUpperCase(),x:n=>Math.round(n).toString(16)};function R(n){return n}var U=Array.prototype.map,Y=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function nn(n){var t=n.grouping===void 0||n.thousands===void 0?R:Q(U.call(n.grouping,Number),n.thousands+""),e=n.currency===void 0?"":n.currency[0]+"",i=n.currency===void 0?"":n.currency[1]+"",o=n.decimal===void 0?".":n.decimal+"",a=n.numerals===void 0?R:V(U.call(n.numerals,String)),c=n.percent===void 0?"%":n.percent+"",h=n.minus===void 0?"−":n.minus+"",M=n.nan===void 0?"NaN":n.nan+"";function T(f,g){f=$(f);var b=f.fill,p=f.align,m=f.sign,w=f.symbol,S=f.zero,E=f.width,F=f.comma,y=f.precision,C=f.trim,d=f.type;d==="n"?(F=!0,d="g"):O[d]||(y===void 0&&(y=12),C=!0,d="g"),(S||b==="0"&&p==="=")&&(S=!0,b="0",p="=");var q=(g&&g.prefix!==void 0?g.prefix:"")+(w==="$"?e:w==="#"&&/[boxX]/.test(d)?"0"+d.toLowerCase():""),B=(w==="$"?i:/[%p]/.test(d)?c:"")+(g&&g.suffix!==void 0?g.suffix:""),D=O[d],H=/[defgprs%]/.test(d);y=y===void 0?6:/[gprs]/.test(d)?Math.max(1,Math.min(21,y)):Math.max(0,Math.min(20,y));function G(r){var l=q,u=B,x,I,k;if(d==="c")u=D(r)+u,r="";else{r=+r;var P=r<0||1/r<0;if(r=isNaN(r)?M:D(Math.abs(r),y),C&&(r=_(r)),P&&+r==0&&m!=="+"&&(P=!1),l=(P?m==="("?m:h:m==="-"||m==="("?"":m)+l,u=(d==="s"&&!isNaN(r)&&N!==void 0?Y[8+N/3]:"")+u+(P&&m==="("?")":""),H){for(x=-1,I=r.length;++x<I;)if(k=r.charCodeAt(x),48>k||k>57){u=(k===46?o+r.slice(x+1):r.slice(x))+u,r=r.slice(0,x);break}}}F&&!S&&(r=t(r,1/0));var z=l.length+r.length+u.length,s=z<E?new Array(E-z+1).join(b):"";switch(F&&S&&(r=t(s+r,s.length?E-u.length:1/0),s=""),p){case"<":r=l+r+u+s;break;case"=":r=l+s+r+u;break;case"^":r=s.slice(0,z=s.length>>1)+l+r+u+s.slice(z);break;default:r=s+l+r+u;break}return a(r)}return G.toString=function(){return f+""},G}function Z(f,g){var b=Math.max(-8,Math.min(8,Math.floor(K(g)/3)))*3,p=Math.pow(10,-b),m=T((f=$(f),f.type="f",f),{suffix:Y[8+b/3]});return function(w){return m(p*w)}}return{format:T,formatPrefix:Z}}var A,tn,rn;en({thousands:",",grouping:[3],currency:["$",""]});function en(n){return A=nn(n),tn=A.format,rn=A.formatPrefix,A}export{rn as a,tn as b,K as e,$ as f};
|
||||||
24
demo/aiui/assets/diagram-PSM6KHXK-CPHecQFp.js
Normal file
43
demo/aiui/assets/diagram-QEK2KX5R-7Quhx6dn.js
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import{s as k,g as R,q as E,p as F,a as I,b as _,_ as l,H as D,y as G,D as f,E as P,F as C,l as z,K as H}from"./mermaid.core-CAd6zjbx.js";import{p as V}from"./chunk-4BX2VUAB-DvKtsWyW.js";import{p as W}from"./treemap-GDKQZRPO-BEECIbaX.js";import"./index-CqBtvLD5.js";import"./_baseUniq-D68iWsEk.js";import"./_basePickBy-C3OIVi4e.js";import"./clone-CtrcJUWv.js";var h={showLegend:!0,ticks:5,max:null,min:0,graticule:"circle"},w={axes:[],curves:[],options:h},m=structuredClone(w),B=P.radar,j=l(()=>f({...B,...C().radar}),"getConfig"),b=l(()=>m.axes,"getAxes"),q=l(()=>m.curves,"getCurves"),K=l(()=>m.options,"getOptions"),N=l(a=>{m.axes=a.map(t=>({name:t.name,label:t.label??t.name}))},"setAxes"),U=l(a=>{m.curves=a.map(t=>({name:t.name,label:t.label??t.name,entries:X(t.entries)}))},"setCurves"),X=l(a=>{if(a[0].axis==null)return a.map(e=>e.value);const t=b();if(t.length===0)throw new Error("Axes must be populated before curves for reference entries");return t.map(e=>{const r=a.find(s=>s.axis?.$refText===e.name);if(r===void 0)throw new Error("Missing entry for axis "+e.label);return r.value})},"computeCurveEntries"),Y=l(a=>{const t=a.reduce((e,r)=>(e[r.name]=r,e),{});m.options={showLegend:t.showLegend?.value??h.showLegend,ticks:t.ticks?.value??h.ticks,max:t.max?.value??h.max,min:t.min?.value??h.min,graticule:t.graticule?.value??h.graticule}},"setOptions"),Z=l(()=>{G(),m=structuredClone(w)},"clear"),$={getAxes:b,getCurves:q,getOptions:K,setAxes:N,setCurves:U,setOptions:Y,getConfig:j,clear:Z,setAccTitle:_,getAccTitle:I,setDiagramTitle:F,getDiagramTitle:E,getAccDescription:R,setAccDescription:k},J=l(a=>{V(a,$);const{axes:t,curves:e,options:r}=a;$.setAxes(t),$.setCurves(e),$.setOptions(r)},"populate"),Q={parse:l(async a=>{const t=await W("radar",a);z.debug(t),J(t)},"parse")},tt=l((a,t,e,r)=>{const s=r.db,o=s.getAxes(),i=s.getCurves(),n=s.getOptions(),c=s.getConfig(),d=s.getDiagramTitle(),u=D(t),p=et(u,c),g=n.max??Math.max(...i.map(y=>Math.max(...y.entries))),x=n.min,v=Math.min(c.width,c.height)/2;at(p,o,v,n.ticks,n.graticule),rt(p,o,v,c),M(p,o,i,x,g,n.graticule,c),T(p,i,n.showLegend,c),p.append("text").attr("class","radarTitle").text(d).attr("x",0).attr("y",-c.height/2-c.marginTop)},"draw"),et=l((a,t)=>{const e=t.width+t.marginLeft+t.marginRight,r=t.height+t.marginTop+t.marginBottom,s={x:t.marginLeft+t.width/2,y:t.marginTop+t.height/2};return a.attr("viewbox",`0 0 ${e} ${r}`).attr("width",e).attr("height",r),a.append("g").attr("transform",`translate(${s.x}, ${s.y})`)},"drawFrame"),at=l((a,t,e,r,s)=>{if(s==="circle")for(let o=0;o<r;o++){const i=e*(o+1)/r;a.append("circle").attr("r",i).attr("class","radarGraticule")}else if(s==="polygon"){const o=t.length;for(let i=0;i<r;i++){const n=e*(i+1)/r,c=t.map((d,u)=>{const p=2*u*Math.PI/o-Math.PI/2,g=n*Math.cos(p),x=n*Math.sin(p);return`${g},${x}`}).join(" ");a.append("polygon").attr("points",c).attr("class","radarGraticule")}}},"drawGraticule"),rt=l((a,t,e,r)=>{const s=t.length;for(let o=0;o<s;o++){const i=t[o].label,n=2*o*Math.PI/s-Math.PI/2;a.append("line").attr("x1",0).attr("y1",0).attr("x2",e*r.axisScaleFactor*Math.cos(n)).attr("y2",e*r.axisScaleFactor*Math.sin(n)).attr("class","radarAxisLine"),a.append("text").text(i).attr("x",e*r.axisLabelFactor*Math.cos(n)).attr("y",e*r.axisLabelFactor*Math.sin(n)).attr("class","radarAxisLabel")}},"drawAxes");function M(a,t,e,r,s,o,i){const n=t.length,c=Math.min(i.width,i.height)/2;e.forEach((d,u)=>{if(d.entries.length!==n)return;const p=d.entries.map((g,x)=>{const v=2*Math.PI*x/n-Math.PI/2,y=A(g,r,s,c),O=y*Math.cos(v),S=y*Math.sin(v);return{x:O,y:S}});o==="circle"?a.append("path").attr("d",L(p,i.curveTension)).attr("class",`radarCurve-${u}`):o==="polygon"&&a.append("polygon").attr("points",p.map(g=>`${g.x},${g.y}`).join(" ")).attr("class",`radarCurve-${u}`)})}l(M,"drawCurves");function A(a,t,e,r){const s=Math.min(Math.max(a,t),e);return r*(s-t)/(e-t)}l(A,"relativeRadius");function L(a,t){const e=a.length;let r=`M${a[0].x},${a[0].y}`;for(let s=0;s<e;s++){const o=a[(s-1+e)%e],i=a[s],n=a[(s+1)%e],c=a[(s+2)%e],d={x:i.x+(n.x-o.x)*t,y:i.y+(n.y-o.y)*t},u={x:n.x-(c.x-i.x)*t,y:n.y-(c.y-i.y)*t};r+=` C${d.x},${d.y} ${u.x},${u.y} ${n.x},${n.y}`}return`${r} Z`}l(L,"closedRoundCurve");function T(a,t,e,r){if(!e)return;const s=(r.width/2+r.marginRight)*3/4,o=-(r.height/2+r.marginTop)*3/4,i=20;t.forEach((n,c)=>{const d=a.append("g").attr("transform",`translate(${s}, ${o+c*i})`);d.append("rect").attr("width",12).attr("height",12).attr("class",`radarLegendBox-${c}`),d.append("text").attr("x",16).attr("y",0).attr("class","radarLegendText").text(n.label)})}l(T,"drawLegend");var st={draw:tt},nt=l((a,t)=>{let e="";for(let r=0;r<a.THEME_COLOR_LIMIT;r++){const s=a[`cScale${r}`];e+=`
|
||||||
|
.radarCurve-${r} {
|
||||||
|
color: ${s};
|
||||||
|
fill: ${s};
|
||||||
|
fill-opacity: ${t.curveOpacity};
|
||||||
|
stroke: ${s};
|
||||||
|
stroke-width: ${t.curveStrokeWidth};
|
||||||
|
}
|
||||||
|
.radarLegendBox-${r} {
|
||||||
|
fill: ${s};
|
||||||
|
fill-opacity: ${t.curveOpacity};
|
||||||
|
stroke: ${s};
|
||||||
|
}
|
||||||
|
`}return e},"genIndexStyles"),ot=l(a=>{const t=H(),e=C(),r=f(t,e.themeVariables),s=f(r.radar,a);return{themeVariables:r,radarOptions:s}},"buildRadarStyleOptions"),it=l(({radar:a}={})=>{const{themeVariables:t,radarOptions:e}=ot(a);return`
|
||||||
|
.radarTitle {
|
||||||
|
font-size: ${t.fontSize};
|
||||||
|
color: ${t.titleColor};
|
||||||
|
dominant-baseline: hanging;
|
||||||
|
text-anchor: middle;
|
||||||
|
}
|
||||||
|
.radarAxisLine {
|
||||||
|
stroke: ${e.axisColor};
|
||||||
|
stroke-width: ${e.axisStrokeWidth};
|
||||||
|
}
|
||||||
|
.radarAxisLabel {
|
||||||
|
dominant-baseline: middle;
|
||||||
|
text-anchor: middle;
|
||||||
|
font-size: ${e.axisLabelFontSize}px;
|
||||||
|
color: ${e.axisColor};
|
||||||
|
}
|
||||||
|
.radarGraticule {
|
||||||
|
fill: ${e.graticuleColor};
|
||||||
|
fill-opacity: ${e.graticuleOpacity};
|
||||||
|
stroke: ${e.graticuleColor};
|
||||||
|
stroke-width: ${e.graticuleStrokeWidth};
|
||||||
|
}
|
||||||
|
.radarLegendText {
|
||||||
|
text-anchor: start;
|
||||||
|
font-size: ${e.legendFontSize}px;
|
||||||
|
dominant-baseline: hanging;
|
||||||
|
}
|
||||||
|
${nt(t,e)}
|
||||||
|
`},"styles"),ht={parser:Q,db:$,renderer:st,styles:it};export{ht as diagram};
|
||||||
24
demo/aiui/assets/diagram-S2PKOQOG-BKQS725D.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import{_ as b,D as m,H as B,e as C,l as w,b as S,a as D,p as T,q as E,g as F,s as P,E as z,F as A,y as W}from"./mermaid.core-CAd6zjbx.js";import{p as _}from"./chunk-4BX2VUAB-DvKtsWyW.js";import{p as N}from"./treemap-GDKQZRPO-BEECIbaX.js";import"./index-CqBtvLD5.js";import"./_baseUniq-D68iWsEk.js";import"./_basePickBy-C3OIVi4e.js";import"./clone-CtrcJUWv.js";var L=z.packet,u,v=(u=class{constructor(){this.packet=[],this.setAccTitle=S,this.getAccTitle=D,this.setDiagramTitle=T,this.getDiagramTitle=E,this.getAccDescription=F,this.setAccDescription=P}getConfig(){const t=m({...L,...A().packet});return t.showBits&&(t.paddingY+=10),t}getPacket(){return this.packet}pushWord(t){t.length>0&&this.packet.push(t)}clear(){W(),this.packet=[]}},b(u,"PacketDB"),u),M=1e4,Y=b((e,t)=>{_(e,t);let r=-1,o=[],n=1;const{bitsPerRow:l}=t.getConfig();for(let{start:a,end:i,bits:d,label:c}of e.blocks){if(a!==void 0&&i!==void 0&&i<a)throw new Error(`Packet block ${a} - ${i} is invalid. End must be greater than start.`);if(a??=r+1,a!==r+1)throw new Error(`Packet block ${a} - ${i??a} is not contiguous. It should start from ${r+1}.`);if(d===0)throw new Error(`Packet block ${a} is invalid. Cannot have a zero bit field.`);for(i??=a+(d??1)-1,d??=i-a+1,r=i,w.debug(`Packet block ${a} - ${r} with label ${c}`);o.length<=l+1&&t.getPacket().length<M;){const[p,s]=H({start:a,end:i,bits:d,label:c},n,l);if(o.push(p),p.end+1===n*l&&(t.pushWord(o),o=[],n++),!s)break;({start:a,end:i,bits:d,label:c}=s)}}t.pushWord(o)},"populate"),H=b((e,t,r)=>{if(e.start===void 0)throw new Error("start should have been set during first phase");if(e.end===void 0)throw new Error("end should have been set during first phase");if(e.start>e.end)throw new Error(`Block start ${e.start} is greater than block end ${e.end}.`);if(e.end+1<=t*r)return[e,void 0];const o=t*r-1,n=t*r;return[{start:e.start,end:o,label:e.label,bits:o-e.start},{start:n,end:e.end,label:e.label,bits:e.end-n}]},"getNextFittingBlock"),x={parser:{yy:void 0},parse:b(async e=>{const t=await N("packet",e),r=x.parser?.yy;if(!(r instanceof v))throw new Error("parser.parser?.yy was not a PacketDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");w.debug(t),Y(t,r)},"parse")},I=b((e,t,r,o)=>{const n=o.db,l=n.getConfig(),{rowHeight:a,paddingY:i,bitWidth:d,bitsPerRow:c}=l,p=n.getPacket(),s=n.getDiagramTitle(),h=a+i,g=h*(p.length+1)-(s?0:a),k=d*c+2,f=B(t);f.attr("viewbox",`0 0 ${k} ${g}`),C(f,g,k,l.useMaxWidth);for(const[y,$]of p.entries())O(f,$,y,l);f.append("text").text(s).attr("x",k/2).attr("y",g-h/2).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("class","packetTitle")},"draw"),O=b((e,t,r,{rowHeight:o,paddingX:n,paddingY:l,bitWidth:a,bitsPerRow:i,showBits:d})=>{const c=e.append("g"),p=r*(o+l)+l;for(const s of t){const h=s.start%i*a+1,g=(s.end-s.start+1)*a-n;if(c.append("rect").attr("x",h).attr("y",p).attr("width",g).attr("height",o).attr("class","packetBlock"),c.append("text").attr("x",h+g/2).attr("y",p+o/2).attr("class","packetLabel").attr("dominant-baseline","middle").attr("text-anchor","middle").text(s.label),!d)continue;const k=s.end===s.start,f=p-2;c.append("text").attr("x",h+(k?g/2:0)).attr("y",f).attr("class","packetByte start").attr("dominant-baseline","auto").attr("text-anchor",k?"middle":"start").text(s.start),k||c.append("text").attr("x",h+g).attr("y",f).attr("class","packetByte end").attr("dominant-baseline","auto").attr("text-anchor","end").text(s.end)}},"drawWord"),j={draw:I},q={byteFontSize:"10px",startByteColor:"black",endByteColor:"black",labelColor:"black",labelFontSize:"12px",titleColor:"black",titleFontSize:"14px",blockStrokeColor:"black",blockStrokeWidth:"1",blockFillColor:"#efefef"},G=b(({packet:e}={})=>{const t=m(q,e);return`
|
||||||
|
.packetByte {
|
||||||
|
font-size: ${t.byteFontSize};
|
||||||
|
}
|
||||||
|
.packetByte.start {
|
||||||
|
fill: ${t.startByteColor};
|
||||||
|
}
|
||||||
|
.packetByte.end {
|
||||||
|
fill: ${t.endByteColor};
|
||||||
|
}
|
||||||
|
.packetLabel {
|
||||||
|
fill: ${t.labelColor};
|
||||||
|
font-size: ${t.labelFontSize};
|
||||||
|
}
|
||||||
|
.packetTitle {
|
||||||
|
fill: ${t.titleColor};
|
||||||
|
font-size: ${t.titleFontSize};
|
||||||
|
}
|
||||||
|
.packetBlock {
|
||||||
|
stroke: ${t.blockStrokeColor};
|
||||||
|
stroke-width: ${t.blockStrokeWidth};
|
||||||
|
fill: ${t.blockFillColor};
|
||||||
|
}
|
||||||
|
`},"styles"),Z={parser:x,get db(){return new v},renderer:j,styles:G};export{Z as diagram};
|
||||||
60
demo/aiui/assets/erDiagram-Q2GNP2WA-BJADubdx.js
Normal file
2
demo/aiui/assets/film-renderer-DjEbuBTn.js
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/FilmGrid-DE3h3PKy.js","assets/FilmGrid.vue_vue_type_script_setup_true_lang-Cl2ukq8v.js","assets/index-CqBtvLD5.js","assets/index-D1RpahE8.css","assets/useContentImages-CXWJDBMs.js","assets/FilmDetail-DTcHMuvD.js","assets/FilmDetail.vue_vue_type_script_setup_true_lang-Ckw7Dobw.js"])))=>i.map(i=>d[i]);
|
||||||
|
import{d as e,_ as r}from"./index-CqBtvLD5.js";const _={id:"film",name:"Film Renderer",contentType:"film",surfaces:["chat-preview","panel-preview","panel-play"],chatPreview:e(()=>r(()=>import("./FilmGrid-DE3h3PKy.js"),__vite__mapDeps([0,1,2,3,4]))),panelPreview:e(()=>r(()=>import("./FilmGrid-DE3h3PKy.js"),__vite__mapDeps([0,1,2,3,4]))),panelPlay:e(()=>r(()=>import("./FilmDetail-DTcHMuvD.js"),__vite__mapDeps([5,6,2,3])))};export{_ as filmRenderer};
|
||||||
162
demo/aiui/assets/flowDiagram-NV44I4VS-DKPdEBIH.js
Normal file
1
demo/aiui/assets/freeFilms-B9DmMKj5.js
Normal file
267
demo/aiui/assets/ganttDiagram-JELNMOA3-DO23PGVp.js
Normal file
65
demo/aiui/assets/gitGraphDiagram-V2S2FVAM-BdeiHkN2.js
Normal file
1
demo/aiui/assets/graph-CJtq5AcG.js
Normal file
100
demo/aiui/assets/guideConversation-BYC5cBFP.js
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
function t(){return{id:"aiui-guide",title:"AIUI Guide",messages:[{id:"guide-q",role:"user",content:"How do I use AIUI?",timestamp:1772496e6},{id:"guide-a",role:"assistant",content:`# AIUI Guide — Your Node Assistant
|
||||||
|
|
||||||
|
AIUI is your AI assistant running directly on your Archipelago node. It can see your installed apps, read your files, check Bitcoin and Lightning status, and help you manage everything — all privately, with no data leaving your node.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Node Awareness
|
||||||
|
|
||||||
|
AIUI automatically knows about your node setup. Just ask naturally:
|
||||||
|
|
||||||
|
- *"What apps do I have installed?"*
|
||||||
|
- *"Is my node connected to the network?"*
|
||||||
|
- *"What version of Archipelago am I running?"*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## File Browsing & Reading
|
||||||
|
|
||||||
|
AIUI can browse and read text files stored in your Nextcloud. Supported formats: \`.txt\`, \`.md\`, \`.json\`, \`.csv\`, \`.log\`, \`.yaml\`, \`.conf\`, \`.toml\`, \`.xml\`, \`.html\`, \`.css\`, \`.js\`, \`.ts\`, \`.py\`, \`.sh\`, and more.
|
||||||
|
|
||||||
|
- *"What files do I have?"*
|
||||||
|
- *"Read my config.yaml file"*
|
||||||
|
- *"Show me the contents of notes.md"*
|
||||||
|
- *"Summarize my todo.txt"*
|
||||||
|
|
||||||
|
> Files are read up to 100KB. Larger files are truncated. Binary files (images, videos) cannot be read as text.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bitcoin Node Status
|
||||||
|
|
||||||
|
If you have Bitcoin Core running, AIUI can check sync status, block height, and mempool info in real-time.
|
||||||
|
|
||||||
|
- *"How's my Bitcoin node doing?"*
|
||||||
|
- *"What block height am I on?"*
|
||||||
|
- *"Is my node fully synced?"*
|
||||||
|
- *"How many transactions are in the mempool?"*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lightning Network (LND)
|
||||||
|
|
||||||
|
AIUI can query your LND node for channels, peers, balances, and sync status. Private keys and macaroons are never exposed.
|
||||||
|
|
||||||
|
- *"What's my Lightning balance?"*
|
||||||
|
- *"How many channels do I have open?"*
|
||||||
|
- *"How many peers is my node connected to?"*
|
||||||
|
- *"Is my Lightning node synced?"*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## App Logs
|
||||||
|
|
||||||
|
When an app isn't working right, AIUI can pull recent log output to help diagnose issues.
|
||||||
|
|
||||||
|
- *"Why is Mempool not working?"*
|
||||||
|
- *"Show me the Bitcoin Core logs"*
|
||||||
|
- *"What errors is Nextcloud showing?"*
|
||||||
|
- *"Show me the last 100 lines of LND logs"*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## App Management
|
||||||
|
|
||||||
|
AIUI can help you navigate your node, open apps, and install new ones.
|
||||||
|
|
||||||
|
- *"Open Mempool"*
|
||||||
|
- *"Install BTCPay Server"*
|
||||||
|
- *"Take me to the Settings page"*
|
||||||
|
- *"What apps are available to install?"*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Chat Features
|
||||||
|
|
||||||
|
- **Conversation History** — All chats saved locally. Use the history panel to switch between them.
|
||||||
|
- **Edit Messages** — Click any sent message to edit and re-send.
|
||||||
|
- **Branch Conversations** — Fork at any point to explore a different direction.
|
||||||
|
- **Web Search** — When enabled, AIUI searches the web for current info.
|
||||||
|
- **Image Support** — Attach images for visual questions.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Privacy & Permissions
|
||||||
|
|
||||||
|
AIUI only accesses what you allow. Node data categories (apps, files, wallet, bitcoin, network, system) are permission-gated through the Archy permissions panel. All processing goes through your node's Claude proxy — your conversations and data never touch third-party servers beyond the AI API. Private keys, seeds, and macaroons are never exposed.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tips
|
||||||
|
|
||||||
|
- Be specific — *"Read my bitcoin.conf"* works better than *"show me config files"*
|
||||||
|
- AIUI remembers context within a conversation, so ask follow-ups
|
||||||
|
- If something seems wrong with an app, ask AIUI to check the logs first
|
||||||
|
- You can ask AIUI to explain what a config file does after reading it
|
||||||
|
- Use the history panel to return to previous conversations at any time
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Try asking me something! For example: *"What apps do I have installed?"* or *"How's my Bitcoin node?"*`,timestamp:1772496e6+2e3}],createdAt:1772496e6,updatedAt:1772496e6+2e3}}export{t as guideToConversation};
|
||||||
3
demo/aiui/assets/icons/microphone.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 83.44 122.88">
|
||||||
|
<path fill="currentColor" d="M45.04,95.45v24.11c0,1.83-1.49,3.32-3.32,3.32c-1.83,0-3.32-1.49-3.32-3.32V95.45c-10.16-0.81-19.32-5.3-26.14-12.12C4.69,75.77,0,65.34,0,53.87c0-1.83,1.49-3.32,3.32-3.32s3.32,1.49,3.32,3.32c0,9.64,3.95,18.41,10.31,24.77c6.36,6.36,15.13,10.31,24.77,10.31h0c9.64,0,18.41-3.95,24.77-10.31c6.36-6.36,10.31-15.13,10.31-24.77c0-1.83,1.49-3.32,3.32-3.32s3.32,1.49,3.32,3.32c0,11.48-4.69,21.91-12.25,29.47C64.36,90.16,55.2,94.64,45.04,95.45z M41.94,0c6.38,0,12.18,2.61,16.38,6.81c4.2,4.2,6.81,10,6.81,16.38v30c0,6.38-2.61,12.18-6.81,16.38c-4.2,4.2-10,6.81-16.38,6.81s-12.18-2.61-16.38-6.81c-4.2-4.2-6.81-10-6.81-16.38v-30c0-6.38,2.61-12.18,6.81-16.38C29.76,2.61,35.56,0,41.94,0z M53.62,11.51c-3-3-7.14-4.86-11.68-4.86c-4.55,0-8.68,1.86-11.68,4.86c-3,3-4.86,7.14-4.86,11.68v30c0,4.55,1.86,8.68,4.86,11.68c3,3,7.14,4.86,11.68,4.86c4.55,0,8.68-1.86,11.68-4.86c3-3,4.86-7.14,4.86-11.68v-30C58.49,18.64,56.62,14.51,53.62,11.51z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1022 B |
BIN
demo/aiui/assets/img/bg-intro-3.jpg
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
48
demo/aiui/assets/index-CqBtvLD5.js
Normal file
1
demo/aiui/assets/index-D1RpahE8.css
Normal file
2
demo/aiui/assets/infoDiagram-HS3SLOUP-BG1I-z0K.js
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
import{_ as e,l as s,H as n,e as i,I as p}from"./mermaid.core-CAd6zjbx.js";import{p as g}from"./treemap-GDKQZRPO-BEECIbaX.js";import"./index-CqBtvLD5.js";import"./_baseUniq-D68iWsEk.js";import"./_basePickBy-C3OIVi4e.js";import"./clone-CtrcJUWv.js";var v={parse:e(async r=>{const a=await g("info",r);s.debug(a)},"parse")},d={version:p.version+""},m=e(()=>d.version,"getVersion"),c={getVersion:m},l=e((r,a,o)=>{s.debug(`rendering info diagram
|
||||||
|
`+r);const t=n(a);i(t,100,400,!0),t.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${o}`)},"draw"),f={draw:l},z={parser:v,db:c,renderer:f};export{z as diagram};
|
||||||
1
demo/aiui/assets/init-Gi6I4Gst.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
function t(e,a){switch(arguments.length){case 0:break;case 1:this.range(e);break;default:this.range(a).domain(e);break}return this}export{t as i};
|
||||||
139
demo/aiui/assets/journeyDiagram-XKPGCS4Q-BCQppdes.js
Normal file
89
demo/aiui/assets/kanban-definition-3W4ZIXB7-DFRRxhYA.js
Normal file
261
demo/aiui/assets/katex-DGN8GczM.js
Normal file
1
demo/aiui/assets/katex.min-CASE1JAf.css
Normal file
1
demo/aiui/assets/layout-BEWArI_F.js
Normal file
1
demo/aiui/assets/linear-BVk1H_UY.js
Normal file
249
demo/aiui/assets/mermaid.core-CAd6zjbx.js
Normal file
68
demo/aiui/assets/mindmap-definition-VGOIOE7T-vbyezeJT.js
Normal file
176
demo/aiui/assets/nodeDemoPrompts-DjnuaxJP.js
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
const n=[{id:"node-apps",userQuery:"What apps do I have installed on my node?",assistantResponse:`You have the following apps installed on your Archipelago node:
|
||||||
|
|
||||||
|
- **Bitcoin Core** (running) — Your Bitcoin full node, fully synced to the blockchain
|
||||||
|
- **LND** (running) — Lightning Network daemon for fast, cheap payments
|
||||||
|
- **Mempool** (running) — Visual Bitcoin blockchain explorer and mempool monitor
|
||||||
|
- **Nextcloud** (running) — Your private cloud storage for files, photos, and documents
|
||||||
|
- **BTCPay Server** (running) — Self-hosted payment processor for accepting Bitcoin
|
||||||
|
- **Tor** (running) — Anonymous network routing for privacy
|
||||||
|
|
||||||
|
All 6 apps are running normally. Would you like me to check the logs for any of them, or open one up?`},{id:"node-bitcoin",userQuery:"How's my Bitcoin node doing?",assistantResponse:`Your Bitcoin Core node is looking healthy:
|
||||||
|
|
||||||
|
**Bitcoin Node Status**
|
||||||
|
- **Block Height:** 886,421
|
||||||
|
- **Sync Progress:** 100.00% (fully synced)
|
||||||
|
- **Chain:** mainnet
|
||||||
|
- **Mempool:** 42,318 transactions (68.2 MB)
|
||||||
|
|
||||||
|
Your node is fully caught up with the Bitcoin network. The mempool is moderately full — transaction fees are around 12-25 sat/vB for next-block confirmation. This is a typical level of activity.
|
||||||
|
|
||||||
|
Would you like me to check your Lightning node status as well?`},{id:"node-lightning",userQuery:"Yes, what's my Lightning balance?",assistantResponse:`Here's your Lightning Network status:
|
||||||
|
|
||||||
|
**Lightning (LND)**
|
||||||
|
- **Node Alias:** ArchyNode-228
|
||||||
|
- **Channels:** 5 active channels
|
||||||
|
- **Peers:** 8 connected peers
|
||||||
|
- **Channel Balance:** 3,150,000 sats (in channels)
|
||||||
|
- **On-chain Balance:** 1,245,000 sats
|
||||||
|
- **Pending Open:** 0 sats
|
||||||
|
- **Sync:** Fully synced to chain
|
||||||
|
|
||||||
|
Your total Lightning capacity is about 3.15M sats across 5 channels, plus 1.24M sats on-chain. Everything looks healthy — all channels are active and your node is fully synced.
|
||||||
|
|
||||||
|
Your total Bitcoin holdings visible to the node: **4,395,000 sats** (~$4,395 at current rates).`},{id:"node-files",userQuery:"What files do I have stored on my node?",assistantResponse:`You have **47 files** in your Nextcloud storage. Here are the most recent:
|
||||||
|
|
||||||
|
- bitcoin.conf
|
||||||
|
- lnd.conf
|
||||||
|
- notes.md
|
||||||
|
- budget-2026.csv
|
||||||
|
- family-photos/ (folder)
|
||||||
|
- Documents/ (folder)
|
||||||
|
- backup-keys.txt
|
||||||
|
- todo.txt
|
||||||
|
- project-ideas.md
|
||||||
|
- recipes/ (folder)
|
||||||
|
|
||||||
|
Would you like me to read any of these files? I can open text files like .txt, .md, .json, .csv, .conf, .yaml, and more.`},{id:"node-read-file",userQuery:"Read my todo.txt",assistantResponse:`Here's the contents of **todo.txt** (342 bytes):
|
||||||
|
|
||||||
|
\`\`\`
|
||||||
|
Shopping List
|
||||||
|
- Groceries for the week
|
||||||
|
- New HDMI cable for the node monitor
|
||||||
|
- Backup hard drive (4TB minimum)
|
||||||
|
|
||||||
|
Node Tasks
|
||||||
|
- Open more Lightning channels
|
||||||
|
- Set up Ride The Lightning (RTL)
|
||||||
|
- Configure automatic channel backups
|
||||||
|
- Test BTCPay Server checkout flow
|
||||||
|
|
||||||
|
Personal
|
||||||
|
- Call dentist for appointment
|
||||||
|
- Renew domain registration
|
||||||
|
- Plan weekend hike
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
Looks like you've got some node tasks on your list! I can help you with a few of those — I can open the app marketplace to install Ride The Lightning, or check your current channel backup configuration. Want me to help with any of these?`},{id:"node-read-config",userQuery:"Show me my bitcoin.conf",assistantResponse:`Here's your **bitcoin.conf** (512 bytes):
|
||||||
|
|
||||||
|
\`\`\`conf
|
||||||
|
# Bitcoin Core Configuration
|
||||||
|
server=1
|
||||||
|
daemon=1
|
||||||
|
txindex=1
|
||||||
|
|
||||||
|
# RPC Settings
|
||||||
|
rpcuser=archipelago
|
||||||
|
rpcpassword=archipelago123
|
||||||
|
rpcallowip=127.0.0.1
|
||||||
|
rpcbind=127.0.0.1
|
||||||
|
rpcport=8332
|
||||||
|
|
||||||
|
# Network
|
||||||
|
listen=1
|
||||||
|
maxconnections=40
|
||||||
|
maxuploadtarget=5000
|
||||||
|
|
||||||
|
# Mempool
|
||||||
|
maxmempool=300
|
||||||
|
mempoolexpiry=72
|
||||||
|
|
||||||
|
# Performance
|
||||||
|
dbcache=450
|
||||||
|
par=2
|
||||||
|
|
||||||
|
# ZMQ (for LND)
|
||||||
|
zmqpubrawblock=tcp://127.0.0.1:28332
|
||||||
|
zmqpubrawtx=tcp://127.0.0.1:28333
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
Your config looks solid. A few observations:
|
||||||
|
- **txindex=1** is enabled, which is needed for Electrum Server and block explorers
|
||||||
|
- **dbcache=450** MB — reasonable for your hardware
|
||||||
|
- **ZMQ** is configured for LND to receive real-time block/tx notifications
|
||||||
|
- **maxuploadtarget=5000** MB/day limits upload bandwidth
|
||||||
|
|
||||||
|
Everything is properly set up for running LND and Mempool alongside Bitcoin Core.`},{id:"node-app-logs",userQuery:"Mempool seems slow, can you check what's going on?",assistantResponse:`Let me check the Mempool logs for you.
|
||||||
|
|
||||||
|
Here are the last 50 lines of **Mempool** logs:
|
||||||
|
|
||||||
|
\`\`\`
|
||||||
|
[2026-03-05 14:23:01] Updating mempool stats...
|
||||||
|
[2026-03-05 14:23:02] Fetched 42318 transactions from Bitcoin Core
|
||||||
|
[2026-03-05 14:23:03] Block 886421 indexed successfully
|
||||||
|
[2026-03-05 14:23:05] WebSocket: 12 clients connected
|
||||||
|
[2026-03-05 14:23:10] Mining pool stats updated
|
||||||
|
[2026-03-05 14:23:15] Mempool size: 68.2 MB (42318 txs)
|
||||||
|
[2026-03-05 14:23:20] Fee estimation updated: 12-25 sat/vB
|
||||||
|
[2026-03-05 14:23:25] WARN: Electrs sync delay detected (2.3s)
|
||||||
|
[2026-03-05 14:23:30] Updating difficulty adjustment...
|
||||||
|
[2026-03-05 14:23:35] Hashrate calculation complete
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
I see one warning: **Electrs sync delay of 2.3 seconds**. This is the Electrum Server indexer that Mempool uses for address lookups. A small delay like this is usually temporary and happens when:
|
||||||
|
|
||||||
|
1. A new block was just found (extra indexing work)
|
||||||
|
2. The mempool is particularly full (more data to process)
|
||||||
|
|
||||||
|
The rest of the logs look normal. Mempool is serving 12 active WebSocket connections. If the slowness persists, you might want to restart the Mempool container. Want me to do that?`},{id:"node-open-app",userQuery:"Open Mempool so I can check it myself",assistantResponse:`Opening **Mempool** for you now. The app should appear in a new view — you'll see the real-time mempool visualization, fee estimates, and recent blocks.
|
||||||
|
|
||||||
|
If it's still feeling slow, try refreshing the page. The Electrs sync delay I noticed earlier should resolve itself within a few minutes.`},{id:"node-install",userQuery:"What other apps can I install?",assistantResponse:`Here are some apps available in the Archipelago marketplace that you haven't installed yet:
|
||||||
|
|
||||||
|
**Recommended for your setup:**
|
||||||
|
- **Ride The Lightning (RTL)** — Visual Lightning node manager with channel management, payments, and routing fee settings. Great companion to LND.
|
||||||
|
- **ThunderHub** — Another Lightning dashboard with a modern UI. More advanced routing and rebalancing tools.
|
||||||
|
- **BOS (Balance of Satoshis)** — CLI tool for advanced Lightning channel management and rebalancing.
|
||||||
|
|
||||||
|
**Privacy & Communication:**
|
||||||
|
- **Nostr Relay** — Run your own Nostr relay for censorship-resistant social media
|
||||||
|
- **SimpleX Chat Server** — Private messaging server
|
||||||
|
|
||||||
|
**Other:**
|
||||||
|
- **Home Assistant** — Smart home automation
|
||||||
|
- **Gitea** — Self-hosted Git repository (like a private GitHub)
|
||||||
|
- **Vaultwarden** — Self-hosted password manager (Bitwarden compatible)
|
||||||
|
|
||||||
|
Since you mentioned wanting to set up RTL in your todo list, would you like me to install **Ride The Lightning** for you?`},{id:"node-summary",userQuery:"Give me a full status summary of my node",assistantResponse:`Here's your complete **Archipelago Node Status**:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**System**
|
||||||
|
- Archipelago v0.1.0
|
||||||
|
- Network: Connected
|
||||||
|
- Uptime: 14 days, 6 hours
|
||||||
|
|
||||||
|
**Bitcoin Core** — Running
|
||||||
|
- Block: 886,421 (100% synced)
|
||||||
|
- Mempool: 42,318 txs (68.2 MB)
|
||||||
|
- Connections: 38 peers
|
||||||
|
|
||||||
|
**Lightning (LND)** — Running
|
||||||
|
- Alias: ArchyNode-228
|
||||||
|
- Channels: 5 active, 0 pending
|
||||||
|
- Peers: 8 connected
|
||||||
|
- Channel balance: 3,150,000 sats
|
||||||
|
- On-chain balance: 1,245,000 sats
|
||||||
|
- Total: 4,395,000 sats
|
||||||
|
|
||||||
|
**Apps** — 6/6 running
|
||||||
|
- Bitcoin Core, LND, Mempool, Nextcloud, BTCPay Server, Tor
|
||||||
|
|
||||||
|
**Storage**
|
||||||
|
- Nextcloud: 47 files
|
||||||
|
- Blockchain: ~600 GB
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Everything is running smoothly. No errors or warnings in the last 24 hours. Your node is fully synced, all channels are active, and all apps are healthy.`}];function i(){const t=[];for(let e=0;e<n.length;e++){const o=n[e],s=17724924e5+e*12e4;t.push({id:`${o.id}-q`,role:"user",content:o.userQuery,timestamp:s},{id:`${o.id}-a`,role:"assistant",content:o.assistantResponse,timestamp:s+5e3})}return{id:"node-demo",title:"Exploring My Node",messages:t,createdAt:17724924e5,updatedAt:17724924e5+n.length*12e4}}export{n as nodeDemoPrompts,i as nodeDemoToConversation};
|
||||||
1
demo/aiui/assets/openlibrary-B8IPeH2e.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
const e={id:"openlibrary",name:"Open Library",version:"1.0.0",type:"search",description:"Search books from Open Library",async init(r){},async destroy(){},async isAvailable(){return!0}};export{e as openLibraryPlugin};
|
||||||
1
demo/aiui/assets/ordinal-Cboi1Yqb.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{i as a}from"./init-Gi6I4Gst.js";class o extends Map{constructor(n,t=g){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:t}}),n!=null)for(const[r,s]of n)this.set(r,s)}get(n){return super.get(c(this,n))}has(n){return super.has(c(this,n))}set(n,t){return super.set(l(this,n),t)}delete(n){return super.delete(p(this,n))}}function c({_intern:e,_key:n},t){const r=n(t);return e.has(r)?e.get(r):t}function l({_intern:e,_key:n},t){const r=n(t);return e.has(r)?e.get(r):(e.set(r,t),t)}function p({_intern:e,_key:n},t){const r=n(t);return e.has(r)&&(t=e.get(r),e.delete(r)),t}function g(e){return e!==null&&typeof e=="object"?e.valueOf():e}const f=Symbol("implicit");function h(){var e=new o,n=[],t=[],r=f;function s(u){let i=e.get(u);if(i===void 0){if(r!==f)return r;e.set(u,i=n.push(u)-1)}return t[i%t.length]}return s.domain=function(u){if(!arguments.length)return n.slice();n=[],e=new o;for(const i of u)e.has(i)||e.set(i,n.push(i)-1);return s},s.range=function(u){return arguments.length?(t=Array.from(u),s):t.slice()},s.unknown=function(u){return arguments.length?(r=u,s):r},s.copy=function(){return h(n,t).unknown(r)},a.apply(s,arguments),s}export{h as o};
|
||||||
30
demo/aiui/assets/pieDiagram-ADFJNKIX-GpWNwMiQ.js
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import{R as S,V as z,aG as j,g as q,s as H,a as Z,b as J,q as K,p as Q,_ as p,l as F,c as X,D as Y,H as ee,a4 as te,e as ae,y as re,E as ne}from"./mermaid.core-CAd6zjbx.js";import{p as ie}from"./chunk-4BX2VUAB-DvKtsWyW.js";import{p as se}from"./treemap-GDKQZRPO-BEECIbaX.js";import{d as I}from"./arc-BxlWYvsk.js";import{o as le}from"./ordinal-Cboi1Yqb.js";import"./index-CqBtvLD5.js";import"./_baseUniq-D68iWsEk.js";import"./_basePickBy-C3OIVi4e.js";import"./clone-CtrcJUWv.js";import"./init-Gi6I4Gst.js";function oe(e,a){return a<e?-1:a>e?1:a>=e?0:NaN}function ce(e){return e}function ue(){var e=ce,a=oe,f=null,y=S(0),s=S(z),o=S(0);function l(t){var n,c=(t=j(t)).length,d,x,h=0,u=new Array(c),i=new Array(c),v=+y.apply(this,arguments),w=Math.min(z,Math.max(-z,s.apply(this,arguments)-v)),m,C=Math.min(Math.abs(w)/c,o.apply(this,arguments)),$=C*(w<0?-1:1),g;for(n=0;n<c;++n)(g=i[u[n]=n]=+e(t[n],n,t))>0&&(h+=g);for(a!=null?u.sort(function(A,D){return a(i[A],i[D])}):f!=null&&u.sort(function(A,D){return f(t[A],t[D])}),n=0,x=h?(w-c*$)/h:0;n<c;++n,v=m)d=u[n],g=i[d],m=v+(g>0?g*x:0)+$,i[d]={data:t[d],index:n,value:g,startAngle:v,endAngle:m,padAngle:C};return i}return l.value=function(t){return arguments.length?(e=typeof t=="function"?t:S(+t),l):e},l.sortValues=function(t){return arguments.length?(a=t,f=null,l):a},l.sort=function(t){return arguments.length?(f=t,a=null,l):f},l.startAngle=function(t){return arguments.length?(y=typeof t=="function"?t:S(+t),l):y},l.endAngle=function(t){return arguments.length?(s=typeof t=="function"?t:S(+t),l):s},l.padAngle=function(t){return arguments.length?(o=typeof t=="function"?t:S(+t),l):o},l}var pe=ne.pie,G={sections:new Map,showData:!1},T=G.sections,N=G.showData,de=structuredClone(pe),ge=p(()=>structuredClone(de),"getConfig"),fe=p(()=>{T=new Map,N=G.showData,re()},"clear"),me=p(({label:e,value:a})=>{if(a<0)throw new Error(`"${e}" has invalid value: ${a}. Negative values are not allowed in pie charts. All slice values must be >= 0.`);T.has(e)||(T.set(e,a),F.debug(`added new section: ${e}, with value: ${a}`))},"addSection"),he=p(()=>T,"getSections"),ve=p(e=>{N=e},"setShowData"),Se=p(()=>N,"getShowData"),L={getConfig:ge,clear:fe,setDiagramTitle:Q,getDiagramTitle:K,setAccTitle:J,getAccTitle:Z,setAccDescription:H,getAccDescription:q,addSection:me,getSections:he,setShowData:ve,getShowData:Se},ye=p((e,a)=>{ie(e,a),a.setShowData(e.showData),e.sections.map(a.addSection)},"populateDb"),xe={parse:p(async e=>{const a=await se("pie",e);F.debug(a),ye(a,L)},"parse")},we=p(e=>`
|
||||||
|
.pieCircle{
|
||||||
|
stroke: ${e.pieStrokeColor};
|
||||||
|
stroke-width : ${e.pieStrokeWidth};
|
||||||
|
opacity : ${e.pieOpacity};
|
||||||
|
}
|
||||||
|
.pieOuterCircle{
|
||||||
|
stroke: ${e.pieOuterStrokeColor};
|
||||||
|
stroke-width: ${e.pieOuterStrokeWidth};
|
||||||
|
fill: none;
|
||||||
|
}
|
||||||
|
.pieTitleText {
|
||||||
|
text-anchor: middle;
|
||||||
|
font-size: ${e.pieTitleTextSize};
|
||||||
|
fill: ${e.pieTitleTextColor};
|
||||||
|
font-family: ${e.fontFamily};
|
||||||
|
}
|
||||||
|
.slice {
|
||||||
|
font-family: ${e.fontFamily};
|
||||||
|
fill: ${e.pieSectionTextColor};
|
||||||
|
font-size:${e.pieSectionTextSize};
|
||||||
|
// fill: white;
|
||||||
|
}
|
||||||
|
.legend text {
|
||||||
|
fill: ${e.pieLegendTextColor};
|
||||||
|
font-family: ${e.fontFamily};
|
||||||
|
font-size: ${e.pieLegendTextSize};
|
||||||
|
}
|
||||||
|
`,"getStyles"),Ae=we,De=p(e=>{const a=[...e.values()].reduce((s,o)=>s+o,0),f=[...e.entries()].map(([s,o])=>({label:s,value:o})).filter(s=>s.value/a*100>=1).sort((s,o)=>o.value-s.value);return ue().value(s=>s.value)(f)},"createPieArcs"),Ce=p((e,a,f,y)=>{F.debug(`rendering pie chart
|
||||||
|
`+e);const s=y.db,o=X(),l=Y(s.getConfig(),o.pie),t=40,n=18,c=4,d=450,x=d,h=ee(a),u=h.append("g");u.attr("transform","translate("+x/2+","+d/2+")");const{themeVariables:i}=o;let[v]=te(i.pieOuterStrokeWidth);v??=2;const w=l.textPosition,m=Math.min(x,d)/2-t,C=I().innerRadius(0).outerRadius(m),$=I().innerRadius(m*w).outerRadius(m*w);u.append("circle").attr("cx",0).attr("cy",0).attr("r",m+v/2).attr("class","pieOuterCircle");const g=s.getSections(),A=De(g),D=[i.pie1,i.pie2,i.pie3,i.pie4,i.pie5,i.pie6,i.pie7,i.pie8,i.pie9,i.pie10,i.pie11,i.pie12];let E=0;g.forEach(r=>{E+=r});const R=A.filter(r=>(r.data.value/E*100).toFixed(0)!=="0"),b=le(D);u.selectAll("mySlices").data(R).enter().append("path").attr("d",C).attr("fill",r=>b(r.data.label)).attr("class","pieCircle"),u.selectAll("mySlices").data(R).enter().append("text").text(r=>(r.data.value/E*100).toFixed(0)+"%").attr("transform",r=>"translate("+$.centroid(r)+")").style("text-anchor","middle").attr("class","slice"),u.append("text").text(s.getDiagramTitle()).attr("x",0).attr("y",-400/2).attr("class","pieTitleText");const W=[...g.entries()].map(([r,M])=>({label:r,value:M})),k=u.selectAll(".legend").data(W).enter().append("g").attr("class","legend").attr("transform",(r,M)=>{const P=n+c,V=P*W.length/2,B=12*n,U=M*P-V;return"translate("+B+","+U+")"});k.append("rect").attr("width",n).attr("height",n).style("fill",r=>b(r.label)).style("stroke",r=>b(r.label)),k.append("text").attr("x",n+c).attr("y",n-c).text(r=>s.getShowData()?`${r.label} [${r.value}]`:r.label);const _=Math.max(...k.selectAll("text").nodes().map(r=>r?.getBoundingClientRect().width??0)),O=x+t+n+c+_;h.attr("viewBox",`0 0 ${O} ${d}`),ae(h,d,O,l.useMaxWidth)},"draw"),$e={draw:Ce},We={parser:xe,db:L,renderer:$e,styles:Ae};export{We as diagram};
|
||||||
7
demo/aiui/assets/quadrantDiagram-AYHSOK5B-DbiBWZt1.js
Normal file
64
demo/aiui/assets/requirementDiagram-UZGBJVZJ-nYhyEINi.js
Normal file
10
demo/aiui/assets/sankeyDiagram-TZEHDZUN-COlytg-6.js
Normal file
269
demo/aiui/assets/seedPrompts-CLWaUv28.js
Normal file
@ -0,0 +1,269 @@
|
|||||||
|
const a=[{id:"seed-films",types:["films"],userQuery:"What are the best Christopher Nolan films?",assistantResponse:`Here are Christopher Nolan's finest works:
|
||||||
|
|
||||||
|
[[film_ext:Inception|2010|Christopher Nolan]] — A mind-bending heist through layers of dreams. DiCaprio leads an ensemble cast through architecture-defying action sequences and emotionally resonant storytelling.
|
||||||
|
|
||||||
|
[[film_ext:The Dark Knight|2008|Christopher Nolan]] — Heath Ledger's Joker elevates this beyond superhero fare into genuine crime thriller territory. The interrogation scene alone is worth the watch.
|
||||||
|
|
||||||
|
[[film_ext:Interstellar|2014|Christopher Nolan]] — A father-daughter love story wrapped in hard science fiction. The docking scene and "years of messages" sequence are devastating.
|
||||||
|
|
||||||
|
[[film_ext:Memento|2000|Christopher Nolan]] — The reverse-chronology thriller that put Nolan on the map. Guy Pearce hunts his wife's killer while unable to form new memories.
|
||||||
|
|
||||||
|
[[film_ext:Oppenheimer|2023|Christopher Nolan]] — Cillian Murphy embodies the father of the atomic bomb in Nolan's most dialogue-heavy and politically charged film.
|
||||||
|
|
||||||
|
All feature practical effects, IMAX cinematography, and Hans Zimmer scores (except Memento and Oppenheimer's Göransson score).`,expected:{films:5}},{id:"seed-songs",types:["songs"],userQuery:"Recommend some ambient electronic music for deep work",assistantResponse:`Here are excellent ambient electronic tracks for focused work:
|
||||||
|
|
||||||
|
[[song_ext:Weightless|Marconi Union|2011]] — Scientifically designed to reduce anxiety. The 8-minute track uses sustained harmonies and a gradually slowing tempo (60 BPM down to 50).
|
||||||
|
|
||||||
|
[[song_ext:An Ending (Ascent)|Brian Eno|1983]] — From the Apollo album. Pure synthesizer beauty — ascending chords that feel like floating above Earth. 4 minutes of transcendence.
|
||||||
|
|
||||||
|
[[song_ext:Intro|The xx|2009]] — Minimalist guitar loops over electronic beats. Not strictly ambient, but the repetitive structure aids concentration.
|
||||||
|
|
||||||
|
[[song_ext:Avril 14th|Aphex Twin|2001]] — A rare gentle piano piece from Richard D. James. Delicate and hypnotic — perfect for reading or writing.
|
||||||
|
|
||||||
|
[[song_ext:Music for Airports 1/1|Brian Eno|1978]] — The track that coined "ambient music." Tape loops of piano and voices create an ever-evolving soundscape.
|
||||||
|
|
||||||
|
[[song_ext:Treefingers|Radiohead|2000]] — From Kid A. Processed guitar creating ethereal textures. Works beautifully on loop.`,expected:{songs:10}},{id:"seed-books",types:["books"],userQuery:"Best books on Bitcoin and monetary history",assistantResponse:`Essential reading on Bitcoin and the history of money:
|
||||||
|
|
||||||
|
[[book_ext:The Bitcoin Standard|Saifedean Ammous|2018]] — The foundational text connecting Austrian economics to Bitcoin. Traces money from primitive shells through gold to fiat, making the case for Bitcoin as the hardest money ever created.
|
||||||
|
|
||||||
|
[[book_ext:The Fiat Standard|Saifedean Ammous|2021]] — The sequel examining how fiat currency actually works — debt creation, cantillon effects, and why the system incentivizes time preference distortion.
|
||||||
|
|
||||||
|
[[book_ext:Mastering Bitcoin|Andreas Antonopoulos|2017]] — The technical reference. Covers cryptography, transactions, mining, and the protocol in depth. Essential for developers.
|
||||||
|
|
||||||
|
[[book_ext:The Price of Tomorrow|Jeff Booth|2020]] — Argues that technology is naturally deflationary, but central banks fight this with money printing. Bitcoin aligns with technology's deflationary nature.
|
||||||
|
|
||||||
|
[[book_ext:Broken Money|Lyn Alden|2023]] — A comprehensive monetary history from ancient to modern times, examining why monetary systems break and how Bitcoin fits into the broader evolution of money technology.
|
||||||
|
|
||||||
|
**Reading order:** Start with *The Bitcoin Standard* for philosophy, then *Broken Money* for history, then *Mastering Bitcoin* for technical depth.`,expected:{books:5}},{id:"seed-tv",types:["tvSeries"],userQuery:"Best TV shows of the last decade",assistantResponse:`Outstanding television from the 2010s and 2020s:
|
||||||
|
|
||||||
|
[[tv_ext:Breaking Bad|Vince Gilligan|2008–2013]] — Walter White's transformation from chemistry teacher to drug lord. The gold standard of character-driven TV drama with a flawless final season.
|
||||||
|
|
||||||
|
[[tv_ext:Severance|Dan Erickson|2022–present]] — A workplace thriller where employees surgically separate work and personal memories. Ben Stiller directs a Kafkaesque masterpiece.
|
||||||
|
|
||||||
|
[[tv_ext:Chernobyl|Craig Mazin|2019]] — Five episodes covering the 1986 nuclear disaster. Haunting, meticulously researched, and terrifyingly relevant to institutional failure.
|
||||||
|
|
||||||
|
[[tv_ext:The Bear|Christopher Storer|2022–present]] — A fine-dining chef returns to run his family's Chicago sandwich shop. Captures kitchen intensity with a season 2 that rivals prestige drama.
|
||||||
|
|
||||||
|
[[tv_ext:Better Call Saul|Peter Gould|2015–2022]] — The Breaking Bad prequel that arguably surpasses it. Bob Odenkirk delivers a career-defining performance across 6 seasons.
|
||||||
|
|
||||||
|
[[tv_ext:True Detective|Nic Pizzolatto|2014–present]] — Season 1 with McConaughey and Harrelson is peak television. Philosophical detective fiction in the Louisiana bayou.
|
||||||
|
|
||||||
|
All available on major streaming platforms. Start with whichever genre appeals most — there's no wrong entry point.`,expected:{tvSeries:6}},{id:"seed-places",types:["places"],userQuery:"Best restaurants in Austin Texas",assistantResponse:`Here are Austin's standout restaurants:
|
||||||
|
|
||||||
|
[[place_ext:Franklin Barbecue|BBQ|Austin TX|4.8|2|1900 E 11th St]] — The most famous BBQ in Texas. Expect 3-4 hour lines for brisket that's genuinely worth the wait. Get there by 8am on weekends.
|
||||||
|
|
||||||
|
[[place_ext:Uchi|Japanese|Austin TX|4.7|3|801 S Lamar Blvd]] — Tyson Cole's Japanese farmhouse dining. The tasting menu is exceptional — the maguro sashimi with goat cheese and cracked pepper is iconic Austin dining.
|
||||||
|
|
||||||
|
[[place_ext:Ramen Tatsu-Ya|Ramen|Austin TX|4.6|2|8557 Research Blvd]] — Austin's best ramen. The Underbelly (pork broth, woodear mushroom, nori) has cult status. Cash only, expect a line.
|
||||||
|
|
||||||
|
[[place_ext:Suerte|Mexican|Austin TX|4.5|2|1800 E 6th St]] — Modern Mexican from the Uchi team. Smoked beef suadero tacos and duck carnitas are standouts. Great mezcal program.
|
||||||
|
|
||||||
|
[[place_ext:Odd Duck|American|Austin TX|4.4|2|1201 S Lamar Blvd]] — Farm-to-table small plates in a converted trailer park. The menu changes daily based on what's fresh. Excellent craft cocktails.
|
||||||
|
|
||||||
|
**Pro tip:** Reservations are essential for Uchi and Suerte. Franklin is walk-in only. Visit Odd Duck for late-night bites after 9pm.`,expected:{places:5}},{id:"seed-podcasts",types:["podcasts"],userQuery:"Best Bitcoin and technology podcasts",assistantResponse:`Top podcasts for Bitcoin and tech:
|
||||||
|
|
||||||
|
[[podcast_ext:What Bitcoin Did|Peter McCormack|2018]] — Twice-weekly interviews covering Bitcoin from beginner to advanced. Peter's honest, accessible style makes complex topics approachable. Essential listening.
|
||||||
|
|
||||||
|
[[podcast_ext:Lex Fridman Podcast|Lex Fridman|2018]] — Long-form conversations with scientists, engineers, and thinkers. The Bitcoin episodes with Saylor, Dorsey, and Antonopoulos are must-listens.
|
||||||
|
|
||||||
|
[[podcast_ext:Bitcoin Audible|Guy Swann|2016]] — Guy reads and discusses the best Bitcoin articles and papers. Perfect for commutes — turns written content into audio education.
|
||||||
|
|
||||||
|
[[podcast_ext:TFTC - Tales from the Crypt|Marty Bent|2018]] — No-nonsense Bitcoin podcast. Marty's "Rabbit Hole Recap" Friday episodes are a great weekly Bitcoin news summary.
|
||||||
|
|
||||||
|
[[podcast_ext:Stephan Livera Podcast|Stephan Livera|2018]] — Technical and economic deep dives. Stephan interviews protocol developers, economists, and Lightning Network builders.
|
||||||
|
|
||||||
|
Start with **What Bitcoin Did** for breadth, **Stephan Livera** for depth, and **Lex Fridman** for cross-disciplinary thinking.`,expected:{podcasts:5}},{id:"seed-code",types:["code"],userQuery:"Show me how to implement a debounce function in TypeScript",assistantResponse:`Here's a proper TypeScript debounce with generic types and cancel support:
|
||||||
|
|
||||||
|
\`\`\`typescript
|
||||||
|
function debounce<T extends (...args: any[]) => any>(
|
||||||
|
fn: T,
|
||||||
|
delay: number,
|
||||||
|
): { (...args: Parameters<T>): void; cancel: () => void } {
|
||||||
|
let timer: ReturnType<typeof setTimeout> | null = null
|
||||||
|
|
||||||
|
const debounced = (...args: Parameters<T>) => {
|
||||||
|
if (timer) clearTimeout(timer)
|
||||||
|
timer = setTimeout(() => {
|
||||||
|
fn(...args)
|
||||||
|
timer = null
|
||||||
|
}, delay)
|
||||||
|
}
|
||||||
|
|
||||||
|
debounced.cancel = () => {
|
||||||
|
if (timer) {
|
||||||
|
clearTimeout(timer)
|
||||||
|
timer = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return debounced
|
||||||
|
}
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
Usage example:
|
||||||
|
|
||||||
|
\`\`\`typescript
|
||||||
|
const debouncedSearch = debounce((query: string) => {
|
||||||
|
console.log('Searching for:', query)
|
||||||
|
fetch(\`/api/search?q=\${encodeURIComponent(query)}\`)
|
||||||
|
}, 300)
|
||||||
|
|
||||||
|
// In an input handler:
|
||||||
|
input.addEventListener('input', (e) => {
|
||||||
|
debouncedSearch((e.target as HTMLInputElement).value)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Cleanup:
|
||||||
|
debouncedSearch.cancel()
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
Key design decisions:
|
||||||
|
- **Generic types** preserve the original function's parameter types
|
||||||
|
- **Cancel method** prevents stale calls on component unmount
|
||||||
|
- **ReturnType<typeof setTimeout>** works in both Node and browser
|
||||||
|
- The return type explicitly shows the augmented function signature`,expected:{codeBlocks:2}},{id:"seed-images",types:["images"],userQuery:"Show me some beautiful landscape photography",assistantResponse:`Here are stunning landscape photographs:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The granite towers catching first light create one of Earth's most dramatic mountain scenes.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The iconic arrowhead-shaped mountain with northern lights dancing above.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Crimson maples frame the famous wooden stage during peak koyo season.
|
||||||
|
|
||||||
|
These represent three different approaches to landscape photography: dramatic alpine, astrophotography, and cultural landscape. Each uses natural light and careful composition to tell a story about place.`,expected:{images:3}},{id:"seed-mixed-films-songs",types:["films","songs"],userQuery:"What are the best movie soundtracks?",assistantResponse:`Great question — here are films with legendary soundtracks:
|
||||||
|
|
||||||
|
[[film_ext:Drive|2011|Nicolas Winding Refn]] — The synthwave soundtrack defined a genre. Cliff Martinez's score plus curated tracks create an unforgettable atmosphere.
|
||||||
|
|
||||||
|
Key tracks:
|
||||||
|
[[song_ext:Nightcall|Kavinsky|2010]] — The opening drive through LA at night. Pure 80s-inspired synth perfection.
|
||||||
|
[[song_ext:A Real Hero|College & Electric Youth|2010]] — The emotional core of the film. Dreamy, melancholic electronica.
|
||||||
|
|
||||||
|
[[film_ext:Blade Runner 2049|2017|Denis Villeneuve]] — Hans Zimmer and Benjamin Wallfisch created a soundscape that honors Vangelis while pushing into new territory.
|
||||||
|
|
||||||
|
[[film_ext:Interstellar|2014|Christopher Nolan]] — Zimmer's organ-driven score is overwhelming in IMAX. "No Time for Caution" during the docking scene is peak cinema.
|
||||||
|
|
||||||
|
[[song_ext:Time|Hans Zimmer|2010]] — From Inception. The building layers of strings and brass have become the template for modern trailer music.
|
||||||
|
|
||||||
|
[[song_ext:Where Is My Mind?|Pixies|1988]] — The Fight Club ending. Sometimes the perfect needle drop is worth more than any original score.
|
||||||
|
|
||||||
|
The best soundtracks don't just accompany the film — they become inseparable from the experience.`,expected:{films:3,songs:2}},{id:"seed-mixed-books-podcasts",types:["books","podcasts"],userQuery:"I want to learn about Austrian economics, what should I read and listen to?",assistantResponse:`Here's a complete Austrian economics learning path:
|
||||||
|
|
||||||
|
## Essential Reading
|
||||||
|
|
||||||
|
[[book_ext:Economics in One Lesson|Henry Hazlitt|1946]] — The best starting point. Hazlitt distills Bastiat's "seen and unseen" into a masterclass on economic thinking. Short, clear, devastating to interventionist arguments.
|
||||||
|
|
||||||
|
[[book_ext:Human Action|Ludwig von Mises|1949]] — The magnum opus of Austrian economics. Dense but comprehensive — covers praxeology, money, banking, and the business cycle. Read after Hazlitt.
|
||||||
|
|
||||||
|
[[book_ext:The Road to Serfdom|Friedrich Hayek|1944]] — Hayek's warning about central planning. Written during WWII, prophetic about the dangers of collectivism. Surprisingly readable.
|
||||||
|
|
||||||
|
[[book_ext:Man, Economy, and State|Murray Rothbard|1962]] — Rothbard's systematic treatise building from first principles. More accessible than Mises, more rigorous than Hazlitt.
|
||||||
|
|
||||||
|
## Podcasts for Ongoing Learning
|
||||||
|
|
||||||
|
[[podcast_ext:The Tom Woods Show|Tom Woods|2013]] — Daily episodes on economics, liberty, and history. Woods makes Austrian concepts accessible with humor and clarity.
|
||||||
|
|
||||||
|
[[podcast_ext:Human Action Podcast|Jeff Deist|2018]] — Chapter-by-chapter walkthrough of Mises' Human Action. Perfect companion to the book.
|
||||||
|
|
||||||
|
[[podcast_ext:EconTalk|Russ Roberts|2006]] — Not strictly Austrian, but Roberts' classical liberal perspective and interview style make this essential economics listening.
|
||||||
|
|
||||||
|
**Path:** Hazlitt → Tom Woods podcast → Road to Serfdom → Human Action book + podcast → Rothbard for depth.`,expected:{books:4,podcasts:3}},{id:"seed-magazine",types:["magazine"],userQuery:"What's happening in the Bitcoin ecosystem this week?",assistantResponse:`## Bitcoin Weekly Roundup
|
||||||
|
|
||||||
|
### Lightning Network Milestone
|
||||||
|
The Lightning Network reached 6,000 BTC in public capacity this week, a new all-time high. Channel count grew 12% month-over-month, with major growth in developing markets.
|
||||||
|
|
||||||
|
**amboss.space** — Track Lightning network statistics and node rankings.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Ordinals Debate Heats Up
|
||||||
|
Bitcoin Core developers are split on whether to filter Ordinals inscriptions at the mempool level. Luke Dashjr's patch was rejected, but the debate continues about block space allocation.
|
||||||
|
|
||||||
|
**delvingbitcoin.org** — Developer discussion forum where the technical arguments play out.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Regulatory Update: EU MiCA
|
||||||
|
The EU's Markets in Crypto-Assets regulation takes effect next month. Self-custody remains legal, but exchanges face new reporting requirements. Most Bitcoin-only companies are prepared.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Mining Difficulty Adjustment
|
||||||
|
Difficulty increased 4.7% — the third consecutive positive adjustment. Hash rate continues climbing post-halving as miners optimize operations.
|
||||||
|
|
||||||
|
**mempool.space** — Real-time mempool and mining statistics.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Sources: Bitcoin Magazine, Nostr, Lightning Labs blog*`,expected:{magazineSections:4}},{id:"seed-recipes",types:["recipes"],userQuery:"How do I make a proper Italian carbonara?",assistantResponse:`Here's an authentic Roman carbonara — no cream, no shortcuts:
|
||||||
|
|
||||||
|
<recipe_ext title="Spaghetti alla Carbonara" servings="4" time="25 min" calories="550">
|
||||||
|
- 400g spaghetti or rigatoni
|
||||||
|
- 200g guanciale (cured pork cheek), cut into strips
|
||||||
|
- 4 large egg yolks + 2 whole eggs
|
||||||
|
- 100g Pecorino Romano, finely grated
|
||||||
|
- Freshly ground black pepper
|
||||||
|
1. Bring a large pot of well-salted water to boil. Cook pasta 1 minute short of al dente.
|
||||||
|
2. Cut guanciale into 1cm strips. Cook in a cold dry pan over medium heat until fat renders and edges crisp (8-10 min). Remove from heat.
|
||||||
|
3. Whisk egg yolks, whole eggs, and most of the Pecorino together. Season generously with black pepper.
|
||||||
|
4. When pasta is ready, reserve 200ml pasta water. Drain and add pasta to the guanciale pan (off heat).
|
||||||
|
5. Wait 30 seconds for the pan to cool slightly, then pour the egg mixture over the pasta. Toss vigorously — the residual heat cooks the eggs into a creamy sauce. Add pasta water a splash at a time if needed.
|
||||||
|
6. Serve immediately with remaining Pecorino and more black pepper.
|
||||||
|
</recipe_ext>
|
||||||
|
|
||||||
|
**Keys to success:**
|
||||||
|
- Guanciale, not pancetta or bacon — the flavor is completely different
|
||||||
|
- Pan OFF heat before adding eggs — scrambled eggs ≠ carbonara
|
||||||
|
- Pecorino Romano, not Parmesan — sharper, saltier, authentic
|
||||||
|
- Save that pasta water — it's liquid gold for emulsifying the sauce`,expected:{recipes:1}},{id:"seed-events",types:["events"],userQuery:"What Bitcoin conferences are coming up?",assistantResponse:`Here are the major upcoming Bitcoin events:
|
||||||
|
|
||||||
|
<event_ext title="Bitcoin 2026" date="2026-07-25" location="Nashville, TN" url="https://b.tc/conference">
|
||||||
|
The largest annual Bitcoin conference. 35,000+ attendees, major announcements, and networking. Past speakers include Saylor, Dorsey, and Bukele.
|
||||||
|
</event_ext>
|
||||||
|
|
||||||
|
<event_ext title="Baltic Honeybadger" date="2026-09-05" location="Riga, Latvia" url="https://baltichoneybadger.com">
|
||||||
|
The OG Bitcoin-only conference. Technical focus, cypherpunk ethos, and intimate atmosphere. 1,000 attendees who actually build things.
|
||||||
|
</event_ext>
|
||||||
|
|
||||||
|
<event_ext title="Adopting Bitcoin" date="2026-11-15" location="San Salvador, El Salvador" url="https://adoptingbitcoin.org">
|
||||||
|
Focused on real-world Bitcoin adoption. Lightning Network workshops, merchant onboarding, and stories from the ground in El Salvador.
|
||||||
|
</event_ext>
|
||||||
|
|
||||||
|
<event_ext title="TABConf" date="2026-10-10" location="Atlanta, GA" url="https://tabconf.com">
|
||||||
|
Developer-focused unconference. Hands-on workshops for building on Bitcoin and Lightning. Small, technical, high signal.
|
||||||
|
</event_ext>
|
||||||
|
|
||||||
|
**Tip:** Baltic Honeybadger sells out fast. TABConf is the best value for developers. Bitcoin 2026 is the big tent event.`,expected:{events:4}},{id:"seed-mixed-tv-places",types:["tvSeries","places"],userQuery:"Best food shows and where to eat what they feature",assistantResponse:`Food TV worth watching, with real-world destinations:
|
||||||
|
|
||||||
|
[[tv_ext:The Bear|Christopher Storer|2022–present]] — Set in a Chicago Italian beef shop. The kitchen chaos is real — watch it for the cooking AND the anxiety.
|
||||||
|
|
||||||
|
Eat the real thing at:
|
||||||
|
[[place_ext:Mr. Beef|Italian Beef|Chicago IL|4.2|1|666 N Orleans St]] — The actual shop that inspired The Bear. Cash only. Get the Italian beef dipped with hot giardiniera.
|
||||||
|
|
||||||
|
[[tv_ext:Chef's Table|David Gelb|2015–present]] — Netflix's cinematic exploration of the world's best chefs. Each episode is a visual feast.
|
||||||
|
|
||||||
|
Featured restaurant still taking reservations:
|
||||||
|
[[place_ext:Gaggan Anand|Indian|Bangkok|4.9|4|68/1 Soi Langsuan]] — The molecular Indian cuisine from Chef's Table Season 2. 25-course tasting menu.
|
||||||
|
|
||||||
|
[[tv_ext:Anthony Bourdain: Parts Unknown|Zero Point Zero|2013–2018]] — Bourdain's masterpiece. Food, culture, and humanity. The Japan and Iran episodes are peak television.
|
||||||
|
|
||||||
|
Bourdain's favorite:
|
||||||
|
[[place_ext:Bún Bò Huế Bà Phượng|Vietnamese|Huế Vietnam|4.5|1|Huế City]] — The noodle soup spot from the Vietnam episode. Simple, perfect, $2 a bowl.`,expected:{tvSeries:3,places:3}},{id:"seed-strip-tags",types:["films","songs","books","tvSeries","places","podcasts"],userQuery:"Give me your top pick in every category",assistantResponse:`Here's one masterpiece per category:
|
||||||
|
|
||||||
|
**Film:** [[film_ext:There Will Be Blood|2007|Paul Thomas Anderson]] — Daniel Day-Lewis as an oil prospector consumed by greed. The milkshake scene. The bowling alley. Perfect.
|
||||||
|
|
||||||
|
**Song:** [[song_ext:Bohemian Rhapsody|Queen|1975]] — Six minutes that redefined what a pop single could be. Opera section? Guitar solo? Headbanging? Yes to all.
|
||||||
|
|
||||||
|
**Book:** [[book_ext:Blood Meridian|Cormac McCarthy|1985]] — The darkest, most beautiful novel in American literature. The Judge is literature's greatest villain.
|
||||||
|
|
||||||
|
**TV Show:** [[tv_ext:The Wire|David Simon|2002–2008]] — Every institution fails. Every character is compromised. Baltimore becomes a lens for all of America.
|
||||||
|
|
||||||
|
**Restaurant:** [[place_ext:Jiro Sushi|Sushi|Tokyo|4.9|4|Ginza]] — 20 pieces of sushi. No menu. The greatest craftsman alive serves fish that transcends food.
|
||||||
|
|
||||||
|
**Podcast:** [[podcast_ext:Hardcore History|Dan Carlin|2006]] — Multi-hour epics on history's most dramatic moments. "Blueprint for Armageddon" (WWI) is the greatest podcast ever made.
|
||||||
|
|
||||||
|
One of each is all you need to start.`,expected:{films:1,songs:1,books:1,tvSeries:1,places:1,podcasts:1}}];function i(){const n=[];for(let e=0;e<a.length;e++){const t=a[e],s=17724888e5+e*6e4;n.push({id:`${t.id}-q`,role:"user",content:t.userQuery,timestamp:s},{id:`${t.id}-a`,role:"assistant",content:t.assistantResponse,timestamp:s+3e3})}return{id:"seed-all",title:"Content Showcase",messages:n,createdAt:17724888e5,updatedAt:17724888e5+a.length*6e4}}export{a as seedPrompts,i as seedPromptsToConversation};
|
||||||
145
demo/aiui/assets/sequenceDiagram-WL72ISMW-CeHENbHj.js
Normal file
2
demo/aiui/assets/song-renderer-DaD61hR1.js
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SongGrid-BPm5eVyu.js","assets/SongGrid.vue_vue_type_script_setup_true_lang-Bx4BvItY.js","assets/index-CqBtvLD5.js","assets/index-D1RpahE8.css","assets/useContentImages-CXWJDBMs.js","assets/SongDetail-DOTXy0Qj.js","assets/SongDetail.vue_vue_type_script_setup_true_lang-D619ywdc.js"])))=>i.map(i=>d[i]);
|
||||||
|
import{d as e,_ as r}from"./index-CqBtvLD5.js";const o={id:"song",name:"Song Renderer",contentType:"song",surfaces:["chat-preview","panel-preview","panel-play"],chatPreview:e(()=>r(()=>import("./SongGrid-BPm5eVyu.js"),__vite__mapDeps([0,1,2,3,4]))),panelPreview:e(()=>r(()=>import("./SongGrid-BPm5eVyu.js"),__vite__mapDeps([0,1,2,3,4]))),panelPlay:e(()=>r(()=>import("./SongDetail-DOTXy0Qj.js"),__vite__mapDeps([5,6,2,3])))};export{o as songRenderer};
|
||||||
1
demo/aiui/assets/stateDiagram-FKZM4ZOC-vcoyXa4O.js
Normal file
1
demo/aiui/assets/stateDiagram-v2-4FDKWEC3-xcVkWlJf.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{s as e,b as r,a,S as s}from"./chunk-DI55MBZ5-Cjkj4Ju9.js";import{_ as i}from"./mermaid.core-CAd6zjbx.js";import"./chunk-55IACEB6-wvCzuWU8.js";import"./chunk-QN33PNHL-DwbD-drI.js";import"./index-CqBtvLD5.js";var p={parser:a,get db(){return new s(2)},renderer:r,styles:e,init:i(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")};export{p as diagram};
|
||||||
61
demo/aiui/assets/timeline-definition-IT6M3QCI-D9ukNp00.js
Normal file
162
demo/aiui/assets/treemap-GDKQZRPO-BEECIbaX.js
Normal file
1
demo/aiui/assets/useContentImages-CXWJDBMs.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{A as v,r as g,B as w,C as I}from"./index-CqBtvLD5.js";function k(t){const a=g(new Set),r=w(new Map);function i(e){a.value=new Set([...a.value,e])}function f(e){const n=t.id(e);return a.value.has(n)?null:t.existingUrl(e)||r.get(n)||null}function l(e){return t.fallback(e)}function d(e){i(t.id(e))}function o(e){const n=t.id(e);return!f(e)&&!a.value.has(n)}function h(e){for(const n of e){const c=t.id(n);t.existingUrl(n)||r.has(c)||a.value.has(c)||t.fetch(n).then(s=>{s?r.set(c,s):i(c)}).catch(()=>{i(c)})}}const u=t.items,m=I(u)?()=>u.value:u;return v(m,e=>h(e),{immediate:!0}),{coverSrc:f,fallbackSrc:l,onError:d,isLoading:o}}export{k as u};
|
||||||
1
demo/aiui/assets/useNostr-CZatyrb1.js
Normal file
1
demo/aiui/assets/wikipedia-BNDKhpH7.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
const e={id:"wikipedia",name:"Wikipedia",version:"1.0.0",type:"search",description:"Search Wikipedia articles with /wiki command",async init(i){},async destroy(){},async isAvailable(){return!0}};export{e as wikipediaPlugin};
|
||||||
7
demo/aiui/assets/xychartDiagram-PRI3JC2R-B1UyzSBJ.js
Normal file
4
demo/aiui/favicon.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
|
||||||
|
<rect width="32" height="32" rx="6" fill="#111111"/>
|
||||||
|
<path d="M 16,5.5 Q 16,16 26.5,16 Q 16,16 16,26.5 Q 16,16 5.5,16 Q 16,16 16,5.5 Z" fill="#fafafa"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 225 B |
16
demo/aiui/icon.svg
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="bg" x1="0" y1="0" x2="512" y2="512" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0%" stop-color="#1a1a1a"/>
|
||||||
|
<stop offset="100%" stop-color="#0a0a0a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="border" x1="0" y1="0" x2="0" y2="512" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0%" stop-color="rgba(255,255,255,0.18)"/>
|
||||||
|
<stop offset="100%" stop-color="rgba(255,255,255,0.04)"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<rect width="512" height="512" rx="108" fill="url(#bg)"/>
|
||||||
|
<rect x="2" y="2" width="508" height="508" rx="106" fill="none" stroke="url(#border)" stroke-width="2"/>
|
||||||
|
<circle cx="256" cy="256" r="120" fill="none" stroke="rgba(255,255,255,0.08)" stroke-width="2.5"/>
|
||||||
|
<path d="M 256,106 Q 256,256 406,256 Q 256,256 256,406 Q 256,256 106,256 Q 256,256 256,106 Z" fill="#fafafa"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 922 B |
24
demo/aiui/images/loading-poster.svg
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<svg width="200" height="300" viewBox="0 0 200 300" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip-poster">
|
||||||
|
<rect width="200" height="300" rx="12" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
<g clip-path="url(#clip-poster)">
|
||||||
|
<rect width="200" height="300" fill="currentColor" fill-opacity="0.15"/>
|
||||||
|
<g fill="currentColor" fill-opacity="0.2">
|
||||||
|
<rect x="8" y="12" width="16" height="24" rx="2"/>
|
||||||
|
<rect x="40" y="12" width="16" height="24" rx="2"/>
|
||||||
|
<rect x="72" y="12" width="16" height="24" rx="2"/>
|
||||||
|
<rect x="104" y="12" width="16" height="24" rx="2"/>
|
||||||
|
<rect x="136" y="12" width="16" height="24" rx="2"/>
|
||||||
|
<rect x="168" y="12" width="16" height="24" rx="2"/>
|
||||||
|
<rect x="8" y="48" width="16" height="24" rx="2"/>
|
||||||
|
<rect x="40" y="48" width="16" height="24" rx="2"/>
|
||||||
|
<rect x="72" y="48" width="16" height="24" rx="2"/>
|
||||||
|
<rect x="104" y="48" width="16" height="24" rx="2"/>
|
||||||
|
<rect x="136" y="48" width="16" height="24" rx="2"/>
|
||||||
|
<rect x="168" y="48" width="16" height="24" rx="2"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
23
demo/aiui/index.html
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en" class="h-full overflow-hidden">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
|
||||||
|
<meta name="theme-color" content="#0a0a0a" media="(prefers-color-scheme: dark)" />
|
||||||
|
<meta name="theme-color" content="#faf9f6" media="(prefers-color-scheme: light)" />
|
||||||
|
<meta name="mobile-web-app-capable" content="yes" />
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||||
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||||
|
<meta name="apple-mobile-web-app-title" content="AIUI" />
|
||||||
|
<meta name="description" content="AI chat interface with rich content surfaces" />
|
||||||
|
<!-- CSP set via HTTP headers in production nginx — not in HTML meta to avoid breaking Vite HMR -->
|
||||||
|
<link rel="icon" href="/aiui/favicon.svg" type="image/svg+xml" />
|
||||||
|
<link rel="apple-touch-icon" href="/aiui/apple-touch-icon-180x180.png" />
|
||||||
|
<title>AIUI</title>
|
||||||
|
<script type="module" crossorigin src="/aiui/assets/index-CqBtvLD5.js"></script>
|
||||||
|
<link rel="stylesheet" crossorigin href="/aiui/assets/index-D1RpahE8.css">
|
||||||
|
<link rel="manifest" href="/aiui/manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="/aiui/registerSW.js"></script></head>
|
||||||
|
<body class="antialiased h-full overflow-hidden fixed w-full">
|
||||||
|
<div id="app"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
1
demo/aiui/manifest.webmanifest
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"name":"AIUI","short_name":"AIUI","description":"AI chat interface with rich content surfaces","start_url":"./","display":"standalone","background_color":"#0a0a0a","theme_color":"#0a0a0a","lang":"en","scope":"./","id":"./","display_override":["standalone","minimal-ui"],"orientation":"any","icons":[{"src":"pwa-192x192.png","sizes":"192x192","type":"image/png","purpose":"any"},{"src":"pwa-512x512.png","sizes":"512x512","type":"image/png","purpose":"any"},{"src":"pwa-512x512.png","sizes":"512x512","type":"image/png","purpose":"maskable"}]}
|
||||||
BIN
demo/aiui/pwa-192x192.png
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
BIN
demo/aiui/pwa-512x512.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
1
demo/aiui/registerSW.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
if('serviceWorker' in navigator) {window.addEventListener('load', () => {navigator.serviceWorker.register('/aiui/sw.js', { scope: '/aiui/' })})}
|
||||||
1
demo/aiui/sw.js
Normal file
1
demo/aiui/workbox-3c177d20.js
Normal file
@ -1,6 +1,10 @@
|
|||||||
# Archipelago Demo Stack - Mock backend + Vue UI
|
# Archipelago Demo Stack - Mock backend + Vue UI + AIUI Chat
|
||||||
# Deploy via Portainer: Web editor → paste this, or deploy from repo
|
# Deploy via Portainer: Web editor -> paste this, or deploy from repo
|
||||||
# Access at http://localhost:4848 (or your host:4848)
|
# Access at http://localhost:4848 (or your host:4848)
|
||||||
|
#
|
||||||
|
# Required: Set ANTHROPIC_API_KEY for AI chat to work
|
||||||
|
# In Portainer: Add as environment variable when deploying
|
||||||
|
# Locally: ANTHROPIC_API_KEY=sk-ant-... docker compose -f docker-compose.demo.yml up --build
|
||||||
|
|
||||||
services:
|
services:
|
||||||
neode-backend:
|
neode-backend:
|
||||||
@ -21,6 +25,8 @@ services:
|
|||||||
container_name: archy-demo-web
|
container_name: archy-demo-web
|
||||||
ports:
|
ports:
|
||||||
- "4848:80"
|
- "4848:80"
|
||||||
|
environment:
|
||||||
|
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
|
||||||
depends_on:
|
depends_on:
|
||||||
- neode-backend
|
- neode-backend
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|||||||
@ -29,12 +29,16 @@ FROM nginx:alpine
|
|||||||
# Copy built files to nginx
|
# Copy built files to nginx
|
||||||
COPY --from=builder /app/dist /usr/share/nginx/html
|
COPY --from=builder /app/dist /usr/share/nginx/html
|
||||||
|
|
||||||
# Copy nginx configuration
|
# Copy AIUI pre-built dist
|
||||||
COPY neode-ui/docker/nginx.conf /etc/nginx/nginx.conf
|
COPY demo/aiui/ /usr/share/nginx/html/aiui/
|
||||||
|
|
||||||
|
# Copy nginx config template and entrypoint
|
||||||
|
COPY neode-ui/docker/nginx-demo.conf /etc/nginx/nginx.conf.template
|
||||||
|
COPY neode-ui/docker/docker-entrypoint.sh /docker-entrypoint-custom.sh
|
||||||
|
RUN chmod +x /docker-entrypoint-custom.sh
|
||||||
|
|
||||||
# Expose port
|
# Expose port
|
||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
|
|
||||||
# Start nginx
|
# Substitute ANTHROPIC_API_KEY at runtime, then start nginx
|
||||||
CMD ["nginx", "-g", "daemon off;"]
|
ENTRYPOINT ["/docker-entrypoint-custom.sh"]
|
||||||
|
|
||||||
|
|||||||
4
neode-ui/docker/docker-entrypoint.sh
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Substitute only ANTHROPIC_API_KEY in nginx config, leave nginx variables untouched
|
||||||
|
envsubst '${ANTHROPIC_API_KEY}' < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf
|
||||||
|
exec nginx -g 'daemon off;'
|
||||||