hanoman 0.9.32 → 0.9.33
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/dist/cli.js +240 -130
- package/dist/server.js +21995 -20480
- package/package.json +1 -1
- package/prisma/migrations/20261020120000_lead_session_inbox/migration.sql +42 -0
- package/prisma/schema.prisma +46 -0
- package/web/assets/{DalangHanomanScreen-DdsEmtBl.js → DalangHanomanScreen-DAXIQxrw.js} +1 -1
- package/web/assets/{DocPreviewModal-BbOqdfaH.js → DocPreviewModal-Cu0UFzPH.js} +1 -1
- package/web/assets/{DocsWorkspace-Cr7AXz9z.js → DocsWorkspace-DElNcoar.js} +1 -1
- package/web/assets/{IdeScreen-hdbQW-ui.js → IdeScreen-BBr567gf.js} +1 -1
- package/web/assets/LeadScreen-CYn8RS3H.js +1 -0
- package/web/assets/{ReviewScreen-BIkpEspG.js → ReviewScreen-zAvwSL50.js} +1 -1
- package/web/assets/{SchedulerScreen-3KVE-d_d.js → SchedulerScreen-BptlSAOx.js} +1 -1
- package/web/assets/{SettingsScreen-B0-W2TeR.js → SettingsScreen-a0Cx4M4j.js} +3 -3
- package/web/assets/{TeamScreen-DNdt2P1g.js → TeamScreen-Cm_phItS.js} +1 -1
- package/web/assets/{TerminalScreen-BjQF48XI.js → TerminalScreen-CFuNRq6d.js} +1 -1
- package/web/assets/{TriageScreen-CzM99CrG.js → TriageScreen-ChTidhCT.js} +1 -1
- package/web/assets/{VpsScreen-SGB_BpbS.js → VpsScreen-8vz0QHO-.js} +1 -1
- package/web/assets/{fields-of8G961J.js → fields-Bhl01LnE.js} +1 -1
- package/web/assets/{index-C5P4ykKO.js → index-R2HBkTbR.js} +207 -207
- package/web/assets/{live-DQen7wLm.js → live-V9nWiHoE.js} +1 -1
- package/web/assets/{sched-lead-shared-C34TvLVv.js → sched-lead-shared-Dr48bY7n.js} +1 -1
- package/web/assets/{settings-rebase-DHIWk4mV.js → settings-rebase-DOqNAynI.js} +1 -1
- package/web/index.html +1 -1
- package/web/assets/LeadScreen-BWE4mfJI.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{T as ra,a as Pa,b as Ba,j as a,c as Se,O as oa,P as me,I as q,d as ca,M as we,e as $,f as Y,g as B,H as Aa,B as U,h as D,i as Ce,k as He,E as Ra,s as _a,C as Ua,m as W,n as Ze,o as ke,p as Fa,q as X,r as Ye,t as Ka,v as za,w as Ga,x as Ha,y as Za,z as Ya,A as Va,D as xe,G as Wa}from"./index-C5P4ykKO.js";import{R as d}from"./react-DfGhg7ZW.js";import{L as qa}from"./live-DQen7wLm.js";import"./markdown-CWEY34jk.js";import"./xterm-3VOAfa_q.js";const Ja=Pa,Z=ra.map(e=>({key:e,label:Ja[e]})),Qa=()=>Object.fromEntries(ra.map(e=>[e,[]])),Ne=(e,t)=>e!==t,da=e=>e.length===0?0:e.reduce((t,n)=>n.order>t?n.order:t,-1/0)+1;function Xa(e,t,n,l){if(!Ne(n,l))return null;const r=e[n].find(f=>f.id===t);if(!r)return null;const o={status:l,order:da(e[l])},u={...e};return u[n]=e[n].filter(f=>f.id!==t),u[l]=[...e[l],{...r,...o}],{board:u,patch:o}}function ye(e,t){const n={...e};return n[t.status]=e[t.status].map(l=>l.id===t.id?t:l),n}const Ve=e=>e?e.slice(0,10):"",We=e=>/^\d{4}-\d{2}-\d{2}$/.test(e)?`${e}T12:00:00.000Z`:null,J=864e5,se=e=>Math.floor(e/J)*J,qe=e=>{if(!e)return null;const t=new Date(e).getTime();return Number.isFinite(t)?t:null};function ee(e){const t=qe(e.startDate),n=qe(e.dueDate);if(t===null&&n===null)return null;const l=t??n,r=n??t;return{start:se(Math.min(l,r)),end:se(Math.max(l,r))+J,invalid:r<l}}const et=new Intl.DateTimeFormat("id-ID",{day:"numeric",month:"short",timeZone:"UTC"}),Je=e=>e?et.format(new Date(e)):null;function ue(e){const t=Je(e.startDate),n=Je(e.dueDate);return t&&n?`${t} → ${n}`:n?`→ ${n}`:t}const Qe=["day","week","month"],ua={day:{cell:34,minTicks:14},week:{cell:56,minTicks:8},month:{cell:84,minTicks:6}},at=e=>ua[e].cell,tt=120,nt=(e,t)=>{const n=se(e);if(t==="day")return n;if(t==="week")return n-(new Date(n).getUTCDay()+6)%7*J;const l=new Date(n);return Date.UTC(l.getUTCFullYear(),l.getUTCMonth(),1)},st=(e,t)=>{if(t==="day")return e+J;if(t==="week")return e+7*J;const n=new Date(e);return Date.UTC(n.getUTCFullYear(),n.getUTCMonth()+1,1)},lt=new Intl.DateTimeFormat("id-ID",{day:"numeric",timeZone:"UTC"}),Xe=new Intl.DateTimeFormat("id-ID",{day:"numeric",month:"short",timeZone:"UTC"}),it=new Intl.DateTimeFormat("id-ID",{month:"short",timeZone:"UTC"}),rt=new Intl.DateTimeFormat("id-ID",{month:"short",year:"2-digit",timeZone:"UTC"}),ot=(e,t)=>{const n=new Date(e);return t==="day"?n.getUTCDate()===1:t==="week"?n.getUTCDate()<=7:n.getUTCMonth()===0},ct=(e,t,n)=>{const l=new Date(e);return t==="day"?(n?Xe:lt).format(l):t==="week"?Xe.format(l):(n?rt:it).format(l)};function ma(e,t,n){const l=se(n);let r=l,o=l+J;for(const b of e)b.start<r&&(r=b.start),b.end>o&&(o=b.end);const u=nt(r,t),{minTicks:f}=ua[t],p=[];let i=u;for(;p.length<tt&&(i<o||p.length<f);){const b=ot(i,t);p.push({start:i,label:ct(i,t,b),major:b}),i=st(i,t)}return{from:u,to:i,zoom:t,ticks:p}}function ha(e,t){const n=t.to-t.from;if(n<=0||e.end<=t.from||e.start>=t.to)return null;const l=Math.max(e.start,t.from),r=Math.min(e.end,t.to);return{left:(l-t.from)/n*100,width:(r-l)/n*100,clippedStart:e.start<t.from,clippedEnd:e.end>t.to,invalid:e.invalid}}function Ie(e,t){const n=ee(e);return n?ha(n,t):null}function dt(e){let t=1/0,n=-1/0,l=!1;for(const r of e){const o=ee(r);o&&(o.start<t&&(t=o.start),o.end>n&&(n=o.end),o.invalid&&(l=!0))}return t===1/0?null:{start:t,end:n,invalid:l}}function ut(e,t){const n=se(t);return n<e.from||n>=e.to?null:(n-e.from)/(e.to-e.from)*100}function mt(e,t){const n=[],l=[],r=[];for(const o of e){const u=ee(o);if(!u){l.push(o);continue}const f=Ie(o,t);if(!f){r.push(o);continue}n.push({task:o,geometry:f,start:u.start})}return n.sort((o,u)=>o.start-u.start||o.task.title.localeCompare(u.task.title,"id")||o.task.id.localeCompare(u.task.id)),{rows:n.map(({task:o,geometry:u})=>({task:o,geometry:u})),unscheduled:l,outside:r}}const ea=(e,t)=>e.title.localeCompare(t.title,"id")||e.id.localeCompare(t.id);function ht(e,t,n){const l=Symbol("no-project"),r=new Map;for(const p of e){const i=p.projectId??l,b=r.get(i);b?b.tasks.push(p):r.set(i,{projectId:p.projectId,tasks:[p]})}const o=[...r.values()].map(({projectId:p,tasks:i})=>{const b=dt(i),m=[],k=[];for(const S of i){const j=ee(S);j?m.push({task:S,start:j.start}):k.push(S)}return m.sort((S,j)=>S.start-j.start||ea(S.task,j.task)),k.sort(ea),{projectId:p,span:b,geometry:b?ha(b,t):null,tasks:[...m.map(S=>S.task),...k]}}),u=p=>p.geometry?0:p.span?1:2,f=p=>p.projectId===null?[1,""]:[0,p.projectId];return o.sort((p,i)=>{const[b,m]=f(p),[k,S]=f(i);return u(p)-u(i)||(p.span&&i.span?p.span.start-i.span.start:0)||n(p.projectId).localeCompare(n(i.projectId),"id")||b-k||m.localeCompare(S)}),o}const pt={tinggi:"high",sedang:"mid",rendah:"low"};function gt({priority:e}){const t=pt[e]??"mid",n=me[e]??e;return a.jsx("span",{className:`hn-tm-prio hn-tm-prio-${t}`,title:`Prioritas ${n}`,children:a.jsxs("span",{className:"hn-sr-only",children:["Prioritas ",n]})})}function bt({name:e}){if(!e)return a.jsx("span",{className:"hn-tm-avatar hn-tm-avatar-empty","aria-hidden":"true",children:a.jsx(q,{name:"user",size:12})});const t=e.split(/\s+/).filter(Boolean).slice(0,2).map(n=>n[0].toUpperCase()).join("");return a.jsx("span",{className:"hn-tm-avatar","aria-hidden":"true",children:t||"?"})}function ft(e,t,n){const l=[...Z.filter(r=>r.key!==e.status).map(r=>({key:`move-${r.key}`,label:`Pindah ke ${r.label}`,onSelect:()=>n.onMove(e,r.key)})),...t.map(r=>({key:`assign-${r.id}`,label:`Tugaskan ke ${r.name}`,disabled:e.memberId===r.id,onSelect:()=>n.onAssign(e,r.id)})),{key:"assign-none",label:"Kosongkan penugasan",disabled:!e.memberId,onSelect:()=>n.onAssign(e,null)}];if(e.specId){if(e.spec&&n.onOpenSpec){const r=e.specId;l.push({key:"open-spec",label:`Buka ${e.spec.id} di Backlog`,onSelect:()=>{var o;return(o=n.onOpenSpec)==null?void 0:o.call(n,r)}})}l.push({key:"unlink",label:e.spec?"Lepas tautan":"Lepas tautan (spec tak ditemukan)",onSelect:()=>n.onUnlink(e)})}else l.push({key:"escalate",label:"Kirim ke Backlog",onSelect:()=>n.onEscalate(e)});return l}function jt({task:e,members:t,projectName:n,dragging:l,onDragStart:r,onDragEnd:o,onOpen:u,onMove:f,onAssign:p,onEscalate:i,onUnlink:b,onOpenSpec:m}){var C;const k=((C=t.find(h=>h.id===e.memberId))==null?void 0:C.name)??null,S=ft(e,t,{onMove:f,onAssign:p,onEscalate:i,onUnlink:b,onOpenSpec:m}),j=e.projectId===null?"tanpa project":n??"project tak dikenal";return a.jsxs("div",{draggable:!0,"data-testid":`team-card-${e.id}`,className:"hn-tm-card","data-dragging":l||void 0,title:`Project: ${j}`,onDragStart:h=>{h.dataTransfer.effectAllowed="move",h.dataTransfer.setData("text/plain",e.id),r()},onDragEnd:o,children:[a.jsxs("div",{className:"hn-tm-card-head",children:[a.jsx(gt,{priority:e.priority}),a.jsx("button",{type:"button",className:"hn-tm-title",onClick:()=>u(e),children:e.title})]}),a.jsx("span",{className:"hn-tm-project","data-empty":e.projectId===null||void 0,children:j}),a.jsxs("div",{className:"hn-tm-card-foot",children:[a.jsxs("span",{className:"hn-tm-assignee-wrap",children:[a.jsx(bt,{name:k}),a.jsx("span",{className:"hn-tm-assignee",children:k??"belum ditugaskan"})]}),a.jsx(oa,{label:`Ubah tugas: ${e.title}`,icon:"ellipsis",items:S})]})]})}function kt({board:e,totals:t,columns:n,members:l,projects:r=[],onMove:o,onAssign:u,onOpen:f,onEscalate:p,onUnlink:i,onOpenSpec:b}){var T;const[m,k]=d.useState(null),[S,j]=d.useState(null),C=Ba(),[h,N]=d.useState(((T=n[0])==null?void 0:T.key)??"backlog"),M=d.useMemo(()=>{const c=new Map(r.map(y=>[y.id,y.name]));return y=>y===null?null:c.get(y)??null},[r]),A=c=>{m&&Ne(m.from,c)&&o(m.task,c),k(null),j(null)},g=(c,y)=>a.jsx(jt,{task:c,members:l,projectName:M(c.projectId),dragging:(m==null?void 0:m.task.id)===c.id,onDragStart:()=>k({task:c,from:y}),onDragEnd:()=>{k(null),j(null)},onOpen:f,onMove:o,onAssign:u,onEscalate:p,onUnlink:i,onOpenSpec:b},c.id);if(C==="mobile"){const c=n.find(I=>I.key===h)??n[0];if(!c)return null;const y=e[c.key],L=Math.max(0,(t[c.key]??0)-y.length);return a.jsxs("div",{"data-testid":"team-board","data-layout":"mobile",className:"hn-tm-mobile",children:[a.jsx(Se,{variant:"pill","aria-label":"Kolom papan tim",value:c.key,onChange:I=>N(I),tabs:n.map(I=>({value:I.key,label:`${I.label} · ${e[I.key].length}`}))}),a.jsxs("div",{"data-testid":`team-col-${c.key}`,className:"hn-tm-col-stack",children:[y.map(I=>g(I,c.key)),y.length===0&&a.jsxs("div",{className:"hn-tm-empty-col",children:["Tak ada tugas di ",c.label,"."]}),L>0&&a.jsxs("div",{className:"hn-tm-hidden-note",children:["menampilkan ",y.length," dari ",t[c.key]," — persempit penyaring"]})]})]})}return a.jsx("div",{"data-testid":"team-board",className:"hn-board-local-overflow hn-tm-board",children:n.map(c=>{const y=e[c.key],L=!!m&&Ne(m.from,c.key),I=L&&S===c.key,K=Math.max(0,(t[c.key]??0)-y.length);return a.jsxs("div",{"data-testid":`team-col-${c.key}`,className:"hn-tm-col","data-active":L||void 0,"data-hot":I||void 0,"data-dimmed":m&&!L||void 0,onDragOver:v=>{L&&(v.preventDefault(),v.dataTransfer.dropEffect="move",j(c.key))},onDragLeave:()=>j(v=>v===c.key?null:v),onDrop:v=>{v.preventDefault(),A(c.key)},children:[a.jsxs("div",{className:"hn-tm-col-head",children:[a.jsx("span",{className:"hn-eyebrow",children:c.label}),a.jsx("span",{className:"hn-tm-col-count",children:y.length})]}),a.jsx("div",{className:"hn-tm-col-body",children:y.map(v=>g(v,c.key))}),K>0&&a.jsxs("div",{className:"hn-tm-hidden-note",children:["menampilkan ",y.length," dari ",t[c.key]," — persempit penyaring"]})]},c.key)})})}const ve=232,xt={brass:"var(--brass-500)",err:"var(--status-err)",muted:"var(--border-strong)",envelope:"var(--border-hair)"},Te=e=>e;function yt({spec:e}){const t=e.geometry,n=xt[e.tone],l=!!e.onClick,r={"data-testid":`timeline-bar-${e.key}`,"data-tone":e.tone,"data-invalid":t.invalid?"true":"false","data-clipped-start":t.clippedStart?"true":"false","data-clipped-end":t.clippedEnd?"true":"false",title:e.title,"aria-label":e.title,onClick:e.onClick,className:"hn-tl-bar",style:Te({"--tl-left":`${t.left}%`,"--tl-width":`${t.width}%`})},o=a.jsxs(a.Fragment,{children:[t.invalid&&a.jsx(q,{name:"triangle-alert",size:11,color:n}),t.clippedStart&&a.jsx(q,{name:"chevron-left",size:11,color:n}),a.jsx("span",{className:"hn-grow"}),t.clippedEnd&&a.jsx(q,{name:"chevron-right",size:11,color:n})]});return l?a.jsx("button",{type:"button",...r,children:o}):a.jsx("div",{role:"img",...r,children:o})}function pa({envelope:e=!1}){const t=n=>a.jsx("span",{"aria-hidden":"true",className:"hn-tl-swatch","data-tone":n});return a.jsxs("ul",{"aria-label":"Legenda linimasa",className:"hn-tl-legend",children:[a.jsxs("li",{className:"hn-tl-legend-item",children:[t("brass"),"Rencana"]}),a.jsxs("li",{className:"hn-tl-legend-item",children:[t("muted"),"Selesai"]}),a.jsxs("li",{className:"hn-tl-legend-item",children:[t("err"),a.jsx(q,{name:"triangle-alert",size:11,color:"var(--status-err)"}),"Tenggat mendahului mulai"]}),e&&a.jsxs("li",{className:"hn-tl-legend-item",children:[t("envelope"),"Rentang project (buka lewat namanya)"]})]})}function ga({window:e,rows:t,today:n,emptyHint:l,testId:r,labelHead:o}){const u=at(e.zoom),f=e.ticks.length*u,p=ut(e,n);return a.jsx("div",{"data-testid":r??"team-timeline",className:"hn-timeline-scroll hn-tl-scroll",children:a.jsxs("div",{"data-testid":"timeline-canvas",className:"hn-tl",style:Te({"--tl-label-w":`${ve}px`,"--tl-cell":`${u}px`,"--tl-ticks":String(e.ticks.length),"--tl-track-w":`${f}px`,"--tl-canvas-w":`${ve+f}px`}),children:[a.jsxs("div",{className:"hn-tl-head",children:[a.jsx("div",{className:"hn-tl-label",children:a.jsx("span",{className:"hn-eyebrow",children:o??"Tugas"})}),a.jsx("div",{className:"hn-tl-ticks",children:e.ticks.map(i=>a.jsx("div",{"data-testid":"timeline-tick","data-major":i.major?"true":"false",className:"hn-tl-tick",children:i.label},i.start))})]}),t.length===0?a.jsx("div",{"data-testid":"timeline-empty",className:"hn-tl-empty",children:l??"Tak ada yang bisa dihamparkan di jendela ini."}):t.map(i=>a.jsxs("div",{"data-testid":`timeline-row-${i.key}`,className:"hn-tl-row",children:[a.jsxs("div",{className:"hn-tl-label",children:[a.jsx("div",{className:"hn-tl-label-text",children:i.label}),i.meta&&a.jsx("div",{className:"hn-tl-label-meta",children:i.meta})]}),a.jsx("div",{className:"hn-tl-track",children:i.bars.map(b=>a.jsx(yt,{spec:b},b.key))})]},i.key)),p!==null&&a.jsx("div",{"data-testid":"timeline-today","aria-hidden":"true",className:"hn-tl-today",style:Te({"--tl-today-x":`${ve+p/100*f}px`})})]})})}function aa({testId:e,icon:t,title:n,hint:l,tasks:r,onOpen:o}){return r.length===0?null:a.jsxs("div",{"data-testid":e,className:"hn-tl-aside",children:[a.jsxs("div",{className:"hn-tl-aside-head",children:[a.jsx(q,{name:t,size:13,color:"var(--text-subtle)"}),a.jsxs("span",{className:"hn-eyebrow",children:[n," · ",r.length]}),l&&a.jsx("span",{className:"hn-tl-aside-hint",children:l})]}),a.jsx("div",{className:"hn-tl-aside-list",children:r.map(u=>a.jsx("button",{type:"button",onClick:()=>o(u),className:"hn-tl-chip",children:u.title},u.id))})]})}function vt({tasks:e,members:t,zoom:n,today:l,hidden:r,onOpen:o}){const u=d.useMemo(()=>{const m=e.map(ee).filter(k=>k!==null);return ma(m,n,l)},[e,n,l]),{rows:f,unscheduled:p,outside:i}=d.useMemo(()=>mt(e,u),[e,u]),b=d.useMemo(()=>f.map(({task:m,geometry:k})=>{var h;const S=((h=t.find(N=>N.id===m.memberId))==null?void 0:h.name)??"belum ditugaskan",j=ue(m),C=[k.invalid?"tenggat mendahului mulai":null,k.clippedStart||k.clippedEnd?"melewati tepi jendela":null].filter(Boolean);return{key:m.id,label:m.title,meta:j?`${S} · ${j}`:S,bars:[{key:m.id,geometry:k,tone:k.invalid?"err":m.status==="done"?"muted":"brass",title:[m.title,j,...C].filter(Boolean).join(" · "),onClick:()=>o(m)}]}}),[f,t,o]);return a.jsxs(a.Fragment,{children:[a.jsx(pa,{}),a.jsx(ga,{window:u,rows:b,today:l,emptyHint:"Belum ada tugas bertanggal — isi mulai atau tenggat di kartunya."}),r>0&&a.jsxs("div",{"data-testid":"timeline-truncated",className:"hn-tl-note",children:[r," tugas tak termuat karena plafon 200 per kolom — persempit penyaring"]}),a.jsx(aa,{testId:"timeline-unscheduled",icon:"calendar-off",title:"Belum dijadwalkan",tasks:p,onOpen:o}),a.jsx(aa,{testId:"timeline-outside",icon:"chevrons-left-right",title:"Di luar jendela",hint:"pilih zoom yang lebih lebar",tasks:i,onOpen:o})]})}const St="__none__",ta=(e,t)=>t.invalid?"err":e.status==="done"?"muted":"brass",na=(e,t,n)=>[e.title,n,t.invalid?"tenggat mendahului mulai":null,t.clippedStart||t.clippedEnd?"melewati tepi jendela":null].filter(Boolean).join(" · ");function Ct({testId:e,open:t,name:n,count:l,onClick:r}){return a.jsxs("button",{type:"button",onClick:r,"data-testid":e,"aria-expanded":t,className:"hn-tl-expand",children:[a.jsx(q,{name:t?"chevron-down":"chevron-right",size:12,color:"var(--text-subtle)"}),a.jsx("span",{className:"hn-tl-expand-name",children:n}),a.jsx("span",{className:"hn-tl-expand-count",children:l})]})}function Nt({tasks:e,projects:t,members:n,zoom:l,today:r,hidden:o,expanded:u,onToggle:f,onOpen:p}){const i=d.useMemo(()=>{const j=e.map(ee).filter(C=>C!==null);return ma(j,l,r)},[e,l,r]),b=d.useCallback(j=>{var C;return j===null?"Tanpa project":((C=t.find(h=>h.id===j))==null?void 0:C.name)??j},[t]),m=d.useMemo(()=>ht(e,i,b),[e,i,b]),k=d.useMemo(()=>new Set(u),[u]),S=d.useMemo(()=>{var C;const j=[];for(const h of m){const N=h.projectId??St,M=k.has(N),A=b(h.projectId),g=h.geometry?ue({startDate:new Date(h.span.start).toISOString(),dueDate:new Date(h.span.end-1).toISOString()}):h.span?"di luar jendela · pilih zoom yang lebih lebar":"belum dijadwalkan",T=[];if(h.geometry){T.push({key:`span:${N}`,geometry:h.geometry,tone:h.geometry.invalid?"err":"envelope",title:`${A} · ${g??""}`.trim()});for(const c of h.tasks){const y=Ie(c,i);y&&T.push({key:`seg:${c.id}`,geometry:y,tone:ta(c,y),title:na(c,y,ue(c)),onClick:()=>p(c)})}}if(j.push({key:`p:${N}`,meta:g,bars:T,label:a.jsx(Ct,{testId:`expand-${N}`,open:M,name:A,count:h.tasks.length,onClick:()=>f(N)})}),!!M)for(const c of h.tasks){const y=Ie(c,i),L=((C=n.find(K=>K.id===c.memberId))==null?void 0:C.name)??"belum ditugaskan",I=ue(c);j.push({key:`t:${c.id}`,label:a.jsx("span",{className:"hn-tl-child",children:c.title}),meta:I?`${L} · ${I}`:L,bars:y?[{key:`t:${c.id}`,geometry:y,tone:ta(c,y),title:na(c,y,I),onClick:()=>p(c)}]:[]})}}return j},[m,k,b,i,n,f,p]);return a.jsxs(a.Fragment,{children:[a.jsx(pa,{envelope:!0}),a.jsx(ga,{window:i,rows:S,today:r,testId:"team-projects",labelHead:"Project",emptyHint:"Belum ada project bertanggal — isi mulai atau tenggat di kartunya."}),o>0&&a.jsxs("div",{"data-testid":"projects-truncated",className:"hn-tl-note",children:[o," tugas tak termuat karena plafon 200 per kolom — amplop project bisa lebih pendek dari rentang sebenarnya; persempit kolom, anggota, atau pencarian"]})]})}const It=Object.keys(me).map(e=>({value:e,label:me[e]})),sa=(e,t)=>({title:(e==null?void 0:e.title)??"",detail:(e==null?void 0:e.detail)??"",projectId:e?e.projectId??"":t??"",status:(e==null?void 0:e.status)??"backlog",priority:e&&e.priority in me?e.priority:"sedang",memberId:(e==null?void 0:e.memberId)??"",startDate:Ve((e==null?void 0:e.startDate)??null),dueDate:Ve((e==null?void 0:e.dueDate)??null)});function Tt({open:e,task:t,projects:n,members:l,defaultProjectId:r,orderFor:o,onClose:u,onSaved:f,onToast:p}){const[i,b]=d.useState(()=>sa(t,r)),[m,k]=d.useState(!1),{confirm:S,dialog:j}=ca(),C=`${e?"1":"0"}:${(t==null?void 0:t.id)??""}`,h=d.useRef(C);if(h.current!==C&&(h.current=C,e&&b(sa(t,r))),!e)return null;const N=g=>b(T=>({...T,...g}));async function M(){if(!i.title.trim()){p("Judul tugas wajib diisi","err","x-circle");return}k(!0);const g=!t||t.status!==i.status,T={title:i.title.trim(),detail:i.detail.trim()||null,projectId:i.projectId||null,status:i.status,priority:i.priority,memberId:i.memberId||null,startDate:We(i.startDate),dueDate:We(i.dueDate),...g?{order:o(i.status)}:{}};try{t?await D.patchTask(t.id,T):await D.createTask(T),p(t?"Tugas diperbarui":"Tugas dibuat","ok","check"),f(),u()}catch(c){p(Ce("menyimpan tugas",c),"err","x-circle")}finally{k(!1)}}async function A(){if(t){try{if(!await S({title:`Hapus "${t.title}"?`,impact:["Kartu ini hilang dari papan di semua device yang tersinkron."],confirmLabel:"Hapus tugas",tone:"danger",icon:"trash-2",run:async()=>{k(!0);try{await D.deleteTask(t.id)}finally{k(!1)}}}))return}catch(g){p(Ce("menghapus tugas",g),"err","x-circle");return}p("Tugas dihapus","ok","trash-2"),f(),u()}}return a.jsxs(a.Fragment,{children:[a.jsxs(we,{open:e,onClose:m?void 0:u,icon:"clipboard-list",eyebrow:"Papan tim",title:t?"Ubah tugas":"Tugas baru",footer:a.jsxs("div",{style:{display:"flex",gap:8,width:"100%",alignItems:"center"},children:[t&&a.jsx(U,{variant:"ghost",leftIcon:"trash-2",onClick:A,disabled:m,children:"Hapus"}),a.jsx("span",{style:{flex:1}}),a.jsx(U,{variant:"secondary",onClick:u,disabled:m,children:"Batal"}),a.jsx(U,{onClick:M,loading:m,children:t?"Simpan":"Buat tugas"})]}),children:[a.jsx($,{label:"Judul",children:a.jsx(Y,{value:i.title,"aria-label":"Judul tugas",placeholder:"mis. Rapikan halaman harga",onChange:g=>N({title:g.target.value}),style:{width:"100%"}})}),a.jsxs("div",{style:{display:"flex",gap:10,flexWrap:"wrap"},children:[a.jsx($,{label:"Project",children:a.jsx(B,{value:i.projectId,"aria-label":"Project tugas",onChange:g=>N({projectId:g.target.value}),options:[{value:"",label:"Tanpa project"},...n.map(g=>({value:g.id,label:g.name}))]})}),a.jsx($,{label:"Kolom",children:a.jsx(B,{value:i.status,"aria-label":"Kolom tugas",onChange:g=>N({status:g.target.value}),options:Z.map(g=>({value:g.key,label:g.label}))})}),a.jsx($,{label:"Prioritas",children:a.jsx(B,{value:i.priority,"aria-label":"Prioritas tugas",onChange:g=>N({priority:g.target.value}),options:It})})]}),a.jsx($,{label:"Ditugaskan ke",children:a.jsx(B,{value:i.memberId,"aria-label":"Anggota tugas",onChange:g=>N({memberId:g.target.value}),options:[{value:"",label:"Belum ditugaskan"},...l.map(g=>({value:g.id,label:g.role?`${g.name} · ${g.role}`:g.name}))],style:{width:"100%"}})}),a.jsxs("div",{style:{display:"flex",gap:10,flexWrap:"wrap"},children:[a.jsx($,{label:"Mulai",children:a.jsx(Y,{type:"date",value:i.startDate,"aria-label":"Tanggal mulai",onChange:g=>N({startDate:g.target.value})})}),a.jsx($,{label:"Tenggat",children:a.jsx(Y,{type:"date",value:i.dueDate,"aria-label":"Tanggal tenggat",onChange:g=>N({dueDate:g.target.value})})})]}),a.jsx($,{label:"Detail",hint:"Opsional — konteks yang tak muat di judul.",children:a.jsx(Aa,{value:i.detail,"aria-label":"Detail tugas",rows:4,placeholder:"mis. tunggu aset dari klien, deadline ikut jadwal kampanye",onChange:g=>N({detail:g.target.value})})})]}),j]})}const wt=Ra.map(e=>({value:e,label:_a(e).label}));function Dt({task:e,projects:t,onClose:n,onDone:l,onToast:r}){const[o,u]=d.useState("brief"),[f,p]=d.useState(()=>He.some(h=>h.value===e.priority)?e.priority:"sedang"),[i,b]=d.useState(""),[m,k]=d.useState(!1),S=e.projectId===null,j=e.projectId??i;async function C(){if(!(!j||m)){k(!0);try{const h=await D.escalateTask(e.id,{source:o,priority:f,...e.projectId?{}:{projectId:i}});r(h.created?`Dieskalasi jadi ${h.spec.id}`:`Sudah tertaut ke ${h.spec.id}`,"ok","link"),l(h.task),n()}catch(h){r(Ce("mengeskalasi kartu",h),"err","x-circle")}finally{k(!1)}}}return a.jsxs(we,{open:!0,onClose:m?void 0:n,icon:"git-branch",eyebrow:"Papan tim",title:"Kirim ke Backlog",footer:a.jsxs("div",{className:"hn-dia-foot-split",children:[a.jsx("span",{className:"hn-grow"}),a.jsx(U,{variant:"secondary",onClick:n,disabled:m,children:"Batal"}),a.jsx(U,{onClick:C,loading:m,disabled:!j,leftIcon:"git-branch",children:"Kirim ke Backlog"})]}),children:[a.jsxs("div",{className:"hn-dia-lead",children:["Kartu ",a.jsx("strong",{children:e.title})," tetap di papan. Yang lahir adalah backlog item baru yang bisa dikerjakan sesi agen, dan kartu ini menampilkan stage-nya."]}),S&&a.jsxs($,{label:"Project",children:[a.jsx(B,{"aria-label":"Project",value:i,className:"hn-dia-full",onChange:h=>b(h.target.value),options:[{value:"",label:"Pilih project…"},...t.map(h=>({value:h.id,label:h.name}))]}),a.jsx("div",{className:"hn-dia-hint",children:"Nomor SPEC diambil dari repo project, jadi kartu tanpa project belum bisa dieskalasi."})]}),a.jsx($,{label:"Source",hint:"Jenis item backlog yang lahir dari kartu ini, mis. feature brief atau Finding QA.",children:a.jsx(B,{"aria-label":"Source",value:o,className:"hn-dia-full",onChange:h=>u(h.target.value),options:wt})}),a.jsx($,{label:"Prioritas",children:a.jsx(B,{"aria-label":"Prioritas",value:f,className:"hn-dia-full",onChange:h=>p(h.target.value),options:He})})]})}function Mt({m:e,busy:t,onSave:n,onToggle:l,onDelete:r}){const[o,u]=d.useState(!1),[f,p]=d.useState(e.name),[i,b]=d.useState(e.role??"");return o?a.jsxs("div",{className:"hn-mem-edit",children:[a.jsx(Y,{size:"sm",value:f,"aria-label":`Nama ${e.name}`,placeholder:"mis. Dena Meidina",onChange:m=>p(m.target.value)}),a.jsx(Y,{size:"sm",value:i,"aria-label":`Peran ${e.name}`,placeholder:"mis. desainer",onChange:m=>b(m.target.value)}),a.jsxs("div",{className:"hn-mem-note",children:[e.email," — ganti email berarti hapus lalu buat baru."]}),a.jsxs("div",{className:"hn-mem-actions",children:[a.jsx(U,{size:"sm",disabled:t,onClick:()=>{n(e.id,{name:f.trim(),role:i.trim()||null}),u(!1)},children:"Simpan"}),a.jsx(U,{size:"sm",variant:"ghost",onClick:()=>u(!1),children:"Batal"})]})]}):a.jsxs("div",{className:`hn-dense-row hn-mem-row${e.active?"":" hn-mem-row--off"}`,children:[a.jsxs("span",{className:"hn-mem-main",children:[a.jsxs("span",{className:"hn-mem-name-row",children:[a.jsx("span",{className:"hn-mem-name",children:e.name}),e.role&&a.jsx(Ze,{tone:"neutral",size:"sm",children:e.role}),!e.active&&a.jsx(Ze,{tone:"warn",size:"sm",children:"nonaktif"})]}),a.jsx("span",{className:"hn-mem-email",children:e.email})]}),a.jsx(ke,{icon:"pencil",label:`Ubah ${e.name}`,size:"sm",onClick:()=>u(!0)}),a.jsx(ke,{icon:e.active?"user-minus":"user-check",size:"sm",label:`${e.active?"Nonaktifkan":"Aktifkan"} ${e.name}`,onClick:()=>l(e)}),a.jsx(ke,{icon:"trash-2",label:`Hapus ${e.name}`,size:"sm",onClick:()=>r(e)})]})}function Et({open:e,onClose:t,onChanged:n,onToast:l}){const[r,o]=d.useState([]),[u,f]=d.useState("loading"),[p,i]=d.useState(!1),[b,m]=d.useState(!1),[k,S]=d.useState(""),[j,C]=d.useState(""),[h,N]=d.useState(""),{confirm:M,dialog:A}=ca(),g=d.useRef(n);g.current=n;const T=d.useRef(!1),c=d.useCallback(()=>{T.current||f("loading"),D.listMembers().then(v=>{T.current=!0,o(v.items),f("ready"),i(!1),g.current(v.items)}).catch(()=>{T.current?i(!0):f("error")})},[]);if(d.useEffect(()=>{e&&c()},[e,c]),!e)return null;async function y(){if(!k.trim()||!j.trim()){l("Nama & email wajib diisi","err","x-circle");return}m(!0);try{await D.createMember({name:k.trim(),email:j.trim(),role:h.trim()||null}),S(""),C(""),N(""),l("Anggota ditambahkan","ok","user-plus"),c()}catch{l("Gagal menambah anggota — email mungkin sudah terdaftar","err","x-circle")}finally{m(!1)}}async function L(v,le){m(!0);try{await D.patchMember(v,le),c()}catch{l("Gagal menyimpan anggota","err","x-circle")}finally{m(!1)}}async function I(v){m(!0);try{await D.patchMember(v.id,{active:!v.active}),c()}catch{l("Gagal mengubah status anggota","err","x-circle")}finally{m(!1)}}async function K(v){await M({title:`Hapus ${v.name} dari direktori?`,message:"Tugasnya tidak ikut terhapus — kartu yang ditugaskan padanya jadi 'belum ditugaskan'.",confirmLabel:"Hapus anggota",tone:"danger",icon:"trash-2",run:()=>D.deleteMember(v.id)})&&(l("Anggota dihapus","ok","trash-2"),c())}return a.jsxs(a.Fragment,{children:[a.jsxs(we,{open:e,onClose:t,icon:"users",eyebrow:"Papan tim",title:"Anggota",width:620,children:[a.jsxs("div",{className:"hn-mem-add",children:[a.jsx(Y,{size:"sm",value:k,"aria-label":"Nama anggota baru",placeholder:"Nama",onChange:v=>S(v.target.value),className:"hn-mem-in-name"}),a.jsx(Y,{size:"sm",value:j,"aria-label":"Email anggota baru",placeholder:"email@nafanesia.id",onChange:v=>C(v.target.value),className:"hn-mem-in-email"}),a.jsx(Y,{size:"sm",value:h,"aria-label":"Peran anggota baru",placeholder:"Peran (opsional)",onChange:v=>N(v.target.value),className:"hn-mem-in-role"}),a.jsx(U,{size:"sm",leftIcon:"user-plus",onClick:y,loading:b,children:"Tambah anggota"})]}),p&&a.jsx(Ua,{tone:"err",title:"Gagal memuat ulang anggota",className:"hn-mem-alert",action:a.jsx(U,{size:"sm",variant:"ghost",onClick:c,children:"Coba lagi"}),children:"Yang tampil di bawah adalah data lama. Coba lagi untuk memuat yang terbaru."}),u==="loading"?a.jsx(W,{kind:"loading",compact:!0}):u==="error"?a.jsx(W,{kind:"error",compact:!0,hint:"Gagal memuat anggota.",action:c,actionLabel:"Coba lagi"}):r.length===0?a.jsx(W,{kind:"empty",compact:!0,icon:"users",title:"Belum ada anggota",hint:"Tambahkan orang di atas agar kartu papan bisa ditugaskan."}):r.map(v=>a.jsx(Mt,{m:v,busy:b,onSave:L,onToggle:I,onDelete:K},v.id))]}),A]})}const $t=5e3,la=200,Lt=400,_="me",H="all",ia=[{value:"board",label:"Papan",icon:"kanban"},{value:"timeline",label:"Linimasa",icon:"gantt-chart"},{value:"projects",label:"Lintas project",icon:"layers"}],Ot={day:"Hari",week:"Minggu",month:"Bulan"},Pt=()=>Object.fromEntries(Z.map(e=>[e.key,0]));function Bt({status:e,params:t,onData:n,refetch:l}){return Wa({topic:"tasks",params:{...t,status:e},apply:r=>n(e,r.data.items,r.data.total),refetch:l,pollMs:$t}),null}function Kt({projects:e,projectFilter:t,onProjectFilter:n,onToast:l,onOpenSpec:r}){var Ke,ze,Ge;const[o,u]=d.useState(Qa),[f,p]=d.useState(Pt),[i,b]=d.useState([]),[m,k]=d.useState(""),[S,j]=d.useState("loading"),[C,h]=d.useState(!1),[N,M]=d.useState(null),[A,g]=d.useState(!1),[T,c]=d.useState(!1),[y,L]=d.useState(null),[I,K]=d.useState(null),[v,le]=Fa(),[he,ba]=X("team","view","board",Ye(...ia.map(s=>s.value))),[V,pe]=X("team","q","",xe),[z,ie]=X("team","col","all",xe),[P,ae]=X("team","member",_,xe),[ge,fa]=X("team","zoom","week",Ye(...Qe)),[ja,De]=X("team","expanded",[],Va),ka=d.useCallback(s=>{De(x=>x.includes(s)?x.filter(w=>w!==s):[...x,s])},[De]),Me=he==="timeline",F=he==="projects",Ee=d.useRef(Date.now()).current;d.useEffect(()=>{var w,E;let s=!0;const x=(E=(w=D).authStatus)==null?void 0:E.call(w);return x==null||x.then(O=>{var R;s&&K(((R=O.user)==null?void 0:R.email)??null)}).catch(()=>{s&&K(null)}),()=>{s=!1}},[]);const G=d.useMemo(()=>z==="all"?Z:Z.filter(s=>s.key===z),[z]),be=G.map(s=>s.key).join(","),fe=F||t==="all"?void 0:t,re=d.useMemo(()=>{if(!I)return null;const s=Ka(I);return i.some(x=>x.id===s)?s:null},[I,i]),oe=P===_?re??void 0:P===H?void 0:P,$e=P!==_&&P!==H,Q=d.useMemo(()=>({projectId:fe,memberId:oe,q:V.trim()||void 0}),[fe,oe,V]),ce=d.useRef(!1),te=d.useCallback((s=!1)=>{!s&&!ce.current&&j("loading");const x=be?be.split(","):[];Promise.all(x.map(w=>D.listTasks({...Q,status:w,page:1,limit:la}))).then(w=>{u(E=>{const O={...E};return x.forEach((R,ne)=>{O[R]=w[ne].items}),O}),p(E=>{const O={...E};return x.forEach((R,ne)=>{O[R]=w[ne].total}),O}),ce.current=!0,h(!1),j("ready")}).catch(()=>{if(!ce.current){j("error");return}h(!0)})},[Q,be]);d.useEffect(()=>{te()},[te]);const Le=d.useCallback(()=>{D.listMembers().then(s=>{b(s.items),k("")}).catch(s=>k(za(s,"tidak diketahui")))},[]);d.useEffect(()=>{Le()},[Le]);const[Oe,xa]=d.useState(()=>V.trim());d.useEffect(()=>{const s=setTimeout(()=>xa(V.trim()),Lt);return()=>clearTimeout(s)},[V]);const ya=d.useCallback((s,x,w)=>{u(E=>({...E,[s]:x})),p(E=>({...E,[s]:w})),ce.current=!0,h(!1),j("ready")},[]),va=d.useMemo(()=>({projectId:Q.projectId,memberId:Q.memberId,q:Oe||void 0,page:1,limit:la}),[Q.projectId,Q.memberId,Oe]),de=d.useCallback(()=>te(!0),[te]);async function Sa(s,x){var O;const w=Xa(o,s.id,s.status,x);if(!w)return;const E=o;u(w.board);try{await D.patchTask(s.id,w.patch);const R=((O=Z.find(ne=>ne.key===x))==null?void 0:O.label)??x;le(`Tugas dipindah ke ${R}`,"ok",void 0,{action:{label:"Urungkan",onAction:()=>{Pe(s.id,{status:s.status})}}})}catch{u(E),l("Gagal memindahkan tugas","err","x-circle")}}async function Ca(s,x){var E;const w=o;u(ye(o,{...s,memberId:x}));try{await D.patchTask(s.id,{memberId:x});const O=x?((E=i.find(R=>R.id===x))==null?void 0:E.name)??"anggota":null;le(O?`Ditugaskan ke ${O}`:"Penugasan dikosongkan","ok",void 0,{action:{label:"Urungkan",onAction:()=>{Pe(s.id,{memberId:s.memberId})}}})}catch{u(w),l("Gagal menugaskan","err","x-circle")}}async function Pe(s,x){try{await D.patchTask(s,x),de()}catch{l("Gagal mengurungkan perubahan","err","x-circle")}}async function Na(s){const x=o;u(ye(o,{...s,specId:null,spec:null}));try{await D.unlinkTaskSpec(s.id),l("Tautan backlog dilepas","ok","unlink")}catch{u(x),l("Gagal melepas tautan","err","x-circle")}}const Be=G.every(s=>o[s.key].length===0),je=V.trim()!=="",Ae=(!F&&t!=="all"?1:0)+(z!=="all"?1:0)+($e?1:0),Re=Ae>0||je||oe!==void 0,Ia=((Ke=e.find(s=>s.id===t))==null?void 0:Ke.name)??t,Ta=((ze=i.find(s=>s.id===P))==null?void 0:ze.name)??P,wa=((Ge=Z.find(s=>s.key===z))==null?void 0:Ge.label)??z,Da=()=>{F||n("all"),ie("all"),ae(_),pe("")},Ma=()=>{F||n("all"),ie("all"),ae(H),pe("")},_e=d.useMemo(()=>G.flatMap(s=>o[s.key]),[o,G]),Ue=G.reduce((s,x)=>s+Math.max(0,(f[x.key]??0)-o[x.key].length),0),Ea=G.reduce((s,x)=>s+(f[x.key]??0),0),Fe=[...!F&&t!=="all"?[{key:"project",label:`Project: ${Ia}`,onRemove:()=>n("all")}]:[],...z!=="all"?[{key:"col",label:`Kolom: ${wa}`,onRemove:()=>ie("all")}]:[],...$e?[{key:"member",label:`Anggota: ${Ta}`,onRemove:()=>ae(_)}]:[]],$a=[...re?[{value:_,label:"Saya"}]:[],{value:H,label:"Semua anggota"},...i.map(s=>({value:s.id,label:s.name}))],La=P===_&&!re?H:P,Oa=a.jsxs(Ga,{gap:3,children:[a.jsx($,{label:"Project",children:a.jsx(B,{size:"sm","aria-label":"Filter project",value:t,disabled:F,onChange:s=>n(s.target.value),options:[{value:"all",label:"Semua project"},...e.map(s=>({value:s.id,label:s.name}))]})}),F&&a.jsx("p",{"data-testid":"project-filter-note",className:"hn-tm-hint",children:"Mode ini melintasi semua project"}),a.jsx($,{label:"Anggota",children:a.jsx(B,{size:"sm","aria-label":"Filter anggota",value:La,disabled:!!m,onChange:s=>ae(s.target.value),options:$a})}),m&&a.jsxs("p",{role:"alert",className:"hn-tm-hint hn-tm-alert",children:["Anggota gagal dimuat: ",m]}),a.jsx($,{label:"Kolom",children:a.jsx(B,{size:"sm","aria-label":"Filter kolom",value:z,onChange:s=>ie(s.target.value),options:[{value:"all",label:"Semua kolom"},...Z.map(s=>({value:s.key,label:s.label}))]})}),(Me||F)&&a.jsx($,{label:"Zoom",children:a.jsx(B,{size:"sm","aria-label":"Zoom linimasa",value:ge,onChange:s=>fa(s.target.value),options:Qe.map(s=>({value:s,label:Ot[s]}))})})]});return a.jsxs("div",{className:"hn-tm-screen",children:[a.jsxs("section",{className:"hn-tm-toolbar",role:"region","aria-label":"Kontrol papan tim",children:[a.jsxs("div",{className:"hn-tm-switches",children:[a.jsx(Se,{variant:"pill",value:he,onChange:ba,tabs:ia,"aria-label":"Mode tampilan"}),re&&a.jsx(Se,{variant:"pill","aria-label":"Lensa tugas",value:P===H?H:P===_?_:"",onChange:s=>ae(s),tabs:[{value:_,label:"Saya"},{value:H,label:"Semua"}]}),a.jsxs("span",{className:"hn-tm-count",role:"status",title:C?"Server tak menjawab saat menyegarkan — angka ini dari muatan terakhir yang berhasil":void 0,children:[Ea," tugas",C?" · data lama":""]}),a.jsx(qa,{})]}),a.jsx(Ha,{label:"Penyaring tim",search:{value:V,onChange:pe,label:"Cari tugas",placeholder:"mis. halaman harga atau deploy"},chips:Fe,filters:Oa,filtersLabel:"Filter",onReset:Fe.length>0||je?Da:void 0,resetLabel:"Reset filter",actions:a.jsxs(a.Fragment,{children:[a.jsx(U,{size:"sm",leftIcon:"plus",onClick:()=>{M(null),g(!0)},children:"Tugas baru"}),a.jsx(Za,{onDone:de,onToast:l}),a.jsx(oa,{label:"Lainnya",items:[{key:"members",label:"Anggota tim",icon:"users",onSelect:()=>c(!0)}]})]})})]}),G.map(s=>a.jsx(Bt,{status:s.key,params:va,onData:ya,refetch:de},s.key)),S==="loading"?a.jsx(W,{kind:"loading"}):S==="error"?a.jsx(W,{kind:"error",hint:"Gagal memuat papan tim.",action:()=>te(),actionLabel:"Coba lagi"}):Be&&!Re?a.jsx(W,{kind:"empty",icon:"users",title:"Papan tim masih kosong",hint:"Catat pekerjaan manusia di sekitar sesi agen — desain, meeting klien, deploy, nego.",action:()=>{M(null),g(!0)},actionLabel:"Tugas baru",actionIcon:"plus"}):a.jsxs(a.Fragment,{children:[Be&&Re&&a.jsx(W,{kind:"empty",compact:!0,icon:"filter",title:oe!==void 0&&Ae===0&&!je?"Tak ada tugas untuk kamu":"Tak ada tugas yang cocok dengan filter",hint:"Penyaring yang aktif menyembunyikan semua tugas di papan ini.",action:Ma,actionLabel:"Tampilkan semua",actionIcon:"x"}),F?a.jsx(Nt,{tasks:_e,projects:e,members:i,zoom:ge,today:Ee,hidden:Ue,expanded:ja,onToggle:ka,onOpen:s=>{M(s),g(!0)}}):Me?a.jsx(vt,{tasks:_e,members:i,zoom:ge,today:Ee,hidden:Ue,onOpen:s=>{M(s),g(!0)}}):a.jsx(kt,{board:o,totals:f,columns:G,members:i,projects:e,onOpenSpec:r,onMove:Sa,onAssign:Ca,onEscalate:L,onUnlink:Na,onOpen:s=>{M(s),g(!0)}})]}),a.jsx(Tt,{open:A,task:N,projects:e,members:i,defaultProjectId:fe??null,orderFor:s=>da(o[s]),onClose:()=>{g(!1),M(null)},onSaved:de,onToast:l}),y&&a.jsx(Dt,{task:y,projects:e,onClose:()=>L(null),onDone:s=>u(x=>ye(x,s)),onToast:l}),a.jsx(Et,{open:T,onClose:()=>c(!1),onChanged:b,onToast:l}),a.jsx(Ya,{toast:v})]})}export{ia as TEAM_VIEWS,Kt as TeamScreen};
|
|
1
|
+
import{T as ra,a as Pa,b as Ba,j as a,c as Se,O as oa,P as me,I as q,d as ca,M as we,e as $,f as Y,g as B,H as Aa,B as U,h as D,i as Ce,k as He,E as Ra,s as _a,C as Ua,m as W,n as Ze,o as ke,p as Fa,q as X,r as Ye,t as Ka,v as za,w as Ga,x as Ha,y as Za,z as Ya,A as Va,D as xe,G as Wa}from"./index-R2HBkTbR.js";import{R as d}from"./react-DfGhg7ZW.js";import{L as qa}from"./live-V9nWiHoE.js";import"./markdown-CWEY34jk.js";import"./xterm-3VOAfa_q.js";const Ja=Pa,Z=ra.map(e=>({key:e,label:Ja[e]})),Qa=()=>Object.fromEntries(ra.map(e=>[e,[]])),Ne=(e,t)=>e!==t,da=e=>e.length===0?0:e.reduce((t,n)=>n.order>t?n.order:t,-1/0)+1;function Xa(e,t,n,l){if(!Ne(n,l))return null;const r=e[n].find(f=>f.id===t);if(!r)return null;const o={status:l,order:da(e[l])},u={...e};return u[n]=e[n].filter(f=>f.id!==t),u[l]=[...e[l],{...r,...o}],{board:u,patch:o}}function ye(e,t){const n={...e};return n[t.status]=e[t.status].map(l=>l.id===t.id?t:l),n}const Ve=e=>e?e.slice(0,10):"",We=e=>/^\d{4}-\d{2}-\d{2}$/.test(e)?`${e}T12:00:00.000Z`:null,J=864e5,se=e=>Math.floor(e/J)*J,qe=e=>{if(!e)return null;const t=new Date(e).getTime();return Number.isFinite(t)?t:null};function ee(e){const t=qe(e.startDate),n=qe(e.dueDate);if(t===null&&n===null)return null;const l=t??n,r=n??t;return{start:se(Math.min(l,r)),end:se(Math.max(l,r))+J,invalid:r<l}}const et=new Intl.DateTimeFormat("id-ID",{day:"numeric",month:"short",timeZone:"UTC"}),Je=e=>e?et.format(new Date(e)):null;function ue(e){const t=Je(e.startDate),n=Je(e.dueDate);return t&&n?`${t} → ${n}`:n?`→ ${n}`:t}const Qe=["day","week","month"],ua={day:{cell:34,minTicks:14},week:{cell:56,minTicks:8},month:{cell:84,minTicks:6}},at=e=>ua[e].cell,tt=120,nt=(e,t)=>{const n=se(e);if(t==="day")return n;if(t==="week")return n-(new Date(n).getUTCDay()+6)%7*J;const l=new Date(n);return Date.UTC(l.getUTCFullYear(),l.getUTCMonth(),1)},st=(e,t)=>{if(t==="day")return e+J;if(t==="week")return e+7*J;const n=new Date(e);return Date.UTC(n.getUTCFullYear(),n.getUTCMonth()+1,1)},lt=new Intl.DateTimeFormat("id-ID",{day:"numeric",timeZone:"UTC"}),Xe=new Intl.DateTimeFormat("id-ID",{day:"numeric",month:"short",timeZone:"UTC"}),it=new Intl.DateTimeFormat("id-ID",{month:"short",timeZone:"UTC"}),rt=new Intl.DateTimeFormat("id-ID",{month:"short",year:"2-digit",timeZone:"UTC"}),ot=(e,t)=>{const n=new Date(e);return t==="day"?n.getUTCDate()===1:t==="week"?n.getUTCDate()<=7:n.getUTCMonth()===0},ct=(e,t,n)=>{const l=new Date(e);return t==="day"?(n?Xe:lt).format(l):t==="week"?Xe.format(l):(n?rt:it).format(l)};function ma(e,t,n){const l=se(n);let r=l,o=l+J;for(const b of e)b.start<r&&(r=b.start),b.end>o&&(o=b.end);const u=nt(r,t),{minTicks:f}=ua[t],p=[];let i=u;for(;p.length<tt&&(i<o||p.length<f);){const b=ot(i,t);p.push({start:i,label:ct(i,t,b),major:b}),i=st(i,t)}return{from:u,to:i,zoom:t,ticks:p}}function ha(e,t){const n=t.to-t.from;if(n<=0||e.end<=t.from||e.start>=t.to)return null;const l=Math.max(e.start,t.from),r=Math.min(e.end,t.to);return{left:(l-t.from)/n*100,width:(r-l)/n*100,clippedStart:e.start<t.from,clippedEnd:e.end>t.to,invalid:e.invalid}}function Ie(e,t){const n=ee(e);return n?ha(n,t):null}function dt(e){let t=1/0,n=-1/0,l=!1;for(const r of e){const o=ee(r);o&&(o.start<t&&(t=o.start),o.end>n&&(n=o.end),o.invalid&&(l=!0))}return t===1/0?null:{start:t,end:n,invalid:l}}function ut(e,t){const n=se(t);return n<e.from||n>=e.to?null:(n-e.from)/(e.to-e.from)*100}function mt(e,t){const n=[],l=[],r=[];for(const o of e){const u=ee(o);if(!u){l.push(o);continue}const f=Ie(o,t);if(!f){r.push(o);continue}n.push({task:o,geometry:f,start:u.start})}return n.sort((o,u)=>o.start-u.start||o.task.title.localeCompare(u.task.title,"id")||o.task.id.localeCompare(u.task.id)),{rows:n.map(({task:o,geometry:u})=>({task:o,geometry:u})),unscheduled:l,outside:r}}const ea=(e,t)=>e.title.localeCompare(t.title,"id")||e.id.localeCompare(t.id);function ht(e,t,n){const l=Symbol("no-project"),r=new Map;for(const p of e){const i=p.projectId??l,b=r.get(i);b?b.tasks.push(p):r.set(i,{projectId:p.projectId,tasks:[p]})}const o=[...r.values()].map(({projectId:p,tasks:i})=>{const b=dt(i),m=[],k=[];for(const S of i){const j=ee(S);j?m.push({task:S,start:j.start}):k.push(S)}return m.sort((S,j)=>S.start-j.start||ea(S.task,j.task)),k.sort(ea),{projectId:p,span:b,geometry:b?ha(b,t):null,tasks:[...m.map(S=>S.task),...k]}}),u=p=>p.geometry?0:p.span?1:2,f=p=>p.projectId===null?[1,""]:[0,p.projectId];return o.sort((p,i)=>{const[b,m]=f(p),[k,S]=f(i);return u(p)-u(i)||(p.span&&i.span?p.span.start-i.span.start:0)||n(p.projectId).localeCompare(n(i.projectId),"id")||b-k||m.localeCompare(S)}),o}const pt={tinggi:"high",sedang:"mid",rendah:"low"};function gt({priority:e}){const t=pt[e]??"mid",n=me[e]??e;return a.jsx("span",{className:`hn-tm-prio hn-tm-prio-${t}`,title:`Prioritas ${n}`,children:a.jsxs("span",{className:"hn-sr-only",children:["Prioritas ",n]})})}function bt({name:e}){if(!e)return a.jsx("span",{className:"hn-tm-avatar hn-tm-avatar-empty","aria-hidden":"true",children:a.jsx(q,{name:"user",size:12})});const t=e.split(/\s+/).filter(Boolean).slice(0,2).map(n=>n[0].toUpperCase()).join("");return a.jsx("span",{className:"hn-tm-avatar","aria-hidden":"true",children:t||"?"})}function ft(e,t,n){const l=[...Z.filter(r=>r.key!==e.status).map(r=>({key:`move-${r.key}`,label:`Pindah ke ${r.label}`,onSelect:()=>n.onMove(e,r.key)})),...t.map(r=>({key:`assign-${r.id}`,label:`Tugaskan ke ${r.name}`,disabled:e.memberId===r.id,onSelect:()=>n.onAssign(e,r.id)})),{key:"assign-none",label:"Kosongkan penugasan",disabled:!e.memberId,onSelect:()=>n.onAssign(e,null)}];if(e.specId){if(e.spec&&n.onOpenSpec){const r=e.specId;l.push({key:"open-spec",label:`Buka ${e.spec.id} di Backlog`,onSelect:()=>{var o;return(o=n.onOpenSpec)==null?void 0:o.call(n,r)}})}l.push({key:"unlink",label:e.spec?"Lepas tautan":"Lepas tautan (spec tak ditemukan)",onSelect:()=>n.onUnlink(e)})}else l.push({key:"escalate",label:"Kirim ke Backlog",onSelect:()=>n.onEscalate(e)});return l}function jt({task:e,members:t,projectName:n,dragging:l,onDragStart:r,onDragEnd:o,onOpen:u,onMove:f,onAssign:p,onEscalate:i,onUnlink:b,onOpenSpec:m}){var C;const k=((C=t.find(h=>h.id===e.memberId))==null?void 0:C.name)??null,S=ft(e,t,{onMove:f,onAssign:p,onEscalate:i,onUnlink:b,onOpenSpec:m}),j=e.projectId===null?"tanpa project":n??"project tak dikenal";return a.jsxs("div",{draggable:!0,"data-testid":`team-card-${e.id}`,className:"hn-tm-card","data-dragging":l||void 0,title:`Project: ${j}`,onDragStart:h=>{h.dataTransfer.effectAllowed="move",h.dataTransfer.setData("text/plain",e.id),r()},onDragEnd:o,children:[a.jsxs("div",{className:"hn-tm-card-head",children:[a.jsx(gt,{priority:e.priority}),a.jsx("button",{type:"button",className:"hn-tm-title",onClick:()=>u(e),children:e.title})]}),a.jsx("span",{className:"hn-tm-project","data-empty":e.projectId===null||void 0,children:j}),a.jsxs("div",{className:"hn-tm-card-foot",children:[a.jsxs("span",{className:"hn-tm-assignee-wrap",children:[a.jsx(bt,{name:k}),a.jsx("span",{className:"hn-tm-assignee",children:k??"belum ditugaskan"})]}),a.jsx(oa,{label:`Ubah tugas: ${e.title}`,icon:"ellipsis",items:S})]})]})}function kt({board:e,totals:t,columns:n,members:l,projects:r=[],onMove:o,onAssign:u,onOpen:f,onEscalate:p,onUnlink:i,onOpenSpec:b}){var T;const[m,k]=d.useState(null),[S,j]=d.useState(null),C=Ba(),[h,N]=d.useState(((T=n[0])==null?void 0:T.key)??"backlog"),M=d.useMemo(()=>{const c=new Map(r.map(y=>[y.id,y.name]));return y=>y===null?null:c.get(y)??null},[r]),A=c=>{m&&Ne(m.from,c)&&o(m.task,c),k(null),j(null)},g=(c,y)=>a.jsx(jt,{task:c,members:l,projectName:M(c.projectId),dragging:(m==null?void 0:m.task.id)===c.id,onDragStart:()=>k({task:c,from:y}),onDragEnd:()=>{k(null),j(null)},onOpen:f,onMove:o,onAssign:u,onEscalate:p,onUnlink:i,onOpenSpec:b},c.id);if(C==="mobile"){const c=n.find(I=>I.key===h)??n[0];if(!c)return null;const y=e[c.key],L=Math.max(0,(t[c.key]??0)-y.length);return a.jsxs("div",{"data-testid":"team-board","data-layout":"mobile",className:"hn-tm-mobile",children:[a.jsx(Se,{variant:"pill","aria-label":"Kolom papan tim",value:c.key,onChange:I=>N(I),tabs:n.map(I=>({value:I.key,label:`${I.label} · ${e[I.key].length}`}))}),a.jsxs("div",{"data-testid":`team-col-${c.key}`,className:"hn-tm-col-stack",children:[y.map(I=>g(I,c.key)),y.length===0&&a.jsxs("div",{className:"hn-tm-empty-col",children:["Tak ada tugas di ",c.label,"."]}),L>0&&a.jsxs("div",{className:"hn-tm-hidden-note",children:["menampilkan ",y.length," dari ",t[c.key]," — persempit penyaring"]})]})]})}return a.jsx("div",{"data-testid":"team-board",className:"hn-board-local-overflow hn-tm-board",children:n.map(c=>{const y=e[c.key],L=!!m&&Ne(m.from,c.key),I=L&&S===c.key,K=Math.max(0,(t[c.key]??0)-y.length);return a.jsxs("div",{"data-testid":`team-col-${c.key}`,className:"hn-tm-col","data-active":L||void 0,"data-hot":I||void 0,"data-dimmed":m&&!L||void 0,onDragOver:v=>{L&&(v.preventDefault(),v.dataTransfer.dropEffect="move",j(c.key))},onDragLeave:()=>j(v=>v===c.key?null:v),onDrop:v=>{v.preventDefault(),A(c.key)},children:[a.jsxs("div",{className:"hn-tm-col-head",children:[a.jsx("span",{className:"hn-eyebrow",children:c.label}),a.jsx("span",{className:"hn-tm-col-count",children:y.length})]}),a.jsx("div",{className:"hn-tm-col-body",children:y.map(v=>g(v,c.key))}),K>0&&a.jsxs("div",{className:"hn-tm-hidden-note",children:["menampilkan ",y.length," dari ",t[c.key]," — persempit penyaring"]})]},c.key)})})}const ve=232,xt={brass:"var(--brass-500)",err:"var(--status-err)",muted:"var(--border-strong)",envelope:"var(--border-hair)"},Te=e=>e;function yt({spec:e}){const t=e.geometry,n=xt[e.tone],l=!!e.onClick,r={"data-testid":`timeline-bar-${e.key}`,"data-tone":e.tone,"data-invalid":t.invalid?"true":"false","data-clipped-start":t.clippedStart?"true":"false","data-clipped-end":t.clippedEnd?"true":"false",title:e.title,"aria-label":e.title,onClick:e.onClick,className:"hn-tl-bar",style:Te({"--tl-left":`${t.left}%`,"--tl-width":`${t.width}%`})},o=a.jsxs(a.Fragment,{children:[t.invalid&&a.jsx(q,{name:"triangle-alert",size:11,color:n}),t.clippedStart&&a.jsx(q,{name:"chevron-left",size:11,color:n}),a.jsx("span",{className:"hn-grow"}),t.clippedEnd&&a.jsx(q,{name:"chevron-right",size:11,color:n})]});return l?a.jsx("button",{type:"button",...r,children:o}):a.jsx("div",{role:"img",...r,children:o})}function pa({envelope:e=!1}){const t=n=>a.jsx("span",{"aria-hidden":"true",className:"hn-tl-swatch","data-tone":n});return a.jsxs("ul",{"aria-label":"Legenda linimasa",className:"hn-tl-legend",children:[a.jsxs("li",{className:"hn-tl-legend-item",children:[t("brass"),"Rencana"]}),a.jsxs("li",{className:"hn-tl-legend-item",children:[t("muted"),"Selesai"]}),a.jsxs("li",{className:"hn-tl-legend-item",children:[t("err"),a.jsx(q,{name:"triangle-alert",size:11,color:"var(--status-err)"}),"Tenggat mendahului mulai"]}),e&&a.jsxs("li",{className:"hn-tl-legend-item",children:[t("envelope"),"Rentang project (buka lewat namanya)"]})]})}function ga({window:e,rows:t,today:n,emptyHint:l,testId:r,labelHead:o}){const u=at(e.zoom),f=e.ticks.length*u,p=ut(e,n);return a.jsx("div",{"data-testid":r??"team-timeline",className:"hn-timeline-scroll hn-tl-scroll",children:a.jsxs("div",{"data-testid":"timeline-canvas",className:"hn-tl",style:Te({"--tl-label-w":`${ve}px`,"--tl-cell":`${u}px`,"--tl-ticks":String(e.ticks.length),"--tl-track-w":`${f}px`,"--tl-canvas-w":`${ve+f}px`}),children:[a.jsxs("div",{className:"hn-tl-head",children:[a.jsx("div",{className:"hn-tl-label",children:a.jsx("span",{className:"hn-eyebrow",children:o??"Tugas"})}),a.jsx("div",{className:"hn-tl-ticks",children:e.ticks.map(i=>a.jsx("div",{"data-testid":"timeline-tick","data-major":i.major?"true":"false",className:"hn-tl-tick",children:i.label},i.start))})]}),t.length===0?a.jsx("div",{"data-testid":"timeline-empty",className:"hn-tl-empty",children:l??"Tak ada yang bisa dihamparkan di jendela ini."}):t.map(i=>a.jsxs("div",{"data-testid":`timeline-row-${i.key}`,className:"hn-tl-row",children:[a.jsxs("div",{className:"hn-tl-label",children:[a.jsx("div",{className:"hn-tl-label-text",children:i.label}),i.meta&&a.jsx("div",{className:"hn-tl-label-meta",children:i.meta})]}),a.jsx("div",{className:"hn-tl-track",children:i.bars.map(b=>a.jsx(yt,{spec:b},b.key))})]},i.key)),p!==null&&a.jsx("div",{"data-testid":"timeline-today","aria-hidden":"true",className:"hn-tl-today",style:Te({"--tl-today-x":`${ve+p/100*f}px`})})]})})}function aa({testId:e,icon:t,title:n,hint:l,tasks:r,onOpen:o}){return r.length===0?null:a.jsxs("div",{"data-testid":e,className:"hn-tl-aside",children:[a.jsxs("div",{className:"hn-tl-aside-head",children:[a.jsx(q,{name:t,size:13,color:"var(--text-subtle)"}),a.jsxs("span",{className:"hn-eyebrow",children:[n," · ",r.length]}),l&&a.jsx("span",{className:"hn-tl-aside-hint",children:l})]}),a.jsx("div",{className:"hn-tl-aside-list",children:r.map(u=>a.jsx("button",{type:"button",onClick:()=>o(u),className:"hn-tl-chip",children:u.title},u.id))})]})}function vt({tasks:e,members:t,zoom:n,today:l,hidden:r,onOpen:o}){const u=d.useMemo(()=>{const m=e.map(ee).filter(k=>k!==null);return ma(m,n,l)},[e,n,l]),{rows:f,unscheduled:p,outside:i}=d.useMemo(()=>mt(e,u),[e,u]),b=d.useMemo(()=>f.map(({task:m,geometry:k})=>{var h;const S=((h=t.find(N=>N.id===m.memberId))==null?void 0:h.name)??"belum ditugaskan",j=ue(m),C=[k.invalid?"tenggat mendahului mulai":null,k.clippedStart||k.clippedEnd?"melewati tepi jendela":null].filter(Boolean);return{key:m.id,label:m.title,meta:j?`${S} · ${j}`:S,bars:[{key:m.id,geometry:k,tone:k.invalid?"err":m.status==="done"?"muted":"brass",title:[m.title,j,...C].filter(Boolean).join(" · "),onClick:()=>o(m)}]}}),[f,t,o]);return a.jsxs(a.Fragment,{children:[a.jsx(pa,{}),a.jsx(ga,{window:u,rows:b,today:l,emptyHint:"Belum ada tugas bertanggal — isi mulai atau tenggat di kartunya."}),r>0&&a.jsxs("div",{"data-testid":"timeline-truncated",className:"hn-tl-note",children:[r," tugas tak termuat karena plafon 200 per kolom — persempit penyaring"]}),a.jsx(aa,{testId:"timeline-unscheduled",icon:"calendar-off",title:"Belum dijadwalkan",tasks:p,onOpen:o}),a.jsx(aa,{testId:"timeline-outside",icon:"chevrons-left-right",title:"Di luar jendela",hint:"pilih zoom yang lebih lebar",tasks:i,onOpen:o})]})}const St="__none__",ta=(e,t)=>t.invalid?"err":e.status==="done"?"muted":"brass",na=(e,t,n)=>[e.title,n,t.invalid?"tenggat mendahului mulai":null,t.clippedStart||t.clippedEnd?"melewati tepi jendela":null].filter(Boolean).join(" · ");function Ct({testId:e,open:t,name:n,count:l,onClick:r}){return a.jsxs("button",{type:"button",onClick:r,"data-testid":e,"aria-expanded":t,className:"hn-tl-expand",children:[a.jsx(q,{name:t?"chevron-down":"chevron-right",size:12,color:"var(--text-subtle)"}),a.jsx("span",{className:"hn-tl-expand-name",children:n}),a.jsx("span",{className:"hn-tl-expand-count",children:l})]})}function Nt({tasks:e,projects:t,members:n,zoom:l,today:r,hidden:o,expanded:u,onToggle:f,onOpen:p}){const i=d.useMemo(()=>{const j=e.map(ee).filter(C=>C!==null);return ma(j,l,r)},[e,l,r]),b=d.useCallback(j=>{var C;return j===null?"Tanpa project":((C=t.find(h=>h.id===j))==null?void 0:C.name)??j},[t]),m=d.useMemo(()=>ht(e,i,b),[e,i,b]),k=d.useMemo(()=>new Set(u),[u]),S=d.useMemo(()=>{var C;const j=[];for(const h of m){const N=h.projectId??St,M=k.has(N),A=b(h.projectId),g=h.geometry?ue({startDate:new Date(h.span.start).toISOString(),dueDate:new Date(h.span.end-1).toISOString()}):h.span?"di luar jendela · pilih zoom yang lebih lebar":"belum dijadwalkan",T=[];if(h.geometry){T.push({key:`span:${N}`,geometry:h.geometry,tone:h.geometry.invalid?"err":"envelope",title:`${A} · ${g??""}`.trim()});for(const c of h.tasks){const y=Ie(c,i);y&&T.push({key:`seg:${c.id}`,geometry:y,tone:ta(c,y),title:na(c,y,ue(c)),onClick:()=>p(c)})}}if(j.push({key:`p:${N}`,meta:g,bars:T,label:a.jsx(Ct,{testId:`expand-${N}`,open:M,name:A,count:h.tasks.length,onClick:()=>f(N)})}),!!M)for(const c of h.tasks){const y=Ie(c,i),L=((C=n.find(K=>K.id===c.memberId))==null?void 0:C.name)??"belum ditugaskan",I=ue(c);j.push({key:`t:${c.id}`,label:a.jsx("span",{className:"hn-tl-child",children:c.title}),meta:I?`${L} · ${I}`:L,bars:y?[{key:`t:${c.id}`,geometry:y,tone:ta(c,y),title:na(c,y,I),onClick:()=>p(c)}]:[]})}}return j},[m,k,b,i,n,f,p]);return a.jsxs(a.Fragment,{children:[a.jsx(pa,{envelope:!0}),a.jsx(ga,{window:i,rows:S,today:r,testId:"team-projects",labelHead:"Project",emptyHint:"Belum ada project bertanggal — isi mulai atau tenggat di kartunya."}),o>0&&a.jsxs("div",{"data-testid":"projects-truncated",className:"hn-tl-note",children:[o," tugas tak termuat karena plafon 200 per kolom — amplop project bisa lebih pendek dari rentang sebenarnya; persempit kolom, anggota, atau pencarian"]})]})}const It=Object.keys(me).map(e=>({value:e,label:me[e]})),sa=(e,t)=>({title:(e==null?void 0:e.title)??"",detail:(e==null?void 0:e.detail)??"",projectId:e?e.projectId??"":t??"",status:(e==null?void 0:e.status)??"backlog",priority:e&&e.priority in me?e.priority:"sedang",memberId:(e==null?void 0:e.memberId)??"",startDate:Ve((e==null?void 0:e.startDate)??null),dueDate:Ve((e==null?void 0:e.dueDate)??null)});function Tt({open:e,task:t,projects:n,members:l,defaultProjectId:r,orderFor:o,onClose:u,onSaved:f,onToast:p}){const[i,b]=d.useState(()=>sa(t,r)),[m,k]=d.useState(!1),{confirm:S,dialog:j}=ca(),C=`${e?"1":"0"}:${(t==null?void 0:t.id)??""}`,h=d.useRef(C);if(h.current!==C&&(h.current=C,e&&b(sa(t,r))),!e)return null;const N=g=>b(T=>({...T,...g}));async function M(){if(!i.title.trim()){p("Judul tugas wajib diisi","err","x-circle");return}k(!0);const g=!t||t.status!==i.status,T={title:i.title.trim(),detail:i.detail.trim()||null,projectId:i.projectId||null,status:i.status,priority:i.priority,memberId:i.memberId||null,startDate:We(i.startDate),dueDate:We(i.dueDate),...g?{order:o(i.status)}:{}};try{t?await D.patchTask(t.id,T):await D.createTask(T),p(t?"Tugas diperbarui":"Tugas dibuat","ok","check"),f(),u()}catch(c){p(Ce("menyimpan tugas",c),"err","x-circle")}finally{k(!1)}}async function A(){if(t){try{if(!await S({title:`Hapus "${t.title}"?`,impact:["Kartu ini hilang dari papan di semua device yang tersinkron."],confirmLabel:"Hapus tugas",tone:"danger",icon:"trash-2",run:async()=>{k(!0);try{await D.deleteTask(t.id)}finally{k(!1)}}}))return}catch(g){p(Ce("menghapus tugas",g),"err","x-circle");return}p("Tugas dihapus","ok","trash-2"),f(),u()}}return a.jsxs(a.Fragment,{children:[a.jsxs(we,{open:e,onClose:m?void 0:u,icon:"clipboard-list",eyebrow:"Papan tim",title:t?"Ubah tugas":"Tugas baru",footer:a.jsxs("div",{style:{display:"flex",gap:8,width:"100%",alignItems:"center"},children:[t&&a.jsx(U,{variant:"ghost",leftIcon:"trash-2",onClick:A,disabled:m,children:"Hapus"}),a.jsx("span",{style:{flex:1}}),a.jsx(U,{variant:"secondary",onClick:u,disabled:m,children:"Batal"}),a.jsx(U,{onClick:M,loading:m,children:t?"Simpan":"Buat tugas"})]}),children:[a.jsx($,{label:"Judul",children:a.jsx(Y,{value:i.title,"aria-label":"Judul tugas",placeholder:"mis. Rapikan halaman harga",onChange:g=>N({title:g.target.value}),style:{width:"100%"}})}),a.jsxs("div",{style:{display:"flex",gap:10,flexWrap:"wrap"},children:[a.jsx($,{label:"Project",children:a.jsx(B,{value:i.projectId,"aria-label":"Project tugas",onChange:g=>N({projectId:g.target.value}),options:[{value:"",label:"Tanpa project"},...n.map(g=>({value:g.id,label:g.name}))]})}),a.jsx($,{label:"Kolom",children:a.jsx(B,{value:i.status,"aria-label":"Kolom tugas",onChange:g=>N({status:g.target.value}),options:Z.map(g=>({value:g.key,label:g.label}))})}),a.jsx($,{label:"Prioritas",children:a.jsx(B,{value:i.priority,"aria-label":"Prioritas tugas",onChange:g=>N({priority:g.target.value}),options:It})})]}),a.jsx($,{label:"Ditugaskan ke",children:a.jsx(B,{value:i.memberId,"aria-label":"Anggota tugas",onChange:g=>N({memberId:g.target.value}),options:[{value:"",label:"Belum ditugaskan"},...l.map(g=>({value:g.id,label:g.role?`${g.name} · ${g.role}`:g.name}))],style:{width:"100%"}})}),a.jsxs("div",{style:{display:"flex",gap:10,flexWrap:"wrap"},children:[a.jsx($,{label:"Mulai",children:a.jsx(Y,{type:"date",value:i.startDate,"aria-label":"Tanggal mulai",onChange:g=>N({startDate:g.target.value})})}),a.jsx($,{label:"Tenggat",children:a.jsx(Y,{type:"date",value:i.dueDate,"aria-label":"Tanggal tenggat",onChange:g=>N({dueDate:g.target.value})})})]}),a.jsx($,{label:"Detail",hint:"Opsional — konteks yang tak muat di judul.",children:a.jsx(Aa,{value:i.detail,"aria-label":"Detail tugas",rows:4,placeholder:"mis. tunggu aset dari klien, deadline ikut jadwal kampanye",onChange:g=>N({detail:g.target.value})})})]}),j]})}const wt=Ra.map(e=>({value:e,label:_a(e).label}));function Dt({task:e,projects:t,onClose:n,onDone:l,onToast:r}){const[o,u]=d.useState("brief"),[f,p]=d.useState(()=>He.some(h=>h.value===e.priority)?e.priority:"sedang"),[i,b]=d.useState(""),[m,k]=d.useState(!1),S=e.projectId===null,j=e.projectId??i;async function C(){if(!(!j||m)){k(!0);try{const h=await D.escalateTask(e.id,{source:o,priority:f,...e.projectId?{}:{projectId:i}});r(h.created?`Dieskalasi jadi ${h.spec.id}`:`Sudah tertaut ke ${h.spec.id}`,"ok","link"),l(h.task),n()}catch(h){r(Ce("mengeskalasi kartu",h),"err","x-circle")}finally{k(!1)}}}return a.jsxs(we,{open:!0,onClose:m?void 0:n,icon:"git-branch",eyebrow:"Papan tim",title:"Kirim ke Backlog",footer:a.jsxs("div",{className:"hn-dia-foot-split",children:[a.jsx("span",{className:"hn-grow"}),a.jsx(U,{variant:"secondary",onClick:n,disabled:m,children:"Batal"}),a.jsx(U,{onClick:C,loading:m,disabled:!j,leftIcon:"git-branch",children:"Kirim ke Backlog"})]}),children:[a.jsxs("div",{className:"hn-dia-lead",children:["Kartu ",a.jsx("strong",{children:e.title})," tetap di papan. Yang lahir adalah backlog item baru yang bisa dikerjakan sesi agen, dan kartu ini menampilkan stage-nya."]}),S&&a.jsxs($,{label:"Project",children:[a.jsx(B,{"aria-label":"Project",value:i,className:"hn-dia-full",onChange:h=>b(h.target.value),options:[{value:"",label:"Pilih project…"},...t.map(h=>({value:h.id,label:h.name}))]}),a.jsx("div",{className:"hn-dia-hint",children:"Nomor SPEC diambil dari repo project, jadi kartu tanpa project belum bisa dieskalasi."})]}),a.jsx($,{label:"Source",hint:"Jenis item backlog yang lahir dari kartu ini, mis. feature brief atau Finding QA.",children:a.jsx(B,{"aria-label":"Source",value:o,className:"hn-dia-full",onChange:h=>u(h.target.value),options:wt})}),a.jsx($,{label:"Prioritas",children:a.jsx(B,{"aria-label":"Prioritas",value:f,className:"hn-dia-full",onChange:h=>p(h.target.value),options:He})})]})}function Mt({m:e,busy:t,onSave:n,onToggle:l,onDelete:r}){const[o,u]=d.useState(!1),[f,p]=d.useState(e.name),[i,b]=d.useState(e.role??"");return o?a.jsxs("div",{className:"hn-mem-edit",children:[a.jsx(Y,{size:"sm",value:f,"aria-label":`Nama ${e.name}`,placeholder:"mis. Dena Meidina",onChange:m=>p(m.target.value)}),a.jsx(Y,{size:"sm",value:i,"aria-label":`Peran ${e.name}`,placeholder:"mis. desainer",onChange:m=>b(m.target.value)}),a.jsxs("div",{className:"hn-mem-note",children:[e.email," — ganti email berarti hapus lalu buat baru."]}),a.jsxs("div",{className:"hn-mem-actions",children:[a.jsx(U,{size:"sm",disabled:t,onClick:()=>{n(e.id,{name:f.trim(),role:i.trim()||null}),u(!1)},children:"Simpan"}),a.jsx(U,{size:"sm",variant:"ghost",onClick:()=>u(!1),children:"Batal"})]})]}):a.jsxs("div",{className:`hn-dense-row hn-mem-row${e.active?"":" hn-mem-row--off"}`,children:[a.jsxs("span",{className:"hn-mem-main",children:[a.jsxs("span",{className:"hn-mem-name-row",children:[a.jsx("span",{className:"hn-mem-name",children:e.name}),e.role&&a.jsx(Ze,{tone:"neutral",size:"sm",children:e.role}),!e.active&&a.jsx(Ze,{tone:"warn",size:"sm",children:"nonaktif"})]}),a.jsx("span",{className:"hn-mem-email",children:e.email})]}),a.jsx(ke,{icon:"pencil",label:`Ubah ${e.name}`,size:"sm",onClick:()=>u(!0)}),a.jsx(ke,{icon:e.active?"user-minus":"user-check",size:"sm",label:`${e.active?"Nonaktifkan":"Aktifkan"} ${e.name}`,onClick:()=>l(e)}),a.jsx(ke,{icon:"trash-2",label:`Hapus ${e.name}`,size:"sm",onClick:()=>r(e)})]})}function Et({open:e,onClose:t,onChanged:n,onToast:l}){const[r,o]=d.useState([]),[u,f]=d.useState("loading"),[p,i]=d.useState(!1),[b,m]=d.useState(!1),[k,S]=d.useState(""),[j,C]=d.useState(""),[h,N]=d.useState(""),{confirm:M,dialog:A}=ca(),g=d.useRef(n);g.current=n;const T=d.useRef(!1),c=d.useCallback(()=>{T.current||f("loading"),D.listMembers().then(v=>{T.current=!0,o(v.items),f("ready"),i(!1),g.current(v.items)}).catch(()=>{T.current?i(!0):f("error")})},[]);if(d.useEffect(()=>{e&&c()},[e,c]),!e)return null;async function y(){if(!k.trim()||!j.trim()){l("Nama & email wajib diisi","err","x-circle");return}m(!0);try{await D.createMember({name:k.trim(),email:j.trim(),role:h.trim()||null}),S(""),C(""),N(""),l("Anggota ditambahkan","ok","user-plus"),c()}catch{l("Gagal menambah anggota — email mungkin sudah terdaftar","err","x-circle")}finally{m(!1)}}async function L(v,le){m(!0);try{await D.patchMember(v,le),c()}catch{l("Gagal menyimpan anggota","err","x-circle")}finally{m(!1)}}async function I(v){m(!0);try{await D.patchMember(v.id,{active:!v.active}),c()}catch{l("Gagal mengubah status anggota","err","x-circle")}finally{m(!1)}}async function K(v){await M({title:`Hapus ${v.name} dari direktori?`,message:"Tugasnya tidak ikut terhapus — kartu yang ditugaskan padanya jadi 'belum ditugaskan'.",confirmLabel:"Hapus anggota",tone:"danger",icon:"trash-2",run:()=>D.deleteMember(v.id)})&&(l("Anggota dihapus","ok","trash-2"),c())}return a.jsxs(a.Fragment,{children:[a.jsxs(we,{open:e,onClose:t,icon:"users",eyebrow:"Papan tim",title:"Anggota",width:620,children:[a.jsxs("div",{className:"hn-mem-add",children:[a.jsx(Y,{size:"sm",value:k,"aria-label":"Nama anggota baru",placeholder:"Nama",onChange:v=>S(v.target.value),className:"hn-mem-in-name"}),a.jsx(Y,{size:"sm",value:j,"aria-label":"Email anggota baru",placeholder:"email@nafanesia.id",onChange:v=>C(v.target.value),className:"hn-mem-in-email"}),a.jsx(Y,{size:"sm",value:h,"aria-label":"Peran anggota baru",placeholder:"Peran (opsional)",onChange:v=>N(v.target.value),className:"hn-mem-in-role"}),a.jsx(U,{size:"sm",leftIcon:"user-plus",onClick:y,loading:b,children:"Tambah anggota"})]}),p&&a.jsx(Ua,{tone:"err",title:"Gagal memuat ulang anggota",className:"hn-mem-alert",action:a.jsx(U,{size:"sm",variant:"ghost",onClick:c,children:"Coba lagi"}),children:"Yang tampil di bawah adalah data lama. Coba lagi untuk memuat yang terbaru."}),u==="loading"?a.jsx(W,{kind:"loading",compact:!0}):u==="error"?a.jsx(W,{kind:"error",compact:!0,hint:"Gagal memuat anggota.",action:c,actionLabel:"Coba lagi"}):r.length===0?a.jsx(W,{kind:"empty",compact:!0,icon:"users",title:"Belum ada anggota",hint:"Tambahkan orang di atas agar kartu papan bisa ditugaskan."}):r.map(v=>a.jsx(Mt,{m:v,busy:b,onSave:L,onToggle:I,onDelete:K},v.id))]}),A]})}const $t=5e3,la=200,Lt=400,_="me",H="all",ia=[{value:"board",label:"Papan",icon:"kanban"},{value:"timeline",label:"Linimasa",icon:"gantt-chart"},{value:"projects",label:"Lintas project",icon:"layers"}],Ot={day:"Hari",week:"Minggu",month:"Bulan"},Pt=()=>Object.fromEntries(Z.map(e=>[e.key,0]));function Bt({status:e,params:t,onData:n,refetch:l}){return Wa({topic:"tasks",params:{...t,status:e},apply:r=>n(e,r.data.items,r.data.total),refetch:l,pollMs:$t}),null}function Kt({projects:e,projectFilter:t,onProjectFilter:n,onToast:l,onOpenSpec:r}){var Ke,ze,Ge;const[o,u]=d.useState(Qa),[f,p]=d.useState(Pt),[i,b]=d.useState([]),[m,k]=d.useState(""),[S,j]=d.useState("loading"),[C,h]=d.useState(!1),[N,M]=d.useState(null),[A,g]=d.useState(!1),[T,c]=d.useState(!1),[y,L]=d.useState(null),[I,K]=d.useState(null),[v,le]=Fa(),[he,ba]=X("team","view","board",Ye(...ia.map(s=>s.value))),[V,pe]=X("team","q","",xe),[z,ie]=X("team","col","all",xe),[P,ae]=X("team","member",_,xe),[ge,fa]=X("team","zoom","week",Ye(...Qe)),[ja,De]=X("team","expanded",[],Va),ka=d.useCallback(s=>{De(x=>x.includes(s)?x.filter(w=>w!==s):[...x,s])},[De]),Me=he==="timeline",F=he==="projects",Ee=d.useRef(Date.now()).current;d.useEffect(()=>{var w,E;let s=!0;const x=(E=(w=D).authStatus)==null?void 0:E.call(w);return x==null||x.then(O=>{var R;s&&K(((R=O.user)==null?void 0:R.email)??null)}).catch(()=>{s&&K(null)}),()=>{s=!1}},[]);const G=d.useMemo(()=>z==="all"?Z:Z.filter(s=>s.key===z),[z]),be=G.map(s=>s.key).join(","),fe=F||t==="all"?void 0:t,re=d.useMemo(()=>{if(!I)return null;const s=Ka(I);return i.some(x=>x.id===s)?s:null},[I,i]),oe=P===_?re??void 0:P===H?void 0:P,$e=P!==_&&P!==H,Q=d.useMemo(()=>({projectId:fe,memberId:oe,q:V.trim()||void 0}),[fe,oe,V]),ce=d.useRef(!1),te=d.useCallback((s=!1)=>{!s&&!ce.current&&j("loading");const x=be?be.split(","):[];Promise.all(x.map(w=>D.listTasks({...Q,status:w,page:1,limit:la}))).then(w=>{u(E=>{const O={...E};return x.forEach((R,ne)=>{O[R]=w[ne].items}),O}),p(E=>{const O={...E};return x.forEach((R,ne)=>{O[R]=w[ne].total}),O}),ce.current=!0,h(!1),j("ready")}).catch(()=>{if(!ce.current){j("error");return}h(!0)})},[Q,be]);d.useEffect(()=>{te()},[te]);const Le=d.useCallback(()=>{D.listMembers().then(s=>{b(s.items),k("")}).catch(s=>k(za(s,"tidak diketahui")))},[]);d.useEffect(()=>{Le()},[Le]);const[Oe,xa]=d.useState(()=>V.trim());d.useEffect(()=>{const s=setTimeout(()=>xa(V.trim()),Lt);return()=>clearTimeout(s)},[V]);const ya=d.useCallback((s,x,w)=>{u(E=>({...E,[s]:x})),p(E=>({...E,[s]:w})),ce.current=!0,h(!1),j("ready")},[]),va=d.useMemo(()=>({projectId:Q.projectId,memberId:Q.memberId,q:Oe||void 0,page:1,limit:la}),[Q.projectId,Q.memberId,Oe]),de=d.useCallback(()=>te(!0),[te]);async function Sa(s,x){var O;const w=Xa(o,s.id,s.status,x);if(!w)return;const E=o;u(w.board);try{await D.patchTask(s.id,w.patch);const R=((O=Z.find(ne=>ne.key===x))==null?void 0:O.label)??x;le(`Tugas dipindah ke ${R}`,"ok",void 0,{action:{label:"Urungkan",onAction:()=>{Pe(s.id,{status:s.status})}}})}catch{u(E),l("Gagal memindahkan tugas","err","x-circle")}}async function Ca(s,x){var E;const w=o;u(ye(o,{...s,memberId:x}));try{await D.patchTask(s.id,{memberId:x});const O=x?((E=i.find(R=>R.id===x))==null?void 0:E.name)??"anggota":null;le(O?`Ditugaskan ke ${O}`:"Penugasan dikosongkan","ok",void 0,{action:{label:"Urungkan",onAction:()=>{Pe(s.id,{memberId:s.memberId})}}})}catch{u(w),l("Gagal menugaskan","err","x-circle")}}async function Pe(s,x){try{await D.patchTask(s,x),de()}catch{l("Gagal mengurungkan perubahan","err","x-circle")}}async function Na(s){const x=o;u(ye(o,{...s,specId:null,spec:null}));try{await D.unlinkTaskSpec(s.id),l("Tautan backlog dilepas","ok","unlink")}catch{u(x),l("Gagal melepas tautan","err","x-circle")}}const Be=G.every(s=>o[s.key].length===0),je=V.trim()!=="",Ae=(!F&&t!=="all"?1:0)+(z!=="all"?1:0)+($e?1:0),Re=Ae>0||je||oe!==void 0,Ia=((Ke=e.find(s=>s.id===t))==null?void 0:Ke.name)??t,Ta=((ze=i.find(s=>s.id===P))==null?void 0:ze.name)??P,wa=((Ge=Z.find(s=>s.key===z))==null?void 0:Ge.label)??z,Da=()=>{F||n("all"),ie("all"),ae(_),pe("")},Ma=()=>{F||n("all"),ie("all"),ae(H),pe("")},_e=d.useMemo(()=>G.flatMap(s=>o[s.key]),[o,G]),Ue=G.reduce((s,x)=>s+Math.max(0,(f[x.key]??0)-o[x.key].length),0),Ea=G.reduce((s,x)=>s+(f[x.key]??0),0),Fe=[...!F&&t!=="all"?[{key:"project",label:`Project: ${Ia}`,onRemove:()=>n("all")}]:[],...z!=="all"?[{key:"col",label:`Kolom: ${wa}`,onRemove:()=>ie("all")}]:[],...$e?[{key:"member",label:`Anggota: ${Ta}`,onRemove:()=>ae(_)}]:[]],$a=[...re?[{value:_,label:"Saya"}]:[],{value:H,label:"Semua anggota"},...i.map(s=>({value:s.id,label:s.name}))],La=P===_&&!re?H:P,Oa=a.jsxs(Ga,{gap:3,children:[a.jsx($,{label:"Project",children:a.jsx(B,{size:"sm","aria-label":"Filter project",value:t,disabled:F,onChange:s=>n(s.target.value),options:[{value:"all",label:"Semua project"},...e.map(s=>({value:s.id,label:s.name}))]})}),F&&a.jsx("p",{"data-testid":"project-filter-note",className:"hn-tm-hint",children:"Mode ini melintasi semua project"}),a.jsx($,{label:"Anggota",children:a.jsx(B,{size:"sm","aria-label":"Filter anggota",value:La,disabled:!!m,onChange:s=>ae(s.target.value),options:$a})}),m&&a.jsxs("p",{role:"alert",className:"hn-tm-hint hn-tm-alert",children:["Anggota gagal dimuat: ",m]}),a.jsx($,{label:"Kolom",children:a.jsx(B,{size:"sm","aria-label":"Filter kolom",value:z,onChange:s=>ie(s.target.value),options:[{value:"all",label:"Semua kolom"},...Z.map(s=>({value:s.key,label:s.label}))]})}),(Me||F)&&a.jsx($,{label:"Zoom",children:a.jsx(B,{size:"sm","aria-label":"Zoom linimasa",value:ge,onChange:s=>fa(s.target.value),options:Qe.map(s=>({value:s,label:Ot[s]}))})})]});return a.jsxs("div",{className:"hn-tm-screen",children:[a.jsxs("section",{className:"hn-tm-toolbar",role:"region","aria-label":"Kontrol papan tim",children:[a.jsxs("div",{className:"hn-tm-switches",children:[a.jsx(Se,{variant:"pill",value:he,onChange:ba,tabs:ia,"aria-label":"Mode tampilan"}),re&&a.jsx(Se,{variant:"pill","aria-label":"Lensa tugas",value:P===H?H:P===_?_:"",onChange:s=>ae(s),tabs:[{value:_,label:"Saya"},{value:H,label:"Semua"}]}),a.jsxs("span",{className:"hn-tm-count",role:"status",title:C?"Server tak menjawab saat menyegarkan — angka ini dari muatan terakhir yang berhasil":void 0,children:[Ea," tugas",C?" · data lama":""]}),a.jsx(qa,{})]}),a.jsx(Ha,{label:"Penyaring tim",search:{value:V,onChange:pe,label:"Cari tugas",placeholder:"mis. halaman harga atau deploy"},chips:Fe,filters:Oa,filtersLabel:"Filter",onReset:Fe.length>0||je?Da:void 0,resetLabel:"Reset filter",actions:a.jsxs(a.Fragment,{children:[a.jsx(U,{size:"sm",leftIcon:"plus",onClick:()=>{M(null),g(!0)},children:"Tugas baru"}),a.jsx(Za,{onDone:de,onToast:l}),a.jsx(oa,{label:"Lainnya",items:[{key:"members",label:"Anggota tim",icon:"users",onSelect:()=>c(!0)}]})]})})]}),G.map(s=>a.jsx(Bt,{status:s.key,params:va,onData:ya,refetch:de},s.key)),S==="loading"?a.jsx(W,{kind:"loading"}):S==="error"?a.jsx(W,{kind:"error",hint:"Gagal memuat papan tim.",action:()=>te(),actionLabel:"Coba lagi"}):Be&&!Re?a.jsx(W,{kind:"empty",icon:"users",title:"Papan tim masih kosong",hint:"Catat pekerjaan manusia di sekitar sesi agen — desain, meeting klien, deploy, nego.",action:()=>{M(null),g(!0)},actionLabel:"Tugas baru",actionIcon:"plus"}):a.jsxs(a.Fragment,{children:[Be&&Re&&a.jsx(W,{kind:"empty",compact:!0,icon:"filter",title:oe!==void 0&&Ae===0&&!je?"Tak ada tugas untuk kamu":"Tak ada tugas yang cocok dengan filter",hint:"Penyaring yang aktif menyembunyikan semua tugas di papan ini.",action:Ma,actionLabel:"Tampilkan semua",actionIcon:"x"}),F?a.jsx(Nt,{tasks:_e,projects:e,members:i,zoom:ge,today:Ee,hidden:Ue,expanded:ja,onToggle:ka,onOpen:s=>{M(s),g(!0)}}):Me?a.jsx(vt,{tasks:_e,members:i,zoom:ge,today:Ee,hidden:Ue,onOpen:s=>{M(s),g(!0)}}):a.jsx(kt,{board:o,totals:f,columns:G,members:i,projects:e,onOpenSpec:r,onMove:Sa,onAssign:Ca,onEscalate:L,onUnlink:Na,onOpen:s=>{M(s),g(!0)}})]}),a.jsx(Tt,{open:A,task:N,projects:e,members:i,defaultProjectId:fe??null,orderFor:s=>da(o[s]),onClose:()=>{g(!1),M(null)},onSaved:de,onToast:l}),y&&a.jsx(Dt,{task:y,projects:e,onClose:()=>L(null),onDone:s=>u(x=>ye(x,s)),onToast:l}),a.jsx(Et,{open:T,onClose:()=>c(!1),onChanged:b,onToast:l}),a.jsx(Ya,{toast:v})]})}export{ia as TEAM_VIEWS,Kt as TeamScreen};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{h as F,i as Q,j as a,M as te,f as St,g as ee,a3 as xn,a4 as ja,m as ze,n as vt,I as De,a2 as vn,Z as yn,B as L,a5 as jn,C as Qe,a6 as ta,a7 as aa,a8 as na,e as we,a9 as wn,aa as Sn,ab as Nn,ac as In,ad as Cn,ae as Rn,af as Fe,ag as wa,ah as Me,ai as Tn,r as En,a1 as An,Y as ge,O as Ne,aj as zn,ak as Dn,al as yt,am as Mn,q as fe,an as Sa,b as Fn,ao as $n,d as Pn,ap as Ln,p as On,aq as Bn,ar as ia,as as Kn,o as gt,at as _n,au as Gn,c as Wn,av as qn,aw as sa,ax as Un,ay as Hn,V as Vn,az as Yn,aA as Jn,aB as Je,aC as Nt,aD as Xn,aE as Zn,D as Qn,aF as ei,aG as ra,aH as ti}from"./index-C5P4ykKO.js";import{R as d,r as P}from"./react-DfGhg7ZW.js";import"./markdown-CWEY34jk.js";import{A as ai}from"./fields-of8G961J.js";import"./xterm-3VOAfa_q.js";function It(e){return e.endedAt?e.endedReason==="reconciled"?"interrupted":e.exitCode===null||e.exitCode===0?"completed":"failed":"running"}const Xe=new Set;let Ae;function ni(e){return Xe.add(e),Ae||(Ae=setInterval(()=>{for(const n of[...Xe])n()},1e3)),()=>{Xe.delete(e),Xe.size===0&&Ae&&(clearInterval(Ae),Ae=void 0)}}const la=20;function ii(e,n){if(!n)return"—";const s=new Date(n).getTime()-new Date(e).getTime();if(!Number.isFinite(s)||s<0)return"—";const r=Math.round(s/1e3);if(r<60)return`${r} dtk`;const l=Math.round(r/60);return l<60?`${l} mnt`:`${Math.floor(l/60)} jam ${l%60} mnt`}function si(e){switch(It(e)){case"running":return{label:"berjalan",tone:"neutral"};case"interrupted":return{label:"terputus",tone:"warn"};case"failed":return{label:`exit ${e.exitCode}`,tone:"err"};default:return{label:"selesai",tone:"ok"}}}const Na=e=>It(e)==="interrupted"?"—":ii(e.startedAt,e.endedAt),Ia=e=>ja[e]??e;function ri({projects:e,onClose:n,onRestart:s}){const[r,l]=d.useState([]),[u,x]=d.useState(0),[g,N]=d.useState(1),[h,k]=d.useState(!1),[p,b]=d.useState(""),[j,C]=d.useState(""),[E,A]=d.useState(""),[R,y]=d.useState(""),[f,M]=d.useState(null),[K,W]=d.useState(null),[v,I]=d.useState(0);d.useEffect(()=>{const o=setTimeout(()=>y(E.trim()),250);return()=>clearTimeout(o)},[E]),d.useEffect(()=>{N(1)},[p,j,R]),d.useEffect(()=>{let o=!0;return k(!0),F.listSessionHistory({projectId:p||void 0,kind:j||void 0,q:R||void 0,page:g,limit:la}).then(T=>{o&&(W(null),x(T.total),l(T.items))}).catch(T=>{o&&(l([]),x(0),W(Q("memuat riwayat sesi",T)))}).finally(()=>{o&&k(!1)}),()=>{o=!1}},[p,j,R,g,v]);const D=yn(u,g,la),w=o=>{var T;return((T=e.find(V=>V.id===o))==null?void 0:T.name)??o};return a.jsxs(te,{open:!0,title:"Riwayat sesi",icon:"history",onClose:n,width:900,children:[a.jsxs("div",{className:"hn-terminal-hist-toolbar",children:[a.jsx(St,{size:"sm",leftIcon:"search",placeholder:"mis. spec-412 atau reverse","aria-label":"Cari riwayat sesi",value:E,onChange:o=>A(o.target.value),className:"hn-terminal-hist-search"}),a.jsx(ee,{size:"sm","aria-label":"Filter project",value:p,onChange:o=>b(o.target.value),options:[{value:"",label:"Semua project"}].concat(e.map(o=>({value:o.id,label:o.name})))}),a.jsx(ee,{size:"sm","aria-label":"Filter jenis",value:j,onChange:o=>C(o.target.value),options:[{value:"",label:"Semua jenis"}].concat(xn.map(o=>({value:o,label:ja[o]})))})]}),K?a.jsx(ze,{kind:"error",icon:"history",title:"Riwayat belum bisa dimuat",hint:K,action:()=>I(o=>o+1),actionLabel:"Coba lagi"}):r.length===0&&!h?a.jsx(ze,{kind:"empty",icon:"history",title:"Belum ada riwayat sesi",hint:"Riwayat terisi sendiri saat sesi terminal dibuka lalu ditutup — termasuk sesi backlog, terminal biasa, dan sesi project-level."}):a.jsxs("div",{className:"hn-terminal-hist-list",children:[r.map(o=>{const T=si(o);return a.jsx("button",{onClick:()=>M(o),className:"hn-terminal-hist-row",children:a.jsxs("span",{className:"hn-dense-row hn-picker-row hn-terminal-hist-main",children:[a.jsx("span",{className:"hn-terminal-hist-when",children:new Date(o.startedAt).toLocaleString("id-ID")}),a.jsx(vt,{size:"sm",tone:"neutral",children:Ia(o.kind)}),a.jsx("span",{className:"hn-picker-title hn-terminal-hist-title",children:o.title??o.specId??w(o.projectId)}),o.transcriptBytes!==null&&a.jsx(De,{name:"file-text",size:12,color:"var(--text-subtle)"}),a.jsx("span",{className:"hn-terminal-hist-duration",children:Na(o)}),a.jsx(vt,{size:"sm",tone:T.tone,children:T.label})]})},o.id)}),h&&a.jsx("div",{className:"hn-terminal-hist-loading",children:"memuat…"})]}),a.jsx(vn,{page:D.page,pageCount:D.pageCount,total:u,from:D.from,to:D.to,onPage:N,unit:"sesi"}),f&&a.jsx(li,{row:f,projectName:w(f.projectId),onBack:()=>M(null),onRestart:s})]})}function li({row:e,projectName:n,onBack:s,onRestart:r}){const[l,u]=d.useState(null),[x,g]=d.useState("idle"),[N,h]=d.useState(null);async function k(j){try{if(!navigator.clipboard)throw new Error("clipboard tidak tersedia di browser ini");await navigator.clipboard.writeText(j),h({tone:"ok",text:"Transkrip disalin."})}catch(C){h({tone:"err",text:Q("menyalin transkrip",C)})}}d.useEffect(()=>{if(e.transcriptBytes===null){g("none"),u(null);return}let j=!0;return g("loading"),F.sessionTranscript(e.id).then(C=>{j&&(u(C.text),g("idle"))}).catch(()=>{j&&(u(null),g("error"))}),()=>{j=!1}},[e.id,e.transcriptBytes]);const p=It(e)==="interrupted",b=[["Project",n],["Sesi",e.sessionId],["Jenis",Ia(e.kind)],["Agen",[e.agent,e.model,e.effort].filter(Boolean).join(" · ")],["Mulai",new Date(e.startedAt).toLocaleString("id-ID")],[p?"Terakhir terlihat hidup":"Selesai",e.endedAt?new Date(e.endedAt).toLocaleString("id-ID"):"berjalan"],...p&&e.reconciledAt?[["Terdeteksi mati",new Date(e.reconciledAt).toLocaleString("id-ID")]]:[],["Durasi",Na(e)],["Direktori",e.cwd]];return e.specId&&b.splice(1,0,["Backlog",`${e.specId}${e.title?` · ${e.title}`:""}`]),e.branch&&b.push(["Branch",e.branch]),a.jsxs(te,{open:!0,title:e.title??e.specId??e.sessionId,icon:"history",onClose:s,width:1e3,children:[a.jsxs("div",{className:"hn-terminal-hist-actions",children:[a.jsx(L,{size:"sm",variant:"ghost",leftIcon:"arrow-left",onClick:s,children:"Kembali"}),a.jsx("div",{className:"hn-terminal-hist-spacer"}),l&&a.jsx(L,{size:"sm",variant:"secondary",leftIcon:"copy",onClick:()=>void k(l),children:"Salin transkrip"}),jn(e.kind)&&a.jsx(L,{size:"sm",leftIcon:"play",onClick:()=>r(e),children:"Mulai lagi"})]}),p&&a.jsxs(Qe,{tone:"warn",title:"Sesi terputus — hasilnya tak diketahui",className:"hn-terminal-notice",children:["Panenya sudah lenyap saat hanoman menyala lagi (reboot, ",a.jsx("code",{children:"tmux kill-server"}),", atau host mati), jadi sesi ini tak meninggalkan exit code dan transkripnya kemungkinan besar tak sempat diambil — capture berjalan tepat sebelum pane dibunuh, dan di jalur ini sudah tak ada pane untuk dibaca. Periksa worktree & branch sesi ini sebelum menganggapnya selesai, lalu mulai lagi bila pekerjaannya belum tuntas."]}),a.jsx("div",{className:"hn-terminal-hist-meta",children:b.map(([j,C])=>a.jsxs(d.Fragment,{children:[a.jsx("span",{className:"hn-terminal-hist-key",children:j}),a.jsx("span",{className:"hn-terminal-hist-val",children:C})]},j))}),x==="loading"&&a.jsx("div",{className:"hn-terminal-hist-note",children:"memuat transkrip…"}),x==="none"&&a.jsx("div",{className:"hn-terminal-hist-note",children:p?"Tanpa transkrip — panenya sudah lenyap sebelum hanoman sempat mengambilnya.":"Tanpa transkrip — sesi ini ditutup sebelum fitur riwayat ada, atau panenya tak menyisakan keluaran."}),N&&a.jsx("div",{role:"status",className:N.tone==="err"?"hn-terminal-hist-copy is-err":"hn-terminal-hist-copy",children:N.text}),x==="error"&&a.jsx("div",{className:"hn-terminal-hist-error",children:"Transkrip tak terbaca lagi di server."}),l!==null&&a.jsx("pre",{className:"hn-terminal-hist-pre",children:l})]})}function oi({open:e,projectId:n,projectName:s,projects:r,onProjectChange:l,onClose:u,onCreated:x}){var w;const[g,N]=d.useState("claude"),[h,k]=d.useState("sonnet"),[p,b]=d.useState("medium"),[j,C]=d.useState({claude:{model:"sonnet",effort:"medium"},codex:{...aa},antigravity:{...ta}}),[E,A]=d.useState(!1),[R,y]=d.useState(null),[f,M]=d.useState(null),[K,W]=d.useState(null);d.useEffect(()=>{e&&(y(null),M(null),F.getSettings().then(o=>{const T={claude:{model:o.model,effort:o.effort},codex:{...aa,...o.codex??{}},antigravity:{...ta,...o.antigravity??{}}},V=o.agent??"claude",O=na(T,V);C(T),N(V),k(O.model),b(O.effort)}).catch(o=>{y(`${Q("memuat pengaturan",o)} · memakai default bawaan`)}),F.getCodexVersion().then(o=>W(o.version)).catch(o=>{y(T=>(T?`${T} · `:"")+Q("membaca versi Codex CLI",o))}))},[e]);const v=o=>{N(o);const T=na(j,o);k(T.model),b(T.effort)},I=o=>{k(o),b(T=>Rn(g,o,T))};async function D(){A(!0),M(null);try{const{id:o}=await F.createTerminal(n,{agent:g,model:h,effort:p});x(o),u()}catch(o){M(Q("membuka sesi",o))}finally{A(!1)}}return a.jsxs(te,{open:e,onClose:u,icon:"plus",eyebrow:s,title:"Sesi baru",footer:a.jsxs(a.Fragment,{children:[a.jsx(L,{variant:"ghost",onClick:u,children:"Batal"}),a.jsx(L,{leftIcon:"play",disabled:E,onClick:()=>void D(),children:"Buka sesi"})]}),children:[R&&a.jsx(Qe,{tone:"warn",title:"Pengaturan belum terbaca",className:"hn-terminal-notice",children:R}),f&&a.jsx(Qe,{tone:"err",title:"Sesi belum terbuka",className:"hn-terminal-notice",children:f}),a.jsxs("div",{className:"hn-terminal-intro",children:["Runtime untuk sesi ini. Default dari setelan global; ubah bila perlu. Sesi lahir dengan pilihan ini untuk seluruh hidupnya — ",a.jsx("code",{children:"/model"})," di terminal tetap bisa mengubahnya."]}),r&&l&&r.length>1&&a.jsx(we,{label:"Project",hint:"Direktori repo tempat sesi dibuka.",children:a.jsx(ee,{"aria-label":"Project",value:n,className:"hn-terminal-field-full",options:r.map(o=>({value:o.id,label:o.name})),onChange:o=>l(o.target.value)})}),a.jsx(we,{label:"Agen",hint:"Mesin yang menjalankan sesi ini. Perilaku sesi sama; hanya CLI-nya berbeda.",children:a.jsx(ee,{"aria-label":"Agen",value:g,className:"hn-terminal-field-full",options:wn,onChange:o=>v(o.target.value)})}),a.jsx(we,{label:"Model",children:a.jsx(ee,{"aria-label":"Model",value:h,className:"hn-terminal-field-full",options:Sn(g,h),onChange:o=>I(o.target.value)})}),a.jsx(we,{label:"Effort",children:a.jsx(ee,{"aria-label":"Effort",value:p,className:"hn-terminal-field-full",options:Nn(g,h).map(o=>({value:o,label:o})),onChange:o=>b(o.target.value)})}),g==="antigravity"&&a.jsx(ai,{}),g==="codex"&&In(h,K)&&a.jsxs("div",{"data-testid":"codex-version-note",className:"hn-terminal-codex-note",children:["Codex CLI terpasang ",a.jsx("b",{children:K}),", sedangkan ",a.jsx("b",{children:h})," butuh ",a.jsx("b",{children:(w=Cn(h))==null?void 0:w.minClient}),". Sesi tetap boleh dijalankan, tapi modelnya belum tentu dikenali CLI ini."]})]})}function ci({projectId:e,projects:n,onProjectChange:s,onClose:r,onConfirm:l}){return a.jsx(te,{open:!0,onClose:r,icon:"terminal",title:"Terminal biasa",footer:a.jsxs(a.Fragment,{children:[a.jsx(L,{variant:"ghost",onClick:r,children:"Batal"}),a.jsx(L,{leftIcon:"play",disabled:!e,onClick:()=>l(e),children:"Buka terminal"})]}),children:a.jsx(we,{label:"Project",hint:"Shell dibuka di direktori repo project ini.",children:a.jsx(ee,{"aria-label":"Project",value:e,className:"hn-terminal-field-full",options:n.map(u=>({value:u.id,label:u.name})),onChange:u=>s(u.target.value)})})})}const Ca=()=>({rows:1,cols:1,cells:[null]}),Ra=(e,n)=>[...e.slice(0,n),...e.slice(n+1)],oa=e=>({...e,rows:e.rows+1,cells:[...e.cells,...Array(e.cols).fill(null)],...e.rowSizes?{rowSizes:[...e.rowSizes,1]}:{}});function ca(e){const n=e.cols+1,s=[];for(let r=0;r<e.rows;r++)for(let l=0;l<n;l++)s.push(l<e.cols?e.cells[r*e.cols+l]??null:null);return{...e,cols:n,cells:s,...e.colSizes?{colSizes:[...e.colSizes,1]}:{}}}function ua(e,n){if(e.rows===1||n<0||n>=e.rows)return e;const s=[...e.cells];return s.splice(n*e.cols,e.cols),{...e,rows:e.rows-1,cells:s,...e.rowSizes?{rowSizes:Ra(e.rowSizes,n)}:{}}}function da(e,n){if(e.cols===1||n<0||n>=e.cols)return e;const s=e.cols-1,r=[];for(let l=0;l<e.rows;l++)for(let u=0;u<e.cols;u++)u!==n&&r.push(e.cells[l*e.cols+u]??null);return{...e,cols:s,cells:r,...e.colSizes?{colSizes:Ra(e.colSizes,n)}:{}}}const Ta=.3,ui=(e,n,s)=>Math.min(s,Math.max(n,e));function Ct(e,n,s){if(n<0||n+1>=e.length||s===0)return e;const l=e.reduce((N,h)=>N+h,0)/e.length*Ta,u=e[n]+e[n+1],x=ui(e[n]+s,l,u-l);if(x===e[n])return e;const g=[...e];return g[n]=x,g[n+1]=u-x,g}function Ea(e,n,s){const r=e.colSizes??Array(e.cols).fill(1),l=Ct(r,n,s);return l===r?e:{...e,colSizes:l}}function Aa(e,n,s){const r=e.rowSizes??Array(e.rows).fill(1),l=Ct(r,n,s);return l===r?e:{...e,rowSizes:l}}const di=.05,mi=.15,za=(e,n)=>e.reduce((s,r)=>s+r,0)*(n?mi:di);function hi(e,n,s,r=!1){const l=e.colSizes??Array(e.cols).fill(1);return Ea(e,n,s*za(l,r))}function pi(e,n,s,r=!1){const l=e.rowSizes??Array(e.rows).fill(1);return Aa(e,n,s*za(l,r))}function ma(e,n){const r=e.reduce((x,g)=>x+g,0)/e.length*Ta,l=e[n]+e[n+1],u=Math.round(r/l*100);return{now:Math.round(e[n]/l*100),min:u,max:100-u}}function jt(e,n,s){if(n<0||n>=e.cells.length)return e;const r=e.cells.map(l=>s!==null&&l===s?null:l);return r[n]=s,{...e,cells:r}}const fi=(e,n)=>({...e,cells:e.cells.map(s=>s&&n.has(s)?s:null)}),Da=e=>({id:crypto.randomUUID(),name:e,layout:Ca()});function ha(){const e=Da("Utama");return{groups:[e],active:e.id}}const $e=e=>e.groups.find(n=>n.id===e.active)??e.groups[0];function gi(e,n){const s=Da(n);return{groups:[...e.groups,s],active:s.id}}const bi=(e,n,s)=>({...e,groups:e.groups.map(r=>r.id===n?{...r,name:s}:r)});function ki(e,n){if(e.groups.length===1)return e;const s=e.groups.filter(r=>r.id!==n);return s.length===e.groups.length?e:{groups:s,active:e.active===n?s[0].id:e.active}}const xi=(e,n)=>e.groups.some(s=>s.id===n)?{...e,active:n}:e;function H(e,n){const s=$e(e);return{...e,groups:e.groups.map(r=>r.id===s.id?{...r,layout:n(r.layout)}:r)}}function wt(e,n,s){const r=$e(e),l=s===null?e.groups:e.groups.map(u=>u.id===r.id?u:{...u,layout:jt(u.layout,u.layout.cells.indexOf(s),null)});return{...e,groups:l.map(u=>u.id===r.id?{...u,layout:jt(u.layout,n,s)}:u)}}function je(e,n){const s=$e(e).layout.cells.indexOf(null);return s===-1?e:wt(e,s,n)}const vi=(e,n)=>({...e,groups:e.groups.map(s=>({...s,layout:jt(s.layout,s.layout.cells.indexOf(n),null)}))}),pa=e=>new Set(e.groups.flatMap(n=>n.layout.cells.filter(s=>s!==null))),fa=(e,n)=>({...e,groups:e.groups.map(s=>({...s,layout:fi(s.layout,n)}))}),Ma="hanoman.terminal.workspace",Fa="hanoman.terminal.layout",Se=e=>Fe.parse({version:1,groups:e.groups});function Ze(e,n){const s=e.groups,r=n&&s.some(l=>l.id===n)?n:s[0].id;return{groups:s,active:r}}function yi(e){try{const n=JSON.parse(e);if(!n||typeof n!="object")return null;const s=n,r=Fe.parse({version:1,groups:s.groups});return{workspace:r,active:typeof s.active=="string"&&r.groups.some(l=>l.id===s.active)?s.active:r.groups[0].id}}catch{return null}}function ji(){try{const e=localStorage.getItem(Ma);if(e)return yi(e);const n=localStorage.getItem(Fa);if(!n)return null;const s=JSON.parse(n),r={id:crypto.randomUUID(),name:"Utama",layout:s};return{workspace:Fe.parse({version:1,groups:[r]}),active:r.id}}catch{return null}}function bt(){try{localStorage.removeItem(Ma),localStorage.removeItem(Fa)}catch{}}const $a=e=>`hanoman.terminal.workspace.v2.${encodeURIComponent(e)}`;function wi(e){try{const n=localStorage.getItem($a(e));if(!n)return null;const s=JSON.parse(n),r=Fe.parse(s.workspace);if(!Number.isInteger(s.revision)||(s.revision??-1)<0)return null;const l=typeof s.active=="string"&&r.groups.some(u=>u.id===s.active)?s.active:r.groups[0].id;return{workspace:r,revision:s.revision,active:l}}catch{return null}}function kt(e,n){try{const s=Fe.parse(n.workspace);if(!Number.isInteger(n.revision)||n.revision<0)return;const r=s.groups.some(l=>l.id===n.active)?n.active:s.groups[0].id;localStorage.setItem($a(e),JSON.stringify({workspace:s,revision:n.revision,active:r}))}catch{}}function xt(e){if(!(e instanceof Me)||e.status!==409)return null;const n=e.detail;if((n==null?void 0:n.code)!=="revision-conflict")return null;const s=Tn.safeParse(n.current);return s.success?s.data:null}function Si(e){const n=P.useRef(null);n.current||(n.current=ha());const[s,r]=P.useState(n.current),[l,u]=P.useState("loading"),[x,g]=P.useState(null),[N,h]=P.useState(!1),k=P.useRef(s),p=P.useRef(0),b=P.useRef(!1),j=P.useRef(Promise.resolve()),C=P.useRef(0),E=P.useCallback(v=>{k.current=v,r(v)},[]),A=P.useCallback(v=>{b.current=v,h(v)},[]),R=P.useCallback(v=>{const I=j.current.then(v,v);return j.current=I.then(()=>{},()=>{}),I},[]),y=P.useCallback((v,I="ready",D=null,w=k.current.active)=>{const o=v.workspace?Ze(v.workspace,w):ha();p.current=v.revision,E(o),u(I),g(D),A(!0),v.workspace&&kt(e,{workspace:v.workspace,revision:v.revision,active:o.active})},[E,A,e]),f=P.useCallback(v=>{const I=wi(e);I&&(p.current=I.revision,E(Ze(I.workspace,I.active))),A(!1),u("recovering"),g(v instanceof Error?v.message:"Layout server belum tersambung")},[E,A,e]),M=P.useCallback(()=>R(async()=>{try{y(await F.getTerminalWorkspace())}catch(v){f(v)}}),[y,R,f]);P.useEffect(()=>{const v=++C.current;return u("loading"),g(null),A(!1),R(async()=>{try{const I=await F.getTerminalWorkspace();if(v!==C.current)return;if(I.workspace){y(I),bt();return}const D=ji();if(!D){y(I);return}try{const w=await F.putTerminalWorkspace({baseRevision:I.revision,workspace:D.workspace});if(v!==C.current)return;E(Ze(w.workspace,D.active)),p.current=w.revision,kt(e,{workspace:w.workspace,revision:w.revision,active:D.active}),bt(),u("ready"),g(null),A(!0)}catch(w){const o=xt(w);o!=null&&o.workspace?(y(o,"conflict","Layout server lebih baru; layout lokal lama tidak diunggah"),bt()):f(w)}}catch(I){v===C.current&&f(I)}}),()=>{C.current+=1}},[y,R,f,E,A,e]),P.useEffect(()=>{const v=()=>{M()},I=()=>{document.visibilityState==="visible"&&M()};return window.addEventListener("focus",v),document.addEventListener("visibilitychange",I),()=>{window.removeEventListener("focus",v),document.removeEventListener("visibilitychange",I)}},[M]);const K=P.useCallback(v=>R(async()=>{if(!b.current)return!1;const I=v(k.current);let D,w;try{D=Se(I),w=Se(k.current)}catch{return u("conflict"),g("Layout tidak valid dan tidak disimpan"),!1}if(wa(D,w))return!0;try{return y(await F.putTerminalWorkspace({baseRevision:p.current,workspace:D}),"ready",null,I.active),!0}catch(o){const T=xt(o);if(!(T!=null&&T.workspace))return f(o),!1;const V=v(Ze(T.workspace,k.current.active));try{const O=await F.putTerminalWorkspace({baseRevision:T.revision,workspace:Se(V)});return y(O,"conflict","Layout berubah di perangkat lain; perubahan ini diterapkan ulang",V.active),!0}catch(O){if(!xt(O)&&!(O instanceof Me&&O.status===409))return f(O),!1;try{y(await F.getTerminalWorkspace(),"conflict","Layout berubah lagi di perangkat lain; state terbaru dimuat")}catch(ue){f(ue)}return!1}}}),[y,R,f]),W=P.useCallback(v=>{const I=xi(k.current,v);E(I);const D=Se(I);kt(e,{workspace:D,revision:p.current,active:I.active})},[E,e]);return{workspace:s,status:l,message:x,writable:N,mutate:K,setActive:W,refresh:M}}const Ni=En("focus","grid"),ga={attention:0,running:1,open:1,failed:2,done:3};function Pa(e,n){return e.exited?e.exitCode?{tone:"failed",label:`Gagal · exit ${e.exitCode}`}:{tone:"done",label:"Selesai"}:n?{tone:"done",label:"Selesai"}:e.deciding?{tone:"attention",label:"Lead memutuskan"}:e.decision?{tone:"attention",label:"Menunggu keputusan"}:e.specId?{tone:"running",label:"Berjalan"}:{tone:"open",label:"Terbuka"}}function Ii(e){const n=e.startedAt;return typeof n=="number"&&Number.isFinite(n)&&n>0?n*1e3:null}function Ci(e,n){const s=e.map((r,l)=>({session:r,index:l,rank:ga[Pa(r,n.has(r.id)).tone]}));return s.sort((r,l)=>{if(r.rank!==l.rank)return r.rank-l.rank;if(r.rank===ga.attention){const u=r.session.decisionAt?Date.parse(r.session.decisionAt):Number.NaN,x=l.session.decisionAt?Date.parse(l.session.decisionAt):Number.NaN,g=Number.isNaN(u)?Number.POSITIVE_INFINITY:u,N=Number.isNaN(x)?Number.POSITIVE_INFINITY:x;if(g!==N)return g<N?-1:1}return r.index-l.index}),s.map(r=>r.session)}function Ri(e){const n=new Map;for(const s of e){const r=n.get(s.projectId);r?r.push(s):n.set(s.projectId,[s])}return[...n.values()].flat()}function Ti(e,n){if(n){const s=e.find(r=>r.id===n);if(s)return s}return e[0]??null}function Ei(e,n,s){if(s<=0)return null;const r=e<0?0:e;switch(n){case"ArrowDown":return Math.min(r+1,s-1);case"ArrowUp":return Math.max(r-1,0);case"Home":return 0;case"End":return s-1;default:return null}}const La={attention:"awaiting",running:"running",open:"idle",failed:"failed",done:"done"};function Ai(e){const[n,s]=d.useState(()=>Date.now());return d.useEffect(()=>{const r=setInterval(()=>s(Date.now()),e);return()=>clearInterval(r)},[e]),n}function ba({items:e,focusedId:n,onFocus:s,menuFor:r,label:l="Daftar sesi"}){const u=Ai(3e4),x=d.useRef([]),g=new Set(e.map(k=>k.session.projectId)).size>1,N=e.findIndex(k=>k.session.id===n),h=k=>{var C;const p=x.current.indexOf(k.target);if(p<0)return;const b=Ei(p,k.key,e.length);if(b===null)return;k.preventDefault();const j=e[b];j&&(s(j.session.id),(C=x.current[b])==null||C.focus())};return a.jsx("ul",{role:"list","aria-label":l,className:"hn-terminal-rail-list",onKeyDown:h,children:e.map((k,p)=>{var R;const{session:b,status:j}=k,C=b.id===n,E=C||N<0&&p===0,A=k.startedMs!==null?An(k.startedMs,u):"";return a.jsxs(d.Fragment,{children:[g&&k.session.projectId!==((R=e[p-1])==null?void 0:R.session.projectId)&&a.jsx("li",{role:"presentation",className:"hn-terminal-rail-group",children:k.projectName}),a.jsx("li",{className:"hn-terminal-rail-item",children:a.jsxs("div",{className:`hn-terminal-rail-row${C?" is-focused":""}`,"data-tone":j.tone,children:[a.jsxs("button",{type:"button",className:"hn-terminal-rail-main",ref:y=>{x.current[p]=y},tabIndex:E?0:-1,"aria-current":C?"true":void 0,title:k.label,onClick:()=>s(b.id),children:[a.jsx("span",{className:"hn-terminal-rail-name",children:k.label}),a.jsxs("span",{className:"hn-terminal-rail-meta",children:[a.jsx(ge,{status:La[j.tone],variant:"dot",size:"sm",children:j.label}),A&&a.jsx("span",{className:"hn-terminal-rail-time",children:A})]})]}),a.jsx(Ne,{label:`Aksi sesi ${b.id} di daftar`,items:r(b)})]})})]},b.id)})})}const zi=[],Di=e=>!!(e.binding??e.repoDir),Mi=e=>{var n;return((n=e.find(Di)??e[0])==null?void 0:n.id)??""},Fi=e=>e instanceof Me&&e.status===400&&typeof e.detail=="object"&&e.detail!==null&&e.detail.needsBind===!0;function Xi({userId:e="test-user",projects:n,backlog:s=zi,focusSession:r,startedSession:l,onStartedSessionHandled:u,onStartBacklog:x,onOpenReview:g,onOpenSessionReview:N,titleOf:h,onIntegrate:k,onIntegrateSession:p,specOf:b,sessions:j,setSessions:C,onOpenProject:E}){const[A,R]=d.useState([]),y=j??A,f=C??R,[M,K]=d.useState([]),W=Si(e),{workspace:v,status:I,message:D,writable:w,mutate:o,setActive:T,refresh:V}=W,[O,ue]=fe("terminal","project",Mi(n),Qn),Ie=Sa(),ke=Fn(),re=ke==="mobile",[J,de]=fe("terminal","fontSize",Ie?Yn:Jn,Vn),[le,Pe]=fe("terminal","keys",Ie&&!re,Je),[q,xe]=fe("terminal","predict",!0,Je),[ae,Le]=fe("terminal","diag",!1,Je),[ne,Ka]=fe("terminal","sr",!1,Je),Tt=t=>de(i=>Hn(i+t)),[me,Et]=d.useState(!1),[ie,et]=d.useState(null),[_a,Oe]=d.useState(!1),[Ga,Be]=d.useState(null),[Wa,At]=d.useState(!1),[qa,tt]=d.useState(!1),[Ua,Ke]=d.useState(!1),[Ha,at]=fe("terminal","view","focus",Ni),U=Ha==="focus",[nt,Ce]=d.useState(null),[it,Va]=d.useState(()=>new Set),[Ya,Ja]=d.useState(null),[zt,Dt]=d.useState(!1),[Xa,Mt]=d.useState(!1),[he,Re]=d.useState(null),[_e,Ft]=d.useState(!1),[Ge,$t]=d.useState(null),st=$n(),{confirm:Za,dialog:Qa}=Pn(),z=$e(v).layout,rt=z.rows===1&&z.cols===1&&!z.cells[0]&&y.length===0,lt=d.useRef(null),[en,tn]=d.useState(Number.POSITIVE_INFINITY);d.useEffect(()=>{const t=lt.current;if(!t||typeof ResizeObserver!="function")return;const i=new ResizeObserver(c=>{var S;const m=((S=c[0])==null?void 0:S.contentRect.width)??t.getBoundingClientRect().width;m>0&&tn(m)});return i.observe(t),()=>i.disconnect()},[rt]);const an=ke==="tablet"&&Ln(z.cols,en,Un),B=re||an,[X,We]=d.useState(0),[se,qe]=d.useState(null),ot=d.useRef(null),Te=t=>{Ce(t),qe(t)},nn=d.useCallback((t,i)=>{Va(c=>{if(c.has(t)===i)return c;const m=new Set(c);return i?m.add(t):m.delete(t),m})},[]),Pt=d.useMemo(()=>Ri(Ci(y,it)),[y,it]),Ue=Ti(Pt,nt),He=(Ue==null?void 0:Ue.id)??null;d.useEffect(()=>{He&&He!==nt&&Ce(He)},[He,nt]);const[ve,sn]=d.useState(!1),[Ve,Lt]=d.useState(null),[rn,ln]=d.useState(0);d.useEffect(()=>{let t=!0;return F.listTerminals().then(i=>{t&&(Lt(null),f(i),sn(!0))}).catch(i=>{t&&Lt(Q("memuat daftar sesi",i))}),()=>{t=!1}},[rn]);const[on,oe]=On();d.useEffect(()=>Bn(t=>{t.t==="sessions"&&!j?f(t.sessions):t.t==="cleanups"&&K(t.cleanups)}),[]),d.useEffect(()=>{if(!ve||!w)return;const t=new Set(y.map(c=>c.id)),i=fa(v,t);wa(Se(i),Se(v))||o(c=>fa(c,t))},[o,y,ve,w,v]),d.useEffect(()=>{!l||l.specId==null||!ve||(f(t=>t.some(i=>i.id===l.id)?t:[...t,{...l,cwd:"",exited:!1}]),Ce(l.id),qe(l.id),u==null||u())},[u,ve,l]);const ct=d.useRef(null);d.useEffect(()=>{if(!r){ot.current=null,ct.current=null;return}if(!(!ve||ot.current===r)){if(!y.some(t=>t.id===r&&!t.exited)){if(ct.current===r)return;ct.current=r,F.listSessionHistory({q:r,limit:1}).then(t=>oe(ia,"warn","history",t.total>0?{action:{label:Kn,onAction:()=>Ke(!0)},duration:7e3}:void 0)).catch(()=>{oe(ia,"warn","history")});return}ot.current=r,Ce(r),qe(r)}},[r,y,ve,oe]),d.useEffect(()=>{if(!se)return;const t=v.groups.find(i=>i.layout.cells.includes(se));if(t){t.id!==v.active&&T(t.id);return}w&&o(i=>{if(pa(i).has(se))return i;const c=je(i,se);return c!==i||!B?c:wt(i,X,se)})},[X,B,o,se,T,w,v]),d.useEffect(()=>{ie&&!y.some(t=>t.id===ie)&&et(null)},[ie,y]);const ut=M.filter(t=>t.error),Z=t=>y.find(i=>i.id===t)??null,Y=d.useCallback(t=>{var i;return((i=n.find(c=>c.id===t))==null?void 0:i.name)??t},[n]);function cn(t){f(i=>i.some(c=>c.id===t)?i:[...i,{id:t,projectId:O,cwd:"",exited:!1}]),o(i=>je(i,t)),Te(t)}async function Ot(t){if(!t)return;tt(!1);let i;try{({id:i}=await F.createShell(t))}catch(c){Fi(c)?oe(`Project ${Y(t)} belum terhubung ke folder repo — hubungkan dulu.`,"err","folder-git-2",E?{action:{label:"Buka project",onAction:()=>E(t)}}:void 0):oe(Q("membuka terminal biasa",c),"err","x-circle");return}f(c=>[...c,{id:i,projectId:t,cwd:"",exited:!1}]),o(c=>je(c,i)),Te(i)}async function Bt(t,i){if(x&&!i){Oe(!1),Be(null),x(t);return}const c=Zn(t.source);try{const{id:m}=await F.startSession({spec:t.id,flow:c,...i?{force:i}:{}});f(S=>S.some($=>$.id===m)?S:[...S,{id:m,projectId:t.projectId,specId:t.id,flow:c,cwd:"",exited:!1}]),o(S=>je(S,m)),Te(m),Oe(!1),Be(null)}catch(m){if(st.offerRetry(m,t.id,$=>Bt(t,$)))return;const S=m instanceof Me&&(m.status===400||m.status===422);Be(`${t.id} · gagal mulai${S?" · project belum punya repoDir":""}`)}}async function Kt(t,i){try{const c=t.specId?await F.startSession({spec:t.specId,flow:t.flow??"feature",agent:t.agent==="antigravity"?"antigravity":t.agent==="codex"?"codex":"claude",...t.model?{model:t.model}:{},...t.effort?{effort:t.effort}:{},...i?{force:i}:{}}):t.kind==="shell"?await F.createShell(t.projectId):t.kind==="terminal"?await F.createTerminal(t.projectId,{agent:t.agent==="antigravity"?"antigravity":t.agent==="codex"?"codex":"claude",...t.model?{model:t.model}:{},...t.effort?{effort:t.effort}:{}}):await(i?F.createTerminalFlow(t.projectId,t.kind,{force:i}):F.createTerminalFlow(t.projectId,t.kind));f(m=>m.some(S=>S.id===c.id)?m:[...m,{id:c.id,projectId:t.projectId,specId:t.specId??void 0,cwd:"",exited:!1}]),o(m=>je(m,c.id)),Te(c.id),Ke(!1)}catch(c){if((t.specId||t.kind!=="shell"&&t.kind!=="terminal")&&st.offerRetry(c,`${t.projectId} · ${t.title??t.specId??t.kind}`,m=>Kt(t,m)))return}}const _t=new Set(y.filter(t=>t.specId&&!t.exited).map(t=>t.specId)),un=s.filter(t=>t.stage!=="done"&&!_t.has(t.id));function Gt(t){f(i=>i.filter(c=>c.id!==t)),F.deleteTerminal(t).catch(i=>{i instanceof Me&&i.status===404||oe(Q(`menutup sesi ${t.slice(0,6)}`,i),"err","x-circle")})}async function Wt(){if(!he||_e)return;const{id:t,value:i}=he;Ft(!0);try{const c=await F.renameTerminal(t,i);f(m=>m.map(S=>{if(S.id!==t)return S;const{name:$,...G}=S;return c.name?{...G,name:c.name}:G})),Re(null),oe(c.name?"Nama sesi disimpan":"Nama kustom dihapus","ok")}catch(c){oe(Q("mengganti nama sesi",c),"err","x-circle")}finally{Ft(!1)}}async function dt(t){const i=Z(t),c=`${i?be(i,Y,h):t} · ${t.slice(0,6)}`,m=!!i&&!i.exited;await Za({title:`Tutup sesi "${c}"?`,impact:[m?"Agen yang sedang berjalan di sesi ini akan dihentikan.":"Sesi ini sudah berhenti, jadi tidak ada agen yang perlu dihentikan.","Worktree sesi ini ikut dibersihkan dari disk."],confirmLabel:"Tutup sesi",icon:"square",tone:"danger"})&&Gt(t)}const dn=d.useCallback((t,i)=>{f(c=>c.map(m=>m.id===t?{...m,exited:!0,exitCode:i}:m))},[]),qt={killSession:Gt,requestKill:dt,detach:t=>{o(i=>vi(i,t))},markExited:dn,setFullId:et,openDialog:(t,i)=>$t({kind:t,sessionId:i}),openRename:t=>{var i;return Re({id:t,value:((i=Z(t))==null?void 0:i.name)??""})},props:{onOpenReview:g,onOpenSessionReview:N,titleOf:h,onIntegrate:k,onIntegrateSession:p,specOf:b}},_=d.useRef(qt);_.current=qt;const Ut=d.useRef(new Map),pe=t=>{let i=Ut.current.get(t);return i||(i={onClose:()=>void _.current.requestKill(t),onForget:()=>_.current.killSession(t),onDetach:()=>_.current.detach(t),onExit:c=>_.current.markExited(t,c),onFullscreen:()=>_.current.setFullId(t),onDialog:c=>_.current.openDialog(c,t),onRename:()=>_.current.openRename(t)},Ut.current.set(t,i)),i},Ht=d.useRef(new Map),mn=t=>{let i=Ht.current.get(t);return i||(i=(c,m)=>{Ja({sessionId:t,phases:c}),nn(t,m)},Ht.current.set(t,i)),i},hn=t=>Ba(t,{label:be(t,Y,h),canArrange:w,specOf:b,onReview:g,onSessionReview:N,onIntegrate:k,onIntegrateSession:p,onDialog:pe(t.id).onDialog,onDetach:pe(t.id).onDetach,onFullscreen:pe(t.id).onFullscreen,onKill:()=>void dt(t.id),onRename:pe(t.id).onRename}),ye=d.useRef({onOpenReview:t=>{var i,c;return(c=(i=_.current.props).onOpenReview)==null?void 0:c.call(i,t)},onOpenSessionReview:(t,i)=>{var c,m;return(m=(c=_.current.props).onOpenSessionReview)==null?void 0:m.call(c,t,i)},titleOf:t=>{var i,c;return(c=(i=_.current.props).titleOf)==null?void 0:c.call(i,t)},onIntegrate:(t,i,c)=>{var m,S;return(S=(m=_.current.props).onIntegrate)==null?void 0:S.call(m,t,i,c)},onIntegrateSession:(t,i,c)=>{var m,S;return(S=(m=_.current.props).onIntegrateSession)==null?void 0:S.call(m,t,i,c)},specOf:t=>{var i,c;return(c=(i=_.current.props).specOf)==null?void 0:c.call(i,t)}}).current,pn=(t,i)=>{We(t),o(c=>wt(c,t,i))},fn=t=>{Te(t),o(i=>je(i,t))},gn=pa(v),mt=y.filter(t=>!gn.has(t.id));d.useEffect(()=>{if(!se)return;const t=z.cells.indexOf(se);t<0||(We(t),qe(null))},[z.cells,se]),d.useEffect(()=>{X>=z.cells.length&&We(Math.max(0,z.cells.length-1))},[X,z.cells.length]);const Ye=d.useRef(null),[ce,ht]=d.useState(null),pt=(ce==null?void 0:ce.axis)==="col"?ce.sizes:z.colSizes??Array(z.cols).fill(1),ft=(ce==null?void 0:ce.axis)==="row"?ce.sizes:z.rowSizes??Array(z.rows).fill(1);function Vt(t,i,c){var $,G,Ee;if(!w)return;const m=($=lt.current)==null?void 0:$.getBoundingClientRect();if(!m)return;(Ee=(G=c.currentTarget).setPointerCapture)==null||Ee.call(G,c.pointerId);const S=t==="col"?pt:ft;Ye.current={axis:t,index:i,pointerId:c.pointerId,start:t==="col"?c.clientX:c.clientY,extent:t==="col"?m.width:m.height,startSizes:S,latest:S},ht({axis:t,sizes:S})}function Yt(t){const i=Ye.current;if(!i||i.pointerId!==t.pointerId)return;const c=i.axis==="col"?t.clientX:t.clientY,m=i.startSizes.reduce(($,G)=>$+G,0),S=(c-i.start)/i.extent*m;i.latest=Ct(i.startSizes,i.index,S),ht({axis:i.axis,sizes:i.latest})}function Jt(t){var c,m;const i=Ye.current;!i||i.pointerId!==t.pointerId||(Ye.current=null,(m=(c=t.currentTarget).releasePointerCapture)==null||m.call(c,t.pointerId),ht(null),i.latest!==i.startSizes&&o(S=>H(S,$=>i.axis==="col"?{...$,colSizes:i.latest}:{...$,rowSizes:i.latest})))}function Xt(t,i,c){if(!w)return;const m=t==="col"?"ArrowRight":"ArrowDown",S=t==="col"?"ArrowLeft":"ArrowUp",$=c.key===m?1:c.key===S?-1:0;$!==0&&(c.preventDefault(),o(G=>H(G,Ee=>t==="col"?hi(Ee,i,$,c.shiftKey):pi(Ee,i,$,c.shiftKey))))}function Zt(t,i){w&&o(c=>H(c,m=>{const S=t==="col"?m.colSizes??Array(m.cols).fill(1):m.rowSizes??Array(m.rows).fill(1),G=(S[i]+S[i+1])/2-S[i];return t==="col"?Ea(m,i,G):Aa(m,i,G)}))}const Qt=a.jsxs("div",{className:"hn-terminal-display",children:[a.jsxs("div",{className:"hn-dense-row hn-terminal-display-row",children:[a.jsx("span",{className:"hn-terminal-display-label",children:"Ukuran teks terminal"}),a.jsx(gt,{size:"sm",icon:"minus",label:"Perkecil teks terminal",disabled:J<=_n,onClick:()=>Tt(-1)}),a.jsxs("span",{className:"hn-terminal-display-value",children:[J,"px"]}),a.jsx(gt,{size:"sm",icon:"plus",label:"Perbesar teks terminal",disabled:J>=Gn,onClick:()=>Tt(1)})]}),a.jsxs("div",{className:"hn-dense-row hn-terminal-display-row",children:[a.jsx("span",{className:"hn-terminal-display-label",children:"Papan tombol layar (Esc · panah · Enter)"}),a.jsx(L,{size:"sm",variant:"secondary","aria-pressed":le,onClick:()=>Pe(t=>!t),children:le?"Sembunyikan":"Tampilkan"})]}),a.jsxs("div",{className:"hn-dense-row hn-terminal-display-row",children:[a.jsx("span",{className:"hn-terminal-display-label",children:"Ketik responsif (huruf tampil sebelum echo server)"}),a.jsx(L,{size:"sm",variant:"secondary","aria-pressed":q,"aria-label":`${q?"Matikan":"Nyalakan"} ketik responsif`,onClick:()=>xe(t=>!t),children:q?"Matikan":"Nyalakan"})]}),a.jsxs("div",{className:"hn-dense-row hn-terminal-display-row",children:[a.jsx("span",{id:"terminal-sr-label",className:"hn-terminal-display-label",children:"Mode pembaca layar"}),a.jsx(L,{size:"sm",variant:"secondary","aria-pressed":ne,"aria-describedby":"terminal-sr-hint","aria-label":`${ne?"Matikan":"Nyalakan"} mode pembaca layar`,onClick:()=>Ka(t=>!t),children:ne?"Matikan":"Nyalakan"})]}),a.jsx("p",{id:"terminal-sr-hint",className:"hn-terminal-sr-hint",children:"Untuk pembaca layar: teks terminal tersedia di DOM; kecepatan lebih rendah. Tab dikirim ke sesi (tidak memindahkan fokus). Untuk keluar dari terminal tekan Ctrl+Shift+Esc."}),!U&&a.jsxs("div",{className:"hn-dense-row hn-terminal-display-row",children:[a.jsx("span",{id:"terminal-reset-grid-hint",className:"hn-terminal-display-label",children:'Kembalikan grid ke 1 kolom × 1 baris (sesi lain pindah ke "belum di grid")'}),a.jsx(L,{size:"sm",variant:"secondary","aria-describedby":"terminal-reset-grid-hint",disabled:!w||z.cols===1&&z.rows===1,onClick:()=>void o(t=>H(t,()=>Ca())),children:"Reset grid"})]}),a.jsxs("details",{className:"hn-terminal-diag",children:[a.jsxs("summary",{className:"hn-terminal-diag-summary",children:["Diagnostik",ae?" · perekaman aktif":""]}),a.jsxs("div",{className:"hn-dense-row hn-terminal-display-row hn-terminal-diag-row",children:[a.jsx("span",{className:"hn-terminal-display-label",children:"Rekam jalur ketik — mencatat setiap tombol yang ditekan di pane. Nyalakan hanya saat menyelidiki masalah ketik."}),a.jsx(L,{size:"sm",variant:"secondary","aria-pressed":ae,"aria-label":`${ae?"Matikan":"Nyalakan"} rekam jalur ketik`,onClick:()=>Le(t=>!t),children:ae?"Matikan":"Nyalakan"})]})]})]}),ea=[{key:"backlog",label:"Ambil backlog",icon:"inbox",onSelect:()=>{Be(null),Oe(!0)}},{key:"history",label:"Riwayat sesi",icon:"history",onSelect:()=>Ke(!0)},{key:"shell",label:"Terminal biasa",icon:"terminal",onSelect:()=>n.length>1?tt(!0):void Ot(O)}],bn=[{key:"col+",label:"+ Kolom",icon:"columns-2",disabled:!w,onSelect:()=>void o(t=>H(t,ca))},{key:"row+",label:"+ Baris",icon:"rows-2",disabled:!w,onSelect:()=>void o(t=>H(t,oa))},{key:"col-",label:"Hapus kolom aktif",icon:"columns-2",disabled:!w||z.cols===1,onSelect:()=>void o(t=>H(t,i=>da(i,X%i.cols)))},{key:"row-",label:"Hapus baris aktif",icon:"rows-2",disabled:!w||z.rows===1,onSelect:()=>void o(t=>H(t,i=>ua(i,Math.floor(X/i.cols))))}],kn=[{key:"mode",label:U?"Pakai mode Grid":"Pakai mode Fokus",icon:U?"columns-2":"terminal",onSelect:()=>at(U?"grid":"focus")},{key:"full",label:me?"Keluar layar penuh":"Layar penuh",icon:me?"minimize-2":"maximize-2",onSelect:()=>Et(t=>!t)},{key:"display",label:"Tampilan terminal",icon:"sliders",onSelect:()=>Mt(!0)}];return a.jsxs("div",{"data-testid":"terminal-root",className:me?"hn-terminal-screen is-maxed":"hn-terminal-screen",children:[a.jsxs("div",{className:"hn-terminal-toolbar",role:"group","aria-label":"Terminal",children:[a.jsx(L,{size:"sm",leftIcon:"plus",title:"Pilih runtime lalu buka sesi agen di direktori project. Agen berjalan dengan izin penuh (claude --dangerously-skip-permissions).",onClick:()=>At(!0),children:"Sesi baru"}),re?a.jsxs(a.Fragment,{children:[a.jsx(ya,{compact:!0,items:ea}),U&&y.length>0&&a.jsxs("button",{type:"button",className:"hn-terminal-rail-toggle","aria-haspopup":"dialog","aria-expanded":zt,onClick:()=>Dt(!0),children:["Sesi · ",y.length]}),a.jsx(Ne,{label:"Menu terminal",title:"Terminal",items:kn})]}):a.jsxs(a.Fragment,{children:[a.jsx(ya,{items:ea}),a.jsxs("div",{className:"hn-terminal-seg",role:"group","aria-label":"Mode tampilan terminal",children:[a.jsx("button",{type:"button",className:"hn-terminal-seg-btn","aria-pressed":U,title:"Satu terminal fokus dengan daftar sesi di samping",onClick:()=>at("focus"),children:"Fokus"}),a.jsx("button",{type:"button",className:"hn-terminal-seg-btn","aria-pressed":!U,title:"Beberapa terminal sekaligus dalam grid",onClick:()=>at("grid"),children:"Grid"})]}),a.jsx(Ne,{label:"Tampilan terminal",icon:"sliders",items:[],children:Qt}),a.jsx(gt,{size:"sm",icon:me?"minimize-2":"maximize-2",label:me?"Keluar layar penuh":"Layar penuh","aria-pressed":me,onClick:()=>Et(t=>!t)})]})]}),(I!=="ready"||M.length>0)&&a.jsxs("div",{className:"hn-terminal-status",children:[I!=="ready"&&a.jsx("span",{"data-testid":"terminal-workspace-status",title:D??void 0,className:I==="conflict"?"hn-terminal-status-warn":void 0,children:I==="loading"?"Memuat layout server…":I==="recovering"?a.jsxs(a.Fragment,{children:[a.jsx("span",{children:"Layout server belum tersambung"})," ",a.jsx("button",{type:"button",onClick:()=>void V(),children:"Coba lagi"})]}):D??"Layout berubah di perangkat lain"}),M.length>0&&a.jsx("span",{"data-testid":"worktree-cleanups",title:M.map(t=>`${t.sessionId}${t.error?` — ${t.error}`:""}`).join(`
|
|
1
|
+
import{h as F,i as Q,j as a,M as te,f as St,g as ee,a3 as xn,a4 as ja,m as ze,n as vt,I as De,a2 as vn,Z as yn,B as L,a5 as jn,C as Qe,a6 as ta,a7 as aa,a8 as na,e as we,a9 as wn,aa as Sn,ab as Nn,ac as In,ad as Cn,ae as Rn,af as Fe,ag as wa,ah as Me,ai as Tn,r as En,a1 as An,Y as ge,O as Ne,aj as zn,ak as Dn,al as yt,am as Mn,q as fe,an as Sa,b as Fn,ao as $n,d as Pn,ap as Ln,p as On,aq as Bn,ar as ia,as as Kn,o as gt,at as _n,au as Gn,c as Wn,av as qn,aw as sa,ax as Un,ay as Hn,V as Vn,az as Yn,aA as Jn,aB as Je,aC as Nt,aD as Xn,aE as Zn,D as Qn,aF as ei,aG as ra,aH as ti}from"./index-R2HBkTbR.js";import{R as d,r as P}from"./react-DfGhg7ZW.js";import"./markdown-CWEY34jk.js";import{A as ai}from"./fields-Bhl01LnE.js";import"./xterm-3VOAfa_q.js";function It(e){return e.endedAt?e.endedReason==="reconciled"?"interrupted":e.exitCode===null||e.exitCode===0?"completed":"failed":"running"}const Xe=new Set;let Ae;function ni(e){return Xe.add(e),Ae||(Ae=setInterval(()=>{for(const n of[...Xe])n()},1e3)),()=>{Xe.delete(e),Xe.size===0&&Ae&&(clearInterval(Ae),Ae=void 0)}}const la=20;function ii(e,n){if(!n)return"—";const s=new Date(n).getTime()-new Date(e).getTime();if(!Number.isFinite(s)||s<0)return"—";const r=Math.round(s/1e3);if(r<60)return`${r} dtk`;const l=Math.round(r/60);return l<60?`${l} mnt`:`${Math.floor(l/60)} jam ${l%60} mnt`}function si(e){switch(It(e)){case"running":return{label:"berjalan",tone:"neutral"};case"interrupted":return{label:"terputus",tone:"warn"};case"failed":return{label:`exit ${e.exitCode}`,tone:"err"};default:return{label:"selesai",tone:"ok"}}}const Na=e=>It(e)==="interrupted"?"—":ii(e.startedAt,e.endedAt),Ia=e=>ja[e]??e;function ri({projects:e,onClose:n,onRestart:s}){const[r,l]=d.useState([]),[u,x]=d.useState(0),[g,N]=d.useState(1),[h,k]=d.useState(!1),[p,b]=d.useState(""),[j,C]=d.useState(""),[E,A]=d.useState(""),[R,y]=d.useState(""),[f,M]=d.useState(null),[K,W]=d.useState(null),[v,I]=d.useState(0);d.useEffect(()=>{const o=setTimeout(()=>y(E.trim()),250);return()=>clearTimeout(o)},[E]),d.useEffect(()=>{N(1)},[p,j,R]),d.useEffect(()=>{let o=!0;return k(!0),F.listSessionHistory({projectId:p||void 0,kind:j||void 0,q:R||void 0,page:g,limit:la}).then(T=>{o&&(W(null),x(T.total),l(T.items))}).catch(T=>{o&&(l([]),x(0),W(Q("memuat riwayat sesi",T)))}).finally(()=>{o&&k(!1)}),()=>{o=!1}},[p,j,R,g,v]);const D=yn(u,g,la),w=o=>{var T;return((T=e.find(V=>V.id===o))==null?void 0:T.name)??o};return a.jsxs(te,{open:!0,title:"Riwayat sesi",icon:"history",onClose:n,width:900,children:[a.jsxs("div",{className:"hn-terminal-hist-toolbar",children:[a.jsx(St,{size:"sm",leftIcon:"search",placeholder:"mis. spec-412 atau reverse","aria-label":"Cari riwayat sesi",value:E,onChange:o=>A(o.target.value),className:"hn-terminal-hist-search"}),a.jsx(ee,{size:"sm","aria-label":"Filter project",value:p,onChange:o=>b(o.target.value),options:[{value:"",label:"Semua project"}].concat(e.map(o=>({value:o.id,label:o.name})))}),a.jsx(ee,{size:"sm","aria-label":"Filter jenis",value:j,onChange:o=>C(o.target.value),options:[{value:"",label:"Semua jenis"}].concat(xn.map(o=>({value:o,label:ja[o]})))})]}),K?a.jsx(ze,{kind:"error",icon:"history",title:"Riwayat belum bisa dimuat",hint:K,action:()=>I(o=>o+1),actionLabel:"Coba lagi"}):r.length===0&&!h?a.jsx(ze,{kind:"empty",icon:"history",title:"Belum ada riwayat sesi",hint:"Riwayat terisi sendiri saat sesi terminal dibuka lalu ditutup — termasuk sesi backlog, terminal biasa, dan sesi project-level."}):a.jsxs("div",{className:"hn-terminal-hist-list",children:[r.map(o=>{const T=si(o);return a.jsx("button",{onClick:()=>M(o),className:"hn-terminal-hist-row",children:a.jsxs("span",{className:"hn-dense-row hn-picker-row hn-terminal-hist-main",children:[a.jsx("span",{className:"hn-terminal-hist-when",children:new Date(o.startedAt).toLocaleString("id-ID")}),a.jsx(vt,{size:"sm",tone:"neutral",children:Ia(o.kind)}),a.jsx("span",{className:"hn-picker-title hn-terminal-hist-title",children:o.title??o.specId??w(o.projectId)}),o.transcriptBytes!==null&&a.jsx(De,{name:"file-text",size:12,color:"var(--text-subtle)"}),a.jsx("span",{className:"hn-terminal-hist-duration",children:Na(o)}),a.jsx(vt,{size:"sm",tone:T.tone,children:T.label})]})},o.id)}),h&&a.jsx("div",{className:"hn-terminal-hist-loading",children:"memuat…"})]}),a.jsx(vn,{page:D.page,pageCount:D.pageCount,total:u,from:D.from,to:D.to,onPage:N,unit:"sesi"}),f&&a.jsx(li,{row:f,projectName:w(f.projectId),onBack:()=>M(null),onRestart:s})]})}function li({row:e,projectName:n,onBack:s,onRestart:r}){const[l,u]=d.useState(null),[x,g]=d.useState("idle"),[N,h]=d.useState(null);async function k(j){try{if(!navigator.clipboard)throw new Error("clipboard tidak tersedia di browser ini");await navigator.clipboard.writeText(j),h({tone:"ok",text:"Transkrip disalin."})}catch(C){h({tone:"err",text:Q("menyalin transkrip",C)})}}d.useEffect(()=>{if(e.transcriptBytes===null){g("none"),u(null);return}let j=!0;return g("loading"),F.sessionTranscript(e.id).then(C=>{j&&(u(C.text),g("idle"))}).catch(()=>{j&&(u(null),g("error"))}),()=>{j=!1}},[e.id,e.transcriptBytes]);const p=It(e)==="interrupted",b=[["Project",n],["Sesi",e.sessionId],["Jenis",Ia(e.kind)],["Agen",[e.agent,e.model,e.effort].filter(Boolean).join(" · ")],["Mulai",new Date(e.startedAt).toLocaleString("id-ID")],[p?"Terakhir terlihat hidup":"Selesai",e.endedAt?new Date(e.endedAt).toLocaleString("id-ID"):"berjalan"],...p&&e.reconciledAt?[["Terdeteksi mati",new Date(e.reconciledAt).toLocaleString("id-ID")]]:[],["Durasi",Na(e)],["Direktori",e.cwd]];return e.specId&&b.splice(1,0,["Backlog",`${e.specId}${e.title?` · ${e.title}`:""}`]),e.branch&&b.push(["Branch",e.branch]),a.jsxs(te,{open:!0,title:e.title??e.specId??e.sessionId,icon:"history",onClose:s,width:1e3,children:[a.jsxs("div",{className:"hn-terminal-hist-actions",children:[a.jsx(L,{size:"sm",variant:"ghost",leftIcon:"arrow-left",onClick:s,children:"Kembali"}),a.jsx("div",{className:"hn-terminal-hist-spacer"}),l&&a.jsx(L,{size:"sm",variant:"secondary",leftIcon:"copy",onClick:()=>void k(l),children:"Salin transkrip"}),jn(e.kind)&&a.jsx(L,{size:"sm",leftIcon:"play",onClick:()=>r(e),children:"Mulai lagi"})]}),p&&a.jsxs(Qe,{tone:"warn",title:"Sesi terputus — hasilnya tak diketahui",className:"hn-terminal-notice",children:["Panenya sudah lenyap saat hanoman menyala lagi (reboot, ",a.jsx("code",{children:"tmux kill-server"}),", atau host mati), jadi sesi ini tak meninggalkan exit code dan transkripnya kemungkinan besar tak sempat diambil — capture berjalan tepat sebelum pane dibunuh, dan di jalur ini sudah tak ada pane untuk dibaca. Periksa worktree & branch sesi ini sebelum menganggapnya selesai, lalu mulai lagi bila pekerjaannya belum tuntas."]}),a.jsx("div",{className:"hn-terminal-hist-meta",children:b.map(([j,C])=>a.jsxs(d.Fragment,{children:[a.jsx("span",{className:"hn-terminal-hist-key",children:j}),a.jsx("span",{className:"hn-terminal-hist-val",children:C})]},j))}),x==="loading"&&a.jsx("div",{className:"hn-terminal-hist-note",children:"memuat transkrip…"}),x==="none"&&a.jsx("div",{className:"hn-terminal-hist-note",children:p?"Tanpa transkrip — panenya sudah lenyap sebelum hanoman sempat mengambilnya.":"Tanpa transkrip — sesi ini ditutup sebelum fitur riwayat ada, atau panenya tak menyisakan keluaran."}),N&&a.jsx("div",{role:"status",className:N.tone==="err"?"hn-terminal-hist-copy is-err":"hn-terminal-hist-copy",children:N.text}),x==="error"&&a.jsx("div",{className:"hn-terminal-hist-error",children:"Transkrip tak terbaca lagi di server."}),l!==null&&a.jsx("pre",{className:"hn-terminal-hist-pre",children:l})]})}function oi({open:e,projectId:n,projectName:s,projects:r,onProjectChange:l,onClose:u,onCreated:x}){var w;const[g,N]=d.useState("claude"),[h,k]=d.useState("sonnet"),[p,b]=d.useState("medium"),[j,C]=d.useState({claude:{model:"sonnet",effort:"medium"},codex:{...aa},antigravity:{...ta}}),[E,A]=d.useState(!1),[R,y]=d.useState(null),[f,M]=d.useState(null),[K,W]=d.useState(null);d.useEffect(()=>{e&&(y(null),M(null),F.getSettings().then(o=>{const T={claude:{model:o.model,effort:o.effort},codex:{...aa,...o.codex??{}},antigravity:{...ta,...o.antigravity??{}}},V=o.agent??"claude",O=na(T,V);C(T),N(V),k(O.model),b(O.effort)}).catch(o=>{y(`${Q("memuat pengaturan",o)} · memakai default bawaan`)}),F.getCodexVersion().then(o=>W(o.version)).catch(o=>{y(T=>(T?`${T} · `:"")+Q("membaca versi Codex CLI",o))}))},[e]);const v=o=>{N(o);const T=na(j,o);k(T.model),b(T.effort)},I=o=>{k(o),b(T=>Rn(g,o,T))};async function D(){A(!0),M(null);try{const{id:o}=await F.createTerminal(n,{agent:g,model:h,effort:p});x(o),u()}catch(o){M(Q("membuka sesi",o))}finally{A(!1)}}return a.jsxs(te,{open:e,onClose:u,icon:"plus",eyebrow:s,title:"Sesi baru",footer:a.jsxs(a.Fragment,{children:[a.jsx(L,{variant:"ghost",onClick:u,children:"Batal"}),a.jsx(L,{leftIcon:"play",disabled:E,onClick:()=>void D(),children:"Buka sesi"})]}),children:[R&&a.jsx(Qe,{tone:"warn",title:"Pengaturan belum terbaca",className:"hn-terminal-notice",children:R}),f&&a.jsx(Qe,{tone:"err",title:"Sesi belum terbuka",className:"hn-terminal-notice",children:f}),a.jsxs("div",{className:"hn-terminal-intro",children:["Runtime untuk sesi ini. Default dari setelan global; ubah bila perlu. Sesi lahir dengan pilihan ini untuk seluruh hidupnya — ",a.jsx("code",{children:"/model"})," di terminal tetap bisa mengubahnya."]}),r&&l&&r.length>1&&a.jsx(we,{label:"Project",hint:"Direktori repo tempat sesi dibuka.",children:a.jsx(ee,{"aria-label":"Project",value:n,className:"hn-terminal-field-full",options:r.map(o=>({value:o.id,label:o.name})),onChange:o=>l(o.target.value)})}),a.jsx(we,{label:"Agen",hint:"Mesin yang menjalankan sesi ini. Perilaku sesi sama; hanya CLI-nya berbeda.",children:a.jsx(ee,{"aria-label":"Agen",value:g,className:"hn-terminal-field-full",options:wn,onChange:o=>v(o.target.value)})}),a.jsx(we,{label:"Model",children:a.jsx(ee,{"aria-label":"Model",value:h,className:"hn-terminal-field-full",options:Sn(g,h),onChange:o=>I(o.target.value)})}),a.jsx(we,{label:"Effort",children:a.jsx(ee,{"aria-label":"Effort",value:p,className:"hn-terminal-field-full",options:Nn(g,h).map(o=>({value:o,label:o})),onChange:o=>b(o.target.value)})}),g==="antigravity"&&a.jsx(ai,{}),g==="codex"&&In(h,K)&&a.jsxs("div",{"data-testid":"codex-version-note",className:"hn-terminal-codex-note",children:["Codex CLI terpasang ",a.jsx("b",{children:K}),", sedangkan ",a.jsx("b",{children:h})," butuh ",a.jsx("b",{children:(w=Cn(h))==null?void 0:w.minClient}),". Sesi tetap boleh dijalankan, tapi modelnya belum tentu dikenali CLI ini."]})]})}function ci({projectId:e,projects:n,onProjectChange:s,onClose:r,onConfirm:l}){return a.jsx(te,{open:!0,onClose:r,icon:"terminal",title:"Terminal biasa",footer:a.jsxs(a.Fragment,{children:[a.jsx(L,{variant:"ghost",onClick:r,children:"Batal"}),a.jsx(L,{leftIcon:"play",disabled:!e,onClick:()=>l(e),children:"Buka terminal"})]}),children:a.jsx(we,{label:"Project",hint:"Shell dibuka di direktori repo project ini.",children:a.jsx(ee,{"aria-label":"Project",value:e,className:"hn-terminal-field-full",options:n.map(u=>({value:u.id,label:u.name})),onChange:u=>s(u.target.value)})})})}const Ca=()=>({rows:1,cols:1,cells:[null]}),Ra=(e,n)=>[...e.slice(0,n),...e.slice(n+1)],oa=e=>({...e,rows:e.rows+1,cells:[...e.cells,...Array(e.cols).fill(null)],...e.rowSizes?{rowSizes:[...e.rowSizes,1]}:{}});function ca(e){const n=e.cols+1,s=[];for(let r=0;r<e.rows;r++)for(let l=0;l<n;l++)s.push(l<e.cols?e.cells[r*e.cols+l]??null:null);return{...e,cols:n,cells:s,...e.colSizes?{colSizes:[...e.colSizes,1]}:{}}}function ua(e,n){if(e.rows===1||n<0||n>=e.rows)return e;const s=[...e.cells];return s.splice(n*e.cols,e.cols),{...e,rows:e.rows-1,cells:s,...e.rowSizes?{rowSizes:Ra(e.rowSizes,n)}:{}}}function da(e,n){if(e.cols===1||n<0||n>=e.cols)return e;const s=e.cols-1,r=[];for(let l=0;l<e.rows;l++)for(let u=0;u<e.cols;u++)u!==n&&r.push(e.cells[l*e.cols+u]??null);return{...e,cols:s,cells:r,...e.colSizes?{colSizes:Ra(e.colSizes,n)}:{}}}const Ta=.3,ui=(e,n,s)=>Math.min(s,Math.max(n,e));function Ct(e,n,s){if(n<0||n+1>=e.length||s===0)return e;const l=e.reduce((N,h)=>N+h,0)/e.length*Ta,u=e[n]+e[n+1],x=ui(e[n]+s,l,u-l);if(x===e[n])return e;const g=[...e];return g[n]=x,g[n+1]=u-x,g}function Ea(e,n,s){const r=e.colSizes??Array(e.cols).fill(1),l=Ct(r,n,s);return l===r?e:{...e,colSizes:l}}function Aa(e,n,s){const r=e.rowSizes??Array(e.rows).fill(1),l=Ct(r,n,s);return l===r?e:{...e,rowSizes:l}}const di=.05,mi=.15,za=(e,n)=>e.reduce((s,r)=>s+r,0)*(n?mi:di);function hi(e,n,s,r=!1){const l=e.colSizes??Array(e.cols).fill(1);return Ea(e,n,s*za(l,r))}function pi(e,n,s,r=!1){const l=e.rowSizes??Array(e.rows).fill(1);return Aa(e,n,s*za(l,r))}function ma(e,n){const r=e.reduce((x,g)=>x+g,0)/e.length*Ta,l=e[n]+e[n+1],u=Math.round(r/l*100);return{now:Math.round(e[n]/l*100),min:u,max:100-u}}function jt(e,n,s){if(n<0||n>=e.cells.length)return e;const r=e.cells.map(l=>s!==null&&l===s?null:l);return r[n]=s,{...e,cells:r}}const fi=(e,n)=>({...e,cells:e.cells.map(s=>s&&n.has(s)?s:null)}),Da=e=>({id:crypto.randomUUID(),name:e,layout:Ca()});function ha(){const e=Da("Utama");return{groups:[e],active:e.id}}const $e=e=>e.groups.find(n=>n.id===e.active)??e.groups[0];function gi(e,n){const s=Da(n);return{groups:[...e.groups,s],active:s.id}}const bi=(e,n,s)=>({...e,groups:e.groups.map(r=>r.id===n?{...r,name:s}:r)});function ki(e,n){if(e.groups.length===1)return e;const s=e.groups.filter(r=>r.id!==n);return s.length===e.groups.length?e:{groups:s,active:e.active===n?s[0].id:e.active}}const xi=(e,n)=>e.groups.some(s=>s.id===n)?{...e,active:n}:e;function H(e,n){const s=$e(e);return{...e,groups:e.groups.map(r=>r.id===s.id?{...r,layout:n(r.layout)}:r)}}function wt(e,n,s){const r=$e(e),l=s===null?e.groups:e.groups.map(u=>u.id===r.id?u:{...u,layout:jt(u.layout,u.layout.cells.indexOf(s),null)});return{...e,groups:l.map(u=>u.id===r.id?{...u,layout:jt(u.layout,n,s)}:u)}}function je(e,n){const s=$e(e).layout.cells.indexOf(null);return s===-1?e:wt(e,s,n)}const vi=(e,n)=>({...e,groups:e.groups.map(s=>({...s,layout:jt(s.layout,s.layout.cells.indexOf(n),null)}))}),pa=e=>new Set(e.groups.flatMap(n=>n.layout.cells.filter(s=>s!==null))),fa=(e,n)=>({...e,groups:e.groups.map(s=>({...s,layout:fi(s.layout,n)}))}),Ma="hanoman.terminal.workspace",Fa="hanoman.terminal.layout",Se=e=>Fe.parse({version:1,groups:e.groups});function Ze(e,n){const s=e.groups,r=n&&s.some(l=>l.id===n)?n:s[0].id;return{groups:s,active:r}}function yi(e){try{const n=JSON.parse(e);if(!n||typeof n!="object")return null;const s=n,r=Fe.parse({version:1,groups:s.groups});return{workspace:r,active:typeof s.active=="string"&&r.groups.some(l=>l.id===s.active)?s.active:r.groups[0].id}}catch{return null}}function ji(){try{const e=localStorage.getItem(Ma);if(e)return yi(e);const n=localStorage.getItem(Fa);if(!n)return null;const s=JSON.parse(n),r={id:crypto.randomUUID(),name:"Utama",layout:s};return{workspace:Fe.parse({version:1,groups:[r]}),active:r.id}}catch{return null}}function bt(){try{localStorage.removeItem(Ma),localStorage.removeItem(Fa)}catch{}}const $a=e=>`hanoman.terminal.workspace.v2.${encodeURIComponent(e)}`;function wi(e){try{const n=localStorage.getItem($a(e));if(!n)return null;const s=JSON.parse(n),r=Fe.parse(s.workspace);if(!Number.isInteger(s.revision)||(s.revision??-1)<0)return null;const l=typeof s.active=="string"&&r.groups.some(u=>u.id===s.active)?s.active:r.groups[0].id;return{workspace:r,revision:s.revision,active:l}}catch{return null}}function kt(e,n){try{const s=Fe.parse(n.workspace);if(!Number.isInteger(n.revision)||n.revision<0)return;const r=s.groups.some(l=>l.id===n.active)?n.active:s.groups[0].id;localStorage.setItem($a(e),JSON.stringify({workspace:s,revision:n.revision,active:r}))}catch{}}function xt(e){if(!(e instanceof Me)||e.status!==409)return null;const n=e.detail;if((n==null?void 0:n.code)!=="revision-conflict")return null;const s=Tn.safeParse(n.current);return s.success?s.data:null}function Si(e){const n=P.useRef(null);n.current||(n.current=ha());const[s,r]=P.useState(n.current),[l,u]=P.useState("loading"),[x,g]=P.useState(null),[N,h]=P.useState(!1),k=P.useRef(s),p=P.useRef(0),b=P.useRef(!1),j=P.useRef(Promise.resolve()),C=P.useRef(0),E=P.useCallback(v=>{k.current=v,r(v)},[]),A=P.useCallback(v=>{b.current=v,h(v)},[]),R=P.useCallback(v=>{const I=j.current.then(v,v);return j.current=I.then(()=>{},()=>{}),I},[]),y=P.useCallback((v,I="ready",D=null,w=k.current.active)=>{const o=v.workspace?Ze(v.workspace,w):ha();p.current=v.revision,E(o),u(I),g(D),A(!0),v.workspace&&kt(e,{workspace:v.workspace,revision:v.revision,active:o.active})},[E,A,e]),f=P.useCallback(v=>{const I=wi(e);I&&(p.current=I.revision,E(Ze(I.workspace,I.active))),A(!1),u("recovering"),g(v instanceof Error?v.message:"Layout server belum tersambung")},[E,A,e]),M=P.useCallback(()=>R(async()=>{try{y(await F.getTerminalWorkspace())}catch(v){f(v)}}),[y,R,f]);P.useEffect(()=>{const v=++C.current;return u("loading"),g(null),A(!1),R(async()=>{try{const I=await F.getTerminalWorkspace();if(v!==C.current)return;if(I.workspace){y(I),bt();return}const D=ji();if(!D){y(I);return}try{const w=await F.putTerminalWorkspace({baseRevision:I.revision,workspace:D.workspace});if(v!==C.current)return;E(Ze(w.workspace,D.active)),p.current=w.revision,kt(e,{workspace:w.workspace,revision:w.revision,active:D.active}),bt(),u("ready"),g(null),A(!0)}catch(w){const o=xt(w);o!=null&&o.workspace?(y(o,"conflict","Layout server lebih baru; layout lokal lama tidak diunggah"),bt()):f(w)}}catch(I){v===C.current&&f(I)}}),()=>{C.current+=1}},[y,R,f,E,A,e]),P.useEffect(()=>{const v=()=>{M()},I=()=>{document.visibilityState==="visible"&&M()};return window.addEventListener("focus",v),document.addEventListener("visibilitychange",I),()=>{window.removeEventListener("focus",v),document.removeEventListener("visibilitychange",I)}},[M]);const K=P.useCallback(v=>R(async()=>{if(!b.current)return!1;const I=v(k.current);let D,w;try{D=Se(I),w=Se(k.current)}catch{return u("conflict"),g("Layout tidak valid dan tidak disimpan"),!1}if(wa(D,w))return!0;try{return y(await F.putTerminalWorkspace({baseRevision:p.current,workspace:D}),"ready",null,I.active),!0}catch(o){const T=xt(o);if(!(T!=null&&T.workspace))return f(o),!1;const V=v(Ze(T.workspace,k.current.active));try{const O=await F.putTerminalWorkspace({baseRevision:T.revision,workspace:Se(V)});return y(O,"conflict","Layout berubah di perangkat lain; perubahan ini diterapkan ulang",V.active),!0}catch(O){if(!xt(O)&&!(O instanceof Me&&O.status===409))return f(O),!1;try{y(await F.getTerminalWorkspace(),"conflict","Layout berubah lagi di perangkat lain; state terbaru dimuat")}catch(ue){f(ue)}return!1}}}),[y,R,f]),W=P.useCallback(v=>{const I=xi(k.current,v);E(I);const D=Se(I);kt(e,{workspace:D,revision:p.current,active:I.active})},[E,e]);return{workspace:s,status:l,message:x,writable:N,mutate:K,setActive:W,refresh:M}}const Ni=En("focus","grid"),ga={attention:0,running:1,open:1,failed:2,done:3};function Pa(e,n){return e.exited?e.exitCode?{tone:"failed",label:`Gagal · exit ${e.exitCode}`}:{tone:"done",label:"Selesai"}:n?{tone:"done",label:"Selesai"}:e.deciding?{tone:"attention",label:"Lead memutuskan"}:e.decision?{tone:"attention",label:"Menunggu keputusan"}:e.specId?{tone:"running",label:"Berjalan"}:{tone:"open",label:"Terbuka"}}function Ii(e){const n=e.startedAt;return typeof n=="number"&&Number.isFinite(n)&&n>0?n*1e3:null}function Ci(e,n){const s=e.map((r,l)=>({session:r,index:l,rank:ga[Pa(r,n.has(r.id)).tone]}));return s.sort((r,l)=>{if(r.rank!==l.rank)return r.rank-l.rank;if(r.rank===ga.attention){const u=r.session.decisionAt?Date.parse(r.session.decisionAt):Number.NaN,x=l.session.decisionAt?Date.parse(l.session.decisionAt):Number.NaN,g=Number.isNaN(u)?Number.POSITIVE_INFINITY:u,N=Number.isNaN(x)?Number.POSITIVE_INFINITY:x;if(g!==N)return g<N?-1:1}return r.index-l.index}),s.map(r=>r.session)}function Ri(e){const n=new Map;for(const s of e){const r=n.get(s.projectId);r?r.push(s):n.set(s.projectId,[s])}return[...n.values()].flat()}function Ti(e,n){if(n){const s=e.find(r=>r.id===n);if(s)return s}return e[0]??null}function Ei(e,n,s){if(s<=0)return null;const r=e<0?0:e;switch(n){case"ArrowDown":return Math.min(r+1,s-1);case"ArrowUp":return Math.max(r-1,0);case"Home":return 0;case"End":return s-1;default:return null}}const La={attention:"awaiting",running:"running",open:"idle",failed:"failed",done:"done"};function Ai(e){const[n,s]=d.useState(()=>Date.now());return d.useEffect(()=>{const r=setInterval(()=>s(Date.now()),e);return()=>clearInterval(r)},[e]),n}function ba({items:e,focusedId:n,onFocus:s,menuFor:r,label:l="Daftar sesi"}){const u=Ai(3e4),x=d.useRef([]),g=new Set(e.map(k=>k.session.projectId)).size>1,N=e.findIndex(k=>k.session.id===n),h=k=>{var C;const p=x.current.indexOf(k.target);if(p<0)return;const b=Ei(p,k.key,e.length);if(b===null)return;k.preventDefault();const j=e[b];j&&(s(j.session.id),(C=x.current[b])==null||C.focus())};return a.jsx("ul",{role:"list","aria-label":l,className:"hn-terminal-rail-list",onKeyDown:h,children:e.map((k,p)=>{var R;const{session:b,status:j}=k,C=b.id===n,E=C||N<0&&p===0,A=k.startedMs!==null?An(k.startedMs,u):"";return a.jsxs(d.Fragment,{children:[g&&k.session.projectId!==((R=e[p-1])==null?void 0:R.session.projectId)&&a.jsx("li",{role:"presentation",className:"hn-terminal-rail-group",children:k.projectName}),a.jsx("li",{className:"hn-terminal-rail-item",children:a.jsxs("div",{className:`hn-terminal-rail-row${C?" is-focused":""}`,"data-tone":j.tone,children:[a.jsxs("button",{type:"button",className:"hn-terminal-rail-main",ref:y=>{x.current[p]=y},tabIndex:E?0:-1,"aria-current":C?"true":void 0,title:k.label,onClick:()=>s(b.id),children:[a.jsx("span",{className:"hn-terminal-rail-name",children:k.label}),a.jsxs("span",{className:"hn-terminal-rail-meta",children:[a.jsx(ge,{status:La[j.tone],variant:"dot",size:"sm",children:j.label}),A&&a.jsx("span",{className:"hn-terminal-rail-time",children:A})]})]}),a.jsx(Ne,{label:`Aksi sesi ${b.id} di daftar`,items:r(b)})]})})]},b.id)})})}const zi=[],Di=e=>!!(e.binding??e.repoDir),Mi=e=>{var n;return((n=e.find(Di)??e[0])==null?void 0:n.id)??""},Fi=e=>e instanceof Me&&e.status===400&&typeof e.detail=="object"&&e.detail!==null&&e.detail.needsBind===!0;function Xi({userId:e="test-user",projects:n,backlog:s=zi,focusSession:r,startedSession:l,onStartedSessionHandled:u,onStartBacklog:x,onOpenReview:g,onOpenSessionReview:N,titleOf:h,onIntegrate:k,onIntegrateSession:p,specOf:b,sessions:j,setSessions:C,onOpenProject:E}){const[A,R]=d.useState([]),y=j??A,f=C??R,[M,K]=d.useState([]),W=Si(e),{workspace:v,status:I,message:D,writable:w,mutate:o,setActive:T,refresh:V}=W,[O,ue]=fe("terminal","project",Mi(n),Qn),Ie=Sa(),ke=Fn(),re=ke==="mobile",[J,de]=fe("terminal","fontSize",Ie?Yn:Jn,Vn),[le,Pe]=fe("terminal","keys",Ie&&!re,Je),[q,xe]=fe("terminal","predict",!0,Je),[ae,Le]=fe("terminal","diag",!1,Je),[ne,Ka]=fe("terminal","sr",!1,Je),Tt=t=>de(i=>Hn(i+t)),[me,Et]=d.useState(!1),[ie,et]=d.useState(null),[_a,Oe]=d.useState(!1),[Ga,Be]=d.useState(null),[Wa,At]=d.useState(!1),[qa,tt]=d.useState(!1),[Ua,Ke]=d.useState(!1),[Ha,at]=fe("terminal","view","focus",Ni),U=Ha==="focus",[nt,Ce]=d.useState(null),[it,Va]=d.useState(()=>new Set),[Ya,Ja]=d.useState(null),[zt,Dt]=d.useState(!1),[Xa,Mt]=d.useState(!1),[he,Re]=d.useState(null),[_e,Ft]=d.useState(!1),[Ge,$t]=d.useState(null),st=$n(),{confirm:Za,dialog:Qa}=Pn(),z=$e(v).layout,rt=z.rows===1&&z.cols===1&&!z.cells[0]&&y.length===0,lt=d.useRef(null),[en,tn]=d.useState(Number.POSITIVE_INFINITY);d.useEffect(()=>{const t=lt.current;if(!t||typeof ResizeObserver!="function")return;const i=new ResizeObserver(c=>{var S;const m=((S=c[0])==null?void 0:S.contentRect.width)??t.getBoundingClientRect().width;m>0&&tn(m)});return i.observe(t),()=>i.disconnect()},[rt]);const an=ke==="tablet"&&Ln(z.cols,en,Un),B=re||an,[X,We]=d.useState(0),[se,qe]=d.useState(null),ot=d.useRef(null),Te=t=>{Ce(t),qe(t)},nn=d.useCallback((t,i)=>{Va(c=>{if(c.has(t)===i)return c;const m=new Set(c);return i?m.add(t):m.delete(t),m})},[]),Pt=d.useMemo(()=>Ri(Ci(y,it)),[y,it]),Ue=Ti(Pt,nt),He=(Ue==null?void 0:Ue.id)??null;d.useEffect(()=>{He&&He!==nt&&Ce(He)},[He,nt]);const[ve,sn]=d.useState(!1),[Ve,Lt]=d.useState(null),[rn,ln]=d.useState(0);d.useEffect(()=>{let t=!0;return F.listTerminals().then(i=>{t&&(Lt(null),f(i),sn(!0))}).catch(i=>{t&&Lt(Q("memuat daftar sesi",i))}),()=>{t=!1}},[rn]);const[on,oe]=On();d.useEffect(()=>Bn(t=>{t.t==="sessions"&&!j?f(t.sessions):t.t==="cleanups"&&K(t.cleanups)}),[]),d.useEffect(()=>{if(!ve||!w)return;const t=new Set(y.map(c=>c.id)),i=fa(v,t);wa(Se(i),Se(v))||o(c=>fa(c,t))},[o,y,ve,w,v]),d.useEffect(()=>{!l||l.specId==null||!ve||(f(t=>t.some(i=>i.id===l.id)?t:[...t,{...l,cwd:"",exited:!1}]),Ce(l.id),qe(l.id),u==null||u())},[u,ve,l]);const ct=d.useRef(null);d.useEffect(()=>{if(!r){ot.current=null,ct.current=null;return}if(!(!ve||ot.current===r)){if(!y.some(t=>t.id===r&&!t.exited)){if(ct.current===r)return;ct.current=r,F.listSessionHistory({q:r,limit:1}).then(t=>oe(ia,"warn","history",t.total>0?{action:{label:Kn,onAction:()=>Ke(!0)},duration:7e3}:void 0)).catch(()=>{oe(ia,"warn","history")});return}ot.current=r,Ce(r),qe(r)}},[r,y,ve,oe]),d.useEffect(()=>{if(!se)return;const t=v.groups.find(i=>i.layout.cells.includes(se));if(t){t.id!==v.active&&T(t.id);return}w&&o(i=>{if(pa(i).has(se))return i;const c=je(i,se);return c!==i||!B?c:wt(i,X,se)})},[X,B,o,se,T,w,v]),d.useEffect(()=>{ie&&!y.some(t=>t.id===ie)&&et(null)},[ie,y]);const ut=M.filter(t=>t.error),Z=t=>y.find(i=>i.id===t)??null,Y=d.useCallback(t=>{var i;return((i=n.find(c=>c.id===t))==null?void 0:i.name)??t},[n]);function cn(t){f(i=>i.some(c=>c.id===t)?i:[...i,{id:t,projectId:O,cwd:"",exited:!1}]),o(i=>je(i,t)),Te(t)}async function Ot(t){if(!t)return;tt(!1);let i;try{({id:i}=await F.createShell(t))}catch(c){Fi(c)?oe(`Project ${Y(t)} belum terhubung ke folder repo — hubungkan dulu.`,"err","folder-git-2",E?{action:{label:"Buka project",onAction:()=>E(t)}}:void 0):oe(Q("membuka terminal biasa",c),"err","x-circle");return}f(c=>[...c,{id:i,projectId:t,cwd:"",exited:!1}]),o(c=>je(c,i)),Te(i)}async function Bt(t,i){if(x&&!i){Oe(!1),Be(null),x(t);return}const c=Zn(t.source);try{const{id:m}=await F.startSession({spec:t.id,flow:c,...i?{force:i}:{}});f(S=>S.some($=>$.id===m)?S:[...S,{id:m,projectId:t.projectId,specId:t.id,flow:c,cwd:"",exited:!1}]),o(S=>je(S,m)),Te(m),Oe(!1),Be(null)}catch(m){if(st.offerRetry(m,t.id,$=>Bt(t,$)))return;const S=m instanceof Me&&(m.status===400||m.status===422);Be(`${t.id} · gagal mulai${S?" · project belum punya repoDir":""}`)}}async function Kt(t,i){try{const c=t.specId?await F.startSession({spec:t.specId,flow:t.flow??"feature",agent:t.agent==="antigravity"?"antigravity":t.agent==="codex"?"codex":"claude",...t.model?{model:t.model}:{},...t.effort?{effort:t.effort}:{},...i?{force:i}:{}}):t.kind==="shell"?await F.createShell(t.projectId):t.kind==="terminal"?await F.createTerminal(t.projectId,{agent:t.agent==="antigravity"?"antigravity":t.agent==="codex"?"codex":"claude",...t.model?{model:t.model}:{},...t.effort?{effort:t.effort}:{}}):await(i?F.createTerminalFlow(t.projectId,t.kind,{force:i}):F.createTerminalFlow(t.projectId,t.kind));f(m=>m.some(S=>S.id===c.id)?m:[...m,{id:c.id,projectId:t.projectId,specId:t.specId??void 0,cwd:"",exited:!1}]),o(m=>je(m,c.id)),Te(c.id),Ke(!1)}catch(c){if((t.specId||t.kind!=="shell"&&t.kind!=="terminal")&&st.offerRetry(c,`${t.projectId} · ${t.title??t.specId??t.kind}`,m=>Kt(t,m)))return}}const _t=new Set(y.filter(t=>t.specId&&!t.exited).map(t=>t.specId)),un=s.filter(t=>t.stage!=="done"&&!_t.has(t.id));function Gt(t){f(i=>i.filter(c=>c.id!==t)),F.deleteTerminal(t).catch(i=>{i instanceof Me&&i.status===404||oe(Q(`menutup sesi ${t.slice(0,6)}`,i),"err","x-circle")})}async function Wt(){if(!he||_e)return;const{id:t,value:i}=he;Ft(!0);try{const c=await F.renameTerminal(t,i);f(m=>m.map(S=>{if(S.id!==t)return S;const{name:$,...G}=S;return c.name?{...G,name:c.name}:G})),Re(null),oe(c.name?"Nama sesi disimpan":"Nama kustom dihapus","ok")}catch(c){oe(Q("mengganti nama sesi",c),"err","x-circle")}finally{Ft(!1)}}async function dt(t){const i=Z(t),c=`${i?be(i,Y,h):t} · ${t.slice(0,6)}`,m=!!i&&!i.exited;await Za({title:`Tutup sesi "${c}"?`,impact:[m?"Agen yang sedang berjalan di sesi ini akan dihentikan.":"Sesi ini sudah berhenti, jadi tidak ada agen yang perlu dihentikan.","Worktree sesi ini ikut dibersihkan dari disk."],confirmLabel:"Tutup sesi",icon:"square",tone:"danger"})&&Gt(t)}const dn=d.useCallback((t,i)=>{f(c=>c.map(m=>m.id===t?{...m,exited:!0,exitCode:i}:m))},[]),qt={killSession:Gt,requestKill:dt,detach:t=>{o(i=>vi(i,t))},markExited:dn,setFullId:et,openDialog:(t,i)=>$t({kind:t,sessionId:i}),openRename:t=>{var i;return Re({id:t,value:((i=Z(t))==null?void 0:i.name)??""})},props:{onOpenReview:g,onOpenSessionReview:N,titleOf:h,onIntegrate:k,onIntegrateSession:p,specOf:b}},_=d.useRef(qt);_.current=qt;const Ut=d.useRef(new Map),pe=t=>{let i=Ut.current.get(t);return i||(i={onClose:()=>void _.current.requestKill(t),onForget:()=>_.current.killSession(t),onDetach:()=>_.current.detach(t),onExit:c=>_.current.markExited(t,c),onFullscreen:()=>_.current.setFullId(t),onDialog:c=>_.current.openDialog(c,t),onRename:()=>_.current.openRename(t)},Ut.current.set(t,i)),i},Ht=d.useRef(new Map),mn=t=>{let i=Ht.current.get(t);return i||(i=(c,m)=>{Ja({sessionId:t,phases:c}),nn(t,m)},Ht.current.set(t,i)),i},hn=t=>Ba(t,{label:be(t,Y,h),canArrange:w,specOf:b,onReview:g,onSessionReview:N,onIntegrate:k,onIntegrateSession:p,onDialog:pe(t.id).onDialog,onDetach:pe(t.id).onDetach,onFullscreen:pe(t.id).onFullscreen,onKill:()=>void dt(t.id),onRename:pe(t.id).onRename}),ye=d.useRef({onOpenReview:t=>{var i,c;return(c=(i=_.current.props).onOpenReview)==null?void 0:c.call(i,t)},onOpenSessionReview:(t,i)=>{var c,m;return(m=(c=_.current.props).onOpenSessionReview)==null?void 0:m.call(c,t,i)},titleOf:t=>{var i,c;return(c=(i=_.current.props).titleOf)==null?void 0:c.call(i,t)},onIntegrate:(t,i,c)=>{var m,S;return(S=(m=_.current.props).onIntegrate)==null?void 0:S.call(m,t,i,c)},onIntegrateSession:(t,i,c)=>{var m,S;return(S=(m=_.current.props).onIntegrateSession)==null?void 0:S.call(m,t,i,c)},specOf:t=>{var i,c;return(c=(i=_.current.props).specOf)==null?void 0:c.call(i,t)}}).current,pn=(t,i)=>{We(t),o(c=>wt(c,t,i))},fn=t=>{Te(t),o(i=>je(i,t))},gn=pa(v),mt=y.filter(t=>!gn.has(t.id));d.useEffect(()=>{if(!se)return;const t=z.cells.indexOf(se);t<0||(We(t),qe(null))},[z.cells,se]),d.useEffect(()=>{X>=z.cells.length&&We(Math.max(0,z.cells.length-1))},[X,z.cells.length]);const Ye=d.useRef(null),[ce,ht]=d.useState(null),pt=(ce==null?void 0:ce.axis)==="col"?ce.sizes:z.colSizes??Array(z.cols).fill(1),ft=(ce==null?void 0:ce.axis)==="row"?ce.sizes:z.rowSizes??Array(z.rows).fill(1);function Vt(t,i,c){var $,G,Ee;if(!w)return;const m=($=lt.current)==null?void 0:$.getBoundingClientRect();if(!m)return;(Ee=(G=c.currentTarget).setPointerCapture)==null||Ee.call(G,c.pointerId);const S=t==="col"?pt:ft;Ye.current={axis:t,index:i,pointerId:c.pointerId,start:t==="col"?c.clientX:c.clientY,extent:t==="col"?m.width:m.height,startSizes:S,latest:S},ht({axis:t,sizes:S})}function Yt(t){const i=Ye.current;if(!i||i.pointerId!==t.pointerId)return;const c=i.axis==="col"?t.clientX:t.clientY,m=i.startSizes.reduce(($,G)=>$+G,0),S=(c-i.start)/i.extent*m;i.latest=Ct(i.startSizes,i.index,S),ht({axis:i.axis,sizes:i.latest})}function Jt(t){var c,m;const i=Ye.current;!i||i.pointerId!==t.pointerId||(Ye.current=null,(m=(c=t.currentTarget).releasePointerCapture)==null||m.call(c,t.pointerId),ht(null),i.latest!==i.startSizes&&o(S=>H(S,$=>i.axis==="col"?{...$,colSizes:i.latest}:{...$,rowSizes:i.latest})))}function Xt(t,i,c){if(!w)return;const m=t==="col"?"ArrowRight":"ArrowDown",S=t==="col"?"ArrowLeft":"ArrowUp",$=c.key===m?1:c.key===S?-1:0;$!==0&&(c.preventDefault(),o(G=>H(G,Ee=>t==="col"?hi(Ee,i,$,c.shiftKey):pi(Ee,i,$,c.shiftKey))))}function Zt(t,i){w&&o(c=>H(c,m=>{const S=t==="col"?m.colSizes??Array(m.cols).fill(1):m.rowSizes??Array(m.rows).fill(1),G=(S[i]+S[i+1])/2-S[i];return t==="col"?Ea(m,i,G):Aa(m,i,G)}))}const Qt=a.jsxs("div",{className:"hn-terminal-display",children:[a.jsxs("div",{className:"hn-dense-row hn-terminal-display-row",children:[a.jsx("span",{className:"hn-terminal-display-label",children:"Ukuran teks terminal"}),a.jsx(gt,{size:"sm",icon:"minus",label:"Perkecil teks terminal",disabled:J<=_n,onClick:()=>Tt(-1)}),a.jsxs("span",{className:"hn-terminal-display-value",children:[J,"px"]}),a.jsx(gt,{size:"sm",icon:"plus",label:"Perbesar teks terminal",disabled:J>=Gn,onClick:()=>Tt(1)})]}),a.jsxs("div",{className:"hn-dense-row hn-terminal-display-row",children:[a.jsx("span",{className:"hn-terminal-display-label",children:"Papan tombol layar (Esc · panah · Enter)"}),a.jsx(L,{size:"sm",variant:"secondary","aria-pressed":le,onClick:()=>Pe(t=>!t),children:le?"Sembunyikan":"Tampilkan"})]}),a.jsxs("div",{className:"hn-dense-row hn-terminal-display-row",children:[a.jsx("span",{className:"hn-terminal-display-label",children:"Ketik responsif (huruf tampil sebelum echo server)"}),a.jsx(L,{size:"sm",variant:"secondary","aria-pressed":q,"aria-label":`${q?"Matikan":"Nyalakan"} ketik responsif`,onClick:()=>xe(t=>!t),children:q?"Matikan":"Nyalakan"})]}),a.jsxs("div",{className:"hn-dense-row hn-terminal-display-row",children:[a.jsx("span",{id:"terminal-sr-label",className:"hn-terminal-display-label",children:"Mode pembaca layar"}),a.jsx(L,{size:"sm",variant:"secondary","aria-pressed":ne,"aria-describedby":"terminal-sr-hint","aria-label":`${ne?"Matikan":"Nyalakan"} mode pembaca layar`,onClick:()=>Ka(t=>!t),children:ne?"Matikan":"Nyalakan"})]}),a.jsx("p",{id:"terminal-sr-hint",className:"hn-terminal-sr-hint",children:"Untuk pembaca layar: teks terminal tersedia di DOM; kecepatan lebih rendah. Tab dikirim ke sesi (tidak memindahkan fokus). Untuk keluar dari terminal tekan Ctrl+Shift+Esc."}),!U&&a.jsxs("div",{className:"hn-dense-row hn-terminal-display-row",children:[a.jsx("span",{id:"terminal-reset-grid-hint",className:"hn-terminal-display-label",children:'Kembalikan grid ke 1 kolom × 1 baris (sesi lain pindah ke "belum di grid")'}),a.jsx(L,{size:"sm",variant:"secondary","aria-describedby":"terminal-reset-grid-hint",disabled:!w||z.cols===1&&z.rows===1,onClick:()=>void o(t=>H(t,()=>Ca())),children:"Reset grid"})]}),a.jsxs("details",{className:"hn-terminal-diag",children:[a.jsxs("summary",{className:"hn-terminal-diag-summary",children:["Diagnostik",ae?" · perekaman aktif":""]}),a.jsxs("div",{className:"hn-dense-row hn-terminal-display-row hn-terminal-diag-row",children:[a.jsx("span",{className:"hn-terminal-display-label",children:"Rekam jalur ketik — mencatat setiap tombol yang ditekan di pane. Nyalakan hanya saat menyelidiki masalah ketik."}),a.jsx(L,{size:"sm",variant:"secondary","aria-pressed":ae,"aria-label":`${ae?"Matikan":"Nyalakan"} rekam jalur ketik`,onClick:()=>Le(t=>!t),children:ae?"Matikan":"Nyalakan"})]})]})]}),ea=[{key:"backlog",label:"Ambil backlog",icon:"inbox",onSelect:()=>{Be(null),Oe(!0)}},{key:"history",label:"Riwayat sesi",icon:"history",onSelect:()=>Ke(!0)},{key:"shell",label:"Terminal biasa",icon:"terminal",onSelect:()=>n.length>1?tt(!0):void Ot(O)}],bn=[{key:"col+",label:"+ Kolom",icon:"columns-2",disabled:!w,onSelect:()=>void o(t=>H(t,ca))},{key:"row+",label:"+ Baris",icon:"rows-2",disabled:!w,onSelect:()=>void o(t=>H(t,oa))},{key:"col-",label:"Hapus kolom aktif",icon:"columns-2",disabled:!w||z.cols===1,onSelect:()=>void o(t=>H(t,i=>da(i,X%i.cols)))},{key:"row-",label:"Hapus baris aktif",icon:"rows-2",disabled:!w||z.rows===1,onSelect:()=>void o(t=>H(t,i=>ua(i,Math.floor(X/i.cols))))}],kn=[{key:"mode",label:U?"Pakai mode Grid":"Pakai mode Fokus",icon:U?"columns-2":"terminal",onSelect:()=>at(U?"grid":"focus")},{key:"full",label:me?"Keluar layar penuh":"Layar penuh",icon:me?"minimize-2":"maximize-2",onSelect:()=>Et(t=>!t)},{key:"display",label:"Tampilan terminal",icon:"sliders",onSelect:()=>Mt(!0)}];return a.jsxs("div",{"data-testid":"terminal-root",className:me?"hn-terminal-screen is-maxed":"hn-terminal-screen",children:[a.jsxs("div",{className:"hn-terminal-toolbar",role:"group","aria-label":"Terminal",children:[a.jsx(L,{size:"sm",leftIcon:"plus",title:"Pilih runtime lalu buka sesi agen di direktori project. Agen berjalan dengan izin penuh (claude --dangerously-skip-permissions).",onClick:()=>At(!0),children:"Sesi baru"}),re?a.jsxs(a.Fragment,{children:[a.jsx(ya,{compact:!0,items:ea}),U&&y.length>0&&a.jsxs("button",{type:"button",className:"hn-terminal-rail-toggle","aria-haspopup":"dialog","aria-expanded":zt,onClick:()=>Dt(!0),children:["Sesi · ",y.length]}),a.jsx(Ne,{label:"Menu terminal",title:"Terminal",items:kn})]}):a.jsxs(a.Fragment,{children:[a.jsx(ya,{items:ea}),a.jsxs("div",{className:"hn-terminal-seg",role:"group","aria-label":"Mode tampilan terminal",children:[a.jsx("button",{type:"button",className:"hn-terminal-seg-btn","aria-pressed":U,title:"Satu terminal fokus dengan daftar sesi di samping",onClick:()=>at("focus"),children:"Fokus"}),a.jsx("button",{type:"button",className:"hn-terminal-seg-btn","aria-pressed":!U,title:"Beberapa terminal sekaligus dalam grid",onClick:()=>at("grid"),children:"Grid"})]}),a.jsx(Ne,{label:"Tampilan terminal",icon:"sliders",items:[],children:Qt}),a.jsx(gt,{size:"sm",icon:me?"minimize-2":"maximize-2",label:me?"Keluar layar penuh":"Layar penuh","aria-pressed":me,onClick:()=>Et(t=>!t)})]})]}),(I!=="ready"||M.length>0)&&a.jsxs("div",{className:"hn-terminal-status",children:[I!=="ready"&&a.jsx("span",{"data-testid":"terminal-workspace-status",title:D??void 0,className:I==="conflict"?"hn-terminal-status-warn":void 0,children:I==="loading"?"Memuat layout server…":I==="recovering"?a.jsxs(a.Fragment,{children:[a.jsx("span",{children:"Layout server belum tersambung"})," ",a.jsx("button",{type:"button",onClick:()=>void V(),children:"Coba lagi"})]}):D??"Layout berubah di perangkat lain"}),M.length>0&&a.jsx("span",{"data-testid":"worktree-cleanups",title:M.map(t=>`${t.sessionId}${t.error?` — ${t.error}`:""}`).join(`
|
|
2
2
|
`),className:ut.length?"hn-terminal-status-err":void 0,children:ut.length?`${ut.length} worktree gagal dibersihkan`:`membersihkan ${M.length} worktree…`})]}),!U&&a.jsxs("div",{className:"hn-terminal-grid-bar",children:[a.jsx(Pi,{compact:me,ws:v,writable:w,onSelect:T,onAdd:()=>void o(t=>gi(t,`Grup ${t.groups.length+1}`)),onRename:(t,i)=>void o(c=>bi(c,t,i)),onRemove:t=>void o(i=>ki(i,t))}),!B&&a.jsxs(a.Fragment,{children:[a.jsx(L,{size:"sm",variant:"ghost",disabled:!w,onClick:()=>void o(t=>H(t,ca)),children:"+ Kolom"}),a.jsx(L,{size:"sm",variant:"ghost",disabled:!w,onClick:()=>void o(t=>H(t,oa)),children:"+ Baris"})]}),B&&a.jsx(Ne,{label:"Atur grid",icon:"sliders",items:bn})]}),Ve&&a.jsxs(Qe,{tone:"err",title:"Daftar sesi belum bisa dimuat",className:"hn-terminal-notice--tight",children:[a.jsxs("span",{children:[Ve," "]}),a.jsx("button",{type:"button",className:"hn-terminal-action hn-terminal-action--text",onClick:()=>ln(t=>t+1),children:"Coba lagi"})]}),!U&&mt.length>0&&a.jsxs("div",{className:"hn-terminal-unplaced",children:[a.jsx("span",{className:"hn-terminal-unplaced-label",children:"Belum di grid:"}),mt.map(t=>a.jsxs("span",{className:"hn-terminal-unplaced-chip",children:[a.jsxs("button",{className:"hn-terminal-unplaced-action",disabled:!w,onClick:()=>fn(t.id),title:"Taruh di sel kosong pertama grup ini",children:[t.specId??Y(t.projectId)," · ",t.id.slice(0,6)]}),a.jsx("button",{type:"button",className:"hn-terminal-action","aria-label":`Tutup sesi ${t.id}`,onClick:()=>void dt(t.id),children:"×"})]},t.id))]}),!U&&B&&!rt&&a.jsx("div",{className:"hn-stack-mobile hn-terminal-tabs-row",children:a.jsx(Wn,{"aria-label":"Panel terminal",variant:"pill",value:String(X),onChange:t=>We(Number(t)),tabs:z.cells.map((t,i)=>({value:String(i),label:`Panel ${i+1}${t?` · ${t.slice(0,6)}`:" · kosong"}`}))})}),!U&&(rt?Ve?null:a.jsx(ze,{kind:"empty",icon:"terminal",title:"Belum ada sesi terminal",hint:"Tekan Sesi baru untuk memulai agen di project terpilih, atau Terminal biasa untuk shell."}):a.jsxs("div",{ref:lt,"data-testid":"terminal-grid",className:"hn-terminal-grid",style:{"--grid-cols":B?"minmax(0, 1fr)":`18px ${pt.map(t=>`minmax(0, ${t}fr)`).join(" ")}`,"--grid-rows":B?"minmax(0, 1fr)":`16px ${ft.map(t=>`minmax(0, ${t}fr)`).join(" ")}`},children:[!B&&a.jsx("div",{className:"hn-terminal-grid-corner"}),!B&&Array.from({length:z.cols},(t,i)=>a.jsx(ka,{axis:"col",label:`Tutup kolom ${i+1}`,disabled:!w||z.cols===1,gridColumn:i+2,gridRow:1,onClick:()=>void o(c=>H(c,m=>da(m,i)))},`col-${i}`)),!B&&Array.from({length:z.rows},(t,i)=>a.jsx(ka,{axis:"row",label:`Tutup baris ${i+1}`,disabled:!w||z.rows===1,gridColumn:1,gridRow:i+2,onClick:()=>void o(c=>H(c,m=>ua(m,i)))},`row-${i}`)),!B&&Array.from({length:z.cols-1},(t,i)=>{const c=ma(pt,i);return a.jsx(xa,{orientation:"col",label:`Ubah lebar kolom ${i+1}/${i+2}`,now:c.now,min:c.min,max:c.max,disabled:!w,gridColumn:i+3,gridRow:"1 / -1",onPointerDown:m=>Vt("col",i,m),onPointerMove:Yt,onPointerUp:Jt,onKeyDown:m=>Xt("col",i,m),onDoubleClick:()=>Zt("col",i)},`col-div-${i}`)}),!B&&Array.from({length:z.rows-1},(t,i)=>{const c=ma(ft,i);return a.jsx(xa,{orientation:"row",label:`Ubah tinggi baris ${i+1}/${i+2}`,now:c.now,min:c.min,max:c.max,disabled:!w,gridColumn:"1 / -1",gridRow:i+3,onPointerDown:m=>Vt("row",i,m),onPointerMove:Yt,onPointerUp:Jt,onKeyDown:m=>Xt("row",i,m),onDoubleClick:()=>Zt("row",i)},`row-div-${i}`)}),Array.from({length:z.rows},(t,i)=>i).flatMap(t=>Array.from({length:z.cols},(i,c)=>{const m=t*z.cols+c,S=z.cells[m]??null,$=S?Z(S):null;return a.jsx("div",{"data-terminal-cell-index":m,"aria-hidden":B&&X!==m?"true":"false",className:B&&X!==m?"hn-terminal-cell-slot is-hidden":"hn-terminal-cell-slot",style:{"--cell-col":B?"auto":c+2,"--cell-row":B?"auto":t+2},children:$?a.jsx(Bi,{session:$,nameOf:Y,...pe($.id),canArrange:w,onReview:g&&ye.onOpenReview,onSessionReview:N&&ye.onOpenSessionReview,titleOf:h&&ye.titleOf,onIntegrate:k&&ye.onIntegrate,onIntegrateSession:p&&ye.onIntegrateSession,specOf:b&&ye.specOf,backlog:s,fontSize:J,showKeys:le,predict:q,diag:ae,screenReader:ne,fullscreen:ie===$.id,paneHidden:B&&X!==m}):a.jsx(qi,{disabled:!w,unplaced:mt,nameOf:Y,onPick:G=>pn(m,G)})},S??`empty-${m}`)}))]})),U&&a.jsx(Gi,{sessionCount:y.length,focused:Ue,mobile:re,railItems:Pt.map(t=>({session:t,label:be(t,Y,h),projectName:Y(t.projectId),status:Pa(t,it.has(t.id)),startedMs:Ii(t)})),listError:!!Ve,menuFor:hn,onFocus:Ce,drawerOpen:zt,onDrawer:Dt,fullId:ie,focusPhases:Ya,paneHandlers:t=>({onExit:pe(t).onExit,onPhases:mn(t),onForget:pe(t).onForget}),fontSize:J,showKeys:le,onToggleKeys:()=>Pe(t=>!t),predict:q,diag:ae,screenReader:ne}),_a&&a.jsx($i,{seed:un,activeIds:_t,error:Ga,onPick:t=>void Bt(t),onClose:()=>Oe(!1)}),Wa&&a.jsx(oi,{open:!0,projectId:O,projectName:Y(O),projects:n,onProjectChange:ue,onClose:()=>At(!1),onCreated:cn}),qa&&a.jsx(ci,{projectId:O,projects:n,onProjectChange:ue,onClose:()=>tt(!1),onConfirm:t=>void Ot(t)}),Ua&&a.jsx(ri,{projects:n,onClose:()=>Ke(!1),onRestart:t=>void Kt(t)}),st.dialog,Ge&&Z(Ge.sessionId)&&a.jsx(_i,{kind:Ge.kind,session:Z(Ge.sessionId),specOf:b,onIntegrate:k,onIntegrateSession:p,onClose:()=>$t(null)}),he&&a.jsx(te,{open:!0,title:"Ganti nama sesi",eyebrow:"terminal",width:420,onClose:()=>{_e||Re(null)},footer:a.jsxs(a.Fragment,{children:[a.jsx(L,{size:"sm",variant:"ghost",disabled:_e,onClick:()=>Re(null),children:"Batal"}),a.jsx(L,{size:"sm",leftIcon:"save",disabled:_e,onClick:()=>void Wt(),children:"Simpan"})]}),children:a.jsx(we,{label:"Nama sesi",hint:"Maksimal 80 karakter. Kosongkan untuk kembali ke nama otomatis.",children:a.jsx(St,{"aria-label":"Nama sesi",autoFocus:!0,maxLength:80,value:he.value,placeholder:Z(he.id)?be({...Z(he.id),name:void 0},Y,h):void 0,onChange:t=>Re({id:he.id,value:t.target.value}),onKeyDown:t=>{t.key==="Enter"&&Wt()}})})}),ie&&Z(ie)&&a.jsx(Wi,{session:Z(ie),label:be(Z(ie),Y,h),fontSize:J,showKeys:le,predict:q,diag:ae,screenReader:ne,onClose:()=>et(null)}),re&&Xa&&a.jsx(te,{open:!0,title:"Tampilan terminal",icon:"sliders",width:420,onClose:()=>Mt(!1),children:Qt}),Qa,a.jsx(qn,{toast:on})]})}function be(e,n,s){if(e.name)return e.name;const r=n(e.projectId),l=e.specId?s==null?void 0:s(e.specId):void 0;return e.specId?`${r} · ${e.specId}${l?` · ${l}`:""}`:e.id.startsWith("xaudit-")?`${r} · audit lintas`:r}function $i({seed:e,activeIds:n,error:s,onPick:r,onClose:l}){const[u,x]=d.useState(""),[g,N]=d.useState("all"),[h,k]=d.useState("all"),[p,b]=d.useState(e),[j,C]=d.useState(""),[E,A]=d.useState(null);d.useEffect(()=>{const f=setTimeout(()=>C(u.trim()),250);return()=>clearTimeout(f)},[u]),d.useEffect(()=>{var K,W;let f=!0;const M=(W=(K=F).listSpecs)==null?void 0:W.call(K,{startable:!0,q:j||void 0,stage:g==="all"?void 0:g,priority:h==="all"?void 0:h});return M==null||M.then(v=>{f&&(b(v.items),A(null))}).catch(v=>{f&&A(Q("memuat backlog",v))}),()=>{f=!1}},[j,g,h]);const R=p.filter(f=>!n.has(f.id)),y=s??E;return a.jsxs(te,{open:!0,title:"Ambil backlog",icon:"inbox",onClose:l,width:760,children:[y&&a.jsx("div",{role:"alert",className:"hn-terminal-pick-notice",children:y}),a.jsxs("div",{className:"hn-terminal-pick-filters",children:[a.jsx(St,{size:"sm",leftIcon:"search",placeholder:"mis. invoice atau SPEC-412","aria-label":"Cari backlog",value:u,onChange:f=>x(f.target.value),className:"hn-terminal-pick-search"}),a.jsx(ee,{size:"sm","aria-label":"Filter stage",value:g,onChange:f=>N(f.target.value),options:[{value:"all",label:"Semua stage"}].concat(Xn.filter(f=>f.key!=="done").map(f=>({value:f.key,label:f.label})))}),a.jsx(ee,{size:"sm","aria-label":"Filter prioritas",value:h,onChange:f=>k(f.target.value),options:[{value:"all",label:"Semua prioritas"},{value:"tinggi",label:"Tinggi"},{value:"sedang",label:"Sedang"},{value:"rendah",label:"Rendah"}]})]}),R.length===0?a.jsx(ze,{kind:"empty",icon:"inbox",title:"Tak ada backlog untuk diambil",hint:"Semua item sudah selesai/aktif atau tak cocok filter — buat brief baru di halaman Backlog."}):a.jsx("div",{className:"hn-terminal-pick-list",children:R.map(f=>a.jsx("button",{onClick:()=>r(f),className:"hn-terminal-pick-row",children:a.jsxs("span",{className:"hn-dense-row hn-picker-row hn-terminal-pick-main",children:[a.jsx(De,{name:f.source==="qa"?"bug":f.source==="audit"?"search":"lightbulb",size:14,color:f.source==="qa"?"var(--clay-500)":f.source==="audit"?"var(--wind-600)":"var(--brass-500)"}),a.jsx("span",{className:"hn-terminal-pick-id",children:f.id}),a.jsx("span",{className:"hn-picker-title hn-terminal-pick-title",children:f.title}),a.jsx(vt,{tone:f.priority==="tinggi"?"err":"neutral",size:"sm",children:f.priority}),a.jsx("span",{className:"hn-terminal-pick-project",children:f.projectId})]})},f.id))})]})}function Pi({ws:e,compact:n=!1,writable:s,onSelect:r,onAdd:l,onRename:u,onRemove:x}){const[g,N]=d.useState(null),h=$e(e),k=e.groups.length===1,b=Sa()?44:24;return a.jsxs("div",{className:n?"hn-terminal-groups":"hn-terminal-groups is-bordered",style:{"--group-box":`${b}px`},children:[a.jsx("div",{role:"tablist","aria-label":"Grup terminal",className:"hn-terminal-groups-tabs",children:e.groups.map((j,C)=>{const E=j.id===h.id;return a.jsx("button",{type:"button",role:"tab","aria-selected":E,tabIndex:E?0:-1,className:"hn-terminal-group-control hn-terminal-group-tab",onClick:()=>r(j.id),onKeyDown:A=>{var y,f;let R=null;A.key==="ArrowRight"?R=(C+1)%e.groups.length:A.key==="ArrowLeft"?R=(C-1+e.groups.length)%e.groups.length:A.key==="Home"?R=0:A.key==="End"&&(R=e.groups.length-1),R!==null&&(A.preventDefault(),r(e.groups[R].id),(f=(y=A.currentTarget.closest('[role="tablist"]'))==null?void 0:y.querySelectorAll('[role="tab"]')[R])==null||f.focus())},children:j.name},j.id)})}),s&&(g===h.id?a.jsx(Li,{initial:h.name,onCommit:j=>{j.trim()&&u(h.id,j.trim()),N(null)},onCancel:()=>N(null)},h.id):a.jsxs("span",{role:"group","aria-label":`Kelola grup ${h.name}`,className:"hn-terminal-groups-actions",children:[a.jsx("button",{type:"button",className:"hn-terminal-group-control hn-terminal-group-action","aria-label":`Ganti nama grup ${h.name}`,title:"Ganti nama",onClick:()=>N(h.id),children:"✎"}),a.jsx("button",{type:"button",className:"hn-terminal-group-control hn-terminal-group-action hn-terminal-group-remove","aria-label":`Hapus grup ${h.name}`,title:k?"Grup terakhir tak bisa dihapus":"Hapus grup (sesi tetap hidup)",disabled:k,onClick:()=>x(h.id),children:"×"})]})),a.jsx("button",{type:"button",className:"hn-terminal-group-control hn-terminal-group-action hn-terminal-group-add","aria-label":"Grup baru",title:"Grup baru",disabled:!s,onClick:l,children:"+"})]})}function ka({label:e,disabled:n,onClick:s,axis:r,gridColumn:l,gridRow:u}){return a.jsx("button",{type:"button","aria-label":e,title:n?"Grid tak boleh menyusut ke nol":e,disabled:n,onClick:s,className:`hn-terminal-gutter hn-terminal-gutter--${r}`,style:{"--grid-col":l,"--grid-row":u},children:"×"})}function xa({orientation:e,label:n,now:s,min:r,max:l,disabled:u,gridColumn:x,gridRow:g,onPointerDown:N,onPointerMove:h,onPointerUp:k,onKeyDown:p,onDoubleClick:b}){return a.jsx("div",{role:"separator","aria-label":n,"aria-disabled":u,"aria-orientation":e==="col"?"vertical":"horizontal","aria-valuenow":s,"aria-valuemin":r,"aria-valuemax":l,tabIndex:u?-1:0,className:`hn-terminal-divider hn-terminal-divider--${e}`,title:u?void 0:"Seret untuk ubah ukuran — panah untuk langkah kecil, Shift+panah langkah besar, klik dua kali menyamakan",style:{"--grid-col":x,"--grid-row":g},onPointerDown:u?void 0:N,onPointerMove:u?void 0:h,onPointerUp:u?void 0:k,onPointerCancel:u?void 0:k,onKeyDown:u?void 0:p,onDoubleClick:u?void 0:b})}function Li({initial:e,onCommit:n,onCancel:s}){const[r,l]=d.useState(e);return a.jsx("input",{autoFocus:!0,"aria-label":"Nama grup",value:r,placeholder:"mis. Rilis",onChange:u=>l(u.target.value),onBlur:()=>n(r),onKeyDown:u=>{u.key==="Enter"?n(r):u.key==="Escape"&&s()},className:"hn-terminal-rename"})}const Oi={done:"✓",running:"●",pending:"○",skipped:"–",failed:"✕",abandoned:"⨯"};function Oa({phases:e,compact:n=!1,now:s}){const[r,l]=d.useState(null),u=zn(r!==null,()=>l(null),"dialog"),[,x]=d.useState(0),g=!!(e!=null&&e.some(p=>{var b;return((b=p.agent)==null?void 0:b.status)==="running"}));if(d.useEffect(()=>{if(!(!g||s!==void 0))return ni(()=>x(p=>p+1))},[g,s]),!(e!=null&&e.length))return null;const N=s??Date.now(),h=e.find(p=>p.name===r&&p.agent),k=p=>{const b=p.agent;return b?typeof b.durationMs=="number"?sa(b.durationMs):b.status==="running"&&b.startedAt?sa(N-Date.parse(b.startedAt)):"":""};return a.jsxs("div",{"data-testid":"phase-strip",className:"hn-terminal-phase",children:[a.jsx("div",{"data-testid":"phase-strip-scroller",className:"hn-terminal-phase-scroller",children:e.map(p=>{if(!p.agent)return a.jsx("span",{"data-state":p.state,title:p.state,className:"hn-terminal-phase-name",children:p.name},p.name);const b=p.agent,j=Dn(p),C=!n||p.state==="active",E=k(p);return a.jsxs("button",{type:"button","data-tone":j,"aria-expanded":r===p.name,ref:r===p.name?u.triggerRef:void 0,"aria-haspopup":"dialog","aria-controls":r===p.name?u.panelId:void 0,"aria-label":Mn(p,E),onClick:()=>l(r===p.name?null:p.name),className:"hn-terminal-phase-chip",children:[a.jsx("span",{"aria-hidden":!0,children:Oi[j]}),a.jsx("span",{"data-state":p.state,title:p.state,className:"hn-terminal-phase-name",children:p.name}),p.state==="skipped"&&a.jsx("span",{children:"dilewati"}),C&&b.model&&a.jsxs("span",{children:["· ",yt(b.model)]}),C&&b.effort&&a.jsxs("span",{children:["· ",b.effort]}),C&&E&&a.jsxs("span",{children:["· ",E]}),(b.attempts??0)>1&&a.jsxs("span",{children:["↻",b.attempts]}),b.evidence==="missing"&&a.jsx("span",{role:"img","aria-label":"bukti subagent tak diterima",title:"bukti subagent tak diterima",className:"hn-terminal-phase-warn",children:"⚠"})]},p.name)})}),(h==null?void 0:h.agent)&&a.jsxs("div",{ref:u.panelRef,id:u.panelId,role:"dialog","aria-label":`Detail fase ${h.name}`,tabIndex:-1,onKeyDown:u.onKeyDown,className:"hn-terminal-phase-panel",children:[a.jsx("div",{children:a.jsx("b",{children:h.agent.name})}),a.jsx("div",{children:[yt(h.agent.model)||(h.agent.evidence==="unknown"?"model tidak diketahui":""),h.agent.effort??(h.agent.evidence==="unknown"?"effort tidak diketahui":""),h.agent.status??"belum mulai"].filter(Boolean).join(" · ")}),a.jsxs("div",{children:["durasi ",k(h)||(h.agent.evidence==="unknown"?"tidak diketahui":"—")," · percobaan ",h.agent.attempts??"tidak diketahui"]}),a.jsxs("div",{children:["token in ",h.agent.inputTokens??"tidak diketahui"," · out ",h.agent.outputTokens??"tidak diketahui"," · cache ",h.agent.cachedTokens??"tidak diketahui"]}),h.agent.resultExcerpt&&a.jsx("pre",{className:"hn-terminal-phase-excerpt",children:h.agent.resultExcerpt})]})]})}const Bi=d.memo(Ki);function Ki({session:e,nameOf:n,onClose:s,onForget:r,canArrange:l,onDetach:u,onExit:x,onReview:g,onSessionReview:N,titleOf:h,onIntegrate:k,onIntegrateSession:p,specOf:b,fontSize:j,showKeys:C,predict:E,diag:A,screenReader:R,fullscreen:y,onFullscreen:f,onDialog:M,onRename:K,paneHidden:W}){const[v,I]=d.useState(null),D=d.useRef(null),[w,o]=d.useState(Number.POSITIVE_INFINITY);d.useEffect(()=>{const q=D.current;if(!q||typeof ResizeObserver!="function")return;const xe=new ResizeObserver(ae=>{var ne;const Le=((ne=ae[0])==null?void 0:ne.contentRect.width)??q.getBoundingClientRect().width;Le>0&&o(Le)});return xe.observe(q),()=>xe.disconnect()},[]);const[T,V]=d.useState(!1),O=d.useCallback((q,xe)=>{I(q),V(xe)},[]),ue=be(e,n,h),Ie=!e.exited&&!!e.decision,ke=!e.exited&&!!e.deciding,re=Ie||ke,J=e.exited&&!!e.exitCode,de=!e.exited&&T,le=J?null:e.exited||de?"PST-005":re?"PST-004":"PST-003",Pe=Ba(e,{label:ue,canArrange:l,specOf:b,onReview:g,onSessionReview:N,onIntegrate:k,onIntegrateSession:p,onDialog:M,onDetach:u,onFullscreen:f,onRename:K});return a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:e.exited?"hn-terminal-cell-header is-exited":"hn-terminal-cell-header","data-cell-tone":J?"failed":e.exited||de?"done":re?"attention":"idle",children:[le&&a.jsx("span",{className:"hn-terminal-cell-illus",children:a.jsx(ti,{id:le,decorative:!0})}),a.jsxs("span",{className:"hn-terminal-cell-title",children:[ue," · ",e.id.slice(0,6)]}),e.orchestrated&&e.model&&a.jsxs("span",{"data-testid":"orchestrator-chip",title:"Model & effort orchestrator",className:"hn-terminal-orch",children:["orch ",yt(e.model),e.effort?` · ${e.effort}`:""]}),e.exited&&(J?a.jsx(ge,{status:"failed",size:"sm",children:`Gagal · exit ${e.exitCode}`}):a.jsx(ge,{status:"done",size:"sm",children:"Selesai"})),de&&a.jsx(ge,{status:"done",size:"sm",children:"Selesai"}),ke&&!de&&a.jsx(ge,{status:"running",size:"sm",children:"Lead memutuskan"}),Ie&&!ke&&!de&&a.jsx(ge,{status:"awaiting",size:"sm"}),a.jsxs("span",{className:"hn-terminal-actions",children:[a.jsx(Ne,{label:`Aksi sesi ${e.id}`,items:Pe}),a.jsx("button",{type:"button",className:"hn-terminal-action","aria-label":`Tutup sesi ${e.id}`,title:"Tutup sesi (dikonfirmasi dulu)",onClick:s,children:a.jsx(De,{name:"x",size:12})})]})]}),a.jsxs("div",{ref:D,className:"hn-terminal-cell-body",children:[e.exited&&a.jsx(Rt,{}),a.jsx(Oa,{phases:v,compact:w<480}),a.jsx("div",{className:"hn-terminal-cell-pane",children:y?a.jsx("div",{className:"hn-terminal-cell-fullscreen",children:"Terbuka di layar penuh"}):a.jsx(Nt,{sessionId:e.id,onExit:x,onPhases:O,fontSize:j,showKeys:C,predict:E,diag:A,screenReader:R,hidden:W,onForget:r,label:be(e,n,h)},e.id)})]})]})}function Ba(e,n){var x;const s=[],r=e.specId?(x=n.specOf)==null?void 0:x.call(n,e.specId):void 0,l=!e.specId&&!!e.branch;e.specId&&s.push({key:"docs",label:"Lihat dokumen",icon:"file-text",title:"Lihat dokumen (audit/spec/plan)",onSelect:()=>n.onDialog("docs")});const u=e.specId;if(u&&n.onReview){const g=n.onReview;s.push({key:"review",label:"Review perubahan",icon:"git-compare",title:"Review perubahan (diff worktree)",onSelect:()=>g(u)})}if(l&&n.onSessionReview){const g=n.onSessionReview;s.push({key:"review-session",label:"Review perubahan",icon:"git-compare",title:"Review perubahan (diff worktree sesi)",onSelect:()=>g(e.id,n.label)})}return r&&n.onIntegrate&&s.push({key:"integrate",label:"Rebase / Merge branch",icon:"git-merge",title:"Rebase / Merge branch spec",onSelect:()=>n.onDialog("integrate")}),l&&n.onIntegrateSession&&s.push({key:"integrate-session",label:"Rebase / Merge branch",icon:"git-merge",title:"Rebase / Merge branch sesi",onSelect:()=>n.onDialog("sessIntegrate")}),n.onRename&&s.push({key:"rename",label:"Ganti nama",icon:"pencil",title:"Beri nama kustom pada sesi ini",onSelect:n.onRename}),s.push({key:"detach",label:"Lepas dari grid",icon:"unlink",disabled:!n.canArrange,title:"Lepas dari grid (sesi tetap hidup)",onSelect:n.onDetach}),s.push({key:"fullscreen",label:"Layar penuh",icon:"fullscreen",title:"Layar penuh — fokus 1 terminal",onSelect:n.onFullscreen}),n.onKill&&s.push({key:"close",label:"Tutup sesi",icon:"square",tone:"danger",title:"Tutup sesi (dikonfirmasi dulu)",onSelect:n.onKill}),s}function _i({kind:e,session:n,specOf:s,onIntegrate:r,onIntegrateSession:l,onClose:u}){if(e==="docs")return n.specId?a.jsx(ei,{specId:n.specId,onClose:u}):null;if(e==="integrate"){const x=n.specId?s==null?void 0:s(n.specId):void 0;return!x||!r?null:a.jsx(ra,{projectId:x.projectId,ownBranch:`hanoman/${x.id.toLowerCase().replace(/[^a-z0-9_-]/g,"_")}`,eyebrow:x.id,onClose:u,onIntegrate:(g,N)=>{u(),r(x,g,N)}})}return!n.branch||n.specId||!l?null:a.jsx(ra,{projectId:n.projectId,ownBranch:n.branch,eyebrow:n.id.slice(0,16),onClose:u,onIntegrate:(x,g)=>{u(),l(n,x,g)}})}const va="Buka sesi lain: ambil backlog, riwayat sesi, atau terminal biasa";function ya({items:e,compact:n=!1}){const[s,r]=d.useState(!1);return a.jsxs(a.Fragment,{children:[n?a.jsxs("button",{type:"button",className:"hn-terminal-open-compact","aria-label":"Buka…",title:va,"aria-haspopup":"dialog","aria-expanded":s,onClick:()=>r(!0),children:[a.jsx(De,{name:"folder-open",size:16}),a.jsx("span",{className:"hn-terminal-open-text",children:"Buka…"})]}):a.jsx(L,{size:"sm",variant:"ghost","aria-haspopup":"dialog","aria-expanded":s,title:va,onClick:()=>r(!0),children:"Buka…"}),s&&a.jsx(te,{open:!0,title:"Buka sesi",icon:"terminal",width:420,onClose:()=>r(!1),children:a.jsx("div",{className:"hn-terminal-menu-list",children:e.map(l=>a.jsxs("button",{type:"button",disabled:l.disabled,title:l.title,className:"hn-overflow-item",onClick:()=>{r(!1),l.onSelect()},children:[l.icon&&a.jsx(De,{name:l.icon,size:15}),l.label]},l.key))})})]})}function Gi({sessionCount:e,focused:n,railItems:s,mobile:r,listError:l,menuFor:u,onFocus:x,drawerOpen:g,onDrawer:N,fullId:h,focusPhases:k,paneHandlers:p,fontSize:b,showKeys:j,onToggleKeys:C,predict:E,diag:A,screenReader:R}){const y=n?s.find(f=>f.session.id===n.id):void 0;return a.jsxs("div",{className:"hn-terminal-focus","data-testid":"terminal-focus",children:[!r&&e>0&&a.jsxs("aside",{className:"hn-terminal-rail","aria-label":"Sesi terminal",children:[a.jsxs("div",{className:"hn-terminal-rail-head",children:[a.jsx("span",{children:"Sesi"}),a.jsx("span",{children:e})]}),a.jsx("div",{className:"hn-terminal-rail-scroll",children:a.jsx(ba,{items:s,focusedId:(n==null?void 0:n.id)??null,onFocus:x,menuFor:u})})]}),a.jsx("section",{className:"hn-terminal-focus-main","aria-label":"Terminal fokus",children:n&&y?a.jsxs(a.Fragment,{children:[a.jsxs("header",{className:"hn-terminal-focus-head",children:[a.jsxs("span",{className:"hn-terminal-focus-title",title:y.label,children:[y.label," · ",n.id.slice(0,6)]}),a.jsx(ge,{status:La[y.status.tone],size:"sm",variant:"dot",children:y.status.label}),a.jsx(Ne,{label:`Aksi sesi ${n.id}`,items:u(n)})]}),n.exited&&a.jsx(Rt,{}),a.jsx(Oa,{compact:r,phases:(k==null?void 0:k.sessionId)===n.id?k.phases:null}),a.jsx("div",{className:"hn-terminal-focus-body",children:h===n.id?a.jsx("div",{className:"hn-terminal-focus-placeholder",children:"Terbuka di layar penuh"}):a.jsx(Nt,{sessionId:n.id,...p(n.id),fontSize:b,showKeys:j,predict:E,diag:A,screenReader:R,composer:!0,compact:r,onToggleKeys:C,label:y.label},n.id)})]}):l?null:a.jsx(ze,{kind:"empty",icon:"terminal",title:"Belum ada sesi terminal",hint:"Tekan Sesi baru untuk memulai agen di project terpilih, atau Terminal biasa untuk shell."})}),r&&g&&a.jsx(te,{open:!0,title:"Sesi terminal",icon:"terminal",width:460,onClose:()=>N(!1),children:a.jsx(ba,{items:s,focusedId:(n==null?void 0:n.id)??null,onFocus:f=>{x(f),N(!1)},menuFor:u})})]})}function Rt(){return a.jsxs("div",{role:"status","data-testid":"terminal-ended",className:"hn-terminal-ended",children:[a.jsx("strong",{className:"hn-terminal-ended-title",children:"Berakhir"}),a.jsx("span",{className:"hn-terminal-ended-body",children:"Agen sudah berhenti. Output tetap bisa dibaca; tutup sel bila tak diperlukan lagi."})]})}function Wi({session:e,label:n,fontSize:s,showKeys:r,predict:l,diag:u,screenReader:x,onClose:g}){return a.jsx(te,{open:!0,icon:"terminal",title:n,onClose:g,closeOnEscape:!1,width:1600,children:a.jsxs("div",{className:"hn-terminal-fullscreen-body",children:[e.exited&&a.jsx(Rt,{}),a.jsx(Nt,{sessionId:e.id,onExit:()=>{},fontSize:s,showKeys:r,predict:l,diag:u,screenReader:x},e.id)]})})}function qi({unplaced:e,nameOf:n,onPick:s,disabled:r}){return a.jsx("div",{className:"hn-terminal-empty-cell",children:a.jsx(ee,{size:"sm",value:"","aria-label":"Pilih sesi untuk sel",disabled:r||!e.length,onChange:l=>l.target.value&&s(l.target.value),options:[{value:"",label:e.length?"Pilih sesi…":"tidak ada sesi bebas"}].concat(e.map(l=>({value:l.id,label:`${l.specId??n(l.projectId)} · ${l.id.slice(0,6)}`})))})})}export{Oa as PhaseStrip,Xi as TerminalScreen,Ba as sessionMenuItems};
|