hanoman 0.9.28 → 0.9.29

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.
Files changed (35) hide show
  1. package/README.md +5 -2
  2. package/dist/build-info.json +3 -3
  3. package/dist/cli.js +337 -90
  4. package/dist/server.js +2677 -1389
  5. package/docs/agent-integration.md +100 -6
  6. package/package.json +1 -1
  7. package/prisma/migrations/20261014130000_cron_report/migration.sql +19 -0
  8. package/prisma/schema.prisma +25 -0
  9. package/scripts/vps/provision.sh +26 -3
  10. package/web/assets/{DalangHanomanScreen-C3UMPHFg.js → DalangHanomanScreen-BMrikKnt.js} +1 -1
  11. package/web/assets/{DocPreviewModal-Bp5stb4M.js → DocPreviewModal-5j31WUwI.js} +1 -1
  12. package/web/assets/{DocsWorkspace-C9yFxK4D.js → DocsWorkspace-GkTrniF3.js} +1 -1
  13. package/web/assets/{IdeScreen-CRFRAP6E.js → IdeScreen-CAQfv1_e.js} +1 -1
  14. package/web/assets/LeadScreen-Da5-1FLe.js +1 -0
  15. package/web/assets/{ReviewScreen-CMHOlmgX.js → ReviewScreen-B8KHzQpd.js} +1 -1
  16. package/web/assets/SchedulerScreen-CBd4O5kw.js +1 -0
  17. package/web/assets/SettingsScreen-BxQ3CH2D.js +62 -0
  18. package/web/assets/{TeamScreen-D4tA34Mj.js → TeamScreen-P6vz88Pp.js} +1 -1
  19. package/web/assets/TerminalScreen-B_cagBZd.js +2 -0
  20. package/web/assets/{TriageScreen-B8ZCexaX.js → TriageScreen-IYkxyhdm.js} +1 -1
  21. package/web/assets/{VpsScreen-BCrLfZh7.js → VpsScreen-DFGT5S8Y.js} +2 -2
  22. package/web/assets/fields-CmVwp6QK.js +1 -0
  23. package/web/assets/{index-BqAP-VDq.css → index-0T3s-I82.css} +1 -1
  24. package/web/assets/index-C-iSWHn3.js +1012 -0
  25. package/web/assets/{live-DuBdI0MZ.js → live-lSo-u7M6.js} +1 -1
  26. package/web/assets/{sched-lead-shared-QqbtjoVv.js → sched-lead-shared-BTz6aILx.js} +1 -1
  27. package/web/assets/{scheduler-CQt-VP9-.css → scheduler-D64RlGvZ.css} +1 -1
  28. package/web/assets/settings-rebase-CPawFVpp.js +1 -0
  29. package/web/index.html +2 -2
  30. package/web/assets/LeadScreen-DfVUawoK.js +0 -1
  31. package/web/assets/SchedulerScreen-CK5QvX5c.js +0 -1
  32. package/web/assets/SettingsScreen-D7P5JgjU.js +0 -62
  33. package/web/assets/TerminalScreen-CKySL63X.js +0 -2
  34. package/web/assets/index-BRR3JL_o.js +0 -1012
  35. package/web/assets/settings-rebase-Cbh-JGJ-.js +0 -1
