hanoman 0.9.22 → 0.9.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/dist/build-info.json +3 -3
  2. package/dist/cli.js +9 -6
  3. package/dist/server.js +19 -15
  4. package/package.json +1 -1
  5. package/web/assets/{DalangHanomanScreen--M-xLwH5.js → DalangHanomanScreen-EQe23yK4.js} +1 -1
  6. package/web/assets/{DocPreviewModal-CYdmHEb_.js → DocPreviewModal-M2ZmZuVV.js} +1 -1
  7. package/web/assets/{DocsWorkspace-BFzb87Ye.js → DocsWorkspace-DaU4WE25.js} +1 -1
  8. package/web/assets/{IdeScreen-CDMJaERU.js → IdeScreen-CTYc8Fph.js} +1 -1
  9. package/web/assets/{LeadScreen-DJjFTkyZ.js → LeadScreen-DnOKlwiq.js} +1 -1
  10. package/web/assets/{ReviewScreen-DG0xSBou.js → ReviewScreen-C60nNc_B.js} +1 -1
  11. package/web/assets/{SchedulerScreen-ChEZ01CH.js → SchedulerScreen-w6PoiYKq.js} +1 -1
  12. package/web/assets/{SettingsScreen-BnINOj5X.js → SettingsScreen-DTEzAFHf.js} +1 -1
  13. package/web/assets/TeamScreen-BfZFbSkx.js +1 -0
  14. package/web/assets/{TeamScreen-CtkpFpCF.css → TeamScreen-Bw8bIycZ.css} +1 -1
  15. package/web/assets/{TerminalScreen-CIROrYjO.js → TerminalScreen-D8AVuoL1.js} +1 -1
  16. package/web/assets/{TriageScreen-BWnuGOmQ.js → TriageScreen-BKqoJ3xG.js} +1 -1
  17. package/web/assets/{VpsScreen-PqOkFriA.js → VpsScreen-CmtFPOrc.js} +1 -1
  18. package/web/assets/{index-T4aiSGoI.css → index-B8xChq6y.css} +1 -1
  19. package/web/assets/{index-DYWU10xI.js → index-DVdPR2vU.js} +209 -209
  20. package/web/assets/{live-C90Zx0h6.js → live-DOOQ6v5A.js} +1 -1
  21. package/web/assets/{sched-lead-shared-Qn3NA7WO.js → sched-lead-shared-CxpBSw2U.js} +1 -1
  22. package/web/assets/{settings-rebase-3Z15zUKI.js → settings-rebase-D5ONeD9O.js} +1 -1
  23. package/web/index.html +2 -2
  24. package/web/assets/TeamScreen-5cFDPm3o.js +0 -1
