herm-tui 1.9.0-dev.10 → 1.9.0-dev.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -93,12 +93,13 @@ See [`.env.example`](./.env.example) for rarely-needed overrides.
93
93
 
94
94
  ### Share and install eikons
95
95
 
96
- - Press `M` from Gallery to enter the native Eikon Marketplace.
97
- - Search shared catalog entries, preview the selected eikon, install without
98
- activating, then use it when ready.
99
- - Use `eikon.liftaris.dev` as a discovery mirror only; it previews catalog
100
- entries and points back to Herm for native install/use.
101
- - Submit local non-bundled eikons with `u`; Herm shows the exact
96
+ - Open Eikon Marketplace, or run `/marketplace`, to browse shared catalog
97
+ entries.
98
+ - Preview the selected eikon, install without activating, then use it when
99
+ ready.
100
+ - Use `eikon.liftaris.dev` as a discovery gallery only; it previews catalog
101
+ entries and gives copyable Herm install instructions.
102
+ - Submit local non-bundled eikons from Studio with `u`; Herm shows the exact
102
103
  preflight bundle before submission and blocks published marketplace installs
103
104
  from duplicate submission.
104
105
 
@@ -17,8 +17,8 @@ You do **not** write `.eikon` or `studio.json`. Studio does.
17
17
 
18
18
  ## Where the user does the work
19
19
 
20
- Herm's built-in **Eikon** tab (Studio / Gallery). Tell the user: "open
21
- the Eikon tab" or "Ctrl+K → Eikon". In Studio:
20
+ Herm's built-in **Eikon** tab (Gallery / Studio / Marketplace). Tell the user:
21
+ "open the Eikon tab" or "Ctrl+K → Eikon". In Studio:
22
22
 
23
23
  - `eikon` row → pick / New…
24
24
  - `source` row → Local file… / Generate image… / Generate video…
@@ -40,6 +40,7 @@ everything.
40
40
  | "make me an eikon of X" | Load `eikon-create` and follow it. |
41
41
  | drops an image path | `cp` it to `~/.hermes/eikons/<name>/source/base.<ext>` → "Eikon tab, pick <name>". |
42
42
  | "edit my <name> eikon" | "Eikon tab → `eikon` row → <name>." |
43
+ | "install/shared marketplace eikon" | "Eikon tab → Marketplace", or `/marketplace`. |
43
44
  | "too dark / washed out" | "invert toggle, then contrast slider — under `input`." |
44
45
  | "off-center / too small" | "Ctrl+wheel to zoom, wheel/drag to pan on the preview." |
45
46
  | "make it move" | `eikon-create` §5 (video), or Studio's `source` → Generate video…. |
package/index.js CHANGED
@@ -3668,7 +3668,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let r="<p>An error
3668
3668
  `);buf=parts.pop()||"";for(let line of parts)if(line)cb(line)}if(buf.trim())cb(buf)}catch{}}class GatewayClient extends EventEmitter10{proc=null;id=0;logs=[];pending=new Map;buf=[];exit;ok=!1;timer=null;sub=!1;root(){return hermesAgentRoot()}push(ev){if(ev.type==="gateway.ready"){if(this.ok=!0,this.timer)clearTimeout(this.timer),this.timer=null}if(this.sub)return void this.emit("event",ev);this.buf.push(ev)}log(line){if(this.logs.push(line)>LOG_MAX)this.logs.splice(0,this.logs.length-LOG_MAX)}dispatch(msg){let id=msg.id,p=id?this.pending.get(id):void 0;if(p){if(this.pending.delete(id),msg.error){let err=msg.error;p.reject(Error(typeof err?.message==="string"?err.message:"request failed"))}else p.resolve(msg.result);return}if(msg.method==="event"){let ev=asEvent(msg.params);if(ev)this.push(ev)}}fail(err){for(let p of this.pending.values())p.reject(err);this.pending.clear()}start(){let root=this.root(),bin=python(root),cwd=process.env.HERMES_CWD||process.cwd(),env2={...process.env};if(!env2.TERMINAL_CWD)env2.TERMINAL_CWD=cwd;let pp=env2.PYTHONPATH?.trim();if(env2.PYTHONPATH=pp?`${root}${delimiter}${pp}`:root,this.ok=!1,this.buf=[],this.exit=void 0,this.proc)try{this.proc.kill()}catch{}if(this.timer)clearTimeout(this.timer);this.timer=setTimeout(()=>{if(this.ok)return;this.log(`[startup] timed out (python=${bin}, cwd=${cwd})`),this.push({type:"gateway.start_timeout",payload:{cwd,python:bin}})},STARTUP_MS);let proc=Bun.spawn([bin,"-u","-m","tui_gateway.entry"],{cwd,env:env2,stdin:"pipe",stdout:"pipe",stderr:"pipe"});if(this.proc=proc,this.proc.stdout)lines(this.proc.stdout,(raw)=>{try{this.dispatch(JSON.parse(raw))}catch{let preview=raw.trim().slice(0,LOG_PREVIEW)||"(empty)";this.log(`[protocol] malformed: ${preview}`),this.push({type:"gateway.protocol_error",payload:{preview}})}});if(this.proc.stderr)lines(this.proc.stderr,(raw)=>{let line=raw.trim();if(!line)return;this.log(line),this.push({type:"gateway.stderr",payload:{line}})});proc.exited.then((code)=>{if(this.proc!==proc)return;if(this.timer)clearTimeout(this.timer),this.timer=null;if(this.fail(Error(`gateway exited${code===null?"":` (${code})`}`)),this.sub)this.emit("exit",code);else this.exit=code})}drain(){if(this.sub)return;this.sub=!0;for(let ev of this.buf.splice(0))this.emit("event",ev);if(this.exit!==void 0){let code=this.exit;this.exit=void 0,this.emit("exit",code)}}tail(n=20){return this.logs.slice(-Math.max(1,n)).join(`
3669
3669
  `)}sid="";setSession(sid){this.sid=sid}request(method,params={}){if(!this.proc||this.proc.exitCode!==null)this.start();let stdin=this.proc?.stdin;if(!stdin||typeof stdin==="number")return Promise.reject(Error("gateway not running"));let rid=`r${++this.id}`,writer=stdin,merged=this.sid&&params.session_id===void 0?{session_id:this.sid,...params}:params;return new Promise((resolve4,reject)=>{let timeout=setTimeout(()=>{if(this.pending.delete(rid))reject(Error(`timeout: ${method}`))},REQUEST_MS);this.pending.set(rid,{reject:(e)=>{clearTimeout(timeout),reject(e)},resolve:(v2)=>{clearTimeout(timeout),resolve4(v2)}});try{writer.write(JSON.stringify({jsonrpc:"2.0",id:rid,method,params:merged})+`
3670
3670
  `)}catch(e){clearTimeout(timeout),this.pending.delete(rid),reject(e instanceof Error?e:Error(String(e)))}})}kill(){this.proc?.kill()}get ready(){return this.ok}}var Gw=import_react13.createContext(null),GatewayProvider=({client,children})=>{let ref=import_react13.useRef(null);if(!ref.current)ref.current=client??new GatewayClient;let[ready,setReady]=import_react13.useState(ref.current.ready);import_react13.useEffect(()=>{let c=ref.current,onEvent=(ev)=>{if(ev.type==="gateway.ready"||ev.type==="session.info")setReady(!0)};return c.on("event",onEvent),c.start(),c.drain(),()=>{c.off("event",onEvent),c.removeAllListeners(),c.kill()}},[]);let restart=import_react13.useCallback(()=>{setReady(!1),ref.current.start()},[]),value=import_react13.useMemo(()=>({client:ref.current,ready,restart}),[ready,restart]);return $jsx(Gw.Provider,{value,children})};function useGateway(){let ctx=import_react13.useContext(Gw);if(!ctx)throw Error("useGateway() must be inside <GatewayProvider>");return ctx.client}function useGatewayEvent(handler){let ctx=import_react13.useContext(Gw);if(!ctx)throw Error("useGatewayEvent() must be inside <GatewayProvider>");let ref=import_react13.useRef(handler);ref.current=handler,import_react13.useEffect(()=>{let c=ctx.client,fn=(ev)=>ref.current(ev);return c.on("event",fn),c.drain(),()=>{c.off("event",fn)}},[ctx.client])}function useGatewayReady(){let ctx=import_react13.useContext(Gw);if(!ctx)throw Error("useGatewayReady() must be inside <GatewayProvider>");return ctx.ready}function useGatewayRestart(){let ctx=import_react13.useContext(Gw);if(!ctx)throw Error("useGatewayRestart() must be inside <GatewayProvider>");return ctx.restart}function text(msg){return msg.parts.filter((p)=>p.type==="text").map((p)=>p.content).join("")}function mid(){return`msg-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var pn=0;function pid(){return`p${++pn}`}var import_react21=__toESM(require_react_production(),1);var import_react20=__toESM(require_react_production(),1);var import_react18=__toESM(require_react_production(),1);var import_react16=__toESM(require_react_production(),1);var import_react14=__toESM(require_react_production(),1);function makeUse(ctx,name){return()=>{let v2=import_react14.useContext(ctx);if(v2===null)throw Error(`${name}() must be used inside its provider`);return v2}}function resolveTheme(theme,mode){let defs=theme.defs??{};function resolve4(c,chain=[]){if(c instanceof RGBA)return c;if(typeof c==="string"){if(c==="transparent"||c==="none")return RGBA.fromInts(0,0,0,0);if(c.startsWith("#"))return RGBA.fromHex(c);if(chain.includes(c))throw Error(`Circular color reference: ${[...chain,c].join(" -> ")}`);let next=defs[c]??theme.theme[c];if(next===void 0)throw Error(`Color reference "${c}" not found in defs or theme`);return resolve4(next,[...chain,c])}if(typeof c==="number")return ansiToRgba(c);return resolve4(c[mode],chain)}let resolved=Object.fromEntries(Object.entries(theme.theme).filter(([key])=>key!=="selectedListItemText"&&key!=="backgroundMenu"&&key!=="thinkingOpacity").map(([key,value])=>[key,resolve4(value)])),hasList=theme.theme.selectedListItemText!==void 0;resolved.selectedListItemText=hasList?resolve4(theme.theme.selectedListItemText):resolved.background,resolved.backgroundMenu=theme.theme.backgroundMenu!==void 0?resolve4(theme.theme.backgroundMenu):resolved.backgroundElement;let base={...resolved,_hasSelectedListItemText:hasList,thinkingOpacity:theme.theme.thinkingOpacity??0.6},herm=resolveHermTokens(resolved.accent);return{...base,...herm}}function resolveHermTokens(accent){return{hermAvatar:accent}}function ansiToRgba(code){if(code<16){let colors=["#000000","#800000","#008000","#808000","#000080","#800080","#008080","#c0c0c0","#808080","#ff0000","#00ff00","#ffff00","#0000ff","#ff00ff","#00ffff","#ffffff"];return RGBA.fromHex(colors[code]??"#000000")}if(code<232){let idx=code-16,val=(x2)=>x2===0?0:x2*40+55;return RGBA.fromInts(val(Math.floor(idx/36)),val(Math.floor(idx/6)%6),val(idx%6))}if(code<256){let gray=(code-232)*10+8;return RGBA.fromInts(gray,gray,gray)}return RGBA.fromInts(0,0,0)}var PREVIEW={ares:{primary:"#C7A96B",accent:"#DD4A3A",background:"#2A1212"},aura:{primary:"#a277ff",accent:"#a277ff",background:"#0f0f0f"},ayu:{primary:"#59C2FF",accent:"#E6B450",background:"#0B0E14"},carbonfox:{primary:"#33b1ff",accent:"#ff7eb6",background:"#161616"},"catppuccin-frappe":{primary:"#8da4e2",accent:"#f4b8e4",background:"#303446"},"catppuccin-macchiato":{primary:"#8aadf4",accent:"#f5bde6",background:"#24273a"},catppuccin:{primary:"#89b4fa",accent:"#f5c2e7",background:"#1e1e2e"},charizard:{primary:"#FFD39A",accent:"#F29C38",background:"#2B160E"},cobalt2:{primary:"#0088ff",accent:"#2affdf",background:"#193549"},cursor:{primary:"#88c0d0",accent:"#88c0d0",background:"#181818"},daylight:{primary:"#233662",accent:"#597FE9",background:"#101014"},default:{primary:"#FFD700",accent:"#FFBF00",background:"#1a1a2e"},dracula:{primary:"#bd93f9",accent:"#8be9fd",background:"#282a36"},everforest:{primary:"#a7c080",accent:"#d699b6",background:"#2d353b"},flexoki:{primary:"#DA702C",accent:"#8B7EC8",background:"#100F0F"},github:{primary:"#58a6ff",accent:"#39c5cf",background:"#0d1117"},gruvbox:{primary:"#83a598",accent:"#8ec07c",background:"#282828"},kanagawa:{primary:"#7E9CD8",accent:"#D27E99",background:"#1F1F28"},"lucent-orng":{primary:"#EC5B2B",accent:"#FFF7F1",background:"transparent"},material:{primary:"#82aaff",accent:"#89ddff",background:"#263238"},matrix:{primary:"#2eff6a",accent:"#c770ff",background:"#0a0e0a"},mercury:{primary:"#8da4f5",accent:"#8da4f5",background:"#171721"},mono:{primary:"#e6edf3",accent:"#aaaaaa",background:"#1F1F1F"},monokai:{primary:"#66d9ef",accent:"#a6e22e",background:"#272822"},nightowl:{primary:"#82AAFF",accent:"#c792ea",background:"#011627"},nord:{primary:"#88C0D0",accent:"#8FBCBB",background:"#2E3440"},"one-dark":{primary:"#61afef",accent:"#56b6c2",background:"#282c34"},opencode:{primary:"#fab283",accent:"#9d7cd8",background:"#0a0a0a"},orng:{primary:"#EC5B2B",accent:"#FFF7F1",background:"#0a0a0a"},"osaka-jade":{primary:"#2DD5B7",accent:"#549e6a",background:"#111c18"},palenight:{primary:"#82aaff",accent:"#89ddff",background:"#292d3e"},poseidon:{primary:"#A9DFFF",accent:"#5DB8F5",background:"#0F2440"},rosepine:{primary:"#9ccfd8",accent:"#ebbcba",background:"#191724"},sisyphus:{primary:"#F5F5F5",accent:"#E7E7E7",background:"#202020"},slate:{primary:"#7eb8f6",accent:"#8EA8FF",background:"#151C2F"},solarized:{primary:"#268bd2",accent:"#2aa198",background:"#002b36"},synthwave84:{primary:"#36f9f6",accent:"#b084eb",background:"#262335"},tokyonight:{primary:"#82aaff",accent:"#ff966c",background:"#1a1b26"},vercel:{primary:"#0070F3",accent:"#8E4EC6",background:"#000000"},vesper:{primary:"#FFC799",accent:"#FFC799",background:"#101010"},"warm-lightmode":{primary:"#9D681D",accent:"#CE661C",background:"#101014"},zenburn:{primary:"#8cd0d3",accent:"#93e0e3",background:"#3f3f3f"}},NAMES=Object.keys(PREVIEW).sort();var cache=new Map,pending=new Map;async function load(name){let hit=cache.get(name);if(hit)return hit;let inflight=pending.get(name);if(inflight)return inflight;if(!PREVIEW[name])throw Error(`Unknown theme: ${name}`);let p=import(`./themes/${name}.json`).then((m2)=>{let json=m2.default??m2;return cache.set(name,json),pending.delete(name),json});return pending.set(name,p),p}function get(name){return cache.get(name)}async function prime(name){await load(name).catch(()=>{return})}var DEFAULT_THEME="tokyonight",THEME_NAMES=NAMES;function syntax(theme){return SyntaxStyle.fromTheme(rules(theme))}function rules(theme){return[{scope:["default"],style:{foreground:theme.text}},{scope:["comment","comment.documentation"],style:{foreground:theme.syntaxComment,italic:!0}},{scope:["string","symbol"],style:{foreground:theme.syntaxString}},{scope:["number","boolean"],style:{foreground:theme.syntaxNumber}},{scope:["keyword"],style:{foreground:theme.syntaxKeyword,italic:!0}},{scope:["keyword.return","keyword.conditional","keyword.repeat"],style:{foreground:theme.syntaxKeyword,italic:!0}},{scope:["keyword.type"],style:{foreground:theme.syntaxType,bold:!0}},{scope:["keyword.function","function.method"],style:{foreground:theme.syntaxFunction}},{scope:["function","function.call"],style:{foreground:theme.syntaxFunction}},{scope:["variable","variable.parameter"],style:{foreground:theme.syntaxVariable}},{scope:["type"],style:{foreground:theme.syntaxType}},{scope:["operator"],style:{foreground:theme.syntaxOperator}},{scope:["punctuation","punctuation.bracket","punctuation.delimiter"],style:{foreground:theme.syntaxPunctuation}},{scope:["markup.heading"],style:{foreground:theme.markdownHeading,bold:!0}},{scope:["markup.strong"],style:{foreground:theme.markdownStrong,bold:!0}},{scope:["markup.italic"],style:{foreground:theme.markdownEmph,italic:!0}},{scope:["markup.link"],style:{foreground:theme.markdownLink,underline:!0}},{scope:["markup.raw"],style:{foreground:theme.markdownCode}},{scope:["markup.list"],style:{foreground:theme.markdownListItem}}]}var exports_preferences={};__export(exports_preferences,{usePref:()=>usePref,set:()=>set,reset:()=>reset,reload:()=>reload,prefs:()=>exports_preferences,load:()=>load2,get:()=>get2});var import_react15=__toESM(require_react_production(),1);import{join as join5}from"path";import{existsSync as existsSync6,mkdirSync as mkdirSync2,readFileSync,writeFileSync as writeFileSync2}from"fs";import{homedir as homedir2}from"os";import{join as join4}from"path";import{existsSync as existsSync5,mkdirSync,readdirSync,renameSync}from"fs";var HOME=()=>process.env.HOME||homedir2(),HERMES_HOME=()=>process.env.HERMES_HOME||join4(HOME(),".hermes"),migrated=!1;function configDir(){let dir=process.env.HERM_CONFIG_DIR||join4(HERMES_HOME(),"herm");if(!migrated)migrated=!0,maybeMigrateLegacy(dir);return dir}function maybeMigrateLegacy(target){if(process.env.HERM_CONFIG_DIR)return;let legacy=join4(HOME(),".config","herm");if(!existsSync5(legacy)||legacy===target)return;try{if(existsSync5(target)&&readdirSync(target).length>0)return;mkdirSync(target,{recursive:!0});for(let name of readdirSync(legacy)){let src=join4(legacy,name),dst=join4(target,name);if(existsSync5(dst))continue;try{renameSync(src,dst)}catch{}}}catch{}}var DEFAULTS={mouse:!0,targetFps:30};function configFile(){return join5(configDir(),"tui.json")}var cached=null;function reset(){cached=null}function reload(){cached=null;for(let l of listeners)l()}function load2(){if(cached)return cached;let CONFIG_FILE=configFile();try{if(!existsSync6(CONFIG_FILE)){let prefs2={...DEFAULTS};return cached=prefs2,prefs2}let raw=JSON.parse(readFileSync(CONFIG_FILE,"utf-8"));if(raw.eikonPath&&!raw.eikon)raw.eikon=raw.eikonPath.split("/").pop()?.replace(/\.eikon$/,""),delete raw.eikonPath;let prefs={...DEFAULTS,...raw};return cached=prefs,prefs}catch{let prefs={...DEFAULTS};return cached=prefs,prefs}}function save(partial){let current=load2();if(partial)Object.assign(current,partial);cached=current;try{let CONFIG_DIR=configDir();if(!existsSync6(CONFIG_DIR))mkdirSync2(CONFIG_DIR,{recursive:!0});let json=JSON.stringify(current,null,2)+`
3671
- `;writeFileSync2(configFile(),json,"utf-8")}catch(err){if(process.env.PERF)console.error("[preferences] failed to save:",err)}}function get2(key){return load2()[key]}function set(key,value){if(load2()[key]===value)return;save({[key]:value});for(let l of listeners)l()}var listeners=new Set;function subscribe(l){return listeners.add(l),()=>listeners.delete(l)}function usePref(key){return import_react15.useSyncExternalStore(subscribe,()=>load2()[key])}var Ctx=import_react16.createContext(null),THEMES_SET=new Set(THEME_NAMES),ThemeProvider=({children,initial,mode:initialMode="dark"})=>{let active=usePref("theme")??initial??DEFAULT_THEME,[mode]=import_react16.useState(initialMode),[tick,force]=import_react16.useState(0);import_react16.useEffect(()=>{if(get(active)&&get(DEFAULT_THEME))return;let cancelled=!1,need=[active,DEFAULT_THEME].filter((n)=>!get(n));return Promise.all(need.map((n)=>load(n).catch(()=>{return}))).then(()=>{if(!cancelled)force((n)=>n+1)}),()=>{cancelled=!0}},[active]);let resolved=import_react16.useMemo(()=>{let json=get(active)??get(DEFAULT_THEME);if(!json)return null;try{return resolveTheme(json,mode)}catch{let fallback=get(DEFAULT_THEME);return fallback?resolveTheme(fallback,mode):null}},[active,mode,tick]),set2=import_react16.useCallback((name)=>{if(!THEMES_SET.has(name))return!1;if(set("theme",name),!get(name))load(name).catch(()=>{});return!0},[]),has=import_react16.useCallback((name)=>THEMES_SET.has(name),[]),syntaxStyle=import_react16.useMemo(()=>resolved?syntax(resolved):null,[resolved]),value=import_react16.useMemo(()=>{if(!resolved||!syntaxStyle)return null;return{theme:resolved,syntaxStyle,name:active,mode,set:set2,names:THEME_NAMES,has}},[resolved,syntaxStyle,active,mode,set2,has]);if(!value)return null;return $jsx(Ctx.Provider,{value,children})},useTheme=makeUse(Ctx,"useTheme");var import_react17=__toESM(require_react_production(),1);var FRAMES=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],MS=80,subs=new Set,tick=0,timer=null;function sub(fn){if(subs.add(fn),fn(tick),!timer)timer=setInterval(()=>{tick=(tick+1)%FRAMES.length;for(let s of Array.from(subs))s(tick)},MS);return()=>{if(subs.delete(fn),subs.size===0&&timer)clearInterval(timer),timer=null}}function useGlyph(active){let ref=import_react17.useRef(null);return import_react17.useEffect(()=>{if(!active)return;return sub((n)=>{let node=ref.current;if(node)node.children=[FRAMES[n]]})},[active]),ref}var Spinner=import_react17.memo((props)=>{let theme=useTheme().theme,color=props.color??theme.textMuted,on=exports_preferences.get("animations")!==!1,ref=useGlyph(on);return $jsxs("text",{children:[$jsx("span",{ref,fg:color,children:on?FRAMES[tick]:"\u22EF"}),props.label?$jsxs("span",{fg:color,children:[" ",props.label]}):null]})}),SpinGlyph=import_react17.memo((props)=>{let on=(props.active??!0)&&exports_preferences.get("animations")!==!1,ref=useGlyph(on);return $jsx("span",{ref,fg:props.fg,children:on?FRAMES[tick]:"\u22EF"})});function useSpinnerGlyph(active=!0){let on=exports_preferences.get("animations")!==!1&&active,[n,set2]=import_react17.useState(tick);return import_react17.useEffect(()=>on?sub(set2):void 0,[on]),on?FRAMES[n]:"\u22EF"}var SPEC={terminal:{icon:"$",verb:"",pending:"Writing command\u2026"},process:{icon:"\u229A",verb:"Process",pending:"Managing process\u2026"},execute_code:{icon:"\xBB",verb:"Exec",pending:"Writing script\u2026"},read_file:{icon:"\u2192",verb:"Read",pending:"Reading file\u2026"},write_file:{icon:"\u2190",verb:"Write",pending:"Preparing write\u2026"},patch:{icon:"\u2190",verb:"Edit",pending:"Preparing edit\u2026"},search_files:{icon:"\u2731",verb:"Search",pending:"Searching\u2026"},web_search:{icon:"\u25C8",verb:"Web",pending:"Searching web\u2026"},web_extract:{icon:"%",verb:"Fetch",pending:"Fetching page\u2026"},session_search:{icon:"\u21BA",verb:"Recall",pending:"Searching memory\u2026"},browser_navigate:{icon:"%",verb:"Navigate",pending:"Navigating\u2026"},browser_click:{icon:"\xB7",verb:"Click",pending:"Clicking\u2026"},browser_type:{icon:"\u2328",verb:"Type",pending:"Typing\u2026"},browser_snapshot:{icon:"\u2399",verb:"Snapshot",pending:"Capturing\u2026"},browser_vision:{icon:"\u25C9",verb:"Vision",pending:"Looking\u2026"},vision_analyze:{icon:"\u25C9",verb:"Vision",pending:"Analyzing image\u2026"},todo:{icon:"\u2630",verb:"Todo",pending:"Updating todos\u2026"},memory:{icon:"\u2691",verb:"Memory",pending:"Updating memory\u2026"},clarify:{icon:"?",verb:"Ask",pending:"Asking\u2026"},skill_view:{icon:"\u25C6",verb:"Skill",pending:"Loading skill\u2026"},skills_list:{icon:"\u25C6",verb:"Skills",pending:"Listing skills\u2026"},skill_manage:{icon:"\u25C6",verb:"Skill",pending:"Managing skill\u2026"},delegate_task:{icon:"\u2299",verb:"Delegate",pending:"Spawning agent\u2026"},cronjob:{icon:"\u25F7",verb:"Cron",pending:"Managing cron\u2026"},text_to_speech:{icon:"\u266A",verb:"TTS",pending:"Synthesizing\u2026"},image_generate:{icon:"\u2726",verb:"Image",pending:"Generating image\u2026"},video_generate:{icon:"\u2726",verb:"Video",pending:"Generating video\u2026"}},GENERIC={icon:"\u2699",verb:"",pending:"Running\u2026"};function spec(name){if(name.startsWith("subagent"))return{icon:"\u2299",verb:"Subagent",pending:"Running\u2026"};if(name.startsWith("mcp__")||name.startsWith("mcp:"))return{icon:"\u25C7",verb:"MCP",pending:"Calling\u2026"};return SPEC[name]??GENERIC}function ms(d2){if(d2==null)return"";if(d2<1000)return`${Math.round(d2)}ms`;if(d2<60000)return`${(d2/1000).toFixed(1)}s`;return`${Math.floor(d2/60000)}m${Math.round(d2%60000/1000)}s`}var InlineTool=import_react18.memo((p)=>{let theme=useTheme().theme,[hover,setHover]=import_react18.useState(!1),s=spec(p.part.name),running=p.part.status==="running",failed=p.part.status==="error",spin=useSpinnerGlyph(running),fg2=failed?theme.error:hover&&p.onClick?theme.text:running?theme.text:theme.textMuted;return $jsxs("box",{flexDirection:"column",paddingLeft:3,onMouseOver:p.onClick?()=>setHover(!0):void 0,onMouseOut:p.onClick?()=>setHover(!1):void 0,onMouseDown:p.onClick,children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsxs("span",{fg:running?theme.warning:p.iconColor??fg2,children:[running?spin:s.icon," "]}),p.complete??!0?$jsx("span",{fg:fg2,children:p.children}):$jsxs("span",{fg:fg2,children:["~ ",s.pending]}),p.part.duration!=null?$jsxs("span",{fg:theme.textMuted,children:[" ",ms(p.part.duration)]}):null]})}),failed&&p.part.result?$jsx("box",{minHeight:1,paddingLeft:2,children:$jsx("text",{fg:theme.error,wrapMode:"word",children:p.part.result})}):null,p.details?.map((d2)=>$jsxs("box",{flexDirection:"column",paddingLeft:2,marginTop:1,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:d2.label})}),$jsx("box",{minHeight:1,children:$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:d2.text})})]},d2.label))]})});var import_react19=__toESM(require_react_production(),1);function dur(d2){if(d2==null)return"";let s=d2/1000;return s<60?`${s.toFixed(1)}s`:`${Math.floor(s/60)}m${Math.round(s%60)}s`}var Subagent=import_react19.memo(({tool})=>{let theme=useTheme().theme,[open,setOpen]=import_react19.useState(!1),running=tool.status==="running",failed=tool.status==="error",spin=useSpinnerGlyph(running),trail=tool.trail??[],last=trail[trail.length-1],fg2=failed?theme.error:running?theme.text:theme.textMuted,goal=(tool.goal??tool.preview??"").replace(/\s+/g," ").trim(),sub2=running?last?`\u21B3 ${spec(last.name).verb||last.name} ${last.preview??""}`:trail.length?`\u21B3 ${trail.length} toolcalls`:"":`\u2514 ${trail.length} toolcall${trail.length===1?"":"s"}${tool.duration?` \xB7 ${dur(tool.duration)}`:""}`;return $jsxs("box",{flexDirection:"column",paddingLeft:3+(tool.depth??0)*2,onMouseDown:trail.length?()=>setOpen((o)=>!o):void 0,children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsxs("span",{fg:running?theme.warning:fg2,children:[running?spin:"\u2299"," "]}),$jsxs("span",{fg:fg2,children:["Task \u2014 ",goal||"delegating\u2026"]})]})}),open?$jsxs("box",{flexDirection:"column",children:[trail.map((c,i)=>{let s=spec(c.name),lbl=s.verb?`${s.verb} ${c.preview??""}`:c.preview??c.name;return $jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:i<trail.length-1?"\u251C\u2500 ":"\u2514\u2500 "}),$jsxs("span",{fg:theme.textMuted,children:[s.icon," ",lbl]})]})},i)}),tool.result?$jsx("box",{minHeight:1,marginTop:1,children:$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:tool.result})}):null]}):sub2?$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:sub2})}):null]})});function short(s,n=120){if(!s)return"";let one=s.replace(/\s+/g," ").trim();return one.length>n?one.slice(0,n-1)+"\u2026":one}var Inline=import_react20.memo(({tool})=>{let s=spec(tool.name),body=tool.preview?short(tool.preview):"";return $jsx(InlineTool,{part:tool,complete:!!body||tool.status!=="running",children:s.verb?`${s.verb} ${body}`:body||tool.name})}),Tool=import_react20.memo(({tool,detail="expanded"})=>{if(detail==="hidden"&&tool.status!=="running")return null;if(tool.trail||tool.name==="delegate_task")return $jsx(Subagent,{tool});if(detail!=="expanded")return $jsx(Inline,{tool});let details=[tool.verboseArgs?{label:"Args",text:tool.verboseArgs}:void 0,tool.verboseResult?{label:tool.status==="error"?"Error":"Result",text:tool.verboseResult}:void 0].filter((d2)=>!!d2),s=spec(tool.name),body=tool.preview?short(tool.preview):"";return $jsx(InlineTool,{part:tool,complete:!!body||tool.status!=="running",details,children:s.verb?`${s.verb} ${body}`:body||tool.name})});var CLOUD_MIN=12,CLOUD_MAX=24,CLOUD={topLeft:"\u256D",topRight:"\u256E",bottomLeft:"\u2570",bottomRight:"\u256F",horizontal:"\u2504",vertical:"\u2506",topT:"\u2504",bottomT:"\u2504",leftT:"\u2506",rightT:"\u2506",cross:"\u253C"},SLOTS=[["\u256D\u2504\u2504\u256E ","\u2570\u2504\u2504\u256F "],[" \u256D\u256E "," \u2570\u256F "],[" \u2576 "," "]],BLANK=" ",ORDER=[2,1,0,-1],Tail=import_react21.memo((props)=>{let theme=useTheme().theme,refs=import_react21.useRef([]),paint=(lit)=>{SLOTS.forEach((slot,i)=>slot.forEach((l,j2)=>{let node=refs.current[i*2+j2];if(node)node.children=[lit===null||lit===i?l:BLANK]}))};return import_react21.useEffect(()=>{if(!props.run){paint(null);return}let f=0;paint(ORDER[0]);let t2=setInterval(()=>{f=(f+1)%ORDER.length,paint(ORDER[f])},160);return()=>{clearInterval(t2),paint(null)}},[props.run]),$jsx("box",{flexDirection:"column",children:SLOTS.flatMap((slot,i)=>slot.map((l,j2)=>$jsx("text",{fg:theme.hermAvatar,children:$jsx("span",{ref:(el)=>{refs.current[i*2+j2]=el},children:l})},`${i}-${j2}`)))})});function parts(m2){return m2?.parts.filter((p)=>p.type==="thinking"||p.type==="tool")??[]}function latest(messages){for(let i=messages.length-1;i>=0;i--)if(messages[i].role==="assistant")return messages[i];return}function rows(list){return list.reduce((n,p)=>n+(p.type==="thinking"?Math.ceil(p.content.length/80)||1:p.type==="tool"&&p.diff?6:1),0)}var ThoughtCloud=import_react21.memo((props)=>{let{theme,syntaxStyle}=useTheme(),detail=usePref("toolDetails")??"expanded",src=props.pick??latest(props.messages),all=parts(src),think=all.filter((p)=>p.type==="thinking"),tools=all.filter((p)=>p.type==="tool"),[pane,setPane]=import_react21.useState("reasoning");import_react21.useEffect(()=>{if(pane==="reasoning"&&think.length===0&&tools.length>0)setPane("tools");if(pane==="tools"&&tools.length===0&&think.length>0)setPane("reasoning")},[pane,think.length,tools.length]);let body=pane==="reasoning"?think:tools,manual=import_react21.useRef(!1),want=Math.min(CLOUD_MAX,Math.max(CLOUD_MIN,rows(body)+3)),resize=props.onResize;import_react21.useEffect(()=>{if(!manual.current)resize(want)},[want,resize]);let drag=import_react21.useRef(null),grab=(e)=>{drag.current={y:e.y,h:props.height},manual.current=!0,e.stopPropagation()},move=(e)=>{let d2=drag.current;if(!d2)return;resize(Math.min(CLOUD_MAX,Math.max(CLOUD_MIN,d2.h+(e.y-d2.y))))},drop=()=>{drag.current=null},pill=(id,label,n)=>{let on=pane===id;return $jsx("box",{height:1,marginRight:2,onMouseDown:(e)=>{e.stopPropagation(),setPane(id)},children:$jsxs("text",{children:[$jsx("span",{fg:on?theme.accent:theme.textMuted,children:on?$jsx("strong",{children:label}):label}),n!==null&&n>0?$jsx("span",{fg:theme.textMuted,children:` ${n}`}):null]})})};return $jsxs("box",{height:props.height,flexDirection:"column",position:"relative",marginLeft:1,border:!0,borderColor:theme.hermAvatar,customBorderChars:CLOUD,backgroundColor:theme.backgroundPanel,paddingX:1,children:[$jsxs("box",{height:1,flexShrink:0,flexDirection:"row",children:[pill("reasoning","reasoning",null),pill("tools","tools",tools.length),$jsx("box",{flexGrow:1}),detail!=="expanded"?$jsx("box",{marginRight:1,children:$jsxs("text",{fg:theme.textMuted,children:["\u27E8",detail,"\u27E9"]})}):null,props.onClose?$jsx("box",{width:1,onMouseDown:props.onClose,children:$jsx("text",{fg:theme.textMuted,children:"\xD7"})}):null]}),$jsx("scrollbox",{scrollY:!0,stickyScroll:!0,stickyStart:"bottom",flexGrow:1,children:$jsx("box",{flexDirection:"column",width:"100%",children:body.map((p,i)=>p.type==="thinking"?$jsx("box",{minHeight:1,width:"100%",flexShrink:0,children:$jsx("markdown",{content:p.content,fg:theme.markdownText,syntaxStyle})},p.key??`th-${i}`):$jsx("box",{width:"100%",flexShrink:0,children:$jsx(Tool,{tool:p,detail:detail==="hidden"?"hidden":"collapsed"})},p.id||`t-${i}`))})}),$jsx("box",{position:"absolute",left:0,right:0,bottom:0,height:1,onMouseDown:grab,onMouseDrag:move,onMouseUp:drop,onMouseDragEnd:drop})]})});var import_react27=__toESM(require_react_production(),1);var import_react22=__toESM(require_react_production(),1);var def=(chord,desc,scope)=>({chord,desc,scope}),DEFAULTS2={leader:def("ctrl+x","Leader prefix","global"),"app.exit":def("ctrl+c","Quit","global"),"input.clear":def("ctrl+c","Clear input","global"),"app.suspend":def("ctrl+z","Suspend to shell","global"),"app.redraw":def("ctrl+l","Clear & force-repaint terminal","global"),"app.sidebar":def("<leader>b","Toggle sidebar","global"),"palette.open":def("ctrl+k","Command palette","global"),"help.open":def("f1","Keyboard shortcuts","global"),"tab.next":def("alt+right","Next tab","global"),"tab.prev":def("alt+left","Previous tab","global"),"focus.cycle":def("tab","Cycle focus (double-tap \u2192 composer)","global"),"editor.open":def("<leader>e,ctrl+g","Open $EDITOR on prompt","global"),"reply.copy":def("<leader>y,ctrl+y","Copy last assistant reply","global"),"clipboard.attach":def("ctrl+v","Attach clipboard image","global"),"queue.flush":def("<leader>u","Interrupt and send queued now","global"),"session.interrupt":def("escape","Interrupt (double-tap while streaming)","global"),"session.new":def("<leader>n","New session","global"),"session.redo":def("<leader>r","Redo last undo","global"),"session.compress":def("<leader>c","Compress context","global"),"session.steer":def("<leader>s","Steer active turn","global"),"input.stash":def("<leader>p","Stash prompt draft","global"),"session.timeline":def("<leader>g","Session timeline","global"),"theme.pick":def("<leader>t","Switch theme","global"),"model.pick":def("<leader>m","Switch model","global"),"status.open":def("<leader>i","Show status","global"),"list.up":def("up","Move selection up","list"),"list.down":def("down","Move selection down","list"),"list.pageUp":def("pageup","Page up","list"),"list.pageDown":def("pagedown","Page down","list"),"list.home":def("home","First item","list"),"list.end":def("end","Last item","list"),"list.activate":def("return","Activate / open","list"),"list.delete":def("d,delete","Delete item","list"),"list.refresh":def("r","Reload","list"),"list.new":def("n","Create","list"),"list.search":def("/","Filter","list"),"list.toggle":def("space","Toggle item","list"),"dialog.accept":def("return","Accept","dialog"),"dialog.cancel":def("escape","Cancel / close","dialog"),"dialog.confirm":def("y","Yes","dialog"),"dialog.deny":def("n","No","dialog"),"dialog.copy":def("c","Copy body","dialog"),"input.submit":def("return","Send","composer"),"input.newline":def("shift+return,ctrl+return,alt+return,ctrl+j","Insert newline","composer"),"sessions.rename":def("ctrl+r","Retitle session","sessions"),"sessions.prev":def("left","Previous source filter","sessions"),"sessions.next":def("right","Next source filter","sessions"),"agents.kill":def("k","Kill subagent","agents"),"agents.history":def("h","Spawn history","agents"),"agents.install":def("i","Install distribution","agents"),"config.save":def("ctrl+s","Write config","config"),"config.mode":def("m","Toggle form \u2194 YAML","config"),"eikon.save":def("ctrl+s","Save eikon","eikon"),"eikon.marketplace":def("m","Open marketplace","eikon")};var TAB_SCOPES=new Set(["sessions","cron","env","agents","skills","config","eikon"]);function scopesOverlap(a,b2){if(a===b2)return!0;if(a==="global"||b2==="global")return!0;if(a==="list")return TAB_SCOPES.has(b2);if(b2==="list")return TAB_SCOPES.has(a);return!1}var ALIAS={esc:"escape",enter:"return",del:"delete",ins:"insert",space:"space"," ":"space"};function parse2(spec2){if(!spec2||spec2==="none")return[];return spec2.split(",").map(one)}function one(combo){let c={name:"",ctrl:!1,meta:!1,shift:!1,super:!1,leader:!1};for(let raw of combo.replace(/<leader>/g,"leader+").toLowerCase().split("+")){let p=raw.trim();if(!p)continue;if(p==="ctrl")c.ctrl=!0;else if(p==="alt"||p==="meta"||p==="option")c.meta=!0;else if(p==="shift")c.shift=!0;else if(p==="super"||p==="cmd")c.super=!0;else if(p==="leader")c.leader=!0;else c.name=ALIAS[p]??p}return c}function from(key,leader=!1){return{name:key.name===" "?"space":key.name,ctrl:key.ctrl,meta:key.meta,shift:key.shift,super:key.super??!1,leader}}function eq(a,b2){return a.name===b2.name&&a.ctrl===b2.ctrl&&a.meta===b2.meta&&a.shift===b2.shift&&a.super===b2.super&&a.leader===b2.leader}function match(list,key,leader=!1){if(list.length===0)return!1;let k2=from(key,leader);return list.some((c)=>eq(c,k2))}function print(list,lead){let c=list[0];if(!c)return"";let mods=[];if(c.ctrl)mods.push("Ctrl");if(c.meta)mods.push("Alt");if(c.super)mods.push("Super");if(c.shift)mods.push("Shift");let name=LABEL[c.name]??cap(c.name),body=[...mods,name].join("+");if(!c.leader)return body;return lead?`${lead} ${body}`:`<leader> ${body}`}var LABEL={return:"Enter",escape:"Esc",space:"Space",delete:"Del",backspace:"\u232B",up:"\u2191",down:"\u2193",left:"\u2190",right:"\u2192",pageup:"PgUp",pagedown:"PgDn",home:"Home",end:"End",tab:"Tab"};function cap(s){return s.length===1?s.toUpperCase():s.charAt(0).toUpperCase()+s.slice(1)}function toBindings(list,action){return list.map((c)=>({name:c.name,ctrl:c.ctrl||void 0,meta:c.meta||void 0,shift:c.shift||void 0,super:c.super||void 0,action}))}function key(c){return`${c.leader?"L":""}${c.ctrl?"C":""}${c.meta?"M":""}${c.shift?"S":""}${c.super?"W":""}-${c.name}`}var LEADER_MS=2000,Ctx2=import_react22.createContext(null),NO_OVERRIDES=Object.freeze({}),KeysProvider=({children,overrides:fixedOverrides})=>{let renderer=useRenderer(),prefOverrides=usePref("keys"),overrides=fixedOverrides??prefOverrides??NO_OVERRIDES,table=import_react22.useMemo(()=>{let t2=new Map;for(let id of Object.keys(DEFAULTS2))t2.set(id,parse2(overrides[id]??DEFAULTS2[id].chord));return t2},[overrides]),lead=table.get("leader"),leadLabel=print(lead),armed=import_react22.useRef(!1),stolen=import_react22.useRef(null),timer2=import_react22.useRef(null),[,bump]=import_react22.useState(0),disarm=import_react22.useCallback(()=>{if(!armed.current)return;if(armed.current=!1,timer2.current)clearTimeout(timer2.current),timer2.current=null;let f=stolen.current;if(stolen.current=null,f&&!f.isDestroyed&&!renderer.currentFocusedRenderable)f.focus();bump((n)=>n+1)},[renderer]),arm=import_react22.useCallback(()=>{if(armed.current=!0,stolen.current=renderer.currentFocusedRenderable??null,stolen.current?.blur(),timer2.current)clearTimeout(timer2.current);timer2.current=setTimeout(disarm,LEADER_MS),bump((n)=>n+1)},[renderer,disarm]);useKeyboard((key2)=>{if(!armed.current&&match(lead,key2)){arm(),key2.stopPropagation();return}if(armed.current)queueMicrotask(disarm)});let value=import_react22.useMemo(()=>({get leader(){return armed.current},match:(id,key2)=>match(table.get(id)??[],key2,armed.current),print:(id)=>print(table.get(id)??[],leadLabel),chord:(id)=>table.get(id)??[],all:(scope)=>Object.keys(DEFAULTS2).filter((id)=>DEFAULTS2[id].scope===scope).map((id)=>({id,desc:DEFAULTS2[id].desc,scope,chord:table.get(id)??[]})),table}),[table,leadLabel]);return $jsx(Ctx2.Provider,{value,children})},useKeys=makeUse(Ctx2,"useKeys");var import_react24=__toESM(require_react_production(),1);function handleListKey(keys,key2,o){let move=(next)=>{o.setSel((p)=>{let n=Math.max(0,Math.min(o.count-1,next(p)));return o.scrollTo?.(n),n})},pg=o.page??10;if(keys.match("list.up",key2))return move((p)=>p-1),!0;if(keys.match("list.down",key2))return move((p)=>p+1),!0;if(keys.match("list.pageUp",key2))return move((p)=>p-pg),!0;if(keys.match("list.pageDown",key2))return move((p)=>p+pg),!0;if(keys.match("list.home",key2))return move(()=>0),!0;if(keys.match("list.end",key2))return move(()=>o.count-1),!0;if(o.onActivate&&keys.match("list.activate",key2))return o.onActivate(),!0;if(o.onDelete&&keys.match("list.delete",key2))return o.onDelete(),!0;if(o.onRefresh&&keys.match("list.refresh",key2))return o.onRefresh(),!0;if(o.onNew&&keys.match("list.new",key2))return o.onNew(),!0;if(o.onToggle&&keys.match("list.toggle",key2))return o.onToggle(),!0;if(o.onSearch&&keys.match("list.search",key2))return o.onSearch(),!0;return!1}function useListKeys(o){let keys=useKeys();return useKeyboard((key2)=>{if(!(typeof o.active==="function"?o.active():o.active))return;if(handleListKey(keys,key2,o))return;o.also?.(key2,keys)}),keys}function useFollow(prefix,key2){let ref=import_react24.useRef(null),id=(i)=>`${prefix}-row-${key2?.(i)??i}`;return{ref,id,opts:{scrollTo:(n)=>ref.current?.scrollChildIntoView(id(n)),get page(){return Math.max(1,(ref.current?.viewport.height??10)-1)}}}}function conflicts(table){let buckets=new Map;for(let[id,chords]of table)for(let c of chords){let k2=key(c),b2=buckets.get(k2);if(b2)b2.push([id,c]);else buckets.set(k2,[[id,c]])}let out=[];for(let bucket of buckets.values()){if(bucket.length<2)continue;for(let i=0;i<bucket.length;i++)for(let j2=i+1;j2<bucket.length;j2++){let[a,c]=bucket[i],[b2]=bucket[j2];if(scopesOverlap(DEFAULTS2[a].scope,DEFAULTS2[b2].scope))out.push({chord:c,a,b:b2})}}return out}function conflictsWith(table,id){let mine=new Set((table.get(id)??[]).map(key));if(mine.size===0)return[];let scope=DEFAULTS2[id].scope,out=[];for(let[other,chords]of table){if(other===id)continue;if(!scopesOverlap(scope,DEFAULTS2[other].scope))continue;if(chords.some((c)=>mine.has(key(c))))out.push(other)}return out}var import_react26=__toESM(require_react_production(),1);var TabStrip=import_react26.memo(({tabs,active,onChange,hint})=>{let theme=useTheme().theme;return $jsxs("box",{width:"100%",flexDirection:"row",height:1,overflow:"hidden",children:[tabs.map((name,i)=>$jsx("box",{onMouseDown:()=>onChange(i),paddingX:2,marginRight:1,flexShrink:0,backgroundColor:i===active?theme.backgroundElement:void 0,children:$jsx("text",{fg:i===active?theme.primary:theme.textMuted,children:$jsx("strong",{children:name})})},i)),$jsx("box",{flexGrow:1,minWidth:0}),hint?$jsx("box",{paddingX:1,flexShrink:1,minWidth:0,overflow:"hidden",children:$jsx("text",{fg:theme.borderSubtle,children:hint})}):null]})});var TabBar=import_react27.memo(({tabs,activeTab,onTabChange})=>{let keys=useKeys(),hint=`${keys.print("tab.prev")}/${keys.print("tab.next")} or ${keys.print("leader")} N`;return $jsx(TabStrip,{tabs:tabs.map((t2)=>t2.name),active:activeTab,onChange:onTabChange,hint})});var import_react31=__toESM(require_react_production(),1);var import_react28=__toESM(require_react_production(),1);var default_default=`{"type":"header","asset":{"version":"2.0","minVersion":"2.0","width":48,"height":24,"mediaType":"application/vnd.eikon.stream+jsonl"},"name":"nous-girl"}
3671
+ `;writeFileSync2(configFile(),json,"utf-8")}catch(err){if(process.env.PERF)console.error("[preferences] failed to save:",err)}}function get2(key){return load2()[key]}function set(key,value){if(load2()[key]===value)return;save({[key]:value});for(let l of listeners)l()}var listeners=new Set;function subscribe(l){return listeners.add(l),()=>listeners.delete(l)}function usePref(key){return import_react15.useSyncExternalStore(subscribe,()=>load2()[key])}var Ctx=import_react16.createContext(null),THEMES_SET=new Set(THEME_NAMES),ThemeProvider=({children,initial,mode:initialMode="dark"})=>{let active=usePref("theme")??initial??DEFAULT_THEME,[mode]=import_react16.useState(initialMode),[tick,force]=import_react16.useState(0);import_react16.useEffect(()=>{if(get(active)&&get(DEFAULT_THEME))return;let cancelled=!1,need=[active,DEFAULT_THEME].filter((n)=>!get(n));return Promise.all(need.map((n)=>load(n).catch(()=>{return}))).then(()=>{if(!cancelled)force((n)=>n+1)}),()=>{cancelled=!0}},[active]);let resolved=import_react16.useMemo(()=>{let json=get(active)??get(DEFAULT_THEME);if(!json)return null;try{return resolveTheme(json,mode)}catch{let fallback=get(DEFAULT_THEME);return fallback?resolveTheme(fallback,mode):null}},[active,mode,tick]),set2=import_react16.useCallback((name)=>{if(!THEMES_SET.has(name))return!1;if(set("theme",name),!get(name))load(name).catch(()=>{});return!0},[]),has=import_react16.useCallback((name)=>THEMES_SET.has(name),[]),syntaxStyle=import_react16.useMemo(()=>resolved?syntax(resolved):null,[resolved]),value=import_react16.useMemo(()=>{if(!resolved||!syntaxStyle)return null;return{theme:resolved,syntaxStyle,name:active,mode,set:set2,names:THEME_NAMES,has}},[resolved,syntaxStyle,active,mode,set2,has]);if(!value)return null;return $jsx(Ctx.Provider,{value,children})},useTheme=makeUse(Ctx,"useTheme");var import_react17=__toESM(require_react_production(),1);var FRAMES=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],MS=80,subs=new Set,tick=0,timer=null;function sub(fn){if(subs.add(fn),fn(tick),!timer)timer=setInterval(()=>{tick=(tick+1)%FRAMES.length;for(let s of Array.from(subs))s(tick)},MS);return()=>{if(subs.delete(fn),subs.size===0&&timer)clearInterval(timer),timer=null}}function useGlyph(active){let ref=import_react17.useRef(null);return import_react17.useEffect(()=>{if(!active)return;return sub((n)=>{let node=ref.current;if(node)node.children=[FRAMES[n]]})},[active]),ref}var Spinner=import_react17.memo((props)=>{let theme=useTheme().theme,color=props.color??theme.textMuted,on=exports_preferences.get("animations")!==!1,ref=useGlyph(on);return $jsxs("text",{children:[$jsx("span",{ref,fg:color,children:on?FRAMES[tick]:"\u22EF"}),props.label?$jsxs("span",{fg:color,children:[" ",props.label]}):null]})}),SpinGlyph=import_react17.memo((props)=>{let on=(props.active??!0)&&exports_preferences.get("animations")!==!1,ref=useGlyph(on);return $jsx("span",{ref,fg:props.fg,children:on?FRAMES[tick]:"\u22EF"})});function useSpinnerGlyph(active=!0){let on=exports_preferences.get("animations")!==!1&&active,[n,set2]=import_react17.useState(tick);return import_react17.useEffect(()=>on?sub(set2):void 0,[on]),on?FRAMES[n]:"\u22EF"}var SPEC={terminal:{icon:"$",verb:"",pending:"Writing command\u2026"},process:{icon:"\u229A",verb:"Process",pending:"Managing process\u2026"},execute_code:{icon:"\xBB",verb:"Exec",pending:"Writing script\u2026"},read_file:{icon:"\u2192",verb:"Read",pending:"Reading file\u2026"},write_file:{icon:"\u2190",verb:"Write",pending:"Preparing write\u2026"},patch:{icon:"\u2190",verb:"Edit",pending:"Preparing edit\u2026"},search_files:{icon:"\u2731",verb:"Search",pending:"Searching\u2026"},web_search:{icon:"\u25C8",verb:"Web",pending:"Searching web\u2026"},web_extract:{icon:"%",verb:"Fetch",pending:"Fetching page\u2026"},session_search:{icon:"\u21BA",verb:"Recall",pending:"Searching memory\u2026"},browser_navigate:{icon:"%",verb:"Navigate",pending:"Navigating\u2026"},browser_click:{icon:"\xB7",verb:"Click",pending:"Clicking\u2026"},browser_type:{icon:"\u2328",verb:"Type",pending:"Typing\u2026"},browser_snapshot:{icon:"\u2399",verb:"Snapshot",pending:"Capturing\u2026"},browser_vision:{icon:"\u25C9",verb:"Vision",pending:"Looking\u2026"},vision_analyze:{icon:"\u25C9",verb:"Vision",pending:"Analyzing image\u2026"},todo:{icon:"\u2630",verb:"Todo",pending:"Updating todos\u2026"},memory:{icon:"\u2691",verb:"Memory",pending:"Updating memory\u2026"},clarify:{icon:"?",verb:"Ask",pending:"Asking\u2026"},skill_view:{icon:"\u25C6",verb:"Skill",pending:"Loading skill\u2026"},skills_list:{icon:"\u25C6",verb:"Skills",pending:"Listing skills\u2026"},skill_manage:{icon:"\u25C6",verb:"Skill",pending:"Managing skill\u2026"},delegate_task:{icon:"\u2299",verb:"Delegate",pending:"Spawning agent\u2026"},cronjob:{icon:"\u25F7",verb:"Cron",pending:"Managing cron\u2026"},text_to_speech:{icon:"\u266A",verb:"TTS",pending:"Synthesizing\u2026"},image_generate:{icon:"\u2726",verb:"Image",pending:"Generating image\u2026"},video_generate:{icon:"\u2726",verb:"Video",pending:"Generating video\u2026"}},GENERIC={icon:"\u2699",verb:"",pending:"Running\u2026"};function spec(name){if(name.startsWith("subagent"))return{icon:"\u2299",verb:"Subagent",pending:"Running\u2026"};if(name.startsWith("mcp__")||name.startsWith("mcp:"))return{icon:"\u25C7",verb:"MCP",pending:"Calling\u2026"};return SPEC[name]??GENERIC}function ms(d2){if(d2==null)return"";if(d2<1000)return`${Math.round(d2)}ms`;if(d2<60000)return`${(d2/1000).toFixed(1)}s`;return`${Math.floor(d2/60000)}m${Math.round(d2%60000/1000)}s`}var InlineTool=import_react18.memo((p)=>{let theme=useTheme().theme,[hover,setHover]=import_react18.useState(!1),s=spec(p.part.name),running=p.part.status==="running",failed=p.part.status==="error",spin=useSpinnerGlyph(running),fg2=failed?theme.error:hover&&p.onClick?theme.text:running?theme.text:theme.textMuted;return $jsxs("box",{flexDirection:"column",paddingLeft:3,onMouseOver:p.onClick?()=>setHover(!0):void 0,onMouseOut:p.onClick?()=>setHover(!1):void 0,onMouseDown:p.onClick,children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsxs("span",{fg:running?theme.warning:p.iconColor??fg2,children:[running?spin:s.icon," "]}),p.complete??!0?$jsx("span",{fg:fg2,children:p.children}):$jsxs("span",{fg:fg2,children:["~ ",s.pending]}),p.part.duration!=null?$jsxs("span",{fg:theme.textMuted,children:[" ",ms(p.part.duration)]}):null]})}),failed&&p.part.result?$jsx("box",{minHeight:1,paddingLeft:2,children:$jsx("text",{fg:theme.error,wrapMode:"word",children:p.part.result})}):null,p.details?.map((d2)=>$jsxs("box",{flexDirection:"column",paddingLeft:2,marginTop:1,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:d2.label})}),$jsx("box",{minHeight:1,children:$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:d2.text})})]},d2.label))]})});var import_react19=__toESM(require_react_production(),1);function dur(d2){if(d2==null)return"";let s=d2/1000;return s<60?`${s.toFixed(1)}s`:`${Math.floor(s/60)}m${Math.round(s%60)}s`}var Subagent=import_react19.memo(({tool})=>{let theme=useTheme().theme,[open,setOpen]=import_react19.useState(!1),running=tool.status==="running",failed=tool.status==="error",spin=useSpinnerGlyph(running),trail=tool.trail??[],last=trail[trail.length-1],fg2=failed?theme.error:running?theme.text:theme.textMuted,goal=(tool.goal??tool.preview??"").replace(/\s+/g," ").trim(),sub2=running?last?`\u21B3 ${spec(last.name).verb||last.name} ${last.preview??""}`:trail.length?`\u21B3 ${trail.length} toolcalls`:"":`\u2514 ${trail.length} toolcall${trail.length===1?"":"s"}${tool.duration?` \xB7 ${dur(tool.duration)}`:""}`;return $jsxs("box",{flexDirection:"column",paddingLeft:3+(tool.depth??0)*2,onMouseDown:trail.length?()=>setOpen((o)=>!o):void 0,children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsxs("span",{fg:running?theme.warning:fg2,children:[running?spin:"\u2299"," "]}),$jsxs("span",{fg:fg2,children:["Task \u2014 ",goal||"delegating\u2026"]})]})}),open?$jsxs("box",{flexDirection:"column",children:[trail.map((c,i)=>{let s=spec(c.name),lbl=s.verb?`${s.verb} ${c.preview??""}`:c.preview??c.name;return $jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:i<trail.length-1?"\u251C\u2500 ":"\u2514\u2500 "}),$jsxs("span",{fg:theme.textMuted,children:[s.icon," ",lbl]})]})},i)}),tool.result?$jsx("box",{minHeight:1,marginTop:1,children:$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:tool.result})}):null]}):sub2?$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:sub2})}):null]})});function short(s,n=120){if(!s)return"";let one=s.replace(/\s+/g," ").trim();return one.length>n?one.slice(0,n-1)+"\u2026":one}var Inline=import_react20.memo(({tool})=>{let s=spec(tool.name),body=tool.preview?short(tool.preview):"";return $jsx(InlineTool,{part:tool,complete:!!body||tool.status!=="running",children:s.verb?`${s.verb} ${body}`:body||tool.name})}),Tool=import_react20.memo(({tool,detail="expanded"})=>{if(detail==="hidden"&&tool.status!=="running")return null;if(tool.trail||tool.name==="delegate_task")return $jsx(Subagent,{tool});if(detail!=="expanded")return $jsx(Inline,{tool});let details=[tool.verboseArgs?{label:"Args",text:tool.verboseArgs}:void 0,tool.verboseResult?{label:tool.status==="error"?"Error":"Result",text:tool.verboseResult}:void 0].filter((d2)=>!!d2),s=spec(tool.name),body=tool.preview?short(tool.preview):"";return $jsx(InlineTool,{part:tool,complete:!!body||tool.status!=="running",details,children:s.verb?`${s.verb} ${body}`:body||tool.name})});var CLOUD_MIN=12,CLOUD_MAX=24,CLOUD={topLeft:"\u256D",topRight:"\u256E",bottomLeft:"\u2570",bottomRight:"\u256F",horizontal:"\u2504",vertical:"\u2506",topT:"\u2504",bottomT:"\u2504",leftT:"\u2506",rightT:"\u2506",cross:"\u253C"},SLOTS=[["\u256D\u2504\u2504\u256E ","\u2570\u2504\u2504\u256F "],[" \u256D\u256E "," \u2570\u256F "],[" \u2576 "," "]],BLANK=" ",ORDER=[2,1,0,-1],Tail=import_react21.memo((props)=>{let theme=useTheme().theme,refs=import_react21.useRef([]),paint=(lit)=>{SLOTS.forEach((slot,i)=>slot.forEach((l,j2)=>{let node=refs.current[i*2+j2];if(node)node.children=[lit===null||lit===i?l:BLANK]}))};return import_react21.useEffect(()=>{if(!props.run){paint(null);return}let f=0;paint(ORDER[0]);let t2=setInterval(()=>{f=(f+1)%ORDER.length,paint(ORDER[f])},160);return()=>{clearInterval(t2),paint(null)}},[props.run]),$jsx("box",{flexDirection:"column",children:SLOTS.flatMap((slot,i)=>slot.map((l,j2)=>$jsx("text",{fg:theme.hermAvatar,children:$jsx("span",{ref:(el)=>{refs.current[i*2+j2]=el},children:l})},`${i}-${j2}`)))})});function parts(m2){return m2?.parts.filter((p)=>p.type==="thinking"||p.type==="tool")??[]}function latest(messages){for(let i=messages.length-1;i>=0;i--)if(messages[i].role==="assistant")return messages[i];return}function rows(list){return list.reduce((n,p)=>n+(p.type==="thinking"?Math.ceil(p.content.length/80)||1:p.type==="tool"&&p.diff?6:1),0)}var ThoughtCloud=import_react21.memo((props)=>{let{theme,syntaxStyle}=useTheme(),detail=usePref("toolDetails")??"expanded",src=props.pick??latest(props.messages),all=parts(src),think=all.filter((p)=>p.type==="thinking"),tools=all.filter((p)=>p.type==="tool"),[pane,setPane]=import_react21.useState("reasoning");import_react21.useEffect(()=>{if(pane==="reasoning"&&think.length===0&&tools.length>0)setPane("tools");if(pane==="tools"&&tools.length===0&&think.length>0)setPane("reasoning")},[pane,think.length,tools.length]);let body=pane==="reasoning"?think:tools,manual=import_react21.useRef(!1),want=Math.min(CLOUD_MAX,Math.max(CLOUD_MIN,rows(body)+3)),resize=props.onResize;import_react21.useEffect(()=>{if(!manual.current)resize(want)},[want,resize]);let drag=import_react21.useRef(null),grab=(e)=>{drag.current={y:e.y,h:props.height},manual.current=!0,e.stopPropagation()},move=(e)=>{let d2=drag.current;if(!d2)return;resize(Math.min(CLOUD_MAX,Math.max(CLOUD_MIN,d2.h+(e.y-d2.y))))},drop=()=>{drag.current=null},pill=(id,label,n)=>{let on=pane===id;return $jsx("box",{height:1,marginRight:2,onMouseDown:(e)=>{e.stopPropagation(),setPane(id)},children:$jsxs("text",{children:[$jsx("span",{fg:on?theme.accent:theme.textMuted,children:on?$jsx("strong",{children:label}):label}),n!==null&&n>0?$jsx("span",{fg:theme.textMuted,children:` ${n}`}):null]})})};return $jsxs("box",{height:props.height,flexDirection:"column",position:"relative",marginLeft:1,border:!0,borderColor:theme.hermAvatar,customBorderChars:CLOUD,backgroundColor:theme.backgroundPanel,paddingX:1,children:[$jsxs("box",{height:1,flexShrink:0,flexDirection:"row",children:[pill("reasoning","reasoning",null),pill("tools","tools",tools.length),$jsx("box",{flexGrow:1}),detail!=="expanded"?$jsx("box",{marginRight:1,children:$jsxs("text",{fg:theme.textMuted,children:["\u27E8",detail,"\u27E9"]})}):null,props.onClose?$jsx("box",{width:1,onMouseDown:props.onClose,children:$jsx("text",{fg:theme.textMuted,children:"\xD7"})}):null]}),$jsx("scrollbox",{scrollY:!0,stickyScroll:!0,stickyStart:"bottom",flexGrow:1,children:$jsx("box",{flexDirection:"column",width:"100%",children:body.map((p,i)=>p.type==="thinking"?$jsx("box",{minHeight:1,width:"100%",flexShrink:0,children:$jsx("markdown",{content:p.content,fg:theme.markdownText,syntaxStyle})},p.key??`th-${i}`):$jsx("box",{width:"100%",flexShrink:0,children:$jsx(Tool,{tool:p,detail:detail==="hidden"?"hidden":"collapsed"})},p.id||`t-${i}`))})}),$jsx("box",{position:"absolute",left:0,right:0,bottom:0,height:1,onMouseDown:grab,onMouseDrag:move,onMouseUp:drop,onMouseDragEnd:drop})]})});var import_react27=__toESM(require_react_production(),1);var import_react22=__toESM(require_react_production(),1);var def=(chord,desc,scope)=>({chord,desc,scope}),DEFAULTS2={leader:def("ctrl+x","Leader prefix","global"),"app.exit":def("ctrl+c","Quit","global"),"input.clear":def("ctrl+c","Clear input","global"),"app.suspend":def("ctrl+z","Suspend to shell","global"),"app.redraw":def("ctrl+l","Clear & force-repaint terminal","global"),"app.sidebar":def("<leader>b","Toggle sidebar","global"),"palette.open":def("ctrl+k","Command palette","global"),"help.open":def("f1","Keyboard shortcuts","global"),"tab.next":def("alt+right","Next tab","global"),"tab.prev":def("alt+left","Previous tab","global"),"focus.cycle":def("tab","Cycle focus (double-tap \u2192 composer)","global"),"editor.open":def("<leader>e,ctrl+g","Open $EDITOR on prompt","global"),"reply.copy":def("<leader>y,ctrl+y","Copy last assistant reply","global"),"clipboard.attach":def("ctrl+v","Attach clipboard image","global"),"queue.flush":def("<leader>u","Interrupt and send queued now","global"),"session.interrupt":def("escape","Interrupt (double-tap while streaming)","global"),"session.new":def("<leader>n","New session","global"),"session.redo":def("<leader>r","Redo last undo","global"),"session.compress":def("<leader>c","Compress context","global"),"session.steer":def("<leader>s","Steer active turn","global"),"input.stash":def("<leader>p","Stash prompt draft","global"),"session.timeline":def("<leader>g","Session timeline","global"),"theme.pick":def("<leader>t","Switch theme","global"),"model.pick":def("<leader>m","Switch model","global"),"status.open":def("<leader>i","Show status","global"),"list.up":def("up","Move selection up","list"),"list.down":def("down","Move selection down","list"),"list.pageUp":def("pageup","Page up","list"),"list.pageDown":def("pagedown","Page down","list"),"list.home":def("home","First item","list"),"list.end":def("end","Last item","list"),"list.activate":def("return","Activate / open","list"),"list.delete":def("d,delete","Delete item","list"),"list.refresh":def("r","Reload","list"),"list.new":def("n","Create","list"),"list.search":def("/","Filter","list"),"list.toggle":def("space","Toggle item","list"),"dialog.accept":def("return","Accept","dialog"),"dialog.cancel":def("escape","Cancel / close","dialog"),"dialog.confirm":def("y","Yes","dialog"),"dialog.deny":def("n","No","dialog"),"dialog.copy":def("c","Copy body","dialog"),"input.submit":def("return","Send","composer"),"input.newline":def("shift+return,ctrl+return,alt+return,ctrl+j","Insert newline","composer"),"sessions.rename":def("ctrl+r","Retitle session","sessions"),"sessions.prev":def("left","Previous source filter","sessions"),"sessions.next":def("right","Next source filter","sessions"),"agents.kill":def("k","Kill subagent","agents"),"agents.history":def("h","Spawn history","agents"),"agents.install":def("i","Install distribution","agents"),"config.save":def("ctrl+s","Write config","config"),"config.mode":def("m","Toggle form \u2194 YAML","config"),"eikon.save":def("ctrl+s","Save eikon","eikon")};var TAB_SCOPES=new Set(["sessions","cron","env","agents","skills","config","eikon"]);function scopesOverlap(a,b2){if(a===b2)return!0;if(a==="global"||b2==="global")return!0;if(a==="list")return TAB_SCOPES.has(b2);if(b2==="list")return TAB_SCOPES.has(a);return!1}var ALIAS={esc:"escape",enter:"return",del:"delete",ins:"insert",space:"space"," ":"space"};function parse2(spec2){if(!spec2||spec2==="none")return[];return spec2.split(",").map(one)}function one(combo){let c={name:"",ctrl:!1,meta:!1,shift:!1,super:!1,leader:!1};for(let raw of combo.replace(/<leader>/g,"leader+").toLowerCase().split("+")){let p=raw.trim();if(!p)continue;if(p==="ctrl")c.ctrl=!0;else if(p==="alt"||p==="meta"||p==="option")c.meta=!0;else if(p==="shift")c.shift=!0;else if(p==="super"||p==="cmd")c.super=!0;else if(p==="leader")c.leader=!0;else c.name=ALIAS[p]??p}return c}function from(key,leader=!1){return{name:key.name===" "?"space":key.name,ctrl:key.ctrl,meta:key.meta,shift:key.shift,super:key.super??!1,leader}}function eq(a,b2){return a.name===b2.name&&a.ctrl===b2.ctrl&&a.meta===b2.meta&&a.shift===b2.shift&&a.super===b2.super&&a.leader===b2.leader}function match(list,key,leader=!1){if(list.length===0)return!1;let k2=from(key,leader);return list.some((c)=>eq(c,k2))}function print(list,lead){let c=list[0];if(!c)return"";let mods=[];if(c.ctrl)mods.push("Ctrl");if(c.meta)mods.push("Alt");if(c.super)mods.push("Super");if(c.shift)mods.push("Shift");let name=LABEL[c.name]??cap(c.name),body=[...mods,name].join("+");if(!c.leader)return body;return lead?`${lead} ${body}`:`<leader> ${body}`}var LABEL={return:"Enter",escape:"Esc",space:"Space",delete:"Del",backspace:"\u232B",up:"\u2191",down:"\u2193",left:"\u2190",right:"\u2192",pageup:"PgUp",pagedown:"PgDn",home:"Home",end:"End",tab:"Tab"};function cap(s){return s.length===1?s.toUpperCase():s.charAt(0).toUpperCase()+s.slice(1)}function toBindings(list,action){return list.map((c)=>({name:c.name,ctrl:c.ctrl||void 0,meta:c.meta||void 0,shift:c.shift||void 0,super:c.super||void 0,action}))}function key(c){return`${c.leader?"L":""}${c.ctrl?"C":""}${c.meta?"M":""}${c.shift?"S":""}${c.super?"W":""}-${c.name}`}var LEADER_MS=2000,Ctx2=import_react22.createContext(null),NO_OVERRIDES=Object.freeze({}),KeysProvider=({children,overrides:fixedOverrides})=>{let renderer=useRenderer(),prefOverrides=usePref("keys"),overrides=fixedOverrides??prefOverrides??NO_OVERRIDES,table=import_react22.useMemo(()=>{let t2=new Map;for(let id of Object.keys(DEFAULTS2))t2.set(id,parse2(overrides[id]??DEFAULTS2[id].chord));return t2},[overrides]),lead=table.get("leader"),leadLabel=print(lead),armed=import_react22.useRef(!1),stolen=import_react22.useRef(null),timer2=import_react22.useRef(null),[,bump]=import_react22.useState(0),disarm=import_react22.useCallback(()=>{if(!armed.current)return;if(armed.current=!1,timer2.current)clearTimeout(timer2.current),timer2.current=null;let f=stolen.current;if(stolen.current=null,f&&!f.isDestroyed&&!renderer.currentFocusedRenderable)f.focus();bump((n)=>n+1)},[renderer]),arm=import_react22.useCallback(()=>{if(armed.current=!0,stolen.current=renderer.currentFocusedRenderable??null,stolen.current?.blur(),timer2.current)clearTimeout(timer2.current);timer2.current=setTimeout(disarm,LEADER_MS),bump((n)=>n+1)},[renderer,disarm]);useKeyboard((key2)=>{if(!armed.current&&match(lead,key2)){arm(),key2.stopPropagation();return}if(armed.current)queueMicrotask(disarm)});let value=import_react22.useMemo(()=>({get leader(){return armed.current},match:(id,key2)=>match(table.get(id)??[],key2,armed.current),print:(id)=>print(table.get(id)??[],leadLabel),chord:(id)=>table.get(id)??[],all:(scope)=>Object.keys(DEFAULTS2).filter((id)=>DEFAULTS2[id].scope===scope).map((id)=>({id,desc:DEFAULTS2[id].desc,scope,chord:table.get(id)??[]})),table}),[table,leadLabel]);return $jsx(Ctx2.Provider,{value,children})},useKeys=makeUse(Ctx2,"useKeys");var import_react24=__toESM(require_react_production(),1);function handleListKey(keys,key2,o){let move=(next)=>{o.setSel((p)=>{let n=Math.max(0,Math.min(o.count-1,next(p)));return o.scrollTo?.(n),n})},pg=o.page??10;if(keys.match("list.up",key2))return move((p)=>p-1),!0;if(keys.match("list.down",key2))return move((p)=>p+1),!0;if(keys.match("list.pageUp",key2))return move((p)=>p-pg),!0;if(keys.match("list.pageDown",key2))return move((p)=>p+pg),!0;if(keys.match("list.home",key2))return move(()=>0),!0;if(keys.match("list.end",key2))return move(()=>o.count-1),!0;if(o.onActivate&&keys.match("list.activate",key2))return o.onActivate(),!0;if(o.onDelete&&keys.match("list.delete",key2))return o.onDelete(),!0;if(o.onRefresh&&keys.match("list.refresh",key2))return o.onRefresh(),!0;if(o.onNew&&keys.match("list.new",key2))return o.onNew(),!0;if(o.onToggle&&keys.match("list.toggle",key2))return o.onToggle(),!0;if(o.onSearch&&keys.match("list.search",key2))return o.onSearch(),!0;return!1}function useListKeys(o){let keys=useKeys();return useKeyboard((key2)=>{if(!(typeof o.active==="function"?o.active():o.active))return;if(handleListKey(keys,key2,o))return;o.also?.(key2,keys)}),keys}function useFollow(prefix,key2){let ref=import_react24.useRef(null),id=(i)=>`${prefix}-row-${key2?.(i)??i}`;return{ref,id,opts:{scrollTo:(n)=>ref.current?.scrollChildIntoView(id(n)),get page(){return Math.max(1,(ref.current?.viewport.height??10)-1)}}}}function conflicts(table){let buckets=new Map;for(let[id,chords]of table)for(let c of chords){let k2=key(c),b2=buckets.get(k2);if(b2)b2.push([id,c]);else buckets.set(k2,[[id,c]])}let out=[];for(let bucket of buckets.values()){if(bucket.length<2)continue;for(let i=0;i<bucket.length;i++)for(let j2=i+1;j2<bucket.length;j2++){let[a,c]=bucket[i],[b2]=bucket[j2];if(scopesOverlap(DEFAULTS2[a].scope,DEFAULTS2[b2].scope))out.push({chord:c,a,b:b2})}}return out}function conflictsWith(table,id){let mine=new Set((table.get(id)??[]).map(key));if(mine.size===0)return[];let scope=DEFAULTS2[id].scope,out=[];for(let[other,chords]of table){if(other===id)continue;if(!scopesOverlap(scope,DEFAULTS2[other].scope))continue;if(chords.some((c)=>mine.has(key(c))))out.push(other)}return out}var import_react26=__toESM(require_react_production(),1);var TabStrip=import_react26.memo(({tabs,active,onChange,hint})=>{let theme=useTheme().theme;return $jsxs("box",{width:"100%",flexDirection:"row",height:1,overflow:"hidden",children:[tabs.map((name,i)=>$jsx("box",{onMouseDown:()=>onChange(i),paddingX:2,marginRight:1,flexShrink:0,backgroundColor:i===active?theme.backgroundElement:void 0,children:$jsx("text",{fg:i===active?theme.primary:theme.textMuted,children:$jsx("strong",{children:name})})},i)),$jsx("box",{flexGrow:1,minWidth:0}),hint?$jsx("box",{paddingX:1,flexShrink:1,minWidth:0,overflow:"hidden",children:$jsx("text",{fg:theme.borderSubtle,children:hint})}):null]})});var TabBar=import_react27.memo(({tabs,activeTab,onTabChange})=>{let keys=useKeys(),hint=`${keys.print("tab.prev")}/${keys.print("tab.next")} or ${keys.print("leader")} N`;return $jsx(TabStrip,{tabs:tabs.map((t2)=>t2.name),active:activeTab,onChange:onTabChange,hint})});var import_react31=__toESM(require_react_production(),1);var import_react28=__toESM(require_react_production(),1);var default_default=`{"type":"header","asset":{"version":"2.0","minVersion":"2.0","width":48,"height":24,"mediaType":"application/vnd.eikon.stream+jsonl"},"name":"nous-girl"}
3672
3672
  {"type":"clip","name":"idle","fps":16,"frameCount":64,"loopFrom":0}
3673
3673
  {"type":"frame","clip":"idle","index":0,"rows":["\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2880\u28C0\u28C0\u28E0\u28E4\u28E4\u28C0\u28C0\u28C0\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2880\u28C0\u28E4\u28E4\u28EC\u28E5\u28C4\u28C0\u2800\u2809\u2819\u283B\u28FF\u28FF\u28FF\u28FF\u28F7\u28F6\u28E4\u2840\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28C0\u28E4\u28FE\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F7\u28E6\u2840\u2800\u2808\u283B\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F7\u28C4\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2880\u28E4\u28FE\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u287F\u287F\u28A6\u2840\u2800\u2808\u28BF\u28FF\u28FF\u28FF\u28FF\u28FF\u28BF\u2857\u2804\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2870\u28FB\u28FF\u28FF\u28FF\u288F\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u287F\u2819\u280F\u2800\u2800\u28EE\u2873\u2800\u2800\u2808\u28BF\u28BF\u283B\u283F\u284F\u2801\u2801\u28F8\u28C4\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u280C\u2808\u2809\u28BA\u283B\u2883\u280A\u2819\u281B\u28A0\u2840\u2880\u2819\u2801\u2801\u2800\u2858\u28F6\u28F7\u28FF\u28F7\u28FE\u2800\u2800\u2808\u28F6\u28C6\u28F3\u28F6\u28EE\u2894\u28FF\u28FF\u2846\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u287C\u28F4\u28B6\u28E4\u28F6\u28FE\u28FC\u28FF\u28FF\u28FF\u28FF\u28BF\u28FF\u28FF\u28FF\u28FE\u28F6\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u2847\u28C0\u28E0\u28F8\u28FF\u28F7\u28FB\u28FF\u28FF\u28FF\u28FF\u28F7\u2840\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u28B0\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u285F\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28AF\u28FF\u28DA\u28FF\u28FF\u28FF\u28BF\u28FF\u28FF\u28FF\u28FF\u28D7\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u28B8\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28BF\u28FF\u28FF\u28FF\u28FF\u2858\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u287F\u28FF\u28FF\u28FF\u28FF\u28FF\u2844\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u28B8\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u287F\u2827\u283B\u281F\u28FB\u281F\u2853\u2808\u281B\u281B\u281B\u281B\u281B\u283F\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F9\u28FF\u28FF\u28FF\u28FF\u28C7\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u283B\u28FF\u287F\u28FF\u28FF\u28C9\u28C1\u2800\u2800\u2800\u2800\u2838\u28BB\u28FF\u2877\u28A6\u2844\u2800\u2800\u2800\u28B9\u28FF\u28FF\u28FF\u28FF\u289F\u28DB\u287B\u28FF\u28FF\u28FF\u28EF\u28FF\u28FF\u28FF\u28FF\u28FF\u2840\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2808\u2819\u280A\u28BB\u28CF\u28BF\u2807\u2800\u2800\u2800\u2800\u282C\u283F\u2825\u280A\u2800\u2800\u2800\u2800\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u287C\u28FF\u28FF\u28FF\u28FF\u28C7\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28F8\u28EF\u280A\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F7\u28BF\u28FF\u28FF\u28FF\u28FF\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28FF\u2847\u2820\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28B8\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u287E\u28FF\u28FF\u28FF\u28FF\u2847\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28FF\u28C7\u2830\u28C4\u28C4\u2840\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28FE\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F7\u28FF\u28FF\u28FF\u28FF\u28FF\u2840\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28B0\u28FF\u28FF\u2846\u2823\u2804\u2808\u2801\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28A0\u28FF\u28FF\u28FF\u28FF\u283B\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FC\u28FF\u28FF\u28B9\u28FF\u28C7\u2800\u2800\u2800\u2800","\u2800\u2800\u28A0\u2800\u2800\u2800\u2800\u28B8\u28FF\u28FF\u28FF\u28C6\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28B8\u28FF\u28FF\u28FF\u284F\u2888\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u2804\u28FF\u28FF\u2840\u2800\u2800\u2800","\u2800\u2800\u28DF\u2800\u2800\u2800\u2800\u28FF\u28FF\u28FF\u28FF\u28FF\u28E6\u28C0\u28C0\u28C0\u28C0\u28E0\u28C4\u2840\u2800\u2800\u28B8\u28FF\u28FF\u28FF\u287E\u281F\u28BF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u2801\u28F9\u28FF\u2847\u2810\u2844\u2800","\u2800\u2880\u28FF\u28E6\u28C0\u28E0\u28FC\u28FF\u28FF\u28FB\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28C4\u2800\u28F8\u28FF\u28FF\u28EF\u2840\u28C0\u28FC\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u287F\u2880\u28FF\u28FF\u2847\u2800\u28F7\u2800","\u2800\u2818\u28DC\u283F\u28FF\u28FF\u283F\u280B\u28F1\u28FF\u28FF\u28FB\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u287E\u280B\u28BF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28E3\u28FE\u28FF\u28FF\u2847\u28A0\u28FF\u2800","\u2800\u2800\u2819\u283F\u28F6\u28E4\u28F6\u28FE\u28FF\u28FF\u288B\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u281B\u288B\u2860\u2886\u2800\u2819\u283F\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u287F\u28A0\u28FF\u280F\u2800","\u2800\u2800\u2800\u2800\u2800\u2809\u28AF\u28C9\u28C9\u28E1\u28FE\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28E7\u2840\u288B\u281D\u2803\u28C0\u28F4\u281F\u282B\u289B\u28ED\u287F\u281A\u280B\u2809\u2801\u2812\u282B\u28DD\u283B\u28FF\u28FF\u28FF\u289F\u28F5\u287F\u280B\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2808\u281B\u283F\u283F\u281B\u2881\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F7\u28E4\u2876\u281F\u2809\u2800\u2880\u28F4\u285F\u2801\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2808\u2833\u28DC\u28BF\u287F\u281F\u280B\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28E0\u28FE\u28FF\u28FF\u28FF\u28FF\u283F\u28FF\u28AF\u287E\u280B\u2800\u2800\u2880\u2854\u2800\u287E\u280B\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2818\u282E\u2805\u2800\u2800\u2800\u2800\u2800\u2800"]}
3674
3674
  {"type":"frame","clip":"idle","index":1,"rows":["\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28C0\u28C0\u28C0\u28E0\u28E0\u28C0\u28C0\u28C0\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28C0\u28E4\u28E4\u28E4\u28E5\u28E4\u28C0\u2800\u2809\u2809\u283B\u28BF\u28FF\u28FF\u28FF\u28F7\u28F6\u28E4\u28C0\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2880\u28E4\u28F6\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F6\u28C4\u2800\u2800\u2819\u28BF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F7\u28E4\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28E0\u28FE\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28DF\u287F\u28B7\u2840\u2800\u2808\u28BB\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28E7\u2880\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2860\u28EB\u287F\u28FF\u28FF\u289F\u28FE\u28FF\u285F\u28FF\u28FF\u28FF\u28FF\u28FF\u280E\u281F\u2800\u2800\u28B4\u287B\u2804\u2800\u2800\u28BB\u28FF\u283F\u28BF\u28FF\u2803\u2809\u28A0\u28E4\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2814\u2804\u2800\u2819\u2833\u280B\u280E\u2809\u281A\u2881\u28C4\u28C0\u28B8\u2809\u2801\u2800\u2848\u28B6\u28FE\u28FF\u28F7\u28FE\u2840\u2800\u2800\u28B6\u28E6\u2874\u28E6\u28F6\u28C2\u28E6\u28BF\u2844\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u28F8\u28F5\u28E6\u28E7\u28F6\u28FE\u28FF\u28FF\u28FF\u28FF\u28FF\u28FB\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28C7\u2880\u28C0\u2878\u28FF\u28FF\u28FB\u28FF\u28F7\u28BE\u28FF\u28FF\u2840\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u28A0\u28F7\u28FF\u28FE\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28CF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28CC\u28FF\u28F0\u28BF\u28FF\u28F7\u28BF\u28FF\u28FF\u28FF\u28FF\u28C7\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u28B8\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28BF\u28FF\u28FF\u28FF\u28FF\u285C\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u285F\u28FF\u28FF\u28FF\u28FF\u28FF\u2843\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2818\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u283F\u2807\u2819\u281B\u287B\u289F\u28CB\u2809\u281B\u281B\u281B\u281B\u281B\u283F\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F9\u28FF\u28FF\u28FF\u28FF\u28F7\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2819\u28BF\u28DF\u28BF\u28FF\u28C1\u28D0\u2800\u2800\u2800\u2800\u2818\u28BB\u28FF\u2877\u28A6\u2844\u2800\u2800\u2800\u28F8\u28FF\u28FF\u28FF\u28FF\u281F\u281B\u283B\u28FF\u28FF\u28FF\u28EF\u28FF\u28FF\u28FF\u28FF\u28FF\u2844\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2809\u2803\u28B9\u28CF\u28BB\u2807\u2800\u2800\u2800\u2800\u2828\u283D\u2825\u280A\u2800\u2800\u2800\u2800\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F9\u28FF\u28FF\u28FF\u28FF\u28C7\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28B8\u28CF\u2801\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2880\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F7\u28BF\u28FF\u28FF\u28FF\u28FF\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28FC\u2807\u2820\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28B8\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u287E\u28FF\u28FF\u28FF\u28FF\u2847\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28FF\u28C7\u2838\u28C4\u28C0\u2840\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28CF\u28FF\u28FF\u28FF\u28FF\u28FF\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28B0\u28FF\u28FF\u2846\u282B\u2800\u2808\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28B8\u28FF\u28FF\u28FF\u28FF\u28B9\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28BB\u28FF\u2847\u2800\u2800\u2800\u2800","\u2800\u2800\u2860\u2800\u2800\u2800\u2800\u28F8\u28FF\u28FF\u28FF\u2844\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28FC\u28FF\u28FF\u28FF\u2803\u2898\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u2808\u28FF\u28FF\u2800\u2800\u2800\u2800","\u2800\u28A0\u28E7\u2800\u2800\u2800\u2880\u28FF\u28FF\u28FF\u28FF\u28FF\u28E6\u28C0\u28C0\u28C0\u28C0\u28E0\u28C4\u2840\u2800\u2800\u28FF\u28FF\u28FF\u28EF\u2876\u281F\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u2801\u28B9\u28FF\u2847\u28A0\u2800\u2800","\u2800\u2808\u28FF\u28F6\u28E4\u28E4\u28FE\u28FF\u287F\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28C4\u2800\u28FF\u28FF\u28FF\u28CF\u2800\u28E0\u28FE\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u287F\u2880\u28FF\u28FF\u2847\u2800\u28E7\u2800","\u2800\u2818\u28CC\u287B\u283F\u283F\u281F\u288B\u28FC\u28FF\u287F\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u287E\u281B\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28E3\u28FE\u28FF\u28FF\u2847\u28B0\u28FF\u2800","\u2800\u2800\u2818\u283B\u28F7\u28F6\u28FE\u28FF\u28FF\u287F\u28B3\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u281B\u288B\u2860\u2886\u2808\u283B\u28BF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u287F\u28A0\u28FF\u2807\u2800","\u2800\u2800\u2800\u2800\u2800\u2808\u28EF\u28C9\u28C1\u28F4\u28FF\u287F\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28E7\u2840\u288B\u281D\u2803\u28C0\u28F4\u281F\u283B\u289B\u28ED\u287F\u281A\u280B\u2809\u2801\u2812\u282B\u28D9\u283B\u28FF\u28FF\u28FF\u285F\u28F1\u28FF\u280B\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2808\u281B\u281B\u281B\u280B\u28F0\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F7\u28E4\u2876\u281F\u2809\u2800\u2880\u28F4\u281F\u2801\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2808\u2833\u28DC\u28BF\u28FF\u283F\u280B\u2801\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28F0\u28FF\u28FF\u28FF\u28FF\u28FF\u283F\u28FF\u28AF\u287E\u280B\u2800\u2800\u2880\u2854\u2880\u287E\u2803\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2818\u283A\u2805\u2800\u2800\u2800\u2800\u2800\u2800"]}
@@ -4068,8 +4068,10 @@ Please report this to https://github.com/markedjs/marked.`,e){let r="<p>An error
4068
4068
  {"type":"frame","clip":"error","index":32,"rows":["\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2880\u28C0\u28C0\u28C0\u28E0\u28E4\u28E4\u28E4\u28E4\u28C0\u28C0\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2880\u28E0\u2876\u281F\u280B\u2809\u2809\u2801\u2801\u2809\u2809\u2809\u281B\u283B\u28BF\u28FF\u28F7\u28E6\u28C0\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2880\u2874\u280B\u28C1\u28E4\u28F6\u28F6\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F6\u28F6\u28E4\u28C0\u2808\u2819\u28BF\u28FF\u28F7\u2844\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28F0\u288F\u2874\u28FA\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u2807\u2822\u2840\u2819\u28BF\u28A7\u2850\u2840\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28FC\u28E3\u280F\u2878\u28BF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28BF\u28BF\u28FF\u283B\u2801\u2809\u2801\u2800\u28AA\u28C0\u2800\u2821\u28C0\u2808\u2844\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28F0\u28FF\u280F\u2840\u2840\u2800\u281B\u281B\u281A\u280B\u2809\u2848\u2801\u2801\u2800\u2840\u28C4\u28C0\u2860\u28C4\u2804\u2850\u28F6\u28FF\u28E7\u2800\u28B9\u28EF\u28FF\u2844\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2880\u28FF\u28DF\u28FE\u28FD\u28A7\u28F6\u28F6\u28FE\u28F4\u28FF\u28FF\u28FF\u28FC\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28DE\u28FF\u28DC\u28FC\u28FF\u28FF\u28C7\u2800\u28FF\u28F7\u28F3\u2840\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28B8\u28FF\u28FE\u28FF\u28FF\u28FE\u28FF\u28FF\u28FF\u28FF\u28FF\u287F\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28DC\u28BB\u28FF\u28FF\u28E7\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u28E4\u28BE\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u2847\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28EF\u28FE\u28FF\u28FA\u28FF\u2846\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u28F8\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28C7\u28B9\u28FF\u28FF\u28FF\u28FF\u284E\u28FF\u28F7\u28FB\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F7\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u28EE\u28FF\u28FF\u28FF\u28FF\u28FF\u287F\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u2804\u283B\u281E\u281B\u287B\u289B\u28C9\u28C9\u28C0\u2819\u281B\u280B\u2809\u28FF\u28FF\u28FF\u28FF\u287F\u28FF\u28FF\u28FF\u28C7\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2819\u28BF\u28FF\u28FF\u28FF\u28FF\u28C7\u2808\u28C9\u287F\u28B2\u28F6\u28C6\u2800\u2800\u2800\u2800\u2800\u2800\u280A\u2899\u28FF\u28FF\u28B9\u2812\u2800\u2800\u28FF\u28FF\u28FF\u28F7\u28F6\u28FE\u28FF\u28FF\u28FF\u2840\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28EF\u28FF\u28FF\u28FF\u28FF\u2840\u2839\u28C0\u2810\u283F\u281F\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2810\u281B\u2813\u2801\u2800\u2800\u2800\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28E7\u2800\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28BF\u28FF\u28FF\u28FF\u28FF\u28C7\u2800\u2800\u2800\u2800\u2800\u2800\u2840\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u2844\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28BF\u28FF\u28FF\u28FF\u28FF\u28FF\u2844\u2800\u2800\u2800\u2800\u2800\u2810\u2800\u2810\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28A0\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F7\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2808\u28FF\u28FF\u28FF\u28FF\u28FF\u28F7\u2840\u2800\u2800\u2800\u2880\u28E0\u28E0\u28C0\u2800\u2800\u2804\u2800\u2800\u2800\u2800\u2800\u2880\u28BE\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u2846\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2880\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F7\u28C4\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2880\u2884\u28E1\u28FC\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u2820\u2840\u2800\u2800","\u2800\u2800\u2800\u2800\u2844\u2800\u2800\u2880\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F7\u28E6\u28C0\u2800\u2800\u2800\u2800\u2800\u2800\u2880\u28A0\u28E2\u2877\u281F\u288B\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u2806\u28B7\u2800\u2800","\u2800\u2800\u2800\u28B8\u28C7\u2800\u2800\u28B8\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F6\u2844\u2810\u2812\u28E8\u2876\u281F\u2809\u2800\u2800\u28B8\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u2803\u28FF\u2806\u2800","\u2800\u2800\u2800\u28B8\u28FF\u28E6\u28C4\u28FC\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28F7\u28F4\u281F\u2809\u2800\u2800\u2800\u2800\u2800\u2808\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FE\u287F\u2800\u2800","\u2800\u2800\u2800\u2808\u28FF\u287F\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28BA\u28FF\u28FF\u28FF\u28FF\u28FF\u285F\u281B\u2829\u28C4\u2852\u2844\u2800\u2800\u2800\u2880\u28E0\u2876\u281F\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u281F\u2801\u2800\u2800","\u2800\u2800\u2800\u2800\u2818\u28BF\u28F6\u28FE\u28FF\u28FF\u28FF\u28FF\u28FF\u28BB\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u2844\u2800\u2827\u2808\u2819\u28C0\u28E0\u2876\u281B\u2801\u2880\u2818\u2889\u28F5\u2836\u280B\u2809\u2809\u2809\u2809\u281B\u28BF\u2841\u2800\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2809\u2899\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u289F\u28FF\u287F\u28B7\u2864\u2816\u283E\u281B\u2809\u2800\u2800\u2880\u2844\u2801\u28F0\u281F\u2801\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2819\u2886\u2800\u2800\u2800\u2800","\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28B8\u281F\u28BF\u28FF\u28FF\u28B7\u287F\u28BF\u285F\u2881\u287E\u280B\u2860\u280A\u2800\u2800\u2800\u2800\u2800\u2800\u28B0\u284F\u2800\u28FC\u280B\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2808\u2883\u2800\u2800\u2800"]}
4069
4069
  `;import{readdirSync as readdirSync4,readFileSync as readFileSync5}from"fs";import{dirname as dirname6,isAbsolute as isAbsolute2,join as join9,relative as relative3,resolve as resolve8}from"path";import{readdirSync as readdirSync2,openSync,readSync,closeSync}from"fs";class EikonCompatibilityError extends Error{problems;constructor(problems){super(problems.map((problem)=>problem.message).join(`
4070
4070
  `));this.name="EikonCompatibilityError",this.problems=problems}}class EikonValidationError extends Error{problems;constructor(problems){super(problems.map((problem)=>problem.message).join(`
4071
- `));this.name="EikonValidationError",this.problems=problems}}var LAUNCH_MAJOR_VERSION=1;var LAUNCH_MEDIA_TYPE="application/vnd.eikon.stream+jsonl",LAUNCH_STREAM_EXTENSION=".eikon",PACKAGE_KIND="eikon.package",PACKAGE_SCHEMA_VERSION="1.0",CATALOG_KIND="eikon.catalog.entry",CATALOG_SCHEMA_VERSION="1.0",CANONICAL_STATES=["idle","listening","thinking","speaking","working","error"],CANONICAL_SIGNALS=CANONICAL_STATES.map((state)=>`state.${state}`);function majorOf(version){if(typeof version==="number")return version;return Number(version.split(".")[0])}function validateLaunchCompatibility(version,extensions={},support={}){let problems=[],major=majorOf(version);if(!Number.isFinite(major)||major!==LAUNCH_MAJOR_VERSION)problems.push({code:"unsupported-version",version:String(version),message:`unsupported Eikon stream version ${version}`});let known=new Set([...support.optional??[],...support.required??[]]);for(let ext of extensions.required??[]){if(known.has(ext))continue;problems.push({code:"unknown-required-extension",extension:ext,message:`unknown required Eikon extension ${ext}`})}return problems}function assertLaunchCompatibility(version,extensions,support){let problems=validateLaunchCompatibility(version,extensions,support);if(problems.length)throw new EikonCompatibilityError(problems)}var FORMAT_VERSION=1;var STATES=CANONICAL_STATES,DEFAULT_CATALOG="https://eikon.liftaris.dev/eikons";var FORBIDDEN_HEADER_KEYS=new Set(["origin","originUrl","origin_url","source","sourceUrl","source_url","editPackageUrl","edit_package_url","generator","generatedBy","packageDigest","package_digest","poster","preview","license","provenance","platform","download","downloadUrl","download_url"]),fail=(line,message)=>{throw new EikonValidationError([{code:"stream",path:`line ${line}`,message:`line ${line}: ${message}`}])},failPath=(path6,message)=>{throw new EikonValidationError([{code:"stream",path:path6,message:`${path6}: ${message}`}])};function row(line,n){try{let value=JSON.parse(line);if(!value||typeof value!=="object"||Array.isArray(value))fail(n,"record must be an object");return value}catch(err){if(err instanceof EikonValidationError)throw err;let msg=err instanceof Error?err.message:String(err);throw new EikonValidationError([{code:"stream-json",path:`line ${n}`,message:`malformed JSON on line ${n}: ${msg}`}])}}var isNum=(value)=>typeof value==="number"&&Number.isFinite(value),isInt=(value)=>isNum(value)&&Math.trunc(value)===value,isStr=(value)=>typeof value==="string"&&value.length>0,isObj=(value)=>!!value&&typeof value==="object"&&!Array.isArray(value),isRows=(value)=>Array.isArray(value)&&value.every((v2)=>typeof v2==="string"),isSignal=(value)=>value.includes(".")&&!value.startsWith(".")&&!value.endsWith(".");function checkCompatibility(version,extensions,n){try{assertLaunchCompatibility(version,extensions)}catch(err){if(err instanceof EikonCompatibilityError)throw new EikonValidationError(err.problems.map((problem)=>({code:problem.code,path:`line ${n}`,message:`line ${n}: ${problem.message}`})));throw err}}function readHeader(record,n){if(record.type!=="header")fail(n,"first record must be header");for(let key2 of Object.keys(record))if(FORBIDDEN_HEADER_KEYS.has(key2))fail(n,`header field "${key2}" is not allowed in launch runtime streams`);if(record.eikon!==LAUNCH_MAJOR_VERSION)fail(n,`header.eikon must be ${LAUNCH_MAJOR_VERSION}`);let sizeRaw=record.size;if(!isObj(sizeRaw))fail(n,"header.size object required");let size=sizeRaw;if(!isInt(size.cols)||size.cols<=0)fail(n,"header.size.cols positive integer required");if(!isInt(size.rows)||size.rows<=0)fail(n,"header.size.rows positive integer required");if(!isStr(record.defaultSignal)||!isSignal(record.defaultSignal))fail(n,"header.defaultSignal namespaced string required");let{defaultSignal,signals:signalsRaw}=record;if(!isObj(signalsRaw))fail(n,"header.signals object required");let signals=signalsRaw;if(!signals[defaultSignal])fail(n,"header.defaultSignal must be declared in header.signals");for(let[signal,raw]of Object.entries(signals)){if(!isSignal(signal))fail(n,`header.signals key "${signal}" must be namespaced`);if(!isObj(raw))fail(n,`header.signals.${signal} object required`);let mapping=raw;if(!isStr(mapping.clip))fail(n,`header.signals.${signal}.clip string required`);if(mapping.fallback!=null&&(!isStr(mapping.fallback)||!isSignal(mapping.fallback)))fail(n,`header.signals.${signal}.fallback namespaced string required`)}return record}function readClip(record,n){if(!isStr(record.name))fail(n,"clip.name string required");if(!isNum(record.fps)||record.fps<=0)fail(n,"clip.fps positive number required");if(record.frameCount!=null&&(!isInt(record.frameCount)||record.frameCount<0))fail(n,"clip.frameCount non-negative integer required");if(record.loopFrom!=null&&(!isInt(record.loopFrom)||record.loopFrom<0))fail(n,"clip.loopFrom non-negative integer required");if("fallback"in record)fail(n,"clip.fallback is not part of the launch contract; use header.signals fallback");return record}function readFrame(record,n){if(!isStr(record.clip))fail(n,"frame.clip string required");if(!isInt(record.index)||record.index<0)fail(n,"frame.index non-negative integer required");if(!isRows(record.rows))fail(n,"frame.rows string array required");return record}function readExtension(record,n){if(!isStr(record.extension))fail(n,"extension.extension string required");if(!("payload"in record))fail(n,"extension.payload required");return record}function checkFrameSize(record,header,n){if(record.rows.length!==header.size.rows)fail(n,`frame height ${record.rows.length} does not match size.rows ${header.size.rows}`);for(let r of record.rows)if(Array.from(r).length!==header.size.cols)fail(n,`frame width ${Array.from(r).length} does not match size.cols ${header.size.cols}`)}function getState(states,clip,line){let state=states.get(clip);if(state===void 0)fail(line,`frame for clip "${clip}" before clip declaration`);return state}function validateFallbackGraph(header){for(let signal of Object.keys(header.signals)){let seen=new Set,current=signal;while(current){if(seen.has(current))failPath(`header.signals.${signal}.fallback`,`fallback cycle detected: ${[...seen,current].join(" -> ")}`);seen.add(current),current=header.signals[current]?.fallback}}}function resolveSignalInternal(header,clips,signal){let fallbackPath=[],seen=new Set,current=header.signals[signal]?signal:header.defaultSignal;if(!header.signals[signal])fallbackPath.push(signal);while(!0){if(seen.has(current))failPath(`header.signals.${signal}.fallback`,`fallback cycle detected: ${[...seen,current].join(" -> ")}`);seen.add(current),fallbackPath.push(current);let mapping=header.signals[current];if(!mapping)failPath(`header.signals.${current}`,"signal mapping missing");let resolvedMapping=mapping;if(clips.has(resolvedMapping.clip))return{signal:current,clip:resolvedMapping.clip,mapping:resolvedMapping,fallbackPath};let next=resolvedMapping.fallback??header.defaultSignal;if(next===current)failPath(`header.signals.${current}`,`signal maps to missing clip "${resolvedMapping.clip}" and fallback loops to itself`);current=next}}function validateSignalResolution(header,clips){validateFallbackGraph(header);for(let signal of Object.keys(header.signals))resolveSignalInternal(header,clips,signal);resolveSignalInternal(header,clips,header.defaultSignal)}function parseLaunchStream(text2){let lines2=text2.split(`
4072
- `),records=[],head,building=new Map;for(let i=0;i<lines2.length;i++){let line=lines2[i];if(!line?.trim())continue;let n=i+1,rec=row(line,n);if(!head){head=readHeader(rec,n),checkCompatibility(head.eikon,head.extensions,n),records.push(head);continue}if(rec.type==="header")fail(n,"duplicate header record");if(rec.type==="clip"){let item=readClip(rec,n);if(checkCompatibility(head.eikon,item.extensions,n),building.has(item.name))fail(n,`duplicate clip "${item.name}"`);building.set(item.name,{record:item,frames:[],seen:new Set}),records.push(item);continue}if(rec.type==="frame"){let item=readFrame(rec,n);checkCompatibility(head.eikon,item.extensions,n),checkFrameSize(item,head,n);let state=getState(building,item.clip,n);if(state.seen.has(item.index))fail(n,`duplicate frame ${item.index} for clip "${item.clip}"`);if(item.index!==state.frames.length)fail(n,`frame index ${item.index} out of order for clip "${item.clip}"`);state.seen.add(item.index),state.frames.push(item.rows),records.push(item);continue}if(rec.type==="extension"){let item=readExtension(rec,n);records.push(item);continue}fail(n,"record.type must be header, clip, frame, or extension")}if(!head)fail(1,"empty stream");let header=head,clips=new Map,states=[];for(let[name,state]of building){let expected=state.record.frameCount;if(expected!=null&&expected!==state.frames.length)throw new EikonValidationError([{code:"stream-frame-count",path:`clip ${name}`,message:`clip "${name}": frameCount=${expected} but got ${state.frames.length}`}]);if(state.record.loopFrom!=null&&state.record.loopFrom>state.frames.length)failPath(`clip ${name}`,`loopFrom ${state.record.loopFrom} exceeds frame count ${state.frames.length}`);states.push(name),clips.set(name,{fps:state.record.fps,frames:state.frames,loopFrom:Math.max(0,Math.min(state.record.loopFrom??0,state.frames.length)),...state.record.color?{color:state.record.color}:{}})}validateSignalResolution(header,clips);let meta={version:header.eikon,name:header.title??header.id??"unnamed",title:header.title,author:header.author?.name,description:header.description,width:header.size.cols,height:header.size.rows,states};return{header,meta,clips,records}}var num=(v2,d2)=>typeof v2==="number"&&isFinite(v2)?v2:d2,str=(v2,d2="")=>typeof v2==="string"?v2:d2;function row2(line,n){try{return JSON.parse(line)}catch(e){let msg=e instanceof Error?e.message:String(e);throw Error(`eikon: malformed JSON on line ${n}: ${msg}`)}}function median(xs){let s=[...xs].sort((a,b2)=>a-b2),m2=s.length>>1;return s.length%2?s[m2]:(s[m2-1]+s[m2])/2}function parse3(text2){let lines2=text2.split(`
4071
+ `));this.name="EikonValidationError",this.problems=problems}}var LAUNCH_MAJOR_VERSION=1;var LAUNCH_MEDIA_TYPE="application/vnd.eikon.stream+jsonl",LAUNCH_STREAM_EXTENSION=".eikon",PACKAGE_KIND="eikon.package",PACKAGE_SCHEMA_VERSION="1.0",CATALOG_KIND="eikon.catalog.entry",CATALOG_SCHEMA_VERSION="1.0",CANONICAL_STATES=["idle","listening","thinking","speaking","working","error"],CANONICAL_SIGNALS=CANONICAL_STATES.map((state)=>`state.${state}`);function canonicalSignal(state){return`state.${state}`}function defaultSignalMappings(){return Object.fromEntries(CANONICAL_STATES.map((state)=>[canonicalSignal(state),state==="idle"?{clip:state}:{clip:state,fallback:"state.idle"}]))}function majorOf(version){if(typeof version==="number")return version;return Number(version.split(".")[0])}function validateLaunchCompatibility(version,extensions={},support={}){let problems=[],major=majorOf(version);if(!Number.isFinite(major)||major!==LAUNCH_MAJOR_VERSION)problems.push({code:"unsupported-version",version:String(version),message:`unsupported Eikon stream version ${version}`});let known=new Set([...support.optional??[],...support.required??[]]);for(let ext of extensions.required??[]){if(known.has(ext))continue;problems.push({code:"unknown-required-extension",extension:ext,message:`unknown required Eikon extension ${ext}`})}return problems}function assertLaunchCompatibility(version,extensions,support){let problems=validateLaunchCompatibility(version,extensions,support);if(problems.length)throw new EikonCompatibilityError(problems)}var FORMAT_VERSION=1;var STATES=CANONICAL_STATES,DEFAULT_CATALOG="https://eikon.liftaris.dev/eikons";var FORBIDDEN_HEADER_KEYS=new Set(["origin","originUrl","origin_url","source","sourceUrl","source_url","editPackageUrl","edit_package_url","generator","generatedBy","packageDigest","package_digest","poster","preview","license","provenance","platform","download","downloadUrl","download_url"]),fail=(line,message)=>{throw new EikonValidationError([{code:"stream",path:`line ${line}`,message:`line ${line}: ${message}`}])},failPath=(path6,message)=>{throw new EikonValidationError([{code:"stream",path:path6,message:`${path6}: ${message}`}])};function row(line,n){try{let value=JSON.parse(line);if(!value||typeof value!=="object"||Array.isArray(value))fail(n,"record must be an object");return value}catch(err){if(err instanceof EikonValidationError)throw err;let msg=err instanceof Error?err.message:String(err);throw new EikonValidationError([{code:"stream-json",path:`line ${n}`,message:`malformed JSON on line ${n}: ${msg}`}])}}var isNum=(value)=>typeof value==="number"&&Number.isFinite(value),isInt=(value)=>isNum(value)&&Math.trunc(value)===value,isStr=(value)=>typeof value==="string"&&value.length>0,isObj=(value)=>!!value&&typeof value==="object"&&!Array.isArray(value),isRows=(value)=>Array.isArray(value)&&value.every((v2)=>typeof v2==="string"),isSignal=(value)=>value.includes(".")&&!value.startsWith(".")&&!value.endsWith(".");function checkCompatibility(version,extensions,n){try{assertLaunchCompatibility(version,extensions)}catch(err){if(err instanceof EikonCompatibilityError)throw new EikonValidationError(err.problems.map((problem)=>({code:problem.code,path:`line ${n}`,message:`line ${n}: ${problem.message}`})));throw err}}function readHeader(record,n){if(record.type!=="header")fail(n,"first record must be header");for(let key2 of Object.keys(record))if(FORBIDDEN_HEADER_KEYS.has(key2))fail(n,`header field "${key2}" is not allowed in launch runtime streams`);if(record.eikon!==LAUNCH_MAJOR_VERSION)fail(n,`header.eikon must be ${LAUNCH_MAJOR_VERSION}`);let sizeRaw=record.size;if(!isObj(sizeRaw))fail(n,"header.size object required");let size=sizeRaw;if(!isInt(size.cols)||size.cols<=0)fail(n,"header.size.cols positive integer required");if(!isInt(size.rows)||size.rows<=0)fail(n,"header.size.rows positive integer required");if(!isStr(record.defaultSignal)||!isSignal(record.defaultSignal))fail(n,"header.defaultSignal namespaced string required");let{defaultSignal,signals:signalsRaw}=record;if(!isObj(signalsRaw))fail(n,"header.signals object required");let signals=signalsRaw;if(!signals[defaultSignal])fail(n,"header.defaultSignal must be declared in header.signals");for(let[signal,raw]of Object.entries(signals)){if(!isSignal(signal))fail(n,`header.signals key "${signal}" must be namespaced`);if(!isObj(raw))fail(n,`header.signals.${signal} object required`);let mapping=raw;if(!isStr(mapping.clip))fail(n,`header.signals.${signal}.clip string required`);if(mapping.fallback!=null&&(!isStr(mapping.fallback)||!isSignal(mapping.fallback)))fail(n,`header.signals.${signal}.fallback namespaced string required`)}return record}function readClip(record,n){if(!isStr(record.name))fail(n,"clip.name string required");if(!isNum(record.fps)||record.fps<=0)fail(n,"clip.fps positive number required");if(record.frameCount!=null&&(!isInt(record.frameCount)||record.frameCount<0))fail(n,"clip.frameCount non-negative integer required");if(record.loopFrom!=null&&(!isInt(record.loopFrom)||record.loopFrom<0))fail(n,"clip.loopFrom non-negative integer required");if("fallback"in record)fail(n,"clip.fallback is not part of the launch contract; use header.signals fallback");return record}function readFrame(record,n){if(!isStr(record.clip))fail(n,"frame.clip string required");if(!isInt(record.index)||record.index<0)fail(n,"frame.index non-negative integer required");if(!isRows(record.rows))fail(n,"frame.rows string array required");return record}function readExtension(record,n){if(!isStr(record.extension))fail(n,"extension.extension string required");if(!("payload"in record))fail(n,"extension.payload required");return record}function checkFrameSize(record,header,n){if(record.rows.length!==header.size.rows)fail(n,`frame height ${record.rows.length} does not match size.rows ${header.size.rows}`);for(let r of record.rows)if(Array.from(r).length!==header.size.cols)fail(n,`frame width ${Array.from(r).length} does not match size.cols ${header.size.cols}`)}function getState(states,clip,line){let state=states.get(clip);if(state===void 0)fail(line,`frame for clip "${clip}" before clip declaration`);return state}function validateFallbackGraph(header){for(let signal of Object.keys(header.signals)){let seen=new Set,current=signal;while(current){if(seen.has(current))failPath(`header.signals.${signal}.fallback`,`fallback cycle detected: ${[...seen,current].join(" -> ")}`);seen.add(current),current=header.signals[current]?.fallback}}}function resolveSignalInternal(header,clips,signal){let fallbackPath=[],seen=new Set,current=header.signals[signal]?signal:header.defaultSignal;if(!header.signals[signal])fallbackPath.push(signal);while(!0){if(seen.has(current))failPath(`header.signals.${signal}.fallback`,`fallback cycle detected: ${[...seen,current].join(" -> ")}`);seen.add(current),fallbackPath.push(current);let mapping=header.signals[current];if(!mapping)failPath(`header.signals.${current}`,"signal mapping missing");let resolvedMapping=mapping;if(clips.has(resolvedMapping.clip))return{signal:current,clip:resolvedMapping.clip,mapping:resolvedMapping,fallbackPath};let next=resolvedMapping.fallback??header.defaultSignal;if(next===current)failPath(`header.signals.${current}`,`signal maps to missing clip "${resolvedMapping.clip}" and fallback loops to itself`);current=next}}function validateSignalResolution(header,clips){validateFallbackGraph(header);for(let signal of Object.keys(header.signals))resolveSignalInternal(header,clips,signal);resolveSignalInternal(header,clips,header.defaultSignal)}function parseLaunchStream(text2){let lines2=text2.split(`
4072
+ `),records=[],head,building=new Map;for(let i=0;i<lines2.length;i++){let line=lines2[i];if(!line?.trim())continue;let n=i+1,rec=row(line,n);if(!head){head=readHeader(rec,n),checkCompatibility(head.eikon,head.extensions,n),records.push(head);continue}if(rec.type==="header")fail(n,"duplicate header record");if(rec.type==="clip"){let item=readClip(rec,n);if(checkCompatibility(head.eikon,item.extensions,n),building.has(item.name))fail(n,`duplicate clip "${item.name}"`);building.set(item.name,{record:item,frames:[],seen:new Set}),records.push(item);continue}if(rec.type==="frame"){let item=readFrame(rec,n);checkCompatibility(head.eikon,item.extensions,n),checkFrameSize(item,head,n);let state=getState(building,item.clip,n);if(state.seen.has(item.index))fail(n,`duplicate frame ${item.index} for clip "${item.clip}"`);if(item.index!==state.frames.length)fail(n,`frame index ${item.index} out of order for clip "${item.clip}"`);state.seen.add(item.index),state.frames.push(item.rows),records.push(item);continue}if(rec.type==="extension"){let item=readExtension(rec,n);records.push(item);continue}fail(n,"record.type must be header, clip, frame, or extension")}if(!head)fail(1,"empty stream");let header=head,clips=new Map,states=[];for(let[name,state]of building){let expected=state.record.frameCount;if(expected!=null&&expected!==state.frames.length)throw new EikonValidationError([{code:"stream-frame-count",path:`clip ${name}`,message:`clip "${name}": frameCount=${expected} but got ${state.frames.length}`}]);if(state.record.loopFrom!=null&&state.record.loopFrom>state.frames.length)failPath(`clip ${name}`,`loopFrom ${state.record.loopFrom} exceeds frame count ${state.frames.length}`);states.push(name),clips.set(name,{fps:state.record.fps,frames:state.frames,loopFrom:Math.max(0,Math.min(state.record.loopFrom??0,state.frames.length)),...state.record.color?{color:state.record.color}:{}})}validateSignalResolution(header,clips);let meta={version:header.eikon,name:header.title??header.id??"unnamed",title:header.title,author:header.author?.name,description:header.description,width:header.size.cols,height:header.size.rows,states};return{header,meta,clips,records}}function serializeLaunchStream(records){if(!records.length)throw new EikonValidationError([{code:"stream",path:"records",message:"stream requires records"}]);let text2=records.map((record)=>JSON.stringify(record)).join(`
4073
+ `)+`
4074
+ `;return parseLaunchStream(text2),text2}var num=(v2,d2)=>typeof v2==="number"&&isFinite(v2)?v2:d2,str=(v2,d2="")=>typeof v2==="string"?v2:d2;function row2(line,n){try{return JSON.parse(line)}catch(e){let msg=e instanceof Error?e.message:String(e);throw Error(`eikon: malformed JSON on line ${n}: ${msg}`)}}function median(xs){let s=[...xs].sort((a,b2)=>a-b2),m2=s.length>>1;return s.length%2?s[m2]:(s[m2-1]+s[m2])/2}function parse3(text2){let lines2=text2.split(`
4073
4075
  `);if(!lines2[0]?.trim())throw Error("eikon: empty file (no header on line 1)");let head=row2(lines2[0],1);if(head.type==="header")return parseLaunchStream(text2);let meta={...head,version:num(head.eikon??head.version,1),name:str(head.name,"unnamed"),author:typeof head.author==="string"?head.author:void 0,glyph:typeof head.glyph==="string"?head.glyph:void 0,width:num(head.width,0),height:num(head.height,0),states:Array.isArray(head.states)?head.states:[]},clips=new Map,cur=null,seal=()=>{if(!cur)return;let fps=cur.fps??(cur.durs.length?Math.round(1000/median(cur.durs))||12:12),n=cur.frames.length,raw=cur.loop===!1?n:cur.loopFrom;clips.set(cur.name,{fps,frames:cur.frames,loopFrom:Math.max(0,Math.min(raw,n))}),cur=null};for(let i=1;i<lines2.length;i++){let line=lines2[i];if(!line||!line.trim())continue;let obj=row2(line,i+1);if(typeof obj.state==="string"){seal(),cur={name:obj.state,fps:typeof obj.fps==="number"?obj.fps:void 0,loopFrom:typeof obj.loop_from==="number"?Math.trunc(obj.loop_from):0,loop:typeof obj.loop==="boolean"?obj.loop:void 0,frames:[],durs:[]};continue}if(!cur)continue;let data2=typeof obj.data==="string"?obj.data.split(`
4074
4076
  `):Array.isArray(obj.lines)?obj.lines:[];cur.frames.push(data2);let ms2=num(obj.duration_ms,0)||num(obj.pause,0)*1000;if(ms2>0)cur.durs.push(ms2)}if(seal(),meta.states.length===0)meta.states=Array.from(clips.keys());return{meta,clips}}function poster(e){return(e.clips.get("idle")??e.clips.values().next().value)?.frames[0]?.join(`
4075
4077
  `)??""}function peek2(path6){let fd=openSync(path6,"r");try{let buf=Buffer.alloc(8192),n=readSync(fd,buf,0,buf.length,0),first=buf.toString("utf8",0,n).split(`
@@ -4135,21 +4137,18 @@ Moves to 'archived' and ends any open run. Children stay; their dependency on th
4135
4137
  `);return}if(key2.raw&&key2.raw.length===1&&key2.raw>=" "){setYaml((prev)=>prev+key2.raw);return}return}if(searching){if(key2.name==="escape"){setSearching(!1),setQuery(""),setCursor(0);return}if(key2.name==="backspace"){setQuery((prev)=>prev.slice(0,-1)),setCursor(0);return}if(key2.name==="up"){setCursor((c)=>Math.max(0,c-1));return}if(key2.name==="down"){setCursor((c)=>Math.min(count3-1,c+1));return}if(key2.raw&&key2.raw.length===1&&key2.raw>=" "){setQuery((prev)=>prev+key2.raw),setCursor(0);return}return}if(editing){let f2=fields[cursor];if(key2.name==="escape"){if(setEditing(!1),setBuf(""),f2)setErr((e)=>{let{[f2.key]:_2,...rest}=e;return rest});return}if(key2.name==="return"){if(f2){let msg=check(f2.key,buf);if(msg){setErr((e)=>({...e,[f2.key]:msg}));return}setErr((e)=>{let{[f2.key]:_2,...rest}=e;return rest});let val=f2.type==="number"?Number(buf)||0:buf;update(f2.key,val)}setEditing(!1),setBuf("");return}if(key2.name==="backspace"){setBuf((prev)=>prev.slice(0,-1));return}if(key2.raw&&key2.raw.length===1){setBuf((prev)=>prev+key2.raw);return}return}if(key2.name==="tab"){setFocus((f2)=>f2==="categories"?"fields":"categories");return}if(keys.match("list.search",key2)){setSearching(!0),setQuery(""),setCursor(0);return}if(focus==="categories"){if(key2.name==="up"){setCat((c)=>{let n=Math.max(0,c-1);return catFollow.opts.scrollTo(n),n}),setCursor(0);return}if(key2.name==="down"){setCat((c)=>{let n=Math.min(groups.length-1,c+1);return catFollow.opts.scrollTo(n),n}),setCursor(0);return}if(key2.name==="return"){setFocus("fields");return}return}if(onSlots){let s=slots[cursor];if(handleListKey(keys,key2,{count:count3,setSel:setCursor,...follow.opts,onActivate:s?()=>pick(s):void 0,onRefresh:()=>{load4(),toast.show({variant:"info",message:"Reloaded",duration:1000})}})||!s)return;if(key2.raw==="x")return unset(s);if(key2.raw==="X")return void unsetAll();return}let f=fields[cursor],writable=!managed;if(handleListKey(keys,key2,{count:count3,setSel:setCursor,...follow.opts,onRefresh:()=>{load4(),toast.show({variant:"info",message:"Reloaded",duration:1000})},onToggle:writable&&f?.type==="boolean"?()=>update(f.key,!f.value):void 0,onActivate:f&&writable&&(f.type==="string"||f.type==="number")?()=>{setEditing(!0),setBuf(String(f.value??""))}:void 0})||!f||!writable)return;if(f.type==="select"&&f.options){let idx=f.options.indexOf(String(f.value));if(key2.raw==="l"||key2.raw==="]"){update(f.key,f.options[(idx+1)%f.options.length]);return}if(key2.raw==="h"||key2.raw==="["){update(f.key,f.options[(idx-1+f.options.length)%f.options.length]);return}}}),mode==="yaml")return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsx(TabShell,{title:"Config \xB7 YAML",children:$jsx("scrollbox",{scrollY:!0,flexGrow:1,children:$jsxs("text",{wrapMode:"word",children:[$jsx("span",{fg:theme.text,children:yaml}),$jsx("span",{fg:theme.accent,children:"\u2588"})]})})}),$jsx(HintBar,{pairs:[[keys.print("config.mode"),"form"],[keys.print("config.save"),"save"]]})]});return $jsxs("box",{flexDirection:"column",flexGrow:1,children:[searching?$jsx("box",{height:1,paddingLeft:1,paddingRight:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.accent,children:"\u2503 "}),$jsx("span",{fg:theme.text,children:query}),$jsx("span",{fg:theme.accent,children:"\u2588"}),$jsx("span",{fg:theme.textMuted,children:` ${count3} of ${all.length} \xB7 \u2191\u2193 nav \xB7 Esc close`})]})}):null,$jsxs("box",{flexDirection:"row",flexGrow:1,children:[searching?null:$jsx(TabShell,{title:"Config",grow:1,focus:focus==="categories",children:$jsx("scrollbox",{ref:catFollow.ref,scrollY:!0,flexGrow:1,children:groups.map((c,i)=>{let sel=i===cat,hot=sel&&focus==="categories",items=grouped.get(c)??[],n=c==="models"?slots.length:items.length,catDirty=items.some((f)=>changed(f.key));return $jsx("box",{id:catFollow.id(i),backgroundColor:hot?theme.backgroundElement:void 0,onMouseDown:()=>{setCat(i),setCursor(0),setFocus("categories")},children:$jsxs("text",{children:[$jsx("span",{fg:catDirty?theme.warning:theme.textMuted,children:catDirty?"\u25CF":" "}),$jsxs("span",{fg:hot?theme.accent:sel?theme.primary:theme.text,children:[sel?"\u25B8 ":" ",c]}),$jsx("span",{fg:theme.textMuted,children:` (${n})`})]})},c)})})}),$jsxs(TabShell,{title:onSlots?"models \xB7 applies immediately":searching?"Search":nChanged>0?`${active} \xB7 ${nChanged} unsaved`:active,grow:3,focus:focus==="fields"||searching,children:[managed?$jsxs("box",{height:1,flexDirection:"row",gap:1,children:[$jsx("text",{fg:theme.warning,children:"\uD83D\uDD12 managed install \u2014 edit"}),$jsx(FileLink,{source:makeSource("config.yaml"),children:"config.yaml"}),$jsx("text",{fg:theme.warning,children:"via configuration.nix"})]}):null,onSlots?$jsxs("box",{flexDirection:"column",flexGrow:1,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Auxiliary tasks handle side-jobs. 'auto' = use main model. Per-task api_key/base_url/timeout live in the 'auxiliary' category."})}),$jsx("box",{height:1}),$jsx("scrollbox",{ref:follow.ref,scrollY:!0,flexGrow:1,verticalScrollbarOptions:VBAR,children:slots.map((s,i)=>$jsx(SlotRow,{id:follow.id(i),s,on:i===cursor&&focus==="fields"},s.key))})]},"slots"):$jsxs($Fragment,{children:[$jsxs(Hdr,{children:[$jsx(Col,{w:4,fg:theme.textMuted,children:""}),searching?$jsx(Col,{w:12,fg:theme.textMuted,bold:!0,children:"Category"}):null,$jsx(Col,{w:40,fg:theme.textMuted,bold:!0,children:"Field"}),$jsx(Col,{grow:!0,min:6,fg:theme.textMuted,bold:!0,children:"Value"}),$jsx(Col,{w:2,fg:theme.textMuted,children:""}),$jsx(Col,{w:9,fg:theme.textMuted,children:""})]}),$jsx("box",{height:1}),count3===0?$jsx("box",{flexGrow:1,padding:2,children:$jsx("text",{fg:theme.textMuted,children:searching?"No matching fields":"No fields in this category"})},"empty"):$jsx("scrollbox",{ref:follow.ref,scrollY:!0,flexGrow:1,verticalScrollbarOptions:VBAR,children:secs.reduce((acc2,s)=>{if(s.head!==null)acc2.out.push($jsx("box",{height:1,marginTop:acc2.base>0?1:0,children:$jsxs("text",{fg:theme.textMuted,children:["\u2500 ",s.head," "]})},`\xA7${s.head}`));return s.items.forEach((f,j2)=>{let i=acc2.base+j2;acc2.out.push($jsx(FieldRow,{id:follow.id(i),field:f,active:i===cursor&&(focus==="fields"||searching),changed:changed(f.key),editing:editing&&i===cursor,buf,readonly:!!managed,error:err[f.key],badge:searching?groupOf(f.key):void 0},f.key))}),acc2.base+=s.items.length,acc2},{base:0,out:[]}).out},"list")]})]})]}),managed?$jsx(HintBar,{raw:`read-only \xB7 managed by ${managed}`}):onSlots?$jsx(HintBar,{pairs:[["\u2191\u2193","nav"],["Enter","pick"],["x","reset"],["X","reset-all"],["Tab","categories"]]}):focus==="categories"&&!searching?$jsx(HintBar,{pairs:[["\u2191\u2193","select"],["Tab","fields"]]}):$jsx(HintBar,{pairs:[[keys.print("config.mode"),"yaml"],["Tab","categories"],["\u2191\u2193","nav"],[keys.print("list.search"),"search"],[keys.print("config.save"),"save"]],suffix:nChanged>0?`\u25CF ${nChanged} unsaved`:void 0})]})});var import_react88=__toESM(require_react_production(),1);var import_react86=__toESM(require_react_production(),1);var iso2=(s)=>{if(!s)return null;let t2=Date.parse(s);return Number.isFinite(t2)?Math.floor(t2/1000):null},parseList=(stdout)=>stdout.split(`
4136
4138
  `).map((s)=>s.trim()).filter((s)=>s.length>0&&!s.startsWith("(")),CuratorDialog=()=>{let{theme,syntaxStyle}=useTheme(),gw=useGateway(),toast=useToast(),dialog=useDialog(),state2=useHome("curatorState"),cfg=useHome("config")?.curator,[report2,setReport]=import_react86.useState(null),[loaded,setLoaded]=import_react86.useState(!1),[busy,setBusy]=import_react86.useState(null),[archived,setArchived]=import_react86.useState([]),[mode,setMode]=import_react86.useState("report"),[sel,setSel]=import_react86.useState(0),sb=import_react86.useRef(null);import_react86.useEffect(()=>{readLatestCuratorReport().then((r)=>{setReport(r),setLoaded(!0)}).catch(()=>setLoaded(!0))},[]);let refreshArchived=import_react86.useCallback(()=>{gw.request("shell.exec",{command:"hermes curator list-archived"}).then((r)=>{if(r.code===0)setArchived(parseList(r.stdout))}).catch(()=>{})},[gw]);import_react86.useEffect(()=>{refreshArchived()},[refreshArchived]);let sh=import_react86.useCallback((verb,ok)=>{if(busy)return;setBusy(verb),gw.request("shell.exec",{command:`hermes curator ${verb}`}).then((r)=>{if(r.code!==0)throw Error((r.stderr||r.stdout||`exit ${r.code}`).trim());toast.show({variant:"success",message:ok}),home2.invalidate("curatorState")}).catch((e)=>toast.show({variant:"error",message:trunc5(e.message,120)})).finally(()=>setBusy(null))},[gw,toast,busy]),restore=import_react86.useCallback((name)=>{if(busy)return;setBusy("restore"),gw.request("shell.exec",{command:`hermes curator restore ${name}`}).then((r)=>{if(r.code!==0)throw Error((r.stderr||r.stdout||`exit ${r.code}`).trim());toast.show({variant:"success",message:`Restored ${name}`}),setArchived((prev)=>prev.filter((n)=>n!==name)),setSel((s)=>Math.max(0,s-1))}).catch((e)=>toast.show({variant:"error",message:trunc5(e.message,120)})).finally(()=>setBusy(null))},[gw,toast,busy]);useKeyboard((key2)=>{if(mode==="archived"){if(key2.name==="escape"){setMode("report");return}if(key2.raw==="a"){setMode("report");return}if(key2.name==="up")return setSel((s)=>Math.max(0,s-1));if(key2.name==="down")return setSel((s)=>Math.min(archived.length-1,s+1));if(key2.name==="return"){let name=archived[sel];if(name)restore(name);return}return}if(key2.name==="escape")return dialog.clear();if(key2.raw==="r")return sh("run","Curator run started (background)");if(key2.raw==="p")return state2?.paused?sh("resume","Curator resumed"):sh("pause","Curator paused");if(key2.raw==="a"&&archived.length>0)setSel(0),setMode("archived")}),import_react86.useEffect(()=>{if(mode==="archived")sb.current?.scrollChildIntoView(`arch-${sel}`)},[sel,mode]);let last3=iso2(state2?.last_run_at??null),due=last3&&cfg?last3+cfg.interval_hours*3600:null,status=cfg?.enabled===!1?"disabled":state2?.paused?"paused":"enabled",tint=status==="enabled"?theme.success:status==="paused"?theme.warning:theme.textMuted;return $jsxs("box",{flexDirection:"column",width:120,height:34,children:[$jsxs("box",{height:1,flexDirection:"row",children:[$jsxs("text",{children:[$jsx("span",{fg:theme.primary,children:$jsx("strong",{children:"Skill Curator"})}),$jsx("span",{fg:tint,children:` \xB7 ${status}`})]}),busy?$jsx("box",{marginLeft:2,children:$jsx(Spinner,{color:theme.textMuted,label:busy})}):null]}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:state2?`${state2.run_count} run${state2.run_count===1?"":"s"}${last3?" \xB7 last "+ago(last3):" \xB7 never"} \xB7 Esc to close`:"No curator state yet \xB7 Esc to close"})}),$jsx("box",{height:1}),$jsxs("box",{flexDirection:"row",flexGrow:1,gap:2,children:[$jsxs("box",{flexDirection:"column",width:40,height:"100%",flexShrink:0,children:[$jsx(KVBlock,{rows:[["Next run",status!=="enabled"?`\u2014 (${status})`:due?until(due):"when idle"],["Last run",last3?ago(last3):"never"],["Duration",state2?.last_run_duration_seconds?dur2(state2.last_run_duration_seconds):void 0],["Archived",archived.length>0?String(archived.length):void 0]]}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Config \xB7 edit in Config tab"})}),$jsx(KVBlock,{rows:[["Interval",cfg?`${cfg.interval_hours}h`:"\u2014"],["Stale after",cfg?`${cfg.stale_after_days}d`:"\u2014"],["Archive after",cfg?`${cfg.archive_after_days}d`:"\u2014"]]}),$jsx("box",{height:1}),$jsxs("box",{flexDirection:"column",children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.accent,children:"r "}),$jsx("span",{fg:theme.text,children:"run now"}),$jsx("span",{fg:theme.textMuted,children:" (background)"})]})}),$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.accent,children:"p "}),$jsx("span",{fg:theme.text,children:state2?.paused?"resume":"pause"})]})}),archived.length>0?$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.accent,children:"a "}),$jsx("span",{fg:theme.text,children:"archived skills"}),$jsx("span",{fg:theme.textMuted,children:` (${archived.length})`})]})}):null]}),state2?.last_run_summary?$jsxs($Fragment,{children:[$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Last run"})}),$jsx("scrollbox",{scrollY:!0,flexGrow:1,children:$jsx("markdown",{content:state2.last_run_summary,fg:theme.markdownText,syntaxStyle})})]}):null]}),mode==="archived"?$jsxs("box",{flexDirection:"column",flexGrow:1,height:"100%",minWidth:0,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.info,children:$jsx("strong",{children:`\u25BE Archived skills (${archived.length})`})})}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"\u2191\u2193 select \xB7 Enter restore \xB7 a/Esc back to report"})}),$jsx("box",{height:1}),$jsx("scrollbox",{ref:sb,scrollY:!0,flexGrow:1,border:!0,borderColor:theme.border,paddingLeft:1,paddingRight:1,contentOptions:{flexDirection:"column"},children:archived.length===0?$jsx("text",{fg:theme.textMuted,children:"No archived skills."}):archived.map((name,i)=>$jsx("box",{id:`arch-${i}`,height:1,backgroundColor:i===sel?theme.backgroundElement:void 0,onMouseMove:()=>setSel(i),onMouseDown:()=>restore(name),children:$jsxs("text",{fg:i===sel?theme.text:theme.textMuted,children:[i===sel?"\u25B8 ":" ",name]})},name))})]}):!loaded?$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"loading report\u2026"})}):report2?$jsxs("box",{flexDirection:"column",flexGrow:1,height:"100%",minWidth:0,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.info,children:$jsx("strong",{children:`\u25BE Report \xB7 ${report2.runId}`})})}),$jsx(KVLink,{label:"File",source:report2.source,text:report2.source.relative}),$jsx("box",{height:1}),$jsx("scrollbox",{scrollY:!0,flexGrow:1,border:!0,borderColor:theme.border,paddingLeft:1,paddingRight:1,children:$jsx("box",{flexDirection:"column",width:"100%",children:$jsx("markdown",{content:report2.content||"(empty)",fg:theme.markdownText,syntaxStyle})})})]}):$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"No runs yet \u2014 curator has not completed a cycle."})})]})]})},openCurator=(dialog)=>dialog.replace($jsx(CuratorDialog,{}),void 0,{ownCancel:!0});var NO_EVENTS=[],iso3=(s)=>{if(!s)return null;let t2=Date.parse(s);return Number.isFinite(t2)?Math.floor(t2/1000):null},SkillRow=import_react88.memo((props)=>{let theme=useTheme().theme,s=props.skill,u3=props.usage,bg2=props.selected?theme.backgroundElement:void 0,used=iso3(u3?.last_used_at)??iso3(u3?.last_viewed_at),stale=u3?.state==="stale",archived=u3?.state==="archived";return $jsxs("box",{id:props.id,flexDirection:"row",height:1,backgroundColor:bg2,onMouseDown:props.onSelect,onMouseMove:props.onHover,children:[$jsx(Col,{w:2,fg:props.selected?theme.primary:theme.text,children:props.selected?"\u25B8 ":" "}),$jsx(Col,{w:2,fg:theme.warning,children:u3?.pinned?"\uD83D\uDCCC":" "}),$jsx(Marquee,{grow:!0,min:8,active:props.selected,fg:archived?theme.textMuted:props.selected?theme.accent:theme.text,children:s.name}),archived?$jsx(Col,{w:10,fg:theme.textMuted,children:"archived"}):stale?$jsx(Col,{w:10,fg:theme.warning,children:"stale"}):$jsx(Col,{w:10,fg:theme.textMuted,children:used?ago(used):""})]})}),HitRow=import_react88.memo((props)=>{let theme=useTheme().theme,on=props.selected;return $jsxs("box",{flexDirection:"row",height:1,backgroundColor:on?theme.backgroundElement:void 0,onMouseMove:props.onHover,children:[$jsx(Col,{w:2,fg:on?theme.primary:theme.textMuted,children:on?"\u25B8 ":" "}),$jsx(Col,{w:28,fg:on?theme.accent:theme.text,children:props.hit.name}),$jsx(Col,{grow:!0,min:8,fg:theme.textMuted,children:props.hit.description||"\u2014"})]})}),bycat=(skills)=>skills.reduce((map,s)=>{let cat=s.category||"uncategorized";return map.set(cat,[...map.get(cat)??[],s]),map},new Map),line2=(e)=>{switch(e.kind){case"absorbed":return`absorbed ${e.sources.map((s)=>`\`${s}\``).join(", ")}`;case"merged":return`merged into \`${e.into}\`${e.reason?` \u2014 ${e.reason}`:""}`;case"transition":return`${e.from} \u2192 ${e.to}`;case"pruned":return`pruned${e.reason?` \u2014 ${e.reason}`:""}`;case"added":return"created by curator"}},DetailPanel2=import_react88.memo((props)=>{let theme=useTheme().theme,s=props.skill,u3=props.usage,used=iso3(u3?.last_used_at),viewed=iso3(u3?.last_viewed_at),patched=iso3(u3?.last_patched_at);return $jsxs("box",{flexDirection:"column",padding:1,border:!0,borderColor:theme.border,backgroundColor:theme.backgroundPanel,width:"50%",children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.primary,children:$jsx("strong",{children:"Skill Detail"})}),u3?.pinned?$jsx("span",{fg:theme.warning,children:" \uD83D\uDCCC pinned"}):null,u3?.state==="stale"?$jsx("span",{fg:theme.warning,children:" \xB7 stale"}):null,u3?.state==="archived"?$jsx("span",{fg:theme.textMuted,children:" \xB7 archived"}):null]})}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.accent,children:$jsx("strong",{children:s.name})})}),$jsx("box",{height:1}),$jsx(KVBlock,{rows:[["Category",s.category||"uncategorized",theme.info],["Tags",s.tags.length>0?s.tags.join(", "):void 0],u3?["Used",u3.use_count>0?`${u3.use_count}\xD7 \xB7 last ${used?ago(used):"never"}`:"never"]:null,u3&&viewed?["Viewed",`${u3.view_count}\xD7 \xB7 last ${ago(viewed)}`]:null,u3&&patched?["Patched",`${u3.patch_count}\xD7 \xB7 last ${ago(patched)}`]:null].filter(Boolean)}),$jsx(KVLink,{label:"File",source:s.source,text:s.source.relative}),$jsx("box",{height:1}),s.description?$jsx("text",{wrapMode:"word",children:$jsx("span",{fg:theme.text,children:s.description})}):$jsx("text",{fg:theme.textMuted,children:"No description"}),props.events.length>0?$jsxs("box",{flexDirection:"column",marginTop:1,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"Curator lineage"})}),props.events.map((e,i)=>$jsxs("box",{flexDirection:"row",minHeight:1,children:[$jsx("box",{width:10,flexShrink:0,children:$jsx("text",{fg:theme.textMuted,children:ago(e.at)})}),$jsx("box",{flexGrow:1,minHeight:1,children:$jsx("text",{wrapMode:"word",fg:theme.text,children:line2(e)})})]},i))]}):u3?$jsx("box",{height:1,marginTop:1,children:$jsx("text",{fg:theme.textMuted,children:"No curator events for this skill"})}):null]})}),EmptyState=import_react88.memo((props)=>{let theme=useTheme().theme;return $jsx("box",{flexGrow:1,padding:2,children:$jsx("text",{children:$jsx("span",{fg:theme.textMuted,children:props.searching?"No matching skills on hub":"No skills found in ~/.hermes/skills/"})})})}),HistoryPanel=import_react88.memo((props)=>{let{theme,syntaxStyle}=useTheme(),keys=useKeys(),follow=useFollow("skills-history"),[runs,setRuns]=import_react88.useState(()=>listCuratorRuns()),[sel,setSel]=import_react88.useState(0),[open2,setOpen]=import_react88.useState(!1),[body,setBody]=import_react88.useState(""),run=runs[sel];import_react88.useEffect(()=>{if(!open2||!run)return;let live=!0;return readCuratorReport(run.id).then((t2)=>{if(live)setBody(t2)}),()=>{live=!1}},[open2,run?.id]);let moveSel=import_react88.useCallback((v2)=>{setOpen(!1),setSel(v2)},[]);return useKeyboard((key2)=>{if(!props.focused)return;handleListKey(keys,key2,{count:runs.length,setSel:moveSel,...follow.opts,onActivate:()=>setOpen((o)=>!o),onRefresh:()=>setRuns(listCuratorRuns())})}),$jsxs("box",{flexDirection:"column",padding:1,border:!0,borderColor:props.focused?theme.primary:theme.border,backgroundColor:theme.backgroundPanel,width:"50%",children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.primary,children:$jsx("strong",{children:"Curator History"})}),$jsx("span",{fg:theme.textMuted,children:` ${runs.length} run${runs.length===1?"":"s"}${runs[0]?` \xB7 last ${ago(runs[0].at)}`:""}`})]})}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:`\u2191\u2193 select \xB7 Enter expand \xB7 ${keys.print("list.refresh")} reload \xB7 h close`})}),$jsx("box",{height:1}),runs.length===0?$jsx("text",{fg:theme.textMuted,children:"no runs in ~/.hermes/logs/curator/"}):$jsx("scrollbox",{ref:follow.ref,scrollY:!0,flexGrow:1,children:$jsx("box",{flexDirection:"column",width:"100%",children:runs.map((r,i)=>{let on=i===sel;return $jsxs("box",{id:follow.id(i),flexDirection:"column",children:[$jsxs("box",{height:1,flexDirection:"row",backgroundColor:on?theme.backgroundElement:void 0,onMouseDown:()=>{setSel(i),setOpen((o)=>i===sel?!o:!0)},children:[$jsx(Col,{w:2,fg:on?theme.primary:theme.textMuted,children:on?"\u25B8 ":" "}),$jsx(Col,{w:12,fg:on?theme.accent:theme.text,children:ago(r.at)}),$jsx(Col,{grow:!0,fg:theme.textMuted,children:`${r.before}\u2192${r.after} arch ${r.archived} cons ${r.consolidated}${r.added?` +${r.added}`:""}`})]}),on&&open2?$jsx("box",{marginLeft:2,marginTop:1,marginBottom:1,children:$jsx("markdown",{content:body||"\u2026",fg:theme.markdownText,syntaxStyle})}):null]},r.id)})})})]})}),Skills=import_react88.memo((props)=>{let theme=useTheme().theme,gw=useGateway(),dialog=useDialog(),toast=useToast(),usage=useHome("skillUsage")??{},curator=useHome("curatorState"),lineage2=import_react88.useRef(indexCuratorLineage());import_react88.useEffect(()=>{lineage2.current=indexCuratorLineage()},[curator?.run_count]);let[skills,setSkills]=import_react88.useState([]),[selected,setSelected]=import_react88.useState(0),[searching,setSearching]=import_react88.useState(!1),[query,setQuery]=import_react88.useState(""),[hits,setHits]=import_react88.useState([]),[sort,setSort]=import_react88.useState("name"),[history,setHistory]=import_react88.useState(!1),seq=import_react88.useRef(0),load4=import_react88.useCallback(()=>{gw.request("skills.manage",{action:"list"}).then((res)=>{let raw=res.skills??{},rows3=Object.entries(raw).flatMap(([cat,names])=>names.map((n)=>{let source=makeSource(`skills/${cat}/${n}/SKILL.md`,`${n}/SKILL.md`),fm=readSkillFrontmatter(source);return{source,category:cat,name:n,description:fm.description,tags:fm.tags,tokenEstimate:count2(`${n} ${fm.description}`)}}));rows3.sort((a,b2)=>a.source.relative.localeCompare(b2.source.relative)),setSkills(rows3)}).catch(()=>{})},[gw]);import_react88.useEffect(()=>{load4()},[load4]),import_react88.useEffect(()=>{let id=++seq.current;if(!searching||!query.trim()){setHits([]);return}let t2=setTimeout(()=>{gw.request("skills.manage",{action:"search",query}).then((r)=>{if(seq.current!==id)return;setHits(r.results??[]),setSelected(0)}).catch(()=>{if(seq.current===id)setHits([])})},150);return()=>clearTimeout(t2)},[gw,query,searching]);let flat=[...sort==="used"?new Map([["by recency",[...skills].sort((a,b2)=>{let ta=iso3(usage[a.name]?.last_used_at)??iso3(usage[a.name]?.last_viewed_at)??0;return(iso3(usage[b2.name]?.last_used_at)??iso3(usage[b2.name]?.last_viewed_at)??0)-ta})]]):bycat(skills)].flatMap(([cat,items])=>[{type:"header",category:cat},...items.map((s)=>({type:"skill",skill:s}))]),skillRows=flat.filter((r)=>r.type==="skill"),count3=searching?hits.length:skillRows.length,current=!searching&&skillRows[selected]?.type==="skill"?skillRows[selected].skill:null,follow=useFollow("sk"),exit=import_react88.useCallback(()=>{setSearching(!1),setQuery(""),setHits([]),setSelected(0)},[]),install2=import_react88.useCallback(async(name)=>{if(!await openConfirm(dialog,{title:"Install skill?",body:name,yes:"install"}))return;gw.request("skills.manage",{action:"install",query:name}).then(()=>{toast.show({variant:"success",message:`Installed ${name}`}),exit(),load4()}).catch((e)=>toast.show({variant:"error",message:`Install failed: ${e.message}`}))},[dialog,gw,toast,exit,load4]),keys=useKeys();useKeyboard((key2)=>{if(!props.focused||dialog.open())return;if(searching){if(key2.name==="escape"){exit();return}if(key2.name==="backspace"){setQuery((p)=>p.slice(0,-1)),setSelected(0);return}if(key2.name==="up")return setSelected((p)=>Math.max(0,p-1));if(key2.name==="down")return setSelected((p)=>Math.min(count3-1,p+1));if(key2.name==="return"){let hit=hits[selected];if(hit)install2(hit.name);return}if(key2.raw&&key2.raw.length===1&&key2.raw>=" ")setQuery((p)=>p+key2.raw),setSelected(0);return}if(!key2.ctrl&&!key2.meta&&key2.raw==="s"){setSort((p)=>p==="name"?"used":"name"),setSelected(0);return}if(!key2.ctrl&&!key2.meta&&key2.raw==="c"){openCurator(dialog);return}if(!key2.ctrl&&!key2.meta&&key2.raw==="h"){setHistory((h2)=>!h2);return}if(history){if(key2.name==="escape")return setHistory(!1);return}handleListKey(keys,key2,{count:count3,setSel:setSelected,...follow.opts,onRefresh:()=>{load4(),toast.show({variant:"info",message:"Reloaded",duration:1000})},onSearch:()=>{setSearching(!0),setQuery(""),setHits([]),setSelected(0)}})});let skillIdx=-1;return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsxs("box",{flexDirection:"row",flexGrow:1,children:[$jsxs(TabShell,{title:searching?`Hub Search (${hits.length})`:`Skills (${skills.length}${sort==="used"?" \xB7 by use":""})`,children:[searching?$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.accent,children:"/ "}),$jsx("span",{fg:theme.text,children:query}),$jsx("span",{fg:theme.accent,children:"\u2588"})]})}):null,searching?null:$jsxs(Hdr,{children:[$jsx(Col,{w:2,fg:theme.textMuted,children:""}),$jsx(Col,{grow:!0,min:8,fg:theme.textMuted,bold:!0,children:"Name"})]}),searching?null:$jsx("box",{height:1}),count3===0?$jsx(EmptyState,{searching}):searching?$jsx("scrollbox",{scrollY:!0,flexGrow:1,children:$jsx("box",{flexDirection:"column",width:"100%",children:hits.map((h2,i)=>$jsx(HitRow,{hit:h2,selected:i===selected,onHover:()=>setSelected(i)},h2.name))})}):$jsx("scrollbox",{ref:follow.ref,scrollY:!0,flexGrow:1,verticalScrollbarOptions:VBAR,children:flat.map((row3,i)=>{if(row3.type==="header")return $jsx("box",{marginTop:i>0?1:0,children:$jsx("text",{fg:theme.info,children:$jsx("strong",{children:`\u25BE ${row3.category}`})})},`h-${row3.category}`);skillIdx++;let idx=skillIdx;return $jsx(SkillRow,{id:follow.id(idx),skill:row3.skill,usage:usage[row3.skill.name],selected:idx===selected,onSelect:()=>setSelected(idx),onHover:()=>setSelected(idx)},row3.skill.name)})}),!searching&&curator?$jsx("box",{height:1,flexShrink:0,children:$jsxs("text",{children:[$jsx("span",{fg:theme.textMuted,children:"curator \xB7 "}),curator.paused?$jsx("span",{fg:theme.warning,children:"paused"}):curator.last_run_at?$jsx("span",{fg:theme.textMuted,children:`${curator.run_count} run${curator.run_count===1?"":"s"} \xB7 last ${ago(iso3(curator.last_run_at)??0)}`}):$jsx("span",{fg:theme.textMuted,children:"never run"})]})}):null]}),history?$jsx(HistoryPanel,{focused:!!props.focused&&!searching}):current?$jsx(DetailPanel2,{skill:current,usage:usage[current.name],events:lineage2.current.get(current.name)??NO_EVENTS}):null]}),$jsx(HintBar,{pairs:searching?[["\u2191\u2193","navigate"],["Enter","install"],["Esc","cancel"]]:[["\u2191\u2193","navigate"],[keys.print("list.search"),"search hub"],["s","sort"],["c","curator"],["h","history"],[keys.print("list.refresh"),"refresh"]]})]})});var import_react90=__toESM(require_react_production(),1);var kindOf=(ts)=>ts.name.includes(":")?"mcp":ts.name.startsWith("hermes-")?"platform":"core",KIND_LABEL={core:"core",platform:"platform bundles",mcp:"mcp"},group2=(list2)=>{let by={core:[],platform:[],mcp:[]};for(let ts of list2)by[kindOf(ts)].push(ts);return["core","platform","mcp"].filter((k2)=>by[k2].length>0).map((k2)=>({kind:k2,items:by[k2]}))},Row2=import_react90.memo((props)=>{let theme=useTheme().theme,ts=props.ts,bg2=props.selected?theme.backgroundElement:void 0,unavail=ts.available===!1,glyph=unavail?"\u25CC":ts.enabled?"\u25CF":"\u25CB",glyphFg=unavail?theme.warning:ts.enabled?theme.success:theme.textMuted;return $jsxs("box",{id:props.id,flexDirection:"row",height:1,backgroundColor:bg2,onMouseDown:props.onSelect,onMouseMove:props.onHover,children:[$jsx(Col,{w:2,fg:props.selected?theme.primary:theme.text,children:props.selected?"\u25B8 ":" "}),$jsx(Col,{w:2,fg:glyphFg,children:`${glyph} `}),$jsx(Col,{grow:!0,fg:props.selected?theme.accent:theme.text,children:ts.name}),$jsx(Col,{w:9,fg:theme.info,right:!0,children:`${ts.tool_count} tools`})]})}),DetailPanel3=import_react90.memo((props)=>{let theme=useTheme().theme,ts=props.ts,unavail=ts.available===!1;return $jsxs("box",{flexDirection:"column",padding:1,border:!0,borderColor:theme.border,backgroundColor:theme.backgroundPanel,width:"40%",children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.accent,children:$jsx("strong",{children:ts.name})})}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:KIND_LABEL[kindOf(ts)]})}),$jsx("box",{height:1}),$jsx(KVBlock,{rows:[["Status",unavail?"unavailable":ts.enabled?"enabled":"disabled",unavail?theme.warning:ts.enabled?theme.success:theme.textMuted],["Tools",String(ts.tool_count),theme.info],["Includes",ts.includes?.length?ts.includes.join(", "):void 0,theme.text],["Requires",ts.requirements?.length?ts.requirements.join(", "):void 0,unavail?theme.warning:theme.text]]}),$jsx("box",{height:1}),$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",fg:theme.text,children:ts.description||"\u2014"})}),ts.tools?.length?$jsxs($Fragment,{children:[$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsxs("text",{fg:theme.textMuted,children:["Tools (",ts.tools.length,"):"]})}),$jsx("scrollbox",{flexGrow:1,scrollY:!0,children:ts.tools.map((n)=>$jsxs("text",{fg:theme.text,children:["\xB7 ",n]},n))})]}):null]})}),Toolsets=import_react90.memo((props)=>{let theme=useTheme().theme,gw=useGateway(),dialog=useDialog(),toast=useToast(),[list2,setList]=import_react90.useState([]),[sel,setSel]=import_react90.useState(0),[err,setErr]=import_react90.useState(null),secs=group2(list2),flat=secs.flatMap((s)=>s.items),live=import_react90.useRef({flat,sel});live.current={flat,sel};let load4=import_react90.useCallback(()=>{gw.request("toolsets.list",{}).then((r)=>{setList(r.toolsets??[]),setErr(null)}).catch((e)=>setErr(e instanceof Error?e.message:String(e)))},[gw]);import_react90.useEffect(()=>{load4()},[load4]);let toggle=import_react90.useCallback(()=>{let ts2=live.current.flat[live.current.sel];if(!ts2)return;if(ts2.available===!1){toast.show({variant:"warning",message:`${ts2.name} is unavailable`});return}let action=ts2.enabled?"disable":"enable",was=ts2.enabled;setList((prev)=>prev.map((t2)=>t2.name===ts2.name?{...t2,enabled:!t2.enabled}:t2)),gw.request("tools.configure",{action,names:[ts2.name]}).then((r)=>{if(r.unknown?.includes(ts2.name)){setList((prev)=>prev.map((t2)=>t2.name===ts2.name?{...t2,enabled:was}:t2)),toast.show({variant:"warning",message:`${ts2.name} is not configurable`});return}if(r.missing_servers?.length&&ts2.name.includes(":")){let server=ts2.name.split(":",1)[0];if(r.missing_servers.includes(server)){setList((prev)=>prev.map((t2)=>t2.name===ts2.name?{...t2,enabled:was}:t2)),toast.show({variant:"warning",message:`MCP server '${server}' not in config`});return}}if(Array.isArray(r.enabled_toolsets)){let on=new Set(r.enabled_toolsets);setList((prev)=>prev.map((t2)=>({...t2,enabled:on.has(t2.name)})))}else load4()}).catch((e)=>{setList((prev)=>prev.map((t2)=>t2.name===ts2.name?{...t2,enabled:was}:t2)),toast.show({variant:"error",message:e.message})})},[gw,toast,load4]),count3=flat.length,ts=flat[sel]??null,follow=useFollow("ts"),keys=useListKeys({active:()=>!!props.focused&&!dialog.open(),count:count3,setSel,...follow.opts,onToggle:toggle,onRefresh:()=>{load4(),toast.show({variant:"info",message:"Reloaded",duration:1000})}});return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsxs("box",{flexDirection:"row",flexGrow:1,children:[$jsxs(TabShell,{title:`Toolsets (${count3})`,error:err,children:[$jsxs(Hdr,{children:[$jsx(Col,{w:4,fg:theme.textMuted,children:""}),$jsx(Col,{grow:!0,fg:theme.textMuted,bold:!0,children:"Name"}),$jsx(Col,{w:9,fg:theme.textMuted,bold:!0,right:!0,children:"Tools"})]}),$jsx("box",{height:1}),count3===0?$jsx("box",{flexGrow:1,padding:2,children:$jsx("text",{fg:theme.textMuted,children:"No toolsets found"})},"empty"):$jsx("scrollbox",{ref:follow.ref,scrollY:!0,flexGrow:1,verticalScrollbarOptions:VBAR,children:secs.reduce((acc2,s)=>{return acc2.out.push($jsx("box",{height:1,marginTop:acc2.base>0?1:0,children:$jsxs("text",{fg:theme.textMuted,children:["\u2500 ",KIND_LABEL[s.kind]," (",s.items.length,") "]})},`\xA7${s.kind}`)),s.items.forEach((t2,j2)=>{let i=acc2.base+j2;acc2.out.push($jsx(Row2,{id:follow.id(i),ts:t2,selected:i===sel,onSelect:()=>setSel(i),onHover:()=>setSel(i)},t2.name))}),acc2.base+=s.items.length,acc2},{base:0,out:[]}).out},"list")]}),ts?$jsx(DetailPanel3,{ts}):null]}),$jsx(HintBar,{pairs:[["\u2191\u2193","nav"],[keys.print("list.toggle"),"toggle"],[keys.print("list.refresh"),"refresh"]]})]})});var import_react91=__toESM(require_react_production(),1);var mask=(val)=>"\u2022".repeat(Math.min(val.length,12)),VarRow=import_react91.memo((props)=>{let theme=useTheme().theme,set2=props.value!==void 0,bg2=props.selected?theme.backgroundElement:void 0;return $jsxs("box",{id:props.id,flexDirection:"row",height:1,backgroundColor:bg2,onMouseDown:props.onClick,onMouseMove:props.onHover,children:[$jsx(Col,{w:2,fg:props.selected?theme.primary:theme.text,children:props.selected?"\u25B8 ":" "}),$jsx(Col,{w:28,fg:props.selected?theme.accent:theme.text,children:props.name}),$jsx(Col,{w:8,fg:set2?theme.success:theme.textMuted,children:set2?" SET ":"UNSET"}),$jsx(Col,{grow:!0,min:4,fg:props.shown?theme.text:theme.textMuted,children:set2?props.shown?props.value:mask(props.value):"\u2014"})]})}),Env=import_react91.memo((props)=>{let theme=useTheme().theme,dialog=useDialog(),toast=useToast(),vars=useHome("env")??{},[sel,setSel]=import_react91.useState(0),[reveal,setReveal]=import_react91.useState(new Set),[collapsed,setCollapsed]=import_react91.useState({}),[searching,setSearching]=import_react91.useState(!1),[query,setQuery]=import_react91.useState(""),known=new Set(ENV_CATALOG.flatMap((g)=>g.keys)),extra=Object.keys(vars).filter((k2)=>!known.has(k2)).sort(),rows3=(extra.length>0?[...ENV_CATALOG,{category:"Other",keys:extra}]:ENV_CATALOG).flatMap((g)=>{let keys2=searching&&query.trim()?g.keys.filter((k2)=>k2.toLowerCase().includes(query.toLowerCase())):g.keys;if(keys2.length===0)return[];let hide=collapsed[g.category]??!1,header={type:"header",category:g.category,collapsed:hide};if(hide)return[header];return[header,...keys2.map((key2)=>({type:"var",key:key2,value:vars[key2]}))]}),count3=rows3.length,cur=rows3[sel],setKeys=rows3.flatMap((r)=>r.type==="var"&&r.value!==void 0?[r.key]:[]),follow=useFollow("env"),edit=import_react91.useCallback(async(key2,initial)=>{let val=await openTextPrompt(dialog,{title:`Edit ${key2}`,label:"Value",initial});if(val==null)return;await writeEnvVar(key2,val),home2.invalidate("env"),toast.show({variant:"success",message:`${key2} saved`})},[dialog,toast]),add2=import_react91.useCallback(async()=>{let key2=await openTextPrompt(dialog,{title:"New Variable",label:"Name (e.g. FOO_API_KEY)"});if(!key2)return;let val=await openTextPrompt(dialog,{title:`Set ${key2}`,label:"Value"});if(val==null)return;await writeEnvVar(key2,val),home2.invalidate("env"),toast.show({variant:"success",message:`${key2} added`})},[dialog,toast]),del=import_react91.useCallback(async(key2)=>{if(!await openConfirm(dialog,{title:"Delete Variable",body:`Remove ${key2} from .env?`,yes:"delete",danger:!0}))return;await removeEnvVar(key2),home2.invalidate("env"),toast.show({variant:"success",message:`${key2} removed`})},[dialog,toast]),revealAll=import_react91.useCallback(()=>setReveal((s)=>s.size===setKeys.length&&setKeys.length>0?new Set:new Set(setKeys)),[setKeys]),activateAt=import_react91.useCallback((i)=>{let r=rows3[i];if(r?.type==="header")return setCollapsed((p)=>({...p,[r.category]:!p[r.category]}));if(r?.type==="var"){if(r.value!==void 0&&!reveal.has(r.key))return setReveal((s)=>new Set(s).add(r.key));return void edit(r.key,r.value??"")}},[rows3,reveal,edit]),activate=import_react91.useCallback(()=>activateAt(sel),[activateAt,sel]),rowClick=import_react91.useCallback((i)=>{setSel(i),activateAt(i)},[activateAt]),keys=useKeys();return useKeyboard((key2)=>{if(!props.focused||dialog.open())return;if(searching){if(key2.name==="escape"){setSearching(!1),setQuery(""),setSel(0);return}if(key2.name==="backspace"){setQuery((q4)=>q4.slice(0,-1)),setSel(0);return}if(key2.name==="up")return setSel((p)=>Math.max(0,p-1));if(key2.name==="down")return setSel((p)=>Math.min(count3-1,p+1));if(key2.name==="return")return setSearching(!1),activate();if(key2.raw&&key2.raw.length===1&&key2.raw>=" "){setQuery((q4)=>q4+key2.raw),setSel(0);return}return}handleListKey(keys,key2,{count:count3,setSel,...follow.opts,onActivate:activate,onToggle:revealAll,onNew:add2,onDelete:()=>{if(cur?.type==="var"&&cur.value!==void 0)del(cur.key)},onSearch:()=>{setSearching(!0),setQuery(""),setSel(0)},onRefresh:()=>{home2.invalidate("env"),toast.show({variant:"info",message:"Reloaded",duration:1000})}})}),$jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsxs(TabShell,{title:searching?"Env (searching)":"Env / API Keys",children:[searching?$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.accent,children:"/ "}),$jsx("span",{fg:theme.text,children:query}),$jsx("span",{fg:theme.accent,children:"\u2588"})]})}):null,$jsxs(Hdr,{children:[$jsx(Col,{w:2,fg:theme.textMuted,children:""}),$jsx(Col,{w:28,fg:theme.textMuted,bold:!0,children:"Name"}),$jsx(Col,{w:8,fg:theme.textMuted,bold:!0,children:"Status"}),$jsx(Col,{grow:!0,min:4,fg:theme.textMuted,bold:!0,children:"Value"})]}),$jsx("box",{height:1}),count3===0?$jsx("box",{flexGrow:1,padding:2,children:$jsx("text",{fg:theme.textMuted,children:searching?"No matching variables":"No variables configured"})},"empty"):$jsx("scrollbox",{ref:follow.ref,scrollY:!0,flexGrow:1,verticalScrollbarOptions:VBAR,children:$jsx("box",{flexDirection:"column",width:"100%",children:rows3.map((row3,i)=>row3.type==="header"?$jsx("box",{id:follow.id(i),marginTop:i>0?1:0,backgroundColor:i===sel?theme.backgroundElement:void 0,onMouseMove:()=>setSel(i),onMouseDown:()=>rowClick(i),children:$jsx("text",{fg:theme.info,children:$jsx("strong",{children:`${row3.collapsed?"\u25B8":"\u25BE"} ${row3.category}`})})},`h-${row3.category}`):$jsx(VarRow,{id:follow.id(i),name:row3.key,value:row3.value,shown:reveal.has(row3.key),selected:i===sel,onHover:()=>setSel(i),onClick:()=>rowClick(i)},row3.key))})},"list")]}),$jsx(HintBar,{pairs:searching?[["\u2191\u2193","move"],["Enter","reveal/edit"],["Esc","cancel"]]:[["\u2191\u2193","move"],[keys.print("list.activate"),"reveal/edit"],[keys.print("list.toggle"),"show-all"],[keys.print("list.new"),"new"],[keys.print("list.delete"),"delete"],[keys.print("list.search"),"search"],[keys.print("list.refresh"),"reload"]]})]})});var import_react93=__toESM(require_react_production(),1);function usageColor(pct,theme){if(pct>=95)return theme.error;if(pct>=80)return theme.warning;return theme.success}function bar2(pct,w2){let filled=Math.round(pct/100*w2);return"\u2588".repeat(filled)+"\u2591".repeat(w2-filled)}var DESC={builtin:"File-based \xA7-delimited entries (MEMORY.md + USER.md). Always active.",mem0:"Server-side LLM fact extraction with semantic search and reranking.",honcho:"AI-native cross-session user modeling with dialectic Q&A.",hindsight:"Knowledge graph with entity resolution and multi-strategy retrieval.",holographic:"Local SQLite fact store with FTS5, trust scoring, HRR retrieval.",openviking:"Session-managed memory with tiered retrieval.",retaindb:"Cloud memory API with hybrid search and 7 memory types.",byterover:"Persistent knowledge tree via brv CLI.",supermemory:"Semantic long-term memory with profile recall and session ingest."},Memory=import_react93.memo((props)=>{let theme=useTheme().theme,dialog=useDialog(),toast=useToast(),gw=useGateway(),[sel,setSel]=import_react93.useState(0),config=useHome("config"),memory=useHome("memory"),userProfile=useHome("userProfile"),providers=useHome("memoryProviders")??[],activity=useHome("memoryActivity")??[],cfg=config?.memory,active=cfg?.provider||"",cur=providers[sel],on=!!cur&&(cur.name==="builtin"||cur.name===active),toggle=async()=>{if(!cur||cur.name==="builtin")return;let isOn=cur.name===active;if(!await openConfirm(dialog,{title:isOn?"Deactivate memory provider?":"Activate memory provider?",body:isOn?`Clear '${cur.name}' as the active provider (revert to built-in only).`:`Set '${cur.name}' as the active provider. Ensure required env vars are set (Env tab).`,yes:isOn?"deactivate":"activate"}))return;let{writeConfig:writeConfig2}=await Promise.resolve().then(() => (init_lane(),exports_lane)),r=await writeConfig2(gw,[{key:"memory.provider",to:isOn?"":cur.name}]);if(r.failed.length)return toast.show({variant:"error",message:r.failed[0].err});home2.invalidate("config"),home2.invalidate("memoryProviders"),toast.show({variant:"success",message:isOn?"Deactivated":`Activated ${cur.name} \u2014 new sessions pick this up`})},keys=useListKeys({active:()=>!!props.focused&&!dialog.open(),count:providers.length,setSel,onToggle:toggle,onRefresh:()=>{home2.invalidate("memoryProviders"),home2.invalidate("memoryActivity"),toast.show({variant:"info",message:"Reloaded",duration:1000})}}),feed=!cur?[]:cur.name==="builtin"?activity:activity.filter((a)=>a.provider===cur.name);return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsxs("box",{flexDirection:"row",flexGrow:1,children:[$jsx(TabShell,{title:"Memory Providers",grow:1,children:$jsx("scrollbox",{scrollY:!0,flexGrow:1,children:providers.map((p,i)=>{let pOn=p.name==="builtin"||p.name===active,has=Object.keys(p.config).length>0,dot=pOn?"\u25CF":has?"\u25D0":"\u25CB",fg2=pOn?theme.success:has?theme.warning:theme.textMuted,tag=pOn?"active":has?"configured":"";return $jsxs("box",{flexDirection:"column",marginBottom:1,backgroundColor:i===sel?theme.backgroundElement:void 0,onMouseDown:()=>setSel(i),onMouseMove:()=>setSel(i),children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsxs("span",{fg:fg2,children:[dot," "]}),$jsx("span",{fg:i===sel?theme.accent:theme.text,children:p.name}),tag?$jsxs("span",{fg:fg2,children:[" (",tag,")"]}):null]})}),$jsx("box",{height:1,overflow:"hidden",paddingLeft:2,children:$jsx("text",{fg:theme.textMuted,children:DESC[p.name]||"\u2014"})})]},p.name)})})}),$jsx(TabShell,{title:cur?.name??"Provider",grow:2,children:cur?$jsx(ProviderDetail,{provider:cur,active,cfg,memory,userProfile,feed}):$jsx("text",{fg:theme.textMuted,children:"Select a provider"})})]}),$jsx(HintBar,{pairs:[["\u2191\u2193","select"],[keys.print("list.toggle"),"activate"]],suffix:on?"\u25CF active":"\u25CB inactive"})]})}),ProviderDetail=import_react93.memo((props)=>{let theme=useTheme().theme,p=props.provider,on=p.name==="builtin"||p.name===props.active;return $jsx("scrollbox",{scrollY:!0,flexGrow:1,children:$jsxs("box",{flexDirection:"column",children:[$jsx("box",{minHeight:1,children:$jsx("text",{wrapMode:"word",fg:theme.textMuted,children:DESC[p.name]||"Memory provider"})}),$jsx("box",{height:1}),p.name==="builtin"?$jsxs("box",{flexDirection:"column",children:[props.cfg?$jsxs($Fragment,{children:[$jsx(KVBlock,{rows:[["Notes",props.cfg.memory_enabled?"enabled":"disabled",props.cfg.memory_enabled?theme.success:theme.error],["Profile",props.cfg.user_profile_enabled?"enabled":"disabled",props.cfg.user_profile_enabled?theme.success:theme.error]]}),$jsx("box",{height:1})]}):null,$jsx(CapacityBar,{title:"Notes (MEMORY.md)",info:props.memory??null}),$jsx("box",{height:1}),$jsx(CapacityBar,{title:"Profile (USER.md)",info:props.userProfile??null})]}):null,p.name!=="builtin"&&on&&props.cfg?$jsxs($Fragment,{children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.accent,children:$jsx("strong",{children:"Agent Settings"})})}),$jsx(KVBlock,{rows:[["Nudge",`every ${props.cfg.nudge_interval} turns`],["Flush",`after ${props.cfg.flush_min_turns} turns`]]}),$jsx("box",{height:1})]}):null,Object.keys(p.config).length>0?$jsxs($Fragment,{children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.accent,children:$jsx("strong",{children:"Local Configuration"})})}),$jsx(KVBlock,{rows:Object.entries(p.config).map(([k2,v2])=>[k2,String(v2)])})]}):p.name!=="builtin"?$jsx("box",{height:1,marginTop:1,children:$jsx("text",{fg:theme.textMuted,children:"No local config found. Run `hermes memory setup` to configure."})}):null,$jsx(ActivityFeed,{items:props.feed,own:p.name})]})})}),OP_GLYPH={write:"+",read:"?"},ActivityFeed=import_react93.memo((props)=>{let theme=useTheme().theme,all=props.own==="builtin",nW=props.items.filter((a)=>a.op==="write").length;return $jsxs("box",{flexDirection:"column",marginTop:1,children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.accent,children:$jsx("strong",{children:"Recent Activity"})}),props.items.length?$jsxs("span",{fg:theme.textMuted,children:[" \xB7 ",nW," writes, ",props.items.length-nW," reads"]}):null]})}),props.items.length===0?$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:"No memory-tool calls in the last ~2000 messages"})}):null,props.items.map((a,i)=>$jsx("box",{height:1,flexDirection:"row",overflow:"hidden",children:$jsxs("text",{children:[$jsxs("span",{fg:a.op==="write"?theme.success:theme.textMuted,children:[OP_GLYPH[a.op]," "]}),$jsx("span",{fg:theme.textMuted,children:ago(a.ts).padEnd(8)}),all&&a.provider!=="builtin"?$jsxs("span",{fg:theme.primary,children:[a.provider,"\xB7"]}):null,$jsx("span",{fg:theme.text,children:a.verb}),$jsxs("span",{fg:theme.textMuted,children:[" ",a.summary]})]})},i))]})}),CapacityBar=import_react93.memo((props)=>{let theme=useTheme().theme;if(!props.info)return $jsx("box",{height:1,children:$jsxs("text",{fg:theme.textMuted,children:[props.title,": unavailable"]})});let color=usageColor(props.info.usagePercent,theme);return $jsxs("box",{flexDirection:"column",children:[$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:theme.text,children:props.title}),$jsxs("span",{fg:theme.textMuted,children:[" \xB7 ",props.info.entryCount," entries"]})]})}),$jsx("box",{height:1,children:$jsxs("text",{children:[$jsx("span",{fg:color,children:bar2(props.info.usagePercent,20)}),$jsxs("span",{fg:theme.textMuted,children:[" ",props.info.charCount,"/",props.info.charLimit," (",props.info.usagePercent,"%)"]})]})})]})});var ConfigGroup=import_react94.memo((props)=>{let labels=SUB_TABS[CONFIG_TAB];import_react94.useEffect(()=>{if(props.sub>=labels.length)props.setSub(0)},[props.sub,labels.length]);let hint="shift+\u2190/\u2192 sub";return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsx(SubTabBar,{tabs:labels,active:props.sub,onChange:props.setSub,hint}),$jsxs("box",{flexGrow:1,minWidth:0,flexDirection:"column",children:[$jsx(Pane3,{visible:props.sub===0,children:$jsx(Config,{focused:!!props.focused&&props.sub===0})}),$jsx(Pane3,{visible:props.sub===1,children:$jsx(Skills,{focused:!!props.focused&&props.sub===1})}),$jsx(Pane3,{visible:props.sub===2,children:$jsx(Toolsets,{focused:!!props.focused&&props.sub===2})}),$jsx(Pane3,{visible:props.sub===3,children:$jsx(Env,{focused:!!props.focused&&props.sub===3})}),$jsx(Pane3,{visible:props.sub===4,children:$jsx(Memory,{focused:!!props.focused&&props.sub===4})})]})]})}),Pane3=({visible,children:children2})=>visible?$jsx("box",{flexGrow:1,minWidth:0,minHeight:0,flexDirection:"column",children:children2}):null;var import_react109=__toESM(require_react_production(),1);var import_react103=__toESM(require_react_production(),1);import{readFileSync as readFileSync13,statSync as statSync6}from"fs";import{basename as basename12}from"path";var import_react95=__toESM(require_react_production(),1);var PathPrompt=(props)=>{let theme=useTheme().theme,[value,setValue]=import_react95.useState(props.initial??""),[items,setItems]=import_react95.useState([]),seq=import_react95.useRef(0),ok=(it)=>it.meta==="dir"||!props.filter||props.filter.test(it.text);return import_react95.useEffect(()=>{if(!value.trim()){setItems([]);return}let me2=++seq.current,t2=setTimeout(()=>{props.gw.request("complete.path",{word:value}).then((r)=>{if(seq.current===me2)setItems((r.items??[]).filter(ok).slice(0,5))}).catch(()=>{if(seq.current===me2)setItems([])})},120);return()=>clearTimeout(t2)},[value,props.gw]),useKeyboard((key2)=>{if(key2.name!=="tab")return;key2.preventDefault();let hit=items[0];if(hit)setValue(hit.text)}),$jsxs("box",{flexDirection:"column",width:72,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:props.title})})}),$jsx("box",{height:1}),props.label?$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:props.label})}):null,$jsxs("box",{height:1,flexDirection:"row",overflow:"hidden",children:[$jsx("box",{flexShrink:0,children:$jsx("text",{fg:theme.accent,children:"\u2503 "})}),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsx("input",{value,onInput:setValue,onSubmit:()=>{let v2=value.trim();if(v2)props.onSubmit(v2)},focused:!0,textColor:theme.text,backgroundColor:theme.backgroundElement,focusedBackgroundColor:theme.backgroundElement})})]}),$jsx("box",{height:1}),items.length>0?items.map((it)=>$jsxs("box",{height:1,flexDirection:"row",overflow:"hidden",children:[$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,children:it.text})}),it.meta?$jsx("box",{flexShrink:0,height:1,children:$jsx("text",{fg:theme.textMuted,children:` ${it.meta}`})}):null]},it.text)):null,items.length>0?$jsx("box",{height:1}):null,$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:value.trim()?`Tab complete \xB7 Enter confirm \xB7 Esc cancel${items.length>0?` \xB7 ${items.length} match${items.length===1?"":"es"}`:""}`:"Type a path \xB7 Esc cancel"})})]})};function openPathPrompt(dialog,gw,opts){return new Promise((resolve4)=>{dialog.replace($jsx(PathPrompt,{title:opts.title,label:opts.label,initial:opts.initial,filter:opts.filter,gw,onSubmit:(v2)=>{resolve4(v2),dialog.clear()}}),()=>resolve4(null))})}var import_react97=__toESM(require_react_production(),1);var BASE=`
4137
4139
  high contrast, light subject on dark, black background`,BINDS=[{name:"return",action:"submit"},{name:"return",shift:!0,action:"newline"}],Generate=(props)=>{let theme=useTheme().theme,ta=import_react97.useRef(null),[prompt,setPrompt]=import_react97.useState(props.lastPrompt??BASE),[useSeed,setUseSeed]=import_react97.useState(!!props.seed),[secs,setSecs]=import_react97.useState(2),[busy,setBusy]=import_react97.useState(!1),[err,setErr]=import_react97.useState(null),[field,setField]=import_react97.useState("prompt");import_react97.useEffect(()=>{ta.current?.setCursor(0,0)},[]);let fields=props.kind==="video"?props.seed?["prompt","seed","seconds","submit"]:["prompt","seconds","submit"]:props.seed?["prompt","seed","submit"]:["prompt","submit"],advance=()=>setField((f)=>fields[(fields.indexOf(f)+1)%fields.length]),submit2=()=>{let p=prompt.trim(),bare=!props.lastPrompt&&p===BASE.trim();if(!p||bare||busy){if(bare)setErr("describe the subject on line 1");return}setBusy(!0),setErr(null),props.run(props.kind,p,{seed:props.seed&&useSeed?props.seed:void 0,seconds:props.kind==="video"?secs:void 0,aspect:props.kind==="video"?"1:1":"square"}).then((r)=>{if("err"in r){setErr(r.err),setBusy(!1);return}props.onDone(r.path,p)})};useKeyboard((key2)=>{if(busy)return;if(key2.name==="tab"){key2.preventDefault();let i=fields.indexOf(field),next2=fields[(i+(key2.shift?fields.length-1:1))%fields.length];setField(next2);return}if(field==="prompt")return;if(key2.name==="return")return field==="submit"?submit2():advance();if(field==="seed"&&(key2.name==="space"||key2.name==="left"||key2.name==="right")){setUseSeed((v2)=>!v2);return}if(field==="seconds"){if(key2.name==="left")return setSecs((v2)=>Math.max(1,v2-1));if(key2.name==="right")return setSecs((v2)=>Math.min(4,v2+1))}if(field==="submit"&&key2.name==="space")submit2()});let lbl=(id,text3)=>$jsx("box",{width:12,flexShrink:0,children:$jsxs("text",{fg:field===id?theme.accent:theme.textMuted,children:[field===id?"\u25B8 ":" ",text3]})});return $jsxs("box",{flexDirection:"column",width:72,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:`Generate ${props.kind} \u2014 ${props.state}`})})}),$jsx("box",{height:1}),$jsxs("box",{flexDirection:"row",children:[lbl("prompt","Prompt"),$jsx("box",{flexGrow:1,minWidth:0,children:$jsx("textarea",{ref:ta,initialValue:prompt,keyBindings:BINDS,onSubmit:advance,onContentChange:()=>{if(ta.current)setPrompt(ta.current.plainText)},focused:field==="prompt",placeholder:props.kind==="image"?"describe the image\u2026":"describe the motion\u2026",textColor:theme.text,placeholderColor:theme.textMuted,backgroundColor:field==="prompt"?theme.backgroundElement:void 0,focusedBackgroundColor:theme.backgroundElement,minHeight:4,maxHeight:6})})]}),props.seed?$jsxs("box",{height:1,flexDirection:"row",marginTop:1,children:[lbl("seed","Seed"),$jsx("box",{flexGrow:1,minWidth:0,height:1,children:$jsx("text",{fg:field==="seed"?theme.text:theme.textMuted,children:useSeed?"\u25CF base.png":"\u25CB none"})})]}):null,props.kind==="video"?$jsxs("box",{height:1,flexDirection:"row",marginTop:1,children:[lbl("seconds","Seconds"),$jsx("box",{width:20,height:1,children:$jsx("slider",{orientation:"horizontal",min:1,max:4,value:secs,foregroundColor:field==="seconds"?theme.accent:theme.textMuted,backgroundColor:theme.border,onChange:(v2)=>setSecs(Math.round(v2))})}),$jsx("box",{width:6,height:1,children:$jsx("text",{fg:field==="seconds"?theme.text:theme.textMuted,children:` ${secs}s`})})]}):null,$jsxs("box",{marginTop:1,flexDirection:"row",children:[lbl("submit",""),$jsx("box",{flexGrow:1,minWidth:0,children:busy?$jsx("box",{height:1,children:$jsx(Spinner,{color:theme.accent,label:"generating\u2026"})}):err?$jsx("text",{fg:theme.warning,wrapMode:"word",children:err}):$jsx("box",{height:1,children:$jsx("text",{fg:field==="submit"?theme.accent:theme.textMuted,children:"[Enter] generate"})})})]}),$jsx("box",{height:1,marginTop:1,children:$jsx("text",{fg:theme.textMuted,children:"Enter next \xB7 Shift+Enter newline \xB7 Tab field \xB7 Esc cancel"})})]})};function openGenerate(dialog,run,opts){return new Promise((resolve4)=>{dialog.replace($jsx(Generate,{...opts,run,onDone:(p,txt)=>{resolve4(p?{path:p,prompt:txt}:null),dialog.clear()}}),()=>resolve4(null))})}var import_react99=__toESM(require_react_production(),1);import{existsSync as existsSync18,readFileSync as readFileSync11}from"fs";import{dirname as dirname11,join as join15}from"path";var exports_eikon={};__export(exports_eikon,{writeStudio:()=>writeStudio,useInstalled:()=>useInstalled,studioFile:()=>studioFile,sourceDir:()=>sourceDir,save:()=>save2,revision:()=>revision,remove:()=>remove2,register:()=>register,readStudio:()=>readStudio,raw:()=>raw,rasterizers:()=>rasterizers,rasterizer:()=>rasterizer,probe:()=>probe,previewPackage:()=>previewPackage,pick:()=>pick,peekSource:()=>peekSource,parseEikon:()=>parseEikon,onRevision:()=>onRevision,onRegistry:()=>onRegistry,loadCatalog:()=>loadCatalog2,list:()=>list2,installPackage:()=>installPackage,header:()=>header,findSource:()=>findSource,file:()=>file,fetchSource:()=>fetchSource,ensure:()=>ensure,eikon:()=>exports_eikon,dir:()=>dir,baked:()=>baked,adopt:()=>adopt,adaptPackage:()=>adaptPackage});import{existsSync as existsSync17,mkdirSync as mkdirSync4,readdirSync as readdirSync7,copyFileSync as copyFileSync2,readFileSync as readFileSync10,writeFileSync as writeFileSync4,rmSync as rmSync3}from"fs";import{join as join14,extname as extname3,basename as basename11,dirname as dirname10}from"path";import{existsSync as existsSync16,readFileSync as readFileSync9}from"fs";import{join as join13,dirname as dirname9}from"path";var locate2=()=>{let d2=import.meta.dir;for(let i=0;i<5;i++){let p=join13(d2,"assets/eikons");if(existsSync16(p))return p;let up=dirname9(d2);if(up===d2)break;d2=up}return join13(import.meta.dir,"../../../assets/eikons")},BUNDLED_EIKON_DIR=locate2(),packageEntrypoint=(dir)=>{let manifest2=join13(dir,"manifest.json");if(!existsSync16(manifest2))return;try{let entrypoints=JSON.parse(readFileSync9(manifest2,"utf8")).entrypoints,value=entrypoints&&typeof entrypoints==="object"&&!Array.isArray(entrypoints)?entrypoints.default:void 0,path7=typeof value==="string"?join13(dir,value):void 0;return path7&&existsSync16(path7)?path7:void 0}catch{return}};function bundledEikonPath(name){if(!name)return;let packageDir=join13(BUNDLED_EIKON_DIR,name),entry2=packageEntrypoint(packageDir);if(entry2)return entry2;for(let p of[join13(packageDir,`${name}.eikon`),join13(BUNDLED_EIKON_DIR,`${name}.eikon`)])if(existsSync16(p))return p;return}import{deflateSync}from"zlib";import{spawnSync as spawnSync2}from"child_process";import{statSync as statSync5}from"fs";var W2=48,H=24,FPS0=16,MAXF=256,S0={zoom:1,ox:0.5,oy:0.5},T0={contrast:1,invert:!0,flip:"none"},defaults=(r)=>Object.fromEntries(Object.entries(r.knobs).map(([k2,d2])=>[k2,d2.default])),caps={chafa:chafaBin(),ffmpeg:spawnSync2("ffmpeg",["-version"],{stdio:"ignore"}).status===0,ffprobe:spawnSync2("ffprobe",["-version"],{stdio:"ignore"}).status===0};function probe(path7){if(!caps.ffprobe)return null;let r=spawnSync2("ffprobe",["-v","error","-select_streams","v:0","-show_entries","stream=width,height","-of","csv=p=0",path7],{encoding:"utf8"});if(r.status!==0)return null;let m2=r.stdout.trim().match(/^(\d+),(\d+)/);return m2?{w:+m2[1],h:+m2[2]}:null}var clamp=(x2,lo,hi)=>Math.min(hi,Math.max(lo,x2)),SCALE=384,PLANE=SCALE*SCALE,VID=/\.(mp4|webm|mov|mkv|m4v|gif)$/i,clips=new Map,CLIP_CAP=8;function decode(src3,fps=FPS0){let full=resolveImage(src3);if(!full)return Promise.resolve(`not found: ${src3}`);let mt=statSync5(full,{throwIfNoEntry:!1})?.mtimeMs??0,key2=`${full}:${mt}:${fps}`,got=clips.get(key2);if(got)return clips.delete(key2),clips.set(key2,got),got;if(!caps.ffmpeg)return Promise.resolve("ffmpeg not installed");let video=VID.test(full),vf=[...video?[`fps=${fps}`]:[],`scale=${SCALE}:${SCALE}:force_original_aspect_ratio=increase`,`crop=${SCALE}:${SCALE}`].join(","),p=(async()=>{let ff=Bun.spawn(["ffmpeg","-hide_banner","-loglevel","error","-i",full,"-vf",vf,"-frames:v",video?String(MAXF):"1","-f","rawvideo","-pix_fmt","gray","-"],{stdout:"pipe",stderr:"pipe"}),[buf,err]=await Promise.all([new Response(ff.stdout).arrayBuffer().then((b2)=>new Uint8Array(b2)),new Response(ff.stderr).text()]);if(await ff.exited,ff.exitCode!==0)return`ffmpeg: ${err.trim()||"failed"}`;if(buf.length===0||buf.length%PLANE!==0)return`ffmpeg: bad read (${buf.length})`;let n=buf.length/PLANE;return{planes:Array.from({length:n},(_2,i)=>buf.subarray(i*PLANE,(i+1)*PLANE)),fps:video?fps:0,w:SCALE,h:SCALE}})();if(clips.size>=CLIP_CAP)clips.delete(clips.keys().next().value);return clips.set(key2,p),p}var prewarm=(src3,fps=FPS0)=>void decode(src3,fps);function crop(clip,sp){let side=Math.max(1,Math.round(clip.w*clamp(sp.zoom,0.1,1))),x0=Math.round((clip.w-side)*clamp(sp.ox,0,1)),y0=Math.round((clip.h-side)*clamp(sp.oy,0,1)),n=clip.planes.length,gray=new Uint8Array(side*side*n);for(let f=0;f<n;f++){let pl=clip.planes[f],off=f*side*side;for(let y2=0;y2<side;y2++)gray.set(pl.subarray((y0+y2)*clip.w+x0,(y0+y2)*clip.w+x0+side),off+y2*side)}let enc2;return{gray,w:side,h:side,frames:n,png:()=>enc2??=png(gray,side,side*n)}}function png(gray,w2,h2){let be32=(n)=>new Uint8Array([n>>>24,n>>>16&255,n>>>8&255,n&255]),T2=png_crc,crc=(b2)=>{let c=4294967295;for(let i=0;i<b2.length;i++)c=T2[(c^b2[i])&255]^c>>>8;return~c>>>0},chunk=(tag,data2)=>{let t2=new TextEncoder().encode(tag),body=new Uint8Array(t2.length+data2.length);return body.set(t2),body.set(data2,4),[be32(data2.length),body,be32(crc(body))]},ihdr=new Uint8Array(13);ihdr.set(be32(w2),0),ihdr.set(be32(h2),4),ihdr[8]=8,ihdr[9]=0,ihdr[10]=0,ihdr[11]=0,ihdr[12]=0;let raw=new Uint8Array(h2*(w2+1));for(let y2=0;y2<h2;y2++)raw.set(gray.subarray(y2*w2,(y2+1)*w2),y2*(w2+1)+1);let idat=new Uint8Array(deflateSync(raw,{level:1})),parts2=[new Uint8Array([137,80,78,71,13,10,26,10]),...chunk("IHDR",ihdr),...chunk("IDAT",idat),...chunk("IEND",new Uint8Array(0))],out=new Uint8Array(parts2.reduce((n,p)=>n+p.length,0)),o=0;for(let p of parts2)out.set(p,o),o+=p.length;return out}var png_crc=(()=>{let t2=new Uint32Array(256);for(let n=0;n<256;n++){let c=n;for(let k2=0;k2<8;k2++)c=c&1?3988292384^c>>>1:c>>>1;t2[n]=c>>>0}return t2})(),cache4=new Map,CAP3=256;function put(key2,v2){if(cache4.size>=CAP3)cache4.delete(cache4.keys().next().value);return cache4.set(key2,v2),v2}function hit(key2){let v2=cache4.get(key2);if(!v2)return;return cache4.delete(key2),cache4.set(key2,v2),v2}function resetCache(){cache4.clear(),clips.clear()}var keyOf=(r,src3,sp,tn,fps,k2)=>`${r}|${src3}|${fps}|${sp.zoom.toFixed(3)}:${sp.ox.toFixed(3)}:${sp.oy.toFixed(3)}|${tn.contrast.toFixed(2)}:${+tn.invert}:${tn.flip}|${JSON.stringify(k2)}`;async function cached2(r,src3,sp,tn,fps,k2,signal){let key2=keyOf(r.name,src3,sp,tn,fps,k2),got=hit(key2);if(got)return{frames:got};let cl=await decode(src3,fps);if(typeof cl==="string")return{err:cl};if(signal?.aborted)return{err:"aborted"};let out=await r.render(tone(crop(cl,sp),tn),k2,signal);if("err"in out)return out;if(signal?.aborted)return{err:"aborted"};return{frames:put(key2,out.frames)}}function pad(rows3){let out=rows3.slice(0,H);while(out.length<H)out.push("");return out.map((l)=>{if(l.includes("\x1B["))return l;let cp=Array.from(l);return cp.length>=W2?cp.slice(0,W2).join(""):l+" ".repeat(W2-cp.length)})}function box(out,n){let rows3=out.replace(/\n$/,"").split(`
4138
- `);return Array.from({length:n},(_2,i)=>pad(rows3.slice(i*H,(i+1)*H)))}function thumb(frame,w2=16,h2=8){let fx=W2/w2,fy=H/h2;return Array.from({length:h2},(_2,y2)=>{let row3=Array.from(frame[Math.min(H-1,Math.floor(y2*fy+fy/2))]??""),n=row3.length;return Array.from({length:w2},(_3,x2)=>row3[Math.min(n-1,Math.floor(x2*fx+fx/2))]??" ").join("")})}function tone(win,t2){let{gray:g,w:w2,h:h2,frames:n}=win,sz=w2*h2,flip=t2.flip,con=clamp(t2.contrast,0.25,4);for(let f=0;f<n;f++){let o=f*sz;if(flip==="h"||flip==="hv")for(let y2=0;y2<h2;y2++){let ro=o+y2*w2;for(let x2=0;x2<w2>>1;x2++){let t3=g[ro+x2];g[ro+x2]=g[ro+w2-1-x2],g[ro+w2-1-x2]=t3}}if(flip==="v"||flip==="hv")for(let y2=0;y2<h2>>1;y2++){let a=g.subarray(o+y2*w2,o+(y2+1)*w2),b2=g.subarray(o+(h2-1-y2)*w2,o+(h2-y2)*w2),t3=new Uint8Array(a);a.set(b2),b2.set(t3)}}if(Math.abs(con-1)>0.001)for(let f=0;f<n;f++){let o=f*sz,sum=0;for(let i=0;i<sz;i++)sum+=g[o+i];let m2=sum/sz;for(let i=0;i<sz;i++)g[o+i]=clamp(Math.round((g[o+i]-m2)*con+m2),0,255)}if(t2.invert)for(let i=0;i<g.length;i++)g[i]=255-g[i];return win}var chafa={name:"chafa",knobs:{symbols:{kind:"cycle",options:["braille","block","ascii","sextant","quad","half","wedge"],default:"braille",hint:"Glyph family used to draw pixels. Braille is densest; block is boldest; ascii is most compatible."},fill:{kind:"cycle",options:["none","stipple","ascii","braille"],default:"none",hint:"Secondary glyph set used where the primary leaves gaps."},dither:{kind:"cycle",options:["none","ordered","diffusion","noise"],default:"none",hint:"Adds texture to smooth gradients so mid-tones don't band."}},available:()=>caps.chafa?!0:"chafa not installed",async render(win,k2,signal){let bin=caps.chafa;if(!bin)return{err:"chafa not installed"};let fill=String(k2.fill??"none"),args=[`--size=${W2}x${H*win.frames}`,"--format=symbols","--stretch","--colors=none",`--symbols=${String(k2.symbols??"braille")}`,...fill==="none"?[]:[`--fill=${fill}`],`--dither=${String(k2.dither??"none")}`,"--preprocess","off","-"];if(signal?.aborted)return{err:"aborted"};let ch=Bun.spawn([bin,...args],{stdin:win.png(),stdout:"pipe",stderr:"pipe"}),kill=()=>ch.kill();signal?.addEventListener("abort",kill,{once:!0});let[out,cerr]=await Promise.all([new Response(ch.stdout).text(),new Response(ch.stderr).text()]);if(await ch.exited,signal?.removeEventListener("abort",kill),signal?.aborted)return{err:"aborted"};if(ch.exitCode!==0)return{err:`chafa: ${cerr.trim()||"failed"}`};return{frames:box(out,win.frames)}}},DOT=[[1,8],[2,16],[4,32],[64,128]],RAMP=" .:-=+*#%@";function sample(g,w2,h2,fw,fh){let sx=w2/fw,sy=h2/fh;return(gx,gy)=>g[Math.min(h2-1,Math.floor(gy*sy))*w2+Math.min(w2-1,Math.floor(gx*sx))]}function mean(g){let s=0;for(let i=0;i<g.length;i++)s+=g[i];return s/g.length}function braille(g,w2,h2){let at=sample(g,w2,h2,W2*2,H*4),thr=mean(g),rows3=[];for(let y2=0;y2<H;y2++){let row3="";for(let x2=0;x2<W2;x2++){let bits=0;for(let dy=0;dy<4;dy++)for(let dx=0;dx<2;dx++)if(at(x2*2+dx,y2*4+dy)>thr)bits|=DOT[dy][dx];row3+=String.fromCodePoint(10240+bits)}rows3.push(row3)}return rows3}function block(g,w2,h2){let at=sample(g,w2,h2,W2,H),n=RAMP.length-1,rows3=[];for(let y2=0;y2<H;y2++){let row3="";for(let x2=0;x2<W2;x2++)row3+=RAMP[Math.round(at(x2,y2)/255*n)];rows3.push(row3)}return rows3}var native={name:"native",knobs:{symbols:{kind:"cycle",options:["braille","block"],default:"braille",hint:"Glyph family used to draw pixels. Braille is denser; block is bolder."}},available:()=>caps.ffmpeg?!0:"ffmpeg not installed",async render(win,k2){let fn=k2.symbols==="block"?block:braille,sz=win.w*win.h;return{frames:Array.from({length:win.frames},(_2,i)=>fn(win.gray.subarray(i*sz,(i+1)*sz),win.w,win.h))}}},BUILTIN=[chafa,native];var exports_eikon_knobs={};__export(exports_eikon_knobs,{zoom:()=>zoom,unfork:()=>unfork,toStudio:()=>toStudio,swap:()=>swap,step:()=>step,slug:()=>slug2,setState:()=>setState,setSlider:()=>setSlider,reset:()=>reset2,pan:()=>pan,knobs:()=>exports_eikon_knobs,fresh:()=>fresh,fork:()=>fork,eff:()=>eff,edit:()=>edit,cycle:()=>cycle2,STATES:()=>STATES2});var STATES2=["idle","listening","thinking","speaking","working","error"],clamp2=(x2,lo,hi)=>Math.min(hi,Math.max(lo,x2)),round=(x2,p=3)=>+x2.toFixed(p),wrap=(arr,cur,d2)=>arr[(Math.max(0,arr.indexOf(cur))+d2+arr.length)%arr.length];function fresh(name,r,seed){return{name,state:"idle",dims:null,dirty:!1,rasterizer:seed?.rasterizer??r.name,spatial:seed?.spatial??{...S0},tone:{...T0,...seed?.tone},fps:seed?.fps??FPS0,base:seed?.base??defaults(r),per:seed?.per??{},glyph:seed?.glyph??"\u25C6",sources:seed?.sources??{},prompts:seed?.prompts??{}}}var eff=(s,state2)=>s.per[state2]??s.base;function edit(s,fn){let own=s.per[s.state];return own?{...s,per:{...s.per,[s.state]:fn(own)},dirty:!0}:{...s,base:fn(s.base),dirty:!0}}var fork=(s)=>s.per[s.state]?s:{...s,per:{...s.per,[s.state]:{...s.base}},dirty:!0},unfork=(s)=>{if(!s.per[s.state])return s;let{[s.state]:_2,...rest}=s.per;return{...s,per:rest,dirty:!0}},setState=(s,state2)=>({...s,state:state2}),cycle2=(s,d2)=>setState(s,wrap(STATES2,s.state,d2));function step(k2,id,def2,d2){if(def2.kind==="cycle")return{...k2,[id]:wrap(def2.options,String(k2[id]??def2.default),d2)};if(def2.kind==="toggle")return{...k2,[id]:!(k2[id]??def2.default)};let cur=Number(k2[id]??def2.default);return{...k2,[id]:round(clamp2(cur+d2*def2.step,def2.min,def2.max))}}function setSlider(k2,id,def2,v2){if(def2.kind!=="slider")return k2;return{...k2,[id]:round(clamp2(v2,def2.min,def2.max))}}function pan(sp,dx,dy,fine=!1){let s=fine?0.01:0.03;return{zoom:sp.zoom,ox:round(clamp2(sp.ox+dx*s,0,1)),oy:round(clamp2(sp.oy+dy*s,0,1))}}function zoom(sp,d2,fine=!1){let s=fine?0.02:0.05;return{...sp,zoom:round(clamp2(sp.zoom+d2*s,0.1,1))}}function swap(s,r){return{...s,rasterizer:r.name,base:defaults(r),per:{},dirty:!0}}var reset2=(s,r)=>({...s,spatial:{...S0},tone:{...T0},base:defaults(r),per:{},dirty:!0}),slug2=(v2)=>v2.toLowerCase().replace(/[^a-z0-9-]+/g,"-").replace(/^-+|-+$/g,"")||"wip",toStudio=(s)=>({rasterizer:s.rasterizer,spatial:s.spatial,tone:s.tone,fps:s.fps,base:s.base,per:s.per,glyph:s.glyph,sources:s.sources,prompts:s.prompts});var ROOT=()=>hermesPath("eikons"),dir=(name)=>join14(ROOT(),name),file=(name)=>join14(dir(name),`${name}.eikon`),sourceDir=(name)=>join14(dir(name),"source"),studioFile=(name)=>join14(dir(name),"studio.json");function ensure(name){return mkdirSync4(sourceDir(name),{recursive:!0}),{dir:dir(name),file:file(name),source:sourceDir(name)}}function manifest2(name){let p=join14(dir(name),"manifest.json");if(!existsSync17(p))return;try{let raw=JSON.parse(readFileSync10(p,"utf8"));if(raw&&typeof raw==="object")return raw}catch{}return}function list2(){let root2=ROOT();if(!existsSync17(root2))return[];return readdirSync7(root2,{withFileTypes:!0}).filter((e)=>e.isDirectory()&&existsSync17(join14(root2,e.name,`${e.name}.eikon`))).map((e)=>{let src3=join14(root2,e.name,"source"),has=existsSync17(src3)&&readdirSync7(src3).length>0,head=header(join14(root2,e.name,`${e.name}.eikon`));return{name:e.name,file:join14(root2,e.name,`${e.name}.eikon`),source:src3,hasSource:has,sourceUrl:typeof head?.source_url==="string"?head.source_url:void 0,manifest:manifest2(e.name)}})}function raw(){let root2=ROOT();if(!existsSync17(root2))return[];return readdirSync7(root2,{withFileTypes:!0}).filter((e)=>e.isDirectory()).map((e)=>e.name)}var IMG=/\.(png|jpe?g|webp|gif|bmp)$/i,VID2=/\.(mp4|webm|mov|mkv)$/i;function findSource(name,state2){let src3=sourceDir(name);if(!existsSync17(src3))return;let files=readdirSync7(src3).filter((f)=>IMG.test(f)||VID2.test(f));if(files.length===0)return;let by=(stem)=>files.find((f)=>basename11(f,extname3(f)).toLowerCase()===stem),pick=(state2&&by(state2))??by("base")??by("idle")??by(name)??files.find((f)=>IMG.test(f))??files[0];return join14(src3,pick)}function adopt(name,from2,role="base"){let fname=`${role}${extname3(from2).toLowerCase()}`,dst=join14(ensure(name).source,fname);if(from2!==dst)copyFileSync2(from2,dst);return fname}function readStudio(name){let p=studioFile(name);if(!existsSync17(p))return;let raw2=JSON.parse(readFileSync10(p,"utf8"));if(!raw2||typeof raw2!=="object")return;return raw2}function writeStudio(name,s){ensure(name),writeFileSync4(studioFile(name),JSON.stringify(s,null,2)+`
4139
- `,"utf8")}function header(path7){if(!existsSync17(path7))return;return peek2(path7)??void 0}function baked(name){let local=file(name);if(existsSync17(local))return local;let target=name.toLowerCase();for(let e of listEikons([BUNDLED_EIKON_DIR]))if(basename11(dirname10(e.path)).toLowerCase()===target||e.meta.name.toLowerCase()===target)return e.path;return bundledEikonPath("default")}var registry=new Map(BUILTIN.map((r)=>[r.name,r])),subs2=new Set;function register(r){registry.set(r.name,r);for(let f of subs2)f();return()=>{if(registry.get(r.name)===r)registry.delete(r.name);for(let f of subs2)f()}}var rasterizers=()=>[...registry.values()],rasterizer=(name)=>registry.get(name),onRegistry=(fn)=>{return subs2.add(fn),()=>subs2.delete(fn)};function pick(prefer){let want=prefer&&registry.get(prefer);if(want&&want.available()===!0)return want;for(let r of registry.values())if(r.available()===!0)return r;return registry.get("native")}var rev=0,revSubs=new Set,revision=()=>rev,onRevision=(fn)=>{return revSubs.add(fn),()=>revSubs.delete(fn)},bump=()=>{rev++;for(let f of revSubs)f()};function serialize2(name,glyph,fps,clips2,url2){let out=[JSON.stringify({eikon:1,name,width:W2,height:H,glyph,author:process.env.USER??"unknown",created:new Date().toISOString(),...url2?{source_url:url2}:{}})];for(let st of STATES2){let fs7=clips2.get(st);out.push(JSON.stringify({state:st,fps,frame_count:fs7.length,loop_from:0})),fs7.forEach((f,i)=>out.push(JSON.stringify({f:i,data:f.join(`
4140
- `)})))}return out.join(`
4141
- `)+`
4142
- `}async function save2(s){let r=rasterizer(s.rasterizer)??pick(s.rasterizer),paths=ensure(s.name),sources={};for(let[role,p]of Object.entries(s.sources)){if(!p)continue;let abs2=p.includes("/")?p:join14(paths.source,p);sources[role]=existsSync17(abs2)?adopt(s.name,abs2,role):p}let seen=new Map,clips2=new Map,blank=[Array.from({length:H},(_2,i)=>(i===H>>1?s.glyph.padStart(W2>>1):"").padEnd(W2))];for(let st of STATES2){let src3=findSource(s.name,st),k2=eff(s,st),key2=`${src3??""}|${JSON.stringify(k2)}`,fs7=seen.get(key2);if(!fs7){if(!src3)fs7=blank;else{let out=await cached2(r,src3,s.spatial,s.tone,s.fps,k2);if("err"in out)throw Error(out.err);fs7=out.frames}seen.set(key2,fs7)}clips2.set(st,fs7)}let url2=header(paths.file)?.source_url;return await Bun.write(paths.file,serialize2(s.name,s.glyph,s.fps,clips2,url2)),writeStudio(s.name,{...toStudio(s),sources}),set("eikon",s.name),bump(),paths.file}function remove2(name){if(rmSync3(dir(name),{recursive:!0,force:!0}),get2("eikon")===name)set("eikon",void 0);bump()}var peekSource=peek3;function stripManifestTrust(name){let p=join14(dir(name),"manifest.json");if(!existsSync17(p))return;let man=JSON.parse(readFileSync10(p,"utf8"));if(!("license"in man)&&!("provenance"in man))return;delete man.license,delete man.provenance,writeFileSync4(p,JSON.stringify(man,null,2)+`
4143
- `,"utf8")}async function fetchSource(src3,opts){let out=await install(src3,ROOT(),opts);stripManifestTrust(out.name);let prev=readStudio(out.name);return writeStudio(out.name,{...prev??toStudio(fresh(out.name,pick())),sources:{...prev?.sources,...out.sources}}),bump(),{name:out.name,sources:out.sources,n:out.n,bytes:out.bytes}}var OBJ=(x2)=>!!x2&&typeof x2==="object"&&!Array.isArray(x2),SAFE=/^[a-zA-Z0-9._/-]+$/,LEGACY=/\.eikon$/i;function safePath(path7){if(!path7||path7.startsWith("/")||path7.startsWith("./")||path7.includes("../")||path7==="..")return!1;if(!SAFE.test(path7))return!1;return!path7.split("/").includes("..")}function pkgErr(path7,msg){return Error(`${path7}: ${msg}`)}function launchOk(range){let lower=range.match(/>=?\s*(\d+)/);if(lower&&Number(lower[1])>2)return!1;let exact=range.match(/^\s*(\d+)(?:\.\d+)?\s*$/);if(exact&&Number(exact[1])!==2)return!1;return!/^\s*>=?\s*99/.test(range)}function validatePkg(value){if(!OBJ(value))throw pkgErr("manifest","object required");let man=value;if(man.kind!=="eikon.package")throw pkgErr("kind","must be eikon.package");if(!/^[a-z0-9][a-z0-9-]{1,63}$/.test(String(man.name??"")))throw pkgErr("name","safe package name required");if(!man.id||typeof man.id!=="string")throw pkgErr("id","safe id required");if(!OBJ(man.compatibility)||typeof man.compatibility.eikon!=="string")throw pkgErr("compatibility.eikon","required");if(!launchOk(man.compatibility.eikon))throw pkgErr("compatibility.eikon","must support launch major version 2");if(!OBJ(man.entrypoints)||typeof man.entrypoints.default!=="string"||!safePath(man.entrypoints.default))throw pkgErr("entrypoints.default","safe relative path required");for(let[k2,p]of Object.entries(man.entrypoints))if(typeof p!=="string"||!safePath(p))throw pkgErr(`entrypoints.${k2}`,"safe relative path required");for(let f of man.files??[])if(!f||typeof f.path!=="string"||!safePath(f.path))throw pkgErr("files.path","safe relative path required");if(man.poster&&!safePath(man.poster))throw pkgErr("poster","safe relative path required");if(man.preview&&!safePath(man.preview))throw pkgErr("preview","safe relative path required");for(let[k2,mapping]of Object.entries(man.signals??{}))if(!mapping||typeof mapping.fallback!=="string")throw pkgErr(`signals.${k2}.fallback`,"fallback required");return man}function asUrl(value,base2){if(/^file:\/\//.test(value))return value;let out=new URL(value,base2);if(out.protocol!=="http:"&&out.protocol!=="https:")throw pkgErr("packageUrl","http(s) URL required");return out.toString()}function relUrl(base2,path7){if(!path7)return;if(/^(https?|file):\/\//.test(path7))return asUrl(path7);if(!safePath(path7))throw pkgErr("path","safe relative path required");return new URL(path7,base2).toString()}function entryState(name,available=!0){if(!available)return"incompatible";if(get2("eikon")===name)return"active";if(existsSync17(file(name)))return"installed";return"available"}function normalize2(input,base2){if(!OBJ(input))throw pkgErr("catalog","entry object required");if(input.kind==="eikon.catalog.entry"){let entry2=input;return{...entry2,state:entryState(entry2.name,entry2.compatibility?.available!==!1)}}if(OBJ(input.manifest)&&typeof input.packageUrl==="string"){let man=validatePkg(input.manifest),packageUrl2=asUrl(input.packageUrl,base2),root2=packageUrl2.slice(0,packageUrl2.lastIndexOf("/")+1);return{kind:"eikon.catalog.entry",schemaVersion:"1.0",id:man.id,sourceKey:typeof input.sourceKey==="string"?input.sourceKey:packageUrl2,name:man.name,title:man.display?.title,author:man.display?.author,description:man.display?.description,glyph:man.display?.glyph,tags:man.display?.tags,poster:relUrl(root2,man.poster),preview:relUrl(root2,man.preview??man.entrypoints.default),packageUrl:packageUrl2,detailUrl:typeof input.detailUrl==="string"?asUrl(input.detailUrl,root2):void 0,installUrl:typeof input.installUrl==="string"?asUrl(input.installUrl,root2):packageUrl2,compatibility:{eikon:man.compatibility.eikon,hosts:man.compatibility.hosts,available:launchOk(man.compatibility.eikon)},state:entryState(man.name,launchOk(man.compatibility.eikon))}}let name=String(input.name??"");if(!/^[a-z0-9][a-z0-9-]{1,63}$/.test(name))throw pkgErr("name","safe catalog name required");let source=typeof input.source==="string"?input.source:`${name}/`,packageUrl=/^(https?|file):\/\//.test(source)?asUrl(source):base2?new URL(source,base2).toString():source,manifest3=packageUrl.endsWith("manifest.json")?packageUrl:new URL("manifest.json",packageUrl.endsWith("/")?packageUrl:`${packageUrl}/`).toString();return{kind:"eikon.catalog.entry",schemaVersion:"1.0",id:name,sourceKey:packageUrl,name,author:typeof input.author==="string"?input.author:void 0,title:typeof input.title==="string"?input.title:void 0,description:typeof input.description==="string"?input.description:void 0,tags:Array.isArray(input.tags)?input.tags.filter((x2)=>typeof x2==="string"):void 0,glyph:typeof input.glyph==="string"?input.glyph:void 0,poster:typeof input.poster==="string"?input.poster:void 0,packageUrl:manifest3,compatibility:{eikon:">=1 <3",available:!0},state:entryState(name)}}async function loadText(url2,fetcher=fetch){if(url2.startsWith("file://"))return readFileSync10(new URL(url2),"utf8");let res=await fetcher(url2);if(!res.ok)throw Error(`fetch: ${res.status} ${url2}`);return await res.text()}async function loadJson(url2,fetcher=fetch){return JSON.parse(await loadText(url2,fetcher))}async function loadCatalog2(index=process.env.HERM_EIKON_MARKETPLACE||DEFAULT_PUBLIC_CATALOG,fetcher=fetch){let url2=index.endsWith("index.json")?index:`${index.replace(/\/$/,"")}/index.json`,raw2=await loadJson(url2,fetcher);if(!Array.isArray(raw2))throw pkgErr("catalog","index array required");let base2=url2.slice(0,url2.lastIndexOf("/")+1);return raw2.map((item)=>normalize2(item,base2))}function legacyToLaunch(raw2){return parseEikon(raw2)}async function adaptPackage(manifest3,streamText,legacyText){let man=validatePkg(manifest3),entry2=man.entrypoints.default,body=streamText??legacyText;if(!body)throw pkgErr("entrypoints.default","stream data required");let eik=LEGACY.test(entry2)||man.legacy?.sourceFormat===".eikon"?legacyToLaunch(body):parseLaunch(body);for(let st of STATES2)if(!eik.states.has(st))throw pkgErr(`states.${st}`,"canonical lifecycle state required");return{manifest:man,eikon:eik,states:[...STATES2],signals:man.signals,triggers:man.triggers,extensions:man.extensions}}function parseLaunch(text3){let lines2=text3.split(`
4144
- `),clips2=new Map,name="unnamed",glyph,width=0,height=0,cur,seal=()=>{if(!cur)return;if(cur.frameCount!=null&&cur.frameCount!==cur.frames.length)throw pkgErr(`clip.${cur.name}`,`frameCount=${cur.frameCount} but got ${cur.frames.length}`);clips2.set(cur.name,{fps:cur.fps,frames:cur.frames,loopFrom:Math.max(0,Math.min(cur.loopFrom,cur.frames.length))}),cur=void 0};for(let line3 of lines2){if(!line3.trim())continue;let rec=JSON.parse(line3);if(rec.type==="header"){let major=Number(String(rec.asset?.version??"").split(".")[0]);if(!major||major>2)throw pkgErr("header.asset.version","unsupported Eikon stream version");name=typeof rec.name==="string"?rec.name:name,glyph=typeof rec.glyph==="string"?rec.glyph:void 0,width=Number(rec.asset?.width??0),height=Number(rec.asset?.height??0);continue}if(rec.type==="clip"){seal(),cur={name:rec.name,fps:rec.fps,frameCount:rec.frameCount,loopFrom:rec.loopFrom??0,frames:[]};continue}if(rec.type==="frame"){if(!cur||cur.name!==rec.clip||rec.index!==cur.frames.length)throw pkgErr("frame","frame order mismatch");cur.frames.push(rec.rows)}}return seal(),{meta:{version:2,name,glyph,width,height,states:[...clips2.keys()]},states:clips2}}async function loadPackage(url2,fetcher=fetch){return{man:validatePkg(await loadJson(url2,fetcher)),base:url2.slice(0,url2.lastIndexOf("/")+1)}}async function previewPackage(entry2,fetcher=fetch){let{man,base:base2}=await loadPackage(entry2.packageUrl,fetcher),streamUrl=new URL(man.entrypoints.default,base2).toString();return adaptPackage(man,await loadText(streamUrl,fetcher))}async function installLaunch(url2,opts={}){let{man,base:base2}=await loadPackage(url2,opts.fetcher),name=opts.name??man.name,streamUrl=new URL(man.entrypoints.default,base2).toString(),text3=await loadText(streamUrl,opts.fetcher),adapted=await adaptPackage(man,LEGACY.test(man.entrypoints.default)?void 0:text3,LEGACY.test(man.entrypoints.default)?text3:void 0),paths=ensure(name),clips2=new Map;for(let st of STATES2)clips2.set(st,adapted.eikon.states.get(st)?.frames??[[""]]);let packed=serialize2(name,adapted.manifest.display?.glyph??adapted.eikon.meta.glyph??"\u25C6",adapted.eikon.states.get("idle")?.fps??12,clips2,base2);return await Bun.write(paths.file,packed),await Bun.write(join14(paths.dir,"manifest.json"),JSON.stringify({...man,origin:{source:url2,at:new Date().toISOString()}},null,2)+`
4145
- `),writeStudio(name,{...toStudio(fresh(name,pick())),sources:{}}),bump(),{name,sources:{},n:1,bytes:text3.length}}async function installPackage(src3,opts={}){let url2=typeof src3==="string"?src3:src3.installUrl??src3.packageUrl;if(url2.endsWith("manifest.json")||url2.startsWith("file://"))return installLaunch(url2,opts);return fetchSource(url2,{name:opts.name})}function useInstalled(name){if(!existsSync17(file(name)))throw Error(`eikon '${name}' is not installed`);set("eikon",name),bump()}var TOKEN2=/(gh[pousr]_[A-Za-z0-9_]+|github_pat_[A-Za-z0-9_]+|Bearer\s+[A-Za-z0-9._~+/=-]+|token\s+[A-Za-z0-9._~+/=-]+|\*{3,})/gi;function submitPath(name){return file(name)}function publishedInfo(path7){let head=header(path7);if(typeof head?.source_url==="string"&&head.source_url.trim())return{source:head.source_url};let mf=join15(dirname11(path7),"manifest.json");if(!existsSync18(mf))return;try{let man=JSON.parse(readFileSync11(mf,"utf8")),src3=man.origin?.source??man.sourceUrl??man.source_url;if(typeof src3==="string"&&src3.trim())return{source:src3}}catch{}return}function redact2(message){return message.replace(TOKEN2,"[redacted]")}function failureText(xs){return xs.map((x2)=>redact2(x2.message)).join(`
4140
+ `);return Array.from({length:n},(_2,i)=>pad(rows3.slice(i*H,(i+1)*H)))}function thumb(frame,w2=16,h2=8){let fx=W2/w2,fy=H/h2;return Array.from({length:h2},(_2,y2)=>{let row3=Array.from(frame[Math.min(H-1,Math.floor(y2*fy+fy/2))]??""),n=row3.length;return Array.from({length:w2},(_3,x2)=>row3[Math.min(n-1,Math.floor(x2*fx+fx/2))]??" ").join("")})}function tone(win,t2){let{gray:g,w:w2,h:h2,frames:n}=win,sz=w2*h2,flip=t2.flip,con=clamp(t2.contrast,0.25,4);for(let f=0;f<n;f++){let o=f*sz;if(flip==="h"||flip==="hv")for(let y2=0;y2<h2;y2++){let ro=o+y2*w2;for(let x2=0;x2<w2>>1;x2++){let t3=g[ro+x2];g[ro+x2]=g[ro+w2-1-x2],g[ro+w2-1-x2]=t3}}if(flip==="v"||flip==="hv")for(let y2=0;y2<h2>>1;y2++){let a=g.subarray(o+y2*w2,o+(y2+1)*w2),b2=g.subarray(o+(h2-1-y2)*w2,o+(h2-y2)*w2),t3=new Uint8Array(a);a.set(b2),b2.set(t3)}}if(Math.abs(con-1)>0.001)for(let f=0;f<n;f++){let o=f*sz,sum=0;for(let i=0;i<sz;i++)sum+=g[o+i];let m2=sum/sz;for(let i=0;i<sz;i++)g[o+i]=clamp(Math.round((g[o+i]-m2)*con+m2),0,255)}if(t2.invert)for(let i=0;i<g.length;i++)g[i]=255-g[i];return win}var chafa={name:"chafa",knobs:{symbols:{kind:"cycle",options:["braille","block","ascii","sextant","quad","half","wedge"],default:"braille",hint:"Glyph family used to draw pixels. Braille is densest; block is boldest; ascii is most compatible."},fill:{kind:"cycle",options:["none","stipple","ascii","braille"],default:"none",hint:"Secondary glyph set used where the primary leaves gaps."},dither:{kind:"cycle",options:["none","ordered","diffusion","noise"],default:"none",hint:"Adds texture to smooth gradients so mid-tones don't band."}},available:()=>caps.chafa?!0:"chafa not installed",async render(win,k2,signal){let bin=caps.chafa;if(!bin)return{err:"chafa not installed"};let fill=String(k2.fill??"none"),args=[`--size=${W2}x${H*win.frames}`,"--format=symbols","--stretch","--colors=none",`--symbols=${String(k2.symbols??"braille")}`,...fill==="none"?[]:[`--fill=${fill}`],`--dither=${String(k2.dither??"none")}`,"--preprocess","off","-"];if(signal?.aborted)return{err:"aborted"};let ch=Bun.spawn([bin,...args],{stdin:win.png(),stdout:"pipe",stderr:"pipe"}),kill=()=>ch.kill();signal?.addEventListener("abort",kill,{once:!0});let[out,cerr]=await Promise.all([new Response(ch.stdout).text(),new Response(ch.stderr).text()]);if(await ch.exited,signal?.removeEventListener("abort",kill),signal?.aborted)return{err:"aborted"};if(ch.exitCode!==0)return{err:`chafa: ${cerr.trim()||"failed"}`};return{frames:box(out,win.frames)}}},DOT=[[1,8],[2,16],[4,32],[64,128]],RAMP=" .:-=+*#%@";function sample(g,w2,h2,fw,fh){let sx=w2/fw,sy=h2/fh;return(gx,gy)=>g[Math.min(h2-1,Math.floor(gy*sy))*w2+Math.min(w2-1,Math.floor(gx*sx))]}function mean(g){let s=0;for(let i=0;i<g.length;i++)s+=g[i];return s/g.length}function braille(g,w2,h2){let at=sample(g,w2,h2,W2*2,H*4),thr=mean(g),rows3=[];for(let y2=0;y2<H;y2++){let row3="";for(let x2=0;x2<W2;x2++){let bits=0;for(let dy=0;dy<4;dy++)for(let dx=0;dx<2;dx++)if(at(x2*2+dx,y2*4+dy)>thr)bits|=DOT[dy][dx];row3+=String.fromCodePoint(10240+bits)}rows3.push(row3)}return rows3}function block(g,w2,h2){let at=sample(g,w2,h2,W2,H),n=RAMP.length-1,rows3=[];for(let y2=0;y2<H;y2++){let row3="";for(let x2=0;x2<W2;x2++)row3+=RAMP[Math.round(at(x2,y2)/255*n)];rows3.push(row3)}return rows3}var native={name:"native",knobs:{symbols:{kind:"cycle",options:["braille","block"],default:"braille",hint:"Glyph family used to draw pixels. Braille is denser; block is bolder."}},available:()=>caps.ffmpeg?!0:"ffmpeg not installed",async render(win,k2){let fn=k2.symbols==="block"?block:braille,sz=win.w*win.h;return{frames:Array.from({length:win.frames},(_2,i)=>fn(win.gray.subarray(i*sz,(i+1)*sz),win.w,win.h))}}},BUILTIN=[chafa,native];var exports_eikon_knobs={};__export(exports_eikon_knobs,{zoom:()=>zoom,unfork:()=>unfork,toStudio:()=>toStudio,swap:()=>swap,step:()=>step,slug:()=>slug2,setState:()=>setState,setSlider:()=>setSlider,reset:()=>reset2,pan:()=>pan,knobs:()=>exports_eikon_knobs,fresh:()=>fresh,fork:()=>fork,eff:()=>eff,edit:()=>edit,cycle:()=>cycle2,STATES:()=>STATES2});var STATES2=["idle","listening","thinking","speaking","working","error"],clamp2=(x2,lo,hi)=>Math.min(hi,Math.max(lo,x2)),round=(x2,p=3)=>+x2.toFixed(p),wrap=(arr,cur,d2)=>arr[(Math.max(0,arr.indexOf(cur))+d2+arr.length)%arr.length];function fresh(name,r,seed){return{name,state:"idle",dims:null,dirty:!1,rasterizer:seed?.rasterizer??r.name,spatial:seed?.spatial??{...S0},tone:{...T0,...seed?.tone},fps:seed?.fps??FPS0,base:seed?.base??defaults(r),per:seed?.per??{},glyph:seed?.glyph??"\u25C6",sources:seed?.sources??{},prompts:seed?.prompts??{}}}var eff=(s,state2)=>s.per[state2]??s.base;function edit(s,fn){let own=s.per[s.state];return own?{...s,per:{...s.per,[s.state]:fn(own)},dirty:!0}:{...s,base:fn(s.base),dirty:!0}}var fork=(s)=>s.per[s.state]?s:{...s,per:{...s.per,[s.state]:{...s.base}},dirty:!0},unfork=(s)=>{if(!s.per[s.state])return s;let{[s.state]:_2,...rest}=s.per;return{...s,per:rest,dirty:!0}},setState=(s,state2)=>({...s,state:state2}),cycle2=(s,d2)=>setState(s,wrap(STATES2,s.state,d2));function step(k2,id,def2,d2){if(def2.kind==="cycle")return{...k2,[id]:wrap(def2.options,String(k2[id]??def2.default),d2)};if(def2.kind==="toggle")return{...k2,[id]:!(k2[id]??def2.default)};let cur=Number(k2[id]??def2.default);return{...k2,[id]:round(clamp2(cur+d2*def2.step,def2.min,def2.max))}}function setSlider(k2,id,def2,v2){if(def2.kind!=="slider")return k2;return{...k2,[id]:round(clamp2(v2,def2.min,def2.max))}}function pan(sp,dx,dy,fine=!1){let s=fine?0.01:0.03;return{zoom:sp.zoom,ox:round(clamp2(sp.ox+dx*s,0,1)),oy:round(clamp2(sp.oy+dy*s,0,1))}}function zoom(sp,d2,fine=!1){let s=fine?0.02:0.05;return{...sp,zoom:round(clamp2(sp.zoom+d2*s,0.1,1))}}function swap(s,r){return{...s,rasterizer:r.name,base:defaults(r),per:{},dirty:!0}}var reset2=(s,r)=>({...s,spatial:{...S0},tone:{...T0},base:defaults(r),per:{},dirty:!0}),slug2=(v2)=>v2.toLowerCase().replace(/[^a-z0-9-]+/g,"-").replace(/^-+|-+$/g,"")||"wip",toStudio=(s)=>({rasterizer:s.rasterizer,spatial:s.spatial,tone:s.tone,fps:s.fps,base:s.base,per:s.per,glyph:s.glyph,sources:s.sources,prompts:s.prompts});var ROOT=()=>hermesPath("eikons"),dir=(name)=>join14(ROOT(),name),file=(name)=>join14(dir(name),`${name}.eikon`),sourceDir=(name)=>join14(dir(name),"source"),studioFile=(name)=>join14(dir(name),"studio.json");function ensure(name){return mkdirSync4(sourceDir(name),{recursive:!0}),{dir:dir(name),file:file(name),source:sourceDir(name)}}function manifest2(name){let p=join14(dir(name),"manifest.json");if(!existsSync17(p))return;try{let raw=JSON.parse(readFileSync10(p,"utf8"));if(raw&&typeof raw==="object")return raw}catch{}return}var LEGACY_SOURCE_URL="source_url";function origin(man){let o=man?.origin;if(!o||typeof o!=="object"||Array.isArray(o))return;let src3=o.source;return typeof src3==="string"?src3:void 0}function legacySource(head){let src3=head?.[LEGACY_SOURCE_URL];return typeof src3==="string"?src3:void 0}function list2(){let root2=ROOT();if(!existsSync17(root2))return[];return readdirSync7(root2,{withFileTypes:!0}).filter((e)=>e.isDirectory()&&existsSync17(join14(root2,e.name,`${e.name}.eikon`))).map((e)=>{let src3=join14(root2,e.name,"source"),has=existsSync17(src3)&&readdirSync7(src3).length>0,man=manifest2(e.name),head=header(join14(root2,e.name,`${e.name}.eikon`));return{name:e.name,file:join14(root2,e.name,`${e.name}.eikon`),source:src3,hasSource:has,sourceUrl:origin(man)??legacySource(head),manifest:man}})}function raw(){let root2=ROOT();if(!existsSync17(root2))return[];return readdirSync7(root2,{withFileTypes:!0}).filter((e)=>e.isDirectory()).map((e)=>e.name)}var IMG=/\.(png|jpe?g|webp|gif|bmp)$/i,VID2=/\.(mp4|webm|mov|mkv)$/i;function findSource(name,state2){let src3=sourceDir(name);if(!existsSync17(src3))return;let files=readdirSync7(src3).filter((f)=>IMG.test(f)||VID2.test(f));if(files.length===0)return;let by=(stem)=>files.find((f)=>basename11(f,extname3(f)).toLowerCase()===stem),pick=(state2&&by(state2))??by("base")??by("idle")??by(name)??files.find((f)=>IMG.test(f))??files[0];return join14(src3,pick)}function adopt(name,from2,role="base"){let fname=`${role}${extname3(from2).toLowerCase()}`,dst=join14(ensure(name).source,fname);if(from2!==dst)copyFileSync2(from2,dst);return fname}function readStudio(name){let p=studioFile(name);if(!existsSync17(p))return;let raw2=JSON.parse(readFileSync10(p,"utf8"));if(!raw2||typeof raw2!=="object")return;return raw2}function writeStudio(name,s){ensure(name),writeFileSync4(studioFile(name),JSON.stringify(s,null,2)+`
4141
+ `,"utf8")}function header(path7){if(!existsSync17(path7))return;return peek2(path7)??void 0}function baked(name){let local=file(name);if(existsSync17(local))return local;let target=name.toLowerCase();for(let e of listEikons([BUNDLED_EIKON_DIR]))if(basename11(dirname10(e.path)).toLowerCase()===target||e.meta.name.toLowerCase()===target)return e.path;return bundledEikonPath("default")}var registry=new Map(BUILTIN.map((r)=>[r.name,r])),subs2=new Set;function register(r){registry.set(r.name,r);for(let f of subs2)f();return()=>{if(registry.get(r.name)===r)registry.delete(r.name);for(let f of subs2)f()}}var rasterizers=()=>[...registry.values()],rasterizer=(name)=>registry.get(name),onRegistry=(fn)=>{return subs2.add(fn),()=>subs2.delete(fn)};function pick(prefer){let want=prefer&&registry.get(prefer);if(want&&want.available()===!0)return want;for(let r of registry.values())if(r.available()===!0)return r;return registry.get("native")}var rev=0,revSubs=new Set,revision=()=>rev,onRevision=(fn)=>{return revSubs.add(fn),()=>revSubs.delete(fn)},bump=()=>{rev++;for(let f of revSubs)f()};function serialize2(name,fps,clips2){let records=[{type:"header",eikon:1,id:name,title:name,author:{name:process.env.USER??"unknown"},size:{cols:W2,rows:H},defaultSignal:"state.idle",signals:defaultSignalMappings()}];for(let st of STATES2){let fs7=clips2.get(st);records.push({type:"clip",name:st,fps,frameCount:fs7.length,loopFrom:0}),fs7.forEach((f,i)=>records.push({type:"frame",clip:st,index:i,rows:f}))}return serializeLaunchStream(records)}function preserve(name,src3){if(!src3)return;let man=manifest2(name)??{name};if(origin(man))return;writeFileSync4(join14(dir(name),"manifest.json"),JSON.stringify({...man,origin:{source:src3,at:new Date().toISOString()}},null,2)+`
4142
+ `,"utf8")}async function save2(s){let r=rasterizer(s.rasterizer)??pick(s.rasterizer),paths=ensure(s.name),sources={};for(let[role,p]of Object.entries(s.sources)){if(!p)continue;let abs2=p.includes("/")?p:join14(paths.source,p);sources[role]=existsSync17(abs2)?adopt(s.name,abs2,role):p}let seen=new Map,clips2=new Map,blank=[Array.from({length:H},(_2,i)=>(i===H>>1?s.glyph.padStart(W2>>1):"").padEnd(W2))];for(let st of STATES2){let src3=findSource(s.name,st),k2=eff(s,st),key2=`${src3??""}|${JSON.stringify(k2)}`,fs7=seen.get(key2);if(!fs7){if(!src3)fs7=blank;else{let out=await cached2(r,src3,s.spatial,s.tone,s.fps,k2);if("err"in out)throw Error(out.err);fs7=out.frames}seen.set(key2,fs7)}clips2.set(st,fs7)}let head=header(paths.file);return preserve(s.name,legacySource(head)),await Bun.write(paths.file,serialize2(s.name,s.fps,clips2)),writeStudio(s.name,{...toStudio(s),sources}),set("eikon",s.name),bump(),paths.file}function remove2(name){if(rmSync3(dir(name),{recursive:!0,force:!0}),get2("eikon")===name)set("eikon",void 0);bump()}var peekSource=peek3;function stripManifestTrust(name){let p=join14(dir(name),"manifest.json");if(!existsSync17(p))return;let man=JSON.parse(readFileSync10(p,"utf8"));if(!("license"in man)&&!("provenance"in man))return;delete man.license,delete man.provenance,writeFileSync4(p,JSON.stringify(man,null,2)+`
4143
+ `,"utf8")}async function fetchSource(src3,opts){let out=await install(src3,ROOT(),opts);stripManifestTrust(out.name);let prev=readStudio(out.name);return writeStudio(out.name,{...prev??toStudio(fresh(out.name,pick())),sources:{...prev?.sources,...out.sources}}),bump(),{name:out.name,sources:out.sources,n:out.n,bytes:out.bytes}}var OBJ=(x2)=>!!x2&&typeof x2==="object"&&!Array.isArray(x2),SAFE=/^[a-zA-Z0-9._/-]+$/;function safePath(path7){if(!path7||path7.startsWith("/")||path7.startsWith("./")||path7.includes("../")||path7==="..")return!1;if(!SAFE.test(path7))return!1;return!path7.split("/").includes("..")}function pkgErr(path7,msg){return Error(`${path7}: ${msg}`)}function launchOk(range){let lower=range.match(/>=?\s*(\d+)/);if(lower&&Number(lower[1])>1)return!1;let exact=range.match(/^\s*(\d+)(?:\.\d+)?\s*$/);if(exact&&Number(exact[1])!==1)return!1;if(/>=?\s*2\b|\^\s*2\b/.test(range))return!1;return!/^\s*>=?\s*99/.test(range)}function validatePkg(value){if(!OBJ(value))throw pkgErr("manifest","object required");let man=value;if(man.kind!=="eikon.package")throw pkgErr("kind","must be eikon.package");if(!/^[a-z0-9][a-z0-9-]{1,63}$/.test(String(man.name??"")))throw pkgErr("name","safe package name required");if(!man.id||typeof man.id!=="string")throw pkgErr("id","safe id required");if(!OBJ(man.compatibility)||typeof man.compatibility.eikon!=="string")throw pkgErr("compatibility.eikon","required");if(!launchOk(man.compatibility.eikon))throw pkgErr("compatibility.eikon","must support launch major version 1");if(!OBJ(man.entrypoints)||typeof man.entrypoints.default!=="string"||!safePath(man.entrypoints.default))throw pkgErr("entrypoints.default","safe relative path required");for(let[k2,p]of Object.entries(man.entrypoints))if(typeof p!=="string"||!safePath(p))throw pkgErr(`entrypoints.${k2}`,"safe relative path required");for(let f of man.files??[])if(!f||typeof f.path!=="string"||!safePath(f.path))throw pkgErr("files.path","safe relative path required");if(man.poster&&!safePath(man.poster))throw pkgErr("poster","safe relative path required");if(man.preview&&!safePath(man.preview))throw pkgErr("preview","safe relative path required");return man}function asUrl(value,base2){if(/^file:\/\//.test(value))return value;let out=new URL(value,base2);if(out.protocol!=="http:"&&out.protocol!=="https:")throw pkgErr("packageUrl","http(s) URL required");return out.toString()}function relUrl(base2,path7){if(!path7)return;if(/^(https?|file):\/\//.test(path7))return asUrl(path7);if(!safePath(path7))throw pkgErr("path","safe relative path required");return new URL(path7,base2).toString()}function entryState(name,available=!0){if(!available)return"incompatible";if(get2("eikon")===name)return"active";if(existsSync17(file(name)))return"installed";return"available"}function normalize2(input,base2){if(!OBJ(input))throw pkgErr("catalog","entry object required");if(input.kind==="eikon.catalog.entry"){let entry2=input;return{...entry2,state:entryState(entry2.name,entry2.compatibility?.available!==!1)}}if(OBJ(input.manifest)&&typeof input.packageUrl==="string"){let man=validatePkg(input.manifest),packageUrl2=asUrl(input.packageUrl,base2),root2=packageUrl2.slice(0,packageUrl2.lastIndexOf("/")+1);return{kind:"eikon.catalog.entry",schemaVersion:"1.0",id:man.id,sourceKey:typeof input.sourceKey==="string"?input.sourceKey:packageUrl2,name:man.name,title:man.display?.title,author:man.display?.author,description:man.display?.description,glyph:man.display?.glyph,tags:man.display?.tags,poster:relUrl(root2,man.poster),preview:relUrl(root2,man.preview??man.entrypoints.default),packageUrl:packageUrl2,detailUrl:typeof input.detailUrl==="string"?asUrl(input.detailUrl,root2):void 0,compatibility:{eikon:man.compatibility.eikon,hosts:man.compatibility.hosts,available:launchOk(man.compatibility.eikon)},state:entryState(man.name,launchOk(man.compatibility.eikon))}}let name=String(input.name??"");if(!/^[a-z0-9][a-z0-9-]{1,63}$/.test(name))throw pkgErr("name","safe catalog name required");let source=typeof input.source==="string"?input.source:`${name}/`,packageUrl=/^(https?|file):\/\//.test(source)?asUrl(source):base2?new URL(source,base2).toString():source,manifest3=packageUrl.endsWith("manifest.json")?packageUrl:new URL("manifest.json",packageUrl.endsWith("/")?packageUrl:`${packageUrl}/`).toString();return{kind:"eikon.catalog.entry",schemaVersion:"1.0",id:name,sourceKey:packageUrl,name,author:typeof input.author==="string"?input.author:void 0,title:typeof input.title==="string"?input.title:void 0,description:typeof input.description==="string"?input.description:void 0,tags:Array.isArray(input.tags)?input.tags.filter((x2)=>typeof x2==="string"):void 0,glyph:typeof input.glyph==="string"?input.glyph:void 0,poster:typeof input.poster==="string"?input.poster:void 0,packageUrl:manifest3,compatibility:{eikon:">=1 <2",available:!0},state:entryState(name)}}async function loadText(url2,fetcher=fetch){if(url2.startsWith("file://"))return readFileSync10(new URL(url2),"utf8");let res=await fetcher(url2);if(!res.ok)throw Error(`fetch: ${res.status} ${url2}`);return await res.text()}async function loadJson(url2,fetcher=fetch){return JSON.parse(await loadText(url2,fetcher))}async function loadCatalog2(index=process.env.HERM_EIKON_MARKETPLACE||DEFAULT_PUBLIC_CATALOG,fetcher=fetch){let url2=index.endsWith("index.json")?index:`${index.replace(/\/$/,"")}/index.json`,raw2=await loadJson(url2,fetcher);if(!Array.isArray(raw2))throw pkgErr("catalog","index array required");let base2=url2.slice(0,url2.lastIndexOf("/")+1);return raw2.map((item)=>normalize2(item,base2))}async function adaptPackage(manifest3,streamText,legacyText){let man=validatePkg(manifest3),body=streamText??legacyText;if(!body)throw pkgErr("entrypoints.default","stream data required");let eik=parseEikon(body);for(let st of STATES2)if(!eik.states.has(st))throw pkgErr(`states.${st}`,"canonical lifecycle state required");return{manifest:man,eikon:eik,states:[...STATES2],triggers:man.triggers,extensions:man.extensions}}async function loadPackage(url2,fetcher=fetch){return{man:validatePkg(await loadJson(url2,fetcher)),base:url2.slice(0,url2.lastIndexOf("/")+1)}}async function previewPackage(entry2,fetcher=fetch){let{man,base:base2}=await loadPackage(entry2.packageUrl,fetcher),streamUrl=new URL(man.entrypoints.default,base2).toString();return adaptPackage(man,await loadText(streamUrl,fetcher))}async function installLaunch(url2,opts={}){let{man,base:base2}=await loadPackage(url2,opts.fetcher),name=opts.name??man.name,streamUrl=new URL(man.entrypoints.default,base2).toString(),text3=await loadText(streamUrl,opts.fetcher),adapted=await adaptPackage(man,text3),paths=ensure(name),clips2=new Map;for(let st of STATES2)clips2.set(st,adapted.eikon.states.get(st)?.frames??[[""]]);let packed=serialize2(name,adapted.eikon.states.get("idle")?.fps??12,clips2);return await Bun.write(paths.file,packed),await Bun.write(join14(paths.dir,"manifest.json"),JSON.stringify({...man,origin:{source:url2,at:new Date().toISOString()}},null,2)+`
4144
+ `),writeStudio(name,{...toStudio(fresh(name,pick())),sources:{}}),bump(),{name,sources:{},n:1,bytes:text3.length}}async function installPackage(src3,opts={}){let url2=typeof src3==="string"?src3:src3.packageUrl;if(url2.endsWith("manifest.json")||url2.startsWith("file://"))return installLaunch(url2,opts);return fetchSource(url2,{name:opts.name})}function useInstalled(name){if(!existsSync17(file(name)))throw Error(`eikon '${name}' is not installed`);set("eikon",name),bump()}var TOKEN2=/(gh[pousr]_[A-Za-z0-9_]+|github_pat_[A-Za-z0-9_]+|Bearer\s+[A-Za-z0-9._~+/=-]+|token\s+[A-Za-z0-9._~+/=-]+|\*{3,})/gi;function submitPath(name){return file(name)}function publishedInfo(path7){let head=header(path7);if(typeof head?.source_url==="string"&&head.source_url.trim())return{source:head.source_url};let mf=join15(dirname11(path7),"manifest.json");if(!existsSync18(mf))return;try{let man=JSON.parse(readFileSync11(mf,"utf8")),src3=man.origin?.source??man.sourceUrl??man.source_url;if(typeof src3==="string"&&src3.trim())return{source:src3}}catch{}return}function redact2(message){return message.replace(TOKEN2,"[redacted]")}function failureText(xs){return xs.map((x2)=>redact2(x2.message)).join(`
4146
4145
  `)}async function preview2(input){let b2=await previewSubmitBundle(input);return{name:b2.meta.name,files:b2.files.map((f)=>({path:f.path,bytes:f.bytes}))}}async function submit2(input){return submit(input)}function openEikonSubmit(dialog,opts){return new Promise((resolve4)=>{dialog.replace($jsx(Form3,{...opts,done:()=>{dialog.clear(),resolve4()}}),()=>resolve4())})}var Form3=(props)=>{let theme=useTheme().theme,[busy,setBusy]=import_react99.useState(!1),[status,setStatus]=import_react99.useState(""),[result,setResult]=import_react99.useState(null),[preview3,setPreview]=import_react99.useState(null),input={path:props.path},submit3=async()=>{if(busy)return;setBusy(!0),setResult(null);try{if(!preview3){setStatus("Previewing files\u2026");let next3=await preview2(input);setPreview(next3),setStatus("Check included files, then Enter to submit");return}setStatus("Submitting\u2026");let next2=await props.submit(input);if(setResult(next2),next2.kind==="submitted")setStatus(`Submitted: ${next2.url}`);else if(next2.kind==="setup-needed")setStatus(`Setup needed: ${failureText(next2.failures)}`);else setStatus(`Submit failed: ${failureText(next2.failures)}`)}catch(e){let msg=e instanceof Error?e.message:String(e);setStatus(`Submit failed: ${redact2(msg)}`)}finally{setBusy(!1)}};return useKeyboard((key2)=>{if(key2.name==="escape")return props.done();if(key2.name==="return")return void submit3()}),$jsxs("box",{flexDirection:"column",width:72,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:"Submit eikon"})})}),$jsx("box",{height:1,children:$jsxs("text",{fg:theme.textMuted,children:[props.name," \xB7 submission"]})}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:props.path})}),$jsx("box",{height:1}),preview3?$jsxs("box",{flexDirection:"column",children:[$jsxs("text",{fg:theme.textMuted,children:["Included files (",preview3.files.length,")"]}),preview3.files.slice(0,8).map((f)=>$jsxs("text",{fg:theme.text,children:["\u2022 ",f.path," \xB7 ",f.bytes," B"]},f.path)),preview3.files.length>8?$jsxs("text",{fg:theme.textMuted,children:["\u2026 ",preview3.files.length-8," more"]}):null]}):$jsx("text",{fg:theme.textMuted,children:"Enter previews the exact bundle before submission."}),$jsx("box",{height:1}),$jsx("text",{fg:status.startsWith("Submit failed")?theme.error:status.startsWith("Setup")?theme.warning:theme.textMuted,wrapMode:"word",children:status||(preview3?"Enter submit \xB7 Esc cancel":"Enter preview \xB7 Esc cancel")}),result?.kind==="submitted"?$jsx("text",{fg:theme.accent,children:result.url}):null]})};var exports_eikon_gen={};__export(exports_eikon_gen,{setProbe:()=>setProbe,setImpl:()=>setImpl,probeCached:()=>probeCached,probe:()=>probe2,generate:()=>generate,gen:()=>exports_eikon_gen,current:()=>current});import{existsSync as existsSync19,readFileSync as readFileSync12}from"fs";import{tmpdir as tmpdir3}from"os";import{join as join16}from"path";var ROOT2=()=>hermesPath("hermes-agent"),WIN=process.platform==="win32",PY=()=>{for(let v2 of["venv",".venv"]){let bin=WIN?`${ROOT2()}/${v2}/Scripts/python.exe`:`${ROOT2()}/${v2}/bin/python`;if(existsSync19(bin))return bin}return WIN?"python":"python3"},spawn2=(args)=>{try{return Bun.spawn([PY(),...args],{cwd:ROOT2(),env:env2(),stdout:"pipe",stderr:"pipe"})}catch(e){return e instanceof Error?e:Error(String(e))}};function dotenv(){let out={},path7=hermesPath(".env");if(!existsSync19(path7))return out;for(let raw2 of readFileSync12(path7,"utf8").split(`
4147
4146
  `)){let ln=raw2.trim();if(!ln||ln.startsWith("#"))continue;let eq3=ln.indexOf("=");if(eq3<1)continue;let k2=ln.slice(0,eq3).replace(/^export\s+/,"").trim(),v2=ln.slice(eq3+1).trim();if(v2.startsWith('"')&&v2.endsWith('"')||v2.startsWith("'")&&v2.endsWith("'"))v2=v2.slice(1,-1);out[k2]=v2}return out}var env2=()=>{let base2=dotenv();for(let[k2,v2]of Object.entries(process.env))if(v2!==void 0)base2[k2]=v2;return base2},q4=(s)=>JSON.stringify(s);function code(kind2,prompt,o){if(kind2==="image")return["from tools.image_generation_tool import _handle_image_generate as g",`print(g({"prompt": ${q4(prompt)}, "aspect_ratio": ${q4(o.aspect??"square")}}))`].join("; ");let args=[`"prompt":${q4(prompt)}`,`"aspect_ratio":${q4(o.aspect??"1:1")}`];if(o.seconds)args.push(`"duration":${o.seconds}`);if(o.seed)args.push(`"image_url":${q4(o.seed)}`);return["from tools.video_generation_tool import _handle_video_generate as g",`print(g({${args.join(",")}}))`].join("; ")}async function probe2(){let root2=ROOT2();if(!existsSync19(root2))return{image:!1,video:!1};let src3=["import json","from tools.image_generation_tool import check_image_generation_requirements as ci","from tools.video_generation_tool import check_video_generation_requirements as cv","print(json.dumps({'image': bool(ci()), 'video': bool(cv())}))"].join("; "),r=spawn2(["-c",src3]);if(r instanceof Error)return{image:!1,video:!1};let out=await new Response(r.stdout).text();if(await r.exited!==0)return{image:!1,video:!1};let last3=out.trim().split(`
4148
4147
  `).pop();try{return JSON.parse(last3)}catch{return{image:!1,video:!1}}}async function fetchTo(url2,ext){let tmp=join16(tmpdir3(),`eikon-gen-${Date.now()}${ext}`),res=await fetch(url2);if(!res.ok)throw Error(`download ${res.status}`);return await Bun.write(tmp,await res.arrayBuffer()),tmp}var generate=async(kind2,prompt,opts)=>{let r=spawn2(["-c",code(kind2,prompt,opts)]);if(r instanceof Error)return{err:r.message};let[out,err,exit]=await Promise.all([new Response(r.stdout).text(),new Response(r.stderr).text(),r.exited]);if(exit!==0)return{err:(err||out).trim().split(`
4149
4148
  `).slice(-3).join(" ")||`python exited ${exit}`};let last3=out.trim().split(`
4150
- `).pop();if(!last3)return{err:"no output"};let j2;try{j2=JSON.parse(last3)}catch{return{err:`unparseable: ${last3.slice(0,200)}`}}if(j2.success===!1||j2.error)return{err:String(j2.error??"provider error")};let ref=j2.image??j2.video;if(!ref)return{err:"provider returned no asset"};if(ref.startsWith("/")||ref.startsWith("file://"))return{path:ref.replace(/^file:\/\//,"")};if(/^https?:\/\//.test(ref))return fetchTo(ref,kind2==="image"?".png":".mp4").then((p)=>({path:p})).catch((e)=>({err:`download: ${e instanceof Error?e.message:e}`}));return{err:`unrecognized asset ref: ${ref.slice(0,80)}`}},impl=generate,probeImpl=probe2,current=()=>impl,setImpl=(fn)=>{impl=fn??generate},setProbe=(fn)=>{probeImpl=fn??probe2},probeCached=()=>probeImpl();var import_react101=__toESM(require_react_production(),1);var ORDER4=["name","from"],FROMS=[{id:"blank",label:"blank",hint:"author in Studio"},{id:"file",label:"local file",hint:"png / jpg / webp / gif / mp4"},{id:"install",label:"install from",hint:"catalog name \xB7 git URL \xB7 http://\u2026 \xB7 local dir"}],INSTALL_HINT="catalog name \xB7 github.com/u/r \xB7 git URL \xB7 http://\u2026/ \xB7 local dir";function openNewEikon(dialog,opts={}){return new Promise((resolve4)=>{let chained=!1;dialog.replace($jsx(Form4,{initial:opts.initial,dialog,onChain:()=>{chained=!0},done:(r)=>{chained=!0,dialog.clear(),resolve4(r)}}),()=>{if(!chained)resolve4(null)})})}var Form4=(props)=>{let theme=useTheme().theme,[name,setName]=import_react101.useState(props.initial??""),[from2,setFrom]=import_react101.useState("blank"),[field,setField]=import_react101.useState("name"),slug3=name?exports_eikon_knobs.slug(name):"",ok=slug3.length>0,submit3=async()=>{if(!ok)return;if(from2==="blank")return props.done({name:slug3,from:"blank"});if(props.onChain(),from2==="file"){let file2=await openTextPrompt(props.dialog,{title:"Source file",label:"absolute or ~ path (png / jpg / webp / gif / mp4)"});return props.done(file2?{name:slug3,from:"file",file:file2}:null)}let src3=await openTextPrompt(props.dialog,{title:"Install eikon",label:INSTALL_HINT});props.done(src3?{name:slug3,from:"install",src:src3}:null)};useKeyboard((key2)=>{if(key2.name==="escape")return props.done(null);if(key2.name==="tab"){let i=ORDER4.indexOf(field);return setField(ORDER4[(i+(key2.shift?-1:1)+ORDER4.length)%ORDER4.length])}if(key2.name==="return")return void submit3();if(field==="name"){if(key2.name==="backspace")return setName((n)=>n.slice(0,-1));if(key2.raw&&key2.raw.length===1&&/[A-Za-z0-9 _-]/.test(key2.raw))return setName((n)=>n+key2.raw);return}if(key2.name==="up"){let i=FROMS.findIndex((f)=>f.id===from2);return setFrom(FROMS[Math.max(0,i-1)].id)}if(key2.name==="down"){let i=FROMS.findIndex((f)=>f.id===from2);return setFrom(FROMS[Math.min(FROMS.length-1,i+1)].id)}});let bg2=(f)=>field===f?theme.backgroundElement:void 0;return $jsxs("box",{flexDirection:"column",width:60,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:"New eikon"})})}),$jsx("box",{height:1}),$jsxs("box",{height:1,flexDirection:"row",backgroundColor:bg2("name"),children:[$jsx("box",{width:9,children:$jsx("text",{fg:theme.textMuted,children:"Name"})}),$jsxs("text",{children:[$jsx("span",{fg:theme.text,children:name}),field==="name"?$jsx("span",{fg:theme.accent,children:"\u2588"}):null]})]}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:slug3?` \u2192 ${slug3}`:" type a name"})}),$jsx("box",{height:1}),$jsx("box",{height:1,backgroundColor:bg2("from"),children:$jsx("text",{fg:theme.textMuted,children:"From (\u2191\u2193)"})}),FROMS.map((f)=>{let on=f.id===from2,fg2=on?theme.accent:theme.text;return $jsxs("box",{height:1,flexDirection:"row",backgroundColor:bg2("from"),children:[$jsx("box",{width:2,children:$jsx("text",{fg:fg2,children:on?"\u25B8 ":" "})}),$jsx("box",{width:14,children:$jsx("text",{fg:fg2,children:f.label})}),$jsx("text",{fg:theme.textMuted,children:f.hint})]},f.id)}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:ok?"Enter create \xB7 Tab next field \xB7 Esc cancel":"type a name"})})]})};extend({slider:SliderRenderable});var PANES=["knobs","preview","strip"],HELP_H=4,COL={flexDirection:"column"},mb2=(n)=>n<1024?`${n} B`:n<1048576?`${(n/1024).toFixed(0)} KB`:`${(n/1048576).toFixed(1)} MB`,HEAD2=[{id:"open",kind:"select",label:"eikon"},{id:"rasterizer",kind:"select",label:"rasterizer"},{id:"source",kind:"prompt",label:"source"},{id:"-1",kind:"divider",label:""},{id:"fetch",kind:"action",label:"fetch source",show:(s,live,url2)=>!live&&!!url2},{id:"knobsfor",kind:"action",label:"tune",show:(_s,live)=>live},{id:"reset",kind:"action",label:"reset",show:(_s,live)=>live},{id:"revert",kind:"action",label:"revert",show:(s)=>s.dirty},{id:"-2",kind:"divider",label:"",show:(_s,live)=>live},{id:"h-input",kind:"header",label:"input",show:(_s,live)=>live},{id:"contrast",kind:"tone",label:"contrast",show:(_s,live)=>live,knob:{kind:"slider",min:0.25,max:4,step:0.05,default:1,hint:"Spread pixel values around their mean. \xD71 = source as-is; higher sharpens, lower flattens. Applied to the image before rasterizing."}},{id:"invert",kind:"tone",label:"invert",show:(_s,live)=>live,knob:{kind:"toggle",default:!0,hint:"Swap light\u2194dark in the source pixels. On for a light subject on a dark terminal background \u2014 turn off if the subject is darker than its surround."}},{id:"flip",kind:"tone",label:"flip",show:(_s,live)=>live,knob:{kind:"cycle",options:["none","h","v","hv"],default:"none",hint:"Mirror the source horizontally, vertically, or both before rasterizing."}},{id:"-3",kind:"divider",label:"",show:(_s,live)=>live}],HELP={open:"Which eikon you're editing. Enter to switch, create a new one, or install from elsewhere.",rasterizer:"The engine that turns your source image/video into text art. Each rasterizer exposes its own look-and-feel settings below the divider.",source:"The image or video file the avatar is rendered from. Enter to pick, generate, or clear.",fetch:"Download this eikon's published source media so you can re-tune it locally.",knobsfor:"\u2190\u2192 toggles whether the settings below apply to every state or just the one selected in the strip.",reset:"Restore every setting below to this rasterizer's defaults and drop per-state overrides.",submit:"Submit this local eikon after backend preflight.",revert:"Throw away unsaved edits and reload this eikon from disk."},FLIPS=["none","h","v","hv"];function helpOf(row3){if(!row3)return"";if(row3.id==="source")return $jsxs($Fragment,{children:[$jsxs("span",{children:[HELP.source," "]}),$jsx("strong",{children:"Use /eikon-create to generate source files interactively (recommended)."})]});let head=HELP[row3.id];if(head)return head;if(!row3.knob)return"";if(row3.knob.hint)return row3.knob.hint;if(row3.knob.kind==="cycle")return`\u2190\u2192 or Enter cycles: ${row3.knob.options.join(" \xB7 ")}.`;if(row3.knob.kind==="toggle")return"Space or Enter toggles on/off.";return`\u2190\u2192 or drag adjusts (${row3.knob.min}\u2013${row3.knob.max}); scroll while selected also works.`}function buildRows(r,s,live,url2){let dyn=live?Object.entries(r.knobs).map(([id,def2])=>({id,kind:"knob",label:def2.label??id,knob:def2})):[],head=HEAD2.filter((h2)=>h2.show?h2.show(s,live,url2):!0);return dyn.length?[...head,{id:"h-r",kind:"header",label:r.name},...dyn]:head}var MINI_W=12;function Mini(props){let theme=useTheme().theme,d2=props.dims??{w:1,h:1},ar=d2.w/d2.h,bw=ar>=1?MINI_W:Math.max(4,Math.round(MINI_W*ar)),bh=ar>=1?Math.max(4,Math.round(MINI_W/ar)):MINI_W,short2=Math.min(bw,bh),cw=Math.max(1,short2*props.sp.zoom),cx=(bw-cw)*props.sp.ox,cy=(bh-cw)*props.sp.oy,on=(x2,y2)=>x2>=cx&&x2<cx+cw&&y2>=cy&&y2<cy+cw,cell=(x2,ty)=>{let up=on(x2,ty*2),dn=on(x2,ty*2+1);return up&&dn?"\u2588":up?"\u2580":dn?"\u2584":"\xB7"};return $jsx("box",{flexDirection:"column",flexShrink:0,backgroundColor:theme.backgroundElement,children:Array.from({length:Math.ceil(bh/2)},(_2,ty)=>$jsx("text",{fg:theme.textMuted,children:Array.from({length:bw},(_3,x2)=>cell(x2,ty)).join("")},ty))})}var SP_ROWS=["pan x","pan y","zoom","fps"];function PanBars(props){let theme=useTheme().theme,z2=props.sp.zoom,slack=1-z2,on=(i)=>props.focused&&props.sel===i,fg2=(i)=>on(i)?theme.accent:theme.textMuted,wheel=(k2)=>(e)=>{e.stopPropagation();let d2=e.scroll?.direction;if(d2==="up"||d2==="left")props.onWheel(k2,-1);if(d2==="down"||d2==="right")props.onWheel(k2,1)},drag=import_react103.useRef(null),grab=(k2,at)=>{drag.current={at,v:props.sp[k2],k:k2}},scrub=(at,L2)=>{let d2=drag.current;if(!d2||slack<=0)return;props.onSet(d2.k,Math.max(0,Math.min(1,+(d2.v+(at-d2.at)/(slack*L2)).toFixed(3))))},drop=()=>{drag.current=null},tw=Math.max(1,Math.round(z2*W2)),tl=Math.min(W2-tw,Math.round(props.sp.ox*slack*W2)),hbar=" ".repeat(tl)+"\u2588".repeat(tw)+" ".repeat(W2-tl-tw),vh=H*2,th=Math.max(1,z2*vh),ty=props.sp.oy*slack*vh,vbar=Array.from({length:H},(_2,y2)=>{let up=y2*2>=ty&&y2*2<ty+th,dn=y2*2+1>=ty&&y2*2+1<ty+th;return up&&dn?"\u2588\u2588":up?"\u2580\u2580":dn?"\u2584\u2584":" "});return $jsxs("box",{flexDirection:"row",flexShrink:0,children:[$jsxs("box",{flexDirection:"column",flexShrink:0,children:[props.children,$jsx("box",{width:W2,height:1,backgroundColor:theme.border,onMouseMove:()=>props.onHover(0),onMouseScroll:wheel("ox"),onMouseDown:(e)=>grab("ox",e.x),onMouseDrag:(e)=>scrub(e.x,W2),onMouseUp:drop,onMouseDragEnd:drop,children:$jsx("text",{fg:fg2(0),children:hbar})})]}),$jsx("box",{flexDirection:"column",width:2,height:H,backgroundColor:theme.border,onMouseMove:()=>props.onHover(1),onMouseScroll:wheel("oy"),onMouseDown:(e)=>grab("oy",e.y),onMouseDrag:(e)=>scrub(e.y,H),onMouseUp:drop,onMouseDragEnd:drop,children:vbar.map((g,y2)=>$jsx("text",{fg:fg2(1),children:g},y2))})]})}function SpatialBar(props){let theme=useTheme().theme,rows3=[{label:"zoom",k:"zoom",min:0.1,max:1,v:props.sp.zoom,i:2},{label:"fps",k:"fps",min:4,max:30,v:props.fps,i:3}],wheel=(k2)=>(e)=>{e.stopPropagation();let d2=e.scroll?.direction;if(d2==="up")props.onWheel(k2,-1);if(d2==="down")props.onWheel(k2,1)};return $jsxs("box",{flexDirection:"row",marginTop:1,flexShrink:0,children:[$jsx("box",{flexDirection:"column",gap:1,flexShrink:0,children:rows3.map((d2)=>{let on=props.focused&&d2.i===props.sel;return $jsxs("box",{height:1,flexDirection:"row",backgroundColor:on?theme.backgroundElement:void 0,onMouseMove:()=>props.onHover(d2.i),onMouseScroll:wheel(d2.k),children:[$jsx("box",{width:2,children:$jsx("text",{fg:on?theme.primary:theme.textMuted,children:on?"\u25B8 ":" "})}),$jsx("box",{width:7,children:$jsx("text",{fg:on?theme.text:theme.textMuted,children:d2.label})}),$jsx("box",{width:20,height:1,children:$jsx("slider",{orientation:"horizontal",min:d2.min,max:d2.max,value:d2.v,foregroundColor:on?theme.accent:theme.textMuted,backgroundColor:theme.border,onChange:(v2)=>props.onSet(d2.k,d2.k==="fps"?Math.round(v2):+v2.toFixed(3))})}),$jsx("box",{width:7,children:$jsx("text",{fg:on?theme.text:theme.textMuted,children:` ${d2.k==="fps"?d2.v.toFixed(0):d2.v.toFixed(2)}`})})]},d2.label)})}),$jsx("box",{width:2}),$jsx(Mini,{sp:props.sp,dims:props.dims})]})}function valueOf(s,r,row3,theme,src3,peek5,busy){if(row3.id==="open")return`${s.name} \u25B8`;if(row3.id==="rasterizer"){let a=r.available();if(a===!0)return`${r.name} \u25B8`;return $jsxs($Fragment,{children:[$jsx("span",{children:`${r.name} \u25B8`}),$jsx("span",{fg:theme.warning,children:` \u26A0 ${a}`})]})}if(row3.id==="source"){if(!src3)return"(none \u2014 Enter to attach)";let d2=s.dims,sz=(()=>{try{return mb2(statSync6(src3).size)}catch{return"?"}})();return d2?`${basename12(src3)} \xB7 ${d2.w}\xD7${d2.h} \xB7 ${sz}`:`${basename12(src3)} \xB7 ${sz}`}if(row3.id==="knobsfor")return`\u25C2 ${!!s.per[s.state]?`${s.state} only`:"all states"} \u25B8`;if(row3.id==="reset")return"\u25B8 defaults";if(row3.id==="revert")return"\u25B8 reload from disk";if(row3.kind==="tone"){if(row3.id==="contrast")return`\xD7${s.tone.contrast.toFixed(2)}`;if(row3.id==="invert")return s.tone.invert?"\u25CF on":"\u25CB off";if(row3.id==="flip")return`\u25C2 ${s.tone.flip} \u25B8`}if(row3.id==="fetch")return busy?"fetching\u2026":peek5?`\u25B8 download to edit (${peek5.n} files, ${mb2(peek5.bytes)})`:"\u25B8 download to edit";if(row3.kind==="knob"&&row3.knob){let k2=exports_eikon_knobs.eff(s,s.state)[row3.id]??row3.knob.default;if(row3.knob.kind==="cycle")return`\u25C2 ${String(k2)} \u25B8`;if(row3.knob.kind==="toggle")return k2?"\u25CF on":"\u25CB off";if(row3.knob.kind==="slider")return Number(k2).toFixed(2)}return""}function KnobRow(props){let theme=useTheme().theme,{row:row3,on,dim:dim2}=props,slider=row3.knob?.kind==="slider"?row3.knob:void 0,sval=!slider?0:row3.kind==="tone"?props.s.tone.contrast:Number(exports_eikon_knobs.eff(props.s,props.s.state)[row3.id]??slider.default),pushed=import_react103.useRef(sval);pushed.current=sval;let slide=(v2)=>{if(v2!==pushed.current)props.onSlide?.(v2)};if(row3.kind==="divider")return $jsx("box",{id:props.id,height:1,children:$jsx("text",{fg:theme.border,children:"\u2500".repeat(24)})});if(row3.kind==="header")return $jsx("box",{id:props.id,height:1,children:$jsx("text",{fg:theme.textMuted,children:$jsx("u",{children:row3.label})})});let scroll=(e)=>{if(!on||!slider||!props.onWheel)return;e.stopPropagation();let d2=e.scroll?.direction;if(d2==="up"||d2==="left")props.onWheel(-1);if(d2==="down"||d2==="right")props.onWheel(1)};return $jsxs("box",{id:props.id,height:1,flexDirection:"row",backgroundColor:on?theme.backgroundElement:void 0,onMouseMove:props.onHover,onMouseDown:props.onClick,onMouseScroll:scroll,children:[$jsx("box",{width:2,children:$jsx("text",{fg:on?theme.primary:theme.textMuted,children:on?"\u25B8 ":" "})}),$jsx("box",{width:14,children:$jsx("text",{fg:dim2?theme.textMuted:on?theme.text:theme.textMuted,children:row3.label})}),slider?$jsxs($Fragment,{children:[$jsx("box",{width:20,height:1,children:$jsx("slider",{orientation:"horizontal",min:slider.min,max:slider.max,value:sval,foregroundColor:on?theme.accent:theme.textMuted,backgroundColor:theme.border,onChange:slide})}),$jsx("box",{width:1})]}):null,$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:props.busy&&row3.id==="fetch"?$jsx(Spinner,{color:theme.accent,label:"fetching\u2026"}):$jsx("text",{fg:dim2?theme.textMuted:theme.text,children:valueOf(props.s,props.r,row3,theme,props.src,props.peek,props.busy)})})]})}function Strip(props){let theme=useTheme().theme,glyph=useSpinnerGlyph(props.pending.size>0);return $jsx("box",{flexDirection:"row",gap:1,children:STATES2.map((st)=>{let on=props.s.state===st,own=!!props.s.per[st],has=!!props.s.sources[st],f=props.frames.get(st),gen=props.pending.has(st),empty=!f&&!gen;return $jsxs("box",{flexDirection:"column",alignItems:"center",onMouseDown:()=>{if(props.onPick(st),empty)props.onEmpty?.(st)},children:[$jsx("box",{border:!0,borderStyle:"rounded",borderColor:on&&props.focused?theme.primary:on?theme.accent:theme.border,width:18,height:10,overflow:"hidden",alignItems:"center",justifyContent:"center",children:gen?$jsx("text",{fg:theme.accent,children:`${glyph} gen`}):f?f.map((ln,i)=>$jsx("text",{fg:on?theme.text:theme.textMuted,children:ln},i)):$jsx("text",{fg:theme.textMuted,children:"+"})}),$jsx("box",{height:1,children:$jsx("text",{fg:on?theme.accent:theme.textMuted,children:st})}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:has?"own src":own?"forked":""})})]},st)})})}var BLANK3=Array.from({length:H},()=>" ".repeat(W2)),genCaps=null,probeGen=()=>{if(genCaps)return genCaps;let p=exports_eikon_gen.probeCached();return p.catch(()=>{genCaps=null}),genCaps=p};var EikonStudio=import_react103.memo((props)=>{let theme=useTheme().theme,keys=useKeys(),dialog=useDialog(),gw=useGateway(),toast=useToast(),wide=useTerminalDimensions().width>=120,ksb=import_react103.useRef(null),outer=import_react103.useRef(null);import_react103.useSyncExternalStore(exports_eikon.onRegistry,()=>exports_eikon.rasterizers().length);let[s,setS]=import_react103.useState(null),[pane,setPane]=import_react103.useState("knobs"),[sel,setSel]=import_react103.useState(0),[spSel,setSpSel]=import_react103.useState(0),selRef=import_react103.useRef(0);selRef.current=sel;let spRef=import_react103.useRef(0);spRef.current=spSel;let sRef=import_react103.useRef(null);sRef.current=s;let[frames,setFrames]=import_react103.useState([BLANK3]),[tick3,setTick]=import_react103.useState(0),[play,setPlay]=import_react103.useState(!0),[busy,setBusy]=import_react103.useState(!1),[fetching,setFetching]=import_react103.useState(!1),[peek5,setPeek]=import_react103.useState(void 0),[thumbs,setThumbs]=import_react103.useState(new Map),[err,setErr]=import_react103.useState(null),[saving,setSaving]=import_react103.useState(!1),[pending3,setPending]=import_react103.useState(new Set),[genOk,setGenOk]=import_react103.useState(null),frame=frames[tick3%frames.length]??BLANK3,r=import_react103.useMemo(()=>exports_eikon.pick(s?.rasterizer??get2("eikonRasterizer")),[s?.rasterizer]),spatialOk=caps.ffmpeg,open2=import_react103.useCallback((name)=>{resetCache();let seed=exports_eikon.readStudio(name),ra=exports_eikon.pick(seed?.rasterizer??get2("eikonRasterizer")),next2=exports_eikon_knobs.fresh(name,ra,seed),src4=exports_eikon.findSource(name,"idle");next2.dims=src4?exports_eikon.probe(src4)??null:null;for(let st of STATES2){let p=exports_eikon.findSource(name,st);if(p)prewarm(p,next2.fps)}setS(next2),selRow.current=void 0,setSel(0),setPane("knobs"),setErr(null),setTick(0),setFrames([BLANK3])},[]),tried=import_react103.useRef(!1);import_react103.useEffect(()=>{if(tried.current)return;if(tried.current=!0,props.name)return open2(props.name||exports_eikon_knobs.slug("new"));let n2=get2("eikon");if(n2)open2(n2)},[open2,props.name]);let dialogRef=import_react103.useRef(dialog);dialogRef.current=dialog,import_react103.useEffect(()=>{if(props.name===void 0)return;let next2=props.name||exports_eikon_knobs.slug("new"),cur=sRef.current;if(cur?.name===next2)return;if(!cur?.dirty)return open2(next2);let dead=!1;return openConfirm(dialogRef.current,{title:"Discard unsaved edits?",danger:!0,body:`Switch to '${next2}' and drop in-memory changes to '${cur.name}'.`}).then((ok)=>{if(!dead&&ok)open2(next2)}),()=>{dead=!0}},[props.name,open2]),import_react103.useEffect(()=>{let dead=!1;return probeGen().then((c)=>{if(!dead)setGenOk(c)}).catch(()=>{}),()=>{dead=!0}},[]);let src3=import_react103.useMemo(()=>s?exports_eikon.findSource(s.name,s.state):void 0,[s?.name,s?.state,s?.sources]),live=import_react103.useMemo(()=>!!(s&&exports_eikon.findSource(s.name)),[s?.name,s?.sources]),baked2=import_react103.useMemo(()=>{if(live||!s)return;let p=exports_eikon.baked(s.name);if(!p)return;try{return exports_eikon.parseEikon(readFileSync13(p,"utf8"))}catch{return}},[live,s?.name]),url2=import_react103.useMemo(()=>{if(!s)return;let p=exports_eikon.baked(s.name);return p?exports_eikon.header(p)?.source_url:void 0},[s?.name]);import_react103.useEffect(()=>{if(setPeek(void 0),!url2||live)return;let dead=!1;return exports_eikon.peekSource(url2).then((x2)=>{if(!dead)setPeek(x2)}),()=>{dead=!0}},[url2,live]);let rows3=import_react103.useMemo(()=>s?buildRows(r,s,live,url2):[],[r,s,live,url2]),navRows=import_react103.useMemo(()=>rows3.map((x2,i)=>({...x2,i})).filter((x2)=>x2.kind!=="divider"&&x2.kind!=="header"),[rows3]),selRow=import_react103.useRef(void 0),rid=(x2)=>`${x2.kind}:${x2.id}`,setSelBy=import_react103.useCallback((arg)=>{setSel((prev)=>{let next2=typeof arg==="function"?arg(prev):arg,row3=navRows[next2];return selRow.current=row3?rid(row3):void 0,next2})},[navRows]),prevRows=import_react103.useRef(navRows);import_react103.useEffect(()=>{if(prevRows.current===navRows)return;prevRows.current=navRows;let id=selRow.current;if(!id)return;let ni=navRows.findIndex((x2)=>rid(x2)===id);if(ni>=0&&ni!==selRef.current)setSel(ni)},[navRows]);let kScroll=(ni)=>{let row3=navRows[ni];if(row3)ksb.current?.scrollChildIntoView(`knob-${row3.kind}-${row3.id}`)};import_react103.useEffect(()=>{if(!s)return;if(!src3){let clip=baked2?.states.get(s.state);setFrames(clip?.frames.length?clip.frames:[BLANK3]),setErr(null),setBusy(!1),setTick(0);return}let ctrl=new AbortController;return setBusy(!0),cached2(r,src3,s.spatial,s.tone,s.fps,exports_eikon_knobs.eff(s,s.state),ctrl.signal).then((out)=>{if(ctrl.signal.aborted)return;if(setBusy(!1),"err"in out){setErr(out.err);return}setErr(null),setFrames(out.frames),setTick((t2)=>t2%out.frames.length)}),()=>ctrl.abort()},[s?.spatial,s?.tone,s?.base,s?.per,s?.state,s?.fps,s?.rasterizer,src3,r,baked2]),import_react103.useEffect(()=>{if(!play||!props.focused||frames.length<=1||busy)return;let fps=live?s?.fps??FPS0:baked2?.states.get(s?.state??"idle")?.fps??FPS0,id=setInterval(()=>setTick((t2)=>t2+1),1000/Math.max(1,fps));return()=>clearInterval(id)},[play,props.focused,frames.length,busy,live,s?.fps,s?.state,baked2]),import_react103.useEffect(()=>{if(!s)return;let dead=!1,t2=setTimeout(()=>{if(dead)return;let jobs=STATES2.map((st)=>{let sp=exports_eikon.findSource(s.name,st);if(!sp){let f=baked2?.states.get(st)?.frames[0];return Promise.resolve([st,f?thumb(f):void 0])}return cached2(r,sp,s.spatial,s.tone,s.fps,exports_eikon_knobs.eff(s,st)).then((res)=>[st,"err"in res?void 0:thumb(res.frames[0])])});Promise.all(jobs).then((done)=>{if(dead)return;setThumbs(new Map(done))})},400);return()=>{dead=!0,clearTimeout(t2)}},[frames,s?.per,s?.sources,s?.name,s?.fps,r,baked2]);let mutate=(fn)=>setS((p)=>p?fn(p):p),setSpatial=(sp)=>mutate((p)=>({...p,spatial:{...p.spatial,...sp},dirty:!0})),setBar=(k2,v2)=>k2==="fps"?mutate((p)=>({...p,fps:Math.round(v2),dirty:!0})):setSpatial({[k2]:v2}),stepBar=(k2,d2)=>{let cur=sRef.current;if(!cur)return;if(k2==="fps")return setBar("fps",Math.max(4,Math.min(30,cur.fps+d2*2)));if(k2==="zoom")return setSpatial({zoom:Math.max(0.1,Math.min(1,+(cur.spatial.zoom+d2*0.03).toFixed(3)))});return setSpatial({[k2]:Math.max(0,Math.min(1,+(cur.spatial[k2]+d2*0.03).toFixed(3)))})},doSave=import_react103.useCallback(async()=>{if(!s)return;if(!s.dirty)return toast.show({variant:"info",message:"Nothing to save"});if(!live)return toast.show({variant:"warning",message:"No source \u2014 fetch or attach before saving"});setSaving(!0),await exports_eikon.save({...s,dirty:!1}).then((f)=>{mutate((p)=>({...p,dirty:!1})),toast.show({variant:"success",message:`Saved \u2192 ${basename12(f)}`})}).catch((e)=>toast.error(e instanceof Error?e:Error(String(e)))).finally(()=>setSaving(!1))},[s,live,toast]),doSelectRasterizer=()=>{let opts=exports_eikon.rasterizers().map((x2)=>{let a=x2.available();return{title:x2.name,value:x2.name,description:Object.keys(x2.knobs).join(" \xB7 "),hint:a===!0?void 0:a}});dialog.replace($jsx(DialogSelect,{title:"Rasterizer",filterable:!1,current:r.name,options:opts,onSelect:(o)=>{dialog.clear();let next2=exports_eikon.rasterizer(o.value);if(!next2)return;let a=next2.available();if(a!==!0)return toast.show({variant:"warning",message:`${o.value}: ${a}`});set("eikonRasterizer",o.value),mutate((p)=>exports_eikon_knobs.swap(p,next2))}}),()=>{})},runGenerate=async(st,kind2)=>{if(!s)return;let seed=s.sources.base?exports_eikon.findSource(s.name):void 0;setPending((prev)=>{let n2=new Set(prev);return n2.add(st),n2});let out=await openGenerate(dialog,exports_eikon_gen.current(),{state:st,kind:kind2,seed,lastPrompt:s.prompts?.[st]});if(!out){setPending((prev)=>{let n2=new Set(prev);return n2.delete(st),n2});return}let role=st==="idle"&&!s.sources.base?"base":st;try{let f=exports_eikon.adopt(s.name,out.path,role);mutate((p)=>({...p,sources:{...p.sources,[role]:f},prompts:{...p.prompts,[st]:out.prompt},dirty:!0}))}catch(e){toast.error(e instanceof Error?e:Error(String(e)))}finally{setPending((prev)=>{let n2=new Set(prev);return n2.delete(st),n2})}},doSource=(forSt)=>{if(!s)return;let st=forSt??s.state,has=!!s.sources[st],opts=[{title:"Local file\u2026",value:"local"}];if(genOk?.image)opts.push({title:"Generate image\u2026",value:"gen-image"});if(genOk?.video)opts.push({title:"Generate video\u2026",value:"gen-video"});if(has&&st!=="idle")opts.push({title:"Same as base",value:"same"});if(has)opts.push({title:"Remove",value:"remove"});dialog.replace($jsx(DialogSelect,{title:`Source for '${st}'`,filterable:!1,options:opts,onSelect:async(o)=>{if(o.value==="local"){let p=await openPathPrompt(dialog,gw,{title:`Source for '${st}'`,label:"png/jpg/webp/gif/mp4/webm/mov \xB7 Tab completes",filter:/\.(png|jpe?g|webp|gif|mp4|webm|mov)$/i});if(!p)return;let role=st==="idle"&&!s.sources.base?"base":st;try{let f=exports_eikon.adopt(s.name,p,role);mutate((prev)=>({...prev,sources:{...prev.sources,[role]:f},dirty:!0}))}catch(e){toast.error(e instanceof Error?e:Error(String(e)))}return}if(o.value==="gen-image")return void runGenerate(st,"image");if(o.value==="gen-video")return void runGenerate(st,"video");dialog.clear(),mutate((prev)=>{let next2={...prev.sources};return delete next2[st],{...prev,sources:next2,dirty:!0}})}}),()=>{})},doPrompt=async(id)=>{if(!s)return;if(id==="source")return doSource()},switchTo=import_react103.useCallback(async(name)=>{let cur=sRef.current;if(cur?.name===name)return;if(cur?.dirty){if(!await openConfirm(dialog,{title:"Discard unsaved edits?",danger:!0,body:`Open '${name}' and drop in-memory changes to '${cur.name}'.`}))return}open2(name)},[dialog,open2]),apply=import_react103.useCallback(async(res)=>{if(!res)return;if(res.from==="blank")return exports_eikon.ensure(res.name),switchTo(res.name);if(res.from==="file"){exports_eikon.ensure(res.name);try{exports_eikon.adopt(res.name,res.file,"base")}catch(e){return toast.error(e instanceof Error?e:Error(String(e)))}return switchTo(res.name)}toast.show({variant:"info",message:`Installing '${res.name}' from ${res.src}\u2026`}),await exports_eikon.installPackage(res.src,{name:res.name}).then((out)=>{toast.show({variant:"success",message:`Installed '${out.name}' (${out.n} files)`}),switchTo(out.name)}).catch((e)=>toast.error(e instanceof Error?e:Error(String(e))))},[switchTo,toast]),doNew=import_react103.useCallback(async()=>{let res=await openNewEikon(dialog,{});await apply(res)},[dialog,apply]),eikonOptions=import_react103.useCallback(()=>{let installed=exports_eikon.list().map((e)=>({title:e.name,value:e.name,category:"installed",hint:e.hasSource?"\u25CF source":e.sourceUrl?"\u25CB source available":"\u2014"})),seen=new Set(installed.map((o)=>o.value)),bundled=listEikons([BUNDLED_EIKON_DIR,hermesPath("eikons")]).filter((e)=>e.path.startsWith(BUNDLED_EIKON_DIR)).map((e)=>{let slug3=e.meta.name.toLowerCase();return{title:e.meta.name,value:slug3,category:"bundled",hint:`${e.meta.width}\xD7${e.meta.height}`}}).filter((o)=>!seen.has(o.value)),raw2=exports_eikon.raw().filter((n2)=>!seen.has(n2)).map((n2)=>({title:n2,value:n2,category:"installed",hint:"(unsaved)"}));return[...installed,...raw2,...bundled]},[]),doInstall=import_react103.useCallback(async()=>{let src4=await openTextPrompt(dialog,{title:"Install eikon",label:"catalog name \xB7 github.com/u/r \xB7 git URL \xB7 http://\u2026/ \xB7 local dir"});if(!src4)return;toast.show({variant:"info",message:`Installing from ${src4}\u2026`}),await exports_eikon.installPackage(src4).then((out)=>{toast.show({variant:"success",message:`Installed '${out.name}' (${out.n} files)`}),switchTo(out.name)}).catch((e)=>toast.error(e instanceof Error?e:Error(String(e))))},[dialog,switchTo,toast]),doOpen=import_react103.useCallback(()=>{let cur=sRef.current,opts=[...eikonOptions(),{title:"+ New\u2026",value:"__new",category:""},{title:"+ Install\u2026",value:"__install",category:""}];dialog.replace($jsx(DialogSelect,{title:"Open eikon",current:cur?.name,options:opts,onSelect:(o)=>{if(dialog.clear(),o.value==="__new")return void doNew();if(o.value==="__install")return void doInstall();switchTo(o.value)}}),()=>{})},[dialog,eikonOptions,switchTo,doNew,doInstall]),doSubmit=import_react103.useCallback(async()=>{let cur=sRef.current;if(!cur)return;let path7=submitPath(cur.name);if(publishedInfo(path7)){toast.show({variant:"warning",title:"Published eikon",message:"Create a local draft before submitting",duration:6000});return}await openEikonSubmit(dialog,{name:cur.name,path:path7,submit:submit2})},[dialog,toast]),doAction=async(id)=>{if(!s)return;if(id==="knobsfor")return mutate((p)=>p.per[p.state]?exports_eikon_knobs.unfork(p):exports_eikon_knobs.fork(p));if(id==="submit"){doSubmit();return}if(id==="revert"){discard();return}if(id==="reset"){if(await openConfirm(dialog,{title:"Reset settings?",body:"Restore rasterizer defaults and drop all per-state overrides.",danger:!0}))mutate((p)=>exports_eikon_knobs.reset(p,r));return}if(id==="fetch"){if(!url2||fetching)return;setFetching(!0),await exports_eikon.fetchSource(url2,{name:s.name}).then((out)=>{toast.show({variant:"success",message:`Fetched ${out.n} file(s) \xB7 ${mb2(out.bytes)}`}),open2(s.name)}).catch((e)=>toast.error(e instanceof Error?e:Error(String(e)))).finally(()=>setFetching(!1))}},doStripMenu=()=>{if(!s)return;dialog.replace($jsx(DialogSelect,{title:`State: ${s.state}`,filterable:!1,options:[{title:"Source\u2026",value:"source"},{title:s.per[s.state]?"Clear override (back to base)":"Tune this state only",value:"fork"}],onSelect:(o)=>{if(o.value==="source"){doSource();return}dialog.clear(),mutate(s.per[s.state]?exports_eikon_knobs.unfork:exports_eikon_knobs.fork)}}),()=>{})},setTone=(t2)=>mutate((p)=>({...p,tone:{...p.tone,...t2},dirty:!0})),stepRow=(row3,d2)=>{if(row3.kind==="tone"){if(row3.id==="contrast"){let def2=row3.knob,cur=sRef.current?.tone.contrast??1;return setTone({contrast:+Math.max(def2.min,Math.min(def2.max,cur+d2*def2.step)).toFixed(2)})}if(row3.id==="invert")return setTone({invert:!sRef.current?.tone.invert});if(row3.id==="flip"){let cur=sRef.current?.tone.flip??"none",i=FLIPS.indexOf(cur);return setTone({flip:FLIPS[(i+d2+FLIPS.length)%FLIPS.length]})}return}if(row3.kind!=="knob"||!row3.knob)return;mutate((p)=>exports_eikon_knobs.edit(p,(k2)=>exports_eikon_knobs.step(k2,row3.id,row3.knob,d2)))},act=(row3,via)=>{if(!row3||!sRef.current)return;if(row3.kind==="select"){if(row3.id==="open")return doOpen();return doSelectRasterizer()}if(row3.kind==="prompt")return void doPrompt(row3.id);if(row3.kind==="action"){if(via==="space"&&row3.id==="reset")return;return void doAction(row3.id)}if(row3.kind==="tone"||row3.kind==="knob"){if(row3.knob.kind==="slider")return;return stepRow(row3,1)}},activate=()=>act(navRows[selRef.current],"enter"),toggle=()=>act(navRows[selRef.current],"space"),adjust=(d2)=>{let row3=navRows[selRef.current];if(!row3)return;if(row3.id==="knobsfor")return void doAction("knobsfor");stepRow(row3,d2)},discard=async()=>{let cur=sRef.current;if(!cur?.dirty)return!1;let pick2=await openSaveDiscard(dialog,{title:"Unsaved edits",body:`'${cur.name}' has unsaved changes. Save them, discard them, or keep editing?`});if(pick2==="save")await doSave(),open2(cur.name);if(pick2==="discard")open2(cur.name);return!0};useKeyboard((key2)=>{if(!props.focused||dialog.open())return;if(key2.name==="u"&&sRef.current)return void doSubmit();if(key2.eventType==="release")return;if(keys.match("eikon.save",key2)){if(!saving)doSave();return}if(key2.name==="escape")return void discard();if(key2.name==="tab"){let i=PANES.indexOf(pane),next2=PANES[(i+(key2.shift?PANES.length-1:1))%PANES.length];setPane(next2),outer.current?.scrollChildIntoView(`studio-${next2}`);return}if(!s){if(key2.name==="return")return void doNew();return}if(pane==="knobs"){if(handleListKey(keys,key2,{count:navRows.length,setSel:setSelBy,scrollTo:kScroll,page:Math.max(1,(ksb.current?.viewport.height??10)-1),onActivate:activate,onToggle:toggle,onNew:()=>void doNew()}))return;if(key2.name==="left")return adjust(-1);if(key2.name==="right")return adjust(1);return}if(pane==="preview"){if(keys.match("list.toggle",key2))return setPlay((p)=>!p);if(!spatialOk||!live)return;if(handleListKey(keys,key2,{count:SP_ROWS.length,setSel:setSpSel}))return;let k2=["ox","oy","zoom","fps"][spRef.current],fine=key2.shift&&k2!=="fps",d2=(name)=>name==="left"?-1:1;if(key2.name==="left"||key2.name==="right"){if(fine&&(k2==="ox"||k2==="oy"||k2==="zoom")){let cur=sRef.current.spatial[k2];return setSpatial({[k2]:Math.max(k2==="zoom"?0.1:0,Math.min(1,+(cur+d2(key2.name)*0.01).toFixed(3)))})}return stepBar(k2,d2(key2.name))}return}if(key2.name==="left")return mutate((p)=>exports_eikon_knobs.cycle(p,-1));if(key2.name==="right")return mutate((p)=>exports_eikon_knobs.cycle(p,1));if(key2.name==="return")return doStripMenu()});let onScroll=(e)=>{if(e.stopPropagation(),!spatialOk||!live||!e.scroll)return;let d2=e.scroll.direction;if(d2!=="up"&&d2!=="down")return;let sign=d2==="up"?-1:1;if(e.modifiers.ctrl)return mutate((p)=>({...p,spatial:exports_eikon_knobs.zoom(p.spatial,sign),dirty:!0}));if(e.modifiers.shift)return mutate((p)=>({...p,spatial:exports_eikon_knobs.pan(p.spatial,sign,0),dirty:!0}));mutate((p)=>({...p,spatial:exports_eikon_knobs.pan(p.spatial,0,sign),dirty:!0}))},n=frames.length,title=s?`Preview \u2014 ${s.state}${s.per[s.state]?" (forked)":""}`+(n>1?` \xB7 ${play?"\u25B6":"\u23F8"} ${tick3%n+1}/${n}`:"")+(live?"":baked2?" \xB7 (baked)":""):"Preview",previewErr=err??(!s||src3||baked2?null:url2?"no source \u2014 Enter on 'fetch source' to download":"no source \u2014 Enter on 'source' to attach"),hint=!s?[["Enter","new eikon"],["Shift+\u2192","gallery"]]:pane==="knobs"?[["\u2191\u2193","row"],["\u2190\u2192","adjust"],[keys.print("list.activate"),"edit"],[keys.print("list.new"),"new"],["u","submit"],[keys.print("eikon.save"),"save"],["Tab","pane"]]:pane==="preview"?[["\u2191\u2193","row"],["\u2190\u2192","adjust"],[keys.print("list.toggle"),"play/pause"],["wheel","pan"],["Ctrl+wheel","zoom"],[keys.print("eikon.save"),"save"],["Tab","pane"]]:[["\u2190\u2192","state"],[keys.print("list.activate"),"actions"],[keys.print("eikon.save"),"save"],["Tab","pane"]],BAR_H=spatialOk&&live?Math.max(Math.ceil(MINI_W/2),3)+1:0,PREVIEW_W=Math.max(W2+2,38+MINI_W)+6,PREVIEW_H=H+(spatialOk&&live?1:0)+BAR_H+6+(previewErr?1:0),body=$jsxs("box",{position:"relative",flexDirection:"column",width:W2,height:H,flexShrink:0,backgroundColor:theme.background,onMouseScroll:onScroll,onMouseDown:()=>setPlay((p)=>!p),children:[frame.map((ln,i)=>$jsx("text",{fg:err?theme.textMuted:theme.hermAvatar,children:ln},i)),busy&&frames[0]===BLANK3?$jsx("box",{position:"absolute",left:0,top:H>>1,width:W2,justifyContent:"center",children:$jsx(Spinner,{color:theme.textMuted,label:"decoding\u2026"})}):null]}),preview3=$jsxs(TabShell,{title:spatialOk?title:`${title} \xB7 (ffmpeg not installed)`,error:previewErr,focus:pane==="preview",children:[!live&&baked2?$jsx("box",{height:1,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:"Baked \u2014 fetch or attach a source to edit."})}):null,spatialOk&&live&&s?$jsxs($Fragment,{children:[$jsx(PanBars,{sp:s.spatial,sel:spSel,focused:pane==="preview",onHover:(i)=>{setPane("preview"),setSpSel(i)},onSet:setBar,onWheel:stepBar,children:body}),$jsx(SpatialBar,{sp:s.spatial,fps:s.fps,dims:s.dims,sel:spSel,focused:pane==="preview",onHover:(i)=>{setPane("preview"),setSpSel(i)},onSet:setBar,onWheel:stepBar})]}):body]}),help=helpOf(navRows[sel]),panel=$jsx(TabShell,{title:s?`Settings \u2014 ${s.name}`:"Settings",focus:pane==="knobs",grow:1,children:!s?$jsx("box",{flexGrow:1,alignItems:"center",justifyContent:"center",children:$jsx("text",{fg:theme.textMuted,children:"No eikon open. Enter to create or pick one."})}):$jsxs($Fragment,{children:[$jsx("scrollbox",{id:"studio-knob-scroll",ref:ksb,scrollY:!0,flexGrow:1,contentOptions:COL,onMouseScroll:(e)=>e.stopPropagation(),children:rows3.map((row3,i)=>{let ni=navRows.findIndex((x2)=>x2.i===i),on=pane==="knobs"&&ni===sel,dim2=row3.kind==="knob"&&!src3;return $jsx(KnobRow,{id:`knob-${row3.kind}-${row3.id}`,row:row3,s,r,src:src3,on,dim:dim2,peek:peek5,busy:row3.id==="fetch"&&fetching,onHover:()=>{if(ni>=0)setPane("knobs"),setSelBy(ni)},onClick:()=>{if(ni>=0)setSelBy(ni),setPane("knobs"),act(row3,"click")},onWheel:(d2)=>stepRow(row3,d2),onSlide:row3.knob?.kind!=="slider"?void 0:row3.kind==="tone"?(v2)=>setTone({contrast:+v2.toFixed(2)}):(v2)=>mutate((p)=>exports_eikon_knobs.edit(p,(k2)=>exports_eikon_knobs.setSlider(k2,row3.id,row3.knob,v2)))},`${row3.kind}:${r.name}:${row3.id}`)})}),$jsx("box",{flexShrink:0,height:HELP_H,marginTop:1,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:help})})]})}),strip=s?$jsx("box",{id:"studio-strip",flexShrink:0,height:18,children:$jsx(TabShell,{title:"States",focus:pane==="strip",children:$jsx(Strip,{s,frames:thumbs,pending:pending3,focused:pane==="strip",onPick:(st)=>{setPane("strip"),mutate((p)=>exports_eikon_knobs.setState(p,st))},onEmpty:(st)=>doSource(st)})})}):null,top=wide?$jsxs("box",{flexDirection:"row",flexShrink:0,height:PREVIEW_H,children:[$jsx("box",{id:"studio-preview",flexShrink:0,width:PREVIEW_W,children:preview3}),$jsx("box",{id:"studio-knobs",flexGrow:1,flexBasis:0,minWidth:0,children:panel})]}):$jsxs($Fragment,{children:[$jsx("box",{id:"studio-preview",flexShrink:0,height:PREVIEW_H,children:preview3}),$jsx("box",{id:"studio-knobs",flexShrink:0,height:Math.max(rows3.length,1)+HELP_H+1+6,children:panel})]});return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,minHeight:0,children:[$jsxs("scrollbox",{ref:outer,scrollY:!0,flexGrow:1,contentOptions:COL,children:[top,strip]}),$jsx(HintBar,{pairs:hint,suffix:saving?"\u25CF saving\u2026":s?.dirty?"\u25CF unsaved":void 0})]})});var import_react105=__toESM(require_react_production(),1);import{readFileSync as readFileSync14}from"fs";import{basename as basename13,dirname as dirname12}from"path";var EikonGallery=import_react105.memo((props)=>{let theme=useTheme().theme,dialog=useDialog(),toast=useToast(),keys=useKeys(),rev2=import_react105.useSyncExternalStore(exports_eikon.onRevision,exports_eikon.revision),rows3=import_react105.useMemo(()=>{let user=hermesPath("eikons"),own=new Map(exports_eikon.list().map((x2)=>[x2.name.toLowerCase(),x2]));return listEikons([BUNDLED_EIKON_DIR,user]).map((e)=>{let slug3=e.path.startsWith(BUNDLED_EIKON_DIR)?e.meta.name.toLowerCase():basename13(dirname12(e.path)),mine=own.get(slug3);return{path:e.path,name:e.meta.name,slug:slug3,author:e.meta.author,bundled:e.path.startsWith(BUNDLED_EIKON_DIR),w:e.meta.width,h:e.meta.height,url:mine?.sourceUrl??e.meta.source_url,hasSource:mine?.hasSource??!!exports_eikon.findSource(slug3)}})},[rev2]),active=usePref("eikon"),[sel,setSel]=import_react105.useState(0),galleryFollow=useFollow("gal",(i)=>rows3[i]?.slug??i);import_react105.useEffect(()=>{if(sel>=rows3.length)setSel(Math.max(0,rows3.length-1))},[rows3.length,sel]);let cur=rows3[sel],parsed=import_react105.useMemo(()=>{if(!cur)return;try{return parseEikon(readFileSync14(cur.path,"utf8"))}catch{return}},[cur]),activate=(row3=cur)=>{if(!row3)return;set("eikon",row3.slug),toast.show({variant:"success",message:`Avatar \u2192 ${row3.name}`})},doNew=import_react105.useCallback(async()=>{let res=await openNewEikon(dialog,{});if(!res)return;if(res.from==="blank")return exports_eikon.ensure(res.name),props.onEdit?.(res.name);if(res.from==="file"){exports_eikon.ensure(res.name);try{exports_eikon.adopt(res.name,res.file,"base")}catch(e){return toast.error(e instanceof Error?e:Error(String(e)))}return props.onEdit?.(res.name)}toast.show({variant:"info",message:`Installing '${res.name}' from ${res.src}\u2026`}),await exports_eikon.installPackage(res.src,{name:res.name}).then((out)=>{toast.show({variant:"success",message:`Installed '${out.name}' (${out.n} files)`})}).catch((e)=>toast.error(e instanceof Error?e:Error(String(e))))},[dialog,toast,props]),submitLocal=import_react105.useCallback(async()=>{if(!cur||cur.bundled)return;let path7=submitPath(cur.slug);if(publishedInfo(path7)){toast.show({variant:"warning",title:"Published eikon",message:"Create a local draft before submitting",duration:6000});return}await openEikonSubmit(dialog,{name:cur.name,path:path7,submit:props.submit??submit2})},[cur,dialog,props.submit,toast]),del=async()=>{if(!cur||cur.bundled)return;if(!await openConfirm(dialog,{title:`Delete '${cur.name}'?`,danger:!0,body:`Removes ${dirname12(cur.path)} and all its sources. This cannot be undone.`}))return;exports_eikon.remove(cur.slug),toast.show({variant:"info",message:`Deleted ${cur.name}`})};return useKeyboard((key2)=>{if(!props.focused||dialog.open())return;if(handleListKey(keys,key2,{count:rows3.length,setSel,page:galleryFollow.opts.page,scrollTo:(n)=>galleryFollow.ref.current?.scrollChildIntoView(galleryFollow.id(n)),onActivate:()=>activate(),onDelete:()=>void del(),onNew:doNew}))return;if(key2.name==="u"&&cur&&!cur.bundled)return void submitLocal();if(key2.name==="e"&&cur&&props.onEdit)props.onEdit(cur.slug)}),$jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsxs("box",{flexDirection:"row",flexGrow:1,children:[$jsx(TabShell,{title:`Gallery (${rows3.length})`,focus:props.focused,grow:3,children:$jsx("scrollbox",{ref:galleryFollow.ref,scrollY:!0,flexGrow:1,verticalScrollbarOptions:VBAR,children:rows3.length===0?$jsx("text",{fg:theme.textMuted,children:"No eikons found."}):rows3.map((r,i)=>{let on=i===sel,here=r.slug===active;return $jsxs("box",{id:galleryFollow.id(i),flexDirection:"row",height:2,backgroundColor:on?theme.backgroundElement:void 0,onMouseMove:()=>setSel(i),onMouseDown:()=>{setSel(i),activate(r)},children:[$jsx("box",{width:2,children:$jsx("text",{fg:on?theme.primary:theme.textMuted,children:on?"\u25B8 ":" "})}),$jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsx("box",{height:1,children:$jsxs("text",{fg:here?theme.accent:theme.text,children:[here?"\u25CF ":" ",$jsx("strong",{children:r.name}),$jsx("span",{fg:theme.textMuted,children:r.bundled?" (bundled)":""})]})}),$jsx("box",{height:1,children:$jsxs("text",{fg:theme.textMuted,children:[` ${r.author??"\u2014"} \xB7 `,$jsx("span",{fg:r.hasSource?theme.success:r.url?theme.textMuted:theme.border,children:r.hasSource?"\u25CF source":r.url?"\u25CB source available":"\u2014 no source"})]})})]})]},r.path)})})}),$jsx(TabShell,{title:cur?`Preview \u2014 ${cur.name}`:"Preview",grow:3,children:$jsx("box",{alignItems:"center",justifyContent:"center",flexGrow:1,children:parsed?$jsx(AnimatedAvatar,{state:"idle",eikon:parsed},cur.path):$jsx("text",{fg:theme.textMuted,children:"No preview."})})})]}),$jsx(HintBar,{pairs:[["\u2191\u2193","select"],[keys.print("list.activate"),"use"],...cur&&props.onEdit?[["e","edit in studio"]]:[],...cur&&!cur.bundled?[["u","submit"]]:[],[keys.print("list.new"),"new / install"],...cur&&!cur.bundled?[[keys.print("list.delete"),"delete"]]:[]]})]})});var import_react107=__toESM(require_react_production(),1);init_perf();var DEFAULT_TIMEOUT=5000,DEFAULT_CACHE_LIMIT=24;function keyIdentity(s){try{let u3=new URL(s);if(u3.protocol==="http:"||u3.protocol==="https:"||u3.protocol==="file:")return u3.href.replace(/\/?$/,"/")}catch{}return s}function manifestBaseKey(s){try{let u3=new URL(s);if((u3.protocol==="http:"||u3.protocol==="https:"||u3.protocol==="file:")&&u3.pathname.endsWith("/manifest.json"))return new URL(".",u3).href}catch{}return}function registryKey(man,source){if(man?.kind!=="eikon.package"||typeof man.id!=="string")return;try{let host=source?new URL(source).host:void 0;if(!host)return;return`registry:${host}:${man.id}${typeof man.version==="string"&&man.version?`@${man.version}`:""}`}catch{return}}function entryKeys(entry2){return[...new Set([entry2.identityKey,entry2.sourceKey].filter(Boolean).map(keyIdentity))]}function keysFor(inst){let keys=new Set,man=inst.manifest,origin=typeof man?.origin?.source==="string"?man.origin.source:void 0,head=exports_eikon.header(inst.file),src3=typeof head?.source_url==="string"?head.source_url:inst.sourceUrl,registry2=registryKey(man,origin);if(registry2)keys.add(registry2);if(origin){keys.add(keyIdentity(origin));let base2=manifestBaseKey(origin);if(base2)keys.add(keyIdentity(base2))}if(src3){keys.add(keyIdentity(src3));let base2=manifestBaseKey(src3);if(base2)keys.add(keyIdentity(base2))}return[...keys]}function cacheKey(entry2){return entry2.identityKey||entry2.sourceKey||entry2.id}function previewTarget(entry2){return entry2.preview||entry2.runtimeUrl}function installed(){return exports_eikon.list().map((inst)=>({...inst,manifest:inst.manifest,identityKeys:keysFor(inst)}))}function match2(entry2,xs){let keys=entryKeys(entry2),exact=xs.find((x2)=>x2.identityKeys.some((k2)=>keys.includes(k2)));if(exact)return{inst:exact,legacy:!1};let named=xs.find((x2)=>x2.name===entry2.name&&x2.identityKeys.length===0);if(named)return{inst:named,legacy:!0};return}function row3(entry2,xs){let usable=match2(entry2,xs),active=usable?get2("eikon")===usable.inst.name:!1,installed2=Boolean(usable),installState=active?"active":!usable?"available":usable.legacy?"legacy-name-match":"installed";return{entry:entry2,installed:installed2,active,installState,...usable?.inst.file?{installedPath:usable.inst.file}:{},...usable?.inst.manifest?{installedManifest:usable.inst.manifest}:{},action:active?"active":installed2?"use":"install"}}function abortErr(){return new DOMException("aborted","AbortError")}class MarketplaceService{catalog;fetcher;timeoutMs;previewCacheLimit;concurrency;activeLoads=0;queue=[];cache=new Map;inFlight=new Map;constructor(catalog2,opts={}){this.catalog=catalog2,this.fetcher=opts.fetcher??fetch,this.timeoutMs=opts.timeoutMs??DEFAULT_TIMEOUT,this.previewCacheLimit=opts.previewCacheLimit??DEFAULT_CACHE_LIMIT,this.concurrency=Math.max(1,Math.floor(opts.concurrency??4))}rows(query=""){let entries2=searchCatalog(this.catalog.entries,query),xs=installed();return entries2.map((e)=>row3(e,xs))}entry(id){let key2=keyIdentity(id);return this.catalog.entries.find((e)=>keyIdentity(e.identityKey)===key2||keyIdentity(e.sourceKey)===key2||e.id===id||e.name===id)}async preview(id,opts={}){if(opts.signal?.aborted)throw abortErr();let entry2=this.entry(id);if(!entry2)throw Error(`marketplace: unknown eikon "${id}"`);let key2=cacheKey(entry2),hit2=this.cache.get(key2);if(hit2!==void 0)return hit2;let active=this.inFlight.get(key2);if(active)return active;let p=this.enqueue(()=>this.loadPreview(entry2,opts)).finally(()=>this.inFlight.delete(key2));return this.inFlight.set(key2,p),p}async install(id){let entry2=this.entry(id);if(!entry2)throw Error(`marketplace: unknown eikon "${id}"`);let before=get2("eikon"),out=await exports_eikon.fetchSource(entry2.packageUrl,{name:entry2.name});if(get2("eikon")!==before)set("eikon",before);return out}enqueue(run){return new Promise((resolve4,reject)=>{this.queue.push({run,resolve:resolve4,reject}),this.pump()})}pump(){if(this.activeLoads>=this.concurrency)return;let job=this.queue.shift();if(!job)return;this.activeLoads+=1,job.run().then(job.resolve,job.reject).finally(()=>{this.activeLoads-=1,this.pump()})}async loadPreview(entry2,opts){let ctl=new AbortController,timeout=setTimeout(()=>ctl.abort(),opts.timeoutMs??this.timeoutMs),off=()=>ctl.abort();opts.signal?.addEventListener("abort",off,{once:!0});try{let res=await this.fetcher(previewTarget(entry2),{signal:ctl.signal});if(!res.ok)throw Error(`catalog: HTTP ${res.status}`);let text3=await res.text();this.cache.set(cacheKey(entry2),text3);while(this.cache.size>this.previewCacheLimit)this.cache.delete(this.cache.keys().next().value);return text3}finally{clearTimeout(timeout),opts.signal?.removeEventListener("abort",off)}}}async function load4(opts={}){let query=opts.query??"";try{if(opts.catalog)publicCatalogUrl(opts.catalog,void 0,opts);let cat=await loadCatalog(opts.catalog,opts.fetcher??fetch,opts),service=new MarketplaceService(cat,opts),rows3=service.rows(query);return{status:rows3.length>0?"ready":"empty",query,rows:rows3,selected:rows3[0],service}}catch(err){return{status:"error",query,rows:[],error:err instanceof Error?err.message:String(err)}}}var NO_MARKET={status:"empty",query:"",rows:[]},EikonMarketplace=import_react107.memo((props)=>{let toast=useToast(),keys=useKeys(),rev2=import_react107.useSyncExternalStore(exports_eikon.onRevision,exports_eikon.revision),[sel,setSel]=import_react107.useState(0),[searching,setSearching]=import_react107.useState(!1),[query,setQuery]=import_react107.useState(""),[state2,setState2]=import_react107.useState(NO_MARKET),[loading,setLoading]=import_react107.useState(!1),[installing,setInstalling]=import_react107.useState(!1),[previewState,setPreviewState]=import_react107.useState("idle"),[detailPreview,setDetailPreview]=import_react107.useState(void 0),previewSeq=import_react107.useRef(0),follow=useFollow("market",(i)=>state2.rows[i]?.entry.identityKey??i);import_react107.useEffect(()=>{if(sel>=state2.rows.length)setSel(Math.max(0,state2.rows.length-1))},[state2.rows.length,sel]);let selected=state2.rows[sel];import_react107.useEffect(()=>{if(!selected||!state2.service){setDetailPreview(void 0),props.sidebarPreview?.(void 0);return}let id=++previewSeq.current,key2=selected.entry.identityKey;count("market:preview:load"),state2.service.preview(key2).then((text3)=>{if(previewSeq.current!==id)return;let e=parseEikon(text3),st=e.states.has(previewState)?previewState:"idle",preview3={key:`${key2}:${st}`,eikon:e,state:st,title:selected.entry.name,subtitle:selected.entry.author??"unknown",body:selected.entry.description??"No description.",rows:[{label:"Action",value:actionLabel(selected),strong:selected.action!=="active"},{label:"Status",value:selected.installed?selected.active?"active":"installed":"not installed"},{label:"State",value:st},{label:"Digest",value:digest(selected)??"unknown"}]};if(props.sidebarPreview)props.sidebarPreview(preview3);setDetailPreview(preview3),count("market:preview:ready")}).catch(()=>{if(previewSeq.current!==id)return;setDetailPreview(void 0),props.sidebarPreview?.(void 0),count("market:preview:error")})},[selected?.entry.identityKey,state2.service,previewState,props.sidebarPreview,props.sidebarHidden]),import_react107.useEffect(()=>()=>{previewSeq.current++,setDetailPreview(void 0),props.sidebarPreview?.(void 0)},[props.sidebarPreview]);let loadMarket=import_react107.useCallback((q5=query)=>{setLoading(!0);let end=mark("market:list:load");load4({catalog:process.env.EIKON_URL,allowPrivate:!0,query:q5}).then((next2)=>{count("market:list:rows",next2.rows.length),setState2(next2),setSel((p)=>Math.max(0,Math.min(next2.rows.length-1,p)))}).finally(()=>{end(),setLoading(!1)})},[query]);import_react107.useEffect(()=>{loadMarket(query)},[query,rev2,loadMarket]);let clearPreview=import_react107.useCallback(()=>{previewSeq.current++,props.sidebarPreview?.(void 0),setDetailPreview(void 0)},[props.sidebarPreview]),primary=import_react107.useCallback((idx)=>{let row4=state2.rows[idx??sel],svc=state2.service;if(!row4||!svc||installing)return;if(row4.action==="active")return;if(row4.action==="use"){let name=row4.installedManifest?.name??row4.entry.name;set("eikon",name),toast.show({variant:"success",message:`Avatar \u2192 ${name}`}),loadMarket(query);return}setInstalling(!0),svc.install(row4.entry.identityKey).then((out)=>{toast.show({variant:"success",message:`Installed '${out.name}' (${out.n} files)`}),loadMarket(query)}).catch((err)=>{let e=err instanceof Error?err:Error(String(err));toast.show({variant:"error",title:"Install failed",message:e.message,duration:6000}),loadMarket(query)}).finally(()=>setInstalling(!1))},[state2.rows,state2.service,sel,installing,toast,loadMarket,query]);useKeyboard((key2)=>{if(!props.focused)return;if(searching){if(key2.name==="escape"){setSearching(!1);return}if(key2.name==="backspace"){setQuery((q5)=>q5.slice(0,-1)),setSel(0);return}if(key2.raw&&key2.raw.length===1&&key2.raw>=" "){setQuery((q5)=>q5+key2.raw),setSel(0);return}return}if(key2.name==="escape")return clearPreview();let plain=!key2.shift&&!key2.ctrl&&!key2.meta,move=(by)=>setSel((p)=>{let n=Math.max(0,Math.min(state2.rows.length-1,p+by));return follow.opts.scrollTo?.(n),n});if(plain&&key2.name==="left"){move(-1);return}if(plain&&key2.name==="right"){move(1);return}if(plain&&key2.name==="up"){move(-2);return}if(plain&&key2.name==="down"){move(2);return}if(handleListKey(keys,key2,{count:state2.rows.length,setSel,...follow.opts,onActivate:primary,onToggle:()=>setPreviewState((s)=>s==="idle"?"thinking":"idle"),onSearch:()=>setSearching(!0),onRefresh:()=>loadMarket(query)}))return}),count("market:render");let fallback=props.sidebarHidden||!props.sidebarPreview;return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,minHeight:0,children:[$jsxs("box",{flexDirection:"row",flexGrow:1,minWidth:0,minHeight:0,children:[$jsx(TabShell,{title:`Marketplace (${state2.rows.length})${searching?` Search: ${query}`:""}`,focus:props.focused,grow:fallback?3:1,children:$jsx(MarketplaceGrid,{rows:state2.rows,sel,follow,loading,error:state2.error,onSel:setSel,onUse:primary})}),fallback?$jsx(TabShell,{title:selected?`Details \u2014 ${selected.entry.name}`:"Details",grow:2,children:$jsx(MarketplaceDetail,{row:selected,loading,installing,onUse:()=>primary(),onState:setPreviewState,preview:detailPreview})}):null]}),$jsx(HintBar,{pairs:[["\u2191\u2193\u2190\u2192/Pg/Home/End","select"],[keys.print("list.activate"),actionLabel(selected)],[keys.print("list.search"),searching?"typing search":"search"],[keys.print("list.refresh"),"reload"],["Space","preview state"],["Esc",searching?"exit search":props.sidebarPreview?"restore sidebar":"clear preview"]]})]})}),MarketplaceGrid=(props)=>{let theme=useTheme().theme;if(props.error)return $jsx("box",{padding:1,children:$jsxs("text",{fg:theme.error,wrapMode:"word",children:["Marketplace unavailable: ",props.error]})},"error");if(props.loading&&props.rows.length===0)return $jsx("box",{padding:1,children:$jsx("text",{fg:theme.textMuted,children:"Loading shared eikons\u2026"})},"loading");if(props.rows.length===0)return $jsx("box",{padding:1,children:$jsx("text",{fg:theme.textMuted,children:"No shared eikons match. Press / to change search."})},"empty");return $jsx("scrollbox",{ref:props.follow.ref,scrollY:!0,flexGrow:1,verticalScrollbarOptions:VBAR,children:chunk(props.rows,2).map((rows3,y2)=>{let h2=Math.max(...rows3.map(cardHeight));return $jsx("box",{flexDirection:"row",height:h2,flexShrink:0,width:"100%",children:rows3.map((r,x2)=>{let i=y2*2+x2,on=i===props.sel,lines2=posterLines(r.entry.poster);return $jsxs("box",{id:props.follow.id(i),flexDirection:"column",height:h2,width:"50%",paddingX:1,backgroundColor:on?theme.backgroundElement:void 0,onMouseMove:()=>props.onSel(i),onMouseDown:()=>{props.onSel(i),props.onUse(i)},children:[$jsxs("box",{height:1,flexDirection:"row",children:[$jsx("box",{width:2,children:$jsx("text",{fg:on?theme.primary:theme.textMuted,children:on?"\u25B8 ":" "})}),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsxs("text",{fg:r.active?theme.accent:theme.text,wrapMode:"none",children:[r.active?"\u25CF ":" ",$jsx("strong",{children:r.entry.name})]})}),$jsx("box",{width:10,children:$jsx("text",{fg:actionColor(r,theme),children:actionLabel(r)})})]}),$jsx("box",{height:lines2.length,paddingLeft:2,overflow:"hidden",flexDirection:"column",children:lines2.map((line3,j2)=>$jsx("box",{height:1,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:line3||" "})},j2))}),$jsx("box",{height:1,paddingLeft:2,overflow:"hidden",children:$jsxs("text",{fg:theme.textMuted,wrapMode:"none",children:["by ",r.entry.author??"unknown"]})}),$jsx("box",{height:1,paddingLeft:2,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:r.entry.description??"No description."})}),$jsx("box",{height:1,paddingLeft:2,overflow:"hidden",children:$jsxs("text",{fg:theme.textMuted,wrapMode:"none",children:[meta(r)," \xB7 ",r.installed?r.active?"active":"installed":"not installed"]})})]},r.entry.identityKey)})},y2)})},"rows")},posterLines=(poster2)=>{let lines2=poster2?poster2.split(`
4149
+ `).pop();if(!last3)return{err:"no output"};let j2;try{j2=JSON.parse(last3)}catch{return{err:`unparseable: ${last3.slice(0,200)}`}}if(j2.success===!1||j2.error)return{err:String(j2.error??"provider error")};let ref=j2.image??j2.video;if(!ref)return{err:"provider returned no asset"};if(ref.startsWith("/")||ref.startsWith("file://"))return{path:ref.replace(/^file:\/\//,"")};if(/^https?:\/\//.test(ref))return fetchTo(ref,kind2==="image"?".png":".mp4").then((p)=>({path:p})).catch((e)=>({err:`download: ${e instanceof Error?e.message:e}`}));return{err:`unrecognized asset ref: ${ref.slice(0,80)}`}},impl=generate,probeImpl=probe2,current=()=>impl,setImpl=(fn)=>{impl=fn??generate},setProbe=(fn)=>{probeImpl=fn??probe2},probeCached=()=>probeImpl();var import_react101=__toESM(require_react_production(),1);var ORDER4=["name","from"],FROMS=[{id:"blank",label:"blank",hint:"author in Studio"},{id:"file",label:"local file",hint:"png / jpg / webp / gif / mp4"},{id:"install",label:"install from",hint:"catalog name \xB7 git URL \xB7 http://\u2026 \xB7 local dir"}],INSTALL_HINT="catalog name \xB7 github.com/u/r \xB7 git URL \xB7 http://\u2026/ \xB7 local dir";function openNewEikon(dialog,opts={}){return new Promise((resolve4)=>{let chained=!1;dialog.replace($jsx(Form4,{initial:opts.initial,dialog,onChain:()=>{chained=!0},done:(r)=>{chained=!0,dialog.clear(),resolve4(r)}}),()=>{if(!chained)resolve4(null)})})}var Form4=(props)=>{let theme=useTheme().theme,[name,setName]=import_react101.useState(props.initial??""),[from2,setFrom]=import_react101.useState("blank"),[field,setField]=import_react101.useState("name"),slug3=name?exports_eikon_knobs.slug(name):"",ok=slug3.length>0,submit3=async()=>{if(!ok)return;if(from2==="blank")return props.done({name:slug3,from:"blank"});if(props.onChain(),from2==="file"){let file2=await openTextPrompt(props.dialog,{title:"Source file",label:"absolute or ~ path (png / jpg / webp / gif / mp4)"});return props.done(file2?{name:slug3,from:"file",file:file2}:null)}let src3=await openTextPrompt(props.dialog,{title:"Install eikon",label:INSTALL_HINT});props.done(src3?{name:slug3,from:"install",src:src3}:null)};useKeyboard((key2)=>{if(key2.name==="escape")return props.done(null);if(key2.name==="tab"){let i=ORDER4.indexOf(field);return setField(ORDER4[(i+(key2.shift?-1:1)+ORDER4.length)%ORDER4.length])}if(key2.name==="return")return void submit3();if(field==="name"){if(key2.name==="backspace")return setName((n)=>n.slice(0,-1));if(key2.raw&&key2.raw.length===1&&/[A-Za-z0-9 _-]/.test(key2.raw))return setName((n)=>n+key2.raw);return}if(key2.name==="up"){let i=FROMS.findIndex((f)=>f.id===from2);return setFrom(FROMS[Math.max(0,i-1)].id)}if(key2.name==="down"){let i=FROMS.findIndex((f)=>f.id===from2);return setFrom(FROMS[Math.min(FROMS.length-1,i+1)].id)}});let bg2=(f)=>field===f?theme.backgroundElement:void 0;return $jsxs("box",{flexDirection:"column",width:60,children:[$jsx("box",{height:1,children:$jsx("text",{fg:theme.primary,children:$jsx("strong",{children:"New eikon"})})}),$jsx("box",{height:1}),$jsxs("box",{height:1,flexDirection:"row",backgroundColor:bg2("name"),children:[$jsx("box",{width:9,children:$jsx("text",{fg:theme.textMuted,children:"Name"})}),$jsxs("text",{children:[$jsx("span",{fg:theme.text,children:name}),field==="name"?$jsx("span",{fg:theme.accent,children:"\u2588"}):null]})]}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:slug3?` \u2192 ${slug3}`:" type a name"})}),$jsx("box",{height:1}),$jsx("box",{height:1,backgroundColor:bg2("from"),children:$jsx("text",{fg:theme.textMuted,children:"From (\u2191\u2193)"})}),FROMS.map((f)=>{let on=f.id===from2,fg2=on?theme.accent:theme.text;return $jsxs("box",{height:1,flexDirection:"row",backgroundColor:bg2("from"),children:[$jsx("box",{width:2,children:$jsx("text",{fg:fg2,children:on?"\u25B8 ":" "})}),$jsx("box",{width:14,children:$jsx("text",{fg:fg2,children:f.label})}),$jsx("text",{fg:theme.textMuted,children:f.hint})]},f.id)}),$jsx("box",{height:1}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:ok?"Enter create \xB7 Tab next field \xB7 Esc cancel":"type a name"})})]})};extend({slider:SliderRenderable});var PANES=["knobs","preview","strip"],HELP_H=4,COL={flexDirection:"column"},mb2=(n)=>n<1024?`${n} B`:n<1048576?`${(n/1024).toFixed(0)} KB`:`${(n/1048576).toFixed(1)} MB`,HEAD2=[{id:"open",kind:"select",label:"eikon"},{id:"rasterizer",kind:"select",label:"rasterizer"},{id:"source",kind:"prompt",label:"source"},{id:"-1",kind:"divider",label:""},{id:"fetch",kind:"action",label:"fetch source",show:(s,live,url2)=>!live&&!!url2},{id:"knobsfor",kind:"action",label:"tune",show:(_s,live)=>live},{id:"reset",kind:"action",label:"reset",show:(_s,live)=>live},{id:"revert",kind:"action",label:"revert",show:(s)=>s.dirty},{id:"-2",kind:"divider",label:"",show:(_s,live)=>live},{id:"h-input",kind:"header",label:"input",show:(_s,live)=>live},{id:"contrast",kind:"tone",label:"contrast",show:(_s,live)=>live,knob:{kind:"slider",min:0.25,max:4,step:0.05,default:1,hint:"Spread pixel values around their mean. \xD71 = source as-is; higher sharpens, lower flattens. Applied to the image before rasterizing."}},{id:"invert",kind:"tone",label:"invert",show:(_s,live)=>live,knob:{kind:"toggle",default:!0,hint:"Swap light\u2194dark in the source pixels. On for a light subject on a dark terminal background \u2014 turn off if the subject is darker than its surround."}},{id:"flip",kind:"tone",label:"flip",show:(_s,live)=>live,knob:{kind:"cycle",options:["none","h","v","hv"],default:"none",hint:"Mirror the source horizontally, vertically, or both before rasterizing."}},{id:"-3",kind:"divider",label:"",show:(_s,live)=>live}],HELP={open:"Which eikon you're editing. Enter to switch, create a new one, or install from elsewhere.",rasterizer:"The engine that turns your source image/video into text art. Each rasterizer exposes its own look-and-feel settings below the divider.",source:"The image or video file the avatar is rendered from. Enter to pick, generate, or clear.",fetch:"Download this eikon's published source media so you can re-tune it locally.",knobsfor:"\u2190\u2192 toggles whether the settings below apply to every state or just the one selected in the strip.",reset:"Restore every setting below to this rasterizer's defaults and drop per-state overrides.",submit:"Submit this local eikon after backend preflight.",revert:"Throw away unsaved edits and reload this eikon from disk."},FLIPS=["none","h","v","hv"];function helpOf(row3){if(!row3)return"";if(row3.id==="source")return $jsxs($Fragment,{children:[$jsxs("span",{children:[HELP.source," "]}),$jsx("strong",{children:"Use /eikon-create to generate source files interactively (recommended)."})]});let head=HELP[row3.id];if(head)return head;if(!row3.knob)return"";if(row3.knob.hint)return row3.knob.hint;if(row3.knob.kind==="cycle")return`\u2190\u2192 or Enter cycles: ${row3.knob.options.join(" \xB7 ")}.`;if(row3.knob.kind==="toggle")return"Space or Enter toggles on/off.";return`\u2190\u2192 or drag adjusts (${row3.knob.min}\u2013${row3.knob.max}); scroll while selected also works.`}function buildRows(r,s,live,url2){let dyn=live?Object.entries(r.knobs).map(([id,def2])=>({id,kind:"knob",label:def2.label??id,knob:def2})):[],head=HEAD2.filter((h2)=>h2.show?h2.show(s,live,url2):!0);return dyn.length?[...head,{id:"h-r",kind:"header",label:r.name},...dyn]:head}var MINI_W=12;function Mini(props){let theme=useTheme().theme,d2=props.dims??{w:1,h:1},ar=d2.w/d2.h,bw=ar>=1?MINI_W:Math.max(4,Math.round(MINI_W*ar)),bh=ar>=1?Math.max(4,Math.round(MINI_W/ar)):MINI_W,short2=Math.min(bw,bh),cw=Math.max(1,short2*props.sp.zoom),cx=(bw-cw)*props.sp.ox,cy=(bh-cw)*props.sp.oy,on=(x2,y2)=>x2>=cx&&x2<cx+cw&&y2>=cy&&y2<cy+cw,cell=(x2,ty)=>{let up=on(x2,ty*2),dn=on(x2,ty*2+1);return up&&dn?"\u2588":up?"\u2580":dn?"\u2584":"\xB7"};return $jsx("box",{flexDirection:"column",flexShrink:0,backgroundColor:theme.backgroundElement,children:Array.from({length:Math.ceil(bh/2)},(_2,ty)=>$jsx("text",{fg:theme.textMuted,children:Array.from({length:bw},(_3,x2)=>cell(x2,ty)).join("")},ty))})}var SP_ROWS=["pan x","pan y","zoom","fps"];function PanBars(props){let theme=useTheme().theme,z2=props.sp.zoom,slack=1-z2,on=(i)=>props.focused&&props.sel===i,fg2=(i)=>on(i)?theme.accent:theme.textMuted,wheel=(k2)=>(e)=>{e.stopPropagation();let d2=e.scroll?.direction;if(d2==="up"||d2==="left")props.onWheel(k2,-1);if(d2==="down"||d2==="right")props.onWheel(k2,1)},drag=import_react103.useRef(null),grab=(k2,at)=>{drag.current={at,v:props.sp[k2],k:k2}},scrub=(at,L2)=>{let d2=drag.current;if(!d2||slack<=0)return;props.onSet(d2.k,Math.max(0,Math.min(1,+(d2.v+(at-d2.at)/(slack*L2)).toFixed(3))))},drop=()=>{drag.current=null},tw=Math.max(1,Math.round(z2*W2)),tl=Math.min(W2-tw,Math.round(props.sp.ox*slack*W2)),hbar=" ".repeat(tl)+"\u2588".repeat(tw)+" ".repeat(W2-tl-tw),vh=H*2,th=Math.max(1,z2*vh),ty=props.sp.oy*slack*vh,vbar=Array.from({length:H},(_2,y2)=>{let up=y2*2>=ty&&y2*2<ty+th,dn=y2*2+1>=ty&&y2*2+1<ty+th;return up&&dn?"\u2588\u2588":up?"\u2580\u2580":dn?"\u2584\u2584":" "});return $jsxs("box",{flexDirection:"row",flexShrink:0,children:[$jsxs("box",{flexDirection:"column",flexShrink:0,children:[props.children,$jsx("box",{width:W2,height:1,backgroundColor:theme.border,onMouseMove:()=>props.onHover(0),onMouseScroll:wheel("ox"),onMouseDown:(e)=>grab("ox",e.x),onMouseDrag:(e)=>scrub(e.x,W2),onMouseUp:drop,onMouseDragEnd:drop,children:$jsx("text",{fg:fg2(0),children:hbar})})]}),$jsx("box",{flexDirection:"column",width:2,height:H,backgroundColor:theme.border,onMouseMove:()=>props.onHover(1),onMouseScroll:wheel("oy"),onMouseDown:(e)=>grab("oy",e.y),onMouseDrag:(e)=>scrub(e.y,H),onMouseUp:drop,onMouseDragEnd:drop,children:vbar.map((g,y2)=>$jsx("text",{fg:fg2(1),children:g},y2))})]})}function SpatialBar(props){let theme=useTheme().theme,rows3=[{label:"zoom",k:"zoom",min:0.1,max:1,v:props.sp.zoom,i:2},{label:"fps",k:"fps",min:4,max:30,v:props.fps,i:3}],wheel=(k2)=>(e)=>{e.stopPropagation();let d2=e.scroll?.direction;if(d2==="up")props.onWheel(k2,-1);if(d2==="down")props.onWheel(k2,1)};return $jsxs("box",{flexDirection:"row",marginTop:1,flexShrink:0,children:[$jsx("box",{flexDirection:"column",gap:1,flexShrink:0,children:rows3.map((d2)=>{let on=props.focused&&d2.i===props.sel;return $jsxs("box",{height:1,flexDirection:"row",backgroundColor:on?theme.backgroundElement:void 0,onMouseMove:()=>props.onHover(d2.i),onMouseScroll:wheel(d2.k),children:[$jsx("box",{width:2,children:$jsx("text",{fg:on?theme.primary:theme.textMuted,children:on?"\u25B8 ":" "})}),$jsx("box",{width:7,children:$jsx("text",{fg:on?theme.text:theme.textMuted,children:d2.label})}),$jsx("box",{width:20,height:1,children:$jsx("slider",{orientation:"horizontal",min:d2.min,max:d2.max,value:d2.v,foregroundColor:on?theme.accent:theme.textMuted,backgroundColor:theme.border,onChange:(v2)=>props.onSet(d2.k,d2.k==="fps"?Math.round(v2):+v2.toFixed(3))})}),$jsx("box",{width:7,children:$jsx("text",{fg:on?theme.text:theme.textMuted,children:` ${d2.k==="fps"?d2.v.toFixed(0):d2.v.toFixed(2)}`})})]},d2.label)})}),$jsx("box",{width:2}),$jsx(Mini,{sp:props.sp,dims:props.dims})]})}function valueOf(s,r,row3,theme,src3,peek5,busy){if(row3.id==="open")return`${s.name} \u25B8`;if(row3.id==="rasterizer"){let a=r.available();if(a===!0)return`${r.name} \u25B8`;return $jsxs($Fragment,{children:[$jsx("span",{children:`${r.name} \u25B8`}),$jsx("span",{fg:theme.warning,children:` \u26A0 ${a}`})]})}if(row3.id==="source"){if(!src3)return"(none \u2014 Enter to attach)";let d2=s.dims,sz=(()=>{try{return mb2(statSync6(src3).size)}catch{return"?"}})();return d2?`${basename12(src3)} \xB7 ${d2.w}\xD7${d2.h} \xB7 ${sz}`:`${basename12(src3)} \xB7 ${sz}`}if(row3.id==="knobsfor")return`\u25C2 ${!!s.per[s.state]?`${s.state} only`:"all states"} \u25B8`;if(row3.id==="reset")return"\u25B8 defaults";if(row3.id==="revert")return"\u25B8 reload from disk";if(row3.kind==="tone"){if(row3.id==="contrast")return`\xD7${s.tone.contrast.toFixed(2)}`;if(row3.id==="invert")return s.tone.invert?"\u25CF on":"\u25CB off";if(row3.id==="flip")return`\u25C2 ${s.tone.flip} \u25B8`}if(row3.id==="fetch")return busy?"fetching\u2026":peek5?`\u25B8 download to edit (${peek5.n} files, ${mb2(peek5.bytes)})`:"\u25B8 download to edit";if(row3.kind==="knob"&&row3.knob){let k2=exports_eikon_knobs.eff(s,s.state)[row3.id]??row3.knob.default;if(row3.knob.kind==="cycle")return`\u25C2 ${String(k2)} \u25B8`;if(row3.knob.kind==="toggle")return k2?"\u25CF on":"\u25CB off";if(row3.knob.kind==="slider")return Number(k2).toFixed(2)}return""}function KnobRow(props){let theme=useTheme().theme,{row:row3,on,dim:dim2}=props,slider=row3.knob?.kind==="slider"?row3.knob:void 0,sval=!slider?0:row3.kind==="tone"?props.s.tone.contrast:Number(exports_eikon_knobs.eff(props.s,props.s.state)[row3.id]??slider.default),pushed=import_react103.useRef(sval);pushed.current=sval;let slide=(v2)=>{if(v2!==pushed.current)props.onSlide?.(v2)};if(row3.kind==="divider")return $jsx("box",{id:props.id,height:1,children:$jsx("text",{fg:theme.border,children:"\u2500".repeat(24)})});if(row3.kind==="header")return $jsx("box",{id:props.id,height:1,children:$jsx("text",{fg:theme.textMuted,children:$jsx("u",{children:row3.label})})});let scroll=(e)=>{if(!on||!slider||!props.onWheel)return;e.stopPropagation();let d2=e.scroll?.direction;if(d2==="up"||d2==="left")props.onWheel(-1);if(d2==="down"||d2==="right")props.onWheel(1)};return $jsxs("box",{id:props.id,height:1,flexDirection:"row",backgroundColor:on?theme.backgroundElement:void 0,onMouseMove:props.onHover,onMouseDown:props.onClick,onMouseScroll:scroll,children:[$jsx("box",{width:2,children:$jsx("text",{fg:on?theme.primary:theme.textMuted,children:on?"\u25B8 ":" "})}),$jsx("box",{width:14,children:$jsx("text",{fg:dim2?theme.textMuted:on?theme.text:theme.textMuted,children:row3.label})}),slider?$jsxs($Fragment,{children:[$jsx("box",{width:20,height:1,children:$jsx("slider",{orientation:"horizontal",min:slider.min,max:slider.max,value:sval,foregroundColor:on?theme.accent:theme.textMuted,backgroundColor:theme.border,onChange:slide})}),$jsx("box",{width:1})]}):null,$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:props.busy&&row3.id==="fetch"?$jsx(Spinner,{color:theme.accent,label:"fetching\u2026"}):$jsx("text",{fg:dim2?theme.textMuted:theme.text,children:valueOf(props.s,props.r,row3,theme,props.src,props.peek,props.busy)})})]})}function Strip(props){let theme=useTheme().theme,glyph=useSpinnerGlyph(props.pending.size>0);return $jsx("box",{flexDirection:"row",gap:1,children:STATES2.map((st)=>{let on=props.s.state===st,own=!!props.s.per[st],has=!!props.s.sources[st],f=props.frames.get(st),gen=props.pending.has(st),empty=!f&&!gen;return $jsxs("box",{flexDirection:"column",alignItems:"center",onMouseDown:()=>{if(props.onPick(st),empty)props.onEmpty?.(st)},children:[$jsx("box",{border:!0,borderStyle:"rounded",borderColor:on&&props.focused?theme.primary:on?theme.accent:theme.border,width:18,height:10,overflow:"hidden",alignItems:"center",justifyContent:"center",children:gen?$jsx("text",{fg:theme.accent,children:`${glyph} gen`}):f?f.map((ln,i)=>$jsx("text",{fg:on?theme.text:theme.textMuted,children:ln},i)):$jsx("text",{fg:theme.textMuted,children:"+"})}),$jsx("box",{height:1,children:$jsx("text",{fg:on?theme.accent:theme.textMuted,children:st})}),$jsx("box",{height:1,children:$jsx("text",{fg:theme.textMuted,children:has?"own src":own?"forked":""})})]},st)})})}var BLANK3=Array.from({length:H},()=>" ".repeat(W2)),genCaps=null,probeGen=()=>{if(genCaps)return genCaps;let p=exports_eikon_gen.probeCached();return p.catch(()=>{genCaps=null}),genCaps=p};var EikonStudio=import_react103.memo((props)=>{let theme=useTheme().theme,keys=useKeys(),dialog=useDialog(),gw=useGateway(),toast=useToast(),wide=useTerminalDimensions().width>=120,ksb=import_react103.useRef(null),outer=import_react103.useRef(null);import_react103.useSyncExternalStore(exports_eikon.onRegistry,()=>exports_eikon.rasterizers().length);let[s,setS]=import_react103.useState(null),[pane,setPane]=import_react103.useState("knobs"),[sel,setSel]=import_react103.useState(0),[spSel,setSpSel]=import_react103.useState(0),selRef=import_react103.useRef(0);selRef.current=sel;let spRef=import_react103.useRef(0);spRef.current=spSel;let sRef=import_react103.useRef(null);sRef.current=s;let[frames,setFrames]=import_react103.useState([BLANK3]),[tick3,setTick]=import_react103.useState(0),[play,setPlay]=import_react103.useState(!0),[busy,setBusy]=import_react103.useState(!1),[fetching,setFetching]=import_react103.useState(!1),[peek5,setPeek]=import_react103.useState(void 0),[thumbs,setThumbs]=import_react103.useState(new Map),[err,setErr]=import_react103.useState(null),[saving,setSaving]=import_react103.useState(!1),[pending3,setPending]=import_react103.useState(new Set),[genOk,setGenOk]=import_react103.useState(null),frame=frames[tick3%frames.length]??BLANK3,r=import_react103.useMemo(()=>exports_eikon.pick(s?.rasterizer??get2("eikonRasterizer")),[s?.rasterizer]),spatialOk=caps.ffmpeg,open2=import_react103.useCallback((name)=>{resetCache();let seed=exports_eikon.readStudio(name),ra=exports_eikon.pick(seed?.rasterizer??get2("eikonRasterizer")),next2=exports_eikon_knobs.fresh(name,ra,seed),src4=exports_eikon.findSource(name,"idle");next2.dims=src4?exports_eikon.probe(src4)??null:null;for(let st of STATES2){let p=exports_eikon.findSource(name,st);if(p)prewarm(p,next2.fps)}setS(next2),selRow.current=void 0,setSel(0),setPane("knobs"),setErr(null),setTick(0),setFrames([BLANK3])},[]),tried=import_react103.useRef(!1);import_react103.useEffect(()=>{if(tried.current)return;if(tried.current=!0,props.name)return open2(props.name||exports_eikon_knobs.slug("new"));let n2=get2("eikon");if(n2)open2(n2)},[open2,props.name]);let dialogRef=import_react103.useRef(dialog);dialogRef.current=dialog,import_react103.useEffect(()=>{if(props.name===void 0)return;let next2=props.name||exports_eikon_knobs.slug("new"),cur=sRef.current;if(cur?.name===next2)return;if(!cur?.dirty)return open2(next2);let dead=!1;return openConfirm(dialogRef.current,{title:"Discard unsaved edits?",danger:!0,body:`Switch to '${next2}' and drop in-memory changes to '${cur.name}'.`}).then((ok)=>{if(!dead&&ok)open2(next2)}),()=>{dead=!0}},[props.name,open2]),import_react103.useEffect(()=>{let dead=!1;return probeGen().then((c)=>{if(!dead)setGenOk(c)}).catch(()=>{}),()=>{dead=!0}},[]);let src3=import_react103.useMemo(()=>s?exports_eikon.findSource(s.name,s.state):void 0,[s?.name,s?.state,s?.sources]),live=import_react103.useMemo(()=>!!(s&&exports_eikon.findSource(s.name)),[s?.name,s?.sources]),baked2=import_react103.useMemo(()=>{if(live||!s)return;let p=exports_eikon.baked(s.name);if(!p)return;try{return exports_eikon.parseEikon(readFileSync13(p,"utf8"))}catch{return}},[live,s?.name]),url2=import_react103.useMemo(()=>{if(!s)return;let p=exports_eikon.baked(s.name);return p?exports_eikon.header(p)?.source_url:void 0},[s?.name]);import_react103.useEffect(()=>{if(setPeek(void 0),!url2||live)return;let dead=!1;return exports_eikon.peekSource(url2).then((x2)=>{if(!dead)setPeek(x2)}),()=>{dead=!0}},[url2,live]);let rows3=import_react103.useMemo(()=>s?buildRows(r,s,live,url2):[],[r,s,live,url2]),navRows=import_react103.useMemo(()=>rows3.map((x2,i)=>({...x2,i})).filter((x2)=>x2.kind!=="divider"&&x2.kind!=="header"),[rows3]),selRow=import_react103.useRef(void 0),rid=(x2)=>`${x2.kind}:${x2.id}`,setSelBy=import_react103.useCallback((arg)=>{setSel((prev)=>{let next2=typeof arg==="function"?arg(prev):arg,row3=navRows[next2];return selRow.current=row3?rid(row3):void 0,next2})},[navRows]),prevRows=import_react103.useRef(navRows);import_react103.useEffect(()=>{if(prevRows.current===navRows)return;prevRows.current=navRows;let id=selRow.current;if(!id)return;let ni=navRows.findIndex((x2)=>rid(x2)===id);if(ni>=0&&ni!==selRef.current)setSel(ni)},[navRows]);let kScroll=(ni)=>{let row3=navRows[ni];if(row3)ksb.current?.scrollChildIntoView(`knob-${row3.kind}-${row3.id}`)};import_react103.useEffect(()=>{if(!s)return;if(!src3){let clip=baked2?.states.get(s.state);setFrames(clip?.frames.length?clip.frames:[BLANK3]),setErr(null),setBusy(!1),setTick(0);return}let ctrl=new AbortController;return setBusy(!0),cached2(r,src3,s.spatial,s.tone,s.fps,exports_eikon_knobs.eff(s,s.state),ctrl.signal).then((out)=>{if(ctrl.signal.aborted)return;if(setBusy(!1),"err"in out){setErr(out.err);return}setErr(null),setFrames(out.frames),setTick((t2)=>t2%out.frames.length)}),()=>ctrl.abort()},[s?.spatial,s?.tone,s?.base,s?.per,s?.state,s?.fps,s?.rasterizer,src3,r,baked2]),import_react103.useEffect(()=>{if(!play||!props.focused||frames.length<=1||busy)return;let fps=live?s?.fps??FPS0:baked2?.states.get(s?.state??"idle")?.fps??FPS0,id=setInterval(()=>setTick((t2)=>t2+1),1000/Math.max(1,fps));return()=>clearInterval(id)},[play,props.focused,frames.length,busy,live,s?.fps,s?.state,baked2]),import_react103.useEffect(()=>{if(!s)return;let dead=!1,t2=setTimeout(()=>{if(dead)return;let jobs=STATES2.map((st)=>{let sp=exports_eikon.findSource(s.name,st);if(!sp){let f=baked2?.states.get(st)?.frames[0];return Promise.resolve([st,f?thumb(f):void 0])}return cached2(r,sp,s.spatial,s.tone,s.fps,exports_eikon_knobs.eff(s,st)).then((res)=>[st,"err"in res?void 0:thumb(res.frames[0])])});Promise.all(jobs).then((done)=>{if(dead)return;setThumbs(new Map(done))})},400);return()=>{dead=!0,clearTimeout(t2)}},[frames,s?.per,s?.sources,s?.name,s?.fps,r,baked2]);let mutate=(fn)=>setS((p)=>p?fn(p):p),setSpatial=(sp)=>mutate((p)=>({...p,spatial:{...p.spatial,...sp},dirty:!0})),setBar=(k2,v2)=>k2==="fps"?mutate((p)=>({...p,fps:Math.round(v2),dirty:!0})):setSpatial({[k2]:v2}),stepBar=(k2,d2)=>{let cur=sRef.current;if(!cur)return;if(k2==="fps")return setBar("fps",Math.max(4,Math.min(30,cur.fps+d2*2)));if(k2==="zoom")return setSpatial({zoom:Math.max(0.1,Math.min(1,+(cur.spatial.zoom+d2*0.03).toFixed(3)))});return setSpatial({[k2]:Math.max(0,Math.min(1,+(cur.spatial[k2]+d2*0.03).toFixed(3)))})},doSave=import_react103.useCallback(async()=>{if(!s)return;if(!s.dirty)return toast.show({variant:"info",message:"Nothing to save"});if(!live)return toast.show({variant:"warning",message:"No source \u2014 fetch or attach before saving"});setSaving(!0),await exports_eikon.save({...s,dirty:!1}).then((f)=>{mutate((p)=>({...p,dirty:!1})),toast.show({variant:"success",message:`Saved \u2192 ${basename12(f)}`})}).catch((e)=>toast.error(e instanceof Error?e:Error(String(e)))).finally(()=>setSaving(!1))},[s,live,toast]),doSelectRasterizer=()=>{let opts=exports_eikon.rasterizers().map((x2)=>{let a=x2.available();return{title:x2.name,value:x2.name,description:Object.keys(x2.knobs).join(" \xB7 "),hint:a===!0?void 0:a}});dialog.replace($jsx(DialogSelect,{title:"Rasterizer",filterable:!1,current:r.name,options:opts,onSelect:(o)=>{dialog.clear();let next2=exports_eikon.rasterizer(o.value);if(!next2)return;let a=next2.available();if(a!==!0)return toast.show({variant:"warning",message:`${o.value}: ${a}`});set("eikonRasterizer",o.value),mutate((p)=>exports_eikon_knobs.swap(p,next2))}}),()=>{})},runGenerate=async(st,kind2)=>{if(!s)return;let seed=s.sources.base?exports_eikon.findSource(s.name):void 0;setPending((prev)=>{let n2=new Set(prev);return n2.add(st),n2});let out=await openGenerate(dialog,exports_eikon_gen.current(),{state:st,kind:kind2,seed,lastPrompt:s.prompts?.[st]});if(!out){setPending((prev)=>{let n2=new Set(prev);return n2.delete(st),n2});return}let role=st==="idle"&&!s.sources.base?"base":st;try{let f=exports_eikon.adopt(s.name,out.path,role);mutate((p)=>({...p,sources:{...p.sources,[role]:f},prompts:{...p.prompts,[st]:out.prompt},dirty:!0}))}catch(e){toast.error(e instanceof Error?e:Error(String(e)))}finally{setPending((prev)=>{let n2=new Set(prev);return n2.delete(st),n2})}},doSource=(forSt)=>{if(!s)return;let st=forSt??s.state,has=!!s.sources[st],opts=[{title:"Local file\u2026",value:"local"}];if(genOk?.image)opts.push({title:"Generate image\u2026",value:"gen-image"});if(genOk?.video)opts.push({title:"Generate video\u2026",value:"gen-video"});if(has&&st!=="idle")opts.push({title:"Same as base",value:"same"});if(has)opts.push({title:"Remove",value:"remove"});dialog.replace($jsx(DialogSelect,{title:`Source for '${st}'`,filterable:!1,options:opts,onSelect:async(o)=>{if(o.value==="local"){let p=await openPathPrompt(dialog,gw,{title:`Source for '${st}'`,label:"png/jpg/webp/gif/mp4/webm/mov \xB7 Tab completes",filter:/\.(png|jpe?g|webp|gif|mp4|webm|mov)$/i});if(!p)return;let role=st==="idle"&&!s.sources.base?"base":st;try{let f=exports_eikon.adopt(s.name,p,role);mutate((prev)=>({...prev,sources:{...prev.sources,[role]:f},dirty:!0}))}catch(e){toast.error(e instanceof Error?e:Error(String(e)))}return}if(o.value==="gen-image")return void runGenerate(st,"image");if(o.value==="gen-video")return void runGenerate(st,"video");dialog.clear(),mutate((prev)=>{let next2={...prev.sources};return delete next2[st],{...prev,sources:next2,dirty:!0}})}}),()=>{})},doPrompt=async(id)=>{if(!s)return;if(id==="source")return doSource()},switchTo=import_react103.useCallback(async(name)=>{let cur=sRef.current;if(cur?.name===name)return;if(cur?.dirty){if(!await openConfirm(dialog,{title:"Discard unsaved edits?",danger:!0,body:`Open '${name}' and drop in-memory changes to '${cur.name}'.`}))return}open2(name)},[dialog,open2]),apply=import_react103.useCallback(async(res)=>{if(!res)return;if(res.from==="blank")return exports_eikon.ensure(res.name),switchTo(res.name);if(res.from==="file"){exports_eikon.ensure(res.name);try{exports_eikon.adopt(res.name,res.file,"base")}catch(e){return toast.error(e instanceof Error?e:Error(String(e)))}return switchTo(res.name)}toast.show({variant:"info",message:`Installing '${res.name}' from ${res.src}\u2026`}),await exports_eikon.installPackage(res.src,{name:res.name}).then((out)=>{toast.show({variant:"success",message:`Installed '${out.name}' (${out.n} files)`}),switchTo(out.name)}).catch((e)=>toast.error(e instanceof Error?e:Error(String(e))))},[switchTo,toast]),doNew=import_react103.useCallback(async()=>{let res=await openNewEikon(dialog,{});await apply(res)},[dialog,apply]),eikonOptions=import_react103.useCallback(()=>{let installed=exports_eikon.list().map((e)=>({title:e.name,value:e.name,category:"installed",hint:e.hasSource?"\u25CF source":e.sourceUrl?"\u25CB source available":"\u2014"})),seen=new Set(installed.map((o)=>o.value)),bundled=listEikons([BUNDLED_EIKON_DIR,hermesPath("eikons")]).filter((e)=>e.path.startsWith(BUNDLED_EIKON_DIR)).map((e)=>{let slug3=e.meta.name.toLowerCase();return{title:e.meta.name,value:slug3,category:"bundled",hint:`${e.meta.width}\xD7${e.meta.height}`}}).filter((o)=>!seen.has(o.value)),raw2=exports_eikon.raw().filter((n2)=>!seen.has(n2)).map((n2)=>({title:n2,value:n2,category:"installed",hint:"(unsaved)"}));return[...installed,...raw2,...bundled]},[]),doInstall=import_react103.useCallback(async()=>{let src4=await openTextPrompt(dialog,{title:"Install eikon",label:"catalog name \xB7 github.com/u/r \xB7 git URL \xB7 http://\u2026/ \xB7 local dir"});if(!src4)return;toast.show({variant:"info",message:`Installing from ${src4}\u2026`}),await exports_eikon.installPackage(src4).then((out)=>{toast.show({variant:"success",message:`Installed '${out.name}' (${out.n} files)`}),switchTo(out.name)}).catch((e)=>toast.error(e instanceof Error?e:Error(String(e))))},[dialog,switchTo,toast]),doOpen=import_react103.useCallback(()=>{let cur=sRef.current,opts=[...eikonOptions(),{title:"+ New\u2026",value:"__new",category:""},{title:"+ Install\u2026",value:"__install",category:""}];dialog.replace($jsx(DialogSelect,{title:"Open eikon",current:cur?.name,options:opts,onSelect:(o)=>{if(dialog.clear(),o.value==="__new")return void doNew();if(o.value==="__install")return void doInstall();switchTo(o.value)}}),()=>{})},[dialog,eikonOptions,switchTo,doNew,doInstall]),doSubmit=import_react103.useCallback(async()=>{let cur=sRef.current;if(!cur)return;let path7=submitPath(cur.name);if(publishedInfo(path7)){toast.show({variant:"warning",title:"Published eikon",message:"Create a local draft before submitting",duration:6000});return}await openEikonSubmit(dialog,{name:cur.name,path:path7,submit:submit2})},[dialog,toast]),doAction=async(id)=>{if(!s)return;if(id==="knobsfor")return mutate((p)=>p.per[p.state]?exports_eikon_knobs.unfork(p):exports_eikon_knobs.fork(p));if(id==="submit"){doSubmit();return}if(id==="revert"){discard();return}if(id==="reset"){if(await openConfirm(dialog,{title:"Reset settings?",body:"Restore rasterizer defaults and drop all per-state overrides.",danger:!0}))mutate((p)=>exports_eikon_knobs.reset(p,r));return}if(id==="fetch"){if(!url2||fetching)return;setFetching(!0),await exports_eikon.fetchSource(url2,{name:s.name}).then((out)=>{toast.show({variant:"success",message:`Fetched ${out.n} file(s) \xB7 ${mb2(out.bytes)}`}),open2(s.name)}).catch((e)=>toast.error(e instanceof Error?e:Error(String(e)))).finally(()=>setFetching(!1))}},doStripMenu=()=>{if(!s)return;dialog.replace($jsx(DialogSelect,{title:`State: ${s.state}`,filterable:!1,options:[{title:"Source\u2026",value:"source"},{title:s.per[s.state]?"Clear override (back to base)":"Tune this state only",value:"fork"}],onSelect:(o)=>{if(o.value==="source"){doSource();return}dialog.clear(),mutate(s.per[s.state]?exports_eikon_knobs.unfork:exports_eikon_knobs.fork)}}),()=>{})},setTone=(t2)=>mutate((p)=>({...p,tone:{...p.tone,...t2},dirty:!0})),stepRow=(row3,d2)=>{if(row3.kind==="tone"){if(row3.id==="contrast"){let def2=row3.knob,cur=sRef.current?.tone.contrast??1;return setTone({contrast:+Math.max(def2.min,Math.min(def2.max,cur+d2*def2.step)).toFixed(2)})}if(row3.id==="invert")return setTone({invert:!sRef.current?.tone.invert});if(row3.id==="flip"){let cur=sRef.current?.tone.flip??"none",i=FLIPS.indexOf(cur);return setTone({flip:FLIPS[(i+d2+FLIPS.length)%FLIPS.length]})}return}if(row3.kind!=="knob"||!row3.knob)return;mutate((p)=>exports_eikon_knobs.edit(p,(k2)=>exports_eikon_knobs.step(k2,row3.id,row3.knob,d2)))},act=(row3,via)=>{if(!row3||!sRef.current)return;if(row3.kind==="select"){if(row3.id==="open")return doOpen();return doSelectRasterizer()}if(row3.kind==="prompt")return void doPrompt(row3.id);if(row3.kind==="action"){if(via==="space"&&row3.id==="reset")return;return void doAction(row3.id)}if(row3.kind==="tone"||row3.kind==="knob"){if(row3.knob.kind==="slider")return;return stepRow(row3,1)}},activate=()=>act(navRows[selRef.current],"enter"),toggle=()=>act(navRows[selRef.current],"space"),adjust=(d2)=>{let row3=navRows[selRef.current];if(!row3)return;if(row3.id==="knobsfor")return void doAction("knobsfor");stepRow(row3,d2)},discard=async()=>{let cur=sRef.current;if(!cur?.dirty)return!1;let pick2=await openSaveDiscard(dialog,{title:"Unsaved edits",body:`'${cur.name}' has unsaved changes. Save them, discard them, or keep editing?`});if(pick2==="save")await doSave(),open2(cur.name);if(pick2==="discard")open2(cur.name);return!0};useKeyboard((key2)=>{if(!props.focused||dialog.open())return;if(key2.name==="u"&&sRef.current)return void doSubmit();if(key2.eventType==="release")return;if(keys.match("eikon.save",key2)){if(!saving)doSave();return}if(key2.name==="escape")return void discard();if(key2.name==="tab"){let i=PANES.indexOf(pane),next2=PANES[(i+(key2.shift?PANES.length-1:1))%PANES.length];setPane(next2),outer.current?.scrollChildIntoView(`studio-${next2}`);return}if(!s){if(key2.name==="return")return void doNew();return}if(pane==="knobs"){if(handleListKey(keys,key2,{count:navRows.length,setSel:setSelBy,scrollTo:kScroll,page:Math.max(1,(ksb.current?.viewport.height??10)-1),onActivate:activate,onToggle:toggle,onNew:()=>void doNew()}))return;if(key2.name==="left")return adjust(-1);if(key2.name==="right")return adjust(1);return}if(pane==="preview"){if(keys.match("list.toggle",key2))return setPlay((p)=>!p);if(!spatialOk||!live)return;if(handleListKey(keys,key2,{count:SP_ROWS.length,setSel:setSpSel}))return;let k2=["ox","oy","zoom","fps"][spRef.current],fine=key2.shift&&k2!=="fps",d2=(name)=>name==="left"?-1:1;if(key2.name==="left"||key2.name==="right"){if(fine&&(k2==="ox"||k2==="oy"||k2==="zoom")){let cur=sRef.current.spatial[k2];return setSpatial({[k2]:Math.max(k2==="zoom"?0.1:0,Math.min(1,+(cur+d2(key2.name)*0.01).toFixed(3)))})}return stepBar(k2,d2(key2.name))}return}if(key2.name==="left")return mutate((p)=>exports_eikon_knobs.cycle(p,-1));if(key2.name==="right")return mutate((p)=>exports_eikon_knobs.cycle(p,1));if(key2.name==="return")return doStripMenu()});let onScroll=(e)=>{if(e.stopPropagation(),!spatialOk||!live||!e.scroll)return;let d2=e.scroll.direction;if(d2!=="up"&&d2!=="down")return;let sign=d2==="up"?-1:1;if(e.modifiers.ctrl)return mutate((p)=>({...p,spatial:exports_eikon_knobs.zoom(p.spatial,sign),dirty:!0}));if(e.modifiers.shift)return mutate((p)=>({...p,spatial:exports_eikon_knobs.pan(p.spatial,sign,0),dirty:!0}));mutate((p)=>({...p,spatial:exports_eikon_knobs.pan(p.spatial,0,sign),dirty:!0}))},n=frames.length,title=s?`Preview \u2014 ${s.state}${s.per[s.state]?" (forked)":""}`+(n>1?` \xB7 ${play?"\u25B6":"\u23F8"} ${tick3%n+1}/${n}`:"")+(live?"":baked2?" \xB7 (baked)":""):"Preview",previewErr=err??(!s||src3||baked2?null:url2?"no source \u2014 Enter on 'fetch source' to download":"no source \u2014 Enter on 'source' to attach"),hint=!s?[["Enter","new eikon"],["Shift+\u2192","gallery"]]:pane==="knobs"?[["\u2191\u2193","row"],["\u2190\u2192","adjust"],[keys.print("list.activate"),"edit"],[keys.print("list.new"),"new"],["u","submit"],[keys.print("eikon.save"),"save"],["Tab","pane"]]:pane==="preview"?[["\u2191\u2193","row"],["\u2190\u2192","adjust"],[keys.print("list.toggle"),"play/pause"],["wheel","pan"],["Ctrl+wheel","zoom"],[keys.print("eikon.save"),"save"],["Tab","pane"]]:[["\u2190\u2192","state"],[keys.print("list.activate"),"actions"],[keys.print("eikon.save"),"save"],["Tab","pane"]],BAR_H=spatialOk&&live?Math.max(Math.ceil(MINI_W/2),3)+1:0,PREVIEW_W=Math.max(W2+2,38+MINI_W)+6,PREVIEW_H=H+(spatialOk&&live?1:0)+BAR_H+6+(previewErr?1:0),body=$jsxs("box",{position:"relative",flexDirection:"column",width:W2,height:H,flexShrink:0,backgroundColor:theme.background,onMouseScroll:onScroll,onMouseDown:()=>setPlay((p)=>!p),children:[frame.map((ln,i)=>$jsx("text",{fg:err?theme.textMuted:theme.hermAvatar,children:ln},i)),busy&&frames[0]===BLANK3?$jsx("box",{position:"absolute",left:0,top:H>>1,width:W2,justifyContent:"center",children:$jsx(Spinner,{color:theme.textMuted,label:"decoding\u2026"})}):null]}),preview3=$jsxs(TabShell,{title:spatialOk?title:`${title} \xB7 (ffmpeg not installed)`,error:previewErr,focus:pane==="preview",children:[!live&&baked2?$jsx("box",{height:1,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:"Baked \u2014 fetch or attach a source to edit."})}):null,spatialOk&&live&&s?$jsxs($Fragment,{children:[$jsx(PanBars,{sp:s.spatial,sel:spSel,focused:pane==="preview",onHover:(i)=>{setPane("preview"),setSpSel(i)},onSet:setBar,onWheel:stepBar,children:body}),$jsx(SpatialBar,{sp:s.spatial,fps:s.fps,dims:s.dims,sel:spSel,focused:pane==="preview",onHover:(i)=>{setPane("preview"),setSpSel(i)},onSet:setBar,onWheel:stepBar})]}):body]}),help=helpOf(navRows[sel]),panel=$jsx(TabShell,{title:s?`Settings \u2014 ${s.name}`:"Settings",focus:pane==="knobs",grow:1,children:!s?$jsx("box",{flexGrow:1,alignItems:"center",justifyContent:"center",children:$jsx("text",{fg:theme.textMuted,children:"No eikon open. Enter to create or pick one."})}):$jsxs($Fragment,{children:[$jsx("scrollbox",{id:"studio-knob-scroll",ref:ksb,scrollY:!0,flexGrow:1,contentOptions:COL,onMouseScroll:(e)=>e.stopPropagation(),children:rows3.map((row3,i)=>{let ni=navRows.findIndex((x2)=>x2.i===i),on=pane==="knobs"&&ni===sel,dim2=row3.kind==="knob"&&!src3;return $jsx(KnobRow,{id:`knob-${row3.kind}-${row3.id}`,row:row3,s,r,src:src3,on,dim:dim2,peek:peek5,busy:row3.id==="fetch"&&fetching,onHover:()=>{if(ni>=0)setPane("knobs"),setSelBy(ni)},onClick:()=>{if(ni>=0)setSelBy(ni),setPane("knobs"),act(row3,"click")},onWheel:(d2)=>stepRow(row3,d2),onSlide:row3.knob?.kind!=="slider"?void 0:row3.kind==="tone"?(v2)=>setTone({contrast:+v2.toFixed(2)}):(v2)=>mutate((p)=>exports_eikon_knobs.edit(p,(k2)=>exports_eikon_knobs.setSlider(k2,row3.id,row3.knob,v2)))},`${row3.kind}:${r.name}:${row3.id}`)})}),$jsx("box",{flexShrink:0,height:HELP_H,marginTop:1,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:help})})]})}),strip=s?$jsx("box",{id:"studio-strip",flexShrink:0,height:18,children:$jsx(TabShell,{title:"States",focus:pane==="strip",children:$jsx(Strip,{s,frames:thumbs,pending:pending3,focused:pane==="strip",onPick:(st)=>{setPane("strip"),mutate((p)=>exports_eikon_knobs.setState(p,st))},onEmpty:(st)=>doSource(st)})})}):null,top=wide?$jsxs("box",{flexDirection:"row",flexShrink:0,height:PREVIEW_H,children:[$jsx("box",{id:"studio-preview",flexShrink:0,width:PREVIEW_W,children:preview3}),$jsx("box",{id:"studio-knobs",flexGrow:1,flexBasis:0,minWidth:0,children:panel})]}):$jsxs($Fragment,{children:[$jsx("box",{id:"studio-preview",flexShrink:0,height:PREVIEW_H,children:preview3}),$jsx("box",{id:"studio-knobs",flexShrink:0,height:Math.max(rows3.length,1)+HELP_H+1+6,children:panel})]});return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,minHeight:0,children:[$jsxs("scrollbox",{ref:outer,scrollY:!0,flexGrow:1,contentOptions:COL,children:[top,strip]}),$jsx(HintBar,{pairs:hint,suffix:saving?"\u25CF saving\u2026":s?.dirty?"\u25CF unsaved":void 0})]})});var import_react105=__toESM(require_react_production(),1);import{readFileSync as readFileSync14}from"fs";import{basename as basename13,dirname as dirname12}from"path";var EikonGallery=import_react105.memo((props)=>{let theme=useTheme().theme,dialog=useDialog(),toast=useToast(),keys=useKeys(),rev2=import_react105.useSyncExternalStore(exports_eikon.onRevision,exports_eikon.revision),rows3=import_react105.useMemo(()=>{let user=hermesPath("eikons"),own=new Map(exports_eikon.list().map((x2)=>[x2.name.toLowerCase(),x2]));return listEikons([BUNDLED_EIKON_DIR,user]).map((e)=>{let slug3=e.path.startsWith(BUNDLED_EIKON_DIR)?e.meta.name.toLowerCase():basename13(dirname12(e.path)),mine=own.get(slug3);return{path:e.path,name:e.meta.name,slug:slug3,author:e.meta.author,bundled:e.path.startsWith(BUNDLED_EIKON_DIR),w:e.meta.width,h:e.meta.height,url:mine?.sourceUrl,hasSource:mine?.hasSource??!!exports_eikon.findSource(slug3)}})},[rev2]),active=usePref("eikon"),[sel,setSel]=import_react105.useState(0),galleryFollow=useFollow("gal",(i)=>rows3[i]?.slug??i);import_react105.useEffect(()=>{if(sel>=rows3.length)setSel(Math.max(0,rows3.length-1))},[rows3.length,sel]);let cur=rows3[sel],parsed=import_react105.useMemo(()=>{if(!cur)return;try{return parseEikon(readFileSync14(cur.path,"utf8"))}catch{return}},[cur]),activate=(row3=cur)=>{if(!row3)return;set("eikon",row3.slug),toast.show({variant:"success",message:`Avatar \u2192 ${row3.name}`})},doNew=import_react105.useCallback(async()=>{let res=await openNewEikon(dialog,{});if(!res)return;if(res.from==="blank")return exports_eikon.ensure(res.name),props.onEdit?.(res.name);if(res.from==="file"){exports_eikon.ensure(res.name);try{exports_eikon.adopt(res.name,res.file,"base")}catch(e){return toast.error(e instanceof Error?e:Error(String(e)))}return props.onEdit?.(res.name)}toast.show({variant:"info",message:`Installing '${res.name}' from ${res.src}\u2026`}),await exports_eikon.installPackage(res.src,{name:res.name}).then((out)=>{toast.show({variant:"success",message:`Installed '${out.name}' (${out.n} files)`})}).catch((e)=>toast.error(e instanceof Error?e:Error(String(e))))},[dialog,toast,props]),submitLocal=import_react105.useCallback(async()=>{if(!cur||cur.bundled)return;let path7=submitPath(cur.slug);if(publishedInfo(path7)){toast.show({variant:"warning",title:"Published eikon",message:"Create a local draft before submitting",duration:6000});return}await openEikonSubmit(dialog,{name:cur.name,path:path7,submit:props.submit??submit2})},[cur,dialog,props.submit,toast]),del=async()=>{if(!cur||cur.bundled)return;if(!await openConfirm(dialog,{title:`Delete '${cur.name}'?`,danger:!0,body:`Removes ${dirname12(cur.path)} and all its sources. This cannot be undone.`}))return;exports_eikon.remove(cur.slug),toast.show({variant:"info",message:`Deleted ${cur.name}`})};return useKeyboard((key2)=>{if(!props.focused||dialog.open())return;if(handleListKey(keys,key2,{count:rows3.length,setSel,page:galleryFollow.opts.page,scrollTo:(n)=>galleryFollow.ref.current?.scrollChildIntoView(galleryFollow.id(n)),onActivate:()=>activate(),onDelete:()=>void del(),onNew:doNew}))return;if(key2.name==="u"&&cur&&!cur.bundled)return void submitLocal();if(key2.name==="e"&&cur&&props.onEdit)props.onEdit(cur.slug)}),$jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsxs("box",{flexDirection:"row",flexGrow:1,children:[$jsx(TabShell,{title:`Gallery (${rows3.length})`,focus:props.focused,grow:3,children:$jsx("scrollbox",{ref:galleryFollow.ref,scrollY:!0,flexGrow:1,verticalScrollbarOptions:VBAR,children:rows3.length===0?$jsx("text",{fg:theme.textMuted,children:"No eikons found."}):rows3.map((r,i)=>{let on=i===sel,here=r.slug===active;return $jsxs("box",{id:galleryFollow.id(i),flexDirection:"row",height:2,backgroundColor:on?theme.backgroundElement:void 0,onMouseMove:()=>setSel(i),onMouseDown:()=>{setSel(i),activate(r)},children:[$jsx("box",{width:2,children:$jsx("text",{fg:on?theme.primary:theme.textMuted,children:on?"\u25B8 ":" "})}),$jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,children:[$jsx("box",{height:1,children:$jsxs("text",{fg:here?theme.accent:theme.text,children:[here?"\u25CF ":" ",$jsx("strong",{children:r.name}),$jsx("span",{fg:theme.textMuted,children:r.bundled?" (bundled)":""})]})}),$jsx("box",{height:1,children:$jsxs("text",{fg:theme.textMuted,children:[` ${r.author??"\u2014"} \xB7 `,$jsx("span",{fg:r.hasSource?theme.success:r.url?theme.textMuted:theme.border,children:r.hasSource?"\u25CF source":r.url?"\u25CB source available":"\u2014 no source"})]})})]})]},r.path)})})}),$jsx(TabShell,{title:cur?`Preview \u2014 ${cur.name}`:"Preview",grow:3,children:$jsx("box",{alignItems:"center",justifyContent:"center",flexGrow:1,children:parsed?$jsx(AnimatedAvatar,{state:"idle",eikon:parsed},cur.path):$jsx("text",{fg:theme.textMuted,children:"No preview."})})})]}),$jsx(HintBar,{pairs:[["\u2191\u2193","select"],[keys.print("list.activate"),"use"],...cur&&props.onEdit?[["e","edit in studio"]]:[],...cur&&!cur.bundled?[["u","submit"]]:[],[keys.print("list.new"),"new / install"],...cur&&!cur.bundled?[[keys.print("list.delete"),"delete"]]:[]]})]})});var import_react107=__toESM(require_react_production(),1);init_perf();var DEFAULT_TIMEOUT=5000,DEFAULT_CACHE_LIMIT=24;function keyIdentity(s){try{let u3=new URL(s);if(u3.protocol==="http:"||u3.protocol==="https:"||u3.protocol==="file:")return u3.href.replace(/\/?$/,"/")}catch{}return s}function manifestBaseKey(s){try{let u3=new URL(s);if((u3.protocol==="http:"||u3.protocol==="https:"||u3.protocol==="file:")&&u3.pathname.endsWith("/manifest.json"))return new URL(".",u3).href}catch{}return}function registryKey(man,source){if(man?.kind!=="eikon.package"||typeof man.id!=="string")return;try{let host=source?new URL(source).host:void 0;if(!host)return;return`registry:${host}:${man.id}${typeof man.version==="string"&&man.version?`@${man.version}`:""}`}catch{return}}function entryKeys(entry2){return[...new Set([entry2.identityKey,entry2.sourceKey].filter(Boolean).map(keyIdentity))]}function keysFor(inst){let keys=new Set,man=inst.manifest,origin2=typeof man?.origin?.source==="string"?man.origin.source:void 0,head=exports_eikon.header(inst.file),src3=typeof head?.source_url==="string"?head.source_url:inst.sourceUrl,registry2=registryKey(man,origin2);if(registry2)keys.add(registry2);if(origin2){keys.add(keyIdentity(origin2));let base2=manifestBaseKey(origin2);if(base2)keys.add(keyIdentity(base2))}if(src3){keys.add(keyIdentity(src3));let base2=manifestBaseKey(src3);if(base2)keys.add(keyIdentity(base2))}return[...keys]}function cacheKey(entry2){return entry2.identityKey||entry2.sourceKey||entry2.id}function previewTarget(entry2){return entry2.preview||entry2.runtimeUrl}function installed(){return exports_eikon.list().map((inst)=>({...inst,manifest:inst.manifest,identityKeys:keysFor(inst)}))}function match2(entry2,xs){let keys=entryKeys(entry2),exact=xs.find((x2)=>x2.identityKeys.some((k2)=>keys.includes(k2)));if(exact)return{inst:exact,legacy:!1};let named=xs.find((x2)=>x2.name===entry2.name&&x2.identityKeys.length===0);if(named)return{inst:named,legacy:!0};return}function row3(entry2,xs){let usable=match2(entry2,xs),active=usable?get2("eikon")===usable.inst.name:!1,installed2=Boolean(usable),installState=active?"active":!usable?"available":usable.legacy?"legacy-name-match":"installed";return{entry:entry2,installed:installed2,active,installState,...usable?.inst.file?{installedPath:usable.inst.file}:{},...usable?.inst.manifest?{installedManifest:usable.inst.manifest}:{},action:active?"active":installed2?"use":"install"}}function abortErr(){return new DOMException("aborted","AbortError")}class MarketplaceService{catalog;fetcher;timeoutMs;previewCacheLimit;concurrency;activeLoads=0;queue=[];cache=new Map;inFlight=new Map;constructor(catalog2,opts={}){this.catalog=catalog2,this.fetcher=opts.fetcher??fetch,this.timeoutMs=opts.timeoutMs??DEFAULT_TIMEOUT,this.previewCacheLimit=opts.previewCacheLimit??DEFAULT_CACHE_LIMIT,this.concurrency=Math.max(1,Math.floor(opts.concurrency??4))}rows(query=""){let entries2=searchCatalog(this.catalog.entries,query),xs=installed();return entries2.map((e)=>row3(e,xs))}entry(id){let key2=keyIdentity(id);return this.catalog.entries.find((e)=>keyIdentity(e.identityKey)===key2||keyIdentity(e.sourceKey)===key2||e.id===id||e.name===id)}async preview(id,opts={}){if(opts.signal?.aborted)throw abortErr();let entry2=this.entry(id);if(!entry2)throw Error(`marketplace: unknown eikon "${id}"`);let key2=cacheKey(entry2),hit2=this.cache.get(key2);if(hit2!==void 0)return hit2;let active=this.inFlight.get(key2);if(active)return active;let p=this.enqueue(()=>this.loadPreview(entry2,opts)).finally(()=>this.inFlight.delete(key2));return this.inFlight.set(key2,p),p}async install(id){let entry2=this.entry(id);if(!entry2)throw Error(`marketplace: unknown eikon "${id}"`);let before=get2("eikon"),out=await exports_eikon.fetchSource(entry2.packageUrl,{name:entry2.name});if(get2("eikon")!==before)set("eikon",before);return out}enqueue(run){return new Promise((resolve4,reject)=>{this.queue.push({run,resolve:resolve4,reject}),this.pump()})}pump(){if(this.activeLoads>=this.concurrency)return;let job=this.queue.shift();if(!job)return;this.activeLoads+=1,job.run().then(job.resolve,job.reject).finally(()=>{this.activeLoads-=1,this.pump()})}async loadPreview(entry2,opts){let ctl=new AbortController,timeout=setTimeout(()=>ctl.abort(),opts.timeoutMs??this.timeoutMs),off=()=>ctl.abort();opts.signal?.addEventListener("abort",off,{once:!0});try{let res=await this.fetcher(previewTarget(entry2),{signal:ctl.signal});if(!res.ok)throw Error(`catalog: HTTP ${res.status}`);let text3=await res.text();this.cache.set(cacheKey(entry2),text3);while(this.cache.size>this.previewCacheLimit)this.cache.delete(this.cache.keys().next().value);return text3}finally{clearTimeout(timeout),opts.signal?.removeEventListener("abort",off)}}}async function load4(opts={}){let query=opts.query??"";try{if(opts.catalog)publicCatalogUrl(opts.catalog,void 0,opts);let cat=await loadCatalog(opts.catalog,opts.fetcher??fetch,opts),service=new MarketplaceService(cat,opts),rows3=service.rows(query);return{status:rows3.length>0?"ready":"empty",query,rows:rows3,selected:rows3[0],service}}catch(err){return{status:"error",query,rows:[],error:err instanceof Error?err.message:String(err)}}}var NO_MARKET={status:"empty",query:"",rows:[]},EikonMarketplace=import_react107.memo((props)=>{let toast=useToast(),keys=useKeys(),rev2=import_react107.useSyncExternalStore(exports_eikon.onRevision,exports_eikon.revision),[sel,setSel]=import_react107.useState(0),[searching,setSearching]=import_react107.useState(!1),[query,setQuery]=import_react107.useState(""),[state2,setState2]=import_react107.useState(NO_MARKET),[loading,setLoading]=import_react107.useState(!1),[installing,setInstalling]=import_react107.useState(!1),[previewState,setPreviewState]=import_react107.useState("idle"),[detailPreview,setDetailPreview]=import_react107.useState(void 0),previewSeq=import_react107.useRef(0),follow=useFollow("market",(i)=>state2.rows[i]?.entry.identityKey??i);import_react107.useEffect(()=>{if(sel>=state2.rows.length)setSel(Math.max(0,state2.rows.length-1))},[state2.rows.length,sel]);let selected=state2.rows[sel];import_react107.useEffect(()=>{if(!selected||!state2.service){setDetailPreview(void 0),props.sidebarPreview?.(void 0);return}let id=++previewSeq.current,key2=selected.entry.identityKey;count("market:preview:load"),state2.service.preview(key2).then((text3)=>{if(previewSeq.current!==id)return;let e=parseEikon(text3),st=e.states.has(previewState)?previewState:"idle",preview3={key:`${key2}:${st}`,eikon:e,state:st,title:selected.entry.name,subtitle:selected.entry.author??"unknown",body:selected.entry.description??"No description.",rows:[{label:"Action",value:actionLabel(selected),strong:selected.action!=="active"},{label:"Status",value:selected.installed?selected.active?"active":"installed":"not installed"},{label:"State",value:st},{label:"Digest",value:digest(selected)??"unknown"}]};if(props.sidebarPreview)props.sidebarPreview(preview3);setDetailPreview(preview3),count("market:preview:ready")}).catch(()=>{if(previewSeq.current!==id)return;setDetailPreview(void 0),props.sidebarPreview?.(void 0),count("market:preview:error")})},[selected?.entry.identityKey,state2.service,previewState,props.sidebarPreview,props.sidebarHidden]),import_react107.useEffect(()=>()=>{previewSeq.current++,setDetailPreview(void 0),props.sidebarPreview?.(void 0)},[props.sidebarPreview]);let loadMarket=import_react107.useCallback((q5=query)=>{setLoading(!0);let end=mark("market:list:load");load4({catalog:process.env.EIKON_URL,allowPrivate:!0,query:q5}).then((next2)=>{count("market:list:rows",next2.rows.length),setState2(next2),setSel((p)=>Math.max(0,Math.min(next2.rows.length-1,p)))}).finally(()=>{end(),setLoading(!1)})},[query]);import_react107.useEffect(()=>{loadMarket(query)},[query,rev2,loadMarket]);let clearPreview=import_react107.useCallback(()=>{previewSeq.current++,props.sidebarPreview?.(void 0),setDetailPreview(void 0)},[props.sidebarPreview]),primary=import_react107.useCallback((idx)=>{let row4=state2.rows[idx??sel],svc=state2.service;if(!row4||!svc||installing)return;if(row4.action==="active")return;if(row4.action==="use"){let name=row4.installedManifest?.name??row4.entry.name;set("eikon",name),toast.show({variant:"success",message:`Avatar \u2192 ${name}`}),loadMarket(query);return}setInstalling(!0),svc.install(row4.entry.identityKey).then((out)=>{toast.show({variant:"success",message:`Installed '${out.name}' (${out.n} files)`}),loadMarket(query)}).catch((err)=>{let e=err instanceof Error?err:Error(String(err));toast.show({variant:"error",title:"Install failed",message:e.message,duration:6000}),loadMarket(query)}).finally(()=>setInstalling(!1))},[state2.rows,state2.service,sel,installing,toast,loadMarket,query]);useKeyboard((key2)=>{if(!props.focused)return;if(searching){if(key2.name==="escape"){setSearching(!1);return}if(key2.name==="backspace"){setQuery((q5)=>q5.slice(0,-1)),setSel(0);return}if(key2.raw&&key2.raw.length===1&&key2.raw>=" "){setQuery((q5)=>q5+key2.raw),setSel(0);return}return}if(key2.name==="escape")return clearPreview();let plain=!key2.shift&&!key2.ctrl&&!key2.meta,move=(by)=>setSel((p)=>{let n=Math.max(0,Math.min(state2.rows.length-1,p+by));return follow.opts.scrollTo?.(n),n});if(plain&&key2.name==="left"){move(-1);return}if(plain&&key2.name==="right"){move(1);return}if(plain&&key2.name==="up"){move(-2);return}if(plain&&key2.name==="down"){move(2);return}if(handleListKey(keys,key2,{count:state2.rows.length,setSel,...follow.opts,onActivate:primary,onToggle:()=>setPreviewState((s)=>s==="idle"?"thinking":"idle"),onSearch:()=>setSearching(!0),onRefresh:()=>loadMarket(query)}))return}),count("market:render");let fallback=props.sidebarHidden||!props.sidebarPreview;return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,minHeight:0,children:[$jsxs("box",{flexDirection:"row",flexGrow:1,minWidth:0,minHeight:0,children:[$jsx(TabShell,{title:`Marketplace (${state2.rows.length})${searching?` Search: ${query}`:""}`,focus:props.focused,grow:fallback?3:1,children:$jsx(MarketplaceGrid,{rows:state2.rows,sel,follow,loading,error:state2.error,onSel:setSel,onUse:primary})}),fallback?$jsx(TabShell,{title:selected?`Details \u2014 ${selected.entry.name}`:"Details",grow:2,children:$jsx(MarketplaceDetail,{row:selected,loading,installing,onUse:()=>primary(),onState:setPreviewState,preview:detailPreview})}):null]}),$jsx(HintBar,{pairs:[["\u2191\u2193\u2190\u2192/Pg/Home/End","select"],[keys.print("list.activate"),actionLabel(selected)],[keys.print("list.search"),searching?"typing search":"search"],[keys.print("list.refresh"),"reload"],["Space","preview state"],["Esc",searching?"exit search":props.sidebarPreview?"restore sidebar":"clear preview"]]})]})}),MarketplaceGrid=(props)=>{let theme=useTheme().theme;if(props.error)return $jsx("box",{padding:1,children:$jsxs("text",{fg:theme.error,wrapMode:"word",children:["Marketplace unavailable: ",props.error]})},"error");if(props.loading&&props.rows.length===0)return $jsx("box",{padding:1,children:$jsx("text",{fg:theme.textMuted,children:"Loading shared eikons\u2026"})},"loading");if(props.rows.length===0)return $jsx("box",{padding:1,children:$jsx("text",{fg:theme.textMuted,children:"No shared eikons match. Press / to change search."})},"empty");return $jsx("scrollbox",{ref:props.follow.ref,scrollY:!0,flexGrow:1,verticalScrollbarOptions:VBAR,children:chunk(props.rows,2).map((rows3,y2)=>{let h2=Math.max(...rows3.map(cardHeight));return $jsx("box",{flexDirection:"row",height:h2,flexShrink:0,width:"100%",children:rows3.map((r,x2)=>{let i=y2*2+x2,on=i===props.sel,lines2=posterLines(r.entry.poster);return $jsxs("box",{id:props.follow.id(i),flexDirection:"column",height:h2,width:"50%",paddingX:1,backgroundColor:on?theme.backgroundElement:void 0,onMouseMove:()=>props.onSel(i),onMouseDown:()=>{props.onSel(i),props.onUse(i)},children:[$jsxs("box",{height:1,flexDirection:"row",children:[$jsx("box",{width:2,children:$jsx("text",{fg:on?theme.primary:theme.textMuted,children:on?"\u25B8 ":" "})}),$jsx("box",{flexGrow:1,minWidth:0,height:1,overflow:"hidden",children:$jsxs("text",{fg:r.active?theme.accent:theme.text,wrapMode:"none",children:[r.active?"\u25CF ":" ",$jsx("strong",{children:r.entry.name})]})}),$jsx("box",{width:10,children:$jsx("text",{fg:actionColor(r,theme),children:actionLabel(r)})})]}),$jsx("box",{height:lines2.length,paddingLeft:2,overflow:"hidden",flexDirection:"column",children:lines2.map((line3,j2)=>$jsx("box",{height:1,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:line3||" "})},j2))}),$jsx("box",{height:1,paddingLeft:2,overflow:"hidden",children:$jsxs("text",{fg:theme.textMuted,wrapMode:"none",children:["by ",r.entry.author??"unknown"]})}),$jsx("box",{height:1,paddingLeft:2,overflow:"hidden",children:$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:r.entry.description??"No description."})}),$jsx("box",{height:1,paddingLeft:2,overflow:"hidden",children:$jsxs("text",{fg:theme.textMuted,wrapMode:"none",children:[meta(r)," \xB7 ",r.installed?r.active?"active":"installed":"not installed"]})})]},r.entry.identityKey)})},y2)})},"rows")},posterLines=(poster2)=>{let lines2=poster2?poster2.split(`
4151
4150
  `):[];return lines2.length?lines2:["(no poster)"]},cardHeight=(row4)=>posterLines(row4.entry.poster).length+4,chunk=(rows3,n)=>rows3.reduce((acc2,row4,i)=>{if(i%n===0)acc2.push([]);return acc2[acc2.length-1].push(row4),acc2},[]),MarketplaceDetail=(props)=>{let theme=useTheme().theme,r=props.row;if(!r)return $jsx("box",{padding:1,children:$jsx("text",{fg:theme.textMuted,children:props.loading?"Loading shared eikons\u2026":"No marketplace entry selected."})});let previewState=props.preview?.state??"idle",next2=previewState==="idle"?"thinking":"idle";return $jsxs("box",{flexDirection:"column",padding:1,gap:1,children:[props.preview?$jsx("box",{alignItems:"center",justifyContent:"center",height:8,overflow:"hidden",children:$jsx("box",{flexDirection:"column",children:props.preview.eikon.states.get(props.preview.state)?.frames[0]?.map((line3,i)=>$jsx("text",{children:line3},i))})}):null,$jsx("text",{fg:r.active?theme.accent:theme.text,children:$jsxs("strong",{children:[r.active?"\u25CF ":"",r.entry.name]})}),$jsxs("text",{fg:theme.textMuted,children:["by ",r.entry.author??"unknown"]}),$jsx("text",{fg:theme.text,wrapMode:"word",children:r.entry.description??"No description."}),$jsxs("text",{fg:theme.textMuted,children:["digest: ",digest(r)??"unknown"]}),$jsxs("text",{fg:theme.textMuted,children:["state: ",r.installed?r.active?"active":"installed":"not installed"]}),$jsx("box",{height:1,onMouseDown:()=>props.onState(next2),children:$jsxs("text",{fg:theme.primary,children:["Preview: ",previewState," [Space] ",next2]})}),$jsx("box",{height:1,onMouseDown:props.onUse,children:$jsx("text",{fg:r.action==="active"?theme.textMuted:theme.primary,children:props.installing?"Installing\u2026":actionLabel(r)})})]})},actionLabel=(row4)=>{if(!row4)return"action";if(row4.action==="install")return"Install";if(row4.action==="use")return"Use";if(row4.action==="retry")return"Retry";return"Active"},shortDigest=(value)=>{if(!value)return;let[algo,hash2]=value.includes(":")?value.split(":",2):[void 0,value];if(!hash2||hash2.length<=16)return value;return algo?`${algo}:${hash2.slice(0,12)}\u2026`:`${hash2.slice(0,12)}\u2026`},digest=(row4)=>shortDigest(row4.entry.trust.manifestDigest??row4.entry.trust.runtimeDigest??row4.entry.trust.digest),meta=(row4)=>{let hash2=digest(row4);return hash2?`digest ${hash2}`:"digest unknown"},actionColor=(row4,theme)=>{if(row4.action==="active")return theme.textMuted;if(row4.action==="use")return theme.success;return theme.primary};var EikonGroup=import_react109.memo((props)=>{let labels=SUB_TABS[EIKON_TAB],[target,setTarget]=import_react109.useState(void 0);import_react109.useEffect(()=>{if(props.sub>=labels.length)props.setSub(0)},[props.sub,labels.length]),import_react109.useEffect(()=>{if(props.sub!==2)props.sidebarPreview?.(void 0)},[props.sub,props.sidebarPreview]);let edit2=import_react109.useCallback((name)=>{setTarget(name),props.setSub(1)},[props]),hint="shift+\u2190/\u2192 sub";return $jsxs("box",{flexDirection:"column",flexGrow:1,minWidth:0,minHeight:0,children:[$jsx(SubTabBar,{tabs:labels,active:props.sub,onChange:props.setSub,hint}),$jsxs("box",{flexGrow:1,minWidth:0,minHeight:0,flexDirection:"column",children:[$jsx(Pane4,{visible:props.sub===0,children:$jsx(EikonGallery,{focused:!!props.focused&&props.sub===0,onEdit:edit2})}),$jsx(Pane4,{visible:props.sub===1,children:$jsx(EikonStudio,{focused:!!props.focused&&props.sub===1,name:target})}),$jsx(Pane4,{visible:props.sub===2,children:$jsx(EikonMarketplace,{focused:!!props.focused&&props.sub===2,sidebarPreview:props.sidebarPreview,sidebarHidden:props.sidebarHidden})})]})]})}),Pane4=({visible,children:children2})=>visible?$jsx("box",{flexGrow:1,minWidth:0,minHeight:0,flexDirection:"column",children:children2}):null;var import_react110=__toESM(require_react_production(),1);var FRAME={cw:16,ch:8,tw:20,tv:8},TL=["\u2800\u2880\u28E4\u2824\u2884\u28C0\u2804\u2880\u28E0\u28E4\u28C4\u2864\u2844\u2840\u2800\u2800","\u2800\u28DC\u2841\u28A9\u28C8\u2842\u2880\u28CB\u28ED\u2809\u2808\u2888\u28EE\u28FB\u2851\u28F6","\u2800\u28B8\u2856\u28BF\u280F\u28E4\u28F6\u28FD\u28EB\u28B6\u28E2\u284C\u2839\u28E7\u284F\u283B","\u2800\u2808\u2864\u2892\u28E6\u28BB\u28FF\u28FF\u28FF\u28BF\u28C5\u2847\u28C6\u2849\u2802\u2880","\u2801\u28B8\u284F\u2818\u280B\u289E\u28B3\u28FF\u28FF\u28DF\u284D\u284D\u28E4\u2805\u2800\u28A8","\u2800\u2824\u28AF\u28C6\u28C0\u2819\u28A6\u28FF\u284B\u2880\u28DC\u2807\u28C1\u28D2\u28CA\u28C9","\u2800\u2880\u28F7\u28DD\u28FB\u28F6\u28F6\u2884\u280D\u2818\u2841\u2847\u28E7\u28E0\u28E4\u2862","\u2800\u2800\u2818\u288E\u28BF\u28EF\u2803\u2801\u2864\u28DA\u287C\u2800\u284F\u28F9\u28FF\u2869"],TR=["\u2800\u2800\u2880\u28A0\u28A0\u28E0\u28E4\u28C0\u2840\u2820\u28C0\u2860\u2824\u28E4\u28C0\u2800","\u28F6\u288A\u28DF\u28F5\u2841\u2801\u2809\u28ED\u28D9\u2800\u2890\u28C2\u284D\u2888\u28E3\u2800","\u281F\u28B9\u28FC\u280F\u28A1\u28D4\u28B6\u28DD\u28EF\u28F6\u28E4\u2839\u287F\u28B2\u2847\u2800","\u2840\u2801\u2889\u28F0\u28B8\u28E8\u287F\u28FF\u28FF\u28FF\u285F\u28F4\u2852\u28A4\u2801\u2800","\u2845\u2804\u2828\u28E4\u28A9\u28A9\u28FB\u28FF\u28FF\u285E\u2873\u2819\u2803\u28B9\u2847\u2800","\u28C9\u28D1\u28D2\u28C8\u2838\u28E3\u2840\u2899\u28FF\u2874\u280B\u28C0\u28F0\u287D\u2824\u2880","\u2884\u28E4\u28C4\u28F8\u28B8\u2888\u2803\u2829\u2860\u28F6\u28F6\u28DF\u28EB\u28FE\u2802\u2800","\u288D\u28FF\u289F\u28B9\u2800\u28A7\u28D2\u28A4\u2801\u2808\u28FD\u287F\u2871\u2807\u2800\u2800"],BL=["\u2800\u2800\u28C0\u28FF\u28FF\u285F\u2801\u2800\u283B\u28AC\u28F3\u2800\u28C7\u28F2\u28DF\u28BF","\u2800\u2890\u287A\u28DB\u286F\u28ED\u2837\u280C\u2882\u2880\u2842\u2847\u284F\u2819\u281B\u2827","\u2800\u2816\u287C\u2809\u2809\u28A0\u28F0\u2825\u28AD\u2818\u28DB\u28C4\u288B\u28C9\u28C9\u2859","\u2800\u28B8\u284C\u2880\u28E0\u28F5\u28FF\u28FF\u28FF\u28FF\u28E8\u2803\u2837\u2802\u2810\u288D","\u2800\u2800\u283B\u281D\u283F\u28F4\u28FF\u28FF\u287F\u28FF\u28DF\u28CB\u284F\u2841\u2804\u2818","\u2800\u28B8\u28F0\u28F6\u28C4\u283B\u283F\u28FF\u28F9\u2830\u281F\u2882\u28A0\u285F\u28C6\u28F4","\u2800\u28AA\u2849\u2838\u28FB\u2807\u2800\u285D\u28DB\u2880\u2840\u28D8\u285F\u2877\u28EB\u286F","\u2800\u2819\u283B\u282A\u281C\u2813\u2802\u2808\u281B\u2813\u281B\u2819\u281A\u2808\u2801\u2800"],BR2=["\u287F\u28FB\u28D6\u28F8\u2800\u28DE\u2861\u281F\u2880\u2804\u28BB\u28FF\u28FF\u28C0\u2800\u2800","\u2836\u281B\u280B\u28B9\u28B8\u2890\u2840\u2850\u2821\u283E\u28ED\u28BD\u28DB\u2897\u2842\u2800","\u288B\u28C9\u28C9\u2859\u28E0\u28DB\u2803\u286D\u282C\u28C6\u2844\u2809\u2829\u28A7\u2832\u2800","\u2869\u2802\u2810\u283E\u2818\u28C5\u28FF\u28FF\u28FF\u28FF\u28EE\u28C4\u2840\u28B1\u2847\u2800","\u2803\u2880\u2888\u28B3\u28D9\u28FB\u28FF\u28DF\u28FF\u28FF\u28E6\u283F\u282B\u281F\u2800\u2800","\u28E6\u28F0\u28BB\u2844\u2850\u283B\u2803\u28CF\u28FF\u283F\u281F\u28E0\u28F6\u28C6\u2847\u2800","\u28BD\u28DD\u28AF\u28BB\u28C3\u2880\u2840\u28DB\u28E9\u2800\u2838\u28DF\u2807\u2889\u2855\u2800","\u2801\u2800\u2801\u2813\u280B\u281B\u281A\u281B\u2801\u2810\u281A\u2823\u2807\u281F\u280B\u2800"],T2=["\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28C0\u28C0\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800","\u2844\u28E2\u28F4\u28F6\u2836\u2816\u2832\u28CC\u2818\u2809\u2822\u285B\u28A1\u2834\u2832\u2836\u28F0\u2896\u28B4\u28E4","\u28FE\u28E5\u283F\u2800\u28E0\u28B0\u283F\u28BE\u2850\u283E\u283F\u2887\u2873\u28FF\u28D7\u2804\u2800\u2823\u28D1\u28F5","\u28BE\u285F\u2804\u2810\u28AD\u28CD\u2896\u2844\u2828\u28BB\u28EB\u283D\u287C\u287F\u28BD\u28A5\u2842\u2804\u283B\u287D","\u2813\u287B\u28B6\u28C4\u2848\u2818\u282D\u281A\u280D\u28BB\u2849\u280B\u280B\u282D\u2803\u2803\u2861\u28F6\u28DF\u28BE","\u2801\u2804\u2809\u2809\u281A\u2824\u2824\u282C\u281F\u2830\u2827\u280A\u282F\u2834\u2824\u2813\u281B\u2809\u2810\u2822","\u28DB\u28DB\u285F\u28DB\u285B\u28DB\u28DB\u289B\u28DB\u28DB\u285B\u28DB\u28DB\u289B\u28FB\u28FB\u28DF\u281B\u28FB\u28BB","\u28CA\u28C9\u28C9\u28DB\u28CB\u28D9\u28CB\u28FC\u28F7\u28E5\u28EF\u28FA\u28CB\u28F5\u28F7\u28ED\u28D9\u28D1\u28FB\u28FD"],B2=["\u28FF\u28BF\u28FF\u28FF\u28BF\u28FF\u287F\u287F\u28FF\u28FF\u283F\u28FF\u28BF\u287F\u28FF\u28FF\u287F\u28FF\u287F\u28BF","\u28C3\u28DB\u28C8\u28D3\u28DA\u28DA\u28C3\u28D9\u28DB\u28C9\u28DB\u28DB\u28C1\u28DB\u28D9\u28D9\u28CB\u28D8\u28C9\u28D9","\u2820\u2884\u2884\u28C0\u2864\u28E4\u2810\u28E0\u2884\u28A0\u2844\u2864\u28C4\u2800\u2864\u2884\u28C0\u2840\u2880\u2880","\u28F1\u282C\u282B\u2811\u2881\u28E0\u28A0\u286B\u28E1\u28E0\u28E4\u28C9\u2885\u2884\u28C4\u2809\u283B\u2850\u28A5\u28CC","\u2894\u28C8\u2800\u28B0\u2841\u28B6\u28FF\u28FF\u28DF\u28FF\u28C3\u285B\u2815\u280D\u28E6\u28C3\u2844\u2802\u28F9\u2862","\u287F\u288F\u2884\u2800\u2803\u28EB\u28FF\u289C\u28A9\u28F6\u28E6\u2809\u2876\u28FE\u2856\u281B\u2800\u28E0\u285B\u287F","\u283C\u28BE\u283F\u28F5\u28D6\u28D8\u2834\u2803\u2808\u2886\u2880\u2800\u2873\u2824\u28C2\u28F2\u28FE\u282F\u281A\u280F","\u2800\u2800\u2801\u2800\u2800\u2800\u2800\u2808\u2809\u2819\u280B\u2809\u2801\u2800\u2800\u2800\u2800\u2800\u2800\u2800"],L2=["\u2800\u2800\u2890\u289F\u28FE\u283F\u282E\u2836\u2877\u28EA\u283E\u2802\u2857\u28AD\u28BF\u28B9","\u2800\u2800\u28E8\u2855\u2809\u2861\u2824\u28C1\u284C\u282A\u28A7\u2801\u2847\u28F0\u28FF\u28BC","\u2800\u2800\u2839\u2843\u28BE\u28D5\u28F7\u2866\u28D3\u2840\u2849\u2846\u284F\u28F6\u2863\u28FB","\u2800\u28B0\u2876\u28AC\u28ED\u285C\u28FF\u28FF\u28EF\u2888\u2893\u2801\u284F\u28DA\u287E\u28FF","\u2800\u2818\u285B\u288A\u28D9\u2823\u2887\u28AF\u28FF\u2828\u286D\u2841\u2867\u28BC\u28F2\u28FF","\u2800\u2800\u28B1\u2849\u28BF\u2847\u2824\u28DD\u2844\u2800\u2841\u2801\u284F\u28F6\u2896\u28BF","\u2800\u2800\u28B0\u28E7\u2840\u2813\u2813\u2809\u2881\u28F4\u284D\u2800\u2847\u283A\u283D\u28BA","\u2800\u2800\u2828\u283A\u28FD\u28F7\u28E6\u2874\u285A\u2803\u2880\u2800\u2847\u287E\u28FF\u28B9"],R=["\u284F\u287F\u286D\u28BA\u2880\u2837\u289D\u28BE\u2836\u2835\u283F\u28F7\u287B\u2842\u2800\u2800","\u2867\u28FF\u28C6\u28B8\u2800\u287C\u2815\u28A1\u28C0\u2824\u288C\u2809\u28AA\u28C5\u2801\u2800","\u28DF\u289C\u28F6\u28B9\u28B0\u2889\u2880\u28DA\u28B4\u28FE\u28EA\u2877\u2898\u280F\u2800\u2800","\u28FF\u28B7\u285B\u28B9\u2808\u285A\u2841\u28FD\u28FF\u28FF\u28A3\u28ED\u2865\u28B6\u2846\u2800","\u28FF\u28D6\u2867\u28BC\u2888\u28AD\u2805\u28FF\u287D\u2878\u2858\u28CB\u2851\u289B\u2803\u2800","\u287F\u2872\u28F6\u28B9\u2808\u2888\u2800\u28A0\u28EB\u2824\u28B8\u287F\u2889\u2846\u2800\u2800","\u2857\u282F\u2817\u28B8\u2800\u28A9\u28E6\u2848\u2809\u281A\u281A\u2880\u28FC\u2846\u2800\u2800","\u284F\u28FF\u28AF\u28B8\u2800\u2880\u2818\u2893\u28A6\u28B6\u28FE\u28EF\u2817\u2805\u2800\u2800"];function frame(w2,h2){let{cw,ch,tw,tv}=FRAME,mw=w2-2*cw,mh=h2-2*ch,inner={x:cw,y:ch,w:Math.max(0,mw),h:Math.max(0,mh)};if(mw<4||mh<2)return{lines:[],inner};let repH=(p,span2)=>p.map((l2)=>l2.repeat(Math.ceil(span2/tw)).slice(0,span2)),repV=(p,span2)=>Array.from({length:span2},(_2,i)=>p[i%tv]),t2=repH(T2,mw),b2=repH(B2,mw),l=repV(L2,mh),r=repV(R,mh),mid2=" ".repeat(mw),out=[];for(let i=0;i<ch;i++)out.push(TL[i]+t2[i]+TR[i]);for(let i=0;i<mh;i++)out.push(l[i]+mid2+r[i]);for(let i=0;i<ch;i++)out.push(BL[i]+b2[i]+BR2[i]);return{lines:out,inner}}import{readFileSync as readFileSync15}from"fs";import{join as join17}from"path";var FALLBACK=["`@file:path/to/file.py` injects file contents directly into your message.","`/title <name>` names the session \u2014 resume it later from the Sessions tab.","Ctrl+G opens $EDITOR seeded with the composer contents.","Ctrl+Z suspends to the shell; `fg` resumes.","Pasting 5+ lines collapses to a `[Pasted #N \u2026]` placeholder.","Click a user message in the transcript to rewind to that point."],HL=/(\/[a-z][\w-]*|@[\w:./-]+|(?:Ctrl|Alt|Shift)\+\S+|`[^`]+`|"[^"]+")/g;function splitTip(tip2){let out=[],i=0;for(let m2 of tip2.matchAll(HL)){let j2=m2.index;if(j2>i)out.push({t:tip2.slice(i,j2),hl:!1});out.push({t:m2[0].replace(/^`|`$/g,""),hl:!0}),i=j2+m2[0].length}if(i<tip2.length)out.push({t:tip2.slice(i),hl:!1});return out}var cache5=null;function loadTips(){if(cache5)return cache5;try{let body=readFileSync15(join17(hermesAgentRoot(),"hermes_cli","tips.py"),"utf8").split(/^TIPS\s*=\s*\[/m)[1]?.split(/^\]/m)[0]??"",tips=[];for(let line3 of body.split(`
4152
- `)){let m2=line3.match(/^\s+"((?:[^"\\]|\\.)*)",?\s*$/);if(m2)tips.push(m2[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"))}cache5=tips.length>10?tips:FALLBACK}catch{cache5=FALLBACK}return cache5}function randomTip(prev){let t2=loadTips();if(t2.length<2)return t2[0]??"";let pick2=t2[Math.floor(Math.random()*t2.length)];while(pick2===prev)pick2=t2[Math.floor(Math.random()*t2.length)];return pick2}import{readFileSync as readFileSync16,existsSync as existsSync20}from"fs";import{dirname as dirname13,join as join18}from"path";var pkgVersion=(d2,up=4)=>{let p=join18(d2,"package.json");if(existsSync20(p))return JSON.parse(readFileSync16(p,"utf8")).version;return up>0?pkgVersion(dirname13(d2),up-1):"0.0.0"},VERSION=pkgVersion(import.meta.dirname);function parseLaunch2(argv){let splash=!0;for(let i=0;i<argv.length;i++){let a=argv[i];if(a==="--no-splash"){splash=!1;continue}if(a==="-c"||a==="--continue")return{mode:"resume",splash};if(a==="--resume"){let next2=argv[i+1];return next2&&!next2.startsWith("-")?{mode:"resume",sid:next2,splash}:{mode:"resume",splash}}}return{mode:"new",splash}}var HELP2=`herm \u2014 OpenTUI client for hermes-agent
4151
+ `)){let m2=line3.match(/^\s+"((?:[^"\\]|\\.)*)",?\s*$/);if(m2)tips.push(m2[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"))}cache5=tips.length>10?tips:FALLBACK}catch{cache5=FALLBACK}return cache5}function randomTip(prev){let t2=loadTips();if(t2.length<2)return t2[0]??"";let pick2=t2[Math.floor(Math.random()*t2.length)];while(pick2===prev)pick2=t2[Math.floor(Math.random()*t2.length)];return pick2}import{readFileSync as readFileSync16,existsSync as existsSync20}from"fs";import{dirname as dirname13,join as join18}from"path";var pkgVersion=(d2,up=4)=>{let p=join18(d2,"package.json");if(existsSync20(p))return JSON.parse(readFileSync16(p,"utf8")).version;return up>0?pkgVersion(dirname13(d2),up-1):"0.0.0"},VERSION=pkgVersion(import.meta.dirname);function parseLaunch(argv){let splash=!0;for(let i=0;i<argv.length;i++){let a=argv[i];if(a==="--no-splash"){splash=!1;continue}if(a==="-c"||a==="--continue")return{mode:"resume",splash};if(a==="--resume"){let next2=argv[i+1];return next2&&!next2.startsWith("-")?{mode:"resume",sid:next2,splash}:{mode:"resume",splash}}}return{mode:"new",splash}}var HELP2=`herm \u2014 OpenTUI client for hermes-agent
4153
4152
 
4154
4153
  Usage:
4155
4154
  herm start a fresh session
@@ -4224,4 +4223,4 @@ Usage:
4224
4223
  `),0}async function handleEikonCli(argv,deps=defaultDeps(),io2=defaultIO()){if(argv[0]!=="eikon")return null;let cmd=argv[1];if(!cmd||cmd==="-h"||cmd==="--help")return emit(io2,EIKON_CLI_USAGE);let p=parse6(argv.slice(2));if(p.error)return emitError(io2,p.error,p.json);try{if(cmd==="install"){let source=p.values[0];if(!source)return emitError(io2,"usage: herm eikon install <name|url|dir>",p.json);let out=await deps.fetchSource(source,{name:p.name,media:p.media});if(p.use!==!1)deps.setActive(out.name);let active=deps.getActive()??null;if(p.json)return emit(io2,JSON.stringify({ok:!0,name:out.name,n:out.n,bytes:out.bytes,sources:out.sources,active}));return emit(io2,`Installed '${out.name}' (${out.n} files)${active===out.name?" and set active":""}`)}if(cmd==="peek"){let source=p.values[0];if(!source)return emitError(io2,"usage: herm eikon peek <name|url|dir>",p.json);let out=await deps.peekSource(source);if(!out)return emitError(io2,`Could not peek '${source}'`,p.json);if(p.json)return emit(io2,JSON.stringify({ok:!0,source,n:out.n,bytes:out.bytes}));return emit(io2,`${source}: ${out.n} files, ${out.bytes} bytes`)}if(cmd==="list"){let rows3=deps.list().map((e)=>({name:e.name,file:e.file,hasSource:e.hasSource,sourceUrl:e.sourceUrl})),active=deps.getActive()??null;if(p.json)return emit(io2,JSON.stringify({ok:!0,active,eikons:rows3}));return emit(io2,rows3.length?rows3.map((e)=>`${e.name}${e.name===active?" *":""}`).join(`
4225
4224
  `):"No installed eikons")}if(cmd==="use"){let name=p.values[0];if(!name)return emitError(io2,"usage: herm eikon use <name>",p.json);if(!deps.baked(name))return emitError(io2,`No installed or bundled eikon named '${name}'`,p.json);if(deps.setActive(name),p.json)return emit(io2,JSON.stringify({ok:!0,active:name}));return emit(io2,`Avatar \u2192 ${name}`)}return emitError(io2,`unknown eikon command '${cmd}'`,p.json)}catch(e){return emitError(io2,e instanceof Error?e.message:String(e),p.json)}}init_perf();var exports_bundled_skills={};__export(exports_bundled_skills,{sync:()=>sync,skills:()=>exports_bundled_skills});import{existsSync as existsSync26,mkdirSync as mkdirSync8,readdirSync as readdirSync9,cpSync}from"fs";import{dirname as dirname14,join as join26}from"path";var locate4=()=>{let d2=import.meta.dir;for(let i=0;i<5;i++){let p=join26(d2,"assets/skills");if(existsSync26(p))return p;let up=dirname14(d2);if(up===d2)break;d2=up}return};function has(root2,n){if(existsSync26(join26(root2,n,"SKILL.md")))return!0;if(!existsSync26(root2))return!1;return readdirSync9(root2,{withFileTypes:!0}).some((e)=>e.isDirectory()&&existsSync26(join26(root2,e.name,n,"SKILL.md")))}function sync(){let src3=locate4();if(!src3)return[];let root2=hermesPath("skills"),dst=join26(root2,"creative"),out=[];for(let e of readdirSync9(src3,{withFileTypes:!0})){if(!e.isDirectory())continue;if(has(root2,e.name))continue;mkdirSync8(dst,{recursive:!0}),cpSync(join26(src3,e.name),join26(dst,e.name),{recursive:!0}),out.push(e.name)}return out}var exports_bundled_plugins={};__export(exports_bundled_plugins,{sync:()=>sync2,plugins:()=>exports_bundled_plugins});import{cpSync as cpSync2,existsSync as existsSync27,mkdirSync as mkdirSync9,readFileSync as readFileSync22,readdirSync as readdirSync10,writeFileSync as writeFileSync8}from"fs";import{dirname as dirname15,join as join27}from"path";var locate5=()=>{let dir2=import.meta.dir;for(let i=0;i<5;i++){let path7=join27(dir2,"assets/plugins");if(existsSync27(path7))return path7;let up=dirname15(dir2);if(up===dir2)break;dir2=up}return},obj=(v2)=>v2&&typeof v2==="object"&&!Array.isArray(v2)?v2:{},arr=(v2)=>Array.isArray(v2)?v2.map(String):[];function ours(dir2){let path7=join27(dir2,"plugin.yaml");if(!existsSync27(path7))return!1;let raw2=readFileSync22(path7,"utf8");return raw2.includes("name: eikon")&&raw2.includes("eikon_install")}function enable(name){let path7=hermesPath("config.yaml"),raw2=existsSync27(path7)?readFileSync22(path7,"utf8"):"",doc=$parseDocument(raw2||`{}
4226
4225
  `),js=doc.toJS();if(!js||typeof js!=="object"||Array.isArray(js))doc.contents=doc.createNode({});let cfg=obj(doc.toJS()),plug=obj(cfg.plugins);if(arr(plug.disabled).includes(name)||arr(plug.enabled).includes(name))return!1;return doc.setIn(["plugins","enabled"],[...arr(plug.enabled),name]),mkdirSync9(dirname15(path7),{recursive:!0}),writeFileSync8(path7,String(doc),"utf8"),!0}function sync2(){let src3=locate5();if(!src3)return[];let root2=hermesPath("plugins"),out=[];for(let e of readdirSync10(src3,{withFileTypes:!0})){if(!e.isDirectory())continue;try{let dst=join27(root2,e.name),fresh2=!existsSync27(dst);if(fresh2)mkdirSync9(root2,{recursive:!0}),cpSync2(join27(src3,e.name),dst,{recursive:!0}),out.push(e.name);if(fresh2||ours(dst))enable(e.name)}catch{}}return out}import{writeSync as writeSync2}from"fs";var TERMINAL_MODE_RESET="\x1B[0'z\x1B[0'{\x1B[?2029l\x1B[?1016l\x1B[?1015l\x1B[?1006l\x1B[?1005l\x1B[?1003l\x1B[?1002l\x1B[?1001l\x1B[?1000l\x1B[?9l\x1B[?1004l\x1B[?2004l\x1B[?1049l\x1B[<u\x1B[>4;0m\x1B[0m\x1B[?25h";function resetTerminalModes(stream=process.stdout){if(!stream.isTTY)return!1;let fd=typeof stream.fd==="number"?stream.fd:stream===process.stdout?1:void 0;if(fd!==void 0)try{return writeSync2(fd,TERMINAL_MODE_RESET),!0}catch{}try{return stream.write(TERMINAL_MODE_RESET),!0}catch{return!1}}var wired=!1;function installExitResetHooks(){if(wired)return;wired=!0,process.on("exit",()=>{resetTerminalModes()});let codes={SIGHUP:129,SIGINT:130,SIGTERM:143};for(let sig of["SIGINT","SIGTERM","SIGHUP"])process.on(sig,()=>{resetTerminalModes(),process.exit(codes[sig])});process.on("uncaughtException",(err)=>{resetTerminalModes(),console.error(err),process.exit(1)}),process.on("unhandledRejection",(reason)=>{resetTerminalModes(),console.error(reason),process.exit(1)})}var cfg={columns:{fallback:80,max:500},rows:{fallback:24,max:200}};function sanitizeTerminalDimension(value,dim2){if(typeof value!=="number")return cfg[dim2].fallback;if(!Number.isFinite(value))return cfg[dim2].fallback;let n=Math.floor(value);if(n<2)return cfg[dim2].fallback;return Math.min(n,cfg[dim2].max)}function findDescriptor(stream,dim2){let cur=stream;while(cur){let desc=Object.getOwnPropertyDescriptor(cur,dim2);if(desc)return desc;cur=Object.getPrototypeOf(cur)}return}function patchDimension(stream,dim2){let desc=findDescriptor(stream,dim2);if(desc&&desc.configurable===!1)return!1;let raw2=desc&&"value"in desc?desc.value:void 0,read3=desc?.get,write=desc?.set;try{return Object.defineProperty(stream,dim2,{configurable:!0,enumerable:desc?.enumerable??!0,get(){let value=read3?read3.call(stream):raw2;return sanitizeTerminalDimension(value,dim2)},set(value){if(write){write.call(stream,value);return}raw2=value}}),!0}catch{return!1}}function clampStdoutDimensions(stream=process.stdout){if(!stream||typeof stream!=="object")return!1;let columns=patchDimension(stream,"columns"),rows3=patchDimension(stream,"rows");return columns||rows3}boot("import-graph",Bun.nanoseconds()/1e6);var argv=Bun.argv.slice(2);if(argv[0]==="eikon"&&argv[1]==="install")exports_bundled_plugins.sync();var eikonCliExit=await handleEikonCli(argv);if(eikonCliExit!==null)process.exit(eikonCliExit);if(argv.includes("--help")||argv.includes("-h"))process.stdout.write(HELP2),process.exit(0);if(argv.includes("--version")||argv.includes("-v"))process.stdout.write(VERSION+`
4227
- `),process.exit(0);var launch=parseLaunch2(argv),main2=async()=>{resetTerminalModes(),installExitResetHooks(),clampStdoutDimensions(),mem("pre-renderer");let prefs=load2(),end=mark("renderer-init"),renderer=await createCliRenderer({exitOnCtrlC:!1,useMouse:prefs.mouse??!0,targetFps:prefs.targetFps??30,gatherStats:!1});end();let bump3=()=>renderer.capabilities?.kitty_keyboard||process.stdout.isTTY&&process.stdout.write("\x1B[>4;2m");bump3(),renderer.on("focus",bump3),mem("post-renderer"),await prime(prefs.theme??DEFAULT_THEME);let root2=createRoot(renderer),endRender=mark("first-render");root2.render($jsx(App,{initialTheme:prefs.theme,launch})),endRender(),boot("first-render",Bun.nanoseconds()/1e6),warmup(),warm(),exports_bundled_skills.sync(),exports_bundled_plugins.sync(),mem("post-first-render"),monitor(15000),start()};main2().catch(console.error);
4226
+ `),process.exit(0);var launch=parseLaunch(argv),main2=async()=>{resetTerminalModes(),installExitResetHooks(),clampStdoutDimensions(),mem("pre-renderer");let prefs=load2(),end=mark("renderer-init"),renderer=await createCliRenderer({exitOnCtrlC:!1,useMouse:prefs.mouse??!0,targetFps:prefs.targetFps??30,gatherStats:!1});end();let bump3=()=>renderer.capabilities?.kitty_keyboard||process.stdout.isTTY&&process.stdout.write("\x1B[>4;2m");bump3(),renderer.on("focus",bump3),mem("post-renderer"),await prime(prefs.theme??DEFAULT_THEME);let root2=createRoot(renderer),endRender=mark("first-render");root2.render($jsx(App,{initialTheme:prefs.theme,launch})),endRender(),boot("first-render",Bun.nanoseconds()/1e6),warmup(),warm(),exports_bundled_skills.sync(),exports_bundled_plugins.sync(),mem("post-first-render"),monitor(15000),start()};main2().catch(console.error);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "herm-tui",
3
- "version": "1.9.0-dev.10",
3
+ "version": "1.9.0-dev.11",
4
4
  "description": "A modern TUI for Hermes Agent",
5
5
  "license": "MIT",
6
6
  "repository": {