@@ -1,2 +1,2 @@
1
- import{a1 as be,h as g,v as fe,d as me,aU as E,aV as Y,j as e,M as ye,c as Oe,aW as ie,aS as ue,m as F,I as ne,x as Re,B as y,i as T,q as Se,r as Me,aX as Ue,aI as _e,e as G,f as X,aY as He,l as Fe,ap as Ke,R as We,X as qe,O as Ge,W as Xe}from"./index-BRR3JL_o.js";import{R as c}from"./react-DfGhg7ZW.js";import"./markdown-CWEY34jk.js";import"./xterm-3VOAfa_q.js";const Ye=10*6e4,we=(s,t)=>!!s.lastSeenAt&&t-new Date(s.lastSeenAt).getTime()<Ye;function he(s,t=Date.now()){const l=s.lastSeenAt?we(s,t)?{state:"done",text:"terhubung"}:{state:"gagal",text:"tidak terjangkau"}:{state:"todo",text:"belum terhubung"},o=s.lastAuditAt?{state:"done",text:`diaudit ${be(s.lastAuditAt,t)||"—"}`}:{state:"todo",text:"belum diaudit"},m=s.lastAuditAt&&s.hardened?{state:"done",text:"diperkuat"}:{state:"todo",text:"belum diperkuat"};return[{key:"terhubung",label:"Terhubung",...l},{key:"diaudit",label:"Diaudit",...o},{key:"diperkuat",label:"Diperkuat",...m}]}const Qe=(s,t)=>{const l=new Set(s);return l.size===new Set(t).size&&t.every(o=>l.has(o))};function ke(s,t){return s.length>0&&t!==null&&Qe(s,t)}const Je=s=>s==null?"Skor —":`Skor ${s}%`,Ze={pass:"check",fail:"x",warn:"alert-triangle",na:"minus",unknown:"circle"},es={pass:"var(--leaf-600)",fail:"var(--clay-600)",warn:"var(--status-warn)",na:"var(--text-subtle)",unknown:"var(--text-subtle)"},ss={critical:"var(--clay-600)",high:"var(--status-warn)",medium:"var(--text-subtle)",low:"var(--text-subtle)"},te={AUTO:"Otomatis",AUDIT:"Audit",INFO:"Info"};function re({text:s,color:t}){return e.jsx("span",{className:"vps-badge",style:{color:t,borderColor:t},children:s})}function Ne({score:s}){const t=s>=90?"vps-tone-ok":s>=50?"vps-tone-warn":"vps-tone-bad";return e.jsxs("div",{className:"vps-bar-wrap",children:[e.jsx("div",{className:"vps-bar",children:e.jsx("div",{className:`vps-bar-fill ${t}`,style:{width:`${s}%`}})}),e.jsxs("span",{className:"vps-bar-num",children:[s,"%"]})]})}function as({item:s,busy:t,selected:l,onToggle:o,onNa:m,onAttest:h}){const u=s.mode==="AUTO"&&!s.na,x=s.status==="fail"||s.status==="warn"||!!s.drifted;return e.jsxs("div",{"data-testid":`item-${s.id}`,title:`${te[s.mode]} · ${Y[s.severity]}`,className:`vps-item${s.na?" vps-item-na":""}`,children:[u?e.jsx("span",{className:"vps-touch",children:e.jsx("input",{type:"checkbox","aria-label":`Pilih ${s.title}`,checked:l,onChange:()=>o(s)})}):e.jsx("span",{className:"vps-item-gap"}),e.jsx(ne,{name:Ze[s.status],size:14,color:es[s.status]}),e.jsx("span",{className:"vps-item-title",children:s.title}),s.drifted&&e.jsx(re,{text:"drift",color:"var(--clay-600)"}),x&&e.jsx(re,{text:Y[s.severity],color:ss[s.severity]}),s.mode==="INFO"&&!s.attested&&e.jsx(y,{size:"sm",variant:"ghost",leftIcon:"check-circle",loading:t,onClick:()=>h(s),children:"Tandai terpenuhi"}),e.jsx(y,{size:"sm",variant:"ghost",leftIcon:s.na?"rotate-ccw":"minus-circle",loading:t,onClick:()=>m(s,!s.na),children:s.na?"Batal N/A":"N/A"})]})}const ce={section:"",mode:"",status:"",severity:""};function le({value:s,onChange:t,options:l,label:o}){return e.jsxs("select",{"aria-label":o,value:s,onChange:m=>t(m.target.value),className:"vps-select vps-touch-select",children:[e.jsxs("option",{value:"",children:[o,": semua"]}),l.map(([m,h])=>e.jsx("option",{value:m,children:h},m))]})}function ts(s){let t=0,l=0,o=0,m=0;for(const x of s)x.status==="fail"?t++:x.status==="warn"?l++:x.status==="unknown"&&o++,x.drifted&&m++;const h=x=>x.charAt(0).toLowerCase()+x.slice(1),u=[t&&`${t} ${h(E.fail)}`,l&&`${l} ${h(E.warn)}`,o&&`${o} ${h(E.unknown)}`].filter(Boolean);return{text:u.length?u.join(" · "):`semua ${h(E.pass)}`,drift:m}}function ns({section:s,items:t,expanded:l,onToggle:o,busy:m,selected:h,onToggleItem:u,onNa:x,onAttest:b,onSectionNa:j}){const p=ts(s.items),f=!!s.suggestion&&!s.suggestion.applicable;return e.jsxs("div",{className:"vps-section",children:[e.jsxs("button",{"data-testid":`section-${s.id}`,"aria-expanded":l,onClick:()=>o(s.id),className:`vps-section-head${l?" vps-section-open":""}`,children:[e.jsx(ne,{name:l?"chevron-down":"chevron-right",size:15,color:"var(--text-subtle)"}),e.jsx("span",{className:"vps-section-icon",children:s.icon}),e.jsx("span",{className:"vps-section-title",children:s.title}),e.jsx("span",{className:"vps-section-sum",children:p.text}),p.drift>0&&e.jsx(re,{text:"drift",color:"var(--clay-600)"}),f&&e.jsx(re,{text:"saran N/A",color:"var(--brass-700)"}),e.jsx(Ne,{score:s.score})]}),l&&e.jsxs("div",{className:"vps-section-body",children:[f&&e.jsxs("div",{"data-testid":`suggestion-${s.id}`,className:"vps-suggest",children:[e.jsx(ne,{name:"info",size:13,color:"var(--brass-700)"}),e.jsxs("span",{className:"vps-suggest-text",children:["Stack tak terdeteksi (",s.suggestion.detail,") — kemungkinan N/A. Cek Docker manual bila ragu."]}),e.jsx(y,{size:"sm",variant:"ghost",leftIcon:"minus-circle",loading:m===`section:${s.id}`,onClick:()=>j(s),children:"Tandai seksi N/A"})]}),t.map(S=>e.jsx(as,{item:S,busy:m===S.id,selected:h.has(S.id),onToggle:u,onNa:x,onAttest:b},S.id))]})]})}function is({vpsId:s,vpsName:t,lastAuditAt:l,health:o,summary:m,provisioning:h,access:u,onScore:x,onClose:b,onToast:j}){const[p,f]=c.useState(null),[S,L]=c.useState("loading"),[A,B]=c.useState(""),[N,R]=c.useState("ringkasan"),[d,z]=c.useState(ce),[K,W]=c.useState(""),[Q,q]=c.useState(new Set),[M,$]=c.useState(null),[C,O]=c.useState(new Set),[D,U]=c.useState(null),[J,a]=c.useState(""),v=c.useRef(x);v.current=x;const I=c.useCallback(()=>{L("loading"),g.vpsChecklist(s).then(i=>{var k;f(i),L("ready"),(k=v.current)==null||k.call(v,i.scoreTotal)}).catch(i=>{B(fe(i,"tak diketahui")),L("error")})},[s]);c.useEffect(()=>{I(),O(new Set),U(null),q(new Set),W(""),z(ce)},[I]);const Z=i=>{U(null),O(k=>{const r=new Set(k);return r.has(i.id)?r.delete(i.id):r.add(i.id),r})},_=()=>{O(new Set),U(null)},ee=i=>q(k=>{const r=new Set(k);return r.has(i)?r.delete(i):r.add(i),r}),{confirm:se,dialog:n}=me(),w=(D==null?void 0:D.forIds)??null,V=ke([...C],w);async function Ce(){const i=[...C];a("preview");try{U({steps:(await g.remediatePreview(s,i)).steps,forIds:i})}catch(k){j(T("membuat pratinjau remediasi",k),"err","x-circle")}finally{a("")}}async function Pe(){const i=[...C];if(!ke(i,w))return;const r=((p==null?void 0:p.sections.flatMap(P=>P.items))??[]).filter(P=>C.has(P.id));if(await se({title:`Terapkan ${i.length} item AUTO ke VPS ini?`,message:"Remediasi dijalankan langsung di server yang terdaftar.",impact:[...r.map(P=>`${P.id} · ${P.title}`),"Langkahnya idempoten dan anti-lockout.","Checklist diaudit ulang setelah selesai."],confirmLabel:"Terapkan",icon:"shield"})){a("apply");try{await g.remediate(s,i),_(),I(),j("Remediasi diterapkan · audit ulang","ok","shield")}catch(P){j(T("menerapkan remediasi",P),"err","x-circle")}finally{a("")}}}async function pe(i,k,r){$(i.id);try{await k(),I(),j(r,"ok","shield")}catch(P){j(T(`memperbarui ${i.id}`,P),"err","x-circle")}finally{$(null)}}const Ae=(i,k)=>pe(i,()=>g.markNa(s,i.id,k,k?"ditandai dari checklist":void 0),k?`${i.id} ditandai N/A`:`${i.id} kembali applicable`),Ie=i=>pe(i,()=>g.attestItem(s,i.id),`${i.id} ditandai terpenuhi`);async function Le(i){const k=i.items.map(r=>r.id);if(await se({title:`Tandai ${k.length} item seksi "${i.title}" sebagai N/A?`,message:"Stack-nya tak terdeteksi — cek Docker manual bila ragu.",confirmLabel:"Tandai N/A",icon:"shield"})){$(`section:${i.id}`);try{await g.markNaBulk(s,k,!0,"app-layer: stack tak terdeteksi"),I(),j(`Seksi ${i.title} ditandai N/A`,"ok","shield")}catch(r){j(T(`menandai seksi ${i.title} sebagai N/A`,r),"err","x-circle")}finally{$(null)}}}const ae=K.trim().toLowerCase(),oe=!!(d.section||d.mode||d.status||d.severity)||ae!=="",Ve=i=>(!d.section||i.section===d.section)&&(!d.mode||i.mode===d.mode)&&(!d.status||i.status===d.status)&&(!d.severity||i.severity===d.severity)&&(!ae||i.title.toLowerCase().includes(ae)||i.id.toLowerCase().includes(ae)||(i.code??"").toLowerCase().includes(ae)),H=i=>k=>z(r=>({...r,[i]:k})),Te=i=>{var k;return((k=p==null?void 0:p.sections.find(r=>r.id===i))==null?void 0:k.title)??i},De=[...d.section?[{key:"section",label:`Seksi: ${Te(d.section)}`,onRemove:()=>H("section")("")}]:[],...d.mode?[{key:"mode",label:`Mode: ${te[d.mode]}`,onRemove:()=>H("mode")("")}]:[],...d.status?[{key:"status",label:`Status: ${E[d.status]}`,onRemove:()=>H("status")("")}]:[],...d.severity?[{key:"severity",label:`Severity: ${Y[d.severity]}`,onRemove:()=>H("severity")("")}]:[]],Be=()=>{z(ce),W("")};function ze(){if(S==="loading")return e.jsx(F,{kind:"loading",compact:!0,title:"Memuat checklist…"});if(S==="error"||!p)return e.jsx(F,{kind:"error",compact:!0,title:"Gagal memuat checklist",hint:A,action:I});const i=p.sections.reduce((r,P)=>r+P.items.filter(Ee=>Ee.drifted).length,0),k=p.sections.map(r=>({section:r,matched:r.items.filter(Ve)})).filter(r=>!oe||r.matched.length>0);return e.jsxs("div",{children:[e.jsxs("div",{className:"vps-check-head",children:[e.jsxs("div",{className:"vps-check-score",children:[e.jsxs("span",{"data-testid":"score-total",className:"vps-check-score-num",children:[p.scoreTotal,"%"]}),e.jsx("div",{className:"vps-check-score-bar",children:e.jsx(Ne,{score:p.scoreTotal})}),e.jsx(ue,{size:11,tone:"subtle",children:"skor kepatuhan"})]}),i>0&&e.jsxs("div",{"data-testid":"drift-summary",className:"vps-drift",children:[e.jsx(ne,{name:"alert-triangle",size:14,color:"var(--clay-600)"}),i," item drift (regresi) sejak audit sebelumnya"]}),e.jsx(Re,{label:"Filter checklist",search:{value:K,onChange:W,label:"cari item",placeholder:"mis. ssh atau 5.2.1"},chips:De,filtersLabel:"Filter",onReset:Be,filters:e.jsxs("div",{className:"vps-filter-fields",children:[e.jsx(le,{label:"seksi",value:d.section,onChange:H("section"),options:p.sections.map(r=>[r.id,r.title])}),e.jsx(le,{label:"mode",value:d.mode,onChange:H("mode"),options:[["AUTO",te.AUTO],["AUDIT",te.AUDIT],["INFO",te.INFO]]}),e.jsx(le,{label:"status",value:d.status,onChange:H("status"),options:[["pass",E.pass],["fail",E.fail],["warn",E.warn],["na",E.na],["unknown",E.unknown]]}),e.jsx(le,{label:"severity",value:d.severity,onChange:H("severity"),options:[["critical",Y.critical],["high",Y.high],["medium",Y.medium],["low",Y.low]]})]})}),C.size>0&&e.jsxs("div",{className:"vps-remedi",role:"group","aria-label":"Alur perbaikan",children:[e.jsxs("ol",{className:"vps-remedi-steps",children:[e.jsxs("li",{"data-state":"done",children:["1 Pilih · ",C.size," item AUTO"]}),e.jsx("li",{"data-state":D?"done":"active",children:"2 Pratinjau"}),e.jsx("li",{"data-state":V?"active":"todo",children:"3 Terapkan"})]}),e.jsxs("div",{className:"vps-remedi-actions",children:[e.jsx(y,{size:"sm",variant:"secondary",leftIcon:"eye",loading:J==="preview",onClick:Ce,children:"Pratinjau"}),e.jsx(y,{size:"sm",leftIcon:"shield",loading:J==="apply",disabled:!V,onClick:Pe,children:"Terapkan"}),e.jsx(y,{size:"sm",variant:"ghost",onClick:_,children:"Batal"})]}),!V&&e.jsx("div",{className:"vps-remedi-hint",children:"Buat pratinjau dulu. Terapkan hanya memakai pratinjau untuk pilihan ini."})]}),D&&e.jsxs("div",{"data-testid":"remediate-preview",className:"vps-preview",children:[e.jsx("div",{className:"vps-preview-title",children:"Pratinjau (dry-run) — belum diterapkan. Mengubah pilihan membatalkannya."}),D.steps.map(r=>e.jsxs("div",{className:"vps-preview-line",children:[r.item," · ",r.status," ",r.detail]},r.item))]})]}),k.length===0?e.jsx(F,{kind:"empty",compact:!0,title:"Tidak ada item cocok",hint:"Ubah kata kunci atau reset filter."}):k.map(({section:r,matched:P})=>e.jsx(ns,{section:r,items:oe?P:r.items,expanded:oe?!0:Q.has(r.id),onToggle:ee,busy:M,selected:C,onToggleItem:Z,onNa:Ae,onAttest:Ie,onSectionNa:Le},r.id))]})}return e.jsxs(ye,{open:!0,width:960,icon:"clipboard-list",eyebrow:"Detail server",title:t??"VPS",onClose:b,children:[e.jsxs(Oe,{"aria-label":"Bagian detail VPS",value:N,className:"vps-tabs",tabs:[{value:"ringkasan",label:"Ringkasan"},{value:"checklist",label:"Checklist"},{value:"pemasangan",label:"Pemasangan"},{value:"akses",label:"Akses"}],onChange:i=>R(i),children:[e.jsx(ie,{value:"ringkasan",children:e.jsxs("div",{className:"vps-summary",children:[e.jsxs("div",{"data-testid":"vps-detail",className:"vps-detail-meta",children:[l?`Audit terakhir ${be(l)||"—"}`:"Belum pernah diaudit",o&&` · disk ${o.disk} · mem ${o.mem} · load ${o.load}`]}),p&&e.jsxs("div",{className:"vps-summary-score",children:[e.jsx(ue,{size:12,tone:"muted",children:"Skor kepatuhan"}),e.jsxs("span",{"data-testid":"ringkasan-score",className:"vps-summary-score-num",children:[p.scoreTotal,"%"]})]}),m]})}),e.jsx(ie,{value:"checklist",children:ze()}),e.jsx(ie,{value:"pemasangan",children:e.jsx("div",{"data-testid":"vps-provisioning",children:h??e.jsx(F,{kind:"empty",compact:!0,title:"Pemasangan belum tersedia"})})}),e.jsx(ie,{value:"akses",children:u??e.jsx(F,{kind:"empty",compact:!0,title:"Akses belum tersedia"})})]}),n]})}const xe=He;function ls(s,t){if(t.status==="partial"&&t.detail.startsWith("not-logged-in"))return`${s} · belum login`;if(t.status==="partial")return`${s} · ${t.detail||xe.partial}`;const l=t.status==="ok"&&t.detail?` ${t.detail}`:"";return`${s} · ${Fe(xe,t.status)}${l}`}const rs={lab:"Uji coba: komponen dipasang langsung di host ini.",production:"Produksi: agen dipasang ke dalam image terisolasi; sebagian komponen tak tersedia di profil ini."};function os({status:s,children:t,title:l}){return e.jsxs("span",{title:l,className:"vps-prov-chip",children:[e.jsx("span",{"aria-hidden":!0,className:"vps-prov-dot","data-status":s}),t]})}function $e({components:s,checkedAt:t}){return!s||!t?e.jsx("span",{className:"vps-prov-hint",children:"Komponen belum diperiksa"}):e.jsxs("div",{className:"vps-prov-badges",children:[Object.entries(s).map(([l,o])=>e.jsx(os,{status:o.status,children:ls(l,o)},l)),e.jsxs("span",{className:"vps-prov-hint",children:["diperiksa ",new Date(t).toLocaleString("id-ID")]})]})}function cs(s,t,l){const o=new Map(t.map(u=>[u.id,u])),m=new Set,h=u=>{var x;if(!m.has(u)){m.add(u);for(const b of((x=o.get(u))==null?void 0:x.requires[l])??[])h(b)}};for(const u of s)h(u);return m}function ds({vps:s,onToast:t,onGotoTerminal:l}){const[o,m]=c.useState([]),[h,u]=Se("vps",`provisionProfile@${s.id}`,"lab",Me("lab","production")),[x,b]=c.useState(new Set),[j,p]=c.useState(""),[f,S]=c.useState(null),[L,A]=c.useState(null),[B,N]=c.useState(null),[R,d]=c.useState(null),[z,K]=c.useState(!1),{confirm:W,dialog:Q}=me();c.useEffect(()=>{g.listVpsComponents().then(n=>m(n.components)).catch(()=>m([]))},[]);const q=o.filter(n=>n.profiles.includes(h)),M=cs(x,o,h),$=[...M],C=$.some(n=>{var w;return(w=o.find(V=>V.id===n))==null?void 0:w.needsDomain}),O=$.length>0&&(!C||j.trim().length>0),D=$.length===0?"Pilih minimal satu komponen.":C&&!j.trim()?"Isi domain dulu — komponen yang dipilih membutuhkannya.":null;function U(n){b(w=>{const V=new Set(w);return V.has(n)?V.delete(n):V.add(n),V})}async function J(){d("probe");try{A(await g.probeVps(s.id)),t("Komponen diperiksa","ok","server")}catch(n){t(T("memeriksa komponen",n),"err","x-circle")}finally{d(null)}}async function a(){d("preview");try{S((await g.provisionPreview(s.id,{items:$,profile:h,domain:j||void 0})).steps)}catch(n){t(T("membuat pratinjau",n),"err","x-circle")}finally{d(null)}}async function v(){if(await W({title:`Pasang ${$.length} komponen di "${s.name}"?`,message:`Profil ${h}. Langkah dijalankan lewat SSH dan bisa memakan beberapa menit.`,impact:$.map(n=>{var w;return((w=o.find(V=>V.id===n))==null?void 0:w.label)??n}),confirmLabel:"Pasang",icon:"server"})){d("apply");try{const n=await g.provisionVps(s.id,{items:$,profile:h,domain:j||void 0,confirm:!0});S(n.steps),A({components:n.components,checkedAt:n.checkedAt}),N(n.setup),t("Provisioning selesai","ok","server")}catch(n){t(T("memasang komponen",n),"err","x-circle")}finally{d(null)}}}const I=async()=>{try{const{id:n}=await g.vpsConsole(s.id);l(n)}catch(n){t(T("membuka console",n),"err","x-circle")}},Z=async n=>{if(!navigator.clipboard){t("Salin tak tersedia di browser ini. Pilih tautannya lalu salin manual.","err","x-circle");return}try{await navigator.clipboard.writeText(n),K(!0),window.setTimeout(()=>K(!1),2e3)}catch(w){t(T("menyalin tautan",w),"err","x-circle")}},_=L?Object.fromEntries(L.components.map(n=>[n.id,{status:n.status,detail:n.detail}])):s.components??null,ee=(L==null?void 0:L.checkedAt)??s.componentsCheckedAt??null,se=_?Object.entries(_).filter(([,n])=>n.status==="partial"&&n.detail.startsWith("not-logged-in")):[];return e.jsxs("div",{className:"vps-prov",children:[e.jsxs("div",{className:"vps-prov-row",children:[e.jsx($e,{components:_,checkedAt:ee}),e.jsx(y,{size:"sm",variant:"ghost",onClick:J,disabled:R!==null,children:"Periksa"})]}),e.jsxs("fieldset",{className:"vps-prov-fieldset",children:[e.jsx("legend",{className:"vps-prov-legend",children:"Profil"}),e.jsx("div",{className:"vps-prov-profiles",children:["lab","production"].map(n=>e.jsxs("div",{children:[e.jsx(Ue,{"aria-label":n,label:n,checked:h===n,onChange:()=>u(n)}),e.jsx("div",{className:"vps-prov-profile-hint",children:rs[n]})]},n))})]}),e.jsx("div",{className:"vps-prov-items",children:q.map(n=>{const w=M.has(n.id)&&!x.has(n.id);return e.jsxs("div",{className:"vps-prov-item",children:[e.jsx(_e,{"aria-label":n.label,label:n.label,checked:M.has(n.id),disabled:w,onChange:()=>U(n.id)}),w&&e.jsx("span",{className:"vps-prov-tag",children:"prasyarat"})]},n.id)})}),C&&e.jsx(G,{label:"Domain",hint:"A record harus sudah menunjuk ke IP VPS ini",children:e.jsx(X,{"aria-label":"Domain",value:j,onChange:n=>p(n.currentTarget.value),placeholder:"hanoman.contoh.id"})}),e.jsxs("div",{className:"vps-prov-row",children:[e.jsx(y,{variant:"ghost",onClick:a,disabled:!O||R!==null,children:"Pratinjau"}),e.jsx(y,{onClick:v,disabled:!O||R!==null,children:"Pasang"}),!O&&D&&e.jsx("span",{className:"vps-prov-reason",children:D})]}),e.jsx("div",{"aria-live":"polite",children:f&&e.jsx("pre",{tabIndex:0,"aria-label":"Hasil langkah provisioning",className:"vps-prov-steps",children:f.map(n=>`${n.item.padEnd(14)} ${n.status.padEnd(6)} ${n.detail}`).join(`
2
- `)})}),B&&e.jsxs("div",{className:"vps-prov-setup",children:[e.jsx("strong",{className:"vps-prov-setup-title",children:"Buat admin pertama"}),e.jsx("a",{href:B.url,target:"_blank",rel:"noreferrer",className:"vps-prov-setup-link",children:B.url}),e.jsxs("span",{className:"vps-prov-hint",children:["berlaku sampai ",new Date(B.expiresAt).toLocaleTimeString("id-ID")]}),e.jsx("div",{children:e.jsx(y,{size:"sm",variant:"ghost",onClick:()=>void Z(B.url),children:z?"Tersalin":"Salin"})})]}),se.length>0&&e.jsxs("div",{className:"vps-prov-pending",children:[e.jsx(ne,{name:"alert-triangle"}),e.jsxs("span",{children:[se.map(([n])=>n).join(", ")," terpasang tapi belum login."]}),e.jsx(y,{size:"sm",variant:"ghost",onClick:I,children:"Login lewat Console"})]}),Q]})}const js=(s,t=Date.now())=>we(s,t),gs=s=>s.lastAuditAt?s.hardened?"hardened":"belum":"unknown";function ve(s){const t={name:s.name.trim(),host:s.host.trim(),user:s.user.trim(),port:Number(s.port)||22};return s.keyPath.trim()&&(t.keyPath=s.keyPath.trim()),s.password&&(t.password=s.password),t}const us="opsional — dipakai sekali untuk memasang key hanoman, tidak disimpan";function de({open:s,title:t,submitLabel:l,initial:o,onClose:m,onSubmit:h}){const[u,x]=c.useState(o);c.useEffect(()=>{s&&x(o)},[s,o]);const b=p=>f=>x(S=>({...S,[p]:f.target.value})),j=!!(u.name.trim()&&u.host.trim()&&u.user.trim());return e.jsxs(ye,{open:s,onClose:m,icon:"server",eyebrow:"infra",title:t,footer:e.jsxs(e.Fragment,{children:[e.jsx(y,{variant:"ghost",size:"sm",onClick:m,children:"Batal"}),e.jsx(y,{size:"sm",leftIcon:"check",onClick:()=>j&&h(u),children:l})]}),children:[e.jsx(G,{label:"Nama",children:e.jsx(X,{value:u.name,onChange:b("name"),placeholder:"mis. web-1",style:{width:"100%"}})}),e.jsx(G,{label:"Host",hint:"hostname atau IP — tanpa user@",children:e.jsx(X,{value:u.host,onChange:b("host"),mono:!0,placeholder:"203.0.113.10",style:{width:"100%"}})}),e.jsxs("div",{className:"hn-grid-mobile vps-form-pair",children:[e.jsx(G,{label:"User SSH",hint:"root atau user ber-passwordless-sudo",children:e.jsx(X,{value:u.user,onChange:b("user"),mono:!0,placeholder:"deploy",style:{width:"100%"}})}),e.jsx(G,{label:"Port",children:e.jsx(X,{value:u.port,onChange:b("port"),mono:!0,placeholder:"22",style:{width:"100%"}})})]}),e.jsx(G,{label:"Password SSH",hint:us,children:e.jsx(X,{type:"password",value:u.password,onChange:b("password"),placeholder:"••••••••",style:{width:"100%"}})}),e.jsx(G,{label:"Key path",hint:"kosongkan bila memakai password di atas, atau key default mesin server",children:e.jsx(X,{value:u.keyPath,onChange:b("keyPath"),mono:!0,placeholder:"~/.ssh/id_ed25519",style:{width:"100%"}})})]})}const je={name:"",host:"",user:"",port:"22",keyPath:"",password:""},ms=s=>({name:s.name,host:s.host,user:s.user,port:String(s.port),keyPath:s.keyPath??"",password:""});function ge({steps:s,name:t}){return e.jsx("ol",{className:"vps-stepper","aria-label":`Kemajuan ${t}`,children:s.map(l=>e.jsxs("li",{className:`vps-step vps-step-${l.state}`,children:[e.jsx("span",{className:"vps-step-label",children:l.label}),e.jsx("span",{className:"vps-step-text",children:l.text})]},l.key))})}function bs({onToast:s,onGotoTerminal:t}){const[l,o]=c.useState([]),[m,h]=c.useState("loading"),[u,x]=c.useState(""),[b,j]=c.useState(null),[p,f]=c.useState(null),[S,L]=Se("vps","detailId",null,Xe),A=c.useMemo(()=>l.find(a=>a.id===S)??null,[l,S]),B=c.useCallback(a=>L(a?a.id:null),[L]),N=c.useCallback(()=>{g.listVps().then(a=>{o(a),h("ready")}).catch(a=>{x(fe(a,"tak diketahui")),h("error")})},[]);c.useEffect(()=>(N(),Ke(a=>{a.t==="vps"&&(o(a.vps),h("ready"))})),[N]);const{confirm:R,dialog:d}=me();async function z(a,v,I,Z,_){j(`${a}:${v}`);try{await I(),N(),s(Z,"ok","server")}catch(ee){s(T(_,ee),"err","x-circle")}finally{j(null)}}const K=async a=>{j(`audit:${a.id}`);try{await g.auditVps(a.id),N(),s(`${a.name} · audit selesai`,"ok","server")}catch(v){s(T("menjalankan audit",v),"err","x-circle")}finally{j(null)}};async function W(a){await R({title:`Harden "${a.name}"?`,message:"Pastikan akses key SSH non-password kamu sudah bekerja sebelum melanjutkan.",impact:[`Firewall: izinkan ${a.port}/80/443.`,"fail2ban & auto security update dipasang.","PermitRootLogin & PasswordAuthentication dimatikan.","NTP disinkronkan."],confirmLabel:"Harden",icon:"shield"})&&z("harden",a.id,()=>g.hardenVps(a.id),`${a.name} · harden selesai`,"menjalankan harden")}const Q=a=>z("sesi",a.id,async()=>{const{id:v}=await g.vpsSession(a.id);t(v)},`${a.name} · sesi Claude dibuka`,"membuka sesi Claude"),q=a=>z("test",a.id,async()=>{const v=await g.testVps(a.id);if(!v.ok)throw new Error(v.out)},`${a.name} · koneksi ok`,"tes koneksi"),M=a=>z("console",a.id,async()=>{const{id:v}=await g.vpsConsole(a.id);t(v)},`${a.name} · console dibuka`,"membuka console");async function $(a){try{if(!await R({title:`Hapus registrasi VPS "${a.name}"?`,message:"Server-nya sendiri tak disentuh — hanya pendaftarannya di dashboard ini yang dihapus.",confirmLabel:"Hapus registrasi",run:()=>g.deleteVps(a.id)}))return;N(),s(`${a.name} dihapus dari daftar`,"ok","check")}catch(v){s(T("menghapus registrasi VPS",v),"err","x-circle")}}async function C(a){try{const v=await g.createVps(ve(a));f(null),N(),s(a.password?`${v.name} terdaftar · key hanoman terpasang · password dibuang`:`${v.name} terdaftar · jalankan audit`,"ok","server")}catch{s("Gagal mendaftarkan VPS — cek host/user, atau password SSH-nya","err","x-circle")}}async function O(a,v){try{const I=await g.updateVps(a.id,ve(v));f(null),N(),s(v.password?`${I.name} diperbarui · key hanoman terpasang · password dibuang`:`${I.name} diperbarui`,"ok","server")}catch{s("Gagal memperbarui VPS","err","x-circle")}}const D=a=>[{key:"tes",label:"Tes koneksi",icon:"plug-zap",onSelect:()=>void q(a)},{key:"console",label:"Buka console",icon:"terminal-square",onSelect:()=>void M(a)},{key:"sesi",label:"Sesi Claude",icon:"terminal",onSelect:()=>void Q(a)},{key:"edit",label:"Edit",icon:"pencil",onSelect:()=>f(a)},{key:"harden",label:"Harden",icon:"shield",tone:"danger",onSelect:()=>void W(a)},{key:"hapus",label:"Hapus registrasi",icon:"trash-2",tone:"danger",onSelect:()=>void $(a)}],U=a=>e.jsxs(e.Fragment,{children:[e.jsx(ge,{steps:he(a),name:a.name}),e.jsx("div",{className:"vps-summary-comp",children:e.jsx($e,{components:a.components??null,checkedAt:a.componentsCheckedAt??null})})]}),J=a=>e.jsxs("div",{className:"vps-access",children:[e.jsxs("dl",{className:"vps-access-list",children:[e.jsxs("div",{children:[e.jsx("dt",{children:"Host"}),e.jsx("dd",{children:a.host})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"User SSH"}),e.jsx("dd",{children:a.user})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Port"}),e.jsx("dd",{children:a.port})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Key"}),e.jsx("dd",{children:a.keyPath??"key default mesin server"})]})]}),e.jsxs("div",{className:"vps-access-actions",children:[e.jsx(y,{size:"sm",variant:"secondary",leftIcon:"plug-zap",loading:b===`test:${a.id}`,onClick:()=>void q(a),children:"Tes koneksi"}),e.jsx(y,{size:"sm",variant:"secondary",leftIcon:"terminal-square",loading:b===`console:${a.id}`,onClick:()=>void M(a),children:"Buka console"}),e.jsx(y,{size:"sm",variant:"secondary",leftIcon:"terminal",loading:b===`sesi:${a.id}`,onClick:()=>void Q(a),children:"Sesi Claude"}),e.jsx(y,{size:"sm",variant:"ghost",leftIcon:"pencil",onClick:()=>f(a),children:"Edit"})]})]});return m==="loading"?e.jsx(F,{kind:"loading",title:"Memuat daftar VPS…"}):m==="error"?e.jsx(F,{kind:"error",title:"Gagal memuat daftar VPS",hint:`Alasan: ${u}. Pastikan server hanoman berjalan.`,action:N}):l.length===0?e.jsxs(e.Fragment,{children:[e.jsx(F,{kind:"empty",icon:"server",title:"Belum ada VPS",hint:"Daftarkan VPS untuk mulai audit & hardening.",action:()=>f("new"),actionLabel:"Daftarkan VPS"}),e.jsx(de,{open:p==="new",title:"Daftarkan VPS",submitLabel:"Daftarkan",initial:je,onClose:()=>f(null),onSubmit:C})]}):e.jsxs("div",{className:"vps-screen",children:[e.jsxs("div",{className:"vps-toolbar",children:[e.jsxs(ue,{size:12,tone:"muted",children:[l.length," VPS terdaftar"]}),e.jsx(y,{size:"sm",leftIcon:"plus",onClick:()=>f("new"),children:"Daftarkan VPS"})]}),e.jsx(We,{label:"Daftar VPS",children:l.map(a=>e.jsx(qe,{actions:e.jsxs(e.Fragment,{children:[e.jsx(y,{size:"sm",leftIcon:"radar",loading:b===`audit:${a.id}`,onClick:()=>void K(a),children:"Periksa"}),e.jsx(Ge,{label:`Aksi lain untuk ${a.name}`,title:a.name,items:D(a)})]}),children:e.jsxs("div",{className:"vps-row",children:[e.jsxs("button",{type:"button","aria-label":`Buka detail ${a.name}`,className:"vps-row-open",onClick:()=>B(a),children:[e.jsx("span",{className:"vps-row-name",children:a.name}),e.jsxs("span",{className:"vps-row-addr",children:[a.user,"@",a.host,a.port!==22?`:${a.port}`:""]})]}),e.jsx(ge,{steps:he(a),name:a.name}),e.jsx("span",{className:"vps-row-score",children:Je(a.scoreTotal)})]})},a.id))}),A&&e.jsx(is,{vpsId:A.id,vpsName:A.name,lastAuditAt:A.lastAuditAt,health:A.health,summary:U(A),provisioning:e.jsx(ds,{vps:A,onToast:s,onGotoTerminal:t}),access:J(A),onScore:()=>N(),onClose:()=>{B(null),N()},onToast:s}),e.jsx(de,{open:p==="new",title:"Daftarkan VPS",submitLabel:"Daftarkan",initial:je,onClose:()=>f(null),onSubmit:C}),p&&p!=="new"&&e.jsx(de,{open:!0,title:`Edit ${p.name}`,submitLabel:"Simpan",initial:ms(p),onClose:()=>f(null),onSubmit:a=>O(p,a)}),d]})}export{bs as VpsScreen,ge as VpsStepper,gs as hardenedLabel,js as isReachable,ve as vpsFormToBody};
1
+ import{a1 as be,h as g,v as fe,d as me,aV as E,aW as Y,j as e,M as ye,c as Oe,aX as ie,aT as ue,m as F,I as ne,x as Re,B as y,i as T,q as Se,r as Me,aY as Ue,aJ as _e,e as G,f as X,aZ as He,l as Fe,aq as Ke,R as We,X as qe,O as Ge,W as Xe}from"./index-C-iSWHn3.js";import{R as c}from"./react-DfGhg7ZW.js";import"./markdown-CWEY34jk.js";import"./xterm-3VOAfa_q.js";const Ye=10*6e4,we=(s,t)=>!!s.lastSeenAt&&t-new Date(s.lastSeenAt).getTime()<Ye;function he(s,t=Date.now()){const l=s.lastSeenAt?we(s,t)?{state:"done",text:"terhubung"}:{state:"gagal",text:"tidak terjangkau"}:{state:"todo",text:"belum terhubung"},o=s.lastAuditAt?{state:"done",text:`diaudit ${be(s.lastAuditAt,t)||"—"}`}:{state:"todo",text:"belum diaudit"},m=s.lastAuditAt&&s.hardened?{state:"done",text:"diperkuat"}:{state:"todo",text:"belum diperkuat"};return[{key:"terhubung",label:"Terhubung",...l},{key:"diaudit",label:"Diaudit",...o},{key:"diperkuat",label:"Diperkuat",...m}]}const Je=(s,t)=>{const l=new Set(s);return l.size===new Set(t).size&&t.every(o=>l.has(o))};function ke(s,t){return s.length>0&&t!==null&&Je(s,t)}const Qe=s=>s==null?"Skor —":`Skor ${s}%`,Ze={pass:"check",fail:"x",warn:"alert-triangle",na:"minus",unknown:"circle"},es={pass:"var(--leaf-600)",fail:"var(--clay-600)",warn:"var(--status-warn)",na:"var(--text-subtle)",unknown:"var(--text-subtle)"},ss={critical:"var(--clay-600)",high:"var(--status-warn)",medium:"var(--text-subtle)",low:"var(--text-subtle)"},te={AUTO:"Otomatis",AUDIT:"Audit",INFO:"Info"};function re({text:s,color:t}){return e.jsx("span",{className:"vps-badge",style:{color:t,borderColor:t},children:s})}function Ne({score:s}){const t=s>=90?"vps-tone-ok":s>=50?"vps-tone-warn":"vps-tone-bad";return e.jsxs("div",{className:"vps-bar-wrap",children:[e.jsx("div",{className:"vps-bar",children:e.jsx("div",{className:`vps-bar-fill ${t}`,style:{width:`${s}%`}})}),e.jsxs("span",{className:"vps-bar-num",children:[s,"%"]})]})}function as({item:s,busy:t,selected:l,onToggle:o,onNa:m,onAttest:h}){const u=s.mode==="AUTO"&&!s.na,x=s.status==="fail"||s.status==="warn"||!!s.drifted;return e.jsxs("div",{"data-testid":`item-${s.id}`,title:`${te[s.mode]} · ${Y[s.severity]}`,className:`vps-item${s.na?" vps-item-na":""}`,children:[u?e.jsx("span",{className:"vps-touch",children:e.jsx("input",{type:"checkbox","aria-label":`Pilih ${s.title}`,checked:l,onChange:()=>o(s)})}):e.jsx("span",{className:"vps-item-gap"}),e.jsx(ne,{name:Ze[s.status],size:14,color:es[s.status]}),e.jsx("span",{className:"vps-item-title",children:s.title}),s.drifted&&e.jsx(re,{text:"drift",color:"var(--clay-600)"}),x&&e.jsx(re,{text:Y[s.severity],color:ss[s.severity]}),s.mode==="INFO"&&!s.attested&&e.jsx(y,{size:"sm",variant:"ghost",leftIcon:"check-circle",loading:t,onClick:()=>h(s),children:"Tandai terpenuhi"}),e.jsx(y,{size:"sm",variant:"ghost",leftIcon:s.na?"rotate-ccw":"minus-circle",loading:t,onClick:()=>m(s,!s.na),children:s.na?"Batal N/A":"N/A"})]})}const ce={section:"",mode:"",status:"",severity:""};function le({value:s,onChange:t,options:l,label:o}){return e.jsxs("select",{"aria-label":o,value:s,onChange:m=>t(m.target.value),className:"vps-select vps-touch-select",children:[e.jsxs("option",{value:"",children:[o,": semua"]}),l.map(([m,h])=>e.jsx("option",{value:m,children:h},m))]})}function ts(s){let t=0,l=0,o=0,m=0;for(const x of s)x.status==="fail"?t++:x.status==="warn"?l++:x.status==="unknown"&&o++,x.drifted&&m++;const h=x=>x.charAt(0).toLowerCase()+x.slice(1),u=[t&&`${t} ${h(E.fail)}`,l&&`${l} ${h(E.warn)}`,o&&`${o} ${h(E.unknown)}`].filter(Boolean);return{text:u.length?u.join(" · "):`semua ${h(E.pass)}`,drift:m}}function ns({section:s,items:t,expanded:l,onToggle:o,busy:m,selected:h,onToggleItem:u,onNa:x,onAttest:b,onSectionNa:j}){const p=ts(s.items),f=!!s.suggestion&&!s.suggestion.applicable;return e.jsxs("div",{className:"vps-section",children:[e.jsxs("button",{"data-testid":`section-${s.id}`,"aria-expanded":l,onClick:()=>o(s.id),className:`vps-section-head${l?" vps-section-open":""}`,children:[e.jsx(ne,{name:l?"chevron-down":"chevron-right",size:15,color:"var(--text-subtle)"}),e.jsx("span",{className:"vps-section-icon",children:s.icon}),e.jsx("span",{className:"vps-section-title",children:s.title}),e.jsx("span",{className:"vps-section-sum",children:p.text}),p.drift>0&&e.jsx(re,{text:"drift",color:"var(--clay-600)"}),f&&e.jsx(re,{text:"saran N/A",color:"var(--brass-700)"}),e.jsx(Ne,{score:s.score})]}),l&&e.jsxs("div",{className:"vps-section-body",children:[f&&e.jsxs("div",{"data-testid":`suggestion-${s.id}`,className:"vps-suggest",children:[e.jsx(ne,{name:"info",size:13,color:"var(--brass-700)"}),e.jsxs("span",{className:"vps-suggest-text",children:["Stack tak terdeteksi (",s.suggestion.detail,") — kemungkinan N/A. Cek Docker manual bila ragu."]}),e.jsx(y,{size:"sm",variant:"ghost",leftIcon:"minus-circle",loading:m===`section:${s.id}`,onClick:()=>j(s),children:"Tandai seksi N/A"})]}),t.map(S=>e.jsx(as,{item:S,busy:m===S.id,selected:h.has(S.id),onToggle:u,onNa:x,onAttest:b},S.id))]})]})}function is({vpsId:s,vpsName:t,lastAuditAt:l,health:o,summary:m,provisioning:h,access:u,onScore:x,onClose:b,onToast:j}){const[p,f]=c.useState(null),[S,L]=c.useState("loading"),[A,B]=c.useState(""),[N,R]=c.useState("ringkasan"),[d,z]=c.useState(ce),[K,W]=c.useState(""),[J,q]=c.useState(new Set),[M,$]=c.useState(null),[C,O]=c.useState(new Set),[D,U]=c.useState(null),[Q,a]=c.useState(""),v=c.useRef(x);v.current=x;const I=c.useCallback(()=>{L("loading"),g.vpsChecklist(s).then(i=>{var k;f(i),L("ready"),(k=v.current)==null||k.call(v,i.scoreTotal)}).catch(i=>{B(fe(i,"tak diketahui")),L("error")})},[s]);c.useEffect(()=>{I(),O(new Set),U(null),q(new Set),W(""),z(ce)},[I]);const Z=i=>{U(null),O(k=>{const r=new Set(k);return r.has(i.id)?r.delete(i.id):r.add(i.id),r})},_=()=>{O(new Set),U(null)},ee=i=>q(k=>{const r=new Set(k);return r.has(i)?r.delete(i):r.add(i),r}),{confirm:se,dialog:n}=me(),w=(D==null?void 0:D.forIds)??null,V=ke([...C],w);async function Ce(){const i=[...C];a("preview");try{U({steps:(await g.remediatePreview(s,i)).steps,forIds:i})}catch(k){j(T("membuat pratinjau remediasi",k),"err","x-circle")}finally{a("")}}async function Pe(){const i=[...C];if(!ke(i,w))return;const r=((p==null?void 0:p.sections.flatMap(P=>P.items))??[]).filter(P=>C.has(P.id));if(await se({title:`Terapkan ${i.length} item AUTO ke VPS ini?`,message:"Remediasi dijalankan langsung di server yang terdaftar.",impact:[...r.map(P=>`${P.id} · ${P.title}`),"Langkahnya idempoten dan anti-lockout.","Checklist diaudit ulang setelah selesai."],confirmLabel:"Terapkan",icon:"shield"})){a("apply");try{await g.remediate(s,i),_(),I(),j("Remediasi diterapkan · audit ulang","ok","shield")}catch(P){j(T("menerapkan remediasi",P),"err","x-circle")}finally{a("")}}}async function pe(i,k,r){$(i.id);try{await k(),I(),j(r,"ok","shield")}catch(P){j(T(`memperbarui ${i.id}`,P),"err","x-circle")}finally{$(null)}}const Ae=(i,k)=>pe(i,()=>g.markNa(s,i.id,k,k?"ditandai dari checklist":void 0),k?`${i.id} ditandai N/A`:`${i.id} kembali applicable`),Ie=i=>pe(i,()=>g.attestItem(s,i.id),`${i.id} ditandai terpenuhi`);async function Le(i){const k=i.items.map(r=>r.id);if(await se({title:`Tandai ${k.length} item seksi "${i.title}" sebagai N/A?`,message:"Stack-nya tak terdeteksi — cek Docker manual bila ragu.",confirmLabel:"Tandai N/A",icon:"shield"})){$(`section:${i.id}`);try{await g.markNaBulk(s,k,!0,"app-layer: stack tak terdeteksi"),I(),j(`Seksi ${i.title} ditandai N/A`,"ok","shield")}catch(r){j(T(`menandai seksi ${i.title} sebagai N/A`,r),"err","x-circle")}finally{$(null)}}}const ae=K.trim().toLowerCase(),oe=!!(d.section||d.mode||d.status||d.severity)||ae!=="",Ve=i=>(!d.section||i.section===d.section)&&(!d.mode||i.mode===d.mode)&&(!d.status||i.status===d.status)&&(!d.severity||i.severity===d.severity)&&(!ae||i.title.toLowerCase().includes(ae)||i.id.toLowerCase().includes(ae)||(i.code??"").toLowerCase().includes(ae)),H=i=>k=>z(r=>({...r,[i]:k})),Te=i=>{var k;return((k=p==null?void 0:p.sections.find(r=>r.id===i))==null?void 0:k.title)??i},De=[...d.section?[{key:"section",label:`Seksi: ${Te(d.section)}`,onRemove:()=>H("section")("")}]:[],...d.mode?[{key:"mode",label:`Mode: ${te[d.mode]}`,onRemove:()=>H("mode")("")}]:[],...d.status?[{key:"status",label:`Status: ${E[d.status]}`,onRemove:()=>H("status")("")}]:[],...d.severity?[{key:"severity",label:`Severity: ${Y[d.severity]}`,onRemove:()=>H("severity")("")}]:[]],Be=()=>{z(ce),W("")};function ze(){if(S==="loading")return e.jsx(F,{kind:"loading",compact:!0,title:"Memuat checklist…"});if(S==="error"||!p)return e.jsx(F,{kind:"error",compact:!0,title:"Gagal memuat checklist",hint:A,action:I});const i=p.sections.reduce((r,P)=>r+P.items.filter(Ee=>Ee.drifted).length,0),k=p.sections.map(r=>({section:r,matched:r.items.filter(Ve)})).filter(r=>!oe||r.matched.length>0);return e.jsxs("div",{children:[e.jsxs("div",{className:"vps-check-head",children:[e.jsxs("div",{className:"vps-check-score",children:[e.jsxs("span",{"data-testid":"score-total",className:"vps-check-score-num",children:[p.scoreTotal,"%"]}),e.jsx("div",{className:"vps-check-score-bar",children:e.jsx(Ne,{score:p.scoreTotal})}),e.jsx(ue,{size:11,tone:"subtle",children:"skor kepatuhan"})]}),i>0&&e.jsxs("div",{"data-testid":"drift-summary",className:"vps-drift",children:[e.jsx(ne,{name:"alert-triangle",size:14,color:"var(--clay-600)"}),i," item drift (regresi) sejak audit sebelumnya"]}),e.jsx(Re,{label:"Filter checklist",search:{value:K,onChange:W,label:"cari item",placeholder:"mis. ssh atau 5.2.1"},chips:De,filtersLabel:"Filter",onReset:Be,filters:e.jsxs("div",{className:"vps-filter-fields",children:[e.jsx(le,{label:"seksi",value:d.section,onChange:H("section"),options:p.sections.map(r=>[r.id,r.title])}),e.jsx(le,{label:"mode",value:d.mode,onChange:H("mode"),options:[["AUTO",te.AUTO],["AUDIT",te.AUDIT],["INFO",te.INFO]]}),e.jsx(le,{label:"status",value:d.status,onChange:H("status"),options:[["pass",E.pass],["fail",E.fail],["warn",E.warn],["na",E.na],["unknown",E.unknown]]}),e.jsx(le,{label:"severity",value:d.severity,onChange:H("severity"),options:[["critical",Y.critical],["high",Y.high],["medium",Y.medium],["low",Y.low]]})]})}),C.size>0&&e.jsxs("div",{className:"vps-remedi",role:"group","aria-label":"Alur perbaikan",children:[e.jsxs("ol",{className:"vps-remedi-steps",children:[e.jsxs("li",{"data-state":"done",children:["1 Pilih · ",C.size," item AUTO"]}),e.jsx("li",{"data-state":D?"done":"active",children:"2 Pratinjau"}),e.jsx("li",{"data-state":V?"active":"todo",children:"3 Terapkan"})]}),e.jsxs("div",{className:"vps-remedi-actions",children:[e.jsx(y,{size:"sm",variant:"secondary",leftIcon:"eye",loading:Q==="preview",onClick:Ce,children:"Pratinjau"}),e.jsx(y,{size:"sm",leftIcon:"shield",loading:Q==="apply",disabled:!V,onClick:Pe,children:"Terapkan"}),e.jsx(y,{size:"sm",variant:"ghost",onClick:_,children:"Batal"})]}),!V&&e.jsx("div",{className:"vps-remedi-hint",children:"Buat pratinjau dulu. Terapkan hanya memakai pratinjau untuk pilihan ini."})]}),D&&e.jsxs("div",{"data-testid":"remediate-preview",className:"vps-preview",children:[e.jsx("div",{className:"vps-preview-title",children:"Pratinjau (dry-run) — belum diterapkan. Mengubah pilihan membatalkannya."}),D.steps.map(r=>e.jsxs("div",{className:"vps-preview-line",children:[r.item," · ",r.status," ",r.detail]},r.item))]})]}),k.length===0?e.jsx(F,{kind:"empty",compact:!0,title:"Tidak ada item cocok",hint:"Ubah kata kunci atau reset filter."}):k.map(({section:r,matched:P})=>e.jsx(ns,{section:r,items:oe?P:r.items,expanded:oe?!0:J.has(r.id),onToggle:ee,busy:M,selected:C,onToggleItem:Z,onNa:Ae,onAttest:Ie,onSectionNa:Le},r.id))]})}return e.jsxs(ye,{open:!0,width:960,icon:"clipboard-list",eyebrow:"Detail server",title:t??"VPS",onClose:b,children:[e.jsxs(Oe,{"aria-label":"Bagian detail VPS",value:N,className:"vps-tabs",tabs:[{value:"ringkasan",label:"Ringkasan"},{value:"checklist",label:"Checklist"},{value:"pemasangan",label:"Pemasangan"},{value:"akses",label:"Akses"}],onChange:i=>R(i),children:[e.jsx(ie,{value:"ringkasan",children:e.jsxs("div",{className:"vps-summary",children:[e.jsxs("div",{"data-testid":"vps-detail",className:"vps-detail-meta",children:[l?`Audit terakhir ${be(l)||"—"}`:"Belum pernah diaudit",o&&` · disk ${o.disk} · mem ${o.mem} · load ${o.load}`]}),p&&e.jsxs("div",{className:"vps-summary-score",children:[e.jsx(ue,{size:12,tone:"muted",children:"Skor kepatuhan"}),e.jsxs("span",{"data-testid":"ringkasan-score",className:"vps-summary-score-num",children:[p.scoreTotal,"%"]})]}),m]})}),e.jsx(ie,{value:"checklist",children:ze()}),e.jsx(ie,{value:"pemasangan",children:e.jsx("div",{"data-testid":"vps-provisioning",children:h??e.jsx(F,{kind:"empty",compact:!0,title:"Pemasangan belum tersedia"})})}),e.jsx(ie,{value:"akses",children:u??e.jsx(F,{kind:"empty",compact:!0,title:"Akses belum tersedia"})})]}),n]})}const xe=He;function ls(s,t){if(t.status==="partial"&&t.detail.startsWith("not-logged-in"))return`${s} · belum login`;if(t.status==="partial")return`${s} · ${t.detail||xe.partial}`;const l=t.status==="ok"&&t.detail?` ${t.detail}`:"";return`${s} · ${Fe(xe,t.status)}${l}`}const rs={lab:"Uji coba: komponen dipasang langsung di host ini.",production:"Produksi: agen dipasang ke dalam image terisolasi; sebagian komponen tak tersedia di profil ini."};function os({status:s,children:t,title:l}){return e.jsxs("span",{title:l,className:"vps-prov-chip",children:[e.jsx("span",{"aria-hidden":!0,className:"vps-prov-dot","data-status":s}),t]})}function $e({components:s,checkedAt:t}){return!s||!t?e.jsx("span",{className:"vps-prov-hint",children:"Komponen belum diperiksa"}):e.jsxs("div",{className:"vps-prov-badges",children:[Object.entries(s).map(([l,o])=>e.jsx(os,{status:o.status,children:ls(l,o)},l)),e.jsxs("span",{className:"vps-prov-hint",children:["diperiksa ",new Date(t).toLocaleString("id-ID")]})]})}function cs(s,t,l){const o=new Map(t.map(u=>[u.id,u])),m=new Set,h=u=>{var x;if(!m.has(u)){m.add(u);for(const b of((x=o.get(u))==null?void 0:x.requires[l])??[])h(b)}};for(const u of s)h(u);return m}function ds({vps:s,onToast:t,onGotoTerminal:l}){const[o,m]=c.useState([]),[h,u]=Se("vps",`provisionProfile@${s.id}`,"lab",Me("lab","production")),[x,b]=c.useState(new Set),[j,p]=c.useState(""),[f,S]=c.useState(null),[L,A]=c.useState(null),[B,N]=c.useState(null),[R,d]=c.useState(null),[z,K]=c.useState(!1),{confirm:W,dialog:J}=me();c.useEffect(()=>{g.listVpsComponents().then(n=>m(n.components)).catch(()=>m([]))},[]);const q=o.filter(n=>n.profiles.includes(h)),M=cs(x,o,h),$=[...M],C=$.some(n=>{var w;return(w=o.find(V=>V.id===n))==null?void 0:w.needsDomain}),O=$.length>0&&(!C||j.trim().length>0),D=$.length===0?"Pilih minimal satu komponen.":C&&!j.trim()?"Isi domain dulu — komponen yang dipilih membutuhkannya.":null;function U(n){b(w=>{const V=new Set(w);return V.has(n)?V.delete(n):V.add(n),V})}async function Q(){d("probe");try{A(await g.probeVps(s.id)),t("Komponen diperiksa","ok","server")}catch(n){t(T("memeriksa komponen",n),"err","x-circle")}finally{d(null)}}async function a(){d("preview");try{S((await g.provisionPreview(s.id,{items:$,profile:h,domain:j||void 0})).steps)}catch(n){t(T("membuat pratinjau",n),"err","x-circle")}finally{d(null)}}async function v(){if(await W({title:`Pasang ${$.length} komponen di "${s.name}"?`,message:`Profil ${h}. Langkah dijalankan lewat SSH dan bisa memakan beberapa menit.`,impact:$.map(n=>{var w;return((w=o.find(V=>V.id===n))==null?void 0:w.label)??n}),confirmLabel:"Pasang",icon:"server"})){d("apply");try{const n=await g.provisionVps(s.id,{items:$,profile:h,domain:j||void 0,confirm:!0});S(n.steps),A({components:n.components,checkedAt:n.checkedAt}),N(n.setup),t("Provisioning selesai","ok","server")}catch(n){t(T("memasang komponen",n),"err","x-circle")}finally{d(null)}}}const I=async()=>{try{const{id:n}=await g.vpsConsole(s.id);l(n)}catch(n){t(T("membuka console",n),"err","x-circle")}},Z=async n=>{if(!navigator.clipboard){t("Salin tak tersedia di browser ini. Pilih tautannya lalu salin manual.","err","x-circle");return}try{await navigator.clipboard.writeText(n),K(!0),window.setTimeout(()=>K(!1),2e3)}catch(w){t(T("menyalin tautan",w),"err","x-circle")}},_=L?Object.fromEntries(L.components.map(n=>[n.id,{status:n.status,detail:n.detail}])):s.components??null,ee=(L==null?void 0:L.checkedAt)??s.componentsCheckedAt??null,se=_?Object.entries(_).filter(([,n])=>n.status==="partial"&&n.detail.startsWith("not-logged-in")):[];return e.jsxs("div",{className:"vps-prov",children:[e.jsxs("div",{className:"vps-prov-row",children:[e.jsx($e,{components:_,checkedAt:ee}),e.jsx(y,{size:"sm",variant:"ghost",onClick:Q,disabled:R!==null,children:"Periksa"})]}),e.jsxs("fieldset",{className:"vps-prov-fieldset",children:[e.jsx("legend",{className:"vps-prov-legend",children:"Profil"}),e.jsx("div",{className:"vps-prov-profiles",children:["lab","production"].map(n=>e.jsxs("div",{children:[e.jsx(Ue,{"aria-label":n,label:n,checked:h===n,onChange:()=>u(n)}),e.jsx("div",{className:"vps-prov-profile-hint",children:rs[n]})]},n))})]}),e.jsx("div",{className:"vps-prov-items",children:q.map(n=>{const w=M.has(n.id)&&!x.has(n.id);return e.jsxs("div",{className:"vps-prov-item",children:[e.jsx(_e,{"aria-label":n.label,label:n.label,checked:M.has(n.id),disabled:w,onChange:()=>U(n.id)}),w&&e.jsx("span",{className:"vps-prov-tag",children:"prasyarat"})]},n.id)})}),C&&e.jsx(G,{label:"Domain",hint:"A record harus sudah menunjuk ke IP VPS ini",children:e.jsx(X,{"aria-label":"Domain",value:j,onChange:n=>p(n.currentTarget.value),placeholder:"hanoman.contoh.id"})}),e.jsxs("div",{className:"vps-prov-row",children:[e.jsx(y,{variant:"ghost",onClick:a,disabled:!O||R!==null,children:"Pratinjau"}),e.jsx(y,{onClick:v,disabled:!O||R!==null,children:"Pasang"}),!O&&D&&e.jsx("span",{className:"vps-prov-reason",children:D})]}),e.jsx("div",{"aria-live":"polite",children:f&&e.jsx("pre",{tabIndex:0,"aria-label":"Hasil langkah provisioning",className:"vps-prov-steps",children:f.map(n=>`${n.item.padEnd(14)} ${n.status.padEnd(6)} ${n.detail}`).join(`
2
+ `)})}),B&&e.jsxs("div",{className:"vps-prov-setup",children:[e.jsx("strong",{className:"vps-prov-setup-title",children:"Buat admin pertama"}),e.jsx("a",{href:B.url,target:"_blank",rel:"noreferrer",className:"vps-prov-setup-link",children:B.url}),e.jsxs("span",{className:"vps-prov-hint",children:["berlaku sampai ",new Date(B.expiresAt).toLocaleTimeString("id-ID")]}),e.jsx("div",{children:e.jsx(y,{size:"sm",variant:"ghost",onClick:()=>void Z(B.url),children:z?"Tersalin":"Salin"})})]}),se.length>0&&e.jsxs("div",{className:"vps-prov-pending",children:[e.jsx(ne,{name:"alert-triangle"}),e.jsxs("span",{children:[se.map(([n])=>n).join(", ")," terpasang tapi belum login."]}),e.jsx(y,{size:"sm",variant:"ghost",onClick:I,children:"Login lewat Console"})]}),J]})}const js=(s,t=Date.now())=>we(s,t),gs=s=>s.lastAuditAt?s.hardened?"hardened":"belum":"unknown";function ve(s){const t={name:s.name.trim(),host:s.host.trim(),user:s.user.trim(),port:Number(s.port)||22};return s.keyPath.trim()&&(t.keyPath=s.keyPath.trim()),s.password&&(t.password=s.password),t}const us="opsional — dipakai sekali untuk memasang key hanoman, tidak disimpan";function de({open:s,title:t,submitLabel:l,initial:o,onClose:m,onSubmit:h}){const[u,x]=c.useState(o);c.useEffect(()=>{s&&x(o)},[s,o]);const b=p=>f=>x(S=>({...S,[p]:f.target.value})),j=!!(u.name.trim()&&u.host.trim()&&u.user.trim());return e.jsxs(ye,{open:s,onClose:m,icon:"server",eyebrow:"infra",title:t,footer:e.jsxs(e.Fragment,{children:[e.jsx(y,{variant:"ghost",size:"sm",onClick:m,children:"Batal"}),e.jsx(y,{size:"sm",leftIcon:"check",onClick:()=>j&&h(u),children:l})]}),children:[e.jsx(G,{label:"Nama",children:e.jsx(X,{value:u.name,onChange:b("name"),placeholder:"mis. web-1",style:{width:"100%"}})}),e.jsx(G,{label:"Host",hint:"hostname atau IP — tanpa user@",children:e.jsx(X,{value:u.host,onChange:b("host"),mono:!0,placeholder:"203.0.113.10",style:{width:"100%"}})}),e.jsxs("div",{className:"hn-grid-mobile vps-form-pair",children:[e.jsx(G,{label:"User SSH",hint:"root atau user ber-passwordless-sudo",children:e.jsx(X,{value:u.user,onChange:b("user"),mono:!0,placeholder:"deploy",style:{width:"100%"}})}),e.jsx(G,{label:"Port",children:e.jsx(X,{value:u.port,onChange:b("port"),mono:!0,placeholder:"22",style:{width:"100%"}})})]}),e.jsx(G,{label:"Password SSH",hint:us,children:e.jsx(X,{type:"password",value:u.password,onChange:b("password"),placeholder:"••••••••",style:{width:"100%"}})}),e.jsx(G,{label:"Key path",hint:"kosongkan bila memakai password di atas, atau key default mesin server",children:e.jsx(X,{value:u.keyPath,onChange:b("keyPath"),mono:!0,placeholder:"~/.ssh/id_ed25519",style:{width:"100%"}})})]})}const je={name:"",host:"",user:"",port:"22",keyPath:"",password:""},ms=s=>({name:s.name,host:s.host,user:s.user,port:String(s.port),keyPath:s.keyPath??"",password:""});function ge({steps:s,name:t}){return e.jsx("ol",{className:"vps-stepper","aria-label":`Kemajuan ${t}`,children:s.map(l=>e.jsxs("li",{className:`vps-step vps-step-${l.state}`,children:[e.jsx("span",{className:"vps-step-label",children:l.label}),e.jsx("span",{className:"vps-step-text",children:l.text})]},l.key))})}function bs({onToast:s,onGotoTerminal:t}){const[l,o]=c.useState([]),[m,h]=c.useState("loading"),[u,x]=c.useState(""),[b,j]=c.useState(null),[p,f]=c.useState(null),[S,L]=Se("vps","detailId",null,Xe),A=c.useMemo(()=>l.find(a=>a.id===S)??null,[l,S]),B=c.useCallback(a=>L(a?a.id:null),[L]),N=c.useCallback(()=>{g.listVps().then(a=>{o(a),h("ready")}).catch(a=>{x(fe(a,"tak diketahui")),h("error")})},[]);c.useEffect(()=>(N(),Ke(a=>{a.t==="vps"&&(o(a.vps),h("ready"))})),[N]);const{confirm:R,dialog:d}=me();async function z(a,v,I,Z,_){j(`${a}:${v}`);try{await I(),N(),s(Z,"ok","server")}catch(ee){s(T(_,ee),"err","x-circle")}finally{j(null)}}const K=async a=>{j(`audit:${a.id}`);try{await g.auditVps(a.id),N(),s(`${a.name} · audit selesai`,"ok","server")}catch(v){s(T("menjalankan audit",v),"err","x-circle")}finally{j(null)}};async function W(a){await R({title:`Harden "${a.name}"?`,message:"Pastikan akses key SSH non-password kamu sudah bekerja sebelum melanjutkan.",impact:[`Firewall: izinkan ${a.port}/80/443.`,"fail2ban & auto security update dipasang.","PermitRootLogin & PasswordAuthentication dimatikan.","NTP disinkronkan."],confirmLabel:"Harden",icon:"shield"})&&z("harden",a.id,()=>g.hardenVps(a.id),`${a.name} · harden selesai`,"menjalankan harden")}const J=a=>z("sesi",a.id,async()=>{const{id:v}=await g.vpsSession(a.id);t(v)},`${a.name} · sesi Claude dibuka`,"membuka sesi Claude"),q=a=>z("test",a.id,async()=>{const v=await g.testVps(a.id);if(!v.ok)throw new Error(v.out)},`${a.name} · koneksi ok`,"tes koneksi"),M=a=>z("console",a.id,async()=>{const{id:v}=await g.vpsConsole(a.id);t(v)},`${a.name} · console dibuka`,"membuka console");async function $(a){try{if(!await R({title:`Hapus registrasi VPS "${a.name}"?`,message:"Server-nya sendiri tak disentuh — hanya pendaftarannya di dashboard ini yang dihapus.",confirmLabel:"Hapus registrasi",run:()=>g.deleteVps(a.id)}))return;N(),s(`${a.name} dihapus dari daftar`,"ok","check")}catch(v){s(T("menghapus registrasi VPS",v),"err","x-circle")}}async function C(a){try{const v=await g.createVps(ve(a));f(null),N(),s(a.password?`${v.name} terdaftar · key hanoman terpasang · password dibuang`:`${v.name} terdaftar · jalankan audit`,"ok","server")}catch{s("Gagal mendaftarkan VPS — cek host/user, atau password SSH-nya","err","x-circle")}}async function O(a,v){try{const I=await g.updateVps(a.id,ve(v));f(null),N(),s(v.password?`${I.name} diperbarui · key hanoman terpasang · password dibuang`:`${I.name} diperbarui`,"ok","server")}catch{s("Gagal memperbarui VPS","err","x-circle")}}const D=a=>[{key:"tes",label:"Tes koneksi",icon:"plug-zap",onSelect:()=>void q(a)},{key:"console",label:"Buka console",icon:"terminal-square",onSelect:()=>void M(a)},{key:"sesi",label:"Sesi Claude",icon:"terminal",onSelect:()=>void J(a)},{key:"edit",label:"Edit",icon:"pencil",onSelect:()=>f(a)},{key:"harden",label:"Harden",icon:"shield",tone:"danger",onSelect:()=>void W(a)},{key:"hapus",label:"Hapus registrasi",icon:"trash-2",tone:"danger",onSelect:()=>void $(a)}],U=a=>e.jsxs(e.Fragment,{children:[e.jsx(ge,{steps:he(a),name:a.name}),e.jsx("div",{className:"vps-summary-comp",children:e.jsx($e,{components:a.components??null,checkedAt:a.componentsCheckedAt??null})})]}),Q=a=>e.jsxs("div",{className:"vps-access",children:[e.jsxs("dl",{className:"vps-access-list",children:[e.jsxs("div",{children:[e.jsx("dt",{children:"Host"}),e.jsx("dd",{children:a.host})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"User SSH"}),e.jsx("dd",{children:a.user})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Port"}),e.jsx("dd",{children:a.port})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Key"}),e.jsx("dd",{children:a.keyPath??"key default mesin server"})]})]}),e.jsxs("div",{className:"vps-access-actions",children:[e.jsx(y,{size:"sm",variant:"secondary",leftIcon:"plug-zap",loading:b===`test:${a.id}`,onClick:()=>void q(a),children:"Tes koneksi"}),e.jsx(y,{size:"sm",variant:"secondary",leftIcon:"terminal-square",loading:b===`console:${a.id}`,onClick:()=>void M(a),children:"Buka console"}),e.jsx(y,{size:"sm",variant:"secondary",leftIcon:"terminal",loading:b===`sesi:${a.id}`,onClick:()=>void J(a),children:"Sesi Claude"}),e.jsx(y,{size:"sm",variant:"ghost",leftIcon:"pencil",onClick:()=>f(a),children:"Edit"})]})]});return m==="loading"?e.jsx(F,{kind:"loading",title:"Memuat daftar VPS…"}):m==="error"?e.jsx(F,{kind:"error",title:"Gagal memuat daftar VPS",hint:`Alasan: ${u}. Pastikan server hanoman berjalan.`,action:N}):l.length===0?e.jsxs(e.Fragment,{children:[e.jsx(F,{kind:"empty",icon:"server",title:"Belum ada VPS",hint:"Daftarkan VPS untuk mulai audit & hardening.",action:()=>f("new"),actionLabel:"Daftarkan VPS"}),e.jsx(de,{open:p==="new",title:"Daftarkan VPS",submitLabel:"Daftarkan",initial:je,onClose:()=>f(null),onSubmit:C})]}):e.jsxs("div",{className:"vps-screen",children:[e.jsxs("div",{className:"vps-toolbar",children:[e.jsxs(ue,{size:12,tone:"muted",children:[l.length," VPS terdaftar"]}),e.jsx(y,{size:"sm",leftIcon:"plus",onClick:()=>f("new"),children:"Daftarkan VPS"})]}),e.jsx(We,{label:"Daftar VPS",children:l.map(a=>e.jsx(qe,{actions:e.jsxs(e.Fragment,{children:[e.jsx(y,{size:"sm",leftIcon:"radar",loading:b===`audit:${a.id}`,onClick:()=>void K(a),children:"Periksa"}),e.jsx(Ge,{label:`Aksi lain untuk ${a.name}`,title:a.name,items:D(a)})]}),children:e.jsxs("div",{className:"vps-row",children:[e.jsxs("button",{type:"button","aria-label":`Buka detail ${a.name}`,className:"vps-row-open",onClick:()=>B(a),children:[e.jsx("span",{className:"vps-row-name",children:a.name}),e.jsxs("span",{className:"vps-row-addr",children:[a.user,"@",a.host,a.port!==22?`:${a.port}`:""]})]}),e.jsx(ge,{steps:he(a),name:a.name}),e.jsx("span",{className:"vps-row-score",children:Qe(a.scoreTotal)})]})},a.id))}),A&&e.jsx(is,{vpsId:A.id,vpsName:A.name,lastAuditAt:A.lastAuditAt,health:A.health,summary:U(A),provisioning:e.jsx(ds,{vps:A,onToast:s,onGotoTerminal:t}),access:Q(A),onScore:()=>N(),onClose:()=>{B(null),N()},onToast:s}),e.jsx(de,{open:p==="new",title:"Daftarkan VPS",submitLabel:"Daftarkan",initial:je,onClose:()=>f(null),onSubmit:C}),p&&p!=="new"&&e.jsx(de,{open:!0,title:`Edit ${p.name}`,submitLabel:"Simpan",initial:ms(p),onClose:()=>f(null),onSubmit:a=>O(p,a)}),d]})}export{bs as VpsScreen,ge as VpsStepper,gs as hardenedLabel,js as isReachable,ve as vpsFormToBody};
@@ -0,0 +1 @@
1
+ import{cf as F,cg as I,ch as O,ci as R,cj as M,ck as U,bY as $,bV as P,bW as B,bX as G,cl as z,a6 as H,a7 as V,cm as K,bb as Y,cn as W,bQ as X,co as q,cp as Q,j as a,B as Z,h as J,aI as ee,b2 as te,ae as T,g as A,a9 as ae,aa as se,ab as ne,ac as re,ad as ie,f as le}from"./index-C-iSWHn3.js";import{R as f}from"./react-DfGhg7ZW.js";import"./markdown-CWEY34jk.js";const xe=F,S=[{key:"sesi",label:"Sesi harian",icon:"bell",sections:[{key:"sesi",label:"Sesi harian",icon:"bell",keywords:"notifikasi suara selesai keputusan gagal full-auto scaffold agen model default effort goal kondisi verifikasi scope metode workflow"}]},{key:"model",label:"Agen & model",icon:"cpu",sections:[{key:"model",label:"Agen & model",icon:"cpu",keywords:"override konflik rebase merge lead operator obrolan portal jatah orkestrasi fase effort model runtime"}]},{key:"integrasi",label:"Integrasi & akses",icon:"webhook",sections:[{key:"agent",label:"Akses AI Agent",icon:"bot",keywords:"token agent capability mcp master switch"},{key:"telegram",label:"Telegram",icon:"send",keywords:"bot token chat allowlist gateway operator agen progress uji koneksi"},{key:"webhook",label:"Webhook",icon:"webhook",keywords:"endpoint secret peristiwa pengiriman dokumentasi"},{key:"akses-klien",label:"Akses klien",icon:"user-check",keywords:"portal klien grant lihat tulis mulai sesi"},{key:"perangkat",label:"Perangkat",icon:"key-round",keywords:"token perangkat sinkron server pusat"},{key:"kendali-jarak-jauh",label:"Kendali jarak jauh",icon:"shield",keywords:"izin server pusat perangkat kendali"}]},{key:"lanjutan",label:"Lanjutan",icon:"sliders-horizontal",collapsible:!0,sections:[{key:"akun",label:"Akun",icon:"user-round",keywords:"password email logout ganti masuk"},{key:"users",label:"Pengguna",icon:"users",keywords:"undang hapus pengguna email password"},{key:"setup",label:"Setup awal",icon:"shield",keywords:"peruntukan hardening setup ulang"},{key:"konfigurasi",label:"Konfigurasi",icon:"sliders-horizontal",keywords:"env rahasia bootstrap sinkron runtime variabel"},{key:"aktivitas",label:"Log aktivitas",icon:"activity",keywords:"log sesi project hasil commit pr hapus"},{key:"custom-agent",label:"Custom agent",icon:"bot",keywords:"persona agen mention katalog"},{key:"zona-bahaya",label:"Zona bahaya",icon:"alert-triangle",keywords:"reset default kembalikan semua setelan"}]}],L="sesi",oe=S.flatMap(e=>e.sections.map(t=>t.key)),D=e=>oe.includes(e),ue=new Map([["umum","sesi"],["orkestrasi","model"]]);function je(e){if(typeof e!="string")return L;const t=ue.get(e)??e;return D(t)?t:L}function ce(e){return S.find(t=>t.sections.some(n=>n.key===e))??S[0]}function de(e){return S.flatMap(n=>n.sections).find(n=>n.key===e)??S[0].sections[0]}function Ne(e){const t=ce(e);return t.sections.length>1?`${t.label} · ${de(e).label}`:t.label}function Ae(e){const t=new URLSearchParams(e.replace(/^#/,"")).get("bagian");return t&&D(t)?t:null}const we=e=>Q(e).map(t=>({value:t,label:t==="xhigh"?"x-high":t})),Te=e=>X(q,e),fe=(e,t)=>{const n=W(e,t);return n===t?{}:{effort:n}},Le=[{value:"blip",label:"Blip · 0.1s"},{value:"pop",label:"Pop · 0.1s"},{value:"short",label:"Short · 0.15s"},{value:"ping",label:"Ping · 0.2s"},{value:"coin",label:"Coin · 0.3s"},{value:"alert",label:"Alert · 0.3s"},{value:"medium",label:"Medium · 0.4s"},{value:"chime",label:"Chime · 0.4s"},{value:"success",label:"Success · 0.4s"},{value:"bell",label:"Bell · 0.5s"},{value:"marimba",label:"Marimba · 0.6s"},{value:"long",label:"Long · 0.8s"},{value:"fanfare",label:"Fanfare · 0.9s"},{value:"off",label:"Senyap"}],De={model:"sonnet",effort:"medium",autoDefault:!0,autoScaffold:!0,notifyFail:!0,notifyDone:!0,notifySound:"short",notifyDecision:!0,notifyDecisionSound:"alert",agentAccessEnabled:!1,scheduler:Y,goal:K,agent:"claude",codex:V,antigravity:H,verifyScope:"changed",method:z,conflict:G,lead:B,telegram:P,portalChat:$,orchestration:U,remoteControl:M,logShipping:R,logRetention:O,builtinAgents:{},builtinAgentPolicies:{},builtinRuntimeDefaults:I};function ge({save:e}){if(e.status==="idle")return null;if(e.status==="error")return a.jsxs("span",{className:"hn-set-save hn-set-save--err",role:"status","data-testid":"save-status",children:["Gagal — coba lagi",a.jsx(Z,{size:"sm",variant:"ghost",leftIcon:"refresh-cw",onClick:e.retry,children:"Coba lagi"})]});const t=e.status==="saved"?"Tersimpan":"Menyimpan…",n=e.status==="saved"?"hn-set-save--ok":"hn-set-save--pending";return a.jsx("span",{className:`hn-set-save ${n}`,role:"status","data-testid":"save-status",children:t})}function he({text:e}){return a.jsx(a.Fragment,{children:e.split(/`([^`]+)`/).map((t,n)=>n%2===1?a.jsx("code",{className:"hn-set-mono hn-set-codeinline",children:t},n):t)})}function x({title:e,desc:t,children:n,last:r,save:c,search:o}){return a.jsxs("div",{className:`hn-setting-row hn-set-row${r?" hn-set-row--last":""}`,"data-setting-row":!0,"data-search":`${e} ${t??""} ${o??""}`,children:[a.jsxs("div",{className:"hn-set-row-text",children:[a.jsx("div",{className:"hn-set-row-title",children:e}),t&&a.jsx("div",{className:"hn-set-row-desc",children:a.jsx(he,{text:t})}),c&&a.jsx(ge,{save:c})]}),a.jsx("div",{className:"hn-setting-control hn-set-row-control",children:n})]})}function Ce({id:e,text:t}){return t?a.jsx("div",{id:e,className:"hn-set-hint",children:t}):null}function _e({children:e}){return a.jsx("div",{className:"hn-set-note",children:e})}function me({children:e}){return a.jsx("div",{className:"hn-set-prose",children:e})}const ke=400,ve=1800;function y(e){const t=f.useRef(e);t.current=e;const[n,r]=f.useState(null),c=f.useRef(e.value),[o,l]=f.useState("idle"),u=f.useRef(0),g=f.useRef(null),s=f.useRef(null),h=f.useRef(null),m=f.useRef(null),d=f.useRef(!1),k=f.useRef(0),v=()=>{s.current&&(clearTimeout(s.current),s.current=null)},j=()=>{h.current&&(clearTimeout(h.current),h.current=null)},N=(i,p)=>{if(v(),k.current===0&&Object.is(i,t.current.value)){p===u.current&&(g.current=null,r(null),l("idle"));return}k.current++,l("saving"),Promise.resolve(t.current.save(i)).then(E=>{k.current--,!(!d.current||p!==u.current)&&(g.current=null,E?(m.current=null,r({v:i,settled:!0}),l("saved"),j(),h.current=setTimeout(()=>{h.current=null,d.current&&l(b=>b==="saved"?"idle":b)},ve)):(m.current={v:i},r(null),l("error")))})},w=i=>{const p=++u.current;g.current={v:i,id:p},m.current=null,j(),r({v:i,settled:!1}),v();const E=t.current.delayMs??ke;if(E<=0){N(i,p);return}l("pending"),s.current=setTimeout(()=>{s.current=null;const b=g.current;b&&N(b.v,b.id)},E)};f.useEffect(()=>{Object.is(c.current,e.value)||(c.current=e.value,r(i=>i&&i.settled?null:i))},[e.value]);const C=()=>{const i=g.current;!s.current||!i||N(i.v,i.id)},_=()=>{const i=m.current;i&&w(i.v)};return f.useEffect(()=>(d.current=!0,()=>{d.current=!1;const i=g.current;s.current&&i&&(v(),Promise.resolve(t.current.save(i.v))),j()}),[]),{value:n?n.v:e.value,set:w,flush:C,status:o,retry:_}}function be({model:e,codexVer:t}){var r;const n=(t==null?void 0:t.version)??null;return re(e,n)?a.jsxs("div",{"data-testid":"codex-version-note",className:"hn-set-codex-note",children:["Codex CLI terpasang ",a.jsx("b",{children:n}),", sedangkan ",a.jsx("b",{children:e})," butuh ",a.jsx("b",{children:(r=ie(e))==null?void 0:r.minClient}),". Sesi tetap boleh dijalankan, tapi modelnya belum tentu dikenali CLI ini. Perbarui dengan ",a.jsx("code",{children:"npm i -g @openai/codex@latest"}),"."]}):null}function Fe({id:e,label:t,active:n}){return a.jsxs("div",{className:"hn-set-agent-head",children:[a.jsx("div",{className:"hn-set-agent-name",children:t}),a.jsx("span",{"data-testid":`agent-badge-${e}`,className:`hn-set-agent-badge${n?" hn-set-agent-badge--on":""}`,children:n?"dipakai sesi baru":"tidak dipakai sekarang"})]})}function Ie({engine:e,labels:t,defaults:n,codexVer:r,save:c}){const o=y({value:e.agent,delayMs:0,save:s=>{const h=n[s];return c({agent:s,model:h.model,effort:s==="claude"?h.effort:T(s,h.model,h.effort)},`${t.msg.agent} → ${s}`)}}),l=y({value:e.model,delayMs:0,save:s=>c({model:s,...e.agent==="claude"?fe(s,e.effort):{effort:T(e.agent,s,e.effort)}},`${t.msg.model} → ${s}`)}),u=y({value:e.effort,delayMs:0,save:s=>c({effort:s},`${t.msg.effort} → ${s}`)}),g=o.value==="codex";return a.jsxs(a.Fragment,{children:[a.jsx(x,{title:t.agentTitle,desc:t.agentDesc,save:o,children:a.jsx(A,{size:"sm","aria-label":t.aria.agent,value:o.value,className:"hn-set-w-sm",options:ae,onChange:s=>o.set(s.target.value)})}),g&&a.jsx(be,{model:l.value,codexVer:r}),o.value==="antigravity"&&a.jsx(pe,{}),a.jsx(x,{title:"Model",save:l,children:a.jsx(A,{size:"sm","aria-label":t.aria.model,value:l.value,className:"hn-set-w-sm",options:se(o.value,l.value),onChange:s=>l.set(s.target.value)})}),a.jsx(x,{title:"Effort",desc:t.effortDesc,last:!0,save:u,children:a.jsx(A,{size:"sm","aria-label":t.aria.effort,value:u.value,className:"hn-set-w-xs",options:ne(o.value,l.value).map(s=>({value:s,label:s==="xhigh"?"x-high":s})),onChange:s=>u.set(s.target.value)})})]})}function Oe({eyebrow:e,title:t,desc:n,toggleTitle:r="Pakai setelan sendiri",toggleDesc:c,toggleAria:o,enabled:l,onToggle:u,inherited:g,inheritedTestId:s,children:h}){const m=y({value:l,delayMs:0,save:d=>u(d)});return a.jsxs(ee,{eyebrow:e,title:t,"data-setting-card":!0,"data-search":`${t} ${e}`,children:[a.jsx(me,{children:n}),a.jsx(x,{title:r,desc:c,save:m,last:!m.value,children:a.jsx(te,{"aria-label":o,checked:m.value,onChange:d=>m.set(d)})}),m.value?h:g?a.jsx("div",{"data-testid":s,className:"hn-set-inherited",children:g}):null]})}function Re({label:e,value:t,min:n,max:r,placeholder:c,width:o,onCommit:l,onToast:u}){const[g,s]=f.useState(String(t));f.useEffect(()=>s(String(t)),[t]);const h=y({value:t,delayMs:0,save:d=>l(d)}),m=()=>{const d=g.trim(),k=d===""?NaN:Math.floor(Number(d));if(!Number.isFinite(k)||k<n){u==null||u(`${e}: isi angka ${n} atau lebih. Nilai sebelumnya dipertahankan.`,"warn","alert-triangle"),s(String(t));return}const v=Math.min(k,r);v!==k&&(u==null||u(`${e} dibatasi ke ${r}.`,"warn","alert-triangle"),s(String(v))),v!==t&&h.set(v)};return a.jsx(le,{"aria-label":e,type:"number",min:n,max:r,placeholder:c,className:o??"hn-set-w-xs",value:g,onChange:d=>s(d.target.value),onBlur:m,onKeyDown:d=>{d.key==="Enter"&&m()}})}function pe({info:e}){const[t,n]=f.useState(null);f.useEffect(()=>{var o,l;if(e!==void 0)return;let c=!0;return(l=(o=J).getAntigravityVersion)==null||l.call(o).then(u=>{c&&n(u)}).catch(()=>{c&&n({version:null,error:"Versi Antigravity tidak dapat diperiksa."})}),()=>{c=!1}},[e]);const r=e===void 0?t:e;return a.jsxs("div",{role:"status","data-testid":"antigravity-version-note",className:"hn-set-codex-note",children:["Antigravity CLI · versi ",(r==null?void 0:r.version)??"tak terdeteksi",". ",r==null?void 0:r.error,a.jsx("p",{children:"Host/lab saja; sandbox belum didukung. Mode goal native belum didukung. Telemetri native tidak diketahui."}),a.jsx("a",{href:"https://antigravity.google/docs/cli",target:"_blank",rel:"noreferrer",children:"Panduan pemasangan dan login resmi"})]})}export{pe as A,Ce as B,be as C,L as D,Ie as E,Oe as F,Re as N,me as P,S,x as a,Le as b,fe as c,Fe as d,xe as e,Te as f,we as g,_e as h,De as i,ce as j,je as n,Ae as r,Ne as s,y as u};
@@ -29,4 +29,4 @@
29
29
  * The original design remains. The terminal itself
30
30
  * has been extended to include xterm CSI codes, among
31
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}.hn-ide-tree-row{position:relative;display:flex;align-items:stretch;min-width:0}.hn-ide-tree-row>.hn-ide-tree-entry{flex:1 1 auto;min-width:0}.hn-ide-row-more{flex:0 0 auto;width:28px;display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:var(--radius-sm);background:transparent;cursor:pointer;opacity:.55}.hn-ide-tree-row:hover .hn-ide-row-more,.hn-ide-tree-row:focus-within .hn-ide-row-more{opacity:1}.hn-ide-row-more:hover{background:var(--bone-200)}@media (pointer: coarse),(max-width: 767px){.hn-ide-row-more{width:44px;height:44px;opacity:1}.hn-ide-tree-row>.hn-ide-tree-entry{min-height:44px}}.hn-ide-tree-leaf{display:flex;align-items:center;gap:8px;width:100%;padding:5px 8px;padding-left:calc(22px + var(--depth, 0) * 12px);border:none;cursor:pointer;text-align:left;background:transparent}.hn-ide-tree-dir{display:flex;align-items:center;gap:8px;width:100%;padding:5px 6px;padding-left:calc(6px + var(--depth, 0) * 12px);border:none;background:transparent;cursor:pointer;text-align:left}.hn-ide-tree-ignored{opacity:.62}.hn-ide-tree-name{flex:1 1 0%;min-width:0;font-family:var(--font-mono);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-body);font-weight:400}.hn-ide-sel .hn-ide-tree-name{color:var(--brass-700);font-weight:600}.hn-ide-tree-dirname{font-family:var(--font-mono);font-size:12.5px;color:var(--text-strong);font-weight:500}.hn-ide-sel .hn-ide-tree-dirname{color:var(--brass-700);font-weight:700}.hn-ide-tree-empty{padding:4px 8px;padding-left:calc(28px + var(--depth, 0) * 12px);font-size:11.5px;color:var(--text-subtle)}.hn-ide-tree-loading{font-size:11px;color:var(--text-subtle)}.hn-ide-status{font-family:var(--font-mono);font-size:12px;font-weight:700}.hn-ide-status[data-status=A]{color:var(--leaf-600)}.hn-ide-status[data-status=M]{color:var(--brass-700)}.hn-ide-status[data-status=D]{color:var(--status-err)}.hn-ide-stat{font-family:var(--font-mono);font-size:11px}.hn-ide-add{color:var(--leaf-600)}.hn-ide-del{color:var(--status-err)}.hn-ide-changed-row{display:flex;align-items:center;gap:8px;width:100%;padding:5px 10px;border:none;cursor:pointer;text-align:left;background:transparent}.hn-ide-sel{background:var(--brass-100)}.hn-ide-changed-path{flex:1 1 0%;min-width:0;font-family:var(--font-mono);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-body)}.hn-ide-sel .hn-ide-changed-path{color:var(--brass-700)}.hn-ide-changed-head{display:flex;align-items:center;gap:6px;padding:6px 8px}.hn-ide-view-btn{display:flex;padding:3px;border:none;cursor:pointer;border-radius:4px;background:transparent}.hn-ide-view-btn[aria-pressed=true]{background:var(--brass-100)}.hn-ide-empty-pad{padding:4px 10px;font-size:12px;color:var(--text-subtle)}.hn-ide-view-btn{min-width:24px;min-height:24px;box-sizing:border-box;align-items:center;justify-content:center}.hn-ide-changed-row{min-height:24px}.kl-screen{display:grid;gap:var(--space-4);min-width:0}.kl-muted{font-size:var(--text-xs);color:var(--text-subtle)}.kl-intro{font-size:var(--text-xs);color:var(--text-muted);line-height:1.5;margin-bottom:var(--space-4)}.kl-field-err{display:block;font-size:var(--text-2xs);color:var(--status-err);margin-top:var(--space-2)}.kl-checks{display:flex;flex-wrap:wrap;gap:var(--space-3) var(--space-4)}.kl-device{display:grid;gap:var(--space-2);flex:1 1 0;min-width:0}.kl-device-head{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2);min-width:0}.kl-device-name{font-family:var(--font-mono);font-size:var(--text-sm);font-weight:500;color:var(--text-strong);overflow-wrap:anywhere}.kl-device-meta{font-size:var(--text-xs);color:var(--text-subtle)}.kl-device-reason{font-size:var(--text-xs);color:var(--text-muted)}.kl-device-access{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1) var(--space-2);font-size:var(--text-xs);color:var(--text-muted)}.kl-device-access strong{font-weight:500;color:var(--text-strong)}.kl-device-access .kl-device-reason{flex-basis:100%}.kl-session{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1) var(--space-3);width:100%;min-width:0;padding:var(--space-2) 0;border:0;border-top:1px solid var(--border-hair);background:transparent;color:var(--text-body);font:inherit;text-align:left}.kl-session-link{cursor:pointer}.kl-session-link:hover{background:var(--bone-100)}.kl-session-id{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-subtle)}.kl-session-title{flex:1 1 180px;min-width:0;font-size:var(--text-sm);color:var(--text-strong);overflow-wrap:anywhere}.kl-session-phase{font-size:var(--text-xs);color:var(--text-muted)}.kl-access{display:grid;gap:var(--space-3);min-width:0}.kl-row{display:flex;align-items:center;gap:var(--space-4);min-width:0;padding:var(--space-3) 0;border-bottom:1px solid var(--border-hair)}.kl-row-last{border-bottom:0}.kl-row-text{flex:1 1 auto;min-width:0}.kl-row-title{font-size:var(--text-sm);font-weight:600;color:var(--text-strong)}.kl-row-desc{font-size:var(--text-xs);color:var(--text-muted);line-height:1.5;margin-top:var(--space-1)}.kl-tier-head{font-size:var(--text-xs);font-weight:600;color:var(--text-strong)}.kl-tier-group{gap:var(--space-2)}.kl-tier-hint{font-size:var(--text-xs);color:var(--text-subtle)}.kl-access-requests{display:grid;gap:var(--space-2);min-width:0}.kl-request-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--space-2)}.kl-device-request-entry{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2)}.kl-device-request{display:grid;gap:var(--space-2);padding:var(--space-2) 0}.kl-request-list{margin:0;padding:0;list-style:none;display:grid;gap:var(--space-1);font-size:var(--text-xs)}.kl-khusus{font-size:var(--text-xs);color:var(--text-muted)}.kl-khusus summary{cursor:pointer;color:var(--text-strong);padding:var(--space-1) 0}.kl-audit-row{font-size:var(--text-xs);padding:var(--space-2) 0;border-bottom:1px solid var(--border-hair);overflow-wrap:anywhere}.kl-status-line{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-3);font-size:var(--text-sm)}.kl-status-origin{color:var(--text-muted);overflow-wrap:anywhere;min-width:0}.kl-account{display:grid;gap:var(--space-2);flex:1 1 0;min-width:0}.kl-account-head{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2)}.kl-account-email{font-weight:500;color:var(--text-strong);overflow-wrap:anywhere}.kl-account-projects{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-4);margin-top:var(--space-2)}.kl-banner{position:sticky;top:0;z-index:3;display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-3);padding:var(--space-3) var(--space-4);margin-bottom:var(--space-4);background:var(--action-bg);color:var(--action-on);border-radius:var(--radius-md);font-size:var(--text-sm);line-height:1.4}.kl-banner-text{flex:1 1 220px;min-width:0;overflow-wrap:anywhere}@media (min-width: 768px){.kl-row-text{flex-basis:200px}}@media (max-width: 767px){.kl-row{flex-direction:column;align-items:flex-start}}.hn-ov{display:flex;flex-direction:column;gap:var(--space-4);min-width:0}.hn-ov-section{min-width:0;padding:var(--space-4) var(--space-5);background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm)}.hn-ov-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--space-2) var(--space-3);margin-bottom:var(--space-2);min-width:0}.hn-ov-head-text{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--space-1) var(--space-3);min-width:0}.hn-ov-title{margin:0;font-family:var(--font-display);font-size:var(--text-xl);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight);line-height:1.2;color:var(--text-strong)}.hn-ov-head-actions{display:flex;flex-wrap:wrap;gap:var(--space-2);margin-left:auto}.hn-ov-meta{font-family:var(--font-ui);font-size:var(--text-xs);color:var(--text-muted)}.hn-ov-name{min-width:8ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:var(--text-sm);font-weight:var(--weight-medium);color:var(--text-strong)}.hn-ov-prj .hn-row-main{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,1fr) auto auto;align-items:center;column-gap:var(--space-3)}.hn-ov-pagehead .hn-page-title{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.hn-ov-empty{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1) var(--space-2);margin:0;padding:var(--space-1) 0;font-family:var(--font-ui);font-size:var(--text-sm);color:var(--text-body)}.hn-ov-empty>svg{flex:0 0 auto;color:var(--text-subtle)}.hn-ov-none{margin:0;padding:var(--space-1) 0}.hn-ov-cov{min-width:0;display:flex;align-items:center;gap:var(--space-2)}.hn-ov-bar{flex:1 1 auto;min-width:0}.hn-ov-pct{flex:0 0 auto;min-width:3ch;font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-muted);text-align:right}.hn-ov-prj-meta{white-space:nowrap}.hn-ov-foot{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--space-2) var(--space-3);margin-top:var(--space-3);padding-top:var(--space-3);border-top:1px solid var(--border-hair)}.hn-ov-foot-link{min-width:0;max-width:100%;min-height:30px;margin:0;padding:var(--space-1) var(--space-3);display:inline-flex;align-items:center;gap:var(--space-2);text-align:left;border:1px solid transparent;border-radius:var(--radius-sm);background:transparent;color:var(--text-body);font:var(--weight-medium) var(--text-sm)/1.35 var(--font-ui);white-space:normal;cursor:pointer}.hn-ov-foot-link:hover{background:var(--bone-200)}.hn-ov-foot-link>svg{flex:0 0 auto}@media (max-width: 767px){.hn-ov-section{padding:var(--space-4)}.hn-ov-prj .hn-row-main{grid-template-columns:minmax(0,1fr) auto;row-gap:var(--space-1)}.hn-ov-prj .hn-ov-cov{grid-column:1 / -1;order:3}.hn-ov-prj .hn-ov-prj-status{order:2}.hn-ov-prj .hn-ov-prj-meta{order:4;grid-column:1 / -1}.hn-ov-attn .hn-row-main{flex-wrap:wrap;align-items:center;row-gap:var(--space-1);column-gap:var(--space-2)}.hn-ov-attn .hn-row-main>:first-child{order:2}.hn-ov-attn .hn-ov-name{order:1;flex:1 1 100%;white-space:normal;overflow-wrap:anywhere;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.hn-ov-attn .hn-ov-meta{order:2;flex:1 1 0;min-width:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.hn-ov-foot-link{width:100%;min-height:var(--touch-target);padding-inline:var(--space-2)}}.hn-ovk-masthead{text-align:center;margin-bottom:var(--space-2)}.hn-ovk-title{margin:0;font-family:var(--font-display);font-size:30px;font-weight:600;letter-spacing:.02em;color:var(--text-strong)}.hn-ovk-dateline{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;border-top:2px solid var(--text-strong);border-bottom:1px solid var(--text-strong);padding:4px 0;margin-top:6px;font-family:var(--font-mono);font-size:12px;color:var(--text-muted)}.hn-ovk-headline{margin:14px 0 6px;font-family:var(--font-display);font-size:26px;line-height:1.25;color:var(--text-strong);max-width:46ch}.hn-ovk-tone--bad{color:var(--clay-600)}.hn-ovk-tone--good{color:var(--leaf-600)}.hn-ovk-kicker{margin:0;font-family:var(--font-ui);font-size:11px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:var(--text-subtle)}.hn-ovk-delta{font-size:12px;color:var(--text-muted)}.hn-ovk-koreksi{border:1px solid var(--border-hair);border-left:3px solid var(--amber-600);background:var(--surface-card);padding:8px 12px;margin:8px 0 12px}.hn-ovk-cols{display:grid;grid-template-columns:1.4fr 1fr 1fr;gap:16px;align-items:start}.hn-ovk-col{display:grid;gap:16px;min-width:0}.hn-ovk-col--lead{grid-column:1}.hn-ovk-col--mid{grid-column:2}.hn-ovk-col--side{grid-column:3}.hn-ovk-indeks .hn-ov-pct,.hn-ovk-indeks .hn-ov-prj-meta{font-family:var(--font-mono)}.hn-ovk-indeks .hn-ov-prj>*{border-bottom:1px dotted var(--border-hair)}@media (max-width: 1100px){.hn-ovk-cols{grid-template-columns:1fr 1fr}.hn-ovk-col--lead{grid-column:1 / -1}.hn-ovk-col--mid{grid-column:1}.hn-ovk-col--side{grid-column:2}}@media (max-width: 720px){.hn-ovk-cols{grid-template-columns:1fr}.hn-ovk-col--lead,.hn-ovk-col--mid,.hn-ovk-col--side{grid-column:1}.hn-ovk-col--side{order:2}.hn-ovk-col--mid{order:3}.hn-ovk-headline{font-size:21px}.hn-ovk-title{font-size:24px}}.hn-ovk-denyut{background:var(--term-bg);color:var(--term-fg);border-radius:6px;padding:12px}.hn-ovk-denyut .hn-ovk-kicker,.hn-ovk-denyut .hn-ov-meta{color:var(--term-dim)}.hn-ovk-denyut .hn-ov-name{color:var(--term-fg)}.hn-ovk-denyut .hn-ov-empty,.hn-ovk-more{color:var(--term-dim)}.hn-ovk-trace{display:block;flex:1 1 120px;min-width:80px;height:24px;overflow:hidden}.hn-ovk-trace svg{display:block;width:200%;height:100%}.hn-ovk-trace path{fill:none;stroke:var(--brass-400);stroke-width:1.6;vector-effect:non-scaling-stroke}.hn-ovk-trace--flat path{stroke:var(--clay-500);stroke-dasharray:4 4}.hn-ovk-trace-run{animation:hn-ovk-scroll 2.4s linear infinite}.hn-ovk-trace--b .hn-ovk-trace-run{animation-duration:3.1s}.hn-ovk-trace--c .hn-ovk-trace-run{animation-duration:1.9s}.hn-ovk-trace--flat .hn-ovk-trace-run{animation:none}@keyframes hn-ovk-scroll{0%{transform:translate(0)}to{transform:translate(-50%)}}@media (prefers-reduced-motion: reduce){.hn-ovk-trace-run{animation:none}}.hn-ovk-denyut .hn-row-main{flex-wrap:wrap}.hn-ovk-denyut .hn-row{border-bottom-color:var(--term-line)}.hn-ovk-denyut .hn-row-interactive:hover,.hn-ovk-denyut .hn-row-interactive:focus-within{background:var(--term-line)}.hn-ovk-denyut .hn-ov-head-actions{--text-body: var(--term-fg);--bone-200: var(--term-line)}.hn-ovk-panel{background:var(--surface-card);border:1px solid var(--border-hair);border-radius:6px;padding:12px;display:grid;gap:6px;min-width:0}.hn-ovk-panel p{margin:0}.hn-ovk-figure{margin:0;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.hn-ovk-big{font-family:var(--font-display);font-size:32px;line-height:1;color:var(--text-strong)}.hn-ovk-unit{font-size:13px;color:var(--text-muted)}.hn-ovk-lede{margin:0;font-family:var(--font-display);font-size:17px;color:var(--text-strong)}.hn-ovk-mono{font-family:var(--font-mono)}.hn-ovk-pill{font-size:11px;font-weight:600;padding:1px 8px;border-radius:999px;background:var(--brass-100);color:var(--brass-700)}.hn-ovk-pill--bad{background:var(--clay-100);color:var(--clay-600)}.hn-ovk-river{width:100%;height:56px}.hn-ovk-river path{fill:var(--brass-100);stroke:var(--brass-500);stroke-width:1}.hn-ovk-river-labels{margin:0;display:flex;justify-content:space-between;font-size:11px;color:var(--text-muted)}.hn-ovk-spark{width:100%;height:44px}.hn-ovk-spark polyline{fill:none;stroke:var(--brass-500);stroke-width:1.5;vector-effect:non-scaling-stroke}.hn-ovk-spark-proj{stroke:var(--brass-500);stroke-dasharray:3 2;vector-effect:non-scaling-stroke}.hn-ovk-spark-limit{stroke:var(--clay-500);stroke-width:.6;vector-effect:non-scaling-stroke}.hn-ovk-heatwrap{margin-top:16px}.hn-ovk-heat{display:grid;grid-template-columns:48px repeat(24,minmax(0,1fr));gap:2px;align-items:center}.hn-ovk-heat-day{font-family:var(--font-mono);font-size:10px;color:var(--text-muted)}.hn-ovk-heat-cell{aspect-ratio:1;border-radius:2px;background:var(--bone-200)}.hn-ovk-heat-cell--1{background:var(--brass-100)}.hn-ovk-heat-cell--2{background:var(--brass-300)}.hn-ovk-heat-cell--3{background:var(--brass-400)}.hn-ovk-heat-cell--4{background:var(--brass-600)}@media (max-width: 720px){.hn-ovk-heat{grid-template-columns:36px repeat(24,minmax(0,1fr));gap:1px}}.hn-skills-workspace{display:flex;flex-direction:column;flex:1 1 0%;min-height:0;min-width:0;gap:var(--space-3)}.hn-skill-master{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;min-width:0;background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-lg);overflow:hidden}.hn-skill-master-foot{display:flex;justify-content:flex-end;padding:var(--space-2);border-top:1px solid var(--border-hair)}.hn-skill-list{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.hn-skill-list-tools{display:flex;flex-direction:column;gap:var(--space-2);padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--border-hair)}.hn-skill-list-scroll{flex:1 1 auto;min-height:0;overflow:auto;padding:var(--space-1) var(--space-2) var(--space-2)}.hn-skill-list-error{padding:4px 8px;font-size:var(--text-xs);color:var(--clay-600)}.hn-skill-rows{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}.hn-skill-row{display:flex;flex-direction:column;gap:2px;width:100%;box-sizing:border-box;min-height:44px;padding:8px 10px;border:0;border-radius:var(--radius-sm);background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;min-width:0}.hn-skill-row:hover{background:var(--bone-200)}.hn-skill-row.is-selected{background:var(--brass-100);box-shadow:inset 3px 0 0 var(--brass-500)}.hn-skill-row:focus-visible{outline:2px solid var(--border-focus);outline-offset:-2px}.hn-skill-row-head{display:flex;align-items:center;gap:6px;min-width:0}.hn-skill-row-name{flex:1 1 auto;min-width:0;font-family:var(--font-mono);font-size:var(--text-sm);color:var(--text-strong);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hn-skill-row-desc{font-size:var(--text-xs);color:var(--text-subtle);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hn-skill-row-meta{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:var(--text-2xs);color:var(--text-subtle)}.hn-skill-detail{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;min-width:0;background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-lg);overflow:hidden}.hn-skill-detail-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-3);padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--border-hair);min-width:0}.hn-skill-detail-text{display:flex;flex-direction:column;gap:2px;min-width:0}.hn-skill-detail-name{font-family:var(--font-mono);font-size:var(--text-md);font-weight:var(--weight-semibold);color:var(--text-strong);overflow-wrap:anywhere}.hn-skill-detail-desc{font-size:var(--text-sm);color:var(--text-muted)}.hn-skill-detail-body{display:flex;flex-wrap:wrap;flex:1 1 auto;min-height:0;align-items:stretch}.hn-skill-detail-structure{flex:0 1 240px;min-width:200px;min-height:200px;display:flex}.hn-skill-detail-editor{flex:1 1 420px;min-width:0;min-height:320px;display:flex}.hn-skill-structure{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;min-height:0;border-right:1px solid var(--border-hair)}.hn-skill-structure-head{padding:10px 14px;border-bottom:1px solid var(--border-hair)}.hn-skill-structure-name{font-size:var(--text-xs);color:var(--text-strong)}.hn-skill-structure-tree{flex:1 1 auto;min-height:0;overflow:auto;padding:8px}.hn-skill-structure-foot{display:flex;gap:8px;padding:8px;border-top:1px solid var(--border-hair);flex-wrap:wrap}.hn-skill-error-text{color:var(--clay-600)}.hn-skill-editor{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;min-height:0}.hn-skill-editor-head{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;padding:10px 16px;border-bottom:1px solid var(--border-hair)}.hn-skill-editor-path{flex:1 1 auto;min-width:0;font-size:var(--text-sm);overflow-wrap:anywhere}.hn-skill-frontmatter{padding:10px 16px;border-bottom:1px solid var(--border-hair);background:var(--bone-200)}.hn-skill-fm-name{font-family:var(--font-mono);font-size:var(--text-xs)}.hn-skill-fm-desc{font-size:var(--text-sm);color:var(--text-muted)}.hn-skill-editor-body{flex:1 1 auto;min-height:0;overflow:auto;padding:var(--space-4)}.hn-skill-editor-body.is-edit{padding:0}.hn-skill-textarea{display:block;width:100%;height:100%;min-height:320px;box-sizing:border-box;resize:none;border:0;padding:var(--space-4);background:transparent;color:var(--text-body);font-family:var(--font-mono);font-size:var(--text-sm)}.hn-skill-textarea:focus-visible{outline:2px solid var(--border-focus);outline-offset:-2px}.hn-skill-pre{margin:0;font-family:var(--font-mono);font-size:var(--text-sm);white-space:pre-wrap}.hn-skill-savebar{position:sticky;bottom:0;z-index:1;display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2);padding:var(--space-2) var(--space-3);border-top:1px solid var(--border-hair);background:var(--bone-100)}.hn-skill-conflict{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2);font-size:var(--text-xs);color:var(--clay-600)}.hn-agents{display:flex;flex-direction:column;gap:var(--space-3);min-width:0}.hn-agents-head{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap}.hn-agents-scope{flex:1 1 280px;min-width:0;margin:0;font-size:var(--text-xs);color:var(--text-subtle)}.hn-agent-evidence{border:1px solid var(--border-hair);border-radius:var(--radius-sm);padding:0 var(--space-3);background:var(--surface-card);min-width:0}.hn-agent-evidence-summary{display:flex;align-items:center;min-height:36px;cursor:pointer;font-size:var(--text-xs);color:var(--text-muted)}.hn-agent-evidence-summary:focus-visible{outline:2px solid var(--border-focus);outline-offset:-2px}.hn-agent-evidence-body{display:flex;flex-direction:column;gap:var(--space-2);padding-bottom:var(--space-3);min-width:0}.hn-agent-card{display:flex;flex-direction:column;gap:6px;padding:14px;min-width:0;background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-lg)}.hn-agent-head{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;min-width:0}.hn-agent-name{font-family:var(--font-mono);font-weight:var(--weight-semibold);color:var(--text-strong);overflow-wrap:anywhere}.hn-agent-desc{margin:0;font-size:var(--text-xs);color:var(--text-muted)}.hn-agent-note{margin:0;font-size:var(--text-xs);color:var(--text-muted);line-height:1.5}.hn-agent-error{display:block;margin-top:3px;color:var(--clay-600)}.hn-agent-meta{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-4);margin:0;font-size:var(--text-xs);color:var(--text-subtle)}.hn-agent-meta>div{display:flex;gap:4px;min-width:0}.hn-agent-meta dt{color:var(--text-subtle)}.hn-agent-meta dd{margin:0;color:var(--text-body);overflow-wrap:anywhere}.hn-agent-card>.hn-agent-evidence{margin-top:var(--space-1)}.hn-agent-samples{display:flex;flex-direction:column;gap:var(--space-2)}.hn-agent-sample{padding:var(--space-2);border:1px solid var(--border-hair);border-radius:var(--radius-sm)}.hn-agent-sample-meta{font-size:var(--text-xs);color:var(--text-subtle);margin-bottom:6px}.hn-agent-sample-form{display:flex;flex-wrap:wrap;gap:var(--space-2)}.hn-agent-metrics{display:flex;gap:14px;flex-wrap:wrap;padding-top:9px;border-top:1px solid var(--border-hair);font-size:var(--text-xs);color:var(--text-subtle)}.hn-agent-stat{display:flex;flex-direction:column;gap:2px;max-width:280px}.hn-agent-stat-caption{color:var(--text-muted)}.hn-agent-stat-line{font-size:var(--text-xs)}.hn-agent-variants{margin-top:var(--space-2)}.hn-agent-variants summary{cursor:pointer;font-size:var(--text-xs);min-height:32px;display:flex;align-items:center}.hn-agent-variants ul{font-size:var(--text-xs);color:var(--text-muted);padding-left:20px}.hn-agent-grid2{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--space-3)}@media (max-width: 767px){.hn-skill-detail-structure,.hn-skill-detail-editor{flex-basis:100%;min-width:0}.hn-skill-detail-structure{min-height:0;max-height:220px}.hn-skill-detail-editor{min-height:320px}.hn-agent-grid2{grid-template-columns:minmax(0,1fr)}}.hn-am-intro{font-size:12.5px;color:var(--text-muted);margin-bottom:12px;line-height:1.5}.hn-am-warn{font-size:12.5px;color:var(--status-warn, var(--text-muted));margin-bottom:12px}.hn-am-row{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}.hn-am-grid{display:grid;gap:10px}.hn-am-label{margin-bottom:4px}.hn-am-note{font-size:12.5px;color:var(--text-subtle)}.hn-qa-stack{display:flex;flex-direction:column;gap:var(--space-3);min-width:0}.hn-qa-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2);min-width:0}.hn-qa-toolbar-project{flex:0 1 240px;min-width:0}.hn-qa-intro{margin:0;max-width:70ch;font-size:var(--text-sm);color:var(--text-subtle)}.hn-qa-note{margin:0;font-size:var(--text-xs);color:var(--text-subtle)}.hn-qa-note-list{margin:0;padding-left:18px}.hn-qa-error{margin:0;font-size:var(--text-sm);color:var(--status-err);overflow-wrap:anywhere}.hn-qa-code{font-family:var(--font-mono);font-size:var(--text-2xs);color:var(--text-subtle);white-space:nowrap}.hn-qa-label{font-size:var(--text-xs);font-weight:var(--weight-semibold);color:var(--text-strong);margin-bottom:var(--space-1)}.hn-qa-pre{white-space:pre-wrap;overflow-wrap:anywhere;font-size:var(--text-sm);color:var(--text-body)}.hn-qa-row-body{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1 1 200px}.hn-qa-row-head{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2);min-width:0}.hn-qa-row-title{display:block;font-size:var(--text-md);font-weight:var(--weight-semibold);color:var(--text-strong);overflow-wrap:anywhere;min-width:0}.hn-qa-row-line{display:flex;flex-wrap:wrap;align-items:center;gap:2px var(--space-3);min-width:0;font-size:var(--text-xs);color:var(--text-subtle)}.hn-qa-row-line>span{min-width:0;overflow-wrap:anywhere}.hn-qa-row-stat{color:var(--text-muted)}.hn-qa-editor{display:flex;flex-direction:column;gap:var(--space-3);min-width:0}.hn-qa-bar{position:sticky;top:0;z-index:2;display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2);padding:var(--space-2) 0;background:var(--surface-page);border-bottom:1px solid var(--border-hair);min-width:0}.hn-qa-bar-title{flex:1 1 200px;min-width:0;display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2)}.hn-qa-bar-name{margin:0;min-width:0;font-size:var(--text-md);font-weight:var(--weight-semibold);color:var(--text-strong);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hn-qa-bar-actions{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2);flex:0 0 auto;min-width:0}.hn-qa-bar-save{display:inline-flex;align-items:center;gap:6px;min-width:0;max-width:360px;font-size:var(--text-xs);color:var(--text-subtle)}.hn-qa-bar-save.is-error{color:var(--status-err)}@media (max-width: 767px){.hn-qa-editor{padding-bottom:calc(84px + env(safe-area-inset-bottom))}.hn-qa-bar-actions{position:fixed;left:0;right:0;bottom:0;z-index:5;justify-content:flex-end;padding:var(--space-2) var(--page-gutter-x) calc(var(--space-2) + env(safe-area-inset-bottom));background:var(--surface-card);border-top:1px solid var(--border-hair)}.hn-qa-bar-save{flex:1 1 100%;max-width:none;order:-1}}.hn-qa-info{display:flex;flex-direction:column;gap:var(--space-2);min-width:0;padding:var(--space-3) var(--space-4);background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-lg)}.hn-qa-info-head{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2);min-width:0}.hn-qa-info-title{margin:0;flex:1 1 160px;min-width:0;font-size:var(--text-sm);font-weight:var(--weight-semibold);color:var(--text-strong)}.hn-qa-facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,170px),1fr));gap:var(--space-2) var(--space-4);margin:0;min-width:0}.hn-qa-facts>div{min-width:0}.hn-qa-facts dt{font-size:var(--text-2xs);color:var(--text-subtle)}.hn-qa-facts dd{margin:0;font-size:var(--text-sm);color:var(--text-strong);overflow-wrap:anywhere}.hn-qa-form{display:flex;flex-direction:column;min-width:0}.hn-qa-grid{display:grid;gap:var(--space-3);grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));min-width:0}.hn-qa-fieldset{border:0;margin:0 0 var(--space-3);padding:0;min-width:0}.hn-qa-legend{padding:0;margin:0 0 var(--space-2);font-size:var(--text-sm);font-weight:var(--weight-semibold);color:var(--text-strong)}.hn-qa-more{margin-top:var(--space-1)}.hn-qa-more>summary{cursor:pointer;color:var(--text-subtle);font-size:var(--text-sm);padding:var(--space-1) 0}.hn-qa-file{display:block;width:100%;max-width:100%;font:var(--text-sm)/1.4 var(--font-ui);color:var(--text-body)}.hn-qa-file::file-selector-button{margin-right:10px;height:34px;padding:0 12px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--surface-card);color:var(--text-strong);font:var(--weight-medium) var(--text-sm)/1 var(--font-ui);cursor:pointer;box-shadow:var(--shadow-xs)}.hn-qa-file::file-selector-button:hover{background:var(--bone-100)}.hn-qa-file:focus-visible{outline:2px solid var(--border-focus);outline-offset:3px;border-radius:var(--radius-sm)}.hn-qa-file:disabled{opacity:.5}.hn-qa-modal-stack{display:flex;flex-direction:column;gap:var(--space-3);min-width:0}.hn-qa-check{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--space-3);min-width:0}.hn-qa-check>li{display:grid;grid-template-columns:22px minmax(0,1fr);gap:var(--space-2);align-items:start;padding-bottom:var(--space-3);border-bottom:1px solid var(--border-hair)}.hn-qa-check>li:last-child{border-bottom:0;padding-bottom:0}.hn-qa-check-icon{display:inline-flex;padding-top:1px}.hn-qa-check-icon.is-ok{color:var(--leaf-600)}.hn-qa-check-icon.is-warn{color:var(--amber-600)}.hn-qa-check-icon.is-miss{color:var(--clay-600)}.hn-qa-check-name{font-size:var(--text-sm);font-weight:var(--weight-semibold);color:var(--text-strong)}.hn-qa-check-note{font-size:var(--text-xs);color:var(--text-subtle);overflow-wrap:anywhere}.hn-qa-check-body{display:flex;flex-direction:column;gap:var(--space-2);min-width:0}.hn-qa-export{display:flex;flex-direction:column;gap:var(--space-1);min-width:0}.hn-qa-export>a{justify-content:flex-start}.hn-qa-case-head{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--space-2);min-width:0}.hn-qa-case-code{flex:0 1 120px;min-width:0}.hn-qa-case-name{flex:1 1 200px;min-width:0}.hn-qa-case-status{display:flex;flex-direction:column;gap:var(--space-2);margin-top:var(--space-1);min-width:0}.hn-qa-case-grid{display:grid;gap:var(--space-3);grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));margin-top:var(--space-2);min-width:0}.hn-qa-add{display:flex;flex-wrap:wrap;gap:var(--space-2);align-items:flex-start;min-width:0}.hn-qa-add-field{flex:1 1 240px;min-width:0}.hn-qa-save{display:inline-flex;align-items:center;gap:6px;min-height:20px;font-size:var(--text-xs);color:var(--text-subtle);overflow-wrap:anywhere}.hn-qa-save.is-saved{color:var(--leaf-600)}.hn-qa-save.is-error{color:var(--status-err)}.hn-qa-seg{min-width:0}.hn-qa-seg .hn-choice-target{position:relative;min-height:36px;border-radius:var(--radius-sm);background:var(--surface-card);border:1px solid var(--border-strong)}.hn-qa-seg .hn-choice-target>span:last-child{display:flex;align-items:center;min-height:36px;padding:0 12px}.hn-qa-seg .hn-choice-control{position:absolute;left:0;top:0;opacity:0}.hn-qa-seg .hn-choice-target:focus-within{outline:2px solid var(--border-focus);outline-offset:2px}.hn-qa-seg .hn-choice-target.is-on{background:var(--brass-100);border-color:var(--brass-600)}.hn-qa-seg .hn-choice-target.is-on>span:last-child{font-weight:var(--weight-semibold)}.hn-qa-detail-grid{display:grid;gap:var(--space-3);grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));min-width:0}.hn-qa-detail-stack{display:flex;flex-direction:column;gap:var(--space-3);min-width:0}.hn-qa-steps{margin:0;padding-left:20px;font-size:var(--text-sm);color:var(--text-body)}.hn-qa-steps li{overflow-wrap:anywhere}.hn-qa-result-line{font-size:var(--text-xs);color:var(--text-subtle);overflow-wrap:anywhere}.hn-qa-result-line.is-err{color:var(--status-err)}.hn-qa-attach{min-width:0;margin-top:var(--space-2);border-radius:var(--radius-sm)}.hn-qa-attach:focus-visible{outline:2px solid var(--border-focus);outline-offset:3px}.hn-qa-attach-list{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--space-3);min-width:0}.hn-qa-attach-item{display:grid;gap:4px;max-width:160px;min-width:0}.hn-qa-attach-img{height:96px;max-width:160px;object-fit:cover;border-radius:var(--radius-sm);border:1px solid var(--border-strong)}.hn-qa-attach-img.is-compact{height:64px}.hn-qa-attach-file{font-size:var(--text-xs);overflow-wrap:anywhere}.hn-qa-attach-meta{font-size:var(--text-2xs);color:var(--text-subtle);overflow-wrap:anywhere}.hn-qa-attach-hint{margin:var(--space-2) 0 0;font-size:var(--text-xs);color:var(--text-subtle)}.hn-qa-preview{display:grid;gap:var(--space-3);grid-template-columns:minmax(0,1fr);min-width:0}.hn-qa-preview .hn-md table{display:block;overflow-x:auto;max-width:100%}.hn-qa-preview .hn-md th{white-space:nowrap}.hn-qa-preview .hn-md td{min-width:112px;overflow-wrap:break-word;word-break:normal}.hn-review{display:flex;flex-direction:column;gap:12px;min-width:0}.hn-review-topbar{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}.hn-review-head{display:flex;flex-direction:column;gap:2px;min-width:0}.hn-review-title{margin:0;font-family:var(--font-display);font-size:var(--text-xl);font-weight:600;color:var(--text-strong);line-height:1.25;overflow-wrap:anywhere}.hn-review-stat{margin:0;font-size:var(--text-sm);color:var(--text-muted)}.hn-review-delta{font-family:var(--font-mono);font-weight:600;color:var(--text-strong)}.hn-review-pane{display:flex;flex-direction:column;min-width:0;background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-lg);overflow:hidden}.hn-review-list{padding:6px 4px;min-width:0}.hn-review-sep{padding:8px 8px 6px;margin-top:8px;border-top:1px solid var(--border-hair)}.hn-review-legend{margin:0;padding:8px 12px;border-top:1px solid var(--border-hair);font-size:var(--text-xs);color:var(--text-subtle)}.hn-review-viewer{display:flex;flex-direction:column;min-width:0;background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-lg);overflow:hidden}.hn-review-viewbar{display:flex;align-items:center;gap:8px 12px;flex-wrap:wrap;padding:10px 14px;border-bottom:1px solid var(--border-hair);min-width:0}.hn-review-path{flex:1 1 180px;min-width:0;font-family:var(--font-mono);font-size:var(--text-sm);font-weight:500;color:var(--text-strong);overflow-wrap:anywhere}.hn-review-filestat{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-muted);white-space:nowrap}.hn-review-seg{display:inline-flex;gap:2px;padding:2px;background:var(--bone-100);border-radius:var(--radius-pill)}.hn-review-seg button{padding:4px 12px;border:none;cursor:pointer;border-radius:var(--radius-pill);font:inherit;font-size:var(--text-xs);color:var(--text-muted);background:transparent}.hn-review-seg button[aria-pressed=true]{background:var(--surface-card);color:var(--text-strong);font-weight:600}.hn-review-seg button:focus-visible{outline:2px solid var(--border-focus);outline-offset:1px}.hn-review-body{min-width:0;background:var(--surface-card)}.hn-review-diff{padding:10px 0}.hn-review-truncated{display:flex;align-items:center;flex-wrap:wrap;gap:8px;padding:8px 12px;font-size:var(--text-xs);color:var(--text-muted)}.hn-review-truncated a{color:var(--brass-700);font-weight:500}.hn-review-pre{margin:0;padding:12px 16px;font-family:var(--font-mono);font-size:var(--text-xs);line-height:1.6;white-space:pre-wrap;word-break:break-word;color:var(--text-body)}.hn-review-decide{position:sticky;bottom:0;z-index:2;display:flex;align-items:center;justify-content:space-between;gap:8px 12px;flex-wrap:wrap;padding:10px 12px;background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-lg);box-shadow:var(--shadow-md)}.hn-review-decide-hint{margin:0;flex:1 1 260px;font-size:var(--text-sm);color:var(--text-muted);line-height:1.5}.hn-review-decide-err{flex:1 1 100%;margin:0}.hn-review-decide-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}.hn-review-more{display:inline-flex}@media (min-width: 768px){.hn-review-list,.hn-review-body{max-height:min(640px,60dvh);overflow:auto}}@media (pointer: coarse),(max-width: 767px){.hn-review button{min-height:var(--touch-target)}.hn-review-seg button{min-height:var(--touch-target);padding:8px 14px}}@media (max-width: 767px){.hn-review-decide{padding-bottom:calc(10px + var(--safe-bottom))}.hn-review-viewbar{align-items:stretch}.hn-review-path{flex-basis:100%}}@media (max-width: 399px){.hn-review-decide-hint{flex:1 1 0;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}.hn-reconcile-error{font-size:var(--text-sm);color:var(--clay-600);background:var(--status-err-tint);border:1px solid var(--clay-500);border-radius:var(--radius-sm);padding:8px 10px;margin-bottom:12px}.hn-reconcile-card{border:1px solid var(--border-hair);border-radius:var(--radius-md);padding:12px;margin:0 0 12px;background:var(--surface-card);min-width:0}.hn-reconcile-head{display:flex;align-items:baseline;gap:8px 10px;flex-wrap:wrap;font-size:var(--text-sm);color:var(--text-strong)}.hn-reconcile-id{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-muted);overflow-wrap:anywhere}.hn-reconcile-hint{font-size:var(--text-xs);color:var(--text-muted)}.hn-reconcile-meta{display:flex;flex-wrap:wrap;gap:4px 16px;margin-top:4px;font-size:var(--text-xs);color:var(--text-subtle)}.hn-reconcile-same{margin:10px 0 0;font-size:var(--text-sm);color:var(--text-muted)}.hn-reconcile-fields{margin:10px 0 0;display:flex;flex-direction:column;gap:6px;min-width:0}.hn-reconcile-field{display:grid;grid-template-columns:minmax(0,110px) minmax(0,1fr) minmax(0,1fr);gap:8px 12px;align-items:start;padding:8px 10px;border-radius:var(--radius-sm);background:var(--bone-100)}.hn-reconcile-field dt{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-strong);overflow-wrap:anywhere}.hn-reconcile-field dd{margin:0;min-width:0;font-size:var(--text-xs);color:var(--text-body)}.hn-reconcile-field code{display:block;font-family:var(--font-mono);font-size:var(--text-xs);white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.5}.hn-reconcile-field-head{background:transparent;padding-bottom:0}.hn-reconcile-field-head dt,.hn-reconcile-field-head dd{font-family:var(--font-ui);font-size:var(--text-xs);color:var(--text-subtle);font-weight:600}.hn-reconcile-side{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;font-size:var(--text-xs);color:var(--text-subtle);font-weight:600}.hn-reconcile-actions{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap;margin-top:10px}@media (max-width: 767px){.hn-reconcile-field{grid-template-columns:minmax(0,1fr);gap:4px}.hn-reconcile-field-head{display:none}.hn-reconcile-side{position:static;width:auto;height:auto;overflow:visible;clip-path:none;white-space:normal;display:block;margin-bottom:2px}.hn-reconcile-actions>*{flex:1 1 140px;justify-content:center}.hn-reconcile-field dt{font-weight:600}}.hn-bl-screen{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;min-width:0}.hn-bl-toolbar{display:flex;flex-direction:column;gap:var(--space-2);margin-bottom:var(--space-4);min-width:0}.hn-bl-stage-tabs{max-width:100%;overflow-x:auto}.hn-bl-status-line{display:flex;flex-wrap:wrap;gap:var(--space-2);min-height:0}.hn-bl-status-line:empty{display:none}.hn-bl-stale{font:var(--weight-medium) var(--text-xs)/1.5 var(--font-ui);color:var(--status-warn)}.hn-bl-muted{font:var(--weight-regular, 400) var(--text-xs)/1.5 var(--font-ui);color:var(--text-muted)}.hn-bl-hint{margin:0;font:var(--weight-regular, 400) var(--text-xs)/1.5 var(--font-ui);color:var(--text-muted)}.hn-bl-gap-top{margin-top:var(--space-2)}.hn-bl-gap-bottom{margin-bottom:var(--space-2)}.hn-bl-view-toggle{display:inline-flex;gap:2px;padding:2px;background:var(--bone-200);border-radius:var(--radius-sm)}.hn-bl-view-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);cursor:pointer}.hn-bl-view-btn:hover{color:var(--text-strong)}.hn-bl-view-btn[aria-pressed=true]{background:var(--surface-card);color:var(--text-strong);box-shadow:var(--shadow-xs)}.hn-bl-view-btn:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}.hn-bl-full{width:100%}.hn-bl-date-row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2);min-width:0}.hn-bl-body{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;min-width:0}.hn-bl-list-scroll{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;border:1px solid var(--border-hair);border-radius:var(--radius-lg);background:var(--surface-card)}.hn-bl-pager{margin-top:var(--space-3);border:1px solid var(--border-hair);border-radius:var(--radius-lg);overflow:hidden}.hn-bl-prio{--dot: var(--ink-400);display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:12px;height:12px}.hn-bl-prio:before{content:"";display:block;border-radius:50%;box-sizing:border-box;width:9px;height:9px;border:1.5px solid var(--dot);background:var(--dot)}.hn-bl-prio-high:before{width:12px;height:12px}.hn-bl-prio-low:before{background:transparent}.hn-bl-prio[data-status=done]{--dot: var(--leaf-500)}.hn-bl-prio[data-status=running]{--dot: var(--brass-600)}.hn-bl-prio[data-status=queued]{--dot: var(--brass-400, var(--brass-500))}.hn-bl-prio-text{display:inline-flex;align-items:center;gap:var(--space-2);font:var(--weight-medium) var(--text-sm)/1 var(--font-ui);color:var(--text-strong)}.hn-bl-stage-pill{flex:0 0 auto}.hn-bl-id{font:var(--weight-regular, 400) var(--text-2xs)/1 var(--font-mono);color:var(--text-subtle);white-space:nowrap}.hn-bl-source{display:inline-flex;align-items:center;gap:var(--space-1);white-space:nowrap;font:var(--weight-regular, 400) var(--text-2xs)/1 var(--font-ui);color:var(--text-muted)}.hn-bl-row-body{display:flex;flex-direction:column;gap:var(--space-1);min-width:0;flex:1 1 auto;text-align:left}.hn-bl-row-title{font:var(--weight-medium) var(--text-md)/1.35 var(--font-ui);color:var(--text-strong);overflow-wrap:anywhere;min-width:0}.hn-bl-row-meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1) var(--space-2);min-width:0}.hn-bl-actions{display:inline-flex;align-items:center;gap:var(--space-1);flex:0 0 auto}.hn-bl-title{display:block;width:100%;padding:0;border:0;background:transparent;cursor:pointer;text-align:left;font:var(--weight-semibold) var(--text-md)/1.35 var(--font-ui);color:var(--text-strong);overflow-wrap:anywhere}.hn-bl-title:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}.hn-bl-board{display:flex;overflow-x:auto;gap:var(--space-2);align-items:stretch}.hn-bl-col{flex:0 0 248px;display:flex;flex-direction:column;min-height:0;padding:var(--space-2);border-radius:var(--radius-lg);background:var(--bone-100);border:1px solid var(--border-hair);transition:var(--transition-fast)}.hn-bl-col[data-active]{border-style:dashed}.hn-bl-col[data-hot]{background:var(--brass-100);border-color:var(--brass-500)}.hn-bl-col[data-dimmed]{opacity:.5}.hn-bl-col-head{display:flex;align-items:center;gap:var(--space-1);margin-bottom:var(--space-2);min-height:20px}.hn-bl-col-count{margin-left:auto;font:var(--weight-regular, 400) var(--text-2xs)/1 var(--font-mono);color:var(--text-subtle)}.hn-bl-col-body{display:flex;flex-direction:column;gap:var(--space-2);min-height:0;overflow-y:auto}.hn-bl-card{flex:0 0 auto;display:flex;flex-direction:column;gap:var(--space-2);padding:var(--space-2) var(--space-3);background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-md);box-shadow:var(--shadow-xs);cursor:default}.hn-bl-card[data-draggable]{cursor:grab}.hn-bl-card[data-dragging]{opacity:.4}.hn-bl-card-head{display:flex;align-items:center;gap:var(--space-2);min-width:0}.hn-bl-card-badges{display:flex;flex-wrap:wrap;gap:var(--space-1)}.hn-bl-card-foot{display:flex;justify-content:flex-end}.hn-bl-stagebar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1)}.hn-bl-stage{position:relative;display:inline-flex;align-items:center;gap:var(--space-1);padding:2px var(--space-2);border-radius:var(--radius-pill)}.hn-bl-stage[data-state=active]{background:var(--brass-100)}.hn-bl-stage:not(:last-child):after{content:"";display:inline-block;width:12px;height:2px;margin-left:var(--space-1);background:var(--bone-300);border-radius:1px}.hn-bl-stage[data-state=done]:after{background:var(--leaf-500)}.hn-bl-stage-dot{width:8px;height:8px;border-radius:50%;background:var(--bone-400);flex:0 0 auto}.hn-bl-stage[data-state=done] .hn-bl-stage-dot{background:var(--leaf-500)}.hn-bl-stage[data-state=active] .hn-bl-stage-dot{background:var(--brass-500)}.hn-bl-stage-label{font:var(--weight-medium) var(--text-2xs)/1 var(--font-mono);color:var(--brass-700)}.hn-bl-detail{display:flex;flex-direction:column;gap:var(--space-4);min-width:0}.hn-bl-section{display:flex;flex-direction:column;gap:var(--space-3);min-width:0}.hn-bl-section-title{margin:0;font:var(--weight-semibold) var(--text-xs)/1.2 var(--font-mono);color:var(--text-muted);letter-spacing:var(--tracking-wide, .04em);text-transform:uppercase}.hn-bl-summary-meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-3)}.hn-bl-facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-2) var(--space-4);margin:0}.hn-bl-facts>div{display:flex;flex-direction:column;gap:2px;min-width:0}.hn-bl-facts dt{font:var(--weight-regular, 400) var(--text-2xs)/1.2 var(--font-mono);color:var(--text-subtle);text-transform:uppercase}.hn-bl-facts dd{margin:0;font:var(--weight-regular, 400) var(--text-sm)/1.4 var(--font-ui);color:var(--text-body);overflow-wrap:anywhere}.hn-bl-field{display:flex;flex-direction:column;gap:var(--space-1);min-width:0}.hn-bl-field-value{font:var(--weight-regular, 400) var(--text-sm)/1.5 var(--font-ui);color:var(--text-strong);white-space:pre-wrap;overflow-wrap:anywhere}.hn-bl-inline-row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2);min-width:0}.hn-bl-end{justify-content:flex-end}.hn-bl-cta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-3)}.hn-bl-subsection{display:flex;flex-direction:column;gap:var(--space-2);min-width:0}.hn-bl-stack-list{display:flex;flex-direction:column;gap:var(--space-1);min-width:0}.hn-bl-dep{display:flex;align-items:center;gap:var(--space-2);font:var(--weight-regular, 400) var(--text-sm)/1.4 var(--font-ui)}.hn-bl-trail{font:var(--weight-regular, 400) var(--text-sm)/1.4 var(--font-ui);color:var(--text-muted);overflow-wrap:anywhere}.hn-bl-checklist{display:flex;flex-direction:column;gap:var(--space-2);max-height:132px;overflow-y:auto;padding:var(--space-2);border:1px solid var(--border-hair);border-radius:var(--radius-sm)}.hn-bl-status-now{font:var(--weight-semibold) var(--text-sm)/1.4 var(--font-ui);color:var(--text-strong)}.hn-bl-callout{padding:var(--space-2) var(--space-3);border:1px solid var(--border-hair);border-radius:var(--radius-sm);background:var(--bone-100);font:var(--weight-regular, 400) var(--text-xs)/1.5 var(--font-ui);color:var(--text-muted)}.hn-bl-callout-title{font:var(--weight-semibold) var(--text-xs)/1.5 var(--font-ui);color:var(--text-strong)}.hn-bl-confirm-lead{font:var(--weight-regular, 400) var(--text-sm)/1.5 var(--font-ui);color:var(--text-strong);margin-bottom:var(--space-3)}.hn-bl-file-list{margin:0 0 var(--space-4);padding-left:var(--space-4);font:var(--weight-regular, 400) var(--text-xs)/1.6 var(--font-mono);color:var(--text-muted);overflow-wrap:anywhere}.hn-bl-advanced{border-top:1px solid var(--border-hair);padding-top:var(--space-3);min-width:0}.hn-bl-advanced>summary{cursor:pointer;list-style:none;font:var(--weight-semibold) var(--text-xs)/1.2 var(--font-mono);color:var(--text-muted);text-transform:uppercase;letter-spacing:var(--tracking-wide, .04em);padding:var(--space-1) 0;min-height:var(--touch-target)}.hn-bl-advanced>summary::-webkit-details-marker{display:none}.hn-bl-advanced>summary:before{content:"+ "}.hn-bl-advanced[open]>summary:before{content:"− "}.hn-bl-advanced>summary:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}.hn-bl-advanced-body{display:flex;flex-direction:column;gap:var(--space-4);padding-top:var(--space-3);min-width:0}.hn-bl-danger{display:flex;flex-direction:column;gap:var(--space-1);padding-top:var(--space-3);border-top:1px solid var(--border-hair)}.hn-bl-danger .hn-bl-section-title{color:var(--clay-600)}@media (max-width: 767px){.hn-bl-toolbar{gap:var(--space-2)}.hn-bl-screen{min-height:auto}.hn-bl-body{flex:0 0 auto;min-height:auto}.hn-bl-list-scroll{flex:0 0 auto;min-height:auto;overflow:visible}.hn-bl-screen .hn-bl-stage-tabs{overflow:visible;flex-wrap:wrap}.hn-bl-board{flex-direction:column;overflow-x:hidden}.hn-bl-col{flex:0 0 auto;width:100%}.hn-bl-col-body{overflow-y:visible}.hn-bl-facts{grid-template-columns:minmax(0,1fr)}.hn-bl-list-scroll{border-radius:var(--radius-md)}.hn-bl-row-title{white-space:normal}.hn-bl-card-foot{justify-content:stretch}.hn-bl-card-foot .hn-bl-actions{width:100%;justify-content:space-between}}.hn-bl-proj{font:var(--weight-regular, 400) var(--text-xs)/1.2 var(--font-ui);color:var(--text-muted);max-width:16ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hn-bl-card>.hn-bl-proj{display:block;max-width:100%}.hn-pc{display:flex;flex-direction:column;gap:14px}.hn-pc-kuota{font-size:12.5px;color:var(--text-muted);line-height:1.6}.hn-pc-row{display:flex;align-items:center;gap:12px;width:100%;text-align:left;padding:12px 16px;background:none;border:none;border-bottom:1px solid var(--border-hair);cursor:pointer}.hn-pc-type{font-size:12.5px;color:var(--text-muted);width:110px}.hn-pc-summary{flex:1;min-width:0;color:var(--text-strong)}.hn-pc-meta{font-size:12.5px;color:var(--text-muted)}.hn-pc-transcript{display:flex;flex-direction:column;gap:10px;margin-bottom:14px}.hn-pc-msg{padding:10px 12px;border-radius:var(--radius-lg);border:1px solid var(--border-hair);background:var(--surface-card)}.hn-pc-msg[data-role=klien]{background:var(--bone-100)}.hn-pc-msg[data-blocked=true]{border-color:var(--status-err)}.hn-pc-msg-meta{font-size:11.5px;color:var(--text-muted);margin-bottom:4px}.hn-pc-msg-text{white-space:pre-wrap;line-height:1.6}.hn-pc-blocked{margin-top:8px;font-size:12.5px;color:var(--text-muted)}.hn-pc-raw{white-space:pre-wrap;margin-top:4px}.hn-pc-prd{border:1px solid var(--border-hair);border-radius:var(--radius-lg);padding:12px 14px;margin-bottom:12px}.hn-pc-prd-actions{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.hn-pc-slug{width:240px}.hn-pc-note{margin-top:10px;font-size:12.5px;color:var(--text-muted)}
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}.hn-ide-tree-row{position:relative;display:flex;align-items:stretch;min-width:0}.hn-ide-tree-row>.hn-ide-tree-entry{flex:1 1 auto;min-width:0}.hn-ide-row-more{flex:0 0 auto;width:28px;display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:var(--radius-sm);background:transparent;cursor:pointer;opacity:.55}.hn-ide-tree-row:hover .hn-ide-row-more,.hn-ide-tree-row:focus-within .hn-ide-row-more{opacity:1}.hn-ide-row-more:hover{background:var(--bone-200)}@media (pointer: coarse),(max-width: 767px){.hn-ide-row-more{width:44px;height:44px;opacity:1}.hn-ide-tree-row>.hn-ide-tree-entry{min-height:44px}}.hn-ide-tree-leaf{display:flex;align-items:center;gap:8px;width:100%;padding:5px 8px;padding-left:calc(22px + var(--depth, 0) * 12px);border:none;cursor:pointer;text-align:left;background:transparent}.hn-ide-tree-dir{display:flex;align-items:center;gap:8px;width:100%;padding:5px 6px;padding-left:calc(6px + var(--depth, 0) * 12px);border:none;background:transparent;cursor:pointer;text-align:left}.hn-ide-tree-ignored{opacity:.62}.hn-ide-tree-name{flex:1 1 0%;min-width:0;font-family:var(--font-mono);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-body);font-weight:400}.hn-ide-sel .hn-ide-tree-name{color:var(--brass-700);font-weight:600}.hn-ide-tree-dirname{font-family:var(--font-mono);font-size:12.5px;color:var(--text-strong);font-weight:500}.hn-ide-sel .hn-ide-tree-dirname{color:var(--brass-700);font-weight:700}.hn-ide-tree-empty{padding:4px 8px;padding-left:calc(28px + var(--depth, 0) * 12px);font-size:11.5px;color:var(--text-subtle)}.hn-ide-tree-loading{font-size:11px;color:var(--text-subtle)}.hn-ide-status{font-family:var(--font-mono);font-size:12px;font-weight:700}.hn-ide-status[data-status=A]{color:var(--leaf-600)}.hn-ide-status[data-status=M]{color:var(--brass-700)}.hn-ide-status[data-status=D]{color:var(--status-err)}.hn-ide-stat{font-family:var(--font-mono);font-size:11px}.hn-ide-add{color:var(--leaf-600)}.hn-ide-del{color:var(--status-err)}.hn-ide-changed-row{display:flex;align-items:center;gap:8px;width:100%;padding:5px 10px;border:none;cursor:pointer;text-align:left;background:transparent}.hn-ide-sel{background:var(--brass-100)}.hn-ide-changed-path{flex:1 1 0%;min-width:0;font-family:var(--font-mono);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-body)}.hn-ide-sel .hn-ide-changed-path{color:var(--brass-700)}.hn-ide-changed-head{display:flex;align-items:center;gap:6px;padding:6px 8px}.hn-ide-view-btn{display:flex;padding:3px;border:none;cursor:pointer;border-radius:4px;background:transparent}.hn-ide-view-btn[aria-pressed=true]{background:var(--brass-100)}.hn-ide-empty-pad{padding:4px 10px;font-size:12px;color:var(--text-subtle)}.hn-ide-view-btn{min-width:24px;min-height:24px;box-sizing:border-box;align-items:center;justify-content:center}.hn-ide-changed-row{min-height:24px}.kl-screen{display:grid;gap:var(--space-4);min-width:0}.kl-muted{font-size:var(--text-xs);color:var(--text-subtle)}.kl-intro{font-size:var(--text-xs);color:var(--text-muted);line-height:1.5;margin-bottom:var(--space-4)}.kl-field-err{display:block;font-size:var(--text-2xs);color:var(--status-err);margin-top:var(--space-2)}.kl-checks{display:flex;flex-wrap:wrap;gap:var(--space-3) var(--space-4)}.kl-device{display:grid;gap:var(--space-2);flex:1 1 0;min-width:0}.kl-device-head{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2);min-width:0}.kl-device-name{font-family:var(--font-mono);font-size:var(--text-sm);font-weight:500;color:var(--text-strong);overflow-wrap:anywhere}.kl-device-meta{font-size:var(--text-xs);color:var(--text-subtle)}.kl-device-reason{font-size:var(--text-xs);color:var(--text-muted)}.kl-device-access{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1) var(--space-2);font-size:var(--text-xs);color:var(--text-muted)}.kl-device-access strong{font-weight:500;color:var(--text-strong)}.kl-device-access .kl-device-reason{flex-basis:100%}.kl-session{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1) var(--space-3);width:100%;min-width:0;padding:var(--space-2) 0;border:0;border-top:1px solid var(--border-hair);background:transparent;color:var(--text-body);font:inherit;text-align:left}.kl-session-link{cursor:pointer}.kl-session-link:hover{background:var(--bone-100)}.kl-session-id{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-subtle)}.kl-session-title{flex:1 1 180px;min-width:0;font-size:var(--text-sm);color:var(--text-strong);overflow-wrap:anywhere}.kl-session-phase{font-size:var(--text-xs);color:var(--text-muted)}.kl-access{display:grid;gap:var(--space-3);min-width:0}.kl-row{display:flex;align-items:center;gap:var(--space-4);min-width:0;padding:var(--space-3) 0;border-bottom:1px solid var(--border-hair)}.kl-row-last{border-bottom:0}.kl-row-text{flex:1 1 auto;min-width:0}.kl-row-title{font-size:var(--text-sm);font-weight:600;color:var(--text-strong)}.kl-row-desc{font-size:var(--text-xs);color:var(--text-muted);line-height:1.5;margin-top:var(--space-1)}.kl-tier-head{font-size:var(--text-xs);font-weight:600;color:var(--text-strong)}.kl-tier-group{gap:var(--space-2)}.kl-tier-hint{font-size:var(--text-xs);color:var(--text-subtle)}.kl-access-requests{display:grid;gap:var(--space-2);min-width:0}.kl-request-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--space-2)}.kl-device-request-entry{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2)}.kl-device-request{display:grid;gap:var(--space-2);padding:var(--space-2) 0}.kl-request-list{margin:0;padding:0;list-style:none;display:grid;gap:var(--space-1);font-size:var(--text-xs)}.kl-khusus{font-size:var(--text-xs);color:var(--text-muted)}.kl-khusus summary{cursor:pointer;color:var(--text-strong);padding:var(--space-1) 0}.kl-audit-row{font-size:var(--text-xs);padding:var(--space-2) 0;border-bottom:1px solid var(--border-hair);overflow-wrap:anywhere}.kl-status-line{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-3);font-size:var(--text-sm)}.kl-status-origin{color:var(--text-muted);overflow-wrap:anywhere;min-width:0}.kl-account{display:grid;gap:var(--space-2);flex:1 1 0;min-width:0}.kl-account-head{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2)}.kl-account-email{font-weight:500;color:var(--text-strong);overflow-wrap:anywhere}.kl-account-projects{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-4);margin-top:var(--space-2)}.kl-banner{position:sticky;top:0;z-index:3;display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-3);padding:var(--space-3) var(--space-4);margin-bottom:var(--space-4);background:var(--action-bg);color:var(--action-on);border-radius:var(--radius-md);font-size:var(--text-sm);line-height:1.4}.kl-banner-text{flex:1 1 220px;min-width:0;overflow-wrap:anywhere}@media (min-width: 768px){.kl-row-text{flex-basis:200px}}@media (max-width: 767px){.kl-row{flex-direction:column;align-items:flex-start}}.hn-ov{display:flex;flex-direction:column;gap:var(--space-4);min-width:0}.hn-ov-section{min-width:0;padding:var(--space-4) var(--space-5);background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm)}.hn-ov-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--space-2) var(--space-3);margin-bottom:var(--space-2);min-width:0}.hn-ov-head-text{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--space-1) var(--space-3);min-width:0}.hn-ov-title{margin:0;font-family:var(--font-display);font-size:var(--text-xl);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight);line-height:1.2;color:var(--text-strong)}.hn-ov-head-actions{display:flex;flex-wrap:wrap;gap:var(--space-2);margin-left:auto}.hn-ov-meta{font-family:var(--font-ui);font-size:var(--text-xs);color:var(--text-muted)}.hn-ov-name{min-width:8ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:var(--text-sm);font-weight:var(--weight-medium);color:var(--text-strong)}.hn-ov-prj .hn-row-main{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,1fr) auto auto;align-items:center;column-gap:var(--space-3)}.hn-ov-pagehead .hn-page-title{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.hn-ov-empty{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1) var(--space-2);margin:0;padding:var(--space-1) 0;font-family:var(--font-ui);font-size:var(--text-sm);color:var(--text-body)}.hn-ov-empty>svg{flex:0 0 auto;color:var(--text-subtle)}.hn-ov-none{margin:0;padding:var(--space-1) 0}.hn-ov-cov{min-width:0;display:flex;align-items:center;gap:var(--space-2)}.hn-ov-bar{flex:1 1 auto;min-width:0}.hn-ov-pct{flex:0 0 auto;min-width:3ch;font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-muted);text-align:right}.hn-ov-prj-meta{white-space:nowrap}.hn-ov-foot{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--space-2) var(--space-3);margin-top:var(--space-3);padding-top:var(--space-3);border-top:1px solid var(--border-hair)}.hn-ov-foot-link{min-width:0;max-width:100%;min-height:30px;margin:0;padding:var(--space-1) var(--space-3);display:inline-flex;align-items:center;gap:var(--space-2);text-align:left;border:1px solid transparent;border-radius:var(--radius-sm);background:transparent;color:var(--text-body);font:var(--weight-medium) var(--text-sm)/1.35 var(--font-ui);white-space:normal;cursor:pointer}.hn-ov-foot-link:hover{background:var(--bone-200)}.hn-ov-foot-link>svg{flex:0 0 auto}@media (max-width: 767px){.hn-ov-section{padding:var(--space-4)}.hn-ov-prj .hn-row-main{grid-template-columns:minmax(0,1fr) auto;row-gap:var(--space-1)}.hn-ov-prj .hn-ov-cov{grid-column:1 / -1;order:3}.hn-ov-prj .hn-ov-prj-status{order:2}.hn-ov-prj .hn-ov-prj-meta{order:4;grid-column:1 / -1}.hn-ov-attn .hn-row-main{flex-wrap:wrap;align-items:center;row-gap:var(--space-1);column-gap:var(--space-2)}.hn-ov-attn .hn-row-main>:first-child{order:2}.hn-ov-attn .hn-ov-name{order:1;flex:1 1 100%;white-space:normal;overflow-wrap:anywhere;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.hn-ov-attn .hn-ov-meta{order:2;flex:1 1 0;min-width:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.hn-ov-foot-link{width:100%;min-height:var(--touch-target);padding-inline:var(--space-2)}}.hn-ovk-masthead{text-align:center;margin-bottom:var(--space-2)}.hn-ovk-title{margin:0;font-family:var(--font-display);font-size:30px;font-weight:600;letter-spacing:.02em;color:var(--text-strong)}.hn-ovk-dateline{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;border-top:2px solid var(--text-strong);border-bottom:1px solid var(--text-strong);padding:4px 0;margin-top:6px;font-family:var(--font-mono);font-size:12px;color:var(--text-muted)}.hn-ovk-headline{margin:14px 0 6px;font-family:var(--font-display);font-size:26px;line-height:1.25;color:var(--text-strong);max-width:46ch}.hn-ovk-tone--bad{color:var(--clay-600)}.hn-ovk-tone--good{color:var(--leaf-600)}.hn-ovk-kicker{margin:0;font-family:var(--font-ui);font-size:11px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:var(--text-subtle)}.hn-ovk-delta{font-size:12px;color:var(--text-muted)}.hn-ovk-koreksi{border:1px solid var(--border-hair);border-left:3px solid var(--amber-600);background:var(--surface-card);padding:8px 12px;margin:8px 0 12px}.hn-ovk-cols{display:grid;grid-template-columns:1.4fr 1fr 1fr;gap:16px;align-items:start}.hn-ovk-col{display:grid;gap:16px;min-width:0}.hn-ovk-col--lead{grid-column:1}.hn-ovk-col--mid{grid-column:2}.hn-ovk-col--side{grid-column:3}.hn-ovk-indeks .hn-ov-pct,.hn-ovk-indeks .hn-ov-prj-meta{font-family:var(--font-mono)}.hn-ovk-indeks .hn-ov-prj>*{border-bottom:1px dotted var(--border-hair)}@media (max-width: 1100px){.hn-ovk-cols{grid-template-columns:1fr 1fr}.hn-ovk-col--lead{grid-column:1 / -1}.hn-ovk-col--mid{grid-column:1}.hn-ovk-col--side{grid-column:2}}@media (max-width: 720px){.hn-ovk-cols{grid-template-columns:1fr}.hn-ovk-col--lead,.hn-ovk-col--mid,.hn-ovk-col--side{grid-column:1}.hn-ovk-col--side{order:2}.hn-ovk-col--mid{order:3}.hn-ovk-headline{font-size:21px}.hn-ovk-title{font-size:24px}}.hn-ovk-denyut{background:var(--term-bg);color:var(--term-fg);border-radius:6px;padding:12px}.hn-ovk-denyut .hn-ovk-kicker,.hn-ovk-denyut .hn-ov-meta{color:var(--term-dim)}.hn-ovk-denyut .hn-ov-name{color:var(--term-fg)}.hn-ovk-denyut .hn-ov-empty,.hn-ovk-more{color:var(--term-dim)}.hn-ovk-trace{display:block;flex:1 1 120px;min-width:80px;height:24px;overflow:hidden}.hn-ovk-trace svg{display:block;width:200%;height:100%}.hn-ovk-trace path{fill:none;stroke:var(--brass-400);stroke-width:1.6;vector-effect:non-scaling-stroke}.hn-ovk-trace--flat path{stroke:var(--clay-500);stroke-dasharray:4 4}.hn-ovk-trace-run{animation:hn-ovk-scroll 2.4s linear infinite}.hn-ovk-trace--b .hn-ovk-trace-run{animation-duration:3.1s}.hn-ovk-trace--c .hn-ovk-trace-run{animation-duration:1.9s}.hn-ovk-trace--flat .hn-ovk-trace-run{animation:none}@keyframes hn-ovk-scroll{0%{transform:translate(0)}to{transform:translate(-50%)}}@media (prefers-reduced-motion: reduce){.hn-ovk-trace-run{animation:none}}.hn-ovk-denyut .hn-row-main{flex-wrap:wrap}.hn-ovk-denyut .hn-row{border-bottom-color:var(--term-line)}.hn-ovk-denyut .hn-row-interactive:hover,.hn-ovk-denyut .hn-row-interactive:focus-within{background:var(--term-line)}.hn-ovk-denyut .hn-ov-head-actions{--text-body: var(--term-fg);--bone-200: var(--term-line)}.hn-ovk-panel{background:var(--surface-card);border:1px solid var(--border-hair);border-radius:6px;padding:12px;display:grid;gap:6px;min-width:0}.hn-ovk-panel p{margin:0}.hn-ovk-figure{margin:0;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.hn-ovk-big{font-family:var(--font-display);font-size:32px;line-height:1;color:var(--text-strong)}.hn-ovk-unit{font-size:13px;color:var(--text-muted)}.hn-ovk-lede{margin:0;font-family:var(--font-display);font-size:17px;color:var(--text-strong)}.hn-ovk-mono{font-family:var(--font-mono)}.hn-ovk-pill{font-size:11px;font-weight:600;padding:1px 8px;border-radius:999px;background:var(--brass-100);color:var(--brass-700)}.hn-ovk-pill--bad{background:var(--clay-100);color:var(--clay-600)}.hn-ovk-river{width:100%;height:56px}.hn-ovk-river path{fill:var(--brass-100);stroke:var(--brass-500);stroke-width:1}.hn-ovk-river-labels{margin:0;display:flex;justify-content:space-between;font-size:11px;color:var(--text-muted)}.hn-ovk-spark{width:100%;height:44px}.hn-ovk-spark polyline{fill:none;stroke:var(--brass-500);stroke-width:1.5;vector-effect:non-scaling-stroke}.hn-ovk-spark-proj{stroke:var(--brass-500);stroke-dasharray:3 2;vector-effect:non-scaling-stroke}.hn-ovk-spark-limit{stroke:var(--clay-500);stroke-width:.6;vector-effect:non-scaling-stroke}.hn-ovk-heatwrap{margin-top:16px}.hn-ovk-heat{display:grid;grid-template-columns:48px repeat(24,minmax(0,1fr));gap:2px;align-items:center}.hn-ovk-heat-day{font-family:var(--font-mono);font-size:10px;color:var(--text-muted)}.hn-ovk-heat-cell{aspect-ratio:1;border-radius:2px;background:var(--bone-200)}.hn-ovk-heat-cell--1{background:var(--brass-100)}.hn-ovk-heat-cell--2{background:var(--brass-300)}.hn-ovk-heat-cell--3{background:var(--brass-400)}.hn-ovk-heat-cell--4{background:var(--brass-600)}@media (max-width: 720px){.hn-ovk-heat{grid-template-columns:36px repeat(24,minmax(0,1fr));gap:1px}}.hn-skills-workspace{display:flex;flex-direction:column;flex:1 1 0%;min-height:0;min-width:0;gap:var(--space-3)}.hn-skill-master{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;min-width:0;background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-lg);overflow:hidden}.hn-skill-master-foot{display:flex;justify-content:flex-end;padding:var(--space-2);border-top:1px solid var(--border-hair)}.hn-skill-list{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.hn-skill-list-tools{display:flex;flex-direction:column;gap:var(--space-2);padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--border-hair)}.hn-skill-list-scroll{flex:1 1 auto;min-height:0;overflow:auto;padding:var(--space-1) var(--space-2) var(--space-2)}.hn-skill-list-error{padding:4px 8px;font-size:var(--text-xs);color:var(--clay-600)}.hn-skill-rows{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}.hn-skill-row{display:flex;flex-direction:column;gap:2px;width:100%;box-sizing:border-box;min-height:44px;padding:8px 10px;border:0;border-radius:var(--radius-sm);background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;min-width:0}.hn-skill-row:hover{background:var(--bone-200)}.hn-skill-row.is-selected{background:var(--brass-100);box-shadow:inset 3px 0 0 var(--brass-500)}.hn-skill-row:focus-visible{outline:2px solid var(--border-focus);outline-offset:-2px}.hn-skill-row-head{display:flex;align-items:center;gap:6px;min-width:0}.hn-skill-row-name{flex:1 1 auto;min-width:0;font-family:var(--font-mono);font-size:var(--text-sm);color:var(--text-strong);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hn-skill-row-desc{font-size:var(--text-xs);color:var(--text-subtle);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hn-skill-row-meta{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:var(--text-2xs);color:var(--text-subtle)}.hn-skill-detail{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;min-width:0;background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-lg);overflow:hidden}.hn-skill-detail-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-3);padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--border-hair);min-width:0}.hn-skill-detail-text{display:flex;flex-direction:column;gap:2px;min-width:0}.hn-skill-detail-name{font-family:var(--font-mono);font-size:var(--text-md);font-weight:var(--weight-semibold);color:var(--text-strong);overflow-wrap:anywhere}.hn-skill-detail-desc{font-size:var(--text-sm);color:var(--text-muted)}.hn-skill-detail-body{display:flex;flex-wrap:wrap;flex:1 1 auto;min-height:0;align-items:stretch}.hn-skill-detail-structure{flex:0 1 240px;min-width:200px;min-height:200px;display:flex}.hn-skill-detail-editor{flex:1 1 420px;min-width:0;min-height:320px;display:flex}.hn-skill-structure{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;min-height:0;border-right:1px solid var(--border-hair)}.hn-skill-structure-head{padding:10px 14px;border-bottom:1px solid var(--border-hair)}.hn-skill-structure-name{font-size:var(--text-xs);color:var(--text-strong)}.hn-skill-structure-tree{flex:1 1 auto;min-height:0;overflow:auto;padding:8px}.hn-skill-structure-foot{display:flex;gap:8px;padding:8px;border-top:1px solid var(--border-hair);flex-wrap:wrap}.hn-skill-error-text{color:var(--clay-600)}.hn-skill-editor{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;min-height:0}.hn-skill-editor-head{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;padding:10px 16px;border-bottom:1px solid var(--border-hair)}.hn-skill-editor-path{flex:1 1 auto;min-width:0;font-size:var(--text-sm);overflow-wrap:anywhere}.hn-skill-frontmatter{padding:10px 16px;border-bottom:1px solid var(--border-hair);background:var(--bone-200)}.hn-skill-fm-name{font-family:var(--font-mono);font-size:var(--text-xs)}.hn-skill-fm-desc{font-size:var(--text-sm);color:var(--text-muted)}.hn-skill-editor-body{flex:1 1 auto;min-height:0;overflow:auto;padding:var(--space-4)}.hn-skill-editor-body.is-edit{padding:0}.hn-skill-textarea{display:block;width:100%;height:100%;min-height:320px;box-sizing:border-box;resize:none;border:0;padding:var(--space-4);background:transparent;color:var(--text-body);font-family:var(--font-mono);font-size:var(--text-sm)}.hn-skill-textarea:focus-visible{outline:2px solid var(--border-focus);outline-offset:-2px}.hn-skill-pre{margin:0;font-family:var(--font-mono);font-size:var(--text-sm);white-space:pre-wrap}.hn-skill-savebar{position:sticky;bottom:0;z-index:1;display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2);padding:var(--space-2) var(--space-3);border-top:1px solid var(--border-hair);background:var(--bone-100)}.hn-skill-conflict{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2);font-size:var(--text-xs);color:var(--clay-600)}.hn-agents{display:flex;flex-direction:column;gap:var(--space-3);min-width:0}.hn-agents-head{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap}.hn-agents-scope{flex:1 1 280px;min-width:0;margin:0;font-size:var(--text-xs);color:var(--text-subtle)}.hn-agent-evidence{border:1px solid var(--border-hair);border-radius:var(--radius-sm);padding:0 var(--space-3);background:var(--surface-card);min-width:0}.hn-agent-evidence-summary{display:flex;align-items:center;min-height:36px;cursor:pointer;font-size:var(--text-xs);color:var(--text-muted)}.hn-agent-evidence-summary:focus-visible{outline:2px solid var(--border-focus);outline-offset:-2px}.hn-agent-evidence-body{display:flex;flex-direction:column;gap:var(--space-2);padding-bottom:var(--space-3);min-width:0}.hn-agent-card{display:flex;flex-direction:column;gap:6px;padding:14px;min-width:0;background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-lg)}.hn-agent-head{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;min-width:0}.hn-agent-name{font-family:var(--font-mono);font-weight:var(--weight-semibold);color:var(--text-strong);overflow-wrap:anywhere}.hn-agent-desc{margin:0;font-size:var(--text-xs);color:var(--text-muted)}.hn-agent-note{margin:0;font-size:var(--text-xs);color:var(--text-muted);line-height:1.5}.hn-agent-error{display:block;margin-top:3px;color:var(--clay-600)}.hn-agent-meta{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-4);margin:0;font-size:var(--text-xs);color:var(--text-subtle)}.hn-agent-meta>div{display:flex;gap:4px;min-width:0}.hn-agent-meta dt{color:var(--text-subtle)}.hn-agent-meta dd{margin:0;color:var(--text-body);overflow-wrap:anywhere}.hn-agent-card>.hn-agent-evidence{margin-top:var(--space-1)}.hn-agent-samples{display:flex;flex-direction:column;gap:var(--space-2)}.hn-agent-sample{padding:var(--space-2);border:1px solid var(--border-hair);border-radius:var(--radius-sm)}.hn-agent-sample-meta{font-size:var(--text-xs);color:var(--text-subtle);margin-bottom:6px}.hn-agent-sample-form{display:flex;flex-wrap:wrap;gap:var(--space-2)}.hn-agent-metrics{display:flex;gap:14px;flex-wrap:wrap;padding-top:9px;border-top:1px solid var(--border-hair);font-size:var(--text-xs);color:var(--text-subtle)}.hn-agent-stat{display:flex;flex-direction:column;gap:2px;max-width:280px}.hn-agent-stat-caption{color:var(--text-muted)}.hn-agent-stat-line{font-size:var(--text-xs)}.hn-agent-variants{margin-top:var(--space-2)}.hn-agent-variants summary{cursor:pointer;font-size:var(--text-xs);min-height:32px;display:flex;align-items:center}.hn-agent-variants ul{font-size:var(--text-xs);color:var(--text-muted);padding-left:20px}.hn-agent-grid2{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--space-3)}@media (max-width: 767px){.hn-skill-detail-structure,.hn-skill-detail-editor{flex-basis:100%;min-width:0}.hn-skill-detail-structure{min-height:0;max-height:220px}.hn-skill-detail-editor{min-height:320px}.hn-agent-grid2{grid-template-columns:minmax(0,1fr)}}.hn-am-intro{font-size:12.5px;color:var(--text-muted);margin-bottom:12px;line-height:1.5}.hn-am-warn{font-size:12.5px;color:var(--status-warn, var(--text-muted));margin-bottom:12px}.hn-am-row{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}.hn-am-grid{display:grid;gap:10px}.hn-am-label{margin-bottom:4px}.hn-am-note{font-size:12.5px;color:var(--text-subtle)}.hn-qa-stack{display:flex;flex-direction:column;gap:var(--space-3);min-width:0}.hn-qa-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2);min-width:0}.hn-qa-toolbar-project{flex:0 1 240px;min-width:0}.hn-qa-intro{margin:0;max-width:70ch;font-size:var(--text-sm);color:var(--text-subtle)}.hn-qa-note{margin:0;font-size:var(--text-xs);color:var(--text-subtle)}.hn-qa-note-list{margin:0;padding-left:18px}.hn-qa-error{margin:0;font-size:var(--text-sm);color:var(--status-err);overflow-wrap:anywhere}.hn-qa-code{font-family:var(--font-mono);font-size:var(--text-2xs);color:var(--text-subtle);white-space:nowrap}.hn-qa-label{font-size:var(--text-xs);font-weight:var(--weight-semibold);color:var(--text-strong);margin-bottom:var(--space-1)}.hn-qa-pre{white-space:pre-wrap;overflow-wrap:anywhere;font-size:var(--text-sm);color:var(--text-body)}.hn-qa-row-body{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1 1 200px}.hn-qa-row-head{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2);min-width:0}.hn-qa-row-title{display:block;font-size:var(--text-md);font-weight:var(--weight-semibold);color:var(--text-strong);overflow-wrap:anywhere;min-width:0}.hn-qa-row-line{display:flex;flex-wrap:wrap;align-items:center;gap:2px var(--space-3);min-width:0;font-size:var(--text-xs);color:var(--text-subtle)}.hn-qa-row-line>span{min-width:0;overflow-wrap:anywhere}.hn-qa-row-stat{color:var(--text-muted)}.hn-qa-editor{display:flex;flex-direction:column;gap:var(--space-3);min-width:0}.hn-qa-bar{position:sticky;top:0;z-index:2;display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2);padding:var(--space-2) 0;background:var(--surface-page);border-bottom:1px solid var(--border-hair);min-width:0}.hn-qa-bar-title{flex:1 1 200px;min-width:0;display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2)}.hn-qa-bar-name{margin:0;min-width:0;font-size:var(--text-md);font-weight:var(--weight-semibold);color:var(--text-strong);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hn-qa-bar-actions{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2);flex:0 0 auto;min-width:0}.hn-qa-bar-save{display:inline-flex;align-items:center;gap:6px;min-width:0;max-width:360px;font-size:var(--text-xs);color:var(--text-subtle)}.hn-qa-bar-save.is-error{color:var(--status-err)}@media (max-width: 767px){.hn-qa-editor{padding-bottom:calc(84px + env(safe-area-inset-bottom))}.hn-qa-bar-actions{position:fixed;left:0;right:0;bottom:0;z-index:5;justify-content:flex-end;padding:var(--space-2) var(--page-gutter-x) calc(var(--space-2) + env(safe-area-inset-bottom));background:var(--surface-card);border-top:1px solid var(--border-hair)}.hn-qa-bar-save{flex:1 1 100%;max-width:none;order:-1}}.hn-qa-info{display:flex;flex-direction:column;gap:var(--space-2);min-width:0;padding:var(--space-3) var(--space-4);background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-lg)}.hn-qa-info-head{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2);min-width:0}.hn-qa-info-title{margin:0;flex:1 1 160px;min-width:0;font-size:var(--text-sm);font-weight:var(--weight-semibold);color:var(--text-strong)}.hn-qa-facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,170px),1fr));gap:var(--space-2) var(--space-4);margin:0;min-width:0}.hn-qa-facts>div{min-width:0}.hn-qa-facts dt{font-size:var(--text-2xs);color:var(--text-subtle)}.hn-qa-facts dd{margin:0;font-size:var(--text-sm);color:var(--text-strong);overflow-wrap:anywhere}.hn-qa-form{display:flex;flex-direction:column;min-width:0}.hn-qa-grid{display:grid;gap:var(--space-3);grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));min-width:0}.hn-qa-fieldset{border:0;margin:0 0 var(--space-3);padding:0;min-width:0}.hn-qa-legend{padding:0;margin:0 0 var(--space-2);font-size:var(--text-sm);font-weight:var(--weight-semibold);color:var(--text-strong)}.hn-qa-more{margin-top:var(--space-1)}.hn-qa-more>summary{cursor:pointer;color:var(--text-subtle);font-size:var(--text-sm);padding:var(--space-1) 0}.hn-qa-file{display:block;width:100%;max-width:100%;font:var(--text-sm)/1.4 var(--font-ui);color:var(--text-body)}.hn-qa-file::file-selector-button{margin-right:10px;height:34px;padding:0 12px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--surface-card);color:var(--text-strong);font:var(--weight-medium) var(--text-sm)/1 var(--font-ui);cursor:pointer;box-shadow:var(--shadow-xs)}.hn-qa-file::file-selector-button:hover{background:var(--bone-100)}.hn-qa-file:focus-visible{outline:2px solid var(--border-focus);outline-offset:3px;border-radius:var(--radius-sm)}.hn-qa-file:disabled{opacity:.5}.hn-qa-modal-stack{display:flex;flex-direction:column;gap:var(--space-3);min-width:0}.hn-qa-check{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--space-3);min-width:0}.hn-qa-check>li{display:grid;grid-template-columns:22px minmax(0,1fr);gap:var(--space-2);align-items:start;padding-bottom:var(--space-3);border-bottom:1px solid var(--border-hair)}.hn-qa-check>li:last-child{border-bottom:0;padding-bottom:0}.hn-qa-check-icon{display:inline-flex;padding-top:1px}.hn-qa-check-icon.is-ok{color:var(--leaf-600)}.hn-qa-check-icon.is-warn{color:var(--amber-600)}.hn-qa-check-icon.is-miss{color:var(--clay-600)}.hn-qa-check-name{font-size:var(--text-sm);font-weight:var(--weight-semibold);color:var(--text-strong)}.hn-qa-check-note{font-size:var(--text-xs);color:var(--text-subtle);overflow-wrap:anywhere}.hn-qa-check-body{display:flex;flex-direction:column;gap:var(--space-2);min-width:0}.hn-qa-export{display:flex;flex-direction:column;gap:var(--space-1);min-width:0}.hn-qa-export>a{justify-content:flex-start}.hn-qa-case-head{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--space-2);min-width:0}.hn-qa-case-code{flex:0 1 120px;min-width:0}.hn-qa-case-name{flex:1 1 200px;min-width:0}.hn-qa-case-status{display:flex;flex-direction:column;gap:var(--space-2);margin-top:var(--space-1);min-width:0}.hn-qa-case-grid{display:grid;gap:var(--space-3);grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));margin-top:var(--space-2);min-width:0}.hn-qa-add{display:flex;flex-wrap:wrap;gap:var(--space-2);align-items:flex-start;min-width:0}.hn-qa-add-field{flex:1 1 240px;min-width:0}.hn-qa-save{display:inline-flex;align-items:center;gap:6px;min-height:20px;font-size:var(--text-xs);color:var(--text-subtle);overflow-wrap:anywhere}.hn-qa-save.is-saved{color:var(--leaf-600)}.hn-qa-save.is-error{color:var(--status-err)}.hn-qa-seg{min-width:0}.hn-qa-seg .hn-choice-target{position:relative;min-height:36px;border-radius:var(--radius-sm);background:var(--surface-card);border:1px solid var(--border-strong)}.hn-qa-seg .hn-choice-target>span:last-child{display:flex;align-items:center;min-height:36px;padding:0 12px}.hn-qa-seg .hn-choice-control{position:absolute;left:0;top:0;opacity:0}.hn-qa-seg .hn-choice-target:focus-within{outline:2px solid var(--border-focus);outline-offset:2px}.hn-qa-seg .hn-choice-target.is-on{background:var(--brass-100);border-color:var(--brass-600)}.hn-qa-seg .hn-choice-target.is-on>span:last-child{font-weight:var(--weight-semibold)}.hn-qa-detail-grid{display:grid;gap:var(--space-3);grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));min-width:0}.hn-qa-detail-stack{display:flex;flex-direction:column;gap:var(--space-3);min-width:0}.hn-qa-steps{margin:0;padding-left:20px;font-size:var(--text-sm);color:var(--text-body)}.hn-qa-steps li{overflow-wrap:anywhere}.hn-qa-result-line{font-size:var(--text-xs);color:var(--text-subtle);overflow-wrap:anywhere}.hn-qa-result-line.is-err{color:var(--status-err)}.hn-qa-attach{min-width:0;margin-top:var(--space-2);border-radius:var(--radius-sm)}.hn-qa-attach:focus-visible{outline:2px solid var(--border-focus);outline-offset:3px}.hn-qa-attach-list{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--space-3);min-width:0}.hn-qa-attach-item{display:grid;gap:4px;max-width:160px;min-width:0}.hn-qa-attach-img{height:96px;max-width:160px;object-fit:cover;border-radius:var(--radius-sm);border:1px solid var(--border-strong)}.hn-qa-attach-img.is-compact{height:64px}.hn-qa-attach-file{font-size:var(--text-xs);overflow-wrap:anywhere}.hn-qa-attach-meta{font-size:var(--text-2xs);color:var(--text-subtle);overflow-wrap:anywhere}.hn-qa-attach-hint{margin:var(--space-2) 0 0;font-size:var(--text-xs);color:var(--text-subtle)}.hn-qa-preview{display:grid;gap:var(--space-3);grid-template-columns:minmax(0,1fr);min-width:0}.hn-qa-preview .hn-md table{display:block;overflow-x:auto;max-width:100%}.hn-qa-preview .hn-md th{white-space:nowrap}.hn-qa-preview .hn-md td{min-width:112px;overflow-wrap:break-word;word-break:normal}.hn-qa-group-title{margin:var(--space-3) 0 var(--space-1);font-size:var(--text-sm);font-weight:var(--weight-semibold);color:var(--text-strong)}.hn-review{display:flex;flex-direction:column;gap:12px;min-width:0}.hn-review-topbar{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}.hn-review-head{display:flex;flex-direction:column;gap:2px;min-width:0}.hn-review-title{margin:0;font-family:var(--font-display);font-size:var(--text-xl);font-weight:600;color:var(--text-strong);line-height:1.25;overflow-wrap:anywhere}.hn-review-stat{margin:0;font-size:var(--text-sm);color:var(--text-muted)}.hn-review-delta{font-family:var(--font-mono);font-weight:600;color:var(--text-strong)}.hn-review-pane{display:flex;flex-direction:column;min-width:0;background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-lg);overflow:hidden}.hn-review-list{padding:6px 4px;min-width:0}.hn-review-sep{padding:8px 8px 6px;margin-top:8px;border-top:1px solid var(--border-hair)}.hn-review-legend{margin:0;padding:8px 12px;border-top:1px solid var(--border-hair);font-size:var(--text-xs);color:var(--text-subtle)}.hn-review-viewer{display:flex;flex-direction:column;min-width:0;background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-lg);overflow:hidden}.hn-review-viewbar{display:flex;align-items:center;gap:8px 12px;flex-wrap:wrap;padding:10px 14px;border-bottom:1px solid var(--border-hair);min-width:0}.hn-review-path{flex:1 1 180px;min-width:0;font-family:var(--font-mono);font-size:var(--text-sm);font-weight:500;color:var(--text-strong);overflow-wrap:anywhere}.hn-review-filestat{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-muted);white-space:nowrap}.hn-review-seg{display:inline-flex;gap:2px;padding:2px;background:var(--bone-100);border-radius:var(--radius-pill)}.hn-review-seg button{padding:4px 12px;border:none;cursor:pointer;border-radius:var(--radius-pill);font:inherit;font-size:var(--text-xs);color:var(--text-muted);background:transparent}.hn-review-seg button[aria-pressed=true]{background:var(--surface-card);color:var(--text-strong);font-weight:600}.hn-review-seg button:focus-visible{outline:2px solid var(--border-focus);outline-offset:1px}.hn-review-body{min-width:0;background:var(--surface-card)}.hn-review-diff{padding:10px 0}.hn-review-truncated{display:flex;align-items:center;flex-wrap:wrap;gap:8px;padding:8px 12px;font-size:var(--text-xs);color:var(--text-muted)}.hn-review-truncated a{color:var(--brass-700);font-weight:500}.hn-review-pre{margin:0;padding:12px 16px;font-family:var(--font-mono);font-size:var(--text-xs);line-height:1.6;white-space:pre-wrap;word-break:break-word;color:var(--text-body)}.hn-review-decide{position:sticky;bottom:0;z-index:2;display:flex;align-items:center;justify-content:space-between;gap:8px 12px;flex-wrap:wrap;padding:10px 12px;background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-lg);box-shadow:var(--shadow-md)}.hn-review-decide-hint{margin:0;flex:1 1 260px;font-size:var(--text-sm);color:var(--text-muted);line-height:1.5}.hn-review-decide-err{flex:1 1 100%;margin:0}.hn-review-decide-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}.hn-review-more{display:inline-flex}@media (min-width: 768px){.hn-review-list,.hn-review-body{max-height:min(640px,60dvh);overflow:auto}}@media (pointer: coarse),(max-width: 767px){.hn-review button{min-height:var(--touch-target)}.hn-review-seg button{min-height:var(--touch-target);padding:8px 14px}}@media (max-width: 767px){.hn-review-decide{padding-bottom:calc(10px + var(--safe-bottom))}.hn-review-viewbar{align-items:stretch}.hn-review-path{flex-basis:100%}}@media (max-width: 399px){.hn-review-decide-hint{flex:1 1 0;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}.hn-reconcile-error{font-size:var(--text-sm);color:var(--clay-600);background:var(--status-err-tint);border:1px solid var(--clay-500);border-radius:var(--radius-sm);padding:8px 10px;margin-bottom:12px}.hn-reconcile-card{border:1px solid var(--border-hair);border-radius:var(--radius-md);padding:12px;margin:0 0 12px;background:var(--surface-card);min-width:0}.hn-reconcile-head{display:flex;align-items:baseline;gap:8px 10px;flex-wrap:wrap;font-size:var(--text-sm);color:var(--text-strong)}.hn-reconcile-id{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-muted);overflow-wrap:anywhere}.hn-reconcile-hint{font-size:var(--text-xs);color:var(--text-muted)}.hn-reconcile-meta{display:flex;flex-wrap:wrap;gap:4px 16px;margin-top:4px;font-size:var(--text-xs);color:var(--text-subtle)}.hn-reconcile-same{margin:10px 0 0;font-size:var(--text-sm);color:var(--text-muted)}.hn-reconcile-fields{margin:10px 0 0;display:flex;flex-direction:column;gap:6px;min-width:0}.hn-reconcile-field{display:grid;grid-template-columns:minmax(0,110px) minmax(0,1fr) minmax(0,1fr);gap:8px 12px;align-items:start;padding:8px 10px;border-radius:var(--radius-sm);background:var(--bone-100)}.hn-reconcile-field dt{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-strong);overflow-wrap:anywhere}.hn-reconcile-field dd{margin:0;min-width:0;font-size:var(--text-xs);color:var(--text-body)}.hn-reconcile-field code{display:block;font-family:var(--font-mono);font-size:var(--text-xs);white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.5}.hn-reconcile-field-head{background:transparent;padding-bottom:0}.hn-reconcile-field-head dt,.hn-reconcile-field-head dd{font-family:var(--font-ui);font-size:var(--text-xs);color:var(--text-subtle);font-weight:600}.hn-reconcile-side{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;font-size:var(--text-xs);color:var(--text-subtle);font-weight:600}.hn-reconcile-actions{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap;margin-top:10px}@media (max-width: 767px){.hn-reconcile-field{grid-template-columns:minmax(0,1fr);gap:4px}.hn-reconcile-field-head{display:none}.hn-reconcile-side{position:static;width:auto;height:auto;overflow:visible;clip-path:none;white-space:normal;display:block;margin-bottom:2px}.hn-reconcile-actions>*{flex:1 1 140px;justify-content:center}.hn-reconcile-field dt{font-weight:600}}.hn-bl-screen{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;min-width:0}.hn-bl-toolbar{display:flex;flex-direction:column;gap:var(--space-2);margin-bottom:var(--space-4);min-width:0}.hn-bl-stage-tabs{max-width:100%;overflow-x:auto}.hn-bl-status-line{display:flex;flex-wrap:wrap;gap:var(--space-2);min-height:0}.hn-bl-status-line:empty{display:none}.hn-bl-stale{font:var(--weight-medium) var(--text-xs)/1.5 var(--font-ui);color:var(--status-warn)}.hn-bl-muted{font:var(--weight-regular, 400) var(--text-xs)/1.5 var(--font-ui);color:var(--text-muted)}.hn-bl-hint{margin:0;font:var(--weight-regular, 400) var(--text-xs)/1.5 var(--font-ui);color:var(--text-muted)}.hn-bl-gap-top{margin-top:var(--space-2)}.hn-bl-gap-bottom{margin-bottom:var(--space-2)}.hn-bl-view-toggle{display:inline-flex;gap:2px;padding:2px;background:var(--bone-200);border-radius:var(--radius-sm)}.hn-bl-view-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);cursor:pointer}.hn-bl-view-btn:hover{color:var(--text-strong)}.hn-bl-view-btn[aria-pressed=true]{background:var(--surface-card);color:var(--text-strong);box-shadow:var(--shadow-xs)}.hn-bl-view-btn:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}.hn-bl-full{width:100%}.hn-bl-date-row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2);min-width:0}.hn-bl-body{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;min-width:0}.hn-bl-list-scroll{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;border:1px solid var(--border-hair);border-radius:var(--radius-lg);background:var(--surface-card)}.hn-bl-pager{margin-top:var(--space-3);border:1px solid var(--border-hair);border-radius:var(--radius-lg);overflow:hidden}.hn-bl-prio{--dot: var(--ink-400);display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:12px;height:12px}.hn-bl-prio:before{content:"";display:block;border-radius:50%;box-sizing:border-box;width:9px;height:9px;border:1.5px solid var(--dot);background:var(--dot)}.hn-bl-prio-high:before{width:12px;height:12px}.hn-bl-prio-low:before{background:transparent}.hn-bl-prio[data-status=done]{--dot: var(--leaf-500)}.hn-bl-prio[data-status=running]{--dot: var(--brass-600)}.hn-bl-prio[data-status=queued]{--dot: var(--brass-400, var(--brass-500))}.hn-bl-prio-text{display:inline-flex;align-items:center;gap:var(--space-2);font:var(--weight-medium) var(--text-sm)/1 var(--font-ui);color:var(--text-strong)}.hn-bl-stage-pill{flex:0 0 auto}.hn-bl-id{font:var(--weight-regular, 400) var(--text-2xs)/1 var(--font-mono);color:var(--text-subtle);white-space:nowrap}.hn-bl-source{display:inline-flex;align-items:center;gap:var(--space-1);white-space:nowrap;font:var(--weight-regular, 400) var(--text-2xs)/1 var(--font-ui);color:var(--text-muted)}.hn-bl-row-body{display:flex;flex-direction:column;gap:var(--space-1);min-width:0;flex:1 1 auto;text-align:left}.hn-bl-row-title{font:var(--weight-medium) var(--text-md)/1.35 var(--font-ui);color:var(--text-strong);overflow-wrap:anywhere;min-width:0}.hn-bl-row-meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1) var(--space-2);min-width:0}.hn-bl-actions{display:inline-flex;align-items:center;gap:var(--space-1);flex:0 0 auto}.hn-bl-title{display:block;width:100%;padding:0;border:0;background:transparent;cursor:pointer;text-align:left;font:var(--weight-semibold) var(--text-md)/1.35 var(--font-ui);color:var(--text-strong);overflow-wrap:anywhere}.hn-bl-title:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}.hn-bl-board{display:flex;overflow-x:auto;gap:var(--space-2);align-items:stretch}.hn-bl-col{flex:0 0 248px;display:flex;flex-direction:column;min-height:0;padding:var(--space-2);border-radius:var(--radius-lg);background:var(--bone-100);border:1px solid var(--border-hair);transition:var(--transition-fast)}.hn-bl-col[data-active]{border-style:dashed}.hn-bl-col[data-hot]{background:var(--brass-100);border-color:var(--brass-500)}.hn-bl-col[data-dimmed]{opacity:.5}.hn-bl-col-head{display:flex;align-items:center;gap:var(--space-1);margin-bottom:var(--space-2);min-height:20px}.hn-bl-col-count{margin-left:auto;font:var(--weight-regular, 400) var(--text-2xs)/1 var(--font-mono);color:var(--text-subtle)}.hn-bl-col-body{display:flex;flex-direction:column;gap:var(--space-2);min-height:0;overflow-y:auto}.hn-bl-card{flex:0 0 auto;display:flex;flex-direction:column;gap:var(--space-2);padding:var(--space-2) var(--space-3);background:var(--surface-card);border:1px solid var(--border-hair);border-radius:var(--radius-md);box-shadow:var(--shadow-xs);cursor:default}.hn-bl-card[data-draggable]{cursor:grab}.hn-bl-card[data-dragging]{opacity:.4}.hn-bl-card-head{display:flex;align-items:center;gap:var(--space-2);min-width:0}.hn-bl-card-badges{display:flex;flex-wrap:wrap;gap:var(--space-1)}.hn-bl-card-foot{display:flex;justify-content:flex-end}.hn-bl-stagebar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1)}.hn-bl-stage{position:relative;display:inline-flex;align-items:center;gap:var(--space-1);padding:2px var(--space-2);border-radius:var(--radius-pill)}.hn-bl-stage[data-state=active]{background:var(--brass-100)}.hn-bl-stage:not(:last-child):after{content:"";display:inline-block;width:12px;height:2px;margin-left:var(--space-1);background:var(--bone-300);border-radius:1px}.hn-bl-stage[data-state=done]:after{background:var(--leaf-500)}.hn-bl-stage-dot{width:8px;height:8px;border-radius:50%;background:var(--bone-400);flex:0 0 auto}.hn-bl-stage[data-state=done] .hn-bl-stage-dot{background:var(--leaf-500)}.hn-bl-stage[data-state=active] .hn-bl-stage-dot{background:var(--brass-500)}.hn-bl-stage-label{font:var(--weight-medium) var(--text-2xs)/1 var(--font-mono);color:var(--brass-700)}.hn-bl-detail{display:flex;flex-direction:column;gap:var(--space-4);min-width:0}.hn-bl-section{display:flex;flex-direction:column;gap:var(--space-3);min-width:0}.hn-bl-section-title{margin:0;font:var(--weight-semibold) var(--text-xs)/1.2 var(--font-mono);color:var(--text-muted);letter-spacing:var(--tracking-wide, .04em);text-transform:uppercase}.hn-bl-summary-meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-3)}.hn-bl-facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-2) var(--space-4);margin:0}.hn-bl-facts>div{display:flex;flex-direction:column;gap:2px;min-width:0}.hn-bl-facts dt{font:var(--weight-regular, 400) var(--text-2xs)/1.2 var(--font-mono);color:var(--text-subtle);text-transform:uppercase}.hn-bl-facts dd{margin:0;font:var(--weight-regular, 400) var(--text-sm)/1.4 var(--font-ui);color:var(--text-body);overflow-wrap:anywhere}.hn-bl-field{display:flex;flex-direction:column;gap:var(--space-1);min-width:0}.hn-bl-field-value{font:var(--weight-regular, 400) var(--text-sm)/1.5 var(--font-ui);color:var(--text-strong);white-space:pre-wrap;overflow-wrap:anywhere}.hn-bl-inline-row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2);min-width:0}.hn-bl-end{justify-content:flex-end}.hn-bl-cta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-3)}.hn-bl-subsection{display:flex;flex-direction:column;gap:var(--space-2);min-width:0}.hn-bl-stack-list{display:flex;flex-direction:column;gap:var(--space-1);min-width:0}.hn-bl-dep{display:flex;align-items:center;gap:var(--space-2);font:var(--weight-regular, 400) var(--text-sm)/1.4 var(--font-ui)}.hn-bl-trail{font:var(--weight-regular, 400) var(--text-sm)/1.4 var(--font-ui);color:var(--text-muted);overflow-wrap:anywhere}.hn-bl-checklist{display:flex;flex-direction:column;gap:var(--space-2);max-height:132px;overflow-y:auto;padding:var(--space-2);border:1px solid var(--border-hair);border-radius:var(--radius-sm)}.hn-bl-status-now{font:var(--weight-semibold) var(--text-sm)/1.4 var(--font-ui);color:var(--text-strong)}.hn-bl-callout{padding:var(--space-2) var(--space-3);border:1px solid var(--border-hair);border-radius:var(--radius-sm);background:var(--bone-100);font:var(--weight-regular, 400) var(--text-xs)/1.5 var(--font-ui);color:var(--text-muted)}.hn-bl-callout-title{font:var(--weight-semibold) var(--text-xs)/1.5 var(--font-ui);color:var(--text-strong)}.hn-bl-confirm-lead{font:var(--weight-regular, 400) var(--text-sm)/1.5 var(--font-ui);color:var(--text-strong);margin-bottom:var(--space-3)}.hn-bl-file-list{margin:0 0 var(--space-4);padding-left:var(--space-4);font:var(--weight-regular, 400) var(--text-xs)/1.6 var(--font-mono);color:var(--text-muted);overflow-wrap:anywhere}.hn-bl-advanced{border-top:1px solid var(--border-hair);padding-top:var(--space-3);min-width:0}.hn-bl-advanced>summary{cursor:pointer;list-style:none;font:var(--weight-semibold) var(--text-xs)/1.2 var(--font-mono);color:var(--text-muted);text-transform:uppercase;letter-spacing:var(--tracking-wide, .04em);padding:var(--space-1) 0;min-height:var(--touch-target)}.hn-bl-advanced>summary::-webkit-details-marker{display:none}.hn-bl-advanced>summary:before{content:"+ "}.hn-bl-advanced[open]>summary:before{content:"− "}.hn-bl-advanced>summary:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}.hn-bl-advanced-body{display:flex;flex-direction:column;gap:var(--space-4);padding-top:var(--space-3);min-width:0}.hn-bl-danger{display:flex;flex-direction:column;gap:var(--space-1);padding-top:var(--space-3);border-top:1px solid var(--border-hair)}.hn-bl-danger .hn-bl-section-title{color:var(--clay-600)}@media (max-width: 767px){.hn-bl-toolbar{gap:var(--space-2)}.hn-bl-screen{min-height:auto}.hn-bl-body{flex:0 0 auto;min-height:auto}.hn-bl-list-scroll{flex:0 0 auto;min-height:auto;overflow:visible}.hn-bl-screen .hn-bl-stage-tabs{overflow:visible;flex-wrap:wrap}.hn-bl-board{flex-direction:column;overflow-x:hidden}.hn-bl-col{flex:0 0 auto;width:100%}.hn-bl-col-body{overflow-y:visible}.hn-bl-facts{grid-template-columns:minmax(0,1fr)}.hn-bl-list-scroll{border-radius:var(--radius-md)}.hn-bl-row-title{white-space:normal}.hn-bl-card-foot{justify-content:stretch}.hn-bl-card-foot .hn-bl-actions{width:100%;justify-content:space-between}}.hn-bl-proj{font:var(--weight-regular, 400) var(--text-xs)/1.2 var(--font-ui);color:var(--text-muted);max-width:16ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hn-bl-card>.hn-bl-proj{display:block;max-width:100%}.hn-pc{display:flex;flex-direction:column;gap:14px}.hn-pc-kuota{font-size:12.5px;color:var(--text-muted);line-height:1.6}.hn-pc-row{display:flex;align-items:center;gap:12px;width:100%;text-align:left;padding:12px 16px;background:none;border:none;border-bottom:1px solid var(--border-hair);cursor:pointer}.hn-pc-type{font-size:12.5px;color:var(--text-muted);width:110px}.hn-pc-summary{flex:1;min-width:0;color:var(--text-strong)}.hn-pc-meta{font-size:12.5px;color:var(--text-muted)}.hn-pc-transcript{display:flex;flex-direction:column;gap:10px;margin-bottom:14px}.hn-pc-msg{padding:10px 12px;border-radius:var(--radius-lg);border:1px solid var(--border-hair);background:var(--surface-card)}.hn-pc-msg[data-role=klien]{background:var(--bone-100)}.hn-pc-msg[data-blocked=true]{border-color:var(--status-err)}.hn-pc-msg-meta{font-size:11.5px;color:var(--text-muted);margin-bottom:4px}.hn-pc-msg-text{white-space:pre-wrap;line-height:1.6}.hn-pc-blocked{margin-top:8px;font-size:12.5px;color:var(--text-muted)}.hn-pc-raw{white-space:pre-wrap;margin-top:4px}.hn-pc-prd{border:1px solid var(--border-hair);border-radius:var(--radius-lg);padding:12px 14px;margin-bottom:12px}.hn-pc-prd-actions{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.hn-pc-slug{width:240px}.hn-pc-note{margin-top:10px;font-size:12.5px;color:var(--text-muted)}