@@ -1 +1 @@
1
- import{u as l,j as s,n as f}from"./index-DYWU10xI.js";import{R as o}from"./react-DfGhg7ZW.js";const m=6e3;function p({className:a="",style:r={}}){const e=l(),t=!e.idle&&!e.connected&&!e.paused,[i,n]=o.useState(()=>Date.now());o.useEffect(()=>{if(!t)return;n(Date.now());const u=setInterval(()=>n(Date.now()),1e3);return()=>clearInterval(u)},[t,e.since]);const c=t&&i-e.since>=m;return s.jsx("span",{role:"status","aria-live":"polite",className:`hn-live-status ${a}`.trim(),style:r,children:c&&s.jsx(f,{tone:"warn",variant:"soft",icon:"wifi-off",children:"koneksi terputus · menyambung ulang…"})})}export{p as L};
1
+ import{u as l,j as s,n as f}from"./index-DVdPR2vU.js";import{R as o}from"./react-DfGhg7ZW.js";const m=6e3;function p({className:a="",style:r={}}){const e=l(),t=!e.idle&&!e.connected&&!e.paused,[i,n]=o.useState(()=>Date.now());o.useEffect(()=>{if(!t)return;n(Date.now());const u=setInterval(()=>n(Date.now()),1e3);return()=>clearInterval(u)},[t,e.since]);const c=t&&i-e.since>=m;return s.jsx("span",{role:"status","aria-live":"polite",className:`hn-live-status ${a}`.trim(),style:r,children:c&&s.jsx(f,{tone:"warn",variant:"soft",icon:"wifi-off",children:"koneksi terputus · menyambung ulang…"})})}export{p as L};
@@ -1 +1 @@
1
- import{j as s,B as m,a1 as f}from"./index-DYWU10xI.js";import{R as c}from"./react-DfGhg7ZW.js";import"./markdown-CWEY34jk.js";/* empty css */function p(t,e=Date.now()){return f(t,e)||"—"}function b(t,e=Date.now()){if(!t)return"—";const r=new Date(t).getTime()-e;if(r<=0)return"jatuh tempo";const n=Math.ceil(r/6e4);return n<60?`${n} menit lagi`:`${Math.ceil(n/60)} jam lagi`}function g(t,e,r,n,a=!0){const i=t.trim()===""?NaN:Number(t.replace(",","."));if(!Number.isFinite(i))return n;const o=a?Math.round(i):i;return Math.min(r,Math.max(e,o))}function D(){return Intl.DateTimeFormat().resolvedOptions().timeZone}function y(t,e){if(!t)return"—";const r=new Date(t);if(Number.isNaN(r.getTime()))return"—";const n={dateStyle:"medium",timeStyle:"short"};try{return new Intl.DateTimeFormat("id-ID",e?{...n,timeZone:e}:n).format(r)}catch(a){if(a instanceof RangeError)return new Intl.DateTimeFormat("id-ID",n).format(r);throw a}}function w({message:t,onRetry:e,busy:r=!1}){return s.jsxs("div",{role:"alert",className:"hn-sched-error",children:[s.jsx("span",{className:"hn-sched-error-text",children:t}),s.jsx(m,{size:"sm",variant:"secondary",leftIcon:"rotate-ccw",disabled:r,onClick:e,children:"Coba lagi"})]})}function x(t){const[e,r]=c.useState(t),n=c.useRef(t),a=JSON.stringify(t);c.useEffect(()=>{const o=JSON.stringify(n.current);n.current=t,r(u=>JSON.stringify(u)===o?t:u)},[a]);const i=JSON.stringify(e)!==a;return{draft:e,setDraft:r,dirty:i}}export{w as I,p as a,D as b,g as c,b as d,y as f,x as u};
1
+ import{j as s,B as m,a1 as f}from"./index-DVdPR2vU.js";import{R as c}from"./react-DfGhg7ZW.js";import"./markdown-CWEY34jk.js";/* empty css */function p(t,e=Date.now()){return f(t,e)||"—"}function b(t,e=Date.now()){if(!t)return"—";const r=new Date(t).getTime()-e;if(r<=0)return"jatuh tempo";const n=Math.ceil(r/6e4);return n<60?`${n} menit lagi`:`${Math.ceil(n/60)} jam lagi`}function g(t,e,r,n,a=!0){const i=t.trim()===""?NaN:Number(t.replace(",","."));if(!Number.isFinite(i))return n;const o=a?Math.round(i):i;return Math.min(r,Math.max(e,o))}function D(){return Intl.DateTimeFormat().resolvedOptions().timeZone}function y(t,e){if(!t)return"—";const r=new Date(t);if(Number.isNaN(r.getTime()))return"—";const n={dateStyle:"medium",timeStyle:"short"};try{return new Intl.DateTimeFormat("id-ID",e?{...n,timeZone:e}:n).format(r)}catch(a){if(a instanceof RangeError)return new Intl.DateTimeFormat("id-ID",n).format(r);throw a}}function w({message:t,onRetry:e,busy:r=!1}){return s.jsxs("div",{role:"alert",className:"hn-sched-error",children:[s.jsx("span",{className:"hn-sched-error-text",children:t}),s.jsx(m,{size:"sm",variant:"secondary",leftIcon:"rotate-ccw",disabled:r,onClick:e,children:"Coba lagi"})]})}function x(t){const[e,r]=c.useState(t),n=c.useRef(t),a=JSON.stringify(t);c.useEffect(()=>{const o=JSON.stringify(n.current);n.current=t,r(u=>JSON.stringify(u)===o?t:u)},[a]);const i=JSON.stringify(e)!==a;return{draft:e,setDraft:r,dirty:i}}export{w as I,p as a,D as b,g as c,b as d,y as f,x as u};
@@ -1 +1 @@
1
- import{j as a,cm as j,aH as g,F as u,bO as p,b1 as C,cn as N,g as x,aJ as $,bJ as k,co as S,cp as A,a9 as L,ac as F,ad as M}from"./index-DYWU10xI.js";import{R as O}from"./react-DfGhg7ZW.js";import"./markdown-CWEY34jk.js";/* empty css */const v=[{id:"claude",label:k.claude},{id:"codex",label:k.codex}],T=[{value:"inline",label:"Inline — agen fase mengerjakan task sendiri (cepat)"},{value:"subagent",label:"Subagen per task — implementer + review tiap task (lebih lambat)"}],_={model:null,effort:null};function I({flow:s,phase:n,runtime:r,cell:e,disabled:t,onPick:l}){const d=A(r),i=L(r,e.model??""),m=r==="codex"?F:M,b=[{value:"",label:"— warisi orchestrator"},...e.model&&!d.some(o=>o.id===e.model)?[{value:e.model,label:e.model}]:[],...d.map(o=>({value:o.id,label:o.label}))],E=[{value:"",label:"— warisi"},...e.effort&&!i.includes(e.effort)?[{value:e.effort,label:e.effort}]:[],...i.map(o=>({value:o,label:o}))];return a.jsxs("div",{className:"hn-sched-picks",children:[a.jsx(x,{size:"sm","aria-label":`Model ${s} ${n} ${r}`,value:e.model??"",className:"hn-sched-pick-model",options:b,disabled:t,onChange:o=>{const h=o.target.value||null;l({model:h,effort:h&&e.effort?m(h,e.effort):e.effort},`${n} (${r}) → ${h??"warisi"}`)}}),a.jsx(x,{size:"sm","aria-label":`Effort ${s} ${n} ${r}`,value:e.effort??"",className:"hn-sched-pick-effort",options:E,disabled:t,onChange:o=>l({...e,effort:o.target.value||null},`${n} (${r}) effort → ${o.target.value||"warisi"}`)})]})}function y({flow:s,f:n,putFlow:r}){return a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"hn-sched-flow-row",children:[a.jsx("span",{className:"hn-sched-flow-status",children:n.enabled?"Fase dikerjakan subagen":"Satu sesi biasa (subagen nonaktif)"}),a.jsx(C,{checked:n.enabled,"aria-label":`Orkestrasi ${s}`,onChange:e=>r(s,{...n,enabled:e},`Orkestrasi ${u[s]} · ${e?"aktif":"nonaktif"}`)})]}),N.has(s)&&a.jsxs("div",{className:"hn-sched-flow-mode",children:[a.jsx("span",{className:"hn-sched-flow-mode-label",children:"Cara mengerjakan rencana"}),a.jsx(x,{size:"sm","aria-label":`Mode Execute ${s}`,value:n.executeMode??"inline",className:"hn-sched-flow-mode-select",options:T,disabled:!n.enabled,onChange:e=>{const t=e.target.value==="subagent"?"subagent":"inline";r(s,{...n,executeMode:t},`Mode Execute ${u[s]} · ${t==="subagent"?"subagen per task":"inline"}`)}}),a.jsx("span",{className:"hn-sched-flow-mode-note",children:"khusus sesi Claude · Codex selalu inline"})]}),a.jsx($,{children:a.jsxs("table",{className:"hn-sched-matrix",children:[a.jsx("thead",{children:a.jsxs("tr",{children:[a.jsx("th",{children:"Fase"}),v.map(e=>a.jsx("th",{children:e.label},e.id))]})}),a.jsx("tbody",{children:S[s].map(e=>a.jsxs("tr",{children:[a.jsx("td",{children:e}),v.map(t=>a.jsx("td",{children:a.jsx(I,{flow:s,phase:e,runtime:t.id,cell:n[t.id][e]??_,disabled:!n.enabled,onPick:(l,d)=>r(s,{...n,[t.id]:{...n[t.id],[e]:l}},d)})},t.id))]},e))})]})})]})}function R({flow:s,f:n,putFlow:r}){const[e,t]=O.useState(!1),l=O.useId();return a.jsxs("div",{className:"hn-sched-flow","data-testid":`orch-flow-${s}`,children:[a.jsxs("button",{type:"button",className:"hn-sched-flow-head hn-touch-target","aria-expanded":e,"aria-controls":l,onClick:()=>t(d=>!d),children:[a.jsx("span",{children:u[s]}),a.jsx("span",{className:"hn-sched-flow-state",children:n.enabled?"aktif":"nonaktif"})]}),a.jsx("div",{id:l,className:"hn-sched-flow-body",hidden:!e,children:a.jsx(y,{flow:s,f:n,putFlow:r})})]})}function z({orchestration:s,onChange:n,variant:r="cards"}){const e=s??p,t=i=>e[i]??p[i],l=(i,m,b)=>n({...e,[i]:m},b),d=a.jsxs("div",{className:"hn-sched-group-hint",children:["Sesi utama berperan sebagai ",a.jsx("b",{children:"pengatur"}),"; setiap fase dikerjakan subagen dengan model & effort di bawah. ",a.jsx("b",{children:"Warisi"})," memakai pengaturan sesi utama yang dipilih saat ",a.jsx("b",{children:"Start"}),". Subagen selalu berjalan di runtime yang sama dengan sesi utama: sesi Claude memakai kolom Claude Code, sesi Codex kolom Codex CLI. Flow yang dimatikan berjalan sebagai satu sesi biasa seperti sebelumnya."]});return r==="accordion"?a.jsxs("div",{className:"hn-sched-panel",children:[d,j.map(i=>a.jsx(R,{flow:i,f:t(i),putFlow:l},i))]}):a.jsxs(a.Fragment,{children:[a.jsx(g,{eyebrow:"orkestrasi",title:"Orkestrasi subagen per fase",children:d}),j.map(i=>a.jsx("div",{"data-testid":`orch-flow-${i}`,children:a.jsx(g,{eyebrow:"flow",title:u[i],children:a.jsx(y,{flow:i,f:t(i),putFlow:l})})},i))]})}const c=s=>!!s&&typeof s=="object"&&!Array.isArray(s)&&Object.getPrototypeOf(s)===Object.prototype,f=(s,n)=>{if(s===n)return!0;if(Array.isArray(s)&&Array.isArray(n))return s.length===n.length&&s.every((r,e)=>f(r,n[e]));if(c(s)&&c(n)){const r=Object.keys(s).filter(t=>s[t]!==void 0),e=Object.keys(n).filter(t=>n[t]!==void 0);return r.length===e.length&&r.every(t=>f(s[t],n[t]))}return!1};function w(s,n,r){if(f(n,s)&&r!==void 0)return r;if(!c(s)||!c(n)||!c(r))return n;const e={...r};for(const t of Object.keys(n))e[t]=w(s[t],n[t],r[t]);return e}export{z as O,w as r};
1
+ import{j as a,cm as j,aH as g,F as u,bO as p,b1 as C,cn as N,g as x,aJ as $,bJ as k,co as S,cp as A,a9 as L,ac as F,ad as M}from"./index-DVdPR2vU.js";import{R as O}from"./react-DfGhg7ZW.js";import"./markdown-CWEY34jk.js";/* empty css */const v=[{id:"claude",label:k.claude},{id:"codex",label:k.codex}],T=[{value:"inline",label:"Inline — agen fase mengerjakan task sendiri (cepat)"},{value:"subagent",label:"Subagen per task — implementer + review tiap task (lebih lambat)"}],_={model:null,effort:null};function I({flow:s,phase:n,runtime:r,cell:e,disabled:t,onPick:l}){const d=A(r),i=L(r,e.model??""),m=r==="codex"?F:M,b=[{value:"",label:"— warisi orchestrator"},...e.model&&!d.some(o=>o.id===e.model)?[{value:e.model,label:e.model}]:[],...d.map(o=>({value:o.id,label:o.label}))],E=[{value:"",label:"— warisi"},...e.effort&&!i.includes(e.effort)?[{value:e.effort,label:e.effort}]:[],...i.map(o=>({value:o,label:o}))];return a.jsxs("div",{className:"hn-sched-picks",children:[a.jsx(x,{size:"sm","aria-label":`Model ${s} ${n} ${r}`,value:e.model??"",className:"hn-sched-pick-model",options:b,disabled:t,onChange:o=>{const h=o.target.value||null;l({model:h,effort:h&&e.effort?m(h,e.effort):e.effort},`${n} (${r}) → ${h??"warisi"}`)}}),a.jsx(x,{size:"sm","aria-label":`Effort ${s} ${n} ${r}`,value:e.effort??"",className:"hn-sched-pick-effort",options:E,disabled:t,onChange:o=>l({...e,effort:o.target.value||null},`${n} (${r}) effort → ${o.target.value||"warisi"}`)})]})}function y({flow:s,f:n,putFlow:r}){return a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"hn-sched-flow-row",children:[a.jsx("span",{className:"hn-sched-flow-status",children:n.enabled?"Fase dikerjakan subagen":"Satu sesi biasa (subagen nonaktif)"}),a.jsx(C,{checked:n.enabled,"aria-label":`Orkestrasi ${s}`,onChange:e=>r(s,{...n,enabled:e},`Orkestrasi ${u[s]} · ${e?"aktif":"nonaktif"}`)})]}),N.has(s)&&a.jsxs("div",{className:"hn-sched-flow-mode",children:[a.jsx("span",{className:"hn-sched-flow-mode-label",children:"Cara mengerjakan rencana"}),a.jsx(x,{size:"sm","aria-label":`Mode Execute ${s}`,value:n.executeMode??"inline",className:"hn-sched-flow-mode-select",options:T,disabled:!n.enabled,onChange:e=>{const t=e.target.value==="subagent"?"subagent":"inline";r(s,{...n,executeMode:t},`Mode Execute ${u[s]} · ${t==="subagent"?"subagen per task":"inline"}`)}}),a.jsx("span",{className:"hn-sched-flow-mode-note",children:"khusus sesi Claude · Codex selalu inline"})]}),a.jsx($,{children:a.jsxs("table",{className:"hn-sched-matrix",children:[a.jsx("thead",{children:a.jsxs("tr",{children:[a.jsx("th",{children:"Fase"}),v.map(e=>a.jsx("th",{children:e.label},e.id))]})}),a.jsx("tbody",{children:S[s].map(e=>a.jsxs("tr",{children:[a.jsx("td",{children:e}),v.map(t=>a.jsx("td",{children:a.jsx(I,{flow:s,phase:e,runtime:t.id,cell:n[t.id][e]??_,disabled:!n.enabled,onPick:(l,d)=>r(s,{...n,[t.id]:{...n[t.id],[e]:l}},d)})},t.id))]},e))})]})})]})}function R({flow:s,f:n,putFlow:r}){const[e,t]=O.useState(!1),l=O.useId();return a.jsxs("div",{className:"hn-sched-flow","data-testid":`orch-flow-${s}`,children:[a.jsxs("button",{type:"button",className:"hn-sched-flow-head hn-touch-target","aria-expanded":e,"aria-controls":l,onClick:()=>t(d=>!d),children:[a.jsx("span",{children:u[s]}),a.jsx("span",{className:"hn-sched-flow-state",children:n.enabled?"aktif":"nonaktif"})]}),a.jsx("div",{id:l,className:"hn-sched-flow-body",hidden:!e,children:a.jsx(y,{flow:s,f:n,putFlow:r})})]})}function z({orchestration:s,onChange:n,variant:r="cards"}){const e=s??p,t=i=>e[i]??p[i],l=(i,m,b)=>n({...e,[i]:m},b),d=a.jsxs("div",{className:"hn-sched-group-hint",children:["Sesi utama berperan sebagai ",a.jsx("b",{children:"pengatur"}),"; setiap fase dikerjakan subagen dengan model & effort di bawah. ",a.jsx("b",{children:"Warisi"})," memakai pengaturan sesi utama yang dipilih saat ",a.jsx("b",{children:"Start"}),". Subagen selalu berjalan di runtime yang sama dengan sesi utama: sesi Claude memakai kolom Claude Code, sesi Codex kolom Codex CLI. Flow yang dimatikan berjalan sebagai satu sesi biasa seperti sebelumnya."]});return r==="accordion"?a.jsxs("div",{className:"hn-sched-panel",children:[d,j.map(i=>a.jsx(R,{flow:i,f:t(i),putFlow:l},i))]}):a.jsxs(a.Fragment,{children:[a.jsx(g,{eyebrow:"orkestrasi",title:"Orkestrasi subagen per fase",children:d}),j.map(i=>a.jsx("div",{"data-testid":`orch-flow-${i}`,children:a.jsx(g,{eyebrow:"flow",title:u[i],children:a.jsx(y,{flow:i,f:t(i),putFlow:l})})},i))]})}const c=s=>!!s&&typeof s=="object"&&!Array.isArray(s)&&Object.getPrototypeOf(s)===Object.prototype,f=(s,n)=>{if(s===n)return!0;if(Array.isArray(s)&&Array.isArray(n))return s.length===n.length&&s.every((r,e)=>f(r,n[e]));if(c(s)&&c(n)){const r=Object.keys(s).filter(t=>s[t]!==void 0),e=Object.keys(n).filter(t=>n[t]!==void 0);return r.length===e.length&&r.every(t=>f(s[t],n[t]))}return!1};function w(s,n,r){if(f(n,s)&&r!==void 0)return r;if(!c(s)||!c(n)||!c(r))return n;const e={...r};for(const t of Object.keys(n))e[t]=w(s[t],n[t],r[t]);return e}export{z as O,w as r};
package/web/index.html CHANGED
@@ -12,11 +12,11 @@
12
12
  <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400&amp;family=IBM+Plex+Serif:ital,wght@0,400;0,500;0,600;0,700;1,400&amp;family=IBM+Plex+Mono:ital,wght@0,400;0,500;0,600;1,400&amp;display=swap" /></noscript>
13
13
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
14
14
  <title>hanoman</title>
15
- <script type="module" crossorigin src="/assets/index-DYWU10xI.js"></script>
15
+ <script type="module" crossorigin src="/assets/index-DVdPR2vU.js"></script>
16
16
  <link rel="modulepreload" crossorigin href="/assets/react-DfGhg7ZW.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/markdown-CWEY34jk.js">
18
18
  <link rel="modulepreload" crossorigin href="/assets/xterm-3VOAfa_q.js">
19
- <link rel="stylesheet" crossorigin href="/assets/index-T4aiSGoI.css">
19
+ <link rel="stylesheet" crossorigin href="/assets/index-B8xChq6y.css">
20
20
  </head>
21
21
  <body>
22
22
  <div id="root"></div>
@@ -1 +0,0 @@
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-DYWU10xI.js";import{R as d}from"./react-DfGhg7ZW.js";import{L as qa}from"./live-C90Zx0h6.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.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};