hanoman 0.9.11 → 0.9.12

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.
@@ -1 +1 @@
1
- import{aM as i,j as u,B as f}from"./index-C0hF6fPX.js";import{R as s}from"./react-DfGhg7ZW.js";const w=6e3;function d({className:o="",style:a={}}){const e=i(),n=!e.connected&&!e.paused,[r,t]=s.useState(()=>Date.now());return s.useEffect(()=>{if(!n)return;t(Date.now());const c=setInterval(()=>t(Date.now()),1e3);return()=>clearInterval(c)},[n,e.since]),!n||r-e.since<w?null:u.jsx(f,{tone:"warn",variant:"soft",icon:"wifi-off",className:o,style:a,children:"koneksi terputus · menyambung ulang…"})}export{d as L};
1
+ import{aO as i,j as u,B as f}from"./index-CvvGNA1i.js";import{R as s}from"./react-DfGhg7ZW.js";const w=6e3;function d({className:o="",style:a={}}){const e=i(),n=!e.connected&&!e.paused,[r,t]=s.useState(()=>Date.now());return s.useEffect(()=>{if(!n)return;t(Date.now());const c=setInterval(()=>t(Date.now()),1e3);return()=>clearInterval(c)},[n,e.since]),!n||r-e.since<w?null:u.jsx(f,{tone:"warn",variant:"soft",icon:"wifi-off",className:o,style:a,children:"koneksi terputus · menyambung ulang…"})}export{d as L};
package/web/index.html CHANGED
@@ -5,11 +5,11 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
7
7
  <title>hanoman</title>
8
- <script type="module" crossorigin src="/assets/index-C0hF6fPX.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-CvvGNA1i.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/react-DfGhg7ZW.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/markdown-CWEY34jk.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/xterm-3VOAfa_q.js">
12
- <link rel="stylesheet" crossorigin href="/assets/index-ezlZRsLF.css">
12
+ <link rel="stylesheet" crossorigin href="/assets/index-BsjfXxQM.css">
13
13
  </head>
14
14
  <body>
15
15
  <div id="root"></div>
