hanoman 0.3.0 → 0.3.2
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 +426 -77
- package/dist/server.js +3103 -2038
- package/package.json +1 -1
- package/prisma/migrations/20260905120000_agent_evidence_identity/migration.sql +3 -0
- package/prisma/schema.prisma +2 -0
- package/web/assets/{ChangelogScreen-DLlZe3rp.js → ChangelogScreen-D_-RmJkz.js} +1 -1
- package/web/assets/{DalangHanomanScreen-R7FUpJF_.js → DalangHanomanScreen-pVfnLx9z.js} +1 -1
- package/web/assets/{DocPreviewModal-DrVk9Jat.js → DocPreviewModal-ZFjISCL0.js} +1 -1
- package/web/assets/{DocsWorkspace-B9v_jrMO.js → DocsWorkspace-Vp_vik3v.js} +1 -1
- package/web/assets/IdeScreen-DQSRs3fr.js +2 -0
- package/web/assets/{LeadScreen-S8AJWFTm.js → LeadScreen-Bv5LiudD.js} +1 -1
- package/web/assets/{ReviewScreen-BRXl6u_X.js → ReviewScreen-Cime4Tci.js} +1 -1
- package/web/assets/SchedulerScreen-DKmRNbTs.js +1 -0
- package/web/assets/SettingsScreen-Bh8XhyVQ.js +62 -0
- package/web/assets/{TeamScreen-CFj0bFS7.js → TeamScreen-5ugoXsOv.js} +1 -1
- package/web/assets/TerminalScreen-DsAn5dlH.js +9 -0
- package/web/assets/{TriageScreen-CC6U7Hog.js → TriageScreen-BajACF5K.js} +1 -1
- package/web/assets/{VpsScreen-CeAUGPqE.js → VpsScreen-C7muNRX5.js} +1 -1
- package/web/assets/{diff-view-Brg2N-Y9.js → diff-view-CsZPBznT.js} +1 -1
- package/web/assets/index-DI7G_sit.js +923 -0
- package/web/assets/{live-BhsIWS2g.js → live-DVDstDzi.js} +1 -1
- package/web/index.html +1 -1
- package/web/assets/IdeScreen-CyRuZ5dQ.js +0 -2
- package/web/assets/SchedulerScreen-BfIF1e2Y.js +0 -1
- package/web/assets/SettingsScreen-CVEuvhVa.js +0 -62
- package/web/assets/TerminalScreen-DNAcMRWA.js +0 -9
- package/web/assets/index-DSFIYjSl.js +0 -915
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a4 as Zt,a2 as Yt,e as M,q as Vt,j as t,f as J,l as St,ae as je,I as He,a as O,af as Se,ag as qt,B as re,M as Qe,ah as qe,ai as Ct,aj as Nt,d as ot,S as Xe,ak as vt,C as At,h as ke,u as Xt,al as Rt,o as Ze,v as Qt,p as pt,a7 as Jt,a0 as Ye}from"./index-DI7G_sit.js";import{R as h}from"./react-DfGhg7ZW.js";import{H as bt}from"./highlight-HK3IjCTX.js";import{D as en}from"./DocPreviewModal-ZFjISCL0.js";import{L as tn}from"./live-DVDstDzi.js";import{b as Tt,T as Mt,D as Ot,C as kt}from"./diff-view-CsZPBznT.js";import"./markdown-CWEY34jk.js";const lt="[A-Za-z$_][0-9A-Za-z$_]*",It=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],jt=["true","false","null","undefined","NaN","Infinity"],Lt=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],zt=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],$t=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],Dt=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],Bt=[].concat($t,Lt,zt);function nn(n){const r=n.regex,a=(j,{after:V})=>{const $="</"+j[0].slice(1);return j.input.indexOf($,V)!==-1},s=lt,l={begin:"<>",end:"</>"},p=/<[A-Za-z0-9\\._:-]+\s*\/>/,b={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(j,V)=>{const $=j[0].length+j.index,F=j.input[$];if(F==="<"||F===","){V.ignoreMatch();return}F===">"&&(a(j,{after:$})||V.ignoreMatch());let L;const q=j.input.substring($);if(L=q.match(/^\s*=/)){V.ignoreMatch();return}if((L=q.match(/^\s+extends\s+/))&&L.index===0){V.ignoreMatch();return}}},v={$pattern:lt,keyword:It,literal:jt,built_in:Bt,"variable.language":Dt},_="[0-9](_?[0-9])*",k=`\\.(${_})`,i="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",N={className:"number",variants:[{begin:`(\\b(${i})((${k})|\\.)?|(${k}))[eE][+-]?(${_})\\b`},{begin:`\\b(${i})\\b((${k})\\b|\\.)?|(${k})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:v,contains:[]},u={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[n.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},c={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[n.BACKSLASH_ESCAPE,o],subLanguage:"css"}},g={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[n.BACKSLASH_ESCAPE,o],subLanguage:"graphql"}},d={className:"string",begin:"`",end:"`",contains:[n.BACKSLASH_ESCAPE,o]},E={className:"comment",variants:[n.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:s+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),n.C_BLOCK_COMMENT_MODE,n.C_LINE_COMMENT_MODE]},C=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE,u,c,g,d,{match:/\$\d+/},N];o.contains=C.concat({begin:/\{/,end:/\}/,keywords:v,contains:["self"].concat(C)});const w=[].concat(E,o.contains),R=w.concat([{begin:/(\s*)\(/,end:/\)/,keywords:v,contains:["self"].concat(w)}]),I={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:v,contains:R},Q={variants:[{match:[/class/,/\s+/,s,/\s+/,/extends/,/\s+/,r.concat(s,"(",r.concat(/\./,s),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,s],scope:{1:"keyword",3:"title.class"}}]},T={relevance:0,match:r.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...Lt,...zt]}},Z={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},B={variants:[{match:[/function/,/\s+/,s,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[I],illegal:/%/},Y={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function A(j){return r.concat("(?!",j.join("|"),")")}const U={match:r.concat(/\b/,A([...$t,"super","import"].map(j=>`${j}\\s*\\(`)),s,r.lookahead(/\s*\(/)),className:"title.function",relevance:0},x={begin:r.concat(/\./,r.lookahead(r.concat(s,/(?![0-9A-Za-z$_(])/))),end:s,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},G={match:[/get|set/,/\s+/,s,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},I]},D="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+n.UNDERSCORE_IDENT_RE+")\\s*=>",W={match:[/const|var|let/,/\s+/,s,/\s*/,/=\s*/,/(async\s*)?/,r.lookahead(D)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[I]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:v,exports:{PARAMS_CONTAINS:R,CLASS_REFERENCE:T},illegal:/#(?![$_A-z])/,contains:[n.SHEBANG({label:"shebang",binary:"node",relevance:5}),Z,n.APOS_STRING_MODE,n.QUOTE_STRING_MODE,u,c,g,d,E,{match:/\$\d+/},N,T,{scope:"attr",match:s+r.lookahead(":"),relevance:0},W,{begin:"("+n.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[E,n.REGEXP_MODE,{className:"function",begin:D,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:n.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:v,contains:R}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:l.begin,end:l.end},{match:p},{begin:b.begin,"on:begin":b.isTrulyOpeningTag,end:b.end}],subLanguage:"xml",contains:[{begin:b.begin,end:b.end,skip:!0,contains:["self"]}]}]},B,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+n.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[I,n.inherit(n.TITLE_MODE,{begin:s,className:"title.function"})]},{match:/\.\.\./,relevance:0},x,{match:"\\$"+s,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[I]},U,Y,Q,G,{match:/\$[(.]/}]}}function an(n){const r=n.regex,a=nn(n),s=lt,l=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],p={begin:[/namespace/,/\s+/,n.IDENT_RE],beginScope:{1:"keyword",3:"title.class"}},b={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{keyword:"interface extends",built_in:l},contains:[a.exports.CLASS_REFERENCE]},v={className:"meta",relevance:10,begin:/^\s*['"]use strict['"]/},_=["type","interface","public","private","protected","implements","declare","abstract","readonly","enum","override","satisfies"],k={$pattern:lt,keyword:It.concat(_),literal:jt,built_in:Bt.concat(l),"variable.language":Dt},i={className:"meta",begin:"@"+s},N=(g,d,S)=>{const E=g.contains.findIndex(C=>C.label===d);if(E===-1)throw new Error("can not find mode to replace");g.contains.splice(E,1,S)};Object.assign(a.keywords,k),a.exports.PARAMS_CONTAINS.push(i);const o=a.contains.find(g=>g.scope==="attr"),u=Object.assign({},o,{match:r.concat(s,r.lookahead(/\s*\?:/))});a.exports.PARAMS_CONTAINS.push([a.exports.CLASS_REFERENCE,o,u]),a.contains=a.contains.concat([i,p,b,u]),N(a,"shebang",n.SHEBANG()),N(a,"use_strict",v);const c=a.contains.find(g=>g.label==="func.def");return c.relevance=0,Object.assign(a,{name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),a}const wt="[A-Za-z$_][0-9A-Za-z$_]*",rn=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],sn=["true","false","null","undefined","NaN","Infinity"],Pt=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],Ft=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],Ut=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],on=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],ln=[].concat(Ut,Pt,Ft);function cn(n){const r=n.regex,a=(j,{after:V})=>{const $="</"+j[0].slice(1);return j.input.indexOf($,V)!==-1},s=wt,l={begin:"<>",end:"</>"},p=/<[A-Za-z0-9\\._:-]+\s*\/>/,b={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(j,V)=>{const $=j[0].length+j.index,F=j.input[$];if(F==="<"||F===","){V.ignoreMatch();return}F===">"&&(a(j,{after:$})||V.ignoreMatch());let L;const q=j.input.substring($);if(L=q.match(/^\s*=/)){V.ignoreMatch();return}if((L=q.match(/^\s+extends\s+/))&&L.index===0){V.ignoreMatch();return}}},v={$pattern:wt,keyword:rn,literal:sn,built_in:ln,"variable.language":on},_="[0-9](_?[0-9])*",k=`\\.(${_})`,i="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",N={className:"number",variants:[{begin:`(\\b(${i})((${k})|\\.)?|(${k}))[eE][+-]?(${_})\\b`},{begin:`\\b(${i})\\b((${k})\\b|\\.)?|(${k})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:v,contains:[]},u={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[n.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},c={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[n.BACKSLASH_ESCAPE,o],subLanguage:"css"}},g={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[n.BACKSLASH_ESCAPE,o],subLanguage:"graphql"}},d={className:"string",begin:"`",end:"`",contains:[n.BACKSLASH_ESCAPE,o]},E={className:"comment",variants:[n.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:s+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),n.C_BLOCK_COMMENT_MODE,n.C_LINE_COMMENT_MODE]},C=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE,u,c,g,d,{match:/\$\d+/},N];o.contains=C.concat({begin:/\{/,end:/\}/,keywords:v,contains:["self"].concat(C)});const w=[].concat(E,o.contains),R=w.concat([{begin:/(\s*)\(/,end:/\)/,keywords:v,contains:["self"].concat(w)}]),I={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:v,contains:R},Q={variants:[{match:[/class/,/\s+/,s,/\s+/,/extends/,/\s+/,r.concat(s,"(",r.concat(/\./,s),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,s],scope:{1:"keyword",3:"title.class"}}]},T={relevance:0,match:r.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...Pt,...Ft]}},Z={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},B={variants:[{match:[/function/,/\s+/,s,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[I],illegal:/%/},Y={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function A(j){return r.concat("(?!",j.join("|"),")")}const U={match:r.concat(/\b/,A([...Ut,"super","import"].map(j=>`${j}\\s*\\(`)),s,r.lookahead(/\s*\(/)),className:"title.function",relevance:0},x={begin:r.concat(/\./,r.lookahead(r.concat(s,/(?![0-9A-Za-z$_(])/))),end:s,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},G={match:[/get|set/,/\s+/,s,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},I]},D="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+n.UNDERSCORE_IDENT_RE+")\\s*=>",W={match:[/const|var|let/,/\s+/,s,/\s*/,/=\s*/,/(async\s*)?/,r.lookahead(D)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[I]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:v,exports:{PARAMS_CONTAINS:R,CLASS_REFERENCE:T},illegal:/#(?![$_A-z])/,contains:[n.SHEBANG({label:"shebang",binary:"node",relevance:5}),Z,n.APOS_STRING_MODE,n.QUOTE_STRING_MODE,u,c,g,d,E,{match:/\$\d+/},N,T,{scope:"attr",match:s+r.lookahead(":"),relevance:0},W,{begin:"("+n.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[E,n.REGEXP_MODE,{className:"function",begin:D,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:n.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:v,contains:R}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:l.begin,end:l.end},{match:p},{begin:b.begin,"on:begin":b.isTrulyOpeningTag,end:b.end}],subLanguage:"xml",contains:[{begin:b.begin,end:b.end,skip:!0,contains:["self"]}]}]},B,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+n.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[I,n.inherit(n.TITLE_MODE,{begin:s,className:"title.function"})]},{match:/\.\.\./,relevance:0},x,{match:"\\$"+s,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[I]},U,Y,Q,G,{match:/\$[(.]/}]}}function dn(n){const r={className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},a={match:/[{}[\],:]/,className:"punctuation",relevance:0},s=["true","false","null"],l={scope:"literal",beginKeywords:s.join(" ")};return{name:"JSON",aliases:["jsonc"],keywords:{literal:s},contains:[r,a,n.QUOTE_STRING_MODE,l,n.C_NUMBER_MODE,n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}function un(n){const r=n.regex,a={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},s={begin:"^[-\\*]{3,}",end:"$"},l={className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},p={className:"bullet",begin:"^[ ]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},b={begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},v=/[A-Za-z][A-Za-z0-9+.-]*/,_={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:r.concat(/\[.+?\]\(/,v,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},k={className:"strong",contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},i={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},N=n.inherit(k,{contains:[]}),o=n.inherit(i,{contains:[]});k.contains.push(o),i.contains.push(N);let u=[a,_];return[k,i,N,o].forEach(S=>{S.contains=S.contains.concat(u)}),u=u.concat(k,i),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:u},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:u}]}]},a,p,k,i,{className:"quote",begin:"^>\\s+",contains:u,end:"$"},l,s,_,b,{scope:"literal",match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}const mn=n=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:n.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:n.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),gn=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],hn=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],pn=[...gn,...hn],fn=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),bn=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),xn=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),yn=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse();function vn(n){const r=n.regex,a=mn(n),s={begin:/-(webkit|moz|ms|o)-(?=[a-z])/},l="and or not only",p=/@-?\w[\w]*(-\w+)*/,b="[a-zA-Z-][a-zA-Z0-9_-]*",v=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE];return{name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"},contains:[a.BLOCK_COMMENT,s,a.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:"selector-class",begin:"\\."+b,relevance:0},a.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{begin:":("+bn.join("|")+")"},{begin:":(:)?("+xn.join("|")+")"}]},a.CSS_VARIABLE,{className:"attribute",begin:"\\b("+yn.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,contains:[a.BLOCK_COMMENT,a.HEXCOLOR,a.IMPORTANT,a.CSS_NUMBER_MODE,...v,{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"},contains:[...v,{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}]},a.FUNCTION_DISPATCH]},{begin:r.lookahead(/@/),end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword",begin:p},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:l,attribute:fn.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute"},...v,a.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"\\b("+pn.join("|")+")\\b"}]}}function kn(n){const r=n.regex,a=r.concat(/[\p{L}_]/u,r.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),s=/[\p{L}0-9._:-]+/u,l={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},p={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},b=n.inherit(p,{begin:/\(/,end:/\)/}),v=n.inherit(n.APOS_STRING_MODE,{className:"string"}),_=n.inherit(n.QUOTE_STRING_MODE,{className:"string"}),k={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:s,relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[l]},{begin:/'/,end:/'/,contains:[l]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin:/<![a-z]/,end:/>/,relevance:10,contains:[p,_,v,b,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin:/<![a-z]/,end:/>/,contains:[p,b,_,v]}]}]},n.COMMENT(/<!--/,/-->/,{relevance:10}),{begin:/<!\[CDATA\[/,end:/\]\]>/,relevance:10},l,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[_]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/<style(?=\s|>)/,end:/>/,keywords:{name:"style"},contains:[k],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/<script(?=\s|>)/,end:/>/,keywords:{name:"script"},contains:[k],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:r.concat(/</,r.lookahead(r.concat(a,r.either(/\/>/,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:a,relevance:0,starts:k}]},{className:"tag",begin:r.concat(/<\//,r.lookahead(r.concat(a,/>/))),contains:[{className:"name",begin:a,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}function wn(n){const r=n.regex,a={},s={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[a]}]};Object.assign(a,{className:"variable",variants:[{begin:r.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},s]});const l={className:"subst",begin:/\$\(/,end:/\)/,contains:[n.BACKSLASH_ESCAPE]},p=n.inherit(n.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),b={begin:/<<-?\s*(?=\w+)/,starts:{contains:[n.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},v={className:"string",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE,a,l]};l.contains.push(v);const _={match:/\\"/},k={className:"string",begin:/'/,end:/'/},i={match:/\\'/},N={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},n.NUMBER_MODE,a]},o=["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"],u=n.SHEBANG({binary:`(${o.join("|")})`,relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[n.inherit(n.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},g=["if","then","else","elif","fi","time","for","while","until","in","do","done","case","esac","coproc","function","select"],d=["true","false"],S={match:/(\/[a-z._-]+)+/},E=["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset"],C=["alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias"],w=["autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp"],R=["chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"];return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:g,literal:d,built_in:[...E,...C,"set","shopt",...w,...R]},contains:[u,n.SHEBANG(),c,N,p,b,S,v,_,k,i,a]}}function _n(n){const r=n.regex,a=new RegExp("[\\p{XID_Start}_]\\p{XID_Continue}*","u"),s=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],v={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:s,built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]},_={className:"meta",begin:/^(>>>|\.\.\.) /},k={className:"subst",begin:/\{/,end:/\}/,keywords:v,illegal:/#/},i={begin:/\{\{/,relevance:0},N={className:"string",contains:[n.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[n.BACKSLASH_ESCAPE,_],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[n.BACKSLASH_ESCAPE,_],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[n.BACKSLASH_ESCAPE,_,i,k]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[n.BACKSLASH_ESCAPE,_,i,k]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[n.BACKSLASH_ESCAPE,i,k]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[n.BACKSLASH_ESCAPE,i,k]},n.APOS_STRING_MODE,n.QUOTE_STRING_MODE]},o="[0-9](_?[0-9])*",u=`(\\b(${o}))?\\.(${o})|\\b(${o})\\.`,c=`\\b|${s.join("|")}`,g={className:"number",relevance:0,variants:[{begin:`(\\b(${o})|(${u}))[eE][+-]?(${o})[jJ]?(?=${c})`},{begin:`(${u})[jJ]?`},{begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${c})`},{begin:`\\b0[bB](_?[01])+[lL]?(?=${c})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${c})`},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${c})`},{begin:`\\b(${o})[jJ](?=${c})`}]},d={className:"comment",begin:r.lookahead(/# type:/),end:/$/,keywords:v,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},S={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:v,contains:["self",_,g,N,n.HASH_COMMENT_MODE]}]};return k.contains=[N,g,_],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:v,illegal:/(<\/|\?)|=>/,contains:[_,g,{scope:"variable.language",match:/\bself\b/},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword"},N,d,n.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,a],scope:{1:"keyword",3:"title.function"},contains:[S]},{variants:[{match:[/\bclass/,/\s+/,a,/\s*/,/\(\s*/,a,/\s*\)/]},{match:[/\bclass/,/\s+/,a]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[g,S,N]}]}}function En(n){const r="true false yes no null",a="[\\w#;/?:@&=+$,.~*'()[\\]]+",s={className:"attr",variants:[{begin:/[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/},{begin:/"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/},{begin:/'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/}]},l={className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]},p={className:"string",relevance:0,begin:/'/,end:/'/,contains:[{match:/''/,scope:"char.escape",relevance:0}]},b={className:"string",relevance:0,variants:[{begin:/"/,end:/"/},{begin:/\S+/}],contains:[n.BACKSLASH_ESCAPE,l]},v=n.inherit(b,{variants:[{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),o={className:"number",begin:"\\b"+"[0-9]{4}(-[0-9][0-9]){0,2}"+"([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?"+"(\\.[0-9]*)?"+"([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?"+"\\b"},u={end:",",endsWithParent:!0,excludeEnd:!0,keywords:r,relevance:0},c={begin:/\{/,end:/\}/,contains:[u],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[u],illegal:"\\n",relevance:0},d=[s,{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+n.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+n.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},n.HASH_COMMENT_MODE,{beginKeywords:r,keywords:{literal:r}},o,{className:"number",begin:n.C_NUMBER_RE+"\\b",relevance:0},c,g,p,b],S=[...d];return S.pop(),S.push(v),u.contains=S,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:d}}function Sn(n){const r=n.regex,a=n.COMMENT("--","$"),s={scope:"string",variants:[{begin:/'/,end:/'/,contains:[{match:/''/}]}]},l={begin:/"/,end:/"/,contains:[{match:/""/}]},p=["true","false","unknown"],b=["double precision","large object","with timezone","without timezone"],v=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],_=["add","asc","collation","desc","final","first","last","view"],k=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year"],i=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],N=["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"],o=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],u=i,c=[...k,..._].filter(R=>!i.includes(R)),g={scope:"variable",match:/@[a-z0-9][a-z0-9_]*/},d={scope:"operator",match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0},S={match:r.concat(/\b/,r.either(...u),/\s*\(/),relevance:0,keywords:{built_in:u}};function E(R){return r.concat(/\b/,r.either(...R.map(I=>I.replace(/\s+/,"\\s+"))),/\b/)}const C={scope:"keyword",match:E(o),relevance:0};function w(R,{exceptions:I,when:Q}={}){const T=Q;return I=I||[],R.map(Z=>Z.match(/\|\d+$/)||I.includes(Z)?Z:T(Z)?`${Z}|0`:Z)}return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:w(c,{when:R=>R.length<3}),literal:p,type:v,built_in:N},contains:[{scope:"type",match:E(b)},C,S,g,s,l,n.C_NUMBER_MODE,n.C_BLOCK_COMMENT_MODE,a,d]}}function Cn(n){const r=n.regex;return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,match:r.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/)},{className:"comment",variants:[{begin:r.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/),end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/,end:/$/}]}}function _t(n){const r=[],a=[];for(const s of n){let l=a.indexOf(s.sha);for(l===-1&&(l=a.indexOf(null),l===-1&&(l=a.length,a.push(null))),a[l]=null,s.parents.forEach((p,b)=>{if(a.indexOf(p)!==-1)return;if(b===0){a[l]=p;return}let v=a.indexOf(null);v===-1&&(v=a.length,a.push(null)),a[v]=p});a.length&&a[a.length-1]===null;)a.pop();r.push({commit:s,lane:l,lanes:[...a],width:Math.max(a.length,l+1)})}return r}function Nn(n){return n.map((r,a)=>{const s=a>0?n[a-1].lanes:[],l=r.lanes,p=r.commit.sha,b=[],v=s.indexOf(p);v!==-1&&b.push({fromLane:v,toLane:r.lane,half:"top",colorLane:r.lane});for(const _ of r.commit.parents){const k=l.indexOf(_);k!==-1&&b.push({fromLane:r.lane,toLane:k,half:"bottom",colorLane:k})}return s.forEach((_,k)=>{if(!_||_===p)return;const i=l.indexOf(_);i!==-1&&b.push({fromLane:k,toLane:i,half:"full",colorLane:i})}),b})}const An={rocket:"🚀",sparkles:"✨",bug:"🐛",fire:"🔥",tada:"🎉",boom:"💥",wrench:"🔧",memo:"📝",art:"🎨",zap:"⚡",lock:"🔒",recycle:"♻️",construction:"🚧",white_check_mark:"✅",ambulance:"🚑",bookmark:"🔖",green_heart:"💚",arrow_up:"⬆️",arrow_down:"⬇️",pushpin:"📌",wastebasket:"🗑️",heavy_plus_sign:"➕",heavy_minus_sign:"➖",pencil2:"✏️",rewind:"⏪",twisted_rightwards_arrows:"🔀",package:"📦",alien:"👽",truck:"🚚",page_facing_up:"📄",bulb:"💡",beers:"🍻",speech_balloon:"💬",card_file_box:"🗃️",loud_sound:"🔊",mute:"🔇",see_no_evil:"🙈",camera_flash:"📸",label:"🏷️",seedling:"🌱",dizzy:"💫",adhesive_bandage:"🩹"};function xt(n){return n.replace(/:([a-z0-9_+-]+):/g,(r,a)=>An[a]??r)}function Rn(n,r=24){return`https://www.gravatar.com/avatar/${In((n||"").trim().toLowerCase())}?s=${r}&d=identicon`}function Tn(n,r){const a=[],s=/(https?:\/\/[^\s]+)|(#\d+)|(\b[0-9a-f]{7,40}\b)/g;let l=0,p,b=0;for(;p=s.exec(n);){p.index>l&&a.push(n.slice(l,p.index));const v=(_,k)=>h.createElement("a",{key:b++,href:_,target:"_blank",rel:"noreferrer",style:{color:"var(--brass-700)"}},k);p[1]?a.push(v(p[1],p[1])):p[2]&&r?a.push(v(r.replace("$1",p[2].slice(1)),p[2])):p[2]?a.push(p[2]):p[3]&&a.push(h.createElement("span",{key:b++,style:{fontFamily:"var(--font-mono)",color:"var(--text-muted)"}},p[3])),l=s.lastIndex}return l<n.length&&a.push(n.slice(l)),a}function Mn(n,r={}){const a=r.emoji===!1?n:xt(n),s=Tn(a,r.issuePattern);return r.markdown===!1?s:s.flatMap(l=>typeof l=="string"?On(l):[l])}function On(n){const r=[],a=/\*\*([^*]+)\*\*|\*([^*]+)\*|`([^`]+)`/g;let s=0,l,p=0;for(;l=a.exec(n);)l.index>s&&r.push(n.slice(s,l.index)),l[1]?r.push(h.createElement("strong",{key:p++},l[1])):l[2]?r.push(h.createElement("em",{key:p++},l[2])):l[3]&&r.push(h.createElement("code",{key:p++,style:{fontFamily:"var(--font-mono)",background:"var(--bone-100)",padding:"0 3px",borderRadius:3}},l[3])),s=a.lastIndex;return s<n.length&&r.push(n.slice(s)),r}function In(n){function r(d,S){return d<<S|d>>>32-S}function a(d,S){const E=(d&65535)+(S&65535);return(d>>16)+(S>>16)+(E>>16)<<16|E&65535}function s(d,S,E,C,w,R){return a(r(a(a(S,d),a(C,R)),w),E)}function l(d,S,E,C,w,R,I){return s(S&E|~S&C,d,S,w,R,I)}function p(d,S,E,C,w,R,I){return s(S&C|E&~C,d,S,w,R,I)}function b(d,S,E,C,w,R,I){return s(S^E^C,d,S,w,R,I)}function v(d,S,E,C,w,R,I){return s(E^(S|~C),d,S,w,R,I)}function _(d){const S=d.length,E=[];for(let C=0;C<S*8;C+=8)E[C>>5]=(E[C>>5]??0)|(d.charCodeAt(C/8)&255)<<C%32;return E}function k(d){let S="";for(let E=0;E<d.length*4;E++)S+=((d[E>>2]??0)>>E%4*8+4&15).toString(16)+((d[E>>2]??0)>>E%4*8&15).toString(16);return S}const i=_(n),N=n.length*8;i[N>>5]=(i[N>>5]??0)|128<<N%32,i[(N+64>>>9<<4)+14]=N;let o=1732584193,u=-271733879,c=-1732584194,g=271733878;for(let d=0;d<i.length;d+=16){const S=o,E=u,C=c,w=g;o=l(o,u,c,g,i[d]||0,7,-680876936),g=l(g,o,u,c,i[d+1]||0,12,-389564586),c=l(c,g,o,u,i[d+2]||0,17,606105819),u=l(u,c,g,o,i[d+3]||0,22,-1044525330),o=l(o,u,c,g,i[d+4]||0,7,-176418897),g=l(g,o,u,c,i[d+5]||0,12,1200080426),c=l(c,g,o,u,i[d+6]||0,17,-1473231341),u=l(u,c,g,o,i[d+7]||0,22,-45705983),o=l(o,u,c,g,i[d+8]||0,7,1770035416),g=l(g,o,u,c,i[d+9]||0,12,-1958414417),c=l(c,g,o,u,i[d+10]||0,17,-42063),u=l(u,c,g,o,i[d+11]||0,22,-1990404162),o=l(o,u,c,g,i[d+12]||0,7,1804603682),g=l(g,o,u,c,i[d+13]||0,12,-40341101),c=l(c,g,o,u,i[d+14]||0,17,-1502002290),u=l(u,c,g,o,i[d+15]||0,22,1236535329),o=p(o,u,c,g,i[d+1]||0,5,-165796510),g=p(g,o,u,c,i[d+6]||0,9,-1069501632),c=p(c,g,o,u,i[d+11]||0,14,643717713),u=p(u,c,g,o,i[d]||0,20,-373897302),o=p(o,u,c,g,i[d+5]||0,5,-701558691),g=p(g,o,u,c,i[d+10]||0,9,38016083),c=p(c,g,o,u,i[d+15]||0,14,-660478335),u=p(u,c,g,o,i[d+4]||0,20,-405537848),o=p(o,u,c,g,i[d+9]||0,5,568446438),g=p(g,o,u,c,i[d+14]||0,9,-1019803690),c=p(c,g,o,u,i[d+3]||0,14,-187363961),u=p(u,c,g,o,i[d+8]||0,20,1163531501),o=p(o,u,c,g,i[d+13]||0,5,-1444681467),g=p(g,o,u,c,i[d+2]||0,9,-51403784),c=p(c,g,o,u,i[d+7]||0,14,1735328473),u=p(u,c,g,o,i[d+12]||0,20,-1926607734),o=b(o,u,c,g,i[d+5]||0,4,-378558),g=b(g,o,u,c,i[d+8]||0,11,-2022574463),c=b(c,g,o,u,i[d+11]||0,16,1839030562),u=b(u,c,g,o,i[d+14]||0,23,-35309556),o=b(o,u,c,g,i[d+1]||0,4,-1530992060),g=b(g,o,u,c,i[d+4]||0,11,1272893353),c=b(c,g,o,u,i[d+7]||0,16,-155497632),u=b(u,c,g,o,i[d+10]||0,23,-1094730640),o=b(o,u,c,g,i[d+13]||0,4,681279174),g=b(g,o,u,c,i[d]||0,11,-358537222),c=b(c,g,o,u,i[d+3]||0,16,-722521979),u=b(u,c,g,o,i[d+6]||0,23,76029189),o=b(o,u,c,g,i[d+9]||0,4,-640364487),g=b(g,o,u,c,i[d+12]||0,11,-421815835),c=b(c,g,o,u,i[d+15]||0,16,530742520),u=b(u,c,g,o,i[d+2]||0,23,-995338651),o=v(o,u,c,g,i[d]||0,6,-198630844),g=v(g,o,u,c,i[d+7]||0,10,1126891415),c=v(c,g,o,u,i[d+14]||0,15,-1416354905),u=v(u,c,g,o,i[d+5]||0,21,-57434055),o=v(o,u,c,g,i[d+12]||0,6,1700485571),g=v(g,o,u,c,i[d+3]||0,10,-1894986606),c=v(c,g,o,u,i[d+10]||0,15,-1051523),u=v(u,c,g,o,i[d+1]||0,21,-2054922799),o=v(o,u,c,g,i[d+8]||0,6,1873313359),g=v(g,o,u,c,i[d+15]||0,10,-30611744),c=v(c,g,o,u,i[d+6]||0,15,-1560198380),u=v(u,c,g,o,i[d+13]||0,21,1309151649),o=v(o,u,c,g,i[d+4]||0,6,-145523070),g=v(g,o,u,c,i[d+11]||0,10,-1120210379),c=v(c,g,o,u,i[d+2]||0,15,718787259),u=v(u,c,g,o,i[d+9]||0,21,-343485551),o=a(o,S),u=a(u,E),c=a(c,C),g=a(g,w)}return k([o,u,c,g])}const Ce=14,jn=30,Ht=4,Ln=460,zn=160,$n=4e3,st=200,Gt=["#a9791c","#3b7a57","#8a5a44","#4a6fa5","#7d5ba6","#b0503a"],yt=(n,r=Gt)=>r[n%r.length],Dn=n=>{const r=new Date(n).getTime();if(!r)return"";const a=Math.max(0,(Date.now()-r)/1e3);return a<3600?`${Math.floor(a/60)}m`:a<86400?`${Math.floor(a/3600)}h`:a<2592e3?`${Math.floor(a/86400)}d`:new Date(n).toLocaleDateString()};function Bn(n,r,a){const s=k=>Ce/2+k*Ce,l=n.half==="bottom"?a/2:0,p=n.half==="top"?a/2:a,b=s(n.fromLane),v=s(n.toLane),_=(l+p)/2;return b===v?`M${b} ${l}V${p}`:r==="angular"?`M${b} ${l}V${_}H${v}V${p}`:`M${b} ${l}C${b} ${_},${v} ${_},${v} ${p}`}function Pn({row:n,edges:r,maxLanes:a,style:s,palette:l,height:p}){const b=Ce/2+n.lane*Ce;return t.jsxs("svg",{width:a*Ce,height:p,style:{flex:"0 0 auto"},children:[r.map((v,_)=>t.jsx("path",{d:Bn(v,s,p),fill:"none",stroke:yt(v.colorLane,l),strokeWidth:1.5},_)),t.jsx("circle",{cx:b,cy:p/2,r:Ht,fill:yt(n.lane,l),stroke:"var(--surface-card)",strokeWidth:1.5})]})}function Ve({x:n,y:r,items:a,onClose:s,returnFocus:l}){const p=h.useRef(null),b=h.useRef(s);b.current=s,h.useLayoutEffect(()=>{var E,C;const d=document.activeElement instanceof HTMLElement?document.activeElement:null,S=d&&d!==document.body?d:l;return(C=(E=p.current)==null?void 0:E.querySelector('[role="menuitem"]'))==null||C.focus(),()=>S==null?void 0:S.focus()},[]),h.useEffect(()=>{const d=S=>{var E;(E=p.current)!=null&&E.contains(S.target)||b.current()};return window.addEventListener("pointerdown",d),()=>window.removeEventListener("pointerdown",d)},[]);const v=d=>{var w,R;const S=Array.from(((w=p.current)==null?void 0:w.querySelectorAll('[role="menuitem"]'))??[]),E=Math.max(0,S.indexOf(document.activeElement));let C=null;if(d.key==="Escape")b.current();else if(d.key==="ArrowDown")C=(E+1)%S.length;else if(d.key==="ArrowUp")C=(E-1+S.length)%S.length;else if(d.key==="Home")C=0;else if(d.key==="End")C=S.length-1;else return;d.preventDefault(),C!==null&&((R=S[C])==null||R.focus())},_=d=>Number.parseFloat(getComputedStyle(document.documentElement).getPropertyValue(d))||0,k=_("--safe-left"),i=_("--safe-right"),N=_("--safe-top"),o=_("--safe-bottom"),u=Math.min(360,a.length*44+8,window.innerHeight-N-o-16),c=Math.max(8+k,Math.min(n,window.innerWidth-i-228)),g=Math.max(8+N,Math.min(r,window.innerHeight-o-u-8));return t.jsx("div",{ref:p,role:"menu",onKeyDown:v,style:{position:"fixed",left:c,top:g,zIndex:150,background:"var(--surface-card)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",boxShadow:"var(--shadow-pop, 0 6px 24px rgba(0,0,0,.15))",padding:4,minWidth:180,maxWidth:"calc(100vw - var(--safe-left) - var(--safe-right) - 16px)",maxHeight:"calc(100dvh - var(--safe-top) - var(--safe-bottom) - 16px)",overflowY:"auto"},children:a.map(d=>t.jsx("button",{role:"menuitem",onClick:()=>{d.run(),b.current()},style:{display:"block",width:"100%",textAlign:"left",padding:"7px 10px",border:"none",background:"transparent",cursor:"pointer",fontFamily:"var(--font-ui)",fontSize:12.5,color:"var(--text-body)",borderRadius:4},children:d.label},d.label))})}function Fn(n,r,a,s,l,p){const b=n.refs.filter(i=>!i.startsWith("origin/")),v=n.refs.filter(i=>i.startsWith("origin/")&&i!=="origin/HEAD").map(i=>i.slice(7)),_=[...new Set([...b,...v])],k=i=>{var N;(N=navigator.clipboard)==null||N.writeText(i)};return[{label:`Checkout ${n.sha.slice(0,7)}`,run:()=>a({op:"checkout",ref:n.sha})},{label:"Merge (fast-forward bila bisa)",run:()=>s(n.sha)},{label:"Merge tanpa fast-forward",run:()=>s(n.sha,{ff:"no-ff"})},{label:"Merge fast-forward saja",run:()=>s(n.sha,{ff:"ff-only"})},{label:"Cherry-pick",run:()=>a({op:"cherry-pick",sha:n.sha})},{label:"Revert",run:()=>a({op:"revert",sha:n.sha})},{label:"Rebase current → sini",run:()=>l(n.sha)},{label:"Drop commit",run:()=>p(n.sha)},{label:"Reset current → sini (soft)",run:()=>a({op:"reset",sha:n.sha,mode:"soft"})},{label:"Reset current → sini (mixed)",run:()=>a({op:"reset",sha:n.sha,mode:"mixed"})},{label:"Reset current → sini (hard)",run:()=>a({op:"reset",sha:n.sha,mode:"hard"})},{label:"Copy hash",run:()=>k(n.sha)},{label:"Copy subject",run:()=>k(n.subject)},{label:"Buat branch di sini…",run:()=>{const i=window.prompt("Nama branch baru:");i&&a({op:"branch",name:i,at:n.sha,checkout:!0})}},{label:"Add tag…",run:()=>{const i=window.prompt("Nama tag:");if(!i)return;const N=window.prompt("Pesan (kosong = lightweight):")||void 0,o=window.confirm("Dorong tag ke origin?");a({op:"tag",name:i,message:N,at:n.sha,push:o})}},...b.filter(i=>i!==r).map(i=>({label:`Merge ${i} lalu hapus (local${v.includes(i)?" + origin":""})`,run:()=>s(i,{deleteBranch:i})})),..._.flatMap(i=>{const N=b.includes(i)&&i!==r,o=v.includes(i),u=[];return N&&o&&u.push({label:`Hapus ${i} (local + origin)`,run:()=>a({op:"delete-branch",name:i,remote:!0})}),N&&u.push({label:`Hapus ${i} (local)`,run:()=>a({op:"delete-branch",name:i})}),o&&u.push({label:`Hapus origin/${i}`,run:()=>a({op:"delete-branch",name:i,local:!1,remote:!0})}),u})]}function Un(n,r,a,s,l,p,b,v,_){const k=n.startsWith("origin/"),i=k?n.slice(7):n,N=()=>{var g;(g=navigator.clipboard)==null||g.writeText(n)};if(k)return[{label:`Checkout ${n}`,run:()=>s({op:"checkout",ref:n})},{label:`Merge ${n} → current`,run:()=>l(n)},{label:`Pull ${i} → current`,run:()=>b(i)},{label:"Create Pull Request",run:()=>v(i)},{label:"Create archive",run:()=>_(n)},{label:`Hapus origin/${i}`,run:()=>s({op:"delete-branch",name:i,local:!1,remote:!0})},{label:"Copy nama branch",run:N}];const o=n===r,u=a.includes(`origin/${i}`),c=[];return o||c.push({label:`Checkout ${n}`,run:()=>s({op:"checkout",ref:n})}),c.push({label:"Rename…",run:()=>{const g=window.prompt(`Nama baru untuk ${n}:`,n);g&&g!==n&&s({op:"rename-branch",from:n,to:g})}}),c.push({label:"Push ke origin",run:()=>s({op:"push-branch",name:n,setUpstream:!0})}),o||c.push({label:`Merge ${n} → current`,run:()=>l(n)}),o||c.push({label:`Rebase current → ${n}`,run:()=>p(n)}),c.push({label:"Create Pull Request",run:()=>v(n)}),c.push({label:"Create archive",run:()=>_(n)}),o||(c.push({label:u?`Hapus ${n} (local + origin)`:`Hapus ${n} (local)`,run:()=>s({op:"delete-branch",name:n,remote:u})}),u&&c.push({label:`Hapus ${n} (local saja)`,run:()=>s({op:"delete-branch",name:n})})),c.push({label:"Copy nama branch",run:N}),c}function Hn({projectId:n,onRunGit:r,onMerge:a,onRebase:s,onPull:l,onDrop:p,onOpenFile:b}){var rt,Ie;const[v,_]=h.useState("loading"),[k,i]=h.useState([]),[N,o]=h.useState(!1),[u,c]=h.useState(0),[g,d]=h.useState(!1),S=h.useRef(null),[E,C]=h.useState(""),[w,R]=h.useState(null),[I,Q]=h.useState("graph"),T=Zt(),Z=Yt(),[B,Y]=h.useState(null),[A,U]=h.useState(null),[x,G]=h.useState(null),[D,W]=h.useState(null),[j,V]=h.useState([]),[$,F]=h.useState(null),[L,q]=h.useState(null),H=h.useMemo(()=>k.flatMap(e=>e.commit.refs),[k]),[ee,ce]=h.useState("list"),[f,z]=h.useState(null),ie=h.useCallback((e,m,y)=>{z({path:e,sha:m,from:y,data:null,tab:"diff"}),(y?M.ideCompareFile(n,y,m,e):M.ideCommitFile(n,m,e)).then(ye=>z(le=>le&&le.path===e?{...le,data:ye}:le)).catch(()=>{})},[n]),[me,Ne]=h.useState(null),[he,Le]=h.useState(null),Je=h.useRef(new Map),[ze,Ae]=h.useState(!1),[we,pe]=h.useState(""),[_e,de]=h.useState(0),ge=h.useCallback(e=>{var m;(m=Je.current.get(e))==null||m.scrollIntoView({block:"center",behavior:"smooth"})},[]),ae=h.useMemo(()=>{const e=we.trim().toLowerCase();return e?k.filter(m=>{const y=m.commit;return y.subject.toLowerCase().includes(e)||y.author.toLowerCase().includes(e)||y.sha.toLowerCase().startsWith(e)||y.refs.some(K=>K.toLowerCase().includes(e))||y.tags.some(K=>K.toLowerCase().includes(e))}).map(m=>m.commit.sha):[]},[we,k]),Ee=h.useCallback(e=>{if(!ae.length)return;const m=(e%ae.length+ae.length)%ae.length;de(m),ge(ae[m])},[ae,ge]),ne=h.useCallback(()=>{const e=k.find(m=>m.commit.refs.includes(E));e&&ge(e.commit.sha)},[k,E,ge]),[te,Ge]=h.useState({branch:"",showRemote:!0,showTags:!0,limit:st}),Re=h.useCallback(e=>Ge(m=>({...m,...e,limit:st})),[]),[$e,De]=h.useState(!0),[et,fe]=h.useState("rounded"),ct=h.useMemo(()=>[...new Set(k.flatMap(e=>e.commit.refs).filter(e=>!e.startsWith("origin/")))].sort(),[k]),[ue,tt]=h.useState({});h.useEffect(()=>{M.getConfig().then(e=>{const m={};for(const y of e.entries){const K=y.value;y.key.startsWith("gitGraph.")&&K!=null&&(m[y.key]=K)}tt(m),m["gitGraph.style"]&&fe(m["gitGraph.style"]==="angular"?"angular":"rounded"),m["gitGraph.muteMergeCommits"]&&De(m["gitGraph.muteMergeCommits"]!=="0"),Ge(y=>({...y,showRemote:m["gitGraph.showRemoteBranches"]!=="0",showTags:m["gitGraph.showTags"]!=="0"}))}).catch(()=>{})},[]);const dt=h.useMemo(()=>{var m;const e=(m=ue["gitGraph.colours"])==null?void 0:m.split(",").map(y=>y.trim()).filter(Boolean);return e&&e.length?e:Gt},[ue]),We={emoji:ue["gitGraph.emoji"]!=="0",markdown:ue["gitGraph.markdown"]!=="0",issuePattern:ue["gitGraph.issueLinkPattern"]||void 0},ut=ue["gitGraph.fetchAvatars"]==="1",Be=h.useCallback((e,m)=>{if(e.metaKey||e.ctrlKey){if(!me){Ne(m);return}me!==m&&M.ideCompare(n,me,m).then(y=>{Le(y),R(null),Q("detail")}).catch(()=>{}),Ne(null);return}M.ideCommit(n,m).then(y=>{R(y),Q("detail")}).catch(()=>{})},[n,me]),be=h.useCallback((e=!1)=>{e||_("loading"),M.ideGraph(n,te.limit,{branches:te.branch?[te.branch]:void 0,showRemote:te.showRemote?void 0:!1,showTags:te.showTags?void 0:!1}).then(m=>{i(_t(m.commits)),C(m.current),c(m.total??0),o(m.commits.length>=te.limit),_("ready")}).catch(()=>{e||_("error")}).finally(()=>d(!1)),M.ideStatus(n).then(G).catch(()=>{e||G(null)}),M.ideStashes(n).then(V).catch(()=>{e||V([])})},[n,te]),Pe=h.useRef(!1);h.useEffect(()=>{be(Pe.current),Pe.current=!1},[be]);const Te=h.useCallback(()=>{Pe.current||(Pe.current=!0,d(!0),Ge(e=>({...e,limit:e.limit+st})))},[]);h.useEffect(()=>{const e=S.current;if(!e||!N||g||typeof IntersectionObserver>"u")return;const m=new IntersectionObserver(y=>{y.some(K=>K.isIntersecting)&&Te()});return m.observe(e),()=>m.disconnect()},[N,g,Te]),Vt({topic:"git",params:{projectId:n,limit:te.limit,branch:te.branch,showRemote:te.showRemote,showTags:te.showTags},apply:e=>{i(_t(e.graph.commits)),C(e.graph.current),c(e.graph.total??0),o(e.graph.commits.length>=te.limit),_("ready"),G(e.status),V(e.stashes)},refetch:()=>be(!0),pollMs:$n}),h.useEffect(()=>{const e=m=>{m.key==="Escape"&&(z(null),Le(null),Ne(null),Ae(!1)),(m.metaKey||m.ctrlKey)&&m.key.toLowerCase()==="f"&&(m.preventDefault(),Ae(!0)),(m.metaKey||m.ctrlKey)&&m.key.toLowerCase()==="h"&&(m.preventDefault(),ne())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[ne]);function nt(e,m){e.preventDefault(),Y({x:e.clientX,y:e.clientY,c:m,anchor:e.currentTarget})}async function oe(e){Y(null),await r(e).then(()=>be()).catch(()=>{})}async function at(e,m){Y(null),await a(e,m).then(()=>be()).catch(()=>{})}async function Fe(e){Y(null),q(null),await s(e).then(()=>be()).catch(()=>{})}async function Me(e){Y(null),q(null),await l(e).then(()=>be()).catch(()=>{})}async function mt(e){Y(null),await p(e).then(()=>be()).catch(()=>{})}function Ue(e){q(null),M.idePrUrl(n,e).then(m=>{m.url?window.open(m.url,"_blank","noreferrer"):window.alert("origin bukan github/gitlab/bitbucket — tak bisa buat PR otomatis")}).catch(()=>{})}function se(e){q(null),window.open(M.ideArchiveUrl(n,e),"_blank")}const Ke=Math.max(1,...k.map(e=>e.width)),gt=h.useMemo(()=>Nn(k),[k]);if(v==="loading")return t.jsx(J,{kind:"loading",title:"Memuat git graph…"});if(v==="error")return t.jsx(J,{kind:"error",title:"Gagal memuat git graph",action:be});if(k.length===0)return t.jsx(J,{kind:"empty",icon:"git-commit",title:"Belum ada commit"});const xe=T!=="desktop",Oe=T==="mobile"||Z?44:jn,ve=!!(w||he);return t.jsxs(t.Fragment,{children:[xe&&ve&&t.jsx(St,{"aria-label":"Panel Git Graph",variant:"pill",value:I,onChange:e=>Q(e),tabs:[{value:"graph",label:"Graph"},{value:"detail",label:"Detail"}]}),t.jsxs("div",{className:"hn-git-graph-layout",style:{display:"grid",gridTemplateColumns:xe?"minmax(0, 1fr)":ve?"minmax(0, 1fr) 340px":"minmax(0, 1fr)",gap:16,alignItems:"start",minWidth:0},children:[t.jsx("section",{"data-panel":"graph","aria-label":"Graph","aria-hidden":xe&&ve&&I!=="graph"?"true":"false",style:{display:xe&&ve&&I!=="graph"?"none":"block",minWidth:0},children:t.jsxs(je,{padding:0,children:[t.jsx("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap",padding:"8px 12px",borderBottom:"1px solid var(--border-hair)"},children:ze?t.jsxs(t.Fragment,{children:[t.jsx(He,{name:"search",size:13,color:"var(--text-subtle)"}),t.jsx("input",{autoFocus:!0,value:we,onChange:e=>{pe(e.target.value),de(0)},onKeyDown:e=>{e.key==="Enter"&&Ee(_e+(e.shiftKey?-1:1)),e.key==="Escape"&&Ae(!1)},placeholder:"mis. auto-merge, 3a3e7e0, atau hanoman/spec-490",style:{flex:1,border:"none",outline:"none",background:"transparent",fontSize:12.5,fontFamily:"var(--font-ui)",color:"var(--text-body)"}}),t.jsx("span",{style:{fontSize:11,color:"var(--text-subtle)",fontFamily:"var(--font-mono)"},children:ae.length?`${_e+1}/${ae.length}`:we?"0":""}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"chevron-up",disabled:!ae.length,onClick:()=>Ee(_e-1)}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"chevron-down",disabled:!ae.length,onClick:()=>Ee(_e+1)}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"x",onClick:()=>{Ae(!1),pe("")}})]}):t.jsxs(t.Fragment,{children:[t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"search",onClick:()=>Ae(!0),children:"Cari"}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"crosshair",onClick:ne,children:"HEAD"}),t.jsx("span",{style:{marginLeft:"auto",fontSize:11,color:"var(--text-subtle)"},children:"⌘F cari · ⌘H center HEAD"})]})}),t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,flexWrap:"wrap",padding:"6px 12px",borderBottom:"1px solid var(--border-hair)",fontSize:12},children:[t.jsxs("select",{value:te.branch,onChange:e=>Re({branch:e.target.value}),style:{fontSize:12,padding:"3px 6px",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",background:"var(--surface-card)",color:"var(--text-body)"},children:[t.jsx("option",{value:"",children:"semua branch"}),ct.map(e=>t.jsx("option",{value:e,children:e},e))]}),t.jsx(Se,{checked:te.showRemote,onChange:e=>Re({showRemote:e}),label:"remote"}),t.jsx(Se,{checked:te.showTags,onChange:e=>Re({showTags:e}),label:"tag"}),t.jsx(Se,{checked:$e,onChange:e=>De(e),label:"muted merge"}),t.jsxs("button",{onClick:()=>fe(e=>e==="rounded"?"angular":"rounded"),style:{border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",background:"var(--surface-card)",cursor:"pointer",padding:"3px 8px",fontSize:12,color:"var(--text-muted)"},children:["style: ",et]}),t.jsx(tn,{})]}),j.length>0&&t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,flexWrap:"wrap",padding:"6px 12px",borderBottom:"1px solid var(--border-hair)"},children:[t.jsx("span",{className:"hn-eyebrow",style:{marginRight:4},children:"stash"}),j.map(e=>t.jsxs("button",{type:"button",title:e.message,"aria-label":`Aksi ${e.ref}`,onClick:m=>{m.stopPropagation(),F({x:m.clientX,y:m.clientY,s:e,anchor:m.currentTarget})},onContextMenu:m=>{m.preventDefault(),m.stopPropagation(),F({x:m.clientX,y:m.clientY,s:e,anchor:m.currentTarget})},style:{fontFamily:"var(--font-mono)",fontSize:10.5,padding:"2px 8px",borderRadius:999,border:"none",cursor:"pointer",background:"var(--ink-100, #e7e6e1)",color:"var(--text-muted)",flex:"0 0 auto"},children:[e.ref,": ",e.message.length>40?e.message.slice(0,40)+"…":e.message]},e.ref))]}),t.jsx(qt,{"data-testid":"ide-graph-rows",children:t.jsxs("div",{style:{minWidth:Ke*Ce+Ln},children:[x&&!x.clean&&(()=>{const e=x.staged.length+x.unstaged.length+x.untracked.length,m=x.unstaged[0]??x.untracked[0]??x.staged[0];return t.jsxs("div",{onClick:()=>{m&&b(m,"")},onContextMenu:y=>{y.preventDefault(),W({x:y.clientX,y:y.clientY,anchor:y.currentTarget})},onMouseEnter:y=>{y.currentTarget.style.background="var(--bone-100)"},onMouseLeave:y=>{y.currentTarget.style.background="transparent"},style:{display:"flex",alignItems:"center",gap:10,height:Oe,padding:"0 12px",cursor:"pointer",borderBottom:"1px solid var(--border-hair)"},children:[t.jsx("svg",{width:Ke*Ce,height:Oe,style:{flex:"0 0 auto"},children:t.jsx("circle",{cx:Ce/2,cy:Oe/2,r:Ht,fill:"none",stroke:yt(0),strokeWidth:1.5})}),t.jsxs("button",{type:"button",onClick:y=>{y.stopPropagation(),m&&b(m,"")},style:{border:0,padding:0,background:"transparent",textAlign:"left",cursor:m?"pointer":"default",fontSize:12.5,fontStyle:"italic",color:"var(--text-muted)",flex:1},children:["Uncommitted changes · ",e," file"]}),t.jsx("button",{type:"button",className:"hn-graph-action","aria-label":"Aksi working tree",onClick:y=>{y.stopPropagation(),W({x:y.clientX,y:y.clientY,anchor:y.currentTarget})},children:"⋮"}),t.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:11,color:"var(--text-subtle)",flex:"0 0 auto",width:88,textAlign:"right"},children:"working tree"}),t.jsx("span",{style:{width:40,flex:"0 0 auto"}})]})})(),k.map((e,m)=>{const y=e.commit,K=y.refs.includes(E),ye=(w==null?void 0:w.sha)===y.sha,le=ae.includes(y.sha),ht=ae[_e]===y.sha,Kt=ye?"var(--brass-100)":ht?"var(--brass-200, #ecd9ac)":le?"var(--bone-100)":"transparent";return t.jsxs("div",{ref:P=>{P&&Je.current.set(y.sha,P)},onClick:P=>Be(P,y.sha),onContextMenu:P=>nt(P,y),title:me?"Ctrl/Cmd-klik untuk bandingkan dengan commit pertama":"Ctrl/Cmd-klik untuk mulai compare",onMouseEnter:P=>{!ye&&!ht&&(P.currentTarget.style.background="var(--bone-100)")},onMouseLeave:P=>{!ye&&!ht&&(P.currentTarget.style.background=le?"var(--bone-100)":"transparent")},style:{display:"flex",alignItems:"center",gap:10,height:Oe,padding:"0 12px",cursor:"pointer",borderBottom:"1px solid var(--border-hair)",background:Kt},children:[t.jsx(Pn,{row:e,edges:gt[m]??[],maxLanes:Ke,style:et,palette:dt,height:Oe}),t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,minWidth:0,flex:1},children:[y.refs.map(P=>t.jsx("button",{type:"button",title:"branch — pilih untuk aksi","aria-label":`Aksi branch ${P}`,onClick:X=>{X.preventDefault(),X.stopPropagation(),q({x:X.clientX,y:X.clientY,ref:P,anchor:X.currentTarget})},onContextMenu:X=>{X.preventDefault(),X.stopPropagation(),q({x:X.clientX,y:X.clientY,ref:P,anchor:X.currentTarget})},style:{fontFamily:"var(--font-mono)",fontSize:10.5,padding:"1px 6px",cursor:"pointer",border:"none",borderRadius:999,background:K&&P===E?"var(--brass-500)":"var(--brass-100)",color:K&&P===E?"#fff":"var(--brass-700)",flex:"0 0 auto"},children:P},P)),y.tags.map(P=>t.jsxs("button",{type:"button",title:"tag — pilih untuk aksi","aria-label":`Aksi tag ${P}`,onClick:X=>{X.preventDefault(),X.stopPropagation(),U({x:X.clientX,y:X.clientY,tag:P,anchor:X.currentTarget})},onContextMenu:X=>{X.preventDefault(),X.stopPropagation(),U({x:X.clientX,y:X.clientY,tag:P,anchor:X.currentTarget})},style:{fontFamily:"var(--font-mono)",fontSize:10.5,padding:"1px 6px 1px 4px",borderRadius:999,border:"none",display:"inline-flex",alignItems:"center",gap:3,background:"var(--leaf-100, #e6efe9)",color:"var(--leaf-600, #3b7a57)",flex:"0 0 auto"},children:["⌂",P]},`tag:${P}`)),t.jsx("button",{type:"button","aria-label":`Buka commit ${y.sha}`,onClick:P=>{P.stopPropagation(),Be(P,y.sha)},style:{minWidth:zn,padding:0,border:0,background:"transparent",cursor:"pointer",textAlign:"left",fontSize:12.5,color:$e&&y.parents.length>1?"var(--text-subtle)":"var(--text-body)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:We.emoji?xt(y.subject):y.subject})]}),t.jsx("button",{type:"button",className:"hn-graph-action","aria-label":`Aksi commit ${y.sha}`,onClick:P=>{P.stopPropagation(),nt(P,y)},children:"⋮"}),t.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:11,color:"var(--text-subtle)",flex:"0 0 auto",width:88,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",textAlign:"right"},children:y.author}),t.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:11,color:"var(--text-subtle)",flex:"0 0 auto",width:40,textAlign:"right"},children:Dn(y.at)})]},y.sha)})]})}),t.jsxs("div",{ref:S,style:{display:"flex",alignItems:"center",justifyContent:"center",gap:10,padding:"9px 12px",borderTop:"1px solid var(--border-hair)"},children:[t.jsxs("span",{style:{fontSize:11.5,color:"var(--text-subtle)"},children:[u>0?`${k.length} dari ${u} commit`:`${k.length} commit dimuat`,N?"":" · seluruh history"]}),N&&t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"chevron-down",disabled:g,onClick:Te,children:g?"Memuat…":`Muat ${st} lagi`})]})]})}),w&&t.jsx("section",{"data-panel":"detail","aria-label":"Detail","aria-hidden":xe&&I!=="detail"?"true":"false",style:{display:xe&&I!=="detail"?"none":"block",minWidth:0},children:t.jsxs(je,{padding:16,children:[t.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:8},children:[t.jsxs("span",{className:"hn-eyebrow",children:["commit ",w.sha.slice(0,8)]}),t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[w.signed&&t.jsx(re,{tone:"ok",size:"sm",children:"signed"}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"copy",onClick:()=>{var e;return void((e=navigator.clipboard)==null?void 0:e.writeText(w.sha))},children:"Hash"}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"x",onClick:()=>{R(null),Q("graph")},children:"Tutup"})]})]}),t.jsx("div",{style:{fontSize:13,color:"var(--text-strong)",fontWeight:600,marginBottom:4},children:We.emoji?xt(w.subject):w.subject}),t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,fontSize:11,color:"var(--text-subtle)",marginBottom:6},children:[ut&&w.authorEmail&&t.jsx("img",{src:Rn(w.authorEmail,20),width:18,height:18,alt:"",style:{borderRadius:999}}),t.jsxs("span",{children:[w.author,w.committer&&w.committer!==w.author?` · committed by ${w.committer}`:""]})]}),w.body&&t.jsx("pre",{style:{fontFamily:"var(--font-mono)",fontSize:11.5,whiteSpace:"pre-wrap",color:"var(--text-muted)",marginBottom:10},children:Mn(w.body,We)}),t.jsxs("div",{className:"hn-eyebrow",style:{display:"flex",alignItems:"center",gap:6,marginBottom:6},children:[t.jsxs("span",{style:{flex:1},children:[w.changed.length," file berubah"]}),["list","tree"].map(e=>t.jsx("button",{"aria-label":e,onClick:()=>ce(e),style:{display:"flex",padding:3,border:"none",cursor:"pointer",borderRadius:4,background:ee===e?"var(--brass-100)":"transparent"},children:t.jsx(He,{name:e==="list"?"list":"folder-tree",size:13,color:ee===e?"var(--brass-700)":"var(--text-subtle)"})},e))]}),ee==="tree"?Tt(w.changed.map(e=>e.path)).map(e=>t.jsx(Mt,{node:e,selected:(f==null?void 0:f.path)??"",onSelect:m=>ie(m,w.sha),defaultOpen:!0},e.path)):w.changed.map(e=>t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,padding:"3px 6px"},children:[t.jsx(re,{tone:e.status==="A"?"ok":e.status==="D"?"err":"warn",size:"sm",children:e.status}),t.jsx("button",{onClick:()=>ie(e.path,w.sha),title:"lihat diff",style:{flex:1,minWidth:0,textAlign:"left",border:"none",background:"transparent",cursor:"pointer",fontFamily:"var(--font-mono)",fontSize:11.5,color:"var(--text-body)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.path}),t.jsx(He,{name:"git-commit",size:12,color:"var(--text-subtle)",title:"view at revision",onClick:()=>b(e.path,w.sha),style:{cursor:"pointer"}}),t.jsx(He,{name:"external-link",size:12,color:"var(--text-subtle)",title:"open (working tree)",onClick:()=>b(e.path,""),style:{cursor:"pointer"}}),t.jsx(He,{name:"copy",size:12,color:"var(--text-subtle)",title:"copy path",onClick:()=>{var m;return void((m=navigator.clipboard)==null?void 0:m.writeText(e.path))},style:{cursor:"pointer"}})]},e.path))]})}),he&&t.jsx("section",{"data-panel":"detail","aria-label":"Detail","aria-hidden":xe&&I!=="detail"?"true":"false",style:{display:xe&&I!=="detail"?"none":"block",minWidth:0},children:t.jsxs(je,{padding:16,children:[t.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:8},children:[t.jsxs("span",{className:"hn-eyebrow",children:["compare ",he.from.slice(0,7)," … ",he.to.slice(0,7)]}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"x",onClick:()=>{Le(null),Q("graph")},children:"Tutup"})]}),t.jsxs("div",{className:"hn-eyebrow",style:{marginBottom:6},children:[he.changed.length," file berbeda"]}),he.changed.length===0&&t.jsx("div",{style:{fontSize:12,color:"var(--text-subtle)"},children:"Tak ada perbedaan."}),he.changed.map(e=>t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,padding:"3px 6px"},children:[t.jsx(re,{tone:e.status==="A"?"ok":e.status==="D"?"err":"warn",size:"sm",children:e.status}),t.jsx("button",{onClick:()=>ie(e.path,he.to,he.from),style:{flex:1,minWidth:0,textAlign:"left",border:"none",background:"transparent",cursor:"pointer",fontFamily:"var(--font-mono)",fontSize:11.5,color:"var(--text-body)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.path})]},e.path))]})}),me&&t.jsxs("div",{style:{position:"fixed",bottom:"max(16px, var(--safe-bottom))",left:"50%",transform:"translateX(-50%)",zIndex:140,background:"var(--brass-500)",color:"#fff",padding:"6px 14px",borderRadius:999,fontSize:12.5,boxShadow:"var(--shadow-pop, 0 6px 24px rgba(0,0,0,.15))",display:"flex",alignItems:"center",gap:10},children:["Compare dari ",me.slice(0,7)," — Ctrl/Cmd-klik commit kedua",t.jsx("button",{onClick:()=>Ne(null),style:{border:"none",background:"transparent",color:"#fff",cursor:"pointer",fontWeight:700},children:"✕"})]}),B&&t.jsx(Ve,{x:B.x,y:B.y,returnFocus:B.anchor,onClose:()=>Y(null),items:Fn(B.c,E,oe,at,Fe,mt)}),A&&t.jsx(Ve,{x:A.x,y:A.y,returnFocus:A.anchor,onClose:()=>U(null),items:[{label:`Hapus tag ${A.tag} (local)`,run:()=>{U(null),oe({op:"delete-tag",name:A.tag})}},{label:`Hapus tag ${A.tag} (local + origin)`,run:()=>{U(null),oe({op:"delete-tag",name:A.tag,remote:!0})}},{label:"Push tag ke origin",run:()=>{U(null),oe({op:"push-tag",name:A.tag})}},{label:"Copy nama tag",run:()=>{var e;U(null),(e=navigator.clipboard)==null||e.writeText(A.tag)}}]}),D&&t.jsx(Ve,{x:D.x,y:D.y,returnFocus:D.anchor,onClose:()=>W(null),items:[{label:"Stash perubahan…",run:()=>{W(null);const e=window.prompt("Pesan stash (opsional):")||void 0;oe({op:"stash",message:e,includeUntracked:!0})}},{label:"Reset working tree (mixed — unstage)",run:()=>{W(null),oe({op:"reset-worktree",mode:"mixed"})}},{label:"Reset working tree (hard — buang semua)",run:()=>{W(null),oe({op:"reset-worktree",mode:"hard"})}},{label:"Clean untracked",run:()=>{W(null),oe({op:"clean",directories:!0})}}]}),$&&t.jsx(Ve,{x:$.x,y:$.y,returnFocus:$.anchor,onClose:()=>F(null),items:[{label:"Apply (jaga stash)",run:()=>{const e=$.s;F(null),oe({op:"stash-apply",ref:e.ref})}},{label:"Pop (apply + buang)",run:()=>{const e=$.s;F(null),oe({op:"stash-pop",ref:e.ref})}},{label:"Drop (buang stash)",run:()=>{const e=$.s;F(null),oe({op:"stash-drop",ref:e.ref})}},{label:"Buat branch dari stash…",run:()=>{const e=$.s;F(null);const m=window.prompt("Nama branch baru:");m&&oe({op:"stash-branch",ref:e.ref,name:m})}},{label:"Copy nama stash",run:()=>{var m;const e=$.s;F(null),(m=navigator.clipboard)==null||m.writeText(e.ref)}}]}),L&&t.jsx(Ve,{x:L.x,y:L.y,returnFocus:L.anchor,onClose:()=>q(null),items:Un(L.ref,E,H,oe,at,Fe,Me,Ue,se)}),f&&t.jsx(Qe,{open:!0,title:`Diff ${f.path}`,eyebrow:`@ ${f.sha.slice(0,8)}`,width:900,fillHeight:!0,onClose:()=>z(null),children:t.jsxs("div",{className:"hn-panel-flex",style:{height:"100%",minHeight:0,display:"flex",flexDirection:"column"},children:[t.jsxs("div",{style:{flex:"0 0 auto",display:"flex",alignItems:"center",gap:12,paddingBottom:10,borderBottom:"1px solid var(--border-hair)"},children:[t.jsx("div",{style:{display:"flex",gap:2,background:"var(--bone-100)",borderRadius:"var(--radius-pill)",padding:2},children:(qe(f.path)?["diff","source","preview"]:["diff","source"]).map(e=>t.jsx("button",{onClick:()=>z(m=>m&&{...m,tab:e}),style:{padding:"4px 12px",border:"none",cursor:"pointer",borderRadius:"var(--radius-pill)",fontSize:12,textTransform:"capitalize",background:f.tab===e?"var(--surface-card)":"transparent",color:f.tab===e?"var(--text-strong)":"var(--text-muted)",fontWeight:f.tab===e?600:400},children:e},e))}),qe(f.path)&&!((rt=f.data)!=null&&rt.binary)&&((Ie=f.data)==null?void 0:Ie.content)!=null&&t.jsx(Ct,{href:e=>f.from?M.ideCompareFileDownloadUrl(n,f.from,f.sha,f.path,e):M.ideCommitFileDownloadUrl(n,f.sha,f.path,e)})]}),t.jsx("div",{"data-testid":"gitgraph-file-scroll",style:{flex:"1 1 auto",minHeight:0,overflow:"auto",padding:"10px 0"},children:f.data?f.data.binary?t.jsx(J,{kind:"empty",icon:"file",title:"Berkas biner"}):f.tab==="diff"?t.jsx(Ot,{diff:f.data.diff??"",emptyHint:"File tak berubah di commit ini."}):f.tab==="preview"?t.jsx("div",{style:{padding:"0 16px"},children:t.jsx(Nt,{text:f.data.content??"",name:f.path})}):t.jsx("pre",{style:{margin:0,padding:"0 16px",fontFamily:"var(--font-mono)",fontSize:12.5,lineHeight:1.6,whiteSpace:"pre-wrap",wordBreak:"break-word",color:"var(--text-body)"},children:f.data.content??"(kosong / dihapus)"}):t.jsx(J,{kind:"loading",title:"Memuat diff…",hint:f.path})})]})})]})]})}const Et=[{value:"both",label:"local + origin"},{value:"local",label:"local saja"},{value:"remote",label:"origin saja"}],Gn=[{value:"all",label:"semua status"},{value:"merged",label:"ter-merge saja"},{value:"unmerged",label:"belum ter-merge"}],it=100,Wn=n=>{const r=new Date(n).getTime();if(!r)return"";const a=Math.max(0,(Date.now()-r)/1e3);return a<3600?`${Math.floor(a/60)}m`:a<86400?`${Math.floor(a/3600)}j`:a<2592e3?`${Math.floor(a/86400)}h`:new Date(n).toLocaleDateString()},ft=n=>n.locks.length===0,Kn=n=>n.local&&n.remote?"local + origin":n.local?"local":"origin";function Zn({projectId:n,onOpenWorktree:r}){const[a,s]=h.useState("loading"),[l,p]=h.useState(null),[b,v]=h.useState([]),[_,k]=h.useState(""),[i,N]=h.useState("both"),[o,u]=h.useState("all"),[c,g]=h.useState(""),[d,S]=h.useState(it),[E,C]=h.useState(new Set),[w,R]=h.useState(null),[I,Q]=h.useState(!1),[T,Z]=h.useState(null),B=h.useCallback(()=>{s("loading"),M.branchesUnused(n,_||void 0,"all").then(f=>{p(f),C(new Set),s("ready")}).catch(()=>s("error"))},[n,_]);h.useEffect(()=>{B()},[B]),h.useEffect(()=>{M.listBranches(n).then(f=>v([...new Set([...f.branches,...f.remotes])].sort())).catch(()=>v([]))},[n]);const Y=(l==null?void 0:l.branches)??[],A=h.useMemo(()=>{const f=c.trim().toLowerCase();return Y.filter(z=>(o==="all"||o==="merged"===z.merged)&&(!f||z.name.toLowerCase().includes(f)))},[Y,o,c]);h.useEffect(()=>{S(it),C(new Set)},[o,c]);const U=A.slice(0,d),x=h.useMemo(()=>U.filter(ft).map(f=>f.name),[U]),G=x.length>0&&x.every(f=>E.has(f)),D=f=>C(z=>{const ie=new Set(z);return ie.has(f)?ie.delete(f):ie.add(f),ie}),W=()=>C(G?new Set:new Set(x)),j=U.filter(f=>E.has(f.name)).map(f=>f.name),V=h.useMemo(()=>new Map(Y.map(f=>[f.name,f])),[Y]),$=(w??[]).filter(f=>{var z;return((z=V.get(f))==null?void 0:z.merged)===!1}),F=$.length>0,L=()=>{const f=w;f&&(Q(!0),M.deleteBranches(n,{names:f,scope:i,...F?{allowUnmerged:!0}:{}}).then(z=>{Z(z.results),R(null),B()}).catch(z=>{Z(f.map(ie=>({name:ie,ok:!1,scope:"none",error:z.message}))),R(null)}).finally(()=>Q(!1)))},q=(T??[]).filter(f=>!f.ok),H=(T??[]).length-q.length,ee=(T??[]).filter(f=>f.ok&&f.forced).length,ce=Et.find(f=>f.value===i).label;return t.jsxs(je,{padding:0,children:[t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,padding:"10px 14px",borderBottom:"1px solid var(--border-hair)",flexWrap:"wrap"},children:[t.jsxs("span",{className:"hn-eyebrow",style:{flex:1},children:["branch project",l!=null&&l.base?` · base ${l.base}`:""]}),t.jsx(ot,{size:"sm","data-testid":"cari",leftIcon:"search",placeholder:"cari branch…",value:c,onChange:f=>g(f.target.value),style:{width:180}}),t.jsx(Xe,{size:"sm","data-testid":"status",value:o,onChange:f=>u(f.target.value),options:Gn}),t.jsx(Xe,{size:"sm","data-testid":"base",value:_,onChange:f=>k(f.target.value),options:[{value:"",label:`base otomatis${l!=null&&l.base?` (${l.base})`:""}`},...b.map(f=>({value:f,label:f}))]}),t.jsx(Xe,{size:"sm","data-testid":"scope",value:i,onChange:f=>N(f.target.value),options:Et}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"rotate-ccw",onClick:B,children:"Muat ulang"}),t.jsxs(O,{size:"sm",variant:"primary",leftIcon:"trash-2","data-testid":"bulk-delete",disabled:j.length===0,onClick:()=>R(j),children:["Hapus terpilih (",j.length,")"]})]}),T&&t.jsxs("div",{style:{padding:"10px 14px",borderBottom:"1px solid var(--border-hair)",fontSize:12.5},children:[t.jsxs("div",{style:{color:"var(--text-strong)"},children:[H," terhapus",ee?` (${ee} dipaksa)`:""," · ",q.length," gagal"]}),q.map(f=>t.jsxs("div",{style:{color:"var(--text-muted)",fontFamily:"var(--font-mono)",fontSize:12},children:[f.name," — ",f.error??"gagal"]},f.name))]}),a==="loading"?t.jsx(J,{kind:"loading",title:"Memuat branch…"}):a==="error"?t.jsx(J,{kind:"error",title:"Gagal memuat branch",action:B}):Y.length===0?t.jsx(J,{kind:"empty",icon:"git-branch",title:"Tak ada branch",hint:"Project ini belum punya branch local maupun origin."}):A.length===0?t.jsx(J,{kind:"empty",icon:"filter",title:"Tak ada branch cocok filter",hint:"Longgarkan filter status atau kosongkan pencarian."}):t.jsxs("div",{style:{maxHeight:620,overflow:"auto"},children:[t.jsx("div",{style:{display:"flex",alignItems:"center",gap:10,padding:"8px 14px",borderBottom:"1px solid var(--border-hair)"},children:t.jsx(Se,{"data-testid":"pick-all",checked:G,onChange:W,disabled:x.length===0,label:`Pilih semua yang boleh (${x.length})`})}),U.map(f=>t.jsxs("div",{className:"hn-dense-row",style:{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap",padding:"8px 14px",borderBottom:"1px solid var(--border-hair)"},children:[t.jsx(Se,{"data-testid":`pick-${f.name}`,checked:E.has(f.name),disabled:!ft(f),onChange:()=>D(f.name)}),t.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:12.5,color:"var(--text-strong)",flex:1},children:f.name}),t.jsx(re,{size:"sm",tone:f.merged?"ok":"warn",children:f.merged?"ter-merge":"belum ter-merge"}),t.jsx(re,{size:"sm",tone:"brass",children:Kn(f)}),f.locks.map(z=>z==="worktree"&&f.worktree&&r?t.jsx("button",{"data-testid":`goto-worktree-${f.name}`,onClick:()=>r(f.worktree),style:{background:"none",border:0,padding:0,cursor:"pointer"},children:t.jsxs(re,{size:"sm",tone:"warn",children:[vt[z]," →"]})},z):t.jsx(re,{size:"sm",tone:"warn",children:vt[z]},z)),t.jsx("span",{style:{fontSize:11.5,color:"var(--text-subtle)",minWidth:200,marginLeft:"auto",textAlign:"right"},children:f.lastCommit?`${f.lastCommit.subject} · ${Wn(f.lastCommit.at)}`:"—"}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"trash-2","data-testid":`row-delete-${f.name}`,disabled:!ft(f),onClick:()=>R([f.name]),children:"Hapus"})]},f.name)),A.length>U.length&&t.jsx("div",{style:{padding:"8px 14px",textAlign:"center"},children:t.jsxs(O,{size:"sm",variant:"ghost","data-testid":"show-more",onClick:()=>S(f=>f+it),children:["Tampilkan ",Math.min(it,A.length-U.length)," lagi (",A.length-U.length," tersisa)"]})})]}),t.jsx(At,{open:w!==null,busy:I,eyebrow:"branch",title:"Hapus branch?",confirmLabel:"Ya, hapus",requireText:F?(w==null?void 0:w.length)===1?w[0]:"hapus paksa":void 0,message:w?`${w.length} branch akan dihapus (${ce}). Tindakan ini tak bisa dibatalkan.`:"",impact:F?[`${$.length} branch belum ter-merge ke ${(l==null?void 0:l.base)??"base"}: ${$.join(", ")}.`,"Commit yang hanya ada di branch itu akan hilang dan tak bisa dipulihkan dari dashboard."]:void 0,onConfirm:L,onCancel:()=>R(null)})]})}const Yn=n=>typeof n=="boolean",Vn=n=>{const r=n?new Date(n).getTime():0;if(!r)return"—";const a=Math.max(0,(Date.now()-r)/1e3);return a<3600?`${Math.floor(a/60)}m`:a<86400?`${Math.floor(a/3600)}j`:a<2592e3?`${Math.floor(a/86400)}h`:new Date(n).toLocaleDateString()},qn=n=>n===null?"—":n<1024*1024?`${Math.max(1,Math.round(n/1024))} KB`:n<1024*1024*1024?`${(n/1024/1024).toFixed(1)} MB`:`${(n/1024/1024/1024).toFixed(1)} GB`;function Xn({projectId:n,focus:r,onOpenBranch:a}){const s=Rt("worktrees",n),[l,p]=h.useState("loading"),[b,v]=h.useState(null),[_,k]=h.useState({}),[i,N]=h.useState(new Set),[o,u]=ke(s,"withBranch",!1,Yn),[c,g]=h.useState(null),{confirm:d,dialog:S}=Xt(),E=h.useCallback(()=>{p("loading"),M.worktrees(n).then(x=>{v(x),N(new Set),k({}),p("ready")}).catch(()=>p("error"))},[n]);h.useEffect(()=>{E()},[E]),h.useEffect(()=>{if(!b)return;let x=!0;return(async()=>{for(const G of b.worktrees){if(!x)return;const D=await M.worktreeStats(n,G.name).catch(()=>null);x&&D&&k(W=>({...W,[G.name]:D}))}})(),()=>{x=!1}},[b,n]);const C=(b==null?void 0:b.worktrees)??[],w=h.useMemo(()=>C.filter(x=>x.deletable).map(x=>x.name),[C]),R=w.length>0&&w.every(x=>i.has(x)),I=x=>N(G=>{const D=new Set(G);return D.has(x)?D.delete(x):D.add(x),D}),Q=C.filter(x=>i.has(x.name)).map(x=>x.name),T=C.some(x=>x.deletable&&x.branch),Z=C.filter(x=>x.orphan),B=Z.filter(x=>x.deletable).map(x=>x.name),Y=async(x,G=!1)=>{const D=C.filter(H=>x.includes(H.name)),W={..._};for(const H of D){const ee=await M.worktreeStats(n,H.name).catch(()=>null);ee?W[H.name]=ee:delete W[H.name]}k(W);const j=D.filter(H=>H.session).length,V=D.reduce((H,ee)=>{var ce;return H+(((ce=W[ee.name])==null?void 0:ce.dirtyFiles)??0)},0),$=D.reduce((H,ee)=>{var ce;return H+(((ce=W[ee.name])==null?void 0:ce.orphanCommits)??0)},0),F=D.map(H=>H.branch).filter(H=>!!H),L=[];j&&L.push(`${j} sesi aktif akan ditutup lebih dulu`),$&&L.push(`${$} commit tak ada di tempat lain — hilang`),V&&L.push(`${V} berkas belum tersimpan`);const q=D.filter(H=>{var ee,ce;return((ee=W[H.name])==null?void 0:ee.dirtyFiles)==null||((ce=W[H.name])==null?void 0:ce.orphanCommits)==null}).length;q&&L.push(`Dampak ${q} worktree belum diketahui — statistik git gagal dibaca`),!G&&o&&F.length&&L.push(`branch ikut dihapus: ${F.join(", ")}`),L.push("Seluruh isi direktori akan hilang, termasuk berkas ignored seperti .env dan node_modules"),await d({eyebrow:"worktree",title:`Hapus ${x.length} worktree?`,confirmLabel:"Ya, hapus",message:G?"Worktree sesi terputus ini akan dihapus. Sesi yang kembali hidup akan dilewati.":"Direktori worktree akan dihapus di latar.",impact:L,run:async()=>{const H=await M.deleteWorktrees(n,{names:x,...G?{orphanOnly:!0}:o?{deleteBranch:!0}:{}});g(H.results),E()}}).catch(H=>(g(x.map(ee=>({name:ee,ok:!1,cleanup:null,error:H.message}))),!1))},A=(c??[]).filter(x=>!x.ok),U=(c??[]).filter(x=>x.ok&&x.branch&&!x.branch.ok);return t.jsxs(je,{padding:0,children:[t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,padding:"10px 14px",borderBottom:"1px solid var(--border-hair)",flexWrap:"wrap"},children:[t.jsx("span",{className:"hn-eyebrow",style:{flex:1},children:"worktree hidup"}),T&&t.jsx(Se,{"data-testid":"with-branch",checked:o,onChange:()=>u(!o),label:"Hapus branch-nya juga"}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"rotate-ccw",onClick:E,children:"Muat ulang"}),t.jsxs(O,{size:"sm",variant:"primary",leftIcon:"trash-2","data-testid":"bulk-delete",disabled:Q.length===0,onClick:()=>void Y(Q),children:["Hapus terpilih (",Q.length,")"]})]}),Z.length>0&&l==="ready"&&t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap",padding:"10px 14px",borderBottom:"1px solid var(--border-hair)",fontSize:12.5},children:[t.jsxs("span",{style:{flex:1},children:[Z.length," worktree sesi yatim — dipertahankan sampai kamu memungutnya."]}),t.jsxs(O,{size:"sm",variant:"ghost",leftIcon:"trash-2",disabled:!B.length,onClick:()=>void Y(B,!0),children:["Pungut yatim (",B.length,")"]})]}),c&&t.jsxs("div",{style:{padding:"10px 14px",borderBottom:"1px solid var(--border-hair)",fontSize:12.5},children:[t.jsxs("div",{style:{color:"var(--text-strong)"},children:[c.length-A.length," terhapus · ",A.length," gagal"]}),A.map(x=>t.jsxs("div",{style:{color:"var(--text-muted)",fontFamily:"var(--font-mono)",fontSize:12},children:[x.name," — ",x.error??"gagal"]},x.name)),U.map(x=>t.jsxs("div",{style:{color:"var(--text-muted)",fontFamily:"var(--font-mono)",fontSize:12},children:[x.branch.name," — ",x.branch.error??"branch gagal dihapus"]},`b-${x.name}`))]}),l==="loading"?t.jsx(J,{kind:"loading",title:"Memuat worktree…"}):l==="error"?t.jsx(J,{kind:"error",title:"Gagal memuat worktree",action:E}):C.length===0?t.jsx(J,{kind:"empty",icon:"folder",title:"Tak ada worktree",hint:"Project ini belum punya checkout lokal, atau git tak bisa dibaca."}):t.jsxs("div",{style:{maxHeight:620,overflow:"auto"},children:[t.jsx("div",{style:{display:"flex",alignItems:"center",gap:10,padding:"8px 14px",borderBottom:"1px solid var(--border-hair)"},children:t.jsx(Se,{"data-testid":"pick-all",checked:R,disabled:w.length===0,onChange:()=>N(R?new Set:new Set(w)),label:`Pilih semua yang boleh (${w.length})`})}),C.map(x=>{var G;return t.jsxs("div",{"data-testid":`row-${x.name}`,className:"hn-dense-row",style:{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap",padding:"8px 14px",borderBottom:"1px solid var(--border-hair)",background:r===x.name?"var(--surface-sunken)":void 0},children:[t.jsx(Se,{"data-testid":`pick-${x.name}`,checked:i.has(x.name),disabled:!x.deletable,onChange:()=>I(x.name)}),t.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:12.5,color:"var(--text-strong)",flex:1},children:x.name}),x.branch?t.jsx("button",{"data-testid":`goto-branch-${x.name}`,onClick:()=>a==null?void 0:a(x.branch),style:{background:"none",border:0,padding:0,cursor:"pointer",fontFamily:"var(--font-mono)",fontSize:12,color:"var(--brass)"},children:x.branch}):t.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:12,color:"var(--text-subtle)"},children:x.head.slice(0,7)||"—"}),!x.branch&&t.jsx(re,{size:"sm",tone:"brass",children:"detached"}),x.spec&&t.jsxs(re,{size:"sm",tone:"brass",children:[x.spec.id," · ",x.spec.stage]}),x.session&&t.jsx(re,{size:"sm",tone:"warn",children:"sesi aktif"}),x.orphan&&t.jsx(re,{size:"sm",tone:"warn",children:"sesi yatim"}),x.prunable&&t.jsx(re,{size:"sm",tone:"warn",children:"prunable"}),x.locked&&t.jsx(re,{size:"sm",tone:"warn",children:"terkunci git"}),x.blocked&&t.jsx(re,{size:"sm",tone:"warn",children:x.blocked}),!!((G=_[x.name])!=null&&G.dirtyFiles)&&t.jsxs(re,{size:"sm",tone:"warn",children:[_[x.name].dirtyFiles," kotor"]}),t.jsxs("span",{style:{fontSize:11.5,color:"var(--text-subtle)",minWidth:130,marginLeft:"auto",textAlign:"right"},children:[_[x.name]?qn(_[x.name].sizeBytes):"…"," · ",Vn(x.createdAt)]}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"trash-2","data-testid":`row-delete-${x.name}`,disabled:!x.deletable,onClick:()=>void Y([x.name]),children:"Hapus"})]},x.name)})]}),S]})}const Qn=n=>new Promise(r=>{if(!n.file)return r(null);n.file(a=>r(a),()=>r(null))}),Jn=n=>new Promise(r=>{var p;const a=(p=n.createReader)==null?void 0:p.call(n);if(!a)return r([]);const s=[],l=()=>a.readEntries(b=>{if(!b.length)return r(s);s.push(...b),l()},()=>r(s));l()});async function Wt(n,r,a){const s=r?`${r}/${n.name}`:n.name;if(n.isFile){const l=await Qn(n);l&&a.push({path:s,file:l});return}if(n.isDirectory)for(const l of await Jn(n))await Wt(l,s,a)}async function ea(n){const a=(n.items?Array.from(n.items):[]).map(l=>{var p;return(p=l.webkitGetAsEntry)==null?void 0:p.call(l)}).filter(l=>!!l);if(!a.length)return Array.from(n.files??[]).map(l=>({path:l.name,file:l}));const s=[];for(const l of a)await Wt(l,"",s);return s}for(const[n,r]of Object.entries({typescript:an,javascript:cn,json:dn,markdown:un,css:vn,xml:kn,bash:wn,python:_n,yaml:En,sql:Sn,diff:Cn}))bt.registerLanguage(n,r);const ta=n=>{const r=n.slice(n.lastIndexOf(".")+1);return{ts:"typescript",tsx:"typescript",js:"javascript",jsx:"javascript",json:"json",md:"markdown",css:"css",html:"xml",sh:"bash",py:"python",yml:"yaml",yaml:"yaml",sql:"sql"}[r]??""};function na({msg:n,onForce:r,onCancel:a}){return t.jsxs(Qe,{open:!0,title:"Operasi ditolak",onClose:a,width:460,footer:t.jsxs(t.Fragment,{children:[t.jsx(O,{size:"sm",variant:"ghost",onClick:a,children:"Batal"}),t.jsx(O,{size:"sm",leftIcon:"alert-triangle",onClick:r,children:"Paksa"})]}),children:[t.jsx("pre",{style:{fontFamily:"var(--font-mono)",fontSize:12,whiteSpace:"pre-wrap",color:"var(--text-muted)",marginBottom:12},children:n}),t.jsx("div",{style:{fontSize:12.5,color:"var(--clay-600)",marginBottom:14},children:"Paksa bisa membuang perubahan tak ter-commit & mengganggu sesi Claude yang jalan."})]})}function aa({projectId:n,onClose:r}){const[a,s]=h.useState([]),[l,p]=h.useState(""),[b,v]=h.useState(""),_=h.useCallback(()=>{M.ideRemotes(n).then(s).catch(()=>s([]))},[n]);return h.useEffect(()=>{_()},[_]),t.jsxs(Qe,{open:!0,title:"Remotes",onClose:r,width:560,children:[a.length===0&&t.jsx("div",{style:{fontSize:12.5,color:"var(--text-subtle)",marginBottom:10},children:"Belum ada remote."}),a.map(k=>t.jsxs("div",{className:"hn-dense-row",style:{display:"flex",alignItems:"center",gap:8,padding:"5px 0",borderBottom:"1px solid var(--border-hair)"},children:[t.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:12.5,fontWeight:600,width:90},children:k.name}),t.jsx("span",{style:{flex:1,minWidth:0,fontFamily:"var(--font-mono)",fontSize:11.5,color:"var(--text-muted)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:k.fetch}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"trash-2",onClick:()=>M.ideDeleteRemote(n,k.name).then(s).catch(()=>{})})]},k.name)),t.jsxs("div",{className:"hn-stack-mobile",style:{display:"flex",gap:8,marginTop:12},children:[t.jsx(ot,{size:"sm",value:l,"aria-label":"Nama remote",onChange:k=>p(k.target.value),placeholder:"origin",style:{width:100}}),t.jsx(ot,{size:"sm",value:b,"aria-label":"URL remote",onChange:k=>v(k.target.value),placeholder:"https://github.com/org/repo.git",style:{flex:1}}),t.jsx(O,{size:"sm",leftIcon:"plus",disabled:!l||!b,onClick:()=>M.ideAddRemote(n,l,b).then(k=>{s(k),p(""),v("")}).catch(()=>{}),children:"Tambah"})]})]})}function ua({projects:n,projectId:r,onProject:a,onToast:s,onGotoTerminal:l}){const p=Rt("ide",r),[b,v]=ke(p,"tab","explorer",pt),[_,k]=h.useState(""),[i,N]=ke(p,"viewRef","",pt),[o,u]=h.useState({branches:[],remotes:[]}),[c,g]=h.useState([]),[d,S]=h.useState([]),[E,C]=h.useState(new Set),[w,R]=ke(p,"hidden",!1,Jt),[I,Q]=h.useState("loading"),[T,Z]=ke(p,"selected","",pt),[B,Y]=ke(p,"selKind","file",Ze("file","staged","unstaged")),[A,U]=h.useState(null),[x,G]=h.useState("view"),[D,W]=h.useState(""),[j,V]=ke(p,"mdView","preview",Ze("preview","source")),[$,F]=h.useState(null),[L,q]=h.useState(null),[H,ee]=ke(p,"stagedView","list",Ze("list","tree")),[ce,f]=ke(p,"changedView","list",Ze("list","tree")),[z,ie]=h.useState(null),[me,Ne]=ke(p,"diffTab","diff",Ze("diff","source")),[he,Le]=h.useState(!1),[Je,ze]=h.useState(!1),[Ae,we]=h.useState("files"),[pe,_e]=h.useState(""),[de,ge]=h.useState(null),[ae,Ee]=h.useState(null),[ne,te]=h.useState(null),[Ge,Re]=h.useState(!1),$e=h.useRef(null),De=h.useRef(null),et=typeof HTMLInputElement<"u"&&"webkitdirectory"in HTMLInputElement.prototype,fe=h.useCallback(()=>{Q("loading"),M.ideTree(r,i,{hidden:w}).then(e=>{g(e.files),S(e.dirs??[]),C(new Set(e.ignored??[])),Q("ready")}).catch(()=>Q("error"))},[r,i,w]),ct=h.useCallback(async e=>{try{const m=await M.ideTree(r,"",{under:e});g(y=>[...new Set([...y,...m.files])].sort()),S(y=>[...new Set([...y,...m.dirs??[]])].sort()),C(y=>new Set([...y,...m.files,...m.dirs??[]]))}catch{s==null||s("Gagal membuka folder","err","x-circle")}},[r,s]),ue=h.useCallback(()=>{M.ideWorkingStatus(r).then(q).catch(()=>q(null))},[r]);h.useEffect(()=>{fe()},[fe]),h.useEffect(()=>{ue()},[ue]),h.useEffect(()=>{M.listBranches(r).then(u).catch(()=>{})},[r]),h.useEffect(()=>{if(!T){U(null),ie(null);return}let e=!0;return ze(!1),B==="file"?(ie(null),M.ideFile(r,T,i).then(m=>{e&&(U(m),G("view"),V("preview"))}).catch(()=>{e&&U(null)})):(U(null),Ne("diff"),M.ideFileDiff(r,T,B==="staged").then(m=>{e&&ie(m)}).catch(()=>{e&&ie(null)})),()=>{e=!1}},[T,B,r,i]);const tt=e=>{Y("file"),Z(e),we("viewer")},dt=e=>{Y("staged"),Z(e),we("viewer")},We=e=>{Y("unstaged"),Z(e),we("viewer")},ut=[{value:"",label:"· working tree ·"},...o.branches.map(e=>({value:e,label:e})),...o.remotes.map(e=>({value:`origin/${e}`,label:`origin/${e}`}))];async function Be(e){try{const m=await M.ideGit(r,e);return N(""),fe(),ue(),m}catch(m){throw m instanceof Ye&&m.status===409&&F({op:e,msg:m.message}),m}}async function be(){i&&await Be({op:"checkout",ref:i}).catch(()=>{})}async function Pe(e,m){try{const y=await M.ideGitMerge(r,{source:e,...m});y.status==="conflict"?(l==null||l(y.sessionId),s==null||s("konflik merge — selesaikan di Terminal","warn","git-merge")):(N(""),fe(),ue(),s==null||s(`merge berhasil · ${y.detail}`,"ok","git-merge"))}catch(y){const K=y instanceof Ye?y.status:0;throw s==null||s("gagal merge"+(K===409?" · cek branch/target":""),"err","x-circle"),y}}async function Te(e,m){try{const y=e==="rebase"?await M.ideGitRebase(r,m):e==="pull"?await M.ideGitPull(r,{source:m}):await M.ideGitDrop(r,m);y.status==="conflict"?(l==null||l(y.sessionId),s==null||s(`konflik ${e} — selesaikan di Terminal`,"warn","git-merge")):(N(""),fe(),s==null||s(`${e} berhasil · ${y.detail}`,"ok","git-branch"))}catch(y){const K=y instanceof Ye?y.status:0;throw s==null||s(`gagal ${e}`+(K===409?" · cek working tree/branch":""),"err","x-circle"),y}}async function nt(){if(!$)return;const e={...$.op,force:!0};F(null),await M.ideGit(r,e).then(()=>{N(""),fe(),ue()}).catch(()=>{})}function oe(){W((A==null?void 0:A.content)??""),G("edit")}async function at(){await M.putIdeFile(r,T,D),U(e=>e&&{...e,content:D}),G("view"),ue()}const Fe=e=>pe?`${pe}/${e}`:e,Me=()=>{fe(),ue()};async function mt(e,m){if(!m.trim())return;const y=Fe(m.trim());try{await M.ideCreateEntry(r,y,e),Me(),s==null||s(`${e==="dir"?"folder":"berkas"} dibuat · ${y}`,"ok","file-plus")}catch(K){const ye=K instanceof Ye?K.status:0;s==null||s(ye===409?`sudah ada · ${y}`:`gagal membuat ${y}`,"err","x-circle")}}async function Ue(e,m=!1){if(!e.length)return;let y;try{y=await M.ideUpload(r,pe,e,m)}catch{s==null||s("gagal mengunggah","err","x-circle");return}Me();const K=new Set(y.skipped.filter(le=>le.reason==="exists").map(le=>le.path)),ye=y.skipped.filter(le=>le.reason!=="exists");y.written.length&&(s==null||s(`${y.written.length} berkas terunggah`,"ok","upload")),ye.length&&(s==null||s(`${ye.length} berkas dilewati · ${ye[0].reason}`,"warn","alert-triangle")),Ee(K.size?{files:e.filter(le=>K.has(Fe(le.path)))}:null)}const se=B==="file"&&T?{path:T,kind:"file"}:pe?{path:pe,kind:"dir"}:null;async function Ke(e){if(!(!se||!e.trim()))try{await M.ideRenameEntry(r,se.path,e.trim()),Me(),se.kind==="file"?Z(e.trim()):_e(e.trim()),s==null||s(`diganti nama · ${e.trim()}`,"ok","pencil")}catch(m){const y=m instanceof Ye?m.status:0;s==null||s(y===409?"nama tujuan sudah dipakai":"gagal mengganti nama","err","x-circle")}}async function gt(){if(se){te(null);try{await M.ideDeleteEntry(r,se.path),Me(),se.kind==="file"?(Z(""),U(null)):_e(""),s==null||s(`dihapus · ${se.path}`,"ok","trash-2")}catch{s==null||s(`gagal menghapus ${se.path}`,"err","x-circle")}}}const xe=e=>{const y=Array.from((e==null?void 0:e.files)??[]).map(K=>({path:K.webkitRelativePath||K.name,file:K}));return e&&(e.value=""),y},Oe=h.useMemo(()=>{if(!A||A.content===null)return"";const e=ta(T);try{return e?bt.highlight(A.content,{language:e}).value:bt.highlightAuto(A.content).value}catch{return A.content}},[A,T]),ve=(()=>{const e=B!=="file",m=e?z:A;return!m||m.binary||m.content===null||!qe(T)?null:{text:m.content,download:e?y=>M.ideFileDiffDownloadUrl(r,T,B==="staged",y):y=>M.ideFileDownloadUrl(r,T,i,y)}})(),rt=t.jsxs("div",{className:"hn-ide-toolbar",children:[t.jsx(Xe,{size:"sm",value:r,onChange:e=>a(e.target.value),options:n.map(e=>({value:e.id,label:e.name}))}),t.jsx(Xe,{size:"sm",value:i,onChange:e=>N(e.target.value),options:ut}),t.jsx(O,{size:"sm",variant:"secondary",leftIcon:"git-branch",onClick:be,disabled:!i,children:"Checkout"}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"download-cloud",onClick:()=>{Be({op:"fetch",prune:!0}).then(()=>M.listBranches(r).then(u)).catch(()=>{})},children:"Fetch"}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"git-branch",onClick:()=>Le(!0),children:"Remotes"})]}),Ie=B!=="file";return t.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:16,...b==="explorer"?{flex:"1 1 0",minHeight:0}:null},children:[t.jsxs("div",{className:"hn-ide-head",style:{flex:"0 0 auto"},children:[t.jsx(St,{tabs:[{value:"explorer",label:"Explorer"},{value:"graph",label:"Git Graph"},{value:"branches",label:"Branches"},{value:"worktrees",label:"Worktrees"}],value:b,onChange:v}),rt]}),b==="explorer"?t.jsx(Qt,{ariaLabel:"Panel IDE",active:Ae,onActiveChange:e=>we(e),masterWidth:300,panels:[{id:"files",label:"Files",className:"hn-panel-flex",content:t.jsxs(je,{padding:0,fill:!0,children:[t.jsxs("div",{style:{flex:"0 0 auto",display:"flex",alignItems:"center",gap:8,padding:"10px 14px",borderBottom:"1px solid var(--border-hair)"},children:[t.jsxs("span",{className:"hn-eyebrow",style:{flex:1},children:["changes",L!=null&&L.branch?` · ${L.branch}`:""]}),t.jsx(O,{size:"sm",variant:w?"secondary":"ghost",leftIcon:w?"eye":"eye-off",disabled:!!i,"aria-pressed":w,title:i?"Hanya di working tree":"Tampilkan berkas & folder yang .gitignore sembunyikan",onClick:()=>R(!w),children:"Tersembunyi"}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"rotate-ccw",onClick:Me,children:"Muat ulang"})]}),t.jsxs("div",{style:{flex:"0 0 auto",display:"flex",alignItems:"center",gap:6,flexWrap:"wrap",padding:"8px 14px",borderBottom:"1px solid var(--border-hair)"},children:[t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"file-plus",onClick:()=>ge({mode:"file",value:""}),children:"File baru"}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"folder-plus",onClick:()=>ge({mode:"dir",value:""}),children:"Folder baru"}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"upload",onClick:()=>{var e;return(e=$e.current)==null?void 0:e.click()},children:"Unggah"}),et&&t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"folder-up",onClick:()=>{var e;return(e=De.current)==null?void 0:e.click()},children:"Unggah folder"}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"pencil",disabled:!se,onClick:()=>ge({mode:"rename",value:(se==null?void 0:se.path)??""}),children:"Ganti nama"}),t.jsx(O,{size:"sm",variant:"ghost",leftIcon:"trash-2",disabled:!se,onClick:()=>te(se),children:"Hapus"}),t.jsxs("span",{"data-testid":"ide-entry-dest",style:{flex:"1 1 auto",minWidth:0,textAlign:"right",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontFamily:"var(--font-mono)",fontSize:11.5,color:"var(--text-subtle)"},children:["→ ",pe||"root"]}),t.jsx("input",{ref:$e,type:"file",multiple:!0,hidden:!0,onChange:()=>void Ue(xe($e.current))}),t.jsx("input",{ref:De,type:"file",hidden:!0,webkitdirectory:"",onChange:()=>void Ue(xe(De.current))})]}),t.jsxs("div",{"data-testid":"ide-tree-scroll",onDragOver:e=>{e.preventDefault(),Re(!0)},onDragLeave:()=>Re(!1),onDrop:e=>{e.preventDefault(),Re(!1),ea(e.dataTransfer).then(m=>Ue(m))},style:{padding:8,flex:"1 1 auto",minHeight:0,overflow:"auto",outline:Ge?"2px dashed var(--brass-500)":"none",outlineOffset:-4},children:[t.jsx(kt,{label:"Staged",changed:(L==null?void 0:L.staged)??[],selected:B==="staged"?T:"",onSelect:dt,view:H,onView:ee,emptyText:"Tak ada file staged."}),t.jsx("div",{style:{borderTop:"1px solid var(--border-hair)",margin:"6px 0"}}),t.jsx(kt,{label:"Changed",changed:(L==null?void 0:L.unstaged)??[],selected:B==="unstaged"?T:"",onSelect:We,view:ce,onView:f,emptyText:"Tak ada file berubah."}),t.jsxs("div",{className:"hn-eyebrow",style:{padding:"6px 8px",marginTop:8,borderTop:"1px solid var(--border-hair)"},children:["Files · ",i||"working tree"]}),I==="loading"?t.jsx(J,{kind:"loading",compact:!0,title:"Memuat file…"}):I==="error"?t.jsx(J,{kind:"error",compact:!0,title:"Gagal memuat file",action:fe}):c.length===0?t.jsx(J,{kind:"empty",compact:!0,icon:"folder-open",title:"Tak ada file"}):Tt(c,d).map(e=>t.jsx(Mt,{node:e,selected:B==="file"?T:"",onSelect:tt,dirSelected:pe,onSelectDir:_e,ignored:E,onExpand:w?ct:void 0},e.path))]})]})},{id:"viewer",label:"Viewer",className:"hn-panel-flex",content:t.jsxs(je,{padding:0,fill:!0,children:[t.jsxs("div",{style:{flex:"0 0 auto",display:"flex",alignItems:"center",gap:12,padding:"10px 16px",borderBottom:"1px solid var(--border-hair)",flexWrap:"wrap"},children:[t.jsx(He,{name:"file-text",size:15,color:"var(--text-muted)"}),t.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:13,color:"var(--text-strong)"},children:T||"—"}),!Ie&&(A==null?void 0:A.truncated)&&t.jsx(re,{tone:"warn",size:"sm",children:"terpotong"}),Ie&&(z==null?void 0:z.status)&&t.jsx(re,{tone:z.status==="D"?"err":z.status==="A"?"ok":"brass",size:"sm",children:z.status}),t.jsx("span",{style:{flex:1}}),Ie?t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[ve&&t.jsx(O,{size:"sm",variant:"secondary",leftIcon:"book-open",onClick:()=>ze(!0),children:"Preview lebar"}),t.jsx("div",{style:{display:"flex",gap:2,background:"var(--bone-100)",borderRadius:"var(--radius-pill)",padding:2},children:["diff","source"].map(e=>t.jsx("button",{onClick:()=>Ne(e),style:{padding:"4px 12px",border:"none",cursor:"pointer",borderRadius:"var(--radius-pill)",fontSize:12,textTransform:"capitalize",background:me===e?"var(--surface-card)":"transparent",color:me===e?"var(--text-strong)":"var(--text-muted)",fontWeight:me===e?600:400},children:e},e))})]}):x==="view"?t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[A&&!A.binary&&qe(T)&&t.jsx("div",{style:{display:"flex",gap:2,background:"var(--bone-100)",borderRadius:"var(--radius-pill)",padding:2},children:["preview","source"].map(e=>t.jsx("button",{onClick:()=>V(e),style:{padding:"4px 12px",border:"none",cursor:"pointer",borderRadius:"var(--radius-pill)",fontSize:12,background:j===e?"var(--surface-card)":"transparent",color:j===e?"var(--text-strong)":"var(--text-muted)",fontWeight:j===e?600:400},children:e==="preview"?"Preview":"Source"},e))}),ve&&t.jsx(O,{size:"sm",variant:"secondary",leftIcon:"book-open",onClick:()=>ze(!0),children:"Preview lebar"}),t.jsx(Ct,{href:e=>M.ideFileDownloadUrl(r,T,i,e),disabled:!A||A.binary}),t.jsx(O,{size:"sm",variant:"secondary",leftIcon:"pencil",onClick:oe,disabled:!A||A.binary,children:"Edit"})]}):t.jsxs("div",{style:{display:"flex",gap:8},children:[t.jsx(O,{size:"sm",variant:"ghost",onClick:()=>G("view"),children:"Batal"}),t.jsx(O,{size:"sm",leftIcon:"check",onClick:at,children:"Simpan"})]})]}),t.jsx("div",{"data-testid":"doc-preview-scroll",style:{flex:"1 1 auto",minHeight:0,overflow:"auto"},children:Ie?T?z===null?t.jsx(J,{kind:"loading",title:"Memuat…",hint:T}):z.binary?t.jsx(J,{kind:"empty",icon:"file",title:"Berkas biner",hint:T}):me==="diff"?t.jsxs("div",{style:{padding:"10px 0"},children:[t.jsx(Ot,{diff:z.diff??""}),z.truncated&&t.jsx("div",{style:{padding:"8px 12px",fontSize:11,color:"var(--text-subtle)"},children:"… dipotong pada 256 KB."})]}):z.content===null?t.jsx(J,{kind:"empty",icon:"trash-2",title:"File dihapus",hint:"Tak ada isi untuk ditampilkan."}):t.jsx("pre",{style:{margin:0,padding:"12px 16px",fontFamily:"var(--font-mono)",fontSize:12.5,lineHeight:1.6,whiteSpace:"pre-wrap",wordBreak:"break-word",color:"var(--text-body)"},children:z.content}):t.jsx(J,{kind:"empty",icon:"file-text",title:"Pilih file dari Staged/Changed"}):T?A===null?t.jsx(J,{kind:"loading",title:"Memuat…",hint:T}):A.binary?t.jsx(J,{kind:"empty",icon:"file",title:"File biner",hint:T}):x==="edit"?t.jsx("textarea",{value:D,onChange:e=>W(e.target.value),spellCheck:!1,style:{width:"100%",minHeight:"clamp(240px, 50dvh, 560px)",boxSizing:"border-box",resize:"vertical",border:"none",outline:"none",padding:"16px 18px",fontFamily:"var(--font-mono)",fontSize:12.5,lineHeight:1.7,color:"var(--text-body)",background:"var(--surface-card)"}}):qe(T)&&j==="preview"?t.jsx("div",{style:{padding:"16px 20px"},children:t.jsx(Nt,{text:A.content??"",name:T})}):t.jsx("pre",{style:{margin:0,padding:"16px 18px",overflow:"auto"},children:t.jsx("code",{className:"hljs",style:{fontFamily:"var(--font-mono)",fontSize:12.5,lineHeight:1.7},dangerouslySetInnerHTML:{__html:Oe}})}):t.jsx(J,{kind:"empty",icon:"file-text",title:"Pilih file dari pohon di kiri"})})]})}]}):b==="graph"?t.jsx(Hn,{projectId:r,onRunGit:Be,onMerge:Pe,onRebase:e=>Te("rebase",e),onPull:e=>Te("pull",e),onDrop:e=>Te("drop",e),onOpenFile:(e,m)=>{N(m),tt(e),v("explorer")}}):b==="branches"?t.jsx(Zn,{projectId:r,onOpenWorktree:e=>{k(e.split("/").pop()??""),v("worktrees")}}):t.jsx(Xn,{projectId:r,focus:_,onOpenBranch:()=>v("branches")}),Je&&ve&&t.jsx(en,{path:T,text:ve.text,eyebrow:i||(L==null?void 0:L.branch)||r,download:ve.download,onClose:()=>ze(!1)}),de&&t.jsx(Qe,{open:!0,title:de.mode==="dir"?"Folder baru":de.mode==="file"?"Berkas baru":"Ganti nama",eyebrow:de.mode==="rename"?void 0:`→ ${pe||"root"}`,onClose:()=>ge(null),width:460,footer:t.jsxs(t.Fragment,{children:[t.jsx(O,{size:"sm",variant:"ghost",onClick:()=>ge(null),children:"Batal"}),t.jsx(O,{size:"sm",leftIcon:"check",disabled:!de.value.trim(),onClick:()=>{const e=de;ge(null),e.mode==="rename"?Ke(e.value):mt(e.mode,e.value)},children:"Simpan"})]}),children:t.jsx(ot,{size:"sm",autoFocus:!0,value:de.value,"aria-label":de.mode==="dir"?"Nama folder":de.mode==="file"?"Nama berkas":"Path baru",placeholder:de.mode==="dir"?"komponen":"Baru.tsx",onChange:e=>ge({...de,value:e.target.value}),style:{width:"100%"}})}),ae&&t.jsxs(Qe,{open:!0,title:`${ae.files.length} berkas sudah ada`,onClose:()=>Ee(null),width:520,footer:t.jsxs(t.Fragment,{children:[t.jsx(O,{size:"sm",variant:"ghost",onClick:()=>Ee(null),children:"Biarkan"}),t.jsx(O,{size:"sm",leftIcon:"alert-triangle",onClick:()=>{const e=ae.files;Ee(null),Ue(e,!0)},children:"Timpa semua"})]}),children:[t.jsx("div",{style:{fontSize:12.5,color:"var(--text-muted)",marginBottom:10},children:"Berkas berikut dilewati supaya perubahan yang belum di-commit tak hilang."}),t.jsx("pre",{style:{margin:0,fontFamily:"var(--font-mono)",fontSize:12,maxHeight:220,overflow:"auto"},children:ae.files.map(e=>Fe(e.path)).join(`
|
|
2
|
+
`)})]}),t.jsx(At,{open:!!ne,title:(ne==null?void 0:ne.kind)==="dir"?"Hapus folder beserta isinya?":"Hapus berkas?",eyebrow:ne==null?void 0:ne.path,message:(ne==null?void 0:ne.kind)==="dir"?"Seluruh isi folder ini hilang. Yang belum di-commit tak bisa dikembalikan.":"Yang belum di-commit tak bisa dikembalikan.",requireText:(ne==null?void 0:ne.kind)==="dir"?ne.path.split("/").pop():void 0,onConfirm:()=>void gt(),onCancel:()=>te(null)}),$&&t.jsx(na,{msg:$.msg,onForce:nt,onCancel:()=>F(null)}),he&&t.jsx(aa,{projectId:r,onClose:()=>Le(!1)})]})}export{ua as IdeScreen};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{h as E,e as b,t as se,q as ne,j as e,f as H,ac as L,B as m,a as u,I as ie,S as Y,R as le,x as J,p as re,d as $,w as oe,D as ce,ad as de,ak as ue}from"./index-DSFIYjSl.js";import{R as c}from"./react-DfGhg7ZW.js";import{L as pe}from"./live-BhsIWS2g.js";import"./markdown-CWEY34jk.js";const me=5e3,z=20;function U({total:a,page:r,onPage:s,unit:o}){const n=ce(a,r,z);return e.jsx(oe,{page:n.page,pageCount:n.pageCount,total:a,from:n.from,to:n.to,onPage:s,unit:o})}function Q(a,r=Date.now()){if(!a)return"—";const s=Math.max(0,r-new Date(a).getTime()),o=Math.floor(s/6e4);if(o<1)return"baru saja";if(o<60)return`${o}m`;const n=Math.floor(o/60);return n<24?`${n}j`:`${Math.floor(n/24)}h`}const xe={tinggi:"ok",sedang:"neutral",ragu:"warn"},ge={berlaku:"ok",ditimpa:"warn",dibatalkan:"neutral",gagal:"err"},he={answer:"jawaban",order:"urutan kerja",collision:"tabrakan area",quality:"mutu hasil",refusal:"tindakan ditolak"},je={contract:"kontrak",detected:"deteksi otomatis",pulse:"denyut"},be={menunggu:"warn",sebagian:"info",selesai:"ok",dibatalkan:"neutral"},ke=new Set(["menunggu","sebagian"]),fe={tunggal:"sekali jalan",submit:"di-submit",operator:"dibatalkan operator",kedaluwarsa:"kedaluwarsa"};function G({children:a}){return e.jsx("div",{className:"hn-dense-row",style:{display:"flex",alignItems:"center",gap:10,padding:"10px 12px",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",background:"var(--surface-card)",marginBottom:6},children:a})}function ve({title:a,count:r,empty:s,children:o}){return e.jsx(L,{eyebrow:`lead · ${a.toLowerCase()}`,title:`${a} (${r})`,children:r===0?e.jsx("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-subtle)"},children:s}):o})}function ye({cfg:a,onWrite:r,busy:s}){var n;const o=(i,p)=>Math.max(p,Number(i)||p);return e.jsxs(L,{eyebrow:"lead · kendali",title:"hanoman-lead",children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap",marginBottom:12},children:[e.jsx(m,{tone:a.enabled?a.paused?"warn":"ok":"neutral",children:a.enabled?a.paused?"dijeda":"aktif":"mati"}),a.enabled?e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"ban",disabled:s,onClick:()=>r({...a,enabled:!1,paused:!1}),children:"Matikan"}):e.jsx(u,{size:"sm",leftIcon:"play",disabled:s,onClick:()=>r({...a,enabled:!0}),children:"Nyalakan"}),a.enabled&&(a.paused?e.jsx(u,{size:"sm",leftIcon:"play",disabled:s,onClick:()=>r({...a,paused:!1}),children:"Lanjutkan"}):e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"pause",disabled:s,onClick:()=>r({...a,paused:!0}),children:"Pause"}))]}),e.jsxs("div",{style:{display:"flex",gap:14,flexWrap:"wrap",alignItems:"center"},children:[e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:6,fontSize:"var(--text-xs)"},children:["denyut tiap",e.jsx($,{type:"number",min:1,style:{width:76},"aria-label":"denyut lead (menit)",placeholder:"5",value:String(a.everyMin),disabled:s,onChange:i=>r({...a,everyMin:o(i.target.value,1)})}),"menit"]}),e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:6,fontSize:"var(--text-xs)"},children:["batas waktu putusan",e.jsx($,{type:"number",min:10,style:{width:84},"aria-label":"batas waktu putusan (detik)",placeholder:"600",value:String(a.timeoutSec),disabled:s,onChange:i=>r({...a,timeoutSec:o(i.target.value,10)})}),"detik"]}),e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:6,fontSize:"var(--text-xs)"},children:["maks jawaban otomatis/sesi",e.jsx($,{type:"number",min:1,style:{width:76},"aria-label":"maksimum jawaban otomatis per sesi",placeholder:"3",value:String(a.maxAutoAnswers),disabled:s,onChange:i=>r({...a,maxAutoAnswers:o(i.target.value,1)})})]}),e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:6,fontSize:"var(--text-xs)"},children:["syarat sebelum integrasi ke main",e.jsx(Y,{size:"sm","aria-label":"syarat sebelum integrasi ke main",value:a.requireGreenBeforeIntegrate?"wajib":"bebas",disabled:s,onChange:i=>r({...a,requireGreenBeforeIntegrate:i.target.value==="wajib"}),options:[{value:"wajib",label:"plan tuntas"},{value:"bebas",label:"tanpa syarat"}]})]})]}),e.jsxs("div",{"data-testid":"lead-engine-line",style:{fontSize:"var(--text-xs)",color:"var(--text-subtle)",marginTop:10},children:["mesin: ",(n=a.engine)!=null&&n.enabled?e.jsxs(e.Fragment,{children:[a.engine.agent==="codex"?"Codex CLI":"Claude Code"," · ",e.jsx("code",{children:a.engine.model})," · ",e.jsx("code",{children:a.engine.effort})]}):e.jsx(e.Fragment,{children:"ikut default global · atur di Settings → Model sesi"})]}),e.jsx("div",{style:{fontSize:"var(--text-xs)",color:"var(--text-subtle)",marginTop:6},children:"Lead memutuskan lalu melapor. Produksi/VPS dan penghapusan data terkunci secara teknis — apa pun setelannya."})]})}function we({options:a,multi:r,value:s,onChange:o}){const n=i=>{if(!r){o([i]);return}o(s.includes(i)?s.filter(p=>p!==i):[...s,i])};return e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:6},children:a.map(i=>r?e.jsx(de,{checked:s.includes(i),label:i,onChange:()=>n(i)},i):e.jsx(ue,{checked:s.includes(i),label:i,onChange:()=>n(i)},i))})}function Se({d:a,onOverride:r,onCancel:s,busyId:o}){var C;const[n,i]=c.useState(!1),[p,w]=c.useState(""),[v,S]=c.useState([]),h=(a.choices??[]).length>0?a.choices:a.choiceIndex!=null&&a.choice?[{index:a.choiceIndex,option:a.choice}]:[],k=a.options??[],y=((C=a.select)==null?void 0:C.mode)==="multi";return e.jsxs("div",{style:{padding:"10px 12px",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",background:"var(--surface-card)",marginBottom:6},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap"},children:[e.jsx(m,{tone:ge[a.status]??"neutral",size:"sm",children:a.status}),e.jsx(m,{tone:xe[a.confidence]??"neutral",size:"sm",children:a.confidence}),e.jsx(m,{tone:"neutral",size:"sm",children:he[a.kind]??a.kind}),e.jsx(m,{tone:"neutral",size:"sm",children:je[a.gate]??a.gate}),a.weighty&&e.jsx(m,{tone:"warn",size:"sm",children:"berbobot"}),h.length>0&&k.length>0&&e.jsx(m,{tone:"brass",size:"sm",children:h.length>1?`${h.length} dari ${k.length} opsi`:`opsi ${h[0].index}/${k.length}`}),(a.missing??[]).length>0&&e.jsx(m,{tone:"warn",size:"sm",children:"kurang konteks"}),e.jsx("span",{style:{flex:1}}),e.jsx("span",{style:{fontSize:"var(--text-xs)",color:"var(--text-muted)"},children:Q(a.createdAt)})]}),e.jsx("div",{style:{marginTop:6,fontSize:"var(--text-sm)",color:"var(--text-subtle)",whiteSpace:"pre-wrap"},children:a.question.slice(0,400)}),e.jsx("div",{style:{marginTop:4,color:"var(--text-strong)",fontWeight:500,whiteSpace:"pre-wrap"},children:h.length?h.map(j=>j.option).join(" · "):a.answer||e.jsx("em",{style:{fontWeight:400,color:"var(--text-muted)"},children:"tak ada jawaban"})}),e.jsx("div",{style:{marginTop:4,fontSize:"var(--text-xs)",color:"var(--text-subtle)",whiteSpace:"pre-wrap"},children:a.reason}),a.refs.length>0&&e.jsx("div",{style:{marginTop:6,display:"flex",gap:6,flexWrap:"wrap"},children:a.refs.map(j=>e.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--text-xs)",color:"var(--text-muted)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",padding:"1px 6px"},children:j},j))}),(a.missing??[]).length>0&&e.jsxs("div",{style:{marginTop:6,fontSize:"var(--text-xs)",color:"var(--text-subtle)"},children:["Yang kurang: ",a.missing.join(" · ")]}),e.jsxs("div",{style:{marginTop:8,display:"flex",gap:8,alignItems:"center",flexWrap:"wrap"},children:[e.jsxs("span",{style:{fontSize:"var(--text-xs)",color:"var(--text-muted)",fontFamily:"var(--font-mono)"},children:[a.projectId,a.specId?` · ${a.specId}`:"",a.sessionId?` · ${a.sessionId}`:"",a.action!=="none"?` · ${a.action}`:""]}),e.jsx("span",{style:{flex:1}}),a.status==="berlaku"&&!n&&e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"edit-3",onClick:()=>i(!0),children:"Timpa"}),a.status==="berlaku"&&e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"x-circle",disabled:o===a.id,onClick:()=>s(a.id),children:"Batalkan"})]}),n&&e.jsxs("div",{style:{marginTop:8,display:"flex",flexDirection:"column",gap:8},children:[k.length>0&&e.jsx(we,{options:k,multi:y,value:v,onChange:S}),e.jsxs("div",{style:{display:"flex",gap:8},children:[e.jsx($,{style:{flex:1},"aria-label":`jawaban operator untuk ${a.id}`,placeholder:"mis. pilih opsi 2, pakai Node 22",value:p,onChange:j=>w(j.target.value)}),e.jsx(u,{size:"sm",leftIcon:"check",disabled:!p.trim()&&v.length===0||o===a.id,onClick:()=>{r(a.id,p.trim()||v.join("; "),v),i(!1),w(""),S([])},children:"Simpan"})]})]})]})}function Pe({projects:a,onProjectChanged:r,onToast:s,onGotoTerminal:o}){const[n,i]=c.useState(null),[p,w]=c.useState([]),[v,S]=c.useState([]),[h,k]=c.useState(0),[y,C]=E("lead","decPage",1,J),[j,M]=c.useState(0),[P,N]=E("lead","flowPage",1,J),[q,B]=c.useState("loading"),[O,T]=c.useState(!1),[I,f]=c.useState(null),[x,X]=E("lead","filter","all",re),d=c.useCallback((t=!1)=>{t||B("loading"),Promise.all([b.getLeadStatus(),b.getLeadDecisions({projectId:x==="all"?void 0:x,page:y,limit:z}),b.getLeadFlows({projectId:x==="all"?void 0:x,page:P,limit:z}).catch(()=>({items:[],total:0,page:1,pageSize:z}))]).then(([l,g,D])=>{i(l),w(g.items??[]),k(g.total??0),S(D.items??[]),M(D.total??0),B("ready")}).catch(()=>{t||B("error")})},[x,y,P]);c.useEffect(()=>{d()},[d]),se(x,()=>{C(1),N(1)}),ne({topic:"lead",params:{projectId:x==="all"?void 0:x,decPage:y,flowPage:P,limit:z},apply:t=>{i(t.status),w(t.decisions.items),k(t.decisions.total),S(t.flows.items),M(t.flows.total),B("ready")},refetch:()=>d(!0),pollMs:me});const A=c.useCallback(async t=>{T(!0);try{await b.putLeadConfig(t),s("Setelan lead tersimpan","ok","save"),d(!0)}catch{s("Gagal menyimpan setelan lead","err","x-circle")}finally{T(!1)}},[d,s]),_=c.useCallback(async(t,l)=>{f(t);try{await b.updateProject(t,{leadOptIn:l}),await r(t),d(!0),s(l?"Project dipimpin lead":"Project dilepas dari lead","ok")}catch{s("Gagal mengubah opt-in","err","x-circle")}finally{f(null)}},[d,r,s]),W=c.useCallback(async(t,l)=>{if(!n)return;const g=new Set(n.config.pausedProjects);l?g.add(t):g.delete(t),await A({...n.config,pausedProjects:[...g]})},[n,A]),Z=c.useCallback(async(t,l,g=[])=>{f(t);try{const D=await b.overrideLeadDecision(t,l,"",g);s(D.delivered?"Jawaban kamu dikirim ke sesi":"Keputusan ditimpa","ok","check"),d(!0)}catch{s("Gagal menimpa keputusan","err","x-circle")}finally{f(null)}},[d,s]),K=c.useCallback(async(t,l)=>{f(t);try{await(l==="submit"?b.submitLeadFlow(t):b.cancelLeadFlow(t)),s(l==="submit"?"Rantai di-submit":"Rantai dibatalkan","ok","check"),d(!0)}catch{s("Gagal menutup rantai","err","x-circle")}finally{f(null)}},[d,s]),ee=c.useCallback(async t=>{f(t);try{await b.cancelLeadDecision(t),s("Keputusan dibatalkan","ok"),d(!0)}catch{s("Gagal membatalkan keputusan","err","x-circle")}finally{f(null)}},[d,s]);if(q==="loading")return e.jsx(H,{kind:"loading"});if(q==="error"||!n)return e.jsx(H,{kind:"error",hint:"Gagal memuat status lead.",action:()=>d(),actionLabel:"Coba lagi"});const F=new Set(n.projects.map(t=>t.projectId)),V=n.waiting,ae=new Set(n.deciding),te=new Set(n.queued??[]),R=n.gate??{inFlight:0,queued:0,capacity:1};return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:16,minHeight:0},children:[e.jsx(ye,{cfg:n.config,onWrite:A,busy:O}),e.jsxs(L,{eyebrow:"lead · project",title:"Project yang dipimpin",children:[e.jsx("div",{style:{fontSize:"var(--text-xs)",color:"var(--text-subtle)",marginBottom:10},children:"Lead hanya menyentuh project yang di-opt-in. Default mati."}),a.length===0?e.jsx("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-subtle)"},children:"Belum ada project."}):a.map(t=>{const l=n.projects.find(g=>g.projectId===t.id);return e.jsxs(G,{children:[e.jsx("span",{style:{flex:1,minWidth:0,color:"var(--text-strong)",fontWeight:500},children:t.name}),l&&e.jsxs("span",{style:{fontSize:"var(--text-xs)",color:"var(--text-muted)"},children:[l.decisions24h," keputusan/24j · ",l.openSessions," sesi"]}),e.jsx(m,{tone:F.has(t.id)?l!=null&&l.paused?"warn":"ok":"neutral",size:"sm",children:F.has(t.id)?l!=null&&l.paused?"dijeda":"dipimpin":"mati"}),F.has(t.id)&&(l!=null&&l.paused?e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"play",disabled:O,onClick:()=>W(t.id,!1),children:"Lanjutkan"}):e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"pause",disabled:O,onClick:()=>W(t.id,!0),children:"Pause"})),F.has(t.id)?e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"ban",disabled:I===t.id,onClick:()=>_(t.id,!1),children:"Lepas"}):e.jsx(u,{size:"sm",leftIcon:"check",disabled:I===t.id,onClick:()=>_(t.id,!0),children:"Pimpin"})]},t.id)})]}),e.jsxs(ve,{title:"Sesi menunggu keputusan",count:V.length,empty:"Tak ada sesi yang menunggu keputusan.",children:[R.queued>0&&e.jsxs("div",{style:{fontSize:"var(--text-xs)",color:"var(--text-muted)",marginBottom:8},children:["Gerbang lead: ",R.inFlight,"/",R.capacity," diputuskan · ",R.queued," antre menunggu slot."]}),V.map(t=>{const l=ae.has(t)?"sedang diputuskan":te.has(t)?"antre":"menunggu";return e.jsxs(G,{children:[e.jsx(ie,{name:l==="sedang diputuskan"?"loader":l==="antre"?"clock":"help-circle"}),e.jsx("span",{style:{flex:1,fontFamily:"var(--font-mono)",color:"var(--text-strong)"},children:t}),e.jsx(m,{tone:l==="menunggu"?"warn":"ok",size:"sm",children:l}),e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"terminal",onClick:()=>o(t),children:"Ambil alih"})]},t)})]}),e.jsxs(L,{eyebrow:"lead · rantai keputusan",title:`Rantai (${j})`,children:[v.length===0?e.jsx("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-subtle)"},children:"Belum ada rantai. Satu rantai adalah satu urusan — beberapa pertanyaan berurutan sampai di-submit."}):v.map(t=>e.jsxs(G,{children:[e.jsx(m,{tone:be[t.status]??"neutral",size:"sm",children:t.status}),e.jsx("span",{style:{flex:1,minWidth:0,color:"var(--text-strong)"},children:t.title}),e.jsxs("span",{style:{fontSize:"var(--text-xs)",color:"var(--text-muted)"},children:[t.steps," langkah · ",Q(t.openedAt),t.closeReason?` · ${fe[t.closeReason]??t.closeReason}`:""]}),ke.has(t.status)&&e.jsxs(e.Fragment,{children:[e.jsx(u,{size:"sm",leftIcon:"check",disabled:I===t.id,onClick:()=>K(t.id,"submit"),children:"Submit"}),e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"x-circle",disabled:I===t.id,onClick:()=>K(t.id,"cancel"),children:"Batalkan"})]})]},t.id)),e.jsx(U,{total:j,page:P,onPage:N,unit:"rantai"})]}),e.jsxs(L,{eyebrow:"lead · jejak keputusan",title:`Keputusan (${h})`,actions:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[e.jsx(Y,{size:"sm",value:x,"aria-label":"saring project",onChange:t=>X(t.target.value),options:[{value:"all",label:"semua project"},...a.map(t=>({value:t.id,label:t.name}))]}),e.jsx(le,{screen:"lead",active:x==="all"?0:1}),e.jsx(pe,{})]}),children:[p.length===0?e.jsx("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-subtle)"},children:"Belum ada keputusan. Lead menulis satu baris di sini setiap kali ia memutuskan."}):p.map(t=>e.jsx(Se,{d:t,onOverride:Z,onCancel:ee,busyId:I},t.id)),e.jsx(U,{total:h,page:y,onPage:C,unit:"keputusan"})]})]})}export{Pe as LeadScreen};
|
|
1
|
+
import{h as E,e as b,t as se,q as ne,j as e,f as H,ae as L,B as m,a as u,I as ie,S as Y,R as le,x as J,p as re,d as $,w as oe,D as ce,af as de,am as ue}from"./index-DI7G_sit.js";import{R as c}from"./react-DfGhg7ZW.js";import{L as pe}from"./live-DVDstDzi.js";import"./markdown-CWEY34jk.js";const me=5e3,z=20;function U({total:a,page:r,onPage:s,unit:o}){const n=ce(a,r,z);return e.jsx(oe,{page:n.page,pageCount:n.pageCount,total:a,from:n.from,to:n.to,onPage:s,unit:o})}function Q(a,r=Date.now()){if(!a)return"—";const s=Math.max(0,r-new Date(a).getTime()),o=Math.floor(s/6e4);if(o<1)return"baru saja";if(o<60)return`${o}m`;const n=Math.floor(o/60);return n<24?`${n}j`:`${Math.floor(n/24)}h`}const xe={tinggi:"ok",sedang:"neutral",ragu:"warn"},ge={berlaku:"ok",ditimpa:"warn",dibatalkan:"neutral",gagal:"err"},he={answer:"jawaban",order:"urutan kerja",collision:"tabrakan area",quality:"mutu hasil",refusal:"tindakan ditolak"},je={contract:"kontrak",detected:"deteksi otomatis",pulse:"denyut"},be={menunggu:"warn",sebagian:"info",selesai:"ok",dibatalkan:"neutral"},fe=new Set(["menunggu","sebagian"]),ke={tunggal:"sekali jalan",submit:"di-submit",operator:"dibatalkan operator",kedaluwarsa:"kedaluwarsa"};function G({children:a}){return e.jsx("div",{className:"hn-dense-row",style:{display:"flex",alignItems:"center",gap:10,padding:"10px 12px",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",background:"var(--surface-card)",marginBottom:6},children:a})}function ve({title:a,count:r,empty:s,children:o}){return e.jsx(L,{eyebrow:`lead · ${a.toLowerCase()}`,title:`${a} (${r})`,children:r===0?e.jsx("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-subtle)"},children:s}):o})}function ye({cfg:a,onWrite:r,busy:s}){var n;const o=(i,p)=>Math.max(p,Number(i)||p);return e.jsxs(L,{eyebrow:"lead · kendali",title:"hanoman-lead",children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap",marginBottom:12},children:[e.jsx(m,{tone:a.enabled?a.paused?"warn":"ok":"neutral",children:a.enabled?a.paused?"dijeda":"aktif":"mati"}),a.enabled?e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"ban",disabled:s,onClick:()=>r({...a,enabled:!1,paused:!1}),children:"Matikan"}):e.jsx(u,{size:"sm",leftIcon:"play",disabled:s,onClick:()=>r({...a,enabled:!0}),children:"Nyalakan"}),a.enabled&&(a.paused?e.jsx(u,{size:"sm",leftIcon:"play",disabled:s,onClick:()=>r({...a,paused:!1}),children:"Lanjutkan"}):e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"pause",disabled:s,onClick:()=>r({...a,paused:!0}),children:"Pause"}))]}),e.jsxs("div",{style:{display:"flex",gap:14,flexWrap:"wrap",alignItems:"center"},children:[e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:6,fontSize:"var(--text-xs)"},children:["denyut tiap",e.jsx($,{type:"number",min:1,style:{width:76},"aria-label":"denyut lead (menit)",placeholder:"5",value:String(a.everyMin),disabled:s,onChange:i=>r({...a,everyMin:o(i.target.value,1)})}),"menit"]}),e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:6,fontSize:"var(--text-xs)"},children:["batas waktu putusan",e.jsx($,{type:"number",min:10,style:{width:84},"aria-label":"batas waktu putusan (detik)",placeholder:"600",value:String(a.timeoutSec),disabled:s,onChange:i=>r({...a,timeoutSec:o(i.target.value,10)})}),"detik"]}),e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:6,fontSize:"var(--text-xs)"},children:["maks jawaban otomatis/sesi",e.jsx($,{type:"number",min:1,style:{width:76},"aria-label":"maksimum jawaban otomatis per sesi",placeholder:"3",value:String(a.maxAutoAnswers),disabled:s,onChange:i=>r({...a,maxAutoAnswers:o(i.target.value,1)})})]}),e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:6,fontSize:"var(--text-xs)"},children:["syarat sebelum integrasi ke main",e.jsx(Y,{size:"sm","aria-label":"syarat sebelum integrasi ke main",value:a.requireGreenBeforeIntegrate?"wajib":"bebas",disabled:s,onChange:i=>r({...a,requireGreenBeforeIntegrate:i.target.value==="wajib"}),options:[{value:"wajib",label:"plan tuntas"},{value:"bebas",label:"tanpa syarat"}]})]})]}),e.jsxs("div",{"data-testid":"lead-engine-line",style:{fontSize:"var(--text-xs)",color:"var(--text-subtle)",marginTop:10},children:["mesin: ",(n=a.engine)!=null&&n.enabled?e.jsxs(e.Fragment,{children:[a.engine.agent==="codex"?"Codex CLI":"Claude Code"," · ",e.jsx("code",{children:a.engine.model})," · ",e.jsx("code",{children:a.engine.effort})]}):e.jsx(e.Fragment,{children:"ikut default global · atur di Settings → Model sesi"})]}),e.jsx("div",{style:{fontSize:"var(--text-xs)",color:"var(--text-subtle)",marginTop:6},children:"Lead memutuskan lalu melapor. Produksi/VPS dan penghapusan data terkunci secara teknis — apa pun setelannya."})]})}function we({options:a,multi:r,value:s,onChange:o}){const n=i=>{if(!r){o([i]);return}o(s.includes(i)?s.filter(p=>p!==i):[...s,i])};return e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:6},children:a.map(i=>r?e.jsx(de,{checked:s.includes(i),label:i,onChange:()=>n(i)},i):e.jsx(ue,{checked:s.includes(i),label:i,onChange:()=>n(i)},i))})}function Se({d:a,onOverride:r,onCancel:s,busyId:o}){var C;const[n,i]=c.useState(!1),[p,w]=c.useState(""),[v,S]=c.useState([]),h=(a.choices??[]).length>0?a.choices:a.choiceIndex!=null&&a.choice?[{index:a.choiceIndex,option:a.choice}]:[],f=a.options??[],y=((C=a.select)==null?void 0:C.mode)==="multi";return e.jsxs("div",{style:{padding:"10px 12px",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",background:"var(--surface-card)",marginBottom:6},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap"},children:[e.jsx(m,{tone:ge[a.status]??"neutral",size:"sm",children:a.status}),e.jsx(m,{tone:xe[a.confidence]??"neutral",size:"sm",children:a.confidence}),e.jsx(m,{tone:"neutral",size:"sm",children:he[a.kind]??a.kind}),e.jsx(m,{tone:"neutral",size:"sm",children:je[a.gate]??a.gate}),a.weighty&&e.jsx(m,{tone:"warn",size:"sm",children:"berbobot"}),h.length>0&&f.length>0&&e.jsx(m,{tone:"brass",size:"sm",children:h.length>1?`${h.length} dari ${f.length} opsi`:`opsi ${h[0].index}/${f.length}`}),(a.missing??[]).length>0&&e.jsx(m,{tone:"warn",size:"sm",children:"kurang konteks"}),e.jsx("span",{style:{flex:1}}),e.jsx("span",{style:{fontSize:"var(--text-xs)",color:"var(--text-muted)"},children:Q(a.createdAt)})]}),e.jsx("div",{style:{marginTop:6,fontSize:"var(--text-sm)",color:"var(--text-subtle)",whiteSpace:"pre-wrap"},children:a.question.slice(0,400)}),e.jsx("div",{style:{marginTop:4,color:"var(--text-strong)",fontWeight:500,whiteSpace:"pre-wrap"},children:h.length?h.map(j=>j.option).join(" · "):a.answer||e.jsx("em",{style:{fontWeight:400,color:"var(--text-muted)"},children:"tak ada jawaban"})}),e.jsx("div",{style:{marginTop:4,fontSize:"var(--text-xs)",color:"var(--text-subtle)",whiteSpace:"pre-wrap"},children:a.reason}),a.refs.length>0&&e.jsx("div",{style:{marginTop:6,display:"flex",gap:6,flexWrap:"wrap"},children:a.refs.map(j=>e.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--text-xs)",color:"var(--text-muted)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",padding:"1px 6px"},children:j},j))}),(a.missing??[]).length>0&&e.jsxs("div",{style:{marginTop:6,fontSize:"var(--text-xs)",color:"var(--text-subtle)"},children:["Yang kurang: ",a.missing.join(" · ")]}),e.jsxs("div",{style:{marginTop:8,display:"flex",gap:8,alignItems:"center",flexWrap:"wrap"},children:[e.jsxs("span",{style:{fontSize:"var(--text-xs)",color:"var(--text-muted)",fontFamily:"var(--font-mono)"},children:[a.projectId,a.specId?` · ${a.specId}`:"",a.sessionId?` · ${a.sessionId}`:"",a.action!=="none"?` · ${a.action}`:""]}),e.jsx("span",{style:{flex:1}}),a.status==="berlaku"&&!n&&e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"edit-3",onClick:()=>i(!0),children:"Timpa"}),a.status==="berlaku"&&e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"x-circle",disabled:o===a.id,onClick:()=>s(a.id),children:"Batalkan"})]}),n&&e.jsxs("div",{style:{marginTop:8,display:"flex",flexDirection:"column",gap:8},children:[f.length>0&&e.jsx(we,{options:f,multi:y,value:v,onChange:S}),e.jsxs("div",{style:{display:"flex",gap:8},children:[e.jsx($,{style:{flex:1},"aria-label":`jawaban operator untuk ${a.id}`,placeholder:"mis. pilih opsi 2, pakai Node 22",value:p,onChange:j=>w(j.target.value)}),e.jsx(u,{size:"sm",leftIcon:"check",disabled:!p.trim()&&v.length===0||o===a.id,onClick:()=>{r(a.id,p.trim()||v.join("; "),v),i(!1),w(""),S([])},children:"Simpan"})]})]})]})}function Pe({projects:a,onProjectChanged:r,onToast:s,onGotoTerminal:o}){const[n,i]=c.useState(null),[p,w]=c.useState([]),[v,S]=c.useState([]),[h,f]=c.useState(0),[y,C]=E("lead","decPage",1,J),[j,M]=c.useState(0),[P,N]=E("lead","flowPage",1,J),[q,B]=c.useState("loading"),[O,T]=c.useState(!1),[I,k]=c.useState(null),[x,X]=E("lead","filter","all",re),d=c.useCallback((t=!1)=>{t||B("loading"),Promise.all([b.getLeadStatus(),b.getLeadDecisions({projectId:x==="all"?void 0:x,page:y,limit:z}),b.getLeadFlows({projectId:x==="all"?void 0:x,page:P,limit:z}).catch(()=>({items:[],total:0,page:1,pageSize:z}))]).then(([l,g,D])=>{i(l),w(g.items??[]),f(g.total??0),S(D.items??[]),M(D.total??0),B("ready")}).catch(()=>{t||B("error")})},[x,y,P]);c.useEffect(()=>{d()},[d]),se(x,()=>{C(1),N(1)}),ne({topic:"lead",params:{projectId:x==="all"?void 0:x,decPage:y,flowPage:P,limit:z},apply:t=>{i(t.status),w(t.decisions.items),f(t.decisions.total),S(t.flows.items),M(t.flows.total),B("ready")},refetch:()=>d(!0),pollMs:me});const A=c.useCallback(async t=>{T(!0);try{await b.putLeadConfig(t),s("Setelan lead tersimpan","ok","save"),d(!0)}catch{s("Gagal menyimpan setelan lead","err","x-circle")}finally{T(!1)}},[d,s]),_=c.useCallback(async(t,l)=>{k(t);try{await b.updateProject(t,{leadOptIn:l}),await r(t),d(!0),s(l?"Project dipimpin lead":"Project dilepas dari lead","ok")}catch{s("Gagal mengubah opt-in","err","x-circle")}finally{k(null)}},[d,r,s]),W=c.useCallback(async(t,l)=>{if(!n)return;const g=new Set(n.config.pausedProjects);l?g.add(t):g.delete(t),await A({...n.config,pausedProjects:[...g]})},[n,A]),Z=c.useCallback(async(t,l,g=[])=>{k(t);try{const D=await b.overrideLeadDecision(t,l,"",g);s(D.delivered?"Jawaban kamu dikirim ke sesi":"Keputusan ditimpa","ok","check"),d(!0)}catch{s("Gagal menimpa keputusan","err","x-circle")}finally{k(null)}},[d,s]),K=c.useCallback(async(t,l)=>{k(t);try{await(l==="submit"?b.submitLeadFlow(t):b.cancelLeadFlow(t)),s(l==="submit"?"Rantai di-submit":"Rantai dibatalkan","ok","check"),d(!0)}catch{s("Gagal menutup rantai","err","x-circle")}finally{k(null)}},[d,s]),ee=c.useCallback(async t=>{k(t);try{await b.cancelLeadDecision(t),s("Keputusan dibatalkan","ok"),d(!0)}catch{s("Gagal membatalkan keputusan","err","x-circle")}finally{k(null)}},[d,s]);if(q==="loading")return e.jsx(H,{kind:"loading"});if(q==="error"||!n)return e.jsx(H,{kind:"error",hint:"Gagal memuat status lead.",action:()=>d(),actionLabel:"Coba lagi"});const F=new Set(n.projects.map(t=>t.projectId)),V=n.waiting,ae=new Set(n.deciding),te=new Set(n.queued??[]),R=n.gate??{inFlight:0,queued:0,capacity:1};return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:16,minHeight:0},children:[e.jsx(ye,{cfg:n.config,onWrite:A,busy:O}),e.jsxs(L,{eyebrow:"lead · project",title:"Project yang dipimpin",children:[e.jsx("div",{style:{fontSize:"var(--text-xs)",color:"var(--text-subtle)",marginBottom:10},children:"Lead hanya menyentuh project yang di-opt-in. Default mati."}),a.length===0?e.jsx("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-subtle)"},children:"Belum ada project."}):a.map(t=>{const l=n.projects.find(g=>g.projectId===t.id);return e.jsxs(G,{children:[e.jsx("span",{style:{flex:1,minWidth:0,color:"var(--text-strong)",fontWeight:500},children:t.name}),l&&e.jsxs("span",{style:{fontSize:"var(--text-xs)",color:"var(--text-muted)"},children:[l.decisions24h," keputusan/24j · ",l.openSessions," sesi"]}),e.jsx(m,{tone:F.has(t.id)?l!=null&&l.paused?"warn":"ok":"neutral",size:"sm",children:F.has(t.id)?l!=null&&l.paused?"dijeda":"dipimpin":"mati"}),F.has(t.id)&&(l!=null&&l.paused?e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"play",disabled:O,onClick:()=>W(t.id,!1),children:"Lanjutkan"}):e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"pause",disabled:O,onClick:()=>W(t.id,!0),children:"Pause"})),F.has(t.id)?e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"ban",disabled:I===t.id,onClick:()=>_(t.id,!1),children:"Lepas"}):e.jsx(u,{size:"sm",leftIcon:"check",disabled:I===t.id,onClick:()=>_(t.id,!0),children:"Pimpin"})]},t.id)})]}),e.jsxs(ve,{title:"Sesi menunggu keputusan",count:V.length,empty:"Tak ada sesi yang menunggu keputusan.",children:[R.queued>0&&e.jsxs("div",{style:{fontSize:"var(--text-xs)",color:"var(--text-muted)",marginBottom:8},children:["Gerbang lead: ",R.inFlight,"/",R.capacity," diputuskan · ",R.queued," antre menunggu slot."]}),V.map(t=>{const l=ae.has(t)?"sedang diputuskan":te.has(t)?"antre":"menunggu";return e.jsxs(G,{children:[e.jsx(ie,{name:l==="sedang diputuskan"?"loader":l==="antre"?"clock":"help-circle"}),e.jsx("span",{style:{flex:1,fontFamily:"var(--font-mono)",color:"var(--text-strong)"},children:t}),e.jsx(m,{tone:l==="menunggu"?"warn":"ok",size:"sm",children:l}),e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"terminal",onClick:()=>o(t),children:"Ambil alih"})]},t)})]}),e.jsxs(L,{eyebrow:"lead · rantai keputusan",title:`Rantai (${j})`,children:[v.length===0?e.jsx("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-subtle)"},children:"Belum ada rantai. Satu rantai adalah satu urusan — beberapa pertanyaan berurutan sampai di-submit."}):v.map(t=>e.jsxs(G,{children:[e.jsx(m,{tone:be[t.status]??"neutral",size:"sm",children:t.status}),e.jsx("span",{style:{flex:1,minWidth:0,color:"var(--text-strong)"},children:t.title}),e.jsxs("span",{style:{fontSize:"var(--text-xs)",color:"var(--text-muted)"},children:[t.steps," langkah · ",Q(t.openedAt),t.closeReason?` · ${ke[t.closeReason]??t.closeReason}`:""]}),fe.has(t.status)&&e.jsxs(e.Fragment,{children:[e.jsx(u,{size:"sm",leftIcon:"check",disabled:I===t.id,onClick:()=>K(t.id,"submit"),children:"Submit"}),e.jsx(u,{size:"sm",variant:"ghost",leftIcon:"x-circle",disabled:I===t.id,onClick:()=>K(t.id,"cancel"),children:"Batalkan"})]})]},t.id)),e.jsx(U,{total:j,page:P,onPage:N,unit:"rantai"})]}),e.jsxs(L,{eyebrow:"lead · jejak keputusan",title:`Keputusan (${h})`,actions:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[e.jsx(Y,{size:"sm",value:x,"aria-label":"saring project",onChange:t=>X(t.target.value),options:[{value:"all",label:"semua project"},...a.map(t=>({value:t.id,label:t.name}))]}),e.jsx(le,{screen:"lead",active:x==="all"?0:1}),e.jsx(pe,{})]}),children:[p.length===0?e.jsx("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-subtle)"},children:"Belum ada keputusan. Lead menulis satu baris di sini setiap kali ia memutuskan."}):p.map(t=>e.jsx(Se,{d:t,onOverride:Z,onCancel:ee,busyId:I},t.id)),e.jsx(U,{total:h,page:y,onPage:C,unit:"keputusan"})]})]})}export{Pe as LeadScreen};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{ah as A,j as e,f as l,v as K,ae as y,a as k,I as L,B as N,e as d}from"./index-DI7G_sit.js";import{R as a}from"./react-DfGhg7ZW.js";import{D as G}from"./DocPreviewModal-ZFjISCL0.js";import{b as J,C as q,T as O,D as Q}from"./diff-view-CsZPBznT.js";import"./markdown-CWEY34jk.js";function ee({specId:r,title:X,onBack:S,kind:f="spec"}){const R=f==="session"?d.sessionReview:d.specReview,F=f==="session"?d.sessionReviewFile:d.specReviewFile,[o,C]=a.useState(null),[x,c]=a.useState("loading"),[B,P]=a.useState(""),[s,g]=a.useState(""),[i,p]=a.useState(null),[u,T]=a.useState("diff"),[z,v]=a.useState(0),[M,D]=a.useState("list"),[V,h]=a.useState(!1),[E,m]=a.useState("files");a.useEffect(()=>{let t=!0;return c("loading"),R(r).then(n=>{var j;t&&(C(n),c("ready"),g(((j=n.changed[0])==null?void 0:j.path)??n.files[0]??""))}).catch(n=>{t&&((n==null?void 0:n.status)===409?(c("empty"),P(String((n==null?void 0:n.message)??""))):c("error"))}),()=>{t=!1}},[r,z]),a.useEffect(()=>{if(!s){p(null);return}let t=!0;return p(null),h(!1),F(r,s).then(n=>{t&&p(n)}).catch(()=>{t&&p(null)}),()=>{t=!1}},[r,s]);const H=a.useMemo(()=>J((o==null?void 0:o.files)??[]),[o]),W=(o==null?void 0:o.changed)??[],b=!!i&&!i.binary&&i.content!==null&&A(s),U=f==="session"?d.sessionReviewFileDownloadUrl:d.specReviewFileDownloadUrl,w=t=>{g(t),m("viewer")};return x==="loading"?e.jsx(l,{kind:"loading",title:"Memuat review…",hint:r}):x==="error"?e.jsx(l,{kind:"error",title:"Gagal memuat review",hint:r,action:()=>v(t=>t+1)}):x==="empty"?e.jsx(l,{kind:"empty",icon:"git-branch",title:"Belum ada worktree untuk di-review",hint:B||"Jalankan atau lanjutkan sesi backlog item ini dulu.",action:S,actionLabel:"Kembali ke backlog"}):e.jsxs(e.Fragment,{children:[e.jsx(K,{ariaLabel:"Panel Review",active:E,onActiveChange:t=>m(t),masterWidth:300,panels:[{id:"files",label:"Files",content:e.jsxs(y,{padding:0,children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:8,padding:"10px 12px",borderBottom:"1px solid var(--border-hair)"},children:[e.jsx("span",{className:"hn-eyebrow",children:r}),e.jsx(k,{size:"sm",variant:"ghost",leftIcon:"rotate-ccw",onClick:()=>v(t=>t+1),children:"Muat ulang"})]}),e.jsxs("div",{style:{maxHeight:640,overflow:"auto",padding:"6px 4px"},children:[e.jsx(q,{label:"Changed",changed:W,selected:s,onSelect:w,view:M,onView:D}),e.jsx("div",{className:"hn-eyebrow",style:{padding:"6px 8px",marginTop:8,borderTop:"1px solid var(--border-hair)"},children:"Files"}),H.map(t=>e.jsx(O,{node:t,selected:s,onSelect:w},t.path))]})]})},{id:"viewer",label:"Viewer",content:e.jsxs(y,{padding:0,children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,padding:"10px 16px",borderBottom:"1px solid var(--border-hair)",flexWrap:"wrap"},children:[e.jsx(L,{name:"file-text",size:15,color:"var(--text-muted)"}),e.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:13,color:"var(--text-strong)",fontWeight:500},children:s||"—"}),(i==null?void 0:i.status)&&e.jsx(N,{tone:i.status==="D"?"err":i.status==="A"?"ok":"brass",size:"sm",children:i.status}),e.jsx("span",{style:{flex:1}}),b&&e.jsx(k,{size:"sm",variant:"secondary",leftIcon:"book-open",onClick:()=>h(!0),children:"Preview"}),e.jsx("div",{style:{display:"flex",gap:2,background:"var(--bone-100)",borderRadius:"var(--radius-pill)",padding:2},children:["diff","source"].map(t=>e.jsx("button",{onClick:()=>T(t),style:{padding:"4px 12px",border:"none",cursor:"pointer",borderRadius:"var(--radius-pill)",fontSize:12,textTransform:"capitalize",background:u===t?"var(--surface-card)":"transparent",color:u===t?"var(--text-strong)":"var(--text-muted)",fontWeight:u===t?600:400},children:t},t))})]}),e.jsx("div",{style:{maxHeight:640,overflow:"auto",background:"var(--surface-card)"},children:s?i?i.binary?e.jsx(l,{kind:"empty",icon:"file",title:"Berkas biner",hint:"Tak dapat di-review dari dashboard."}):u==="diff"?e.jsxs("div",{style:{padding:"10px 0"},children:[e.jsx(Q,{diff:i.diff??"",emptyHint:"File ini bagian dari project tapi tak diubah backlog ini."}),i.truncated&&e.jsx("div",{style:{padding:"8px 12px",fontSize:11,color:"var(--text-subtle)"},children:"… dipotong pada 256 KB."})]}):i.content===null?e.jsx(l,{kind:"empty",icon:"trash-2",title:"File dihapus",hint:"Tak ada isi untuk ditampilkan."}):e.jsx("pre",{style:{margin:0,padding:"12px 16px",fontFamily:"var(--font-mono)",fontSize:12.5,lineHeight:1.6,whiteSpace:"pre-wrap",wordBreak:"break-word",color:"var(--text-body)"},children:i.content}):e.jsx(l,{kind:"loading",title:"Memuat file…",hint:s}):e.jsx(l,{kind:"empty",icon:"file-text",title:"Pilih file",hint:"Pilih file dari changed atau tree."})})]})}]}),V&&b&&e.jsx(G,{path:s,text:i.content??"",eyebrow:r,download:t=>U(r,s,t),onClose:()=>h(!1)})]})}export{ee as ReviewScreen};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{h as D,p as le,y as ie,e as v,an as U,ao as se,j as e,ae as w,I as T,a as g,B as P,ap as oe,M as de,c as C,d as z,S as I,aq as ue,H as ce,U as Q,V as pe,ar as H,as as xe,at as W,x as V,w as Y,D as X,q as Z,f as _,z as me,au as he}from"./index-DI7G_sit.js";import{R as m}from"./react-DfGhg7ZW.js";import{L as ge}from"./live-DVDstDzi.js";import"./markdown-CWEY34jk.js";const J=10,G=a=>String(a).padStart(2,"0"),B=a=>a?new Date(a).toLocaleString("id-ID",{dateStyle:"medium",timeStyle:"short"}):"—",K=a=>{const i={name:(a==null?void 0:a.name)??"",prompt:(a==null?void 0:a.prompt)??"",enabled:(a==null?void 0:a.enabled)??!1,kind:"lanjutan",time:"07:00",weekday:1,everyHours:6,expr:(a==null?void 0:a.expr)??"0 7 * * *",agent:(a==null?void 0:a.agent)??"",model:(a==null?void 0:a.model)??"",effort:(a==null?void 0:a.effort)??""},l=a?xe(a.expr):{kind:"harian",hour:7,minute:0};if(!l)return i;if(l.kind==="tiap-n-jam")return{...i,kind:l.kind,everyHours:l.everyHours,time:`00:${G(l.minute)}`};const t=`${G(l.hour)}:${G(l.minute)}`;return l.kind==="mingguan"?{...i,kind:l.kind,time:t,weekday:l.weekday}:{...i,kind:l.kind,time:t}},fe=a=>{if(a.kind==="lanjutan")return a.expr.trim();const[i,l]=a.time.split(":").map(Number);switch(a.kind){case"harian":return W({kind:"harian",hour:i,minute:l});case"hari-kerja":return W({kind:"hari-kerja",hour:i,minute:l});case"mingguan":return W({kind:"mingguan",hour:i,minute:l,weekday:a.weekday});case"tiap-n-jam":return W({kind:"tiap-n-jam",everyHours:a.everyHours,minute:l})}},be={launched:"ok",queued:"neutral",skipped:"warn",failed:"err"},je={launched:"berjalan",queued:"menunggu",skipped:"dilewati",failed:"gagal"};function ve({cronId:a}){const[i,l]=m.useState([]),[t,p]=m.useState(0),[u,f]=D("scheduler","cronRunsPage",1,V);m.useEffect(()=>{let o=!0;return v.listCronRuns(a,{page:u,limit:J}).then(n=>{o&&(l(n.items),p(n.total))}).catch(()=>{o&&(l([]),p(0))}),()=>{o=!1}},[a,u]);const x=X(t,u,J);return t===0?e.jsx("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-subtle)"},children:"Belum ada eksekusi."}):e.jsxs(e.Fragment,{children:[i.map(o=>e.jsxs("div",{className:"hn-dense-row",style:{display:"flex",alignItems:"center",gap:10,padding:"8px 10px",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",marginBottom:6},children:[e.jsx(P,{tone:be[o.status]??"neutral",size:"sm",children:je[o.status]??o.status}),e.jsxs("span",{style:{flex:1,minWidth:0,fontSize:"var(--text-xs)",color:"var(--text-muted)"},children:["jatuh tempo ",B(o.dueAt),o.startedAt?` · mulai ${B(o.startedAt)}`:"",o.sessionId?` · sesi ${o.sessionId}`:"",o.manual?" · uji coba":"",o.note?` · ${o.note}`:""]})]},o.id)),e.jsx(Y,{page:x.page,pageCount:x.pageCount,total:t,from:x.from,to:x.to,onPage:f,unit:"run"})]})}function ye({projects:a,onProjectChanged:i,onToast:l}){var F;const[t,p]=D("scheduler","cronProject",((F=a[0])==null?void 0:F.id)??"",le),[u,f]=m.useState([]),[x,o]=m.useState(void 0),[n,d]=m.useState(K()),[j,k]=D("scheduler","cronOpenRuns",null,ie),[h,y]=m.useState(!1),M=a.find(r=>r.id===t),S=m.useCallback(()=>{if(!t){f([]);return}v.listCrons({projectId:t,page:1,limit:100}).then(r=>f(r.items)).catch(()=>f([]))},[t]);m.useEffect(()=>{S()},[S]);const s=r=>{o(r??null),d(K(r))},b=fe(n),A=U(b)?se(b,new Date):null,L=async()=>{var r;if(!U(b)){l("Cron expression tak sah","err","x-circle");return}y(!0);try{x?await v.patchCron(x.id,{name:n.name,expr:b,prompt:n.prompt,enabled:n.enabled,agent:n.agent||null,model:n.model||null,effort:n.effort||null}):await v.createCron({project:t,name:n.name,expr:b,prompt:n.prompt,enabled:n.enabled,agent:n.agent||void 0,model:n.model||void 0,effort:n.effort||void 0}),l("Cron tersimpan","ok","save"),o(void 0),S()}catch(c){l(((r=c.detail)==null?void 0:r.error)??"Gagal menyimpan cron","err","x-circle")}finally{y(!1)}},ae=async r=>{var c;y(!0);try{await v.runCronNow(r),l("Uji coba diantrekan — sesi terbuka di tick berikutnya","ok","play")}catch(re){l(((c=re.detail)==null?void 0:c.error)??"Gagal menjalankan cron","err","x-circle")}finally{y(!1),S()}},te=async r=>{y(!0);try{await v.deleteCron(r),l("Cron dihapus","ok","trash")}catch{l("Gagal menghapus cron","err","x-circle")}finally{y(!1),S()}},ne=async()=>{if(t)try{await v.updateProject(t,{schedulerOptIn:!0}),await i(t),l("Project di-opt-in","ok")}catch{l("Gagal mengubah opt-in","err","x-circle")}},N=n.agent||"claude";return e.jsxs(w,{eyebrow:"scheduler · cronjob",title:"Pengecekan rutin per project",actions:e.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[e.jsx(I,{value:t,"aria-label":"Project",onChange:r=>p(r.target.value),options:a.map(r=>({value:r.id,label:r.name}))}),e.jsx(g,{size:"sm",leftIcon:"plus",disabled:!t,onClick:()=>s(),children:"Cron baru"})]}),children:[M&&!M.schedulerOptIn&&e.jsxs("div",{className:"hn-dense-row",style:{display:"flex",alignItems:"center",gap:10,marginBottom:12,padding:"10px 12px",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",background:"var(--surface-sunken)"},children:[e.jsx(T,{name:"alert-triangle",size:16,color:"var(--clay-500)"}),e.jsx("span",{style:{flex:1,fontSize:"var(--text-xs)",color:"var(--text-muted)"},children:"Project ini belum di-opt-in scheduler — cron-nya tak akan pernah dijalankan."}),e.jsx(g,{size:"sm",leftIcon:"check",onClick:()=>void ne(),children:"Aktifkan scheduler di project ini"})]}),u.length===0?e.jsx("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-subtle)"},children:"Belum ada cron di project ini."}):u.map(r=>e.jsxs("div",{style:{padding:"10px 12px",marginBottom:6,border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",background:"var(--surface-card)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap"},children:[e.jsx("span",{style:{color:"var(--text-strong)",fontWeight:500},children:r.name}),e.jsx(P,{tone:r.enabled?"ok":"neutral",size:"sm",children:r.enabled?"aktif":"nonaktif"}),e.jsx("span",{style:{flex:1}}),e.jsx(g,{size:"sm",variant:"ghost",leftIcon:"play",disabled:h,onClick:()=>void ae(r.id),children:"Jalankan sekarang"}),e.jsx(g,{size:"sm",variant:"ghost",leftIcon:"list",onClick:()=>k(j===r.id?null:r.id),children:"Riwayat"}),e.jsx(g,{size:"sm",variant:"ghost",leftIcon:"pencil",onClick:()=>s(r),children:"Ubah"}),e.jsx(g,{size:"sm",variant:"ghost",leftIcon:"trash",disabled:h,onClick:()=>void te(r.id),children:"Hapus"})]}),e.jsxs("div",{style:{marginTop:4,fontSize:"var(--text-xs)",color:"var(--text-subtle)"},children:[oe(r.expr)," · terakhir ",B(r.lastRunAt)," · berikutnya ",B(r.nextRunAt)]}),j===r.id&&e.jsx("div",{style:{marginTop:10},children:e.jsx(ve,{cronId:r.id})})]},r.id)),e.jsxs(de,{open:x!==void 0,title:x?"Ubah cron":"Cron baru",eyebrow:"scheduler",onClose:()=>o(void 0),width:620,footer:e.jsxs("div",{style:{display:"flex",gap:8,justifyContent:"flex-end"},children:[e.jsx(g,{size:"sm",variant:"ghost",onClick:()=>o(void 0),children:"Batal"}),e.jsx(g,{size:"sm",leftIcon:"save",disabled:h,onClick:()=>void L(),children:"Simpan"})]}),children:[e.jsx(C,{label:"Nama cron",children:e.jsx(z,{"aria-label":"Nama cron",placeholder:"Cek error produksi pagi",value:n.name,onChange:r=>d(c=>({...c,name:r.target.value}))})}),e.jsxs("div",{className:"hn-grid-mobile",style:{display:"grid",gridTemplateColumns:"repeat(3, minmax(0,1fr))",gap:10},children:[e.jsx(C,{label:"Preset jadwal",children:e.jsx(I,{"aria-label":"Preset jadwal",value:n.kind,onChange:r=>d(c=>({...c,kind:r.target.value})),options:[{value:"harian",label:"Setiap hari"},{value:"hari-kerja",label:"Hari kerja"},{value:"mingguan",label:"Mingguan"},{value:"tiap-n-jam",label:"Tiap N jam"},{value:"lanjutan",label:"Lanjutan (cron expression)"}]})}),n.kind!=="lanjutan"&&e.jsx(C,{label:n.kind==="tiap-n-jam"?"Menit (dari jam)":"Jam",children:e.jsx(z,{type:"time","aria-label":"Jam",value:n.time,onChange:r=>d(c=>({...c,time:r.target.value}))})}),n.kind==="mingguan"&&e.jsx(C,{label:"Hari",children:e.jsx(I,{"aria-label":"Hari",value:String(n.weekday),onChange:r=>d(c=>({...c,weekday:Number(r.target.value)})),options:ue.map((r,c)=>({value:String(c),label:r}))})}),n.kind==="tiap-n-jam"&&e.jsx(C,{label:"Tiap berapa jam",children:e.jsx(z,{type:"number",min:1,max:23,"aria-label":"Tiap berapa jam",placeholder:"mis. 6",value:String(n.everyHours),onChange:r=>d(c=>({...c,everyHours:Math.min(23,Math.max(1,Number(r.target.value)||1))}))})})]}),n.kind==="lanjutan"&&e.jsx(C,{label:"Cron expression",hint:"Lima field: menit jam tanggal bulan hari-pekan — zona waktu server.",children:e.jsx(z,{"aria-label":"Cron expression",placeholder:"0 7 * * 1-5",value:n.expr,onChange:r=>d(c=>({...c,expr:r.target.value}))})}),e.jsx("div",{"data-testid":"cron-next-preview",style:{marginBottom:14,fontSize:"var(--text-xs)",color:A?"var(--text-muted)":"var(--clay-500)"},children:A?`Jalan berikutnya: ${B(A.toISOString())} (waktu lokal)`:"Jadwal tak sah — tak ada jalan berikutnya"}),e.jsx(C,{label:"Prompt",hint:"Instruksi bebas untuk agen. Temuan sebaiknya difilekan sebagai backlog lewat POST /api/specs.",children:e.jsx(ce,{"aria-label":"Prompt",rows:6,placeholder:"mis. Periksa error 5xx sejak kemarin, lalu filekan temuannya sebagai QA finding.",value:n.prompt,onChange:r=>d(c=>({...c,prompt:r.target.value}))})}),e.jsxs("div",{className:"hn-grid-mobile",style:{display:"grid",gridTemplateColumns:"repeat(3, minmax(0,1fr))",gap:10},children:[e.jsx(C,{label:"Runtime",children:e.jsx(I,{"aria-label":"Runtime",value:n.agent,onChange:r=>d(c=>({...c,agent:r.target.value,model:"",effort:""})),options:[{value:"",label:"Warisi default sesi"},{value:"claude",label:"Claude Code"},{value:"codex",label:"Codex CLI"}]})}),e.jsx(C,{label:"Model",children:e.jsx(I,{"aria-label":"Model",value:n.model,disabled:!n.agent,onChange:r=>d(c=>({...c,model:r.target.value,effort:""})),options:[{value:"",label:"Warisi"},...Q(N).map(r=>({value:r.id,label:r.label}))]})}),e.jsx(C,{label:"Effort",children:e.jsx(I,{"aria-label":"Effort",value:n.effort,disabled:!n.agent,onChange:r=>d(c=>({...c,effort:r.target.value})),options:[{value:"",label:"Warisi"},...pe(N,n.model||Q(N)[0].id).map(r=>({value:r,label:r}))]})})]}),e.jsx(H,{label:"Aktif",checked:n.enabled,onChange:r=>d(c=>({...c,enabled:r}))})]})]})}const q=5e3,O=10;function ee(a,i=Date.now()){if(!a)return"—";const l=Math.max(0,i-new Date(a).getTime()),t=Math.floor(l/6e4);if(t<1)return"baru saja";if(t<60)return`${t}m`;const p=Math.floor(t/60);return p<24?`${p}j`:`${Math.floor(p/24)}h`}function ke(a,i=Date.now()){if(!a)return"—";const l=new Date(a).getTime()-i;if(l<=0)return"jatuh tempo";const t=Math.ceil(l/6e4);return t<60?`${t}m lagi`:`${Math.ceil(t/60)}j lagi`}const Ce={tinggi:"err",sedang:"warn",rendah:"neutral"};function E(a,i){var l;return((l=i.find(t=>t.id===a))==null?void 0:l.title)??a}function Se({s:a}){return e.jsxs("div",{style:{padding:"12px 14px",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-md)",background:"var(--surface-card)",display:"flex",flexDirection:"column",gap:6,flex:1,minWidth:180},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[e.jsx("span",{style:{fontFamily:"var(--font-mono)",fontWeight:600,color:"var(--text-strong)"},children:a.id}),e.jsx(P,{tone:a.enabled?"ok":"neutral",size:"sm",children:a.enabled?"aktif":"nonaktif"})]}),e.jsxs("div",{style:{fontSize:"var(--text-xs)",color:"var(--text-subtle)"},children:["tiap ",a.everyMin,"m"]}),e.jsxs("div",{style:{fontSize:"var(--text-xs)",color:"var(--text-muted)"},children:["terakhir ",ee(a.lastRunAt)," · berikutnya ",ke(a.nextRunAt)]})]})}function R({children:a}){return e.jsx("div",{className:"hn-dense-row",style:{display:"flex",alignItems:"center",gap:10,padding:"10px 12px",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",background:"var(--surface-card)",marginBottom:6},children:a})}function we({q:a,backlog:i,onCancel:l,busy:t}){return e.jsxs(R,{children:[e.jsxs("span",{style:{flex:1,minWidth:0},children:[e.jsx("span",{style:{color:"var(--text-strong)",fontWeight:500},children:E(a.specId,i)}),e.jsxs("span",{style:{display:"block",fontSize:"var(--text-xs)",color:"var(--text-subtle)"},children:[a.projectId," · ",a.source,a.note?` · ${a.note}`:""]})]}),e.jsx(P,{tone:Ce[a.priority]??"neutral",size:"sm",children:a.priority}),e.jsx(g,{size:"sm",variant:"ghost",leftIcon:"ban",disabled:t,onClick:()=>l(a.id),children:"Batalkan"})]})}function Ie({q:a,backlog:i,onRequeue:l,busy:t}){return e.jsxs(R,{children:[e.jsx(T,{name:"ban",size:16,color:"var(--text-subtle)"}),e.jsxs("span",{style:{flex:1,minWidth:0},children:[e.jsx("span",{style:{color:"var(--text-strong)",fontWeight:500},children:E(a.specId,i)}),e.jsxs("span",{style:{display:"block",fontSize:"var(--text-xs)",color:"var(--text-subtle)"},children:[a.projectId," · ",a.source," · ",a.note??"dibatalkan"]})]}),e.jsx(g,{size:"sm",variant:"ghost",leftIcon:"rotate-ccw",disabled:t,onClick:()=>l(a.id),children:"Antre lagi"})]})}function ze({s:a,backlog:i,onGotoTerminal:l}){return e.jsxs(R,{children:[e.jsxs("span",{style:{flex:1,minWidth:0},children:[e.jsx("span",{style:{color:"var(--text-strong)",fontWeight:500},children:E(a.specId,i)}),e.jsxs("span",{style:{display:"block",fontSize:"var(--text-xs)",color:"var(--text-subtle)"},children:[a.projectId,a.flow?` · ${a.flow}`:""]})]}),a.decision&&e.jsx(P,{tone:"warn",icon:"bell",size:"sm",children:"menunggu keputusan"}),e.jsx(g,{size:"sm",variant:"ghost",leftIcon:"terminal",onClick:()=>l(a.id),children:"Buka terminal"})]})}function Pe({q:a,backlog:i,onToast:l}){const t=me(a.specId);return e.jsxs(R,{children:[e.jsxs("span",{style:{flex:1,minWidth:0},children:[e.jsx("span",{style:{color:"var(--text-strong)",fontWeight:500},children:E(a.specId,i)}),e.jsxs("span",{style:{display:"block",fontSize:"var(--text-xs)",color:"var(--text-subtle)"},children:[a.projectId," · ",a.source," · ",a.launchedAt?`selesai ${ee(a.launchedAt)}`:a.note??"tak diluncurkan",a.sessionId?` · hanoman/${a.sessionId}`:""]})]}),e.jsx(g,{size:"sm",variant:"ghost",leftIcon:"external-link",onClick:()=>window.open(t,"_blank","noreferrer"),children:"Buka review"}),e.jsx(g,{size:"sm",variant:"ghost",leftIcon:"copy",onClick:()=>{var p;(p=navigator.clipboard)==null||p.writeText(t),l("Link review disalin","ok","copy")},children:"Salin"})]})}function Re({q:a,backlog:i}){return e.jsxs(R,{children:[e.jsx(T,{name:"x-circle",size:16,color:"var(--clay-500)"}),e.jsxs("span",{style:{flex:1,minWidth:0},children:[e.jsx("span",{style:{color:"var(--text-strong)",fontWeight:500},children:E(a.specId,i)}),e.jsxs("span",{style:{display:"block",fontSize:"var(--text-xs)",color:"var(--text-subtle)"},children:[a.projectId," · ",a.note??"gagal tanpa alasan tercatat"]})]})]})}function Ae({title:a,count:i,empty:l,children:t}){return e.jsx(w,{eyebrow:"scheduler",title:`${a}${i?` · ${i}`:""}`,children:i===0?e.jsx("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-subtle)"},children:l}):t})}function $({title:a,status:i,count:l,empty:t,render:p}){const[u,f]=m.useState([]),[x,o]=m.useState(0),[n,d]=D("scheduler",`queue-${i}-page`,1,V),j=m.useCallback(()=>{let h=!0;return v.getSchedulerQueue({status:i,page:n,limit:O}).then(y=>{h&&(f(y.items),o(y.total))}).catch(()=>{h&&(f([]),o(0))}),()=>{h=!1}},[i,n]);m.useEffect(()=>j(),[j]),Z({topic:"schedulerQueue",params:{status:i,page:n,limit:O},apply:h=>{f(h.data.items),o(h.data.total)},refetch:()=>{j()},pollMs:q});const k=X(x,n,O);return e.jsx(w,{eyebrow:"scheduler",title:`${a}${l?` · ${l}`:""}`,children:l===0?e.jsx("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-subtle)"},children:t}):e.jsxs(e.Fragment,{children:[u.map(h=>p(h)),e.jsx(Y,{page:k.page,pageCount:k.pageCount,total:x,from:k.from,to:k.to,onPage:d,unit:"item"})]})})}function Le({cfg:a,cap:i,liveCount:l,onWrite:t,busy:p}){const u=!a.enabled,f=u?"neutral":a.paused?"warn":"ok",x=u?"berhenti":a.paused?"dijeda":"aktif";return e.jsx(w,{eyebrow:"scheduler · rem darurat",title:"Kendali",children:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,flexWrap:"wrap"},children:[e.jsx(P,{tone:f,children:x}),e.jsxs("span",{style:{fontSize:"var(--text-sm)",color:"var(--text-muted)"},children:[l," / ",i," sesi hidup"]}),e.jsx(ge,{}),e.jsx("span",{style:{flex:1}}),a.enabled&&e.jsx(g,{size:"sm",variant:"secondary",leftIcon:a.paused?"play":"pause",disabled:p,onClick:()=>t({...a,paused:!a.paused}),children:a.paused?"Lanjutkan":"Pause"}),a.enabled?e.jsx(g,{size:"sm",variant:"ghost",leftIcon:"square",disabled:p,onClick:()=>t({...a,enabled:!1}),children:"Stop"}):e.jsx(g,{size:"sm",leftIcon:"play",disabled:p,onClick:()=>t({...a,enabled:!0}),children:"Aktifkan"})]})})}function Be({status:a}){return e.jsx(w,{eyebrow:"host · peluncuran agen",title:"Gerbang peluncuran",children:e.jsxs("div",{"aria-label":"Status gerbang peluncuran",style:{fontSize:"var(--text-sm)",color:"var(--text-muted)",lineHeight:1.6},children:[e.jsxs("div",{children:["Gerbang ",a.enabled?"aktif":"nonaktif"," · ",a.liveCount," sesi hidup · ",a.liveAgentCount," agen terstruktur · cap ",a.maxConcurrent]}),e.jsxs("div",{children:["Load per core: ",a.loadStatus==="available"&&a.loadPerCore!==null?a.loadPerCore.toFixed(2):"tidak tersedia",a.loadStatus==="unsupported"?" (tidak didukung platform)":""," · ambang ",a.maxLoadPerCore]}),e.jsx("div",{style:{fontSize:"var(--text-xs)",marginTop:6},children:"Berlaku juga saat scheduler berhenti. Terminal dan shell tetap bisa dibuka; keduanya ikut mengisi cap."})]})})}function Ee({cfg:a,onWrite:i,busy:l}){const[t,p]=m.useState(a);m.useEffect(()=>{p(a)},[a]);const u=(n,d)=>p(j=>({...j,sources:{...j.sources,[n]:{...j.sources[n],...d}}})),f=(n,d=1)=>Math.max(d,Number(n)||d),x=t.launchGuard??he.launchGuard,o=Number.isFinite(x.maxLoadPerCore)&&x.maxLoadPerCore>0;return e.jsxs(w,{eyebrow:"scheduler · setelan",title:"Konfigurasi",actions:e.jsx(g,{size:"sm",leftIcon:"save",disabled:l||!o,onClick:()=>i({...t,launchGuard:x}),children:"Simpan setelan"}),children:[e.jsxs("div",{className:"hn-grid-mobile",style:{display:"grid",gridTemplateColumns:"repeat(2, minmax(0,1fr))",gap:14},children:[e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:4},children:[e.jsx("span",{className:"hn-eyebrow",children:"Cap concurrent"}),e.jsx(z,{type:"number",min:1,value:String(t.maxConcurrent),"aria-label":"Cap concurrent",placeholder:"6",onChange:n=>p(d=>({...d,maxConcurrent:f(n.target.value)}))})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:4},children:[e.jsx("span",{className:"hn-eyebrow",children:"Autonomy"}),e.jsx(I,{value:t.autonomy,"aria-label":"Autonomy",onChange:n=>p(d=>({...d,autonomy:n.target.value})),options:[{value:"butuh-keputusan",label:"butuh-keputusan"},{value:"full-control",label:"full-control"}]})]})]}),e.jsxs("div",{style:{marginTop:14,padding:"10px 12px",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)"},children:[e.jsx(H,{label:"Gerbang peluncuran",checked:x.enabled,onChange:n=>p(d=>({...d,launchGuard:{...x,enabled:n}}))}),e.jsx("p",{style:{fontSize:"var(--text-xs)",color:"var(--text-muted)",lineHeight:1.5},children:"Membatasi peluncuran agen menurut cap sesi dan beban host, termasuk peluncuran manual. Mematikannya melewati kedua pemeriksaan. Terpisah dari sakelar scheduler dan source."}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:4},children:[e.jsx("span",{className:"hn-eyebrow",children:"Ambang load per core"}),e.jsx(z,{type:"number",min:0,step:"any",value:String(x.maxLoadPerCore),"aria-label":"Ambang load per core","aria-invalid":!o,placeholder:"2.5",onChange:n=>p(d=>({...d,launchGuard:{...x,maxLoadPerCore:Number(n.target.value)}}))}),!o&&e.jsx("span",{style:{fontSize:"var(--text-xs)",color:"var(--clay-500)"},children:"Isi angka lebih besar dari nol."})]})]}),e.jsx("div",{style:{marginTop:14,display:"flex",flexDirection:"column",gap:10},children:["backlog","triase"].map(n=>e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,flexWrap:"wrap",padding:"10px 12px",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)"},children:[e.jsx(H,{label:n,checked:t.sources[n].enabled,onChange:d=>u(n,{enabled:d})}),e.jsx("span",{style:{flex:1}}),e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:6,fontSize:"var(--text-xs)"},children:["tiap",e.jsx(z,{type:"number",min:1,style:{width:84},"aria-label":`cadence ${n}`,placeholder:"30",value:String(t.sources[n].everyMin),onChange:d=>u(n,{everyMin:f(d.target.value)})}),"menit"]})]},n))})]})}function Me({projects:a,onToggle:i,busyId:l}){return e.jsxs(w,{eyebrow:"scheduler · opt-in project",title:"Project yang diizinkan",children:[e.jsx("div",{style:{fontSize:"var(--text-xs)",color:"var(--text-subtle)",marginBottom:10},children:"Scheduler hanya menyentuh project yang di-opt-in. Default mati."}),a.length===0?e.jsx("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-subtle)"},children:"Belum ada project."}):a.map(t=>e.jsxs(R,{children:[e.jsx("span",{style:{flex:1,minWidth:0,color:"var(--text-strong)",fontWeight:500},children:t.name}),e.jsx(P,{tone:t.schedulerOptIn?"ok":"neutral",size:"sm",children:t.schedulerOptIn?"opt-in":"mati"}),t.schedulerOptIn?e.jsx(g,{size:"sm",variant:"ghost",leftIcon:"ban",disabled:l===t.id,onClick:()=>i(t.id,!1),children:"Cabut opt-in"}):e.jsx(g,{size:"sm",leftIcon:"check",disabled:l===t.id,onClick:()=>i(t.id,!0),children:"Opt-in"})]},t.id))]})}function Ge({projects:a,backlog:i,onProjectChanged:l,onToast:t,onGotoTerminal:p}){const[u,f]=m.useState(null),[x,o]=m.useState("loading"),[n,d]=m.useState(!1),[j,k]=m.useState(null),h=m.useCallback((s=!1)=>{s||o("loading"),v.getSchedulerState().then(b=>{f(b),o("ready")}).catch(()=>{s||o("error")})},[]);m.useEffect(()=>{h()},[h]),Z({topic:"schedulerState",params:{},apply:s=>{f(s.state),o("ready")},refetch:()=>h(!0),pollMs:q});const y=m.useCallback(async s=>{d(!0);try{await v.putSchedulerConfig(s),t("Setelan scheduler tersimpan","ok","save"),h(!0)}catch{t("Gagal menyimpan setelan","err","x-circle")}finally{d(!1)}},[h,t]),M=m.useCallback(async(s,b)=>{k(s);try{await v.updateProject(s,{schedulerOptIn:b}),await l(s),t(b?"Project di-opt-in":"Opt-in dicabut","ok")}catch{t("Gagal mengubah opt-in","err","x-circle")}finally{k(null)}},[l,t]),S=m.useCallback(async(s,b)=>{k(s);try{b==="cancel"?(await v.cancelSchedulerQueueItem(s),t("Item antrean dibatalkan","ok","ban")):(await v.requeueSchedulerQueueItem(s),t("Item dikembalikan ke antrean","ok","rotate-ccw"))}catch(A){const L=A.detail;t((L==null?void 0:L.error)??"Gagal mengubah item antrean","err","x-circle")}finally{k(null),h(!0)}},[h,t]);return x==="loading"?e.jsx(_,{kind:"loading"}):x==="error"||!u?e.jsx(_,{kind:"error",hint:"Gagal memuat state scheduler.",action:()=>h(),actionLabel:"Coba lagi"}):e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:16,minHeight:0},children:[e.jsx(Le,{cfg:u.config,cap:u.cap,liveCount:u.liveCount,onWrite:y,busy:n}),u.admission&&e.jsx(Be,{status:u.admission}),e.jsx(w,{eyebrow:"scheduler · observabilitas",title:"Status per source",children:e.jsx("div",{style:{display:"flex",gap:10,flexWrap:"wrap"},children:u.sources.map(s=>e.jsx(Se,{s},s.id))})}),e.jsx(ye,{projects:a,onProjectChanged:l,onToast:t}),e.jsx($,{title:"Antrean",status:"queued",count:u.queueCounts.queued,empty:"Antrean kosong.",render:s=>e.jsx(we,{q:s,backlog:i,onCancel:b=>void S(b,"cancel"),busy:j===s.id},s.id)}),e.jsx($,{title:"Dibatalkan",status:"canceled",count:u.queueCounts.canceled,empty:"Tak ada item yang dibatalkan.",render:s=>e.jsx(Ie,{q:s,backlog:i,onRequeue:b=>void S(b,"requeue"),busy:j===s.id},s.id)}),e.jsx(Ae,{title:"Sesi berjalan",count:u.sessions.length,empty:"Tak ada sesi scheduler berjalan.",children:u.sessions.map(s=>e.jsx(ze,{s,backlog:i,onGotoTerminal:p},s.id))}),e.jsx($,{title:"Selesai (done)",status:"done",count:u.queueCounts.done,empty:"Belum ada hasil selesai.",render:s=>e.jsx(Pe,{q:s,backlog:i,onToast:t},s.id)}),e.jsx($,{title:"Gagal",status:"failed",count:u.queueCounts.failed,empty:"Tak ada sesi gagal.",render:s=>e.jsx(Re,{q:s,backlog:i},s.id)}),e.jsx(Ee,{cfg:u.config,onWrite:y,busy:n}),e.jsx(Me,{projects:a,onToggle:M,busyId:j})]})}export{Ge as SchedulerScreen};
|