hanoman 0.9.21 → 0.9.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build-info.json +3 -3
- package/package.json +1 -1
- package/web/assets/DalangHanomanScreen--M-xLwH5.js +16 -0
- package/web/assets/DalangHanomanScreen-DhDPV6e8.css +1 -0
- package/web/assets/{DocPreviewModal-CJP6d0Hx.js → DocPreviewModal-CYdmHEb_.js} +1 -1
- package/web/assets/{DocsWorkspace-zGpPd7u3.js → DocsWorkspace-BFzb87Ye.js} +1 -1
- package/web/assets/{IdeScreen-DTvfuR2n.js → IdeScreen-CDMJaERU.js} +1 -1
- package/web/assets/{LeadScreen-DWbunLkQ.js → LeadScreen-DJjFTkyZ.js} +1 -1
- package/web/assets/{ReviewScreen-Ch9UiKlx.js → ReviewScreen-DG0xSBou.js} +1 -1
- package/web/assets/{SchedulerScreen-zIUh-Vbe.js → SchedulerScreen-ChEZ01CH.js} +1 -1
- package/web/assets/{SettingsScreen-CLMuCJ6R.js → SettingsScreen-BnINOj5X.js} +1 -1
- package/web/assets/{TeamScreen-CV1R5Ekk.js → TeamScreen-5cFDPm3o.js} +1 -1
- package/web/assets/{TerminalScreen-QVjhjrxx.js → TerminalScreen-CIROrYjO.js} +1 -1
- package/web/assets/TerminalScreen-D0NdFmR-.css +1 -0
- package/web/assets/{TriageScreen-Dpj4YrBQ.js → TriageScreen-BWnuGOmQ.js} +1 -1
- package/web/assets/{VpsScreen-DX_HEquM.js → VpsScreen-PqOkFriA.js} +1 -1
- package/web/assets/hnm-blencong-v01-CBBfchr0.webp +0 -0
- package/web/assets/hnm-hero-rig-arm-ml-v01-Kts3pjTf.webp +0 -0
- package/web/assets/hnm-hero-rig-arm-mr-v01-DQgnE6bD.webp +0 -0
- package/web/assets/hnm-hero-rig-arm-ul-v01-CIAWAxFe.webp +0 -0
- package/web/assets/hnm-hero-rig-arm-ur-v01-C0R0CZnp.webp +0 -0
- package/web/assets/hnm-hero-rig-body-v01-DmbKJJHB.webp +0 -0
- package/web/assets/hnm-wayang-panakawan-v01-1LGv-V8N.webp +0 -0
- package/web/assets/hnm-wayang-putri-v01-F6p69kHq.webp +0 -0
- package/web/assets/hnm-wayang-satria-alus-v01-CpfoXKTy.webp +0 -0
- package/web/assets/hnm-wayang-satria-gagah-v01-bLfIYAsv.webp +0 -0
- package/web/assets/{index-DmnwLncG.js → index-DYWU10xI.js} +3 -3
- package/web/assets/index-T4aiSGoI.css +32 -0
- package/web/assets/{live-B193WtZm.js → live-C90Zx0h6.js} +1 -1
- package/web/assets/{sched-lead-shared-BjMO8Q_k.js → sched-lead-shared-Qn3NA7WO.js} +1 -1
- package/web/assets/{settings-rebase-BI7-Bk98.js → settings-rebase-3Z15zUKI.js} +1 -1
- package/web/index.html +2 -2
- package/web/assets/DalangHanomanScreen-Us_5qG25.js +0 -13
- package/web/assets/DalangHanomanScreen-gk7fa9dl.css +0 -1
- package/web/assets/TerminalScreen-DrgZKlw2.css +0 -1
- package/web/assets/index-CL0_zz87.css +0 -32
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DalangHanomanScreen-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DalangHanomanScreen--M-xLwH5.js","assets/react-DfGhg7ZW.js","assets/markdown-CWEY34jk.js","assets/xterm-3VOAfa_q.js","assets/DalangHanomanScreen-DhDPV6e8.css","assets/TeamScreen-5cFDPm3o.js","assets/live-C90Zx0h6.js","assets/TeamScreen-CtkpFpCF.css","assets/TriageScreen-BWnuGOmQ.js","assets/TriageScreen-B6_KrS6l.css","assets/TerminalScreen-CIROrYjO.js","assets/TerminalScreen-D0NdFmR-.css","assets/IdeScreen-CDMJaERU.js","assets/highlight-HK3IjCTX.js","assets/DocPreviewModal-CYdmHEb_.js","assets/IdeScreen-CppUucs0.css","assets/VpsScreen-PqOkFriA.js","assets/VpsScreen-BzXpc3le.css","assets/SchedulerScreen-ChEZ01CH.js","assets/sched-lead-shared-Qn3NA7WO.js","assets/scheduler-CQt-VP9-.css","assets/settings-rebase-3Z15zUKI.js","assets/LeadScreen-DJjFTkyZ.js","assets/LeadScreen-CN53yR_e.css","assets/DocsWorkspace-BFzb87Ye.js","assets/DocsWorkspace-CSak7xFX.css","assets/ReviewScreen-DG0xSBou.js","assets/SettingsScreen-BnINOj5X.js","assets/SettingsScreen-DQZ3K43g.css"])))=>i.map(i=>d[i]);
|
|
2
2
|
var _f=Object.defineProperty;var Af=(e,a,n)=>a in e?_f(e,a,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[a]=n;var bu=(e,a,n)=>Af(e,typeof a!="symbol"?a+"":a,n);import{r as qt,a as Ef,R as c,B as Tf,u as Cf,b as Pf}from"./react-DfGhg7ZW.js";import{m as Mf,p as If}from"./markdown-CWEY34jk.js";import{D as Nf,o as Rf}from"./xterm-3VOAfa_q.js";(function(){const a=document.createElement("link").relList;if(a&&a.supports&&a.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))i(r);new MutationObserver(r=>{for(const s of r)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&i(o)}).observe(document,{childList:!0,subtree:!0});function n(r){const s={};return r.integrity&&(s.integrity=r.integrity),r.referrerPolicy&&(s.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?s.credentials="include":r.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function i(r){if(r.ep)return;r.ep=!0;const s=n(r);fetch(r.href,s)}})();var bp={exports:{}},Uo={};/**
|
|
3
3
|
* @license React
|
|
4
4
|
* react-jsx-runtime.production.min.js
|
|
@@ -914,7 +914,7 @@ var _f=Object.defineProperty;var Af=(e,a,n)=>a in e?_f(e,a,{enumerable:!0,config
|
|
|
914
914
|
*
|
|
915
915
|
* This source code is licensed under the ISC license.
|
|
916
916
|
* See the LICENSE file in the root directory of this source tree.
|
|
917
|
-
*/const JS=G("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),ik={Activity:Uj,Anchor:zj,ArrowLeft:Fj,ArrowRight:Gj,ArrowUpRight:Kj,Ban:Wj,Baseline:Vj,Bell:Yj,BookOpen:Jj,Bot:Qj,Box:Zj,Bug:Xj,CalendarClock:e1,CalendarOff:a1,Check:t1,ChevronDown:n1,ChevronLeft:i1,ChevronRight:s1,ChevronUp:r1,ChevronsLeftRight:o1,Circle:p1,CircleArrowUp:l1,CircleCheck:c1,CircleCheckBig:d1,CircleHelp:u1,CircleMinus:m1,CircleX:h1,ClipboardCheck:g1,ClipboardList:k1,CloudDownload:b1,Code:y1,CodeXml:f1,Columns2:v1,Command:x1,Compass:j1,Copy:w1,CornerLeftUp:S1,Cpu:_1,Crosshair:A1,Delete:E1,Diff:T1,Dot:C1,Download:P1,Drama:M1,Ellipsis:I1,ExternalLink:N1,Eye:L1,EyeOff:R1,File:O1,FileDown:B1,FilePlus:$1,FileText:D1,Files:H1,Filter:q1,Focus:U1,Folder:W1,FolderGit2:z1,FolderOpen:F1,FolderPlus:G1,FolderTree:K1,Fullscreen:V1,GanttChart:Y1,Ghost:J1,GitBranch:Q1,GitCommitHorizontal:Z1,GitCompare:X1,GitFork:ew,GitMerge:aw,Goal:tw,Grab:nw,Group:iw,Hand:sw,Hash:rw,History:ow,Image:lw,Inbox:dw,Info:cw,Kanban:uw,Key:hw,KeyRound:mw,Layers:pw,LayoutDashboard:gw,LayoutGrid:kw,LifeBuoy:bw,Lightbulb:fw,Link:vw,Link2:yw,List:jw,ListChecks:xw,Loader:Sw,LoaderCircle:ww,Lock:_w,LogIn:Aw,LogOut:Ew,Logs:Tw,Maximize2:Cw,Menu:Pw,Merge:Mw,MessagesSquare:Iw,Mic:Nw,Minimize2:Rw,Minus:Lw,Monitor:Bw,Move:$w,Network:Dw,OctagonAlert:Ow,Option:Hw,Package:qw,Palette:Uw,Paperclip:zw,Pause:Fw,PenLine:Gw,Pencil:Kw,Pill:Ww,Play:Vw,PlugZap:Yw,Plus:Jw,Pointer:Qw,Radar:Zw,Radio:Xw,RefreshCw:eS,Replace:aS,RotateCcw:tS,Route:nS,Rows2:iS,Save:sS,Scroll:oS,ScrollText:rS,Search:lS,Section:dS,Send:cS,Server:uS,Settings:mS,Share2:hS,Sheet:pS,Shell:gS,Shield:kS,Shuffle:bS,SlidersHorizontal:fS,SlidersVertical:yS,Sparkles:vS,Split:xS,Square:wS,SquareTerminal:jS,Sticker:SS,Table:_S,Tablet:AS,Tag:ES,Target:TS,Terminal:CS,Text:PS,Ticket:MS,Trash:NS,Trash2:IS,TriangleAlert:RS,Type:LS,Underline:BS,Unlink:$S,Upload:DS,User:zS,UserCheck:OS,UserMinus:HS,UserPlus:qS,UserRound:US,Users:FS,View:GS,Volume2:KS,Webhook:WS,WifiOff:VS,X:YS,Zap:JS},QS={"alert-triangle":"TriangleAlert","arrow-up-circle":"CircleArrowUp","check-circle":"CircleCheckBig","check-circle-2":"CircleCheck","code-2":"CodeXml","download-cloud":"CloudDownload","edit-3":"PenLine","git-commit":"GitCommitHorizontal","help-circle":"CircleHelp","loader-2":"LoaderCircle","minus-circle":"CircleMinus","more-horizontal":"Ellipsis",sliders:"SlidersVertical","terminal-square":"SquareTerminal","x-circle":"CircleX"},ZS=e=>(e||"").split(/[-_\s]+/).map(a=>a.charAt(0).toUpperCase()+a.slice(1)).join(""),XS=e=>[ZS(e),QS[e]??""].filter(Boolean);function Re({name:e,size:a=16,stroke:n,color:i,style:r,...s}){const o=a_(e)??ik.Circle,l=s["aria-label"]!=null||s["aria-labelledby"]!=null||s.title!=null;return t.jsx(o,{"data-icon":e,"aria-hidden":l?void 0:!0,role:l?"img":void 0,size:a,color:i,strokeWidth:n,style:r,...s})}const e_=ik;function a_(e){for(const a of XS(e)){const n=e_[a];if(n)return n}}const t_="/assets/hnm-ill-diagram-technical-kit-modular-master-v01-DMmzOITA.webp",n_="/assets/hnm-ill-hero-workflow-16x9-master-v01-BngPlVl5.webp",i_="/assets/hnm-ill-lakon-anoman-duta-4x3-master-v01-0hEUEZ6d.webp",s_="/assets/hnm-ill-lakon-anoman-obong-4x3-master-v01-D841uTR5.webp",r_="/assets/hnm-ill-lakon-chiranjivi-4x3-master-v01-DtbnhQ7C.webp",o_="/assets/hnm-ill-lakon-gunung-dronagiri-4x3-master-v01-C6nCvUhL.webp",l_="/assets/hnm-ill-mascot-pose-ask-1x1-master-v01-S3NAOxD0.webp",d_="/assets/hnm-ill-mascot-pose-carry-knowledge-1x1-master-v01-BnkGXS8s.webp",c_="/assets/hnm-ill-mascot-pose-celebrate-1x1-master-v01-B-OkKay_.webp",u_="/assets/hnm-ill-mascot-pose-neutral-1x1-master-v01-CnvdPWgA.webp",m_="/assets/hnm-ill-mascot-pose-observe-1x1-master-v01-CG_jUBwM.webp",h_="/assets/hnm-ill-mascot-pose-warn-1x1-master-v01-Cm_KnXCE.webp",p_="/assets/hnm-ill-mascot-pose-welcome-1x1-master-v01-CAaHl0C1.webp",g_="/assets/hnm-ill-mascot-pose-work-1x1-master-v01-CFT1_F13.webp",k_="/assets/hnm-ill-model-character-sheet-master-v01-CIs0yaMj.webp",b_="/assets/hnm-ill-model-mascot-sheet-master-v01-BNJl7gCC.webp",f_="/assets/hnm-ill-motif-lakon-buntut-tile-strip-master-v01-DUZOJrQs.webp",y_="/assets/hnm-ill-product-state-awaiting-decision-4x3-master-v01-BwYfsI4Y.webp",v_="/assets/hnm-ill-product-state-empty-backlog-4x3-master-v01-CpttzxOY.webp",x_="/assets/hnm-ill-product-state-onboarding-4x3-master-v01-BEqlvDgy.webp",j_="/assets/hnm-ill-product-state-recoverable-error-4x3-master-v01-BcVo2BbN.webp",w_="/assets/hnm-ill-product-state-session-active-4x3-master-v01-BErsEZ5E.webp",S_="/assets/hnm-ill-product-state-success-4x3-master-v01-tJsjz-0L.webp",__="/assets/hnm-ill-social-landscape-16x9-master-v01-DCmpP1dP.webp",A_="/assets/hnm-ill-social-portrait-4x5-master-v01-DAMYmb8y.webp",E_="/assets/hnm-ill-social-square-1x1-master-v01-CA5ntGVr.webp",T_="/assets/hnm-ill-social-story-9x16-master-v01-DCZ-dWfx.webp",C_="/assets/hnm-ill-spot-context-1x1-master-v01-C-_dXTKT.webp",P_="/assets/hnm-ill-spot-durable-knowledge-1x1-master-v01-_CVUcBE4.webp",M_="/assets/hnm-ill-spot-human-control-1x1-master-v01-BRV52OwQ.webp",I_="/assets/hnm-ill-spot-isolation-1x1-master-v01-C6wtR8uB.webp",N_="/assets/hnm-ill-spot-parallel-work-1x1-master-v01-Ch4Wl1Du.webp",R_="/assets/hnm-ill-spot-visibility-1x1-master-v01-DkgTZ2MF.webp",L_="/assets/hnm-ill-sticker-blocked-1x1-master-v01-suto6sZ9.webp",B_="/assets/hnm-ill-sticker-docs-updated-1x1-master-v01-CV0BaOI1.webp",$_="/assets/hnm-ill-sticker-ready-1x1-master-v01-Cetao79T.webp",D_="/assets/hnm-ill-sticker-review-1x1-master-v01-txPj5Zvx.webp",O_="/assets/hnm-ill-sticker-shipped-1x1-master-v01-r05qU9m-.webp",H_="/assets/hnm-ill-sticker-thanks-1x1-master-v01-BlHuF8Nt.webp",q_="/assets/hnm-ill-sticker-waiting-1x1-master-v01-Dh-UnLNA.webp",U_="/assets/hnm-ill-sticker-working-1x1-master-v01-TQU0v2gf.webp",z_=[{id:"MOD-001",family:"model",subject:"character",ratio:"sheet",filename:"hnm-ill-model-character-sheet-master-v01.webp",transparent:!1,promptIntent:"Three-tier canonical Anoman model sheet with profile, back, three-quarter, gesture, costume, hand, foot, and tail views."},{id:"MSC-001",family:"model",subject:"mascot",ratio:"sheet",filename:"hnm-ill-model-mascot-sheet-master-v01.webp",transparent:!1,promptIntent:"Compact canonical mascot construction and scale sheet derived from MOD-001."},{id:"HRO-001",family:"hero",subject:"workflow",ratio:"16x9",filename:"hnm-ill-hero-workflow-16x9-master-v01.webp",transparent:!1,promptIntent:"Documented intent crosses a visible session lane and returns as evidence to grounded human control."},{id:"LKN-001",family:"lakon",subject:"anoman-duta",ratio:"4x3",filename:"hnm-ill-lakon-anoman-duta-4x3-master-v01.webp",transparent:!1,promptIntent:"An intact mandate crosses a boundary and returns with distinct evidence."},{id:"LKN-002",family:"lakon",subject:"anoman-obong",ratio:"4x3",filename:"hnm-ill-lakon-anoman-obong-4x3-master-v01.webp",transparent:!1,promptIntent:"A controlled ember passes through checklist steps and resolves into a clean branch-diff result."},{id:"LKN-003",family:"lakon",subject:"gunung-dronagiri",ratio:"4x3",filename:"hnm-ill-lakon-gunung-dronagiri-4x3-master-v01.webp",transparent:!1,promptIntent:"Anoman supports five bounded context strata while a grounded human hand selects the final path."},{id:"LKN-004",family:"lakon",subject:"chiranjivi",ratio:"4x3",filename:"hnm-ill-lakon-chiranjivi-4x3-master-v01.webp",transparent:!1,promptIntent:"One finite tail path links session, branch, merge, docs, and useful ground for the next actor."},{id:"SPT-001",family:"spot",subject:"context",ratio:"1x1",filename:"hnm-ill-spot-context-1x1-master-v01.webp",transparent:!1,promptIntent:"Anoman carries a bounded context folio along a purposeful path."},{id:"SPT-002",family:"spot",subject:"visibility",ratio:"1x1",filename:"hnm-ill-spot-visibility-1x1-master-v01.webp",transparent:!1,promptIntent:"Anoman opens a kelir-like field so a session state becomes inspectable."},{id:"SPT-003",family:"spot",subject:"isolation",ratio:"1x1",filename:"hnm-ill-spot-isolation-1x1-master-v01.webp",transparent:!1,promptIntent:"Anoman places work into distinct bounded worktree fields."},{id:"SPT-004",family:"spot",subject:"human-control",ratio:"1x1",filename:"hnm-ill-spot-human-control-1x1-master-v01.webp",transparent:!1,promptIntent:"A grounded human hand gently steers Anoman's workflow path without puppet coercion."},{id:"SPT-005",family:"spot",subject:"parallel-work",ratio:"1x1",filename:"hnm-ill-spot-parallel-work-1x1-master-v01.webp",transparent:!1,promptIntent:"Several isolated paths progress in parallel without collision or duplicated characters."},{id:"SPT-006",family:"spot",subject:"durable-knowledge",ratio:"1x1",filename:"hnm-ill-spot-durable-knowledge-1x1-master-v01.webp",transparent:!1,promptIntent:"A living session trace settles into reusable documents for the next contributor."},{id:"PST-001",family:"product-state",subject:"onboarding",ratio:"4x3",filename:"hnm-ill-product-state-onboarding-4x3-master-v01.webp",transparent:!1,promptIntent:"A welcome pose opens one bounded start path with calm setup space."},{id:"PST-002",family:"product-state",subject:"empty-backlog",ratio:"4x3",filename:"hnm-ill-product-state-empty-backlog-4x3-master-v01.webp",transparent:!1,promptIntent:"An observe pose sits beside a plainly empty backlog tray."},{id:"PST-003",family:"product-state",subject:"session-active",ratio:"4x3",filename:"hnm-ill-product-state-session-active-4x3-master-v01.webp",transparent:!1,promptIntent:"A focused work pose watches one visibly active session marker."},{id:"PST-004",family:"product-state",subject:"awaiting-decision",ratio:"4x3",filename:"hnm-ill-product-state-awaiting-decision-4x3-master-v01.webp",transparent:!1,promptIntent:"A patient ask pose waits at a fork with one grounded human decision marker."},{id:"PST-005",family:"product-state",subject:"success",ratio:"4x3",filename:"hnm-ill-product-state-success-4x3-master-v01.webp",transparent:!1,promptIntent:"A restrained relieved celebration acknowledges one completed result marker."},{id:"PST-006",family:"product-state",subject:"recoverable-error",ratio:"4x3",filename:"hnm-ill-product-state-recoverable-error-4x3-master-v01.webp",transparent:!1,promptIntent:"A concerned but calm mascot points to a reconnect path and recovery arrow."},{id:"MPS-001",family:"mascot-pose",subject:"neutral",ratio:"1x1",filename:"hnm-ill-mascot-pose-neutral-1x1-master-v01.webp",transparent:!0,promptIntent:"Neutral-ready GST-01, EXP-01, TAL-01 pose."},{id:"MPS-002",family:"mascot-pose",subject:"welcome",ratio:"1x1",filename:"hnm-ill-mascot-pose-welcome-1x1-master-v01.webp",transparent:!0,promptIntent:"Welcome open-palm GST-02, EXP-02, TAL-02 pose."},{id:"MPS-003",family:"mascot-pose",subject:"observe",ratio:"1x1",filename:"hnm-ill-mascot-pose-observe-1x1-master-v01.webp",transparent:!0,promptIntent:"Focused observe GST-05, EXP-03, TAL-01 pose."},{id:"MPS-004",family:"mascot-pose",subject:"work",ratio:"1x1",filename:"hnm-ill-mascot-pose-work-1x1-master-v01.webp",transparent:!0,promptIntent:"Focused work GST-06, EXP-03, TAL-02 pose."},{id:"MPS-005",family:"mascot-pose",subject:"ask",ratio:"1x1",filename:"hnm-ill-mascot-pose-ask-1x1-master-v01.webp",transparent:!0,promptIntent:"Curious ask GST-07, EXP-04, TAL-02 pose."},{id:"MPS-006",family:"mascot-pose",subject:"warn",ratio:"1x1",filename:"hnm-ill-mascot-pose-warn-1x1-master-v01.webp",transparent:!0,promptIntent:"Firm warn GST-08, EXP-06, TAL-03 pose."},{id:"MPS-007",family:"mascot-pose",subject:"celebrate",ratio:"1x1",filename:"hnm-ill-mascot-pose-celebrate-1x1-master-v01.webp",transparent:!0,promptIntent:"Relieved celebrate GST-11, EXP-07, TAL-04 pose."},{id:"MPS-008",family:"mascot-pose",subject:"carry-knowledge",ratio:"1x1",filename:"hnm-ill-mascot-pose-carry-knowledge-1x1-master-v01.webp",transparent:!0,promptIntent:"Grateful pass-knowledge GST-12, EXP-08, TAL-04 pose."},{id:"STK-001",family:"sticker",subject:"ready",ratio:"1x1",filename:"hnm-ill-sticker-ready-1x1-master-v01.webp",transparent:!0,promptIntent:"Ready reaction using GST-01, EXP-02, TAL-01."},{id:"STK-002",family:"sticker",subject:"working",ratio:"1x1",filename:"hnm-ill-sticker-working-1x1-master-v01.webp",transparent:!0,promptIntent:"Working reaction using GST-06, EXP-03, TAL-02."},{id:"STK-003",family:"sticker",subject:"waiting",ratio:"1x1",filename:"hnm-ill-sticker-waiting-1x1-master-v01.webp",transparent:!0,promptIntent:"Waiting reaction using GST-05, EXP-01, TAL-01."},{id:"STK-004",family:"sticker",subject:"blocked",ratio:"1x1",filename:"hnm-ill-sticker-blocked-1x1-master-v01.webp",transparent:!0,promptIntent:"Concerned blocked reaction using GST-08, EXP-05, TAL-03 without anger or catastrophe."},{id:"STK-005",family:"sticker",subject:"shipped",ratio:"1x1",filename:"hnm-ill-sticker-shipped-1x1-master-v01.webp",transparent:!0,promptIntent:"Shipped reaction using GST-11, EXP-07, TAL-04."},{id:"STK-006",family:"sticker",subject:"review",ratio:"1x1",filename:"hnm-ill-sticker-review-1x1-master-v01.webp",transparent:!0,promptIntent:"Review reaction using GST-04, EXP-03, TAL-02."},{id:"STK-007",family:"sticker",subject:"thanks",ratio:"1x1",filename:"hnm-ill-sticker-thanks-1x1-master-v01.webp",transparent:!0,promptIntent:"Grateful thanks reaction using GST-02, EXP-08, TAL-01."},{id:"STK-008",family:"sticker",subject:"docs-updated",ratio:"1x1",filename:"hnm-ill-sticker-docs-updated-1x1-master-v01.webp",transparent:!0,promptIntent:"Docs-updated reaction using GST-12, EXP-08, TAL-04."},{id:"SOC-001",family:"social",subject:"square",ratio:"1x1",filename:"hnm-ill-social-square-1x1-master-v01.webp",transparent:!1,promptIntent:"Square release field with character lower-left and clear upper-right headline/proof zones."},{id:"SOC-002",family:"social",subject:"portrait",ratio:"4x5",filename:"hnm-ill-social-portrait-4x5-master-v01.webp",transparent:!1,promptIntent:"Portrait release field with character in lower half, headline-safe upper third, and central proof zone."},{id:"SOC-003",family:"social",subject:"landscape",ratio:"16x9",filename:"hnm-ill-social-landscape-16x9-master-v01.webp",transparent:!1,promptIntent:"Landscape release field with character left, central proof object, and right-third headline-safe zone."},{id:"SOC-004",family:"social",subject:"story",ratio:"9x16",filename:"hnm-ill-social-story-9x16-master-v01.webp",transparent:!1,promptIntent:"Vertical story field with character low, central proof object, and quiet top UI-safe headline band."},{id:"DGM-001",family:"diagram",subject:"technical-kit",ratio:"modular",filename:"hnm-ill-diagram-technical-kit-modular-master-v01.webp",transparent:!1,promptIntent:"Text-free orthogonal primitive board for human, agent, docs, backlog, session, terminal, branch, worktree, state, arrows, and boundaries."},{id:"MTF-001",family:"motif",subject:"lakon-buntut",ratio:"tile-strip",filename:"hnm-ill-motif-lakon-buntut-tile-strip-master-v01.webp",transparent:!1,promptIntent:"Modular Buntut connector plus distinct Duta, Obong, Dronagiri, and Chiranjivi motifs with clean joins and no false loop."}],F_=["MOD-001","MSC-001","HRO-001","LKN-001","LKN-002","LKN-003","LKN-004","SPT-001","SPT-002","SPT-003","SPT-004","SPT-005","SPT-006","PST-001","PST-002","PST-003","PST-004","PST-005","PST-006","MPS-001","MPS-002","MPS-003","MPS-004","MPS-005","MPS-006","MPS-007","MPS-008","STK-001","STK-002","STK-003","STK-004","STK-005","STK-006","STK-007","STK-008","SOC-001","SOC-002","SOC-003","SOC-004","DGM-001","MTF-001"],G_=z_,K_=Object.assign({"../../../internal/assets/illustration/web/hnm-ill-diagram-technical-kit-modular-master-v01.webp":t_,"../../../internal/assets/illustration/web/hnm-ill-hero-workflow-16x9-master-v01.webp":n_,"../../../internal/assets/illustration/web/hnm-ill-lakon-anoman-duta-4x3-master-v01.webp":i_,"../../../internal/assets/illustration/web/hnm-ill-lakon-anoman-obong-4x3-master-v01.webp":s_,"../../../internal/assets/illustration/web/hnm-ill-lakon-chiranjivi-4x3-master-v01.webp":r_,"../../../internal/assets/illustration/web/hnm-ill-lakon-gunung-dronagiri-4x3-master-v01.webp":o_,"../../../internal/assets/illustration/web/hnm-ill-mascot-pose-ask-1x1-master-v01.webp":l_,"../../../internal/assets/illustration/web/hnm-ill-mascot-pose-carry-knowledge-1x1-master-v01.webp":d_,"../../../internal/assets/illustration/web/hnm-ill-mascot-pose-celebrate-1x1-master-v01.webp":c_,"../../../internal/assets/illustration/web/hnm-ill-mascot-pose-neutral-1x1-master-v01.webp":u_,"../../../internal/assets/illustration/web/hnm-ill-mascot-pose-observe-1x1-master-v01.webp":m_,"../../../internal/assets/illustration/web/hnm-ill-mascot-pose-warn-1x1-master-v01.webp":h_,"../../../internal/assets/illustration/web/hnm-ill-mascot-pose-welcome-1x1-master-v01.webp":p_,"../../../internal/assets/illustration/web/hnm-ill-mascot-pose-work-1x1-master-v01.webp":g_,"../../../internal/assets/illustration/web/hnm-ill-model-character-sheet-master-v01.webp":k_,"../../../internal/assets/illustration/web/hnm-ill-model-mascot-sheet-master-v01.webp":b_,"../../../internal/assets/illustration/web/hnm-ill-motif-lakon-buntut-tile-strip-master-v01.webp":f_,"../../../internal/assets/illustration/web/hnm-ill-product-state-awaiting-decision-4x3-master-v01.webp":y_,"../../../internal/assets/illustration/web/hnm-ill-product-state-empty-backlog-4x3-master-v01.webp":v_,"../../../internal/assets/illustration/web/hnm-ill-product-state-onboarding-4x3-master-v01.webp":x_,"../../../internal/assets/illustration/web/hnm-ill-product-state-recoverable-error-4x3-master-v01.webp":j_,"../../../internal/assets/illustration/web/hnm-ill-product-state-session-active-4x3-master-v01.webp":w_,"../../../internal/assets/illustration/web/hnm-ill-product-state-success-4x3-master-v01.webp":S_,"../../../internal/assets/illustration/web/hnm-ill-social-landscape-16x9-master-v01.webp":__,"../../../internal/assets/illustration/web/hnm-ill-social-portrait-4x5-master-v01.webp":A_,"../../../internal/assets/illustration/web/hnm-ill-social-square-1x1-master-v01.webp":E_,"../../../internal/assets/illustration/web/hnm-ill-social-story-9x16-master-v01.webp":T_,"../../../internal/assets/illustration/web/hnm-ill-spot-context-1x1-master-v01.webp":C_,"../../../internal/assets/illustration/web/hnm-ill-spot-durable-knowledge-1x1-master-v01.webp":P_,"../../../internal/assets/illustration/web/hnm-ill-spot-human-control-1x1-master-v01.webp":M_,"../../../internal/assets/illustration/web/hnm-ill-spot-isolation-1x1-master-v01.webp":I_,"../../../internal/assets/illustration/web/hnm-ill-spot-parallel-work-1x1-master-v01.webp":N_,"../../../internal/assets/illustration/web/hnm-ill-spot-visibility-1x1-master-v01.webp":R_,"../../../internal/assets/illustration/web/hnm-ill-sticker-blocked-1x1-master-v01.webp":L_,"../../../internal/assets/illustration/web/hnm-ill-sticker-docs-updated-1x1-master-v01.webp":B_,"../../../internal/assets/illustration/web/hnm-ill-sticker-ready-1x1-master-v01.webp":$_,"../../../internal/assets/illustration/web/hnm-ill-sticker-review-1x1-master-v01.webp":D_,"../../../internal/assets/illustration/web/hnm-ill-sticker-shipped-1x1-master-v01.webp":O_,"../../../internal/assets/illustration/web/hnm-ill-sticker-thanks-1x1-master-v01.webp":H_,"../../../internal/assets/illustration/web/hnm-ill-sticker-waiting-1x1-master-v01.webp":q_,"../../../internal/assets/illustration/web/hnm-ill-sticker-working-1x1-master-v01.webp":U_});function W_(e){const a=G_.find(i=>i.id===e);if(!a)throw new Error(`Illustration ${e} is missing from inventory.json`);const n=Object.entries(K_).find(([i])=>i.endsWith(`/${a.filename}`));if(!n)throw new Error(`Illustration ${e} references missing WebP ${a.filename}`);return Object.freeze({id:e,family:a.family,subject:a.subject,ratio:a.ratio,filename:a.filename,transparent:a.transparent,alt:a.promptIntent,src:n[1]})}const V_=Object.freeze(Object.fromEntries(F_.map(e=>[e,W_(e)]))),Y_={"1x1":"1 / 1","4x3":"4 / 3","4x5":"4 / 5","16x9":"16 / 9","9x16":"9 / 16"};function sk({id:e,alt:a,decorative:n=!1,priority:i=!1,fit:r="contain",style:s,...o}){const l=V_[e],d=i?{fetchpriority:"high"}:{};return t.jsx("img",{...o,...d,src:l.src,alt:n?"":a??l.alt,"aria-hidden":n||void 0,loading:i?"eager":"lazy",decoding:"async","data-testid":`illustration-${e}`,"data-illustration-id":e,"data-illustration-family":l.family,style:{display:"block",width:"100%",height:"auto",objectFit:r,aspectRatio:Y_[l.ratio],...s}})}function rk(e){return t.jsx(sk,{...e})}const si=Object.assign,Bc=c.createContext(null);function Xo(e){const a=c.useContext(Bc),n=c.useId(),i=a==null?void 0:a.register,r=a==null?void 0:a.unregister,s=e.id;c.useLayoutEffect(()=>{if(!(!i||!r))return i(n,s),()=>r(n)},[i,r,n,s]);const o=(a==null?void 0:a.owner)??null,l=o&&o.token===n?o:null;return{id:l?l.id:s,describedBy:e.describedBy??(l?a==null?void 0:a.describedBy:void 0),invalid:!!e.invalid||!!l&&!!(a!=null&&a.invalid)}}const $c=e=>e===!0||e==="true",jm={sm:{h:30,px:12,fs:"var(--text-sm)",gap:6,icon:15},md:{h:38,px:16,fs:"var(--text-md)",gap:8,icon:17},lg:{h:46,px:22,fs:"var(--text-base)",gap:9,icon:19}};function J_(e){switch(e){case"secondary":return{background:"var(--surface-card)",color:"var(--text-strong)",border:"1px solid var(--border-strong)",boxShadow:"var(--shadow-xs)"};case"ghost":return{background:"transparent",color:"var(--text-body)",border:"1px solid transparent"};case"danger":case"danger-outline":return{};case"primary":default:return{background:"var(--accent)",color:"var(--accent-on)",border:"1px solid var(--accent)",boxShadow:"var(--shadow-xs)"}}}function U({children:e,variant:a="primary",size:n="md",leftIcon:i,rightIcon:r,loading:s=!1,disabled:o=!1,fullWidth:l=!1,type:d="button",as:u="button",className:m="",style:h={},...p}){const g=jm[n]||jm.md,[f,b]=c.useState(!1),[x,v]=c.useState(!1),y=o||s,T=J_(a),S=a==="danger"||a==="danger-outline",E=S?{}:a==="ghost"?{background:"var(--bone-200)"}:a==="secondary"?{background:"var(--bone-100)",borderColor:"var(--ink-300)"}:{filter:"brightness(0.95)"},w=u==="a",N=w?{"aria-disabled":y||void 0}:{type:d,disabled:y};return c.createElement(w?"a":"button",si({...N,onMouseEnter:()=>b(!0),onMouseLeave:()=>{b(!1),v(!1)},onMouseDown:()=>v(!0),onMouseUp:()=>v(!1),className:["hn-touch-target",S?`hn-btn-${a}`:"",m].filter(Boolean).join(" "),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",gap:g.gap,height:g.h,textDecoration:"none",padding:`0 ${g.px}px`,width:l?"100%":"auto",font:`var(--weight-medium) ${g.fs}/1 var(--font-ui)`,letterSpacing:"0.005em",borderRadius:"var(--radius-sm)",cursor:y?"not-allowed":"pointer",opacity:y?.5:1,transition:"var(--transition-fast)",transform:x&&!y?"translateY(0.5px)":"none",whiteSpace:"nowrap",...T,...f&&!y?E:null,...h}},p),s&&c.createElement(Re,{name:"loader-2",size:g.icon,style:{animation:"hn-spin 0.7s linear infinite"}}),!s&&i&&c.createElement(Re,{name:i,size:g.icon}),e!=null&&c.createElement("span",null,e),!s&&r&&c.createElement(Re,{name:r,size:g.icon}))}const wm={sm:{box:30,icon:16},md:{box:38,icon:18},lg:{box:46,icon:20}};function yr({icon:e,label:a,variant:n="ghost",size:i="md",disabled:r=!1,className:s="",style:o={},...l}){const d=wm[i]||wm.md,[u,m]=c.useState(!1),h=n==="solid"?{background:"var(--accent)",color:"var(--accent-on)",border:"1px solid var(--accent)"}:n==="outline"?{background:"var(--surface-card)",color:"var(--text-body)",border:"1px solid var(--border-strong)"}:{background:"transparent",color:"var(--text-muted)",border:"1px solid transparent"},p=n==="solid"?{filter:"brightness(0.95)"}:n==="outline"?{background:"var(--bone-100)",borderColor:"var(--ink-300)",color:"var(--text-strong)"}:{background:"var(--bone-200)",color:"var(--text-strong)"};return c.createElement("button",si({type:"button","aria-label":a,title:a,disabled:r,onMouseEnter:()=>m(!0),onMouseLeave:()=>m(!1),className:`hn-touch-target ${s}`.trim(),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:d.box,height:d.box,borderRadius:"var(--radius-sm)",cursor:r?"not-allowed":"pointer",opacity:r?.5:1,transition:"var(--transition-fast)",...h,...u&&!r?p:null,...o}},l),c.createElement(Re,{name:e,size:d.icon}))}const Sm={sm:{h:30,px:10,fs:"var(--text-sm)",icon:15},md:{h:38,px:12,fs:"var(--text-md)",icon:17},lg:{h:46,px:14,fs:"var(--text-base)",icon:19}};function Oe({size:e="md",leftIcon:a,rightIcon:n,invalid:i=!1,disabled:r=!1,mono:s=!1,className:o="",style:l={},...d}){const u=Sm[e]||Sm.md,[m,h]=c.useState(!1),p=Xo({id:d.id,describedBy:d["aria-describedby"],invalid:i||$c(d["aria-invalid"])}),g=p.invalid,f=g?"var(--status-err)":m?"var(--border-focus)":"var(--border-strong)";return c.createElement("div",{className:`hn-touch-target ${o}`.trim(),style:{display:"flex",alignItems:"center",gap:8,height:u.h,padding:`0 ${u.px}px`,background:r?"var(--bone-200)":"var(--surface-card)",border:`1px solid ${f}`,borderRadius:"var(--radius-sm)",boxShadow:m?"var(--ring)":g?"none":"var(--shadow-inset)",transition:"var(--transition-fast)",opacity:r?.6:1,...l}},a&&c.createElement(Re,{name:a,size:u.icon,color:"var(--text-subtle)"}),c.createElement("input",si({disabled:r,onFocus:b=>{h(!0),d.onFocus&&d.onFocus(b)},onBlur:b=>{h(!1),d.onBlur&&d.onBlur(b)}},d,{id:p.id,"aria-describedby":p.describedBy,"aria-invalid":g?!0:d["aria-invalid"],className:"hn-input-core",style:{flex:1,minWidth:0,height:"100%",boxSizing:"border-box",border:"none",outline:"none",background:"transparent",color:"var(--text-strong)",fontFamily:s?"var(--font-mono)":"var(--font-ui)",fontSize:u.fs,lineHeight:1.2}})),n&&c.createElement(Re,{name:n,size:u.icon,color:"var(--text-subtle)"}))}const _m={sm:{h:30,px:10,fs:"var(--text-sm)"},md:{h:38,px:12,fs:"var(--text-md)"},lg:{h:46,px:14,fs:"var(--text-base)"}};function $e({options:e=[],value:a,defaultValue:n,onChange:i,size:r="md",disabled:s=!1,invalid:o=!1,placeholder:l,className:d="",style:u={},...m}){const h=_m[r]||_m.md,[p,g]=c.useState(!1),f=Xo({id:m.id,describedBy:m["aria-describedby"],invalid:o||$c(m["aria-invalid"])}),b=f.invalid,x=b?"var(--status-err)":p?"var(--border-focus)":"var(--border-strong)",v=e.map(y=>typeof y=="string"?{value:y,label:y}:y);return c.createElement("div",{className:`hn-touch-target hn-select ${d}`.trim(),style:{position:"relative",display:"inline-flex",alignItems:"center",height:h.h,background:s?"var(--bone-200)":"var(--surface-card)",border:`1px solid ${x}`,borderRadius:"var(--radius-sm)",boxShadow:p?"var(--ring)":b?"none":"var(--shadow-inset)",transition:"var(--transition-fast)",opacity:s?.6:1,...u}},c.createElement("select",si({value:a,defaultValue:n,onChange:i,disabled:s},m,{id:f.id,"aria-describedby":f.describedBy,"aria-invalid":b?!0:m["aria-invalid"],onFocus:y=>{g(!0),m.onFocus&&m.onFocus(y)},onBlur:y=>{g(!1),m.onBlur&&m.onBlur(y)},style:{appearance:"none",WebkitAppearance:"none",border:"none",outline:"none",background:"transparent",color:"var(--text-strong)",fontFamily:"var(--font-ui)",fontSize:h.fs,height:"100%",flex:1,width:"100%",minWidth:0,boxSizing:"border-box",padding:`0 ${h.px+22}px 0 ${h.px}px`,cursor:s?"not-allowed":"pointer"}}),l&&c.createElement("option",{value:"",disabled:!0},l),v.map(y=>c.createElement("option",{key:y.value,value:y.value,disabled:y.disabled},y.label))),c.createElement(Re,{name:"chevron-down",size:16,color:"var(--text-subtle)",style:{position:"absolute",right:h.px,pointerEvents:"none"}}))}function vs({checked:e,defaultChecked:a,onChange:n,label:i,description:r,disabled:s=!1,className:o="",style:l={},...d}){const u=c.useId(),{"aria-label":m,"aria-labelledby":h,...p}=d,g=e!==void 0,[f,b]=c.useState(!!a),x=g?e:f,v=y=>{s||(g||b(T=>!T),n&&n(!x,y))};return c.createElement("label",si({className:`hn-choice-target ${o}`.trim(),style:{display:"inline-flex",alignItems:r?"flex-start":"center",gap:10,cursor:s?"not-allowed":"pointer",opacity:s?.55:1,...l}},p),c.createElement("span",{role:"checkbox","aria-checked":x,"aria-disabled":s||void 0,"aria-label":m,"aria-labelledby":h??(!m&&(i||r)?u:void 0),className:"hn-choice-control",tabIndex:s?-1:0,onClick:v,onKeyDown:y=>{y.key!==" "&&y.key!=="Enter"||(y.preventDefault(),v(y))},style:{display:"inline-grid",placeItems:"center",width:24,height:24,marginTop:r?-1:0,flex:"0 0 auto"}},c.createElement("span",{style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:18,height:18,borderRadius:"var(--radius-xs)",background:x?"var(--accent)":"var(--surface-card)",border:`1.5px solid ${x?"var(--accent)":"var(--border-strong)"}`,boxShadow:x?"none":"var(--shadow-inset)",transition:"var(--transition-fast)"}},x&&c.createElement(Re,{name:"check",size:13,stroke:3,color:"var(--accent-on)"}))),(i||r)&&c.createElement("span",{id:u,onClick:v,style:{userSelect:"none"}},i&&c.createElement("span",{style:{display:"block",fontSize:"var(--text-md)",color:"var(--text-strong)",lineHeight:1.4}},i),r&&c.createElement("span",{style:{display:"block",fontSize:"var(--text-sm)",color:"var(--text-muted)",lineHeight:1.45}},r)))}const ok=c.createContext(null);function Mi({checked:e=!1,value:a,onChange:n,label:i,description:r,disabled:s=!1,tone:o,className:l="",style:d={},...u}){const m=c.useId(),h=c.useContext(ok),p=!!h&&a!==void 0,g=s||!!(h!=null&&h.disabled),f=p?h.value===a:e,b=o??(h==null?void 0:h.tone)??"default",x=g||h&&a!==void 0&&h.tabTarget!==a?-1:0,{"aria-label":v,"aria-labelledby":y,...T}=u,S=E=>{g||(h&&a!==void 0&&h.value!==a&&h.onSelect(a,E),n&&n(E))};return c.createElement("label",si({className:`hn-choice-target ${l}`.trim(),"data-tone":b,style:{display:"inline-flex",alignItems:r?"flex-start":"center",gap:10,cursor:g?"not-allowed":"pointer",opacity:g?.55:1,...d}},T),c.createElement("span",{role:"radio","aria-checked":f,"aria-disabled":g||void 0,"aria-label":v,"aria-labelledby":y??(!v&&(i||r)?m:void 0),"data-value":p?a:void 0,className:"hn-choice-control",tabIndex:x,onClick:S,onKeyDown:E=>{E.key!==" "&&E.key!=="Enter"||(E.preventDefault(),S(E))},style:{display:"inline-grid",placeItems:"center",width:24,height:24,marginTop:r?-1:0,flex:"0 0 auto"}},c.createElement("span",{className:"hn-radio-ring"},f&&c.createElement("span",{className:"hn-radio-dot"}))),(i||r)&&c.createElement("span",{id:m,onClick:S,style:{userSelect:"none"}},i&&c.createElement("span",{className:"hn-radio-label"},i),r&&c.createElement("span",{style:{display:"block",fontSize:"var(--text-sm)",color:"var(--text-muted)",lineHeight:1.45}},r)))}function Am(e){return e?Array.from(e.querySelectorAll('[role="radio"][data-value]')).filter(a=>a.getAttribute("aria-disabled")!=="true"):[]}function vr({value:e,onChange:a,label:n,direction:i="column",disabled:r=!1,tone:s="default",children:o,style:l={},...d}){const u=c.useRef(null),m=c.useId(),[h,p]=c.useState(null);c.useLayoutEffect(()=>{const x=Am(u.current).map(y=>y.dataset.value??""),v=e!=null&&x.includes(e)?e:x[0]??null;p(y=>y===v?y:v)});const g=c.useCallback((x,v)=>{a==null||a(x,v)},[a]),f=c.useMemo(()=>({value:e,tabTarget:h,disabled:r,tone:s,onSelect:g}),[e,h,r,s,g]),b=x=>{if(!["ArrowDown","ArrowRight","ArrowUp","ArrowLeft","Home","End"].includes(x.key))return;const v=Am(u.current),y=v.indexOf(x.target);if(y<0)return;const T=v.length,S=x.key==="Home"?0:x.key==="End"?T-1:x.key==="ArrowDown"||x.key==="ArrowRight"?(y+1)%T:(y-1+T)%T;x.preventDefault();const E=v[S];E.focus();const w=E.dataset.value;w!==void 0&&w!==e&&(a==null||a(w,x))};return t.jsx(ok.Provider,{value:f,children:t.jsxs("div",{...d,ref:u,role:"radiogroup","aria-labelledby":n?m:d["aria-labelledby"],"aria-disabled":r||void 0,onKeyDown:b,style:{display:"flex",flexDirection:"column",gap:8,minWidth:0,...l},children:[n&&t.jsx("div",{id:m,style:{fontSize:12.5,fontWeight:600,color:"var(--text-strong)",lineHeight:1.4},children:n}),t.jsx("div",{style:{display:"flex",flexDirection:i,flexWrap:"wrap",gap:i==="row"?18:10},children:o})]})})}const Em={sm:{w:32,h:18,knob:14},md:{w:40,h:22,knob:18}};function el({checked:e,defaultChecked:a,onChange:n,size:i="md",disabled:r=!1,label:s,className:o="",style:l={},...d}){const u=c.useId(),{"aria-label":m,"aria-labelledby":h,...p}=d,g=Em[i]||Em.md,f=e!==void 0,[b,x]=c.useState(!!a),v=f?e:b,y=S=>{r||(f||x(E=>!E),n&&n(!v,S))},T=c.createElement("span",{role:"switch","aria-checked":v,"aria-disabled":r||void 0,"aria-label":m,"aria-labelledby":h??(!m&&s?u:void 0),className:"hn-choice-control",tabIndex:r?-1:0,onClick:y,onKeyDown:S=>{S.key!==" "&&S.key!=="Enter"||(S.preventDefault(),y(S))},style:{display:"inline-grid",placeItems:"center",width:g.w,height:g.h,cursor:r?"not-allowed":"pointer",flex:"0 0 auto"}},c.createElement("span",{style:{position:"relative",display:"inline-block",width:g.w,height:g.h,borderRadius:"var(--radius-pill)",background:v?"var(--accent)":"var(--ink-300)",border:"1px solid "+(v?"var(--accent-hover)":"var(--ink-300)"),transition:"var(--transition-fast)"}},c.createElement("span",{style:{position:"absolute",top:"50%",left:v?g.w-g.knob-3:2,transform:"translateY(-50%)",width:g.knob,height:g.knob,borderRadius:"50%",background:"var(--bone-000)",boxShadow:"var(--shadow-sm)",transition:"var(--transition-fast)"}})));return s?c.createElement("label",si({className:`hn-choice-target ${o}`.trim(),style:{display:"inline-flex",alignItems:"center",gap:10,cursor:r?"not-allowed":"pointer",opacity:r?.55:1,...l}},p),T,c.createElement("span",{id:u,onClick:y,style:{fontSize:"var(--text-md)",color:"var(--text-strong)",userSelect:"none"}},s)):c.createElement("span",si({className:`hn-choice-target ${o}`.trim(),style:{opacity:r?.55:1,...l}},p),T)}function Nd({options:e,value:a,onChange:n,placeholder:i="Pilih…",searchPlaceholder:r="Cari…",emptyText:s="Tak ada yang cocok.",invalidValues:o=[],disabled:l=!1,style:d={},...u}){const[m,h]=c.useState(!1),[p,g]=c.useState(""),f=Xo({id:u.id,describedBy:u["aria-describedby"]}),b=u["aria-label"]??i,x=S=>{var E;return((E=e.find(w=>w.value===S))==null?void 0:E.label)??S},v=p.trim().toLowerCase(),y=v?e.filter(S=>`${S.label} ${S.value} ${S.group??""}`.toLowerCase().includes(v)):e,T=S=>n(a.includes(S)?a.filter(E=>E!==S):[...a,S]);return c.createElement("div",{style:{display:"flex",flexDirection:"column",gap:6,...d}},a.length>0&&c.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:6}},a.map(S=>{const E=o.includes(S);return c.createElement("span",{key:S,"data-testid":`chip-${S}`,title:E?"tak ada di katalog mesin ini":void 0,style:{display:"inline-flex",alignItems:"center",gap:6,padding:"2px 8px",borderRadius:"var(--radius-pill)",fontSize:"var(--text-xs)",fontFamily:"var(--font-mono)",background:"var(--bone-200)",color:E?"var(--status-err)":"var(--text-strong)",border:`1px solid ${E?"var(--status-err)":"var(--border-strong)"}`}},E?"⚠ ":null,x(S),c.createElement("button",{type:"button","aria-label":`Hapus ${S}`,disabled:l,onClick:()=>n(a.filter(w=>w!==S)),style:{border:"none",background:"transparent",cursor:"pointer",color:"inherit",padding:0,lineHeight:1,fontSize:"var(--text-sm)"}},"×"))})),c.createElement(U,{variant:"secondary",size:"sm",disabled:l,id:f.id,"aria-describedby":f.describedBy,"aria-invalid":f.invalid||void 0,"aria-label":b,"aria-expanded":m,onClick:()=>h(S=>!S),rightIcon:m?"chevron-up":"chevron-down"},a.length?`${a.length} dipilih`:i),m&&c.createElement("div",{style:{display:"flex",flexDirection:"column",gap:6,padding:8,border:"1px solid var(--border-strong)",borderRadius:"var(--radius-sm)",background:"var(--surface-card)"}},c.createElement(Bc.Provider,{value:null},c.createElement(Oe,{type:"search",role:"searchbox",size:"sm",value:p,placeholder:r,"aria-label":`Cari ${b}`,onChange:S=>g(S.target.value)})),c.createElement("div",{role:"listbox","aria-multiselectable":!0,style:{display:"flex",flexDirection:"column",maxHeight:220,overflowY:"auto"}},y.length===0?c.createElement("span",{style:{fontSize:"var(--text-xs)",color:"var(--text-subtle)",padding:"6px 4px"}},s):y.map(S=>c.createElement("button",{key:S.value,type:"button",role:"option","aria-selected":a.includes(S.value),disabled:l,onClick:()=>T(S.value),style:{display:"flex",alignItems:"center",gap:8,padding:"6px 4px",border:"none",background:"transparent",cursor:"pointer",textAlign:"left",font:"var(--weight-medium) var(--text-sm)/1.3 var(--font-ui)",color:a.includes(S.value)?"var(--text-strong)":"var(--text-body)"}},c.createElement(Re,{name:a.includes(S.value)?"check":"circle",size:14,color:a.includes(S.value)?"var(--accent)":"var(--text-subtle)"}),c.createElement("span",null,S.label),S.group&&c.createElement("span",{style:{marginLeft:"auto",fontSize:"var(--text-xs)",color:"var(--text-subtle)"}},S.group))))))}const Q_={loading:{icon:"loader-2",fg:"var(--text-muted)",bg:"var(--bone-200)",title:"Memuat…"},empty:{icon:"inbox",fg:"var(--brass-700)",bg:"var(--brass-100)",title:"Belum ada data"},error:{icon:"octagon-alert",fg:"var(--clay-600)",bg:"var(--status-err-tint)",title:"Gagal memuat"}};function ue({kind:e,title:a,hint:n,icon:i,action:r,actionLabel:s,actionIcon:o,illustration:l,illustrationDecorative:d,compact:u}){const m=Q_[e],h=u?34:44;return t.jsxs("div",{role:e==="error"?"alert":void 0,"aria-busy":e==="loading"||void 0,style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:4,textAlign:"center",padding:u?"24px 16px":"56px 24px",fontFamily:"var(--font-sans)"},children:[l?t.jsx(sk,{id:l,decorative:d,style:{width:u?132:240,maxWidth:"100%",marginBottom:8,borderRadius:"var(--radius-md)"}}):t.jsx("span",{style:{width:h,height:h,borderRadius:"var(--radius-md)",marginBottom:6,background:m.bg,color:m.fg,display:"inline-flex",alignItems:"center",justifyContent:"center"},children:t.jsx(Re,{name:i||m.icon,size:u?17:21,style:e==="loading"?{animation:"hn-spin 0.7s linear infinite"}:void 0})}),t.jsx("div",{style:{fontSize:u?13.5:15,fontWeight:600,color:"var(--text-strong)",lineHeight:1.3},children:a??m.title}),n&&t.jsx("div",{style:{fontSize:12.5,color:"var(--text-muted)",lineHeight:1.5,maxWidth:380},children:n}),r&&t.jsx("div",{style:{marginTop:10},children:t.jsx(U,{size:"sm",variant:e==="error"?"secondary":"primary",leftIcon:o||(e==="error"?"rotate-ccw":"plus"),onClick:r,children:s??(e==="error"?"Coba lagi":"Tambah")})})]})}class Z_ extends c.Component{constructor(){super(...arguments);bu(this,"state",{error:null})}static getDerivedStateFromError(n){return{error:n}}render(){return this.state.error?t.jsx(ue,{kind:"error",title:"Halaman gagal dimuat",hint:"Biasanya karena hanoman baru diperbarui di server. Muat ulang tab ini.",action:()=>window.location.reload(),actionLabel:"Muat ulang"}):this.props.children}}const lk=e=>`/sounds/notify-${e}.wav`;let Or;function dk(){if(Or===void 0)try{Or=new Audio}catch{Or=null}return Or}let Tm=!1;function X_(){if(Tm)return;const e=dk();if(e){Tm=!0;try{e.muted=!0,e.src=lk("short"),Promise.resolve(e.play()).then(()=>{e.pause(),e.muted=!1}).catch(()=>{e.muted=!1})}catch{e.muted=!1}}}function e2(e){if(e==="off")return;const a=dk();if(a)try{a.muted=!1,a.src=lk(e),a.currentTime=0,Promise.resolve(a.play()).catch(()=>{})}catch{}}function xs(e,a="Terjadi kesalahan"){const n=e instanceof Error?e.message:typeof e=="string"?e:"";return n&&n.trim()?n.trim():a}function ba(e,a){const n=xs(a,"");return n?`Gagal ${e}: ${n}`:`Gagal ${e}`}function Cm(e){return e.reduce((a,n)=>n.createdAt>a?n.createdAt:a,"")}function a2(e,a){return e.filter(n=>n.createdAt>a)}function t2(e,a){return e.type==="decision"?{msg:`${e.specId??e.sessionId} · butuh keputusan`,tone:"warn",icon:"git-merge",sound:a.notifyDecisionSound,enabled:a.notifyDecision}:e.type==="ticket"?{msg:e.title,tone:"warn",icon:"inbox",sound:a.notifyDecisionSound,enabled:!0}:{msg:`${e.specId} · "${e.title}" selesai`,tone:"ok",icon:"check-circle-2",sound:a.notifySound,enabled:a.notifyDone}}function n2(e,a,n){if(!(!("Notification"in window)||window.Notification.permission!=="granted"||!document.hidden))try{const i=new window.Notification(e,{tag:a.id});i.onclick=()=>{window.focus(),n==null||n(a),i.close()}}catch{}}const ck=c.createContext({items:[],unread:0,total:0,markAllRead:()=>{},markRead:()=>{},clear:()=>{}}),Dc=()=>c.useContext(ck);function i2({showToast:e,onOpen:a,isViewing:n,children:i}){const[r,s]=c.useState([]),[o,l]=c.useState(0),[d,u]=c.useState(0),m=c.useRef(void 0),h=c.useRef({notifyDone:!0,notifySound:"short",notifyDecision:!0,notifyDecisionSound:"alert"}),p=c.useRef(a);p.current=a;const g=c.useRef(n);g.current=n;const f=c.useRef(new Set),b=c.useRef(()=>{}),x=c.useCallback(async()=>{try{const w=await ne.getSettings();h.current={notifyDone:w.notifyDone,notifySound:w.notifySound,notifyDecision:w.notifyDecision,notifyDecisionSound:w.notifyDecisionSound}}catch{}},[]),v=c.useCallback(w=>{var I;if(s(w.items),l(w.unread),u(w.total??w.items.length),m.current===void 0){m.current=Cm(w.items);return}const N=a2(w.items,m.current),R=Cm(w.items);R>m.current&&(m.current=R);const L=N[0];if(L&&!f.current.has(L.id)){f.current.add(L.id),f.current.size>200&&f.current.delete(f.current.values().next().value);const B=t2(L,h.current);if(B.enabled){const A=L.type==="decision",M=A&&((I=g.current)==null?void 0:I.call(g,L))===!0,K=A&&p.current?{action:{label:"Jawab",onAction:()=>{var O;b.current(L.id),(O=p.current)==null||O.call(p,L)}},duration:7e3}:void 0;M||e(B.msg,B.tone,B.icon,K),e2(B.sound),n2(B.msg,L,p.current)}}},[e]);c.useEffect(()=>{x();const w=Ii(R=>{R.t==="notifications"&&v({items:R.items,unread:R.unread,total:R.total})}),N=()=>{X_(),"Notification"in window&&window.Notification.permission==="default"&&window.Notification.requestPermission(),window.removeEventListener("pointerdown",N),window.removeEventListener("keydown",N)};return window.addEventListener("pointerdown",N,{once:!0}),window.addEventListener("keydown",N,{once:!0}),()=>{w(),window.removeEventListener("pointerdown",N),window.removeEventListener("keydown",N)}},[v,x]);const y=c.useRef({items:r,unread:o,total:d});y.current={items:r,unread:o,total:d};const T=c.useCallback(()=>{const w=y.current.unread;l(0),ne.markNotificationsRead().catch(N=>{l(w),e(ba("menandai notifikasi dibaca",N),"err","x-circle")})},[e]),S=c.useCallback(w=>{const N=y.current.items.find(L=>L.id===w);if(N!=null&&N.readAt)return;const R=new Date().toISOString();N&&(s(L=>L.map(I=>I.id===w?{...I,readAt:R}:I)),l(L=>Math.max(0,L-1))),ne.markNotificationRead(w).catch(L=>{N&&(s(I=>I.map(B=>B.id===w?{...B,readAt:null}:B)),l(I=>I+1)),e(ba("menandai notifikasi dibaca",L),"err","x-circle")})},[e]);b.current=S;const E=c.useCallback(()=>{const w=y.current;s([]),l(0),u(0),ne.clearNotifications().catch(N=>{s(w.items),l(w.unread),u(w.total),e(ba("membersihkan notifikasi",N),"err","x-circle")})},[e]);return t.jsx(ck.Provider,{value:{items:r,unread:o,total:d,markAllRead:T,markRead:S,clear:E,onOpen:a},children:i})}function s2(e,a){if(e.type==="ticket")return{section:"triage",projectFilter:e.projectId??void 0};const n=e.sessionId?a.find(i=>i.id===e.sessionId&&!i.exited):void 0;return e.type==="decision"||n?{section:"terminal",projectFilter:e.projectId??void 0,focus:e.sessionId??void 0}:{section:"backlog",projectFilter:e.projectId??void 0}}const mr=Object.assign;function uk({color:e,size:a,pulse:n=!1}){return c.createElement("span",{"aria-hidden":"true",className:n?"hn-status-dot hn-status-dot-pulse":"hn-status-dot",style:{width:a,height:a,borderRadius:"50%",background:e,flex:"0 0 auto"}})}const Pm={neutral:{bg:"var(--bone-200)",text:"var(--ink-600)",dot:"var(--ink-500)",bd:"var(--bone-400)"},brass:{bg:"var(--brass-100)",text:"var(--brass-700)",dot:"var(--brass-500)",bd:"var(--brass-300)"},info:{bg:"var(--wind-100)",text:"var(--wind-700)",dot:"var(--wind-600)",bd:"var(--wind-500)"},ok:{bg:"var(--status-ok-tint)",text:"var(--leaf-600)",dot:"var(--leaf-600)",bd:"var(--leaf-500)"},warn:{bg:"var(--status-warn-tint)",text:"var(--status-warn)",dot:"var(--amber-600)",bd:"var(--amber-500)"},err:{bg:"var(--status-err-tint)",text:"var(--clay-600)",dot:"var(--clay-600)",bd:"var(--clay-500)"}};function ra({children:e,tone:a="neutral",icon:n,variant:i="soft",size:r="md",className:s="",style:o={},...l}){const d=Pm[a]||Pm.neutral,u=r==="sm",m=i==="solid",h=i==="outline",p=i==="dot",g=p?{display:"inline-flex",alignItems:"center",gap:u?5:6,fontFamily:"var(--font-ui)",fontSize:u?"var(--text-2xs)":"var(--text-xs)",fontWeight:"var(--weight-medium)",lineHeight:1,color:d.text,whiteSpace:"nowrap"}:{display:"inline-flex",alignItems:"center",gap:u?4:5,height:u?18:22,padding:u?"0 7px":"0 9px",borderRadius:"var(--radius-pill)",fontFamily:"var(--font-ui)",fontSize:u?"var(--text-2xs)":"var(--text-xs)",fontWeight:"var(--weight-medium)",lineHeight:1,letterSpacing:"0.01em",background:m?d.text:h?"transparent":d.bg,color:m?"var(--bone-000)":d.text,border:`1px solid ${h?d.bd:m?d.text:"transparent"}`,whiteSpace:"nowrap"};return c.createElement("span",mr({className:s,style:{...g,...o}},l),p&&c.createElement(uk,{color:d.dot,size:u?6:7}),n&&!p&&c.createElement(Re,{name:n,size:u?11:13}),e)}const Mm={info:{icon:"info",role:"note"},ok:{icon:"check-circle-2",role:"status"},warn:{icon:"alert-triangle",role:"status"},err:{icon:"octagon-alert",role:"alert"},danger:{icon:"octagon-alert",role:"alert"},brass:{icon:"sparkles",role:"note"}};function ft({children:e,tone:a="info",title:n,icon:i,action:r,role:s,className:o="",style:l={},...d}){const u=Mm[a]?a:"info",m=Mm[u];return c.createElement("div",mr({className:`hn-callout ${o}`.trim(),"data-tone":u,role:s??m.role,style:{display:"flex",gap:12,padding:"14px 16px",borderRadius:"var(--radius-md)",...l}},d),c.createElement(Re,{name:i||m.icon,size:19,style:{marginTop:1}}),c.createElement("div",{style:{flex:1,minWidth:0}},n&&c.createElement("div",{style:{fontFamily:"var(--font-ui)",fontSize:"var(--text-md)",fontWeight:"var(--weight-semibold)",color:"var(--text-strong)",marginBottom:e?3:0}},n),e&&c.createElement("div",{style:{fontSize:"var(--text-sm)",lineHeight:"var(--leading-normal)",color:"var(--text-body)"}},e),r&&c.createElement("div",{style:{marginTop:10}},r)))}const r2=new Set(["brass","ok","warn","err","danger","info"]);function Oc({value:e=0,max:a=100,tone:n="brass",size:i="md",showLabel:r=!1,label:s,valueText:o,className:l="",style:d={},...u}){const m=Math.max(0,Math.min(100,e/a*100)),h=i==="sm"?5:i==="lg"?10:7,p=r2.has(n)?n:"brass",g={},f={};for(const[x,v]of Object.entries(u))x.startsWith("aria-")?g[x]=v:f[x]=v;const b=g["aria-label"]??(typeof s=="string"?s:void 0);return c.createElement("div",mr({className:l,style:{...d}},f),(r||s)&&c.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"baseline",marginBottom:6}},c.createElement("span",{style:{fontSize:"var(--text-sm)",color:"var(--text-body)"}},s),r&&c.createElement("span",{"aria-hidden":"true",style:{fontFamily:"var(--font-mono)",fontSize:"var(--text-xs)",color:"var(--text-muted)"}},Math.round(m),"%")),c.createElement("div",mr({role:"progressbar","aria-valuemin":0,"aria-valuenow":e,"aria-valuemax":a,"aria-label":b,"aria-valuetext":o,style:{height:h,background:"var(--bone-300)",borderRadius:"var(--radius-pill)",overflow:"hidden"}},g),c.createElement("div",{className:"hn-progress-fill","data-tone":p,style:{width:m+"%",height:"100%",borderRadius:"var(--radius-pill)",transition:"width var(--dur-slow) var(--ease-out)"}})))}const Im={ok:{label:"On convention",dot:"var(--leaf-600)",text:"var(--leaf-600)",bg:"var(--status-ok-tint)",pulse:!1},drift:{label:"Drifting",dot:"var(--amber-600)",text:"var(--status-warn)",bg:"var(--status-warn-tint)",pulse:!1},broken:{label:"Off convention",dot:"var(--clay-600)",text:"var(--clay-600)",bg:"var(--status-err-tint)",pulse:!1},running:{label:"Running",dot:"var(--brass-600)",text:"var(--brass-700)",bg:"var(--brass-100)",pulse:!0},awaiting:{label:"Menunggu keputusan",dot:"var(--amber-600)",text:"var(--status-warn)",bg:"var(--status-warn-tint)",pulse:!0},queued:{label:"Queued",dot:"var(--wind-600)",text:"var(--wind-700)",bg:"var(--wind-100)",pulse:!1},done:{label:"Done",dot:"var(--leaf-600)",text:"var(--leaf-600)",bg:"var(--status-ok-tint)",pulse:!1},failed:{label:"Failed",dot:"var(--clay-600)",text:"var(--clay-600)",bg:"var(--status-err-tint)",pulse:!1},paused:{label:"Paused",dot:"var(--amber-600)",text:"var(--status-warn)",bg:"var(--status-warn-tint)",pulse:!1},stopped:{label:"Stopped",dot:"var(--ink-500)",text:"var(--ink-500)",bg:"var(--bone-200)",pulse:!1},scanning:{label:"Scanning",dot:"var(--wind-600)",text:"var(--wind-700)",bg:"var(--wind-100)",pulse:!0},idle:{label:"Idle",dot:"var(--ink-500)",text:"var(--ink-500)",bg:"var(--bone-200)",pulse:!1}};function pt({status:e="idle",children:a,size:n="md",variant:i="pill",className:r="",style:s={},...o}){const l=Im[e]||Im.idle,d=n==="sm",u=i==="dot";return c.createElement("span",mr({className:r,style:{display:"inline-flex",alignItems:"center",gap:d?5:6,height:u?"auto":d?20:24,padding:u?0:d?"0 8px 0 7px":"0 10px 0 8px",borderRadius:"var(--radius-pill)",background:u?"transparent":l.bg,color:l.text,fontFamily:"var(--font-ui)",fontSize:d?"var(--text-2xs)":"var(--text-xs)",fontWeight:"var(--weight-medium)",lineHeight:1,whiteSpace:"nowrap",...s}},o),c.createElement(uk,{color:l.dot,size:d?6:7,pulse:l.pulse}),a||l.label)}const o2=15e3;function l2(){const[e,a]=c.useState(km);return c.useEffect(()=>(a(km()),bj(a)),[]),e}function EL(e){const{topic:a,params:n,pollMs:i}=e,r=c.useRef(e.apply);r.current=e.apply;const s=c.useRef(e.refetch);s.current=e.refetch;const o=JSON.stringify(n),[l,d]=c.useState(()=>bm());c.useEffect(()=>(d(bm()),vj(d)),[]);const u=l.includes(a);c.useEffect(()=>xj(a,n,f=>r.current(f)),[a,o]);const m=yj()||l.length>0,[h,p]=c.useState(!1);c.useEffect(()=>{if(u||m){p(!1);return}const f=setTimeout(()=>{fj()===null&&p(!0)},o2);return()=>clearTimeout(f)},[u,m]);const g=!u&&(h||m);c.useEffect(()=>{if(!g)return;const f=setInterval(()=>{document.hidden||s.current()},i);return()=>clearInterval(f)},[g,i,o])}const d2=Object.assign;function Sa({children:e,title:a,eyebrow:n,actions:i,footer:r,elevation:s="raised",interactive:o=!1,padding:l=20,fill:d=!1,className:u="",style:m={},...h}){const[p,g]=c.useState(!1),f={flat:"none",raised:"var(--shadow-sm)",float:"var(--shadow-md)"}[s]||"var(--shadow-sm)",b=a||n||i;return c.createElement("div",d2({className:u,onMouseEnter:()=>o&&g(!0),onMouseLeave:()=>o&&g(!1),style:{background:"var(--surface-card)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-lg)",boxShadow:o&&p?"var(--shadow-md)":f,transform:o&&p?"translateY(-1px)":"none",transition:"var(--transition-base)",cursor:o?"pointer":"default",overflow:"hidden",...d?{display:"flex",flexDirection:"column",flex:"1 1 auto",minHeight:0}:null,...m}},h),b&&c.createElement("div",{className:"hn-card-header",style:{padding:`${l}px ${l}px ${a&&e?0:l}px`}},c.createElement("div",{style:{minWidth:0}},n&&c.createElement("div",{className:"hn-eyebrow",style:{fontFamily:"var(--font-mono)",fontSize:"var(--text-2xs)",fontWeight:"var(--weight-medium)",letterSpacing:"var(--tracking-caps)",textTransform:"uppercase",color:"var(--text-muted)",marginBottom:5}},n),a&&c.createElement("div",{style:{fontFamily:"var(--font-display)",fontSize:"var(--text-xl)",fontWeight:"var(--weight-semibold)",letterSpacing:"var(--tracking-tight)",color:"var(--text-strong)",lineHeight:1.2}},a)),i&&c.createElement("div",{className:"hn-card-actions",style:{flex:"0 0 auto"}},i)),e&&c.createElement("div",{style:{padding:b?`12px ${l}px ${l}px`:l,...d?{display:"flex",flexDirection:"column",flex:"1 1 auto",minHeight:0}:null}},e),r&&c.createElement("div",{style:{padding:`12px ${l}px`,borderTop:"1px solid var(--border-hair)",background:"var(--bone-100)"}},r))}const Hr=[],zs=new Map;function c2(e){const a=[];let n=e;for(;n!==document.body&&n.parentElement;){for(const i of Array.from(n.parentElement.children)){if(i===n||i.hasAttribute("data-hn-toast-host"))continue;const r=zs.get(i)??0;zs.set(i,r+1),r===0&&i.setAttribute("inert",""),a.push(i)}n=n.parentElement}return()=>{for(const i of a){const r=(zs.get(i)??1)-1;if(r>0){zs.set(i,r);continue}zs.delete(i),i.removeAttribute("inert")}}}const u2=3,m2=2600,h2=7e3;function mk(){const[e,a]=c.useState([]),n=c.useRef(0),i=c.useCallback((o,l="ok",d,u)=>{const m=++n.current;a(h=>[...h,{k:m,message:o,tone:l,icon:d,action:u==null?void 0:u.action,duration:u==null?void 0:u.duration}])},[]),r=c.useCallback(o=>a(l=>l.filter(d=>d.k!==o)),[]);return[c.useMemo(()=>({items:e,dismiss:r}),[e,r]),i]}function p2({toast:e,onDone:a}){const n=e.tone||"ok",i=n==="err",r=i?"var(--clay-500)":n==="warn"?"var(--amber-500)":n==="info"?"var(--wind-600)":"var(--leaf-500)",s=e.icon||(i?"x-circle":n==="warn"?"alert-triangle":n==="info"?"info":"check-circle-2"),o=e.action,l=e.duration??(o?h2:m2),[d,u]=c.useState(!1),[m,h]=c.useState(!1),[p,g]=c.useState(!1),f=d||m,b=c.useRef(l),x=c.useRef(0),v=c.useRef(a);v.current=a;const y=e.k,T=()=>{v.current?v.current(y):g(!0)};return c.useEffect(()=>{if(f)return;x.current=Date.now();const S=setTimeout(()=>{v.current?v.current(y):g(!0)},b.current);return()=>{clearTimeout(S),b.current=Math.max(0,b.current-(Date.now()-x.current))}},[f,y]),p?null:t.jsxs("div",{className:o?"hn-toast hn-toast--action":"hn-toast",role:i?"alert":void 0,"aria-live":i?"assertive":void 0,onMouseEnter:()=>u(!0),onMouseLeave:()=>u(!1),onFocus:()=>h(!0),onBlur:S=>{S.currentTarget.contains(S.relatedTarget)||h(!1)},children:[t.jsx(Re,{name:s,size:16,color:r}),t.jsx("span",{className:"hn-toast-msg",children:e.message}),o&&t.jsx("button",{type:"button",onClick:()=>{o.onAction(),T()},className:"hn-toast-action",children:o.label})]})}function Hc({toast:e}){const a=e&&"items"in e?e:null,n=e&&!("items"in e)?e:null,i=a?a.items:n?[n]:[],r=a?a.dismiss:void 0,s=i.slice(0,u2);return t.jsx("div",{"data-hn-toast-host":"",role:"status","aria-live":"polite",className:"hn-toast-host",children:s.map(o=>t.jsx(p2,{toast:o,onDone:r},o.k))})}function TL({toast:e}){return t.jsx(Hc,{toast:e})}function la({open:e,title:a,eyebrow:n,icon:i,onClose:r,footer:s,width:o=560,closeOnEscape:l=!0,dismissible:d=!0,fillHeight:u=!1,children:m}){const h=c.useRef(null),p=c.useRef(Symbol("modal")),g=c.useId(),f=c.useRef(r);f.current=r;const b=c.useRef(d);b.current=d;const x=d&&!!r;return c.useLayoutEffect(()=>{if(!e||!h.current)return;const v=document.activeElement instanceof HTMLElement?document.activeElement:null,y=h.current,T=p.current;Hr.push(T);const S=c2(y),E=()=>Array.from(y.querySelectorAll('button:not([disabled]), a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')),w=y.querySelector("[data-initial-focus]:not([disabled])")??y.querySelector("[autofocus]")??y.querySelector("input:not([disabled]), textarea:not([disabled]), select:not([disabled])")??y.querySelector('button:not([disabled]), a[href], [tabindex]:not([tabindex="-1"])');w==null||w.focus();const N=R=>{var A;if(Hr.at(-1)!==T)return;if(R.key==="Escape"&&l){if(!b.current)return;R.preventDefault(),(A=f.current)==null||A.call(f);return}if(R.key!=="Tab")return;const L=E(),I=L[0],B=L[L.length-1];!I||!B?(R.preventDefault(),y.focus()):R.shiftKey&&document.activeElement===I?(R.preventDefault(),B.focus()):!R.shiftKey&&document.activeElement===B&&(R.preventDefault(),I.focus())};return window.addEventListener("keydown",N),()=>{window.removeEventListener("keydown",N);const R=Hr.lastIndexOf(T);R>=0&&Hr.splice(R,1),S(),v==null||v.focus()}},[l,e]),e?t.jsx("div",{className:"hn-modal-overlay hn-modal-scrim",onMouseDown:v=>{x&&v.target===v.currentTarget&&(r==null||r())},children:t.jsxs("div",{ref:h,"data-testid":"modal-panel",className:u?"hn-modal-panel hn-modal-sheet hn-modal-panel--fill":"hn-modal-panel hn-modal-sheet",role:"dialog","aria-modal":"true","aria-labelledby":a?g:void 0,tabIndex:-1,style:{width:o},children:[t.jsxs("div",{className:"hn-modal-header",children:[i&&t.jsx("span",{className:"hn-modal-icon",children:t.jsx(Re,{name:i,size:17})}),t.jsxs("div",{className:"hn-grow-min",children:[n&&t.jsx("div",{className:"hn-eyebrow hn-modal-eyebrow",children:n}),a&&t.jsx("h2",{id:g,className:"hn-modal-title",children:a})]}),t.jsx("button",{type:"button",onClick:()=>{x&&(r==null||r())},disabled:!x,"aria-label":"Tutup",className:"hn-modal-close",children:t.jsx(Re,{name:"x",size:18})})]}),t.jsx("div",{"data-testid":"modal-body",className:u?"hn-modal-body hn-modal-body--fill":"hn-modal-body",children:m}),s&&t.jsx("div",{className:"hn-modal-footer",children:s})]})}):null}function oe({label:e,hint:a,error:n,tone:i="default",children:r}){const s=c.useId(),o=a?`${s}-hint`:void 0,l=n?`${s}-error`:void 0,[d,u]=c.useState([]),m=c.useCallback((x,v)=>{const y=v??`${s}-control`;u(T=>{const S=T.findIndex(E=>E.token===x);return S<0?[...T,{token:x,id:y}]:T[S].id===y?T:T.map((E,w)=>w===S?{token:x,id:y}:E)})},[s]),h=c.useCallback(x=>{u(v=>v.filter(y=>y.token!==x))},[]),p=d[0]??null,g=[l,o].filter(Boolean).join(" ")||void 0,f=!!n||i==="danger",b=c.useMemo(()=>({owner:p,describedBy:g,invalid:f,register:m,unregister:h}),[p,g,f,m,h]);return t.jsx(Bc.Provider,{value:b,children:t.jsxs("div",{className:"hn-field","data-tone":i,children:[e&&t.jsx("label",{htmlFor:p==null?void 0:p.id,className:"hn-field-label",children:e}),r,a&&t.jsx("div",{id:o,className:"hn-field-hint",children:a}),n&&t.jsx("div",{id:l,role:"alert",className:"hn-field-error",children:n})]})})}function Ma({value:e,onChange:a,rows:n=3,placeholder:i,mono:r=!1,invalid:s=!1,onFocus:o,onBlur:l,...d}){const[u,m]=c.useState(!1),h=Xo({id:d.id,describedBy:d["aria-describedby"],invalid:s||$c(d["aria-invalid"])}),p=h.invalid;return t.jsx("textarea",{...d,id:h.id,"aria-describedby":h.describedBy,"aria-invalid":p?!0:d["aria-invalid"],className:"hn-textarea-core",value:e,onChange:a,rows:n,placeholder:i,onFocus:g=>{m(!0),o==null||o(g)},onBlur:g=>{m(!1),l==null||l(g)},style:{display:"block",width:"100%",boxSizing:"border-box",resize:"vertical",fontFamily:r?"var(--font-mono)":"var(--font-ui)",fontSize:13,color:"var(--text-strong)",background:"var(--surface-card)",border:`1px solid ${p?"var(--status-err)":u?"var(--border-focus)":"var(--border-strong)"}`,borderRadius:"var(--radius-sm)",padding:"9px 11px",lineHeight:1.5,boxShadow:u?"var(--ring)":p?"none":"var(--shadow-inset)",outline:"none"}})}const hk={flex:"1 1 auto",minHeight:0,overflowY:"auto"},pk={display:"flex",flexDirection:"column",flex:"1 1 auto",minHeight:0},Ao={flex:"0 0 auto"};function xr(e,a,n){const i=Math.max(1,Math.ceil(e/Math.max(1,n))),r=Math.min(Math.max(1,a),i),s=e===0?0:(r-1)*n+1,o=Math.min(e,r*n);return{page:r,pageCount:i,from:s,to:o}}function Cl({children:e,onClick:a,disabled:n,active:i,aria:r}){const[s,o]=c.useState(!1);return t.jsx("button",{className:"hn-touch-target",onClick:n?void 0:a,disabled:n,"aria-label":r,"aria-current":i?"page":void 0,onMouseEnter:()=>o(!0),onMouseLeave:()=>o(!1),style:{minWidth:28,height:28,padding:"0 7px",borderRadius:"var(--radius-sm)",border:`1px solid ${i?"var(--brass-400)":"var(--border-hair)"}`,background:i?"var(--brass-100)":s&&!n?"var(--bone-200)":"var(--surface-card)",color:n?"var(--text-subtle)":i?"var(--brass-700)":"var(--text-body)",fontFamily:"var(--font-mono)",fontSize:12,fontWeight:i?600:400,cursor:n?"default":"pointer",opacity:n?.5:1,display:"inline-flex",alignItems:"center",justifyContent:"center"},children:e})}function g2(e,a){const n=[],i=s=>s===1||s===a||Math.abs(s-e)<=1;let r=0;for(let s=1;s<=a;s++)i(s)&&(r&&s-r>1&&n.push("…"),n.push(s),r=s);return n}function jr({page:e,pageCount:a,total:n,from:i,to:r,onPage:s,unit:o="item"}){return n===0?null:t.jsxs("div",{className:"hn-pager",children:[t.jsxs("span",{className:"hn-pager-count",children:[i,"–",r," dari ",n," ",o]}),t.jsxs("div",{className:"hn-pager-btns",children:[t.jsx(Cl,{onClick:()=>s(e-1),disabled:e<=1,aria:"Sebelumnya",children:t.jsx(Re,{name:"chevron-left",size:15})}),g2(e,a).map((l,d)=>l==="…"?t.jsx("span",{className:"hn-pager-gap",children:"…"},"e"+d):t.jsx(Cl,{onClick:()=>s(l),active:l===e,aria:"Halaman "+l,children:l},l)),t.jsx(Cl,{onClick:()=>s(e+1),disabled:e>=a,aria:"Berikutnya",children:t.jsx(Re,{name:"chevron-right",size:15})})]})]})}const k2=Object.assign,Eo=(e,a,n)=>`${e}-${a}-${n.replace(/[^A-Za-z0-9_-]/g,"_")}`,gk=c.createContext(null);function ps({value:e,children:a,className:n="",style:i}){const r=c.useContext(gk),s=!r||r.active===e;return c.createElement("div",{role:"tabpanel",id:r?Eo(r.baseId,"panel",e):void 0,"aria-labelledby":r?Eo(r.baseId,"tab",e):void 0,hidden:!s,className:`hn-tabpanel ${n}`.trim(),style:i},a)}const b2=e=>{if(getComputedStyle(e).overflowX==="visible")return{start:!1,end:!1};const a=e.scrollWidth-e.clientWidth;return{start:e.scrollLeft>1,end:a>1&&e.scrollLeft<a-1}};function kk(e){const[a,n]=c.useState({start:!1,end:!1}),i=c.useCallback(()=>{const r=e.current;if(!r)return;const s=b2(r);n(o=>o.start===s.start&&o.end===s.end?o:s)},[e]);return c.useEffect(()=>{i()}),c.useEffect(()=>{const r=e.current;if(!r)return;r.addEventListener("scroll",i,{passive:!0});const s=typeof ResizeObserver>"u"?null:new ResizeObserver(i);return s==null||s.observe(r),()=>{r.removeEventListener("scroll",i),s==null||s.disconnect()}},[e,i]),a}const Pl=24;function f2(e,a){const n=e.getBoundingClientRect(),i=a.getBoundingClientRect(),r=i.left-n.left-e.clientLeft+e.scrollLeft,s=r+i.width;(r<e.scrollLeft+Pl||s>e.scrollLeft+e.clientWidth-Pl)&&(e.scrollLeft=Math.max(0,r-Pl))}function At({tabs:e=[],value:a,defaultValue:n,onChange:i,variant:r="underline",className:s="",style:o={},children:l,...d}){const u=e.map(w=>typeof w=="string"?{value:w,label:w}:w),m=a!==void 0,[h,p]=c.useState(n??(u[0]&&u[0].value)),g=m?a:h,f=c.useId(),b=c.useRef(null),x=kk(b);c.useLayoutEffect(()=>{const w=b.current,N=w==null?void 0:w.querySelector('[role="tab"][aria-selected="true"]');w&&N&&f2(w,N)},[g]);const v=new Set(c.Children.toArray(l).flatMap(w=>c.isValidElement(w)&&w.type===ps&&w.props.value!==void 0?[w.props.value]:[])),y=w=>{m||p(w),i&&i(w)},T=(w,N)=>{var I,B;let R=N;if(w.key==="ArrowRight")R=(N+1)%u.length;else if(w.key==="ArrowLeft")R=(N-1+u.length)%u.length;else if(w.key==="Home")R=0;else if(w.key==="End")R=u.length-1;else return;w.preventDefault();const L=u[R];L&&(y(L.value),(B=(I=w.currentTarget.parentElement)==null?void 0:I.querySelectorAll('[role="tab"]')[R])==null||B.focus())},S=r==="pill",E=c.createElement("div",k2({ref:b,className:`hn-tabs ${s}`.trim(),role:"tablist","data-fade-start":x.start?"true":void 0,"data-fade-end":x.end?"true":void 0,style:{display:"inline-flex",gap:S?4:0,padding:S?4:0,background:S?"var(--bone-200)":"transparent",borderRadius:S?"var(--radius-md)":0,borderBottom:S?"none":"1px solid var(--border-hair)",...o}},d),u.map((w,N)=>{const R=w.value===g;return c.createElement("button",{key:w.value,id:Eo(f,"tab",w.value),role:"tab","aria-selected":R,tabIndex:R?0:-1,"aria-controls":v.has(w.value)?Eo(f,"panel",w.value):void 0,onClick:()=>y(w.value),onKeyDown:L=>T(L,N),style:{flex:"0 0 auto",display:"inline-flex",alignItems:"center",gap:6,padding:S?"6px 12px":"9px 14px",marginBottom:S?0:-1,border:"none",background:S&&R?"var(--surface-card)":"transparent",boxShadow:S&&R?"var(--shadow-xs)":"none",borderRadius:S?"var(--radius-sm)":0,borderBottom:S?"none":`2px solid ${R?"var(--accent)":"transparent"}`,color:R?"var(--text-strong)":"var(--text-muted)",fontFamily:"var(--font-ui)",fontSize:"var(--text-md)",fontWeight:R?"var(--weight-semibold)":"var(--weight-medium)",cursor:"pointer",transition:"var(--transition-fast)",whiteSpace:"nowrap"}},w.icon&&c.createElement(Re,{name:w.icon,size:15}),w.label,w.count!=null&&c.createElement("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--text-2xs)",color:R?"var(--brass-700)":"var(--text-subtle)",background:R?"var(--brass-100)":"var(--bone-300)",borderRadius:"var(--radius-pill)",padding:"1px 6px"}},w.count))}));return l==null?E:c.createElement(gk.Provider,{value:{baseId:f,active:g??""}},E,l)}const y2='button:not([disabled]), a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';function sn({label:e,title:a,items:n,icon:i="more-horizontal",size:r="sm",children:s}){const[o,l]=c.useState(!1),[d,u]=c.useState(0),m=c.useRef([]),h=c.useRef(null),p=c.useId(),g=c.useRef(!1),f=c.useRef(!1);if(c.useEffect(()=>{var E;f.current&&!o&&g.current&&(g.current=!1,(E=document.getElementById(p))==null||E.focus()),f.current=o},[o,p]),!n.length&&!s)return null;const b=n.flatMap((E,w)=>E.disabled?[]:[w]),x=Math.max(0,n.findIndex(E=>!E.disabled)),v=()=>{u(x),l(!0)},y=()=>{g.current=!0,l(!1)},T=E=>{var w;u(E),(w=m.current[E])==null||w.focus()},S=E=>{var N;const w=m.current.findIndex(R=>R===E.target);if(E.key==="Tab"){if(E.shiftKey&&((N=h.current)!=null&&N.querySelector(y2)))return;E.preventDefault(),E.stopPropagation(),y();return}if(E.key==="ArrowDown"||E.key==="ArrowUp"){E.preventDefault();const R=b.length;if(!R)return;const L=b.indexOf(w),I=E.key==="ArrowDown"?1:-1,B=L<0?b[I>0?0:R-1]:b[(L+I+R)%R];B!==void 0&&T(B);return}if(E.key==="Home"||E.key==="End"){E.preventDefault();const R=E.key==="Home"?b[0]:b[b.length-1];R!==void 0&&T(R);return}if(E.key.length===1&&E.key!==" "&&!E.ctrlKey&&!E.metaKey&&!E.altKey){const R=E.key.toLowerCase(),I=[...b.filter(B=>B>w),...b.filter(B=>B<=w)].find(B=>{var A;return(((A=n[B])==null?void 0:A.label)??"").trim().toLowerCase().startsWith(R)});I!==void 0&&T(I)}};return t.jsxs(t.Fragment,{children:[t.jsx(yr,{id:p,size:r,icon:i,label:e,"aria-haspopup":n.length?"menu":"dialog","aria-expanded":o,onClick:v}),o&&t.jsxs(la,{open:!0,title:a??e,icon:i,width:420,onClose:y,children:[s!=null&&t.jsx("div",{ref:h,children:s}),n.length>0&&t.jsx("div",{role:"menu","aria-label":a??e,className:"hn-overflow-menu",onKeyDown:S,children:n.map((E,w)=>{const N=E.tone==="danger";return t.jsxs("button",{ref:R=>{m.current[w]=R},type:"button",role:"menuitem",tabIndex:w===d?0:-1,disabled:E.disabled,title:E.title,"data-initial-focus":w===d?"":void 0,onFocus:()=>u(w),onClick:()=>{l(!1),E.onSelect()},className:`hn-overflow-item${N?" hn-overflow-item-danger":""}`,children:[E.icon&&t.jsx(Re,{name:E.icon,size:15}),E.label]},E.key)})})]})]})}function wr(e,a,n){const i=c.useRef(null),r=c.useRef(null),s=c.useId(),o=c.useRef(a);o.current=a,c.useLayoutEffect(()=>{if(!e||!r.current)return;const d=document.activeElement instanceof HTMLElement?document.activeElement:null,u=d&&d!==document.body?d:i.current,m=n==="menu"?'[role="menuitem"]':'button:not([disabled]), a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';return(r.current.querySelector(m)??r.current).focus(),()=>u==null?void 0:u.focus()},[n,e]),c.useEffect(()=>{if(!e)return;const d=u=>{var h,p;const m=u.target;(h=r.current)!=null&&h.contains(m)||(p=i.current)!=null&&p.contains(m)||o.current()};return document.addEventListener("pointerdown",d),()=>document.removeEventListener("pointerdown",d)},[e]);const l=c.useCallback(d=>{var p,g;if(d.key==="Escape"){d.preventDefault(),o.current();return}if(n!=="menu")return;const u=Array.from(((p=r.current)==null?void 0:p.querySelectorAll('[role="menuitem"]'))??[]);if(!u.length)return;const m=Math.max(0,u.indexOf(document.activeElement));let h=null;d.key==="ArrowDown"?h=(m+1)%u.length:d.key==="ArrowUp"?h=(m-1+u.length)%u.length:d.key==="Home"?h=0:d.key==="End"&&(h=u.length-1),h!==null&&(d.preventDefault(),(g=u[h])==null||g.focus())},[n]);return{triggerRef:i,panelRef:r,panelId:s,onKeyDown:l}}function Nm({title:e,eyebrow:a,description:n,actions:i,className:r=""}){return t.jsxs("header",{className:`hn-page-header ${r}`.trim(),children:[t.jsxs("div",{className:"hn-page-header-text",children:[a&&t.jsx("div",{className:"hn-eyebrow hn-page-eyebrow",children:a}),t.jsx("h2",{className:"hn-page-title",children:e}),n&&t.jsx("p",{className:"hn-page-description",children:n})]}),i&&t.jsx("div",{className:"hn-page-actions",children:i})]})}function v2({label:e,count:a,children:n}){const[i,r]=c.useState(!1),s=c.useCallback(()=>r(!1),[]),{triggerRef:o,panelRef:l,panelId:d,onKeyDown:u}=wr(i,s,"dialog");return t.jsxs("div",{className:"hn-filter-popover-anchor",children:[t.jsxs("button",{ref:o,type:"button",className:"hn-filter-trigger hn-touch-target","aria-haspopup":"dialog","aria-expanded":i,"aria-controls":i?d:void 0,onClick:()=>r(m=>!m),children:[t.jsx(Re,{name:"sliders",size:14}),e,a>0&&t.jsxs("span",{className:"hn-filter-count",children:[a,t.jsx("span",{className:"hn-sr-only",children:" aktif"})]})]}),i&&t.jsx("div",{ref:l,id:d,role:"dialog","aria-label":e,className:"hn-filter-popover",onKeyDown:u,children:n})]})}function x2({label:e,search:a,chips:n=[],filters:i,filtersLabel:r="Filter",onReset:s,resetLabel:o="Reset",actions:l}){const d=n.length>0||!!(a!=null&&a.value),u=!!s&&d;return t.jsxs("div",{role:a?"search":"group","aria-label":e,className:"hn-filter-bar",children:[t.jsxs("div",{className:"hn-filter-bar-row",children:[a&&t.jsx("div",{className:"hn-filter-search",children:t.jsx(Oe,{type:"search",size:"sm",leftIcon:"search","aria-label":a.label,placeholder:a.placeholder,value:a.value,onChange:m=>a.onChange(m.target.value)})}),i!=null&&t.jsx(v2,{label:r,count:n.length,children:i}),l&&t.jsx("div",{className:"hn-filter-actions",children:l})]}),(n.length>0||u)&&t.jsxs("div",{className:"hn-filter-bar-chips",children:[n.map(m=>t.jsxs("button",{type:"button",className:"hn-filter-chip",onClick:m.onRemove,"aria-label":`Hapus filter ${m.label}`,children:[t.jsx("span",{children:m.label}),t.jsx(Re,{name:"x",size:12})]},m.key)),u&&t.jsx(U,{size:"sm",variant:"ghost",onClick:s,children:o})]})]})}function Zt({label:e,children:a,className:n=""}){return t.jsx("ul",{role:"list","aria-label":e,className:`hn-row-list ${n}`.trim(),children:a})}function en({children:e,onClick:a,href:n,selected:i=!1,actions:r}){const s=!!(a||n),o=i?"true":void 0;let l;n&&!a?l=t.jsx("a",{href:n,className:"hn-row-main","aria-current":o,children:e}):s?l=t.jsx("button",{type:"button",className:"hn-row-main",onClick:a,"aria-current":o,children:e}):l=t.jsx("div",{className:"hn-row-main",children:e});const d=["hn-row",s&&"hn-row-interactive",i&&"hn-row-selected"].filter(Boolean).join(" ");return t.jsxs("li",{className:d,children:[l,r&&t.jsx("div",{className:"hn-row-actions",children:r})]})}function j2({gap:e=3,align:a,as:n="div",children:i,className:r="",style:s}){return c.createElement(n,{className:`hn-stack ${r}`.trim(),style:{gap:`var(--space-${e})`,alignItems:a,...s}},i)}const w2={start:"flex-start",center:"center",end:"flex-end",between:"space-between"};function CL({gap:e=2,align:a="center",justify:n,wrap:i=!0,as:r="div",children:s,className:o="",style:l}){return c.createElement(r,{className:`hn-inline${i?"":" hn-inline-nowrap"} ${o}`.trim(),style:{gap:`var(--space-${e})`,alignItems:a,justifyContent:n?w2[n]:void 0,...l}},s)}const S2={11:"var(--text-2xs)",12:"var(--text-xs)",13:"var(--text-sm)",14:"var(--text-md)",16:"var(--text-base)"},_2={body:"var(--text-body)",muted:"var(--text-muted)",subtle:"var(--text-subtle)",strong:"var(--text-strong)"};function PL({size:e=14,tone:a="body",as:n="span",children:i,className:r="",style:s}){return c.createElement(n,{className:`hn-text ${r}`.trim(),style:{fontSize:S2[e],color:_2[a],...s}},i)}function A2({width:e="100%",height:a=14,radius:n="sm",className:i="",style:r}){return t.jsx("span",{"aria-hidden":"true",className:`hn-skeleton hn-skeleton-r-${n} ${i}`.trim(),style:{width:e,height:a,...r}})}function bk({rows:e=3,label:a="Memuat…",rowHeight:n=44,className:i=""}){return t.jsxs("div",{role:"status","aria-live":"polite","aria-busy":"true",className:`hn-skeleton-list ${i}`.trim(),children:[t.jsx("span",{className:"hn-sr-only",children:a}),Array.from({length:e},(r,s)=>t.jsx(A2,{height:n,radius:"md",width:s%3===2?"70%":"100%"},s))]})}function E2({open:e,title:a,message:n,impact:i,eyebrow:r,confirmLabel:s="Hapus",cancelLabel:o="Batal",tone:l="danger",icon:d,busy:u=!1,requireText:m,onConfirm:h,onCancel:p}){const[g,f]=c.useState("");c.useEffect(()=>{f("")},[e,m]);const b=!!m&&g!==m,x=d??(l==="danger"?"trash-2":"help-circle"),v=l==="danger"&&!m,y=l!=="danger"&&!m;return t.jsxs(la,{open:e,title:a,eyebrow:r,width:440,icon:x,onClose:p,dismissible:!u,footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{size:"sm",variant:"secondary",onClick:p,disabled:u,"data-initial-focus":v?"true":void 0,children:o}),t.jsx(U,{size:"sm",variant:l==="danger"?"danger":"primary",leftIcon:d??(l==="danger"?"trash-2":"check"),loading:u,"data-initial-focus":y?"true":void 0,onClick:h,disabled:u||b,children:s})]}),children:[n&&t.jsx("div",{style:{fontSize:13.5,color:"var(--text-strong)",lineHeight:1.55},children:n}),!!(i!=null&&i.length)&&t.jsx("ul",{style:{margin:n?"10px 0 0":0,paddingLeft:18,fontSize:13,color:"var(--text-body)",lineHeight:1.55},children:i.map((T,S)=>t.jsx("li",{style:{marginTop:S?4:0},children:T},S))}),m&&t.jsx(Oe,{size:"sm",value:g,"aria-label":`Ketik ${m} untuk konfirmasi`,placeholder:m,disabled:u,onChange:T=>f(T.target.value),style:{marginTop:12,width:"100%"}})]})}function ot(){const[e,a]=c.useState(null),[n,i]=c.useState(!1),r=c.useRef(null),s=c.useCallback(m=>new Promise((h,p)=>{var f;(f=r.current)==null||f.settle(!1);const g={options:m,settle:h,fail:p};r.current=g,i(!1),a(g)}),[]),o=c.useCallback(()=>{const m=r.current;m&&(r.current=null,a(null),i(!1),m.settle(!1))},[]),l=c.useCallback(async()=>{const m=r.current;if(m){if(r.current=null,!m.options.run){a(null),m.settle(!0);return}i(!0);try{await m.options.run(),a(null),i(!1),m.settle(!0)}catch(h){a(null),i(!1),m.fail(h)}}},[]),d=e==null?void 0:e.options,u=t.jsx(E2,{open:!!e,busy:n,title:(d==null?void 0:d.title)??"",message:d==null?void 0:d.message,impact:d==null?void 0:d.impact,eyebrow:d==null?void 0:d.eyebrow,confirmLabel:d==null?void 0:d.confirmLabel,cancelLabel:d==null?void 0:d.cancelLabel,tone:d==null?void 0:d.tone,icon:d==null?void 0:d.icon,requireText:d==null?void 0:d.requireText,onConfirm:()=>{l()},onCancel:o});return{confirm:s,dialog:u}}const Sr="0 0 128 128",zn={fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"};function T2(){return t.jsxs("svg",{viewBox:Sr,width:"100%",height:"100%",children:[t.jsx("circle",{cx:"64",cy:"64",r:"27",...zn,strokeWidth:"2.4",opacity:"0.4"}),t.jsx("circle",{cx:"64",cy:"64",r:"40",...zn,strokeWidth:"9"}),t.jsx("circle",{cx:"64",cy:"24",r:"8.5",fill:"currentColor"})]})}function C2(){return t.jsxs("svg",{viewBox:Sr,width:"100%",height:"100%",children:[t.jsx("path",{...zn,strokeWidth:"9",d:"M32 44 H72 a12 12 0 1 0 -12 -12"}),t.jsx("path",{...zn,strokeWidth:"9",d:"M24 66 H84 a13 13 0 1 0 -13 -13"}),t.jsx("path",{...zn,strokeWidth:"9",d:"M38 88 H68 a10 10 0 1 0 -10 -10"})]})}function P2({cx:e=65,cy:a=66,turns:n=1.32,rOuter:i=41,rInner:r=5,wBase:s=21,wTip:o=2,a0:l=.15,dir:d=1,N:u=160}={}){const m=[];for(let x=0;x<=u;x++){const v=x/u,y=i+(r-i)*v,T=l+d*n*2*Math.PI*v;m.push({x:e+y*Math.sin(T),y:a+y*Math.cos(T),t:v})}const h=x=>(s+(o-s)*x)/2,p=[],g=[];for(let x=0;x<m.length;x++){const v=m[x],y=m[Math.max(0,x-1)],T=m[Math.min(m.length-1,x+1)];let S=T.x-y.x,E=T.y-y.y;const w=Math.hypot(S,E)||1;S/=w,E/=w;const N=-E,R=S,L=h(v.t);p.push({x:v.x+N*L,y:v.y+R*L}),g.push({x:v.x-N*L,y:v.y-R*L})}const f=x=>x.toFixed(2);let b="M "+f(p[0].x)+" "+f(p[0].y);for(let x=1;x<p.length;x++)b+=" L "+f(p[x].x)+" "+f(p[x].y);for(let x=g.length-1;x>=0;x--)b+=" L "+f(g[x].x)+" "+f(g[x].y);return b+=" A "+f(s/2)+" "+f(s/2)+" 0 0 1 "+f(p[0].x)+" "+f(p[0].y)+" Z",b}const M2=P2({});function I2(){return t.jsx("svg",{viewBox:Sr,width:"100%",height:"100%",children:t.jsx("path",{d:M2,fill:"currentColor",stroke:"none"})})}function N2(){return t.jsxs("svg",{viewBox:Sr,width:"100%",height:"100%",children:[t.jsx("path",{...zn,strokeWidth:"11",d:"M46 24 V102"}),t.jsx("path",{...zn,strokeWidth:"11",d:"M46 64 C 46 50 58 46 71 46 C 83 46 86 57 86 68 V 88 c 0 9 9 12 17 7"})]})}function R2(){return t.jsxs("svg",{viewBox:Sr,width:"100%",height:"100%",children:[t.jsx("path",{...zn,strokeWidth:"9",d:"M26 94 L64 42 L102 94"}),t.jsx("path",{...zn,strokeWidth:"9",d:"M52 94 L70 68",opacity:"0.4"}),t.jsx("circle",{cx:"64",cy:"34",r:"8",fill:"currentColor"})]})}const L2={cincin:T2,bayu:C2,buntut:I2,anoman:N2,dronagiri:R2};function qc({id:e,size:a=128,color:n="var(--brass-500)",style:i={}}){const r=L2[e];return t.jsx("span",{style:{display:"inline-flex",width:a,height:a,color:n,flex:"0 0 auto",...i},children:r?t.jsx(r,{}):null})}function fk({size:e=30,color:a="var(--ink-900)",weight:n=500,style:i={}}){return t.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:e,fontWeight:n,letterSpacing:"-0.02em",color:a,lineHeight:1,whiteSpace:"nowrap",...i},children:"hanoman"})}const Rd=6e4,Ld=60*Rd,yk=24*Ld,B2=7;function vk(e){if(e==null||e==="")return null;const a=e instanceof Date?e.getTime():typeof e=="number"?e:Date.parse(e);return Number.isFinite(a)?a:null}function $2(e,a){const n=new Date(e);n.setHours(0,0,0,0);const i=new Date(a);return i.setHours(0,0,0,0),Math.round((i.getTime()-n.getTime())/yk)}function xt(e,a=Date.now()){const n=vk(e);if(n===null)return"";const i=a-n;if(i<Rd)return"baru saja";if(i<Ld)return`${Math.floor(i/Rd)} menit lalu`;if(i<yk)return`${Math.floor(i/Ld)} jam lalu`;const r=$2(n,a);return r===1?"kemarin":r<B2?`${r} hari lalu`:D2(n,a)}function D2(e,a=Date.now()){const n=vk(e);if(n===null)return"";const i=new Date(n).getFullYear()===new Date(a).getFullYear();return new Intl.DateTimeFormat("id-ID",{day:"numeric",month:"short",...i?{}:{year:"numeric"}}).format(new Date(n))}const Rm=20;function O2({onClose:e,onOpen:a}){const{markRead:n}=Dc(),[i,r]=c.useState([]),[s,o]=c.useState(0),[l,d]=c.useState(1),[u,m]=c.useState(!0);c.useEffect(()=>{let p=!0;return m(!0),ne.listNotifications({page:l,limit:Rm}).then(g=>{p&&(r(g.items),o(g.total))}).catch(()=>{p&&(r([]),o(0))}).finally(()=>{p&&m(!1)}),()=>{p=!1}},[l]);const h=xr(s,l,Rm);return t.jsxs(la,{open:!0,title:"Semua notifikasi",icon:"bell",onClose:e,width:720,children:[t.jsx("div",{className:"hn-notif-archive-list",children:u&&i.length===0?t.jsx("div",{className:"hn-notif-empty",children:"memuat…"}):i.length===0?t.jsx("div",{className:"hn-notif-empty",children:"Belum ada notifikasi"}):i.map(p=>{const g=p.type==="decision";return t.jsxs("div",{className:"hn-notif-archive-row",children:[t.jsx(Re,{name:"bell",size:14,color:"var(--text-subtle)"}),t.jsx("span",{className:"hn-notif-archive-title",children:p.specId?`${p.specId} · ${p.title}`:p.title}),t.jsx("span",{className:"hn-notif-archive-time",children:xt(p.createdAt)||"—"}),a&&t.jsx("button",{onClick:()=>{n(p.id),a(p),e()},className:g?"hn-notif-open hn-notif-open--primary":"hn-notif-open",children:g?"Jawab":"Buka"})]},p.id)})}),t.jsx(jr,{page:h.page,pageCount:h.pageCount,total:s,from:h.from,to:h.to,onPage:d,unit:"notifikasi"})]})}function H2(){const{items:e,unread:a,total:n,markAllRead:i,markRead:r,clear:s,onOpen:o}=Dc(),[l,d]=c.useState(!1),[u,m]=c.useState(!1),h=c.useRef(null),p=wr(l,()=>d(!1),"menu");c.useEffect(()=>{if(!l)return;const f=b=>{h.current&&!h.current.contains(b.target)&&d(!1)};return document.addEventListener("mousedown",f),()=>document.removeEventListener("mousedown",f)},[l]);function g(){d(f=>!f)}return t.jsxs("div",{ref:h,className:"hn-notif-anchor",children:[t.jsxs("button",{ref:p.triggerRef,"aria-label":"Notifikasi","aria-haspopup":"menu","aria-controls":l?p.panelId:void 0,"aria-expanded":l,onClick:g,className:l?"hn-notif-trigger is-open":"hn-notif-trigger",children:[t.jsx(Re,{name:"bell",size:18}),a>0&&t.jsx("span",{className:"hn-notif-badge",children:a>99?"99+":a})]}),l&&t.jsxs("div",{ref:p.panelRef,id:p.panelId,role:"menu",tabIndex:-1,onKeyDown:p.onKeyDown,className:"hn-viewport-popover hn-notif-popover",children:[t.jsxs("div",{className:"hn-notif-head",children:[t.jsx("span",{className:"hn-notif-title",children:"Notifikasi"}),e.length>0&&t.jsx("button",{role:"menuitem",onClick:s,className:"hn-notif-clear",children:"Bersihkan"})]}),e.length===0?t.jsx("div",{className:"hn-notif-empty",children:"Belum ada notifikasi"}):e.map(f=>{const b=f.type==="decision",x=f.type==="ticket",v=x?"inbox":b?"git-merge":"check-circle-2",y=x?"var(--brass-500)":b?"var(--amber-600)":"var(--leaf-500)",T=x?"keluhan baru":b?"butuh keputusan":"selesai",S=b?"Jawab":x?"Lihat triase":"Buka",E=b?"hn-notif-open hn-notif-open--primary":x?"hn-notif-open hn-notif-open--ticket":"hn-notif-open";return t.jsxs("div",{className:"hn-notif-item",children:[t.jsx(Re,{name:v,size:16,color:y}),t.jsxs("div",{className:"hn-notif-text",children:[t.jsx("div",{className:"hn-notif-item-title",children:x?f.title:`${f.specId??f.sessionId} · ${f.title}`}),t.jsxs("div",{className:"hn-notif-item-meta",children:[T," · ",xt(f.createdAt)||"—"]})]}),o&&t.jsx("button",{role:"menuitem",onClick:()=>{r(f.id),o(f),d(!1)},className:E,children:S}),!f.readAt&&t.jsx("span",{className:"hn-notif-dot"})]},f.id)}),e.length>0&&t.jsxs("div",{className:"hn-notif-foot",children:[t.jsx("button",{role:"menuitem",onClick:i,className:"hn-notif-foot-btn",children:"Tandai semua dibaca"}),t.jsxs("button",{role:"menuitem",onClick:()=>{m(!0),d(!1)},className:"hn-notif-foot-btn hn-notif-foot-btn--archive",children:["Lihat semua",n>e.length?` (${n})`:""]})]})]}),u&&t.jsx(O2,{onClose:()=>m(!1),onOpen:o})]})}const qr={normal:0,warning:1,critical:2};function xk(e){return e.length?e.reduce((a,n)=>qr[n.severity]!==qr[a.severity]?qr[n.severity]>qr[a.severity]?n:a:n.usedPct>a.usedPct?n:a):null}function jk(e){return e==="critical"?{fg:"var(--status-err)",bg:"var(--status-err-tint)"}:e==="warning"?{fg:"var(--status-warn)",bg:"var(--status-warn-tint)"}:{fg:"var(--status-ok)",bg:"var(--status-ok-tint)"}}let Bd={status:"unavailable",windows:[],fetchedAt:null},Ur;const Fs=new Set;function q2(e){return Fs.add(e),Fs.size===1&&(Ur=Ii(a=>{if(a.t==="limits"){Bd=a.limits;for(const n of Fs)n()}})),()=>{Fs.delete(e),Fs.size===0&&Ur&&(Ur(),Ur=void 0)}}function wk(){return qt.useSyncExternalStore(q2,()=>Bd,()=>Bd)}let $d={status:"unavailable",windows:[],fetchedAt:null,plan:null},zr;const Gs=new Set;function U2(e){return Gs.add(e),Gs.size===1&&(zr=Ii(a=>{if(a.t==="codexLimits"){$d=a.limits;for(const n of Gs)n()}})),()=>{Gs.delete(e),Gs.size===0&&zr&&(zr(),zr=void 0)}}function Sk(){return qt.useSyncExternalStore(U2,()=>$d,()=>$d)}const Uc=767,zc=1199,_k=`(max-width: ${Uc}px)`,Ak=`(min-width: ${Uc+1}px) and (max-width: ${zc}px)`,z2=`(min-width: ${zc+1}px)`;function F2(e){return e<=Uc?"mobile":e<=zc?"tablet":"desktop"}function G2(){return typeof window>"u"?"desktop":typeof window.matchMedia!="function"?F2(window.innerWidth):window.matchMedia(_k).matches?"mobile":window.matchMedia(Ak).matches?"tablet":"desktop"}function K2(e){if(typeof window>"u"||typeof window.matchMedia!="function")return()=>{};const a=[_k,Ak,z2].map(n=>window.matchMedia(n));for(const n of a)n.addEventListener("change",e);return()=>{for(const n of a)n.removeEventListener("change",e)}}function al(){return c.useSyncExternalStore(K2,G2,()=>"desktop")}const Lm="(pointer: coarse)";function Fc(){const e=c.useCallback(n=>{if(typeof window>"u"||typeof window.matchMedia!="function")return()=>{};const i=window.matchMedia(Lm);return i.addEventListener("change",n),()=>i.removeEventListener("change",n)},[]),a=c.useCallback(()=>typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia(Lm).matches,[]);return c.useSyncExternalStore(e,a,()=>!1)}function tl({panels:e,active:a,onActiveChange:n,ariaLabel:i,splitAt:r="tablet",masterWidth:s,className:o="",style:l}){const d=al(),u=d==="desktop"||d==="tablet"&&r==="tablet",m=c.useRef(new Map),h=c.useRef({active:a,split:u}),p=s===void 0?l:{"--hn-master-width":typeof s=="number"?`${s}px`:s,...l};return c.useLayoutEffect(()=>{var b;const g=h.current.active!==a,f=h.current.split&&!u;h.current={active:a,split:u},!u&&(g||f)&&((b=m.current.get(a))==null||b.focus())},[a,u]),t.jsxs("div",{className:`hn-responsive-panels hn-responsive-panels--${r} ${o}`.trim(),"data-active-panel":a,"data-split":u?"true":"false",style:{display:"flex",flex:"1 1 auto",minWidth:0,minHeight:0,flexDirection:"column",gap:12,...p},children:[t.jsx("div",{className:"hn-panel-switcher",children:t.jsx(At,{"aria-label":i,variant:"pill",value:a,onChange:n,tabs:e.map(g=>({value:g.id,label:g.label}))})}),t.jsx("div",{className:"hn-panels-grid",style:{display:"grid",flex:"1 1 auto",minWidth:0,minHeight:0,...u&&e.length===1?{gridTemplateColumns:"minmax(0, 1fr)"}:null},children:e.map(g=>{var b;const f=u||g.id===a;return t.jsx("section",{ref:x=>{x?m.current.set(g.id,x):m.current.delete(g.id)},className:`hn-responsive-panel ${g.className??""}`.trim(),"data-panel":g.id,role:"region","aria-label":typeof g.label=="string"?g.label:g.id,"aria-hidden":f?"false":"true",tabIndex:-1,style:(b=g.className)!=null&&b.includes("hn-panel-flex")?{display:f?"flex":void 0,flexDirection:"column",minWidth:0,minHeight:0}:{minWidth:0,minHeight:0},children:g.content},g.id)})})]})}c.forwardRef(function({className:a="",...n},i){return t.jsx("div",{ref:i,className:`hn-responsive-toolbar ${a}`.trim(),...n})});const ML=c.forwardRef(function({className:a="",...n},i){return t.jsx("div",{ref:i,className:`hn-local-overflow ${a}`.trim(),...n})}),Gc=e=>e,W2=new Intl.DateTimeFormat("id-ID",{weekday:"short",day:"numeric",month:"short",hour:"2-digit",minute:"2-digit"});function V2(e,a=!1){if(!e)return"";const n=new Date(e).getTime()-Date.now(),i=Math.floor(n/36e5),r=Math.round(n%36e5/6e4),s=n<=0?"reset segera":i>=1?`reset dalam ${i} jam ${r} menit`:`reset dalam ${r} menit`;return a?`${s} · ${W2.format(new Date(e))}`:s}const Y2=Ej,To=e=>Y2[e]??"tidak diketahui";function J2({label:e,pct:a,severity:n}){const i=Math.round(a);return t.jsx("div",{role:"progressbar","aria-label":e,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":i,"aria-valuetext":`${i}% terpakai, ${To(n)}`,className:"hn-lim-meter",children:t.jsx("div",{className:"hn-lim-meter-fill",style:Gc({"--lim-fill":`${Math.max(0,Math.min(100,a))}%`})})})}function Ek({dto:e,emptyHint:a}){return e.windows.length?t.jsxs("div",{className:"hn-lim-windows",children:[e.windows.map(n=>{const i=jk(n.severity);return t.jsxs("div",{className:"hn-lim-window",style:Gc({"--lim-fg":i.fg}),children:[t.jsxs("div",{className:"hn-lim-head",children:[t.jsxs("span",{className:"hn-lim-label",children:[n.label,n.isActive?" · aktif":""]}),t.jsxs("span",{className:"hn-lim-value",children:[t.jsxs("span",{className:"hn-lim-pct",children:[n.usedPct,"%"]}),t.jsx("span",{className:"hn-lim-word",children:To(n.severity)})]})]}),t.jsx(J2,{label:n.label,pct:n.usedPct,severity:n.severity}),n.resetsAt&&t.jsx("span",{className:"hn-lim-reset",children:V2(n.resetsAt,n.key.startsWith("weekly"))})]},n.key)}),t.jsx("div",{className:"hn-lim-foot",children:e.status==="stale"?`Data lama · terakhir diperbarui ${xt(e.fetchedAt)}`:`Diperbarui ${xt(e.fetchedAt)}`})]}):t.jsx("div",{className:"hn-lim-empty",children:e.status==="unavailable"?a??"Limit belum terbaca — Claude belum dipakai atau belum login di host ini.":"Belum ada data limit."})}function Tk({title:e,dto:a,square:n=!1,emptyHint:i,eyebrow:r,footnote:s}){const o=xk(a.windows),[l,d]=c.useState(!1),u=wr(l,()=>d(!1),"dialog"),m=Fc(),h=!!o&&a.status!=="unavailable",p=h&&o?jk(o.severity):{fg:"var(--text-muted)",bg:"var(--bone-200)"},g=a.status==="stale",f=!h||!o?"belum terbaca":`${o.usedPct}% terpakai, ${To(o.severity)}${g?", data lama":""}`,b=!h||!o?"Limit —":`${o.usedPct}% · ${To(o.severity)}${g?" · lama":""}`;return t.jsxs("div",{className:"hn-lim-pill-wrap",children:[t.jsxs("button",{ref:u.triggerRef,type:"button",onClick:()=>d(x=>!x),"aria-haspopup":"dialog","aria-expanded":l,"aria-controls":l?u.panelId:void 0,"aria-label":`${e}, ${f}`,title:e,className:m?"hn-lim-pill hn-lim-pill-touch":"hn-lim-pill",style:Gc({"--lim-bg":p.bg,"--lim-fg":p.fg}),children:[t.jsx("span",{"aria-hidden":"true",className:n?"hn-lim-dot hn-lim-dot-square":"hn-lim-dot"}),b]}),l&&t.jsxs("div",{ref:u.panelRef,id:u.panelId,role:"dialog","aria-label":e,tabIndex:-1,onKeyDown:u.onKeyDown,className:"hn-viewport-popover hn-lim-popover",children:[t.jsx("div",{className:"hn-eyebrow hn-lim-eyebrow",children:r??e}),t.jsx(Ek,{dto:a,emptyHint:i}),s&&t.jsx("div",{className:"hn-lim-footnote",children:s})]})]})}function Q2(){const e=wk();return t.jsx(Tk,{title:"Limit Claude",dto:e})}function Z2(){const e=Sk();return e.status==="unavailable"||!xk(e.windows)?null:t.jsx(Tk,{title:"Limit Codex",dto:e,square:!0,emptyHint:"Limit Codex belum terbaca. Jalankan satu sesi Codex dulu.",eyebrow:`Limit Codex${e.plan?` · paket ${e.plan}`:""}`,footnote:"Dibaca dari sesi Codex terakhir. Nilainya berubah saat sesi Codex berjalan, tidak realtime."})}const X2={currentVersion:"",latestVersion:null,registry:{status:"unavailable",checkedAt:null},updateAvailable:!1,command:"",canApply:!1},eA={boot:null,restartedTo:null};let Dd=X2,Co=eA,Fr;const Ks=new Set;function Ck(e){return Ks.add(e),Ks.size===1&&(Fr=Ii(a=>{if(a.t==="update"){Dd=a.update,Co=uA(Co,a.update.currentVersion);for(const n of Ks)n()}})),()=>{Ks.delete(e),Ks.size===0&&Fr&&(Fr(),Fr=void 0)}}function aA(){return qt.useSyncExternalStore(Ck,()=>Dd,()=>Dd)}function tA(e){return e.updateAvailable?`hanoman ${e.latestVersion} tersedia — pasang lalu restart instance ini`:"Versi terpasang sudah terbaru"}function nA(e){return e.latestVersion?`Update · ${e.latestVersion}`:"Update"}function iA(e){return e.latestVersion??"Update"}const sA=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;function rA(e){return sA.test(e)&&e.split(/[-+]/)[0]!=="0.0.0"}function oA(e){return`terpasang ${e.currentVersion||"?"} · tersedia ${e.latestVersion??"?"}`}function lA(e){return e.registry.status!=="ok"?"Registry npm belum terbaca — versi tersedia tak bisa dipastikan.":e.registry.checkedAt?`Registry npm diperiksa ${new Date(e.registry.checkedAt).toLocaleString("id-ID")}.`:"Registry npm terbaca."}async function dA(e){let a;try{a=await fetch("/api/update/apply",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({confirm:e})})}catch{return{kind:"error",message:"Server tak terjangkau."}}let n={};try{n=await a.json()}catch{}const i=String(n.from??""),r=n.to??null,s=Number(n.liveSessions??0);return a.status===202?{kind:"accepted",liveSessions:s,from:i,to:r}:a.status===409&&n.error==="confirm-required"?{kind:"confirm",liveSessions:s,from:i,to:r}:{kind:"error",message:Pk(String(n.error??a.status))}}function Pk(e){return e==="unsupervised"?"Instance ini tidak dijalankan lewat `hanoman start`, jadi tak ada yang akan menghidupkannya lagi — pasang manual dengan perintah di atas.":e==="up-to-date"?"Versi terpasang ternyata sudah terkini.":`Gagal memulai update (${e}).`}function cA(e){return e<=0?"Pasang versi baru lalu jalankan ulang hanoman? Tak ada sesi yang sedang berjalan.":`${e} sesi sedang berjalan. Sesi itu tetap hidup di tmux dan terminalnya tersambung lagi sendiri. Lanjutkan?`}function uA(e,a){return a?e.boot===null?{boot:a,restartedTo:null}:a===e.boot?e.restartedTo===null?e:{boot:e.boot,restartedTo:null}:a===e.restartedTo?e:{boot:e.boot,restartedTo:a}:e}function mA(){return qt.useSyncExternalStore(Ck,()=>Co.restartedTo,()=>Co.restartedTo)}function Bm(e){return`Muat ulang · ${e}`}function hA(e){return`hanoman di server sudah diperbarui ke ${e}. Halaman ini masih menjalankan versi lama — muat ulang untuk memakainya.`}function Mk(){location.reload()}async function pA(e=gA,a=i=>new Promise(r=>setTimeout(r,i)),n={}){const i=n.intervalMs??1e3,r=n.timeoutMs??9e4,s=n.minWaitMs??3e3;let o=!1;for(let l=0;l<r;)if(await a(i),l+=i,!await e().catch(()=>!1))o=!0;else if(o||l>=s)return!0;return!1}const gA=async()=>(await fetch("/api/health",{cache:"no-store"})).ok;async function kA(e){let a;try{a=await fetch("/api/restart",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({confirm:e})})}catch{return{kind:"error",message:"Server tak terjangkau."}}let n={};try{n=await a.json()}catch{}const i=Number(n.liveSessions??0);return a.status===202?{kind:"accepted",liveSessions:i,from:"",to:null}:a.status===409&&n.error==="confirm-required"?{kind:"confirm",liveSessions:i,from:"",to:null}:{kind:"error",message:Pk(String(n.error??a.status))}}function bA(){const e=aA(),[a,n]=c.useState(!1),[i,r]=c.useState(!1),[s,o]=c.useState({t:"idle"}),[l,d]=c.useState({t:"idle"}),u=wr(a,()=>n(!1),"dialog");if(!e.updateAvailable&&!rA(e.currentVersion))return null;const m=()=>{var x;try{(x=navigator.clipboard)==null||x.writeText(e.command),r(!0),setTimeout(()=>r(!1),1500)}catch{}},h=async x=>{o({t:x?"applying":"asking"});const v=await dA(x);v.kind==="confirm"?o({t:"confirming",message:cA(v.liveSessions)}):v.kind==="accepted"?o({t:"applying"}):o({t:"failed",message:v.message})},p=async x=>{d({t:x?"applying":"asking"});const v=await kA(x);v.kind==="confirm"?d({t:"confirming",message:`Ada ${v.liveSessions} sesi berjalan. Sesi tmux tetap hidup, dashboard terputus sebentar. Mulai ulang?`}):v.kind==="accepted"?(d({t:"applying"}),pA().then(y=>{y?Mk():d({t:"failed",message:"Server belum kembali dalam 90 detik — periksa prosesnya lalu muat ulang halaman ini."})})):d({t:"failed",message:v.message})},g=e.updateAvailable?"Update tersedia":"Versi hanoman",f=e.updateAvailable?nA(e):`v${e.currentVersion}`,b=e.updateAvailable?iA(e):e.currentVersion;return t.jsxs("div",{className:"hn-upd-root",children:[t.jsxs("button",{ref:u.triggerRef,onClick:()=>n(x=>!x),"aria-haspopup":"dialog","aria-controls":a?u.panelId:void 0,"aria-expanded":a,title:g,"aria-label":`${g} · ${f}`,className:`hn-upd-pill ${e.updateAvailable?"hn-upd-pill--update":"hn-upd-pill--version"}`,children:[t.jsx(Re,{name:e.updateAvailable?"arrow-up-circle":"package",size:13,color:e.updateAvailable?"var(--brass-700)":"var(--text-subtle)"}),t.jsx("span",{className:"hn-topbar-label",children:f}),t.jsx("span",{className:"hn-topbar-label-short","aria-hidden":"true",children:b})]}),a&&t.jsxs("div",{ref:u.panelRef,id:u.panelId,role:"dialog","aria-label":g,tabIndex:-1,onKeyDown:u.onKeyDown,className:"hn-viewport-popover hn-upd-popover",children:[t.jsx("div",{className:"hn-eyebrow hn-upd-eyebrow",children:g}),t.jsx("div",{className:"hn-upd-headline",children:tA(e)}),e.updateAvailable&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"hn-upd-cmd",children:[t.jsx("code",{className:"hn-upd-code",children:e.command}),t.jsx("button",{onClick:m,title:"Salin perintah",className:"hn-upd-btn",children:i?"Tersalin":"Salin"})]}),e.canApply&&t.jsxs("div",{className:"hn-upd-block",children:[s.t==="idle"&&t.jsx("button",{onClick:()=>void h(!1),className:"hn-upd-btn hn-upd-btn--primary",children:"Pasang & mulai ulang"}),s.t==="asking"&&t.jsx("div",{className:"hn-upd-note",children:"Memeriksa sesi yang berjalan…"}),s.t==="confirming"&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"hn-upd-text hn-upd-text--gap",children:s.message}),t.jsxs("div",{className:"hn-upd-row",children:[t.jsx("button",{onClick:()=>void h(!0),className:"hn-upd-btn hn-upd-btn--primary",children:"Ya, pasang"}),t.jsx("button",{onClick:()=>o({t:"idle"}),className:"hn-upd-btn",children:"Batal"})]})]}),s.t==="applying"&&t.jsx("div",{className:"hn-upd-text",children:"Memasang dari npm lalu menjalankan ulang — dashboard tersambung lagi sendiri."}),s.t==="failed"&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"hn-upd-err",children:s.message}),t.jsx("button",{onClick:()=>o({t:"idle"}),className:"hn-upd-btn",children:"Coba lagi"})]})]})]}),t.jsx("div",{className:"hn-upd-note",children:oA(e)}),e.canApply&&t.jsxs("div",{className:"hn-upd-restart",children:[l.t==="idle"&&t.jsxs("button",{onClick:()=>void p(!1),className:"hn-upd-btn",title:"Untuk server yang macet atau troubleshooting",children:[t.jsx(Re,{name:"refresh-cw",size:12})," Mulai ulang hanoman"]}),l.t==="asking"&&t.jsx("div",{className:"hn-upd-note",children:"Memeriksa sesi yang berjalan…"}),l.t==="confirming"&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"hn-upd-text hn-upd-text--gap",children:l.message}),t.jsxs("div",{className:"hn-upd-row",children:[t.jsx("button",{onClick:()=>void p(!0),className:"hn-upd-btn hn-upd-btn--primary",children:"Ya, mulai ulang"}),t.jsx("button",{onClick:()=>d({t:"idle"}),className:"hn-upd-btn",children:"Batal"})]})]}),l.t==="applying"&&t.jsx("div",{className:"hn-upd-text",children:"Menjalankan ulang — dashboard tersambung lagi sendiri."}),l.t==="failed"&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"hn-upd-err",children:l.message}),t.jsx("button",{onClick:()=>d({t:"idle"}),className:"hn-upd-btn",children:"Coba lagi"})]})]}),!e.updateAvailable&&t.jsx("div",{className:"hn-upd-note hn-upd-note--gap",children:lA(e)})]})]})}function fA(){const e=mA();return e?t.jsxs("button",{onClick:Mk,title:hA(e),"aria-label":Bm(e),className:"hn-upd-pill hn-upd-pill--update",children:[t.jsx(Re,{name:"refresh-cw",size:13,color:"var(--brass-700)"}),t.jsx("span",{className:"hn-topbar-label",children:Bm(e)}),t.jsx("span",{className:"hn-topbar-label-short","aria-hidden":"true",children:e})]}):null}const Ik=c.createContext({user:null,logout:async()=>{}}),yA=()=>c.useContext(Ik);function vA({user:e,onLoggedOut:a,children:n}){const i=c.useCallback(async()=>{try{await ne.logout()}catch{}finally{a()}},[a]);return t.jsx(Ik.Provider,{value:{user:e,logout:i},children:n})}function xA(){const{user:e,logout:a}=yA(),[n,i]=c.useState(!1),r=c.useRef(null),s=wr(n,()=>i(!1),"menu"),{confirm:o,dialog:l}=ot();if(c.useEffect(()=>{if(!n)return;const m=h=>{r.current&&!r.current.contains(h.target)&&i(!1)};return document.addEventListener("mousedown",m),()=>document.removeEventListener("mousedown",m)},[n]),!e)return null;const d=e.email.slice(0,1).toUpperCase();async function u(){i(!1),await o({title:"Keluar dari hanoman?",message:"Anda perlu masuk lagi untuk membuka dashboard ini.",confirmLabel:"Keluar",cancelLabel:"Tetap masuk",tone:"default",icon:"log-out"})&&a()}return t.jsxs("div",{ref:r,className:"hn-account",children:[t.jsx("button",{ref:s.triggerRef,className:"hn-touch-target hn-account-trigger","aria-label":"Akun","aria-haspopup":"menu","aria-controls":n?s.panelId:void 0,"aria-expanded":n,title:e.email,onClick:()=>i(m=>!m),children:t.jsx("span",{className:"hn-account-avatar",children:d})}),n&&t.jsxs("div",{ref:s.panelRef,id:s.panelId,role:"menu",tabIndex:-1,onKeyDown:s.onKeyDown,className:"hn-viewport-popover hn-account-menu",children:[t.jsxs("div",{className:"hn-account-who",children:[t.jsx("div",{className:"hn-account-caption",children:"Masuk sebagai"}),t.jsx("div",{className:"hn-account-email",children:e.email})]}),t.jsxs("button",{role:"menuitem",className:"hn-account-item",onClick:()=>{u()},children:[t.jsx(Re,{name:"log-out",size:16,color:"var(--text-muted)"})," Keluar"]})]}),l]})}const Po="hn.ui",Kc="v1",IL=(e,a)=>a?`${e}@${a}`:e,nl=(e,a)=>`${Po}.${Kc}.${e}.${a}`,jA=e=>`${Po}.${Kc}.${e}.`,Dn=e=>typeof e=="string",Wc=e=>typeof e=="number"&&Number.isFinite(e),NL=e=>typeof e=="boolean",Nk=e=>e===null||typeof e=="string",wA=e=>Array.isArray(e)&&e.every(a=>typeof a=="string"),bi=(...e)=>a=>typeof a=="string"&&e.includes(a);function SA(e,a){return a===null?e===null:Array.isArray(a)?Array.isArray(e):typeof a=="number"?Wc(e):e===null?!1:typeof e==typeof a}function Mo(e,a,n){let i;try{i=localStorage.getItem(e)}catch{return a}if(i===null)return a;let r;try{r=JSON.parse(i)}catch{return a}return(n?n(r):SA(r,a))?r:a}function il(e,a){try{localStorage.setItem(e,JSON.stringify(a))}catch{}}function _A(){try{const e=[];for(let a=0;a<localStorage.length;a++){const n=localStorage.key(a);n!==null&&e.push(n)}return e}catch{return[]}}function Rk(e){for(const a of _A())if(e(a))try{localStorage.removeItem(a)}catch{}}const Od=new Set;function AA(e){return Od.add(e),()=>{Od.delete(e)}}function EA(e){const a=jA(e);Rk(n=>n.startsWith(a));for(const n of[...Od])n(a)}function TA(){const e=`${Po}.${Kc}.`;Rk(a=>a.startsWith(`${Po}.`)&&!a.startsWith(e))}function Da(e,a,n,i){const r=nl(e,a),s=c.useRef({initial:n,accept:i});s.current={initial:n,accept:i};const[o,l]=c.useState(()=>({key:r,value:Mo(r,n,i)}));o.key!==r&&l({key:r,value:Mo(r,s.current.initial,s.current.accept)}),c.useEffect(()=>{il(o.key,o.value)},[o]),c.useEffect(()=>AA(u=>{r.startsWith(u)&&l({key:r,value:s.current.initial})}),[r]);const d=c.useCallback(u=>{l(m=>({key:m.key,value:typeof u=="function"?u(m.value):u}))},[]);return[o.value,d]}function Lk(e,a){const n=c.useRef(e),i=c.useRef(a);i.current=a,c.useEffect(()=>{n.current!==e&&(n.current=e,i.current())},[e])}const CA=20,PA=200;function Vc(e,a,n=!0){const i=nl(e,a),[r,s]=c.useState(null),o=c.useCallback(d=>s(d),[]),l=c.useRef(!1);return c.useEffect(()=>{if(!r)return;let d=0,u=null;const m=()=>{d&&(clearTimeout(d),d=0),u!==null&&(il(i,u),u=null)},h=()=>{l.current||(u=r.scrollTop,d||(d=window.setTimeout(m,PA)))};return r.addEventListener("scroll",h),r.addEventListener("scrollend",m),()=>{r.removeEventListener("scroll",h),r.removeEventListener("scrollend",m),m()}},[r,i]),c.useEffect(()=>{if(!r||!n)return;const d=Mo(i,0);if(d<=0)return;let u=0,m=0;l.current=!0;const h=()=>{if(r.scrollTop=d,r.scrollHeight-r.clientHeight>=d||++u>=CA){l.current=!1;return}m=requestAnimationFrame(h)};return m=requestAnimationFrame(h),()=>{cancelAnimationFrame(m),l.current=!1}},[r,i,n]),o}let is={palette:!1,help:!1};const Hd=new Set;function _r(e){const a={...is,...e};if(!(a.palette===is.palette&&a.help===is.help)){is=a;for(const n of[...Hd])n()}}const Bk=()=>_r({palette:!0}),$k=()=>_r({palette:!1}),MA=()=>_r({palette:!is.palette}),IA=()=>_r({help:!0}),NA=()=>_r({help:!1}),qd=()=>is;function RA(e){return Hd.add(e),()=>{Hd.delete(e)}}function Dk(){return c.useSyncExternalStore(RA,qd,qd)}const Ok=c.createContext(null),LA=new Set(["backlog","team","prd"]);function BA(e){var a;return e.value==="all"?void 0:((a=e.projects.find(n=>n.id===e.value))==null?void 0:a.name)??e.value}function $A({scope:e}){const a=c.useMemo(()=>[{value:"all",label:"Semua project"},...e.projects.map(n=>({value:n.id,label:n.name}))],[e.projects]);return t.jsx($e,{size:"sm","aria-label":"Project aktif",className:"hn-shell-scope",value:e.value,options:a,onChange:n=>e.onChange(n.target.value)})}const DA=1e3,Hk={o:"overview",d:"dalang",p:"projects",r:"prd",b:"backlog",m:"team",q:"qa",e:"triage",j:"scheduler",l:"lead",t:"terminal",i:"ide",a:"skills",v:"vps",k:"clients",f:"docs",s:"settings"},gs={armedAt:null};function OA(e,a,n,i){const r=a.length===1?a.toLowerCase():a;if(e.armedAt!==null&&n-e.armedAt<=DA){const o=Hk[r];if(o&&i.includes(o))return{state:gs,target:o,consumed:!0};if(r!=="g")return{state:gs,consumed:!1}}return r==="g"?{state:{armedAt:n},consumed:!0}:{state:gs,consumed:!1}}function qk(e=typeof navigator<"u"?navigator:void 0){const a=`${(e==null?void 0:e.platform)??""} ${(e==null?void 0:e.userAgent)??""}`;return/mac|iphone|ipad/i.test(a)}function HA(e){return e?"⌘K":"Ctrl K"}const qA={dalang:"Buka panggung"};function UA(e,a){const n=e?"⌘":"Ctrl",i=new Map(Object.entries(Hk).map(([r,s])=>[s,r]));return[{title:"Global",rows:[{keys:[n,"K"],label:"Buka palet perintah"},{keys:["/"],label:"Fokus kotak cari (bila halaman tak punya, buka palet)"},{keys:["?"],label:"Tampilkan bantuan shortcut ini"},{keys:["Esc"],label:"Tutup dialog atau palet"}]},{title:"Pindah layar: tekan g, lalu huruf",rows:a.flatMap(r=>{const s=i.get(r.key);return s?[{keys:["g",s],label:qA[r.key]??r.label}]:[]})}]}const zA=[{key:"kerja",label:"Kerja"},{key:"otomasi",label:"Otomasi"},{key:"sistem",label:"Sistem"}],Uk=[{key:"overview",label:"Overview",icon:"layout-dashboard",group:"kerja",children:[{section:"overview",label:"Overview"}],default:"overview"},{key:"projects",label:"Projects",icon:"layout-grid",group:"kerja",children:[{section:"projects",label:"Daftar"},{section:"prd",label:"PRD"},{section:"docs",label:"Docs"},{section:"qa",label:"QA"},{section:"ide",label:"Kode"}],derived:[{section:"project",under:"projects"}],default:"projects"},{key:"backlog",label:"Backlog",icon:"list-checks",group:"kerja",children:[{section:"backlog",label:"Spec"},{section:"team",label:"Tugas manusia"}],derived:[{section:"review",under:"backlog"}],default:"backlog"},{key:"triage",label:"Triase",icon:"inbox",group:"kerja",children:[{section:"triage",label:"Triase"}],default:"triage"},{key:"sesi",label:"Sesi",icon:"terminal",group:"kerja",children:[{section:"terminal",label:"Terminal"},{section:"clients",label:"Perangkat",gate:"clients"}],default:"terminal"},{key:"otonom",label:"Otonom",icon:"calendar-clock",group:"otomasi",children:[{section:"scheduler",label:"Scheduler"},{section:"lead",label:"Lead"}],default:"scheduler"},{key:"skills",label:"Skills",icon:"sparkles",group:"sistem",children:[{section:"skills",label:"Skills"}],default:"skills"},{key:"pengaturan",label:"Pengaturan",icon:"settings",group:"sistem",children:[{section:"settings",label:"Pengaturan"},{section:"vps",label:"Server (VPS)"}],default:"settings"}];function Yc(e){if(e)return Uk.find(a=>a.children.some(n=>n.section===e)||(a.derived??[]).some(n=>n.section===e))}function zk(e){var n;const a=Yc(e);if(a)return a.children.some(i=>i.section===e)?e:(n=(a.derived??[]).find(i=>i.section===e))==null?void 0:n.under}function sl(e,a){return e.children.filter(n=>!n.gate||a[n.gate])}function FA(e,a,n){const i=new Set(sl(e,n).map(s=>s.section)),r=a[e.key];return r&&i.has(r)?r:i.has(e.default)?e.default:[...i][0]??e.default}function GA(e,a,n){let i=0;for(const r of sl(e,n))i+=Ug(a,r.section)??0;return i>0?i:void 0}const oo=[{key:"overview",label:"Overview",icon:"layout-dashboard"},{key:"dalang",label:"Dalang Hanoman",icon:"drama"},{key:"projects",label:"Projects",icon:"layout-grid"},{key:"prd",label:"PRD",icon:"scroll-text"},{key:"backlog",label:"Backlog",icon:"list-checks"},{key:"team",label:"Tim",icon:"users"},{key:"qa",label:"QA",icon:"clipboard-check"},{key:"triage",label:"Triase",icon:"inbox"},{key:"scheduler",label:"Scheduler",icon:"calendar-clock"},{key:"lead",label:"Lead",icon:"compass"},{key:"terminal",label:"Terminal",icon:"terminal"},{key:"ide",label:"IDE",icon:"code-2"},{key:"skills",label:"Skills",icon:"sparkles"},{key:"vps",label:"VPS",icon:"server"},{key:"clients",label:"Klien",icon:"monitor",gate:"clients"},{key:"docs",label:"Docs · SoT",icon:"book-open"},{key:"settings",label:"Settings",icon:"settings"}],Ml=oo.map(e=>e.key);function KA(){return t.jsx("div",{className:"hn-wordmark-stack",children:t.jsxs("div",{className:"hn-wordmark-row",children:[t.jsx("span",{className:"hn-wordmark-mark",children:t.jsx(qc,{id:"buntut",size:17,color:"#fff"})}),t.jsx("span",{className:"hn-wordmark-text",children:"hanoman"})]})})}const Jc=c.createContext(null),Fk=c.createContext(null);function WA({count:e}){return t.jsx("span",{className:"hn-nav-badge","data-testid":"nav-badge","aria-hidden":"true",children:dj(e)})}function VA({hub:e,on:a,target:n,badge:i,onNavigate:r}){const s=!!r,o=i?`${e.label}, ${i} butuh pengajuan`:e.label;return t.jsxs("button",{type:"button",className:"hn-nav-item","data-interactive":s?"true":void 0,onClick:s?()=>r(n):void 0,"aria-current":a?"page":void 0,"aria-label":o,title:o,children:[t.jsx(Re,{name:e.icon,size:17,color:a?"var(--accent-hover)":"var(--text-muted)"}),t.jsx("span",{className:"hn-nav-label",children:e.label}),i!==void 0&&t.jsx(WA,{count:i})]})}const YA=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&Object.values(e).every(a=>typeof a=="string"),Qc=c.createContext({});function JA(e){const[a,n]=c.useState({start:!1,end:!1}),i=c.useCallback(()=>{const r=e.current;if(!r)return;const s=r.scrollHeight-r.clientHeight,o={start:r.scrollTop>1,end:s>1&&r.scrollTop<s-1};n(l=>l.start===o.start&&l.end===o.end?l:o)},[e]);return c.useLayoutEffect(()=>{i()}),c.useEffect(()=>{const r=e.current;if(!r)return;r.addEventListener("scroll",i,{passive:!0});const s=typeof ResizeObserver>"u"?null:new ResizeObserver(i);return s==null||s.observe(r),()=>{r.removeEventListener("scroll",i),s==null||s.disconnect()}},[e,i]),a}const QA={position:"absolute",width:1,height:1,overflow:"hidden",clip:"rect(0 0 0 0)",whiteSpace:"nowrap"},ZA={position:"fixed",left:12,top:12,zIndex:300,padding:"8px 12px",borderRadius:"var(--radius-sm)",background:"var(--surface-card)",color:"var(--text-strong)",border:"1px solid var(--border-hair)",boxShadow:"var(--shadow-md)",fontFamily:"var(--font-ui)",fontSize:13,textDecoration:"none"};function Za({active:e,title:a,breadcrumb:n,actions:i,showSearch:r=!1,searchValue:s="",onSearchChange:o,onNavigate:l,wide:d=!1,children:u}){var ee;const[m,h]=c.useState(!1),p=c.useContext(Qc),g=c.useContext(Ok),f=!!g&&LA.has(e??""),b=f&&g?BA(g):void 0,x=c.useContext(Jc),v=Yc(e),y=zk(e),[T,S]=Da("nav","lastTab",{},YA);c.useEffect(()=>{!v||!y||T[v.key]===y||S(X=>({...X,[v.key]:y}))},[e]);const E=v?sl(v,p):[],w=v&&E.length>1?[v.label,(ee=E.find(X=>X.section===y))==null?void 0:ee.label].filter(Boolean).join(" › "):void 0,N=qk(),R=HA(N),L=Vc(`page@${e??"-"}`,"scroll"),I=al(),B=I==="mobile",A=B?void 0:w,M=c.useContext(Fk),K=g&&f||r||!!i,[O,J]=c.useState(!1),Z=c.useRef(null),H=c.useRef(null),te=c.useRef(null),ae=c.useRef(!1),F=c.useRef(null),fe=JA(F);c.useEffect(()=>{var X,ce,se;(se=(ce=(X=F.current)==null?void 0:X.querySelector('[aria-current="page"]'))==null?void 0:ce.scrollIntoView)==null||se.call(ce,{block:"nearest"})},[v==null?void 0:v.key]);const _e=c.useCallback((X=!0)=>{ae.current=X,J(!1)},[]);return c.useLayoutEffect(()=>{var X,ce;(X=Z.current)==null||X.toggleAttribute("inert",B&&!O),(ce=te.current)==null||ce.toggleAttribute("inert",B&&O)},[B,O]),c.useLayoutEffect(()=>{var X,ce;!B||!O||(ce=(X=Z.current)==null?void 0:X.querySelector("button:not([disabled])"))==null||ce.focus()},[B,O]),c.useLayoutEffect(()=>{var X;O||!ae.current||(ae.current=!1,(X=H.current)==null||X.focus())},[O]),c.useEffect(()=>{if(!B||!O)return;const X=ce=>{if(ce.key==="Escape"){ce.preventDefault(),_e();return}if(ce.key!=="Tab"||!Z.current)return;const se=Array.from(Z.current.querySelectorAll('button:not([disabled]), a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')),Ce=se[0],Te=se[se.length-1];!Ce||!Te||(ce.shiftKey&&document.activeElement===Ce?(ce.preventDefault(),Te.focus()):!ce.shiftKey&&document.activeElement===Te&&(ce.preventDefault(),Ce.focus()))};return document.addEventListener("keydown",X),()=>document.removeEventListener("keydown",X)},[_e,B,O]),c.useEffect(()=>{B||J(!1)},[B]),t.jsxs("div",{className:"hn-shell","data-layout":I,"data-nav-open":O?"true":"false",children:[t.jsx("a",{href:"#main-content",onFocus:()=>h(!0),onBlur:()=>h(!1),style:m?ZA:QA,children:"Lewati ke konten"}),B&&O&&t.jsx("button",{className:"hn-shell-backdrop",type:"button","aria-label":"Tutup navigasi",onClick:()=>_e()}),t.jsxs("aside",{ref:Z,id:"hn-primary-navigation",className:"hn-shell-sidebar","aria-hidden":B&&!O?"true":void 0,children:[t.jsx("div",{className:"hn-shell-wordmark",children:t.jsx(KA,{})}),t.jsx("nav",{ref:F,className:"hn-shell-nav","aria-label":"Navigasi utama","data-cue-start":fe.start?"true":void 0,"data-cue-end":fe.end?"true":void 0,children:zA.map(X=>t.jsxs("div",{className:"hn-nav-group",role:"group","aria-labelledby":`hn-nav-group-${X.key}`,children:[t.jsx("div",{id:`hn-nav-group-${X.key}`,className:"hn-eyebrow hn-nav-group-label",children:X.label}),Uk.filter(ce=>ce.group===X.key).map(ce=>t.jsx(VA,{hub:ce,on:(v==null?void 0:v.key)===ce.key,target:FA(ce,T,p),badge:GA(ce,x,p),onNavigate:l?se=>{l(se),B&&_e()}:void 0},ce.key))]},X.key))}),t.jsx("div",{className:"hn-shell-dock","data-pet-slot":"sidebar",children:I==="desktop"?M:null})]}),t.jsxs("div",{ref:te,className:"hn-shell-column","aria-hidden":B&&O?"true":void 0,children:[t.jsxs("header",{className:"hn-shell-topbar",children:[t.jsx("button",{ref:H,className:"hn-shell-menu",type:"button","aria-label":"Buka navigasi","aria-controls":"hn-primary-navigation","aria-expanded":O,onClick:()=>J(!0),children:t.jsx(Re,{name:"menu",size:20})}),t.jsxs("div",{className:"hn-shell-heading",children:[(A||n||b)&&t.jsxs("div",{className:"hn-shell-crumb",children:[A&&t.jsx("span",{"data-testid":"hub-crumb",children:A}),A&&(n||b)?" · ":"",n&&t.jsx("span",{children:n}),b&&t.jsxs("span",{"data-testid":"scope-crumb",children:[n||A?" · ":"","project: ",b]})]}),t.jsx("h1",{className:"hn-shell-title",children:a})]}),K&&t.jsxs("div",{className:"hn-shell-subrow",children:[g&&f&&t.jsx($A,{scope:g}),r&&t.jsx(Oe,{className:"hn-shell-search","aria-label":"Cari",placeholder:"mis. hanoman atau erp",leftIcon:"search",size:"sm",value:s,onChange:o?X=>o(X.target.value):void 0,readOnly:!o}),i]}),t.jsxs("div",{className:"hn-shell-tools",children:[t.jsxs("button",{type:"button",className:"hn-shell-cmdk","aria-label":"Cari","aria-keyshortcuts":N?"Meta+K":"Control+K",title:`Palet perintah (${R})`,onClick:()=>Bk(),children:[t.jsx(Re,{name:"search",size:16}),t.jsx("kbd",{className:"hn-kbd","aria-hidden":"true",children:R})]}),t.jsx("div",{className:"hn-topbar-extra",children:t.jsx(bA,{})}),t.jsx(fA,{}),t.jsx(H2,{}),t.jsxs("div",{className:"hn-topbar-extra",children:[t.jsx(Q2,{}),t.jsx(Z2,{})]}),t.jsx(xA,{})]})]}),t.jsx("main",{ref:L,id:"main-content",tabIndex:-1,"data-testid":"shell-main",className:"hn-shell-main",children:t.jsx("div",{className:d?"hn-shell-content hn-shell-content--wide":"hn-shell-content hn-shell-content--capped",children:u})}),t.jsx("div",{className:"hn-shell-lane","data-pet-slot":"lane",children:I==="desktop"?null:M})]})]})}const XA=["a","blockquote","br","code","del","em","h1","h2","h3","h4","h5","h6","hr","img","input","li","ol","p","pre","strong","table","tbody","td","th","thead","tr","ul"],eE=["align","alt","checked","class","disabled","href","src","start","title","type"],aE=["href","src"],tE=new Set(["http","https","mailto"]),nE=new Set(["http","https"]);function iE(e){return e.replace(/[&<>]/g,a=>({"&":"&","<":"<",">":">"})[a])}function sE(e,a){var r,s;const n=e.replace(/[\u0000-\u0020\u007f-\u009f]/g,""),i=(s=(r=/^([a-z][a-z\d+.-]*):/i.exec(n))==null?void 0:r[1])==null?void 0:s.toLowerCase();return i?(a==="href"?tE:nE).has(i):!0}function rE(e){const a=e.tagName.toLowerCase(),n=a==="ul"?new Set(["contains-task-list"]):a==="li"?new Set(["task-list-item"]):null;return e.className.split(/\s+/).filter(i=>(n==null?void 0:n.has(i))||a==="code"&&/^language-[\w-]+$/.test(i))}function oE(e){var i;const a=If.sanitize(e,{ALLOWED_TAGS:XA,ALLOWED_ATTR:eE,ALLOW_ARIA_ATTR:!1,ALLOW_DATA_ATTR:!1}),n=document.createElement("template");n.innerHTML=a;for(const r of n.content.querySelectorAll("[href], [src]"))for(const s of aE){const o=r.getAttribute(s);o!==null&&!sE(o,s)&&r.removeAttribute(s)}for(const r of n.content.querySelectorAll("[class]")){const s=rE(r);s.length?r.setAttribute("class",s.join(" ")):r.removeAttribute("class")}for(const r of n.content.querySelectorAll("input"))((i=r.getAttribute("type"))==null?void 0:i.toLowerCase())!=="checkbox"?r.remove():r.setAttribute("disabled","");return n.innerHTML}function lE(e){try{const a=Mf.parse(e||"",{gfm:!0,breaks:!1});return oE(a)}catch{return"<pre>"+iE(String(e||""))+"</pre>"}}function dE(e){return/\.json$/.test(e)?"json":/\.toml$/.test(e)?"toml":/\.ya?ml$/.test(e)?"yaml":/\.(ts|tsx|js)$/.test(e)?"ts":""}const Gk=e=>/\.md$/i.test(e);function cE(e,a){const n=/\.md$/.test(a)?e||"":"```"+dE(a)+`
|
|
917
|
+
*/const JS=G("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),ik={Activity:Uj,Anchor:zj,ArrowLeft:Fj,ArrowRight:Gj,ArrowUpRight:Kj,Ban:Wj,Baseline:Vj,Bell:Yj,BookOpen:Jj,Bot:Qj,Box:Zj,Bug:Xj,CalendarClock:e1,CalendarOff:a1,Check:t1,ChevronDown:n1,ChevronLeft:i1,ChevronRight:s1,ChevronUp:r1,ChevronsLeftRight:o1,Circle:p1,CircleArrowUp:l1,CircleCheck:c1,CircleCheckBig:d1,CircleHelp:u1,CircleMinus:m1,CircleX:h1,ClipboardCheck:g1,ClipboardList:k1,CloudDownload:b1,Code:y1,CodeXml:f1,Columns2:v1,Command:x1,Compass:j1,Copy:w1,CornerLeftUp:S1,Cpu:_1,Crosshair:A1,Delete:E1,Diff:T1,Dot:C1,Download:P1,Drama:M1,Ellipsis:I1,ExternalLink:N1,Eye:L1,EyeOff:R1,File:O1,FileDown:B1,FilePlus:$1,FileText:D1,Files:H1,Filter:q1,Focus:U1,Folder:W1,FolderGit2:z1,FolderOpen:F1,FolderPlus:G1,FolderTree:K1,Fullscreen:V1,GanttChart:Y1,Ghost:J1,GitBranch:Q1,GitCommitHorizontal:Z1,GitCompare:X1,GitFork:ew,GitMerge:aw,Goal:tw,Grab:nw,Group:iw,Hand:sw,Hash:rw,History:ow,Image:lw,Inbox:dw,Info:cw,Kanban:uw,Key:hw,KeyRound:mw,Layers:pw,LayoutDashboard:gw,LayoutGrid:kw,LifeBuoy:bw,Lightbulb:fw,Link:vw,Link2:yw,List:jw,ListChecks:xw,Loader:Sw,LoaderCircle:ww,Lock:_w,LogIn:Aw,LogOut:Ew,Logs:Tw,Maximize2:Cw,Menu:Pw,Merge:Mw,MessagesSquare:Iw,Mic:Nw,Minimize2:Rw,Minus:Lw,Monitor:Bw,Move:$w,Network:Dw,OctagonAlert:Ow,Option:Hw,Package:qw,Palette:Uw,Paperclip:zw,Pause:Fw,PenLine:Gw,Pencil:Kw,Pill:Ww,Play:Vw,PlugZap:Yw,Plus:Jw,Pointer:Qw,Radar:Zw,Radio:Xw,RefreshCw:eS,Replace:aS,RotateCcw:tS,Route:nS,Rows2:iS,Save:sS,Scroll:oS,ScrollText:rS,Search:lS,Section:dS,Send:cS,Server:uS,Settings:mS,Share2:hS,Sheet:pS,Shell:gS,Shield:kS,Shuffle:bS,SlidersHorizontal:fS,SlidersVertical:yS,Sparkles:vS,Split:xS,Square:wS,SquareTerminal:jS,Sticker:SS,Table:_S,Tablet:AS,Tag:ES,Target:TS,Terminal:CS,Text:PS,Ticket:MS,Trash:NS,Trash2:IS,TriangleAlert:RS,Type:LS,Underline:BS,Unlink:$S,Upload:DS,User:zS,UserCheck:OS,UserMinus:HS,UserPlus:qS,UserRound:US,Users:FS,View:GS,Volume2:KS,Webhook:WS,WifiOff:VS,X:YS,Zap:JS},QS={"alert-triangle":"TriangleAlert","arrow-up-circle":"CircleArrowUp","check-circle":"CircleCheckBig","check-circle-2":"CircleCheck","code-2":"CodeXml","download-cloud":"CloudDownload","edit-3":"PenLine","git-commit":"GitCommitHorizontal","help-circle":"CircleHelp","loader-2":"LoaderCircle","minus-circle":"CircleMinus","more-horizontal":"Ellipsis",sliders:"SlidersVertical","terminal-square":"SquareTerminal","x-circle":"CircleX"},ZS=e=>(e||"").split(/[-_\s]+/).map(a=>a.charAt(0).toUpperCase()+a.slice(1)).join(""),XS=e=>[ZS(e),QS[e]??""].filter(Boolean);function Re({name:e,size:a=16,stroke:n,color:i,style:r,...s}){const o=a_(e)??ik.Circle,l=s["aria-label"]!=null||s["aria-labelledby"]!=null||s.title!=null;return t.jsx(o,{"data-icon":e,"aria-hidden":l?void 0:!0,role:l?"img":void 0,size:a,color:i,strokeWidth:n,style:r,...s})}const e_=ik;function a_(e){for(const a of XS(e)){const n=e_[a];if(n)return n}}const t_="/assets/hnm-ill-diagram-technical-kit-modular-master-v01-DMmzOITA.webp",n_="/assets/hnm-ill-hero-workflow-16x9-master-v01-BngPlVl5.webp",i_="/assets/hnm-ill-lakon-anoman-duta-4x3-master-v01-0hEUEZ6d.webp",s_="/assets/hnm-ill-lakon-anoman-obong-4x3-master-v01-D841uTR5.webp",r_="/assets/hnm-ill-lakon-chiranjivi-4x3-master-v01-DtbnhQ7C.webp",o_="/assets/hnm-ill-lakon-gunung-dronagiri-4x3-master-v01-C6nCvUhL.webp",l_="/assets/hnm-ill-mascot-pose-ask-1x1-master-v01-S3NAOxD0.webp",d_="/assets/hnm-ill-mascot-pose-carry-knowledge-1x1-master-v01-BnkGXS8s.webp",c_="/assets/hnm-ill-mascot-pose-celebrate-1x1-master-v01-B-OkKay_.webp",u_="/assets/hnm-ill-mascot-pose-neutral-1x1-master-v01-CnvdPWgA.webp",m_="/assets/hnm-ill-mascot-pose-observe-1x1-master-v01-CG_jUBwM.webp",h_="/assets/hnm-ill-mascot-pose-warn-1x1-master-v01-Cm_KnXCE.webp",p_="/assets/hnm-ill-mascot-pose-welcome-1x1-master-v01-CAaHl0C1.webp",g_="/assets/hnm-ill-mascot-pose-work-1x1-master-v01-CFT1_F13.webp",k_="/assets/hnm-ill-model-character-sheet-master-v01-CIs0yaMj.webp",b_="/assets/hnm-ill-model-mascot-sheet-master-v01-BNJl7gCC.webp",f_="/assets/hnm-ill-motif-lakon-buntut-tile-strip-master-v01-DUZOJrQs.webp",y_="/assets/hnm-ill-product-state-awaiting-decision-4x3-master-v01-BwYfsI4Y.webp",v_="/assets/hnm-ill-product-state-empty-backlog-4x3-master-v01-CpttzxOY.webp",x_="/assets/hnm-ill-product-state-onboarding-4x3-master-v01-BEqlvDgy.webp",j_="/assets/hnm-ill-product-state-recoverable-error-4x3-master-v01-BcVo2BbN.webp",w_="/assets/hnm-ill-product-state-session-active-4x3-master-v01-BErsEZ5E.webp",S_="/assets/hnm-ill-product-state-success-4x3-master-v01-tJsjz-0L.webp",__="/assets/hnm-ill-social-landscape-16x9-master-v01-DCmpP1dP.webp",A_="/assets/hnm-ill-social-portrait-4x5-master-v01-DAMYmb8y.webp",E_="/assets/hnm-ill-social-square-1x1-master-v01-CA5ntGVr.webp",T_="/assets/hnm-ill-social-story-9x16-master-v01-DCZ-dWfx.webp",C_="/assets/hnm-ill-spot-context-1x1-master-v01-C-_dXTKT.webp",P_="/assets/hnm-ill-spot-durable-knowledge-1x1-master-v01-_CVUcBE4.webp",M_="/assets/hnm-ill-spot-human-control-1x1-master-v01-BRV52OwQ.webp",I_="/assets/hnm-ill-spot-isolation-1x1-master-v01-C6wtR8uB.webp",N_="/assets/hnm-ill-spot-parallel-work-1x1-master-v01-Ch4Wl1Du.webp",R_="/assets/hnm-ill-spot-visibility-1x1-master-v01-DkgTZ2MF.webp",L_="/assets/hnm-ill-sticker-blocked-1x1-master-v01-suto6sZ9.webp",B_="/assets/hnm-ill-sticker-docs-updated-1x1-master-v01-CV0BaOI1.webp",$_="/assets/hnm-ill-sticker-ready-1x1-master-v01-Cetao79T.webp",D_="/assets/hnm-ill-sticker-review-1x1-master-v01-txPj5Zvx.webp",O_="/assets/hnm-ill-sticker-shipped-1x1-master-v01-r05qU9m-.webp",H_="/assets/hnm-ill-sticker-thanks-1x1-master-v01-BlHuF8Nt.webp",q_="/assets/hnm-ill-sticker-waiting-1x1-master-v01-Dh-UnLNA.webp",U_="/assets/hnm-ill-sticker-working-1x1-master-v01-TQU0v2gf.webp",z_=[{id:"MOD-001",family:"model",subject:"character",ratio:"sheet",filename:"hnm-ill-model-character-sheet-master-v01.webp",transparent:!1,promptIntent:"Three-tier canonical Anoman model sheet with profile, back, three-quarter, gesture, costume, hand, foot, and tail views."},{id:"MSC-001",family:"model",subject:"mascot",ratio:"sheet",filename:"hnm-ill-model-mascot-sheet-master-v01.webp",transparent:!1,promptIntent:"Compact canonical mascot construction and scale sheet derived from MOD-001."},{id:"HRO-001",family:"hero",subject:"workflow",ratio:"16x9",filename:"hnm-ill-hero-workflow-16x9-master-v01.webp",transparent:!1,promptIntent:"Documented intent crosses a visible session lane and returns as evidence to grounded human control."},{id:"LKN-001",family:"lakon",subject:"anoman-duta",ratio:"4x3",filename:"hnm-ill-lakon-anoman-duta-4x3-master-v01.webp",transparent:!1,promptIntent:"An intact mandate crosses a boundary and returns with distinct evidence."},{id:"LKN-002",family:"lakon",subject:"anoman-obong",ratio:"4x3",filename:"hnm-ill-lakon-anoman-obong-4x3-master-v01.webp",transparent:!1,promptIntent:"A controlled ember passes through checklist steps and resolves into a clean branch-diff result."},{id:"LKN-003",family:"lakon",subject:"gunung-dronagiri",ratio:"4x3",filename:"hnm-ill-lakon-gunung-dronagiri-4x3-master-v01.webp",transparent:!1,promptIntent:"Anoman supports five bounded context strata while a grounded human hand selects the final path."},{id:"LKN-004",family:"lakon",subject:"chiranjivi",ratio:"4x3",filename:"hnm-ill-lakon-chiranjivi-4x3-master-v01.webp",transparent:!1,promptIntent:"One finite tail path links session, branch, merge, docs, and useful ground for the next actor."},{id:"SPT-001",family:"spot",subject:"context",ratio:"1x1",filename:"hnm-ill-spot-context-1x1-master-v01.webp",transparent:!1,promptIntent:"Anoman carries a bounded context folio along a purposeful path."},{id:"SPT-002",family:"spot",subject:"visibility",ratio:"1x1",filename:"hnm-ill-spot-visibility-1x1-master-v01.webp",transparent:!1,promptIntent:"Anoman opens a kelir-like field so a session state becomes inspectable."},{id:"SPT-003",family:"spot",subject:"isolation",ratio:"1x1",filename:"hnm-ill-spot-isolation-1x1-master-v01.webp",transparent:!1,promptIntent:"Anoman places work into distinct bounded worktree fields."},{id:"SPT-004",family:"spot",subject:"human-control",ratio:"1x1",filename:"hnm-ill-spot-human-control-1x1-master-v01.webp",transparent:!1,promptIntent:"A grounded human hand gently steers Anoman's workflow path without puppet coercion."},{id:"SPT-005",family:"spot",subject:"parallel-work",ratio:"1x1",filename:"hnm-ill-spot-parallel-work-1x1-master-v01.webp",transparent:!1,promptIntent:"Several isolated paths progress in parallel without collision or duplicated characters."},{id:"SPT-006",family:"spot",subject:"durable-knowledge",ratio:"1x1",filename:"hnm-ill-spot-durable-knowledge-1x1-master-v01.webp",transparent:!1,promptIntent:"A living session trace settles into reusable documents for the next contributor."},{id:"PST-001",family:"product-state",subject:"onboarding",ratio:"4x3",filename:"hnm-ill-product-state-onboarding-4x3-master-v01.webp",transparent:!1,promptIntent:"A welcome pose opens one bounded start path with calm setup space."},{id:"PST-002",family:"product-state",subject:"empty-backlog",ratio:"4x3",filename:"hnm-ill-product-state-empty-backlog-4x3-master-v01.webp",transparent:!1,promptIntent:"An observe pose sits beside a plainly empty backlog tray."},{id:"PST-003",family:"product-state",subject:"session-active",ratio:"4x3",filename:"hnm-ill-product-state-session-active-4x3-master-v01.webp",transparent:!1,promptIntent:"A focused work pose watches one visibly active session marker."},{id:"PST-004",family:"product-state",subject:"awaiting-decision",ratio:"4x3",filename:"hnm-ill-product-state-awaiting-decision-4x3-master-v01.webp",transparent:!1,promptIntent:"A patient ask pose waits at a fork with one grounded human decision marker."},{id:"PST-005",family:"product-state",subject:"success",ratio:"4x3",filename:"hnm-ill-product-state-success-4x3-master-v01.webp",transparent:!1,promptIntent:"A restrained relieved celebration acknowledges one completed result marker."},{id:"PST-006",family:"product-state",subject:"recoverable-error",ratio:"4x3",filename:"hnm-ill-product-state-recoverable-error-4x3-master-v01.webp",transparent:!1,promptIntent:"A concerned but calm mascot points to a reconnect path and recovery arrow."},{id:"MPS-001",family:"mascot-pose",subject:"neutral",ratio:"1x1",filename:"hnm-ill-mascot-pose-neutral-1x1-master-v01.webp",transparent:!0,promptIntent:"Neutral-ready GST-01, EXP-01, TAL-01 pose."},{id:"MPS-002",family:"mascot-pose",subject:"welcome",ratio:"1x1",filename:"hnm-ill-mascot-pose-welcome-1x1-master-v01.webp",transparent:!0,promptIntent:"Welcome open-palm GST-02, EXP-02, TAL-02 pose."},{id:"MPS-003",family:"mascot-pose",subject:"observe",ratio:"1x1",filename:"hnm-ill-mascot-pose-observe-1x1-master-v01.webp",transparent:!0,promptIntent:"Focused observe GST-05, EXP-03, TAL-01 pose."},{id:"MPS-004",family:"mascot-pose",subject:"work",ratio:"1x1",filename:"hnm-ill-mascot-pose-work-1x1-master-v01.webp",transparent:!0,promptIntent:"Focused work GST-06, EXP-03, TAL-02 pose."},{id:"MPS-005",family:"mascot-pose",subject:"ask",ratio:"1x1",filename:"hnm-ill-mascot-pose-ask-1x1-master-v01.webp",transparent:!0,promptIntent:"Curious ask GST-07, EXP-04, TAL-02 pose."},{id:"MPS-006",family:"mascot-pose",subject:"warn",ratio:"1x1",filename:"hnm-ill-mascot-pose-warn-1x1-master-v01.webp",transparent:!0,promptIntent:"Firm warn GST-08, EXP-06, TAL-03 pose."},{id:"MPS-007",family:"mascot-pose",subject:"celebrate",ratio:"1x1",filename:"hnm-ill-mascot-pose-celebrate-1x1-master-v01.webp",transparent:!0,promptIntent:"Relieved celebrate GST-11, EXP-07, TAL-04 pose."},{id:"MPS-008",family:"mascot-pose",subject:"carry-knowledge",ratio:"1x1",filename:"hnm-ill-mascot-pose-carry-knowledge-1x1-master-v01.webp",transparent:!0,promptIntent:"Grateful pass-knowledge GST-12, EXP-08, TAL-04 pose."},{id:"STK-001",family:"sticker",subject:"ready",ratio:"1x1",filename:"hnm-ill-sticker-ready-1x1-master-v01.webp",transparent:!0,promptIntent:"Ready reaction using GST-01, EXP-02, TAL-01."},{id:"STK-002",family:"sticker",subject:"working",ratio:"1x1",filename:"hnm-ill-sticker-working-1x1-master-v01.webp",transparent:!0,promptIntent:"Working reaction using GST-06, EXP-03, TAL-02."},{id:"STK-003",family:"sticker",subject:"waiting",ratio:"1x1",filename:"hnm-ill-sticker-waiting-1x1-master-v01.webp",transparent:!0,promptIntent:"Waiting reaction using GST-05, EXP-01, TAL-01."},{id:"STK-004",family:"sticker",subject:"blocked",ratio:"1x1",filename:"hnm-ill-sticker-blocked-1x1-master-v01.webp",transparent:!0,promptIntent:"Concerned blocked reaction using GST-08, EXP-05, TAL-03 without anger or catastrophe."},{id:"STK-005",family:"sticker",subject:"shipped",ratio:"1x1",filename:"hnm-ill-sticker-shipped-1x1-master-v01.webp",transparent:!0,promptIntent:"Shipped reaction using GST-11, EXP-07, TAL-04."},{id:"STK-006",family:"sticker",subject:"review",ratio:"1x1",filename:"hnm-ill-sticker-review-1x1-master-v01.webp",transparent:!0,promptIntent:"Review reaction using GST-04, EXP-03, TAL-02."},{id:"STK-007",family:"sticker",subject:"thanks",ratio:"1x1",filename:"hnm-ill-sticker-thanks-1x1-master-v01.webp",transparent:!0,promptIntent:"Grateful thanks reaction using GST-02, EXP-08, TAL-01."},{id:"STK-008",family:"sticker",subject:"docs-updated",ratio:"1x1",filename:"hnm-ill-sticker-docs-updated-1x1-master-v01.webp",transparent:!0,promptIntent:"Docs-updated reaction using GST-12, EXP-08, TAL-04."},{id:"SOC-001",family:"social",subject:"square",ratio:"1x1",filename:"hnm-ill-social-square-1x1-master-v01.webp",transparent:!1,promptIntent:"Square release field with character lower-left and clear upper-right headline/proof zones."},{id:"SOC-002",family:"social",subject:"portrait",ratio:"4x5",filename:"hnm-ill-social-portrait-4x5-master-v01.webp",transparent:!1,promptIntent:"Portrait release field with character in lower half, headline-safe upper third, and central proof zone."},{id:"SOC-003",family:"social",subject:"landscape",ratio:"16x9",filename:"hnm-ill-social-landscape-16x9-master-v01.webp",transparent:!1,promptIntent:"Landscape release field with character left, central proof object, and right-third headline-safe zone."},{id:"SOC-004",family:"social",subject:"story",ratio:"9x16",filename:"hnm-ill-social-story-9x16-master-v01.webp",transparent:!1,promptIntent:"Vertical story field with character low, central proof object, and quiet top UI-safe headline band."},{id:"DGM-001",family:"diagram",subject:"technical-kit",ratio:"modular",filename:"hnm-ill-diagram-technical-kit-modular-master-v01.webp",transparent:!1,promptIntent:"Text-free orthogonal primitive board for human, agent, docs, backlog, session, terminal, branch, worktree, state, arrows, and boundaries."},{id:"MTF-001",family:"motif",subject:"lakon-buntut",ratio:"tile-strip",filename:"hnm-ill-motif-lakon-buntut-tile-strip-master-v01.webp",transparent:!1,promptIntent:"Modular Buntut connector plus distinct Duta, Obong, Dronagiri, and Chiranjivi motifs with clean joins and no false loop."}],F_=["MOD-001","MSC-001","HRO-001","LKN-001","LKN-002","LKN-003","LKN-004","SPT-001","SPT-002","SPT-003","SPT-004","SPT-005","SPT-006","PST-001","PST-002","PST-003","PST-004","PST-005","PST-006","MPS-001","MPS-002","MPS-003","MPS-004","MPS-005","MPS-006","MPS-007","MPS-008","STK-001","STK-002","STK-003","STK-004","STK-005","STK-006","STK-007","STK-008","SOC-001","SOC-002","SOC-003","SOC-004","DGM-001","MTF-001"],G_=z_,K_=Object.assign({"../../../internal/assets/illustration/web/hnm-ill-diagram-technical-kit-modular-master-v01.webp":t_,"../../../internal/assets/illustration/web/hnm-ill-hero-workflow-16x9-master-v01.webp":n_,"../../../internal/assets/illustration/web/hnm-ill-lakon-anoman-duta-4x3-master-v01.webp":i_,"../../../internal/assets/illustration/web/hnm-ill-lakon-anoman-obong-4x3-master-v01.webp":s_,"../../../internal/assets/illustration/web/hnm-ill-lakon-chiranjivi-4x3-master-v01.webp":r_,"../../../internal/assets/illustration/web/hnm-ill-lakon-gunung-dronagiri-4x3-master-v01.webp":o_,"../../../internal/assets/illustration/web/hnm-ill-mascot-pose-ask-1x1-master-v01.webp":l_,"../../../internal/assets/illustration/web/hnm-ill-mascot-pose-carry-knowledge-1x1-master-v01.webp":d_,"../../../internal/assets/illustration/web/hnm-ill-mascot-pose-celebrate-1x1-master-v01.webp":c_,"../../../internal/assets/illustration/web/hnm-ill-mascot-pose-neutral-1x1-master-v01.webp":u_,"../../../internal/assets/illustration/web/hnm-ill-mascot-pose-observe-1x1-master-v01.webp":m_,"../../../internal/assets/illustration/web/hnm-ill-mascot-pose-warn-1x1-master-v01.webp":h_,"../../../internal/assets/illustration/web/hnm-ill-mascot-pose-welcome-1x1-master-v01.webp":p_,"../../../internal/assets/illustration/web/hnm-ill-mascot-pose-work-1x1-master-v01.webp":g_,"../../../internal/assets/illustration/web/hnm-ill-model-character-sheet-master-v01.webp":k_,"../../../internal/assets/illustration/web/hnm-ill-model-mascot-sheet-master-v01.webp":b_,"../../../internal/assets/illustration/web/hnm-ill-motif-lakon-buntut-tile-strip-master-v01.webp":f_,"../../../internal/assets/illustration/web/hnm-ill-product-state-awaiting-decision-4x3-master-v01.webp":y_,"../../../internal/assets/illustration/web/hnm-ill-product-state-empty-backlog-4x3-master-v01.webp":v_,"../../../internal/assets/illustration/web/hnm-ill-product-state-onboarding-4x3-master-v01.webp":x_,"../../../internal/assets/illustration/web/hnm-ill-product-state-recoverable-error-4x3-master-v01.webp":j_,"../../../internal/assets/illustration/web/hnm-ill-product-state-session-active-4x3-master-v01.webp":w_,"../../../internal/assets/illustration/web/hnm-ill-product-state-success-4x3-master-v01.webp":S_,"../../../internal/assets/illustration/web/hnm-ill-social-landscape-16x9-master-v01.webp":__,"../../../internal/assets/illustration/web/hnm-ill-social-portrait-4x5-master-v01.webp":A_,"../../../internal/assets/illustration/web/hnm-ill-social-square-1x1-master-v01.webp":E_,"../../../internal/assets/illustration/web/hnm-ill-social-story-9x16-master-v01.webp":T_,"../../../internal/assets/illustration/web/hnm-ill-spot-context-1x1-master-v01.webp":C_,"../../../internal/assets/illustration/web/hnm-ill-spot-durable-knowledge-1x1-master-v01.webp":P_,"../../../internal/assets/illustration/web/hnm-ill-spot-human-control-1x1-master-v01.webp":M_,"../../../internal/assets/illustration/web/hnm-ill-spot-isolation-1x1-master-v01.webp":I_,"../../../internal/assets/illustration/web/hnm-ill-spot-parallel-work-1x1-master-v01.webp":N_,"../../../internal/assets/illustration/web/hnm-ill-spot-visibility-1x1-master-v01.webp":R_,"../../../internal/assets/illustration/web/hnm-ill-sticker-blocked-1x1-master-v01.webp":L_,"../../../internal/assets/illustration/web/hnm-ill-sticker-docs-updated-1x1-master-v01.webp":B_,"../../../internal/assets/illustration/web/hnm-ill-sticker-ready-1x1-master-v01.webp":$_,"../../../internal/assets/illustration/web/hnm-ill-sticker-review-1x1-master-v01.webp":D_,"../../../internal/assets/illustration/web/hnm-ill-sticker-shipped-1x1-master-v01.webp":O_,"../../../internal/assets/illustration/web/hnm-ill-sticker-thanks-1x1-master-v01.webp":H_,"../../../internal/assets/illustration/web/hnm-ill-sticker-waiting-1x1-master-v01.webp":q_,"../../../internal/assets/illustration/web/hnm-ill-sticker-working-1x1-master-v01.webp":U_});function W_(e){const a=G_.find(i=>i.id===e);if(!a)throw new Error(`Illustration ${e} is missing from inventory.json`);const n=Object.entries(K_).find(([i])=>i.endsWith(`/${a.filename}`));if(!n)throw new Error(`Illustration ${e} references missing WebP ${a.filename}`);return Object.freeze({id:e,family:a.family,subject:a.subject,ratio:a.ratio,filename:a.filename,transparent:a.transparent,alt:a.promptIntent,src:n[1]})}const V_=Object.freeze(Object.fromEntries(F_.map(e=>[e,W_(e)]))),Y_={"1x1":"1 / 1","4x3":"4 / 3","4x5":"4 / 5","16x9":"16 / 9","9x16":"9 / 16"};function sk({id:e,alt:a,decorative:n=!1,priority:i=!1,fit:r="contain",style:s,...o}){const l=V_[e],d=i?{fetchpriority:"high"}:{};return t.jsx("img",{...o,...d,src:l.src,alt:n?"":a??l.alt,"aria-hidden":n||void 0,loading:i?"eager":"lazy",decoding:"async","data-testid":`illustration-${e}`,"data-illustration-id":e,"data-illustration-family":l.family,style:{display:"block",width:"100%",height:"auto",objectFit:r,aspectRatio:Y_[l.ratio],...s}})}function rk(e){return t.jsx(sk,{...e})}const si=Object.assign,Bc=c.createContext(null);function Xo(e){const a=c.useContext(Bc),n=c.useId(),i=a==null?void 0:a.register,r=a==null?void 0:a.unregister,s=e.id;c.useLayoutEffect(()=>{if(!(!i||!r))return i(n,s),()=>r(n)},[i,r,n,s]);const o=(a==null?void 0:a.owner)??null,l=o&&o.token===n?o:null;return{id:l?l.id:s,describedBy:e.describedBy??(l?a==null?void 0:a.describedBy:void 0),invalid:!!e.invalid||!!l&&!!(a!=null&&a.invalid)}}const $c=e=>e===!0||e==="true",jm={sm:{h:30,px:12,fs:"var(--text-sm)",gap:6,icon:15},md:{h:38,px:16,fs:"var(--text-md)",gap:8,icon:17},lg:{h:46,px:22,fs:"var(--text-base)",gap:9,icon:19}};function J_(e){switch(e){case"secondary":return{background:"var(--surface-card)",color:"var(--text-strong)",border:"1px solid var(--border-strong)",boxShadow:"var(--shadow-xs)"};case"ghost":return{background:"transparent",color:"var(--text-body)",border:"1px solid transparent"};case"danger":case"danger-outline":return{};case"primary":default:return{background:"var(--action-bg)",color:"var(--action-on)",border:"1px solid var(--action-bg)",boxShadow:"var(--shadow-xs)"}}}function U({children:e,variant:a="primary",size:n="md",leftIcon:i,rightIcon:r,loading:s=!1,disabled:o=!1,fullWidth:l=!1,type:d="button",as:u="button",className:m="",style:h={},...p}){const g=jm[n]||jm.md,[f,b]=c.useState(!1),[x,v]=c.useState(!1),y=o||s,T=J_(a),S=a==="danger"||a==="danger-outline",E=S?{}:a==="ghost"?{background:"var(--bone-200)"}:a==="secondary"?{background:"var(--bone-100)",borderColor:"var(--ink-300)"}:{background:"var(--action-bg-hover)",border:"1px solid var(--action-bg-hover)"},w=u==="a",N=w?{"aria-disabled":y||void 0}:{type:d,disabled:y};return c.createElement(w?"a":"button",si({...N,onMouseEnter:()=>b(!0),onMouseLeave:()=>{b(!1),v(!1)},onMouseDown:()=>v(!0),onMouseUp:()=>v(!1),className:["hn-touch-target",S?`hn-btn-${a}`:"",m].filter(Boolean).join(" "),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",gap:g.gap,height:g.h,textDecoration:"none",padding:`0 ${g.px}px`,width:l?"100%":"auto",font:`var(--weight-medium) ${g.fs}/1 var(--font-ui)`,letterSpacing:"0.005em",borderRadius:"var(--radius-sm)",cursor:y?"not-allowed":"pointer",opacity:y?.5:1,transition:"var(--transition-fast)",transform:x&&!y?"translateY(0.5px)":"none",whiteSpace:"nowrap",...T,...f&&!y?E:null,...h}},p),s&&c.createElement(Re,{name:"loader-2",size:g.icon,style:{animation:"hn-spin 0.7s linear infinite"}}),!s&&i&&c.createElement(Re,{name:i,size:g.icon}),e!=null&&c.createElement("span",null,e),!s&&r&&c.createElement(Re,{name:r,size:g.icon}))}const wm={sm:{box:30,icon:16},md:{box:38,icon:18},lg:{box:46,icon:20}};function yr({icon:e,label:a,variant:n="ghost",size:i="md",disabled:r=!1,className:s="",style:o={},...l}){const d=wm[i]||wm.md,[u,m]=c.useState(!1),h=n==="solid"?{background:"var(--action-bg)",color:"var(--action-on)",border:"1px solid var(--action-bg)"}:n==="outline"?{background:"var(--surface-card)",color:"var(--text-body)",border:"1px solid var(--border-strong)"}:{background:"transparent",color:"var(--text-muted)",border:"1px solid transparent"},p=n==="solid"?{background:"var(--action-bg-hover)",border:"1px solid var(--action-bg-hover)"}:n==="outline"?{background:"var(--bone-100)",borderColor:"var(--ink-300)",color:"var(--text-strong)"}:{background:"var(--bone-200)",color:"var(--text-strong)"};return c.createElement("button",si({type:"button","aria-label":a,title:a,disabled:r,onMouseEnter:()=>m(!0),onMouseLeave:()=>m(!1),className:`hn-touch-target ${s}`.trim(),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:d.box,height:d.box,borderRadius:"var(--radius-sm)",cursor:r?"not-allowed":"pointer",opacity:r?.5:1,transition:"var(--transition-fast)",...h,...u&&!r?p:null,...o}},l),c.createElement(Re,{name:e,size:d.icon}))}const Sm={sm:{h:30,px:10,fs:"var(--text-sm)",icon:15},md:{h:38,px:12,fs:"var(--text-md)",icon:17},lg:{h:46,px:14,fs:"var(--text-base)",icon:19}};function Oe({size:e="md",leftIcon:a,rightIcon:n,invalid:i=!1,disabled:r=!1,mono:s=!1,className:o="",style:l={},...d}){const u=Sm[e]||Sm.md,[m,h]=c.useState(!1),p=Xo({id:d.id,describedBy:d["aria-describedby"],invalid:i||$c(d["aria-invalid"])}),g=p.invalid,f=g?"var(--status-err)":m?"var(--border-focus)":"var(--border-strong)";return c.createElement("div",{className:`hn-touch-target ${o}`.trim(),style:{display:"flex",alignItems:"center",gap:8,height:u.h,padding:`0 ${u.px}px`,background:r?"var(--bone-200)":"var(--surface-card)",border:`1px solid ${f}`,borderRadius:"var(--radius-sm)",boxShadow:m?"var(--ring)":g?"none":"var(--shadow-inset)",transition:"var(--transition-fast)",opacity:r?.6:1,...l}},a&&c.createElement(Re,{name:a,size:u.icon,color:"var(--text-subtle)"}),c.createElement("input",si({disabled:r,onFocus:b=>{h(!0),d.onFocus&&d.onFocus(b)},onBlur:b=>{h(!1),d.onBlur&&d.onBlur(b)}},d,{id:p.id,"aria-describedby":p.describedBy,"aria-invalid":g?!0:d["aria-invalid"],className:"hn-input-core",style:{flex:1,minWidth:0,height:"100%",boxSizing:"border-box",border:"none",outline:"none",background:"transparent",color:"var(--text-strong)",fontFamily:s?"var(--font-mono)":"var(--font-ui)",fontSize:u.fs,lineHeight:1.2}})),n&&c.createElement(Re,{name:n,size:u.icon,color:"var(--text-subtle)"}))}const _m={sm:{h:30,px:10,fs:"var(--text-sm)"},md:{h:38,px:12,fs:"var(--text-md)"},lg:{h:46,px:14,fs:"var(--text-base)"}};function $e({options:e=[],value:a,defaultValue:n,onChange:i,size:r="md",disabled:s=!1,invalid:o=!1,placeholder:l,className:d="",style:u={},...m}){const h=_m[r]||_m.md,[p,g]=c.useState(!1),f=Xo({id:m.id,describedBy:m["aria-describedby"],invalid:o||$c(m["aria-invalid"])}),b=f.invalid,x=b?"var(--status-err)":p?"var(--border-focus)":"var(--border-strong)",v=e.map(y=>typeof y=="string"?{value:y,label:y}:y);return c.createElement("div",{className:`hn-touch-target hn-select ${d}`.trim(),style:{position:"relative",display:"inline-flex",alignItems:"center",height:h.h,background:s?"var(--bone-200)":"var(--surface-card)",border:`1px solid ${x}`,borderRadius:"var(--radius-sm)",boxShadow:p?"var(--ring)":b?"none":"var(--shadow-inset)",transition:"var(--transition-fast)",opacity:s?.6:1,...u}},c.createElement("select",si({value:a,defaultValue:n,onChange:i,disabled:s},m,{id:f.id,"aria-describedby":f.describedBy,"aria-invalid":b?!0:m["aria-invalid"],onFocus:y=>{g(!0),m.onFocus&&m.onFocus(y)},onBlur:y=>{g(!1),m.onBlur&&m.onBlur(y)},style:{appearance:"none",WebkitAppearance:"none",border:"none",outline:"none",background:"transparent",color:"var(--text-strong)",fontFamily:"var(--font-ui)",fontSize:h.fs,height:"100%",flex:1,width:"100%",minWidth:0,boxSizing:"border-box",padding:`0 ${h.px+22}px 0 ${h.px}px`,cursor:s?"not-allowed":"pointer"}}),l&&c.createElement("option",{value:"",disabled:!0},l),v.map(y=>c.createElement("option",{key:y.value,value:y.value,disabled:y.disabled},y.label))),c.createElement(Re,{name:"chevron-down",size:16,color:"var(--text-subtle)",style:{position:"absolute",right:h.px,pointerEvents:"none"}}))}function vs({checked:e,defaultChecked:a,onChange:n,label:i,description:r,disabled:s=!1,className:o="",style:l={},...d}){const u=c.useId(),{"aria-label":m,"aria-labelledby":h,...p}=d,g=e!==void 0,[f,b]=c.useState(!!a),x=g?e:f,v=y=>{s||(g||b(T=>!T),n&&n(!x,y))};return c.createElement("label",si({className:`hn-choice-target ${o}`.trim(),style:{display:"inline-flex",alignItems:r?"flex-start":"center",gap:10,cursor:s?"not-allowed":"pointer",opacity:s?.55:1,...l}},p),c.createElement("span",{role:"checkbox","aria-checked":x,"aria-disabled":s||void 0,"aria-label":m,"aria-labelledby":h??(!m&&(i||r)?u:void 0),className:"hn-choice-control",tabIndex:s?-1:0,onClick:v,onKeyDown:y=>{y.key!==" "&&y.key!=="Enter"||(y.preventDefault(),v(y))},style:{display:"inline-grid",placeItems:"center",width:24,height:24,marginTop:r?-1:0,flex:"0 0 auto"}},c.createElement("span",{style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:18,height:18,borderRadius:"var(--radius-xs)",background:x?"var(--action-bg)":"var(--surface-card)",border:`1.5px solid ${x?"var(--action-bg)":"var(--border-strong)"}`,boxShadow:x?"none":"var(--shadow-inset)",transition:"var(--transition-fast)"}},x&&c.createElement(Re,{name:"check",size:13,stroke:3,color:"var(--action-on)"}))),(i||r)&&c.createElement("span",{id:u,onClick:v,style:{userSelect:"none"}},i&&c.createElement("span",{style:{display:"block",fontSize:"var(--text-md)",color:"var(--text-strong)",lineHeight:1.4}},i),r&&c.createElement("span",{style:{display:"block",fontSize:"var(--text-sm)",color:"var(--text-muted)",lineHeight:1.45}},r)))}const ok=c.createContext(null);function Mi({checked:e=!1,value:a,onChange:n,label:i,description:r,disabled:s=!1,tone:o,className:l="",style:d={},...u}){const m=c.useId(),h=c.useContext(ok),p=!!h&&a!==void 0,g=s||!!(h!=null&&h.disabled),f=p?h.value===a:e,b=o??(h==null?void 0:h.tone)??"default",x=g||h&&a!==void 0&&h.tabTarget!==a?-1:0,{"aria-label":v,"aria-labelledby":y,...T}=u,S=E=>{g||(h&&a!==void 0&&h.value!==a&&h.onSelect(a,E),n&&n(E))};return c.createElement("label",si({className:`hn-choice-target ${l}`.trim(),"data-tone":b,style:{display:"inline-flex",alignItems:r?"flex-start":"center",gap:10,cursor:g?"not-allowed":"pointer",opacity:g?.55:1,...d}},T),c.createElement("span",{role:"radio","aria-checked":f,"aria-disabled":g||void 0,"aria-label":v,"aria-labelledby":y??(!v&&(i||r)?m:void 0),"data-value":p?a:void 0,className:"hn-choice-control",tabIndex:x,onClick:S,onKeyDown:E=>{E.key!==" "&&E.key!=="Enter"||(E.preventDefault(),S(E))},style:{display:"inline-grid",placeItems:"center",width:24,height:24,marginTop:r?-1:0,flex:"0 0 auto"}},c.createElement("span",{className:"hn-radio-ring"},f&&c.createElement("span",{className:"hn-radio-dot"}))),(i||r)&&c.createElement("span",{id:m,onClick:S,style:{userSelect:"none"}},i&&c.createElement("span",{className:"hn-radio-label"},i),r&&c.createElement("span",{style:{display:"block",fontSize:"var(--text-sm)",color:"var(--text-muted)",lineHeight:1.45}},r)))}function Am(e){return e?Array.from(e.querySelectorAll('[role="radio"][data-value]')).filter(a=>a.getAttribute("aria-disabled")!=="true"):[]}function vr({value:e,onChange:a,label:n,direction:i="column",disabled:r=!1,tone:s="default",children:o,style:l={},...d}){const u=c.useRef(null),m=c.useId(),[h,p]=c.useState(null);c.useLayoutEffect(()=>{const x=Am(u.current).map(y=>y.dataset.value??""),v=e!=null&&x.includes(e)?e:x[0]??null;p(y=>y===v?y:v)});const g=c.useCallback((x,v)=>{a==null||a(x,v)},[a]),f=c.useMemo(()=>({value:e,tabTarget:h,disabled:r,tone:s,onSelect:g}),[e,h,r,s,g]),b=x=>{if(!["ArrowDown","ArrowRight","ArrowUp","ArrowLeft","Home","End"].includes(x.key))return;const v=Am(u.current),y=v.indexOf(x.target);if(y<0)return;const T=v.length,S=x.key==="Home"?0:x.key==="End"?T-1:x.key==="ArrowDown"||x.key==="ArrowRight"?(y+1)%T:(y-1+T)%T;x.preventDefault();const E=v[S];E.focus();const w=E.dataset.value;w!==void 0&&w!==e&&(a==null||a(w,x))};return t.jsx(ok.Provider,{value:f,children:t.jsxs("div",{...d,ref:u,role:"radiogroup","aria-labelledby":n?m:d["aria-labelledby"],"aria-disabled":r||void 0,onKeyDown:b,style:{display:"flex",flexDirection:"column",gap:8,minWidth:0,...l},children:[n&&t.jsx("div",{id:m,style:{fontSize:12.5,fontWeight:600,color:"var(--text-strong)",lineHeight:1.4},children:n}),t.jsx("div",{style:{display:"flex",flexDirection:i,flexWrap:"wrap",gap:i==="row"?18:10},children:o})]})})}const Em={sm:{w:32,h:18,knob:14},md:{w:40,h:22,knob:18}};function el({checked:e,defaultChecked:a,onChange:n,size:i="md",disabled:r=!1,label:s,className:o="",style:l={},...d}){const u=c.useId(),{"aria-label":m,"aria-labelledby":h,...p}=d,g=Em[i]||Em.md,f=e!==void 0,[b,x]=c.useState(!!a),v=f?e:b,y=S=>{r||(f||x(E=>!E),n&&n(!v,S))},T=c.createElement("span",{role:"switch","aria-checked":v,"aria-disabled":r||void 0,"aria-label":m,"aria-labelledby":h??(!m&&s?u:void 0),className:"hn-choice-control",tabIndex:r?-1:0,onClick:y,onKeyDown:S=>{S.key!==" "&&S.key!=="Enter"||(S.preventDefault(),y(S))},style:{display:"inline-grid",placeItems:"center",width:g.w,height:g.h,cursor:r?"not-allowed":"pointer",flex:"0 0 auto"}},c.createElement("span",{style:{position:"relative",display:"inline-block",width:g.w,height:g.h,borderRadius:"var(--radius-pill)",background:v?"var(--accent)":"var(--ink-300)",border:"1px solid "+(v?"var(--accent-hover)":"var(--ink-300)"),transition:"var(--transition-fast)"}},c.createElement("span",{style:{position:"absolute",top:"50%",left:v?g.w-g.knob-3:2,transform:"translateY(-50%)",width:g.knob,height:g.knob,borderRadius:"50%",background:"var(--bone-000)",boxShadow:"var(--shadow-sm)",transition:"var(--transition-fast)"}})));return s?c.createElement("label",si({className:`hn-choice-target ${o}`.trim(),style:{display:"inline-flex",alignItems:"center",gap:10,cursor:r?"not-allowed":"pointer",opacity:r?.55:1,...l}},p),T,c.createElement("span",{id:u,onClick:y,style:{fontSize:"var(--text-md)",color:"var(--text-strong)",userSelect:"none"}},s)):c.createElement("span",si({className:`hn-choice-target ${o}`.trim(),style:{opacity:r?.55:1,...l}},p),T)}function Nd({options:e,value:a,onChange:n,placeholder:i="Pilih…",searchPlaceholder:r="Cari…",emptyText:s="Tak ada yang cocok.",invalidValues:o=[],disabled:l=!1,style:d={},...u}){const[m,h]=c.useState(!1),[p,g]=c.useState(""),f=Xo({id:u.id,describedBy:u["aria-describedby"]}),b=u["aria-label"]??i,x=S=>{var E;return((E=e.find(w=>w.value===S))==null?void 0:E.label)??S},v=p.trim().toLowerCase(),y=v?e.filter(S=>`${S.label} ${S.value} ${S.group??""}`.toLowerCase().includes(v)):e,T=S=>n(a.includes(S)?a.filter(E=>E!==S):[...a,S]);return c.createElement("div",{style:{display:"flex",flexDirection:"column",gap:6,...d}},a.length>0&&c.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:6}},a.map(S=>{const E=o.includes(S);return c.createElement("span",{key:S,"data-testid":`chip-${S}`,title:E?"tak ada di katalog mesin ini":void 0,style:{display:"inline-flex",alignItems:"center",gap:6,padding:"2px 8px",borderRadius:"var(--radius-pill)",fontSize:"var(--text-xs)",fontFamily:"var(--font-mono)",background:"var(--bone-200)",color:E?"var(--status-err)":"var(--text-strong)",border:`1px solid ${E?"var(--status-err)":"var(--border-strong)"}`}},E?"⚠ ":null,x(S),c.createElement("button",{type:"button","aria-label":`Hapus ${S}`,disabled:l,onClick:()=>n(a.filter(w=>w!==S)),style:{border:"none",background:"transparent",cursor:"pointer",color:"inherit",padding:0,lineHeight:1,fontSize:"var(--text-sm)"}},"×"))})),c.createElement(U,{variant:"secondary",size:"sm",disabled:l,id:f.id,"aria-describedby":f.describedBy,"aria-invalid":f.invalid||void 0,"aria-label":b,"aria-expanded":m,onClick:()=>h(S=>!S),rightIcon:m?"chevron-up":"chevron-down"},a.length?`${a.length} dipilih`:i),m&&c.createElement("div",{style:{display:"flex",flexDirection:"column",gap:6,padding:8,border:"1px solid var(--border-strong)",borderRadius:"var(--radius-sm)",background:"var(--surface-card)"}},c.createElement(Bc.Provider,{value:null},c.createElement(Oe,{type:"search",role:"searchbox",size:"sm",value:p,placeholder:r,"aria-label":`Cari ${b}`,onChange:S=>g(S.target.value)})),c.createElement("div",{role:"listbox","aria-multiselectable":!0,style:{display:"flex",flexDirection:"column",maxHeight:220,overflowY:"auto"}},y.length===0?c.createElement("span",{style:{fontSize:"var(--text-xs)",color:"var(--text-subtle)",padding:"6px 4px"}},s):y.map(S=>c.createElement("button",{key:S.value,type:"button",role:"option","aria-selected":a.includes(S.value),disabled:l,onClick:()=>T(S.value),style:{display:"flex",alignItems:"center",gap:8,padding:"6px 4px",border:"none",background:"transparent",cursor:"pointer",textAlign:"left",font:"var(--weight-medium) var(--text-sm)/1.3 var(--font-ui)",color:a.includes(S.value)?"var(--text-strong)":"var(--text-body)"}},c.createElement(Re,{name:a.includes(S.value)?"check":"circle",size:14,color:a.includes(S.value)?"var(--accent)":"var(--text-subtle)"}),c.createElement("span",null,S.label),S.group&&c.createElement("span",{style:{marginLeft:"auto",fontSize:"var(--text-xs)",color:"var(--text-subtle)"}},S.group))))))}const Q_={loading:{icon:"loader-2",fg:"var(--text-muted)",bg:"var(--bone-200)",title:"Memuat…"},empty:{icon:"inbox",fg:"var(--brass-700)",bg:"var(--brass-100)",title:"Belum ada data"},error:{icon:"octagon-alert",fg:"var(--clay-600)",bg:"var(--status-err-tint)",title:"Gagal memuat"}};function ue({kind:e,title:a,hint:n,icon:i,action:r,actionLabel:s,actionIcon:o,illustration:l,illustrationDecorative:d,compact:u}){const m=Q_[e],h=u?34:44;return t.jsxs("div",{role:e==="error"?"alert":void 0,"aria-busy":e==="loading"||void 0,style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:4,textAlign:"center",padding:u?"24px 16px":"56px 24px",fontFamily:"var(--font-sans)"},children:[l?t.jsx(sk,{id:l,decorative:d,style:{width:u?132:240,maxWidth:"100%",marginBottom:8,borderRadius:"var(--radius-md)"}}):t.jsx("span",{style:{width:h,height:h,borderRadius:"var(--radius-md)",marginBottom:6,background:m.bg,color:m.fg,display:"inline-flex",alignItems:"center",justifyContent:"center"},children:t.jsx(Re,{name:i||m.icon,size:u?17:21,style:e==="loading"?{animation:"hn-spin 0.7s linear infinite"}:void 0})}),t.jsx("div",{style:{fontSize:u?13.5:15,fontWeight:600,color:"var(--text-strong)",lineHeight:1.3},children:a??m.title}),n&&t.jsx("div",{style:{fontSize:12.5,color:"var(--text-muted)",lineHeight:1.5,maxWidth:380},children:n}),r&&t.jsx("div",{style:{marginTop:10},children:t.jsx(U,{size:"sm",variant:e==="error"?"secondary":"primary",leftIcon:o||(e==="error"?"rotate-ccw":"plus"),onClick:r,children:s??(e==="error"?"Coba lagi":"Tambah")})})]})}class Z_ extends c.Component{constructor(){super(...arguments);bu(this,"state",{error:null})}static getDerivedStateFromError(n){return{error:n}}render(){return this.state.error?t.jsx(ue,{kind:"error",title:"Halaman gagal dimuat",hint:"Biasanya karena hanoman baru diperbarui di server. Muat ulang tab ini.",action:()=>window.location.reload(),actionLabel:"Muat ulang"}):this.props.children}}const lk=e=>`/sounds/notify-${e}.wav`;let Or;function dk(){if(Or===void 0)try{Or=new Audio}catch{Or=null}return Or}let Tm=!1;function X_(){if(Tm)return;const e=dk();if(e){Tm=!0;try{e.muted=!0,e.src=lk("short"),Promise.resolve(e.play()).then(()=>{e.pause(),e.muted=!1}).catch(()=>{e.muted=!1})}catch{e.muted=!1}}}function e2(e){if(e==="off")return;const a=dk();if(a)try{a.muted=!1,a.src=lk(e),a.currentTime=0,Promise.resolve(a.play()).catch(()=>{})}catch{}}function xs(e,a="Terjadi kesalahan"){const n=e instanceof Error?e.message:typeof e=="string"?e:"";return n&&n.trim()?n.trim():a}function ba(e,a){const n=xs(a,"");return n?`Gagal ${e}: ${n}`:`Gagal ${e}`}function Cm(e){return e.reduce((a,n)=>n.createdAt>a?n.createdAt:a,"")}function a2(e,a){return e.filter(n=>n.createdAt>a)}function t2(e,a){return e.type==="decision"?{msg:`${e.specId??e.sessionId} · butuh keputusan`,tone:"warn",icon:"git-merge",sound:a.notifyDecisionSound,enabled:a.notifyDecision}:e.type==="ticket"?{msg:e.title,tone:"warn",icon:"inbox",sound:a.notifyDecisionSound,enabled:!0}:{msg:`${e.specId} · "${e.title}" selesai`,tone:"ok",icon:"check-circle-2",sound:a.notifySound,enabled:a.notifyDone}}function n2(e,a,n){if(!(!("Notification"in window)||window.Notification.permission!=="granted"||!document.hidden))try{const i=new window.Notification(e,{tag:a.id});i.onclick=()=>{window.focus(),n==null||n(a),i.close()}}catch{}}const ck=c.createContext({items:[],unread:0,total:0,markAllRead:()=>{},markRead:()=>{},clear:()=>{}}),Dc=()=>c.useContext(ck);function i2({showToast:e,onOpen:a,isViewing:n,children:i}){const[r,s]=c.useState([]),[o,l]=c.useState(0),[d,u]=c.useState(0),m=c.useRef(void 0),h=c.useRef({notifyDone:!0,notifySound:"short",notifyDecision:!0,notifyDecisionSound:"alert"}),p=c.useRef(a);p.current=a;const g=c.useRef(n);g.current=n;const f=c.useRef(new Set),b=c.useRef(()=>{}),x=c.useCallback(async()=>{try{const w=await ne.getSettings();h.current={notifyDone:w.notifyDone,notifySound:w.notifySound,notifyDecision:w.notifyDecision,notifyDecisionSound:w.notifyDecisionSound}}catch{}},[]),v=c.useCallback(w=>{var I;if(s(w.items),l(w.unread),u(w.total??w.items.length),m.current===void 0){m.current=Cm(w.items);return}const N=a2(w.items,m.current),R=Cm(w.items);R>m.current&&(m.current=R);const L=N[0];if(L&&!f.current.has(L.id)){f.current.add(L.id),f.current.size>200&&f.current.delete(f.current.values().next().value);const B=t2(L,h.current);if(B.enabled){const A=L.type==="decision",M=A&&((I=g.current)==null?void 0:I.call(g,L))===!0,K=A&&p.current?{action:{label:"Jawab",onAction:()=>{var O;b.current(L.id),(O=p.current)==null||O.call(p,L)}},duration:7e3}:void 0;M||e(B.msg,B.tone,B.icon,K),e2(B.sound),n2(B.msg,L,p.current)}}},[e]);c.useEffect(()=>{x();const w=Ii(R=>{R.t==="notifications"&&v({items:R.items,unread:R.unread,total:R.total})}),N=()=>{X_(),"Notification"in window&&window.Notification.permission==="default"&&window.Notification.requestPermission(),window.removeEventListener("pointerdown",N),window.removeEventListener("keydown",N)};return window.addEventListener("pointerdown",N,{once:!0}),window.addEventListener("keydown",N,{once:!0}),()=>{w(),window.removeEventListener("pointerdown",N),window.removeEventListener("keydown",N)}},[v,x]);const y=c.useRef({items:r,unread:o,total:d});y.current={items:r,unread:o,total:d};const T=c.useCallback(()=>{const w=y.current.unread;l(0),ne.markNotificationsRead().catch(N=>{l(w),e(ba("menandai notifikasi dibaca",N),"err","x-circle")})},[e]),S=c.useCallback(w=>{const N=y.current.items.find(L=>L.id===w);if(N!=null&&N.readAt)return;const R=new Date().toISOString();N&&(s(L=>L.map(I=>I.id===w?{...I,readAt:R}:I)),l(L=>Math.max(0,L-1))),ne.markNotificationRead(w).catch(L=>{N&&(s(I=>I.map(B=>B.id===w?{...B,readAt:null}:B)),l(I=>I+1)),e(ba("menandai notifikasi dibaca",L),"err","x-circle")})},[e]);b.current=S;const E=c.useCallback(()=>{const w=y.current;s([]),l(0),u(0),ne.clearNotifications().catch(N=>{s(w.items),l(w.unread),u(w.total),e(ba("membersihkan notifikasi",N),"err","x-circle")})},[e]);return t.jsx(ck.Provider,{value:{items:r,unread:o,total:d,markAllRead:T,markRead:S,clear:E,onOpen:a},children:i})}function s2(e,a){if(e.type==="ticket")return{section:"triage",projectFilter:e.projectId??void 0};const n=e.sessionId?a.find(i=>i.id===e.sessionId&&!i.exited):void 0;return e.type==="decision"||n?{section:"terminal",projectFilter:e.projectId??void 0,focus:e.sessionId??void 0}:{section:"backlog",projectFilter:e.projectId??void 0}}const mr=Object.assign;function uk({color:e,size:a,pulse:n=!1}){return c.createElement("span",{"aria-hidden":"true",className:n?"hn-status-dot hn-status-dot-pulse":"hn-status-dot",style:{width:a,height:a,borderRadius:"50%",background:e,flex:"0 0 auto"}})}const Pm={neutral:{bg:"var(--bone-200)",text:"var(--ink-600)",dot:"var(--ink-500)",bd:"var(--bone-400)"},brass:{bg:"var(--brass-100)",text:"var(--brass-700)",dot:"var(--brass-500)",bd:"var(--brass-300)"},info:{bg:"var(--wind-100)",text:"var(--wind-700)",dot:"var(--wind-600)",bd:"var(--wind-500)"},ok:{bg:"var(--status-ok-tint)",text:"var(--leaf-600)",dot:"var(--leaf-600)",bd:"var(--leaf-500)"},warn:{bg:"var(--status-warn-tint)",text:"var(--status-warn)",dot:"var(--amber-600)",bd:"var(--amber-500)"},err:{bg:"var(--status-err-tint)",text:"var(--clay-600)",dot:"var(--clay-600)",bd:"var(--clay-500)"}};function ra({children:e,tone:a="neutral",icon:n,variant:i="soft",size:r="md",className:s="",style:o={},...l}){const d=Pm[a]||Pm.neutral,u=r==="sm",m=i==="solid",h=i==="outline",p=i==="dot",g=p?{display:"inline-flex",alignItems:"center",gap:u?5:6,fontFamily:"var(--font-ui)",fontSize:u?"var(--text-2xs)":"var(--text-xs)",fontWeight:"var(--weight-medium)",lineHeight:1,color:d.text,whiteSpace:"nowrap"}:{display:"inline-flex",alignItems:"center",gap:u?4:5,height:u?18:22,padding:u?"0 7px":"0 9px",borderRadius:"var(--radius-pill)",fontFamily:"var(--font-ui)",fontSize:u?"var(--text-2xs)":"var(--text-xs)",fontWeight:"var(--weight-medium)",lineHeight:1,letterSpacing:"0.01em",background:m?d.text:h?"transparent":d.bg,color:m?"var(--bone-000)":d.text,border:`1px solid ${h?d.bd:m?d.text:"transparent"}`,whiteSpace:"nowrap"};return c.createElement("span",mr({className:s,style:{...g,...o}},l),p&&c.createElement(uk,{color:d.dot,size:u?6:7}),n&&!p&&c.createElement(Re,{name:n,size:u?11:13}),e)}const Mm={info:{icon:"info",role:"note"},ok:{icon:"check-circle-2",role:"status"},warn:{icon:"alert-triangle",role:"status"},err:{icon:"octagon-alert",role:"alert"},danger:{icon:"octagon-alert",role:"alert"},brass:{icon:"sparkles",role:"note"}};function ft({children:e,tone:a="info",title:n,icon:i,action:r,role:s,className:o="",style:l={},...d}){const u=Mm[a]?a:"info",m=Mm[u];return c.createElement("div",mr({className:`hn-callout ${o}`.trim(),"data-tone":u,role:s??m.role,style:{display:"flex",gap:12,padding:"14px 16px",borderRadius:"var(--radius-md)",...l}},d),c.createElement(Re,{name:i||m.icon,size:19,style:{marginTop:1}}),c.createElement("div",{style:{flex:1,minWidth:0}},n&&c.createElement("div",{style:{fontFamily:"var(--font-ui)",fontSize:"var(--text-md)",fontWeight:"var(--weight-semibold)",color:"var(--text-strong)",marginBottom:e?3:0}},n),e&&c.createElement("div",{style:{fontSize:"var(--text-sm)",lineHeight:"var(--leading-normal)",color:"var(--text-body)"}},e),r&&c.createElement("div",{style:{marginTop:10}},r)))}const r2=new Set(["brass","ok","warn","err","danger","info"]);function Oc({value:e=0,max:a=100,tone:n="brass",size:i="md",showLabel:r=!1,label:s,valueText:o,className:l="",style:d={},...u}){const m=Math.max(0,Math.min(100,e/a*100)),h=i==="sm"?5:i==="lg"?10:7,p=r2.has(n)?n:"brass",g={},f={};for(const[x,v]of Object.entries(u))x.startsWith("aria-")?g[x]=v:f[x]=v;const b=g["aria-label"]??(typeof s=="string"?s:void 0);return c.createElement("div",mr({className:l,style:{...d}},f),(r||s)&&c.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"baseline",marginBottom:6}},c.createElement("span",{style:{fontSize:"var(--text-sm)",color:"var(--text-body)"}},s),r&&c.createElement("span",{"aria-hidden":"true",style:{fontFamily:"var(--font-mono)",fontSize:"var(--text-xs)",color:"var(--text-muted)"}},Math.round(m),"%")),c.createElement("div",mr({role:"progressbar","aria-valuemin":0,"aria-valuenow":e,"aria-valuemax":a,"aria-label":b,"aria-valuetext":o,style:{height:h,background:"var(--bone-300)",borderRadius:"var(--radius-pill)",overflow:"hidden"}},g),c.createElement("div",{className:"hn-progress-fill","data-tone":p,style:{width:m+"%",height:"100%",borderRadius:"var(--radius-pill)",transition:"width var(--dur-slow) var(--ease-out)"}})))}const Im={ok:{label:"On convention",dot:"var(--leaf-600)",text:"var(--leaf-600)",bg:"var(--status-ok-tint)",pulse:!1},drift:{label:"Drifting",dot:"var(--amber-600)",text:"var(--status-warn)",bg:"var(--status-warn-tint)",pulse:!1},broken:{label:"Off convention",dot:"var(--clay-600)",text:"var(--clay-600)",bg:"var(--status-err-tint)",pulse:!1},running:{label:"Running",dot:"var(--brass-600)",text:"var(--brass-700)",bg:"var(--brass-100)",pulse:!0},awaiting:{label:"Menunggu keputusan",dot:"var(--amber-600)",text:"var(--status-warn)",bg:"var(--status-warn-tint)",pulse:!0},queued:{label:"Queued",dot:"var(--wind-600)",text:"var(--wind-700)",bg:"var(--wind-100)",pulse:!1},done:{label:"Done",dot:"var(--leaf-600)",text:"var(--leaf-600)",bg:"var(--status-ok-tint)",pulse:!1},failed:{label:"Failed",dot:"var(--clay-600)",text:"var(--clay-600)",bg:"var(--status-err-tint)",pulse:!1},paused:{label:"Paused",dot:"var(--amber-600)",text:"var(--status-warn)",bg:"var(--status-warn-tint)",pulse:!1},stopped:{label:"Stopped",dot:"var(--ink-500)",text:"var(--ink-500)",bg:"var(--bone-200)",pulse:!1},scanning:{label:"Scanning",dot:"var(--wind-600)",text:"var(--wind-700)",bg:"var(--wind-100)",pulse:!0},idle:{label:"Idle",dot:"var(--ink-500)",text:"var(--ink-500)",bg:"var(--bone-200)",pulse:!1}};function pt({status:e="idle",children:a,size:n="md",variant:i="pill",className:r="",style:s={},...o}){const l=Im[e]||Im.idle,d=n==="sm",u=i==="dot";return c.createElement("span",mr({className:r,style:{display:"inline-flex",alignItems:"center",gap:d?5:6,height:u?"auto":d?20:24,padding:u?0:d?"0 8px 0 7px":"0 10px 0 8px",borderRadius:"var(--radius-pill)",background:u?"transparent":l.bg,color:l.text,fontFamily:"var(--font-ui)",fontSize:d?"var(--text-2xs)":"var(--text-xs)",fontWeight:"var(--weight-medium)",lineHeight:1,whiteSpace:"nowrap",...s}},o),c.createElement(uk,{color:l.dot,size:d?6:7,pulse:l.pulse}),a||l.label)}const o2=15e3;function l2(){const[e,a]=c.useState(km);return c.useEffect(()=>(a(km()),bj(a)),[]),e}function EL(e){const{topic:a,params:n,pollMs:i}=e,r=c.useRef(e.apply);r.current=e.apply;const s=c.useRef(e.refetch);s.current=e.refetch;const o=JSON.stringify(n),[l,d]=c.useState(()=>bm());c.useEffect(()=>(d(bm()),vj(d)),[]);const u=l.includes(a);c.useEffect(()=>xj(a,n,f=>r.current(f)),[a,o]);const m=yj()||l.length>0,[h,p]=c.useState(!1);c.useEffect(()=>{if(u||m){p(!1);return}const f=setTimeout(()=>{fj()===null&&p(!0)},o2);return()=>clearTimeout(f)},[u,m]);const g=!u&&(h||m);c.useEffect(()=>{if(!g)return;const f=setInterval(()=>{document.hidden||s.current()},i);return()=>clearInterval(f)},[g,i,o])}const d2=Object.assign;function Sa({children:e,title:a,eyebrow:n,actions:i,footer:r,elevation:s="raised",interactive:o=!1,padding:l=20,fill:d=!1,className:u="",style:m={},...h}){const[p,g]=c.useState(!1),f={flat:"none",raised:"var(--shadow-sm)",float:"var(--shadow-md)"}[s]||"var(--shadow-sm)",b=a||n||i;return c.createElement("div",d2({className:u,onMouseEnter:()=>o&&g(!0),onMouseLeave:()=>o&&g(!1),style:{background:"var(--surface-card)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-lg)",boxShadow:o&&p?"var(--shadow-md)":f,transform:o&&p?"translateY(-1px)":"none",transition:"var(--transition-base)",cursor:o?"pointer":"default",overflow:"hidden",...d?{display:"flex",flexDirection:"column",flex:"1 1 auto",minHeight:0}:null,...m}},h),b&&c.createElement("div",{className:"hn-card-header",style:{padding:`${l}px ${l}px ${a&&e?0:l}px`}},c.createElement("div",{style:{minWidth:0}},n&&c.createElement("div",{className:"hn-eyebrow",style:{fontFamily:"var(--font-mono)",fontSize:"var(--text-2xs)",fontWeight:"var(--weight-medium)",letterSpacing:"var(--tracking-caps)",textTransform:"uppercase",color:"var(--text-muted)",marginBottom:5}},n),a&&c.createElement("div",{style:{fontFamily:"var(--font-display)",fontSize:"var(--text-xl)",fontWeight:"var(--weight-semibold)",letterSpacing:"var(--tracking-tight)",color:"var(--text-strong)",lineHeight:1.2}},a)),i&&c.createElement("div",{className:"hn-card-actions",style:{flex:"0 0 auto"}},i)),e&&c.createElement("div",{style:{padding:b?`12px ${l}px ${l}px`:l,...d?{display:"flex",flexDirection:"column",flex:"1 1 auto",minHeight:0}:null}},e),r&&c.createElement("div",{style:{padding:`12px ${l}px`,borderTop:"1px solid var(--border-hair)",background:"var(--bone-100)"}},r))}const Hr=[],zs=new Map;function c2(e){const a=[];let n=e;for(;n!==document.body&&n.parentElement;){for(const i of Array.from(n.parentElement.children)){if(i===n||i.hasAttribute("data-hn-toast-host"))continue;const r=zs.get(i)??0;zs.set(i,r+1),r===0&&i.setAttribute("inert",""),a.push(i)}n=n.parentElement}return()=>{for(const i of a){const r=(zs.get(i)??1)-1;if(r>0){zs.set(i,r);continue}zs.delete(i),i.removeAttribute("inert")}}}const u2=3,m2=2600,h2=7e3;function mk(){const[e,a]=c.useState([]),n=c.useRef(0),i=c.useCallback((o,l="ok",d,u)=>{const m=++n.current;a(h=>[...h,{k:m,message:o,tone:l,icon:d,action:u==null?void 0:u.action,duration:u==null?void 0:u.duration}])},[]),r=c.useCallback(o=>a(l=>l.filter(d=>d.k!==o)),[]);return[c.useMemo(()=>({items:e,dismiss:r}),[e,r]),i]}function p2({toast:e,onDone:a}){const n=e.tone||"ok",i=n==="err",r=i?"var(--clay-500)":n==="warn"?"var(--amber-500)":n==="info"?"var(--wind-600)":"var(--leaf-500)",s=e.icon||(i?"x-circle":n==="warn"?"alert-triangle":n==="info"?"info":"check-circle-2"),o=e.action,l=e.duration??(o?h2:m2),[d,u]=c.useState(!1),[m,h]=c.useState(!1),[p,g]=c.useState(!1),f=d||m,b=c.useRef(l),x=c.useRef(0),v=c.useRef(a);v.current=a;const y=e.k,T=()=>{v.current?v.current(y):g(!0)};return c.useEffect(()=>{if(f)return;x.current=Date.now();const S=setTimeout(()=>{v.current?v.current(y):g(!0)},b.current);return()=>{clearTimeout(S),b.current=Math.max(0,b.current-(Date.now()-x.current))}},[f,y]),p?null:t.jsxs("div",{className:o?"hn-toast hn-toast--action":"hn-toast",role:i?"alert":void 0,"aria-live":i?"assertive":void 0,onMouseEnter:()=>u(!0),onMouseLeave:()=>u(!1),onFocus:()=>h(!0),onBlur:S=>{S.currentTarget.contains(S.relatedTarget)||h(!1)},children:[t.jsx(Re,{name:s,size:16,color:r}),t.jsx("span",{className:"hn-toast-msg",children:e.message}),o&&t.jsx("button",{type:"button",onClick:()=>{o.onAction(),T()},className:"hn-toast-action",children:o.label})]})}function Hc({toast:e}){const a=e&&"items"in e?e:null,n=e&&!("items"in e)?e:null,i=a?a.items:n?[n]:[],r=a?a.dismiss:void 0,s=i.slice(0,u2);return t.jsx("div",{"data-hn-toast-host":"",role:"status","aria-live":"polite",className:"hn-toast-host",children:s.map(o=>t.jsx(p2,{toast:o,onDone:r},o.k))})}function TL({toast:e}){return t.jsx(Hc,{toast:e})}function la({open:e,title:a,eyebrow:n,icon:i,onClose:r,footer:s,width:o=560,closeOnEscape:l=!0,dismissible:d=!0,fillHeight:u=!1,children:m}){const h=c.useRef(null),p=c.useRef(Symbol("modal")),g=c.useId(),f=c.useRef(r);f.current=r;const b=c.useRef(d);b.current=d;const x=d&&!!r;return c.useLayoutEffect(()=>{if(!e||!h.current)return;const v=document.activeElement instanceof HTMLElement?document.activeElement:null,y=h.current,T=p.current;Hr.push(T);const S=c2(y),E=()=>Array.from(y.querySelectorAll('button:not([disabled]), a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')),w=y.querySelector("[data-initial-focus]:not([disabled])")??y.querySelector("[autofocus]")??y.querySelector("input:not([disabled]), textarea:not([disabled]), select:not([disabled])")??y.querySelector('button:not([disabled]), a[href], [tabindex]:not([tabindex="-1"])');w==null||w.focus();const N=R=>{var A;if(Hr.at(-1)!==T)return;if(R.key==="Escape"&&l){if(!b.current)return;R.preventDefault(),(A=f.current)==null||A.call(f);return}if(R.key!=="Tab")return;const L=E(),I=L[0],B=L[L.length-1];!I||!B?(R.preventDefault(),y.focus()):R.shiftKey&&document.activeElement===I?(R.preventDefault(),B.focus()):!R.shiftKey&&document.activeElement===B&&(R.preventDefault(),I.focus())};return window.addEventListener("keydown",N),()=>{window.removeEventListener("keydown",N);const R=Hr.lastIndexOf(T);R>=0&&Hr.splice(R,1),S(),v==null||v.focus()}},[l,e]),e?t.jsx("div",{className:"hn-modal-overlay hn-modal-scrim",onMouseDown:v=>{x&&v.target===v.currentTarget&&(r==null||r())},children:t.jsxs("div",{ref:h,"data-testid":"modal-panel",className:u?"hn-modal-panel hn-modal-sheet hn-modal-panel--fill":"hn-modal-panel hn-modal-sheet",role:"dialog","aria-modal":"true","aria-labelledby":a?g:void 0,tabIndex:-1,style:{width:o},children:[t.jsxs("div",{className:"hn-modal-header",children:[i&&t.jsx("span",{className:"hn-modal-icon",children:t.jsx(Re,{name:i,size:17})}),t.jsxs("div",{className:"hn-grow-min",children:[n&&t.jsx("div",{className:"hn-eyebrow hn-modal-eyebrow",children:n}),a&&t.jsx("h2",{id:g,className:"hn-modal-title",children:a})]}),t.jsx("button",{type:"button",onClick:()=>{x&&(r==null||r())},disabled:!x,"aria-label":"Tutup",className:"hn-modal-close",children:t.jsx(Re,{name:"x",size:18})})]}),t.jsx("div",{"data-testid":"modal-body",className:u?"hn-modal-body hn-modal-body--fill":"hn-modal-body",children:m}),s&&t.jsx("div",{className:"hn-modal-footer",children:s})]})}):null}function oe({label:e,hint:a,error:n,tone:i="default",children:r}){const s=c.useId(),o=a?`${s}-hint`:void 0,l=n?`${s}-error`:void 0,[d,u]=c.useState([]),m=c.useCallback((x,v)=>{const y=v??`${s}-control`;u(T=>{const S=T.findIndex(E=>E.token===x);return S<0?[...T,{token:x,id:y}]:T[S].id===y?T:T.map((E,w)=>w===S?{token:x,id:y}:E)})},[s]),h=c.useCallback(x=>{u(v=>v.filter(y=>y.token!==x))},[]),p=d[0]??null,g=[l,o].filter(Boolean).join(" ")||void 0,f=!!n||i==="danger",b=c.useMemo(()=>({owner:p,describedBy:g,invalid:f,register:m,unregister:h}),[p,g,f,m,h]);return t.jsx(Bc.Provider,{value:b,children:t.jsxs("div",{className:"hn-field","data-tone":i,children:[e&&t.jsx("label",{htmlFor:p==null?void 0:p.id,className:"hn-field-label",children:e}),r,a&&t.jsx("div",{id:o,className:"hn-field-hint",children:a}),n&&t.jsx("div",{id:l,role:"alert",className:"hn-field-error",children:n})]})})}function Ma({value:e,onChange:a,rows:n=3,placeholder:i,mono:r=!1,invalid:s=!1,onFocus:o,onBlur:l,...d}){const[u,m]=c.useState(!1),h=Xo({id:d.id,describedBy:d["aria-describedby"],invalid:s||$c(d["aria-invalid"])}),p=h.invalid;return t.jsx("textarea",{...d,id:h.id,"aria-describedby":h.describedBy,"aria-invalid":p?!0:d["aria-invalid"],className:"hn-textarea-core",value:e,onChange:a,rows:n,placeholder:i,onFocus:g=>{m(!0),o==null||o(g)},onBlur:g=>{m(!1),l==null||l(g)},style:{display:"block",width:"100%",boxSizing:"border-box",resize:"vertical",fontFamily:r?"var(--font-mono)":"var(--font-ui)",fontSize:13,color:"var(--text-strong)",background:"var(--surface-card)",border:`1px solid ${p?"var(--status-err)":u?"var(--border-focus)":"var(--border-strong)"}`,borderRadius:"var(--radius-sm)",padding:"9px 11px",lineHeight:1.5,boxShadow:u?"var(--ring)":p?"none":"var(--shadow-inset)",outline:"none"}})}const hk={flex:"1 1 auto",minHeight:0,overflowY:"auto"},pk={display:"flex",flexDirection:"column",flex:"1 1 auto",minHeight:0},Ao={flex:"0 0 auto"};function xr(e,a,n){const i=Math.max(1,Math.ceil(e/Math.max(1,n))),r=Math.min(Math.max(1,a),i),s=e===0?0:(r-1)*n+1,o=Math.min(e,r*n);return{page:r,pageCount:i,from:s,to:o}}function Cl({children:e,onClick:a,disabled:n,active:i,aria:r}){const[s,o]=c.useState(!1);return t.jsx("button",{className:"hn-touch-target",onClick:n?void 0:a,disabled:n,"aria-label":r,"aria-current":i?"page":void 0,onMouseEnter:()=>o(!0),onMouseLeave:()=>o(!1),style:{minWidth:28,height:28,padding:"0 7px",borderRadius:"var(--radius-sm)",border:`1px solid ${i?"var(--brass-400)":"var(--border-hair)"}`,background:i?"var(--brass-100)":s&&!n?"var(--bone-200)":"var(--surface-card)",color:n?"var(--text-subtle)":i?"var(--brass-700)":"var(--text-body)",fontFamily:"var(--font-mono)",fontSize:12,fontWeight:i?600:400,cursor:n?"default":"pointer",opacity:n?.5:1,display:"inline-flex",alignItems:"center",justifyContent:"center"},children:e})}function g2(e,a){const n=[],i=s=>s===1||s===a||Math.abs(s-e)<=1;let r=0;for(let s=1;s<=a;s++)i(s)&&(r&&s-r>1&&n.push("…"),n.push(s),r=s);return n}function jr({page:e,pageCount:a,total:n,from:i,to:r,onPage:s,unit:o="item"}){return n===0?null:t.jsxs("div",{className:"hn-pager",children:[t.jsxs("span",{className:"hn-pager-count",children:[i,"–",r," dari ",n," ",o]}),t.jsxs("div",{className:"hn-pager-btns",children:[t.jsx(Cl,{onClick:()=>s(e-1),disabled:e<=1,aria:"Sebelumnya",children:t.jsx(Re,{name:"chevron-left",size:15})}),g2(e,a).map((l,d)=>l==="…"?t.jsx("span",{className:"hn-pager-gap",children:"…"},"e"+d):t.jsx(Cl,{onClick:()=>s(l),active:l===e,aria:"Halaman "+l,children:l},l)),t.jsx(Cl,{onClick:()=>s(e+1),disabled:e>=a,aria:"Berikutnya",children:t.jsx(Re,{name:"chevron-right",size:15})})]})]})}const k2=Object.assign,Eo=(e,a,n)=>`${e}-${a}-${n.replace(/[^A-Za-z0-9_-]/g,"_")}`,gk=c.createContext(null);function ps({value:e,children:a,className:n="",style:i}){const r=c.useContext(gk),s=!r||r.active===e;return c.createElement("div",{role:"tabpanel",id:r?Eo(r.baseId,"panel",e):void 0,"aria-labelledby":r?Eo(r.baseId,"tab",e):void 0,hidden:!s,className:`hn-tabpanel ${n}`.trim(),style:i},a)}const b2=e=>{if(getComputedStyle(e).overflowX==="visible")return{start:!1,end:!1};const a=e.scrollWidth-e.clientWidth;return{start:e.scrollLeft>1,end:a>1&&e.scrollLeft<a-1}};function kk(e){const[a,n]=c.useState({start:!1,end:!1}),i=c.useCallback(()=>{const r=e.current;if(!r)return;const s=b2(r);n(o=>o.start===s.start&&o.end===s.end?o:s)},[e]);return c.useEffect(()=>{i()}),c.useEffect(()=>{const r=e.current;if(!r)return;r.addEventListener("scroll",i,{passive:!0});const s=typeof ResizeObserver>"u"?null:new ResizeObserver(i);return s==null||s.observe(r),()=>{r.removeEventListener("scroll",i),s==null||s.disconnect()}},[e,i]),a}const Pl=24;function f2(e,a){const n=e.getBoundingClientRect(),i=a.getBoundingClientRect(),r=i.left-n.left-e.clientLeft+e.scrollLeft,s=r+i.width;(r<e.scrollLeft+Pl||s>e.scrollLeft+e.clientWidth-Pl)&&(e.scrollLeft=Math.max(0,r-Pl))}function At({tabs:e=[],value:a,defaultValue:n,onChange:i,variant:r="underline",className:s="",style:o={},children:l,...d}){const u=e.map(w=>typeof w=="string"?{value:w,label:w}:w),m=a!==void 0,[h,p]=c.useState(n??(u[0]&&u[0].value)),g=m?a:h,f=c.useId(),b=c.useRef(null),x=kk(b);c.useLayoutEffect(()=>{const w=b.current,N=w==null?void 0:w.querySelector('[role="tab"][aria-selected="true"]');w&&N&&f2(w,N)},[g]);const v=new Set(c.Children.toArray(l).flatMap(w=>c.isValidElement(w)&&w.type===ps&&w.props.value!==void 0?[w.props.value]:[])),y=w=>{m||p(w),i&&i(w)},T=(w,N)=>{var I,B;let R=N;if(w.key==="ArrowRight")R=(N+1)%u.length;else if(w.key==="ArrowLeft")R=(N-1+u.length)%u.length;else if(w.key==="Home")R=0;else if(w.key==="End")R=u.length-1;else return;w.preventDefault();const L=u[R];L&&(y(L.value),(B=(I=w.currentTarget.parentElement)==null?void 0:I.querySelectorAll('[role="tab"]')[R])==null||B.focus())},S=r==="pill",E=c.createElement("div",k2({ref:b,className:`hn-tabs ${s}`.trim(),role:"tablist","data-fade-start":x.start?"true":void 0,"data-fade-end":x.end?"true":void 0,style:{display:"inline-flex",gap:S?4:0,padding:S?4:0,background:S?"var(--bone-200)":"transparent",borderRadius:S?"var(--radius-md)":0,borderBottom:S?"none":"1px solid var(--border-hair)",...o}},d),u.map((w,N)=>{const R=w.value===g;return c.createElement("button",{key:w.value,id:Eo(f,"tab",w.value),role:"tab","aria-selected":R,tabIndex:R?0:-1,"aria-controls":v.has(w.value)?Eo(f,"panel",w.value):void 0,onClick:()=>y(w.value),onKeyDown:L=>T(L,N),style:{flex:"0 0 auto",display:"inline-flex",alignItems:"center",gap:6,padding:S?"6px 12px":"9px 14px",marginBottom:S?0:-1,border:"none",background:S&&R?"var(--surface-card)":"transparent",boxShadow:S&&R?"var(--shadow-xs)":"none",borderRadius:S?"var(--radius-sm)":0,borderBottom:S?"none":`2px solid ${R?"var(--accent)":"transparent"}`,color:R?"var(--text-strong)":"var(--text-muted)",fontFamily:"var(--font-ui)",fontSize:"var(--text-md)",fontWeight:R?"var(--weight-semibold)":"var(--weight-medium)",cursor:"pointer",transition:"var(--transition-fast)",whiteSpace:"nowrap"}},w.icon&&c.createElement(Re,{name:w.icon,size:15}),w.label,w.count!=null&&c.createElement("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--text-2xs)",color:R?"var(--brass-700)":"var(--text-subtle)",background:R?"var(--brass-100)":"var(--bone-300)",borderRadius:"var(--radius-pill)",padding:"1px 6px"}},w.count))}));return l==null?E:c.createElement(gk.Provider,{value:{baseId:f,active:g??""}},E,l)}const y2='button:not([disabled]), a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';function sn({label:e,title:a,items:n,icon:i="more-horizontal",size:r="sm",children:s}){const[o,l]=c.useState(!1),[d,u]=c.useState(0),m=c.useRef([]),h=c.useRef(null),p=c.useId(),g=c.useRef(!1),f=c.useRef(!1);if(c.useEffect(()=>{var E;f.current&&!o&&g.current&&(g.current=!1,(E=document.getElementById(p))==null||E.focus()),f.current=o},[o,p]),!n.length&&!s)return null;const b=n.flatMap((E,w)=>E.disabled?[]:[w]),x=Math.max(0,n.findIndex(E=>!E.disabled)),v=()=>{u(x),l(!0)},y=()=>{g.current=!0,l(!1)},T=E=>{var w;u(E),(w=m.current[E])==null||w.focus()},S=E=>{var N;const w=m.current.findIndex(R=>R===E.target);if(E.key==="Tab"){if(E.shiftKey&&((N=h.current)!=null&&N.querySelector(y2)))return;E.preventDefault(),E.stopPropagation(),y();return}if(E.key==="ArrowDown"||E.key==="ArrowUp"){E.preventDefault();const R=b.length;if(!R)return;const L=b.indexOf(w),I=E.key==="ArrowDown"?1:-1,B=L<0?b[I>0?0:R-1]:b[(L+I+R)%R];B!==void 0&&T(B);return}if(E.key==="Home"||E.key==="End"){E.preventDefault();const R=E.key==="Home"?b[0]:b[b.length-1];R!==void 0&&T(R);return}if(E.key.length===1&&E.key!==" "&&!E.ctrlKey&&!E.metaKey&&!E.altKey){const R=E.key.toLowerCase(),I=[...b.filter(B=>B>w),...b.filter(B=>B<=w)].find(B=>{var A;return(((A=n[B])==null?void 0:A.label)??"").trim().toLowerCase().startsWith(R)});I!==void 0&&T(I)}};return t.jsxs(t.Fragment,{children:[t.jsx(yr,{id:p,size:r,icon:i,label:e,"aria-haspopup":n.length?"menu":"dialog","aria-expanded":o,onClick:v}),o&&t.jsxs(la,{open:!0,title:a??e,icon:i,width:420,onClose:y,children:[s!=null&&t.jsx("div",{ref:h,children:s}),n.length>0&&t.jsx("div",{role:"menu","aria-label":a??e,className:"hn-overflow-menu",onKeyDown:S,children:n.map((E,w)=>{const N=E.tone==="danger";return t.jsxs("button",{ref:R=>{m.current[w]=R},type:"button",role:"menuitem",tabIndex:w===d?0:-1,disabled:E.disabled,title:E.title,"data-initial-focus":w===d?"":void 0,onFocus:()=>u(w),onClick:()=>{l(!1),E.onSelect()},className:`hn-overflow-item${N?" hn-overflow-item-danger":""}`,children:[E.icon&&t.jsx(Re,{name:E.icon,size:15}),E.label]},E.key)})})]})]})}function wr(e,a,n){const i=c.useRef(null),r=c.useRef(null),s=c.useId(),o=c.useRef(a);o.current=a,c.useLayoutEffect(()=>{if(!e||!r.current)return;const d=document.activeElement instanceof HTMLElement?document.activeElement:null,u=d&&d!==document.body?d:i.current,m=n==="menu"?'[role="menuitem"]':'button:not([disabled]), a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';return(r.current.querySelector(m)??r.current).focus(),()=>u==null?void 0:u.focus()},[n,e]),c.useEffect(()=>{if(!e)return;const d=u=>{var h,p;const m=u.target;(h=r.current)!=null&&h.contains(m)||(p=i.current)!=null&&p.contains(m)||o.current()};return document.addEventListener("pointerdown",d),()=>document.removeEventListener("pointerdown",d)},[e]);const l=c.useCallback(d=>{var p,g;if(d.key==="Escape"){d.preventDefault(),o.current();return}if(n!=="menu")return;const u=Array.from(((p=r.current)==null?void 0:p.querySelectorAll('[role="menuitem"]'))??[]);if(!u.length)return;const m=Math.max(0,u.indexOf(document.activeElement));let h=null;d.key==="ArrowDown"?h=(m+1)%u.length:d.key==="ArrowUp"?h=(m-1+u.length)%u.length:d.key==="Home"?h=0:d.key==="End"&&(h=u.length-1),h!==null&&(d.preventDefault(),(g=u[h])==null||g.focus())},[n]);return{triggerRef:i,panelRef:r,panelId:s,onKeyDown:l}}function Nm({title:e,eyebrow:a,description:n,actions:i,className:r=""}){return t.jsxs("header",{className:`hn-page-header ${r}`.trim(),children:[t.jsxs("div",{className:"hn-page-header-text",children:[a&&t.jsx("div",{className:"hn-eyebrow hn-page-eyebrow",children:a}),t.jsx("h2",{className:"hn-page-title",children:e}),n&&t.jsx("p",{className:"hn-page-description",children:n})]}),i&&t.jsx("div",{className:"hn-page-actions",children:i})]})}function v2({label:e,count:a,children:n}){const[i,r]=c.useState(!1),s=c.useCallback(()=>r(!1),[]),{triggerRef:o,panelRef:l,panelId:d,onKeyDown:u}=wr(i,s,"dialog");return t.jsxs("div",{className:"hn-filter-popover-anchor",children:[t.jsxs("button",{ref:o,type:"button",className:"hn-filter-trigger hn-touch-target","aria-haspopup":"dialog","aria-expanded":i,"aria-controls":i?d:void 0,onClick:()=>r(m=>!m),children:[t.jsx(Re,{name:"sliders",size:14}),e,a>0&&t.jsxs("span",{className:"hn-filter-count",children:[a,t.jsx("span",{className:"hn-sr-only",children:" aktif"})]})]}),i&&t.jsx("div",{ref:l,id:d,role:"dialog","aria-label":e,className:"hn-filter-popover",onKeyDown:u,children:n})]})}function x2({label:e,search:a,chips:n=[],filters:i,filtersLabel:r="Filter",onReset:s,resetLabel:o="Reset",actions:l}){const d=n.length>0||!!(a!=null&&a.value),u=!!s&&d;return t.jsxs("div",{role:a?"search":"group","aria-label":e,className:"hn-filter-bar",children:[t.jsxs("div",{className:"hn-filter-bar-row",children:[a&&t.jsx("div",{className:"hn-filter-search",children:t.jsx(Oe,{type:"search",size:"sm",leftIcon:"search","aria-label":a.label,placeholder:a.placeholder,value:a.value,onChange:m=>a.onChange(m.target.value)})}),i!=null&&t.jsx(v2,{label:r,count:n.length,children:i}),l&&t.jsx("div",{className:"hn-filter-actions",children:l})]}),(n.length>0||u)&&t.jsxs("div",{className:"hn-filter-bar-chips",children:[n.map(m=>t.jsxs("button",{type:"button",className:"hn-filter-chip",onClick:m.onRemove,"aria-label":`Hapus filter ${m.label}`,children:[t.jsx("span",{children:m.label}),t.jsx(Re,{name:"x",size:12})]},m.key)),u&&t.jsx(U,{size:"sm",variant:"ghost",onClick:s,children:o})]})]})}function Zt({label:e,children:a,className:n=""}){return t.jsx("ul",{role:"list","aria-label":e,className:`hn-row-list ${n}`.trim(),children:a})}function en({children:e,onClick:a,href:n,selected:i=!1,actions:r}){const s=!!(a||n),o=i?"true":void 0;let l;n&&!a?l=t.jsx("a",{href:n,className:"hn-row-main","aria-current":o,children:e}):s?l=t.jsx("button",{type:"button",className:"hn-row-main",onClick:a,"aria-current":o,children:e}):l=t.jsx("div",{className:"hn-row-main",children:e});const d=["hn-row",s&&"hn-row-interactive",i&&"hn-row-selected"].filter(Boolean).join(" ");return t.jsxs("li",{className:d,children:[l,r&&t.jsx("div",{className:"hn-row-actions",children:r})]})}function j2({gap:e=3,align:a,as:n="div",children:i,className:r="",style:s}){return c.createElement(n,{className:`hn-stack ${r}`.trim(),style:{gap:`var(--space-${e})`,alignItems:a,...s}},i)}const w2={start:"flex-start",center:"center",end:"flex-end",between:"space-between"};function CL({gap:e=2,align:a="center",justify:n,wrap:i=!0,as:r="div",children:s,className:o="",style:l}){return c.createElement(r,{className:`hn-inline${i?"":" hn-inline-nowrap"} ${o}`.trim(),style:{gap:`var(--space-${e})`,alignItems:a,justifyContent:n?w2[n]:void 0,...l}},s)}const S2={11:"var(--text-2xs)",12:"var(--text-xs)",13:"var(--text-sm)",14:"var(--text-md)",16:"var(--text-base)"},_2={body:"var(--text-body)",muted:"var(--text-muted)",subtle:"var(--text-subtle)",strong:"var(--text-strong)"};function PL({size:e=14,tone:a="body",as:n="span",children:i,className:r="",style:s}){return c.createElement(n,{className:`hn-text ${r}`.trim(),style:{fontSize:S2[e],color:_2[a],...s}},i)}function A2({width:e="100%",height:a=14,radius:n="sm",className:i="",style:r}){return t.jsx("span",{"aria-hidden":"true",className:`hn-skeleton hn-skeleton-r-${n} ${i}`.trim(),style:{width:e,height:a,...r}})}function bk({rows:e=3,label:a="Memuat…",rowHeight:n=44,className:i=""}){return t.jsxs("div",{role:"status","aria-live":"polite","aria-busy":"true",className:`hn-skeleton-list ${i}`.trim(),children:[t.jsx("span",{className:"hn-sr-only",children:a}),Array.from({length:e},(r,s)=>t.jsx(A2,{height:n,radius:"md",width:s%3===2?"70%":"100%"},s))]})}function E2({open:e,title:a,message:n,impact:i,eyebrow:r,confirmLabel:s="Hapus",cancelLabel:o="Batal",tone:l="danger",icon:d,busy:u=!1,requireText:m,onConfirm:h,onCancel:p}){const[g,f]=c.useState("");c.useEffect(()=>{f("")},[e,m]);const b=!!m&&g!==m,x=d??(l==="danger"?"trash-2":"help-circle"),v=l==="danger"&&!m,y=l!=="danger"&&!m;return t.jsxs(la,{open:e,title:a,eyebrow:r,width:440,icon:x,onClose:p,dismissible:!u,footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{size:"sm",variant:"secondary",onClick:p,disabled:u,"data-initial-focus":v?"true":void 0,children:o}),t.jsx(U,{size:"sm",variant:l==="danger"?"danger":"primary",leftIcon:d??(l==="danger"?"trash-2":"check"),loading:u,"data-initial-focus":y?"true":void 0,onClick:h,disabled:u||b,children:s})]}),children:[n&&t.jsx("div",{style:{fontSize:13.5,color:"var(--text-strong)",lineHeight:1.55},children:n}),!!(i!=null&&i.length)&&t.jsx("ul",{style:{margin:n?"10px 0 0":0,paddingLeft:18,fontSize:13,color:"var(--text-body)",lineHeight:1.55},children:i.map((T,S)=>t.jsx("li",{style:{marginTop:S?4:0},children:T},S))}),m&&t.jsx(Oe,{size:"sm",value:g,"aria-label":`Ketik ${m} untuk konfirmasi`,placeholder:m,disabled:u,onChange:T=>f(T.target.value),style:{marginTop:12,width:"100%"}})]})}function ot(){const[e,a]=c.useState(null),[n,i]=c.useState(!1),r=c.useRef(null),s=c.useCallback(m=>new Promise((h,p)=>{var f;(f=r.current)==null||f.settle(!1);const g={options:m,settle:h,fail:p};r.current=g,i(!1),a(g)}),[]),o=c.useCallback(()=>{const m=r.current;m&&(r.current=null,a(null),i(!1),m.settle(!1))},[]),l=c.useCallback(async()=>{const m=r.current;if(m){if(r.current=null,!m.options.run){a(null),m.settle(!0);return}i(!0);try{await m.options.run(),a(null),i(!1),m.settle(!0)}catch(h){a(null),i(!1),m.fail(h)}}},[]),d=e==null?void 0:e.options,u=t.jsx(E2,{open:!!e,busy:n,title:(d==null?void 0:d.title)??"",message:d==null?void 0:d.message,impact:d==null?void 0:d.impact,eyebrow:d==null?void 0:d.eyebrow,confirmLabel:d==null?void 0:d.confirmLabel,cancelLabel:d==null?void 0:d.cancelLabel,tone:d==null?void 0:d.tone,icon:d==null?void 0:d.icon,requireText:d==null?void 0:d.requireText,onConfirm:()=>{l()},onCancel:o});return{confirm:s,dialog:u}}const Sr="0 0 128 128",zn={fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"};function T2(){return t.jsxs("svg",{viewBox:Sr,width:"100%",height:"100%",children:[t.jsx("circle",{cx:"64",cy:"64",r:"27",...zn,strokeWidth:"2.4",opacity:"0.4"}),t.jsx("circle",{cx:"64",cy:"64",r:"40",...zn,strokeWidth:"9"}),t.jsx("circle",{cx:"64",cy:"24",r:"8.5",fill:"currentColor"})]})}function C2(){return t.jsxs("svg",{viewBox:Sr,width:"100%",height:"100%",children:[t.jsx("path",{...zn,strokeWidth:"9",d:"M32 44 H72 a12 12 0 1 0 -12 -12"}),t.jsx("path",{...zn,strokeWidth:"9",d:"M24 66 H84 a13 13 0 1 0 -13 -13"}),t.jsx("path",{...zn,strokeWidth:"9",d:"M38 88 H68 a10 10 0 1 0 -10 -10"})]})}function P2({cx:e=65,cy:a=66,turns:n=1.32,rOuter:i=41,rInner:r=5,wBase:s=21,wTip:o=2,a0:l=.15,dir:d=1,N:u=160}={}){const m=[];for(let x=0;x<=u;x++){const v=x/u,y=i+(r-i)*v,T=l+d*n*2*Math.PI*v;m.push({x:e+y*Math.sin(T),y:a+y*Math.cos(T),t:v})}const h=x=>(s+(o-s)*x)/2,p=[],g=[];for(let x=0;x<m.length;x++){const v=m[x],y=m[Math.max(0,x-1)],T=m[Math.min(m.length-1,x+1)];let S=T.x-y.x,E=T.y-y.y;const w=Math.hypot(S,E)||1;S/=w,E/=w;const N=-E,R=S,L=h(v.t);p.push({x:v.x+N*L,y:v.y+R*L}),g.push({x:v.x-N*L,y:v.y-R*L})}const f=x=>x.toFixed(2);let b="M "+f(p[0].x)+" "+f(p[0].y);for(let x=1;x<p.length;x++)b+=" L "+f(p[x].x)+" "+f(p[x].y);for(let x=g.length-1;x>=0;x--)b+=" L "+f(g[x].x)+" "+f(g[x].y);return b+=" A "+f(s/2)+" "+f(s/2)+" 0 0 1 "+f(p[0].x)+" "+f(p[0].y)+" Z",b}const M2=P2({});function I2(){return t.jsx("svg",{viewBox:Sr,width:"100%",height:"100%",children:t.jsx("path",{d:M2,fill:"currentColor",stroke:"none"})})}function N2(){return t.jsxs("svg",{viewBox:Sr,width:"100%",height:"100%",children:[t.jsx("path",{...zn,strokeWidth:"11",d:"M46 24 V102"}),t.jsx("path",{...zn,strokeWidth:"11",d:"M46 64 C 46 50 58 46 71 46 C 83 46 86 57 86 68 V 88 c 0 9 9 12 17 7"})]})}function R2(){return t.jsxs("svg",{viewBox:Sr,width:"100%",height:"100%",children:[t.jsx("path",{...zn,strokeWidth:"9",d:"M26 94 L64 42 L102 94"}),t.jsx("path",{...zn,strokeWidth:"9",d:"M52 94 L70 68",opacity:"0.4"}),t.jsx("circle",{cx:"64",cy:"34",r:"8",fill:"currentColor"})]})}const L2={cincin:T2,bayu:C2,buntut:I2,anoman:N2,dronagiri:R2};function qc({id:e,size:a=128,color:n="var(--brass-500)",style:i={}}){const r=L2[e];return t.jsx("span",{style:{display:"inline-flex",width:a,height:a,color:n,flex:"0 0 auto",...i},children:r?t.jsx(r,{}):null})}function fk({size:e=30,color:a="var(--ink-900)",weight:n=500,style:i={}}){return t.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:e,fontWeight:n,letterSpacing:"-0.02em",color:a,lineHeight:1,whiteSpace:"nowrap",...i},children:"hanoman"})}const Rd=6e4,Ld=60*Rd,yk=24*Ld,B2=7;function vk(e){if(e==null||e==="")return null;const a=e instanceof Date?e.getTime():typeof e=="number"?e:Date.parse(e);return Number.isFinite(a)?a:null}function $2(e,a){const n=new Date(e);n.setHours(0,0,0,0);const i=new Date(a);return i.setHours(0,0,0,0),Math.round((i.getTime()-n.getTime())/yk)}function xt(e,a=Date.now()){const n=vk(e);if(n===null)return"";const i=a-n;if(i<Rd)return"baru saja";if(i<Ld)return`${Math.floor(i/Rd)} menit lalu`;if(i<yk)return`${Math.floor(i/Ld)} jam lalu`;const r=$2(n,a);return r===1?"kemarin":r<B2?`${r} hari lalu`:D2(n,a)}function D2(e,a=Date.now()){const n=vk(e);if(n===null)return"";const i=new Date(n).getFullYear()===new Date(a).getFullYear();return new Intl.DateTimeFormat("id-ID",{day:"numeric",month:"short",...i?{}:{year:"numeric"}}).format(new Date(n))}const Rm=20;function O2({onClose:e,onOpen:a}){const{markRead:n}=Dc(),[i,r]=c.useState([]),[s,o]=c.useState(0),[l,d]=c.useState(1),[u,m]=c.useState(!0);c.useEffect(()=>{let p=!0;return m(!0),ne.listNotifications({page:l,limit:Rm}).then(g=>{p&&(r(g.items),o(g.total))}).catch(()=>{p&&(r([]),o(0))}).finally(()=>{p&&m(!1)}),()=>{p=!1}},[l]);const h=xr(s,l,Rm);return t.jsxs(la,{open:!0,title:"Semua notifikasi",icon:"bell",onClose:e,width:720,children:[t.jsx("div",{className:"hn-notif-archive-list",children:u&&i.length===0?t.jsx("div",{className:"hn-notif-empty",children:"memuat…"}):i.length===0?t.jsx("div",{className:"hn-notif-empty",children:"Belum ada notifikasi"}):i.map(p=>{const g=p.type==="decision";return t.jsxs("div",{className:"hn-notif-archive-row",children:[t.jsx(Re,{name:"bell",size:14,color:"var(--text-subtle)"}),t.jsx("span",{className:"hn-notif-archive-title",children:p.specId?`${p.specId} · ${p.title}`:p.title}),t.jsx("span",{className:"hn-notif-archive-time",children:xt(p.createdAt)||"—"}),a&&t.jsx("button",{onClick:()=>{n(p.id),a(p),e()},className:g?"hn-notif-open hn-notif-open--primary":"hn-notif-open",children:g?"Jawab":"Buka"})]},p.id)})}),t.jsx(jr,{page:h.page,pageCount:h.pageCount,total:s,from:h.from,to:h.to,onPage:d,unit:"notifikasi"})]})}function H2(){const{items:e,unread:a,total:n,markAllRead:i,markRead:r,clear:s,onOpen:o}=Dc(),[l,d]=c.useState(!1),[u,m]=c.useState(!1),h=c.useRef(null),p=wr(l,()=>d(!1),"menu");c.useEffect(()=>{if(!l)return;const f=b=>{h.current&&!h.current.contains(b.target)&&d(!1)};return document.addEventListener("mousedown",f),()=>document.removeEventListener("mousedown",f)},[l]);function g(){d(f=>!f)}return t.jsxs("div",{ref:h,className:"hn-notif-anchor",children:[t.jsxs("button",{ref:p.triggerRef,"aria-label":"Notifikasi","aria-haspopup":"menu","aria-controls":l?p.panelId:void 0,"aria-expanded":l,onClick:g,className:l?"hn-notif-trigger is-open":"hn-notif-trigger",children:[t.jsx(Re,{name:"bell",size:18}),a>0&&t.jsx("span",{className:"hn-notif-badge",children:a>99?"99+":a})]}),l&&t.jsxs("div",{ref:p.panelRef,id:p.panelId,role:"menu",tabIndex:-1,onKeyDown:p.onKeyDown,className:"hn-viewport-popover hn-notif-popover",children:[t.jsxs("div",{className:"hn-notif-head",children:[t.jsx("span",{className:"hn-notif-title",children:"Notifikasi"}),e.length>0&&t.jsx("button",{role:"menuitem",onClick:s,className:"hn-notif-clear",children:"Bersihkan"})]}),e.length===0?t.jsx("div",{className:"hn-notif-empty",children:"Belum ada notifikasi"}):e.map(f=>{const b=f.type==="decision",x=f.type==="ticket",v=x?"inbox":b?"git-merge":"check-circle-2",y=x?"var(--brass-500)":b?"var(--amber-600)":"var(--leaf-500)",T=x?"keluhan baru":b?"butuh keputusan":"selesai",S=b?"Jawab":x?"Lihat triase":"Buka",E=b?"hn-notif-open hn-notif-open--primary":x?"hn-notif-open hn-notif-open--ticket":"hn-notif-open";return t.jsxs("div",{className:"hn-notif-item",children:[t.jsx(Re,{name:v,size:16,color:y}),t.jsxs("div",{className:"hn-notif-text",children:[t.jsx("div",{className:"hn-notif-item-title",children:x?f.title:`${f.specId??f.sessionId} · ${f.title}`}),t.jsxs("div",{className:"hn-notif-item-meta",children:[T," · ",xt(f.createdAt)||"—"]})]}),o&&t.jsx("button",{role:"menuitem",onClick:()=>{r(f.id),o(f),d(!1)},className:E,children:S}),!f.readAt&&t.jsx("span",{className:"hn-notif-dot"})]},f.id)}),e.length>0&&t.jsxs("div",{className:"hn-notif-foot",children:[t.jsx("button",{role:"menuitem",onClick:i,className:"hn-notif-foot-btn",children:"Tandai semua dibaca"}),t.jsxs("button",{role:"menuitem",onClick:()=>{m(!0),d(!1)},className:"hn-notif-foot-btn hn-notif-foot-btn--archive",children:["Lihat semua",n>e.length?` (${n})`:""]})]})]}),u&&t.jsx(O2,{onClose:()=>m(!1),onOpen:o})]})}const qr={normal:0,warning:1,critical:2};function xk(e){return e.length?e.reduce((a,n)=>qr[n.severity]!==qr[a.severity]?qr[n.severity]>qr[a.severity]?n:a:n.usedPct>a.usedPct?n:a):null}function jk(e){return e==="critical"?{fg:"var(--status-err)",bg:"var(--status-err-tint)"}:e==="warning"?{fg:"var(--status-warn)",bg:"var(--status-warn-tint)"}:{fg:"var(--status-ok)",bg:"var(--status-ok-tint)"}}let Bd={status:"unavailable",windows:[],fetchedAt:null},Ur;const Fs=new Set;function q2(e){return Fs.add(e),Fs.size===1&&(Ur=Ii(a=>{if(a.t==="limits"){Bd=a.limits;for(const n of Fs)n()}})),()=>{Fs.delete(e),Fs.size===0&&Ur&&(Ur(),Ur=void 0)}}function wk(){return qt.useSyncExternalStore(q2,()=>Bd,()=>Bd)}let $d={status:"unavailable",windows:[],fetchedAt:null,plan:null},zr;const Gs=new Set;function U2(e){return Gs.add(e),Gs.size===1&&(zr=Ii(a=>{if(a.t==="codexLimits"){$d=a.limits;for(const n of Gs)n()}})),()=>{Gs.delete(e),Gs.size===0&&zr&&(zr(),zr=void 0)}}function Sk(){return qt.useSyncExternalStore(U2,()=>$d,()=>$d)}const Uc=767,zc=1199,_k=`(max-width: ${Uc}px)`,Ak=`(min-width: ${Uc+1}px) and (max-width: ${zc}px)`,z2=`(min-width: ${zc+1}px)`;function F2(e){return e<=Uc?"mobile":e<=zc?"tablet":"desktop"}function G2(){return typeof window>"u"?"desktop":typeof window.matchMedia!="function"?F2(window.innerWidth):window.matchMedia(_k).matches?"mobile":window.matchMedia(Ak).matches?"tablet":"desktop"}function K2(e){if(typeof window>"u"||typeof window.matchMedia!="function")return()=>{};const a=[_k,Ak,z2].map(n=>window.matchMedia(n));for(const n of a)n.addEventListener("change",e);return()=>{for(const n of a)n.removeEventListener("change",e)}}function al(){return c.useSyncExternalStore(K2,G2,()=>"desktop")}const Lm="(pointer: coarse)";function Fc(){const e=c.useCallback(n=>{if(typeof window>"u"||typeof window.matchMedia!="function")return()=>{};const i=window.matchMedia(Lm);return i.addEventListener("change",n),()=>i.removeEventListener("change",n)},[]),a=c.useCallback(()=>typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia(Lm).matches,[]);return c.useSyncExternalStore(e,a,()=>!1)}function tl({panels:e,active:a,onActiveChange:n,ariaLabel:i,splitAt:r="tablet",masterWidth:s,className:o="",style:l}){const d=al(),u=d==="desktop"||d==="tablet"&&r==="tablet",m=c.useRef(new Map),h=c.useRef({active:a,split:u}),p=s===void 0?l:{"--hn-master-width":typeof s=="number"?`${s}px`:s,...l};return c.useLayoutEffect(()=>{var b;const g=h.current.active!==a,f=h.current.split&&!u;h.current={active:a,split:u},!u&&(g||f)&&((b=m.current.get(a))==null||b.focus())},[a,u]),t.jsxs("div",{className:`hn-responsive-panels hn-responsive-panels--${r} ${o}`.trim(),"data-active-panel":a,"data-split":u?"true":"false",style:{display:"flex",flex:"1 1 auto",minWidth:0,minHeight:0,flexDirection:"column",gap:12,...p},children:[t.jsx("div",{className:"hn-panel-switcher",children:t.jsx(At,{"aria-label":i,variant:"pill",value:a,onChange:n,tabs:e.map(g=>({value:g.id,label:g.label}))})}),t.jsx("div",{className:"hn-panels-grid",style:{display:"grid",flex:"1 1 auto",minWidth:0,minHeight:0,...u&&e.length===1?{gridTemplateColumns:"minmax(0, 1fr)"}:null},children:e.map(g=>{var b;const f=u||g.id===a;return t.jsx("section",{ref:x=>{x?m.current.set(g.id,x):m.current.delete(g.id)},className:`hn-responsive-panel ${g.className??""}`.trim(),"data-panel":g.id,role:"region","aria-label":typeof g.label=="string"?g.label:g.id,"aria-hidden":f?"false":"true",tabIndex:-1,style:(b=g.className)!=null&&b.includes("hn-panel-flex")?{display:f?"flex":void 0,flexDirection:"column",minWidth:0,minHeight:0}:{minWidth:0,minHeight:0},children:g.content},g.id)})})]})}c.forwardRef(function({className:a="",...n},i){return t.jsx("div",{ref:i,className:`hn-responsive-toolbar ${a}`.trim(),...n})});const ML=c.forwardRef(function({className:a="",...n},i){return t.jsx("div",{ref:i,className:`hn-local-overflow ${a}`.trim(),...n})}),Gc=e=>e,W2=new Intl.DateTimeFormat("id-ID",{weekday:"short",day:"numeric",month:"short",hour:"2-digit",minute:"2-digit"});function V2(e,a=!1){if(!e)return"";const n=new Date(e).getTime()-Date.now(),i=Math.floor(n/36e5),r=Math.round(n%36e5/6e4),s=n<=0?"reset segera":i>=1?`reset dalam ${i} jam ${r} menit`:`reset dalam ${r} menit`;return a?`${s} · ${W2.format(new Date(e))}`:s}const Y2=Ej,To=e=>Y2[e]??"tidak diketahui";function J2({label:e,pct:a,severity:n}){const i=Math.round(a);return t.jsx("div",{role:"progressbar","aria-label":e,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":i,"aria-valuetext":`${i}% terpakai, ${To(n)}`,className:"hn-lim-meter",children:t.jsx("div",{className:"hn-lim-meter-fill",style:Gc({"--lim-fill":`${Math.max(0,Math.min(100,a))}%`})})})}function Ek({dto:e,emptyHint:a}){return e.windows.length?t.jsxs("div",{className:"hn-lim-windows",children:[e.windows.map(n=>{const i=jk(n.severity);return t.jsxs("div",{className:"hn-lim-window",style:Gc({"--lim-fg":i.fg}),children:[t.jsxs("div",{className:"hn-lim-head",children:[t.jsxs("span",{className:"hn-lim-label",children:[n.label,n.isActive?" · aktif":""]}),t.jsxs("span",{className:"hn-lim-value",children:[t.jsxs("span",{className:"hn-lim-pct",children:[n.usedPct,"%"]}),t.jsx("span",{className:"hn-lim-word",children:To(n.severity)})]})]}),t.jsx(J2,{label:n.label,pct:n.usedPct,severity:n.severity}),n.resetsAt&&t.jsx("span",{className:"hn-lim-reset",children:V2(n.resetsAt,n.key.startsWith("weekly"))})]},n.key)}),t.jsx("div",{className:"hn-lim-foot",children:e.status==="stale"?`Data lama · terakhir diperbarui ${xt(e.fetchedAt)}`:`Diperbarui ${xt(e.fetchedAt)}`})]}):t.jsx("div",{className:"hn-lim-empty",children:e.status==="unavailable"?a??"Limit belum terbaca — Claude belum dipakai atau belum login di host ini.":"Belum ada data limit."})}function Tk({title:e,dto:a,square:n=!1,emptyHint:i,eyebrow:r,footnote:s}){const o=xk(a.windows),[l,d]=c.useState(!1),u=wr(l,()=>d(!1),"dialog"),m=Fc(),h=!!o&&a.status!=="unavailable",p=h&&o?jk(o.severity):{fg:"var(--text-muted)",bg:"var(--bone-200)"},g=a.status==="stale",f=!h||!o?"belum terbaca":`${o.usedPct}% terpakai, ${To(o.severity)}${g?", data lama":""}`,b=!h||!o?"Limit —":`${o.usedPct}% · ${To(o.severity)}${g?" · lama":""}`;return t.jsxs("div",{className:"hn-lim-pill-wrap",children:[t.jsxs("button",{ref:u.triggerRef,type:"button",onClick:()=>d(x=>!x),"aria-haspopup":"dialog","aria-expanded":l,"aria-controls":l?u.panelId:void 0,"aria-label":`${e}, ${f}`,title:e,className:m?"hn-lim-pill hn-lim-pill-touch":"hn-lim-pill",style:Gc({"--lim-bg":p.bg,"--lim-fg":p.fg}),children:[t.jsx("span",{"aria-hidden":"true",className:n?"hn-lim-dot hn-lim-dot-square":"hn-lim-dot"}),b]}),l&&t.jsxs("div",{ref:u.panelRef,id:u.panelId,role:"dialog","aria-label":e,tabIndex:-1,onKeyDown:u.onKeyDown,className:"hn-viewport-popover hn-lim-popover",children:[t.jsx("div",{className:"hn-eyebrow hn-lim-eyebrow",children:r??e}),t.jsx(Ek,{dto:a,emptyHint:i}),s&&t.jsx("div",{className:"hn-lim-footnote",children:s})]})]})}function Q2(){const e=wk();return t.jsx(Tk,{title:"Limit Claude",dto:e})}function Z2(){const e=Sk();return e.status==="unavailable"||!xk(e.windows)?null:t.jsx(Tk,{title:"Limit Codex",dto:e,square:!0,emptyHint:"Limit Codex belum terbaca. Jalankan satu sesi Codex dulu.",eyebrow:`Limit Codex${e.plan?` · paket ${e.plan}`:""}`,footnote:"Dibaca dari sesi Codex terakhir. Nilainya berubah saat sesi Codex berjalan, tidak realtime."})}const X2={currentVersion:"",latestVersion:null,registry:{status:"unavailable",checkedAt:null},updateAvailable:!1,command:"",canApply:!1},eA={boot:null,restartedTo:null};let Dd=X2,Co=eA,Fr;const Ks=new Set;function Ck(e){return Ks.add(e),Ks.size===1&&(Fr=Ii(a=>{if(a.t==="update"){Dd=a.update,Co=uA(Co,a.update.currentVersion);for(const n of Ks)n()}})),()=>{Ks.delete(e),Ks.size===0&&Fr&&(Fr(),Fr=void 0)}}function aA(){return qt.useSyncExternalStore(Ck,()=>Dd,()=>Dd)}function tA(e){return e.updateAvailable?`hanoman ${e.latestVersion} tersedia — pasang lalu restart instance ini`:"Versi terpasang sudah terbaru"}function nA(e){return e.latestVersion?`Update · ${e.latestVersion}`:"Update"}function iA(e){return e.latestVersion??"Update"}const sA=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;function rA(e){return sA.test(e)&&e.split(/[-+]/)[0]!=="0.0.0"}function oA(e){return`terpasang ${e.currentVersion||"?"} · tersedia ${e.latestVersion??"?"}`}function lA(e){return e.registry.status!=="ok"?"Registry npm belum terbaca — versi tersedia tak bisa dipastikan.":e.registry.checkedAt?`Registry npm diperiksa ${new Date(e.registry.checkedAt).toLocaleString("id-ID")}.`:"Registry npm terbaca."}async function dA(e){let a;try{a=await fetch("/api/update/apply",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({confirm:e})})}catch{return{kind:"error",message:"Server tak terjangkau."}}let n={};try{n=await a.json()}catch{}const i=String(n.from??""),r=n.to??null,s=Number(n.liveSessions??0);return a.status===202?{kind:"accepted",liveSessions:s,from:i,to:r}:a.status===409&&n.error==="confirm-required"?{kind:"confirm",liveSessions:s,from:i,to:r}:{kind:"error",message:Pk(String(n.error??a.status))}}function Pk(e){return e==="unsupervised"?"Instance ini tidak dijalankan lewat `hanoman start`, jadi tak ada yang akan menghidupkannya lagi — pasang manual dengan perintah di atas.":e==="up-to-date"?"Versi terpasang ternyata sudah terkini.":`Gagal memulai update (${e}).`}function cA(e){return e<=0?"Pasang versi baru lalu jalankan ulang hanoman? Tak ada sesi yang sedang berjalan.":`${e} sesi sedang berjalan. Sesi itu tetap hidup di tmux dan terminalnya tersambung lagi sendiri. Lanjutkan?`}function uA(e,a){return a?e.boot===null?{boot:a,restartedTo:null}:a===e.boot?e.restartedTo===null?e:{boot:e.boot,restartedTo:null}:a===e.restartedTo?e:{boot:e.boot,restartedTo:a}:e}function mA(){return qt.useSyncExternalStore(Ck,()=>Co.restartedTo,()=>Co.restartedTo)}function Bm(e){return`Muat ulang · ${e}`}function hA(e){return`hanoman di server sudah diperbarui ke ${e}. Halaman ini masih menjalankan versi lama — muat ulang untuk memakainya.`}function Mk(){location.reload()}async function pA(e=gA,a=i=>new Promise(r=>setTimeout(r,i)),n={}){const i=n.intervalMs??1e3,r=n.timeoutMs??9e4,s=n.minWaitMs??3e3;let o=!1;for(let l=0;l<r;)if(await a(i),l+=i,!await e().catch(()=>!1))o=!0;else if(o||l>=s)return!0;return!1}const gA=async()=>(await fetch("/api/health",{cache:"no-store"})).ok;async function kA(e){let a;try{a=await fetch("/api/restart",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({confirm:e})})}catch{return{kind:"error",message:"Server tak terjangkau."}}let n={};try{n=await a.json()}catch{}const i=Number(n.liveSessions??0);return a.status===202?{kind:"accepted",liveSessions:i,from:"",to:null}:a.status===409&&n.error==="confirm-required"?{kind:"confirm",liveSessions:i,from:"",to:null}:{kind:"error",message:Pk(String(n.error??a.status))}}function bA(){const e=aA(),[a,n]=c.useState(!1),[i,r]=c.useState(!1),[s,o]=c.useState({t:"idle"}),[l,d]=c.useState({t:"idle"}),u=wr(a,()=>n(!1),"dialog");if(!e.updateAvailable&&!rA(e.currentVersion))return null;const m=()=>{var x;try{(x=navigator.clipboard)==null||x.writeText(e.command),r(!0),setTimeout(()=>r(!1),1500)}catch{}},h=async x=>{o({t:x?"applying":"asking"});const v=await dA(x);v.kind==="confirm"?o({t:"confirming",message:cA(v.liveSessions)}):v.kind==="accepted"?o({t:"applying"}):o({t:"failed",message:v.message})},p=async x=>{d({t:x?"applying":"asking"});const v=await kA(x);v.kind==="confirm"?d({t:"confirming",message:`Ada ${v.liveSessions} sesi berjalan. Sesi tmux tetap hidup, dashboard terputus sebentar. Mulai ulang?`}):v.kind==="accepted"?(d({t:"applying"}),pA().then(y=>{y?Mk():d({t:"failed",message:"Server belum kembali dalam 90 detik — periksa prosesnya lalu muat ulang halaman ini."})})):d({t:"failed",message:v.message})},g=e.updateAvailable?"Update tersedia":"Versi hanoman",f=e.updateAvailable?nA(e):`v${e.currentVersion}`,b=e.updateAvailable?iA(e):e.currentVersion;return t.jsxs("div",{className:"hn-upd-root",children:[t.jsxs("button",{ref:u.triggerRef,onClick:()=>n(x=>!x),"aria-haspopup":"dialog","aria-controls":a?u.panelId:void 0,"aria-expanded":a,title:g,"aria-label":`${g} · ${f}`,className:`hn-upd-pill ${e.updateAvailable?"hn-upd-pill--update":"hn-upd-pill--version"}`,children:[t.jsx(Re,{name:e.updateAvailable?"arrow-up-circle":"package",size:13,color:e.updateAvailable?"var(--brass-700)":"var(--text-subtle)"}),t.jsx("span",{className:"hn-topbar-label",children:f}),t.jsx("span",{className:"hn-topbar-label-short","aria-hidden":"true",children:b})]}),a&&t.jsxs("div",{ref:u.panelRef,id:u.panelId,role:"dialog","aria-label":g,tabIndex:-1,onKeyDown:u.onKeyDown,className:"hn-viewport-popover hn-upd-popover",children:[t.jsx("div",{className:"hn-eyebrow hn-upd-eyebrow",children:g}),t.jsx("div",{className:"hn-upd-headline",children:tA(e)}),e.updateAvailable&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"hn-upd-cmd",children:[t.jsx("code",{className:"hn-upd-code",children:e.command}),t.jsx("button",{onClick:m,title:"Salin perintah",className:"hn-upd-btn",children:i?"Tersalin":"Salin"})]}),e.canApply&&t.jsxs("div",{className:"hn-upd-block",children:[s.t==="idle"&&t.jsx("button",{onClick:()=>void h(!1),className:"hn-upd-btn hn-upd-btn--primary",children:"Pasang & mulai ulang"}),s.t==="asking"&&t.jsx("div",{className:"hn-upd-note",children:"Memeriksa sesi yang berjalan…"}),s.t==="confirming"&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"hn-upd-text hn-upd-text--gap",children:s.message}),t.jsxs("div",{className:"hn-upd-row",children:[t.jsx("button",{onClick:()=>void h(!0),className:"hn-upd-btn hn-upd-btn--primary",children:"Ya, pasang"}),t.jsx("button",{onClick:()=>o({t:"idle"}),className:"hn-upd-btn",children:"Batal"})]})]}),s.t==="applying"&&t.jsx("div",{className:"hn-upd-text",children:"Memasang dari npm lalu menjalankan ulang — dashboard tersambung lagi sendiri."}),s.t==="failed"&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"hn-upd-err",children:s.message}),t.jsx("button",{onClick:()=>o({t:"idle"}),className:"hn-upd-btn",children:"Coba lagi"})]})]})]}),t.jsx("div",{className:"hn-upd-note",children:oA(e)}),e.canApply&&t.jsxs("div",{className:"hn-upd-restart",children:[l.t==="idle"&&t.jsxs("button",{onClick:()=>void p(!1),className:"hn-upd-btn",title:"Untuk server yang macet atau troubleshooting",children:[t.jsx(Re,{name:"refresh-cw",size:12})," Mulai ulang hanoman"]}),l.t==="asking"&&t.jsx("div",{className:"hn-upd-note",children:"Memeriksa sesi yang berjalan…"}),l.t==="confirming"&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"hn-upd-text hn-upd-text--gap",children:l.message}),t.jsxs("div",{className:"hn-upd-row",children:[t.jsx("button",{onClick:()=>void p(!0),className:"hn-upd-btn hn-upd-btn--primary",children:"Ya, mulai ulang"}),t.jsx("button",{onClick:()=>d({t:"idle"}),className:"hn-upd-btn",children:"Batal"})]})]}),l.t==="applying"&&t.jsx("div",{className:"hn-upd-text",children:"Menjalankan ulang — dashboard tersambung lagi sendiri."}),l.t==="failed"&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"hn-upd-err",children:l.message}),t.jsx("button",{onClick:()=>d({t:"idle"}),className:"hn-upd-btn",children:"Coba lagi"})]})]}),!e.updateAvailable&&t.jsx("div",{className:"hn-upd-note hn-upd-note--gap",children:lA(e)})]})]})}function fA(){const e=mA();return e?t.jsxs("button",{onClick:Mk,title:hA(e),"aria-label":Bm(e),className:"hn-upd-pill hn-upd-pill--update",children:[t.jsx(Re,{name:"refresh-cw",size:13,color:"var(--brass-700)"}),t.jsx("span",{className:"hn-topbar-label",children:Bm(e)}),t.jsx("span",{className:"hn-topbar-label-short","aria-hidden":"true",children:e})]}):null}const Ik=c.createContext({user:null,logout:async()=>{}}),yA=()=>c.useContext(Ik);function vA({user:e,onLoggedOut:a,children:n}){const i=c.useCallback(async()=>{try{await ne.logout()}catch{}finally{a()}},[a]);return t.jsx(Ik.Provider,{value:{user:e,logout:i},children:n})}function xA(){const{user:e,logout:a}=yA(),[n,i]=c.useState(!1),r=c.useRef(null),s=wr(n,()=>i(!1),"menu"),{confirm:o,dialog:l}=ot();if(c.useEffect(()=>{if(!n)return;const m=h=>{r.current&&!r.current.contains(h.target)&&i(!1)};return document.addEventListener("mousedown",m),()=>document.removeEventListener("mousedown",m)},[n]),!e)return null;const d=e.email.slice(0,1).toUpperCase();async function u(){i(!1),await o({title:"Keluar dari hanoman?",message:"Anda perlu masuk lagi untuk membuka dashboard ini.",confirmLabel:"Keluar",cancelLabel:"Tetap masuk",tone:"default",icon:"log-out"})&&a()}return t.jsxs("div",{ref:r,className:"hn-account",children:[t.jsx("button",{ref:s.triggerRef,className:"hn-touch-target hn-account-trigger","aria-label":"Akun","aria-haspopup":"menu","aria-controls":n?s.panelId:void 0,"aria-expanded":n,title:e.email,onClick:()=>i(m=>!m),children:t.jsx("span",{className:"hn-account-avatar",children:d})}),n&&t.jsxs("div",{ref:s.panelRef,id:s.panelId,role:"menu",tabIndex:-1,onKeyDown:s.onKeyDown,className:"hn-viewport-popover hn-account-menu",children:[t.jsxs("div",{className:"hn-account-who",children:[t.jsx("div",{className:"hn-account-caption",children:"Masuk sebagai"}),t.jsx("div",{className:"hn-account-email",children:e.email})]}),t.jsxs("button",{role:"menuitem",className:"hn-account-item",onClick:()=>{u()},children:[t.jsx(Re,{name:"log-out",size:16,color:"var(--text-muted)"})," Keluar"]})]}),l]})}const Po="hn.ui",Kc="v1",IL=(e,a)=>a?`${e}@${a}`:e,nl=(e,a)=>`${Po}.${Kc}.${e}.${a}`,jA=e=>`${Po}.${Kc}.${e}.`,Dn=e=>typeof e=="string",Wc=e=>typeof e=="number"&&Number.isFinite(e),NL=e=>typeof e=="boolean",Nk=e=>e===null||typeof e=="string",wA=e=>Array.isArray(e)&&e.every(a=>typeof a=="string"),bi=(...e)=>a=>typeof a=="string"&&e.includes(a);function SA(e,a){return a===null?e===null:Array.isArray(a)?Array.isArray(e):typeof a=="number"?Wc(e):e===null?!1:typeof e==typeof a}function Mo(e,a,n){let i;try{i=localStorage.getItem(e)}catch{return a}if(i===null)return a;let r;try{r=JSON.parse(i)}catch{return a}return(n?n(r):SA(r,a))?r:a}function il(e,a){try{localStorage.setItem(e,JSON.stringify(a))}catch{}}function _A(){try{const e=[];for(let a=0;a<localStorage.length;a++){const n=localStorage.key(a);n!==null&&e.push(n)}return e}catch{return[]}}function Rk(e){for(const a of _A())if(e(a))try{localStorage.removeItem(a)}catch{}}const Od=new Set;function AA(e){return Od.add(e),()=>{Od.delete(e)}}function EA(e){const a=jA(e);Rk(n=>n.startsWith(a));for(const n of[...Od])n(a)}function TA(){const e=`${Po}.${Kc}.`;Rk(a=>a.startsWith(`${Po}.`)&&!a.startsWith(e))}function Da(e,a,n,i){const r=nl(e,a),s=c.useRef({initial:n,accept:i});s.current={initial:n,accept:i};const[o,l]=c.useState(()=>({key:r,value:Mo(r,n,i)}));o.key!==r&&l({key:r,value:Mo(r,s.current.initial,s.current.accept)}),c.useEffect(()=>{il(o.key,o.value)},[o]),c.useEffect(()=>AA(u=>{r.startsWith(u)&&l({key:r,value:s.current.initial})}),[r]);const d=c.useCallback(u=>{l(m=>({key:m.key,value:typeof u=="function"?u(m.value):u}))},[]);return[o.value,d]}function Lk(e,a){const n=c.useRef(e),i=c.useRef(a);i.current=a,c.useEffect(()=>{n.current!==e&&(n.current=e,i.current())},[e])}const CA=20,PA=200;function Vc(e,a,n=!0){const i=nl(e,a),[r,s]=c.useState(null),o=c.useCallback(d=>s(d),[]),l=c.useRef(!1);return c.useEffect(()=>{if(!r)return;let d=0,u=null;const m=()=>{d&&(clearTimeout(d),d=0),u!==null&&(il(i,u),u=null)},h=()=>{l.current||(u=r.scrollTop,d||(d=window.setTimeout(m,PA)))};return r.addEventListener("scroll",h),r.addEventListener("scrollend",m),()=>{r.removeEventListener("scroll",h),r.removeEventListener("scrollend",m),m()}},[r,i]),c.useEffect(()=>{if(!r||!n)return;const d=Mo(i,0);if(d<=0)return;let u=0,m=0;l.current=!0;const h=()=>{if(r.scrollTop=d,r.scrollHeight-r.clientHeight>=d||++u>=CA){l.current=!1;return}m=requestAnimationFrame(h)};return m=requestAnimationFrame(h),()=>{cancelAnimationFrame(m),l.current=!1}},[r,i,n]),o}let is={palette:!1,help:!1};const Hd=new Set;function _r(e){const a={...is,...e};if(!(a.palette===is.palette&&a.help===is.help)){is=a;for(const n of[...Hd])n()}}const Bk=()=>_r({palette:!0}),$k=()=>_r({palette:!1}),MA=()=>_r({palette:!is.palette}),IA=()=>_r({help:!0}),NA=()=>_r({help:!1}),qd=()=>is;function RA(e){return Hd.add(e),()=>{Hd.delete(e)}}function Dk(){return c.useSyncExternalStore(RA,qd,qd)}const Ok=c.createContext(null),LA=new Set(["backlog","team","prd"]);function BA(e){var a;return e.value==="all"?void 0:((a=e.projects.find(n=>n.id===e.value))==null?void 0:a.name)??e.value}function $A({scope:e}){const a=c.useMemo(()=>[{value:"all",label:"Semua project"},...e.projects.map(n=>({value:n.id,label:n.name}))],[e.projects]);return t.jsx($e,{size:"sm","aria-label":"Project aktif",className:"hn-shell-scope",value:e.value,options:a,onChange:n=>e.onChange(n.target.value)})}const DA=1e3,Hk={o:"overview",d:"dalang",p:"projects",r:"prd",b:"backlog",m:"team",q:"qa",e:"triage",j:"scheduler",l:"lead",t:"terminal",i:"ide",a:"skills",v:"vps",k:"clients",f:"docs",s:"settings"},gs={armedAt:null};function OA(e,a,n,i){const r=a.length===1?a.toLowerCase():a;if(e.armedAt!==null&&n-e.armedAt<=DA){const o=Hk[r];if(o&&i.includes(o))return{state:gs,target:o,consumed:!0};if(r!=="g")return{state:gs,consumed:!1}}return r==="g"?{state:{armedAt:n},consumed:!0}:{state:gs,consumed:!1}}function qk(e=typeof navigator<"u"?navigator:void 0){const a=`${(e==null?void 0:e.platform)??""} ${(e==null?void 0:e.userAgent)??""}`;return/mac|iphone|ipad/i.test(a)}function HA(e){return e?"⌘K":"Ctrl K"}const qA={dalang:"Buka panggung"};function UA(e,a){const n=e?"⌘":"Ctrl",i=new Map(Object.entries(Hk).map(([r,s])=>[s,r]));return[{title:"Global",rows:[{keys:[n,"K"],label:"Buka palet perintah"},{keys:["/"],label:"Fokus kotak cari (bila halaman tak punya, buka palet)"},{keys:["?"],label:"Tampilkan bantuan shortcut ini"},{keys:["Esc"],label:"Tutup dialog atau palet"}]},{title:"Pindah layar: tekan g, lalu huruf",rows:a.flatMap(r=>{const s=i.get(r.key);return s?[{keys:["g",s],label:qA[r.key]??r.label}]:[]})}]}const zA=[{key:"kerja",label:"Kerja"},{key:"otomasi",label:"Otomasi"},{key:"sistem",label:"Sistem"}],Uk=[{key:"overview",label:"Overview",icon:"layout-dashboard",group:"kerja",children:[{section:"overview",label:"Overview"}],default:"overview"},{key:"projects",label:"Projects",icon:"layout-grid",group:"kerja",children:[{section:"projects",label:"Daftar"},{section:"prd",label:"PRD"},{section:"docs",label:"Docs"},{section:"qa",label:"QA"},{section:"ide",label:"Kode"}],derived:[{section:"project",under:"projects"}],default:"projects"},{key:"backlog",label:"Backlog",icon:"list-checks",group:"kerja",children:[{section:"backlog",label:"Spec"},{section:"team",label:"Tugas manusia"}],derived:[{section:"review",under:"backlog"}],default:"backlog"},{key:"triage",label:"Triase",icon:"inbox",group:"kerja",children:[{section:"triage",label:"Triase"}],default:"triage"},{key:"sesi",label:"Sesi",icon:"terminal",group:"kerja",children:[{section:"terminal",label:"Terminal"},{section:"clients",label:"Perangkat",gate:"clients"}],default:"terminal"},{key:"otonom",label:"Otonom",icon:"calendar-clock",group:"otomasi",children:[{section:"scheduler",label:"Scheduler"},{section:"lead",label:"Lead"}],default:"scheduler"},{key:"skills",label:"Skills",icon:"sparkles",group:"sistem",children:[{section:"skills",label:"Skills"}],default:"skills"},{key:"pengaturan",label:"Pengaturan",icon:"settings",group:"sistem",children:[{section:"settings",label:"Pengaturan"},{section:"vps",label:"Server (VPS)"}],default:"settings"}];function Yc(e){if(e)return Uk.find(a=>a.children.some(n=>n.section===e)||(a.derived??[]).some(n=>n.section===e))}function zk(e){var n;const a=Yc(e);if(a)return a.children.some(i=>i.section===e)?e:(n=(a.derived??[]).find(i=>i.section===e))==null?void 0:n.under}function sl(e,a){return e.children.filter(n=>!n.gate||a[n.gate])}function FA(e,a,n){const i=new Set(sl(e,n).map(s=>s.section)),r=a[e.key];return r&&i.has(r)?r:i.has(e.default)?e.default:[...i][0]??e.default}function GA(e,a,n){let i=0;for(const r of sl(e,n))i+=Ug(a,r.section)??0;return i>0?i:void 0}const oo=[{key:"overview",label:"Overview",icon:"layout-dashboard"},{key:"dalang",label:"Dalang Hanoman",icon:"drama"},{key:"projects",label:"Projects",icon:"layout-grid"},{key:"prd",label:"PRD",icon:"scroll-text"},{key:"backlog",label:"Backlog",icon:"list-checks"},{key:"team",label:"Tim",icon:"users"},{key:"qa",label:"QA",icon:"clipboard-check"},{key:"triage",label:"Triase",icon:"inbox"},{key:"scheduler",label:"Scheduler",icon:"calendar-clock"},{key:"lead",label:"Lead",icon:"compass"},{key:"terminal",label:"Terminal",icon:"terminal"},{key:"ide",label:"IDE",icon:"code-2"},{key:"skills",label:"Skills",icon:"sparkles"},{key:"vps",label:"VPS",icon:"server"},{key:"clients",label:"Klien",icon:"monitor",gate:"clients"},{key:"docs",label:"Docs · SoT",icon:"book-open"},{key:"settings",label:"Settings",icon:"settings"}],Ml=oo.map(e=>e.key);function KA(){return t.jsx("div",{className:"hn-wordmark-stack",children:t.jsxs("div",{className:"hn-wordmark-row",children:[t.jsx("span",{className:"hn-wordmark-mark",children:t.jsx(qc,{id:"buntut",size:17,color:"#fff"})}),t.jsx("span",{className:"hn-wordmark-text",children:"hanoman"})]})})}const Jc=c.createContext(null),Fk=c.createContext(null);function WA({count:e}){return t.jsx("span",{className:"hn-nav-badge","data-testid":"nav-badge","aria-hidden":"true",children:dj(e)})}function VA({hub:e,on:a,target:n,badge:i,onNavigate:r}){const s=!!r,o=i?`${e.label}, ${i} butuh pengajuan`:e.label;return t.jsxs("button",{type:"button",className:"hn-nav-item","data-interactive":s?"true":void 0,onClick:s?()=>r(n):void 0,"aria-current":a?"page":void 0,"aria-label":o,title:o,children:[t.jsx(Re,{name:e.icon,size:17,color:a?"var(--accent-hover)":"var(--text-muted)"}),t.jsx("span",{className:"hn-nav-label",children:e.label}),i!==void 0&&t.jsx(WA,{count:i})]})}const YA=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&Object.values(e).every(a=>typeof a=="string"),Qc=c.createContext({});function JA(e){const[a,n]=c.useState({start:!1,end:!1}),i=c.useCallback(()=>{const r=e.current;if(!r)return;const s=r.scrollHeight-r.clientHeight,o={start:r.scrollTop>1,end:s>1&&r.scrollTop<s-1};n(l=>l.start===o.start&&l.end===o.end?l:o)},[e]);return c.useLayoutEffect(()=>{i()}),c.useEffect(()=>{const r=e.current;if(!r)return;r.addEventListener("scroll",i,{passive:!0});const s=typeof ResizeObserver>"u"?null:new ResizeObserver(i);return s==null||s.observe(r),()=>{r.removeEventListener("scroll",i),s==null||s.disconnect()}},[e,i]),a}const QA={position:"absolute",width:1,height:1,overflow:"hidden",clip:"rect(0 0 0 0)",whiteSpace:"nowrap"},ZA={position:"fixed",left:12,top:12,zIndex:300,padding:"8px 12px",borderRadius:"var(--radius-sm)",background:"var(--surface-card)",color:"var(--text-strong)",border:"1px solid var(--border-hair)",boxShadow:"var(--shadow-md)",fontFamily:"var(--font-ui)",fontSize:13,textDecoration:"none"};function Za({active:e,title:a,breadcrumb:n,actions:i,showSearch:r=!1,searchValue:s="",onSearchChange:o,onNavigate:l,wide:d=!1,children:u}){var ee;const[m,h]=c.useState(!1),p=c.useContext(Qc),g=c.useContext(Ok),f=!!g&&LA.has(e??""),b=f&&g?BA(g):void 0,x=c.useContext(Jc),v=Yc(e),y=zk(e),[T,S]=Da("nav","lastTab",{},YA);c.useEffect(()=>{!v||!y||T[v.key]===y||S(X=>({...X,[v.key]:y}))},[e]);const E=v?sl(v,p):[],w=v&&E.length>1?[v.label,(ee=E.find(X=>X.section===y))==null?void 0:ee.label].filter(Boolean).join(" › "):void 0,N=qk(),R=HA(N),L=Vc(`page@${e??"-"}`,"scroll"),I=al(),B=I==="mobile",A=B?void 0:w,M=c.useContext(Fk),K=g&&f||r||!!i,[O,J]=c.useState(!1),Z=c.useRef(null),H=c.useRef(null),te=c.useRef(null),ae=c.useRef(!1),F=c.useRef(null),fe=JA(F);c.useEffect(()=>{var X,ce,se;(se=(ce=(X=F.current)==null?void 0:X.querySelector('[aria-current="page"]'))==null?void 0:ce.scrollIntoView)==null||se.call(ce,{block:"nearest"})},[v==null?void 0:v.key]);const _e=c.useCallback((X=!0)=>{ae.current=X,J(!1)},[]);return c.useLayoutEffect(()=>{var X,ce;(X=Z.current)==null||X.toggleAttribute("inert",B&&!O),(ce=te.current)==null||ce.toggleAttribute("inert",B&&O)},[B,O]),c.useLayoutEffect(()=>{var X,ce;!B||!O||(ce=(X=Z.current)==null?void 0:X.querySelector("button:not([disabled])"))==null||ce.focus()},[B,O]),c.useLayoutEffect(()=>{var X;O||!ae.current||(ae.current=!1,(X=H.current)==null||X.focus())},[O]),c.useEffect(()=>{if(!B||!O)return;const X=ce=>{if(ce.key==="Escape"){ce.preventDefault(),_e();return}if(ce.key!=="Tab"||!Z.current)return;const se=Array.from(Z.current.querySelectorAll('button:not([disabled]), a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')),Ce=se[0],Te=se[se.length-1];!Ce||!Te||(ce.shiftKey&&document.activeElement===Ce?(ce.preventDefault(),Te.focus()):!ce.shiftKey&&document.activeElement===Te&&(ce.preventDefault(),Ce.focus()))};return document.addEventListener("keydown",X),()=>document.removeEventListener("keydown",X)},[_e,B,O]),c.useEffect(()=>{B||J(!1)},[B]),t.jsxs("div",{className:"hn-shell","data-layout":I,"data-nav-open":O?"true":"false",children:[t.jsx("a",{href:"#main-content",onFocus:()=>h(!0),onBlur:()=>h(!1),style:m?ZA:QA,children:"Lewati ke konten"}),B&&O&&t.jsx("button",{className:"hn-shell-backdrop",type:"button","aria-label":"Tutup navigasi",onClick:()=>_e()}),t.jsxs("aside",{ref:Z,id:"hn-primary-navigation",className:"hn-shell-sidebar","aria-hidden":B&&!O?"true":void 0,children:[t.jsx("div",{className:"hn-shell-wordmark",children:t.jsx(KA,{})}),t.jsx("nav",{ref:F,className:"hn-shell-nav","aria-label":"Navigasi utama","data-cue-start":fe.start?"true":void 0,"data-cue-end":fe.end?"true":void 0,children:zA.map(X=>t.jsxs("div",{className:"hn-nav-group",role:"group","aria-labelledby":`hn-nav-group-${X.key}`,children:[t.jsx("div",{id:`hn-nav-group-${X.key}`,className:"hn-eyebrow hn-nav-group-label",children:X.label}),Uk.filter(ce=>ce.group===X.key).map(ce=>t.jsx(VA,{hub:ce,on:(v==null?void 0:v.key)===ce.key,target:FA(ce,T,p),badge:GA(ce,x,p),onNavigate:l?se=>{l(se),B&&_e()}:void 0},ce.key))]},X.key))}),t.jsx("div",{className:"hn-shell-dock","data-pet-slot":"sidebar",children:I==="desktop"?M:null})]}),t.jsxs("div",{ref:te,className:"hn-shell-column","aria-hidden":B&&O?"true":void 0,children:[t.jsxs("header",{className:"hn-shell-topbar",children:[t.jsx("button",{ref:H,className:"hn-shell-menu",type:"button","aria-label":"Buka navigasi","aria-controls":"hn-primary-navigation","aria-expanded":O,onClick:()=>J(!0),children:t.jsx(Re,{name:"menu",size:20})}),t.jsxs("div",{className:"hn-shell-heading",children:[(A||n||b)&&t.jsxs("div",{className:"hn-shell-crumb",children:[A&&t.jsx("span",{"data-testid":"hub-crumb",children:A}),A&&(n||b)?" · ":"",n&&t.jsx("span",{children:n}),b&&t.jsxs("span",{"data-testid":"scope-crumb",children:[n||A?" · ":"","project: ",b]})]}),t.jsx("h1",{className:"hn-shell-title",children:a})]}),K&&t.jsxs("div",{className:"hn-shell-subrow",children:[g&&f&&t.jsx($A,{scope:g}),r&&t.jsx(Oe,{className:"hn-shell-search","aria-label":"Cari",placeholder:"mis. hanoman atau erp",leftIcon:"search",size:"sm",value:s,onChange:o?X=>o(X.target.value):void 0,readOnly:!o}),i]}),t.jsxs("div",{className:"hn-shell-tools",children:[t.jsxs("button",{type:"button",className:"hn-shell-cmdk","aria-label":"Cari","aria-keyshortcuts":N?"Meta+K":"Control+K",title:`Palet perintah (${R})`,onClick:()=>Bk(),children:[t.jsx(Re,{name:"search",size:16}),t.jsx("kbd",{className:"hn-kbd","aria-hidden":"true",children:R})]}),t.jsx("div",{className:"hn-topbar-extra",children:t.jsx(bA,{})}),t.jsx(fA,{}),t.jsx(H2,{}),t.jsxs("div",{className:"hn-topbar-extra",children:[t.jsx(Q2,{}),t.jsx(Z2,{})]}),t.jsx(xA,{})]})]}),t.jsx("main",{ref:L,id:"main-content",tabIndex:-1,"data-testid":"shell-main",className:"hn-shell-main",children:t.jsx("div",{className:d?"hn-shell-content hn-shell-content--wide":"hn-shell-content hn-shell-content--capped",children:u})}),t.jsx("div",{className:"hn-shell-lane","data-pet-slot":"lane",children:I==="desktop"?null:M})]})]})}const XA=["a","blockquote","br","code","del","em","h1","h2","h3","h4","h5","h6","hr","img","input","li","ol","p","pre","strong","table","tbody","td","th","thead","tr","ul"],eE=["align","alt","checked","class","disabled","href","src","start","title","type"],aE=["href","src"],tE=new Set(["http","https","mailto"]),nE=new Set(["http","https"]);function iE(e){return e.replace(/[&<>]/g,a=>({"&":"&","<":"<",">":">"})[a])}function sE(e,a){var r,s;const n=e.replace(/[\u0000-\u0020\u007f-\u009f]/g,""),i=(s=(r=/^([a-z][a-z\d+.-]*):/i.exec(n))==null?void 0:r[1])==null?void 0:s.toLowerCase();return i?(a==="href"?tE:nE).has(i):!0}function rE(e){const a=e.tagName.toLowerCase(),n=a==="ul"?new Set(["contains-task-list"]):a==="li"?new Set(["task-list-item"]):null;return e.className.split(/\s+/).filter(i=>(n==null?void 0:n.has(i))||a==="code"&&/^language-[\w-]+$/.test(i))}function oE(e){var i;const a=If.sanitize(e,{ALLOWED_TAGS:XA,ALLOWED_ATTR:eE,ALLOW_ARIA_ATTR:!1,ALLOW_DATA_ATTR:!1}),n=document.createElement("template");n.innerHTML=a;for(const r of n.content.querySelectorAll("[href], [src]"))for(const s of aE){const o=r.getAttribute(s);o!==null&&!sE(o,s)&&r.removeAttribute(s)}for(const r of n.content.querySelectorAll("[class]")){const s=rE(r);s.length?r.setAttribute("class",s.join(" ")):r.removeAttribute("class")}for(const r of n.content.querySelectorAll("input"))((i=r.getAttribute("type"))==null?void 0:i.toLowerCase())!=="checkbox"?r.remove():r.setAttribute("disabled","");return n.innerHTML}function lE(e){try{const a=Mf.parse(e||"",{gfm:!0,breaks:!1});return oE(a)}catch{return"<pre>"+iE(String(e||""))+"</pre>"}}function dE(e){return/\.json$/.test(e)?"json":/\.toml$/.test(e)?"toml":/\.ya?ml$/.test(e)?"yaml":/\.(ts|tsx|js)$/.test(e)?"ts":""}const Gk=e=>/\.md$/i.test(e);function cE(e,a){const n=/\.md$/.test(a)?e||"":"```"+dE(a)+`
|
|
918
918
|
`+(e||"")+"\n```";return lE(n)}function ws({text:e,name:a}){return t.jsx("div",{className:"hn-md",dangerouslySetInnerHTML:{__html:cE(e,a)}})}function Kk({href:e,disabled:a=!1,size:n="sm"}){return a?null:t.jsxs("div",{style:{display:"flex",gap:4},children:[t.jsx(U,{as:"a",href:e("md"),download:!0,size:n,variant:"ghost",leftIcon:"download",title:"Unduh sumber Markdown","aria-label":"Unduh .md",children:".md"}),t.jsx(U,{as:"a",href:e("pdf"),download:!0,size:n,variant:"ghost",leftIcon:"file-down",title:"Unduh sebagai PDF","aria-label":"Unduh .pdf",children:".pdf"})]})}function uE({section:e,onNavigate:a}){const n=c.useContext(Qc),i=c.useContext(Jc),r=Yc(e),s=zk(e);if(!r||!s)return null;const o=sl(r,n);return o.length<2?null:t.jsx("div",{className:"hn-section-tabs",children:t.jsx(At,{"aria-label":r.label,value:s,tabs:o.map(l=>({value:l.section,label:l.label,count:Ug(i,l.section)})),onChange:l=>{l!==e&&a(l)}})})}const mE=/[\s\-_./:·>|()[\]]/;function $m(e){return e.normalize("NFD").replace(/[̀-ͯ]/g,"").toLowerCase()}function Dm(e,a){return a===0||mE.test(e[a-1])}function hE(e,a){const n=a.indexOf(e);if(n>=0)return 1e3+(Dm(a,n)?100:0)-Math.min(n,99);let i=0,r=-2,s=-1,o=0;for(const d of e){const u=a.indexOf(d,i);if(u<0)return null;s<0&&(s=u),o+=1,u===r+1&&(o+=3),Dm(a,u)&&(o+=4),r=u,i=u+1}const l=r-s+1-e.length;return Math.max(1,o-Math.min(l,20))}function pE(e,a){const n=$m(e).trim().split(/\s+/).filter(Boolean);if(n.length===0)return 0;const i=$m(a);let r=0;for(const s of n){const o=hE(s,i);if(o===null)return null;r+=o}return r}const gE=["Riwayat","Menunggu kamu","Aksi","Pindah ke","Backlog","Project"],kE=new Set(["Menunggu kamu","Aksi","Pindah ke"]),Wk=5,bE=8;function fE(e){var r;const a=[],n=e.waiting.length,i=e.scope==="all"?"Semua project":((r=e.projects.find(s=>s.id===e.scope))==null?void 0:r.name)??e.scope;a.push({id:"action:new-spec",group:"Aksi",label:"Buat backlog baru",hint:"brief → spec",keywords:"tambah baru spec brief tugas",run:e.newSpec},{id:"action:new-project",group:"Aksi",label:"Project baru",keywords:"tambah repo codebase",run:e.newProject},{id:"action:answer",group:"Aksi",label:"Jawab sesi yang menunggu",hint:n>0?`${n} sesi`:"tidak ada sesi yang menunggu",keywords:"jawab menunggu keputusan sesi terminal",disabled:n===0,run:()=>{const s=e.waiting[0];s&&e.openSession(s.id)}},{id:"action:settings",group:"Aksi",label:"Buka pengaturan",keywords:"settings akun preferensi konfigurasi",run:()=>e.go("settings")},{id:"action:panggung",group:"Aksi",label:"Buka panggung",hint:"Dalang Hanoman",keywords:"dalang panggung orkestrasi sinematik wayang",run:()=>e.go("dalang")},{id:"action:scope",group:"Aksi",label:"Ganti project aktif",hint:i,keywords:"project scope filter",prefill:"project ",run:()=>{}},e.petOn?{id:"action:pet-hide",group:"Aksi",label:"Sembunyikan Hanoman",hint:"pet",keywords:"pet maskot hanoman sembunyi matikan tutup",run:()=>e.setPetOn(!1)}:{id:"action:pet-show",group:"Aksi",label:"Tampilkan Hanoman",hint:"pet",keywords:"pet maskot hanoman tampil nyalakan munculkan",run:()=>e.setPetOn(!0)});for(const s of e.nav)s.gate&&!e.gates[s.gate]||a.push({id:`nav:${s.key}`,group:"Pindah ke",label:s.label,hint:"halaman",keywords:s.key,run:()=>e.go(s.key)});for(const s of e.waiting)a.push({id:`wait:${s.id}`,group:"Menunggu kamu",label:`Jawab · ${s.label}`,hint:"Terminal",keywords:"jawab sesi menunggu terminal",run:()=>e.openSession(s.id)});for(const s of e.specs)a.push({id:`spec:${s.id}`,group:"Backlog",label:`${s.id} · ${s.title}`,keywords:`${s.id} spec backlog`,run:()=>e.openSpec(s.id)});a.push({id:"scope:all",group:"Project",label:"Ganti project ke Semua project",keywords:"project semua all scope",disabled:e.scope==="all",run:()=>e.setScope("all")});for(const s of e.projects){const o=e.scope===s.id;a.push({id:`scope:${s.id}`,group:"Project",label:`Ganti project ke ${s.name}`,hint:o?"sedang aktif":void 0,keywords:`project ${s.name} ${s.id} scope`,disabled:o,run:()=>e.setScope(s.id)})}return a}function yE(e,a,n=[]){const i=a.trim(),r=new Map,s=(o,l)=>{const d=r.get(o.group)??[];d.push({cmd:o,score:l}),r.set(o.group,d)};if(i){for(const o of e){const l=pE(i,`${o.label} ${o.keywords??""}`);l!==null&&s(o,l)}for(const[o,l]of r)l.sort((d,u)=>u.score-d.score),(o==="Backlog"||o==="Project")&&l.splice(bE)}else{const o=new Map(e.map(l=>[l.id,l]));for(const l of n.slice(0,Wk)){const d=o.get(l);d&&s({...d,group:"Riwayat"},0)}for(const l of e)kE.has(l.group)&&s(l,0)}return gE.flatMap(o=>{const l=r.get(o);return l&&l.length>0?[{group:o,items:l}]:[]})}function vE(e){return e.flatMap(a=>a.items.map(n=>n.cmd))}function xE(e,a){return[a,...e.filter(n=>n!==a)].slice(0,Wk)}function jE({commands:e}){const{palette:a}=Dk();return t.jsx(la,{open:a,onClose:$k,title:"Palet perintah",width:600,children:t.jsx(wE,{commands:e})})}function wE({commands:e}){const a=c.useId(),n=`${a}-list`,i=y=>`${a}-opt-${y}`,[r,s]=c.useState(""),[o,l]=c.useState(null),[d]=Da("palette","recent",[],wA),u=c.useMemo(()=>yE(e,r,d),[e,r,d]),m=c.useMemo(()=>{let y=0;return u.map((T,S)=>({group:T.group,gi:S,items:T.items.map(({cmd:E})=>({cmd:E,index:y++}))}))},[u]),h=c.useMemo(()=>vE(u),[u]),p=h.findIndex(y=>!y.disabled),g=o!==null&&h[o]?o:p,f=h[g];c.useEffect(()=>{var y,T;g>=0&&((T=(y=document.getElementById(i(g)))==null?void 0:y.scrollIntoView)==null||T.call(y,{block:"nearest"}))},[g,a]);const b=y=>{if(!y.disabled){if(y.prefill!==void 0){s(y.prefill),l(null);return}il(nl("palette","recent"),xE(d,y.id)),$k(),y.run()}},x=y=>{const T=h.length;if(!(T===0||g<0))for(let S=1;S<=T;S++){const E=(g+y*S+T*S)%T;if(!h[E].disabled){l(E);return}}},v=y=>{y.nativeEvent.isComposing||(y.key==="ArrowDown"?(y.preventDefault(),x(1)):y.key==="ArrowUp"?(y.preventDefault(),x(-1)):y.key==="Enter"&&(y.preventDefault(),f&&b(f)))};return t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"hn-palette",children:[t.jsxs("div",{className:"hn-palette-search",children:[t.jsx(Re,{name:"search",size:16,color:"var(--text-subtle)"}),t.jsx("input",{role:"combobox","aria-label":"Cari perintah, halaman, atau backlog","aria-expanded":"true","aria-controls":n,"aria-autocomplete":"list","aria-activedescendant":f?i(g):void 0,autoComplete:"off",spellCheck:!1,placeholder:"mis. backlog atau buat project",value:r,onChange:y=>{s(y.target.value),l(null)},onKeyDown:v,className:"hn-palette-input"})]}),t.jsx("div",{id:n,role:"listbox","aria-label":"Hasil perintah",className:"hn-palette-list",children:m.length===0?t.jsxs("div",{role:"status",className:"hn-palette-empty",children:["Tidak ada yang cocok dengan “",r.trim(),"”."]}):m.map(y=>{const T=`${a}-g-${y.gi}`;return t.jsxs("div",{role:"group","aria-labelledby":T,className:"hn-palette-group",children:[t.jsx("div",{id:T,className:"hn-palette-group-label",children:y.group}),y.items.map(({cmd:S,index:E})=>{const w=E===g;return t.jsxs("div",{id:i(E),role:"option","aria-selected":w,"aria-disabled":S.disabled?!0:void 0,className:`hn-palette-option${w?" is-active":""}${S.disabled?" is-disabled":""}`,onMouseMove:()=>{S.disabled||l(E)},onClick:()=>b(S),children:[t.jsx("span",{className:"hn-palette-option-label",children:S.label}),S.hint&&t.jsx("span",{className:"hn-palette-option-hint",children:S.hint})]},`${y.group}:${S.id}`)})]},y.group)})})]}),t.jsxs("div",{className:"hn-palette-foot","aria-hidden":"true",children:[t.jsxs("span",{children:[t.jsx("kbd",{children:"↑"})," ",t.jsx("kbd",{children:"↓"})," pilih"]}),t.jsxs("span",{children:[t.jsx("kbd",{children:"Enter"})," jalankan"]}),t.jsxs("span",{children:[t.jsx("kbd",{children:"Esc"})," tutup"]})]})]})}function SE({nav:e}){const{help:a}=Dk(),n=c.useMemo(()=>UA(qk(),e),[e]);return t.jsx(la,{open:a,onClose:NA,title:"Shortcut keyboard",width:560,children:t.jsx("div",{className:"hn-shortcut-help",children:n.map(i=>t.jsxs("section",{className:"hn-shortcut-section",children:[t.jsx("h3",{className:"hn-shortcut-title",children:i.title}),t.jsx("dl",{className:"hn-shortcut-list",children:i.rows.map(r=>t.jsxs("div",{className:"hn-shortcut-row",children:[t.jsx("dt",{children:r.keys.map(s=>t.jsx("kbd",{children:s},s))}),t.jsx("dd",{children:r.label})]},r.label))})]},i.title))})})}const _E='input, textarea, select, [contenteditable]:not([contenteditable="false"])',AE=".xterm";function EE(e){return e instanceof Element&&e.closest(_E)!==null}function Om(e){return e instanceof Element&&e.closest(AE)!==null}function Hm(){return document.querySelector('[aria-modal="true"]')!==null}function TE(){const e=document.querySelector(".hn-shell-search input");if(e&&!e.disabled&&!e.readOnly){e.focus();return}Bk()}function CE(e){const a=c.useRef(e);a.current=e,c.useEffect(()=>{let n=gs;const i=r=>{const s=a.current;if(!s.enabled||r.isComposing||r.defaultPrevented)return;const o=r.target,l=r.metaKey||r.ctrlKey;if(l&&!r.altKey&&r.key.toLowerCase()==="k"){if(Om(o)||!qd().palette&&Hm())return;r.preventDefault(),n=gs,MA();return}if(l||r.altKey||EE(o)||Om(o)||Hm()){n=gs;return}const d=OA(n,r.key,Date.now(),s.navKeys);if(n=d.state,d.target){r.preventDefault(),s.go(d.target);return}d.consumed||(r.key==="?"?(r.preventDefault(),IA()):r.key==="/"&&(r.preventDefault(),TE()))};return window.addEventListener("keydown",i),()=>window.removeEventListener("keydown",i)},[])}const qm={ready:"siap",sleeping:"tidur",working:"sedang bekerja",deciding:"sedang diputuskan lead",waiting:"menunggu jawabanmu",blocked:"tertahan",shipped:"baru saja selesai",review:"menunggu review","docs-updated":"dokumen baru terbit",offline:"tak terhubung"},Il={offline:"koneksi terputus",failed:"sesi gagal",blocked:"backlog tertahan dependency",waiting:"sesi menunggu jawabanmu",deciding:"sesi sedang diputuskan lead",shipped:"kabar selesai","docs-updated":"dokumen terbit",working:"sesi berjalan",review:"sesi menunggu review",ready:"backlog siap dikerjakan"},Nl=45e3,Vk=6e3,Um=30*6e4,Ud=10*6e4,Yk="hanoman.pet.hidden",Jk="hanoman.pet.roam",Qk=new Set(["done","automerge"]),Zk={connected:!0,since:0,paused:!1},Io=e=>[...e].sort((a,n)=>a.id.localeCompare(n.id)),hi=e=>e.specId??e.id,PE=(e,a)=>a.specId?e.find(n=>n.id===a.specId):void 0,ME=e=>new Date(e).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}),Xk=e=>e.reduce((a,n)=>n.createdAt>a?n.createdAt:a,""),IE=(e,a)=>`${e.filter(n=>!n.exited).map(n=>n.id).sort().join(",")}|${Xk(a)}`,rl=e=>new Set(e.filter(a=>a.stage==="done").map(a=>a.id));function Ar(e,a){const n=!!e.specId&&a.has(e.specId);return e.exited?e.exitCode?"failed":n?"review":null:e.decision&&!e.deciding?"waiting":e.deciding?"deciding":n?"review":"working"}const eb=(e,a)=>{const n=rl(a);return Io(e).filter(i=>Ar(i,n)==="waiting")},NE=(e,a)=>{const n=rl(a);return Io(e).filter(i=>Ar(i,n)==="deciding")};function RE(e){const{sessions:a,backlog:n,notifications:i,now:r}=e,s=e.connection??Zk,o=[];!s.connected&&!s.paused&&r-s.since>=Vk&&o.push({kind:"offline",pose:"offline",headline:`Tak terhubung sejak ${ME(s.since)}`,detail:"Dashboard menyambung ulang sendiri; yang tertulis di bawah adalah data terakhir.",count:1,subject:null,since:s.since,target:null,recheckAt:null});const l=rl(n),d=new Set(n.filter(L=>L.source==="audit").map(L=>L.id)),u=a.filter(L=>!L.exited),m=new Map;for(const L of Io(a)){const I=Ar(L,l);I&&m.set(I,[...m.get(I)??[],L])}const h=L=>m.get(L)??[],p=Io(n.filter(L=>{var I;return L.stage!=="done"&&(((I=L.blockedBy)==null?void 0:I.length)??0)>0})),g=(L,I,B,A,M=null)=>{var K;return{kind:L,pose:I,headline:A(B[0]),detail:((K=PE(n,B[0]))==null?void 0:K.title)??"Sesi terminal",count:B.length,subject:hi(B[0]),since:M,target:{section:"terminal",sessionId:B[0].id},recheckAt:null}},f=L=>{const I=L.map(B=>B.decisionAt?Date.parse(B.decisionAt):NaN).filter(B=>Number.isFinite(B));return I.length>0?Math.min(...I):null},b=h("failed"),x=b[0];x&&o.push({kind:"failed",pose:"blocked",headline:`${hi(x)} · sesi gagal`,detail:`Keluar dengan exit ${x.exitCode}`,count:b.length,subject:hi(x),since:null,target:{section:"terminal",sessionId:x.id},recheckAt:null});const v=p[0],y=()=>({kind:"blocked",pose:"blocked",headline:`${v.id} · tertahan dependency`,detail:`Menunggu ${(v.blockedBy??[]).map(L=>L.id).join(", ")}`,count:p.length,subject:v.id,since:null,target:{section:"backlog"},recheckAt:null});if(v&&u.length===0&&o.push(y()),h("waiting").length){const L=f(h("waiting"));o.push({...g("waiting","waiting",h("waiting"),I=>`Menunggu jawabanmu · ${hi(I)}`,L),recheckAt:L!==null&&r-L<Ud?L+Ud:null})}h("deciding").length&&o.push(g("deciding","deciding",h("deciding"),L=>`${hi(L)} · lead sedang memutuskan`));const T=i.filter(L=>Date.parse(L.createdAt)+Nl>r),S=L=>[...L].sort((I,B)=>B.createdAt.localeCompare(I.createdAt))[0],E=T.filter(L=>Qk.has(L.type)&&!(L.specId&&d.has(L.specId))),w=T.filter(L=>L.type==="done"&&!!L.specId&&d.has(L.specId)),N=S(E),R=S(w);return N&&o.push({kind:"shipped",pose:"shipped",headline:`${N.specId??"Backlog"} · selesai`,detail:N.title,count:E.length,subject:N.specId??"Backlog",since:null,target:{section:"backlog"},recheckAt:Date.parse(N.createdAt)+Nl}),R&&o.push({kind:"docs-updated",pose:"docs-updated",headline:`${R.specId??"Audit"} · dokumen terbit`,detail:R.title,count:w.length,subject:R.specId??"Audit",since:null,target:{section:"backlog"},recheckAt:Date.parse(R.createdAt)+Nl}),h("working").length&&o.push(g("working","working",h("working"),L=>`${hi(L)} · sedang berjalan`)),h("review").length&&o.push(g("review","review",h("review"),L=>`${hi(L)} · menunggu review`)),v&&u.length>0&&o.push(y()),o}const LE=(e,...a)=>{const n=a.filter(i=>i!==null&&i>e);return n.length>0?Math.min(...n):null};function BE(e){const{backlog:a,now:n,quietSince:i}=e,r=e.connection??Zk,s=RE(e),o=a.filter(g=>{var f;return g.stage!=="done"&&(((f=g.blockedBy)==null?void 0:f.length)??0)===0}),l=i!==void 0&&n-i>=Um,d={kind:"ready",pose:l?"sleeping":"ready",headline:l?"Tidur — tak ada kabar 30 menit terakhir":o.length>0?`${o.length} backlog siap dikerjakan`:"Tidak ada pekerjaan siap",detail:l?"Bangun sendiri begitu ada sesi atau notifikasi baru.":"Tak ada sesi yang berjalan",count:1,subject:null,since:null,target:{section:"backlog"},recheckAt:null},u=s.length>0?s:[d],m=u[0],h=!r.connected&&!r.paused?r.since+Vk:null,p=s.length===0&&i!==void 0&&!l?i+Um:null;return{...m,recheckAt:LE(n,m.recheckAt,h,p),conditions:u}}function $E(){try{return localStorage.getItem(Yk)==="1"}catch{return!1}}function DE(e){try{localStorage.setItem(Yk,e?"1":"0")}catch{}}function OE(){try{return localStorage.getItem(Jk)!=="0"}catch{return!0}}function HE(e){try{localStorage.setItem(Jk,e?"1":"0")}catch{}}function qE({screen:e,active:a,onReset:n,label:i="Reset tampilan"}){return t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[a>0&&t.jsxs(ra,{tone:"warn",size:"sm",icon:"filter",children:[a," filter aktif"]}),t.jsx(U,{size:"sm",variant:"ghost",leftIcon:"rotate-ccw",disabled:a===0,onClick:()=>{EA(e),n==null||n()},children:i})]})}const ab=nl("pet","enabled"),UE=e=>e===null||typeof e=="boolean";let zd;const Fd=new Set;function zE(){return zd!==void 0?zd:Mo(ab,null,UE)}function FE(e){zd=e,il(ab,e);for(const a of[...Fd])a()}function GE(e){return Fd.add(e),()=>{Fd.delete(e)}}function KE(e,a){return e??a==="desktop"}function tb(){return[c.useSyncExternalStore(GE,zE,()=>null),FE]}function WE(e){return!e.enabled||e.liveAgentCount>=e.maxConcurrent||e.loadStatus==="unavailable"||e.loadPerCore!==null&&e.loadPerCore>e.maxLoadPerCore}function VE(e,a){var o;const n=new Map(e.devices.map(l=>[l.deviceId,l])),i=[cn,...a.map(l=>l.deviceId),...e.devices.map(l=>l.deviceId).filter(l=>l!==cn&&!a.some(d=>d.deviceId===l))],r=new Set,s=[];for(const l of i){if(r.has(l))continue;r.add(l);const d=n.get(l),u=(d==null?void 0:d.name)??((o=a.find(m=>m.deviceId===l))==null?void 0:o.name)??l;if(!d){s.push({deviceId:l,name:u,eligible:!1,reason:"offline"});continue}if(!d.online){s.push({deviceId:l,name:d.name,eligible:!1,reason:"offline"});continue}if(l!==cn){if(!d.control){s.push({deviceId:l,name:d.name,eligible:!1,reason:"control-off"});continue}if(d.control.state==="protocol-mismatch"){s.push({deviceId:l,name:d.name,eligible:!1,reason:"protocol-mismatch"});continue}if(!d.control.capabilities.includes("sessions:spawn")){s.push({deviceId:l,name:d.name,eligible:!1,reason:"no-spawn"});continue}}if(d.capacity&&WE(d.capacity)){s.push({deviceId:l,name:d.name,eligible:!1,reason:"capacity-full"});continue}s.push({deviceId:l,name:d.name,eligible:!0})}return s}function YE(e){return e==="codex"?kn:ys}function JE(e){return e==="codex"?kn:Yp()}function QE(e,a){return Qp(YE(e),a)}function nb(e,a){return e==="codex"?yv(a):Jp(a)}function ZE(e,a){const n=e[a];return{model:n.model,effort:a==="codex"?Jo(n.model,n.effort):Vo(n.model,n.effort)}}function XE(){const[e,a]=c.useState(null),[n,i]=c.useState(!1);function r(d,u,m){const h=d instanceof ha&&d.status===409?vg.safeParse(d.detail):null;return h!=null&&h.success?(a({title:u,rejection:h.data,retry:m}),!0):!1}async function s(d){if(!e||n)return;const u=e;a(null),i(!0);try{await u.retry(d)}finally{i(!1)}}const o=e==null?void 0:e.rejection.admission,l=e&&o&&t.jsx(la,{open:!0,onClose:()=>a(null),icon:"play",eyebrow:e.title,title:"Peluncuran ditolak",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",disabled:n,onClick:()=>a(null),children:"Batal"}),t.jsx(U,{disabled:n,onClick:()=>void s(),children:"Coba lagi"}),t.jsx(U,{variant:"danger",leftIcon:"lock",disabled:n,onClick:()=>void s(!0),children:"Mulai tetap"})]}),children:t.jsxs("div",{role:"alert",style:{fontSize:"var(--text-sm)",lineHeight:1.6,color:"var(--text-strong)"},children:[t.jsx("b",{children:e.rejection.error}),t.jsxs("div",{children:[o.liveCount," sesi hidup · ",o.liveAgentCount," agen terstruktur · cap ",o.maxConcurrent]}),t.jsxs("div",{children:["Load per core: ",o.loadStatus==="available"&&o.loadPerCore!==null?o.loadPerCore.toFixed(2):"tidak tersedia",o.loadStatus==="unsupported"?" (tidak didukung platform)":""," · ambang ",o.maxLoadPerCore]}),t.jsxs("div",{children:["Memori tersedia: ",o.memStatus==="available"&&o.memAvailablePct!==null?`${o.memAvailablePct.toFixed(0)}%`:"tidak tersedia"," · ambang ",o.minMemAvailablePct,"%"]}),t.jsx("p",{children:"Mulai tetap melewati cap sesi dan pemeriksaan beban host, serta dependency bila ada. Pilihan sesi dan konteks pekerjaan tetap sama."})]})});return{offerRetry:r,dialog:l}}const eT=["image/png","image/jpeg","image/webp","application/pdf","text/markdown","text/plain","application/json","text/csv",".png",".jpg",".jpeg",".webp",".pdf",".md",".txt",".log",".json",".csv"].join(","),ib=e=>e.startsWith("image/"),sb=e=>e==="application/pdf"?"file-text":e==="text/csv"?"table":"file",rb=e=>e>=1024*1024?`${(e/1024/1024).toFixed(1)} MB`:e>=1024?`${Math.round(e/1024)} KB`:`${e} B`;function ob({children:e,onFiles:a}){const[n,i]=c.useState(!1),r=c.useRef(null);return t.jsxs("div",{"data-dropzone":!0,className:"hn-att-drop","data-over":n?"true":"false",onDragOver:s=>{s.preventDefault(),i(!0)},onDragLeave:()=>i(!1),onDrop:s=>{var l;s.preventDefault(),i(!1);const o=Array.from(((l=s.dataTransfer)==null?void 0:l.files)??[]);o.length&&a(o)},children:[t.jsx("input",{ref:r,type:"file",multiple:!0,accept:eT,className:"hn-att-input","aria-label":"Pilih lampiran",onChange:s=>{const o=Array.from(s.target.files??[]);s.target.value="",o.length&&a(o)}}),t.jsxs("div",{className:"hn-att-row",children:[t.jsx(Re,{name:"paperclip",size:14}),t.jsx("span",{className:"hn-att-hint",children:"Seret berkas ke sini — gambar, .md, .txt, .log, .json, .csv, .pdf"}),t.jsx("span",{className:"hn-grow"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"upload",onClick:()=>{var s;return(s=r.current)==null?void 0:s.click()},children:"Pilih berkas"})]}),e]})}function aT({files:e,onChange:a}){return t.jsx(ob,{onFiles:n=>a([...e,...n]),children:e.length>0&&t.jsx("div",{className:"hn-att-list",children:e.map((n,i)=>t.jsxs("div",{className:"hn-att-card",children:[t.jsx(Re,{name:ib(n.type)?"image":sb(n.type),size:16}),t.jsx("span",{className:"hn-att-name",children:n.name}),t.jsx("span",{className:"hn-att-meta",children:rb(n.size)}),t.jsx(yr,{size:"sm",icon:"x",label:`Buang ${n.name}`,onClick:()=>a(e.filter((r,s)=>s!==i))})]},`${n.name}-${i}`))})})}function tT({specId:e,onToast:a}){const[n,i]=c.useState([]),[r,s]=c.useState(!1),{confirm:o,dialog:l}=ot(),d=c.useCallback(async()=>{var p;const h=await((p=ne.listSpecAttachments)==null?void 0:p.call(ne,e).catch(()=>null));Array.isArray(h==null?void 0:h.attachments)&&i(h.attachments)},[e]);c.useEffect(()=>{d()},[d]);async function u(h){s(!0);try{const p=await ne.uploadSpecAttachments(e,h);p.rejected.length&&a(`${p.rejected.length} berkas ditolak: ${p.rejected.map(g=>g.filename).join(", ")}`,"warn"),p.saved.length&&a(`${p.saved.length} lampiran ditambahkan`,"ok"),await d()}catch(p){a(ba("mengunggah lampiran",p),"err")}finally{s(!1)}}async function m(h){try{await o({title:`Hapus lampiran ${h.filename}?`,impact:["Berkas dihapus dari disk dan tak bisa dikembalikan.","Fase sesi berikutnya tak lagi membaca lampiran ini."],confirmLabel:"Hapus lampiran",tone:"danger",icon:"trash-2",run:()=>ne.deleteSpecAttachment(e,h.id)})&&await d()}catch(p){a(ba("menghapus lampiran",p),"err")}}return t.jsxs("div",{className:"hn-att-panel",children:[t.jsx("div",{className:"hn-eyebrow hn-att-eyebrow",children:"Lampiran"}),t.jsx(ob,{onFiles:h=>void u(h),children:n.length>0&&t.jsx("div",{className:"hn-att-list",children:n.map(h=>t.jsxs("div",{className:"hn-att-card",children:[ib(h.mimeType)?t.jsx("img",{src:C.specAttachment(e,h.id),alt:h.filename,className:"hn-att-thumb"}):t.jsx(Re,{name:sb(h.mimeType),size:16}),t.jsx("span",{className:"hn-att-name",children:h.filename}),t.jsx("span",{className:"hn-att-meta",children:rb(h.size)}),t.jsx("a",{href:C.specAttachment(e,h.id),download:h.filename,"aria-label":`Unduh ${h.filename}`,title:`Unduh ${h.filename}`,className:"hn-att-link",children:t.jsx(Re,{name:"download",size:15})}),t.jsx(yr,{size:"sm",icon:"trash-2",disabled:r,label:`Hapus lampiran ${h.filename}`,onClick:()=>void m(h)})]},h.id))})}),l]})}const Zc=e=>{var a,n;return e?e===fc?"warisi orchestrator":((a=Wo(e))==null?void 0:a.label)??((n=kn.find(i=>i.id===e))==null?void 0:n.label)??e:""};function RL(e){const a=Math.max(0,Math.round(e/1e3));return a>=60?`${Math.floor(a/60)}m${String(a%60).padStart(2,"0")}s`:`${a}s`}function nT(e){var n;if(e.state==="skipped")return"skipped";const a=(n=e.agent)==null?void 0:n.status;return a==="abandoned"?"abandoned":a==="interrupted"?"failed":e.state==="done"?"done":a==="running"||e.state==="active"?"running":"pending"}const iT=Mj;function LL(e,a){const n=e.agent,i=[iT[nT(e)],Zc(n==null?void 0:n.model),(n==null?void 0:n.effort)??"",a,n&&n.attempts>1?`percobaan ${n.attempts}`:"",(n==null?void 0:n.evidence)==="missing"?"bukti subagent tak diterima":""].filter(Boolean);return`Fase ${e.name}: ${i.join(" · ")}`}const Ws={fontSize:12,lineHeight:1.5,marginBottom:12,color:"var(--text-muted)"};function sT({flow:e,agent:a,model:n,effort:i,orchestration:r,codexVersion:s,loading:o,phaseOverrides:l,onPhaseOverridesChange:d,loadError:u,remoteTarget:m}){if(o)return t.jsx("div",{"data-testid":"phase-plan-preview",style:Ws,children:"Memuat rencana fase…"});const h=m?t.jsxs("div",{"data-testid":"phase-plan-remote-note",style:Ws,children:["Sesi lahir di ",t.jsx("b",{children:m}),": rencana fase final ditentukan Setting device itu (orkestrasi, model & effort, versi codex). Pratinjau ini memakai Setting hub ini; override fase ikut dikirim, tetapi bisa diabaikan device versi lama."]}):null;if(u)return t.jsxs(t.Fragment,{children:[h,t.jsx("div",{"data-testid":"phase-plan-preview",role:"alert",style:Ws,children:"Gagal memuat Setting — rencana fase tak bisa dipratinjau. Sesi tetap memakai Setting server saat lahir; tutup lalu buka lagi modal ini untuk mencoba ulang."})]});const p=(r??bc)[e];if((p==null?void 0:p.enabled)===!1)return t.jsxs(t.Fragment,{children:[h,t.jsx("div",{"data-testid":"phase-plan-preview",style:Ws,children:"Orkestrasi mati untuk flow ini — sesi tunggal."})]});const g=a==="claude"||Cv(s),f=v=>Pv({flow:e,runtime:a,orchestration:r,orchestrator:{model:n,effort:i},phaseOverrides:v,nativeAgents:g}),b=f(l),x=(v,y)=>{var E,w;const T={...l??{}},S={...T[v]??{}};return delete S[y],Object.keys(S).length?T[v]=S:delete T[v],((w=(E=f(T))==null?void 0:E.phases.find(N=>N.phase===v))==null?void 0:w[y])??""};return b?t.jsxs(t.Fragment,{children:[h,t.jsxs("div",{"data-testid":"phase-plan-preview",style:{marginBottom:12},children:[t.jsx("div",{style:{fontSize:12,fontWeight:600,marginBottom:4},children:"Fase — dikerjakan subagent"}),t.jsx("ul",{style:{margin:0,paddingLeft:16,fontSize:12,lineHeight:1.6,fontFamily:"var(--font-mono)"},children:b.phases.map(v=>{var O;const y=(O=p==null?void 0:p[a])==null?void 0:O[v.phase],T=l==null?void 0:l[v.phase],S=!(y!=null&&y.model),E=!(y!=null&&y.effort),w=T!=null&&T.model?"override":S?"warisi":"",N=T!=null&&T.effort?"override":E?"warisi":"",R=w&&w===N?[w==="override"?"override sesi":"warisi"]:[w&&`model ${w}`,N&&`effort ${N}`].filter(Boolean),L=R.length?` (${R.join(" · ")})`:"",I=y!=null&&y.model?"Settings":"orchestrator",B=y!=null&&y.effort?"Settings":"orchestrator",A=nb(a,v.model),M=[...T!=null&&T.effort&&!A.includes(T.effort)?[{value:T.effort,label:`${T.effort} (dikoersi → ${v.effort})`}]:[],...A.map(J=>({value:J,label:J}))],K=(J,Z)=>{if(!d)return;const H={...(l==null?void 0:l[v.phase])??{}};Z?H[J]=Z:delete H[J];const te=H.model??(y==null?void 0:y.model)??n;J==="model"&&H.effort&&(H.effort=a==="codex"?Jo(te,H.effort):Vo(te,H.effort));const ae={...l??{}};Object.keys(H).length?ae[v.phase]=H:delete ae[v.phase],d(ae)};return t.jsxs("li",{style:{overflowWrap:"anywhere",marginBottom:d?8:0},children:[t.jsxs("div",{children:[v.phase," · ",Zc(v.model)," · ",v.effort,L]}),d&&t.jsxs("div",{style:{display:"grid",gridTemplateColumns:"minmax(0, 1fr) minmax(0, .65fr)",gap:6,marginTop:4},children:[t.jsx($e,{size:"sm","aria-label":`Model subagent ${v.phase}`,value:(T==null?void 0:T.model)??"",onChange:J=>K("model",J.target.value),style:zm,options:[{value:"",label:rT(I,x(v.phase,"model"))},...Qp(JE(a),(T==null?void 0:T.model)??"")]}),t.jsx($e,{size:"sm","aria-label":`Effort subagent ${v.phase}`,value:(T==null?void 0:T.effort)??"",onChange:J=>K("effort",J.target.value),style:zm,options:[{value:"",label:`Warisi ${B} · ${x(v.phase,"effort")}`},...M]})]})]},v.phase)})})]})]}):t.jsxs(t.Fragment,{children:[h,t.jsxs("div",{"data-testid":"phase-plan-preview",style:Ws,children:["Codex CLI ",s??"tak terdeteksi"," belum mendukung subagent native (butuh ≥"," ",ig,") — sesi tunggal."]})]})}const zm={width:"100%",minWidth:0},rT=(e,a)=>!a||a===fc?`Warisi ${e}`:`Warisi ${e} · ${Zc(a)}`,oT="~/.hanoman/setup.token";function lT(e){var i,r,s,o;const a=(i=e==null?void 0:e.error)==null?void 0:i.fieldErrors;if(!a)return null;const n=[];return(r=a.email)!=null&&r.length&&n.push("Format email belum valid."),(s=a.password)!=null&&s.length&&n.push("Password minimal 8 karakter."),(o=a.setupToken)!=null&&o.length&&n.push("Setup token belum diisi."),n.length>0?n.join(" "):null}function dT(e,a){if(e instanceof ha){if(a){if(e.status===409)return"Akun sudah ada. Silakan masuk.";if(e.status===429)return"Terlalu banyak percobaan membuat akun. Tunggu sebentar, lalu coba lagi.";if(e.status===403)return"Setup token salah. Salin ulang isinya dari berkas setup.token di host server.";if(e.status===400)return lT(e.detail)??"Data akun belum valid. Periksa email dan password, lalu coba lagi."}else{if(e.status===401)return"Email atau password salah.";if(e.status===429)return"Terlalu banyak percobaan masuk. Tunggu sebentar, lalu coba lagi."}return ba(a?"membuat akun":"masuk",e)}return"Tidak bisa terhubung ke server. Periksa koneksi, lalu coba lagi."}function cT({needsSetup:e,setupTokenRequired:a=!1,setupTokenPath:n,setupStep:i,onDone:r}){const[s,o]=c.useState(""),[l,d]=c.useState(""),[u,m]=c.useState(""),[h,p]=c.useState(!1),[g,f]=c.useState(""),b=e&&a,x=/\S+@\S+\.\S+/.test(s),v=e?8:1,y=x&&l.length>=v&&(!b||u.trim().length>0),T=x?l.length<v?e?"Password minimal 8 karakter.":"Isi password.":b&&!u.trim()?"Isi setup token dari host server.":null:"Isi email yang valid.";async function S(){if(!(!y||h)){p(!0),f("");try{const{user:w}=await(e?ne.setup(b?{email:s,password:l,setupToken:u.trim()}:{email:s,password:l}):ne.login({email:s,password:l}));r(w)}catch(w){f(dT(w,e)),p(!1)}}}const E=e?i?`hanoman · setup ${i}/2`:"hanoman · setup":"hanoman · masuk";return t.jsx("div",{"data-testid":"auth-scroll",className:"hn-dynamic-viewport",style:{minHeight:"100dvh",height:"100dvh",display:"flex",overflowY:"auto",background:"var(--bone-100)",boxSizing:"border-box",padding:"max(24px, var(--safe-top)) max(16px, var(--safe-right)) max(24px, var(--safe-bottom)) max(16px, var(--safe-left))"},children:t.jsxs("div",{className:"hn-auth-wrap",children:[t.jsx("div",{className:"hn-auth-mark",children:t.jsx(fk,{})}),t.jsxs(Sa,{eyebrow:E,title:e?"Buat akun pertama":"Masuk",children:[e&&t.jsx(rk,{id:"PST-001",priority:!0,decorative:!0,className:"hn-auth-illus"}),t.jsx("p",{className:"hn-auth-lead",children:e?"Akun pertama ini yang bisa mengundang orang lain ke hanoman.":"Masuk dengan email dan password akun Anda."}),t.jsxs("form",{className:"hn-auth-form",onSubmit:w=>{w.preventDefault(),S()},children:[t.jsx(oe,{label:"Email",children:t.jsx(Oe,{type:"email",size:"lg",autoComplete:e?"email":"username",value:s,placeholder:"mis. kamu@nafanesia.id",className:"hn-auth-input",onChange:w=>o(w.target.value)})}),t.jsx(oe,{label:"Password",hint:e?"Minimal 8 karakter.":void 0,children:t.jsx(Oe,{type:"password",size:"lg",autoComplete:e?"new-password":"current-password",value:l,placeholder:"••••••••",className:"hn-auth-input",onChange:w=>d(w.target.value)})}),b&&t.jsx(oe,{label:"Setup token",hint:`Ada di berkas ${n??oT} pada komputer tempat hanoman berjalan. Salin isinya ke sini.`,children:t.jsx(Oe,{type:"password",size:"lg",autoComplete:"off",value:u,placeholder:"••••••••",className:"hn-auth-input",onChange:w=>m(w.target.value)})}),g&&t.jsx("div",{role:"alert",className:"hn-auth-error",children:g}),!y&&T&&t.jsx("p",{id:"auth-block-reason",className:"hn-auth-reason",children:T}),t.jsx(U,{type:"submit",size:"lg",leftIcon:e?"user-plus":"log-in",disabled:!y||h,loading:h,fullWidth:!0,className:"hn-auth-submit",children:h?"Memproses…":e?"Buat akun & masuk":"Masuk"})]})]})]})})}function uT({status:e,onDone:a,onCancel:n}){const i=e.needed,[r,s]=c.useState(i?"local":e.deployment),[o,l]=c.useState(e.hardening),[d,u]=c.useState(!1),[m,h]=c.useState(!1),[p,g]=c.useState(""),f=e.prerequisites.filter(w=>!w.ok),b=e.hardeningLocked||!o&&f.length>0,x=r==="public"&&!o,v=!m&&(!x||d),y=m?null:x&&!d?"Centang pernyataan risiko untuk melanjutkan tanpa hardening.":null;function T(w){s(w),!e.hardeningLocked&&(w==="public"&&f.length===0&&l(!0),w==="local"&&l(!1))}async function S(){if(v){h(!0),g("");try{await ne.applySetup({deployment:r,hardening:o,...x?{acknowledgedUnhardened:!0}:{}}),a()}catch(w){g(ba("menyimpan setup",w)),h(!1)}}}const E=t.jsxs(t.Fragment,{children:[t.jsx("p",{children:"Hardening memperketat sesi agen: sesi berjalan di dalam kontainer tanpa hak root, lalu lintas keluar lewat proxy, dan setiap upload diperiksa pemindai. Tanpa hardening, sesi agen berjalan langsung di mesin ini dan satu-satunya penghalangnya adalah password akun."}),t.jsxs("label",{className:"hn-choice-target hn-setup-check",children:[t.jsx("input",{type:"checkbox",checked:o,disabled:b,onChange:w=>l(w.target.checked),"aria-describedby":"hardening-note"}),"Aktifkan hardening"]}),t.jsx("div",{id:"hardening-note",className:"hn-setup-hardening-note",children:e.hardeningLocked?"Hardening dipasang lewat env di host ini — dashboard tidak bisa mematikannya.":f.length>0?`Belum bisa dinyalakan: selesaikan prasyarat yang belum lengkap (${f.map(w=>w.label).join(", ")}).`:"Semua prasyarat lengkap."}),t.jsx("ul",{className:"hn-setup-prereq",children:e.prerequisites.map(w=>t.jsxs("li",{"data-ok":w.ok?"true":"false",children:[t.jsx("strong",{children:w.ok?"Lengkap":"Belum"})," · ",w.label,w.detail?` — ${w.detail}`:""]},w.id))})]});return t.jsx("div",{className:"hn-dynamic-viewport hn-setup-root",children:t.jsxs("div",{className:"hn-setup-wrap",children:[t.jsx("div",{className:"hn-auth-mark",children:t.jsx(fk,{})}),t.jsx(Sa,{eyebrow:i?"hanoman · setup 1/2":"hanoman · setup",title:"Instance ini untuk apa?",children:t.jsxs("div",{className:"hn-setup-card",children:[i&&t.jsx(rk,{id:"PST-001",decorative:!0,className:"hn-setup-illus"}),t.jsx("p",{className:"hn-setup-lead",children:"Pilihan ini hanya mengubah default dan peringatan. Tidak ada yang dipaksakan."}),t.jsxs(vr,{"aria-label":"Peruntukan",value:r,onChange:w=>T(w),children:[t.jsx(Mi,{value:"local",label:"Perangkat ini",description:"Hanya saya yang memakai instance ini. Ini pilihan awal."}),t.jsx(Mi,{value:"public",label:"Diakses orang lain",description:"Instance terbuka untuk orang lain. Hardening disarankan."})]}),x&&t.jsxs("div",{className:"hn-setup-warn",role:"note",children:[t.jsx("p",{children:"Instance terbuka tanpa hardening: sesi agen berjalan langsung di mesin ini. Nyalakan hardening di Lanjutan, atau akui risikonya di bawah."}),t.jsxs("label",{className:"hn-choice-target hn-setup-check",children:[t.jsx("input",{type:"checkbox","aria-label":"Saya paham risikonya",checked:d,onChange:w=>u(w.target.checked)}),"Saya paham instance ini menjalankan perintah penuh di mesin ini, dan tanpa hardening satu-satunya penghalangnya adalah password akun hanoman."]})]}),t.jsxs("details",{className:"hn-setup-advanced",children:[t.jsx("summary",{children:"Lanjutan · keamanan (hardening)"}),t.jsx("div",{className:"hn-setup-advanced-body",children:E})]}),p&&t.jsx("div",{role:"alert",className:"hn-auth-error",children:p}),y&&t.jsx("p",{className:"hn-auth-reason",children:y}),t.jsxs("div",{className:"hn-setup-foot",children:[n&&t.jsx(U,{variant:"ghost",onClick:n,children:"Batal"}),t.jsx(U,{onClick:S,disabled:!v,loading:m,children:m?"Menyimpan…":i?"Simpan & lanjut":"Simpan"})]})]})})]})})}function mT({status:e}){return!e||e.deployment!=="public"||e.hardening?null:t.jsx("div",{"data-testid":"unhardened-banner",className:"hn-unhardened",children:"Instance ini terbuka tanpa hardening — sesi agen berjalan langsung di mesin ini."})}async function Jn(e){const a=await fetch(e,{headers:{"content-type":"application/json"}});if(!a.ok)throw new ha(a.status,`GET ${e} → ${a.status}`);return a.json()}async function Fm(e,a){const n=await fetch(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(a)});if(!n.ok)throw new ha(n.status,`POST ${e} → ${n.status}`);return n.json()}const ln=e=>`/api/portal/projects/${encodeURIComponent(e)}`,Gr=({page:e,limit:a})=>`?page=${e}&limit=${a}`,It={listProjects:()=>Jn("/api/portal/projects"),listBacklog:(e,a)=>Jn(`${ln(e)}/backlog${Gr(a)}`),getSpec:(e,a)=>Jn(`${ln(e)}/backlog/${encodeURIComponent(a)}`),listTickets:(e,a)=>Jn(`${ln(e)}/tickets${Gr(a)}`),getTicket:(e,a)=>Jn(`${ln(e)}/tickets/${encodeURIComponent(a)}`),createTicket:async(e,a)=>{const n=`${ln(e)}/tickets`,i=await fetch(n,{method:"POST",body:a});if(!i.ok)throw new ha(i.status,`POST ${n} → ${i.status}`);return i.json()},getChatQuota:e=>Jn(`${ln(e)}/chat`),listChatSessions:(e,a)=>Jn(`${ln(e)}/chat/sessions${Gr(a)}`),getChatSession:(e,a,n)=>Jn(`${ln(e)}/chat/sessions/${encodeURIComponent(a)}${Gr(n)}`),startChatSession:(e,a)=>Fm(`${ln(e)}/chat/sessions`,{type:a}),sendChatMessage:(e,a,n)=>Fm(`${ln(e)}/chat/sessions/${encodeURIComponent(a)}/messages`,{text:n}),logout:async()=>{const e=await fetch("/api/auth/logout",{method:"POST"});if(!e.ok)throw new ha(e.status,`POST /api/auth/logout → ${e.status}`)}},hT={"Sedang ditinjau":"queued",Diterima:"awaiting","Sedang dikerjakan":"running",Selesai:"done",Ditutup:"failed"},pT={brainstorming:"queued",objective:"queued","spec-ready":"queued",planned:"queued",executing:"running",done:"done"},Gd=e=>hT[e]??"idle",Gm=e=>pT[e]??"idle",gT={bug:"Ada masalah",fitur:"Permintaan fitur",pertanyaan:"Pertanyaan",lainnya:"Lainnya"},kT={tinggi:"Prioritas tinggi",sedang:"Prioritas sedang",rendah:"Prioritas rendah"},js=e=>gT[e]??e,Km=e=>kT[e]??e;function or(e,a){return e instanceof TypeError?"Tidak bisa terhubung ke server. Periksa koneksi, lalu coba lagi.":(e instanceof Error?e.message.trim():"")||a}const Rl=3;function bT({projects:e,activeId:a,email:n,onCancel:i,onSent:r}){var L;const[s,o]=c.useState(1),[l,d]=c.useState(a),[u,m]=c.useState(kd.options[0]),[h,p]=c.useState(""),[g,f]=c.useState(""),[b,x]=c.useState([]),[v,y]=c.useState(!1),[T,S]=c.useState(null),E=h.trim()!==""&&g.trim()!=="",w=((L=e.find(I=>I.id===l))==null?void 0:L.name)??"",N=async()=>{if(!(v||!E)){S(null),y(!0);try{const I=new FormData;I.set("category",u),I.set("title",h),I.set("detail",g);for(const B of b.slice(0,Rl))I.append("files",B,B.name);await It.createTicket(l,I),r(l)}catch{S("Gagal mengirim keluhan. Periksa koneksi, lalu coba lagi.")}finally{y(!1)}}},R=s===1?t.jsxs("div",{className:"hn-portal-foot",children:[t.jsx(U,{size:"sm",variant:"secondary",onClick:i,children:"Batal"}),t.jsx(U,{size:"sm",variant:"primary",rightIcon:"arrow-right",disabled:!E,onClick:()=>o(2),children:"Lanjut"})]}):t.jsxs("div",{className:"hn-portal-foot",children:[t.jsx(U,{size:"sm",variant:"secondary",disabled:v,onClick:()=>o(1),children:"Kembali"}),t.jsx(U,{size:"sm",variant:"primary",leftIcon:"send",disabled:v||!E,loading:v,onClick:()=>{N()},children:"Kirim"})]});return t.jsx(la,{open:!0,title:"Lapor masalah",icon:"send",eyebrow:`langkah ${s} dari 2`,dismissible:!v,onClose:i,footer:R,children:s===1?t.jsxs("div",{className:"hn-portal-form",children:[t.jsxs("p",{className:"hn-portal-field-note",children:[t.jsx("strong",{children:"Apa yang terjadi?"})," Cukup judul singkat dan ceritanya."]}),e.length>1&&t.jsx(oe,{label:"Project",children:t.jsx($e,{"aria-label":"Project",size:"lg",value:l,onChange:I=>d(I.target.value),options:e.map(I=>({value:I.id,label:I.name})),className:"hn-portal-wide"})}),t.jsx(oe,{label:"Kategori",children:t.jsx($e,{"aria-label":"Kategori",size:"lg",value:u,onChange:I=>m(I.target.value),options:kd.options.map(I=>({value:I,label:js(I)})),className:"hn-portal-wide"})}),t.jsx(oe,{label:"Judul",hint:"Satu kalimat tentang masalahnya.",children:t.jsx(Oe,{"aria-label":"Judul",size:"lg",value:h,maxLength:200,className:"hn-portal-wide",onChange:I=>p(I.target.value),placeholder:"mis. Tombol Simpan tidak berfungsi di HP"})}),t.jsx(oe,{label:"Detail",hint:"Langkah yang Anda lakukan, dan apa yang terjadi setelahnya.",children:t.jsx("textarea",{"aria-label":"Detail",className:"hn-portal-textarea",value:g,rows:5,onChange:I=>f(I.target.value),placeholder:"mis. Buka halaman Pesanan di HP, tekan Simpan — layar diam dan datanya tidak tersimpan."})}),!E&&t.jsx("p",{className:"hn-portal-field-note",children:"Isi judul dan detail untuk melanjutkan."})]}):t.jsxs("div",{className:"hn-portal-form",children:[t.jsxs("p",{className:"hn-portal-field-note",children:[t.jsx("strong",{children:"Lampiran (opsional)."})," Tangkapan layar membantu tim melihat masalahnya lebih cepat."]}),t.jsx(oe,{label:"Lampiran gambar",hint:`Maksimal ${Rl} berkas PNG, JPEG, atau WebP.`,children:t.jsx("input",{"aria-label":"Lampiran gambar",className:"hn-portal-file",type:"file",accept:"image/png,image/jpeg,image/webp",multiple:!0,onChange:I=>x(Array.from(I.target.files??[]).slice(0,Rl))})}),b.length>0&&t.jsx("ul",{className:"hn-portal-files","aria-label":"Lampiran terpilih",children:b.map(I=>t.jsx("li",{children:I.name},I.name))}),t.jsxs("div",{className:"hn-portal-summary",children:[t.jsxs("span",{children:["Judul: ",t.jsx("strong",{children:h})]}),t.jsxs("span",{children:["Kategori: ",t.jsx("strong",{children:js(u)})]}),e.length>1&&t.jsxs("span",{children:["Project: ",t.jsx("strong",{children:w})]}),n&&t.jsxs("span",{children:["Tercatat atas nama ",t.jsx("strong",{children:n}),"."]})]}),T&&t.jsx("p",{role:"alert",className:"hn-portal-error",children:T})]})})}const Wm={page:1,limit:20},Ll=[{value:"brainstorm",label:"Brainstorming",jelas:"Kita gali ide Anda bersama-sama sampai jelas, lalu saya rangkum jadi usulan untuk tim."},{value:"tanya",label:"Bertanya",jelas:"Tanyakan apa saja seputar project Anda — saya jawab langsung di sini."}],Kr="Maaf, ada kendala sebentar. Coba lagi ya.",fT=e=>new Date(e).toLocaleDateString("id-ID",{day:"numeric",month:"long",year:"numeric"});function yT({projectId:e}){var I;const[a,n]=c.useState(null),[i,r]=c.useState([]),[s,o]=c.useState(!1),[l,d]=c.useState([]),u=c.useRef(0),[m,h]=c.useState(""),[p,g]=c.useState(!1),[f,b]=c.useState(null),[x,v]=c.useState(null),y=c.useCallback(()=>{o(!1),It.listChatSessions(e,Wm).then(B=>r(B.items)).catch(()=>{r([]),o(!0)})},[e]);c.useEffect(()=>{n(null),d([]),b(null),y(),It.getChatQuota(e).then(v).catch(()=>v(null))},[e,y]);const T=()=>void It.getChatQuota(e).then(v).catch(()=>v(null)),S=async B=>{n(B),b(null);try{const A=await It.getChatSession(e,B.id,Wm);d(A.messages.items)}catch{d([]),b(Kr)}},E=async B=>{b(null);try{const A=await It.startChatSession(e,B);n(A),d([]),r(M=>[A,...M]),T()}catch{b(Kr)}},w=async B=>{const A=(B?B.teks:m).trim();if(!A||!a||p)return;b(null),g(!0);const M=(B==null?void 0:B.id)??`lokal-${++u.current}`;d(K=>B?K.map(O=>O.id===M?{...O,gagal:!1}:O):[...K,{id:M,seq:K.length+1,role:"klien",text:A,createdAt:new Date().toISOString()}]),B||h("");try{const K=await It.sendChatMessage(e,a.id,A);d(O=>[...O,K])}catch{d(K=>K.map(O=>O.id===M?{...O,gagal:!0}:O)),B||h(K=>K.trim()?K:A),b(Kr)}finally{g(!1)}},N=t.jsxs("p",{"data-testid":"chat-beda-help",className:"hn-portal-note",children:["Obrolan ini dijawab hanoman saat itu juga. Kalau Anda ingin melaporkan masalah supaya ditangani orang, kirimkan lewat ",t.jsx("strong",{children:"Keluhan saya"})," — laporan di sana masuk antrean tim dan dijawab manusia."]}),R=B=>x==null?void 0:x[B==="brainstorm"?"brainstorm":"tanya"],L=x&&t.jsxs("p",{"data-testid":"chat-jatah",className:"hn-chat-jatah",children:["Brainstorming: sudah dipakai ",x.brainstorm.terpakai," dari ",x.brainstorm.jatah," bulan ini. Bertanya: ",x.tanya.terpakai," dari ",x.tanya.jatah,". Jatah kembali penuh pada"," ",fT(x.resetPada),"."]});return a?t.jsxs("div",{className:"hn-chat",children:[N,t.jsxs("div",{className:"hn-chat-bar",children:[t.jsx(U,{size:"sm",variant:"ghost",onClick:()=>{n(null),d([])},children:"← Semua obrolan"}),t.jsx("span",{children:(I=Ll.find(B=>B.value===a.type))==null?void 0:I.label})]}),t.jsxs("div",{className:"hn-chat-thread",children:[l.map(B=>t.jsxs("div",{className:"hn-chat-msg","data-role":B.role,"data-gagal":B.gagal?"true":void 0,children:[t.jsx("div",{className:"hn-chat-bubble",children:B.text}),B.gagal&&t.jsxs("div",{className:"hn-chat-failed",children:[t.jsx("span",{role:"alert",children:"Gagal terkirim"}),t.jsx(U,{size:"sm",variant:"ghost",disabled:p,onClick:()=>void w({id:B.id,teks:B.text}),children:"Kirim ulang"})]})]},B.id)),p&&t.jsx(ue,{kind:"loading",title:"hanoman sedang memikirkan…",hint:"Ini bisa memakan waktu sebentar."})]}),f&&t.jsx("p",{"data-testid":"chat-galat",role:"alert",className:"hn-portal-error",children:f}),t.jsxs("div",{className:"hn-chat-compose",children:[t.jsx("div",{children:t.jsx("textarea",{"data-testid":"chat-input",className:"hn-portal-textarea",value:m,rows:3,"aria-label":"Pesan Anda",placeholder:"Tulis pesan Anda…",disabled:p,onChange:B=>h(B.target.value)})}),t.jsx(U,{"data-testid":"chat-kirim",disabled:p||!m.trim(),onClick:()=>void w(),children:"Kirim"})]})]}):t.jsxs("div",{className:"hn-chat",children:[N,L,t.jsx("div",{className:"hn-chat-types",children:Ll.map(B=>{var A;return t.jsx(Sa,{children:t.jsxs("div",{className:"hn-chat-type",children:[t.jsx(U,{disabled:((A=R(B.value))==null?void 0:A.sisa)===0,onClick:()=>void E(B.value),children:B.label}),t.jsx("p",{children:B.jelas})]})},B.value)})}),f&&t.jsx("p",{"data-testid":"chat-galat",role:"alert",className:"hn-portal-error",children:f}),s&&t.jsx(ue,{kind:"error",compact:!0,title:"Riwayat obrolan belum bisa dimuat",hint:Kr,action:y,actionLabel:"Coba lagi"}),i.length>0&&t.jsxs("div",{className:"hn-chat-history",children:[t.jsx("h3",{children:"Obrolan sebelumnya"}),t.jsx(Sa,{padding:0,children:i.map(B=>{var A;return t.jsxs("button",{type:"button",className:"hn-chat-row",onClick:()=>void S(B),children:[t.jsx("span",{className:"hn-chat-row-type",children:((A=Ll.find(M=>M.value===B.type))==null?void 0:A.label)??B.type}),t.jsx("span",{className:"hn-chat-row-sum",children:B.summary||"Belum ada ringkasan"})]},B.id)})})]})]})}const vT=["Diterima","Ditinjau","Dikerjakan","Selesai"];function Fi(e){return vT.map((a,n)=>({label:a,state:e[n]??"pending"}))}function xT(e){switch(e){case"Sedang ditinjau":return Fi({0:"done",1:"current"});case"Diterima":return Fi({0:"done",1:"done",2:"current"});case"Sedang dikerjakan":return Fi({0:"done",1:"done",2:"current"});case"Selesai":return Fi({0:"done",1:"done",2:"done",3:"done"});case"Ditutup":return Fi({0:"done",1:"closed"});default:return Fi({0:"done"})}}function lb(e){switch(e){case"Sedang ditinjau":return"Laporan sudah masuk dan sedang ditinjau tim. Belum ada yang perlu Anda lakukan.";case"Diterima":return"Laporan diterima dan menunggu giliran dikerjakan.";case"Sedang dikerjakan":return"Tim sedang mengerjakan perbaikannya.";case"Selesai":return"Sudah selesai dikerjakan.";case"Ditutup":return"Laporan ini tidak dilanjutkan. Kirim laporan baru bila masalahnya masih terjadi.";default:return`Status laporan: ${e}.`}}const jT={done:"sudah",current:"sekarang",pending:"belum",closed:"tidak dilanjutkan"};function Kd({status:e,compact:a=!1}){return t.jsx("ol",{className:a?"hn-timeline hn-timeline-compact":"hn-timeline","aria-label":`Perkembangan laporan: ${e}`,children:xT(e).map(n=>t.jsxs("li",{className:"hn-timeline-step","data-state":n.state,"aria-current":n.state==="current"?"step":void 0,children:[t.jsx("span",{className:"hn-timeline-dot","aria-hidden":"true"}),t.jsx("span",{className:"hn-timeline-label",children:n.label}),t.jsxs("span",{className:"hn-sr-only",children:[" (",jT[n.state],")"]})]},n.label))})}function db({status:e}){return t.jsx("p",{className:"hn-timeline-note",children:lb(e)})}const Gi=e=>e?new Date(e).toLocaleDateString("id-ID",{day:"numeric",month:"short",year:"numeric"}):"—",Vm={brainstorming:"Dirumuskan",objective:"Dirumuskan","spec-ready":"Disiapkan",planned:"Direncanakan",executing:"Sedang dikerjakan",done:"Selesai"},No=20,Ym={items:[],total:0,page:1,pageSize:No};function Jm({total:e,page:a,onPage:n,unit:i}){const r=xr(e,a,No);return t.jsx("div",{className:"hn-portal-pager",children:t.jsx(jr,{page:r.page,pageCount:r.pageCount,total:e,from:r.from,to:r.to,onPage:n,unit:i})})}function wT({user:e,onLoggedOut:a}){const[n,i]=c.useState(null),[r,s]=c.useState(null),[o,l]=c.useState("keluhan"),[d,u]=c.useState(Ym),[m,h]=c.useState(Ym),[p,g]=c.useState(1),[f,b]=c.useState(1),[x,v]=c.useState(0),[y,T]=c.useState(null),[S,E]=c.useState(null),[w,N]=c.useState(!1),[R,L]=c.useState(0),[I,B]=c.useState(null),[A,M]=c.useState(null),[K,O]=c.useState(!1);c.useEffect(()=>{i(null),N(!1),It.listProjects().then(X=>{i(X.items),s(ce=>{var se;return ce??((se=X.items[0])==null?void 0:se.id)??null})}).catch(()=>{i([]),N(!0)})},[R]);const J=c.useRef(0),Z=c.useCallback((X,ce,se)=>{const Ce=++J.current;Promise.all([It.listBacklog(X,{page:ce,limit:No}),It.listTickets(X,{page:se,limit:No})]).then(([Te,le])=>{Ce===J.current&&(u(Te),h(le),B(null))}).catch(Te=>{Ce===J.current&&B(or(Te,"Daftar belum bisa dimuat."))})},[]);c.useEffect(()=>{r&&Z(r,p,f)},[r,p,f,x,Z]),c.useEffect(()=>{g(1),b(1)},[r,o]);const H=async X=>{M(null);try{T(await It.getSpec(r,X))}catch(ce){M(or(ce,"Pekerjaan ini belum bisa dibuka. Coba lagi."))}},te=async X=>{M(null);try{E(await It.getTicket(r,X))}catch(ce){M(or(ce,"Laporan ini belum bisa dibuka. Coba lagi."))}},ae=async()=>{try{await It.logout()}catch{}finally{a()}},F=n==null?void 0:n.find(X=>X.id===r),fe=(F==null?void 0:F.name)??"",_e=(F==null?void 0:F.chatEnabled)===!0,ee=o==="tanya"&&!_e?"keluhan":o;return t.jsxs("div",{"data-testid":"portal-root",className:"hn-dynamic-viewport hn-portal",style:{height:"100dvh",minHeight:0,display:"flex",flexDirection:"column",background:"var(--surface-page)",color:"var(--text-body)"},children:[t.jsxs("header",{className:"hn-portal-header",style:Ao,children:[t.jsx("span",{className:"hn-portal-mark",children:t.jsx(qc,{id:"buntut",size:17,color:"var(--surface-card)"})}),t.jsx("span",{className:"hn-portal-brand",children:"Klien"}),t.jsx("div",{className:"hn-portal-spacer"}),t.jsx("span",{className:"hn-portal-who",children:e.email}),t.jsx(U,{size:"sm",variant:"ghost",leftIcon:"log-out",onClick:ae,children:"Keluar"})]}),t.jsx("main",{"data-testid":"portal-scroll",style:hk,children:t.jsxs("div",{className:"hn-portal-content",children:[A&&t.jsx("p",{role:"alert",className:"hn-portal-alert",children:A}),n===null?t.jsx(ue,{kind:"loading",title:"Memuat…"}):n.length===0?t.jsx(ue,{kind:w?"error":"empty",icon:"folder",title:w?"Gagal memuat data":"Belum ada project yang bisa dilihat",hint:w?"Project Anda belum bisa dimuat. Periksa koneksi, lalu coba lagi.":"Hubungi tim hanoman untuk meminta akses ke project Anda.",action:w?()=>L(X=>X+1):void 0,actionLabel:w?"Coba lagi":void 0}):t.jsxs(t.Fragment,{children:[n.length>1&&t.jsx("div",{className:"hn-portal-projects",children:n.map(X=>t.jsx(U,{size:"sm",variant:X.id===r?"primary":"ghost","aria-pressed":X.id===r,onClick:()=>s(X.id),children:X.name},X.id))}),t.jsxs("div",{className:"hn-portal-head",children:[t.jsxs("div",{className:"hn-portal-titlebox",children:[t.jsx("h1",{className:"hn-portal-title",children:fe}),t.jsx("p",{className:"hn-portal-sub",children:"Beranda Klien · lihat bagaimana masalah Anda berkembang di sini."})]}),t.jsx(U,{variant:"primary",leftIcon:"send",onClick:()=>O(!0),children:"Lapor masalah"})]}),t.jsx("div",{className:"hn-portal-tabs-row",children:t.jsx(At,{className:"hn-portal-tabs",value:ee,onChange:X=>l(X),tabs:[{value:"keluhan",label:"Keluhan saya",count:m.total},{value:"progres",label:"Progres pekerjaan",count:d.total},..._e?[{value:"tanya",label:"Tanya & ide"}]:[]]})}),ee==="tanya"?t.jsx(yT,{projectId:r}):I?t.jsx(ue,{kind:"error",title:"Daftar belum bisa dimuat",hint:I,action:()=>v(X=>X+1),actionLabel:"Coba lagi"}):ee==="progres"?d.total===0?t.jsx(ue,{kind:"empty",icon:"list-checks",title:"Belum ada pekerjaan tercatat",hint:"Begitu tim mulai mengerjakan sesuatu di project ini, daftarnya muncul di sini."}):t.jsxs(t.Fragment,{children:[t.jsx("p",{className:"hn-portal-note",children:"Ini pekerjaan yang dikerjakan tim untuk project ini. Keluhan Anda ada di tab Keluhan saya."}),t.jsx(Sa,{padding:0,"data-testid":"portal-list",className:"hn-portal-list",children:d.items.map(X=>t.jsxs("button",{type:"button",className:"hn-portal-row",onClick:()=>void H(X.id),children:[t.jsx("span",{className:"hn-portal-row-title",title:X.title,children:X.title}),t.jsx(pt,{status:Gm(X.stage),size:"sm",children:Vm[X.stage]??X.stage}),t.jsx("span",{className:"hn-portal-meta",children:Km(X.priority)}),t.jsx("span",{className:"hn-portal-meta",children:Gi(X.doneAt??X.startedAt??X.createdAt)})]},X.id))}),t.jsx(Jm,{total:d.total,page:p,onPage:g,unit:"pekerjaan"})]}):m.total===0?t.jsx(ue,{kind:"empty",illustration:"PST-002",illustrationDecorative:!0,title:"Belum ada keluhan",hint:"Ada yang tidak berfungsi? Lapor di sini. Perkembangannya akan tampil di halaman ini.",action:()=>O(!0),actionLabel:"Lapor masalah"}):t.jsxs(t.Fragment,{children:[t.jsx("ul",{className:"hn-portal-cases","data-testid":"portal-list",children:m.items.map(X=>t.jsxs("li",{className:"hn-portal-case",children:[t.jsxs("div",{className:"hn-portal-case-head",children:[t.jsxs("span",{className:"hn-portal-case-num",children:["#",X.number]}),t.jsx("button",{type:"button",className:"hn-portal-case-title",onClick:()=>void te(X.id),children:X.title}),t.jsx(pt,{status:Gd(X.status),size:"sm",children:X.status})]}),t.jsx(Kd,{status:X.status,compact:!0}),t.jsx("p",{className:"hn-portal-case-note",children:lb(X.status)}),t.jsxs("span",{className:"hn-portal-case-meta",children:[js(X.category)," · dikirim ",Gi(X.createdAt)]})]},X.id))}),t.jsx(Jm,{total:m.total,page:f,onPage:b,unit:"keluhan"})]})]})]})}),K&&n&&n.length>0&&t.jsx(bT,{projects:n,activeId:r,email:e.email,onCancel:()=>O(!1),onSent:X=>{O(!1),l("keluhan"),b(1),X===r?v(ce=>ce+1):s(X)}}),t.jsx(la,{open:!!y,title:(y==null?void 0:y.title)??"",eyebrow:"pekerjaan",onClose:()=>T(null),children:y&&t.jsxs("div",{className:"hn-portal-detail",children:[t.jsxs("div",{className:"hn-portal-pillrow",children:[t.jsx(pt,{status:Gm(y.stage),size:"sm",children:Vm[y.stage]??y.stage}),t.jsx("span",{className:"hn-portal-meta",children:Km(y.priority)})]}),t.jsx("p",{className:"hn-portal-body",children:y.objective}),t.jsxs("dl",{className:"hn-portal-dl",children:[t.jsx("dt",{children:"Dibuat"}),t.jsx("dd",{children:Gi(y.createdAt)}),t.jsx("dt",{children:"Mulai"}),t.jsx("dd",{children:Gi(y.startedAt)}),t.jsx("dt",{children:"Selesai"}),t.jsx("dd",{children:Gi(y.doneAt)})]})]})}),t.jsx(la,{open:!!S,title:(S==null?void 0:S.title)??"",eyebrow:S?`#${S.number} · ${js(S.category)}`:void 0,onClose:()=>E(null),children:S&&t.jsxs("div",{className:"hn-portal-detail",children:[t.jsx("div",{children:t.jsx(pt,{status:Gd(S.status),size:"sm",children:S.status})}),t.jsx(Kd,{status:S.status}),t.jsx(db,{status:S.status}),t.jsx("p",{className:"hn-portal-body",children:S.detail}),t.jsxs("dl",{className:"hn-portal-dl",children:[t.jsx("dt",{children:"Dikirim"}),t.jsx("dd",{children:Gi(S.createdAt)})]})]})})]})}function cb(e,a){return[{value:"",label:e.length?"main (default project)":"project belum punya repo"}].concat(e.map(n=>({value:n,label:a!=null&&a.has(n)?`${n} · origin`:n})))}const ST=e=>`prd/${e.replace(/^docs\/prd\//,"").replace(/\.md$/,"")}`;function hr({open:e,onClose:a,onPick:n,start:i}){const[r,s]=c.useState(""),[o,l]=c.useState(""),[d,u]=c.useState(null),[m,h]=c.useState([]),[p,g]=c.useState(""),[f,b]=c.useState(!1),x=c.useRef(0),v=c.useCallback(T=>{const S=++x.current;b(!0),g(""),ne.browseFs(T).then(E=>{S===x.current&&(l(E.path),s(E.path),u(E.parent),h(E.entries))}).catch(E=>{S===x.current&&g(`Tak bisa membuka folder ini: ${xs(E,"tidak diketahui")}`)}).finally(()=>{S===x.current&&b(!1)})},[]);c.useEffect(()=>{e&&v(i&&i.trim()?i.trim():void 0)},[e,i,v]);const y=!!o&&!f&&!p&&r.trim()===o;return t.jsxs(la,{open:e,onClose:a,icon:"folder-open",eyebrow:"device",title:"Pilih folder codebase",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",size:"sm",onClick:a,children:"Batal"}),t.jsx(U,{size:"sm",leftIcon:"check",disabled:!y,onClick:()=>{n(o),a()},children:"Pilih folder ini"})]}),children:[t.jsxs("div",{className:"hn-prj-inline hn-prj-picker-path",children:[t.jsx(Oe,{value:r,onChange:T=>s(T.target.value),onKeyDown:T=>{T.key==="Enter"&&v(T.currentTarget.value.trim()||void 0)},"aria-label":"Path folder",leftIcon:"folder",mono:!0,className:"hn-prj-grow",placeholder:"/path/ke/folder"}),t.jsx(U,{size:"sm",variant:"secondary",onClick:()=>v(r.trim()||void 0),children:"Buka"})]}),t.jsx("div",{"aria-label":"Sub-folder",className:"hn-prj-picker-list",children:f?t.jsx(ue,{kind:"loading",compact:!0,title:"Membuka folder…"}):p?t.jsx(ue,{kind:"error",compact:!0,title:p,hint:r||void 0,action:()=>v(r.trim()||void 0)}):t.jsxs(t.Fragment,{children:[d&&t.jsx(Qm,{icon:"corner-left-up",name:"..",onClick:()=>v(d)}),m.map(T=>t.jsx(Qm,{icon:"folder",name:T.name,onClick:()=>v(T.path)},T.path)),m.length===0&&t.jsx(ue,{kind:"empty",compact:!0,icon:"folder",title:"Tak ada sub-folder",hint:"Folder ini bisa langsung dipilih."})]})})]})}function Qm({icon:e,name:a,onClick:n}){return t.jsxs("button",{type:"button",onClick:n,className:"hn-prj-folder-row",children:[t.jsx(Re,{name:e,size:16,color:"var(--brass-700)"}),t.jsx("span",{className:"hn-prj-mono hn-prj-wrap",children:a})]})}function ub({list:e,size:a="sm"}){return e!=null&&e.length?t.jsx("span",{style:{display:"flex",flexWrap:"wrap",alignItems:"center",gap:5,minWidth:0},children:e.map(n=>t.jsx(ra,{size:a,icon:"monitor",tone:n.revoked?"warn":"brass",title:n.revoked?"Perangkat ini sudah dicabut aksesnya. Riwayatnya sengaja tetap disimpan.":void 0,"data-testid":`handled-by-${n.deviceId}`,children:n.revoked?`${n.name} · dicabut`:n.name},n.deviceId))}):t.jsx("span",{"data-testid":"handled-by-empty",style:{fontSize:"var(--text-xs)",color:"var(--text-subtle)",fontFamily:"var(--font-ui)"},children:"belum ditetapkan"})}function _T(){const e=new Date;return{from:new Date(e.getTime()-24*36e5).toISOString(),to:e.toISOString()}}function AT(){const[e,a]=c.useState(_T()),[n,i]=c.useState([]),[r,s]=c.useState(null),[o,l]=c.useState(!1),[d,u]=c.useState(null),[m,h]=c.useState(null),[p,g]=c.useState(null);async function f(v){l(!0),u(null);try{const y=await zg({...e,cursor:v});i(T=>v?[...T,...y.items]:y.items),s(y.nextCursor)}catch(y){u(y.message)}finally{l(!1)}}c.useEffect(()=>{f(),Gg().then(g).catch(()=>{})},[e.from,e.to,e.deviceId,e.projectId,e.specId,e.lane,e.level,e.kind,e.q]);async function b(v){if(!v.hasTranscript)return;const y=await Fg(v.id);h({id:v.id,text:y})}async function x(v){const y=await Kg(v);g(y)}return d?t.jsx(ue,{kind:"error",title:"Gagal memuat log",hint:d,action:()=>void f(),actionLabel:"Coba lagi"}):t.jsxs("div",{className:"hn-logs-panel",children:[t.jsxs("form",{onSubmit:v=>{v.preventDefault(),f()},className:"hn-logs-filter",children:[t.jsx("input",{type:"datetime-local","aria-label":"Dari",value:e.from.slice(0,16),onChange:v=>a(y=>({...y,from:new Date(v.target.value).toISOString()}))}),t.jsx("input",{type:"datetime-local","aria-label":"Sampai",value:e.to.slice(0,16),onChange:v=>a(y=>({...y,to:new Date(v.target.value).toISOString()}))}),t.jsx("input",{type:"text","aria-label":"Device",placeholder:"deviceId",value:e.deviceId??"",onChange:v=>a(y=>({...y,deviceId:v.target.value||void 0}))}),t.jsx("input",{type:"text","aria-label":"Project",placeholder:"projectId",value:e.projectId??"",onChange:v=>a(y=>({...y,projectId:v.target.value||void 0}))}),t.jsx("input",{type:"text","aria-label":"Spec",placeholder:"specId",value:e.specId??"",onChange:v=>a(y=>({...y,specId:v.target.value||void 0}))}),t.jsxs("select",{"aria-label":"Lajur",value:e.lane??"",onChange:v=>a(y=>({...y,lane:v.target.value||void 0})),children:[t.jsx("option",{value:"",children:"semua lajur"}),t.jsx("option",{value:"event",children:"event"}),t.jsx("option",{value:"server",children:"server"}),t.jsx("option",{value:"transcript",children:"transcript"})]}),t.jsxs("select",{"aria-label":"Level",value:e.level??"",onChange:v=>a(y=>({...y,level:v.target.value||void 0})),children:[t.jsx("option",{value:"",children:"semua level"}),t.jsx("option",{value:"debug",children:"debug"}),t.jsx("option",{value:"info",children:"info"}),t.jsx("option",{value:"warn",children:"warn"}),t.jsx("option",{value:"error",children:"error"})]}),t.jsx("input",{type:"text","aria-label":"kind",placeholder:"mis. launch.rejected",value:e.kind??"",onChange:v=>a(y=>({...y,kind:v.target.value||void 0}))}),t.jsx("input",{type:"search","aria-label":"Cari",placeholder:"mis. celah log",value:e.q??"",onChange:v=>a(y=>({...y,q:v.target.value||void 0}))}),t.jsx("button",{type:"submit",children:"Cari"})]}),o&&n.length===0?t.jsx(ue,{kind:"loading",title:"Memuat log…",compact:!0}):n.length===0?t.jsx(ue,{kind:"empty",title:"Tidak ada log pada rentang/penyaring ini",compact:!0}):t.jsx("ul",{className:"hn-logs-list",children:n.map(v=>t.jsxs("li",{className:`hn-dense-row hn-logs-row${v.hasTranscript?" hn-logs-row--open":""}`,role:v.hasTranscript?"button":void 0,tabIndex:v.hasTranscript?0:void 0,onClick:()=>void b(v),children:[t.jsx("span",{className:"hn-logs-ts",children:v.ts}),t.jsx("span",{className:"hn-logs-meta",children:v.lane}),t.jsx("span",{className:"hn-logs-meta",children:v.level}),t.jsx("span",{className:"hn-logs-meta",children:v.kind}),t.jsx("span",{className:"hn-logs-msg",children:v.msg})]},v.id))}),r&&t.jsx("button",{type:"button",onClick:()=>void f(r),children:"Muat lagi"}),m&&t.jsxs("section",{children:[t.jsx("button",{type:"button",onClick:()=>h(null),children:"Tutup transkrip"}),t.jsx("pre",{className:"hn-logs-transcript",children:m.text})]}),p&&t.jsxs("section",{className:"hn-logs-retention",children:[t.jsx("h3",{className:"hn-logs-h3",children:"Retensi"}),t.jsxs("div",{className:"hn-logs-filter",children:[t.jsxs("label",{children:["event (hari)",t.jsx("input",{type:"number",placeholder:"mis. 90",value:p.eventDays,onChange:v=>g({...p,eventDays:Number(v.target.value)})})]}),t.jsxs("label",{children:["server (hari)",t.jsx("input",{type:"number",placeholder:"mis. 7",value:p.serverDays,onChange:v=>g({...p,serverDays:Number(v.target.value)})})]}),t.jsxs("label",{children:["transcript (hari)",t.jsx("input",{type:"number",placeholder:"mis. 30",value:p.transcriptDays,onChange:v=>g({...p,transcriptDays:Number(v.target.value)})})]}),t.jsxs("label",{children:["maxBytes",t.jsx("input",{type:"number",placeholder:"mis. 268435456",value:p.maxBytes,onChange:v=>g({...p,maxBytes:Number(v.target.value)})})]})]}),t.jsx("button",{type:"button",onClick:()=>void x(p),children:"Simpan"})]})]})}const ET={kind:"local"},mb=c.createContext(ET);function TT({value:e,children:a}){return t.jsx(mb.Provider,{value:e,children:a})}function Xc(){return c.useContext(mb)}function Et(){const e=Xc();return c.useMemo(()=>e.kind==="local"?ne:Nc({base:`/api/devices/${e.deviceId}/relay`}),[e.kind==="local"?"local":e.deviceId])}function CT(e){const a=Xc();if(a.kind==="local")return{url:`/api/${e==="events"?"events":`terminal/sessions/${e.slice(9)}`}/ws`,ticketTarget:e};const n=e==="events"?"events/ws":`terminal/sessions/${e.slice(9)}/ws`;return{url:`/api/devices/${a.deviceId}/relay/${n}`,ticketTarget:`relay:${a.deviceId}:${e}`}}function PT({device:e,hubVersion:a,onClose:n}){const i=e.control.version,r=i!==a;return t.jsxs("div",{role:"status","data-testid":"remote-banner",className:"kl-banner",children:[t.jsxs("span",{className:"kl-banner-text",children:[t.jsx("b",{children:e.name})," · Baca-saja · v",i," · ",e.online?"online":"offline",r&&" · versi server pusat berbeda"]}),n&&t.jsx(U,{size:"sm",variant:"secondary",className:"hn-touch-target",onClick:n,children:"Keluar"})]})}/**
|
|
919
919
|
* Copyright (c) 2014-2024 The xterm.js authors. All rights reserved.
|
|
920
920
|
* @license MIT
|
|
@@ -1007,6 +1007,6 @@ Klik Masuk`,"aria-label":`Langkah pengujian ${e.code}`,...m("steps")})}),t.jsx(o
|
|
|
1007
1007
|
Isi akun yang benar
|
|
1008
1008
|
Klik Masuk`,value:o.steps,onChange:N("steps")})}),t.jsx(oe,{label:"Hasil yang diharapkan",children:t.jsx(Ma,{rows:3,placeholder:"mis. Halaman beranda terbuka.",value:o.expected,onChange:N("expected")})}),t.jsx(oe,{label:"Hasil yang terjadi",children:t.jsx(Ma,{rows:3,placeholder:"mis. Tombol diam, tak ada pesan galat.",value:o.actual,onChange:N("actual")})}),o.id&&t.jsx(oe,{label:"Status",children:t.jsx($e,{value:o.status,onChange:N("status"),options:[{value:"open",label:ro.open},{value:"wontfix",label:ro.wontfix}]})}),d&&t.jsx("p",{role:"alert",className:"hn-qa-error",children:d})]})}),i]})}function eI({f:e,p:a}){return t.jsxs("div",{className:"hn-qa-detail-stack",children:[t.jsxs("span",{className:"hn-qa-row-line",children:[t.jsx(ra,{tone:rf[e.severity],size:"sm",children:hs[e.severity]}),t.jsx(ra,{tone:of[e.status],variant:"dot",size:"sm",children:ro[e.status]}),t.jsxs("span",{children:["Prioritas ",e.priority]}),e.area&&t.jsx("span",{children:e.area}),e.caseCode&&t.jsx("span",{children:e.caseCode})]}),e.steps.length>0&&t.jsxs("div",{children:[t.jsx("div",{className:"hn-qa-label",children:"Cara memunculkan masalah"}),t.jsx("ol",{className:"hn-qa-steps",children:e.steps.map((n,i)=>t.jsx("li",{children:n},i))})]}),t.jsxs("div",{className:"hn-qa-detail-grid",children:[t.jsxs("div",{children:[t.jsx("div",{className:"hn-qa-label",children:"Hasil yang diharapkan"}),t.jsx("div",{className:"hn-qa-pre",children:e.expected||"—"})]}),t.jsxs("div",{children:[t.jsx("div",{className:"hn-qa-label",children:"Hasil yang terjadi"}),t.jsx("div",{className:"hn-qa-pre",children:e.actual||"—"})]})]}),t.jsxs("div",{children:[t.jsx("div",{className:"hn-qa-label",children:"Lampiran temuan"}),t.jsx(uu,{...a,ownerType:"finding",ownerId:e.id,compact:!0})]})]})}function aI({detail:e,projectId:a}){const n=Et(),i=Object.fromEntries(e.attachments.map(r=>[r.id,n.qaAttachmentUrl(a,e.id,r.id)]));return t.jsx("div",{className:"hn-qa-preview",children:t.jsx(ws,{text:Bx(e,i,{preview:!0}),name:`${e.code}.md`})})}const ac=[{key:"os",label:"Sistem operasi",example:"Windows 11 atau macOS 15"},{key:"browser",label:"Browser",example:"Chrome 130"},{key:"device",label:"Perangkat",example:"Laptop atau iPhone 15"},{key:"url",label:"Alamat aplikasi",example:"https://staging.example.com"},{key:"branch",label:"Branch (opsional)",example:"main"}],Kh=e=>({title:e.title,buildVersion:e.buildVersion,tester:e.tester,scope:e.scope,summary:e.summary,verdict:e.verdict??"",env:UM(Object.fromEntries(Object.entries(e.environment).filter(([a])=>!ac.some(n=>n.key===a)))),os:e.environment.os??"",browser:e.environment.browser??"",device:e.environment.device??"",url:e.environment.url??"",branch:e.environment.branch??""});function tI({detail:e,projectId:a,onChange:n,onBack:i,onDeleted:r,onToast:s,onOpenSession:o,startOpen:l=!1}){const d=Et(),{confirm:u,dialog:m}=ot(),h=e.status==="closed",p=Object.prototype.hasOwnProperty.call(Md,e.status),[g,f]=c.useState("cases"),[b,x]=c.useState(()=>Kh(e)),[v,y]=c.useState(()=>Kh(e)),[T,S]=c.useState(l),[E,w]=c.useState(!1),[N,R]=c.useState(!1),[L,I]=c.useState(!1),[B,A]=c.useState(""),[M,K]=c.useState(""),[O,J]=c.useState(""),Z=JSON.stringify(b)!==JSON.stringify(v),H=e.status==="submitted"?"closed":"submitted",te=b.title.trim().length>0,ae=e.findings.filter(Se=>Se.status==="open").length,F=e.attachments.filter(Se=>Se.ownerType==="report").length,fe=()=>({title:b.title,buildVersion:b.buildVersion,tester:b.tester,scope:b.scope,summary:b.summary,verdict:b.verdict||null,environment:{...zM(b.env),...Object.fromEntries(ac.filter(({key:Se})=>b[Se].trim()).map(({key:Se})=>[Se,b[Se].trim()]))}}),_e=async(Se,Je)=>{const q=b;I(!0);try{const Be=await d.patchQaReport(a,e.id,{...h?{}:fe(),...Se?{status:Se}:{}});return y(q),A(""),K(""),n(Be),null}catch(Be){return Oo(Je,Be)}finally{I(!1)}},ee=async()=>{if(!te){A("Isi judul laporan sebelum menyimpan."),S(!0);return}const Se=await _e(void 0,"menyimpan laporan");Se&&K(Se)},X=async()=>{const Se=await _e("draft","membuka kembali laporan");Se&&K(Se)},ce=()=>{J(""),w(!0)},se=async()=>{J("");const Se=await _e(H,H==="closed"?"menyelesaikan laporan":"mengajukan laporan");Se?J(Se):w(!1)},Ce=async()=>{if(await u({title:`Hapus ${e.code}?`,message:`"${e.title}"`,impact:["Test case, temuan, dan lampirannya ikut terhapus."],tone:"danger",confirmLabel:"Hapus"}))try{await d.deleteQaReport(a,e.id),r()}catch(Se){s==null||s(_t(Se))}},Te=async()=>{Z&&!await u({title:"Buang perubahan yang belum disimpan?",message:"Perubahan pada informasi laporan belum disimpan dan akan hilang.",impact:["Judul, versi, penguji, lingkungan, ringkasan, dan keputusan kembali ke nilai yang tersimpan."],tone:"danger",confirmLabel:"Buang perubahan"})||i()},le=Se=>Je=>x(q=>({...q,[Se]:Je.target.value})),xa=b.verdict&&b.verdict in tr?tr[b.verdict]:"Belum dipilih",Ze=[b.os,b.browser,b.device].map(Se=>Se.trim()).filter(Boolean),He=M||(h?"Laporan terkunci. Buka kembali untuk mengubah isinya.":Z?"Ada perubahan belum disimpan.":"Semua perubahan tersimpan."),Ke=H==="closed"?"Selesaikan dan kunci":"Ajukan",ga=H==="closed"?"Selesaikan dan kunci":"Ajukan laporan",Ge=h?t.jsx(U,{disabled:L,loading:L,onClick:()=>void X(),children:"Buka kembali"}):Z?t.jsxs(t.Fragment,{children:[t.jsx(U,{disabled:L,loading:L,onClick:()=>void ee(),children:"Simpan"}),t.jsx(U,{variant:"secondary",disabled:L,onClick:ce,children:Ke})]}):t.jsx(U,{disabled:L,onClick:ce,children:Ke}),fa=[{key:"preview",label:"Pratinjau laporan",icon:"eye",onSelect:()=>R(!0)},...h?[]:[{key:"delete",label:"Hapus laporan",icon:"trash-2",tone:"danger",onSelect:()=>void Ce()}]],Aa=te&&b.verdict!=="",ma={detail:e,projectId:a,locked:h,onChange:n,onToast:s,onOpenSession:o};return t.jsxs("div",{className:"hn-qa-editor",children:[t.jsxs("div",{className:"hn-qa-bar",children:[t.jsxs("div",{className:"hn-qa-bar-title",children:[t.jsx(U,{variant:"ghost",size:"sm",leftIcon:"arrow-left",onClick:()=>void Te(),children:"Kembali"}),t.jsx(ra,{tone:"brass",variant:"outline",size:"sm",children:e.code}),p&&t.jsx(ra,{tone:lf[e.status],size:"sm",children:Md[e.status]}),t.jsx("h3",{className:"hn-qa-bar-name",children:b.title.trim()||"Tanpa judul"})]}),t.jsxs("div",{className:"hn-qa-bar-actions",children:[t.jsx("span",{role:M?"alert":"status",className:`hn-qa-bar-save${M?" is-error":""}`,children:He}),Ge,t.jsx(sn,{label:"Menu laporan",title:"Ekspor dan tindakan lain",items:fa,children:t.jsx("div",{className:"hn-qa-export",children:qM.map(Se=>t.jsx(U,{size:"sm",variant:Se.format==="zip"?"secondary":"ghost",leftIcon:"download",as:"a",href:d.qaExportUrl(a,e.id,Se.format),children:Se.label},Se.format))})})]})]}),t.jsxs("section",{className:"hn-qa-info","aria-labelledby":`${e.id}-info`,children:[t.jsxs("div",{className:"hn-qa-info-head",children:[t.jsx("h3",{id:`${e.id}-info`,className:"hn-qa-info-title",children:"Info laporan"}),Z&&t.jsx(ra,{tone:"warn",size:"sm",children:"Belum disimpan"}),t.jsx(U,{variant:"secondary",size:"sm",leftIcon:"pencil",onClick:()=>S(!0),children:h?"Lihat info":"Ubah info"})]}),t.jsxs("dl",{className:"hn-qa-facts",children:[t.jsxs("div",{children:[t.jsx("dt",{children:"Versi aplikasi"}),t.jsx("dd",{children:b.buildVersion.trim()||"Belum diisi"})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Penguji"}),t.jsx("dd",{children:b.tester.trim()||"Belum diisi"})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Keputusan"}),t.jsx("dd",{children:xa})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Perangkat dan lingkungan"}),t.jsx("dd",{children:Ze.length?Ze.join(" · "):"Belum diisi"})]})]})]}),t.jsx(At,{value:g,onChange:f,tabs:[{value:"cases",label:"Langkah uji",count:e.cases.length},{value:"findings",label:"Temuan",count:e.findings.length},{value:"attachments",label:"Lampiran",count:F}]}),g==="cases"&&t.jsx(YM,{...ma}),g==="findings"&&t.jsx(XM,{...ma}),g==="attachments"&&t.jsx(uu,{...ma,ownerType:"report",ownerId:e.id}),t.jsx(la,{open:T,title:"Info laporan",eyebrow:e.code,width:640,onClose:()=>S(!1),footer:t.jsx(U,{onClick:()=>S(!1),children:"Selesai"}),children:t.jsxs("div",{className:"hn-qa-form",children:[t.jsx(oe,{label:"Judul laporan (wajib)",error:B||void 0,children:t.jsx(Oe,{placeholder:"Contoh: Pengujian fitur login versi 1.0",value:b.title,disabled:h,onChange:le("title")})}),t.jsxs("div",{className:"hn-qa-grid",children:[t.jsx(oe,{label:"Versi aplikasi",children:t.jsx(Oe,{placeholder:"Contoh: 1.0.0",value:b.buildVersion,disabled:h,onChange:le("buildVersion")})}),t.jsx(oe,{label:"Nama penguji",children:t.jsx(Oe,{placeholder:"Contoh: Rina Pratama",value:b.tester,disabled:h,onChange:le("tester")})})]}),t.jsx(oe,{label:"Apa yang diuji?",hint:"Sebutkan fitur yang diperiksa dan batasan pengujiannya.",children:t.jsx(Ma,{rows:3,placeholder:"Contoh: Login dengan email dan kata sandi. Login Google belum diuji.",value:b.scope,disabled:h,onChange:le("scope")})}),t.jsxs("fieldset",{className:"hn-qa-fieldset",children:[t.jsx("legend",{className:"hn-qa-legend",children:"Perangkat dan lingkungan pengujian"}),t.jsx("div",{className:"hn-qa-grid",children:ac.map(({key:Se,label:Je,example:q})=>t.jsx(oe,{label:Je,children:t.jsx(Oe,{value:b[Se],placeholder:q,disabled:h,onChange:le(Se)})},Se))}),t.jsxs("details",{className:"hn-qa-more",children:[t.jsx("summary",{children:"Informasi lingkungan tambahan (opsional)"}),t.jsx(oe,{label:"Lingkungan tambahan",hint:"Satu per baris, misalnya jaringan=Wi-Fi",children:t.jsx(Ma,{rows:3,placeholder:"mis. jaringan=Wi-Fi",value:b.env,disabled:h,onChange:le("env")})})]})]}),t.jsx(oe,{label:"Ringkasan hasil",hint:"Boleh diisi setelah langkah uji dan temuan selesai dicatat.",children:t.jsx(Ma,{rows:3,placeholder:"Contoh: Login berhasil di Chrome, tetapi tombol Masuk tidak bereaksi di Safari.",value:b.summary,disabled:h,onChange:le("summary")})}),t.jsx(oe,{label:"Keputusan",hint:"Wajib saat mengajukan laporan. Pilih berdasarkan hasil pengujian.",children:t.jsx($e,{value:b.verdict,disabled:h,onChange:le("verdict"),options:[{value:"",label:"Pilih setelah pengujian selesai"},...wo.map(Se=>({value:Se,label:tr[Se]}))]})})]})}),t.jsxs(la,{open:E,title:H==="closed"?"Tinjau dan selesaikan":"Tinjau dan ajukan",eyebrow:e.code,width:560,dismissible:!L,onClose:()=>w(!1),footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",disabled:L,onClick:()=>w(!1),children:"Batal"}),t.jsx(U,{disabled:!Aa||L,loading:L,onClick:()=>void se(),children:ga})]}),children:[t.jsxs("ul",{className:"hn-qa-check","aria-label":"Syarat pengajuan",children:[t.jsxs("li",{children:[t.jsx(ad,{ok:te}),t.jsxs("div",{className:"hn-qa-check-body",children:[t.jsx("div",{className:"hn-qa-check-name",children:"Judul laporan"}),t.jsx("div",{className:"hn-qa-check-note",children:te?"Sudah diisi.":"Belum diisi. Isi judul di Info laporan, lalu tinjau lagi."})]})]}),t.jsxs("li",{children:[t.jsx(ad,{ok:b.verdict!==""}),t.jsxs("div",{className:"hn-qa-check-body",children:[t.jsx("div",{className:"hn-qa-check-name",children:"Keputusan hasil pengujian"}),t.jsx("div",{className:"hn-qa-check-note",children:b.verdict!==""?`Dipilih: ${xa}.`:"Pilih satu keputusan. Wajib sebelum laporan diajukan."}),t.jsx(vr,{"aria-label":"Keputusan hasil pengujian",value:b.verdict,onChange:Se=>x(Je=>({...Je,verdict:Se})),children:wo.map(Se=>t.jsx(Mi,{value:Se,label:tr[Se]},Se))})]})]}),t.jsxs("li",{children:[t.jsx(ad,{ok:ae===0,warn:!0}),t.jsxs("div",{className:"hn-qa-check-body",children:[t.jsx("div",{className:"hn-qa-check-name",children:"Temuan belum ditangani"}),t.jsx("div",{className:"hn-qa-check-note",children:ae===0?"Tidak ada temuan terbuka.":`${ae} temuan belum ditangani. Ini tidak menghalangi pengajuan.`})]})]})]}),O&&t.jsx("p",{role:"alert",className:"hn-qa-error",children:O})]}),t.jsx(la,{open:N,title:`Pratinjau ${e.code}`,width:880,onClose:()=>R(!1),footer:t.jsx(U,{variant:"ghost",onClick:()=>R(!1),children:"Tutup"}),children:t.jsx(aI,{detail:e,projectId:a})}),m]})}function ad({ok:e,warn:a=!1}){const n=e?"is-ok":a?"is-warn":"is-miss";return t.jsx("span",{className:`hn-qa-check-icon ${n}`,children:t.jsx(Re,{name:e?"circle-check":a?"triangle-alert":"circle-x",size:16})})}function nI({projectId:e,reports:a,onOpen:n}){const i=Et();if(a.length===0)return t.jsx(ue,{kind:"empty",title:"Belum ada laporan QA",hint:"Buat laporan baru, atau impor dari template Excel."});const r=Date.now();return t.jsx(Zt,{label:"Daftar laporan QA",children:a.map(s=>t.jsx(en,{onClick:()=>n(s.id),actions:t.jsx(U,{as:"a",size:"sm",variant:"ghost",leftIcon:"download",href:i.qaExportUrl(e,s.id),"aria-label":`Unduh ZIP ${s.code}`,children:"Unduh ZIP"}),children:t.jsxs("span",{className:"hn-qa-row-body",children:[t.jsxs("span",{className:"hn-qa-row-head",children:[t.jsx("span",{className:"hn-qa-code",children:s.code}),t.jsx(ra,{tone:lf[s.status],variant:"dot",size:"sm",children:Md[s.status]})]}),t.jsx("span",{className:"hn-qa-row-title",children:s.title}),t.jsxs("span",{className:"hn-qa-row-line",children:[t.jsx("span",{children:[s.buildVersion&&`Versi ${s.buildVersion}`,s.tester].filter(Boolean).join(" · ")||"Belum ada versi atau penguji"}),t.jsxs("span",{className:"hn-qa-row-stat",children:[s.stats.cases.pass,"/",s.stats.cases.total," lulus (",HM(s.stats.passRate),") · ",s.stats.findings.total," temuan (",s.stats.findings.open," belum ditangani)"]}),s.verdict&&t.jsxs("span",{children:["Keputusan: ",tr[s.verdict]]}),t.jsxs("span",{children:["Diubah ",xt(s.updatedAt,r)||"—"]})]})]})},s.id))})}function iI({projects:e,projectId:a,onSelectProject:n,onToast:i,onOpenSession:r}){const s=Et(),[o,l]=c.useState(!1),[d,u]=c.useState(null),[m,h]=c.useState(!1),[p,g]=c.useState(null),[f,b]=c.useState(null),[x,v]=c.useState(!1),[y,T]=c.useState(""),[S,E]=c.useState(!1),[w,N]=c.useState(),[R,L]=c.useState([]),[I,B]=c.useState(!1),[A,M]=c.useState(""),[K,O]=c.useState([]),J=c.useCallback(async()=>{if(a){h(!1);try{u((await s.qaReports(a)).items)}catch{h(!0)}}},[s,a]);if(c.useEffect(()=>{g(null),b(null),u(null),O([]),E(!1),N(void 0),L([]),J()},[J]),!a)return t.jsx(ue,{kind:"empty",title:"Belum ada project",hint:"Buat atau muat project di halaman Projects, lalu buka QA lagi."});const Z=async F=>{try{g(await s.qaReport(a,F))}catch(fe){i==null||i(_t(fe))}},H=async()=>{if(!o){l(!0);try{const F=await s.syncNow();if(!F.ok){i==null||i(F.reason==="not-configured"?"Sinkronisasi belum dikonfigurasi. Hubungkan server dan device token di Settings.":F.reason??"Sinkronisasi gagal");return}await J(),p&&g(await s.qaReport(a,p.id)),i==null||i("QA disinkronkan. Lampiran dipindahkan bertahap pada siklus sinkronisasi.")}catch(F){i==null||i(_t(F))}finally{l(!1)}}},te=async()=>{const F=y.trim();if(F)try{const fe=await s.createQaReport(a,{title:F});v(!1),T(""),b(fe.id),g(fe),J()}catch(fe){i==null||i(_t(fe))}},ae=async()=>{if(!(!w||I)){B(!0),M(""),O([]);try{const F=await s.importQaReport(a,w,R),fe=F.attachments.rejected.length?`, ${F.attachments.rejected.length} lampiran ditolak`:"";i==null||i(`${F.created?"Diimpor":"Diperbarui"}: ${F.cases} test case, ${F.findings} temuan, ${F.attachments.saved} lampiran${fe}`),O(F.attachments.rejected.map(_e=>`${_e.filename}: ${_e.reason==="missing"?"Berkas belum disertakan. Lampirkan dari laporan yang diimpor.":_e.reason==="type"?"Tipe berkas tidak didukung.":_e.reason}`)),E(!1),N(void 0),L([]),await J(),await Z(F.reportId)}catch(F){M(_t(F))}finally{B(!1)}}};return t.jsxs("div",{className:"hn-qa-stack",children:[t.jsxs("div",{className:"hn-qa-toolbar",children:[t.jsx($e,{"aria-label":"Project",className:"hn-qa-toolbar-project",value:a,onChange:F=>n(F.target.value),options:e.map(F=>({value:F.id,label:F.name}))}),t.jsx(U,{variant:"secondary",disabled:o,loading:o,onClick:()=>void H(),children:"Sinkronkan QA"}),!p&&t.jsxs(t.Fragment,{children:[t.jsx(U,{leftIcon:"plus",onClick:()=>v(!0),children:"Laporan baru"}),t.jsx(U,{variant:"secondary",leftIcon:"upload",onClick:()=>{M(""),E(!0)},children:"Impor Excel, ZIP, atau .md"}),t.jsx(U,{variant:"ghost",leftIcon:"download",as:"a",href:s.qaTemplateUrl(),download:"qa-template.xlsx",children:"Unduh template Excel"})]})]}),!p&&t.jsx("p",{className:"hn-qa-intro",children:"Catat hasil pengujian aplikasi dalam satu laporan. Mulai dengan laporan baru, atau unduh template Excel lalu isi dan impor kembali bersama lampirannya."}),K.length>0&&t.jsx("div",{role:"status",children:t.jsx(ft,{tone:"warn",title:"Laporan berhasil diimpor. Beberapa lampiran perlu ditambahkan.",action:t.jsx(U,{size:"sm",variant:"ghost",onClick:()=>O([]),children:"Tutup"}),children:t.jsx("ul",{className:"hn-qa-note-list",children:K.map((F,fe)=>t.jsx("li",{children:F},fe))})})}),p?t.jsx(tI,{detail:p,projectId:a,onChange:g,onToast:i,onOpenSession:r,startOpen:p.id===f,onBack:()=>{g(null),b(null),J()},onDeleted:()=>{g(null),J()}},p.id):m?t.jsx(ue,{kind:"error",title:"Gagal memuat laporan QA",action:()=>void J(),actionLabel:"Coba lagi"}):d===null?t.jsx(bk,{rows:3,label:"Memuat laporan QA…",rowHeight:64}):t.jsx(nI,{projectId:a,reports:d,onOpen:F=>void Z(F)}),t.jsx(la,{open:S,title:"Impor laporan QA",width:620,onClose:()=>{I||E(!1)},footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",disabled:I,onClick:()=>E(!1),children:"Batal"}),t.jsx(U,{disabled:!w||I,loading:I,onClick:()=>void ae(),children:"Impor laporan"})]}),children:t.jsxs("div",{className:"hn-qa-modal-stack",children:[t.jsx("p",{className:"hn-qa-note",children:"Isi template Excel, lalu pilih berkasnya di bawah. Laporan hasil ekspor juga dapat diimpor kembali."}),t.jsx(oe,{label:"Berkas laporan (wajib)",hint:"Excel (.xlsx), ZIP dengan Excel dan lampiran, atau Markdown (.md).",children:t.jsx("input",{type:"file",className:"hn-qa-file","aria-label":"Berkas laporan (wajib)",accept:".xlsx,.zip,.md",disabled:I,onChange:F=>{var fe;return N((fe=F.target.files)==null?void 0:fe[0])}})}),t.jsx(oe,{label:"Berkas lampiran (opsional)",hint:"Pilih semua screenshot atau log yang disebut pada sheet Lampiran. Nama berkas harus sama dengan kolom Berkas; kolom Pemilik diisi Laporan, TC-01, atau F-01.",children:t.jsx("input",{type:"file",multiple:!0,className:"hn-qa-file","aria-label":"Berkas lampiran (opsional)",accept:".png,.jpg,.jpeg,.webp,.pdf,.md,.txt,.log,.json,.csv",disabled:I,onChange:F=>L(Array.from(F.target.files??[]))})}),t.jsx("p",{className:"hn-qa-note",children:"Maksimal 10 MB per lampiran, 30 lampiran dan 100 MB per laporan. Untuk ZIP, sertakan report.xlsx dan folder attachments/. Gambar yang ditempel di sel Excel perlu disertakan sebagai berkas terpisah."}),A&&t.jsx("p",{role:"alert",className:"hn-qa-error",children:A})]})}),t.jsx(la,{open:x,title:"Laporan QA baru",onClose:()=>v(!1),footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",onClick:()=>v(!1),children:"Batal"}),t.jsx(U,{onClick:()=>void te(),disabled:!y.trim(),children:"Buat"})]}),children:t.jsx(oe,{label:"Judul",hint:"Contoh: Pengujian fitur login versi 1.0",children:t.jsx(Oe,{value:y,autoFocus:!0,placeholder:"mis. Regresi rilis 1.1",onChange:F=>T(F.target.value),onKeyDown:F=>{F.key==="Enter"&&te()}})})})]})}const sI=[{value:"all",label:Cd.all},{value:"worktree",label:Cd.worktree}],rI=e=>!!e.baseSha;function oI(e,a){return a==="all"?e:e.filter(rI)}const lI=[{value:"all",label:Pd.all},{value:"review",label:Pd.review}],dI=new Set;function cI(e,a=[]){const n=new Set;for(const i of e)i.specId&&Ar(i,dI)==="waiting"&&n.add(i.specId);for(const i of a)i.stage==="done"&&i.baseSha&&!i.reviewedAt&&n.add(i.id);return n}function uI(e,a,n){return a==="all"?e:e.filter(i=>n.has(i.id))}function mI({projectId:e,ownBranch:a,eyebrow:n,onClose:i,onIntegrate:r}){const[s,o]=c.useState({local:[],origin:[]}),[l,d]=c.useState(""),u=a;c.useEffect(()=>{let p=!0;return ne.listBranches(e).then(g=>{p&&o({local:g.branches.filter(f=>f!==u),origin:g.remotes.filter(f=>f!==u)})}).catch(()=>{p&&o({local:[],origin:[]})}),()=>{p=!1}},[e,u]);const m=[{value:"",label:"Pilih target…"},...s.local.map(p=>({value:`local:${p}`,label:`${p} (lokal)`})),...s.origin.map(p=>({value:`origin:${p}`,label:`origin/${p}`}))],h=p=>{l&&r(p,l)};return t.jsxs(la,{open:!0,title:"Rebase / Merge",eyebrow:`${n} · ${u}`,icon:"git-merge",onClose:i,children:[t.jsxs("div",{style:{fontSize:13,color:"var(--text-muted)",marginBottom:12,lineHeight:1.5},children:["Rebase menata ulang branch di atas target (force-push balik ke branch itu). Merge menggabungkan branch ke target. Bila ada konflik, sesi agen membereskannya di Terminal — agen, model & effort-nya diatur di ",t.jsx("b",{children:"Settings → Model sesi → Konflik rebase & merge"})," ","— selama kartu itu dinonaktifkan, ia mengikuti default global."]}),t.jsxs("div",{style:{marginBottom:16},children:[t.jsx("div",{className:"hn-eyebrow",style:{marginBottom:4},children:"Target"}),t.jsx($e,{size:"sm","aria-label":"Target",value:l,disabled:m.length===1,onChange:p=>d(p.target.value),options:m})]}),t.jsxs("div",{style:{display:"flex",gap:8,justifyContent:"flex-end"},children:[t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"git-branch",disabled:!l,onClick:()=>h("rebase"),children:"Rebase"}),t.jsx(U,{size:"sm",variant:"primary",leftIcon:"git-merge",disabled:!l,onClick:()=>h("merge"),children:"Merge"})]})]})}function hI(e){return new Date(e.localUpdatedAt)>=new Date(e.serverUpdatedAt)?"local":"server"}function eo(e){if(e===void 0)return"(kosong)";const a=typeof e=="string"?`"${e}"`:JSON.stringify(e)??String(e);return a.length>80?`${a.slice(0,77)}…`:a}function Wh(e){const a=e.localData??{},n=e.serverData??{};return[...new Set([...Object.keys(a),...Object.keys(n)])].filter(r=>JSON.stringify(a[r])!==JSON.stringify(n[r]))}const pI={project:"Project",spec:"Item backlog",vps:"VPS",sessionResult:"Hasil sesi",ticket:"Tiket",ticketAttachment:"Lampiran tiket",customAgent:"Agen kustom",githubIssue:"Issue GitHub",member:"Anggota tim",task:"Tugas",qaReport:"Laporan QA",qaCase:"Kasus QA",qaFinding:"Temuan QA",qaAttachment:"Lampiran QA"},td=e=>pI[e]??"Data",gI={"still-conflict":"Server pusat bergeser lagi sebelum keputusan ini masuk. Coba lagi — datanya sudah disegarkan.","not-found":"Konflik ini sudah tidak ada di server pusat (mungkin sudah diselesaikan dari perangkat lain)."},kI="Server pusat menolak keputusan ini. Muat ulang daftar, lalu coba lagi.";function bI({open:e,onClose:a,onResolved:n}){const[i,r]=c.useState([]),[s,o]=c.useState(!1),[l,d]=c.useState(null),[u,m]=c.useState(null),[h,p]=c.useState(null),{confirm:g,dialog:f}=ot(),b=Date.now(),x=c.useCallback(async()=>{o(!0),d(null);try{r((await ne.listConflicts()).conflicts)}catch(S){r([]),d(ba("memuat daftar konflik",S))}finally{o(!1)}},[]);c.useEffect(()=>{e&&x()},[e,x]);async function v(S,E){const w=`${S.entity}:${S.recordId}`;m(w),p(null);try{const N=await ne.resolveConflict(S.entity,S.recordId,E);N.ok||p(gI[N.reason??""]??kI),await x(),N.ok&&n()}catch(N){p(ba("menghubungi server",N))}finally{m(null)}}function y(S,E){const w=E==="local"?"Lokal":"Server",N=E==="local"?"Server":"Lokal",R=(E==="local"?S.localData:S.serverData)??{},L=(E==="local"?S.serverData:S.localData)??{},I=Wh(S),B=I.length===0?["Tidak ada field yang berbeda antara kedua sisi."]:I.map(A=>`${A}: ${eo(L[A])} → ${eo(R[A])}`);g({title:`Pakai data ${w}?`,message:`Sisi ${N} di server pusat akan diganti dengan data ${w} untuk ${td(S.entity).toLowerCase()} ${S.recordId}.`,impact:B,eyebrow:"konflik sinkron",confirmLabel:`Pakai data ${w}`,tone:"danger",run:()=>v(S,E)}).catch(A=>p(ba("menyelesaikan konflik",A)))}const T=!s&&!l&&i.length===0;return t.jsxs(t.Fragment,{children:[t.jsxs(la,{open:e,title:"Konflik sinkron",eyebrow:"sinkronisasi",icon:"git-merge",width:720,onClose:()=>{u===null&&a()},children:[h&&t.jsx("div",{"data-testid":"resolve-error",role:"alert",className:"hn-reconcile-error",children:h}),s&&i.length===0&&t.jsx(ue,{kind:"loading",compact:!0,title:"Memuat konflik…"}),l&&t.jsx(ue,{kind:"error",compact:!0,title:"Daftar konflik gagal dimuat",hint:l,action:()=>{x()},actionLabel:"Coba lagi"}),T&&t.jsx(ue,{kind:"empty",compact:!0,icon:"git-merge",title:"Tidak ada konflik",hint:"Data lokal dan server sudah sinkron."}),i.map(S=>{const E=hI(S),w=`${S.entity}:${S.recordId}`,N=Wh(S),R=S.localData??{},L=S.serverData??{};return t.jsxs("section",{className:"hn-reconcile-card","aria-label":`${td(S.entity)} ${S.recordId}`,children:[t.jsxs("div",{className:"hn-reconcile-head",children:[t.jsx("strong",{children:td(S.entity)}),t.jsx("span",{className:"hn-reconcile-id",children:S.recordId}),t.jsxs("span",{"data-testid":"default-side",className:"hn-reconcile-hint",children:["disarankan: ",E==="local"?"Lokal":"Server"," (diubah terakhir)"]})]}),t.jsxs("div",{className:"hn-reconcile-meta",children:[t.jsxs("span",{children:["Lokal v",S.localVersion," · ",xt(S.localUpdatedAt,b)||"—"]}),t.jsxs("span",{children:["Server v",S.serverVersion," · ",xt(S.serverUpdatedAt,b)||"—"]})]}),N.length===0?t.jsx("p",{className:"hn-reconcile-same",children:"Kedua sisi berisi data yang sama."}):t.jsxs("dl",{className:"hn-reconcile-fields","aria-label":"Field yang berbeda",children:[t.jsxs("div",{className:"hn-reconcile-field hn-reconcile-field-head","aria-hidden":"true",children:[t.jsx("dt",{children:"Field"}),t.jsx("dd",{children:"Lokal"}),t.jsx("dd",{children:"Server"})]}),N.map(I=>t.jsxs("div",{className:"hn-reconcile-field",children:[t.jsx("dt",{children:I}),t.jsxs("dd",{children:[t.jsx("span",{className:"hn-reconcile-side",children:"Lokal"}),t.jsx("code",{children:eo(R[I])})]}),t.jsxs("dd",{children:[t.jsx("span",{className:"hn-reconcile-side",children:"Server"}),t.jsx("code",{children:eo(L[I])})]})]},I))]}),t.jsxs("div",{className:"hn-reconcile-actions",children:[t.jsx(U,{size:"sm",variant:E==="local"?"primary":"secondary",disabled:u!==null,loading:u===w,onClick:()=>y(S,"local"),children:"Pakai Lokal"}),t.jsx(U,{size:"sm",variant:E==="server"?"primary":"secondary",disabled:u!==null,onClick:()=>y(S,"server"),children:"Pakai Server"})]})]},w)})]}),f]})}let nd=null;function fI(){const[e,a]=c.useState(!1);return c.useEffect(()=>{nd||(nd=(async()=>{var i;try{return((i=(await ne.getConfig()).sync)==null?void 0:i.running)??!1}catch{return!1}})());let n=!0;return nd.then(i=>{n&&a(i)}),()=>{n=!1}},[]),e}function yI({onDone:e,onToast:a}){const n=fI(),[i,r]=c.useState(""),[s,o]=c.useState(!1),[l,d]=c.useState(0),u=c.useCallback(()=>{ne.getSyncPending().then(h=>d(h.total)).catch(()=>d(0))},[]);if(c.useEffect(()=>{n&&u()},[n,u]),!n)return null;async function m(h){r(h?"full":"once");try{const p=h?await ne.syncNow({full:!0}):await ne.syncNow();p.ok?a(`Sinkron: ↓${p.pulled??0} ↑${p.pushed??0}`+(p.deleted?` ⨯${p.deleted}`:"")+(p.conflicts?` · ${p.conflicts} konflik`:""),p.conflicts?"warn":"ok",p.conflicts?"triangle-alert":"check"):a("Instance ini hub — tak ada sync manual","info","info"),p.ok&&p.conflicts&&o(!0),e(),u()}catch{a("Gagal sync","err","x-circle")}finally{r("")}}return t.jsxs(t.Fragment,{children:[t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"rotate-ccw",onClick:()=>m(!1),disabled:i!=="",children:i==="once"?"Menyinkron…":"Sync"}),t.jsx(U,{size:"sm",variant:"ghost",leftIcon:"history",onClick:()=>m(!0),disabled:i!=="",title:"Tarik ulang seluruh feed dari awal — untuk data lama yang tak ikut tersinkron",children:i==="full"?"Menarik ulang…":"Tarik ulang"}),l>0&&t.jsxs("span",{className:"hn-muted",style:{fontSize:12},title:"Penghapusan sudah tercatat di mesin ini dan akan menyeberang ke hub pada sync berikutnya",children:[l," hapus menunggu"]}),t.jsx(bI,{open:s,onClose:()=>o(!1),onResolved:e})]})}const Vh={qa:{label:zi.qa,icon:"bug",tone:"err",color:"var(--clay-500)"},audit:{label:zi.audit,icon:"search",tone:"info",color:"var(--wind-600)"},brief:{label:zi.brief,icon:"lightbulb",tone:"brass",color:"var(--brass-500)"},goal:{label:zi.goal,icon:"target",tone:"brass",color:"var(--brass-700)"},help:{label:zi.help,icon:"life-buoy",tone:"info",color:"var(--wind-500)"},no_effort:{label:zi.no_effort,icon:"zap",tone:"brass",color:"var(--brass-400)"}},ai=e=>Vh[e]??Vh.brief,vI=br.options.map(e=>({value:e,label:ai(e).label})),xI=[["context","Konteks","mis. operator harus membuka tiga layar untuk tahu sesi mana yang menunggu"],["outcome","Outcome","mis. satu badge di Overview menunjukkan jumlah sesi yang menunggu"],["constraints","Batasan","mis. reuse queue yang ada"]],jI=[["goal","Goal","mis. p95 GET /api/specs di bawah 200 ms"],["done","Selesai bila","mis. output benchmark menunjukkan < 200 ms"],["constraints","Batasan","mis. tanpa cache eksternal"]],wI=[["severity","Severity",""],["steps","Langkah reproduksi",`1. Buka …
|
|
1009
1009
|
2. Lakukan …
|
|
1010
|
-
3. Amati …`],["expected","Diharapkan","mis. total funnel sama dengan jumlah baris laporan harian"],["actual","Aktual","mis. total funnel dua kali lipat untuk sesi yang melewati tengah malam"],["env","Environment","prod · web · v0.9.2"],["constraints","Batasan","mis. jangan ubah kontrak API"]],tc={brief:xI,qa:wI,goal:jI},nc=[{value:"tinggi",label:ms.tinggi},{value:"sedang",label:ms.sedang},{value:"rendah",label:ms.rendah}],df=[{value:"critical",label:Tl.critical},{value:"major",label:Tl.major},{value:"minor",label:Tl.minor}];function SI({spec:e,onClose:a,onSubmit:n}){var E;const i=e.stage!=="brainstorming"||e.baseSha!=null,r=vI.filter(w=>w.value!==e.source),[s,o]=c.useState(((E=r[0])==null?void 0:E.value)??""),l=i&&ur(s)!==ur(e.source),d=i&&!l,u=c.useMemo(()=>xy(s,e.payload),[s,e.payload]),[m,h]=c.useState(()=>u.payload),[p,g]=c.useState(null),[f,b]=c.useState(!1);c.useEffect(()=>{h(u.payload),g(null)},[s]);const x=w=>N=>h(R=>({...R,[w]:N.target.value})),v=Ti(s),y=tc[v]??[],T=w=>{var N;return((N=(tc[dc(e.payload)]??[]).find(([R])=>R===w))==null?void 0:N[1])??w};async function S(w){if(!f){b(!0);try{const N=await n(s,d?void 0:{...m},w);N&&N.pending?g(N):a()}finally{b(!1)}}}return p?t.jsxs(la,{open:!0,title:"Item ini akan dikembalikan ke Brainstorming",icon:"rotate-ccw",eyebrow:`${e.id} · ${ai(e.source).label} → ${ai(s).label}`,onClose:f?void 0:a,children:[t.jsxs("div",{className:"hn-dia-lead hn-dia-lead-sm",children:["Alur kerja ",ai(s).label," berbeda dari yang sudah dikerjakan, jadi item ini mulai lagi dari awal. Kode yang sudah ter-commit di branch lain tak disentuh."]}),t.jsxs("ul",{"data-testid":"source-reset-impact",className:"hn-dia-impact",children:[p.wouldDelete.map(w=>t.jsx("li",{children:w},w)),p.worktree&&t.jsx("li",{children:p.worktree}),p.branch&&t.jsx("li",{children:p.branch}),!p.wouldDelete.length&&!p.worktree&&!p.branch&&t.jsx("li",{children:"tak ada berkas yang perlu dibuang — hanya tahapnya yang mundur"})]}),t.jsxs("div",{className:"hn-dia-foot",children:[t.jsx(U,{size:"sm",variant:"secondary",disabled:f,onClick:a,children:"Batal"}),t.jsx(U,{size:"sm",variant:"danger",leftIcon:"rotate-ccw",loading:f,onClick:()=>S(!0),children:"Reset & ubah type"})]})]}):t.jsxs(la,{open:!0,title:"Ubah type backlog item",icon:"shuffle",eyebrow:`${e.id} · ${ai(e.source).label}`,onClose:a,children:[t.jsx(oe,{label:"Type tujuan",children:t.jsx($e,{"aria-label":"Type tujuan",value:s,onChange:w=>o(w.target.value),options:r,className:"hn-dia-full"})}),!r.length&&t.jsx("div",{className:"hn-dia-note",children:"Tak ada type lain yang bisa dituju. Dialog tetap terbuka dan mengatakannya — menolak dengan diam adalah bug yang melahirkan ADR-0149."}),d?t.jsxs("div",{className:"hn-dia-note",children:["Item ini sudah pernah dikerjakan sesi, dan type tujuannya memakai alur kerja yang sama — yang berpindah hanya ",t.jsx("strong",{children:"labelnya"}),". Isi, worktree, dan berkas fase tak disentuh."]}):t.jsxs(t.Fragment,{children:[l&&t.jsxs("div",{"data-testid":"source-reset-warning",className:"hn-dia-box",children:[t.jsx(ra,{tone:"warn",size:"sm",children:"alur kerja berbeda"})," ","Item ini akan kembali ke tahap ",t.jsx("strong",{children:"Brainstorming"}),"; dokumen fase, worktree, dan branch sesi lamanya dihapus. Daftar persisnya ditampilkan sebelum kamu menyetujui."]}),u.dropped.length>0&&t.jsxs("div",{"data-testid":"source-dropped",className:"hn-dia-box hn-dia-box-muted",children:[t.jsx(ra,{tone:"warn",size:"sm",children:"tak punya padanan"})," ",u.dropped.map(T).join(", ")," tidak ada di bentuk"," ",ai(s).label,". Teks lamanya tetap tersimpan di"," ",t.jsx("strong",{children:"jejak konversi"})," item ini."]}),v!=="qa"&&t.jsx(oe,{label:"Prioritas",children:t.jsx($e,{"aria-label":"Prioritas",value:m.priority??"sedang",onChange:x("priority"),options:nc,className:"hn-dia-full"})}),y.map(([w,N,R])=>t.jsx(oe,{label:N,children:w==="severity"?t.jsx($e,{"aria-label":N,value:m[w]??"minor",onChange:x(w),options:df,className:"hn-dia-full"}):t.jsx(Ma,{"aria-label":N,value:m[w]??"",onChange:x(w),rows:2,placeholder:R})},w))]}),t.jsxs("div",{className:"hn-dia-foot hn-dia-foot-tight",children:[t.jsx(U,{size:"sm",variant:"secondary",onClick:a,children:"Batal"}),t.jsx(U,{size:"sm",variant:"primary",leftIcon:"shuffle",loading:f,disabled:!r.length,onClick:()=>S(),children:"Ubah type"})]})]})}const Yh=280;function cf({spec:e,onClose:a,onSubmit:n}){const[i,r]=c.useState(""),[s,o]=c.useState(null),[l,d]=c.useState(!1),u=c.useRef(!1);async function m(){if(!u.current){u.current=!0,d(!0);try{const h=await n(e,i.trim(),s!==null);if(h&&"needConfirm"in h){o(h.sessionId??"");return}h&&a()}finally{u.current=!1,d(!1)}}}return t.jsxs(la,{open:!0,title:"Tandai selesai",icon:"circle-check",eyebrow:e.id+" · "+e.projectId,onClose:l?void 0:a,children:[t.jsx("div",{style:{fontSize:13,color:"var(--text-muted)",lineHeight:1.55,marginBottom:14},children:"Item keluar dari daftar siap-kerja dan berstatus selesai — sama seperti item yang selesai lewat sesi. Kode, commit, dan dokumen tidak disentuh, dan status ini masih bisa dikembalikan lewat “Ubah status”."}),s!==null&&t.jsxs("div",{"data-testid":"mark-done-live",style:{border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",background:"var(--bone-100)",padding:10,marginBottom:14,fontSize:12.5,color:"var(--text-strong)",lineHeight:1.5},children:["Masih ada sesi yang berjalan untuk item ini",s?` (${s})`:"",". Menandainya selesai tidak menghentikan sesi itu — tutup sesinya dari Terminal bila memang sudah tak dibutuhkan."]}),t.jsx(oe,{label:"Alasan singkat (opsional)",hint:`${i.trim().length}/${Yh} — mis. “sudah ter-merge lewat PR #12”`,children:t.jsx(Ma,{"aria-label":"Alasan singkat (opsional)",rows:2,value:i,maxLength:Yh,disabled:l,onChange:h=>r(h.target.value),placeholder:"sudah dikerjakan langsung di checkout"})}),t.jsxs("div",{style:{display:"flex",gap:8,justifyContent:"flex-end"},children:[t.jsx(U,{size:"sm",variant:"secondary",disabled:l,onClick:a,children:"Batal"}),t.jsx(U,{size:"sm",variant:"primary",leftIcon:"circle-check",loading:l,onClick:m,children:s!==null?"Tandai selesai — sesi tetap berjalan":"Tandai selesai"})]})]})}const pn=[{key:"brainstorming",label:"Brainstorm"},{key:"objective",label:"Objective"},{key:"spec-ready",label:"Spec"},{key:"planned",label:"Plan"},{key:"executing",label:"Execute"},{key:"done",label:"Done"}],uf=e=>pn.findIndex(a=>a.key===e),mf={brainstorming:"Brainstorm: ide digali bersama agen sebelum tujuan dikunci",objective:"Objective: tujuan terukur dikunci sebelum spec ditulis","spec-ready":"Spec: dokumen spesifikasi ditulis",planned:"Plan: rencana langkah disusun",executing:"Execute: kode dikerjakan di worktree sesi",done:"Done: item selesai"},lr=[{key:"all",label:"Semua",stages:pn.map(e=>e.key)},{key:"brainstorm",label:"Brainstorm",stages:["brainstorming","objective"]},{key:"spec",label:"Spec",stages:["spec-ready","planned"]},{key:"doing",label:"Dikerjakan",stages:["executing"]},{key:"done",label:"Selesai",stages:["done"]}],Jh=(e,a)=>{var n;return a==="all"||(((n=lr.find(i=>i.key===a))==null?void 0:n.stages.includes(e))??!1)},_I=e=>{var a;return((a=lr.find(n=>n.key!=="all"&&n.stages.includes(e)))==null?void 0:a.label)??e},AI={brainstorming:"idle",objective:"idle","spec-ready":"queued",planned:"queued",executing:"running",done:"done"},EI=e=>e==="brainstorming"?"Mulai":"Lanjutkan",Qh={tinggi:{tone:"brass",label:ms.tinggi,level:"high"},sedang:{tone:"neutral",label:ms.sedang,level:"mid"},rendah:{tone:"neutral",label:ms.rendah,level:"low"}},Ho=e=>Qh[e]??Qh.sedang,Zh=[{value:"all",label:"Semua sumber"},{value:"brief",label:"Dari brief"},{value:"qa",label:"Dari QA"},{value:"audit",label:"Audit"},{value:"goal",label:"Goal"},{value:"help",label:"Help Center"},{value:"no_effort",label:"Tanpa effort"}],TI=[{value:"all",label:"Semua prioritas"},{value:"tinggi",label:"Tinggi"},{value:"sedang",label:"Sedang"},{value:"rendah",label:"Rendah"}],Xh={audit:"Audit: hasil pemeriksaan project. Dari sini bisa dinaikkan jadi Finding QA, feature brief, atau PRD.",goal:"Goal: item dengan tujuan terukur. Dikerjakan dua fase (Goal lalu Verifikasi) tanpa tahap perencanaan.",no_effort:"Tanpa effort: tugas remeh yang dikerjakan satu fase, tanpa perencanaan maupun verifikasi."},hf=e=>e==="missing"?"tak ditemukan":e==="unmerged"?"belum ter-merge":"belum selesai";function mu({spec:e}){const a=e.blockedBy??[];return a.length?t.jsx(ra,{tone:"warn",size:"sm",icon:"lock",title:a.map(n=>`${n.id} — ${hf(n.reason)}`).join(" · "),children:"Terblokir"}):null}function hu({priority:e}){const a=Ho(e);return t.jsx("span",{className:`hn-bl-prio hn-bl-prio-${a.level}`,title:`Prioritas ${a.label}`,children:t.jsxs("span",{className:"hn-sr-only",children:["Prioritas ",a.label]})})}function pf({source:e}){const a=ai(e);return t.jsxs("span",{className:"hn-bl-source",children:[t.jsx(Re,{name:a.icon,size:12,color:a.color}),a.label]})}function gf({stage:e}){return t.jsx(pt,{status:AI[e]??"idle",size:"sm",variant:"dot",className:"hn-bl-stage-pill",title:mf[e],children:_I(e)})}function CI({stage:e}){var i;const a=uf(e),n=((i=pn[a])==null?void 0:i.label)??e;return t.jsx("div",{role:"progressbar","aria-label":`Status ${n}`,"aria-valuemin":0,"aria-valuemax":pn.length-1,"aria-valuenow":Math.max(a,0),"aria-valuetext":n,className:"hn-bl-stagebar",children:pn.map((r,s)=>{const o=s<a||e==="done",l=s===a&&e!=="done",d=o?"done":l?"active":"todo";return t.jsxs("span",{className:"hn-bl-stage","data-state":d,title:mf[r.key],children:[t.jsx("span",{className:"hn-bl-stage-dot","aria-hidden":"true"}),l&&t.jsx("span",{className:"hn-bl-stage-label",children:r.label})]},r.key)})})}function ep({label:e,value:a}){return t.jsxs("div",{className:"hn-bl-field",children:[t.jsx("div",{className:"hn-eyebrow",children:e}),t.jsx("div",{className:"hn-bl-field-value",children:a||"—"})]})}const PI={qa:"Finding QA — ada yang perlu diperbaiki.",brief:"Feature brief — kebutuhan yang bentuknya sudah jelas.",prd:"PRD — kebutuhan produk yang perlu didefinisikan dulu."},id=(e,a)=>e&&e.target===a?"primary":"secondary",ap=e=>e==="audit";function MI({spec:e,onClose:a,onEditBranch:n,onRevertStage:i,onMarkDone:r,onOpenReview:s,onStart:o,onIntegrate:l,onEditSpec:d,onPromoteToQa:u,onPromoteToBrief:m,onPromoteToPrd:h,onEditDeps:p,onEditAutoMerge:g,onChangeSource:f,onRequestDelete:b,onUndoable:x,projectPolicy:v,allSpecs:y,onAttachmentToast:T,running:S,onOpenRun:E,projectName:w,presenceOn:N}){var nt,Wa,ea;const[R,L]=c.useState([]),[I,B]=c.useState(new Set),[A,M]=c.useState(null),[K,O]=c.useState(""),[J,Z]=c.useState(!1),[H,te]=c.useState(!1),ae=c.useRef(!1),[F,fe]=c.useState(!1),[_e,ee]=c.useState(!1),[X,ce]=c.useState(!1),[se,Ce]=c.useState(!1),[Te,le]=c.useState({}),xa=(e==null?void 0:e.stage)==="brainstorming"&&(e==null?void 0:e.baseSha)==null&&!!d&&e.payload!==void 0,Ze=()=>{if(!e)return;const ge=e.payload||{};le({title:e.title,priority:e.priority,...ge}),Ce(!0)},He=ge=>be=>le(ca=>({...ca,[ge]:be.target.value})),[Ke,ga]=c.useState(null),Ge=e&&ap(e.source)?e.id:null;c.useEffect(()=>{var be;if(ga(null),!Ge)return;let ge=!0;return(be=ne.getEscalation)==null||be.call(ne,Ge).then(ca=>{ge&&ga(ca.escalation)}).catch(()=>{ge&&ga(null)}),()=>{ge=!1}},[Ge]);const fa=()=>{if(!e||!d)return;const ge=e.source==="qa"?{title:Te.title,payload:{severity:Te.severity,steps:Te.steps,expected:Te.expected,actual:Te.actual,env:Te.env,constraints:Te.constraints??""}}:Ti(e.source)==="goal"?{title:Te.title,priority:Te.priority,payload:{goal:Te.goal,done:Te.done??"",constraints:Te.constraints??"",priority:Te.priority}}:{title:Te.title,priority:Te.priority,payload:{context:Te.context,outcome:Te.outcome,constraints:Te.constraints,priority:Te.priority}};d(e,ge),Ce(!1)},Aa=ge=>{if(!e||!d||ge===e.priority)return;const be=e.priority;d(e,{priority:ge}),x==null||x(`Prioritas ${e.id} diubah ke ${Ho(ge).label}`,()=>d(e,{priority:be}))},ma=e==null?void 0:e.projectId;c.useEffect(()=>{if(!ma){L([]),B(new Set);return}let ge=!0;return ne.listBranches(ma).then(be=>{if(ge){const ca=[...new Set([...be.branches,...be.remotes])].sort();L(ca),B(new Set(be.remotes.filter(Na=>!be.branches.includes(Na))))}}).catch(()=>{ge&&(L([]),B(new Set))}),()=>{ge=!1}},[ma]),c.useEffect(()=>{K&&O(""),A&&M(null)},[e==null?void 0:e.id,e==null?void 0:e.stage]);async function Se(ge){if(!ae.current){ae.current=!0,te(!0);try{return await ge()}finally{ae.current=!1,te(!1)}}}async function Je(){if(!e||!i||!K)return;const ge=await Se(()=>i(e,K));ge&&ge.pending?M({target:K,files:ge.wouldDelete}):ge&&O("")}async function q(){if(!e||!i||!A)return;await Se(()=>i(e,A.target,!0))&&(M(null),O(""))}function Be(){A||ae.current||(Ce(!1),a())}if(!e)return null;const me=pn.slice(0,uf(e.stage)),We=((nt=pn.find(ge=>ge.key===e.stage))==null?void 0:nt.label)??e.stage,ia=((Wa=pn.find(ge=>ge.key===K))==null?void 0:Wa.label)??K,ye=e.source==="qa",oa=Ti(e.source),we=e.payload||{},xe=(y??[]).filter(ge=>ge.projectId===e.projectId&&ge.id!==e.id),Xe=tc[oa],Pa=ai(e.source);return t.jsxs(la,{open:!0,title:e.title,eyebrow:e.id,icon:Pa.icon,onClose:Be,width:600,children:[t.jsxs("div",{className:"hn-bl-detail",children:[t.jsxs("section",{className:"hn-bl-section","aria-labelledby":"bl-sec-ringkasan",children:[t.jsx("h3",{id:"bl-sec-ringkasan",className:"hn-bl-section-title",children:"Ringkasan"}),t.jsxs("div",{className:"hn-bl-summary-meta",children:[t.jsx(gf,{stage:e.stage}),t.jsxs("span",{className:"hn-bl-prio-text",children:[t.jsx(hu,{priority:e.priority}),Ho(e.priority).label]}),t.jsx(mu,{spec:e}),t.jsx(dl,{names:N})]}),t.jsx(CI,{stage:e.stage}),se?t.jsx(oe,{label:"Judul",children:t.jsx(Oe,{value:Te.title??"",onChange:He("title"),placeholder:"mis. Jadwal invoice berulang",className:"hn-bl-full"})}):t.jsx(ep,{label:"Tujuan",value:e.objective}),t.jsxs("dl",{className:"hn-bl-facts",children:[t.jsxs("div",{children:[t.jsx("dt",{children:"Project"}),t.jsx("dd",{children:w??e.projectId})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Penulis"}),t.jsx("dd",{children:e.author||"—"})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Dibuat"}),t.jsx("dd",{children:II(e.createdAt)||"—"})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Branch asal"}),t.jsx("dd",{children:e.branchFrom||"—"})]})]}),xa&&!se&&t.jsxs("div",{className:"hn-bl-inline-row",children:[t.jsx($e,{size:"sm","aria-label":"Prioritas item ini",value:e.priority,onChange:ge=>Aa(ge.target.value),options:nc}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"pencil",onClick:Ze,children:"Edit"})]}),se?t.jsxs(t.Fragment,{children:[!ye&&t.jsx(oe,{label:"Prioritas",children:t.jsx($e,{value:Te.priority??"sedang",onChange:He("priority"),options:nc,className:"hn-bl-full"})}),Xe.map(([ge,be,ca])=>t.jsx(oe,{label:be,children:ge==="severity"?t.jsx($e,{value:Te[ge]??"major",onChange:He(ge),options:df,className:"hn-bl-full"}):t.jsx(Ma,{value:Te[ge]??"",onChange:He(ge),rows:2,placeholder:ca})},ge)),t.jsxs("div",{className:"hn-bl-inline-row hn-bl-end",children:[t.jsx(U,{size:"sm",variant:"secondary",onClick:()=>Ce(!1),children:"Batal"}),t.jsx(U,{size:"sm",variant:"primary",leftIcon:"check",onClick:fa,children:"Simpan"})]})]}):Xe.map(([ge,be])=>t.jsx(ep,{label:be,value:we[ge]??""},ge)),e.manualDone&&t.jsxs("div",{className:"hn-bl-field","data-testid":"manual-done-trail",children:[t.jsx("div",{className:"hn-eyebrow",children:"Ditandai selesai manual"}),t.jsxs("div",{className:"hn-bl-field-value hn-bl-muted",children:[e.manualDone.by," · ",new Date(e.manualDone.at).toLocaleString("id-ID"),e.manualDone.reason?t.jsx("div",{className:"hn-bl-gap-top",children:e.manualDone.reason}):null]})]})]}),t.jsxs("div",{className:"hn-bl-cta",children:[S&&E&&t.jsx(U,{variant:"primary",leftIcon:"terminal",onClick:()=>E(e),children:"Buka sesi"}),!S&&o&&t.jsx(U,{variant:"primary",leftIcon:"play",onClick:()=>o(e),children:"Jalankan"}),e.stage==="done"&&t.jsx("span",{className:"hn-bl-hint",children:"Sesi baru melanjutkan sisa kerja item ini."})]}),t.jsxs("section",{className:"hn-bl-section","aria-labelledby":"bl-sec-review",children:[t.jsx("h3",{id:"bl-sec-review",className:"hn-bl-section-title",children:"Review, dokumen, dan lampiran"}),t.jsxs("div",{className:"hn-bl-inline-row",children:[s&&t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"git-compare",onClick:()=>{s(e),a()},children:"Review perubahan"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"file-text",onClick:()=>ee(!0),children:"Lihat dokumen"})]}),ap(e.source)&&(u||m||h)&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Tindak lanjut"}),Ke&&t.jsxs("div",{className:"hn-bl-hint",children:[Ke.target==="none"?t.jsxs("span",{children:["Audit menilai ",t.jsx("strong",{children:"cukup jawaban"})," — tak perlu perbaikan."]}):t.jsxs("span",{children:[t.jsx(ra,{tone:"brass",size:"sm",children:"direkomendasikan hanoman"})," ",PI[Ke.target]]}),Ke.reason?t.jsx("div",{className:"hn-bl-gap-top",children:Ke.reason}):null]}),t.jsxs("div",{className:"hn-bl-inline-row",children:[u&&t.jsx(U,{size:"sm",variant:id(Ke,"qa"),leftIcon:"bug",onClick:()=>u(e,Ke),children:"Jadikan Finding QA"}),m&&t.jsx(U,{size:"sm",variant:id(Ke,"brief"),leftIcon:"lightbulb",onClick:()=>m(e,Ke),children:"Jadikan Feature brief"}),h&&t.jsx(U,{size:"sm",variant:id(Ke,"prd"),leftIcon:"scroll-text",onClick:()=>h(e,Ke),children:"Jadikan PRD"})]})]}),t.jsx(tT,{specId:e.id,onToast:T??(()=>{})})]}),t.jsxs("details",{className:"hn-bl-advanced","data-testid":"spec-advanced",children:[t.jsx("summary",{children:"Lanjutan"}),t.jsxs("div",{className:"hn-bl-advanced-body",children:[t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Branch worktree"}),t.jsx($e,{size:"sm",value:e.branchFrom??"",disabled:!R.length,onChange:ge=>n&&n(e,ge.target.value||null),options:cb(R,I)})]}),t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Bergantung pada"}),(e.dependsOn??[]).length===0?t.jsx("div",{className:"hn-bl-hint",children:"— berdiri sendiri"}):t.jsx("div",{className:"hn-bl-stack-list",children:(e.dependsOn??[]).map(ge=>{const be=(e.blockedBy??[]).find(ca=>ca.id===ge);return t.jsxs("div",{className:"hn-bl-dep",children:[t.jsx("span",{className:"hn-bl-id",children:ge}),be?t.jsx(ra,{tone:"warn",size:"sm",children:hf(be.reason)}):t.jsx(ra,{tone:"ok",size:"sm",icon:"check",children:"selesai & ter-merge"})]},ge)})}),p&&xe.length>0&&t.jsx("div",{className:"hn-bl-checklist",children:xe.map(ge=>{const be=(e.dependsOn??[]).includes(ge.id);return t.jsx(vs,{"aria-label":`Bergantung pada ${ge.id}`,checked:be,label:`${ge.id} · ${ge.title}`,onChange:()=>p(e,be?(e.dependsOn??[]).filter(ca=>ca!==ge.id):[...e.dependsOn??[],ge.id])},ge.id)})})]}),g&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Auto-merge saat selesai"}),t.jsx($e,{size:"sm","aria-label":"Auto-merge item ini",value:e.autoMerge?e.autoMerge.mode:"inherit",onChange:ge=>{var ca;const be=ge.target.value;if(be==="inherit")return g(e,null);if(be==="off")return g(e,{...ls});g(e,{...e.autoMerge??ls,mode:be,branch:be==="branch"?((ca=e.autoMerge)==null?void 0:ca.branch)??R[0]??null:null})},options:[{value:"inherit",label:`Ikut project (${Ip(My(v,null))})`},{value:"off",label:"Tanpa auto-merge untuk item ini"},{value:"default-branch",label:"Auto-merge ke default branch repo"},{value:"branch",label:"Auto-merge ke branch tujuan…"}]}),((ea=e.autoMerge)==null?void 0:ea.mode)==="branch"&&t.jsx("div",{className:"hn-bl-gap-top",children:t.jsx($e,{size:"sm","aria-label":"Branch tujuan item ini",value:e.autoMerge.branch??"",onChange:ge=>g(e,{...e.autoMerge,branch:ge.target.value||null}),options:[{value:"",label:"Pilih branch…"},...R.map(ge=>({value:ge,label:ge}))]})})]}),(i||r)&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Ubah status"}),t.jsx("div",{className:"hn-bl-status-now",children:`Status saat ini: ${We}`}),e.stage!=="done"&&r&&t.jsx("div",{className:"hn-bl-gap-bottom",children:t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"circle-check",onClick:()=>Z(!0),children:"Tandai selesai"})}),i?me.length>0?t.jsxs(t.Fragment,{children:[t.jsx($e,{size:"sm","aria-label":"Kembalikan stage",value:K,onChange:ge=>O(ge.target.value),disabled:H,placeholder:"Pilih status lebih awal…",options:me.map(ge=>({value:ge.key,label:"← "+ge.label}))}),t.jsx("div",{className:"hn-bl-hint hn-bl-gap-top",children:"Status saat ini dan status berikutnya tidak dapat dipilih. Kemajuan hanya berasal dari fase sesi."}),K&&t.jsxs("div",{className:"hn-bl-callout",children:[t.jsxs("div",{className:"hn-bl-callout-title",children:[We," → ",ia]}),"Fase sesi yang sudah berjalan tidak dibatalkan. Dokumen Spec/Plan di atas target mungkin perlu dihapus setelah konfirmasi; kode dan commit tidak disentuh."]}),t.jsx("div",{className:"hn-bl-gap-top",children:t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"rotate-ccw",disabled:!K,loading:H,onClick:Je,children:"Simpan status"})})]}):t.jsxs("div",{className:"hn-bl-hint",children:[We," adalah status paling awal. Kemajuan hanya berasal dari fase sesi."]}):null]}),e.stage==="done"&&l&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Integrasi"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"git-merge",onClick:()=>fe(!0),children:"Rebase / Merge"})]}),f&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Type"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"shuffle",onClick:()=>ce(!0),children:"Ubah type"})]}),(e.sourceHistory??[]).length>0&&t.jsxs("div",{className:"hn-bl-subsection","data-testid":"source-trail",children:[t.jsx("div",{className:"hn-eyebrow",children:"Jejak konversi type"}),t.jsx("div",{className:"hn-bl-stack-list",children:(e.sourceHistory??[]).map((ge,be)=>t.jsxs("div",{className:"hn-bl-trail",children:[t.jsxs("span",{className:"hn-bl-id",children:[ge.from," → ",ge.to]})," · ",new Date(ge.at).toLocaleString("id-ID")," · ",ge.by]},`${ge.at}-${be}`))})]})]})]}),b&&t.jsxs("section",{className:"hn-bl-danger","aria-labelledby":"bl-sec-bahaya",children:[t.jsx("h3",{id:"bl-sec-bahaya",className:"hn-bl-section-title",children:"Zona berbahaya"}),t.jsx("div",{className:"hn-bl-hint",children:"Menghapus item tak bisa dibatalkan. Kode dan commit di repo tidak disentuh."}),t.jsx("div",{className:"hn-bl-gap-top",children:t.jsx(U,{size:"sm",variant:"danger",leftIcon:"trash-2",onClick:()=>b(e),children:"Hapus spec"})})]})]}),A&&t.jsxs(la,{open:!0,title:"Kembalikan status & hapus dokumen fase",icon:"rotate-ccw",eyebrow:e.id+" → "+A.target,onClose:H?void 0:()=>M(null),children:[t.jsxs("div",{className:"hn-bl-confirm-lead",children:[A.files.length," berkas docs akan dihapus dari disk (kode & commit tak disentuh):"]}),t.jsx("ul",{className:"hn-bl-file-list",children:A.files.map(ge=>t.jsx("li",{children:ge},ge))}),t.jsxs("div",{className:"hn-bl-inline-row hn-bl-end",children:[t.jsx(U,{size:"sm",variant:"secondary",disabled:H,onClick:()=>M(null),children:"Batal"}),t.jsx(U,{size:"sm",variant:"danger",leftIcon:"trash-2",loading:H,onClick:q,children:"Hapus & kembalikan"})]})]}),F&&l&&t.jsx(mI,{projectId:e.projectId,ownBranch:`hanoman/${e.id.toLowerCase().replace(/[^a-z0-9_-]/g,"_")}`,eyebrow:e.id,onClose:()=>fe(!1),onIntegrate:(ge,be)=>{fe(!1),l(e,ge,be)}}),J&&r&&t.jsx(cf,{spec:e,onClose:()=>Z(!1),onSubmit:r}),_e&&t.jsx(ou,{specId:e.id,onClose:()=>ee(!1)}),X&&f&&e.payload!==void 0&&t.jsx(SI,{spec:e,onClose:()=>ce(!1),onSubmit:(ge,be,ca)=>Promise.resolve(f(e,ge,be,ca)??null)})]})}function kf({spec:e,onStart:a,onDelete:n,onOpenRun:i,onOpenReview:r,onMarkDone:s,onMarkReviewed:o,running:l}){const[d,u]=c.useState(!1),[m,h]=c.useState(!1),p=e.stage!=="done",g=l?i?{label:"Buka sesi",icon:"terminal",run:()=>i(e)}:null:p?a?{label:EI(e.stage),icon:"play",run:()=>a(e)}:null:r?{label:"Review perubahan",icon:"git-compare",run:()=>r(e)}:null,b=[...!!r&&(g==null?void 0:g.label)!=="Review perubahan"&&r?[{key:"review",label:"Review perubahan",icon:"git-compare",onSelect:()=>r(e)}]:[],{key:"docs",label:"Lihat dokumen",icon:"file-text",onSelect:()=>u(!0)},...!p&&a?[{key:"rerun",label:"Jalankan lagi",icon:"play",onSelect:()=>a(e)}]:[],...p&&s?[{key:"done",label:"Tandai selesai",icon:"circle-check",onSelect:()=>h(!0)}]:[],...!p&&o?[{key:"reviewed",label:e.reviewedAt?"Batalkan tanda ditinjau":"Tandai ditinjau",icon:e.reviewedAt?"rotate-ccw":"circle-check",onSelect:()=>void o(e,!e.reviewedAt)}]:[],...n?[{key:"delete",label:"Hapus spec",icon:"trash-2",tone:"danger",onSelect:()=>n(e)}]:[]];return t.jsxs("div",{className:"hn-bl-actions",children:[g&&t.jsx(U,{size:"sm",variant:"primary",leftIcon:g.icon,onClick:g.run,children:g.label}),t.jsx(sn,{label:`Aksi lain ${e.id}`,items:b}),m&&s&&t.jsx(cf,{spec:e,onClose:()=>h(!1),onSubmit:s}),d&&t.jsx(ou,{specId:e.id,onClose:()=>u(!1)})]})}const II=e=>{const a=e?new Date(e):null;return a&&!Number.isNaN(a.getTime())?a.toLocaleDateString("id-ID",{day:"numeric",month:"short",year:"numeric"}):""};function NI({spec:e,onOpenDetail:a,className:n="hn-bl-title"}){return t.jsx("button",{type:"button",className:n,onClick:()=>a&&a(e),children:e.title})}function RI({spec:e,presenceOn:a,onOpenDetail:n,...i}){return t.jsxs(en,{onClick:n?()=>n(e):void 0,actions:t.jsx(kf,{spec:e,...i}),children:[t.jsx(hu,{priority:e.priority}),t.jsxs("span",{className:"hn-bl-row-body",children:[t.jsx("span",{className:"hn-bl-row-title",children:e.title}),t.jsxs("span",{className:"hn-bl-row-meta",children:[t.jsx("span",{className:"hn-bl-id",children:e.id}),t.jsx(pf,{source:e.source}),t.jsx(gf,{stage:e.stage}),t.jsx(mu,{spec:e}),t.jsx(dl,{names:a})]})]})]})}const cl="backlog",bf="success",LI=pn[0].key,tp=[{key:cl,label:"Backlog",icon:"inbox"},...pn.slice(0,5).map(e=>({key:e.key,label:e.label})),{key:bf,label:"Success",icon:"check-circle-2"}];function BI(e,a){return e.stage==="done"?bf:!a&&e.stage==="brainstorming"?cl:e.stage}const np=(e,a)=>e===cl&&a===LI;function $I({spec:e,col:a,onOpenDetail:n,presenceOn:i,onDragStart:r,onDragEnd:s,dragging:o,...l}){const d=a===cl;return t.jsxs("div",{draggable:d,className:"hn-bl-card","data-dragging":o||void 0,onDragStart:u=>{u.dataTransfer.effectAllowed="move",u.dataTransfer.setData("text/plain",e.id),r()},onDragEnd:s,title:d?"Seret ke Brainstorm untuk memulai sesi":"Stage mengikuti fase yang dilaporkan agen — kartu tak bisa dipindah","data-draggable":d||void 0,children:[t.jsxs("div",{className:"hn-bl-card-head",children:[t.jsx(hu,{priority:e.priority}),t.jsx("span",{className:"hn-bl-id",children:e.id}),t.jsx(pf,{source:e.source})]}),t.jsx(NI,{spec:e,onOpenDetail:n}),(e.blockedBy??[]).length>0||i!=null&&i.length?t.jsxs("div",{className:"hn-bl-card-badges",children:[t.jsx(mu,{spec:e}),t.jsx(dl,{names:i})]}):null,t.jsx("div",{className:"hn-bl-card-foot",children:t.jsx(kf,{spec:e,...l})})]})}function DI({specs:e,activeSpecs:a,presenceBySpec:n,onOpenDetail:i,...r}){const[s,o]=c.useState(null),[l,d]=c.useState(null),u=c.useMemo(()=>{var p;const h=new Map(tp.map(g=>[g.key,[]]));for(const g of e)(p=h.get(BI(g,a==null?void 0:a.has(g.id))))==null||p.push(g);return h},[e,a]),m=h=>{s&&np(s.from,h)&&r.onStart&&r.onStart(s.spec),o(null),d(null)};return t.jsx("div",{"data-testid":"backlog-board",className:"hn-board-local-overflow hn-bl-board",children:tp.map(h=>{const p=u.get(h.key),g=!!s&&np(s.from,h.key),f=g&&l===h.key;return t.jsxs("div",{className:"hn-bl-col","data-active":g||void 0,"data-hot":f||void 0,"data-dimmed":s&&!g||void 0,onDragOver:b=>{g&&(b.preventDefault(),b.dataTransfer.dropEffect="move",d(h.key))},onDragLeave:()=>d(b=>b===h.key?null:b),onDrop:b=>{b.preventDefault(),m(h.key)},children:[t.jsxs("div",{className:"hn-bl-col-head",children:[h.icon&&t.jsx(Re,{name:h.icon,size:13,color:"var(--text-muted)"}),t.jsx("span",{className:"hn-eyebrow",children:h.label}),t.jsx("span",{className:"hn-bl-col-count",children:p.length})]}),t.jsx("div",{className:"hn-bl-col-body",children:p.map(b=>t.jsx($I,{spec:b,col:h.key,onOpenDetail:i,presenceOn:n==null?void 0:n.get(b.id),...r,dragging:(s==null?void 0:s.spec.id)===b.id,running:a==null?void 0:a.has(b.id),onDragStart:()=>o({spec:b,from:h.key}),onDragEnd:()=>{o(null),d(null)}},b.id))})]},h.key)})})}const OI=[{value:"list",label:"Daftar",icon:"list"},{value:"board",label:"Papan",icon:"kanban"}];function HI({value:e,onChange:a}){return t.jsx("div",{className:"hn-bl-view-toggle",role:"group","aria-label":"Mode tampilan",children:OI.map(n=>t.jsx("button",{type:"button",className:"hn-bl-view-btn hn-touch-target","aria-pressed":e===n.value,"aria-label":n.label,title:n.label,onClick:()=>a(n.value),children:t.jsx(Re,{name:n.icon,size:15})},n.value))})}const qI=5,UI=new Set;function zI({backlog:e,projects:a,pageSize:n=20,onStart:i,activeSpecs:r,presenceBySpec:s,reviewSpecIds:o=UI,onDelete:l,onOpenRun:d,onOpenReview:u,onNew:m,onEditBranch:h,onRevertStage:p,onMarkDone:g,onMarkReviewed:f,onIntegrate:b,onEditSpec:x,onEditDeps:v,onEditAutoMerge:y,onChangeSource:T,onPromoteToQa:S,onPromoteToBrief:E,onPromoteToPrd:w,projectFilter:N,onProjectFilter:R,dataVersion:L,onToast:I,initialDetailId:B}){var ya,Gt,rn,wt,wn;const[A,M]=Da("backlog","tab","all",Dn),[K,O]=c.useState(0),[J,Z]=Da("backlog","view","list",bi("list","board")),[H,te]=Da("backlog","stageGroup","all",bi("all","brainstorm","spec","doing","done")),[ae,F]=Da("backlog","q","",Dn),[fe,_e]=Da("backlog","prio","all",Dn),[ee,X]=Da("backlog","worktree","all",bi("all","worktree")),[ce,se]=Da("backlog","review","all",bi("all","review")),[Ce,Te]=Da("backlog","dateField","created",bi("created","started")),[le,xa]=Da("backlog","from","",Dn),[Ze,He]=Da("backlog","to","",Dn),Ke=N,ga=R,[Ge,fa]=Da("backlog","detailId",null,Nk);c.useEffect(()=>{B&&fa(B)},[B]);const Aa=a||[...new Set(e.map(he=>he.projectId))].map(he=>({id:he,name:he})),[ma,Se]=c.useState(()=>e.map(he=>({objective:"",...he}))),[Je,q]=Da("backlog","page",1,Wc),[Be,me]=c.useState(()=>ae.trim()),[We,ia]=c.useState(!1),[ye,oa]=c.useState(!1),[we,xe]=c.useState(!1),Xe=c.useRef(!1),[Pa,nt]=mk(),Wa=c.useCallback((he,ka)=>{nt(he,"ok",void 0,{action:{label:"Urungkan",onAction:ka}})},[nt]),ea=[A!=="all",Ke!=="all",ae.trim()!=="",H!=="all",fe!=="all",le!=="",Ze!=="",ee!=="all",ce!=="all"].filter(Boolean).length,ge=Vc("backlog","scroll",ma.length>0);c.useEffect(()=>{const he=setTimeout(()=>me(ae.trim()),250);return()=>clearTimeout(he)},[ae]),Lk(JSON.stringify([A,Ke,H,fe,Be,Ce,le,Ze,ee,ce]),()=>q(1)),c.useEffect(()=>{var Ba;let he=!0;const ka=(Ba=ne.listSpecs)==null?void 0:Ba.call(ne,{project:Ke==="all"?void 0:Ke,source:A==="all"?void 0:A,q:Be||void 0,priority:fe==="all"?void 0:fe,dateField:le||Ze?Ce:void 0,from:le||void 0,to:Ze||void 0});return oa(!!ka),ka==null||ka.then(Rt=>{he&&(Se(Rt.items),xe(!0),Xe.current=!1,ia(!1),oa(!1))}).catch(()=>{he&&(Xe.current||(Xe.current=!0,I==null||I("Gagal menyegarkan backlog — data di layar mungkin usang","warn")),ia(!0),oa(!1))}),()=>{he=!1}},[A,Ke,fe,Be,Ce,le,Ze,L,K]);const be=c.useMemo(()=>new Map(e.map(he=>[he.id,he])),[e]),ca=c.useMemo(()=>ma.map(he=>Jl(he,be.get(he.id))),[ma,be]),Na=c.useMemo(()=>uI(oI(ca,ee),ce,o),[ca,ee,ce,o]),Tt=c.useMemo(()=>{const he={};for(const ka of lr)he[ka.key]=Na.filter(Ba=>Jh(Ba.stage,ka.key)).length;return he},[Na]),lt=c.useMemo(()=>Na.filter(he=>Jh(he.stage,H)),[Na,H]),dt=xr(lt.length,Je,n),Ra=lt.slice((dt.page-1)*n,dt.page*n),[ct,vn]=c.useState(null);c.useEffect(()=>{if(!Ge||!ne.getSpec){vn(null);return}let he=!0;return ne.getSpec(Ge).then(ka=>{he&&vn(ka)}).catch(ka=>{!he||!(ka instanceof ha)||ka.status!==404||(fa(null),I==null||I(`${Ge} sudah tidak ada`,"warn"))}),()=>{he=!1}},[Ge,L]);const Va=c.useMemo(()=>{if(!Ge)return null;const he=be.get(Ge);if((ct==null?void 0:ct.id)===Ge)return Jl(ct,he);const ka=ma.find(Ba=>Ba.id===Ge);return ka?Jl(ka,he):he?{objective:"",...he}:null},[Ge,ct,ma,be]),{confirm:it,dialog:Ya}=ot(),jt=l?he=>{var Ba;const ka=((Ba=a.find(Rt=>Rt.id===he.projectId))==null?void 0:Ba.name)??he.projectId;it({title:`Hapus ${he.id}?`,message:`"${he.title}" dihapus dari backlog ${ka}.`,impact:["Tindakan ini tidak bisa dibatalkan.","Lampiran item ini ikut dihapus dari disk.","Sesi yang masih berjalan untuk item ini tidak ikut dihentikan.","Item lain yang menunggu item ini tidak lagi bergantung padanya.","Kode dan commit di repo tidak disentuh."],confirmLabel:"Hapus spec",tone:"danger",icon:"trash-2",run:async()=>{await l(he),Ge===he.id&&fa(null)}}).catch(Rt=>I==null?void 0:I(ba(`menghapus ${he.id}`,Rt),"err","x-circle"))}:void 0,Ct=()=>{M("all"),ga("all"),F(""),te("all"),_e("all"),Te("created"),xa(""),He(""),X("all"),se("all"),q(1)},Nt=[...A!=="all"?[{key:"tab",label:`Sumber: ${((ya=Zh.find(he=>he.value===A))==null?void 0:ya.label)??A}`,onRemove:()=>M("all")}]:[],...Ke!=="all"?[{key:"proj",label:`Project: ${((Gt=Aa.find(he=>he.id===Ke))==null?void 0:Gt.name)??Ke}`,onRemove:()=>ga("all")}]:[],...fe!=="all"?[{key:"prio",label:`Prioritas: ${Ho(fe).label}`,onRemove:()=>_e("all")}]:[],...le||Ze?[{key:"date",label:`Tanggal ${Ce==="created"?"dibuat":"dikerjakan"}: ${le||"…"} – ${Ze||"…"}`,onRemove:()=>{xa(""),He("")}}]:[],...ee!=="all"?[{key:"wt",label:Cd.worktree,onRemove:()=>X("all")}]:[],...ce!=="all"?[{key:"review",label:Pd.review,onRemove:()=>se("all")}]:[]],xn=t.jsxs(j2,{gap:3,children:[t.jsx(oe,{label:"Sumber",children:t.jsx($e,{size:"sm","aria-label":"Filter sumber",value:A,onChange:he=>M(he.target.value),options:Zh})}),t.jsx(oe,{label:"Project",children:t.jsx($e,{size:"sm","aria-label":"Filter project",value:Ke,onChange:he=>ga(he.target.value),options:[{value:"all",label:"Semua project"}].concat(Aa.map(he=>({value:he.id,label:he.name})))})}),t.jsx(oe,{label:"Prioritas",children:t.jsx($e,{size:"sm","aria-label":"Filter prioritas",value:fe,onChange:he=>_e(he.target.value),options:TI})}),t.jsx(oe,{label:"Worktree",hint:"Hanya item yang pernah dibuatkan worktree oleh hanoman. Pekerjaan di luar hanoman tidak terhitung.",children:t.jsx($e,{size:"sm","aria-label":"Filter worktree",value:ee,onChange:he=>X(he.target.value),options:sI.map(he=>({value:he.value,label:he.label}))})}),t.jsx(oe,{label:"Tinjauan",hint:"Item yang sesinya menunggu jawabanmu, dan item selesai yang belum kamu tandai sudah ditinjau. Tandai lewat menu item atau di Review perubahan.",children:t.jsx($e,{size:"sm","aria-label":"Filter perlu ditinjau",value:ce,onChange:he=>se(he.target.value),options:lI.map(he=>({value:he.value,label:he.label}))})}),t.jsx(oe,{label:"Tanggal",children:t.jsxs("div",{className:"hn-bl-date-row",children:[t.jsx($e,{size:"sm","aria-label":"Filter tanggal berdasarkan",value:Ce,onChange:he=>Te(he.target.value),options:[{value:"created",label:"Dibuat"},{value:"started",label:"Dikerjakan"}]}),t.jsx(Oe,{size:"sm",type:"date","aria-label":"Tanggal dari",value:le,onChange:he=>xa(he.target.value)}),t.jsx("span",{className:"hn-eyebrow","aria-hidden":"true",children:"→"}),t.jsx(Oe,{size:"sm",type:"date","aria-label":"Tanggal sampai",value:Ze,onChange:he=>He(he.target.value)})]})})]}),Pt=!we&&ca.length===0&&ye,gt={onStart:i,onDelete:jt,onOpenRun:d,onOpenReview:u,onMarkDone:g,onMarkReviewed:f},Ua=he=>fa(he.id),jn=((rn=lr.find(he=>he.key===H))==null?void 0:rn.label)??"";return t.jsxs("div",{className:"hn-bl-screen",children:[t.jsxs("section",{className:"hn-bl-toolbar",role:"region","aria-label":"Kontrol backlog",children:[t.jsx(x2,{label:"Penyaring backlog",search:{value:ae,onChange:F,label:"Cari backlog",placeholder:"mis. invoice atau SPEC-412"},chips:Nt,filters:xn,filtersLabel:"Filter",onReset:ea>0?Ct:void 0,resetLabel:"Reset filter",actions:t.jsxs(t.Fragment,{children:[t.jsx(HI,{value:J,onChange:Z}),t.jsx(yI,{onDone:()=>O(he=>he+1),onToast:I??(()=>{})})]})}),t.jsx(At,{variant:"pill","aria-label":"Tahap backlog",value:H,onChange:he=>te(he),className:"hn-bl-stage-tabs",tabs:lr.map(he=>({value:he.key,label:he.label,count:Tt[he.key]}))}),Xh[A]&&t.jsx("p",{className:"hn-bl-hint","data-testid":"backlog-tab-hint",children:Xh[A]}),t.jsxs("div",{className:"hn-bl-status-line",children:[We&&t.jsx("span",{role:"status",className:"hn-bl-stale",title:"Server tak menjawab saat menyegarkan — angka ini dari muatan terakhir yang berhasil",children:"Data mungkin usang: server tak menjawab saat menyegarkan."}),ye&&t.jsx("span",{"data-testid":"backlog-refreshing",className:"hn-bl-muted",children:"Memuat…"})]})]}),Pt?t.jsx(bk,{rows:qI,label:"Memuat backlog"}):Na.length===0?e.length===0?t.jsx(ue,{kind:"empty",illustration:"PST-002",title:"Backlog masih kosong",hint:"Ajukan feature brief atau Finding QA — hanoman menjalankannya dari brainstorm sampai execute.",action:m,actionLabel:"Tambah spec"}):t.jsx(ue,{kind:"empty",icon:"filter",title:"Tidak ada spec untuk filter ini",hint:`${e.length} spec ada di backlog, tapi tak ada yang cocok dengan filter aktif.`,action:Ct,actionLabel:"Reset filter",actionIcon:"rotate-ccw"}):lt.length===0?t.jsx(ue,{kind:"empty",compact:!0,icon:"filter",title:`Tidak ada spec di tahap ${jn}`,hint:"Tahap lain tetap memuat item yang sama.",action:()=>te("all"),actionLabel:"Tampilkan semua",actionIcon:"x"}):J==="board"?t.jsxs("div",{className:"hn-bl-body",children:[t.jsx("p",{"data-testid":"board-drag-hint",className:"hn-bl-hint",children:"Seret kartu dari kolom Backlog ke Brainstorm untuk memulai sesi. Tombol di kartu melakukan hal yang sama."}),t.jsx(DI,{specs:lt,activeSpecs:r,presenceBySpec:s,onOpenDetail:Ua,...gt})]}):t.jsxs("div",{className:"hn-bl-body",children:[t.jsx("div",{ref:ge,"data-testid":"backlog-scroll","aria-busy":ye||void 0,className:"hn-bl-list-scroll",children:t.jsx(Zt,{label:"Daftar backlog",children:Ra.map(he=>t.jsx(RI,{spec:he,presenceOn:s==null?void 0:s.get(he.id),running:r==null?void 0:r.has(he.id),onOpenDetail:Ua,...gt},he.id))})}),t.jsx("div",{className:"hn-bl-pager",children:t.jsx(jr,{page:dt.page,pageCount:dt.pageCount,total:lt.length,from:dt.from,to:dt.to,onPage:q,unit:"spec"})})]}),t.jsx(MI,{spec:Va,onClose:()=>fa(null),running:!!Ge&&!!(r!=null&&r.has(Ge)),onOpenRun:d,presenceOn:Ge?s==null?void 0:s.get(Ge):void 0,onEditBranch:h,onRevertStage:p,onMarkDone:g,onOpenReview:u,onStart:i,onIntegrate:b,onEditSpec:x,onPromoteToQa:S,onPromoteToBrief:E,onPromoteToPrd:w,onEditDeps:v,onEditAutoMerge:y,onChangeSource:T,onRequestDelete:jt,onUndoable:Wa,projectPolicy:(wt=a.find(he=>{var ka;return he.id===((ka=e.find(Ba=>Ba.id===Ge))==null?void 0:ka.projectId)}))==null?void 0:wt.autoMerge,projectName:(wn=a.find(he=>he.id===(Va==null?void 0:Va.projectId)))==null?void 0:wn.name,allSpecs:e,onAttachmentToast:(he,ka)=>I==null?void 0:I(he,ka??"ok","paperclip")}),t.jsx(Hc,{toast:Pa}),Ya]})}const ip=20,sp=Ij,sd=e=>e?new Date(e).toLocaleDateString("id-ID",{day:"numeric",month:"short",year:"numeric"}):"—";function FI({projectId:e}){const[a,n]=c.useState(null),[i,r]=c.useState(0),[s,o]=c.useState(null),[l,d]=c.useState(1),[u,m]=c.useState(null),[h,p]=c.useState(""),[g,f]=c.useState(null),b=c.useCallback(()=>{El.listSessions(e,{page:l,limit:ip}).then(T=>{n(T.items),r(T.total),o(T.kuota)}).catch(()=>{n([]),r(0),o(null)})},[e,l]);c.useEffect(()=>{m(null),b()},[b]),c.useEffect(()=>{d(1)},[e]);const x=T=>{f(null),p(""),El.getSession(T).then(m).catch(()=>m(null))},v=async()=>{if(!(!u||!h.trim()))try{const T=await El.materializePrd(u.id,h.trim());f(`PRD tersimpan di ${T.path}. Ia BELUM jadi backlog — eskalasi tetap keputusan Anda.`),b()}catch(T){f(T instanceof Error?T.message:"gagal menulis PRD")}};if(a===null)return t.jsx(ue,{kind:"loading",title:"Memuat obrolan…"});const y=xr(i,l,ip);return t.jsxs("div",{className:"hn-pc",children:[s&&t.jsxs("div",{"data-testid":"portal-chat-kuota",className:"hn-pc-kuota",children:["Jatah bulan ini — Brainstorming ",t.jsxs("b",{children:[s.brainstorm.terpakai," / ",s.brainstorm.jatah]})," · ","Bertanya ",t.jsxs("b",{children:[s.tanya.terpakai," / ",s.tanya.jatah]})," · ","reset ",sd(s.resetPada),!s.enabled&&" · obrolan portal sedang MATI di Settings"]}),a.length===0?t.jsx(ue,{kind:"empty",icon:"messages-square",title:"Belum ada obrolan",hint:"Begitu klien memulai obrolan di portal, sesinya muncul di sini."}):t.jsxs(t.Fragment,{children:[t.jsx(Sa,{padding:0,children:a.map(T=>t.jsxs("button",{type:"button","data-testid":`portal-chat-row-${T.id}`,onClick:()=>x(T.id),className:"hn-pc-row",children:[t.jsx("span",{className:"hn-pc-type",children:sp[T.type]??T.type}),t.jsx("span",{className:"hn-pc-summary",children:T.summary||"Belum ada ringkasan"}),T.prdSiap&&t.jsx(pt,{status:T.prdDocPath?"ok":"warn",size:"sm",children:T.prdDocPath?"PRD dokumen":"PRD draft"}),t.jsx("span",{className:"hn-pc-meta",children:T.clientEmail}),t.jsx("span",{className:"hn-pc-meta",children:sd(T.createdAt)})]},T.id))}),t.jsx(jr,{page:y.page,pageCount:y.pageCount,total:i,from:y.from,to:y.to,onPage:d,unit:"obrolan"})]}),u&&t.jsxs(Sa,{eyebrow:`${sp[u.type]??u.type} · ${u.clientEmail}`,title:u.summary||"Obrolan",children:[t.jsx("div",{"data-testid":"portal-chat-transkrip",className:"hn-pc-transcript",children:u.messages.map(T=>t.jsxs("div",{className:"hn-pc-msg","data-role":T.role,"data-blocked":T.blocked?"true":"false",children:[t.jsxs("div",{className:"hn-pc-msg-meta",children:[T.role==="klien"?"Klien":"hanoman"," · ",sd(T.createdAt)]}),t.jsx("div",{className:"hn-pc-msg-text",children:T.text}),T.blocked&&t.jsxs("div",{className:"hn-pc-blocked",children:[t.jsx("b",{children:"Diblokir"})," (",(T.blockReasons??[]).join(", "),") — teks asli agen:",t.jsx("div",{className:"hn-pc-raw",children:T.rawText})]})]},T.id))}),u.prdMarkdown&&t.jsxs(t.Fragment,{children:[t.jsx("div",{"data-testid":"portal-chat-prd",className:"hn-pc-prd",children:t.jsx(ws,{text:u.prdMarkdown,name:"prd-draft.md"})}),t.jsxs("div",{className:"hn-pc-prd-actions",children:[t.jsx(Oe,{"data-testid":"portal-chat-slug","aria-label":"Slug dokumen PRD",placeholder:"nama-dokumen",value:h,className:"hn-pc-slug",onChange:T=>p(T.target.value)}),t.jsx(U,{"data-testid":"portal-chat-jadikan-prd",disabled:!h.trim(),onClick:()=>void v(),children:"Jadikan dokumen PRD"}),t.jsxs("span",{className:"hn-pc-meta",children:["Menyimpan ke ",t.jsx("code",{children:"docs/prd/"}),". Tidak membuat backlog."]})]})]}),g&&t.jsx("p",{className:"hn-pc-note",children:g})]})]})}function ff({projects:e,defaultProject:a,onClose:n,onCreate:i,prefill:r,lockProject:s}){var f;const[o,l]=c.useState(a||((f=e[0])==null?void 0:f.id)||""),[d,u]=c.useState({title:(r==null?void 0:r.title)??"",context:(r==null?void 0:r.context)??"",outcome:(r==null?void 0:r.outcome)??"",constraints:(r==null?void 0:r.constraints)??""}),m=b=>x=>u(v=>({...v,[b]:x.target.value})),h=!!d.title.trim()&&!!o,p=()=>{h&&i(o,{title:d.title.trim(),context:d.context,outcome:d.outcome,constraints:d.constraints||void 0})},g=t.jsx("span",{"aria-hidden":"true",className:"hn-prj-required",children:"*"});return t.jsxs(la,{open:!0,onClose:n,icon:"scroll-text",eyebrow:"PM → hanoman",title:"PRD baru",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",size:"sm",onClick:n,children:"Batal"}),t.jsx(U,{size:"sm",leftIcon:"messages-square",onClick:p,disabled:!h,children:"Buat brief → brainstorm PRD"})]}),children:[t.jsxs("p",{className:"hn-prj-note",children:["hanoman membuka sesi brainstorm interaktif di terminal, lalu menulis dokumen PRD ke ",t.jsx("code",{children:"docs/prd/"}),"."]}),t.jsxs("p",{className:"hn-prj-note",children:[t.jsx("span",{"aria-hidden":"true",className:"hn-prj-required",children:"*"})," wajib diisi"]}),t.jsx(oe,{label:t.jsxs(t.Fragment,{children:["Project",g]}),hint:"Tujuan penulisan docs/prd/ — pilih di sini, tak perlu memfilter daftar dulu",children:t.jsx($e,{"aria-label":"Project untuk PRD baru",value:o,disabled:s,onChange:b=>l(b.target.value),className:"hn-prj-full",options:e.map(b=>({value:b.id,label:b.name}))})}),t.jsx(oe,{label:t.jsxs(t.Fragment,{children:["Judul",g]}),hint:d.title.trim()?void 0:"Wajib diisi — tanpa judul, brief tak bisa dibuat.",children:t.jsx(Oe,{value:d.title,onChange:m("title"),placeholder:"mis. Jadwal Invoice Berulang",className:"hn-prj-full"})}),t.jsx(oe,{label:"Konteks",hint:"Latar belakang & alasan fitur ini dibutuhkan",children:t.jsx(Ma,{value:d.context,onChange:m("context"),rows:3,placeholder:"mis. operator harus membuka tiga layar untuk tahu sesi mana yang menunggu"})}),t.jsx(oe,{label:"Hasil yang diharapkan",children:t.jsx(Ma,{value:d.outcome,onChange:m("outcome"),rows:2,placeholder:"mis. satu badge di Overview menunjukkan jumlah sesi yang menunggu"})}),t.jsx(oe,{label:"Batasan",hint:"opsional",children:t.jsx(Oe,{value:d.constraints,onChange:m("constraints"),placeholder:"mis. reuse queue yang ada",className:"hn-prj-full"})})]})}const GI={draft:"neutral",dieskalasi:"info",terwujud:"ok"};function KI({prd:e}){const a=Id[e.status]??e.status;return t.jsx(ra,{tone:GI[e.status],size:"sm",children:e.specCount>0?`${a} ${e.doneCount}/${e.specCount}`:a})}function WI({open:e,onClose:a,prd:n,takeBase:i,items:r,include:s,setInclude:o,busy:l,onTake:d,onStartBreakdown:u,onMaterialize:m,projectId:h}){const p=r.filter((g,f)=>s[f]).length;return t.jsxs(la,{open:e,onClose:a,icon:"list-checks",width:600,eyebrow:"PRD → backlog",title:"Jadikan backlog",footer:t.jsx(U,{variant:"ghost",size:"sm",onClick:a,children:"Batal"}),children:[t.jsxs("p",{className:"hn-prj-note",children:["Pilih bentuk backlog untuk ",t.jsx("b",{children:n.title}),". Manusia yang memutuskan."]}),t.jsxs("div",{className:"hn-prj-sheet-options",children:[t.jsxs("div",{className:"hn-prj-sheet-option",children:[t.jsx(U,{leftIcon:"lightbulb",onClick:()=>{a(),d({...i,kind:"brief",context:`Dari PRD: ${n.path}`,outcome:""})},children:"Sebagai feature brief"}),t.jsx("p",{className:"hn-prj-hint",children:"Sesi menjalankan pipeline penuh: brainstorm → objective → spec → plan → execute."})]}),t.jsxs("div",{className:"hn-prj-sheet-option",children:[t.jsx(U,{leftIcon:"target",variant:"secondary",onClick:()=>{a(),d({...i,kind:"goal",context:"",outcome:"",goal:`Wujudkan PRD ${n.path}`})},children:"Sebagai goal"}),t.jsx("p",{className:"hn-prj-hint",children:"Sesi dua fase (Goal → Verifikasi) yang langsung mengejar goal-nya, tanpa brainstorm, spec, maupun plan. Mode goal selalu aktif."})]}),t.jsx("div",{className:"hn-prj-sheet-option",children:r.length>0?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"hn-prj-sheet-head",children:[t.jsxs("span",{className:"hn-prj-sheet-title",children:["Breakdown · ",r.length," item"]}),t.jsxs("span",{className:"hn-prj-hint",children:[p,"/",r.length," dipilih"]})]}),t.jsx("ul",{className:"hn-prj-checklist",children:r.map((g,f)=>t.jsx("li",{children:t.jsxs("label",{className:"hn-prj-check",children:[t.jsx("input",{type:"checkbox",checked:s[f]??!1,className:"hn-prj-check-input",onChange:b=>o(x=>x.map((v,y)=>y===f?b.target.checked:v))}),t.jsxs("span",{className:"hn-prj-check-text",children:[t.jsxs("span",{className:"hn-prj-check-title",children:[g.title," ",t.jsx(ra,{tone:"brass",size:"sm",children:g.priority})]}),g.outcome&&t.jsx("span",{className:"hn-prj-hint",children:g.outcome})]})]})},f))}),t.jsx(U,{size:"sm",leftIcon:"plus",disabled:!p||l,onClick:m,children:l?"Membuat…":`Buat ${p} backlog`})]}):t.jsxs(t.Fragment,{children:[t.jsx(U,{leftIcon:"split",variant:"secondary",onClick:()=>{a(),u(h,n.path)},children:"Breakdown ke backlog"}),t.jsx("p",{className:"hn-prj-hint",children:"Mulai sesi breakdown yang menulis usulan backlog paralel dari PRD ini."})]})})]})]})}function VI({prd:e,projectId:a,dataVersion:n,onTake:i,onStartBreakdown:r,onMaterialize:s}){const[o,l]=c.useState(null),[d,u]=c.useState(""),[m,h]=c.useState(0),[p,g]=c.useState([]),[f,b]=c.useState([]),[x,v]=c.useState(""),[y,T]=c.useState(0),[S,E]=c.useState(!1),[w,N]=c.useState(!1);c.useEffect(()=>{let B=!0;return l(null),u(""),ne.getPrd(a,e.path).then(A=>{B&&l(A.content)}).catch(A=>{B&&u(xs(A,"tidak diketahui"))}),()=>{B=!1}},[a,e.path,m]),c.useEffect(()=>{let B=!0;return ne.getBreakdown(a,e.path).then(A=>{B&&(g(A.items),b(A.items.map(()=>!0)),v(""))}).catch(A=>{if(B){if((A==null?void 0:A.status)===404){g([]),b([]),v("");return}v(xs(A,"tidak diketahui"))}}),()=>{B=!1}},[a,e.path,n,y]);const R={project:a,title:e.title,prdPath:e.path,branchFrom:ST(e.path)},L=p.filter((B,A)=>f[A]),I=async()=>{if(L.length){E(!0);try{await s(a,e.path,L),N(!1)}finally{E(!1)}}};return t.jsxs("div",{className:"hn-prd-pane",children:[t.jsxs("div",{className:"hn-prd-actionbar",role:"toolbar","aria-label":"Aksi PRD",children:[t.jsx("span",{className:"hn-prd-actionbar-title",children:e.title}),t.jsx(U,{size:"sm",leftIcon:"list-checks",onClick:()=>N(!0),children:"Jadikan backlog"}),t.jsx(sn,{label:"Aksi lain PRD",icon:"ellipsis",items:[],children:t.jsx(Kk,{href:B=>ne.prdDownloadUrl(a,e.path,B),disabled:o===null})})]}),t.jsxs("div",{className:"hn-prd-read",children:[t.jsxs("header",{className:"hn-prd-head",children:[t.jsx("div",{className:"hn-prj-mono hn-prd-path",children:e.path}),t.jsxs("div",{className:"hn-prd-head-row",children:[t.jsx("h2",{className:"hn-prd-title",children:e.title}),t.jsx(KI,{prd:e})]})]}),x&&t.jsxs("div",{role:"alert",className:"hn-prj-stale",children:[t.jsxs("span",{className:"hn-prj-stale-text",children:["Usulan breakdown gagal dimuat: ",x]}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"rotate-ccw",onClick:()=>T(B=>B+1),children:"Coba lagi"})]}),p.length>0&&t.jsxs("details",{className:"hn-prd-breakdown",children:[t.jsxs("summary",{className:"hn-prd-breakdown-summary",children:["Usulan breakdown · ",p.length," item"]}),t.jsx("ul",{className:"hn-prd-breakdown-list",children:p.map((B,A)=>t.jsxs("li",{children:[t.jsx("span",{className:"hn-prd-breakdown-item",children:B.title}),t.jsx(ra,{tone:"brass",size:"sm",children:B.priority})]},A))}),t.jsx("p",{className:"hn-prj-hint",children:"Pilih item yang dibuat lewat “Jadikan backlog”."})]}),d?t.jsx(ue,{kind:"error",title:"Gagal memuat isi PRD",hint:d,action:()=>h(B=>B+1)}):o===null?t.jsx(ue,{kind:"loading",title:"Memuat PRD…"}):t.jsx("div",{className:"hn-prd-doc",children:t.jsx(ws,{text:o,name:e.name})})]}),t.jsx(WI,{open:w,onClose:()=>N(!1),prd:e,takeBase:R,items:p,include:f,setInclude:b,busy:S,onTake:i,onStartBreakdown:r,onMaterialize:()=>{I()},projectId:a})]})}function YI(e){const a=[],n=new Map;for(const i of e){let r=n.get(i.projectId);r||(r={projectId:i.projectId,projectName:i.projectName,items:[]},n.set(i.projectId,r),a.push(i.projectId)),r.items.push(i)}return a.map(i=>n.get(i))}function JI({prd:e,active:a,showProject:n,onSelect:i}){return t.jsxs("button",{type:"button",onClick:i,"aria-current":a?"true":void 0,className:`hn-prd-item${a?" is-active":""}`,children:[t.jsxs("span",{className:"hn-prd-item-head",children:[t.jsx(Re,{name:"scroll-text",size:13,color:a?"var(--brass-700)":"var(--brass-500)"}),t.jsx("span",{className:"hn-prd-item-title",children:e.title}),e.live&&t.jsx(ra,{tone:"brass",size:"sm",children:"sesi hidup"})]}),t.jsxs("span",{className:"hn-prd-item-meta",children:[n&&t.jsxs("span",{children:[e.projectName," · "]}),e.specCount>0&&t.jsxs("span",{children:[e.doneCount,"/",e.specCount," item selesai · "]}),t.jsx("span",{className:"hn-prj-mono",children:e.path})]})]})}function QI({projects:e,projectFilter:a,onProjectFilter:n,onNewPrd:i,onTakeToBacklog:r,onStartBreakdown:s,onMaterialize:o,dataVersion:l}){const[d,u]=c.useState([]),[m,h]=c.useState("loading"),[p,g]=c.useState(""),[f,b]=c.useState(0),[x,v]=Da("prd","sel",null,Nk),[y,T]=c.useState("list"),S=c.useMemo(()=>d.find(H=>H.slug===x)??null,[d,x]),E=c.useCallback(H=>v(H?H.slug:null),[v]),[w,N]=c.useState(!1),R=a==="all",L=R?"":a,I=c.useRef(null);c.useEffect(()=>{I.current!==null&&I.current!==a&&E(null),I.current=a},[a,E]),c.useEffect(()=>{let H=!0;return(R?ne.listAllPrds():L?ne.listPrds(L):Promise.resolve({items:[]})).then(ae=>{H&&(u(ae.items),h("ready"),g(""))}).catch(ae=>{H&&(h("error"),g(xs(ae,"tidak diketahui")))}),()=>{H=!1}},[a,l,f]);const[B,A]=c.useState(!1),M=S?S.projectId||L:"",K=[{value:"all",label:"Semua project"}].concat(e.map(H=>({value:H.id,label:H.name}))),O=[...yd],J=[...yd.map(H=>({status:H,label:Kn(Id,H),items:d.filter(te=>te.status===H)})),...Array.from(new Set(d.map(H=>H.status).filter(H=>!O.includes(H)))).map(H=>({status:H,label:Kn(Id,H),items:d.filter(te=>te.status===H)}))],Z=m==="loading"&&d.length===0?t.jsx(ue,{kind:"loading",compact:!0,title:"Memuat daftar PRD…"}):m==="error"&&d.length===0?t.jsx(ue,{kind:"error",compact:!0,title:"Gagal memuat daftar PRD",hint:p,action:()=>b(H=>H+1)}):d.length===0?t.jsx(ue,{kind:"empty",icon:"scroll-text",title:"Belum ada PRD",hint:"Buat PRD dari brief + brainstorm; hanoman menulisnya ke docs/prd/ lalu bisa di-take jadi backlog.",action:()=>N(!0),actionLabel:"PRD baru"}):t.jsxs(t.Fragment,{children:[m==="error"&&t.jsxs("div",{role:"alert",className:"hn-prj-stale hn-prd-stale",children:[t.jsx("span",{className:"hn-prj-stale-text",children:"Gagal memuat ulang — daftar dari muatan terakhir."}),t.jsx(U,{size:"sm",variant:"secondary",onClick:()=>b(H=>H+1),children:"Coba lagi"})]}),J.filter(H=>H.items.length>0).map(H=>t.jsxs("details",{open:!0,className:"hn-prd-group",children:[t.jsxs("summary",{className:"hn-prd-group-summary",children:[H.label,t.jsx("span",{className:"hn-prj-chip-count",children:H.items.length})]}),YI(H.items).map(te=>t.jsxs("div",{className:"hn-prd-group-body",children:[R&&t.jsx("div",{className:"hn-eyebrow hn-prd-project-label",children:te.projectName}),te.items.map(ae=>t.jsx(JI,{prd:ae,showProject:!1,active:(S==null?void 0:S.path)===ae.path&&(S==null?void 0:S.projectId)===ae.projectId,onSelect:()=>{E(ae),T("detail")}},`${ae.projectId}:${ae.path}`))]},te.projectId))]},H.status))]});return t.jsxs("div",{style:pk,children:[t.jsxs("div",{style:Ao,className:"hn-prd-toolbar",children:[t.jsx($e,{size:"sm",value:a,"aria-label":"Project",onChange:H=>n(H.target.value),options:K}),t.jsx(qE,{screen:"prd",active:R?0:1}),t.jsx("span",{className:"hn-prd-toolbar-spacer"}),!R&&t.jsx(U,{size:"sm",variant:B?"primary":"ghost",leftIcon:"messages-square","aria-expanded":B,onClick:()=>A(H=>!H),children:"Draft dari portal klien"}),t.jsx(U,{size:"sm",leftIcon:"plus",onClick:()=>N(!0),children:"PRD baru"})]}),B&&!R&&t.jsx("div",{style:Ao,className:"hn-prd-portal",children:t.jsx(FI,{projectId:a})}),t.jsx(tl,{ariaLabel:"Panel PRD",active:y,onActiveChange:H=>T(H),masterWidth:288,panels:[{id:"list",label:"Indeks",className:"hn-panel-flex",content:t.jsx("aside",{"aria-label":"Indeks PRD",className:"hn-prd-index",children:Z})},{id:"detail",label:"Isi",className:"hn-panel-flex",content:t.jsx("section",{"aria-label":"Isi PRD",className:"hn-prd-detail",children:S?t.jsx(VI,{prd:S,projectId:M,dataVersion:l,onTake:H=>r(H),onStartBreakdown:s,onMaterialize:o}):t.jsx(ue,{kind:"empty",icon:"scroll-text",title:"Pilih PRD",hint:"Klik dokumen di indeks kiri untuk membacanya, lalu jadikan backlog."})})}]}),w&&t.jsx(ff,{projects:e,defaultProject:L,onClose:()=>N(!1),onCreate:(H,te)=>{N(!1),i(H,te)}})]})}const rp=5e3,ZI=12e3,XI=5*6e4,eN=new Set(["shipped","docs-updated","waiting","offline"]),aN={shipped:"selesai","docs-updated":"dokumen terbit",waiting:"butuh jawabanmu"},tN={shipped:"kabar","docs-updated":"dokumen",waiting:"sesi"},yf=(e,a)=>e.kind==="waiting"&&e.since!==null&&a-e.since>=Ud;function nN(e){const a=Math.floor(e/6e4);if(a<1)return`${Math.max(0,Math.floor(e/1e3))} detik`;if(a<60)return`${a} menit`;const n=Math.floor(a/60),i=a%60;return i>0?`${n} jam ${i} menit`:`${n} jam`}function iN(e,a){if(!eN.has(e.kind))return null;if(e.kind==="offline")return{kind:"pose",text:"Aku kehilangan sambungan",ttl:rp};let n=`${e.subject??"Backlog"} ${aN[e.kind]}`;return e.count>1&&(n+=` · ${e.count} ${tN[e.kind]}`),yf(e,a)&&(n+=` — ${nN(a-e.since)}`),{kind:"pose",text:n,ttl:rp}}function vf(e){const a=rl(e.backlog),n={};for(const i of e.sessions){const r=Ar(i,a);r&&(n[i.id]=r)}return{at:e.now,sessions:n,notifiedAt:Xk(e.notifications)}}function sN(e,a){const n=vf(a),i=d=>Object.entries(n.sessions).filter(([u,m])=>m===d&&e.sessions[u]!==d).length,r=a.notifications.filter(d=>Qk.has(d.type)&&d.createdAt>e.notifiedAt).length,s=i("waiting"),o=i("failed"),l=[r>0?`${r} selesai`:"",s>0?`${s} menunggu`:"",o>0?`${o} gagal`:""].filter(Boolean);return l.length>0?{kind:"recap",text:l.join(" · "),ttl:ZI}:null}const rN="PET-001",oN=2,lN={w:192,h:208},dN=8,cN={x:.62,baseline:202},uN={h:168},mN=[{key:"idle",fps:6,loop:!0},{key:"walk-right",fps:10,loop:!0,dir:"right"},{key:"walk-left",fps:10,loop:!0,dir:"left"},{key:"working",fps:8,loop:!0},{key:"waiting",fps:6,loop:!0},{key:"blocked",fps:4,loop:!0},{key:"review",fps:6,loop:!0},{key:"shipped",fps:10,loop:!1,then:"idle"},{key:"docs-updated",fps:6,loop:!0},{key:"wave",fps:10,loop:!1,then:"idle"},{key:"deciding",fps:6,loop:!0},{key:"sleep",fps:4,loop:!0},{key:"thanks",fps:10,loop:!1,then:"idle"},{key:"held",fps:8,loop:!0},{key:"falling",fps:8,loop:!0},{key:"dizzy",fps:8,loop:!1,then:"idle"}],hN={idle:"4a0f06cacdad0fa8e0b0a369628e383fc2cb54cbdd5297285c88d1a33bd686ac","walk-right":"7bdfb2786b2b1c899fb7b170ce2cf5d1e3a922e251cbaca9600c210262629a52","walk-left":"c53c6f7b980d4179b45d55160145df73eb629ccbb809ce2b19946045e388ce60",working:"2ec0d0d4565eced3c55c32603c2b1c6fe9ff93f13f2a1061bc7d2e8d8864aa6f",waiting:"8bb1595bf280040e101949392c1048330c19142d7b5a1d6b74918734f72287e3",blocked:"134f48c60fa6fef038da266be7fb2a69755ecb9123d23dc4e270b14d7d077da6",review:"77c865ff6d49a8bbf3db4e0d7b91ce4663a1e3acef5d072ddd65eac9479b232c",shipped:"d32653efa6a64eb4d00fb63a6e8c0a7dc24de63ecd5a6cfda36f32b584de00b8","docs-updated":"2b3a01ddd640efd6e65d61c6ad4980da3a9fbceff251f1b42ce13389c02bb19c",wave:"4153420063211e6d196219b89c572f43f96ec32f28c63a1159e6d98630e0ed73",deciding:"6309ab706c8430cf97b187f353fd2d447ba729f6e0764efef1b75a3c96168984",sleep:"40f1fd6e27ddddb13a5702c05a03f5e015e44e7e77e96c4e1ed52a5d7741f2ec",thanks:"0f59f2c042b25ff47a7022d4452bf0dc433dcea796d90bf47d95a5c8ca359d8d",held:"8de04ba258b30acb105a27a81ed400b66f3b68953042957a75e63ebe8efe7c89",falling:"8bc3429c44ef4ba257da895080fa6458c3a66e51cebe103e09cd8bac25be5363",dizzy:"3e8c2072e2aa652e204e3c6b041cb6c9487d8dca1649b52f9695600880a94e49"},pN={id:rN,version:oN,cell:lN,columns:dN,anchor:cN,character:uN,rows:mN,sources:hN},gN="/assets/hnm-pet-anoman-atlas-v02-ClJhW17L.webp",ir=["idle","walk-right","walk-left","working","waiting","blocked","review","shipped","docs-updated","wave","deciding","sleep","thanks","held","falling","dizzy"],kN=e=>typeof e=="string"&&ir.includes(e),gi=e=>typeof e=="number"&&Number.isInteger(e)&&e>0,Zi=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);function bN(e){const a=h=>{throw new Error(`pet.json tidak sah: ${h}`)};if(!Zi(e))return a("bukan objek");const{id:n,version:i,cell:r,columns:s,anchor:o,character:l,rows:d,sources:u}=e;if(typeof n!="string"||!n)return a("id");if(!gi(i))return a("version");if(!Zi(r)||!gi(r.w)||!gi(r.h))return a("cell");if(!gi(s))return a("columns");if(!Zi(o)||typeof o.x!="number"||!(o.x>0&&o.x<1)||!gi(o.baseline)||o.baseline>r.h)return a("anchor");if(!Zi(l)||!gi(l.h)||l.h>r.h)return a("character");if(!Array.isArray(d)||d.length!==ir.length)return a(`rows: butuh ${ir.length} baris`);const m=d.map((h,p)=>{const g=ir[p];if(!Zi(h)||h.key!==g)return a(`rows[${p}]: harus "${g}"`);if(!gi(h.fps))return a(`rows[${p}].fps`);if(typeof h.loop!="boolean")return a(`rows[${p}].loop`);const f={key:g,fps:h.fps,loop:h.loop};if(h.then!==void 0){if(!kN(h.then)||h.loop)return a(`rows[${p}].then hanya untuk baris loop:false`);f.then=h.then}else if(!h.loop)return a(`rows[${p}] loop:false tanpa then`);if(h.dir!==void 0){if(h.dir!=="right"&&h.dir!=="left")return a(`rows[${p}].dir`);f.dir=h.dir}return f});return!Zi(u)||ir.some(h=>typeof u[h]!="string")?a("sources"):{id:n,version:i,cell:{w:r.w,h:r.h},columns:s,anchor:{x:o.x,baseline:o.baseline},character:{h:l.h},rows:m,sources:u}}const Er=bN(pN),fN=gN,qo={ready:"idle",sleeping:"sleep",offline:"idle",working:"working",deciding:"deciding",waiting:"waiting",blocked:"blocked",review:"review",shipped:"shipped","docs-updated":"docs-updated"};function pu(e,a=Er){const n=a.rows.find(i=>i.key===e);if(!n)throw new Error(`baris ${e} tak ada di manifest`);return n}const yN=(e,a=Er)=>a.rows.findIndex(n=>n.key===e),xf=(e,a=Er)=>Math.round(a.columns/pu(e,a).fps*1e3),vN=(e,a=Er)=>pu(e,a).then??null,op=40,dr=[1200,4500],xN=[5e3,14e3],ic=16,lp=24,jN=240,wN=220,SN=new Set(["waiting","blocked"]),_N=new Set(["offline","sleeping"]),ao=(e,[a,n])=>a+e()*(n-a),rd=e=>e==="right"?"walk-right":"walk-left",gu=(e,a)=>Math.max(ic,e-a-ic),ti=(e,a,n)=>Math.min(Math.max(e,ic),gu(a,n)),jf=(e,a,n)=>Math.min(Math.max(e,0),Math.max(0,a-n)),dp=e=>e==="held"||e==="falling"||e==="dizzy",AN=e=>!e.roam||e.reduced||e.tier==="mobile";function cp(e,a,n){return{x:gu(e,a),y:0,facing:"right",mode:"stand",until:n+dr[0],parkedX:null}}function EN(e,a){const{now:n,laneWidth:i,petWidth:r,pose:s}=a,o=ti(a.currentX,i,r);return{state:{x:o,y:0,facing:e.facing,mode:"stand",until:n+dr[0],parkedX:e.parkedX===null?null:ti(e.parkedX,i,r)},row:qo[s],move:{x:o,y:0,durationMs:0,ease:"linear"}}}const TN=(e,a,n,i,r)=>({...e,x:ti(e.x,a,i),y:jf(e.y,n,r)});function CN(e,a,n){const{now:i,laneWidth:r,laneHeight:s,petWidth:o,petHeight:l,pose:d}=a,u=gu(r,o),m=qo[d],h=ti(a.currentX,r,o),p=e.mode==="walk"||e.mode==="home",g=e.mode==="dizzy",f=(E,w,N=e.facing)=>({x:E,y:0,facing:N,mode:"stand",until:w,parkedX:e.parkedX}),b=E=>p||Math.abs(h-E)>.5?{x:E,y:0,durationMs:0,ease:"linear"}:null,x=(E,w)=>{const N=Math.round(Math.abs(E-h)/op*1e3),R=E>=h?"right":"left";return{state:{x:E,y:0,facing:R,mode:w,until:i+N,parkedX:e.parkedX},row:rd(R),move:{x:E,y:0,durationMs:N,ease:"linear"}}},v=E=>{const w={x:E,y:0,durationMs:0,ease:"linear"};return a.reduced?{state:{...f(E,1/0),parkedX:E},row:m,move:w}:{state:{x:E,y:0,facing:e.facing,mode:"dizzy",until:i+xf("dizzy"),parkedX:E},row:"dizzy",move:w}};if(a.dragging){const E=ti(a.pointerX,r,o),w=jf(a.pointerY,s,l);return{state:{x:E,y:w,facing:e.facing,mode:"held",until:1/0,parkedX:e.parkedX},row:"held",move:{x:E,y:w,durationMs:0,ease:"linear"}}}if(e.mode==="held"){if(a.reduced||e.y===0)return v(e.x);const E=Math.max(wN,Math.round(e.y/jN*1e3));return{state:{x:e.x,y:0,facing:e.facing,mode:"falling",until:i+E,parkedX:e.x},row:"falling",move:{x:e.x,y:0,durationMs:E,ease:"fall"}}}if(e.mode==="falling")return i<e.until?{state:e,row:"falling",move:null}:v(e.x);if(e.mode==="dizzy"&&i<e.until)return{state:e,row:"dizzy",move:null};if(AN(a)){const E=ti(e.parkedX??u,r,o);return{state:f(E,1/0,"right"),row:m,move:b(E)}}if(a.hovered||a.panelOpen||a.documentHidden)return{state:f(h,1/0),row:m,move:b(h)};if(_N.has(d))return{state:f(h,1/0),row:m,move:b(h)};if(SN.has(d))return Math.abs(h-u)>1?e.mode==="home"&&i<e.until?{state:e,row:rd(e.facing),move:null}:x(u,"home"):{state:f(u,1/0,"right"),row:m,move:b(u)};if(d==="shipped")return{state:f(h,1/0),row:m,move:b(h)};if(p)return i<e.until?{state:e,row:rd(e.facing),move:null}:{state:f(e.x,i+ao(n,dr)),row:m,move:null};if(g||e.until===1/0)return{state:f(h,i+ao(n,dr)),row:m,move:null};if(i<e.until)return{state:e,row:m,move:null};const y=ao(n,xN)*op/1e3;let T=n()<.5?-1:1,S=ti(h+T*y,r,o);return Math.abs(S-h)<lp&&(T=-T,S=ti(h+T*y,r,o)),Math.abs(S-h)<lp?{state:f(h,i+ao(n,dr)),row:m,move:null}:x(S,"walk")}const Ln={loading:"Membaca layar sesi…",none:"Pertanyaannya tak terbaca dari sini — buka Terminal untuk menjawabnya.",stale:"Layarnya sudah berubah — pertanyaannya dimuat ulang.",deciding:"hanoman-lead sedang menyusun keputusan untuk sesi ini.",failed:"Jawaban tak terkirim. Buka Terminal untuk menjawabnya.",answering:"hanoman-lead sudah mengirim jawabannya ke pane — terlambat mengambil alih.",taken:"Kamu mengambil alih sesi ini. hanoman-lead berhenti menjawabnya.",preparing:"Kotak jawabnya sedang disiapkan — dialognya belum tergambar di pane."},PN={queued:"hanoman-lead mengantre untuk sesi ini",deciding:"hanoman-lead sedang menyusun keputusan",answered:"hanoman-lead sudah menjawab","taken-over":"Kamu yang menjawab sesi ini",failed:"hanoman-lead tak sanggup menjawab sesi ini"},up=e=>{var a;return e instanceof ha?(a=e.detail)==null?void 0:a.reason:void 0};function mp({sessionId:e,label:a,reduced:n,ask:i}){const[r,s]=c.useState(void 0),[o,l]=c.useState([]),[d,u]=c.useState(""),[m,h]=c.useState(!1),[p,g]=c.useState(!1),[f,b]=c.useState(null),[x,v]=c.useState(0);c.useEffect(()=>{let I=!0;return s(void 0),ne.sessionDialog(e).then(B=>{I&&(s(B),l(B?B.dialog.options.filter(A=>A.checked).map(A=>A.n):[]))}).catch(()=>{I&&s(null)}),()=>{I=!1}},[e,x]);async function y(){if(!m){h(!0),b(null);try{await ne.takeoverSessionDialog(e),b(Ln.taken),v(I=>I+1)}catch(I){b(up(I)==="answering"?Ln.answering:Ln.failed)}finally{h(!1)}}}async function T(I){if(!(!r||m)){h(!0),b(null);try{await ne.answerSessionDialog(e,{screenHash:r.screenHash,...I}),g(!0)}catch(B){const A=up(B);A==="stale"?(b(Ln.stale),v(M=>M+1)):b(A==="deciding"?Ln.deciding:Ln.failed)}finally{h(!1)}}}const S=n?{transition:"none",transform:"none"}:void 0,E=I=>t.jsx("div",{"data-testid":"pet-answer-note",className:"hn-pet-note",children:I});if(p)return t.jsx("div",{className:"hn-pet-box",children:t.jsxs("div",{"data-testid":"pet-answer-sent",className:"hn-pet-sent",children:["Terkirim — menunggu ",a," bergerak"]})});const w=i==null?void 0:i.questions[Math.min(i.at,Math.max(0,i.questions.length-1))],N=i?t.jsxs("div",{className:"hn-pet-head",children:[t.jsx("div",{"data-testid":"pet-answer-lead-state",className:"hn-eyebrow",children:PN[i.state]}),i.total>1&&t.jsxs("div",{className:"hn-eyebrow hn-pet-eyebrow-top",children:["Pertanyaan ",Math.min(i.at+1,i.total)," dari ",i.total]}),i.source==="turn-end"&&t.jsx("div",{"data-testid":"pet-answer-source",className:"hn-eyebrow hn-pet-eyebrow-top",children:"Giliran terakhir sesi"}),((w==null?void 0:w.question)||i.message)&&t.jsx("div",{className:"hn-pet-question",children:(w==null?void 0:w.question)||i.message}),i.state!=="taken-over"&&t.jsx("div",{className:"hn-pet-mt-6",children:t.jsx(U,{"data-testid":"pet-answer-takeover",size:"sm",variant:"ghost",disabled:m,style:S,onClick:()=>{y()},children:"Ambil alih"})})]}):null;if(r===void 0)return t.jsxs("div",{className:"hn-pet-box",children:[N,E(Ln.loading)]});if(r===null)return t.jsxs("div",{className:"hn-pet-box",children:[N,E(f??(i?Ln.preparing:Ln.none))]});const{dialog:R}=r,L=R.tabs.filter(I=>I.answered).length;return t.jsxs("div",{"data-testid":"pet-answer","data-session":e,className:"hn-pet-box",children:[N,!i&&R.tabs.length>1&&t.jsxs("div",{className:"hn-eyebrow hn-pet-eyebrow-bottom",children:["Pertanyaan ",Math.min(L+1,R.tabs.length)," dari ",R.tabs.length]}),!i&&R.title&&t.jsx("div",{className:"hn-pet-title",children:R.title}),R.multi?t.jsx("div",{className:"hn-pet-stack",children:R.options.map(I=>t.jsx(vs,{label:I.label,checked:o.includes(I.n),disabled:m,onChange:B=>l(A=>(B?[...A,I.n]:A.filter(M=>M!==I.n)).sort((M,K)=>M-K))},I.n))}):t.jsx("div",{className:"hn-pet-wrap",children:R.options.map(I=>t.jsx(U,{"data-testid":"pet-answer-option",size:"sm",variant:"ghost",disabled:m,style:S,onClick:()=>{T({choice:I.n})},children:I.label},I.n))}),(R.freeIndex!==null||R.notes)&&t.jsxs("div",{className:"hn-pet-free",children:[t.jsx(Oe,{"data-testid":"pet-answer-text",size:"sm",value:d,disabled:m,placeholder:"Jawab dengan kalimatmu sendiri",className:"hn-grow-min",onChange:I=>u(I.target.value)}),!R.multi&&t.jsx(U,{size:"sm",variant:"ghost",disabled:m||!d.trim(),style:S,onClick:()=>{T({text:d.trim()})},children:"Kirim"})]}),R.multi&&t.jsx("div",{className:"hn-pet-mt-8",children:t.jsx(U,{"data-testid":"pet-answer-submit",size:"sm",variant:"primary",disabled:m,style:S,onClick:()=>{T({choices:o,...d.trim()?{text:d.trim()}:{}})},children:"Submit"})}),f&&t.jsx("div",{className:"hn-pet-mt-6",children:E(f)})]})}const MN={mobile:96,tablet:112,desktop:112},ts=44,wf=22,IN=wf+ts,NN=56,RN=6,od=268,LN=10,to=12,no=200,ld=8,BN=5e3,$N=1.5,DN=2e3,ON=3,HN=6,qN={linear:"linear",fall:"var(--ease-fall)"};function UN(){const e="(prefers-reduced-motion: reduce)",[a,n]=c.useState(()=>typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia(e).matches);return c.useEffect(()=>{var s;if(typeof window>"u"||typeof window.matchMedia!="function")return;const i=window.matchMedia(e),r=()=>n(i.matches);return(s=i.addEventListener)==null||s.call(i,"change",r),()=>{var o;return(o=i.removeEventListener)==null?void 0:o.call(i,"change",r)}},[]),a}function zN(){const[e,a]=c.useState(()=>typeof document<"u"&&document.hidden);return c.useEffect(()=>{const n=()=>a(document.hidden);return document.addEventListener("visibilitychange",n),()=>document.removeEventListener("visibilitychange",n)},[]),e}function FN(e,a,n){const i=c.useCallback(()=>{var o;return Math.round(((o=e.current)==null?void 0:o.getBoundingClientRect().width)??0)},[e]),[r,s]=c.useState(0);return c.useLayoutEffect(()=>{n&&s(i())},[i,a,n]),c.useEffect(()=>{const o=e.current;if(!n||!o)return;if(typeof ResizeObserver<"u"){const u=new ResizeObserver(()=>s(i()));return u.observe(o),()=>u.disconnect()}let l;const d=()=>{clearTimeout(l),l=setTimeout(()=>s(i()),150)};return window.addEventListener("resize",d),()=>{clearTimeout(l),window.removeEventListener("resize",d)}},[i,n,e]),r}const GN="(min-width: 1200px) and (max-height: 760px)";function KN(e){const a=c.useCallback(i=>{var s;if(typeof window>"u"||typeof window.matchMedia!="function")return()=>{};const r=window.matchMedia(e);return(s=r.addEventListener)==null||s.call(r,"change",i),()=>{var o;return(o=r.removeEventListener)==null?void 0:o.call(r,"change",i)}},[e]),n=c.useCallback(()=>typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia(e).matches,[e]);return c.useSyncExternalStore(a,n,()=>!1)}function WN({sessions:e,backlog:a,asks:n=[],onOpen:i}){const{items:r}=Dc(),[s,o]=c.useState($E),[l,d]=c.useState(OE),[u,m]=c.useState(!1),[h,p]=c.useState(!1),[g,f]=c.useState(to),[b,x]=c.useState(!1),[v,y]=c.useState(!1),[T,S]=c.useState(0),[E,w]=c.useState(null),N=UN(),[R,L]=c.useState(!1);c.useEffect(()=>{const ie=window;if(ie.requestIdleCallback){const qe=ie.requestIdleCallback(()=>L(!0),{timeout:1500});return()=>{var sa;return(sa=ie.cancelIdleCallback)==null?void 0:sa.call(ie,qe)}}const De=window.setTimeout(()=>L(!0),1);return()=>window.clearTimeout(De)},[]);const I=al(),B=zN(),A=KN(GN)&&I==="desktop",M=I!=="desktop",[K,O]=c.useState(!1),J=c.useRef(null),Z=c.useRef(null),H=c.useRef(null),te=FN(J,I,R),[,ae]=tb(),F=l2(),fe=IE(e,r),[_e,ee]=c.useState(fe),[X,ce]=c.useState(()=>Date.now());_e!==fe&&(ee(fe),ce(Date.now()));const se=c.useMemo(()=>BE({sessions:e,backlog:a,notifications:r,now:Date.now(),connection:F,quietSince:X}),[e,a,r,F,X,T]),Ce=c.useMemo(()=>eb(e,a),[e,a]),Te=c.useMemo(()=>NE(e,a),[e,a]);c.useEffect(()=>{if(se.recheckAt===null)return;const ie=setTimeout(()=>S(De=>De+1),Math.max(0,se.recheckAt-Date.now()));return()=>clearTimeout(ie)},[se.recheckAt]),c.useEffect(()=>{if(!E)return;const ie=setTimeout(()=>w(null),E.ttl);return()=>clearTimeout(ie)},[E]);const le=c.useRef(null),xa=c.useRef(null);c.useEffect(()=>{const ie={sessions:e,backlog:a,notifications:r,now:Date.now()};if(B){le.current||(le.current=vf(ie)),xa.current=null;return}const De=le.current;if(!De)return;if(xa.current===null&&(xa.current=ie.now),ie.now-De.at<XI){le.current=null;return}const qe=sN(De,ie);if(qe){le.current=null,w({...qe,id:ie.now});return}ie.now-xa.current>BN&&(le.current=null)},[B,e,a,r]);const Ze=iN(se,Date.now()),[He,Ke]=c.useState((Ze==null?void 0:Ze.text)??null);((Ze==null?void 0:Ze.text)??null)!==He&&(Ke((Ze==null?void 0:Ze.text)??null),Ze&&w({...Ze,id:Date.now()}));const{cell:ga,columns:Ge,anchor:fa,character:Aa,rows:ma}=Er,Se=MN[I]/Aa.h,Je=Math.round(ga.w*Se),q=Math.round(ga.h*Se),Be=c.useRef(cp(te,Je,Date.now())),[me,We]=c.useState(Be.current),[ia,ye]=c.useState(qo[se.pose]),[oa,we]=c.useState({x:Be.current.x,y:0,durationMs:0,ease:"linear"}),[xe,Xe]=c.useState(null),Pa=c.useRef(null),nt=c.useRef(!1),Wa=c.useCallback(()=>{var qe,sa;const ie=(qe=Z.current)==null?void 0:qe.getBoundingClientRect(),De=(sa=J.current)==null?void 0:sa.getBoundingClientRect();return ie&&De&&ie.width>0?ie.left-De.left:Be.current.x},[]),ea=c.useCallback(()=>typeof window<"u"?window.innerHeight:q,[q]),ge=c.useMemo(()=>{const ie=oa.x+fa.x*Je-no/2,De=Math.min(Math.max(ie,ld),Math.max(ld,te-no-ld));return Math.round(fa.x*Je-no/2+(De-ie))},[oa.x,Je,fa.x,te]);c.useEffect(()=>{if(!E||u)return;const ie=qe=>{J.current&&!J.current.contains(qe.target)&&w(null)},De=qe=>{qe.key==="Escape"&&w(null)};return document.addEventListener("mousedown",ie),document.addEventListener("keydown",De),()=>{document.removeEventListener("mousedown",ie),document.removeEventListener("keydown",De)}},[E,u]);const be=c.useRef(0),ca=c.useCallback(()=>{if(te<=0)return;const ie=Date.now();if(be.current===0){be.current=te;const za=cp(te,Je,ie);Be.current=za,We(za),ye(qo[se.pose]),we({x:za.x,y:0,durationMs:0,ease:"linear"});return}const De=be.current!==te;be.current=te;const qe=Wa(),sa=De&&xe===null&&!dp(Be.current.mode)?EN(Be.current,{now:ie,currentX:qe,laneWidth:te,petWidth:Je,pose:se.pose}):CN(Be.current,{now:ie,currentX:qe,laneWidth:te,laneHeight:ea(),petWidth:Je,petHeight:q,pose:se.pose,hovered:v,panelOpen:u,documentHidden:B,roam:l,reduced:N,tier:I,dragging:xe!==null,pointerX:(xe==null?void 0:xe.x)??0,pointerY:(xe==null?void 0:xe.y)??0},Math.random);Be.current=sa.state,We(sa.state),ye(sa.row),sa.move&&we(sa.move)},[Wa,ea,te,Je,q,se.pose,v,u,B,l,N,I,xe]);c.useEffect(()=>{ca()},[ca]),c.useEffect(()=>{if(!Number.isFinite(me.until))return;const ie=setTimeout(ca,Math.max(0,me.until-Date.now()));return()=>clearTimeout(ie)},[me.until,ca]);const[Na,Tt]=c.useState(null),lt=c.useRef(0),dt=c.useRef([]),[Ra,ct]=c.useState(0),[vn,Va]=c.useState(!1);c.useEffect(()=>{Va(!1)},[se.pose]);const it=ia==="shipped"&&vn?vN("shipped")??"idle":ia,Ya=(Na==null?void 0:Na.row)??it,jt=pu(Ya),Ct=c.useCallback(()=>!N&&se.pose!=="offline"&&se.pose!=="sleeping"&&xe===null&&!dp(Be.current.mode),[N,se.pose,xe]),Nt=c.useCallback(()=>{Ct()&&Tt(ie=>ie??{row:"wave",id:++lt.current})},[Ct]),xn=c.useCallback(()=>{N||(Tt({row:"thanks",id:++lt.current}),ct(ie=>ie+1))},[N]);c.useEffect(()=>{if(!u)return;const ie=qe=>{J.current&&!J.current.contains(qe.target)&>()},De=qe=>{qe.key==="Escape"&>()};return document.addEventListener("mousedown",ie),document.addEventListener("keydown",De),()=>{document.removeEventListener("mousedown",ie),document.removeEventListener("keydown",De)}},[u,N]),c.useEffect(()=>{N&&(x(!1),Tt(null),u||p(!1))},[N,u]),c.useEffect(()=>{var ie;(ie=H.current)==null||ie.toggleAttribute("inert",!u)},[u,h]);function Pt(){var on,Lt;const ie=typeof window<"u"?window.innerWidth:te,De=(on=Z.current)==null?void 0:on.getBoundingClientRect(),qe=((Lt=J.current)==null?void 0:Lt.getBoundingClientRect().left)??0,za=(De&&De.width>0?De.left:qe+Be.current.x)+fa.x*Je,Sn=Math.min(Math.max(za-od/2,to),Math.max(to,ie-od-to));f(Math.round(Sn-qe)),p(!0),m(!0)}function gt(){m(!1),N&&p(!1)}function Ua(){u?gt():Pt()}function jn(){const ie=Date.now(),De=[...dt.current.filter(qe=>ie-qe<DN),ie];if(De.length>=ON){dt.current=[],xn();return}dt.current=De,N||x(!0),Nt(),Ua()}function ya(ie){var De,qe;(qe=(De=ie.currentTarget).setPointerCapture)==null||qe.call(De,ie.pointerId),Pa.current={id:ie.pointerId,dx:ie.clientX-Wa(),dy:ie.clientY+Be.current.y,x0:ie.clientX,y0:ie.clientY,moved:!1}}function Gt(ie){const De=Pa.current;if(!(!De||De.id!==ie.pointerId)){if(!De.moved){if(Math.hypot(ie.clientX-De.x0,ie.clientY-De.y0)<=HN)return;De.moved=!0,u&>(),Tt(null)}Xe({x:ie.clientX-De.dx,y:De.dy-ie.clientY})}}function rn(ie){var qe,sa;const De=Pa.current;!De||De.id!==ie.pointerId||(Pa.current=null,(sa=(qe=ie.currentTarget).releasePointerCapture)==null||sa.call(qe,ie.pointerId),De.moved&&(nt.current=!0,Xe(null)))}function wt(ie){o(ie),DE(ie),ie&&(m(!1),p(!1))}function wn(){if(I==="desktop"&&A){m(!1),p(!1),O(!1);return}I==="desktop"?wt(!0):(m(!1),p(!1),ae(!1))}function he(ie){d(ie),HE(ie)}const ka=me.mode==="held"||me.mode==="falling",Ba=s||(A||M)&&!K,Rt=M?NN:Ba?IN:q,Mt=TN(oa,te,ea(),Je,q);c.useEffect(()=>{Ba&&u&&(m(!1),p(!1))},[Ba,u]),c.useEffect(()=>{if(!M||!K)return;const ie=qe=>{J.current&&!J.current.contains(qe.target)&&O(!1)},De=qe=>{qe.key==="Escape"&&!u&&O(!1)};return document.addEventListener("mousedown",ie),document.addEventListener("keydown",De),()=>{document.removeEventListener("mousedown",ie),document.removeEventListener("keydown",De)}},[M,K,u]);const ri={position:"relative",width:"100%",height:Rt,zIndex:80,pointerEvents:"none"},Vn=R?Rt:0;if(c.useLayoutEffect(()=>{const ie=document.documentElement;return ie.style.setProperty("--pet-h",`${Vn}px`),()=>{ie.style.removeProperty("--pet-h")}},[Vn]),!R)return null;if(Ba)return t.jsx("div",{"data-testid":"pet-root",ref:J,style:ri,children:t.jsx("button",{"aria-label":"Tampilkan pet Hanoman",onClick:()=>{s&&wt(!1),O(!0)},style:{pointerEvents:"auto",position:"absolute",width:ts,height:ts,padding:0,right:M?"max(var(--page-gutter-x), var(--safe-right))":"max(22px, var(--safe-right))",bottom:M?RN:wf,display:"inline-flex",alignItems:"center",justifyContent:"center",cursor:"pointer",border:"1px solid var(--text-muted)",borderRadius:"var(--radius-pill)",background:"var(--surface-card)",color:"var(--text-strong)",boxShadow:"var(--shadow-sm)"},children:t.jsx(qc,{id:"buntut",size:15})})});const oi=se.pose==="offline",Ni=`Hanoman ${qm[se.pose]} · ${se.headline}`+(se.count>1?` · ${se.count} ${Il[se.kind]}`:""),_s=Ya==="waiting"&&yf(se,Date.now()),ta=Math.round(xf(Ya)/(_s?$N:1)),Ri=N?"none":`hn-pet-frames ${ta}ms steps(${Ge}, end) ${jt.loop?"infinite":"1 forwards"}`;return t.jsxs("div",{"data-testid":"pet-root",ref:J,style:ri,children:[h&&t.jsxs("div",{ref:H,"data-testid":"pet-panel","aria-hidden":!u||void 0,onAnimationEnd:ie=>{ie.animationName==="hn-pet-panel-out"&&!u&&p(!1)},style:{pointerEvents:u?"auto":"none",position:"absolute",left:g,bottom:q+LN,width:od,maxWidth:"calc(100vw - var(--safe-left) - var(--safe-right) - 24px)",maxHeight:"calc(100dvh - var(--safe-top) - var(--safe-bottom) - 120px)",overflowY:"auto",boxSizing:"border-box",padding:14,background:"var(--surface-card)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-md)",boxShadow:"var(--shadow-lg)",transformOrigin:"center bottom",animation:N?"none":`${u?"hn-pet-panel-in":"hn-pet-panel-out"} var(--dur-slow) var(--ease-out) both`},children:[t.jsx("div",{className:"hn-eyebrow",style:{marginBottom:8},children:qm[se.pose]}),t.jsx("ul",{"data-testid":"pet-conditions",style:{listStyle:"none",margin:0,padding:0,display:"flex",flexDirection:"column",gap:10},children:se.conditions.map((ie,De)=>t.jsxs("li",{"data-testid":"pet-condition","data-kind":ie.kind,style:De>0?{borderTop:"1px solid var(--border-hair)",paddingTop:10}:void 0,children:[t.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:6},children:[t.jsx("span",{style:De===0?{fontFamily:"var(--font-display)",fontSize:15,fontWeight:600,color:"var(--text-strong)",lineHeight:1.25}:{fontFamily:"var(--font-ui)",fontSize:13,fontWeight:600,color:"var(--text-strong)",lineHeight:1.3},children:ie.headline}),ie.count>1&&t.jsx("span",{"data-testid":"pet-condition-count",title:`${ie.count} ${Il[ie.kind]}`,style:{flex:"0 0 auto",padding:"2px 6px",fontFamily:"var(--font-ui)",fontSize:11,fontWeight:700,lineHeight:1,color:"var(--accent-on)",background:"var(--accent)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-pill)"},children:ie.count})]}),t.jsx("div",{style:{marginTop:3,fontFamily:"var(--font-ui)",fontSize:12.5,color:"var(--text-muted)",lineHeight:1.45},children:ie.detail}),ie.target&&t.jsx("div",{style:{marginTop:7},children:t.jsx(U,{size:"sm",variant:De===0?"primary":"ghost",leftIcon:ie.target.section==="terminal"?"terminal":"list-checks",style:N?{transition:"none",transform:"none"}:void 0,onClick:()=>{const qe=ie.target;gt(),i(qe)},children:ie.target.section==="terminal"?"Buka Terminal":"Buka Backlog"})}),ie.kind==="waiting"&&u&&Ce.map(qe=>t.jsx(mp,{sessionId:qe.id,label:qe.specId??qe.id,reduced:N,ask:n.find(sa=>sa.sessionId===qe.id)},qe.id)),ie.kind==="deciding"&&u&&Te.map(qe=>{const sa=n.find(za=>za.sessionId===qe.id);return sa?t.jsx(mp,{sessionId:qe.id,label:qe.specId??qe.id,reduced:N,ask:sa},qe.id):null})]},`${ie.kind}:${De}`))}),t.jsxs("div",{style:{display:"flex",flexWrap:"wrap",gap:8,marginTop:12,borderTop:"1px solid var(--border-hair)",paddingTop:10},children:[I!=="mobile"&&t.jsx(U,{size:"sm",variant:"ghost",style:N?{transition:"none",transform:"none"}:void 0,onClick:()=>he(!l),children:l?me.parkedX===null?"Diam di pojok":"Diam di sini":"Berkeliaran"}),t.jsx(U,{size:"sm",variant:"ghost",style:N?{transition:"none",transform:"none"}:void 0,onClick:wn,children:"Sembunyikan"})]})]}),te>0&&t.jsxs("div",{"data-testid":"pet-actor",ref:Z,"data-facing":me.facing,"data-mode":me.mode,onTransitionEnd:ie=>{ie.propertyName==="transform"&&ca()},style:{position:"absolute",left:0,bottom:0,width:Je,height:q,transform:`translate(${Mt.x}px, ${-Mt.y}px)`,transition:N||oa.durationMs===0?"none":`transform ${oa.durationMs}ms ${qN[oa.ease]}`,willChange:!N&&oa.durationMs>0?"transform":void 0},children:[E&&!u&&t.jsxs("div",{"data-testid":"pet-bubble","data-kind":E.kind,"aria-hidden":E.kind==="pose"&&se.kind!=="waiting"?"true":void 0,style:{pointerEvents:"none",position:"absolute",left:ge,bottom:q-6,width:"max-content",maxWidth:no,boxSizing:"border-box",padding:"6px 10px",fontFamily:"var(--font-ui)",fontSize:12.5,lineHeight:1.35,color:"var(--text-strong)",background:"var(--surface-card)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-md)",boxShadow:"var(--shadow-sm)",animation:N?"none":"hn-pet-bubble-in var(--dur-base) var(--ease-out) both"},children:[t.jsx("span",{"data-testid":"pet-bubble-text","aria-hidden":E.kind==="pose"?"true":void 0,children:E.text}),(E.kind==="recap"||se.kind==="waiting")&&t.jsx("div",{style:{marginTop:6,pointerEvents:"auto"},children:t.jsx(U,{size:"sm",variant:"ghost",leftIcon:E.kind==="recap"?"list-checks":"terminal","aria-label":E.kind==="recap"?`${E.text} — buka ringkasan pet`:`${E.text} — jawab di sini`,style:N?{transition:"none",transform:"none"}:void 0,onClick:()=>{w(null),Pt()},children:E.kind==="recap"?"Lihat":"Jawab di sini"})})]}),t.jsxs("div",{"data-testid":"pet-stage",className:"hn-pet-stage","data-reduced-motion":N?"true":void 0,style:{position:"relative",width:Je,height:q,animation:N?"none":"hn-pet-reveal var(--dur-slow) var(--ease-out) both"},children:[t.jsx("span",{className:"hn-sr-only",role:"status","aria-live":"polite","data-testid":"pet-status",children:Ni}),se.count>1&&t.jsx("span",{"data-testid":"pet-badge","aria-hidden":"true",title:`${se.count} ${Il[se.kind]}`,style:{pointerEvents:"none",position:"absolute",top:4,right:8,zIndex:2,minWidth:18,height:18,padding:"0 5px",boxSizing:"border-box",display:"inline-flex",alignItems:"center",justifyContent:"center",fontFamily:"var(--font-ui)",fontSize:11,fontWeight:700,lineHeight:1,color:"var(--accent-on)",background:"var(--accent)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-pill)",boxShadow:"var(--shadow-sm)"},children:se.count}),Ra>0&&!N&&t.jsx("span",{"data-testid":"pet-hearts","aria-hidden":"true",style:{pointerEvents:"none",position:"absolute",zIndex:2,left:Math.round(fa.x*Je),bottom:Math.round(q*.55)},onAnimationEnd:ie=>{ie.target.dataset.last==="1"&&ct(0)},children:[0,1,2].map(ie=>t.jsx("span",{"data-last":ie===2?"1":void 0,style:{position:"absolute",left:ie*9-9,fontFamily:"var(--font-ui)",fontSize:12,color:"var(--accent)",animation:`hn-pet-heart 900ms var(--ease-out) ${ie*120}ms both`},children:"♥"},ie))},Ra),t.jsx("div",{"data-testid":"pet-reactor",className:"hn-pet-reactor",style:{position:"relative",width:"100%",height:"100%",transition:N?"none":"transform var(--dur-base) var(--ease-out)",animation:N||!b?"none":"hn-pet-click var(--dur-slow) var(--ease-out) both"},onAnimationEnd:ie=>{ie.animationName==="hn-pet-click"&&x(!1)},children:t.jsx("div",{"data-testid":"pet-viewport","data-offline":oi?"true":void 0,style:{position:"relative",overflow:"hidden",width:Je,height:q,opacity:oi?.45:1,transition:N?"none":"opacity var(--dur-slow) var(--ease-out)"},children:t.jsx("div",{"data-testid":"pet-rowshift",className:"hn-pet-rowshift","data-row":Ya,style:{width:Je,height:q,"--row":yN(Ya)},children:t.jsx("img",{"data-testid":"pet-atlas",src:fN,alt:"","aria-hidden":"true",draggable:!1,decoding:"async",onAnimationEnd:ie=>{if(ie.animationName==="hn-pet-frames"){if(Na){Na.row==="wave"&&v&&Ct()?Tt({row:"wave",id:++lt.current}):Tt(null);return}Ya==="shipped"&&Va(!0)}},style:{display:"block",width:Je*Ge,height:q*ma.length,animation:Ri}},`${Ya}:${(Na==null?void 0:Na.id)??0}`)})})}),t.jsx("button",{"data-testid":"pet-hit",className:"hn-pet-hit","aria-label":"Ringkasan status Hanoman",title:`${se.headline} — ${se.detail}`,onClick:()=>{if(nt.current){nt.current=!1;return}jn()},onPointerDown:ya,onPointerMove:Gt,onPointerUp:rn,onPointerCancel:rn,onPointerEnter:()=>{y(!0),Nt()},onPointerLeave:()=>y(!1),onFocus:()=>y(!0),onBlur:()=>y(!1),style:{pointerEvents:"auto",position:"absolute",zIndex:3,left:Math.round(fa.x*Je-ts/2),bottom:0,width:ts,height:ts,padding:0,border:"none",background:"transparent",cursor:ka?"grabbing":"grab"}})]})]})]})}const VN=c.lazy(()=>tn(()=>import("./DalangHanomanScreen-Us_5qG25.js"),__vite__mapDeps([0,1,2,3,4])).then(e=>({default:e.DalangHanomanScreen}))),YN=c.lazy(()=>tn(()=>import("./TeamScreen-CV1R5Ekk.js"),__vite__mapDeps([5,1,6,2,3,7])).then(e=>({default:e.TeamScreen}))),JN=c.lazy(()=>tn(()=>import("./TriageScreen-Dpj4YrBQ.js"),__vite__mapDeps([8,1,6,2,3,9])).then(e=>({default:e.TriageScreen}))),QN=c.lazy(()=>tn(()=>import("./TerminalScreen-QVjhjrxx.js"),__vite__mapDeps([10,1,2,3,11])).then(e=>({default:e.TerminalScreen}))),ZN=c.lazy(()=>tn(()=>import("./IdeScreen-DTvfuR2n.js"),__vite__mapDeps([12,1,13,14,6,2,3,15])).then(e=>({default:e.IdeScreen}))),XN=c.lazy(()=>tn(()=>import("./VpsScreen-DX_HEquM.js"),__vite__mapDeps([16,1,2,3,17])).then(e=>({default:e.VpsScreen}))),eR=c.lazy(()=>tn(()=>import("./SchedulerScreen-zIUh-Vbe.js"),__vite__mapDeps([18,1,6,2,19,20,21,3])).then(e=>({default:e.SchedulerScreen}))),aR=c.lazy(()=>tn(()=>import("./LeadScreen-DWbunLkQ.js"),__vite__mapDeps([22,1,6,2,19,20,3,23])).then(e=>({default:e.LeadScreen}))),tR=c.lazy(()=>tn(()=>import("./DocsWorkspace-zGpPd7u3.js"),__vite__mapDeps([24,1,2,3,25])).then(e=>({default:e.DocsWorkspace}))),nR=c.lazy(()=>tn(()=>import("./ReviewScreen-Ch9UiKlx.js"),__vite__mapDeps([26,1,14,2,3])).then(e=>({default:e.ReviewScreen}))),iR=c.lazy(()=>tn(()=>import("./SettingsScreen-CLMuCJ6R.js"),__vite__mapDeps([27,1,2,21,20,14,3,28])).then(e=>({default:e.SettingsScreen}))),sR=[{value:"critical",label:"Critical"},{value:"major",label:"Major"},{value:"minor",label:"Minor"}],hp=[{value:"tinggi",label:"Tinggi"},{value:"sedang",label:"Sedang"},{value:"rendah",label:"Rendah"}];function rR(e){switch(e){case"offline":return"offline";case"control-off":return"kendali jarak jauh mati";case"protocol-mismatch":return"versi tak cocok";case"no-spawn":return"tanpa izin mulai sesi";case"capacity-full":return"kapasitas penuh";default:return"tak tersedia"}}function oR({open:e,spec:a,onClose:n,onStarted:i,onError:r}){var Je,q,Be;const[s,o]=c.useState("sonnet"),[l,d]=c.useState("medium"),[u,m]=c.useState("claude"),[h,p]=c.useState({claude:{model:"sonnet",effort:"medium"},codex:{...bd}}),[g,f]=c.useState({}),[b,x]=c.useState(!1),[v,y]=c.useState(""),[T,S]=c.useState("changed"),[E,w]=c.useState(Mu().id),[N,R]=c.useState(!1),[L,I]=c.useState(null);c.useEffect(()=>{I(null)},[e,a==null?void 0:a.id]);const[B,A]=c.useState([{deviceId:cn,name:"hub ini",eligible:!0}]),[M,K]=c.useState(cn),[O,J]=c.useState(null),[Z,H]=c.useState(null),[te,ae]=c.useState(void 0),[F,fe]=c.useState(!1),[_e,ee]=c.useState(!1),[X,ce]=c.useState(!1),[se,Ce]=c.useState(null);c.useEffect(()=>{e&&(fe(!1),ee(!1),ce(!1),f({}),ne.getSettings().then(me=>{const We={claude:{model:me.model,effort:me.effort},codex:{...bd,...me.codex??{}}},ia=me.agent==="codex"?"codex":"claude";p(We),m(ia),o(We[ia].model),d(We[ia].effort);const ye=!!a&&Gu(ur(a.source));x(ye||me.goal.enabled),y(ye?"":me.goal.condition),S(me.verifyScope??"changed"),w(Mu(me.method).id),ae(me.orchestration),fe(!0)}).catch(()=>{ee(!0),fe(!0)}),ne.getCodexVersion().then(me=>{H(me.version),ce(!0)}).catch(()=>{ce(!0)}),ne.getMethodStatus().then(me=>Ce(me.methods)).catch(()=>Ce(null)))},[e,a]),c.useEffect(()=>{if(!e||!a)return;let me=!1;return(async()=>{try{const[We,ia]=await Promise.all([typeof ne.presence=="function"?ne.presence():Promise.resolve({enabled:!1,devices:[],hubVersion:""}),typeof ne.getProject=="function"?ne.getProject(a.projectId).then(we=>we.handledBy??[]).catch(()=>[]):Promise.resolve([])]);if(me)return;const ye=VE(We,ia);A(ye);const oa=ye.find(we=>we.deviceId!==cn&&we.eligible);K((oa==null?void 0:oa.deviceId)??cn)}catch{if(me)return;A([{deviceId:cn,name:"hub ini",eligible:!0}]),K(cn)}})(),()=>{me=!0}},[e,a==null?void 0:a.id]);const Te=M!==cn,le=c.useMemo(()=>Te?Nc({base:`/api/devices/${M}/relay`}):ne,[Te,M]),xa=me=>{m(me),f({});const We=ZE(h,me);o(We.model),d(We.effort)},Ze=me=>{o(me),d(We=>u==="codex"?Jo(me,We):Vo(me,We))},He=nb(u,s);if(!a)return null;const Ke=a,ga=ur(Ke.source),Ge=Gu(ga),fa=Ke.blockedBy??[],Aa=fa.length>0,ma=(se==null?void 0:se.find(me=>me.method===E&&me.agent===u))??null;async function Se(me=!1,We=!1){R(!0),I(null),J(null);try{const{id:ia,resumed:ye}=await le.startSession({spec:Ke.id,flow:ga,model:s,effort:l,agent:u,...Object.keys(g).length?{phaseOverrides:g}:{},goal:b,goalCondition:b&&v.trim()?v.trim():void 0,verifyScope:T,method:E,...Aa||me?{force:!0}:{},...We?{confirmRemote:!0}:{}});i(ia,ye),n()}catch(ia){if(ia instanceof ha&&ia.status===409&&ia.detail&&typeof ia.detail=="object"&&(ia.detail.error==="remote-session"||ia.detail.error==="confirm-required")){J(ia.detail);return}const ye=ia instanceof ha&&ia.status===409?vg.safeParse(ia.detail):null;ye!=null&&ye.success?I(ye.data):r==null||r(ia)}finally{R(!1)}}return t.jsxs(la,{open:e,onClose:n,icon:"play",eyebrow:`${Ke.id} · ${ga}`,title:"Mulai sesi",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",onClick:n,children:"Batal"}),t.jsx(U,{leftIcon:Aa?"lock":"play",variant:Aa?"danger":"primary",disabled:N,onClick:()=>void Se(),children:Aa?"Mulai tetap":L?"Coba lagi":"Mulai"}),L&&!Aa&&!Te&&t.jsx(U,{leftIcon:"lock",variant:"danger",disabled:N,onClick:()=>void Se(!0),children:"Mulai tetap"})]}),children:[t.jsxs("div",{className:"hn-sheet-lead",children:["Agen, model & effort ",t.jsx("b",{children:"orchestrator"})," sesi ini. Default dari setelan global; ubah bila perlu. Bila orkestrasi flow ini aktif, tiap fase dikerjakan subagent dengan model & effort di bawah (Settings › Orkestrasi). Override di bawah hanya berlaku untuk sesi ini dan tidak mengubah Settings."]}),L&&t.jsxs("div",{role:"alert",className:"hn-sheet-alert",children:[t.jsx("b",{children:L.error}),t.jsxs("div",{children:[L.admission.liveCount," sesi hidup · ",L.admission.liveAgentCount," agen terstruktur · cap ",L.admission.maxConcurrent]}),t.jsxs("div",{children:["Load per core: ",L.admission.loadStatus==="available"&&L.admission.loadPerCore!==null?L.admission.loadPerCore.toFixed(2):"tidak tersedia",L.admission.loadStatus==="unsupported"?" (tidak didukung platform)":""," · ambang ",L.admission.maxLoadPerCore]}),t.jsx("div",{children:"Coba lagi setelah beban turun, atau pilih Mulai tetap untuk melewati cap dan pemeriksaan beban host."})]}),Aa&&t.jsxs("div",{"data-testid":"dep-blocked-note",className:"hn-sheet-alert",children:["Backlog ini menunggu"," ",t.jsx("b",{children:fa.map(me=>`${me.id} (${me.reason==="missing"?"tak ditemukan":me.reason==="unmerged"?"belum ter-merge":"belum selesai"})`).join(", ")}),". Sesi tetap bisa dimulai, tapi worktree-nya lahir dari basis yang belum memuat pekerjaan itu."," ","Mulai tetap juga melewati cap sesi dan pemeriksaan beban host."]}),t.jsx(oe,{label:"Target",hint:"Mesin yang menjalankan sesi ini. Tak terpilih tetap tampil beserta alasannya.",children:t.jsx($e,{"aria-label":"target",value:M,className:"hn-w-full",options:B.map(me=>({value:me.deviceId,label:me.eligible?me.name:`${me.name} — ${rR(me.reason)}`,disabled:!me.eligible})),onChange:me=>{K(me.target.value),J(null)}})}),(O==null?void 0:O.error)==="remote-session"&&O.remoteSession&&t.jsxs("div",{role:"alert",className:"hn-sheet-notice",children:["Sesi ini sudah berjalan di ",t.jsx("b",{children:O.remoteSession.name}),"."]}),(O==null?void 0:O.error)==="confirm-required"&&t.jsxs("div",{role:"alert",className:"hn-sheet-notice",children:[t.jsx("div",{children:"Device terakhir yang mengerjakan ini sudah offline."}),t.jsx(U,{variant:"danger",disabled:N,onClick:()=>void Se(!1,!0),children:"Tetap mulai"})]}),t.jsx(oe,{label:"Agen",hint:"Mesin yang menjalankan sesi ini. Perilaku sesi sama; hanya CLI-nya berbeda.",children:t.jsx($e,{"aria-label":"Agen",value:u,className:"hn-w-full",options:[{value:"claude",label:"Claude Code"},{value:"codex",label:"Codex CLI"}],onChange:me=>xa(me.target.value)})}),t.jsx(oe,{label:"Model",children:t.jsx($e,{"aria-label":"Model",value:s,className:"hn-w-full",options:QE(u,s),onChange:me=>Ze(me.target.value)})}),t.jsx(oe,{label:"Effort",children:t.jsx($e,{"aria-label":"Effort",value:l,className:"hn-w-full",options:He.map(me=>({value:me,label:me})),onChange:me=>d(me.target.value)})}),u==="codex"&&vv(s,Z)&&t.jsxs("div",{"data-testid":"codex-version-note",className:"hn-sheet-note",children:["Codex CLI terpasang ",t.jsx("b",{children:Z}),", sedangkan ",t.jsx("b",{children:s})," butuh ",t.jsx("b",{children:(Je=Yo(s))==null?void 0:Je.minClient}),". Sesi tetap boleh dijalankan, tapi modelnya belum tentu dikenali CLI ini."]}),t.jsx(sT,{flow:ga,agent:u,model:s,effort:l,orchestration:te,codexVersion:Z,phaseOverrides:g,onPhaseOverridesChange:f,loadError:_e,remoteTarget:Te?((q=B.find(me=>me.deviceId===M))==null?void 0:q.name)??M:null,loading:!F||u==="codex"&&!X}),t.jsxs(oe,{label:"Mode goal",hint:Ge?"Backlog goal selalu berjalan dalam mode goal — sesi menolak berhenti sampai goal item ini terbukti tercapai. Kosongkan kondisi untuk memakai goal item apa adanya.":"Sesi menolak berhenti sampai kondisinya terbukti. Kosongkan kondisi untuk memakai bawaan hanoman: semua fase tercatat, plan tak menyisakan task, push sukses.",children:[t.jsxs("div",{className:b?"hn-goal-row hn-goal-row--on":"hn-goal-row",children:[t.jsx(el,{"aria-label":"Mode goal",checked:b,disabled:Ge,onChange:me=>{Ge||x(me)}}),t.jsx("span",{className:"hn-sheet-meta",children:Ge?"aktif · terkunci":b?"aktif":"nonaktif"})]}),b&&t.jsx(Ma,{value:v,rows:4,mono:!0,placeholder:Ge?"Kosong = goal backlog item ini · mis. semua fase tercatat & plan tanpa - [ ]":"Kosong = kondisi bawaan hanoman · mis. semua fase tercatat & plan tanpa - [ ]",onChange:me=>y(me.target.value)})]}),t.jsx(oe,{label:"Scope verifikasi",hint:"Hanya yang berubah = test/typecheck/lint hanya menyentuh berkas yang disentuh sesi ini. Suite penuh tetap dijalankan manusia sebelum merge.",children:t.jsx($e,{"aria-label":"Scope verifikasi",value:T,className:"hn-w-full",options:[{value:"changed",label:"Hanya yang berubah — hemat RAM & CPU"},{value:"full",label:"Seluruh project"}],onChange:me=>S(me.target.value)})}),t.jsxs(oe,{label:"Metode",hint:"Metodologi kerja sesi ini: skill per fase + direktori plan/spec. Fase-fasenya sendiri tak berubah. Item yang sudah pernah dijalankan memakai metode tercatatnya saat dilanjutkan.",children:[t.jsx($e,{"aria-label":"Metode",value:E,className:"hn-w-full",options:cc.map(me=>({value:me,label:Ci[me].label})),onChange:me=>w(me.target.value)}),t.jsxs("div",{"data-testid":"method-requires",className:"hn-sheet-foot",children:["Butuh terpasang: ",((Be=Ci[E])==null?void 0:Be.requires.join(" · "))??"—"]}),ma&&!ma.ready&&t.jsxs("div",{"data-testid":"method-status-note",className:"hn-sheet-status",children:[t.jsx("b",{children:ma.label})," belum siap untuk ",t.jsx("b",{children:u==="codex"?"Codex CLI":"Claude Code"})," di mesin ini",ma.missingPackages.length>0&&t.jsxs(t.Fragment,{children:[" · paket kurang: ",t.jsx("code",{children:ma.missingPackages.join(" · ")})]}),ma.missingSkills.length>0&&t.jsxs(t.Fragment,{children:[" · skill kurang: ",t.jsx("code",{children:ma.missingSkills.join(" · ")})]}),"."," ","Sesi tetap boleh dijalankan, tapi gerbang yang disebut prompt tak akan ada. Pasang dari Settings → Sesi."]})]})]})}function lR({open:e,onClose:a,projects:n,defaultProject:i,onCreate:r,prefill:s,specs:o}){const l={kind:(s==null?void 0:s.kind)??"brief",project:(s==null?void 0:s.project)||i,title:(s==null?void 0:s.title)??"",context:(s==null?void 0:s.context)??"",outcome:(s==null?void 0:s.outcome)??"",constraints:(s==null?void 0:s.constraints)??"",priority:"sedang",severity:(s==null?void 0:s.severity)??"major",steps:(s==null?void 0:s.steps)??"",expected:"",actual:(s==null?void 0:s.actual)??"",env:"",branchFrom:(s==null?void 0:s.branchFrom)??"",fromAudit:(s==null?void 0:s.fromAudit)??"",goal:(s==null?void 0:s.goal)??"",done:(s==null?void 0:s.done)??"",dependsOn:[],attachments:[]},[d,u]=c.useState(l);c.useEffect(()=>{e&&u({...l,project:(s==null?void 0:s.project)||i})},[e,i,s]);const[m,h]=c.useState([]),[p,g]=c.useState(new Set);c.useEffect(()=>{if(!e||!d.project){h([]),g(new Set);return}let N=!0;return ne.listBranches(d.project).then(R=>{if(!N)return;const L=[...new Set([...R.branches,...R.remotes])].sort();h(L),g(new Set(R.remotes.filter(I=>!R.branches.includes(I)))),u(I=>I.branchFrom&&!L.includes(I.branchFrom)?{...I,branchFrom:""}:I)}).catch(()=>{N&&(h([]),g(new Set))}),()=>{N=!1}},[e,d.project]);const f=N=>R=>u(L=>({...L,[N]:R.target.value})),b=d.kind==="qa",x=d.kind==="audit",v=d.kind==="goal",y=d.kind==="no_effort",T=Ti(d.kind)==="goal",S=(o??[]).filter(N=>N.projectId===d.project),E=N=>u(R=>({...R,dependsOn:R.dependsOn.includes(N)?R.dependsOn.filter(L=>L!==N):[...R.dependsOn,N]})),w=()=>{!d.title.trim()||T&&!d.goal.trim()||r(d)};return t.jsxs(la,{open:e,onClose:a,icon:b?"bug":x?"search":y?"zap":v?"target":"lightbulb",eyebrow:"human → hanoman",title:b?"QA finding baru":x?"Audit baru":y?"Task remeh baru":v?"Goal baru":"Feature brief baru",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",size:"sm",onClick:a,children:"Batal"}),t.jsx(U,{size:"sm",leftIcon:b?"radar":x?"search":y?"zap":v?"target":"messages-square",onClick:w,children:b?"Filekan finding → audit":x?"Buat audit → investigasi":y?"Buat task → sesi satu fase":v?"Buat goal → sesi goal":"Buat brief → brainstorm"})]}),children:[t.jsxs("div",{className:"hn-sheet-block",children:[t.jsx(At,{variant:"pill",className:"hn-sheet-kinds",value:d.kind,onChange:N=>u(R=>({...R,kind:N})),tabs:[{value:"brief",label:"Feature brief",icon:"lightbulb"},{value:"qa",label:"QA finding",icon:"bug"},{value:"audit",label:"Audit",icon:"search"},{value:"goal",label:"Goal",icon:"target"},{value:"no_effort",label:"Tanpa effort",icon:"zap"}]}),t.jsx("div",{className:"hn-sheet-hint",children:y?"Sesi satu fase (Kerjakan): langsung mengerjakan lalu berhenti — tanpa brainstorm, spec, plan, maupun fase pembuktian terpisah. Untuk ganti copy, bump konstanta, perbaiki typo docs, tambah satu baris allowlist.":v?"Sesi goal langsung mengejar goal-nya — tanpa brainstorm, spec, atau plan (fase: Goal → Verifikasi). Sesi lahir dengan mode goal aktif dan menolak berhenti sampai buktinya ada di transkrip.":b?"Finding masuk lewat alur audit → spec → plan → execute. hanoman menelusuri akar masalah dulu.":x?"Audit HANYA menghasilkan dokumen (audit → laporan) — tanpa perbaikan kode. Bisa dinaikkan jadi Finding QA bila perlu diperbaiki.":"Brief masuk lewat alur brainstorm → objective → spec → plan → execute."})]}),t.jsx(oe,{label:"Project",children:t.jsx($e,{value:d.project,onChange:f("project"),className:"hn-w-full",options:n.map(N=>({value:N.id,label:N.name}))})}),t.jsx(oe,{label:"Branch",hint:"branch yang disalin ke worktree (salinan kerja terpisah untuk sesi ini) saat sesi dimulai",children:t.jsx($e,{value:d.branchFrom,onChange:f("branchFrom"),disabled:!m.length,className:"hn-w-full",options:cb(m,p)})}),t.jsx(oe,{label:"Bergantung pada",hint:"Backlog yang harus selesai & ter-merge lebih dulu. Kosongkan bila item ini berdiri sendiri.",children:S.length===0?t.jsx("div",{className:"hn-sheet-empty",children:"Belum ada backlog lain di project ini."}):t.jsx("div",{className:"hn-dep-list",children:S.map(N=>t.jsx(vs,{"aria-label":`Bergantung pada ${N.id}`,checked:d.dependsOn.includes(N.id),onChange:()=>E(N.id),label:`${N.id} · ${N.title}`},N.id))})}),t.jsx(oe,{label:"Judul",children:t.jsx(Oe,{"aria-label":"Judul",value:d.title,onChange:f("title"),placeholder:b?"mis. Funnel double-count sesi lintas tengah malam":y?"mis. Label tombol Simpan di form backlog":v?"mis. Latensi daftar backlog":"mis. Jadwal invoice berulang",className:"hn-w-full"})}),T?t.jsxs(t.Fragment,{children:[t.jsx(oe,{label:"Goal",hint:"Keadaan yang harus tercapai — inilah yang dikejar sesi sampai terbukti",children:t.jsx(Ma,{"aria-label":"Goal",value:d.goal,onChange:f("goal"),rows:3,placeholder:"mis. p95 GET /api/specs di bawah 200 ms"})}),t.jsx(oe,{label:"Selesai bila",hint:"Bukti yang harus muncul di transkrip; kosongkan bila goal-nya sudah jadi buktinya sendiri",children:t.jsx(Ma,{"aria-label":"Selesai bila",value:d.done,onChange:f("done"),rows:2,placeholder:"mis. output benchmark menunjukkan < 200 ms"})}),t.jsxs("div",{className:"hn-grid-mobile hn-grid-split",children:[t.jsx(oe,{label:"Batasan",hint:"opsional",children:t.jsx(Oe,{"aria-label":"Batasan",value:d.constraints,onChange:f("constraints"),placeholder:"mis. tanpa cache eksternal",className:"hn-w-full"})}),t.jsx(oe,{label:"Prioritas",children:t.jsx($e,{"aria-label":"Prioritas",value:d.priority,onChange:f("priority"),className:"hn-w-full",options:hp})})]})]}):b?t.jsxs(t.Fragment,{children:[t.jsx(oe,{label:"Severity",children:t.jsx($e,{value:d.severity,onChange:f("severity"),className:"hn-w-full",options:sR})}),t.jsx(oe,{label:"Langkah reproduksi",children:t.jsx(Ma,{value:d.steps,onChange:f("steps"),rows:3,mono:!0,placeholder:`1. Buka …
|
|
1010
|
+
3. Amati …`],["expected","Diharapkan","mis. total funnel sama dengan jumlah baris laporan harian"],["actual","Aktual","mis. total funnel dua kali lipat untuk sesi yang melewati tengah malam"],["env","Environment","prod · web · v0.9.2"],["constraints","Batasan","mis. jangan ubah kontrak API"]],tc={brief:xI,qa:wI,goal:jI},nc=[{value:"tinggi",label:ms.tinggi},{value:"sedang",label:ms.sedang},{value:"rendah",label:ms.rendah}],df=[{value:"critical",label:Tl.critical},{value:"major",label:Tl.major},{value:"minor",label:Tl.minor}];function SI({spec:e,onClose:a,onSubmit:n}){var E;const i=e.stage!=="brainstorming"||e.baseSha!=null,r=vI.filter(w=>w.value!==e.source),[s,o]=c.useState(((E=r[0])==null?void 0:E.value)??""),l=i&&ur(s)!==ur(e.source),d=i&&!l,u=c.useMemo(()=>xy(s,e.payload),[s,e.payload]),[m,h]=c.useState(()=>u.payload),[p,g]=c.useState(null),[f,b]=c.useState(!1);c.useEffect(()=>{h(u.payload),g(null)},[s]);const x=w=>N=>h(R=>({...R,[w]:N.target.value})),v=Ti(s),y=tc[v]??[],T=w=>{var N;return((N=(tc[dc(e.payload)]??[]).find(([R])=>R===w))==null?void 0:N[1])??w};async function S(w){if(!f){b(!0);try{const N=await n(s,d?void 0:{...m},w);N&&N.pending?g(N):a()}finally{b(!1)}}}return p?t.jsxs(la,{open:!0,title:"Item ini akan dikembalikan ke Brainstorming",icon:"rotate-ccw",eyebrow:`${e.id} · ${ai(e.source).label} → ${ai(s).label}`,onClose:f?void 0:a,children:[t.jsxs("div",{className:"hn-dia-lead hn-dia-lead-sm",children:["Alur kerja ",ai(s).label," berbeda dari yang sudah dikerjakan, jadi item ini mulai lagi dari awal. Kode yang sudah ter-commit di branch lain tak disentuh."]}),t.jsxs("ul",{"data-testid":"source-reset-impact",className:"hn-dia-impact",children:[p.wouldDelete.map(w=>t.jsx("li",{children:w},w)),p.worktree&&t.jsx("li",{children:p.worktree}),p.branch&&t.jsx("li",{children:p.branch}),!p.wouldDelete.length&&!p.worktree&&!p.branch&&t.jsx("li",{children:"tak ada berkas yang perlu dibuang — hanya tahapnya yang mundur"})]}),t.jsxs("div",{className:"hn-dia-foot",children:[t.jsx(U,{size:"sm",variant:"secondary",disabled:f,onClick:a,children:"Batal"}),t.jsx(U,{size:"sm",variant:"danger",leftIcon:"rotate-ccw",loading:f,onClick:()=>S(!0),children:"Reset & ubah type"})]})]}):t.jsxs(la,{open:!0,title:"Ubah type backlog item",icon:"shuffle",eyebrow:`${e.id} · ${ai(e.source).label}`,onClose:a,children:[t.jsx(oe,{label:"Type tujuan",children:t.jsx($e,{"aria-label":"Type tujuan",value:s,onChange:w=>o(w.target.value),options:r,className:"hn-dia-full"})}),!r.length&&t.jsx("div",{className:"hn-dia-note",children:"Tak ada type lain yang bisa dituju. Dialog tetap terbuka dan mengatakannya — menolak dengan diam adalah bug yang melahirkan ADR-0149."}),d?t.jsxs("div",{className:"hn-dia-note",children:["Item ini sudah pernah dikerjakan sesi, dan type tujuannya memakai alur kerja yang sama — yang berpindah hanya ",t.jsx("strong",{children:"labelnya"}),". Isi, worktree, dan berkas fase tak disentuh."]}):t.jsxs(t.Fragment,{children:[l&&t.jsxs("div",{"data-testid":"source-reset-warning",className:"hn-dia-box",children:[t.jsx(ra,{tone:"warn",size:"sm",children:"alur kerja berbeda"})," ","Item ini akan kembali ke tahap ",t.jsx("strong",{children:"Brainstorming"}),"; dokumen fase, worktree, dan branch sesi lamanya dihapus. Daftar persisnya ditampilkan sebelum kamu menyetujui."]}),u.dropped.length>0&&t.jsxs("div",{"data-testid":"source-dropped",className:"hn-dia-box hn-dia-box-muted",children:[t.jsx(ra,{tone:"warn",size:"sm",children:"tak punya padanan"})," ",u.dropped.map(T).join(", ")," tidak ada di bentuk"," ",ai(s).label,". Teks lamanya tetap tersimpan di"," ",t.jsx("strong",{children:"jejak konversi"})," item ini."]}),v!=="qa"&&t.jsx(oe,{label:"Prioritas",children:t.jsx($e,{"aria-label":"Prioritas",value:m.priority??"sedang",onChange:x("priority"),options:nc,className:"hn-dia-full"})}),y.map(([w,N,R])=>t.jsx(oe,{label:N,children:w==="severity"?t.jsx($e,{"aria-label":N,value:m[w]??"minor",onChange:x(w),options:df,className:"hn-dia-full"}):t.jsx(Ma,{"aria-label":N,value:m[w]??"",onChange:x(w),rows:2,placeholder:R})},w))]}),t.jsxs("div",{className:"hn-dia-foot hn-dia-foot-tight",children:[t.jsx(U,{size:"sm",variant:"secondary",onClick:a,children:"Batal"}),t.jsx(U,{size:"sm",variant:"primary",leftIcon:"shuffle",loading:f,disabled:!r.length,onClick:()=>S(),children:"Ubah type"})]})]})}const Yh=280;function cf({spec:e,onClose:a,onSubmit:n}){const[i,r]=c.useState(""),[s,o]=c.useState(null),[l,d]=c.useState(!1),u=c.useRef(!1);async function m(){if(!u.current){u.current=!0,d(!0);try{const h=await n(e,i.trim(),s!==null);if(h&&"needConfirm"in h){o(h.sessionId??"");return}h&&a()}finally{u.current=!1,d(!1)}}}return t.jsxs(la,{open:!0,title:"Tandai selesai",icon:"circle-check",eyebrow:e.id+" · "+e.projectId,onClose:l?void 0:a,children:[t.jsx("div",{style:{fontSize:13,color:"var(--text-muted)",lineHeight:1.55,marginBottom:14},children:"Item keluar dari daftar siap-kerja dan berstatus selesai — sama seperti item yang selesai lewat sesi. Kode, commit, dan dokumen tidak disentuh, dan status ini masih bisa dikembalikan lewat “Ubah status”."}),s!==null&&t.jsxs("div",{"data-testid":"mark-done-live",style:{border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",background:"var(--bone-100)",padding:10,marginBottom:14,fontSize:12.5,color:"var(--text-strong)",lineHeight:1.5},children:["Masih ada sesi yang berjalan untuk item ini",s?` (${s})`:"",". Menandainya selesai tidak menghentikan sesi itu — tutup sesinya dari Terminal bila memang sudah tak dibutuhkan."]}),t.jsx(oe,{label:"Alasan singkat (opsional)",hint:`${i.trim().length}/${Yh} — mis. “sudah ter-merge lewat PR #12”`,children:t.jsx(Ma,{"aria-label":"Alasan singkat (opsional)",rows:2,value:i,maxLength:Yh,disabled:l,onChange:h=>r(h.target.value),placeholder:"sudah dikerjakan langsung di checkout"})}),t.jsxs("div",{style:{display:"flex",gap:8,justifyContent:"flex-end"},children:[t.jsx(U,{size:"sm",variant:"secondary",disabled:l,onClick:a,children:"Batal"}),t.jsx(U,{size:"sm",variant:"primary",leftIcon:"circle-check",loading:l,onClick:m,children:s!==null?"Tandai selesai — sesi tetap berjalan":"Tandai selesai"})]})]})}const pn=[{key:"brainstorming",label:"Brainstorm"},{key:"objective",label:"Objective"},{key:"spec-ready",label:"Spec"},{key:"planned",label:"Plan"},{key:"executing",label:"Execute"},{key:"done",label:"Done"}],uf=e=>pn.findIndex(a=>a.key===e),mf={brainstorming:"Brainstorm: ide digali bersama agen sebelum tujuan dikunci",objective:"Objective: tujuan terukur dikunci sebelum spec ditulis","spec-ready":"Spec: dokumen spesifikasi ditulis",planned:"Plan: rencana langkah disusun",executing:"Execute: kode dikerjakan di worktree sesi",done:"Done: item selesai"},lr=[{key:"all",label:"Semua",stages:pn.map(e=>e.key)},{key:"brainstorm",label:"Brainstorm",stages:["brainstorming","objective"]},{key:"spec",label:"Spec",stages:["spec-ready","planned"]},{key:"doing",label:"Dikerjakan",stages:["executing"]},{key:"done",label:"Selesai",stages:["done"]}],Jh=(e,a)=>{var n;return a==="all"||(((n=lr.find(i=>i.key===a))==null?void 0:n.stages.includes(e))??!1)},_I=e=>{var a;return((a=lr.find(n=>n.key!=="all"&&n.stages.includes(e)))==null?void 0:a.label)??e},AI={brainstorming:"idle",objective:"idle","spec-ready":"queued",planned:"queued",executing:"running",done:"done"},EI=e=>e==="brainstorming"?"Mulai":"Lanjutkan",Qh={tinggi:{tone:"brass",label:ms.tinggi,level:"high"},sedang:{tone:"neutral",label:ms.sedang,level:"mid"},rendah:{tone:"neutral",label:ms.rendah,level:"low"}},Ho=e=>Qh[e]??Qh.sedang,Zh=[{value:"all",label:"Semua sumber"},{value:"brief",label:"Dari brief"},{value:"qa",label:"Dari QA"},{value:"audit",label:"Audit"},{value:"goal",label:"Goal"},{value:"help",label:"Help Center"},{value:"no_effort",label:"Tanpa effort"}],TI=[{value:"all",label:"Semua prioritas"},{value:"tinggi",label:"Tinggi"},{value:"sedang",label:"Sedang"},{value:"rendah",label:"Rendah"}],Xh={audit:"Audit: hasil pemeriksaan project. Dari sini bisa dinaikkan jadi Finding QA, feature brief, atau PRD.",goal:"Goal: item dengan tujuan terukur. Dikerjakan dua fase (Goal lalu Verifikasi) tanpa tahap perencanaan.",no_effort:"Tanpa effort: tugas remeh yang dikerjakan satu fase, tanpa perencanaan maupun verifikasi."},hf=e=>e==="missing"?"tak ditemukan":e==="unmerged"?"belum ter-merge":"belum selesai";function mu({spec:e}){const a=e.blockedBy??[];return a.length?t.jsx(ra,{tone:"warn",size:"sm",icon:"lock",title:a.map(n=>`${n.id} — ${hf(n.reason)}`).join(" · "),children:"Terblokir"}):null}function hu({priority:e}){const a=Ho(e);return t.jsx("span",{className:`hn-bl-prio hn-bl-prio-${a.level}`,title:`Prioritas ${a.label}`,children:t.jsxs("span",{className:"hn-sr-only",children:["Prioritas ",a.label]})})}function pf({source:e}){const a=ai(e);return t.jsxs("span",{className:"hn-bl-source",children:[t.jsx(Re,{name:a.icon,size:12,color:a.color}),a.label]})}function gf({stage:e}){return t.jsx(pt,{status:AI[e]??"idle",size:"sm",variant:"dot",className:"hn-bl-stage-pill",title:mf[e],children:_I(e)})}function CI({stage:e}){var i;const a=uf(e),n=((i=pn[a])==null?void 0:i.label)??e;return t.jsx("div",{role:"progressbar","aria-label":`Status ${n}`,"aria-valuemin":0,"aria-valuemax":pn.length-1,"aria-valuenow":Math.max(a,0),"aria-valuetext":n,className:"hn-bl-stagebar",children:pn.map((r,s)=>{const o=s<a||e==="done",l=s===a&&e!=="done",d=o?"done":l?"active":"todo";return t.jsxs("span",{className:"hn-bl-stage","data-state":d,title:mf[r.key],children:[t.jsx("span",{className:"hn-bl-stage-dot","aria-hidden":"true"}),l&&t.jsx("span",{className:"hn-bl-stage-label",children:r.label})]},r.key)})})}function ep({label:e,value:a}){return t.jsxs("div",{className:"hn-bl-field",children:[t.jsx("div",{className:"hn-eyebrow",children:e}),t.jsx("div",{className:"hn-bl-field-value",children:a||"—"})]})}const PI={qa:"Finding QA — ada yang perlu diperbaiki.",brief:"Feature brief — kebutuhan yang bentuknya sudah jelas.",prd:"PRD — kebutuhan produk yang perlu didefinisikan dulu."},id=(e,a)=>e&&e.target===a?"primary":"secondary",ap=e=>e==="audit";function MI({spec:e,onClose:a,onEditBranch:n,onRevertStage:i,onMarkDone:r,onOpenReview:s,onStart:o,onIntegrate:l,onEditSpec:d,onPromoteToQa:u,onPromoteToBrief:m,onPromoteToPrd:h,onEditDeps:p,onEditAutoMerge:g,onChangeSource:f,onRequestDelete:b,onUndoable:x,projectPolicy:v,allSpecs:y,onAttachmentToast:T,running:S,onOpenRun:E,projectName:w,presenceOn:N}){var nt,Wa,ea;const[R,L]=c.useState([]),[I,B]=c.useState(new Set),[A,M]=c.useState(null),[K,O]=c.useState(""),[J,Z]=c.useState(!1),[H,te]=c.useState(!1),ae=c.useRef(!1),[F,fe]=c.useState(!1),[_e,ee]=c.useState(!1),[X,ce]=c.useState(!1),[se,Ce]=c.useState(!1),[Te,le]=c.useState({}),xa=(e==null?void 0:e.stage)==="brainstorming"&&(e==null?void 0:e.baseSha)==null&&!!d&&e.payload!==void 0,Ze=()=>{if(!e)return;const ge=e.payload||{};le({title:e.title,priority:e.priority,...ge}),Ce(!0)},He=ge=>be=>le(ca=>({...ca,[ge]:be.target.value})),[Ke,ga]=c.useState(null),Ge=e&&ap(e.source)?e.id:null;c.useEffect(()=>{var be;if(ga(null),!Ge)return;let ge=!0;return(be=ne.getEscalation)==null||be.call(ne,Ge).then(ca=>{ge&&ga(ca.escalation)}).catch(()=>{ge&&ga(null)}),()=>{ge=!1}},[Ge]);const fa=()=>{if(!e||!d)return;const ge=e.source==="qa"?{title:Te.title,payload:{severity:Te.severity,steps:Te.steps,expected:Te.expected,actual:Te.actual,env:Te.env,constraints:Te.constraints??""}}:Ti(e.source)==="goal"?{title:Te.title,priority:Te.priority,payload:{goal:Te.goal,done:Te.done??"",constraints:Te.constraints??"",priority:Te.priority}}:{title:Te.title,priority:Te.priority,payload:{context:Te.context,outcome:Te.outcome,constraints:Te.constraints,priority:Te.priority}};d(e,ge),Ce(!1)},Aa=ge=>{if(!e||!d||ge===e.priority)return;const be=e.priority;d(e,{priority:ge}),x==null||x(`Prioritas ${e.id} diubah ke ${Ho(ge).label}`,()=>d(e,{priority:be}))},ma=e==null?void 0:e.projectId;c.useEffect(()=>{if(!ma){L([]),B(new Set);return}let ge=!0;return ne.listBranches(ma).then(be=>{if(ge){const ca=[...new Set([...be.branches,...be.remotes])].sort();L(ca),B(new Set(be.remotes.filter(Na=>!be.branches.includes(Na))))}}).catch(()=>{ge&&(L([]),B(new Set))}),()=>{ge=!1}},[ma]),c.useEffect(()=>{K&&O(""),A&&M(null)},[e==null?void 0:e.id,e==null?void 0:e.stage]);async function Se(ge){if(!ae.current){ae.current=!0,te(!0);try{return await ge()}finally{ae.current=!1,te(!1)}}}async function Je(){if(!e||!i||!K)return;const ge=await Se(()=>i(e,K));ge&&ge.pending?M({target:K,files:ge.wouldDelete}):ge&&O("")}async function q(){if(!e||!i||!A)return;await Se(()=>i(e,A.target,!0))&&(M(null),O(""))}function Be(){A||ae.current||(Ce(!1),a())}if(!e)return null;const me=pn.slice(0,uf(e.stage)),We=((nt=pn.find(ge=>ge.key===e.stage))==null?void 0:nt.label)??e.stage,ia=((Wa=pn.find(ge=>ge.key===K))==null?void 0:Wa.label)??K,ye=e.source==="qa",oa=Ti(e.source),we=e.payload||{},xe=(y??[]).filter(ge=>ge.projectId===e.projectId&&ge.id!==e.id),Xe=tc[oa],Pa=ai(e.source);return t.jsxs(la,{open:!0,title:e.title,eyebrow:e.id,icon:Pa.icon,onClose:Be,width:600,children:[t.jsxs("div",{className:"hn-bl-detail",children:[t.jsxs("section",{className:"hn-bl-section","aria-labelledby":"bl-sec-ringkasan",children:[t.jsx("h3",{id:"bl-sec-ringkasan",className:"hn-bl-section-title",children:"Ringkasan"}),t.jsxs("div",{className:"hn-bl-summary-meta",children:[t.jsx(gf,{stage:e.stage}),t.jsxs("span",{className:"hn-bl-prio-text",children:[t.jsx(hu,{priority:e.priority}),Ho(e.priority).label]}),t.jsx(mu,{spec:e}),t.jsx(dl,{names:N})]}),t.jsx(CI,{stage:e.stage}),se?t.jsx(oe,{label:"Judul",children:t.jsx(Oe,{value:Te.title??"",onChange:He("title"),placeholder:"mis. Jadwal invoice berulang",className:"hn-bl-full"})}):t.jsx(ep,{label:"Tujuan",value:e.objective}),t.jsxs("dl",{className:"hn-bl-facts",children:[t.jsxs("div",{children:[t.jsx("dt",{children:"Project"}),t.jsx("dd",{children:w??e.projectId})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Penulis"}),t.jsx("dd",{children:e.author||"—"})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Dibuat"}),t.jsx("dd",{children:II(e.createdAt)||"—"})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Branch asal"}),t.jsx("dd",{children:e.branchFrom||"—"})]})]}),xa&&!se&&t.jsxs("div",{className:"hn-bl-inline-row",children:[t.jsx($e,{size:"sm","aria-label":"Prioritas item ini",value:e.priority,onChange:ge=>Aa(ge.target.value),options:nc}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"pencil",onClick:Ze,children:"Edit"})]}),se?t.jsxs(t.Fragment,{children:[!ye&&t.jsx(oe,{label:"Prioritas",children:t.jsx($e,{value:Te.priority??"sedang",onChange:He("priority"),options:nc,className:"hn-bl-full"})}),Xe.map(([ge,be,ca])=>t.jsx(oe,{label:be,children:ge==="severity"?t.jsx($e,{value:Te[ge]??"major",onChange:He(ge),options:df,className:"hn-bl-full"}):t.jsx(Ma,{value:Te[ge]??"",onChange:He(ge),rows:2,placeholder:ca})},ge)),t.jsxs("div",{className:"hn-bl-inline-row hn-bl-end",children:[t.jsx(U,{size:"sm",variant:"secondary",onClick:()=>Ce(!1),children:"Batal"}),t.jsx(U,{size:"sm",variant:"primary",leftIcon:"check",onClick:fa,children:"Simpan"})]})]}):Xe.map(([ge,be])=>t.jsx(ep,{label:be,value:we[ge]??""},ge)),e.manualDone&&t.jsxs("div",{className:"hn-bl-field","data-testid":"manual-done-trail",children:[t.jsx("div",{className:"hn-eyebrow",children:"Ditandai selesai manual"}),t.jsxs("div",{className:"hn-bl-field-value hn-bl-muted",children:[e.manualDone.by," · ",new Date(e.manualDone.at).toLocaleString("id-ID"),e.manualDone.reason?t.jsx("div",{className:"hn-bl-gap-top",children:e.manualDone.reason}):null]})]})]}),t.jsxs("div",{className:"hn-bl-cta",children:[S&&E&&t.jsx(U,{variant:"primary",leftIcon:"terminal",onClick:()=>E(e),children:"Buka sesi"}),!S&&o&&t.jsx(U,{variant:"primary",leftIcon:"play",onClick:()=>o(e),children:"Jalankan"}),e.stage==="done"&&t.jsx("span",{className:"hn-bl-hint",children:"Sesi baru melanjutkan sisa kerja item ini."})]}),t.jsxs("section",{className:"hn-bl-section","aria-labelledby":"bl-sec-review",children:[t.jsx("h3",{id:"bl-sec-review",className:"hn-bl-section-title",children:"Review, dokumen, dan lampiran"}),t.jsxs("div",{className:"hn-bl-inline-row",children:[s&&t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"git-compare",onClick:()=>{s(e),a()},children:"Review perubahan"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"file-text",onClick:()=>ee(!0),children:"Lihat dokumen"})]}),ap(e.source)&&(u||m||h)&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Tindak lanjut"}),Ke&&t.jsxs("div",{className:"hn-bl-hint",children:[Ke.target==="none"?t.jsxs("span",{children:["Audit menilai ",t.jsx("strong",{children:"cukup jawaban"})," — tak perlu perbaikan."]}):t.jsxs("span",{children:[t.jsx(ra,{tone:"brass",size:"sm",children:"direkomendasikan hanoman"})," ",PI[Ke.target]]}),Ke.reason?t.jsx("div",{className:"hn-bl-gap-top",children:Ke.reason}):null]}),t.jsxs("div",{className:"hn-bl-inline-row",children:[u&&t.jsx(U,{size:"sm",variant:id(Ke,"qa"),leftIcon:"bug",onClick:()=>u(e,Ke),children:"Jadikan Finding QA"}),m&&t.jsx(U,{size:"sm",variant:id(Ke,"brief"),leftIcon:"lightbulb",onClick:()=>m(e,Ke),children:"Jadikan Feature brief"}),h&&t.jsx(U,{size:"sm",variant:id(Ke,"prd"),leftIcon:"scroll-text",onClick:()=>h(e,Ke),children:"Jadikan PRD"})]})]}),t.jsx(tT,{specId:e.id,onToast:T??(()=>{})})]}),t.jsxs("details",{className:"hn-bl-advanced","data-testid":"spec-advanced",children:[t.jsx("summary",{children:"Lanjutan"}),t.jsxs("div",{className:"hn-bl-advanced-body",children:[t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Branch worktree"}),t.jsx($e,{size:"sm",value:e.branchFrom??"",disabled:!R.length,onChange:ge=>n&&n(e,ge.target.value||null),options:cb(R,I)})]}),t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Bergantung pada"}),(e.dependsOn??[]).length===0?t.jsx("div",{className:"hn-bl-hint",children:"— berdiri sendiri"}):t.jsx("div",{className:"hn-bl-stack-list",children:(e.dependsOn??[]).map(ge=>{const be=(e.blockedBy??[]).find(ca=>ca.id===ge);return t.jsxs("div",{className:"hn-bl-dep",children:[t.jsx("span",{className:"hn-bl-id",children:ge}),be?t.jsx(ra,{tone:"warn",size:"sm",children:hf(be.reason)}):t.jsx(ra,{tone:"ok",size:"sm",icon:"check",children:"selesai & ter-merge"})]},ge)})}),p&&xe.length>0&&t.jsx("div",{className:"hn-bl-checklist",children:xe.map(ge=>{const be=(e.dependsOn??[]).includes(ge.id);return t.jsx(vs,{"aria-label":`Bergantung pada ${ge.id}`,checked:be,label:`${ge.id} · ${ge.title}`,onChange:()=>p(e,be?(e.dependsOn??[]).filter(ca=>ca!==ge.id):[...e.dependsOn??[],ge.id])},ge.id)})})]}),g&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Auto-merge saat selesai"}),t.jsx($e,{size:"sm","aria-label":"Auto-merge item ini",value:e.autoMerge?e.autoMerge.mode:"inherit",onChange:ge=>{var ca;const be=ge.target.value;if(be==="inherit")return g(e,null);if(be==="off")return g(e,{...ls});g(e,{...e.autoMerge??ls,mode:be,branch:be==="branch"?((ca=e.autoMerge)==null?void 0:ca.branch)??R[0]??null:null})},options:[{value:"inherit",label:`Ikut project (${Ip(My(v,null))})`},{value:"off",label:"Tanpa auto-merge untuk item ini"},{value:"default-branch",label:"Auto-merge ke default branch repo"},{value:"branch",label:"Auto-merge ke branch tujuan…"}]}),((ea=e.autoMerge)==null?void 0:ea.mode)==="branch"&&t.jsx("div",{className:"hn-bl-gap-top",children:t.jsx($e,{size:"sm","aria-label":"Branch tujuan item ini",value:e.autoMerge.branch??"",onChange:ge=>g(e,{...e.autoMerge,branch:ge.target.value||null}),options:[{value:"",label:"Pilih branch…"},...R.map(ge=>({value:ge,label:ge}))]})})]}),(i||r)&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Ubah status"}),t.jsx("div",{className:"hn-bl-status-now",children:`Status saat ini: ${We}`}),e.stage!=="done"&&r&&t.jsx("div",{className:"hn-bl-gap-bottom",children:t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"circle-check",onClick:()=>Z(!0),children:"Tandai selesai"})}),i?me.length>0?t.jsxs(t.Fragment,{children:[t.jsx($e,{size:"sm","aria-label":"Kembalikan stage",value:K,onChange:ge=>O(ge.target.value),disabled:H,placeholder:"Pilih status lebih awal…",options:me.map(ge=>({value:ge.key,label:"← "+ge.label}))}),t.jsx("div",{className:"hn-bl-hint hn-bl-gap-top",children:"Status saat ini dan status berikutnya tidak dapat dipilih. Kemajuan hanya berasal dari fase sesi."}),K&&t.jsxs("div",{className:"hn-bl-callout",children:[t.jsxs("div",{className:"hn-bl-callout-title",children:[We," → ",ia]}),"Fase sesi yang sudah berjalan tidak dibatalkan. Dokumen Spec/Plan di atas target mungkin perlu dihapus setelah konfirmasi; kode dan commit tidak disentuh."]}),t.jsx("div",{className:"hn-bl-gap-top",children:t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"rotate-ccw",disabled:!K,loading:H,onClick:Je,children:"Simpan status"})})]}):t.jsxs("div",{className:"hn-bl-hint",children:[We," adalah status paling awal. Kemajuan hanya berasal dari fase sesi."]}):null]}),e.stage==="done"&&l&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Integrasi"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"git-merge",onClick:()=>fe(!0),children:"Rebase / Merge"})]}),f&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Type"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"shuffle",onClick:()=>ce(!0),children:"Ubah type"})]}),(e.sourceHistory??[]).length>0&&t.jsxs("div",{className:"hn-bl-subsection","data-testid":"source-trail",children:[t.jsx("div",{className:"hn-eyebrow",children:"Jejak konversi type"}),t.jsx("div",{className:"hn-bl-stack-list",children:(e.sourceHistory??[]).map((ge,be)=>t.jsxs("div",{className:"hn-bl-trail",children:[t.jsxs("span",{className:"hn-bl-id",children:[ge.from," → ",ge.to]})," · ",new Date(ge.at).toLocaleString("id-ID")," · ",ge.by]},`${ge.at}-${be}`))})]})]})]}),b&&t.jsxs("section",{className:"hn-bl-danger","aria-labelledby":"bl-sec-bahaya",children:[t.jsx("h3",{id:"bl-sec-bahaya",className:"hn-bl-section-title",children:"Zona berbahaya"}),t.jsx("div",{className:"hn-bl-hint",children:"Menghapus item tak bisa dibatalkan. Kode dan commit di repo tidak disentuh."}),t.jsx("div",{className:"hn-bl-gap-top",children:t.jsx(U,{size:"sm",variant:"danger",leftIcon:"trash-2",onClick:()=>b(e),children:"Hapus spec"})})]})]}),A&&t.jsxs(la,{open:!0,title:"Kembalikan status & hapus dokumen fase",icon:"rotate-ccw",eyebrow:e.id+" → "+A.target,onClose:H?void 0:()=>M(null),children:[t.jsxs("div",{className:"hn-bl-confirm-lead",children:[A.files.length," berkas docs akan dihapus dari disk (kode & commit tak disentuh):"]}),t.jsx("ul",{className:"hn-bl-file-list",children:A.files.map(ge=>t.jsx("li",{children:ge},ge))}),t.jsxs("div",{className:"hn-bl-inline-row hn-bl-end",children:[t.jsx(U,{size:"sm",variant:"secondary",disabled:H,onClick:()=>M(null),children:"Batal"}),t.jsx(U,{size:"sm",variant:"danger",leftIcon:"trash-2",loading:H,onClick:q,children:"Hapus & kembalikan"})]})]}),F&&l&&t.jsx(mI,{projectId:e.projectId,ownBranch:`hanoman/${e.id.toLowerCase().replace(/[^a-z0-9_-]/g,"_")}`,eyebrow:e.id,onClose:()=>fe(!1),onIntegrate:(ge,be)=>{fe(!1),l(e,ge,be)}}),J&&r&&t.jsx(cf,{spec:e,onClose:()=>Z(!1),onSubmit:r}),_e&&t.jsx(ou,{specId:e.id,onClose:()=>ee(!1)}),X&&f&&e.payload!==void 0&&t.jsx(SI,{spec:e,onClose:()=>ce(!1),onSubmit:(ge,be,ca)=>Promise.resolve(f(e,ge,be,ca)??null)})]})}function kf({spec:e,onStart:a,onDelete:n,onOpenRun:i,onOpenReview:r,onMarkDone:s,onMarkReviewed:o,running:l}){const[d,u]=c.useState(!1),[m,h]=c.useState(!1),p=e.stage!=="done",g=l?i?{label:"Buka sesi",icon:"terminal",run:()=>i(e)}:null:p?a?{label:EI(e.stage),icon:"play",run:()=>a(e)}:null:r?{label:"Review perubahan",icon:"git-compare",run:()=>r(e)}:null,b=[...!!r&&(g==null?void 0:g.label)!=="Review perubahan"&&r?[{key:"review",label:"Review perubahan",icon:"git-compare",onSelect:()=>r(e)}]:[],{key:"docs",label:"Lihat dokumen",icon:"file-text",onSelect:()=>u(!0)},...!p&&a?[{key:"rerun",label:"Jalankan lagi",icon:"play",onSelect:()=>a(e)}]:[],...p&&s?[{key:"done",label:"Tandai selesai",icon:"circle-check",onSelect:()=>h(!0)}]:[],...!p&&o?[{key:"reviewed",label:e.reviewedAt?"Batalkan tanda ditinjau":"Tandai ditinjau",icon:e.reviewedAt?"rotate-ccw":"circle-check",onSelect:()=>void o(e,!e.reviewedAt)}]:[],...n?[{key:"delete",label:"Hapus spec",icon:"trash-2",tone:"danger",onSelect:()=>n(e)}]:[]];return t.jsxs("div",{className:"hn-bl-actions",children:[g&&t.jsx(U,{size:"sm",variant:"primary",leftIcon:g.icon,onClick:g.run,children:g.label}),t.jsx(sn,{label:`Aksi lain ${e.id}`,items:b}),m&&s&&t.jsx(cf,{spec:e,onClose:()=>h(!1),onSubmit:s}),d&&t.jsx(ou,{specId:e.id,onClose:()=>u(!1)})]})}const II=e=>{const a=e?new Date(e):null;return a&&!Number.isNaN(a.getTime())?a.toLocaleDateString("id-ID",{day:"numeric",month:"short",year:"numeric"}):""};function NI({spec:e,onOpenDetail:a,className:n="hn-bl-title"}){return t.jsx("button",{type:"button",className:n,onClick:()=>a&&a(e),children:e.title})}function RI({spec:e,presenceOn:a,onOpenDetail:n,...i}){return t.jsxs(en,{onClick:n?()=>n(e):void 0,actions:t.jsx(kf,{spec:e,...i}),children:[t.jsx(hu,{priority:e.priority}),t.jsxs("span",{className:"hn-bl-row-body",children:[t.jsx("span",{className:"hn-bl-row-title",children:e.title}),t.jsxs("span",{className:"hn-bl-row-meta",children:[t.jsx("span",{className:"hn-bl-id",children:e.id}),t.jsx(pf,{source:e.source}),t.jsx(gf,{stage:e.stage}),t.jsx(mu,{spec:e}),t.jsx(dl,{names:a})]})]})]})}const cl="backlog",bf="success",LI=pn[0].key,tp=[{key:cl,label:"Backlog",icon:"inbox"},...pn.slice(0,5).map(e=>({key:e.key,label:e.label})),{key:bf,label:"Success",icon:"check-circle-2"}];function BI(e,a){return e.stage==="done"?bf:!a&&e.stage==="brainstorming"?cl:e.stage}const np=(e,a)=>e===cl&&a===LI;function $I({spec:e,col:a,onOpenDetail:n,presenceOn:i,onDragStart:r,onDragEnd:s,dragging:o,...l}){const d=a===cl;return t.jsxs("div",{draggable:d,className:"hn-bl-card","data-dragging":o||void 0,onDragStart:u=>{u.dataTransfer.effectAllowed="move",u.dataTransfer.setData("text/plain",e.id),r()},onDragEnd:s,title:d?"Seret ke Brainstorm untuk memulai sesi":"Stage mengikuti fase yang dilaporkan agen — kartu tak bisa dipindah","data-draggable":d||void 0,children:[t.jsxs("div",{className:"hn-bl-card-head",children:[t.jsx(hu,{priority:e.priority}),t.jsx("span",{className:"hn-bl-id",children:e.id}),t.jsx(pf,{source:e.source})]}),t.jsx(NI,{spec:e,onOpenDetail:n}),(e.blockedBy??[]).length>0||i!=null&&i.length?t.jsxs("div",{className:"hn-bl-card-badges",children:[t.jsx(mu,{spec:e}),t.jsx(dl,{names:i})]}):null,t.jsx("div",{className:"hn-bl-card-foot",children:t.jsx(kf,{spec:e,...l})})]})}function DI({specs:e,activeSpecs:a,presenceBySpec:n,onOpenDetail:i,...r}){const[s,o]=c.useState(null),[l,d]=c.useState(null),u=c.useMemo(()=>{var p;const h=new Map(tp.map(g=>[g.key,[]]));for(const g of e)(p=h.get(BI(g,a==null?void 0:a.has(g.id))))==null||p.push(g);return h},[e,a]),m=h=>{s&&np(s.from,h)&&r.onStart&&r.onStart(s.spec),o(null),d(null)};return t.jsx("div",{"data-testid":"backlog-board",className:"hn-board-local-overflow hn-bl-board",children:tp.map(h=>{const p=u.get(h.key),g=!!s&&np(s.from,h.key),f=g&&l===h.key;return t.jsxs("div",{className:"hn-bl-col","data-active":g||void 0,"data-hot":f||void 0,"data-dimmed":s&&!g||void 0,onDragOver:b=>{g&&(b.preventDefault(),b.dataTransfer.dropEffect="move",d(h.key))},onDragLeave:()=>d(b=>b===h.key?null:b),onDrop:b=>{b.preventDefault(),m(h.key)},children:[t.jsxs("div",{className:"hn-bl-col-head",children:[h.icon&&t.jsx(Re,{name:h.icon,size:13,color:"var(--text-muted)"}),t.jsx("span",{className:"hn-eyebrow",children:h.label}),t.jsx("span",{className:"hn-bl-col-count",children:p.length})]}),t.jsx("div",{className:"hn-bl-col-body",children:p.map(b=>t.jsx($I,{spec:b,col:h.key,onOpenDetail:i,presenceOn:n==null?void 0:n.get(b.id),...r,dragging:(s==null?void 0:s.spec.id)===b.id,running:a==null?void 0:a.has(b.id),onDragStart:()=>o({spec:b,from:h.key}),onDragEnd:()=>{o(null),d(null)}},b.id))})]},h.key)})})}const OI=[{value:"list",label:"Daftar",icon:"list"},{value:"board",label:"Papan",icon:"kanban"}];function HI({value:e,onChange:a}){return t.jsx("div",{className:"hn-bl-view-toggle",role:"group","aria-label":"Mode tampilan",children:OI.map(n=>t.jsx("button",{type:"button",className:"hn-bl-view-btn hn-touch-target","aria-pressed":e===n.value,"aria-label":n.label,title:n.label,onClick:()=>a(n.value),children:t.jsx(Re,{name:n.icon,size:15})},n.value))})}const qI=5,UI=new Set;function zI({backlog:e,projects:a,pageSize:n=20,onStart:i,activeSpecs:r,presenceBySpec:s,reviewSpecIds:o=UI,onDelete:l,onOpenRun:d,onOpenReview:u,onNew:m,onEditBranch:h,onRevertStage:p,onMarkDone:g,onMarkReviewed:f,onIntegrate:b,onEditSpec:x,onEditDeps:v,onEditAutoMerge:y,onChangeSource:T,onPromoteToQa:S,onPromoteToBrief:E,onPromoteToPrd:w,projectFilter:N,onProjectFilter:R,dataVersion:L,onToast:I,initialDetailId:B}){var ya,Gt,rn,wt,wn;const[A,M]=Da("backlog","tab","all",Dn),[K,O]=c.useState(0),[J,Z]=Da("backlog","view","list",bi("list","board")),[H,te]=Da("backlog","stageGroup","all",bi("all","brainstorm","spec","doing","done")),[ae,F]=Da("backlog","q","",Dn),[fe,_e]=Da("backlog","prio","all",Dn),[ee,X]=Da("backlog","worktree","all",bi("all","worktree")),[ce,se]=Da("backlog","review","all",bi("all","review")),[Ce,Te]=Da("backlog","dateField","created",bi("created","started")),[le,xa]=Da("backlog","from","",Dn),[Ze,He]=Da("backlog","to","",Dn),Ke=N,ga=R,[Ge,fa]=Da("backlog","detailId",null,Nk);c.useEffect(()=>{B&&fa(B)},[B]);const Aa=a||[...new Set(e.map(he=>he.projectId))].map(he=>({id:he,name:he})),[ma,Se]=c.useState(()=>e.map(he=>({objective:"",...he}))),[Je,q]=Da("backlog","page",1,Wc),[Be,me]=c.useState(()=>ae.trim()),[We,ia]=c.useState(!1),[ye,oa]=c.useState(!1),[we,xe]=c.useState(!1),Xe=c.useRef(!1),[Pa,nt]=mk(),Wa=c.useCallback((he,ka)=>{nt(he,"ok",void 0,{action:{label:"Urungkan",onAction:ka}})},[nt]),ea=[A!=="all",Ke!=="all",ae.trim()!=="",H!=="all",fe!=="all",le!=="",Ze!=="",ee!=="all",ce!=="all"].filter(Boolean).length,ge=Vc("backlog","scroll",ma.length>0);c.useEffect(()=>{const he=setTimeout(()=>me(ae.trim()),250);return()=>clearTimeout(he)},[ae]),Lk(JSON.stringify([A,Ke,H,fe,Be,Ce,le,Ze,ee,ce]),()=>q(1)),c.useEffect(()=>{var Ba;let he=!0;const ka=(Ba=ne.listSpecs)==null?void 0:Ba.call(ne,{project:Ke==="all"?void 0:Ke,source:A==="all"?void 0:A,q:Be||void 0,priority:fe==="all"?void 0:fe,dateField:le||Ze?Ce:void 0,from:le||void 0,to:Ze||void 0});return oa(!!ka),ka==null||ka.then(Rt=>{he&&(Se(Rt.items),xe(!0),Xe.current=!1,ia(!1),oa(!1))}).catch(()=>{he&&(Xe.current||(Xe.current=!0,I==null||I("Gagal menyegarkan backlog — data di layar mungkin usang","warn")),ia(!0),oa(!1))}),()=>{he=!1}},[A,Ke,fe,Be,Ce,le,Ze,L,K]);const be=c.useMemo(()=>new Map(e.map(he=>[he.id,he])),[e]),ca=c.useMemo(()=>ma.map(he=>Jl(he,be.get(he.id))),[ma,be]),Na=c.useMemo(()=>uI(oI(ca,ee),ce,o),[ca,ee,ce,o]),Tt=c.useMemo(()=>{const he={};for(const ka of lr)he[ka.key]=Na.filter(Ba=>Jh(Ba.stage,ka.key)).length;return he},[Na]),lt=c.useMemo(()=>Na.filter(he=>Jh(he.stage,H)),[Na,H]),dt=xr(lt.length,Je,n),Ra=lt.slice((dt.page-1)*n,dt.page*n),[ct,vn]=c.useState(null);c.useEffect(()=>{if(!Ge||!ne.getSpec){vn(null);return}let he=!0;return ne.getSpec(Ge).then(ka=>{he&&vn(ka)}).catch(ka=>{!he||!(ka instanceof ha)||ka.status!==404||(fa(null),I==null||I(`${Ge} sudah tidak ada`,"warn"))}),()=>{he=!1}},[Ge,L]);const Va=c.useMemo(()=>{if(!Ge)return null;const he=be.get(Ge);if((ct==null?void 0:ct.id)===Ge)return Jl(ct,he);const ka=ma.find(Ba=>Ba.id===Ge);return ka?Jl(ka,he):he?{objective:"",...he}:null},[Ge,ct,ma,be]),{confirm:it,dialog:Ya}=ot(),jt=l?he=>{var Ba;const ka=((Ba=a.find(Rt=>Rt.id===he.projectId))==null?void 0:Ba.name)??he.projectId;it({title:`Hapus ${he.id}?`,message:`"${he.title}" dihapus dari backlog ${ka}.`,impact:["Tindakan ini tidak bisa dibatalkan.","Lampiran item ini ikut dihapus dari disk.","Sesi yang masih berjalan untuk item ini tidak ikut dihentikan.","Item lain yang menunggu item ini tidak lagi bergantung padanya.","Kode dan commit di repo tidak disentuh."],confirmLabel:"Hapus spec",tone:"danger",icon:"trash-2",run:async()=>{await l(he),Ge===he.id&&fa(null)}}).catch(Rt=>I==null?void 0:I(ba(`menghapus ${he.id}`,Rt),"err","x-circle"))}:void 0,Ct=()=>{M("all"),ga("all"),F(""),te("all"),_e("all"),Te("created"),xa(""),He(""),X("all"),se("all"),q(1)},Nt=[...A!=="all"?[{key:"tab",label:`Sumber: ${((ya=Zh.find(he=>he.value===A))==null?void 0:ya.label)??A}`,onRemove:()=>M("all")}]:[],...Ke!=="all"?[{key:"proj",label:`Project: ${((Gt=Aa.find(he=>he.id===Ke))==null?void 0:Gt.name)??Ke}`,onRemove:()=>ga("all")}]:[],...fe!=="all"?[{key:"prio",label:`Prioritas: ${Ho(fe).label}`,onRemove:()=>_e("all")}]:[],...le||Ze?[{key:"date",label:`Tanggal ${Ce==="created"?"dibuat":"dikerjakan"}: ${le||"…"} – ${Ze||"…"}`,onRemove:()=>{xa(""),He("")}}]:[],...ee!=="all"?[{key:"wt",label:Cd.worktree,onRemove:()=>X("all")}]:[],...ce!=="all"?[{key:"review",label:Pd.review,onRemove:()=>se("all")}]:[]],xn=t.jsxs(j2,{gap:3,children:[t.jsx(oe,{label:"Sumber",children:t.jsx($e,{size:"sm","aria-label":"Filter sumber",value:A,onChange:he=>M(he.target.value),options:Zh})}),t.jsx(oe,{label:"Project",children:t.jsx($e,{size:"sm","aria-label":"Filter project",value:Ke,onChange:he=>ga(he.target.value),options:[{value:"all",label:"Semua project"}].concat(Aa.map(he=>({value:he.id,label:he.name})))})}),t.jsx(oe,{label:"Prioritas",children:t.jsx($e,{size:"sm","aria-label":"Filter prioritas",value:fe,onChange:he=>_e(he.target.value),options:TI})}),t.jsx(oe,{label:"Worktree",hint:"Hanya item yang pernah dibuatkan worktree oleh hanoman. Pekerjaan di luar hanoman tidak terhitung.",children:t.jsx($e,{size:"sm","aria-label":"Filter worktree",value:ee,onChange:he=>X(he.target.value),options:sI.map(he=>({value:he.value,label:he.label}))})}),t.jsx(oe,{label:"Tinjauan",hint:"Item yang sesinya menunggu jawabanmu, dan item selesai yang belum kamu tandai sudah ditinjau. Tandai lewat menu item atau di Review perubahan.",children:t.jsx($e,{size:"sm","aria-label":"Filter perlu ditinjau",value:ce,onChange:he=>se(he.target.value),options:lI.map(he=>({value:he.value,label:he.label}))})}),t.jsx(oe,{label:"Tanggal",children:t.jsxs("div",{className:"hn-bl-date-row",children:[t.jsx($e,{size:"sm","aria-label":"Filter tanggal berdasarkan",value:Ce,onChange:he=>Te(he.target.value),options:[{value:"created",label:"Dibuat"},{value:"started",label:"Dikerjakan"}]}),t.jsx(Oe,{size:"sm",type:"date","aria-label":"Tanggal dari",value:le,onChange:he=>xa(he.target.value)}),t.jsx("span",{className:"hn-eyebrow","aria-hidden":"true",children:"→"}),t.jsx(Oe,{size:"sm",type:"date","aria-label":"Tanggal sampai",value:Ze,onChange:he=>He(he.target.value)})]})})]}),Pt=!we&&ca.length===0&&ye,gt={onStart:i,onDelete:jt,onOpenRun:d,onOpenReview:u,onMarkDone:g,onMarkReviewed:f},Ua=he=>fa(he.id),jn=((rn=lr.find(he=>he.key===H))==null?void 0:rn.label)??"";return t.jsxs("div",{className:"hn-bl-screen",children:[t.jsxs("section",{className:"hn-bl-toolbar",role:"region","aria-label":"Kontrol backlog",children:[t.jsx(x2,{label:"Penyaring backlog",search:{value:ae,onChange:F,label:"Cari backlog",placeholder:"mis. invoice atau SPEC-412"},chips:Nt,filters:xn,filtersLabel:"Filter",onReset:ea>0?Ct:void 0,resetLabel:"Reset filter",actions:t.jsxs(t.Fragment,{children:[t.jsx(HI,{value:J,onChange:Z}),t.jsx(yI,{onDone:()=>O(he=>he+1),onToast:I??(()=>{})})]})}),t.jsx(At,{variant:"pill","aria-label":"Tahap backlog",value:H,onChange:he=>te(he),className:"hn-bl-stage-tabs",tabs:lr.map(he=>({value:he.key,label:he.label,count:Tt[he.key]}))}),Xh[A]&&t.jsx("p",{className:"hn-bl-hint","data-testid":"backlog-tab-hint",children:Xh[A]}),t.jsxs("div",{className:"hn-bl-status-line",children:[We&&t.jsx("span",{role:"status",className:"hn-bl-stale",title:"Server tak menjawab saat menyegarkan — angka ini dari muatan terakhir yang berhasil",children:"Data mungkin usang: server tak menjawab saat menyegarkan."}),ye&&t.jsx("span",{"data-testid":"backlog-refreshing",className:"hn-bl-muted",children:"Memuat…"})]})]}),Pt?t.jsx(bk,{rows:qI,label:"Memuat backlog"}):Na.length===0?e.length===0?t.jsx(ue,{kind:"empty",illustration:"PST-002",title:"Backlog masih kosong",hint:"Ajukan feature brief atau Finding QA — hanoman menjalankannya dari brainstorm sampai execute.",action:m,actionLabel:"Tambah spec"}):t.jsx(ue,{kind:"empty",icon:"filter",title:"Tidak ada spec untuk filter ini",hint:`${e.length} spec ada di backlog, tapi tak ada yang cocok dengan filter aktif.`,action:Ct,actionLabel:"Reset filter",actionIcon:"rotate-ccw"}):lt.length===0?t.jsx(ue,{kind:"empty",compact:!0,icon:"filter",title:`Tidak ada spec di tahap ${jn}`,hint:"Tahap lain tetap memuat item yang sama.",action:()=>te("all"),actionLabel:"Tampilkan semua",actionIcon:"x"}):J==="board"?t.jsxs("div",{className:"hn-bl-body",children:[t.jsx("p",{"data-testid":"board-drag-hint",className:"hn-bl-hint",children:"Seret kartu dari kolom Backlog ke Brainstorm untuk memulai sesi. Tombol di kartu melakukan hal yang sama."}),t.jsx(DI,{specs:lt,activeSpecs:r,presenceBySpec:s,onOpenDetail:Ua,...gt})]}):t.jsxs("div",{className:"hn-bl-body",children:[t.jsx("div",{ref:ge,"data-testid":"backlog-scroll","aria-busy":ye||void 0,className:"hn-bl-list-scroll",children:t.jsx(Zt,{label:"Daftar backlog",children:Ra.map(he=>t.jsx(RI,{spec:he,presenceOn:s==null?void 0:s.get(he.id),running:r==null?void 0:r.has(he.id),onOpenDetail:Ua,...gt},he.id))})}),t.jsx("div",{className:"hn-bl-pager",children:t.jsx(jr,{page:dt.page,pageCount:dt.pageCount,total:lt.length,from:dt.from,to:dt.to,onPage:q,unit:"spec"})})]}),t.jsx(MI,{spec:Va,onClose:()=>fa(null),running:!!Ge&&!!(r!=null&&r.has(Ge)),onOpenRun:d,presenceOn:Ge?s==null?void 0:s.get(Ge):void 0,onEditBranch:h,onRevertStage:p,onMarkDone:g,onOpenReview:u,onStart:i,onIntegrate:b,onEditSpec:x,onPromoteToQa:S,onPromoteToBrief:E,onPromoteToPrd:w,onEditDeps:v,onEditAutoMerge:y,onChangeSource:T,onRequestDelete:jt,onUndoable:Wa,projectPolicy:(wt=a.find(he=>{var ka;return he.id===((ka=e.find(Ba=>Ba.id===Ge))==null?void 0:ka.projectId)}))==null?void 0:wt.autoMerge,projectName:(wn=a.find(he=>he.id===(Va==null?void 0:Va.projectId)))==null?void 0:wn.name,allSpecs:e,onAttachmentToast:(he,ka)=>I==null?void 0:I(he,ka??"ok","paperclip")}),t.jsx(Hc,{toast:Pa}),Ya]})}const ip=20,sp=Ij,sd=e=>e?new Date(e).toLocaleDateString("id-ID",{day:"numeric",month:"short",year:"numeric"}):"—";function FI({projectId:e}){const[a,n]=c.useState(null),[i,r]=c.useState(0),[s,o]=c.useState(null),[l,d]=c.useState(1),[u,m]=c.useState(null),[h,p]=c.useState(""),[g,f]=c.useState(null),b=c.useCallback(()=>{El.listSessions(e,{page:l,limit:ip}).then(T=>{n(T.items),r(T.total),o(T.kuota)}).catch(()=>{n([]),r(0),o(null)})},[e,l]);c.useEffect(()=>{m(null),b()},[b]),c.useEffect(()=>{d(1)},[e]);const x=T=>{f(null),p(""),El.getSession(T).then(m).catch(()=>m(null))},v=async()=>{if(!(!u||!h.trim()))try{const T=await El.materializePrd(u.id,h.trim());f(`PRD tersimpan di ${T.path}. Ia BELUM jadi backlog — eskalasi tetap keputusan Anda.`),b()}catch(T){f(T instanceof Error?T.message:"gagal menulis PRD")}};if(a===null)return t.jsx(ue,{kind:"loading",title:"Memuat obrolan…"});const y=xr(i,l,ip);return t.jsxs("div",{className:"hn-pc",children:[s&&t.jsxs("div",{"data-testid":"portal-chat-kuota",className:"hn-pc-kuota",children:["Jatah bulan ini — Brainstorming ",t.jsxs("b",{children:[s.brainstorm.terpakai," / ",s.brainstorm.jatah]})," · ","Bertanya ",t.jsxs("b",{children:[s.tanya.terpakai," / ",s.tanya.jatah]})," · ","reset ",sd(s.resetPada),!s.enabled&&" · obrolan portal sedang MATI di Settings"]}),a.length===0?t.jsx(ue,{kind:"empty",icon:"messages-square",title:"Belum ada obrolan",hint:"Begitu klien memulai obrolan di portal, sesinya muncul di sini."}):t.jsxs(t.Fragment,{children:[t.jsx(Sa,{padding:0,children:a.map(T=>t.jsxs("button",{type:"button","data-testid":`portal-chat-row-${T.id}`,onClick:()=>x(T.id),className:"hn-pc-row",children:[t.jsx("span",{className:"hn-pc-type",children:sp[T.type]??T.type}),t.jsx("span",{className:"hn-pc-summary",children:T.summary||"Belum ada ringkasan"}),T.prdSiap&&t.jsx(pt,{status:T.prdDocPath?"ok":"warn",size:"sm",children:T.prdDocPath?"PRD dokumen":"PRD draft"}),t.jsx("span",{className:"hn-pc-meta",children:T.clientEmail}),t.jsx("span",{className:"hn-pc-meta",children:sd(T.createdAt)})]},T.id))}),t.jsx(jr,{page:y.page,pageCount:y.pageCount,total:i,from:y.from,to:y.to,onPage:d,unit:"obrolan"})]}),u&&t.jsxs(Sa,{eyebrow:`${sp[u.type]??u.type} · ${u.clientEmail}`,title:u.summary||"Obrolan",children:[t.jsx("div",{"data-testid":"portal-chat-transkrip",className:"hn-pc-transcript",children:u.messages.map(T=>t.jsxs("div",{className:"hn-pc-msg","data-role":T.role,"data-blocked":T.blocked?"true":"false",children:[t.jsxs("div",{className:"hn-pc-msg-meta",children:[T.role==="klien"?"Klien":"hanoman"," · ",sd(T.createdAt)]}),t.jsx("div",{className:"hn-pc-msg-text",children:T.text}),T.blocked&&t.jsxs("div",{className:"hn-pc-blocked",children:[t.jsx("b",{children:"Diblokir"})," (",(T.blockReasons??[]).join(", "),") — teks asli agen:",t.jsx("div",{className:"hn-pc-raw",children:T.rawText})]})]},T.id))}),u.prdMarkdown&&t.jsxs(t.Fragment,{children:[t.jsx("div",{"data-testid":"portal-chat-prd",className:"hn-pc-prd",children:t.jsx(ws,{text:u.prdMarkdown,name:"prd-draft.md"})}),t.jsxs("div",{className:"hn-pc-prd-actions",children:[t.jsx(Oe,{"data-testid":"portal-chat-slug","aria-label":"Slug dokumen PRD",placeholder:"nama-dokumen",value:h,className:"hn-pc-slug",onChange:T=>p(T.target.value)}),t.jsx(U,{"data-testid":"portal-chat-jadikan-prd",disabled:!h.trim(),onClick:()=>void v(),children:"Jadikan dokumen PRD"}),t.jsxs("span",{className:"hn-pc-meta",children:["Menyimpan ke ",t.jsx("code",{children:"docs/prd/"}),". Tidak membuat backlog."]})]})]}),g&&t.jsx("p",{className:"hn-pc-note",children:g})]})]})}function ff({projects:e,defaultProject:a,onClose:n,onCreate:i,prefill:r,lockProject:s}){var f;const[o,l]=c.useState(a||((f=e[0])==null?void 0:f.id)||""),[d,u]=c.useState({title:(r==null?void 0:r.title)??"",context:(r==null?void 0:r.context)??"",outcome:(r==null?void 0:r.outcome)??"",constraints:(r==null?void 0:r.constraints)??""}),m=b=>x=>u(v=>({...v,[b]:x.target.value})),h=!!d.title.trim()&&!!o,p=()=>{h&&i(o,{title:d.title.trim(),context:d.context,outcome:d.outcome,constraints:d.constraints||void 0})},g=t.jsx("span",{"aria-hidden":"true",className:"hn-prj-required",children:"*"});return t.jsxs(la,{open:!0,onClose:n,icon:"scroll-text",eyebrow:"PM → hanoman",title:"PRD baru",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",size:"sm",onClick:n,children:"Batal"}),t.jsx(U,{size:"sm",leftIcon:"messages-square",onClick:p,disabled:!h,children:"Buat brief → brainstorm PRD"})]}),children:[t.jsxs("p",{className:"hn-prj-note",children:["hanoman membuka sesi brainstorm interaktif di terminal, lalu menulis dokumen PRD ke ",t.jsx("code",{children:"docs/prd/"}),"."]}),t.jsxs("p",{className:"hn-prj-note",children:[t.jsx("span",{"aria-hidden":"true",className:"hn-prj-required",children:"*"})," wajib diisi"]}),t.jsx(oe,{label:t.jsxs(t.Fragment,{children:["Project",g]}),hint:"Tujuan penulisan docs/prd/ — pilih di sini, tak perlu memfilter daftar dulu",children:t.jsx($e,{"aria-label":"Project untuk PRD baru",value:o,disabled:s,onChange:b=>l(b.target.value),className:"hn-prj-full",options:e.map(b=>({value:b.id,label:b.name}))})}),t.jsx(oe,{label:t.jsxs(t.Fragment,{children:["Judul",g]}),hint:d.title.trim()?void 0:"Wajib diisi — tanpa judul, brief tak bisa dibuat.",children:t.jsx(Oe,{value:d.title,onChange:m("title"),placeholder:"mis. Jadwal Invoice Berulang",className:"hn-prj-full"})}),t.jsx(oe,{label:"Konteks",hint:"Latar belakang & alasan fitur ini dibutuhkan",children:t.jsx(Ma,{value:d.context,onChange:m("context"),rows:3,placeholder:"mis. operator harus membuka tiga layar untuk tahu sesi mana yang menunggu"})}),t.jsx(oe,{label:"Hasil yang diharapkan",children:t.jsx(Ma,{value:d.outcome,onChange:m("outcome"),rows:2,placeholder:"mis. satu badge di Overview menunjukkan jumlah sesi yang menunggu"})}),t.jsx(oe,{label:"Batasan",hint:"opsional",children:t.jsx(Oe,{value:d.constraints,onChange:m("constraints"),placeholder:"mis. reuse queue yang ada",className:"hn-prj-full"})})]})}const GI={draft:"neutral",dieskalasi:"info",terwujud:"ok"};function KI({prd:e}){const a=Id[e.status]??e.status;return t.jsx(ra,{tone:GI[e.status],size:"sm",children:e.specCount>0?`${a} ${e.doneCount}/${e.specCount}`:a})}function WI({open:e,onClose:a,prd:n,takeBase:i,items:r,include:s,setInclude:o,busy:l,onTake:d,onStartBreakdown:u,onMaterialize:m,projectId:h}){const p=r.filter((g,f)=>s[f]).length;return t.jsxs(la,{open:e,onClose:a,icon:"list-checks",width:600,eyebrow:"PRD → backlog",title:"Jadikan backlog",footer:t.jsx(U,{variant:"ghost",size:"sm",onClick:a,children:"Batal"}),children:[t.jsxs("p",{className:"hn-prj-note",children:["Pilih bentuk backlog untuk ",t.jsx("b",{children:n.title}),". Manusia yang memutuskan."]}),t.jsxs("div",{className:"hn-prj-sheet-options",children:[t.jsxs("div",{className:"hn-prj-sheet-option",children:[t.jsx(U,{leftIcon:"lightbulb",onClick:()=>{a(),d({...i,kind:"brief",context:`Dari PRD: ${n.path}`,outcome:""})},children:"Sebagai feature brief"}),t.jsx("p",{className:"hn-prj-hint",children:"Sesi menjalankan pipeline penuh: brainstorm → objective → spec → plan → execute."})]}),t.jsxs("div",{className:"hn-prj-sheet-option",children:[t.jsx(U,{leftIcon:"target",variant:"secondary",onClick:()=>{a(),d({...i,kind:"goal",context:"",outcome:"",goal:`Wujudkan PRD ${n.path}`})},children:"Sebagai goal"}),t.jsx("p",{className:"hn-prj-hint",children:"Sesi dua fase (Goal → Verifikasi) yang langsung mengejar goal-nya, tanpa brainstorm, spec, maupun plan. Mode goal selalu aktif."})]}),t.jsx("div",{className:"hn-prj-sheet-option",children:r.length>0?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"hn-prj-sheet-head",children:[t.jsxs("span",{className:"hn-prj-sheet-title",children:["Breakdown · ",r.length," item"]}),t.jsxs("span",{className:"hn-prj-hint",children:[p,"/",r.length," dipilih"]})]}),t.jsx("ul",{className:"hn-prj-checklist",children:r.map((g,f)=>t.jsx("li",{children:t.jsxs("label",{className:"hn-prj-check",children:[t.jsx("input",{type:"checkbox",checked:s[f]??!1,className:"hn-prj-check-input",onChange:b=>o(x=>x.map((v,y)=>y===f?b.target.checked:v))}),t.jsxs("span",{className:"hn-prj-check-text",children:[t.jsxs("span",{className:"hn-prj-check-title",children:[g.title," ",t.jsx(ra,{tone:"brass",size:"sm",children:g.priority})]}),g.outcome&&t.jsx("span",{className:"hn-prj-hint",children:g.outcome})]})]})},f))}),t.jsx(U,{size:"sm",leftIcon:"plus",disabled:!p||l,onClick:m,children:l?"Membuat…":`Buat ${p} backlog`})]}):t.jsxs(t.Fragment,{children:[t.jsx(U,{leftIcon:"split",variant:"secondary",onClick:()=>{a(),u(h,n.path)},children:"Breakdown ke backlog"}),t.jsx("p",{className:"hn-prj-hint",children:"Mulai sesi breakdown yang menulis usulan backlog paralel dari PRD ini."})]})})]})]})}function VI({prd:e,projectId:a,dataVersion:n,onTake:i,onStartBreakdown:r,onMaterialize:s}){const[o,l]=c.useState(null),[d,u]=c.useState(""),[m,h]=c.useState(0),[p,g]=c.useState([]),[f,b]=c.useState([]),[x,v]=c.useState(""),[y,T]=c.useState(0),[S,E]=c.useState(!1),[w,N]=c.useState(!1);c.useEffect(()=>{let B=!0;return l(null),u(""),ne.getPrd(a,e.path).then(A=>{B&&l(A.content)}).catch(A=>{B&&u(xs(A,"tidak diketahui"))}),()=>{B=!1}},[a,e.path,m]),c.useEffect(()=>{let B=!0;return ne.getBreakdown(a,e.path).then(A=>{B&&(g(A.items),b(A.items.map(()=>!0)),v(""))}).catch(A=>{if(B){if((A==null?void 0:A.status)===404){g([]),b([]),v("");return}v(xs(A,"tidak diketahui"))}}),()=>{B=!1}},[a,e.path,n,y]);const R={project:a,title:e.title,prdPath:e.path,branchFrom:ST(e.path)},L=p.filter((B,A)=>f[A]),I=async()=>{if(L.length){E(!0);try{await s(a,e.path,L),N(!1)}finally{E(!1)}}};return t.jsxs("div",{className:"hn-prd-pane",children:[t.jsxs("div",{className:"hn-prd-actionbar",role:"toolbar","aria-label":"Aksi PRD",children:[t.jsx("span",{className:"hn-prd-actionbar-title",children:e.title}),t.jsx(U,{size:"sm",leftIcon:"list-checks",onClick:()=>N(!0),children:"Jadikan backlog"}),t.jsx(sn,{label:"Aksi lain PRD",icon:"ellipsis",items:[],children:t.jsx(Kk,{href:B=>ne.prdDownloadUrl(a,e.path,B),disabled:o===null})})]}),t.jsxs("div",{className:"hn-prd-read",children:[t.jsxs("header",{className:"hn-prd-head",children:[t.jsx("div",{className:"hn-prj-mono hn-prd-path",children:e.path}),t.jsxs("div",{className:"hn-prd-head-row",children:[t.jsx("h2",{className:"hn-prd-title",children:e.title}),t.jsx(KI,{prd:e})]})]}),x&&t.jsxs("div",{role:"alert",className:"hn-prj-stale",children:[t.jsxs("span",{className:"hn-prj-stale-text",children:["Usulan breakdown gagal dimuat: ",x]}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"rotate-ccw",onClick:()=>T(B=>B+1),children:"Coba lagi"})]}),p.length>0&&t.jsxs("details",{className:"hn-prd-breakdown",children:[t.jsxs("summary",{className:"hn-prd-breakdown-summary",children:["Usulan breakdown · ",p.length," item"]}),t.jsx("ul",{className:"hn-prd-breakdown-list",children:p.map((B,A)=>t.jsxs("li",{children:[t.jsx("span",{className:"hn-prd-breakdown-item",children:B.title}),t.jsx(ra,{tone:"brass",size:"sm",children:B.priority})]},A))}),t.jsx("p",{className:"hn-prj-hint",children:"Pilih item yang dibuat lewat “Jadikan backlog”."})]}),d?t.jsx(ue,{kind:"error",title:"Gagal memuat isi PRD",hint:d,action:()=>h(B=>B+1)}):o===null?t.jsx(ue,{kind:"loading",title:"Memuat PRD…"}):t.jsx("div",{className:"hn-prd-doc",children:t.jsx(ws,{text:o,name:e.name})})]}),t.jsx(WI,{open:w,onClose:()=>N(!1),prd:e,takeBase:R,items:p,include:f,setInclude:b,busy:S,onTake:i,onStartBreakdown:r,onMaterialize:()=>{I()},projectId:a})]})}function YI(e){const a=[],n=new Map;for(const i of e){let r=n.get(i.projectId);r||(r={projectId:i.projectId,projectName:i.projectName,items:[]},n.set(i.projectId,r),a.push(i.projectId)),r.items.push(i)}return a.map(i=>n.get(i))}function JI({prd:e,active:a,showProject:n,onSelect:i}){return t.jsxs("button",{type:"button",onClick:i,"aria-current":a?"true":void 0,className:`hn-prd-item${a?" is-active":""}`,children:[t.jsxs("span",{className:"hn-prd-item-head",children:[t.jsx(Re,{name:"scroll-text",size:13,color:a?"var(--brass-700)":"var(--brass-500)"}),t.jsx("span",{className:"hn-prd-item-title",children:e.title}),e.live&&t.jsx(ra,{tone:"brass",size:"sm",children:"sesi hidup"})]}),t.jsxs("span",{className:"hn-prd-item-meta",children:[n&&t.jsxs("span",{children:[e.projectName," · "]}),e.specCount>0&&t.jsxs("span",{children:[e.doneCount,"/",e.specCount," item selesai · "]}),t.jsx("span",{className:"hn-prj-mono",children:e.path})]})]})}function QI({projects:e,projectFilter:a,onProjectFilter:n,onNewPrd:i,onTakeToBacklog:r,onStartBreakdown:s,onMaterialize:o,dataVersion:l}){const[d,u]=c.useState([]),[m,h]=c.useState("loading"),[p,g]=c.useState(""),[f,b]=c.useState(0),[x,v]=Da("prd","sel",null,Nk),[y,T]=c.useState("list"),S=c.useMemo(()=>d.find(H=>H.slug===x)??null,[d,x]),E=c.useCallback(H=>v(H?H.slug:null),[v]),[w,N]=c.useState(!1),R=a==="all",L=R?"":a,I=c.useRef(null);c.useEffect(()=>{I.current!==null&&I.current!==a&&E(null),I.current=a},[a,E]),c.useEffect(()=>{let H=!0;return(R?ne.listAllPrds():L?ne.listPrds(L):Promise.resolve({items:[]})).then(ae=>{H&&(u(ae.items),h("ready"),g(""))}).catch(ae=>{H&&(h("error"),g(xs(ae,"tidak diketahui")))}),()=>{H=!1}},[a,l,f]);const[B,A]=c.useState(!1),M=S?S.projectId||L:"",K=[{value:"all",label:"Semua project"}].concat(e.map(H=>({value:H.id,label:H.name}))),O=[...yd],J=[...yd.map(H=>({status:H,label:Kn(Id,H),items:d.filter(te=>te.status===H)})),...Array.from(new Set(d.map(H=>H.status).filter(H=>!O.includes(H)))).map(H=>({status:H,label:Kn(Id,H),items:d.filter(te=>te.status===H)}))],Z=m==="loading"&&d.length===0?t.jsx(ue,{kind:"loading",compact:!0,title:"Memuat daftar PRD…"}):m==="error"&&d.length===0?t.jsx(ue,{kind:"error",compact:!0,title:"Gagal memuat daftar PRD",hint:p,action:()=>b(H=>H+1)}):d.length===0?t.jsx(ue,{kind:"empty",icon:"scroll-text",title:"Belum ada PRD",hint:"Buat PRD dari brief + brainstorm; hanoman menulisnya ke docs/prd/ lalu bisa di-take jadi backlog.",action:()=>N(!0),actionLabel:"PRD baru"}):t.jsxs(t.Fragment,{children:[m==="error"&&t.jsxs("div",{role:"alert",className:"hn-prj-stale hn-prd-stale",children:[t.jsx("span",{className:"hn-prj-stale-text",children:"Gagal memuat ulang — daftar dari muatan terakhir."}),t.jsx(U,{size:"sm",variant:"secondary",onClick:()=>b(H=>H+1),children:"Coba lagi"})]}),J.filter(H=>H.items.length>0).map(H=>t.jsxs("details",{open:!0,className:"hn-prd-group",children:[t.jsxs("summary",{className:"hn-prd-group-summary",children:[H.label,t.jsx("span",{className:"hn-prj-chip-count",children:H.items.length})]}),YI(H.items).map(te=>t.jsxs("div",{className:"hn-prd-group-body",children:[R&&t.jsx("div",{className:"hn-eyebrow hn-prd-project-label",children:te.projectName}),te.items.map(ae=>t.jsx(JI,{prd:ae,showProject:!1,active:(S==null?void 0:S.path)===ae.path&&(S==null?void 0:S.projectId)===ae.projectId,onSelect:()=>{E(ae),T("detail")}},`${ae.projectId}:${ae.path}`))]},te.projectId))]},H.status))]});return t.jsxs("div",{style:pk,children:[t.jsxs("div",{style:Ao,className:"hn-prd-toolbar",children:[t.jsx($e,{size:"sm",value:a,"aria-label":"Project",onChange:H=>n(H.target.value),options:K}),t.jsx(qE,{screen:"prd",active:R?0:1}),t.jsx("span",{className:"hn-prd-toolbar-spacer"}),!R&&t.jsx(U,{size:"sm",variant:B?"primary":"ghost",leftIcon:"messages-square","aria-expanded":B,onClick:()=>A(H=>!H),children:"Draft dari portal klien"}),t.jsx(U,{size:"sm",leftIcon:"plus",onClick:()=>N(!0),children:"PRD baru"})]}),B&&!R&&t.jsx("div",{style:Ao,className:"hn-prd-portal",children:t.jsx(FI,{projectId:a})}),t.jsx(tl,{ariaLabel:"Panel PRD",active:y,onActiveChange:H=>T(H),masterWidth:288,panels:[{id:"list",label:"Indeks",className:"hn-panel-flex",content:t.jsx("aside",{"aria-label":"Indeks PRD",className:"hn-prd-index",children:Z})},{id:"detail",label:"Isi",className:"hn-panel-flex",content:t.jsx("section",{"aria-label":"Isi PRD",className:"hn-prd-detail",children:S?t.jsx(VI,{prd:S,projectId:M,dataVersion:l,onTake:H=>r(H),onStartBreakdown:s,onMaterialize:o}):t.jsx(ue,{kind:"empty",icon:"scroll-text",title:"Pilih PRD",hint:"Klik dokumen di indeks kiri untuk membacanya, lalu jadikan backlog."})})}]}),w&&t.jsx(ff,{projects:e,defaultProject:L,onClose:()=>N(!1),onCreate:(H,te)=>{N(!1),i(H,te)}})]})}const rp=5e3,ZI=12e3,XI=5*6e4,eN=new Set(["shipped","docs-updated","waiting","offline"]),aN={shipped:"selesai","docs-updated":"dokumen terbit",waiting:"butuh jawabanmu"},tN={shipped:"kabar","docs-updated":"dokumen",waiting:"sesi"},yf=(e,a)=>e.kind==="waiting"&&e.since!==null&&a-e.since>=Ud;function nN(e){const a=Math.floor(e/6e4);if(a<1)return`${Math.max(0,Math.floor(e/1e3))} detik`;if(a<60)return`${a} menit`;const n=Math.floor(a/60),i=a%60;return i>0?`${n} jam ${i} menit`:`${n} jam`}function iN(e,a){if(!eN.has(e.kind))return null;if(e.kind==="offline")return{kind:"pose",text:"Aku kehilangan sambungan",ttl:rp};let n=`${e.subject??"Backlog"} ${aN[e.kind]}`;return e.count>1&&(n+=` · ${e.count} ${tN[e.kind]}`),yf(e,a)&&(n+=` — ${nN(a-e.since)}`),{kind:"pose",text:n,ttl:rp}}function vf(e){const a=rl(e.backlog),n={};for(const i of e.sessions){const r=Ar(i,a);r&&(n[i.id]=r)}return{at:e.now,sessions:n,notifiedAt:Xk(e.notifications)}}function sN(e,a){const n=vf(a),i=d=>Object.entries(n.sessions).filter(([u,m])=>m===d&&e.sessions[u]!==d).length,r=a.notifications.filter(d=>Qk.has(d.type)&&d.createdAt>e.notifiedAt).length,s=i("waiting"),o=i("failed"),l=[r>0?`${r} selesai`:"",s>0?`${s} menunggu`:"",o>0?`${o} gagal`:""].filter(Boolean);return l.length>0?{kind:"recap",text:l.join(" · "),ttl:ZI}:null}const rN="PET-001",oN=2,lN={w:192,h:208},dN=8,cN={x:.62,baseline:202},uN={h:168},mN=[{key:"idle",fps:6,loop:!0},{key:"walk-right",fps:10,loop:!0,dir:"right"},{key:"walk-left",fps:10,loop:!0,dir:"left"},{key:"working",fps:8,loop:!0},{key:"waiting",fps:6,loop:!0},{key:"blocked",fps:4,loop:!0},{key:"review",fps:6,loop:!0},{key:"shipped",fps:10,loop:!1,then:"idle"},{key:"docs-updated",fps:6,loop:!0},{key:"wave",fps:10,loop:!1,then:"idle"},{key:"deciding",fps:6,loop:!0},{key:"sleep",fps:4,loop:!0},{key:"thanks",fps:10,loop:!1,then:"idle"},{key:"held",fps:8,loop:!0},{key:"falling",fps:8,loop:!0},{key:"dizzy",fps:8,loop:!1,then:"idle"}],hN={idle:"4a0f06cacdad0fa8e0b0a369628e383fc2cb54cbdd5297285c88d1a33bd686ac","walk-right":"7bdfb2786b2b1c899fb7b170ce2cf5d1e3a922e251cbaca9600c210262629a52","walk-left":"c53c6f7b980d4179b45d55160145df73eb629ccbb809ce2b19946045e388ce60",working:"2ec0d0d4565eced3c55c32603c2b1c6fe9ff93f13f2a1061bc7d2e8d8864aa6f",waiting:"8bb1595bf280040e101949392c1048330c19142d7b5a1d6b74918734f72287e3",blocked:"134f48c60fa6fef038da266be7fb2a69755ecb9123d23dc4e270b14d7d077da6",review:"77c865ff6d49a8bbf3db4e0d7b91ce4663a1e3acef5d072ddd65eac9479b232c",shipped:"d32653efa6a64eb4d00fb63a6e8c0a7dc24de63ecd5a6cfda36f32b584de00b8","docs-updated":"2b3a01ddd640efd6e65d61c6ad4980da3a9fbceff251f1b42ce13389c02bb19c",wave:"4153420063211e6d196219b89c572f43f96ec32f28c63a1159e6d98630e0ed73",deciding:"6309ab706c8430cf97b187f353fd2d447ba729f6e0764efef1b75a3c96168984",sleep:"40f1fd6e27ddddb13a5702c05a03f5e015e44e7e77e96c4e1ed52a5d7741f2ec",thanks:"0f59f2c042b25ff47a7022d4452bf0dc433dcea796d90bf47d95a5c8ca359d8d",held:"8de04ba258b30acb105a27a81ed400b66f3b68953042957a75e63ebe8efe7c89",falling:"8bc3429c44ef4ba257da895080fa6458c3a66e51cebe103e09cd8bac25be5363",dizzy:"3e8c2072e2aa652e204e3c6b041cb6c9487d8dca1649b52f9695600880a94e49"},pN={id:rN,version:oN,cell:lN,columns:dN,anchor:cN,character:uN,rows:mN,sources:hN},gN="/assets/hnm-pet-anoman-atlas-v02-ClJhW17L.webp",ir=["idle","walk-right","walk-left","working","waiting","blocked","review","shipped","docs-updated","wave","deciding","sleep","thanks","held","falling","dizzy"],kN=e=>typeof e=="string"&&ir.includes(e),gi=e=>typeof e=="number"&&Number.isInteger(e)&&e>0,Zi=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);function bN(e){const a=h=>{throw new Error(`pet.json tidak sah: ${h}`)};if(!Zi(e))return a("bukan objek");const{id:n,version:i,cell:r,columns:s,anchor:o,character:l,rows:d,sources:u}=e;if(typeof n!="string"||!n)return a("id");if(!gi(i))return a("version");if(!Zi(r)||!gi(r.w)||!gi(r.h))return a("cell");if(!gi(s))return a("columns");if(!Zi(o)||typeof o.x!="number"||!(o.x>0&&o.x<1)||!gi(o.baseline)||o.baseline>r.h)return a("anchor");if(!Zi(l)||!gi(l.h)||l.h>r.h)return a("character");if(!Array.isArray(d)||d.length!==ir.length)return a(`rows: butuh ${ir.length} baris`);const m=d.map((h,p)=>{const g=ir[p];if(!Zi(h)||h.key!==g)return a(`rows[${p}]: harus "${g}"`);if(!gi(h.fps))return a(`rows[${p}].fps`);if(typeof h.loop!="boolean")return a(`rows[${p}].loop`);const f={key:g,fps:h.fps,loop:h.loop};if(h.then!==void 0){if(!kN(h.then)||h.loop)return a(`rows[${p}].then hanya untuk baris loop:false`);f.then=h.then}else if(!h.loop)return a(`rows[${p}] loop:false tanpa then`);if(h.dir!==void 0){if(h.dir!=="right"&&h.dir!=="left")return a(`rows[${p}].dir`);f.dir=h.dir}return f});return!Zi(u)||ir.some(h=>typeof u[h]!="string")?a("sources"):{id:n,version:i,cell:{w:r.w,h:r.h},columns:s,anchor:{x:o.x,baseline:o.baseline},character:{h:l.h},rows:m,sources:u}}const Er=bN(pN),fN=gN,qo={ready:"idle",sleeping:"sleep",offline:"idle",working:"working",deciding:"deciding",waiting:"waiting",blocked:"blocked",review:"review",shipped:"shipped","docs-updated":"docs-updated"};function pu(e,a=Er){const n=a.rows.find(i=>i.key===e);if(!n)throw new Error(`baris ${e} tak ada di manifest`);return n}const yN=(e,a=Er)=>a.rows.findIndex(n=>n.key===e),xf=(e,a=Er)=>Math.round(a.columns/pu(e,a).fps*1e3),vN=(e,a=Er)=>pu(e,a).then??null,op=40,dr=[1200,4500],xN=[5e3,14e3],ic=16,lp=24,jN=240,wN=220,SN=new Set(["waiting","blocked"]),_N=new Set(["offline","sleeping"]),ao=(e,[a,n])=>a+e()*(n-a),rd=e=>e==="right"?"walk-right":"walk-left",gu=(e,a)=>Math.max(ic,e-a-ic),ti=(e,a,n)=>Math.min(Math.max(e,ic),gu(a,n)),jf=(e,a,n)=>Math.min(Math.max(e,0),Math.max(0,a-n)),dp=e=>e==="held"||e==="falling"||e==="dizzy",AN=e=>!e.roam||e.reduced||e.tier==="mobile";function cp(e,a,n){return{x:gu(e,a),y:0,facing:"right",mode:"stand",until:n+dr[0],parkedX:null}}function EN(e,a){const{now:n,laneWidth:i,petWidth:r,pose:s}=a,o=ti(a.currentX,i,r);return{state:{x:o,y:0,facing:e.facing,mode:"stand",until:n+dr[0],parkedX:e.parkedX===null?null:ti(e.parkedX,i,r)},row:qo[s],move:{x:o,y:0,durationMs:0,ease:"linear"}}}const TN=(e,a,n,i,r)=>({...e,x:ti(e.x,a,i),y:jf(e.y,n,r)});function CN(e,a,n){const{now:i,laneWidth:r,laneHeight:s,petWidth:o,petHeight:l,pose:d}=a,u=gu(r,o),m=qo[d],h=ti(a.currentX,r,o),p=e.mode==="walk"||e.mode==="home",g=e.mode==="dizzy",f=(E,w,N=e.facing)=>({x:E,y:0,facing:N,mode:"stand",until:w,parkedX:e.parkedX}),b=E=>p||Math.abs(h-E)>.5?{x:E,y:0,durationMs:0,ease:"linear"}:null,x=(E,w)=>{const N=Math.round(Math.abs(E-h)/op*1e3),R=E>=h?"right":"left";return{state:{x:E,y:0,facing:R,mode:w,until:i+N,parkedX:e.parkedX},row:rd(R),move:{x:E,y:0,durationMs:N,ease:"linear"}}},v=E=>{const w={x:E,y:0,durationMs:0,ease:"linear"};return a.reduced?{state:{...f(E,1/0),parkedX:E},row:m,move:w}:{state:{x:E,y:0,facing:e.facing,mode:"dizzy",until:i+xf("dizzy"),parkedX:E},row:"dizzy",move:w}};if(a.dragging){const E=ti(a.pointerX,r,o),w=jf(a.pointerY,s,l);return{state:{x:E,y:w,facing:e.facing,mode:"held",until:1/0,parkedX:e.parkedX},row:"held",move:{x:E,y:w,durationMs:0,ease:"linear"}}}if(e.mode==="held"){if(a.reduced||e.y===0)return v(e.x);const E=Math.max(wN,Math.round(e.y/jN*1e3));return{state:{x:e.x,y:0,facing:e.facing,mode:"falling",until:i+E,parkedX:e.x},row:"falling",move:{x:e.x,y:0,durationMs:E,ease:"fall"}}}if(e.mode==="falling")return i<e.until?{state:e,row:"falling",move:null}:v(e.x);if(e.mode==="dizzy"&&i<e.until)return{state:e,row:"dizzy",move:null};if(AN(a)){const E=ti(e.parkedX??u,r,o);return{state:f(E,1/0,"right"),row:m,move:b(E)}}if(a.hovered||a.panelOpen||a.documentHidden)return{state:f(h,1/0),row:m,move:b(h)};if(_N.has(d))return{state:f(h,1/0),row:m,move:b(h)};if(SN.has(d))return Math.abs(h-u)>1?e.mode==="home"&&i<e.until?{state:e,row:rd(e.facing),move:null}:x(u,"home"):{state:f(u,1/0,"right"),row:m,move:b(u)};if(d==="shipped")return{state:f(h,1/0),row:m,move:b(h)};if(p)return i<e.until?{state:e,row:rd(e.facing),move:null}:{state:f(e.x,i+ao(n,dr)),row:m,move:null};if(g||e.until===1/0)return{state:f(h,i+ao(n,dr)),row:m,move:null};if(i<e.until)return{state:e,row:m,move:null};const y=ao(n,xN)*op/1e3;let T=n()<.5?-1:1,S=ti(h+T*y,r,o);return Math.abs(S-h)<lp&&(T=-T,S=ti(h+T*y,r,o)),Math.abs(S-h)<lp?{state:f(h,i+ao(n,dr)),row:m,move:null}:x(S,"walk")}const Ln={loading:"Membaca layar sesi…",none:"Pertanyaannya tak terbaca dari sini — buka Terminal untuk menjawabnya.",stale:"Layarnya sudah berubah — pertanyaannya dimuat ulang.",deciding:"hanoman-lead sedang menyusun keputusan untuk sesi ini.",failed:"Jawaban tak terkirim. Buka Terminal untuk menjawabnya.",answering:"hanoman-lead sudah mengirim jawabannya ke pane — terlambat mengambil alih.",taken:"Kamu mengambil alih sesi ini. hanoman-lead berhenti menjawabnya.",preparing:"Kotak jawabnya sedang disiapkan — dialognya belum tergambar di pane."},PN={queued:"hanoman-lead mengantre untuk sesi ini",deciding:"hanoman-lead sedang menyusun keputusan",answered:"hanoman-lead sudah menjawab","taken-over":"Kamu yang menjawab sesi ini",failed:"hanoman-lead tak sanggup menjawab sesi ini"},up=e=>{var a;return e instanceof ha?(a=e.detail)==null?void 0:a.reason:void 0};function mp({sessionId:e,label:a,reduced:n,ask:i}){const[r,s]=c.useState(void 0),[o,l]=c.useState([]),[d,u]=c.useState(""),[m,h]=c.useState(!1),[p,g]=c.useState(!1),[f,b]=c.useState(null),[x,v]=c.useState(0);c.useEffect(()=>{let I=!0;return s(void 0),ne.sessionDialog(e).then(B=>{I&&(s(B),l(B?B.dialog.options.filter(A=>A.checked).map(A=>A.n):[]))}).catch(()=>{I&&s(null)}),()=>{I=!1}},[e,x]);async function y(){if(!m){h(!0),b(null);try{await ne.takeoverSessionDialog(e),b(Ln.taken),v(I=>I+1)}catch(I){b(up(I)==="answering"?Ln.answering:Ln.failed)}finally{h(!1)}}}async function T(I){if(!(!r||m)){h(!0),b(null);try{await ne.answerSessionDialog(e,{screenHash:r.screenHash,...I}),g(!0)}catch(B){const A=up(B);A==="stale"?(b(Ln.stale),v(M=>M+1)):b(A==="deciding"?Ln.deciding:Ln.failed)}finally{h(!1)}}}const S=n?{transition:"none",transform:"none"}:void 0,E=I=>t.jsx("div",{"data-testid":"pet-answer-note",className:"hn-pet-note",children:I});if(p)return t.jsx("div",{className:"hn-pet-box",children:t.jsxs("div",{"data-testid":"pet-answer-sent",className:"hn-pet-sent",children:["Terkirim — menunggu ",a," bergerak"]})});const w=i==null?void 0:i.questions[Math.min(i.at,Math.max(0,i.questions.length-1))],N=i?t.jsxs("div",{className:"hn-pet-head",children:[t.jsx("div",{"data-testid":"pet-answer-lead-state",className:"hn-eyebrow",children:PN[i.state]}),i.total>1&&t.jsxs("div",{className:"hn-eyebrow hn-pet-eyebrow-top",children:["Pertanyaan ",Math.min(i.at+1,i.total)," dari ",i.total]}),i.source==="turn-end"&&t.jsx("div",{"data-testid":"pet-answer-source",className:"hn-eyebrow hn-pet-eyebrow-top",children:"Giliran terakhir sesi"}),((w==null?void 0:w.question)||i.message)&&t.jsx("div",{className:"hn-pet-question",children:(w==null?void 0:w.question)||i.message}),i.state!=="taken-over"&&t.jsx("div",{className:"hn-pet-mt-6",children:t.jsx(U,{"data-testid":"pet-answer-takeover",size:"sm",variant:"ghost",disabled:m,style:S,onClick:()=>{y()},children:"Ambil alih"})})]}):null;if(r===void 0)return t.jsxs("div",{className:"hn-pet-box",children:[N,E(Ln.loading)]});if(r===null)return t.jsxs("div",{className:"hn-pet-box",children:[N,E(f??(i?Ln.preparing:Ln.none))]});const{dialog:R}=r,L=R.tabs.filter(I=>I.answered).length;return t.jsxs("div",{"data-testid":"pet-answer","data-session":e,className:"hn-pet-box",children:[N,!i&&R.tabs.length>1&&t.jsxs("div",{className:"hn-eyebrow hn-pet-eyebrow-bottom",children:["Pertanyaan ",Math.min(L+1,R.tabs.length)," dari ",R.tabs.length]}),!i&&R.title&&t.jsx("div",{className:"hn-pet-title",children:R.title}),R.multi?t.jsx("div",{className:"hn-pet-stack",children:R.options.map(I=>t.jsx(vs,{label:I.label,checked:o.includes(I.n),disabled:m,onChange:B=>l(A=>(B?[...A,I.n]:A.filter(M=>M!==I.n)).sort((M,K)=>M-K))},I.n))}):t.jsx("div",{className:"hn-pet-wrap",children:R.options.map(I=>t.jsx(U,{"data-testid":"pet-answer-option",size:"sm",variant:"ghost",disabled:m,style:S,onClick:()=>{T({choice:I.n})},children:I.label},I.n))}),(R.freeIndex!==null||R.notes)&&t.jsxs("div",{className:"hn-pet-free",children:[t.jsx(Oe,{"data-testid":"pet-answer-text",size:"sm",value:d,disabled:m,placeholder:"Jawab dengan kalimatmu sendiri",className:"hn-grow-min",onChange:I=>u(I.target.value)}),!R.multi&&t.jsx(U,{size:"sm",variant:"ghost",disabled:m||!d.trim(),style:S,onClick:()=>{T({text:d.trim()})},children:"Kirim"})]}),R.multi&&t.jsx("div",{className:"hn-pet-mt-8",children:t.jsx(U,{"data-testid":"pet-answer-submit",size:"sm",variant:"primary",disabled:m,style:S,onClick:()=>{T({choices:o,...d.trim()?{text:d.trim()}:{}})},children:"Submit"})}),f&&t.jsx("div",{className:"hn-pet-mt-6",children:E(f)})]})}const MN={mobile:96,tablet:112,desktop:112},ts=44,wf=22,IN=wf+ts,NN=56,RN=6,od=268,LN=10,to=12,no=200,ld=8,BN=5e3,$N=1.5,DN=2e3,ON=3,HN=6,qN={linear:"linear",fall:"var(--ease-fall)"};function UN(){const e="(prefers-reduced-motion: reduce)",[a,n]=c.useState(()=>typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia(e).matches);return c.useEffect(()=>{var s;if(typeof window>"u"||typeof window.matchMedia!="function")return;const i=window.matchMedia(e),r=()=>n(i.matches);return(s=i.addEventListener)==null||s.call(i,"change",r),()=>{var o;return(o=i.removeEventListener)==null?void 0:o.call(i,"change",r)}},[]),a}function zN(){const[e,a]=c.useState(()=>typeof document<"u"&&document.hidden);return c.useEffect(()=>{const n=()=>a(document.hidden);return document.addEventListener("visibilitychange",n),()=>document.removeEventListener("visibilitychange",n)},[]),e}function FN(e,a,n){const i=c.useCallback(()=>{var o;return Math.round(((o=e.current)==null?void 0:o.getBoundingClientRect().width)??0)},[e]),[r,s]=c.useState(0);return c.useLayoutEffect(()=>{n&&s(i())},[i,a,n]),c.useEffect(()=>{const o=e.current;if(!n||!o)return;if(typeof ResizeObserver<"u"){const u=new ResizeObserver(()=>s(i()));return u.observe(o),()=>u.disconnect()}let l;const d=()=>{clearTimeout(l),l=setTimeout(()=>s(i()),150)};return window.addEventListener("resize",d),()=>{clearTimeout(l),window.removeEventListener("resize",d)}},[i,n,e]),r}const GN="(min-width: 1200px) and (max-height: 760px)";function KN(e){const a=c.useCallback(i=>{var s;if(typeof window>"u"||typeof window.matchMedia!="function")return()=>{};const r=window.matchMedia(e);return(s=r.addEventListener)==null||s.call(r,"change",i),()=>{var o;return(o=r.removeEventListener)==null?void 0:o.call(r,"change",i)}},[e]),n=c.useCallback(()=>typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia(e).matches,[e]);return c.useSyncExternalStore(a,n,()=>!1)}function WN({sessions:e,backlog:a,asks:n=[],onOpen:i}){const{items:r}=Dc(),[s,o]=c.useState($E),[l,d]=c.useState(OE),[u,m]=c.useState(!1),[h,p]=c.useState(!1),[g,f]=c.useState(to),[b,x]=c.useState(!1),[v,y]=c.useState(!1),[T,S]=c.useState(0),[E,w]=c.useState(null),N=UN(),[R,L]=c.useState(!1);c.useEffect(()=>{const ie=window;if(ie.requestIdleCallback){const qe=ie.requestIdleCallback(()=>L(!0),{timeout:1500});return()=>{var sa;return(sa=ie.cancelIdleCallback)==null?void 0:sa.call(ie,qe)}}const De=window.setTimeout(()=>L(!0),1);return()=>window.clearTimeout(De)},[]);const I=al(),B=zN(),A=KN(GN)&&I==="desktop",M=I!=="desktop",[K,O]=c.useState(!1),J=c.useRef(null),Z=c.useRef(null),H=c.useRef(null),te=FN(J,I,R),[,ae]=tb(),F=l2(),fe=IE(e,r),[_e,ee]=c.useState(fe),[X,ce]=c.useState(()=>Date.now());_e!==fe&&(ee(fe),ce(Date.now()));const se=c.useMemo(()=>BE({sessions:e,backlog:a,notifications:r,now:Date.now(),connection:F,quietSince:X}),[e,a,r,F,X,T]),Ce=c.useMemo(()=>eb(e,a),[e,a]),Te=c.useMemo(()=>NE(e,a),[e,a]);c.useEffect(()=>{if(se.recheckAt===null)return;const ie=setTimeout(()=>S(De=>De+1),Math.max(0,se.recheckAt-Date.now()));return()=>clearTimeout(ie)},[se.recheckAt]),c.useEffect(()=>{if(!E)return;const ie=setTimeout(()=>w(null),E.ttl);return()=>clearTimeout(ie)},[E]);const le=c.useRef(null),xa=c.useRef(null);c.useEffect(()=>{const ie={sessions:e,backlog:a,notifications:r,now:Date.now()};if(B){le.current||(le.current=vf(ie)),xa.current=null;return}const De=le.current;if(!De)return;if(xa.current===null&&(xa.current=ie.now),ie.now-De.at<XI){le.current=null;return}const qe=sN(De,ie);if(qe){le.current=null,w({...qe,id:ie.now});return}ie.now-xa.current>BN&&(le.current=null)},[B,e,a,r]);const Ze=iN(se,Date.now()),[He,Ke]=c.useState((Ze==null?void 0:Ze.text)??null);((Ze==null?void 0:Ze.text)??null)!==He&&(Ke((Ze==null?void 0:Ze.text)??null),Ze&&w({...Ze,id:Date.now()}));const{cell:ga,columns:Ge,anchor:fa,character:Aa,rows:ma}=Er,Se=MN[I]/Aa.h,Je=Math.round(ga.w*Se),q=Math.round(ga.h*Se),Be=c.useRef(cp(te,Je,Date.now())),[me,We]=c.useState(Be.current),[ia,ye]=c.useState(qo[se.pose]),[oa,we]=c.useState({x:Be.current.x,y:0,durationMs:0,ease:"linear"}),[xe,Xe]=c.useState(null),Pa=c.useRef(null),nt=c.useRef(!1),Wa=c.useCallback(()=>{var qe,sa;const ie=(qe=Z.current)==null?void 0:qe.getBoundingClientRect(),De=(sa=J.current)==null?void 0:sa.getBoundingClientRect();return ie&&De&&ie.width>0?ie.left-De.left:Be.current.x},[]),ea=c.useCallback(()=>typeof window<"u"?window.innerHeight:q,[q]),ge=c.useMemo(()=>{const ie=oa.x+fa.x*Je-no/2,De=Math.min(Math.max(ie,ld),Math.max(ld,te-no-ld));return Math.round(fa.x*Je-no/2+(De-ie))},[oa.x,Je,fa.x,te]);c.useEffect(()=>{if(!E||u)return;const ie=qe=>{J.current&&!J.current.contains(qe.target)&&w(null)},De=qe=>{qe.key==="Escape"&&w(null)};return document.addEventListener("mousedown",ie),document.addEventListener("keydown",De),()=>{document.removeEventListener("mousedown",ie),document.removeEventListener("keydown",De)}},[E,u]);const be=c.useRef(0),ca=c.useCallback(()=>{if(te<=0)return;const ie=Date.now();if(be.current===0){be.current=te;const za=cp(te,Je,ie);Be.current=za,We(za),ye(qo[se.pose]),we({x:za.x,y:0,durationMs:0,ease:"linear"});return}const De=be.current!==te;be.current=te;const qe=Wa(),sa=De&&xe===null&&!dp(Be.current.mode)?EN(Be.current,{now:ie,currentX:qe,laneWidth:te,petWidth:Je,pose:se.pose}):CN(Be.current,{now:ie,currentX:qe,laneWidth:te,laneHeight:ea(),petWidth:Je,petHeight:q,pose:se.pose,hovered:v,panelOpen:u,documentHidden:B,roam:l,reduced:N,tier:I,dragging:xe!==null,pointerX:(xe==null?void 0:xe.x)??0,pointerY:(xe==null?void 0:xe.y)??0},Math.random);Be.current=sa.state,We(sa.state),ye(sa.row),sa.move&&we(sa.move)},[Wa,ea,te,Je,q,se.pose,v,u,B,l,N,I,xe]);c.useEffect(()=>{ca()},[ca]),c.useEffect(()=>{if(!Number.isFinite(me.until))return;const ie=setTimeout(ca,Math.max(0,me.until-Date.now()));return()=>clearTimeout(ie)},[me.until,ca]);const[Na,Tt]=c.useState(null),lt=c.useRef(0),dt=c.useRef([]),[Ra,ct]=c.useState(0),[vn,Va]=c.useState(!1);c.useEffect(()=>{Va(!1)},[se.pose]);const it=ia==="shipped"&&vn?vN("shipped")??"idle":ia,Ya=(Na==null?void 0:Na.row)??it,jt=pu(Ya),Ct=c.useCallback(()=>!N&&se.pose!=="offline"&&se.pose!=="sleeping"&&xe===null&&!dp(Be.current.mode),[N,se.pose,xe]),Nt=c.useCallback(()=>{Ct()&&Tt(ie=>ie??{row:"wave",id:++lt.current})},[Ct]),xn=c.useCallback(()=>{N||(Tt({row:"thanks",id:++lt.current}),ct(ie=>ie+1))},[N]);c.useEffect(()=>{if(!u)return;const ie=qe=>{J.current&&!J.current.contains(qe.target)&>()},De=qe=>{qe.key==="Escape"&>()};return document.addEventListener("mousedown",ie),document.addEventListener("keydown",De),()=>{document.removeEventListener("mousedown",ie),document.removeEventListener("keydown",De)}},[u,N]),c.useEffect(()=>{N&&(x(!1),Tt(null),u||p(!1))},[N,u]),c.useEffect(()=>{var ie;(ie=H.current)==null||ie.toggleAttribute("inert",!u)},[u,h]);function Pt(){var on,Lt;const ie=typeof window<"u"?window.innerWidth:te,De=(on=Z.current)==null?void 0:on.getBoundingClientRect(),qe=((Lt=J.current)==null?void 0:Lt.getBoundingClientRect().left)??0,za=(De&&De.width>0?De.left:qe+Be.current.x)+fa.x*Je,Sn=Math.min(Math.max(za-od/2,to),Math.max(to,ie-od-to));f(Math.round(Sn-qe)),p(!0),m(!0)}function gt(){m(!1),N&&p(!1)}function Ua(){u?gt():Pt()}function jn(){const ie=Date.now(),De=[...dt.current.filter(qe=>ie-qe<DN),ie];if(De.length>=ON){dt.current=[],xn();return}dt.current=De,N||x(!0),Nt(),Ua()}function ya(ie){var De,qe;(qe=(De=ie.currentTarget).setPointerCapture)==null||qe.call(De,ie.pointerId),Pa.current={id:ie.pointerId,dx:ie.clientX-Wa(),dy:ie.clientY+Be.current.y,x0:ie.clientX,y0:ie.clientY,moved:!1}}function Gt(ie){const De=Pa.current;if(!(!De||De.id!==ie.pointerId)){if(!De.moved){if(Math.hypot(ie.clientX-De.x0,ie.clientY-De.y0)<=HN)return;De.moved=!0,u&>(),Tt(null)}Xe({x:ie.clientX-De.dx,y:De.dy-ie.clientY})}}function rn(ie){var qe,sa;const De=Pa.current;!De||De.id!==ie.pointerId||(Pa.current=null,(sa=(qe=ie.currentTarget).releasePointerCapture)==null||sa.call(qe,ie.pointerId),De.moved&&(nt.current=!0,Xe(null)))}function wt(ie){o(ie),DE(ie),ie&&(m(!1),p(!1))}function wn(){if(I==="desktop"&&A){m(!1),p(!1),O(!1);return}I==="desktop"?wt(!0):(m(!1),p(!1),ae(!1))}function he(ie){d(ie),HE(ie)}const ka=me.mode==="held"||me.mode==="falling",Ba=s||(A||M)&&!K,Rt=M?NN:Ba?IN:q,Mt=TN(oa,te,ea(),Je,q);c.useEffect(()=>{Ba&&u&&(m(!1),p(!1))},[Ba,u]),c.useEffect(()=>{if(!M||!K)return;const ie=qe=>{J.current&&!J.current.contains(qe.target)&&O(!1)},De=qe=>{qe.key==="Escape"&&!u&&O(!1)};return document.addEventListener("mousedown",ie),document.addEventListener("keydown",De),()=>{document.removeEventListener("mousedown",ie),document.removeEventListener("keydown",De)}},[M,K,u]);const ri={position:"relative",width:"100%",height:Rt,zIndex:80,pointerEvents:"none"},Vn=R?Rt:0;if(c.useLayoutEffect(()=>{const ie=document.documentElement;return ie.style.setProperty("--pet-h",`${Vn}px`),()=>{ie.style.removeProperty("--pet-h")}},[Vn]),!R)return null;if(Ba)return t.jsx("div",{"data-testid":"pet-root",ref:J,style:ri,children:t.jsx("button",{"aria-label":"Tampilkan pet Hanoman",onClick:()=>{s&&wt(!1),O(!0)},style:{pointerEvents:"auto",position:"absolute",width:ts,height:ts,padding:0,right:M?"max(var(--page-gutter-x), var(--safe-right))":"max(22px, var(--safe-right))",bottom:M?RN:wf,display:"inline-flex",alignItems:"center",justifyContent:"center",cursor:"pointer",border:"1px solid var(--text-muted)",borderRadius:"var(--radius-pill)",background:"var(--surface-card)",color:"var(--text-strong)",boxShadow:"var(--shadow-sm)"},children:t.jsx(qc,{id:"buntut",size:15})})});const oi=se.pose==="offline",Ni=`Hanoman ${qm[se.pose]} · ${se.headline}`+(se.count>1?` · ${se.count} ${Il[se.kind]}`:""),_s=Ya==="waiting"&&yf(se,Date.now()),ta=Math.round(xf(Ya)/(_s?$N:1)),Ri=N?"none":`hn-pet-frames ${ta}ms steps(${Ge}, end) ${jt.loop?"infinite":"1 forwards"}`;return t.jsxs("div",{"data-testid":"pet-root",ref:J,style:ri,children:[h&&t.jsxs("div",{ref:H,"data-testid":"pet-panel","aria-hidden":!u||void 0,onAnimationEnd:ie=>{ie.animationName==="hn-pet-panel-out"&&!u&&p(!1)},style:{pointerEvents:u?"auto":"none",position:"absolute",left:g,bottom:q+LN,width:od,maxWidth:"calc(100vw - var(--safe-left) - var(--safe-right) - 24px)",maxHeight:"calc(100dvh - var(--safe-top) - var(--safe-bottom) - 120px)",overflowY:"auto",boxSizing:"border-box",padding:14,background:"var(--surface-card)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-md)",boxShadow:"var(--shadow-lg)",transformOrigin:"center bottom",animation:N?"none":`${u?"hn-pet-panel-in":"hn-pet-panel-out"} var(--dur-slow) var(--ease-out) both`},children:[t.jsx("div",{className:"hn-eyebrow",style:{marginBottom:8},children:qm[se.pose]}),t.jsx("ul",{"data-testid":"pet-conditions",style:{listStyle:"none",margin:0,padding:0,display:"flex",flexDirection:"column",gap:10},children:se.conditions.map((ie,De)=>t.jsxs("li",{"data-testid":"pet-condition","data-kind":ie.kind,style:De>0?{borderTop:"1px solid var(--border-hair)",paddingTop:10}:void 0,children:[t.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:6},children:[t.jsx("span",{style:De===0?{fontFamily:"var(--font-display)",fontSize:15,fontWeight:600,color:"var(--text-strong)",lineHeight:1.25}:{fontFamily:"var(--font-ui)",fontSize:13,fontWeight:600,color:"var(--text-strong)",lineHeight:1.3},children:ie.headline}),ie.count>1&&t.jsx("span",{"data-testid":"pet-condition-count",title:`${ie.count} ${Il[ie.kind]}`,style:{flex:"0 0 auto",padding:"2px 6px",fontFamily:"var(--font-ui)",fontSize:11,fontWeight:700,lineHeight:1,color:"var(--action-on)",background:"var(--action-bg)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-pill)"},children:ie.count})]}),t.jsx("div",{style:{marginTop:3,fontFamily:"var(--font-ui)",fontSize:12.5,color:"var(--text-muted)",lineHeight:1.45},children:ie.detail}),ie.target&&t.jsx("div",{style:{marginTop:7},children:t.jsx(U,{size:"sm",variant:De===0?"primary":"ghost",leftIcon:ie.target.section==="terminal"?"terminal":"list-checks",style:N?{transition:"none",transform:"none"}:void 0,onClick:()=>{const qe=ie.target;gt(),i(qe)},children:ie.target.section==="terminal"?"Buka Terminal":"Buka Backlog"})}),ie.kind==="waiting"&&u&&Ce.map(qe=>t.jsx(mp,{sessionId:qe.id,label:qe.specId??qe.id,reduced:N,ask:n.find(sa=>sa.sessionId===qe.id)},qe.id)),ie.kind==="deciding"&&u&&Te.map(qe=>{const sa=n.find(za=>za.sessionId===qe.id);return sa?t.jsx(mp,{sessionId:qe.id,label:qe.specId??qe.id,reduced:N,ask:sa},qe.id):null})]},`${ie.kind}:${De}`))}),t.jsxs("div",{style:{display:"flex",flexWrap:"wrap",gap:8,marginTop:12,borderTop:"1px solid var(--border-hair)",paddingTop:10},children:[I!=="mobile"&&t.jsx(U,{size:"sm",variant:"ghost",style:N?{transition:"none",transform:"none"}:void 0,onClick:()=>he(!l),children:l?me.parkedX===null?"Diam di pojok":"Diam di sini":"Berkeliaran"}),t.jsx(U,{size:"sm",variant:"ghost",style:N?{transition:"none",transform:"none"}:void 0,onClick:wn,children:"Sembunyikan"})]})]}),te>0&&t.jsxs("div",{"data-testid":"pet-actor",ref:Z,"data-facing":me.facing,"data-mode":me.mode,onTransitionEnd:ie=>{ie.propertyName==="transform"&&ca()},style:{position:"absolute",left:0,bottom:0,width:Je,height:q,transform:`translate(${Mt.x}px, ${-Mt.y}px)`,transition:N||oa.durationMs===0?"none":`transform ${oa.durationMs}ms ${qN[oa.ease]}`,willChange:!N&&oa.durationMs>0?"transform":void 0},children:[E&&!u&&t.jsxs("div",{"data-testid":"pet-bubble","data-kind":E.kind,"aria-hidden":E.kind==="pose"&&se.kind!=="waiting"?"true":void 0,style:{pointerEvents:"none",position:"absolute",left:ge,bottom:q-6,width:"max-content",maxWidth:no,boxSizing:"border-box",padding:"6px 10px",fontFamily:"var(--font-ui)",fontSize:12.5,lineHeight:1.35,color:"var(--text-strong)",background:"var(--surface-card)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-md)",boxShadow:"var(--shadow-sm)",animation:N?"none":"hn-pet-bubble-in var(--dur-base) var(--ease-out) both"},children:[t.jsx("span",{"data-testid":"pet-bubble-text","aria-hidden":E.kind==="pose"?"true":void 0,children:E.text}),(E.kind==="recap"||se.kind==="waiting")&&t.jsx("div",{style:{marginTop:6,pointerEvents:"auto"},children:t.jsx(U,{size:"sm",variant:"ghost",leftIcon:E.kind==="recap"?"list-checks":"terminal","aria-label":E.kind==="recap"?`${E.text} — buka ringkasan pet`:`${E.text} — jawab di sini`,style:N?{transition:"none",transform:"none"}:void 0,onClick:()=>{w(null),Pt()},children:E.kind==="recap"?"Lihat":"Jawab di sini"})})]}),t.jsxs("div",{"data-testid":"pet-stage",className:"hn-pet-stage","data-reduced-motion":N?"true":void 0,style:{position:"relative",width:Je,height:q,animation:N?"none":"hn-pet-reveal var(--dur-slow) var(--ease-out) both"},children:[t.jsx("span",{className:"hn-sr-only",role:"status","aria-live":"polite","data-testid":"pet-status",children:Ni}),se.count>1&&t.jsx("span",{"data-testid":"pet-badge","aria-hidden":"true",title:`${se.count} ${Il[se.kind]}`,style:{pointerEvents:"none",position:"absolute",top:4,right:8,zIndex:2,minWidth:18,height:18,padding:"0 5px",boxSizing:"border-box",display:"inline-flex",alignItems:"center",justifyContent:"center",fontFamily:"var(--font-ui)",fontSize:11,fontWeight:700,lineHeight:1,color:"var(--action-on)",background:"var(--action-bg)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-pill)",boxShadow:"var(--shadow-sm)"},children:se.count}),Ra>0&&!N&&t.jsx("span",{"data-testid":"pet-hearts","aria-hidden":"true",style:{pointerEvents:"none",position:"absolute",zIndex:2,left:Math.round(fa.x*Je),bottom:Math.round(q*.55)},onAnimationEnd:ie=>{ie.target.dataset.last==="1"&&ct(0)},children:[0,1,2].map(ie=>t.jsx("span",{"data-last":ie===2?"1":void 0,style:{position:"absolute",left:ie*9-9,fontFamily:"var(--font-ui)",fontSize:12,color:"var(--accent)",animation:`hn-pet-heart 900ms var(--ease-out) ${ie*120}ms both`},children:"♥"},ie))},Ra),t.jsx("div",{"data-testid":"pet-reactor",className:"hn-pet-reactor",style:{position:"relative",width:"100%",height:"100%",transition:N?"none":"transform var(--dur-base) var(--ease-out)",animation:N||!b?"none":"hn-pet-click var(--dur-slow) var(--ease-out) both"},onAnimationEnd:ie=>{ie.animationName==="hn-pet-click"&&x(!1)},children:t.jsx("div",{"data-testid":"pet-viewport","data-offline":oi?"true":void 0,style:{position:"relative",overflow:"hidden",width:Je,height:q,opacity:oi?.45:1,transition:N?"none":"opacity var(--dur-slow) var(--ease-out)"},children:t.jsx("div",{"data-testid":"pet-rowshift",className:"hn-pet-rowshift","data-row":Ya,style:{width:Je,height:q,"--row":yN(Ya)},children:t.jsx("img",{"data-testid":"pet-atlas",src:fN,alt:"","aria-hidden":"true",draggable:!1,decoding:"async",onAnimationEnd:ie=>{if(ie.animationName==="hn-pet-frames"){if(Na){Na.row==="wave"&&v&&Ct()?Tt({row:"wave",id:++lt.current}):Tt(null);return}Ya==="shipped"&&Va(!0)}},style:{display:"block",width:Je*Ge,height:q*ma.length,animation:Ri}},`${Ya}:${(Na==null?void 0:Na.id)??0}`)})})}),t.jsx("button",{"data-testid":"pet-hit",className:"hn-pet-hit","aria-label":"Ringkasan status Hanoman",title:`${se.headline} — ${se.detail}`,onClick:()=>{if(nt.current){nt.current=!1;return}jn()},onPointerDown:ya,onPointerMove:Gt,onPointerUp:rn,onPointerCancel:rn,onPointerEnter:()=>{y(!0),Nt()},onPointerLeave:()=>y(!1),onFocus:()=>y(!0),onBlur:()=>y(!1),style:{pointerEvents:"auto",position:"absolute",zIndex:3,left:Math.round(fa.x*Je-ts/2),bottom:0,width:ts,height:ts,padding:0,border:"none",background:"transparent",cursor:ka?"grabbing":"grab"}})]})]})]})}const VN=c.lazy(()=>tn(()=>import("./DalangHanomanScreen--M-xLwH5.js"),__vite__mapDeps([0,1,2,3,4])).then(e=>({default:e.DalangHanomanScreen}))),YN=c.lazy(()=>tn(()=>import("./TeamScreen-5cFDPm3o.js"),__vite__mapDeps([5,1,6,2,3,7])).then(e=>({default:e.TeamScreen}))),JN=c.lazy(()=>tn(()=>import("./TriageScreen-BWnuGOmQ.js"),__vite__mapDeps([8,1,6,2,3,9])).then(e=>({default:e.TriageScreen}))),QN=c.lazy(()=>tn(()=>import("./TerminalScreen-CIROrYjO.js"),__vite__mapDeps([10,1,2,3,11])).then(e=>({default:e.TerminalScreen}))),ZN=c.lazy(()=>tn(()=>import("./IdeScreen-CDMJaERU.js"),__vite__mapDeps([12,1,13,14,6,2,3,15])).then(e=>({default:e.IdeScreen}))),XN=c.lazy(()=>tn(()=>import("./VpsScreen-PqOkFriA.js"),__vite__mapDeps([16,1,2,3,17])).then(e=>({default:e.VpsScreen}))),eR=c.lazy(()=>tn(()=>import("./SchedulerScreen-ChEZ01CH.js"),__vite__mapDeps([18,1,6,2,19,20,21,3])).then(e=>({default:e.SchedulerScreen}))),aR=c.lazy(()=>tn(()=>import("./LeadScreen-DJjFTkyZ.js"),__vite__mapDeps([22,1,6,2,19,20,3,23])).then(e=>({default:e.LeadScreen}))),tR=c.lazy(()=>tn(()=>import("./DocsWorkspace-BFzb87Ye.js"),__vite__mapDeps([24,1,2,3,25])).then(e=>({default:e.DocsWorkspace}))),nR=c.lazy(()=>tn(()=>import("./ReviewScreen-DG0xSBou.js"),__vite__mapDeps([26,1,14,2,3])).then(e=>({default:e.ReviewScreen}))),iR=c.lazy(()=>tn(()=>import("./SettingsScreen-BnINOj5X.js"),__vite__mapDeps([27,1,2,21,20,14,3,28])).then(e=>({default:e.SettingsScreen}))),sR=[{value:"critical",label:"Critical"},{value:"major",label:"Major"},{value:"minor",label:"Minor"}],hp=[{value:"tinggi",label:"Tinggi"},{value:"sedang",label:"Sedang"},{value:"rendah",label:"Rendah"}];function rR(e){switch(e){case"offline":return"offline";case"control-off":return"kendali jarak jauh mati";case"protocol-mismatch":return"versi tak cocok";case"no-spawn":return"tanpa izin mulai sesi";case"capacity-full":return"kapasitas penuh";default:return"tak tersedia"}}function oR({open:e,spec:a,onClose:n,onStarted:i,onError:r}){var Je,q,Be;const[s,o]=c.useState("sonnet"),[l,d]=c.useState("medium"),[u,m]=c.useState("claude"),[h,p]=c.useState({claude:{model:"sonnet",effort:"medium"},codex:{...bd}}),[g,f]=c.useState({}),[b,x]=c.useState(!1),[v,y]=c.useState(""),[T,S]=c.useState("changed"),[E,w]=c.useState(Mu().id),[N,R]=c.useState(!1),[L,I]=c.useState(null);c.useEffect(()=>{I(null)},[e,a==null?void 0:a.id]);const[B,A]=c.useState([{deviceId:cn,name:"hub ini",eligible:!0}]),[M,K]=c.useState(cn),[O,J]=c.useState(null),[Z,H]=c.useState(null),[te,ae]=c.useState(void 0),[F,fe]=c.useState(!1),[_e,ee]=c.useState(!1),[X,ce]=c.useState(!1),[se,Ce]=c.useState(null);c.useEffect(()=>{e&&(fe(!1),ee(!1),ce(!1),f({}),ne.getSettings().then(me=>{const We={claude:{model:me.model,effort:me.effort},codex:{...bd,...me.codex??{}}},ia=me.agent==="codex"?"codex":"claude";p(We),m(ia),o(We[ia].model),d(We[ia].effort);const ye=!!a&&Gu(ur(a.source));x(ye||me.goal.enabled),y(ye?"":me.goal.condition),S(me.verifyScope??"changed"),w(Mu(me.method).id),ae(me.orchestration),fe(!0)}).catch(()=>{ee(!0),fe(!0)}),ne.getCodexVersion().then(me=>{H(me.version),ce(!0)}).catch(()=>{ce(!0)}),ne.getMethodStatus().then(me=>Ce(me.methods)).catch(()=>Ce(null)))},[e,a]),c.useEffect(()=>{if(!e||!a)return;let me=!1;return(async()=>{try{const[We,ia]=await Promise.all([typeof ne.presence=="function"?ne.presence():Promise.resolve({enabled:!1,devices:[],hubVersion:""}),typeof ne.getProject=="function"?ne.getProject(a.projectId).then(we=>we.handledBy??[]).catch(()=>[]):Promise.resolve([])]);if(me)return;const ye=VE(We,ia);A(ye);const oa=ye.find(we=>we.deviceId!==cn&&we.eligible);K((oa==null?void 0:oa.deviceId)??cn)}catch{if(me)return;A([{deviceId:cn,name:"hub ini",eligible:!0}]),K(cn)}})(),()=>{me=!0}},[e,a==null?void 0:a.id]);const Te=M!==cn,le=c.useMemo(()=>Te?Nc({base:`/api/devices/${M}/relay`}):ne,[Te,M]),xa=me=>{m(me),f({});const We=ZE(h,me);o(We.model),d(We.effort)},Ze=me=>{o(me),d(We=>u==="codex"?Jo(me,We):Vo(me,We))},He=nb(u,s);if(!a)return null;const Ke=a,ga=ur(Ke.source),Ge=Gu(ga),fa=Ke.blockedBy??[],Aa=fa.length>0,ma=(se==null?void 0:se.find(me=>me.method===E&&me.agent===u))??null;async function Se(me=!1,We=!1){R(!0),I(null),J(null);try{const{id:ia,resumed:ye}=await le.startSession({spec:Ke.id,flow:ga,model:s,effort:l,agent:u,...Object.keys(g).length?{phaseOverrides:g}:{},goal:b,goalCondition:b&&v.trim()?v.trim():void 0,verifyScope:T,method:E,...Aa||me?{force:!0}:{},...We?{confirmRemote:!0}:{}});i(ia,ye),n()}catch(ia){if(ia instanceof ha&&ia.status===409&&ia.detail&&typeof ia.detail=="object"&&(ia.detail.error==="remote-session"||ia.detail.error==="confirm-required")){J(ia.detail);return}const ye=ia instanceof ha&&ia.status===409?vg.safeParse(ia.detail):null;ye!=null&&ye.success?I(ye.data):r==null||r(ia)}finally{R(!1)}}return t.jsxs(la,{open:e,onClose:n,icon:"play",eyebrow:`${Ke.id} · ${ga}`,title:"Mulai sesi",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",onClick:n,children:"Batal"}),t.jsx(U,{leftIcon:Aa?"lock":"play",variant:Aa?"danger":"primary",disabled:N,onClick:()=>void Se(),children:Aa?"Mulai tetap":L?"Coba lagi":"Mulai"}),L&&!Aa&&!Te&&t.jsx(U,{leftIcon:"lock",variant:"danger",disabled:N,onClick:()=>void Se(!0),children:"Mulai tetap"})]}),children:[t.jsxs("div",{className:"hn-sheet-lead",children:["Agen, model & effort ",t.jsx("b",{children:"orchestrator"})," sesi ini. Default dari setelan global; ubah bila perlu. Bila orkestrasi flow ini aktif, tiap fase dikerjakan subagent dengan model & effort di bawah (Settings › Orkestrasi). Override di bawah hanya berlaku untuk sesi ini dan tidak mengubah Settings."]}),L&&t.jsxs("div",{role:"alert",className:"hn-sheet-alert",children:[t.jsx("b",{children:L.error}),t.jsxs("div",{children:[L.admission.liveCount," sesi hidup · ",L.admission.liveAgentCount," agen terstruktur · cap ",L.admission.maxConcurrent]}),t.jsxs("div",{children:["Load per core: ",L.admission.loadStatus==="available"&&L.admission.loadPerCore!==null?L.admission.loadPerCore.toFixed(2):"tidak tersedia",L.admission.loadStatus==="unsupported"?" (tidak didukung platform)":""," · ambang ",L.admission.maxLoadPerCore]}),t.jsx("div",{children:"Coba lagi setelah beban turun, atau pilih Mulai tetap untuk melewati cap dan pemeriksaan beban host."})]}),Aa&&t.jsxs("div",{"data-testid":"dep-blocked-note",className:"hn-sheet-alert",children:["Backlog ini menunggu"," ",t.jsx("b",{children:fa.map(me=>`${me.id} (${me.reason==="missing"?"tak ditemukan":me.reason==="unmerged"?"belum ter-merge":"belum selesai"})`).join(", ")}),". Sesi tetap bisa dimulai, tapi worktree-nya lahir dari basis yang belum memuat pekerjaan itu."," ","Mulai tetap juga melewati cap sesi dan pemeriksaan beban host."]}),t.jsx(oe,{label:"Target",hint:"Mesin yang menjalankan sesi ini. Tak terpilih tetap tampil beserta alasannya.",children:t.jsx($e,{"aria-label":"target",value:M,className:"hn-w-full",options:B.map(me=>({value:me.deviceId,label:me.eligible?me.name:`${me.name} — ${rR(me.reason)}`,disabled:!me.eligible})),onChange:me=>{K(me.target.value),J(null)}})}),(O==null?void 0:O.error)==="remote-session"&&O.remoteSession&&t.jsxs("div",{role:"alert",className:"hn-sheet-notice",children:["Sesi ini sudah berjalan di ",t.jsx("b",{children:O.remoteSession.name}),"."]}),(O==null?void 0:O.error)==="confirm-required"&&t.jsxs("div",{role:"alert",className:"hn-sheet-notice",children:[t.jsx("div",{children:"Device terakhir yang mengerjakan ini sudah offline."}),t.jsx(U,{variant:"danger",disabled:N,onClick:()=>void Se(!1,!0),children:"Tetap mulai"})]}),t.jsx(oe,{label:"Agen",hint:"Mesin yang menjalankan sesi ini. Perilaku sesi sama; hanya CLI-nya berbeda.",children:t.jsx($e,{"aria-label":"Agen",value:u,className:"hn-w-full",options:[{value:"claude",label:"Claude Code"},{value:"codex",label:"Codex CLI"}],onChange:me=>xa(me.target.value)})}),t.jsx(oe,{label:"Model",children:t.jsx($e,{"aria-label":"Model",value:s,className:"hn-w-full",options:QE(u,s),onChange:me=>Ze(me.target.value)})}),t.jsx(oe,{label:"Effort",children:t.jsx($e,{"aria-label":"Effort",value:l,className:"hn-w-full",options:He.map(me=>({value:me,label:me})),onChange:me=>d(me.target.value)})}),u==="codex"&&vv(s,Z)&&t.jsxs("div",{"data-testid":"codex-version-note",className:"hn-sheet-note",children:["Codex CLI terpasang ",t.jsx("b",{children:Z}),", sedangkan ",t.jsx("b",{children:s})," butuh ",t.jsx("b",{children:(Je=Yo(s))==null?void 0:Je.minClient}),". Sesi tetap boleh dijalankan, tapi modelnya belum tentu dikenali CLI ini."]}),t.jsx(sT,{flow:ga,agent:u,model:s,effort:l,orchestration:te,codexVersion:Z,phaseOverrides:g,onPhaseOverridesChange:f,loadError:_e,remoteTarget:Te?((q=B.find(me=>me.deviceId===M))==null?void 0:q.name)??M:null,loading:!F||u==="codex"&&!X}),t.jsxs(oe,{label:"Mode goal",hint:Ge?"Backlog goal selalu berjalan dalam mode goal — sesi menolak berhenti sampai goal item ini terbukti tercapai. Kosongkan kondisi untuk memakai goal item apa adanya.":"Sesi menolak berhenti sampai kondisinya terbukti. Kosongkan kondisi untuk memakai bawaan hanoman: semua fase tercatat, plan tak menyisakan task, push sukses.",children:[t.jsxs("div",{className:b?"hn-goal-row hn-goal-row--on":"hn-goal-row",children:[t.jsx(el,{"aria-label":"Mode goal",checked:b,disabled:Ge,onChange:me=>{Ge||x(me)}}),t.jsx("span",{className:"hn-sheet-meta",children:Ge?"aktif · terkunci":b?"aktif":"nonaktif"})]}),b&&t.jsx(Ma,{value:v,rows:4,mono:!0,placeholder:Ge?"Kosong = goal backlog item ini · mis. semua fase tercatat & plan tanpa - [ ]":"Kosong = kondisi bawaan hanoman · mis. semua fase tercatat & plan tanpa - [ ]",onChange:me=>y(me.target.value)})]}),t.jsx(oe,{label:"Scope verifikasi",hint:"Hanya yang berubah = test/typecheck/lint hanya menyentuh berkas yang disentuh sesi ini. Suite penuh tetap dijalankan manusia sebelum merge.",children:t.jsx($e,{"aria-label":"Scope verifikasi",value:T,className:"hn-w-full",options:[{value:"changed",label:"Hanya yang berubah — hemat RAM & CPU"},{value:"full",label:"Seluruh project"}],onChange:me=>S(me.target.value)})}),t.jsxs(oe,{label:"Metode",hint:"Metodologi kerja sesi ini: skill per fase + direktori plan/spec. Fase-fasenya sendiri tak berubah. Item yang sudah pernah dijalankan memakai metode tercatatnya saat dilanjutkan.",children:[t.jsx($e,{"aria-label":"Metode",value:E,className:"hn-w-full",options:cc.map(me=>({value:me,label:Ci[me].label})),onChange:me=>w(me.target.value)}),t.jsxs("div",{"data-testid":"method-requires",className:"hn-sheet-foot",children:["Butuh terpasang: ",((Be=Ci[E])==null?void 0:Be.requires.join(" · "))??"—"]}),ma&&!ma.ready&&t.jsxs("div",{"data-testid":"method-status-note",className:"hn-sheet-status",children:[t.jsx("b",{children:ma.label})," belum siap untuk ",t.jsx("b",{children:u==="codex"?"Codex CLI":"Claude Code"})," di mesin ini",ma.missingPackages.length>0&&t.jsxs(t.Fragment,{children:[" · paket kurang: ",t.jsx("code",{children:ma.missingPackages.join(" · ")})]}),ma.missingSkills.length>0&&t.jsxs(t.Fragment,{children:[" · skill kurang: ",t.jsx("code",{children:ma.missingSkills.join(" · ")})]}),"."," ","Sesi tetap boleh dijalankan, tapi gerbang yang disebut prompt tak akan ada. Pasang dari Settings → Sesi."]})]})]})}function lR({open:e,onClose:a,projects:n,defaultProject:i,onCreate:r,prefill:s,specs:o}){const l={kind:(s==null?void 0:s.kind)??"brief",project:(s==null?void 0:s.project)||i,title:(s==null?void 0:s.title)??"",context:(s==null?void 0:s.context)??"",outcome:(s==null?void 0:s.outcome)??"",constraints:(s==null?void 0:s.constraints)??"",priority:"sedang",severity:(s==null?void 0:s.severity)??"major",steps:(s==null?void 0:s.steps)??"",expected:"",actual:(s==null?void 0:s.actual)??"",env:"",branchFrom:(s==null?void 0:s.branchFrom)??"",fromAudit:(s==null?void 0:s.fromAudit)??"",goal:(s==null?void 0:s.goal)??"",done:(s==null?void 0:s.done)??"",dependsOn:[],attachments:[]},[d,u]=c.useState(l);c.useEffect(()=>{e&&u({...l,project:(s==null?void 0:s.project)||i})},[e,i,s]);const[m,h]=c.useState([]),[p,g]=c.useState(new Set);c.useEffect(()=>{if(!e||!d.project){h([]),g(new Set);return}let N=!0;return ne.listBranches(d.project).then(R=>{if(!N)return;const L=[...new Set([...R.branches,...R.remotes])].sort();h(L),g(new Set(R.remotes.filter(I=>!R.branches.includes(I)))),u(I=>I.branchFrom&&!L.includes(I.branchFrom)?{...I,branchFrom:""}:I)}).catch(()=>{N&&(h([]),g(new Set))}),()=>{N=!1}},[e,d.project]);const f=N=>R=>u(L=>({...L,[N]:R.target.value})),b=d.kind==="qa",x=d.kind==="audit",v=d.kind==="goal",y=d.kind==="no_effort",T=Ti(d.kind)==="goal",S=(o??[]).filter(N=>N.projectId===d.project),E=N=>u(R=>({...R,dependsOn:R.dependsOn.includes(N)?R.dependsOn.filter(L=>L!==N):[...R.dependsOn,N]})),w=()=>{!d.title.trim()||T&&!d.goal.trim()||r(d)};return t.jsxs(la,{open:e,onClose:a,icon:b?"bug":x?"search":y?"zap":v?"target":"lightbulb",eyebrow:"human → hanoman",title:b?"QA finding baru":x?"Audit baru":y?"Task remeh baru":v?"Goal baru":"Feature brief baru",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",size:"sm",onClick:a,children:"Batal"}),t.jsx(U,{size:"sm",leftIcon:b?"radar":x?"search":y?"zap":v?"target":"messages-square",onClick:w,children:b?"Filekan finding → audit":x?"Buat audit → investigasi":y?"Buat task → sesi satu fase":v?"Buat goal → sesi goal":"Buat brief → brainstorm"})]}),children:[t.jsxs("div",{className:"hn-sheet-block",children:[t.jsx(At,{variant:"pill",className:"hn-sheet-kinds",value:d.kind,onChange:N=>u(R=>({...R,kind:N})),tabs:[{value:"brief",label:"Feature brief",icon:"lightbulb"},{value:"qa",label:"QA finding",icon:"bug"},{value:"audit",label:"Audit",icon:"search"},{value:"goal",label:"Goal",icon:"target"},{value:"no_effort",label:"Tanpa effort",icon:"zap"}]}),t.jsx("div",{className:"hn-sheet-hint",children:y?"Sesi satu fase (Kerjakan): langsung mengerjakan lalu berhenti — tanpa brainstorm, spec, plan, maupun fase pembuktian terpisah. Untuk ganti copy, bump konstanta, perbaiki typo docs, tambah satu baris allowlist.":v?"Sesi goal langsung mengejar goal-nya — tanpa brainstorm, spec, atau plan (fase: Goal → Verifikasi). Sesi lahir dengan mode goal aktif dan menolak berhenti sampai buktinya ada di transkrip.":b?"Finding masuk lewat alur audit → spec → plan → execute. hanoman menelusuri akar masalah dulu.":x?"Audit HANYA menghasilkan dokumen (audit → laporan) — tanpa perbaikan kode. Bisa dinaikkan jadi Finding QA bila perlu diperbaiki.":"Brief masuk lewat alur brainstorm → objective → spec → plan → execute."})]}),t.jsx(oe,{label:"Project",children:t.jsx($e,{value:d.project,onChange:f("project"),className:"hn-w-full",options:n.map(N=>({value:N.id,label:N.name}))})}),t.jsx(oe,{label:"Branch",hint:"branch yang disalin ke worktree (salinan kerja terpisah untuk sesi ini) saat sesi dimulai",children:t.jsx($e,{value:d.branchFrom,onChange:f("branchFrom"),disabled:!m.length,className:"hn-w-full",options:cb(m,p)})}),t.jsx(oe,{label:"Bergantung pada",hint:"Backlog yang harus selesai & ter-merge lebih dulu. Kosongkan bila item ini berdiri sendiri.",children:S.length===0?t.jsx("div",{className:"hn-sheet-empty",children:"Belum ada backlog lain di project ini."}):t.jsx("div",{className:"hn-dep-list",children:S.map(N=>t.jsx(vs,{"aria-label":`Bergantung pada ${N.id}`,checked:d.dependsOn.includes(N.id),onChange:()=>E(N.id),label:`${N.id} · ${N.title}`},N.id))})}),t.jsx(oe,{label:"Judul",children:t.jsx(Oe,{"aria-label":"Judul",value:d.title,onChange:f("title"),placeholder:b?"mis. Funnel double-count sesi lintas tengah malam":y?"mis. Label tombol Simpan di form backlog":v?"mis. Latensi daftar backlog":"mis. Jadwal invoice berulang",className:"hn-w-full"})}),T?t.jsxs(t.Fragment,{children:[t.jsx(oe,{label:"Goal",hint:"Keadaan yang harus tercapai — inilah yang dikejar sesi sampai terbukti",children:t.jsx(Ma,{"aria-label":"Goal",value:d.goal,onChange:f("goal"),rows:3,placeholder:"mis. p95 GET /api/specs di bawah 200 ms"})}),t.jsx(oe,{label:"Selesai bila",hint:"Bukti yang harus muncul di transkrip; kosongkan bila goal-nya sudah jadi buktinya sendiri",children:t.jsx(Ma,{"aria-label":"Selesai bila",value:d.done,onChange:f("done"),rows:2,placeholder:"mis. output benchmark menunjukkan < 200 ms"})}),t.jsxs("div",{className:"hn-grid-mobile hn-grid-split",children:[t.jsx(oe,{label:"Batasan",hint:"opsional",children:t.jsx(Oe,{"aria-label":"Batasan",value:d.constraints,onChange:f("constraints"),placeholder:"mis. tanpa cache eksternal",className:"hn-w-full"})}),t.jsx(oe,{label:"Prioritas",children:t.jsx($e,{"aria-label":"Prioritas",value:d.priority,onChange:f("priority"),className:"hn-w-full",options:hp})})]})]}):b?t.jsxs(t.Fragment,{children:[t.jsx(oe,{label:"Severity",children:t.jsx($e,{value:d.severity,onChange:f("severity"),className:"hn-w-full",options:sR})}),t.jsx(oe,{label:"Langkah reproduksi",children:t.jsx(Ma,{value:d.steps,onChange:f("steps"),rows:3,mono:!0,placeholder:`1. Buka …
|
|
1011
1011
|
2. Lakukan …
|
|
1012
1012
|
3. Amati …`})}),t.jsxs("div",{className:"hn-grid-mobile hn-grid-even",children:[t.jsx(oe,{label:"Diharapkan",children:t.jsx(Ma,{value:d.expected,onChange:f("expected"),rows:2,placeholder:"mis. total funnel sama dengan jumlah baris laporan harian"})}),t.jsx(oe,{label:"Aktual",children:t.jsx(Ma,{value:d.actual,onChange:f("actual"),rows:2,placeholder:"mis. total funnel dua kali lipat untuk sesi yang melewati tengah malam"})})]}),t.jsx(oe,{label:"Environment",hint:"build / kanal tempat finding muncul",children:t.jsx(Oe,{value:d.env,onChange:f("env"),placeholder:"prod · web · v0.9.2",className:"hn-w-full"})}),t.jsx(oe,{label:"Batasan",hint:"opsional — batasan pengerjaan yang sudah kamu ketahui",children:t.jsx(Oe,{"aria-label":"Batasan",value:d.constraints,onChange:f("constraints"),placeholder:"mis. jangan ubah kontrak API",className:"hn-w-full"})})]}):t.jsxs(t.Fragment,{children:[t.jsx(oe,{label:x?"Apa yang diaudit / pertanyaan":"Konteks",hint:x?"Isu atau pertanyaan yang mau ditelusuri":"Latar belakang & alasan fitur ini dibutuhkan",children:t.jsx(Ma,{value:d.context,onChange:f("context"),rows:3,placeholder:x?"mis. apakah funnel double-count? cek log sesi lintas tengah malam…":"mis. operator harus membuka tiga layar untuk tahu sesi mana yang menunggu"})}),t.jsx(oe,{label:x?"Temuan/jawaban yang diharapkan":"Hasil yang diharapkan",children:t.jsx(Ma,{value:d.outcome,onChange:f("outcome"),rows:2,placeholder:x?"Jawaban/kepastian yang dicari…":"mis. satu badge di Overview menunjukkan jumlah sesi yang menunggu"})}),t.jsxs("div",{className:"hn-grid-mobile hn-grid-split",children:[t.jsx(oe,{label:"Batasan",hint:"opsional",children:t.jsx(Oe,{value:d.constraints,onChange:f("constraints"),placeholder:"mis. reuse queue yang ada",className:"hn-w-full"})}),t.jsx(oe,{label:"Prioritas",children:t.jsx($e,{value:d.priority,onChange:f("priority"),className:"hn-w-full",options:hp})})]})]}),t.jsx(oe,{label:"Lampiran",hint:"Gambar, log, CSV, JSON, atau PDF — sesi agen membacanya sebagai konteks",children:t.jsx(aT,{files:d.attachments,onChange:N=>u(R=>({...R,attachments:N}))})})]})}function dR({open:e,onClose:a,onCreate:n}){const i={kind:"from-scratch",mode:"local",name:"",desc:"",dir:"",gitRemote:"",objective:""},[r,s]=c.useState(i),[o,l]=c.useState(!1);c.useEffect(()=>{e&&(s(i),l(!1))},[e]);const d=x=>v=>s(y=>({...y,[x]:v.target.value})),u=r.kind==="from-scratch",m=!u&&r.mode==="clone",h=u?!!r.name.trim()&&!!r.dir.trim():m?!!r.gitRemote.trim()&&!!r.dir.trim():!!r.name.trim()||!!r.dir.trim(),p=async()=>{if(!(!h||o)){l(!0);try{await n(r)}finally{l(!1)}}},[g,f]=c.useState(!1),b=u?"Buat dan susun tujuan":m?o?"Menyalin repo…":"Salin repo dan susun dokumen":"Tambah dan susun dokumen";return t.jsxs(la,{open:e,onClose:a,icon:"box",eyebrow:"workspace",title:"Project baru",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",size:"sm",onClick:a,disabled:o,children:"Batal"}),t.jsx(U,{size:"sm",leftIcon:u?"messages-square":m?"git-branch":"radar",onClick:p,disabled:!h||o,children:b})]}),children:[t.jsxs("div",{className:"hn-sheet-block",children:[t.jsx(At,{variant:"pill",value:r.kind,onChange:x=>s(v=>({...v,kind:x})),tabs:[{value:"from-scratch",label:"Dari nol",icon:"sparkles"},{value:"existing",label:"Kode yang sudah ada",icon:"folder-git-2"}]}),t.jsx("div",{className:"hn-sheet-hint",children:u?"hanoman menggali ide sampai tujuan MVP disepakati (brainstorm), lalu membuat kerangka dokumen acuan (Source of Truth).":"hanoman membaca kode yang sudah ada, lalu menyusun dokumen acuan (Source of Truth) dari kode itu."})]}),u?t.jsxs(t.Fragment,{children:[t.jsx(oe,{label:"Nama project",hint:"lowercase, tanpa spasi",children:t.jsx(Oe,{value:r.name,onChange:d("name"),placeholder:"mis. kirana",className:"hn-w-full"})}),t.jsx(oe,{label:"Direktori",hint:"folder tempat repo baru dibuat (mesin ini)",children:t.jsxs("div",{className:"hn-row-8",children:[t.jsx(Oe,{value:r.dir,onChange:d("dir"),leftIcon:"folder",mono:!0,placeholder:"/path/ke/project-baru",className:"hn-grow"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"folder-open",onClick:()=>f(!0),children:"Pilih folder"})]})}),t.jsx(hr,{open:g,onClose:()=>f(!1),start:r.dir,onPick:x=>s(v=>({...v,dir:x}))}),t.jsx(oe,{label:"Ide awal",hint:"bahan awal brainstorm tujuan; menjadi deskripsi dan kerangka dokumen",children:t.jsx(Ma,{value:r.objective,onChange:d("objective"),rows:2,placeholder:"mis. POS ritel dengan stok multi-gudang dan laporan harian"})})]}):t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"hn-mb-12",children:t.jsx(At,{variant:"pill",value:r.mode,onChange:x=>s(v=>({...v,mode:x})),tabs:[{value:"local",label:"Dari folder lokal",icon:"folder"},{value:"clone",label:"Salin dari URL git",icon:"git-branch"}]})}),m?t.jsx(oe,{label:"URL repository",hint:"GitHub/GitLab · https atau ssh",children:t.jsx(Oe,{value:r.gitRemote,onChange:d("gitRemote"),leftIcon:"git-branch",mono:!0,placeholder:"https://github.com/org/repo.git",className:"hn-w-full"})}):null,t.jsx(oe,{label:m?"Folder tujuan salinan":"Direktori",hint:m?"folder lokal tempat repo disalin (git clone) di mesin ini":"opsional · folder checkout lokal (bisa diedit belakangan per-mesin)",children:t.jsxs("div",{className:"hn-row-8",children:[t.jsx(Oe,{value:r.dir,onChange:d("dir"),leftIcon:"folder",mono:!0,placeholder:"/path/ke/repo",className:"hn-grow"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"folder-open",onClick:()=>f(!0),children:"Pilih folder"})]})}),t.jsx(hr,{open:g,onClose:()=>f(!1),start:r.dir,onPick:x=>s(v=>({...v,dir:x}))}),t.jsx(oe,{label:"Deskripsi",hint:"opsional",children:t.jsx(Oe,{value:r.desc,onChange:d("desc"),placeholder:"mis. POS ritel + inventori",className:"hn-w-full"})})]})]})}function cR({open:e,project:a,onClose:n,onSave:i}){const[r,s]=c.useState({id:"",name:"",desc:"",dir:"",gitRemote:""}),[o,l]=c.useState(!1),[d,u]=c.useState(null),[m,h]=c.useState([]),p=!!(d!=null&&d.length);c.useEffect(()=>{e&&a&&(s({id:a.id,name:a.name,desc:a.desc,dir:a.binding??"",gitRemote:a.gitRemote??""}),h((a.handledBy??[]).map(b=>({deviceId:b.deviceId,name:b.name}))))},[e,a]),c.useEffect(()=>{var x;if(!e)return;let b=!0;return(x=ne.listDeviceTokens)==null||x.call(ne).then(v=>{b&&u(v)}).catch(()=>{b&&u([])}),()=>{b=!1}},[e]);const g=/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/.test(r.id.trim()),f=!!r.name.trim()&&g;return t.jsxs(la,{open:e,onClose:n,icon:"pencil",eyebrow:a?a.id:"project",title:"Edit project",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",size:"sm",onClick:n,children:"Batal"}),t.jsx(U,{size:"sm",leftIcon:"check",onClick:()=>f&&i({...r,handledBy:p?m:void 0}),children:"Simpan"})]}),children:[t.jsx(oe,{label:"ID project",hint:"slug unik · huruf-kecil/angka/hubung · ganti = pengaruh Help Center & sync ke server",children:t.jsx(Oe,{value:r.id,onChange:b=>s(x=>({...x,id:b.target.value})),leftIcon:"hash",mono:!0,placeholder:"mis. erp-tumbuh-ai",className:"hn-w-full"})}),t.jsx(oe,{label:"Nama project",hint:"label tampilan — boleh berbeda dari id",children:t.jsx(Oe,{value:r.name,onChange:b=>s(x=>({...x,name:b.target.value})),placeholder:"mis. ERP Tumbuh AI",className:"hn-w-full"})}),t.jsx(oe,{label:"Deskripsi",children:t.jsx(Oe,{value:r.desc,onChange:b=>s(x=>({...x,desc:b.target.value})),placeholder:"mis. ERP manufaktur + inventori",className:"hn-w-full"})}),t.jsx(oe,{label:"Path (mesin ini)",hint:"opsional · disimpan lokal, tak disync · kosongkan = pakai default",children:t.jsxs("div",{className:"hn-row-8",children:[t.jsx(Oe,{value:r.dir,onChange:b=>s(x=>({...x,dir:b.target.value})),leftIcon:"folder",mono:!0,placeholder:"/path/ke/repo (mesin ini)",className:"hn-grow-min"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"folder-open",onClick:()=>l(!0),children:"Pilih folder"})]})}),t.jsx(hr,{open:o,onClose:()=>l(!1),start:r.dir,onPick:b=>s(x=>({...x,dir:b}))}),t.jsx(oe,{label:"Git remote",hint:"opsional · remote resmi agar device lain bisa clone project ini · disync antar-device",children:t.jsx(Oe,{value:r.gitRemote,onChange:b=>s(x=>({...x,gitRemote:b.target.value})),leftIcon:"git-branch",mono:!0,placeholder:"https://github.com/org/repo.git",className:"hn-w-full"})}),t.jsx(oe,{label:"Ditangani oleh",hint:p?"hanoman client yang memegang project ini · disync ke semua mesin · boleh kosong":"disync ke semua mesin · hanya bisa diubah dari instance yang memegang katalog device",children:p?t.jsx(Nd,{"aria-label":"Pilih hanoman client",placeholder:"Pilih client…",searchPlaceholder:"mis. mac-mini atau vps-jakarta",emptyText:"Tak ada device terdaftar yang cocok.",value:m.map(b=>b.deviceId),invalidValues:m.filter(b=>!d.some(x=>x.id===b.deviceId&&!x.revokedAt)).map(b=>b.deviceId),options:d.filter(b=>!b.revokedAt).map(b=>({value:b.id,label:b.lastSeenAt?`${b.name} · terakhir ${new Date(b.lastSeenAt).toLocaleDateString("id-ID")}`:b.name})),onChange:b=>h(b.map(x=>{var v;return m.find(y=>y.deviceId===x)??{deviceId:x,name:((v=d.find(y=>y.id===x))==null?void 0:v.name)??x}}))}):t.jsx(ub,{list:a==null?void 0:a.handledBy})})]})}function uR(){return t.jsx(Tf,{children:t.jsx(mR,{})})}function mR(){var Es,Ts,Cs,Ps,Ms;const e=Cf(),a=Pf(),n=c.useMemo(()=>wj(e.pathname,Ml),[e.pathname]),[i,r]=Da("app","section","overview",bi(...Ml)),s=(n==null?void 0:n.section)??i;c.useEffect(()=>{n&&Ml.includes(n.section)&&r(n.section)},[n==null?void 0:n.section]);const o=c.useCallback(_=>a(Yt({section:_})),[a]),l=c.useCallback(_=>a(Yt({section:"project",projectId:_})),[a]),[d,u]=c.useState(null),[m,h]=c.useState([]),[p,g]=c.useState([]),f=c.useRef(""),[b,x]=c.useState(0),[v,y]=c.useState([]),[T,S]=c.useState([]),[E,w]=Da("app","projectId","",Dn),[N,R]=c.useState(null),[L,I]=Da("app","projectFilter","all",Dn),[B,A]=c.useState(null),[M,K]=c.useState(null),[O,J]=c.useState(null);c.useEffect(()=>{s!=="terminal"&&A(null)},[s]);const Z=c.useCallback(_=>{A(_??null),o("terminal")},[o]),[H,te]=Da("projects","q","",Dn),[ae,F]=c.useState(null),{confirm:fe,dialog:_e}=ot(),ee=XE(),[X,ce]=c.useState(null),[se,Ce]=c.useState(null),[Te,le]=mk(),[xa,Ze]=c.useState("loading"),[He,Ke]=c.useState(null),ga=c.useCallback(()=>Ke({needsSetup:!1,user:null}),[]);c.useEffect(()=>{ne.authStatus().then(Ke).catch(()=>Ke({needsSetup:!1,user:null}))},[]);const Ge=(He==null?void 0:He.user)!=null&&He.user.role!=="client";ek(Ge);const[fa,Aa]=tb(),ma=al(),Se=Ge&&KE(fa,ma),[Je,q]=c.useState(null),[Be,me]=c.useState(!1);c.useEffect(()=>{(He!=null&&He.needsSetup||Ge)&&ne.setupStatus().then(q).catch(()=>q(null))},[He==null?void 0:He.needsSetup,Ge,(Es=He==null?void 0:He.user)==null?void 0:Es.id]),c.useEffect(()=>{TA()},[]),c.useEffect(()=>{const _=tM(window.location.hash);if(_){a(Yt({section:"backlog",specId:_}),{replace:!0});return}n||a(Yt({section:i}),{replace:!0})},[n]),c.useEffect(()=>{(n==null?void 0:n.section)==="project"&&n.projectId&&w(n.projectId),(n==null?void 0:n.section)==="backlog"&&u(n.specId??null)},[n==null?void 0:n.section,n==null?void 0:n.projectId,n==null?void 0:n.specId]);const[We,ia]=c.useState({enabled:!1,devices:[],hubVersion:""}),[ye,oa]=c.useState(null),we=c.useRef({sessions:v,leadAsks:T,pending:ye});we.current={sessions:v,leadAsks:T,pending:ye};const xe=c.useCallback(()=>{Ze("loading"),Promise.all([ne.listProjects(),ne.listSpecs(),ne.listTerminals()]).then(([_,W,Y])=>{h(_.items),g(W.items.map(X5)),y(Y),f.current=Hh(W.items),w(je=>{var V;return je||((V=_.items[0])==null?void 0:V.id)||""}),x(je=>je+1),Ze("ready")}).catch(_=>{if(_ instanceof ha&&_.status===401){ga();return}Ze("error"),le("Gagal memuat data dari server","err","x-circle")})},[le,ga]);c.useEffect(()=>{Ge&&xe()},[xe,Ge,(Ts=He==null?void 0:He.user)==null?void 0:Ts.id]);const Xe=m,Pa=c.useCallback(async _=>{try{const W=await ne.getProject(_);h(Y=>Y.map(je=>je.id===W.id?W:je))}catch{}},[]),nt=c.useMemo(()=>new Set(v.filter(_=>_.specId&&!_.exited).map(_=>_.specId)),[v]),Wa=c.useMemo(()=>cI(v,p),[v,p]),ea=c.useMemo(()=>Q5(We),[We]),ge=c.useMemo(()=>Object.fromEntries(p.map(_=>[_.id,_.title])),[p]);c.useEffect(()=>{if(Ge)return Ii(_=>{if(_.t==="specs"){const W=Hh(_.specs);W!==f.current&&(f.current=W,g(_.specs),x(Y=>Y+1))}else if(_.t==="sessions")Ql(we.current.sessions,_.sessions,y);else if(_.t==="leadAsks")Ql(we.current.leadAsks,_.asks,S);else if(_.t==="presence"){const W={enabled:_.enabled,devices:_.devices,hubVersion:_.hubVersion};ia(Y=>qh(Y)===qh(W)?Y:W)}else _.t==="pending"&&Ql(we.current.pending,_.counts,oa)})},[Ge]);const be=Xe.find(_=>_.id===E)||Xe[0];function ca(_){w(_.id),l(_.id)}const Na=(_,W)=>a(Yt({section:"review",kind:_,id:W}));function Tt(_){R({id:_.id,kind:"spec",title:_.title}),Na("spec",_.id)}function lt(_){var W;R({id:_,kind:"spec",title:((W=p.find(Y=>Y.id===_))==null?void 0:W.title)??_}),Na("spec",_)}function dt(_,W){R({id:_,kind:"session",title:W}),Na("session",_)}const Ra=(n==null?void 0:n.section)==="review"?N&&N.id===n.id&&N.kind===n.kind?N:{id:n.id,kind:n.kind,title:((Cs=p.find(_=>_.id===n.id))==null?void 0:Cs.title)??n.id}:null,ct=c.useMemo(()=>oo.filter(_=>!_.gate||We.enabled),[We.enabled]),vn=c.useMemo(()=>ct.map(_=>_.key),[ct]);CE({enabled:!!(He!=null&&He.user)&&He.user.role!=="client",navKeys:vn,go:o});const Va=c.useMemo(()=>Xe.map(_=>({id:_.id,name:_.name})),[m]),it=c.useMemo(()=>({value:L,projects:Va,onChange:I}),[L,Va,I]),Ya=c.useMemo(()=>fE({nav:oo,gates:{clients:We.enabled},projects:Va,specs:p,waiting:eb(v,p).map(_=>{const W=_.specId?ge[_.specId]:void 0;return{id:_.id,label:`${_.specId??_.id}${W?` · ${W}`:""}`}}),scope:L,go:o,openSpec:_=>a(Yt({section:"backlog",specId:_})),openSession:_=>Z(_),newSpec:()=>F("brief"),newProject:()=>F("project"),setScope:I,petOn:Se,setPetOn:Aa}),[p,v,Va,We.enabled,L,ge,o,a,Z,Se,Aa]),jt=c.useRef(null);c.useEffect(()=>{s!=="dalang"&&(jt.current=s)},[s]);const Ct=c.useCallback(_=>s==="terminal"&&!!_.sessionId&&B===_.sessionId,[s,B]),Nt=c.useCallback(_=>{const W=s2(_,v);W.projectFilter&&I(W.projectFilter),W.focus&&A(W.focus),o(W.section)},[v]);async function xn(_){if(!be)return;const W=_.id.trim();try{if(W&&W!==be.id){if(!await fe({title:`Ganti ID project "${be.id}" → "${W}"?`,message:"Ini berpengaruh ke SEMUA yang terkait project:",impact:[t.jsxs(t.Fragment,{children:["Link Help Center publik berubah jadi ",t.jsxs("code",{children:["/help/",W]})," — tautan lama rusak."]}),"Perubahan dirambatkan (sync) ke server; server ikut berganti id."],confirmLabel:"Ganti ID",icon:"pencil"}))return;const re=await ne.renameProject(be.id,W);re.helpUrl&&le("Help Center baru: "+re.helpUrl,"ok","life-buoy")}const Y=W&&W!==be.id?W:be.id;await ne.updateProject(Y,{name:_.name.trim(),desc:_.desc.trim(),gitRemote:_.gitRemote.trim(),..._.handledBy?{handledBy:_.handledBy}:{}});const je=_.dir.trim();je!==(be.binding??"")&&(je?await ne.putBinding(Y,je):await ne.deleteBinding(Y));const V=await ne.getProject(Y);h(re=>[...re.filter(Ue=>Ue.id!==be.id&&Ue.id!==V.id),V]),w(V.id),F(null),le("Project "+V.name+" diperbarui","ok","box")}catch{le("Gagal memperbarui project","err","x-circle")}}async function Pt(_){var Ue;const W=_.kind==="from-scratch",Y=!W&&_.mode==="clone",je=du(_.gitRemote),V=_.name.trim()||(Y?je:_.dir.split("/").filter(Boolean).pop()||"repo");let re;try{re=await ne.createProject({name:V,kind:_.kind,desc:W&&_.objective.trim()||_.desc.trim(),repoDir:W?_.dir.trim():Y?void 0:_.dir,gitRemote:Y?_.gitRemote.trim():void 0})}catch{le("Gagal membuat project","err","x-circle");return}if(Y)try{await ne.cloneProject(re.id,_.dir.trim()),re=await ne.getProject(re.id)}catch(na){const{error:Fa}=ef(na);h(Qa=>[re,...Qa]),w(re.id),F(null),l(re.id),le(`Project ${re.id} dibuat, tapi clone gagal · ${Fa} · clone ulang dari detail project`,"warn","git-branch");return}if(h(na=>[re,...na]),F(null),W){let na=!0;try{na=(await ne.getSettings()).autoScaffold}catch{}if(na)try{const{id:Fa}=await ne.scaffoldDocs(re.id);w(re.id),Z(Fa),le(`Project ${re.id} dibuat · buat kerangka dokumen · sesi ${Fa} dimulai`,"ok","sparkles");return}catch{}w(re.id),l(re.id),le(`Project ${re.id} dibuat · tekan "Scaffold docs" untuk menyusun SoT`,"ok","box");return}w(re.id);try{const{id:na}=await ne.reverseDocs(re.id);Z(na),le(`Project ${re.id} dibuat · susun dokumen · sesi ${na} dimulai`,"ok","radar")}catch(na){const Fa=(Ue=na.detail)==null?void 0:Ue.error;l(re.id),le(`Project ${re.id} dibuat, tapi susun dokumen gagal dimulai`+(Fa?` · ${Fa}`:"")+' · ulangi lewat "Reverse docs"',"warn","radar")}}async function gt(_){try{if(!await fe({title:`Hapus project "${_.name}"?`,message:`Project "${_.id}" dan seluruh isinya dihapus dari dashboard ini.`,impact:["Semua backlog item project ini ikut terhapus.","Tindakan ini tak bisa dibatalkan."],confirmLabel:"Hapus project",run:()=>ne.deleteProject(_.id)}))return;h(W=>W.filter(Y=>Y.id!==_.id)),g(W=>W.filter(Y=>Y.projectId!==_.id)),y(W=>W.filter(Y=>Y.projectId!==_.id)),w(W=>W===_.id?"":W),I(W=>W===_.id?"all":W),(s==="docs"||s==="project")&&o("projects"),le("Project "+_.id+" dihapus","warn","trash-2")}catch(W){const Y=W instanceof ha&&W.status===409;le("Gagal hapus "+_.id+(Y?" · masih ada sesi aktif":""),"err","x-circle")}}const[Ua,jn]=c.useState(null);function ya(_){J("backlog"),jn(_)}function Gt(_){J("terminal"),jn(_)}const rn=c.useCallback(()=>K(null),[]);async function wt(_,W,Y){try{const je=await ne.integrateSpec(_.id,W,Y);je.status==="conflict"?(Z(je.sessionId),le(`${_.id} · konflik ${W} — selesaikan di Terminal`,"warn","git-merge")):le(`${_.id} · ${W} berhasil · ${je.detail}`,"ok","git-merge")}catch(je){const V=je instanceof ha?je.status:0;le(`${_.id} · gagal ${W}`+(V===409?" · cek target/branch":""),"err","x-circle")}}async function wn(_,W,Y){try{const je=await ne.sessionIntegrate(_.id,W,Y);je.status==="conflict"?(Z(je.sessionId),le(`${_.id} · konflik ${W} — selesaikan di Terminal`,"warn","git-merge")):le(`${_.id} · ${W} berhasil · ${je.detail}`,"ok","git-merge")}catch(je){const V=je instanceof ha?je.status:0;le(`${_.id} · gagal ${W}`+(V===409?" · cek target/branch":""),"err","x-circle")}}async function he(_,W){try{const{id:Y}=await(W?ne.reverseDocs(_.id,{force:W}):ne.reverseDocs(_.id));Z(Y),le(_.id+" · susun dokumen · sesi "+Y+" dimulai","info","radar")}catch(Y){if(ee.offerRetry(Y,`${_.id} · susun dokumen`,V=>he(_,V)))return;const je=Y instanceof ha&&(Y.status===422||Y.status===400);le(_.id+" · gagal mulai reverse"+(je?" · project belum punya repoDir":""),"warn","x-circle")}}async function ka(_,W){try{const{id:Y}=await(W?ne.scaffoldDocs(_.id,{force:W}):ne.scaffoldDocs(_.id));Z(Y),le(_.id+" · buat kerangka dokumen · sesi "+Y+" dimulai","info","sparkles")}catch(Y){if(ee.offerRetry(Y,`${_.id} · buat kerangka dokumen`,V=>ka(_,V)))return;const je=Y instanceof ha&&(Y.status===422||Y.status===400);le(_.id+" · gagal mulai scaffold"+(je?" · project belum punya repoDir":""),"warn","x-circle")}}async function Ba(_,W,Y,je){try{const{id:V}=await ne.startPrd(_,W,je?{...Y,force:je}:Y);Z(V),le(`PRD · sesi ${V} dimulai`,"info","scroll-text")}catch(V){if(ee.offerRetry(V,`${_} · PRD`,Ue=>Ba(_,W,Y,Ue)))return;const re=V instanceof ha&&(V.status===422||V.status===400);le("gagal mulai PRD"+(re?" · project belum punya repoDir":""),"warn","x-circle")}}function Rt(_){ce(_),F("brief")}async function Mt(_,W,Y){try{const{id:je}=await(Y?ne.startBreakdown(_,W,{force:Y}):ne.startBreakdown(_,W));Z(je),le(`Breakdown · sesi ${je} dimulai`,"info","split")}catch(je){if(ee.offerRetry(je,`${_} · pecah jadi backlog`,re=>Mt(_,W,re)))return;const V=je instanceof ha&&(je.status===422||je.status===400);le("gagal mulai breakdown"+(V?" · project belum punya repoDir/PRD":""),"warn","x-circle")}}async function ri(_,W,Y){try{const{created:je}=await ne.createSpecsBatch({project:_,items:Y,prdPath:W});return g(V=>[...je,...V]),o("backlog"),le(`${je.length} backlog dibuat dari PRD`,"ok","list-checks"),je.length}catch{return le("Gagal membuat backlog dari PRD","err","x-circle"),0}}function Vn(_,W){const Y=W==null?void 0:W.prefill,je=`Dari audit ${_.id}: ${_.objective}`;ce({project:_.projectId,kind:"qa",title:(Y==null?void 0:Y.title)||_.title,steps:((Y==null?void 0:Y.steps)||je).slice(0,500),actual:(Y==null?void 0:Y.context)||_.objective,severity:Y!=null&&Y.severity&&["critical","major","minor"].includes(Y.severity)?Y.severity:"major",constraints:(Y==null?void 0:Y.constraints)??"",branchFrom:`hanoman/${_.id.toLowerCase()}`,fromAudit:_.id}),F("brief")}function oi(_,W){const Y=W==null?void 0:W.prefill;ce({project:_.projectId,kind:"brief",title:(Y==null?void 0:Y.title)||_.title,context:(Y==null?void 0:Y.context)||`Dari audit ${_.id}: ${_.objective}`,outcome:(Y==null?void 0:Y.outcome)||"",branchFrom:`hanoman/${_.id.toLowerCase()}`,fromAudit:_.id}),F("brief")}function Ni(_,W){const Y=W==null?void 0:W.prefill;Ce({project:_.projectId,branchFrom:`hanoman/${_.id.toLowerCase()}`,fromAudit:_.id,title:(Y==null?void 0:Y.title)||_.title,context:(Y==null?void 0:Y.context)||`Dari audit ${_.id}: ${_.objective}`,outcome:(Y==null?void 0:Y.outcome)||""})}async function _s(_,W){try{const Y=await ne.patchSpec(_.id,{branchFrom:W});if("pending"in Y)return;g(je=>je.map(V=>V.id===Y.id?Y:V)),le(_.id+" · branch "+(W??"main (default project)"),"ok","git-branch")}catch{le("Gagal mengubah branch "+_.id,"err","x-circle")}}async function ta(_,W){try{const Y=await ne.patchSpec(_.id,W);if("pending"in Y)return;g(je=>je.map(V=>V.id===Y.id?Y:V)),le(_.id+" diperbarui","ok","check")}catch(Y){const je=Y instanceof ha&&Y.status===409;le(je?_.id+" sudah dimulai — tak bisa diedit":"Gagal menyimpan "+_.id,"warn","x-circle")}}async function Ri(_,W,Y,je){try{const V=await ne.changeSpecSource(_.id,{source:W,payload:Y,confirmReset:je});return"pending"in V?V:(g(re=>re.map(Ue=>Ue.id===V.id?V:Ue)),le(`${_.id} · type ${_.source} → ${W}`,"ok","shuffle"),null)}catch(V){const re=V instanceof ha&&V.status===409;return le(re?`${_.id} punya sesi yang masih berjalan — tutup dulu sesinya`:`Gagal mengubah type ${_.id}`,"warn","x-circle"),null}}async function ie(_,W){try{const Y=await ne.patchSpec(_.id,{dependsOn:W});if("pending"in Y)return;g(je=>je.map(V=>V.id===Y.id?Y:V)),le(_.id+" · dependency diperbarui","ok","lock")}catch(Y){const je=Y instanceof ha&&Y.status===400;le(je?"Dependency ditolak server":"Gagal menyimpan dependency "+_.id,"warn","x-circle")}}async function De(_,W){try{const Y=await ne.patchSpec(_.id,{autoMerge:W});if("pending"in Y)return;g(je=>je.map(V=>V.id===Y.id?Y:V)),le(_.id+" · auto-merge diperbarui","ok","git-merge")}catch(Y){const je=Y instanceof ha?Y.message:"Gagal menyimpan auto-merge "+_.id;le(je,"warn","x-circle")}}async function qe(_,W,Y){try{const je=await ne.patchSpec(_.id,{stage:W,confirmDelete:Y});return"pending"in je||(g(V=>V.map(re=>re.id===je.id?je:re)),le(_.id+" dikembalikan ke "+(Lc[W]??W),"warn","rotate-ccw")),je}catch{le("Gagal mengembalikan stage "+_.id,"err","x-circle");return}}async function sa(_){const{defaultBranch:W}=await ne.listBranches(_.projectId),Y=_.branchFrom??W;if(!Y){le(_.id+" · cabang tujuan belum diketahui","err","x-circle");return}await wt(_,"merge","local:"+Y)}async function za(_){const W=await ne.deleteSpecWorktree(_.id);if(!W.ok)throw new Error(W.error??"worktree tidak ditemukan");le(_.id+" · worktree dihapus","ok","trash-2")}async function Sn(_,W,Y){var je;try{const V=await ne.markSpecDone(_.id,{reason:W||void 0,confirm:Y});return g(re=>re.map(Ue=>Ue.id===V.id?V:Ue)),le(_.id+" ditandai selesai","ok","circle-check"),V}catch(V){const re=V instanceof ha?V.detail:null;if((re==null?void 0:re.error)==="confirm-required")return{needConfirm:!0,sessionId:(je=re.session)==null?void 0:je.id};le((re==null?void 0:re.error)==="backlog item sudah selesai"?_.id+" sudah selesai":"Gagal menandai selesai "+_.id,"warn","x-circle");return}}async function on(_,W){const Y=await ne.markSpecReviewed(_.id,W);g(je=>je.map(V=>V.id===Y.id?{...V,reviewedAt:Y.reviewedAt}:V)),le(_.id+(W?" ditandai sudah ditinjau":" tanda ditinjau dibatalkan"),"ok",W?"circle-check":"rotate-ccw")}async function Lt(_){await ne.deleteSpec(_.id),g(W=>W.filter(Y=>Y.id!==_.id)),le(_.id+" dihapus dari backlog","warn","trash-2")}async function li(_){const W=_.kind==="qa",Y=Ti(_.kind)==="goal",je=W?{severity:_.severity,steps:_.steps,expected:_.expected,actual:_.actual,env:_.env,constraints:_.constraints,..._.fromAudit?{fromAudit:_.fromAudit}:{}}:Y?{goal:_.goal.trim(),done:_.done,constraints:_.constraints,priority:_.priority}:{context:_.context,outcome:_.outcome,constraints:_.constraints,priority:_.priority,..._.fromAudit?{fromAudit:_.fromAudit}:{}};try{const V=await ne.createSpec({project:_.project,source:_.kind,title:_.title.trim(),priority:_.priority,payload:je,branchFrom:_.branchFrom||void 0,..._.dependsOn.length?{dependsOn:_.dependsOn}:{}});if(g(Ue=>[V,...Ue]),_.attachments.length){const Ue=await ne.uploadSpecAttachments(V.id,_.attachments).catch(()=>null);Ue?Ue.rejected.length&&le(`${Ue.rejected.length} lampiran ditolak: ${Ue.rejected.map(na=>na.filename).join(", ")}`,"warn","paperclip"):le("Item dibuat, tapi lampiran gagal diunggah","warn","paperclip")}F(null),ce(null),o("backlog");const re=_.kind==="audit"?" dibuat · audit-only (dokumen)":_.kind==="no_effort"?" dibuat · sesi satu fase (Kerjakan)":_.kind==="goal"?" dibuat · sesi goal (Goal → Verifikasi)":W?" difilekan · masuk audit":" dibuat · masuk brainstorm";le(V.id+re,"ok",_.kind==="audit"?"search":_.kind==="no_effort"?"zap":_.kind==="goal"?"target":W?"bug":"lightbulb")}catch{le("Gagal membuat spec","err","x-circle")}}const di=_=>t.jsx(Z_,{children:t.jsx(c.Suspense,{fallback:t.jsx(ue,{kind:"loading",title:"Memuat halaman…"}),children:_})}),Ja=_=>xa==="loading"?t.jsx(ue,{kind:"loading",title:"Memuat workspace…"}):xa==="error"?t.jsx(ue,{kind:"error",illustration:"PST-006",title:"Gagal memuat data dari server",hint:"Pastikan server hanoman berjalan, lalu coba lagi.",action:xe}):di(_),Ha=t.jsx(uE,{section:s,onNavigate:o});if(!He)return t.jsx(ue,{kind:"loading",title:"Memuat hanoman…"});if(He.needsSetup&&(Je!=null&&Je.needed)&&!Be)return t.jsx(uT,{status:Je,onDone:()=>me(!0)});if(!He.user)return t.jsx(cT,{needsSetup:He.needsSetup,setupTokenRequired:He.setupTokenRequired??!1,setupTokenPath:He.setupTokenPath,setupStep:He.needsSetup&&Be?2:void 0,onDone:_=>Ke({needsSetup:!1,user:_})});if(He.user.role==="client")return t.jsx(wT,{user:He.user,onLoggedOut:ga});const As=He.user;let La=null;if(s==="overview")La=t.jsx(Za,{active:"overview",title:"Overview",breadcrumb:"nafanesia.id · ringkasan workspace",onNavigate:o,children:Ja(t.jsx(uM,{projects:Xe,backlog:p,sessions:v,onOpenProject:ca,onGoto:o,onCreateProject:()=>F("project"),onOpenSession:_=>{A(_),o("terminal")}}))});else if(s==="dalang"){const _=jt.current,W=(Ps=oo.find(Y=>Y.key===_))==null?void 0:Ps.label;La=Ja(t.jsx(VN,{projects:Xe,backlog:p,sessions:v,onOpenProject:ca,onGoto:o,onOpenSession:Y=>{A(Y),o("terminal")},previous:_&&W?{label:W,onBack:()=>o(_)}:void 0,onExit:()=>o("overview")}))}else if(s==="projects")La=t.jsxs(Za,{active:"projects",title:"Projects",breadcrumb:"nafanesia.id · workspace",showSearch:!0,searchValue:H,onSearchChange:te,onNavigate:o,actions:t.jsx(U,{size:"sm",leftIcon:"plus",onClick:()=>F("project"),children:"Project baru"}),children:[Ha,Ja(Xe.length===0?t.jsx(ue,{kind:"empty",icon:"box",title:"Belum ada project",hint:"Mulai dari nol atau tambahkan codebase yang sudah ada — hanoman menyusun Source of Truth-nya.",action:()=>F("project"),actionLabel:"Project baru"}):t.jsx(gM,{projects:Xe,variant:"list",onOpen:ca,onDelete:gt,pageSize:20,search:H,dataVersion:b,onClearSearch:()=>te(""),presenceByProject:ea.byProject}))]});else if(s==="project")La=t.jsxs(Za,{active:"projects",title:be?be.name:"Project",breadcrumb:be?"projects · "+be.id:"projects",onNavigate:o,children:[Ha,Ja(be?t.jsx(TM,{p:be,onEdit:()=>F("project-edit"),onToast:le,onProjectChanged:Pa,onGotoDocs:()=>o("docs"),onGotoTerminal:()=>{I(be.id),Z()},onGotoBacklog:()=>{I(be.id),o("backlog")},onGotoSkills:()=>a(Yt({section:"skills",projectId:be.id})),onReverse:be.kind==="existing"&&(be.binding??be.repoDir)?()=>he(be):void 0,onScaffold:be.kind==="from-scratch"&&(be.binding??be.repoDir)?()=>ka(be):void 0,onDelete:()=>gt(be)}):t.jsx(ue,{kind:"empty",icon:"box",title:"Belum ada project",hint:"Mulai dari nol atau tambahkan codebase yang sudah ada.",action:()=>F("project"),actionLabel:"Project baru"}))]});else if(s==="backlog")La=t.jsxs(Za,{active:"backlog",title:"Backlog",breadcrumb:"specs · brainstorm → execute",onNavigate:o,actions:t.jsx(U,{size:"sm",leftIcon:"plus",onClick:()=>F("brief"),children:"Tambah"}),children:[Ha,Ja(t.jsx(zI,{backlog:p,projects:Xe,pageSize:20,onStart:ya,activeSpecs:nt,presenceBySpec:ea.bySpec,reviewSpecIds:Wa,onNew:()=>F("brief"),onDelete:Lt,onOpenRun:_=>{var W;return Z((W=v.find(Y=>Y.specId===_.id&&!Y.exited))==null?void 0:W.id)},onOpenReview:Tt,onEditBranch:_s,onRevertStage:qe,onMarkDone:Sn,onMarkReviewed:(_,W)=>on(_,W).catch(()=>le(_.id+" gagal diperbarui","warn","x-circle")),onIntegrate:wt,onEditSpec:ta,onEditDeps:ie,onEditAutoMerge:De,onChangeSource:Ri,onPromoteToQa:Vn,onPromoteToBrief:oi,onPromoteToPrd:Ni,onToast:le,initialDetailId:d,projectFilter:L,onProjectFilter:I,dataVersion:b}))]});else if(s==="team")La=t.jsxs(Za,{active:"team",title:"Tim",breadcrumb:"tugas manusia · backlog → selesai",onNavigate:o,children:[Ha,t.jsx(YN,{projects:Xe,projectFilter:L,onProjectFilter:I,onToast:le,onOpenSpec:_=>a(Yt({section:"backlog",specId:_}))})]});else if(s==="triage")La=t.jsx(Za,{active:"triage",title:"Triase",breadcrumb:"keluhan · lapor → triase → backlog",onNavigate:o,children:t.jsx(JN,{projects:Xe,onToast:le,onAccepted:(_,W)=>{le(W?`Tiket sudah jadi ${_.id}`:`Diterima → ${_.id}`,"ok","arrow-up-right"),I(_.projectId),o("backlog")}})});else if(s==="prd")La=t.jsxs(Za,{active:"prd",title:"PRD",breadcrumb:"brief → brainstorm → dokumen",onNavigate:o,children:[Ha,Ja(Xe.length===0?t.jsx(ue,{kind:"empty",icon:"box",title:"Belum ada project",hint:"PRD butuh project dengan repoDir untuk menulis docs/prd/.",action:()=>F("project"),actionLabel:"Project baru"}):t.jsx(QI,{projects:Xe,projectFilter:L,onProjectFilter:I,onNewPrd:Ba,onTakeToBacklog:Rt,onStartBreakdown:Mt,onMaterialize:ri,dataVersion:b}))]});else if(s==="terminal")La=t.jsxs(Za,{active:"terminal",title:"Terminal",breadcrumb:"Claude Code · sesi interaktif",onNavigate:o,wide:!0,children:[Ha,Ja(Xe.length===0?t.jsx(ue,{kind:"empty",icon:"box",title:"Belum ada project",hint:"Terminal butuh project dengan repoDir untuk dijalankan.",action:()=>F("project"),actionLabel:"Project baru"}):t.jsx(QN,{userId:As.id,projects:Xe,backlog:p,focusSession:B,sessions:v,setSessions:y,startedSession:M,onStartedSessionHandled:rn,onStartBacklog:Gt,onOpenProject:l,onOpenReview:lt,onOpenSessionReview:dt,titleOf:_=>{var W;return(W=p.find(Y=>Y.id===_))==null?void 0:W.title},onIntegrate:wt,onIntegrateSession:wn,specOf:_=>p.find(W=>W.id===_)}))]});else if(s==="ide")La=t.jsxs(Za,{active:"ide",title:"IDE",breadcrumb:be?be.name:"workspace",onNavigate:o,wide:!0,children:[Ha,Ja(Xe.length===0?t.jsx(ue,{kind:"empty",icon:"box",title:"Belum ada project",hint:"IDE butuh project dengan repoDir.",action:()=>F("project"),actionLabel:"Project baru"}):t.jsx(ZN,{projects:Xe,projectId:be?be.id:Xe[0].id,onProject:_=>w(_),onToast:le,onGotoTerminal:Z}))]});else if(s==="vps")La=t.jsxs(Za,{active:"vps",title:"VPS",breadcrumb:"infra · audit → harden",onNavigate:o,children:[Ha,t.jsx(XN,{onToast:le,onGotoTerminal:Z})]});else if(s==="clients")La=t.jsxs(Za,{active:"clients",title:"Klien",breadcrumb:"device · sesi yang sedang berjalan",onNavigate:o,children:[Ha,t.jsx(J5,{view:We,specTitles:ge,onOpenSpec:lt,onToast:le})]});else if(s==="scheduler")La=t.jsxs(Za,{active:"scheduler",title:"Scheduler",breadcrumb:"otonom · jadwal → antrean → sesi",onNavigate:o,children:[Ha,t.jsx(eR,{projects:Xe,backlog:p,onProjectChanged:Pa,onToast:le,onGotoTerminal:Z})]});else if(s==="lead")La=t.jsxs(Za,{active:"lead",title:"Lead",breadcrumb:"otonom · keputusan → jejak → kendali",onNavigate:o,children:[Ha,t.jsx(aR,{projects:Xe,onProjectChanged:Pa,onToast:le,onGotoTerminal:Z})]});else if(s==="docs")La=t.jsxs(Za,{active:"docs",title:"Source of Truth",breadcrumb:be?be.name:"workspace",onNavigate:o,wide:!0,actions:be&&t.jsxs(t.Fragment,{children:[t.jsx($e,{size:"sm","aria-label":"Pilih project",value:be.id,onChange:_=>w(_.target.value),options:Xe.map(_=>({value:_.id,label:_.name}))}),t.jsx(sn,{label:`Aksi untuk project ${be.name}`,icon:"ellipsis",items:[{key:"delete",label:"Hapus project…",icon:"trash-2",tone:"danger",onSelect:()=>gt(be)}]})]}),children:[Ha,Ja(be?t.jsx(tR,{projectId:be.id,projectName:be.name,docStatus:be.docStatus}):t.jsx(ue,{kind:"empty",icon:"book-open",title:"Belum ada project",hint:"Source of Truth muncul setelah ada project yang dipantau.",action:()=>F("project"),actionLabel:"Project baru"}))]});else if(s==="review"){const _=(Ra==null?void 0:Ra.kind)==="session"?"terminal":"backlog",W=(Ra==null?void 0:Ra.kind)==="spec"?p.find(Y=>Y.id===Ra.id):void 0;La=t.jsxs(Za,{active:"backlog",title:"Review",wide:!0,onNavigate:o,breadcrumb:Ra?(Ra.kind==="session"?"terminal · ":"backlog · ")+Ra.id:"review",actions:t.jsx(U,{size:"sm",variant:"ghost",leftIcon:"arrow-left",onClick:()=>o(_),children:"Kembali"}),children:[Ha,Ja(Ra?t.jsx(nR,{specId:Ra.id,kind:Ra.kind,title:Ra.title,onBack:()=>o(_),onGoto:Y=>a(Yt(Y)),...(W==null?void 0:W.stage)==="done"?{onIntegrate:()=>sa(W),integrateTarget:W.branchFrom??void 0,onRevert:async(Y,je)=>{const V=await qe(W,"executing",je);return V&&"pending"in V?V:void 0},reviewed:!!W.reviewedAt,onMarkReviewed:(Y,je)=>on(W,je)}:{},...W&&W.stage!=="done"?{onDiscard:()=>za(W)}:{}}):t.jsx(ue,{kind:"empty",icon:"git-compare",title:"Pilih item untuk di-review",hint:"Buka Review dari Backlog atau dari sel sesi di Terminal.",action:()=>o("backlog"),actionLabel:"Ke Backlog"}))]})}else if(s==="qa"){const _=(n==null?void 0:n.projectId)??((Ms=m[0])==null?void 0:Ms.id);La=t.jsxs(Za,{active:"qa",title:"QA",wide:!0,onNavigate:o,breadcrumb:"qa · laporan per project",children:[Ha,Ja(t.jsx(iI,{projects:m,projectId:_,onSelectProject:W=>a(Yt({section:"qa",projectId:W})),onToast:le,onOpenSession:W=>{A(W),o("terminal")}},_??"none"))]})}else if(s==="skills"){const _=n!=null&&n.projectId?m.find(W=>W.id===n.projectId):void 0;La=t.jsx(Za,{active:"skills",title:"Skills",wide:!0,onNavigate:o,breadcrumb:n!=null&&n.projectId?`skills · ${(_==null?void 0:_.name)??n.projectId}`:"skills · global & project",actions:n!=null&&n.projectId?t.jsx(U,{size:"sm",variant:"ghost",leftIcon:"arrow-left",onClick:()=>l(n.projectId),children:"Kembali ke project"}):void 0,children:Ja(t.jsx(OM,{projectId:n==null?void 0:n.projectId,projectName:_==null?void 0:_.name,onToast:le},(n==null?void 0:n.projectId)??"all"))})}else s==="settings"&&(La=t.jsxs(Za,{active:"settings",title:"Settings",breadcrumb:"nafanesia.id · workspace",onNavigate:o,children:[Ha,di(t.jsx(iR,{onToast:le,me:As,onLoggedOut:ga}))]}));return t.jsx(vA,{user:As,onLoggedOut:ga,children:t.jsxs(i2,{showToast:le,onOpen:Nt,isViewing:Ct,children:[t.jsx(mT,{status:Je}),t.jsx(Ok.Provider,{value:it,children:t.jsx(Qc.Provider,{value:{clients:We.enabled},children:t.jsx(Jc.Provider,{value:ye,children:t.jsx(Fk.Provider,{value:Se?t.jsx(WN,{sessions:v,backlog:p,asks:T,onOpen:_=>{_.sessionId&&A(_.sessionId),o(_.section)}}):null,children:La})})})}),t.jsx(lR,{open:ae==="brief",onClose:()=>{F(null),ce(null)},projects:Xe,defaultProject:be?be.id:"",onCreate:li,prefill:X??void 0,specs:p})," ",se&&t.jsx(ff,{projects:Xe,defaultProject:se.project,lockProject:!0,prefill:{title:se.title,context:se.context,outcome:se.outcome},onClose:()=>Ce(null),onCreate:(_,W)=>{Ba(_,W,{branchFrom:se.branchFrom,fromAudit:se.fromAudit}),Ce(null)}}),t.jsx(dR,{open:ae==="project",onClose:()=>F(null),onCreate:Pt}),t.jsx(cR,{open:ae==="project-edit",project:be,onClose:()=>F(null),onSave:xn}),t.jsx(oR,{open:!!Ua,spec:Ua,onClose:()=>{jn(null),J(null)},onStarted:(_,W)=>{const Y=Ua;if(O==="terminal"&&Y){const je={id:_,projectId:Y.projectId,specId:Y.id,flow:ur(Y.source),cwd:"",exited:!1};K(je),A(_),y(V=>V.some(re=>re.id===_)?V:[...V,je])}le(((Y==null?void 0:Y.id)??"")+" · sesi "+_+(W?" dilanjutkan":" dimulai"),"info","play")},onError:_=>{const W=_ instanceof ha&&(_.status===400||_.status===422);le(((Ua==null?void 0:Ua.id)??"")+" · gagal mulai sesi"+(W?" · project belum punya repoDir":""),"warn","x-circle")}}),_e,ee.dialog,t.jsx(jE,{commands:Ya}),t.jsx(SE,{nav:ct}),t.jsx(Hc,{toast:Te})]})})}const sc={async getInfo(e){const a=await fetch(C.help(e));if(!a.ok)throw new Error("Help Center tak tersedia untuk project ini.");return a.json()},async submit(e,a){const n=await fetch(C.helpTickets(e),{method:"POST",body:a});if(n.status===429)throw new Error("Terlalu banyak permintaan. Coba lagi beberapa saat lagi.");if(n.status===404)throw new Error("Help Center tidak aktif untuk project ini.");if(!n.ok)throw new Error("Gagal mengirim keluhan. Pastikan semua isian wajib terisi.");const i=await n.json();if(typeof i.number!="number"||typeof i.statusPath!="string")throw new Error("Gagal mengirim keluhan. Silakan coba lagi.");return i},async status(e,a){const n=await fetch(C.helpStatus(e,a));if(!n.ok)throw new Error("Tiket tidak ditemukan.");return n.json()}},dd=3;function hR(e){const a=e.replace(/^\/+|\/+$/g,"").split("/");return a[0]!=="help"||!a[1]?null:a[2]==="status"&&a[3]?{slug:decodeURIComponent(a[1]),key:decodeURIComponent(a[3])}:{slug:decodeURIComponent(a[1])}}function os({children:e}){return t.jsx("div",{"data-testid":"public-help-scroll",className:"hn-dynamic-viewport hn-public",style:{height:"100dvh",minHeight:0,overflowY:"auto",overscrollBehavior:"contain",boxSizing:"border-box",background:"var(--bone-100)",padding:"max(40px, var(--safe-top)) max(16px, var(--safe-right)) max(40px, var(--safe-bottom)) max(16px, var(--safe-left))"},children:t.jsx("div",{className:"hn-public-page",children:e})})}function pR({slug:e,statusKey:a}){const[n,i]=c.useState(null),[r,s]=c.useState("loading"),o=c.useCallback(()=>{s("loading"),sc.status(e,a).then(l=>{i(l),s("ready")}).catch(()=>s("error"))},[e,a]);return c.useEffect(()=>{o()},[o]),t.jsx(os,{children:t.jsx(Sa,{eyebrow:"status keluhan",title:n?`Tiket #${n.number}`:"Status tiket",children:r==="loading"?t.jsx(ue,{kind:"loading"}):r==="error"||!n?t.jsx(ue,{kind:"error",title:"Status belum bisa dimuat",hint:"Periksa kembali link status Anda, lalu coba lagi.",action:o,actionLabel:"Coba lagi"}):t.jsxs("div",{className:"hn-public-form",children:[t.jsx("div",{children:t.jsx(pt,{status:Gd(n.status),size:"sm",children:n.status})}),t.jsx(Kd,{status:n.status}),t.jsx(db,{status:n.status}),t.jsxs("dl",{className:"hn-public-status-dl",children:[t.jsxs("div",{children:[t.jsx("dt",{children:"Kategori"}),t.jsx("dd",{children:js(n.category)})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Judul"}),t.jsx("dd",{children:n.title})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Dilaporkan"}),t.jsx("dd",{children:new Date(n.createdAt).toLocaleString("id-ID")})]})]})]})})})}function gR({slug:e}){const[a,n]=c.useState(null),[i,r]=c.useState("loading"),[s,o]=c.useState("bug"),[l,d]=c.useState(""),[u,m]=c.useState(""),[h,p]=c.useState(""),[g,f]=c.useState(""),[b,x]=c.useState([]),[v,y]=c.useState(!1),[T,S]=c.useState(null),[E,w]=c.useState(null),[N,R]=c.useState(!1),L=c.useCallback(()=>{r("loading"),sc.getInfo(e).then(O=>{n(O),o(O.categories[0]??"bug"),r("ready")}).catch(()=>r("error"))},[e]);c.useEffect(()=>{L()},[L]);const[I,B]=c.useState("");function A(O){O.preventDefault();const J=I.trim().split("/").pop()??I.trim();J&&(window.location.href=`/help/${encodeURIComponent(e)}/status/${encodeURIComponent(J)}`)}const M=async O=>{if(!navigator.clipboard){S("Salin tidak tersedia di browser ini. Pilih linknya lalu salin manual.");return}try{await navigator.clipboard.writeText(O),R(!0),window.setTimeout(()=>R(!1),2e3)}catch(J){S(or(J,"Link belum bisa disalin. Pilih linknya lalu salin manual."))}};async function K(O){O.preventDefault(),S(null),y(!0);try{const J=new FormData;J.set("category",s),J.set("title",l),J.set("detail",u),J.set("email",h),J.set("hc_trap",g);for(const te of b.slice(0,dd))J.append("files",te,te.name);const Z=await sc.submit(e,J),H=`${window.location.origin}${Z.statusPath}`;w({number:Z.number,statusUrl:H})}catch(J){S(or(J,"Keluhan belum terkirim. Coba lagi sebentar."))}finally{y(!1)}}return i==="loading"?t.jsx(os,{children:t.jsx(ue,{kind:"loading"})}):i==="error"||!a?t.jsx(os,{children:t.jsx(Sa,{title:"Help Center",children:t.jsx(ue,{kind:"error",title:"Belum bisa dibuka",hint:"Coba lagi sebentar. Jika tetap gagal, Help Center untuk project ini mungkin tidak aktif.",action:L,actionLabel:"Coba lagi"})})}):E?t.jsx(os,{children:t.jsx(Sa,{eyebrow:"terkirim",title:`Terima kasih — tiket #${E.number}`,children:t.jsxs("div",{className:"hn-public-form",children:[t.jsx("p",{className:"hn-public-lead",children:"Keluhan Anda sudah kami terima. Simpan link berikut untuk memantau perkembangannya."}),t.jsxs("div",{className:"hn-public-linkbox",children:[t.jsx("code",{className:"hn-public-code",children:E.statusUrl}),t.jsxs("div",{className:"hn-public-actions",children:[t.jsx(U,{size:"sm",leftIcon:"copy",onClick:()=>void M(E.statusUrl),children:N?"Tersalin":"Salin link"}),t.jsx(U,{size:"sm",variant:"ghost",onClick:()=>window.location.assign(E.statusUrl),children:"Buka status"})]})]})]})})}):t.jsxs(os,{children:[t.jsx(Sa,{eyebrow:"help center",title:`Lapor keluhan · ${a.projectName}`,children:t.jsxs("form",{onSubmit:K,className:"hn-public-form",children:[t.jsxs("div",{className:"hn-public-field",children:[t.jsx("label",{htmlFor:"hc-cat",className:"hn-public-label",children:"Kategori"}),t.jsx($e,{id:"hc-cat",size:"lg",value:s,onChange:O=>o(O.target.value),options:a.categories.map(O=>({value:O,label:js(O)}))})]}),t.jsxs("div",{className:"hn-public-field",children:[t.jsx("label",{htmlFor:"hc-title",className:"hn-public-label",children:"Judul"}),t.jsx("input",{id:"hc-title",className:"hn-public-input",value:l,onChange:O=>d(O.target.value),required:!0,maxLength:200,placeholder:"mis. Tombol Simpan tidak berfungsi di HP"})]}),t.jsxs("div",{className:"hn-public-field",children:[t.jsx("label",{htmlFor:"hc-detail",className:"hn-public-label",children:"Detail"}),t.jsx("textarea",{id:"hc-detail",className:"hn-public-input",value:u,onChange:O=>m(O.target.value),required:!0,maxLength:1e4,rows:6,placeholder:"mis. Buka halaman Pesanan di HP, tekan Simpan — layar diam dan datanya tidak tersimpan. Jangan sertakan data sensitif (kata sandi, dsb)."})]}),t.jsxs("div",{className:"hn-public-field",children:[t.jsx("label",{htmlFor:"hc-email",className:"hn-public-label",children:"Email Anda"}),t.jsx("input",{id:"hc-email",className:"hn-public-input",type:"email",value:h,onChange:O=>p(O.target.value),required:!0,maxLength:200,placeholder:"nama@contoh.id"})]}),t.jsxs("div",{className:"hn-public-field",children:[t.jsxs("label",{htmlFor:"hc-files",className:"hn-public-label",children:["Lampiran gambar (opsional, maks ",dd,")"]}),t.jsxs("div",{className:"hn-public-file",children:[t.jsx("input",{id:"hc-files",className:"hn-public-file-input",type:"file",accept:"image/png,image/jpeg,image/webp",multiple:!0,onChange:O=>x(Array.from(O.target.files??[]).slice(0,dd))}),t.jsx("label",{htmlFor:"hc-files",className:"hn-public-file-btn","aria-hidden":"true",children:"Pilih berkas"}),t.jsx("span",{className:"hn-public-files","aria-live":"polite",children:b.length>0?b.map(O=>O.name).join(", "):"Belum ada berkas dipilih"})]})]}),t.jsx("input",{tabIndex:-1,autoComplete:"new-password","aria-hidden":!0,value:g,onChange:O=>f(O.target.value),name:"hc_trap",style:{position:"absolute",left:"-9999px",width:1,height:1}}),T&&t.jsx("p",{role:"alert",className:"hn-portal-error",children:T}),t.jsx("div",{className:"hn-portal-foot",children:t.jsx(U,{type:"submit",disabled:v,loading:v,leftIcon:"send",children:"Kirim keluhan"})})]})}),t.jsx(Sa,{eyebrow:"sudah pernah lapor?",title:"Cek status keluhan",children:t.jsxs("form",{onSubmit:A,className:"hn-public-check",children:[t.jsxs("div",{className:"hn-public-field",children:[t.jsx("label",{htmlFor:"hc-check",className:"hn-public-label",children:"Kode status atau link"}),t.jsx("input",{id:"hc-check",className:"hn-public-input",value:I,onChange:O=>B(O.target.value),placeholder:"mis. a1b2c3d4e5f6, atau tempel link statusnya"})]}),t.jsx(U,{type:"submit",variant:"secondary",disabled:!I.trim(),children:"Cek status"})]})})]})}function kR(){const e=hR(window.location.pathname);return e?e.key?t.jsx(pR,{slug:e.slug,statusKey:e.key}):t.jsx(gR,{slug:e.slug}):t.jsx(os,{children:t.jsx(Sa,{title:"Help Center",children:t.jsx(ue,{kind:"error",title:"Halaman tidak ditemukan",hint:"Link Help Center tidak valid."})})})}const bR=window.location.pathname.startsWith("/help/");yp(document.getElementById("root")).render(t.jsx(c.StrictMode,{children:bR?t.jsx(kR,{}):t.jsx(uR,{})}));export{C as $,wA as A,U as B,ft as C,Dn as D,Cg as E,tk as F,EL as G,Ma as H,Re as I,Vc as J,Lk as K,bk as L,la as M,uL as N,sn as O,ms as P,qE as Q,Zt as R,Lc as S,Tg as T,tl as U,Wc as V,Nk as W,en as X,pt as Y,xr as Z,HL as _,mL as a,AR as a$,E2 as a0,xt as a1,jr as a2,Ax as a3,ER as a4,TR as a5,bd as a6,ZE as a7,QE as a8,nb as a9,NL as aA,j5 as aB,pn as aC,ur as aD,ou as aE,mI as aF,rk as aG,Sa as aH,vs as aI,ML as aJ,Wb as aK,Bo as aL,ll as aM,Gk as aN,Kk as aO,E5 as aP,ws as aQ,dL as aR,PL as aS,IL as aT,gL as aU,cL as aV,ps as aW,Mi as aX,kL as aY,bg as aZ,SR as a_,vv as aa,Yo as ab,Jo as ac,Vo as ad,Hg as ae,lL as af,ha as ag,oL as ah,wr as ai,nT as aj,Zc as ak,LL as al,Fc as am,XE as an,DL as ao,Ii as ap,_L as aq,AL as ar,yP as as,vP as at,TL as au,RL as av,xP as aw,Ah as ax,$L as ay,Ob as az,al as b,tb as b$,nx as b0,el as b1,YE as b2,tx as b3,_R as b4,pL as b5,Oc as b6,Q2 as b7,Z2 as b8,hL as b9,ZR as bA,XR as bB,eL as bC,aL as bD,tL as bE,nL as bF,iL as bG,sL as bH,rL as bI,bL as bJ,uv as bK,ev as bL,Zy as bM,Ry as bN,bc as bO,Av as bP,Sy as bQ,_v as bR,wv as bS,Tp as bT,jv as bU,Qp as bV,ys as bW,Jp as bX,yv as bY,kn as bZ,ek as b_,xv as ba,vr as bb,SL as bc,yL as bd,vL as be,wL as bf,fL as bg,xL as bh,jL as bi,CL as bj,Rh as bk,Yt as bl,DR as bm,OR as bn,HR as bo,qR as bp,UR as bq,zR as br,FR as bs,GR as bt,KR as bu,WR as bv,VR as bw,YR as bx,JR as by,QR as bz,At as c,Mu as c0,e2 as c1,cc as c2,Ci as c3,Eg as c4,Tc as c5,Ox as c6,$x as c7,BR as c8,LR as c9,RR as ca,PR as cb,Dx as cc,MR as cd,NR as ce,IR as cf,CR as cg,wR as ch,nf as ci,uT as cj,OL as ck,M5 as cl,Fp as cm,jR as cn,hc as co,JE as cp,ot as d,oe as e,Oe as f,$e as g,ne as h,ba as i,t as j,nc as k,Kn as l,ue as m,ra as n,yr as o,mk as p,Da as q,bi as r,ai as s,$R as t,l2 as u,xs as v,j2 as w,x2 as x,yI as y,Hc as z};
|