@@ -1,2 +0,0 @@
1
- import{e as L,j as t,M as ke,d as yt,S as J,G as _t,J as kt,f as Ye,B as _e,I as ie,w as qt,D as Ut,a as G,K as Vt,N as Yt,O as lt,Q as ot,c as Pe,U as Jt,V as Xt,W as Qt,X as Zt,Y as ea,Z as ta,_ as je,$ as jt,a0 as Je,a1 as aa,a2 as na,a3 as ia,a4 as qe,a5 as ra,h as be,a6 as wt,a7 as sa,a8 as la,a9 as oa,g as We,aa as ca,ab as da,ac as St,l as ua,ad as ct,ae as pa,x as ma,af as fa,ag as ha,ah as Me,p as xa,ai as ga,aj as ba,ak as It,al as va,am as ve,an as ya,ao as dt,ap as ka}from"./index-C0hF6fPX.js";import{R as o,r as $}from"./react-DfGhg7ZW.js";import"./markdown-CWEY34jk.js";import"./xterm-3VOAfa_q.js";function Xe(e){return e.endedAt?e.endedReason==="reconciled"?"interrupted":e.exitCode===null||e.exitCode===0?"completed":"failed":"running"}const Ae=new Set;let ye;function ja(e){return Ae.add(e),ye||(ye=setInterval(()=>{for(const i of[...Ae])i()},1e3)),()=>{Ae.delete(e),Ae.size===0&&ye&&(clearInterval(ye),ye=void 0)}}const ut=20;function wa(e,i){if(!i)return"—";const n=new Date(i).getTime()-new Date(e).getTime();if(!Number.isFinite(n)||n<0)return"—";const s=Math.round(n/1e3);if(s<60)return`${s} dtk`;const c=Math.round(s/60);return c<60?`${c} mnt`:`${Math.floor(c/60)} jam ${c%60} mnt`}function Sa(e){switch(Xe(e)){case"running":return{label:"berjalan",tone:"neutral"};case"interrupted":return{label:"terputus",tone:"warn"};case"failed":return{label:`exit ${e.exitCode}`,tone:"err"};default:return{label:"selesai",tone:"ok"}}}const Ct=e=>Xe(e)==="interrupted"?"—":wa(e.startedAt,e.endedAt),zt=e=>kt[e]??e;function Ia({projects:e,onClose:i,onRestart:n}){const[s,c]=o.useState([]),[d,R]=o.useState(0),[v,T]=o.useState(1),[h,g]=o.useState(!1),[b,u]=o.useState(""),[x,C]=o.useState(""),[w,p]=o.useState(""),[S,z]=o.useState(""),[N,D]=o.useState(null);o.useEffect(()=>{const l=setTimeout(()=>z(w.trim()),250);return()=>clearTimeout(l)},[w]),o.useEffect(()=>{T(1)},[b,x,S]),o.useEffect(()=>{let l=!0;return g(!0),L.listSessionHistory({projectId:b||void 0,kind:x||void 0,q:S||void 0,page:v,limit:ut}).then(f=>{l&&(R(f.total),c(f.items))}).catch(()=>{l&&(c([]),R(0))}).finally(()=>{l&&g(!1)}),()=>{l=!1}},[b,x,S,v]);const k=Ut(d,v,ut),E=l=>{var f;return((f=e.find(I=>I.id===l))==null?void 0:f.name)??l};return t.jsxs(ke,{open:!0,title:"Riwayat sesi",icon:"history",onClose:i,width:900,children:[t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap",marginBottom:10},children:[t.jsx(yt,{size:"sm",leftIcon:"search",placeholder:"mis. spec-412 atau reverse","aria-label":"Cari riwayat sesi",value:w,onChange:l=>p(l.target.value),style:{flex:"1 1 200px"}}),t.jsx(J,{size:"sm","aria-label":"Filter project",value:b,onChange:l=>u(l.target.value),options:[{value:"",label:"Semua project"}].concat(e.map(l=>({value:l.id,label:l.name})))}),t.jsx(J,{size:"sm","aria-label":"Filter jenis",value:x,onChange:l=>C(l.target.value),options:[{value:"",label:"Semua jenis"}].concat(_t.map(l=>({value:l,label:kt[l]})))})]}),s.length===0&&!h?t.jsx(Ye,{kind:"empty",icon:"history",title:"Belum ada riwayat sesi",hint:"Riwayat terisi sendiri saat sesi terminal dibuka lalu ditutup — termasuk sesi backlog, terminal biasa, dan sesi project-level."}):t.jsxs("div",{style:{display:"flex",flexDirection:"column",maxHeight:"60vh",overflowY:"auto"},children:[s.map(l=>{const f=Sa(l);return t.jsx("button",{onClick:()=>D(l),style:{cursor:"pointer",display:"block",width:"100%",flex:"0 0 auto",font:"inherit",color:"inherit",textAlign:"left",background:"transparent",padding:"9px 8px",border:"none",borderBottom:"1px solid var(--border-hair)"},children:t.jsxs("span",{className:"hn-dense-row hn-picker-row",style:{display:"flex",alignItems:"center",gap:10,width:"100%"},children:[t.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:11,color:"var(--text-subtle)",flex:"0 0 132px"},children:new Date(l.startedAt).toLocaleString("id-ID")}),t.jsx(_e,{size:"sm",tone:"neutral",children:zt(l.kind)}),t.jsx("span",{className:"hn-picker-title",style:{flex:1,minWidth:0,fontSize:13,color:"var(--text-strong)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:l.title??l.specId??E(l.projectId)}),l.transcriptBytes!==null&&t.jsx(ie,{name:"file-text",size:12,color:"var(--text-subtle)"}),t.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:11,color:"var(--text-muted)",flex:"0 0 72px"},children:Ct(l)}),t.jsx(_e,{size:"sm",tone:f.tone,children:f.label})]})},l.id)}),h&&t.jsx("div",{style:{padding:"10px 8px",textAlign:"center",fontSize:11,color:"var(--text-subtle)"},children:"memuat…"})]}),t.jsx(qt,{page:k.page,pageCount:k.pageCount,total:d,from:k.from,to:k.to,onPage:T,unit:"sesi"}),N&&t.jsx(Ca,{row:N,projectName:E(N.projectId),onBack:()=>D(null),onRestart:n})]})}function Ca({row:e,projectName:i,onBack:n,onRestart:s}){const[c,d]=o.useState(null),[R,v]=o.useState("idle");o.useEffect(()=>{if(e.transcriptBytes===null){v("none"),d(null);return}let g=!0;return v("loading"),L.sessionTranscript(e.id).then(b=>{g&&(d(b.text),v("idle"))}).catch(()=>{g&&(d(null),v("error"))}),()=>{g=!1}},[e.id,e.transcriptBytes]);const T=Xe(e)==="interrupted",h=[["Project",i],["Sesi",e.sessionId],["Jenis",zt(e.kind)],["Agen",[e.agent,e.model,e.effort].filter(Boolean).join(" · ")],["Mulai",new Date(e.startedAt).toLocaleString("id-ID")],[T?"Terakhir terlihat hidup":"Selesai",e.endedAt?new Date(e.endedAt).toLocaleString("id-ID"):"berjalan"],...T&&e.reconciledAt?[["Terdeteksi mati",new Date(e.reconciledAt).toLocaleString("id-ID")]]:[],["Durasi",Ct(e)],["Direktori",e.cwd]];return e.specId&&h.splice(1,0,["Backlog",`${e.specId}${e.title?` · ${e.title}`:""}`]),e.branch&&h.push(["Branch",e.branch]),t.jsxs(ke,{open:!0,title:e.title??e.specId??e.sessionId,icon:"history",onClose:n,width:1e3,children:[t.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center",marginBottom:10},children:[t.jsx(G,{size:"sm",variant:"ghost",leftIcon:"arrow-left",onClick:n,children:"Kembali"}),t.jsx("div",{style:{flex:1}}),c&&t.jsx(G,{size:"sm",variant:"secondary",leftIcon:"copy",onClick:()=>{var g;return void((g=navigator.clipboard)==null?void 0:g.writeText(c))},children:"Salin transkrip"}),Vt(e.kind)&&t.jsx(G,{size:"sm",leftIcon:"play",onClick:()=>s(e),children:"Mulai lagi"})]}),T&&t.jsxs(Yt,{tone:"warn",title:"Sesi terputus — hasilnya tak diketahui",style:{marginBottom:12},children:["Panenya sudah lenyap saat hanoman menyala lagi (reboot, ",t.jsx("code",{children:"tmux kill-server"}),", atau host mati), jadi sesi ini tak meninggalkan exit code dan transkripnya kemungkinan besar tak sempat diambil — capture berjalan tepat sebelum pane dibunuh, dan di jalur ini sudah tak ada pane untuk dibaca. Periksa worktree & branch sesi ini sebelum menganggapnya selesai, lalu mulai lagi bila pekerjaannya belum tuntas."]}),t.jsx("div",{style:{display:"grid",gridTemplateColumns:"auto 1fr",gap:"4px 12px",marginBottom:12,fontSize:12},children:h.map(([g,b])=>t.jsxs(o.Fragment,{children:[t.jsx("span",{style:{color:"var(--text-subtle)"},children:g}),t.jsx("span",{style:{fontFamily:"var(--font-mono)",color:"var(--text-body)",wordBreak:"break-all"},children:b})]},g))}),R==="loading"&&t.jsx("div",{style:{fontSize:12,color:"var(--text-subtle)"},children:"memuat transkrip…"}),R==="none"&&t.jsx("div",{style:{fontSize:12,color:"var(--text-subtle)"},children:T?"Tanpa transkrip — panenya sudah lenyap sebelum hanoman sempat mengambilnya.":"Tanpa transkrip — sesi ini ditutup sebelum fitur riwayat ada, atau panenya tak menyisakan keluaran."}),R==="error"&&t.jsx("div",{style:{fontSize:12,color:"var(--clay-600)"},children:"Transkrip tak terbaca lagi di server."}),c!==null&&t.jsx("pre",{style:{maxHeight:"52vh",overflow:"auto",margin:0,padding:10,background:"var(--bone-200)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",fontFamily:"var(--font-mono)",fontSize:11,whiteSpace:"pre-wrap",wordBreak:"break-word",color:"var(--text-body)"},children:c})]})}function za({open:e,projectId:i,projectName:n,onClose:s,onCreated:c}){var D;const[d,R]=o.useState("claude"),[v,T]=o.useState("sonnet"),[h,g]=o.useState("medium"),[b,u]=o.useState({claude:{model:"sonnet",effort:"medium"},codex:{...lt}}),[x,C]=o.useState(!1),[w,p]=o.useState(null);o.useEffect(()=>{e&&(L.getSettings().then(k=>{const E={claude:{model:k.model,effort:k.effort},codex:{...lt,...k.codex??{}}},l=k.agent==="codex"?"codex":"claude",f=ot(E,l);u(E),R(l),T(f.model),g(f.effort)}).catch(()=>{}),L.getCodexVersion().then(k=>p(k.version)).catch(()=>{}))},[e]);const S=k=>{R(k);const E=ot(b,k);T(E.model),g(E.effort)},z=k=>{T(k),g(E=>d==="codex"?ea(k,E):ta(k,E))};async function N(){C(!0);try{const{id:k}=await L.createTerminal(i,{agent:d,model:v,effort:h});c(k),s()}catch{}finally{C(!1)}}return t.jsxs(ke,{open:e,onClose:s,icon:"plus",eyebrow:n,title:"Sesi baru",footer:t.jsxs(t.Fragment,{children:[t.jsx(G,{variant:"ghost",onClick:s,children:"Batal"}),t.jsx(G,{leftIcon:"play",disabled:x,onClick:()=>void N(),children:"Buka sesi"})]}),children:[t.jsxs("div",{style:{fontSize:12.5,color:"var(--text-muted)",marginBottom:12,lineHeight:1.5},children:["Runtime untuk sesi ini. Default dari setelan global; ubah bila perlu. Sesi lahir dengan pilihan ini untuk seluruh hidupnya — ",t.jsx("code",{children:"/model"})," di terminal tetap bisa mengubahnya."]}),t.jsx(Pe,{label:"Agen",hint:"Mesin yang menjalankan sesi ini. Perilaku sesi sama; hanya CLI-nya berbeda.",children:t.jsx(J,{"aria-label":"Agen",value:d,style:{width:"100%"},options:[{value:"claude",label:"Claude Code"},{value:"codex",label:"Codex CLI"}],onChange:k=>S(k.target.value)})}),t.jsx(Pe,{label:"Model",children:t.jsx(J,{"aria-label":"Model",value:v,style:{width:"100%"},options:Jt(d,v),onChange:k=>z(k.target.value)})}),t.jsx(Pe,{label:"Effort",children:t.jsx(J,{"aria-label":"Effort",value:h,style:{width:"100%"},options:Xt(d,v).map(k=>({value:k,label:k})),onChange:k=>g(k.target.value)})}),d==="codex"&&Qt(v,w)&&t.jsxs("div",{"data-testid":"codex-version-note",style:{fontSize:12,lineHeight:1.5,marginBottom:12,padding:"8px 10px",borderRadius:8,background:"var(--warn-bg, #fdf6e3)",color:"var(--text-muted)"},children:["Codex CLI terpasang ",t.jsx("b",{children:w}),", sedangkan ",t.jsx("b",{children:v})," butuh ",t.jsx("b",{children:(D=Zt(v))==null?void 0:D.minClient}),". Sesi tetap boleh dijalankan, tapi modelnya belum tentu dikenali CLI ini."]})]})}const Ra=()=>({rows:1,cols:1,cells:[null]}),pt=e=>({...e,rows:e.rows+1,cells:[...e.cells,...Array(e.cols).fill(null)]});function mt(e){const i=e.cols+1,n=[];for(let s=0;s<e.rows;s++)for(let c=0;c<i;c++)n.push(c<e.cols?e.cells[s*e.cols+c]??null:null);return{rows:e.rows,cols:i,cells:n}}function ft(e,i){if(e.rows===1||i<0||i>=e.rows)return e;const n=[...e.cells];return n.splice(i*e.cols,e.cols),{...e,rows:e.rows-1,cells:n}}function ht(e,i){if(e.cols===1||i<0||i>=e.cols)return e;const n=e.cols-1,s=[];for(let c=0;c<e.rows;c++)for(let d=0;d<e.cols;d++)d!==i&&s.push(e.cells[c*e.cols+d]??null);return{rows:e.rows,cols:n,cells:s}}function Ue(e,i,n){if(i<0||i>=e.cells.length)return e;const s=e.cells.map(c=>n!==null&&c===n?null:c);return s[i]=n,{...e,cells:s}}const Ta=(e,i)=>({...e,cells:e.cells.map(n=>n&&i.has(n)?n:null)}),Rt=e=>({id:crypto.randomUUID(),name:e,layout:Ra()});function xt(){const e=Rt("Utama");return{groups:[e],active:e.id}}const we=e=>e.groups.find(i=>i.id===e.active)??e.groups[0];function Ea(e,i){const n=Rt(i);return{groups:[...e.groups,n],active:n.id}}const Na=(e,i,n)=>({...e,groups:e.groups.map(s=>s.id===i?{...s,name:n}:s)});function Aa(e,i){if(e.groups.length===1)return e;const n=e.groups.filter(s=>s.id!==i);return n.length===e.groups.length?e:{groups:n,active:e.active===i?n[0].id:e.active}}const La=(e,i)=>e.groups.some(n=>n.id===i)?{...e,active:i}:e;function ne(e,i){const n=we(e);return{...e,groups:e.groups.map(s=>s.id===n.id?{...s,layout:i(s.layout)}:s)}}function Ve(e,i,n){const s=we(e),c=n===null?e.groups:e.groups.map(d=>d.id===s.id?d:{...d,layout:Ue(d.layout,d.layout.cells.indexOf(n),null)});return{...e,groups:c.map(d=>d.id===s.id?{...d,layout:Ue(d.layout,i,n)}:d)}}function ue(e,i){const n=we(e).layout.cells.indexOf(null);return n===-1?e:Ve(e,n,i)}const Fa=(e,i)=>({...e,groups:e.groups.map(n=>({...n,layout:Ue(n.layout,n.layout.cells.indexOf(i),null)}))}),gt=e=>new Set(e.groups.flatMap(i=>i.layout.cells.filter(n=>n!==null))),bt=(e,i)=>({...e,groups:e.groups.map(n=>({...n,layout:Ta(n.layout,i)}))}),Tt="hanoman.terminal.workspace",Et="hanoman.terminal.layout",pe=e=>je.parse({version:1,groups:e.groups});function Le(e,i){const n=e.groups,s=i&&n.some(c=>c.id===i)?i:n[0].id;return{groups:n,active:s}}function $a(e){try{const i=JSON.parse(e);if(!i||typeof i!="object")return null;const n=i,s=je.parse({version:1,groups:n.groups});return{workspace:s,active:typeof n.active=="string"&&s.groups.some(c=>c.id===n.active)?n.active:s.groups[0].id}}catch{return null}}function Ba(){try{const e=localStorage.getItem(Tt);if(e)return $a(e);const i=localStorage.getItem(Et);if(!i)return null;const n=JSON.parse(i),s={id:crypto.randomUUID(),name:"Utama",layout:n};return{workspace:je.parse({version:1,groups:[s]}),active:s.id}}catch{return null}}function He(){try{localStorage.removeItem(Tt),localStorage.removeItem(Et)}catch{}}const Nt=e=>`hanoman.terminal.workspace.v2.${encodeURIComponent(e)}`;function Da(e){try{const i=localStorage.getItem(Nt(e));if(!i)return null;const n=JSON.parse(i),s=je.parse(n.workspace);if(!Number.isInteger(n.revision)||(n.revision??-1)<0)return null;const c=typeof n.active=="string"&&s.groups.some(d=>d.id===n.active)?n.active:s.groups[0].id;return{workspace:s,revision:n.revision,active:c}}catch{return null}}function Ge(e,i){try{const n=je.parse(i.workspace);if(!Number.isInteger(i.revision)||i.revision<0)return;const s=n.groups.some(c=>c.id===i.active)?i.active:n.groups[0].id;localStorage.setItem(Nt(e),JSON.stringify({workspace:n,revision:i.revision,active:s}))}catch{}}function Ke(e){if(!(e instanceof Je)||e.status!==409)return null;const i=e.detail;if((i==null?void 0:i.code)!=="revision-conflict")return null;const n=aa.safeParse(i.current);return n.success?n.data:null}function Oa(e){const i=$.useRef(null);i.current||(i.current=xt());const[n,s]=$.useState(i.current),[c,d]=$.useState("loading"),[R,v]=$.useState(null),[T,h]=$.useState(!1),g=$.useRef(n),b=$.useRef(0),u=$.useRef(!1),x=$.useRef(Promise.resolve()),C=$.useRef(0),w=$.useCallback(l=>{g.current=l,s(l)},[]),p=$.useCallback(l=>{u.current=l,h(l)},[]),S=$.useCallback(l=>{const f=x.current.then(l,l);return x.current=f.then(()=>{},()=>{}),f},[]),z=$.useCallback((l,f="ready",I=null,y=g.current.active)=>{const O=l.workspace?Le(l.workspace,y):xt();b.current=l.revision,w(O),d(f),v(I),p(!0),l.workspace&&Ge(e,{workspace:l.workspace,revision:l.revision,active:O.active})},[w,p,e]),N=$.useCallback(l=>{const f=Da(e);f&&(b.current=f.revision,w(Le(f.workspace,f.active))),p(!1),d("recovering"),v(l instanceof Error?l.message:"Layout server belum tersambung")},[w,p,e]),D=$.useCallback(()=>S(async()=>{try{z(await L.getTerminalWorkspace())}catch(l){N(l)}}),[z,S,N]);$.useEffect(()=>{const l=++C.current;return d("loading"),v(null),p(!1),S(async()=>{try{const f=await L.getTerminalWorkspace();if(l!==C.current)return;if(f.workspace){z(f),He();return}const I=Ba();if(!I){z(f);return}try{const y=await L.putTerminalWorkspace({baseRevision:f.revision,workspace:I.workspace});if(l!==C.current)return;w(Le(y.workspace,I.active)),b.current=y.revision,Ge(e,{workspace:y.workspace,revision:y.revision,active:I.active}),He(),d("ready"),v(null),p(!0)}catch(y){const O=Ke(y);O!=null&&O.workspace?(z(O,"conflict","Layout server lebih baru; layout lokal lama tidak diunggah"),He()):N(y)}}catch(f){l===C.current&&N(f)}}),()=>{C.current+=1}},[z,S,N,w,p,e]),$.useEffect(()=>{const l=()=>{D()},f=()=>{document.visibilityState==="visible"&&D()};return window.addEventListener("focus",l),document.addEventListener("visibilitychange",f),()=>{window.removeEventListener("focus",l),document.removeEventListener("visibilitychange",f)}},[D]);const k=$.useCallback(l=>S(async()=>{if(!u.current)return!1;const f=l(g.current);let I,y;try{I=pe(f),y=pe(g.current)}catch{return d("conflict"),v("Layout tidak valid dan tidak disimpan"),!1}if(jt(I,y))return!0;try{return z(await L.putTerminalWorkspace({baseRevision:b.current,workspace:I}),"ready",null,f.active),!0}catch(O){const X=Ke(O);if(!(X!=null&&X.workspace))return N(O),!1;const M=l(Le(X.workspace,g.current.active));try{const _=await L.putTerminalWorkspace({baseRevision:X.revision,workspace:pe(M)});return z(_,"conflict","Layout berubah di perangkat lain; perubahan ini diterapkan ulang",M.active),!0}catch(_){if(!Ke(_)&&!(_ instanceof Je&&_.status===409))return N(_),!1;try{z(await L.getTerminalWorkspace(),"conflict","Layout berubah lagi di perangkat lain; state terbaru dimuat")}catch(Q){N(Q)}return!1}}}),[z,S,N]),E=$.useCallback(l=>{const f=La(g.current,l);w(f);const I=pe(f);Ge(e,{workspace:I,revision:b.current,active:f.active})},[w,e]);return{workspace:n,status:c,message:R,writable:T,mutate:k,setActive:E,refresh:D}}const Pa=[];function tn({userId:e="test-user",projects:i,backlog:n=Pa,focusSession:s,startedSession:c,onStartedSessionHandled:d,onStartBacklog:R,onOpenReview:v,onOpenSessionReview:T,titleOf:h,onIntegrate:g,onIntegrateSession:b,specOf:u,sessions:x,setSessions:C}){var st;const[w,p]=o.useState([]),S=x??w,z=C??p,[N,D]=o.useState([]),k=Oa(e),{workspace:E,status:l,message:f,writable:I,mutate:y,setActive:O,refresh:X}=k,[M,_]=be("terminal","project",((st=i[0])==null?void 0:st.id)??"",xa),Q=wt(),[re,le]=be("terminal","fontSize",Q?fa:ha,ma),[q,me]=be("terminal","keys",Q,Me),[Z,fe]=be("terminal","predict",!0,Me),[V,Se]=be("terminal","diag",!1,Me),oe=a=>le(r=>pa(r+a)),[B,Ie]=o.useState(!1),[K,he]=o.useState(null),[Ce,te]=o.useState(!1),[H,P]=o.useState(null),[Fe,xe]=o.useState(!1),[ze,Re]=o.useState(!1),$e=sa(),W=la()==="mobile",[Y,Te]=o.useState(0),[ee,ae]=o.useState(null),Be=o.useRef(null),[ce,Lt]=o.useState(!1);o.useEffect(()=>{L.listTerminals().then(a=>{z(a),Lt(!0)}).catch(()=>{})},[]),o.useEffect(()=>oa(a=>{a.t==="sessions"&&!x?z(a.sessions):a.t==="cleanups"&&D(a.cleanups)}),[]),o.useEffect(()=>{if(!ce||!I)return;const a=new Set(S.map(m=>m.id)),r=bt(E,a);jt(pe(r),pe(E))||y(m=>bt(m,a))},[y,S,ce,I,E]),o.useEffect(()=>{!c||c.specId==null||!ce||(z(a=>a.some(r=>r.id===c.id)?a:[...a,{...c,cwd:"",exited:!1}]),ae(c.id),d==null||d())},[d,ce,c]),o.useEffect(()=>{if(!s){Be.current=null;return}!ce||Be.current===s||S.some(a=>a.id===s&&!a.exited)&&(Be.current=s,ae(s))},[s,S,ce]),o.useEffect(()=>{if(!ee)return;const a=E.groups.find(r=>r.layout.cells.includes(ee));if(a){a.id!==E.active&&O(a.id);return}I&&y(r=>{if(gt(r).has(ee))return r;const m=ue(r,ee);return m!==r||!W?m:Ve(r,Y,ee)})},[Y,W,y,ee,O,I,E]),o.useEffect(()=>{K&&!S.some(a=>a.id===K)&&he(null)},[K,S]);const De=N.filter(a=>a.error),Ee=a=>S.find(r=>r.id===a)??null,ge=o.useCallback(a=>{var r;return((r=i.find(m=>m.id===a))==null?void 0:r.name)??a},[i]);function Ft(a){z(r=>r.some(m=>m.id===a)?r:[...r,{id:a,projectId:M,cwd:"",exited:!1}]),y(r=>ue(r,a)),ae(a)}async function Qe(){if(!M)return;const{id:a}=await L.createShell(M);z(r=>[...r,{id:a,projectId:M,cwd:"",exited:!1}]),y(r=>ue(r,a)),ae(a)}async function Ze(a,r){if(R&&!r){te(!1),P(null),R(a);return}const m=ba(a.source);try{const{id:j}=await L.startSession({spec:a.id,flow:m,...r?{force:r}:{}});z(A=>A.some(se=>se.id===j)?A:[...A,{id:j,projectId:a.projectId,specId:a.id,flow:m,cwd:"",exited:!1}]),y(A=>ue(A,j)),ae(j),te(!1),P(null)}catch(j){if($e.offerRetry(j,a.id,se=>Ze(a,se)))return;const A=j instanceof Je&&(j.status===400||j.status===422);P(`${a.id} · gagal mulai${A?" · project belum punya repoDir":""}`)}}async function et(a,r){try{const m=a.specId?await L.startSession({spec:a.specId,flow:a.flow??"feature",agent:a.agent==="codex"?"codex":"claude",...a.model?{model:a.model}:{},...a.effort?{effort:a.effort}:{},...r?{force:r}:{}}):a.kind==="shell"?await L.createShell(a.projectId):a.kind==="terminal"?await L.createTerminal(a.projectId,{agent:a.agent==="codex"?"codex":"claude",...a.model?{model:a.model}:{},...a.effort?{effort:a.effort}:{}}):await(r?L.createTerminalFlow(a.projectId,a.kind,{force:r}):L.createTerminalFlow(a.projectId,a.kind));z(j=>j.some(A=>A.id===m.id)?j:[...j,{id:m.id,projectId:a.projectId,specId:a.specId??void 0,cwd:"",exited:!1}]),y(j=>ue(j,m.id)),ae(m.id),Re(!1)}catch(m){if((a.specId||a.kind!=="shell"&&a.kind!=="terminal")&&$e.offerRetry(m,`${a.projectId} · ${a.title??a.specId??a.kind}`,j=>et(a,j)))return}}const tt=new Set(S.filter(a=>a.specId&&!a.exited).map(a=>a.specId)),$t=n.filter(a=>a.stage!=="done"&&!tt.has(a.id));function at(a){z(r=>r.filter(m=>m.id!==a)),L.deleteTerminal(a).catch(()=>{})}const Bt=o.useCallback((a,r)=>{z(m=>m.map(j=>j.id===a?{...j,exited:!0,exitCode:r}:j))},[]),nt={close:at,detach:a=>{y(r=>Fa(r,a))},markExited:Bt,setFullId:he,props:{onOpenReview:v,onOpenSessionReview:T,titleOf:h,onIntegrate:g,onIntegrateSession:b,specOf:u}},U=o.useRef(nt);U.current=nt;const it=o.useRef(new Map),Dt=a=>{let r=it.current.get(a);return r||(r={onClose:()=>void U.current.close(a),onDetach:()=>U.current.detach(a),onExit:m=>U.current.markExited(a,m),onFullscreen:()=>U.current.setFullId(a)},it.current.set(a,r)),r},de=o.useRef({onOpenReview:a=>{var r,m;return(m=(r=U.current.props).onOpenReview)==null?void 0:m.call(r,a)},onOpenSessionReview:(a,r)=>{var m,j;return(j=(m=U.current.props).onOpenSessionReview)==null?void 0:j.call(m,a,r)},titleOf:a=>{var r,m;return(m=(r=U.current.props).titleOf)==null?void 0:m.call(r,a)},onIntegrate:(a,r,m)=>{var j,A;return(A=(j=U.current.props).onIntegrate)==null?void 0:A.call(j,a,r,m)},onIntegrateSession:(a,r,m)=>{var j,A;return(A=(j=U.current.props).onIntegrateSession)==null?void 0:A.call(j,a,r,m)},specOf:a=>{var r,m;return(m=(r=U.current.props).specOf)==null?void 0:m.call(r,a)}}).current,Ot=(a,r)=>{Te(a),y(m=>Ve(m,a,r))},Pt=a=>{ae(a),y(r=>ue(r,a))},Wt=gt(E),Oe=S.filter(a=>!Wt.has(a.id)),F=we(E).layout;o.useEffect(()=>{if(!ee)return;const a=F.cells.indexOf(ee);a<0||(Te(a),ae(null))},[F.cells,ee]),o.useEffect(()=>{Y>=F.cells.length&&Te(Math.max(0,F.cells.length-1))},[Y,F.cells.length]);const rt=F.rows===1&&F.cols===1&&!F.cells[0]&&S.length===0,Mt=t.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:10,marginBottom:10},children:[t.jsxs("div",{className:"hn-dense-row",style:{display:"flex",alignItems:"center",gap:8},children:[t.jsx("span",{style:{flex:1,minWidth:0,fontSize:12,color:"var(--text-muted)"},children:"Ukuran teks terminal"}),t.jsx(We,{size:"sm",icon:"minus",label:"Perkecil teks terminal",disabled:re<=ca,onClick:()=>oe(-1)}),t.jsxs("span",{style:{fontFamily:"var(--font-mono)",fontSize:12,minWidth:44,textAlign:"center"},children:[re,"px"]}),t.jsx(We,{size:"sm",icon:"plus",label:"Perbesar teks terminal",disabled:re>=da,onClick:()=>oe(1)})]}),t.jsxs("div",{className:"hn-dense-row",style:{display:"flex",alignItems:"center",gap:8},children:[t.jsx("span",{style:{flex:1,minWidth:0,fontSize:12,color:"var(--text-muted)"},children:"Papan tombol layar (Esc · panah · Enter)"}),t.jsx(G,{size:"sm",variant:"secondary","aria-pressed":q,onClick:()=>me(a=>!a),children:q?"Sembunyikan":"Tampilkan"})]}),t.jsxs("div",{className:"hn-dense-row",style:{display:"flex",alignItems:"center",gap:8},children:[t.jsx("span",{style:{flex:1,minWidth:0,fontSize:12,color:"var(--text-muted)"},children:"Ketik responsif (huruf tampil sebelum echo server)"}),t.jsx(G,{size:"sm",variant:"secondary","aria-pressed":Z,"aria-label":`${Z?"Matikan":"Nyalakan"} ketik responsif`,onClick:()=>fe(a=>!a),children:Z?"Matikan":"Nyalakan"})]}),t.jsxs("div",{className:"hn-dense-row",style:{display:"flex",alignItems:"center",gap:8},children:[t.jsx("span",{style:{flex:1,minWidth:0,fontSize:12,color:"var(--text-muted)"},children:"Rekam jalur ketik (diagnostik — merekam setiap tombol)"}),t.jsx(G,{size:"sm",variant:"secondary","aria-pressed":V,"aria-label":`${V?"Matikan":"Nyalakan"} rekam jalur ketik`,onClick:()=>Se(a=>!a),children:V?"Matikan":"Nyalakan"})]}),W&&t.jsx(J,{size:"sm","aria-label":"Project sesi baru",value:M,onChange:a=>_(a.target.value),options:i.map(a=>({value:a.id,label:a.name}))})]}),Ht=[{key:"backlog",label:"Ambil backlog",icon:"inbox",onSelect:()=>{P(null),te(!0)}},{key:"history",label:"Riwayat sesi",icon:"history",onSelect:()=>Re(!0)},{key:"shell",label:"Terminal biasa",icon:"terminal",onSelect:()=>void Qe()},{key:"col+",label:"+ Kolom",icon:"columns-2",disabled:!I,onSelect:()=>void y(a=>ne(a,mt))},{key:"row+",label:"+ Baris",icon:"rows-2",disabled:!I,onSelect:()=>void y(a=>ne(a,pt))},{key:"col-",label:"Hapus kolom aktif",icon:"columns-2",disabled:!I||F.cols===1,onSelect:()=>void y(a=>ne(a,r=>ht(r,Y%r.cols)))},{key:"row-",label:"Hapus baris aktif",icon:"rows-2",disabled:!I||F.rows===1,onSelect:()=>void y(a=>ne(a,r=>ft(r,Math.floor(Y/r.cols))))}],Gt={display:"flex",flexDirection:"column",gap:B?8:12,...B?{position:"fixed",inset:0,zIndex:100,background:"var(--surface-page)",paddingTop:"max(12px, var(--safe-top))",paddingRight:"max(12px, var(--safe-right))",paddingBottom:"max(12px, var(--safe-bottom))",paddingLeft:"max(12px, var(--safe-left))"}:{flex:"1 1 0",minHeight:640}};return t.jsxs("div",{"data-testid":"terminal-root",style:Gt,children:[t.jsxs("div",{style:{display:"flex",gap:8,flexDirection:B?"row":"column",alignItems:B?"center":"stretch"},children:[t.jsx(Ma,{compact:B,ws:E,writable:I,onSelect:O,onAdd:()=>void y(a=>Ea(a,`Grup ${a.groups.length+1}`)),onRename:(a,r)=>void y(m=>Na(m,a,r)),onRemove:a=>void y(r=>Aa(r,a))}),t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap",...B?{flex:1,minWidth:0}:{}},children:[!W&&t.jsxs(t.Fragment,{children:[t.jsx(G,{size:"sm",variant:"ghost",disabled:!I,onClick:()=>void y(a=>ne(a,mt)),children:"+ Kolom"}),t.jsx(G,{size:"sm",variant:"ghost",disabled:!I,onClick:()=>void y(a=>ne(a,pt)),children:"+ Baris"})]}),t.jsx("div",{style:{flex:1,minWidth:0}}),l!=="ready"&&t.jsx("span",{"data-testid":"terminal-workspace-status",title:f??void 0,style:{fontSize:12,color:l==="conflict"?"var(--status-warn)":"var(--text-muted)"},children:l==="loading"?"Memuat layout server…":l==="recovering"?t.jsxs(t.Fragment,{children:[t.jsx("span",{children:"Layout server belum tersambung"})," ",t.jsx("button",{type:"button",onClick:()=>void X(),children:"Retry"})]}):f??"Layout berubah di perangkat lain"}),N.length>0&&t.jsx("span",{"data-testid":"worktree-cleanups",title:N.map(a=>`${a.sessionId}${a.error?` — ${a.error}`:""}`).join(`
2
- `),style:{fontSize:12,color:De.length?"var(--status-err)":"var(--text-muted)"},children:De.length?`${De.length} worktree gagal dibersihkan`:`membersihkan ${N.length} worktree…`}),!W&&t.jsxs(t.Fragment,{children:[t.jsx(J,{size:"sm",value:M,onChange:a=>_(a.target.value),options:i.map(a=>({value:a.id,label:a.name}))}),t.jsx(G,{size:"sm",variant:"secondary",leftIcon:"inbox",onClick:()=>{P(null),te(!0)},children:"Ambil backlog"}),t.jsx(G,{size:"sm",variant:"secondary",leftIcon:"history",title:"Riwayat sesi yang sudah berlalu — buka kembali atau baca transkripnya",onClick:()=>Re(!0),children:"Riwayat"}),t.jsx(G,{size:"sm",variant:"secondary",leftIcon:"terminal",title:"Buka shell tmux tanpa Claude di project terpilih — jalankan command di project",onClick:()=>void Qe(),children:"Terminal biasa"})]}),t.jsx(G,{size:"sm",leftIcon:"plus",onClick:()=>xe(!0),children:"Sesi baru"}),t.jsx(St,{label:W?"Aksi terminal lain":"Tampilan terminal",items:W?Ht:[],children:Mt}),t.jsx(We,{size:"sm",icon:B?"minimize-2":"maximize-2",label:B?"Keluar layar penuh":"Layar penuh","aria-pressed":B,onClick:()=>Ie(a=>!a)})]})]}),Oe.length>0&&t.jsxs("div",{style:{display:"flex",gap:6,flexWrap:"wrap",alignItems:"center"},children:[t.jsx("span",{style:{fontSize:11,color:"var(--text-subtle)"},children:"Belum di grid:"}),Oe.map(a=>t.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:6,padding:"4px 8px",borderRadius:"var(--radius-sm)",background:"var(--bone-200)",border:"1px solid var(--border-hair)",fontFamily:"var(--font-mono)",fontSize:11},children:[t.jsxs("button",{className:"hn-terminal-unplaced-action",disabled:!I,onClick:()=>Pt(a.id),title:"Taruh di sel kosong pertama grup ini",style:{all:"unset",cursor:"pointer"},children:[a.specId??ge(a.projectId)," · ",a.id.slice(0,6)]}),t.jsx("button",{type:"button",className:"hn-terminal-action","aria-label":`Tutup sesi ${a.id}`,onClick:()=>void at(a.id),children:"×"})]},a.id))]}),W&&!rt&&t.jsx("div",{className:"hn-stack-mobile",style:{display:"flex",alignItems:"center",gap:8},children:t.jsx(ua,{"aria-label":"Panel terminal",variant:"pill",value:String(Y),onChange:a=>Te(Number(a)),tabs:F.cells.map((a,r)=>({value:String(r),label:`Panel ${r+1}${a?` · ${a.slice(0,6)}`:" · kosong"}`}))})}),rt?t.jsx(Ye,{kind:"empty",icon:"terminal",title:"Belum ada sesi terminal",hint:"Pilih project lalu buka sesi — 'Sesi baru' menjalankan claude --dangerously-skip-permissions di direktori project; 'Terminal biasa' membuka shell tmux polos untuk menjalankan command."}):t.jsxs("div",{style:{flex:1,minHeight:0,display:"grid",gap:8,gridTemplateColumns:W?"minmax(0, 1fr)":`18px repeat(${F.cols}, minmax(0, 1fr))`,gridTemplateRows:W?"minmax(0, 1fr)":`16px repeat(${F.rows}, minmax(0, 1fr))`},children:[!W&&t.jsx("div",{}),!W&&Array.from({length:F.cols},(a,r)=>t.jsx(vt,{label:`Tutup kolom ${r+1}`,disabled:!I||F.cols===1,onClick:()=>void y(m=>ne(m,j=>ht(j,r)))},`col-${r}`)),Array.from({length:F.rows},(a,r)=>t.jsxs(o.Fragment,{children:[!W&&t.jsx(vt,{label:`Tutup baris ${r+1}`,disabled:!I||F.rows===1,onClick:()=>void y(m=>ne(m,j=>ft(j,r)))}),Array.from({length:F.cols},(m,j)=>{const A=r*F.cols+j,se=F.cells[A]??null,Ne=se?Ee(se):null;return t.jsx("div",{"data-terminal-cell-index":A,"aria-hidden":W&&Y!==A?"true":"false",style:{minHeight:0,minWidth:0,display:W&&Y!==A?"none":"flex",flexDirection:"column",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",overflow:"hidden"},children:Ne?t.jsx(qa,{session:Ne,nameOf:ge,...Dt(Ne.id),canArrange:I,onReview:v&&de.onOpenReview,onSessionReview:T&&de.onOpenSessionReview,titleOf:h&&de.titleOf,onIntegrate:g&&de.onIntegrate,onIntegrateSession:b&&de.onIntegrateSession,specOf:u&&de.specOf,backlog:n,fontSize:re,showKeys:q,predict:Z,diag:V,fullscreen:K===Ne.id,paneHidden:W&&Y!==A}):t.jsx(Ya,{disabled:!I,unplaced:Oe,nameOf:ge,onPick:Kt=>Ot(A,Kt)})},se??`empty-${A}`)})]},`row-${r}`))]}),Ce&&t.jsx(Wa,{seed:$t,activeIds:tt,error:H,onPick:a=>void Ze(a),onClose:()=>te(!1)}),Fe&&t.jsx(za,{open:!0,projectId:M,projectName:ge(M),onClose:()=>xe(!1),onCreated:Ft}),ze&&t.jsx(Ia,{projects:i,onClose:()=>Re(!1),onRestart:a=>void et(a)}),$e.dialog,K&&Ee(K)&&t.jsx(Va,{session:Ee(K),label:At(Ee(K),ge,h),fontSize:re,showKeys:q,predict:Z,diag:V,onClose:()=>he(null)})]})}function At(e,i,n){const s=i(e.projectId),c=e.specId?n==null?void 0:n(e.specId):void 0;return e.specId?`${s} · ${e.specId}${c?` · ${c}`:""}`:e.id.startsWith("xaudit-")?`${s} · audit lintas`:s}function Wa({seed:e,activeIds:i,error:n,onPick:s,onClose:c}){const[d,R]=o.useState(""),[v,T]=o.useState("all"),[h,g]=o.useState("all"),[b,u]=o.useState(e),[x,C]=o.useState("");o.useEffect(()=>{const p=setTimeout(()=>C(d.trim()),250);return()=>clearTimeout(p)},[d]),o.useEffect(()=>{var z,N;let p=!0;const S=(N=(z=L).listSpecs)==null?void 0:N.call(z,{startable:!0,q:x||void 0,stage:v==="all"?void 0:v,priority:h==="all"?void 0:h});return S==null||S.then(D=>{p&&u(D.items)}).catch(()=>{}),()=>{p=!1}},[x,v,h]);const w=b.filter(p=>!i.has(p.id));return t.jsxs(ke,{open:!0,title:"Ambil backlog",icon:"inbox",onClose:c,width:760,children:[n&&t.jsx("div",{style:{marginBottom:10,padding:"8px 10px",borderRadius:"var(--radius-sm)",background:"var(--clay-100)",color:"var(--clay-600)",fontSize:12},children:n}),t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap",marginBottom:10},children:[t.jsx(yt,{size:"sm",leftIcon:"search",placeholder:"mis. invoice atau SPEC-412","aria-label":"Cari backlog",value:d,onChange:p=>R(p.target.value),style:{flex:"1 1 220px"}}),t.jsx(J,{size:"sm","aria-label":"Filter stage",value:v,onChange:p=>T(p.target.value),options:[{value:"all",label:"Semua stage"}].concat(ga.filter(p=>p.key!=="done").map(p=>({value:p.key,label:p.label})))}),t.jsx(J,{size:"sm","aria-label":"Filter prioritas",value:h,onChange:p=>g(p.target.value),options:[{value:"all",label:"Semua prioritas"},{value:"tinggi",label:"Tinggi"},{value:"sedang",label:"Sedang"},{value:"rendah",label:"Rendah"}]})]}),w.length===0?t.jsx(Ye,{kind:"empty",icon:"inbox",title:"Tak ada backlog untuk diambil",hint:"Semua item sudah selesai/aktif atau tak cocok filter — buat brief baru di halaman Backlog."}):t.jsx("div",{style:{display:"flex",flexDirection:"column",maxHeight:"62vh",overflowY:"auto"},children:w.map(p=>t.jsx("button",{onClick:()=>s(p),style:{cursor:"pointer",display:"block",width:"100%",flex:"0 0 auto",font:"inherit",color:"inherit",textAlign:"left",background:"transparent",padding:"9px 8px",border:"none",borderBottom:"1px solid var(--border-hair)"},children:t.jsxs("span",{className:"hn-dense-row hn-picker-row",style:{display:"flex",alignItems:"center",gap:10,width:"100%"},children:[t.jsx(ie,{name:p.source==="qa"?"bug":p.source==="audit"?"search":"lightbulb",size:14,color:p.source==="qa"?"var(--clay-500)":p.source==="audit"?"var(--wind-600)":"var(--brass-500)"}),t.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:12,color:"var(--text-subtle)",flex:"0 0 78px"},children:p.id}),t.jsx("span",{className:"hn-picker-title",style:{flex:1,minWidth:0,fontSize:13,color:"var(--text-strong)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:p.title}),t.jsx(_e,{tone:p.priority==="tinggi"?"err":"neutral",size:"sm",children:p.priority}),t.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:11,flex:"0 1 auto",minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",color:"var(--text-muted)"},children:p.projectId})]})},p.id))})]})}function Ma({ws:e,compact:i=!1,writable:n,onSelect:s,onAdd:c,onRename:d,onRemove:R}){const[v,T]=o.useState(null),h=we(e),g=e.groups.length===1;return t.jsxs("div",{role:"tablist","aria-label":"Grup terminal",style:{display:"flex",alignItems:"center",gap:4,flexWrap:"wrap",...i?{}:{borderBottom:"1px solid var(--border-hair)",paddingBottom:4}},children:[e.groups.map((b,u)=>{const x=b.id===h.id;return v===b.id?t.jsx(Ha,{initial:b.name,onCommit:C=>{C.trim()&&d(b.id,C.trim()),T(null)},onCancel:()=>T(null)},b.id):t.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4,padding:"3px 6px",borderRadius:"var(--radius-sm)",fontSize:12,background:x?"var(--bone-200)":"transparent",border:`1px solid ${x?"var(--border-hair)":"transparent"}`},children:[t.jsx("button",{className:"hn-terminal-group-control",role:"tab","aria-selected":x,tabIndex:x?0:-1,onClick:()=>s(b.id),onKeyDown:C=>{var p,S;let w=null;C.key==="ArrowRight"?w=(u+1)%e.groups.length:C.key==="ArrowLeft"?w=(u-1+e.groups.length)%e.groups.length:C.key==="Home"?w=0:C.key==="End"&&(w=e.groups.length-1),w!==null&&(C.preventDefault(),s(e.groups[w].id),(S=(p=C.currentTarget.closest('[role="tablist"]'))==null?void 0:p.querySelectorAll('[role="tab"]')[w])==null||S.focus())},style:{border:0,padding:0,background:"transparent",font:"inherit",cursor:"pointer",color:x?"var(--text-strong)":"var(--text-muted)"},children:b.name}),x&&n&&t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"hn-terminal-group-control","aria-label":`Ganti nama grup ${b.name}`,title:"Ganti nama",onClick:()=>T(b.id),style:{border:0,padding:0,background:"transparent",cursor:"pointer",color:"var(--text-subtle)",fontSize:10},children:"✎"}),t.jsx("button",{className:"hn-terminal-group-control","aria-label":`Hapus grup ${b.name}`,title:g?"Grup terakhir tak bisa dihapus":"Hapus grup (sesi tetap hidup)",disabled:g,onClick:()=>R(b.id),style:{border:0,padding:0,background:"transparent",cursor:g?"not-allowed":"pointer",color:"var(--text-subtle)",opacity:g?.35:1},children:"×"})]})]},b.id)}),t.jsx("button",{className:"hn-terminal-group-control","aria-label":"Grup baru",title:"Grup baru",disabled:!n,onClick:c,style:{border:0,background:"transparent",cursor:"pointer",padding:"3px 8px",color:"var(--text-subtle)",fontSize:12},children:"+"})]})}function vt({label:e,disabled:i,onClick:n}){return t.jsx("button",{type:"button","aria-label":e,title:i?"Grid tak boleh menyusut ke nol":e,disabled:i,onClick:n,style:{all:"unset",display:"grid",placeItems:"center",fontSize:11,lineHeight:1,color:"var(--text-subtle)",opacity:i?.3:1,cursor:i?"not-allowed":"pointer"},children:"×"})}function Ha({initial:e,onCommit:i,onCancel:n}){const[s,c]=o.useState(e);return t.jsx("input",{autoFocus:!0,"aria-label":"Nama grup",value:s,placeholder:"mis. Rilis",onChange:d=>c(d.target.value),onBlur:()=>i(s),onKeyDown:d=>{d.key==="Enter"?i(s):d.key==="Escape"&&n()},style:{width:100,padding:"3px 6px",fontSize:12,fontFamily:"var(--font-ui)",border:"1px solid var(--border-strong)",borderRadius:"var(--radius-sm)",background:"var(--surface-card)",color:"var(--text-strong)"}})}const Ga={done:"var(--brass)",active:"var(--text-strong)",skipped:"var(--text-subtle)",pending:"var(--text-subtle)"},Ka={done:"✓",running:"●",pending:"○",skipped:"–",failed:"✕",abandoned:"⨯"};function _a({phases:e,compact:i=!1,now:n}){const[s,c]=o.useState(null),d=na(s!==null,()=>c(null),"dialog"),[,R]=o.useState(0),v=!!(e!=null&&e.some(u=>{var x;return((x=u.agent)==null?void 0:x.status)==="running"}));if(o.useEffect(()=>{if(!(!v||n!==void 0))return ja(()=>R(u=>u+1))},[v,n]),!(e!=null&&e.length))return null;const T=n??Date.now(),h=e.find(u=>u.name===s&&u.agent),g=u=>({color:Ga[u.state],fontWeight:u.state==="active"?600:400,textDecoration:u.state==="skipped"?"line-through":"none",opacity:u.state==="pending"?.5:1}),b=u=>{const x=u.agent;return x?typeof x.durationMs=="number"?ct(x.durationMs):x.status==="running"&&x.startedAt?ct(T-Date.parse(x.startedAt)):"":""};return t.jsxs("div",{"data-testid":"phase-strip",style:{flex:"0 0 auto",borderBottom:"1px solid var(--border-hair)"},children:[t.jsx("div",{"data-testid":"phase-strip-scroller",style:{display:"flex",alignItems:"center",gap:8,padding:"3px 8px",fontSize:10,fontFamily:"var(--font-mono)",overflowX:"auto",whiteSpace:"nowrap"},children:e.map(u=>{if(!u.agent)return t.jsx("span",{"data-state":u.state,title:u.state,style:g(u),children:u.name},u.name);const x=u.agent,C=ia(u),w=!i||u.state==="active",p=b(u);return t.jsxs("button",{type:"button","data-tone":C,"aria-expanded":s===u.name,ref:s===u.name?d.triggerRef:void 0,"aria-haspopup":"dialog","aria-controls":s===u.name?d.panelId:void 0,"aria-label":ra(u,p),onClick:()=>c(s===u.name?null:u.name),style:{display:"inline-flex",alignItems:"center",gap:4,flex:"0 0 auto",padding:"1px 6px",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",background:"transparent",font:"inherit",color:"var(--text-body)",cursor:"pointer"},children:[t.jsx("span",{"aria-hidden":!0,children:Ka[C]}),t.jsx("span",{"data-state":u.state,title:u.state,style:g(u),children:u.name}),u.state==="skipped"&&t.jsx("span",{children:"dilewati"}),w&&x.model&&t.jsxs("span",{children:["· ",qe(x.model)]}),w&&x.effort&&t.jsxs("span",{children:["· ",x.effort]}),w&&p&&t.jsxs("span",{children:["· ",p]}),x.attempts>1&&t.jsxs("span",{children:["↻",x.attempts]}),x.evidence==="missing"&&t.jsx("span",{role:"img","aria-label":"bukti subagent tak diterima",title:"bukti subagent tak diterima",style:{color:"var(--status-warn)"},children:"⚠"})]},u.name)})}),(h==null?void 0:h.agent)&&t.jsxs("div",{ref:d.panelRef,id:d.panelId,role:"dialog","aria-label":`Detail fase ${h.name}`,tabIndex:-1,onKeyDown:d.onKeyDown,style:{position:"absolute",marginLeft:8,zIndex:5,minWidth:220,maxWidth:"min(420px, calc(100% - 16px))",maxHeight:"calc(100% - 48px)",overflowY:"auto",boxSizing:"border-box",padding:"8px 10px",background:"var(--surface-card)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",whiteSpace:"normal",lineHeight:1.5,fontSize:10,fontFamily:"var(--font-mono)"},children:[t.jsx("div",{children:t.jsx("b",{children:h.agent.name})}),t.jsx("div",{children:[qe(h.agent.model),h.agent.effort,h.agent.status??"belum mulai"].filter(Boolean).join(" · ")}),t.jsxs("div",{children:["durasi ",b(h)||"—"," · percobaan ",h.agent.attempts]}),t.jsxs("div",{children:["token in ",h.agent.inputTokens??"—"," · out ",h.agent.outputTokens??"—"," · cache ",h.agent.cachedTokens??"—"]}),h.agent.resultExcerpt&&t.jsx("pre",{style:{margin:"6px 0 0",whiteSpace:"pre-wrap",maxHeight:160,overflow:"auto"},children:h.agent.resultExcerpt})]})]})}const qa=o.memo(Ua);function Ua({session:e,nameOf:i,onClose:n,canArrange:s,onDetach:c,onExit:d,onReview:R,onSessionReview:v,titleOf:T,onIntegrate:h,onIntegrateSession:g,specOf:b,fontSize:u,showKeys:x,predict:C,diag:w,fullscreen:p,onFullscreen:S,paneHidden:z}){const[N,D]=o.useState(null),k=o.useRef(null),[E,l]=o.useState(Number.POSITIVE_INFINITY),f=wt();o.useEffect(()=>{const H=k.current;if(!H||typeof ResizeObserver!="function")return;const P=new ResizeObserver(Fe=>{var ze;const xe=((ze=Fe[0])==null?void 0:ze.contentRect.width)??H.getBoundingClientRect().width;xe>0&&l(xe)});return P.observe(H),()=>P.disconnect()},[]);const[I,y]=o.useState(!1),O=o.useCallback((H,P)=>{D(H),y(P)},[]),[X,M]=o.useState(!1),[_,Q]=o.useState(!1),[re,le]=o.useState(!1),q=e.specId?b==null?void 0:b(e.specId):void 0,me=!e.specId&&!!e.branch,Z=At(e,i,T),fe=!e.exited&&!!e.decision,V=!e.exited&&!!e.deciding,Se=fe||V,oe=e.exited&&!!e.exitCode,B=!e.exited&&I,Ie=oe?null:e.exited||B?"PST-005":Se?"PST-004":"PST-003",K=[...e.specId?[{key:"docs",label:"Lihat dokumen",icon:"file-text",title:"Lihat dokumen (audit/spec/plan)",onSelect:()=>M(!0),render:t.jsx("button",{type:"button",className:"hn-terminal-action",onClick:()=>M(!0),"aria-label":`Lihat dokumen sesi ${e.id}`,title:"Lihat dokumen (audit/spec/plan)",children:t.jsx(ie,{name:"file-text",size:12})},"docs")}]:[],...e.specId&&R?[{key:"review",label:"Review perubahan",icon:"git-compare",title:"Review perubahan (diff worktree)",onSelect:()=>R(e.specId),render:t.jsx("button",{type:"button",className:"hn-terminal-action",onClick:()=>R(e.specId),"aria-label":`Review sesi ${e.id}`,title:"Review perubahan (diff worktree)",children:t.jsx(ie,{name:"git-compare",size:12})},"review")}]:[],...me&&v?[{key:"review-session",label:"Review perubahan",icon:"git-compare",title:"Review perubahan (diff worktree sesi)",onSelect:()=>v(e.id,Z),render:t.jsx("button",{type:"button",className:"hn-terminal-action",onClick:()=>v(e.id,Z),"aria-label":`Review sesi ${e.id}`,title:"Review perubahan (diff worktree sesi)",children:t.jsx(ie,{name:"git-compare",size:12})},"review-session")}]:[],...q&&h?[{key:"integrate",label:"Rebase / Merge branch",icon:"git-merge",title:"Rebase / Merge branch spec",onSelect:()=>Q(!0),render:t.jsx("button",{type:"button",className:"hn-terminal-action",onClick:()=>Q(!0),"aria-label":`Integrasikan sesi ${e.id}`,title:"Rebase / Merge branch spec",children:t.jsx(ie,{name:"git-merge",size:12})},"integrate")}]:[],...me&&g?[{key:"integrate-session",label:"Rebase / Merge branch",icon:"git-merge",title:"Rebase / Merge branch sesi",onSelect:()=>le(!0),render:t.jsx("button",{type:"button",className:"hn-terminal-action",onClick:()=>le(!0),"aria-label":`Integrasikan sesi ${e.id}`,title:"Rebase / Merge branch sesi",children:t.jsx(ie,{name:"git-merge",size:12})},"integrate-session")}]:[],{key:"detach",label:"Lepas dari grid",icon:"unlink",disabled:!s,title:"Lepas dari grid (sesi tetap hidup)",onSelect:c,render:t.jsx("button",{type:"button",className:"hn-terminal-action hn-terminal-action--text",onClick:c,disabled:!s,title:"Lepas dari grid (sesi tetap hidup)",children:"lepas"},"detach")},{key:"fullscreen",label:"Layar penuh",icon:"fullscreen",title:"Layar penuh — fokus 1 terminal",onSelect:S,render:t.jsx("button",{type:"button",className:"hn-terminal-action",onClick:S,title:"Layar penuh — fokus 1 terminal","aria-label":`Layar penuh sesi ${e.id}`,children:t.jsx(ie,{name:"fullscreen",size:12})},"fullscreen")},{key:"close",label:"Tutup",icon:"x",title:"Tutup sesi",onSelect:n,render:t.jsx("button",{type:"button",className:"hn-terminal-action","aria-label":`Tutup sesi ${e.id}`,onClick:n,children:"×"},"close")}],he=40+(e.orchestrated&&e.model?110:0)+(e.exited||B?110:0)+(V||fe&&!B?130:0),Ce=ka(E,K.length,f?44:28,he),te=K.slice(Ce);return t.jsxs(t.Fragment,{children:[t.jsxs("div",{ref:k,className:"hn-terminal-cell-header",style:{display:"flex",alignItems:"center",gap:8,padding:"4px 8px",flex:"0 0 auto",background:oe?"var(--status-err-tint)":e.exited||B?"var(--status-ok-tint)":Se?"var(--status-warn-tint)":"var(--bone-200)",borderBottom:"1px solid var(--border-hair)",fontFamily:"var(--font-mono)",fontSize:11,color:e.exited?"var(--text-muted)":"var(--text-body)"},children:[Ie&&t.jsx(va,{id:Ie,decorative:!0,style:{width:34,flex:"0 0 auto",borderRadius:"var(--radius-sm)"}}),t.jsxs("span",{style:{flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:[Z," · ",e.id.slice(0,6)]}),e.orchestrated&&e.model&&t.jsxs("span",{"data-testid":"orchestrator-chip",title:"Model & effort orchestrator",style:{flex:"0 0 auto",fontSize:10,color:"var(--text-muted)"},children:["orch ",qe(e.model),e.effort?` · ${e.effort}`:""]}),e.exited&&(oe?t.jsx(ve,{status:"failed",size:"sm",children:`Gagal · exit ${e.exitCode}`}):t.jsx(ve,{status:"done",size:"sm",children:"Selesai"})),B&&t.jsx(ve,{status:"done",size:"sm",children:"Selesai"}),V&&!B&&t.jsx(ve,{status:"running",size:"sm",children:"Lead memutuskan"}),fe&&!V&&!B&&t.jsx(ve,{status:"awaiting",size:"sm"}),t.jsxs("span",{className:"hn-terminal-actions",children:[K.slice(0,Ce).map(H=>H.render),te.length>0&&t.jsx(St,{label:`Aksi lain sesi ${e.id}`,items:te.map(({render:H,...P})=>P)})]})]}),t.jsxs("div",{style:{display:"flex",flexDirection:"column",flex:1,minHeight:0,position:"relative",opacity:e.exited?.6:1},children:[t.jsx(_a,{phases:N,compact:E<480}),t.jsx("div",{style:{flex:1,minHeight:0},children:p?t.jsx("div",{style:{height:"100%",display:"grid",placeItems:"center",padding:12,color:"var(--text-subtle)",fontSize:12,textAlign:"center"},children:"Terbuka di layar penuh"}):t.jsx(It,{sessionId:e.id,onExit:d,onPhases:O,fontSize:u,showKeys:x,predict:C,diag:w,hidden:z},e.id)})]}),X&&e.specId&&t.jsx(ya,{specId:e.specId,onClose:()=>M(!1)}),_&&q&&h&&t.jsx(dt,{projectId:q.projectId,ownBranch:`hanoman/${q.id.toLowerCase().replace(/[^a-z0-9_-]/g,"_")}`,eyebrow:q.id,onClose:()=>Q(!1),onIntegrate:(H,P)=>{Q(!1),h(q,H,P)}}),re&&me&&g&&t.jsx(dt,{projectId:e.projectId,ownBranch:e.branch,eyebrow:e.id.slice(0,16),onClose:()=>le(!1),onIntegrate:(H,P)=>{le(!1),g(e,H,P)}})]})}function Va({session:e,label:i,fontSize:n,showKeys:s,predict:c,diag:d,onClose:R}){return t.jsx(ke,{open:!0,icon:"terminal",title:i,onClose:R,closeOnEscape:!1,width:1600,children:t.jsx("div",{style:{height:"min(72vh, calc(100dvh - 180px))",minHeight:0,display:"flex",flexDirection:"column",opacity:e.exited?.6:1},children:t.jsx(It,{sessionId:e.id,onExit:()=>{},fontSize:n,showKeys:s,predict:c,diag:d},e.id)})})}function Ya({unplaced:e,nameOf:i,onPick:n,disabled:s}){return t.jsx("div",{style:{flex:1,display:"grid",placeItems:"center",padding:12},children:t.jsx(J,{size:"sm",value:"","aria-label":"Pilih sesi untuk sel",disabled:s||!e.length,onChange:c=>c.target.value&&n(c.target.value),options:[{value:"",label:e.length?"Pilih sesi…":"tidak ada sesi bebas"}].concat(e.map(c=>({value:c.id,label:`${c.specId??i(c.projectId)} · ${c.id.slice(0,6)}`})))})})}export{_a as PhaseStrip,tn as TerminalScreen};
@@ -1,32 +0,0 @@
1
- @import"https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400&family=IBM+Plex+Serif:ital,wght@0,400;0,500;0,600;0,700;1,400&family=IBM+Plex+Mono:ital,wght@0,400;0,500;0,600;1,400&display=swap";:root{--ink-900: #17130c;--ink-800: #241d13;--ink-700: #3a3125;--ink-600: #574b3a;--ink-500: #6f6250;--ink-400: #90826c;--ink-300: #b3a794;--ink-200: #d6ccb9;--bone-000: #fffdf8;--bone-100: #faf6ec;--bone-200: #f2ebdc;--bone-300: #e8dfcc;--bone-400: #dccfb6;--brass-700: #7a5417;--brass-600: #97671f;--brass-500: #b8863b;--brass-400: #cf9d55;--brass-300: #e3c988;--brass-100: #f3e6c4;--brass-050: #faf2df;--wind-700: #2f5560;--wind-600: #3f6e7a;--wind-500: #517f8c;--wind-100: #dbe7ea;--wind-050: #eef4f5;--leaf-600: #4d6b30;--leaf-500: #5f8340;--leaf-100: #e6eed7;--amber-600: #b3771a;--amber-500: #cf8f28;--amber-100: #f7e9c9;--clay-600: #a23b2e;--clay-500: #bd4a3a;--clay-100: #f5dcd6;--term-bg: #1c1810;--term-fg: #e9e0cd;--term-dim: #8f8467;--term-line: #2c2618;--surface-page: var(--bone-100);--surface-panel: var(--bone-200);--surface-card: var(--bone-000);--surface-sunken: var(--bone-200);--surface-inverse: var(--ink-900);--surface-code: var(--term-bg);--text-strong: var(--ink-900);--text-body: var(--ink-700);--text-muted: var(--ink-500);--text-subtle: var(--ink-400);--text-on-brass: var(--ink-900);--text-on-dark: var(--term-fg);--text-link: var(--wind-600);--border-hair: var(--bone-300);--border-strong: var(--bone-400);--border-focus: var(--brass-500);--accent: var(--brass-500);--accent-hover: var(--brass-600);--accent-press: var(--brass-700);--accent-tint: var(--brass-100);--accent-on: var(--ink-900);--info: var(--wind-600);--info-tint: var(--wind-100);--status-ok: var(--leaf-600);--status-ok-tint: var(--leaf-100);--status-warn: var(--amber-600);--status-warn-tint: var(--amber-100);--status-err: var(--clay-600);--status-err-tint: var(--clay-100);--ring: 0 0 0 3px color-mix(in srgb, var(--brass-500) 45%, transparent)}:root{--font-serif: "IBM Plex Serif", Georgia, "Times New Roman", serif;--font-sans: "IBM Plex Sans", ui-sans-serif, system-ui, -apple-system, sans-serif;--font-mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, monospace;--font-display: var(--font-serif);--font-body: var(--font-sans);--font-ui: var(--font-sans);--font-code: var(--font-mono);--text-2xs: 11px;--text-xs: 12px;--text-sm: 13px;--text-md: 14px;--text-base:16px;--text-lg: 18px;--text-xl: 20px;--text-2xl: 24px;--text-3xl: 30px;--text-4xl: 38px;--text-5xl: 48px;--text-6xl: 62px;--weight-regular: 400;--weight-medium: 500;--weight-semibold: 600;--weight-bold: 700;--leading-tight: 1.12;--leading-snug: 1.3;--leading-normal: 1.5;--leading-relaxed:1.65;--tracking-tight: -.02em;--tracking-normal: 0;--tracking-wide: .02em;--tracking-caps: .14em}:root{--space-0: 0;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 20px;--space-6: 24px;--space-7: 32px;--space-8: 40px;--space-9: 48px;--space-10: 64px;--space-11: 80px;--space-12: 96px;--radius-xs: 3px;--radius-sm: 5px;--radius-md: 8px;--radius-lg: 12px;--radius-xl: 16px;--radius-pill: 999px;--border-thin: 1px;--border-med: 1.5px;--border-thick:2px;--content-max: 1200px;--sidebar-w: 248px;--topbar-h: 56px;--page-gutter-x: 28px;--page-gutter-y: 24px;--touch-target: 44px;--safe-top: env(safe-area-inset-top, 0px);--safe-right: env(safe-area-inset-right, 0px);--safe-bottom: env(safe-area-inset-bottom, 0px);--safe-left: env(safe-area-inset-left, 0px)}@media (min-width: 768px) and (max-width: 1199px){:root{--sidebar-w: 72px;--page-gutter-x: 20px;--page-gutter-y: 20px}}@media (max-width: 767px){:root{--sidebar-w: 0px;--page-gutter-x: 14px;--page-gutter-y: 14px}}:root{--shadow-xs: 0 1px 1px rgba(35, 27, 15, .05);--shadow-sm: 0 1px 2px rgba(35, 27, 15, .06), 0 1px 1px rgba(35, 27, 15, .04);--shadow-md: 0 2px 4px rgba(35, 27, 15, .07), 0 4px 12px rgba(35, 27, 15, .06);--shadow-lg: 0 8px 24px rgba(35, 27, 15, .1), 0 2px 6px rgba(35, 27, 15, .06);--shadow-xl: 0 20px 48px rgba(35, 27, 15, .16), 0 4px 12px rgba(35, 27, 15, .08);--shadow-inset: inset 0 1px 2px rgba(35, 27, 15, .08);--shadow-gild: 0 1px 0 rgba(255, 253, 248, .6) inset, 0 0 0 1px var(--brass-300);--elevation-flat: none;--elevation-raised: var(--shadow-sm);--elevation-float: var(--shadow-md);--elevation-overlay:var(--shadow-lg);--elevation-modal: var(--shadow-xl);--ease-out: cubic-bezier(.22, .61, .36, 1);--ease-inout: cubic-bezier(.65, 0, .35, 1);--ease-fall: cubic-bezier(.55, .085, .68, .53);--dur-fast: .12s;--dur-base: .18s;--dur-slow: .28s;--transition-base: all var(--dur-base) var(--ease-out);--transition-fast: all var(--dur-fast) var(--ease-out)}*,*:before,*:after{box-sizing:border-box}body{margin:0;background:var(--surface-page);color:var(--text-body);font-family:var(--font-body);font-size:var(--text-base);line-height:var(--leading-normal);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1,h2,h3,h4{font-family:var(--font-display);color:var(--text-strong);line-height:var(--leading-tight);letter-spacing:var(--tracking-tight);font-weight:var(--weight-semibold);margin:0 0 var(--space-3)}p{margin:0 0 var(--space-3)}a{color:var(--text-link);text-decoration:none;border-bottom:1px solid color-mix(in srgb,var(--text-link) 35%,transparent);transition:var(--transition-fast)}a:hover{color:var(--wind-700);border-bottom-color:var(--wind-700)}code,kbd,samp,pre{font-family:var(--font-code);font-size:.92em}.hn-eyebrow{font-family:var(--font-mono);font-size:var(--text-2xs);font-weight:var(--weight-medium);letter-spacing:var(--tracking-caps);text-transform:uppercase;color:var(--text-muted)}::selection{background:var(--brass-100);color:var(--ink-900)}html,body{margin:0;height:100%;background:var(--surface-page)}#root{height:100vh;height:100dvh;overflow:hidden;max-width:100%}.hn-dynamic-viewport{height:100vh;height:100dvh;min-height:100vh;min-height:100dvh}button:focus-visible,a[href]:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,[role=button]:focus-visible,[role=tab]:focus-visible,[role=checkbox]:focus-visible,[role=radio]:focus-visible,[role=switch]:focus-visible{outline:2px solid var(--border-focus)!important;outline-offset:2px}.hn-select select:focus,.hn-select select:focus-visible{outline:none!important}.hn-shell{display:flex;width:100%;height:100%;min-width:0;min-height:0;overflow:hidden;background:var(--surface-page);color:var(--text-body)}.hn-shell-sidebar{width:var(--sidebar-w);flex:0 0 auto;display:flex;min-height:0;flex-direction:column;box-sizing:border-box;border-right:1px solid var(--border-hair);background:var(--bone-100);padding:18px 14px}.hn-shell-wordmark{padding:2px 4px 20px}.hn-shell-workspace{padding:0 10px 8px}.hn-shell-nav{display:flex;min-height:0;flex-direction:column;gap:2px;overflow-y:auto}.hn-shell-column{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column}.hn-shell-topbar{min-height:var(--topbar-h);flex:0 0 auto;display:flex;align-items:center;gap:16px;padding:0 22px;border-bottom:1px solid var(--border-hair);background:color-mix(in srgb,var(--bone-100) 80%,transparent);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);position:relative;z-index:90}.hn-shell-menu{display:none;width:var(--touch-target);height:var(--touch-target);flex:0 0 auto;align-items:center;justify-content:center;border:1px solid var(--border-hair);border-radius:var(--radius-sm);background:var(--surface-card);color:var(--text-body)}.hn-shell-heading{min-width:0}.hn-shell-tools{margin-left:auto;display:flex;min-width:0;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:10px}.hn-shell-search{width:220px}.hn-shell-main{flex:1;min-width:0;min-height:0;overflow-x:hidden;overflow-y:auto}.hn-shell-content{width:100%;min-width:0;min-height:100%;margin:0 auto;padding:var(--page-gutter-y) var(--page-gutter-x) calc(32px + var(--safe-bottom));box-sizing:border-box;display:flex;flex-direction:column}.hn-shell-backdrop{display:none}.hn-viewport-popover{box-sizing:border-box;max-width:calc(100vw - var(--safe-left) - var(--safe-right) - 28px)}.hn-modal-overlay{box-sizing:border-box;padding:calc(24px + var(--safe-top)) calc(24px + var(--safe-right)) calc(24px + var(--safe-bottom)) calc(24px + var(--safe-left))}.hn-modal-panel{min-width:0}.hn-modal-footer{flex-wrap:wrap;padding-bottom:calc(14px + var(--safe-bottom))}.hn-board-local-overflow{max-width:100%;overscroll-behavior-inline:contain}.hn-timeline-scroll{overscroll-behavior-inline:contain;-webkit-overflow-scrolling:touch}.hn-row-actions{flex-wrap:wrap}.hn-topbar-label-short{display:none}.hn-grid-mobile,.hn-stack-mobile,.hn-wrap-mobile,.hn-dense-row,.hn-vps-row{min-width:0}.hn-vps-row:hover{background:var(--surface-sunken)}.hn-vps-main{display:flex;align-items:center;gap:12px;min-width:0;flex-wrap:wrap}.hn-vps-actions{display:flex;align-items:center;gap:4px;margin-left:auto;flex-shrink:0}.hn-vps-sep{width:1px;height:18px;margin:0 4px;background:var(--border-hair)}@media (max-width: 1199px){.hn-vps-actions{flex-wrap:wrap;justify-content:flex-end}}.hn-nav-badge{margin-left:auto;flex-shrink:0;min-width:18px;height:18px;padding:0 5px;display:inline-flex;align-items:center;justify-content:center;background:var(--brass-700);color:var(--bone-000);border-radius:var(--radius-pill);font-family:var(--font-mono);font-size:var(--text-2xs);font-weight:var(--weight-semibold);line-height:1}@media (min-width: 768px) and (max-width: 1199px){.hn-shell-sidebar{width:var(--sidebar-w);padding:14px 8px}.hn-shell-sidebar .hn-nav-badge{margin-left:0}.hn-shell-sidebar .hn-nav-label,.hn-shell-sidebar .hn-shell-workspace,.hn-shell-sidebar .hn-shell-wordmark>div>div>span:last-child{display:none}.hn-shell-sidebar nav button{justify-content:center;padding-inline:0}.hn-shell-wordmark{display:flex;justify-content:center;padding-inline:0}}@media (max-width: 767px){.hn-shell-menu{display:inline-flex}.hn-shell-sidebar{position:fixed;z-index:120;inset:0 auto 0 0;width:min(320px,calc(100vw - 48px));padding:calc(14px + var(--safe-top)) 14px calc(14px + var(--safe-bottom)) calc(14px + var(--safe-left));box-shadow:var(--shadow-xl);transform:translate(-105%);transition:transform var(--transition-fast)}.hn-shell[data-nav-open=true] .hn-shell-sidebar{transform:translate(0)}.hn-shell-backdrop{display:block;position:fixed;z-index:119;top:0;right:0;bottom:0;left:0;width:100%;height:100%;border:0;background:color-mix(in srgb,var(--ink-900) 42%,transparent)}.hn-shell-topbar{align-items:flex-start;flex-wrap:wrap;gap:8px 10px;padding:calc(6px + var(--safe-top)) var(--page-gutter-x) 8px;-webkit-backdrop-filter:none;backdrop-filter:none}.hn-shell-heading{flex:1 1 calc(100% - 54px);align-self:center}.hn-shell-tools{flex:1 1 100%;margin-left:0;justify-content:flex-start;gap:6px}.hn-shell-search{flex:1 1 100%;width:100%}.hn-topbar-label{display:none}.hn-topbar-label-short{display:inline}.hn-shell button{min-width:var(--touch-target);min-height:var(--touch-target)}.hn-viewport-popover{position:fixed!important;inset:auto max(var(--page-gutter-x),var(--safe-right)) calc(var(--page-gutter-y) + var(--safe-bottom)) max(var(--page-gutter-x),var(--safe-left))!important;width:auto!important;max-width:none;max-height:calc(100dvh - var(--safe-top) - var(--safe-bottom) - var(--page-gutter-y) - var(--page-gutter-y))!important;overflow:auto}.hn-modal-overlay{align-items:flex-end!important;padding:var(--safe-top) var(--safe-right) var(--safe-bottom) var(--safe-left)}.hn-modal-panel{width:100%!important;max-width:100%!important;max-height:calc(100dvh - var(--safe-top) - var(--safe-bottom))!important;border-radius:var(--radius-lg) var(--radius-lg) 0 0!important}.hn-modal-header,.hn-modal-body,.hn-modal-footer{padding-inline:var(--page-gutter-x)!important}.hn-modal-footer>*{min-height:var(--touch-target)}.hn-stat-grid{grid-template-columns:repeat(2,minmax(0,1fr))!important}.hn-project-header{display:none!important}.hn-project-row{grid-template-columns:minmax(0,1fr)!important;align-items:stretch!important;gap:10px!important;margin-bottom:10px;padding:14px!important;border:1px solid var(--border-hair);border-left-width:3px;border-radius:var(--radius-md)}.hn-project-row>[data-label]{min-width:0}.hn-project-row>[data-label]:before{content:attr(data-label);display:block;margin-bottom:4px;color:var(--text-subtle);font:var(--weight-semibold) var(--text-2xs)/1.2 var(--font-mono);letter-spacing:.08em;text-transform:uppercase}.hn-project-row>[data-label=Aktivitas]{white-space:normal!important}.hn-backlog-topline,.hn-team-topline,.hn-backlog-view-actions,.hn-team-view-actions,.hn-backlog-filters,.hn-team-filters{align-items:stretch!important}.hn-backlog-topline>*,.hn-team-topline>*,.hn-backlog-view-actions>*,.hn-team-view-actions>*,.hn-backlog-filters>*,.hn-team-filters>*{max-width:100%}.hn-backlog-view-actions,.hn-team-view-actions{flex-wrap:wrap}.hn-backlog-filters .hn-touch-target,.hn-team-filters .hn-touch-target{flex:1 1 145px!important;width:auto!important}.hn-backlog-grid{grid-template-columns:minmax(0,1fr)!important}.hn-backlog-row{align-items:flex-start!important;flex-wrap:wrap}.hn-backlog-row>div{flex-basis:100%!important}.hn-card-footer{align-items:flex-start!important;flex-direction:column}.hn-grid-mobile{grid-template-columns:minmax(0,1fr)!important}.hn-stack-mobile{align-items:stretch!important;flex-direction:column}.hn-wrap-mobile,.hn-dense-row{align-items:flex-start!important;flex-wrap:wrap}.hn-vps-main{align-items:flex-start;gap:8px}.hn-vps-main>button{flex:1 1 100%}.hn-vps-pills{flex-wrap:wrap}.hn-vps-actions{margin-left:0;width:100%;justify-content:flex-start}.hn-vps-actions>button{flex:1 1 auto}.hn-vps-sep{display:none}.hn-dense-row>[style*="flex: 1"]{min-width:min(220px,100%)}.hn-picker-row{flex-wrap:wrap}.hn-picker-row>.hn-picker-title{order:2;flex:1 1 100%!important;min-width:100%!important;white-space:normal!important;overflow:visible!important}.hn-card-header{align-items:stretch!important;flex-direction:column}.hn-card-actions{max-width:100%}.hn-card-actions>*{max-width:100%}.hn-settings-layout{width:100%}.hn-portal-header{height:auto!important;min-height:var(--topbar-h);flex-wrap:wrap;padding:max(8px,var(--safe-top)) max(var(--page-gutter-x),var(--safe-right)) 8px max(var(--page-gutter-x),var(--safe-left))!important}.hn-portal-header>div{flex-basis:1px}.hn-portal-content{box-sizing:border-box;padding:16px max(var(--page-gutter-x),var(--safe-right)) calc(24px + var(--safe-bottom)) max(var(--page-gutter-x),var(--safe-left))!important}.hn-portal-toolbar{align-items:stretch!important;flex-direction:column}.hn-portal-row{align-items:flex-start!important;flex-wrap:wrap;min-height:var(--touch-target)}.hn-portal-row>span:nth-child(2){flex-basis:calc(100% - 110px)}}.hn-responsive-toolbar{display:flex;align-items:center;flex-wrap:wrap;gap:10px;min-width:0;max-width:100%}@media (max-width: 767px){.hn-setting-row{align-items:stretch!important;flex-direction:column}.hn-setting-control{width:100%}.hn-setting-control>.hn-touch-target,.hn-setting-control>div{width:100%!important;max-width:100%}.hn-setting-control>div{flex-wrap:wrap}.hn-setting-control>div>div.hn-touch-target{flex:1 1 200px;width:auto!important;max-width:100%}}.hn-local-overflow{max-width:100%;min-width:0;overflow:auto;overscroll-behavior-inline:contain;-webkit-overflow-scrolling:touch}.hn-tabs{max-width:100%;overflow-x:auto;overflow-y:hidden;overscroll-behavior-inline:contain}.hn-ide-head{display:flex;align-items:center;flex-wrap:wrap;gap:12px;min-width:0}.hn-ide-head>.hn-tabs{flex:0 0 auto}.hn-ide-toolbar{display:flex;align-items:center;flex:1 1 480px;flex-wrap:nowrap;gap:10px;min-width:0;max-width:100%;overflow-x:auto;overflow-y:hidden;overscroll-behavior-inline:contain}.hn-ide-toolbar>*{flex:0 0 auto}.hn-ide-toolbar>:first-child{margin-inline-start:auto}@media (pointer: coarse),(max-width: 767px){button:not(.hn-shell-backdrop){min-width:var(--touch-target);min-height:var(--touch-target)}input,select,textarea{min-width:var(--touch-target);min-height:var(--touch-target)}.hn-touch-target,.hn-project-open,.hn-terminal-unplaced-action,[role=button][tabindex="0"]{min-width:var(--touch-target)!important;min-height:var(--touch-target)!important}.hn-tabs [role=tab]{min-height:var(--touch-target)}.hn-choice-target{min-width:var(--touch-target);min-height:var(--touch-target)}.hn-choice-control{min-width:var(--touch-target);min-height:var(--touch-target);outline-offset:8px}}.hn-responsive-panels{display:flex;flex:1 1 auto;min-width:0;min-height:0;flex-direction:column;gap:12px}.hn-panel-switcher{flex:0 0 auto;max-width:100%;overflow-x:auto;overscroll-behavior-inline:contain}.hn-panels-grid{display:grid;grid-template-columns:minmax(0,1fr);flex:1 1 auto;min-width:0;min-height:0;gap:16px}.hn-responsive-panel{min-width:0;min-height:0}.hn-panel-flex{display:flex;min-width:0;min-height:0;flex-direction:column}.hn-panel-flex>*{min-width:0}.hn-graph-action{display:inline-grid;min-width:28px;min-height:28px;place-items:center;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);cursor:pointer}.hn-graph-action:hover{background:var(--bone-200)}.hn-terminal-actions{display:inline-flex;flex:0 0 auto;align-items:center;gap:2px}.hn-terminal-action{display:inline-grid;min-width:28px;min-height:28px;padding:0;place-items:center;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--text-subtle);font:inherit;cursor:pointer}.hn-terminal-action--text{padding-inline:5px}.hn-terminal-action:hover{background:var(--bone-300);color:var(--text-strong)}.hn-terminal-keys{display:flex;flex:0 0 auto;gap:4px;max-width:100%;padding:4px 2px;overflow-x:auto;overscroll-behavior-inline:contain;border-top:1px solid var(--border-hair)}.hn-terminal-key{flex:0 0 auto;min-width:40px;min-height:32px;padding:0 8px;border:1px solid var(--border-hair);border-radius:var(--radius-sm);background:var(--surface-card);color:var(--text-body);font:var(--weight-medium) var(--text-sm)/1 var(--font-mono);cursor:pointer}.hn-terminal-key:hover{background:var(--bone-200);color:var(--text-strong)}.hn-terminal-composer{display:flex;flex:0 0 auto;flex-wrap:wrap;align-items:center;gap:6px;padding:4px 2px;border-top:1px solid var(--border-hair)}.hn-terminal-composer-status{flex:0 0 auto;font:var(--text-xs)/1.2 var(--font-mono);color:var(--text-subtle);white-space:nowrap}.hn-terminal-composer-status--queued{color:var(--status-warn)}.hn-terminal-composer-status--held{color:var(--status-err)}@media (max-width: 767px){.hn-terminal-cell-header{flex-wrap:wrap}}@media (pointer: coarse),(max-width: 767px){.hn-graph-action,.hn-terminal-action,.hn-terminal-key,.hn-terminal-group-control{min-width:var(--touch-target);min-height:var(--touch-target)}}.hn-responsive-panel[aria-hidden=true]{display:none}@media (min-width: 768px){.hn-responsive-panels--tablet .hn-panel-switcher{display:none}.hn-responsive-panels--tablet .hn-panels-grid{grid-template-columns:minmax(0,var(--hn-master-width, 280px)) minmax(0,1fr)}.hn-responsive-panels--tablet .hn-responsive-panel[aria-hidden=true]{display:block}}@media (min-width: 1200px){.hn-responsive-panels--desktop .hn-panel-switcher{display:none}.hn-responsive-panels--desktop .hn-panels-grid{grid-template-columns:minmax(0,var(--hn-master-width, 300px)) minmax(0,1fr)}.hn-responsive-panels--desktop .hn-responsive-panel[aria-hidden=true]{display:block}}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation:none!important;scroll-behavior:auto!important;transition:none!important}}button{--accent-on: #fff}a{color:var(--text-link);text-decoration:none}a:hover{color:var(--wind-700);text-decoration:underline}.hn-md{color:var(--text-body);font-family:var(--font-sans);font-size:15px;line-height:1.72;overflow-wrap:anywhere}.hn-md>:first-child{margin-top:8px}.hn-md h1,.hn-md h2,.hn-md h3,.hn-md h4{font-family:var(--font-display);font-weight:600;letter-spacing:-.02em;color:var(--ink-900);line-height:1.2;margin:1.6em 0 .5em}.hn-md h1{font-size:30px;margin-top:.4em;padding-bottom:.34em;border-bottom:1px solid var(--border-hair)}.hn-md h2{font-size:22px}.hn-md h3{font-size:18px}.hn-md h4{font-size:15px}.hn-md p{margin:.7em 0}.hn-md ul,.hn-md ol{margin:.6em 0;padding-left:1.5em}.hn-md li{margin:.28em 0}.hn-md li::marker{color:var(--brass-500)}.hn-md ul.contains-task-list,.hn-md li.task-list-item{list-style:none}.hn-md li.task-list-item{padding-left:0}.hn-md input[type=checkbox]{accent-color:var(--brass-500);margin-right:8px;transform:translateY(1px)}.hn-md strong{font-weight:600;color:var(--ink-900)}.hn-md em{color:var(--text-muted)}.hn-md a{color:var(--text-link)}.hn-md hr{border:none;border-top:1px solid var(--border-hair);margin:1.6em 0}.hn-md code{font-family:var(--font-mono);font-size:.86em;background:var(--bone-200);color:var(--ink-800);padding:1.5px 5px;border-radius:var(--radius-xs);border:1px solid var(--border-hair)}.hn-md pre{background:var(--surface-code);border:1px solid var(--term-line);border-radius:var(--radius-lg);padding:14px 16px;overflow:auto;margin:1em 0;white-space:pre-wrap;overflow-wrap:anywhere}.hn-md pre code{background:transparent;border:none;padding:0;color:var(--term-fg);font-size:12.5px;line-height:1.7}.hn-md blockquote{margin:1em 0;padding:4px 16px;border-left:3px solid var(--brass-500);background:var(--brass-050);color:var(--text-body);border-radius:0 var(--radius-sm) var(--radius-sm) 0}.hn-md blockquote p{margin:.4em 0}.hn-md table{border-collapse:collapse;width:100%;margin:1em 0;font-size:14px;table-layout:fixed}.hn-md th,.hn-md td{overflow-wrap:anywhere}.hn-md th{font-family:var(--font-mono);font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted);text-align:left;padding:8px 12px;background:var(--bone-100);border:1px solid var(--border-hair)}.hn-md td{padding:8px 12px;border:1px solid var(--border-hair);color:var(--text-body)}.hn-md td code{font-size:.82em}.hn-md img{max-width:100%;border-radius:var(--radius-sm)}@keyframes hn-fade-in{0%{opacity:0}to{opacity:1}}@keyframes hn-modal-in{0%{opacity:0;transform:translateY(8px) scale(.99)}to{opacity:1;transform:none}}@keyframes hn-toast-in{0%{opacity:0;transform:translate(-50%,10px)}to{opacity:1;transform:translate(-50%)}}.hn-pet-reactor{transform-origin:50% 86%}.hn-pet-stage:not([data-reduced-motion=true]):hover .hn-pet-reactor{transform:translateY(-2px) scale(1.035) rotate(-1deg)}.hn-pet-rowshift{transform:translateY(calc(var(--row, 0) * -100%))}.hn-pet-hit{touch-action:none;user-select:none;-webkit-user-select:none}@keyframes hn-pet-frames{to{transform:translate(-100%)}}.hn-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}@keyframes hn-pet-click{0%,to{transform:translateY(0) scale(1) rotate(0)}38%{transform:translateY(2px) scale(.9,1.06) rotate(-2deg)}72%{transform:translateY(-3px) scale(1.06,.96) rotate(1.5deg)}}@keyframes hn-pet-panel-in{0%{opacity:0;transform:translateY(6px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes hn-pet-panel-out{0%{opacity:1;transform:translateY(0) scale(1)}to{opacity:0;transform:translateY(5px) scale(.985)}}@keyframes hn-pet-reveal{0%{opacity:0;transform:translateY(7px) scale(.86)}70%{opacity:1;transform:translateY(-1px) scale(1.035)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes hn-pet-bubble-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes hn-pet-heart{0%{opacity:0;transform:translateY(0) scale(.6)}30%{opacity:1;transform:translateY(-8px) scale(1)}to{opacity:0;transform:translateY(-26px) scale(.9)}}.hn-dalang{border:1px solid var(--border-hair);border-radius:var(--radius-lg);background:var(--surface-card);overflow:hidden;margin-bottom:20px}.hn-dalang-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:16px 20px 10px}.hn-dalang-stats{display:flex;gap:22px;flex-wrap:wrap}.hn-dalang-stat{text-align:right}.hn-dalang-stat>div:first-child{justify-content:flex-end}.hn-dalang-stage{position:relative;display:flex;align-items:flex-end;gap:16px;min-height:148px;padding:6px 20px 0;background:linear-gradient(180deg,var(--bone-000),var(--bone-200))}.hn-dalang-stage[data-live]{min-height:196px;padding-top:30px;background:radial-gradient(ellipse 85% 130% at 50% -25%,color-mix(in srgb,var(--brass-400) 24%,var(--term-bg)),var(--term-bg) 64%)}.hn-dalang-stage[data-live] .hn-dalang-mascot img{filter:drop-shadow(0 0 20px color-mix(in srgb,var(--bone-000) 32%,transparent))}.hn-dalang-stage[data-live] .hn-dalang-live{border-color:color-mix(in srgb,var(--brass-500) 45%,var(--term-line))}.hn-dalang-stage[data-live] .hn-dalang-live[data-waiting]{border-color:var(--amber-600)}.hn-dalang-stage[data-live] .hn-dalang-puppet img{filter:drop-shadow(0 0 10px color-mix(in srgb,var(--brass-300) 55%,transparent))}.hn-dalang-threads{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;pointer-events:none}.hn-dalang-threads path{fill:none;stroke:var(--brass-400);stroke-width:1.5;stroke-linecap:round;stroke-dasharray:5 9;opacity:.75;animation:hn-dalang-flow 1.4s linear infinite}@keyframes hn-dalang-flow{to{stroke-dashoffset:-28}}.hn-dalang-mascot{width:172px;flex:0 0 auto}.hn-dalang-blencong{height:44px;width:auto;flex:0 0 auto;pointer-events:none}.hn-dalang-blencong[data-lit]{filter:drop-shadow(0 0 14px color-mix(in srgb,var(--brass-400) 65%,transparent))}.hn-dalang-troupe{flex:1;display:flex;flex-wrap:wrap;gap:12px;align-items:flex-end;padding:4px 0 14px}.hn-dalang-live{-webkit-appearance:none;-moz-appearance:none;appearance:none;font:inherit;text-align:left;cursor:pointer;width:168px;background:var(--term-bg);border:1px solid var(--term-line);border-radius:var(--radius-md);padding:8px 12px 10px;box-shadow:var(--shadow-sm),0 0 16px color-mix(in srgb,var(--brass-500) 28%,transparent);transition:box-shadow var(--dur-base) var(--ease-out),transform var(--dur-base) var(--ease-out)}.hn-dalang-live:hover{transform:translateY(-2px);box-shadow:var(--shadow-md),0 0 22px color-mix(in srgb,var(--brass-500) 42%,transparent)}.hn-dalang-live:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}.hn-dalang-puppet{display:block;width:fit-content;margin:0 auto 6px;transform-origin:50% 100%;animation:hn-dalang-sway 3.8s var(--ease-inout) infinite alternate}@keyframes hn-dalang-sway{0%{transform:rotate(-2.4deg)}to{transform:rotate(2.4deg)}}.hn-dalang-puppet--still{animation:none;transform:rotate(-3deg)}.hn-dalang-live[data-waiting]{border-color:var(--amber-600);box-shadow:var(--shadow-sm),0 0 16px color-mix(in srgb,var(--amber-500) 30%,transparent)}.hn-dalang-empty{flex:1;padding:22px 0 26px}.hn-dalang-debog{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:10px 20px 12px;border-top:1px solid var(--border-hair);background:var(--bone-100)}.hn-dalang-parked{-webkit-appearance:none;-moz-appearance:none;appearance:none;font:inherit;cursor:pointer;display:inline-flex;align-items:center;gap:7px;padding:4px 12px 4px 8px;background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-pill);transition:border-color var(--dur-fast) var(--ease-out)}.hn-dalang-parked:hover{border-color:var(--bone-400)}.hn-dalang-parked:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}.hn-dlg{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;overflow-y:auto;overscroll-behavior:contain;background:linear-gradient(180deg,var(--term-bg),#0d0b07 60%);padding:20px 26px 12px;color:var(--term-fg);padding-bottom:max(12px,var(--safe-bottom, 0px))}.hn-dlg-top{display:flex;align-items:center;justify-content:space-between;gap:14px}.hn-dlg-blencong{height:44px;width:auto;flex:0 0 auto}.hn-dlg-blencong[data-lit]{filter:drop-shadow(0 0 12px rgba(207,157,85,.65))}.hn-dlg-title{font-family:var(--font-display);font-size:21px;font-weight:600;color:var(--term-fg);margin:0}.hn-dlg-boot{margin:4px 0 0;font-family:var(--font-mono);font-size:11px;letter-spacing:.06em;color:var(--brass-300);min-height:15px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.hn-dlg-boot:after{content:"▍";color:var(--brass-500);margin-left:2px;animation:hn-dlg-blink 1s steps(1) infinite}@keyframes hn-dlg-blink{50%{opacity:0}}.hn-dlg-chips{display:flex;gap:8px;flex:0 0 auto}.hn-dlg-chip{display:inline-flex;align-items:center;gap:7px;padding:7px 12px;border:1px solid var(--term-line);border-radius:var(--radius-md);background:#fffdf808;font-family:var(--font-mono);font-size:12px;color:var(--brass-300);white-space:nowrap;font-variant-numeric:tabular-nums}.hn-dlg-exit{-webkit-appearance:none;-moz-appearance:none;appearance:none;font:inherit;cursor:pointer;width:34px;height:34px;flex:none;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--term-line);border-radius:var(--radius-md);background:#fffdf808;color:var(--term-dim);transition:color var(--dur-fast) var(--ease-out),border-color var(--dur-fast) var(--ease-out)}.hn-dlg-exit:hover{color:var(--term-fg);border-color:var(--brass-700)}.hn-dlg-exit:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}.hn-dlg-kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-top:16px}.hn-dlg-kpi{display:flex;gap:11px;align-items:flex-start;min-width:0;padding:12px 14px;border:1px solid var(--term-line);border-radius:var(--radius-md);background:#fffdf808}.hn-dlg-kpi-ic{width:34px;height:34px;border-radius:var(--radius-sm);display:inline-flex;align-items:center;justify-content:center;flex:none}.hn-dlg-tone-wind{background:#517f8c2e;color:var(--wind-500)}.hn-dlg-tone-leaf{background:#5f83402e;color:var(--leaf-500)}.hn-dlg-tone-brass{background:#b8863b2e;color:var(--brass-400)}.hn-dlg-tone-amber{background:#cf8f282e;color:var(--amber-500)}.hn-dlg-kpi-l{display:block;font-family:var(--font-mono);font-size:9.5px;letter-spacing:.12em;color:var(--term-dim)}.hn-dlg-kpi-v{display:block;font-family:var(--font-display);font-size:25px;font-weight:700;line-height:1.15;color:var(--term-fg);font-variant-numeric:tabular-nums}.hn-dlg-kpi-s{display:block;font-size:10.5px;color:var(--term-dim);margin-top:1px}.hn-dlg-grid{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:14px;align-items:start;margin-top:14px}.hn-dlg-hero{position:relative;overflow:hidden;border:1px solid var(--term-line);border-radius:var(--radius-lg);background:radial-gradient(ellipse 75% 95% at 50% 0%,#cf9d5533,#0000 62%);padding:16px 16px 0}.hn-dlg-hud{position:absolute;left:50%;top:128px;transform:translate(-50%,-50%);width:300px;height:300px;pointer-events:none;opacity:.5}.hn-dlg-hud circle{fill:none;stroke:var(--brass-700);stroke-width:1}.hn-dlg-hud-a,.hn-dlg-hud-b{transform-origin:50% 50%}.hn-dlg-hud-a{animation:hn-dlg-rot 26s linear infinite}.hn-dlg-hud-b{animation:hn-dlg-rotr 40s linear infinite}@keyframes hn-dlg-rot{to{transform:rotate(360deg)}}@keyframes hn-dlg-rotr{to{transform:rotate(-360deg)}}.hn-dlg-threads{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;pointer-events:none}.hn-dlg-threads path{fill:none;stroke:var(--brass-500);stroke-width:1.4;stroke-linecap:round;stroke-dasharray:4 8;opacity:.8;animation:hn-dalang-flow 1.5s linear infinite}.hn-dlg-threads path.hn-dlg-thread--slack{stroke:var(--brass-700);stroke-dasharray:none;opacity:.3;animation:none}.hn-dlg-scan{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;background:linear-gradient(180deg,#0000,#cf9d550d 48%,#e3c98817,#cf9d550d 52%,#0000);background-size:100% 240px;background-repeat:no-repeat;background-position:0 -240px;animation:hn-dlg-scan 7s linear infinite}@keyframes hn-dlg-scan{0%{background-position:0 -240px}60%{background-position:0 460px}to{background-position:0 460px}}.hn-dlg-hero-art{position:relative;width:min(540px,94%);aspect-ratio:835 / 582;margin:0 auto;animation:hn-dlg-float 6s ease-in-out infinite}.hn-dlg-hero-art img{position:absolute;display:block;height:auto;filter:drop-shadow(0 0 18px rgba(212,164,60,.35))}.hn-dlg-rig-body{left:25.88%;top:16.32%;width:48.73%;z-index:2}.hn-dlg-rig-arm{z-index:1;will-change:transform}.hn-dlg-rig-arm--ul{left:5.48%;top:.39%;width:32.03%;transform-origin:85.5% 86.8%;animation:hn-dlg-arm-a 5s ease-in-out infinite}.hn-dlg-rig-arm--ur{left:61.65%;top:0%;width:30.82%;transform-origin:15.1% 87.1%;animation:hn-dlg-arm-b 5.6s ease-in-out infinite}.hn-dlg-rig-arm--ml{left:0%;top:58.84%;width:37.36%;transform-origin:89.2% 24.2%;animation:hn-dlg-arm-b 6.4s ease-in-out infinite}.hn-dlg-rig-arm--mr{left:61.8%;top:58.32%;width:38.2%;transform-origin:11.1% 24.3%;animation:hn-dlg-arm-a 7s ease-in-out infinite}@keyframes hn-dlg-arm-a{0%,to{transform:rotate(-2.5deg)}50%{transform:rotate(3deg)}}@keyframes hn-dlg-arm-b{0%,to{transform:rotate(2.5deg)}50%{transform:rotate(-3deg)}}.hn-dlg-hand{position:absolute;width:2px;height:2px;pointer-events:none}.hn-dlg-hand[data-hand=ul]{left:15.5%;top:9.9%}.hn-dlg-hand[data-hand=ur]{left:82.7%;top:9.6%}.hn-dlg-hand[data-hand=ml]{left:10.2%;top:76.1%}.hn-dlg-hand[data-hand=mr]{left:89.5%;top:75.5%}@keyframes hn-dlg-float{0%,to{transform:translateY(0)}50%{transform:translateY(-6px)}}.hn-dlg-cards{position:relative;display:flex;flex-wrap:wrap;gap:12px;align-items:stretch;justify-content:center;padding:18px 0 16px}.hn-dlg-prj{-webkit-appearance:none;-moz-appearance:none;appearance:none;font:inherit;text-align:left;cursor:pointer;width:168px;background:#0a0805d9;border:1px solid rgba(184,134,59,.45);border-radius:var(--radius-md);padding:8px 12px 10px;color:var(--term-fg);box-shadow:0 0 16px #b8863b38;transition:transform var(--dur-base) var(--ease-out),box-shadow var(--dur-base) var(--ease-out)}.hn-dlg-prj:hover{transform:translateY(-3px);box-shadow:0 0 24px #b8863b66}.hn-dlg-prj:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}.hn-dlg-prj[data-waiting]{border-color:var(--amber-600);box-shadow:0 0 16px #cf8f284d}.hn-dlg-prj--off{border-color:var(--term-line);box-shadow:none}.hn-dlg-prj--off:hover{box-shadow:0 0 14px #b8863b24}.hn-dlg-prj--off .hn-dlg-puppet img{filter:grayscale(.85) brightness(.55)}.hn-dlg-prj--off .hn-dlg-prj-name,.hn-dlg-prj-sub--off{color:var(--term-dim)}.hn-dlg-puppet{display:block;width:fit-content;margin:0 auto 6px;transform-origin:50% 0%;animation:hn-dalang-sway 3.6s var(--ease-inout) infinite alternate}.hn-dlg-puppet--still{animation:none;transform:rotate(-3deg)}.hn-dlg-puppet img{display:block;height:108px;width:auto;filter:drop-shadow(0 0 10px rgba(227,201,136,.5))}.hn-dlg-prj--off .hn-dlg-puppet img{height:88px}.hn-dlg-prj-name{display:block;font-family:var(--font-mono);font-size:12px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hn-dlg-prj-sub{display:block;font-family:var(--font-mono);font-size:10.5px;color:var(--brass-400);margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hn-dlg-prj-sub--amber{color:var(--amber-500)}.hn-dlg-empty{position:relative;text-align:center;padding:26px 0 30px;color:var(--term-dim);font-size:12.5px;line-height:1.7}.hn-dlg-cmd{-webkit-appearance:none;-moz-appearance:none;appearance:none;font:inherit;cursor:pointer;width:100%;margin-top:12px;display:flex;align-items:center;gap:12px;padding:11px 15px;text-align:left;border:1px solid var(--brass-700);border-radius:var(--radius-lg);background:linear-gradient(90deg,#d4a43c1f,#d4a43c08);color:var(--term-fg);transition:border-color var(--dur-base) var(--ease-out)}.hn-dlg-cmd:hover{border-color:var(--brass-500)}.hn-dlg-cmd:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}.hn-dlg-mic{position:relative;width:11px;height:11px;border-radius:50%;background:var(--brass-500);flex:none}.hn-dlg-mic:before{content:"";position:absolute;top:-5px;right:-5px;bottom:-5px;left:-5px;border-radius:50%;border:1px solid var(--brass-500);opacity:0;animation:hn-dlg-ping 1.8s ease-out infinite}@keyframes hn-dlg-ping{0%{transform:scale(.85);opacity:.8}70%{transform:scale(1.4);opacity:0}to{opacity:0}}.hn-dlg-cmd-t{font-family:var(--font-mono);font-size:12px;color:var(--term-dim);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hn-dlg-cmd-t b{color:var(--brass-300);font-weight:500}.hn-dlg-cmd-k{margin-left:auto;flex:none;font-family:var(--font-mono);font-size:10px;color:var(--term-dim);border:1px solid var(--term-line);border-radius:var(--radius-sm);padding:2px 8px}.hn-dlg-rail{display:flex;flex-direction:column;gap:12px;min-width:0}.hn-dlg-card{border:1px solid var(--term-line);border-radius:var(--radius-md);background:#fffdf808;padding:12px 14px}.hn-dlg-rt{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.12em;color:var(--brass-300);margin-bottom:9px}.hn-dlg-mut{font-size:12px;color:var(--term-dim)}.hn-dlg-act{display:flex;gap:9px;align-items:flex-start;padding:6px 0;border-bottom:1px solid var(--term-line);font-size:11.5px}.hn-dlg-act:last-of-type{border-bottom:0}.hn-dlg-dot{width:7px;height:7px;border-radius:50%;background:var(--term-line);flex:none;margin-top:4px}.hn-dlg-dot--on{background:var(--brass-500)}.hn-dlg-act-x{color:var(--term-dim);line-height:1.5;min-width:0;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.hn-dlg-act-x b{color:var(--term-fg);font-family:var(--font-mono);font-size:11px;font-weight:500}.hn-dlg-donut-wrap{display:flex;align-items:center;gap:12px}.hn-dlg-donut{position:relative;width:112px;height:112px;flex:none}.hn-dlg-ring{fill:none;stroke:var(--term-line)}.hn-dlg-seg{fill:none;transition:stroke-dasharray var(--dur-slow) var(--ease-out)}.hn-dlg-seg--wind{stroke:var(--wind-500)}.hn-dlg-seg--leaf{stroke:var(--leaf-500)}.hn-dlg-seg--amber{stroke:var(--amber-500)}.hn-dlg-seg--brass{stroke:var(--brass-400)}.hn-dlg-leg{display:flex;flex-direction:column;gap:6px;font-size:11px;color:var(--term-dim)}.hn-dlg-leg b{color:var(--term-fg)}.hn-dlg-leg i{display:inline-block;width:9px;height:9px;border-radius:3px;margin-right:7px}.hn-dlg-leg i.hn-dlg-seg--wind{background:var(--wind-500)}.hn-dlg-leg i.hn-dlg-seg--leaf{background:var(--leaf-500)}.hn-dlg-leg i.hn-dlg-seg--amber{background:var(--amber-500)}.hn-dlg-leg i.hn-dlg-seg--brass{background:var(--brass-400)}.hn-dlg-donut-c{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center}.hn-dlg-donut-c b{font-family:var(--font-display);font-size:23px;color:var(--term-fg);line-height:1}.hn-dlg-donut-c span{font-size:9.5px;color:var(--term-dim);margin-top:2px}.hn-dlg-chart{display:block;width:100%;height:auto}.hn-dlg-chart line{stroke:var(--term-line);stroke-width:.6}.hn-dlg-chart text{font-family:var(--font-mono);font-size:7.5px;fill:var(--term-dim)}.hn-dlg-chart circle{fill:var(--wind-500)}.hn-dlg-trend{fill:none;stroke:var(--wind-500);stroke-width:1.6}.hn-dlg-foot{text-align:center;font-family:var(--font-mono);font-size:10px;letter-spacing:.28em;color:var(--brass-700);padding:12px 0 4px}@media (max-width: 1199px){.hn-dlg-grid{grid-template-columns:1fr}}@media (max-width: 767px){.hn-dlg-kpis{grid-template-columns:repeat(2,minmax(0,1fr))}.hn-dlg-chips{display:none}.hn-dlg-hero-art{width:min(360px,100%)}}@media (max-width: 767px){.hn-dalang-head{flex-direction:column}.hn-dalang-stats{gap:16px}.hn-dalang-stat{text-align:left}.hn-dalang-stat>div:first-child{justify-content:flex-start}.hn-dalang-mascot{width:116px}.hn-dalang-blencong{display:none}.hn-dalang-live{width:100%}}/**
2
- * Copyright (c) 2014 The xterm.js authors. All rights reserved.
3
- * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
4
- * https://github.com/chjj/term.js
5
- * @license MIT
6
- *
7
- * Permission is hereby granted, free of charge, to any person obtaining a copy
8
- * of this software and associated documentation files (the "Software"), to deal
9
- * in the Software without restriction, including without limitation the rights
10
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
- * copies of the Software, and to permit persons to whom the Software is
12
- * furnished to do so, subject to the following conditions:
13
- *
14
- * The above copyright notice and this permission notice shall be included in
15
- * all copies or substantial portions of the Software.
16
- *
17
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
- * THE SOFTWARE.
24
- *
25
- * Originally forked from (with the author's permission):
26
- * Fabrice Bellard's javascript vt100 for jslinux:
27
- * http://bellard.org/jslinux/
28
- * Copyright (c) 2011 Fabrice Bellard
29
- * The original design remains. The terminal itself
30
- * has been extended to include xterm CSI codes, among
31
- * other features.
32
- */.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{font-family:monospace;-webkit-user-select:text;user-select:text;white-space:pre}.xterm .xterm-accessibility-tree>div{transform-origin:left;width:fit-content}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;background:#0000;transition:opacity .1s linear;z-index:11}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{position:absolute;display:none}.xterm .xterm-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow, #000) 0 6px 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px;box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}