hanoman 0.9.30 → 0.9.31
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 +12 -2
- package/dist/server.js +323 -235
- package/package.json +1 -1
- package/web/assets/{DalangHanomanScreen-Fd7_DcSP.js → DalangHanomanScreen-DdsEmtBl.js} +1 -1
- package/web/assets/{DocPreviewModal-SMRN2K98.js → DocPreviewModal-BbOqdfaH.js} +1 -1
- package/web/assets/{DocsWorkspace-pxj0N6QW.js → DocsWorkspace-Cr7AXz9z.js} +1 -1
- package/web/assets/{IdeScreen-Cr9Vqdrc.js → IdeScreen-hdbQW-ui.js} +1 -1
- package/web/assets/{LeadScreen-CQXpJy0y.js → LeadScreen-BWE4mfJI.js} +1 -1
- package/web/assets/{ReviewScreen-B7NNEjxk.js → ReviewScreen-BIkpEspG.js} +1 -1
- package/web/assets/{SchedulerScreen-D3rPdS-F.js → SchedulerScreen-3KVE-d_d.js} +1 -1
- package/web/assets/SettingsScreen-B0-W2TeR.js +62 -0
- package/web/assets/{TeamScreen-BBAsYLpT.js → TeamScreen-DNdt2P1g.js} +1 -1
- package/web/assets/{TerminalScreen-DpVp4h1n.js → TerminalScreen-BjQF48XI.js} +1 -1
- package/web/assets/{TriageScreen-wAPnttRe.js → TriageScreen-CzM99CrG.js} +1 -1
- package/web/assets/{VpsScreen-DeQVx9Jy.js → VpsScreen-SGB_BpbS.js} +1 -1
- package/web/assets/fields-of8G961J.js +1 -0
- package/web/assets/{index-BQw6xQI4.js → index-C5P4ykKO.js} +3 -3
- package/web/assets/{live-CONO0GTu.js → live-DQen7wLm.js} +1 -1
- package/web/assets/{sched-lead-shared-CDR0pOqs.js → sched-lead-shared-C34TvLVv.js} +1 -1
- package/web/assets/{settings-rebase-CpaFw0Tm.js → settings-rebase-DHIWk4mV.js} +1 -1
- package/web/index.html +1 -1
- package/web/assets/SettingsScreen-Bx13PWKQ.js +0 -62
- package/web/assets/fields-qnBoIMR_.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DalangHanomanScreen-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DalangHanomanScreen-DdsEmtBl.js","assets/react-DfGhg7ZW.js","assets/markdown-CWEY34jk.js","assets/xterm-3VOAfa_q.js","assets/DalangHanomanScreen-DhDPV6e8.css","assets/TeamScreen-DNdt2P1g.js","assets/live-DQen7wLm.js","assets/TeamScreen-Bw8bIycZ.css","assets/TriageScreen-CzM99CrG.js","assets/TriageScreen-B6_KrS6l.css","assets/TerminalScreen-BjQF48XI.js","assets/fields-of8G961J.js","assets/TerminalScreen-BjFMJnq6.css","assets/IdeScreen-hdbQW-ui.js","assets/highlight-HK3IjCTX.js","assets/DocPreviewModal-BbOqdfaH.js","assets/IdeScreen-CppUucs0.css","assets/VpsScreen-SGB_BpbS.js","assets/VpsScreen-BzXpc3le.css","assets/SchedulerScreen-3KVE-d_d.js","assets/sched-lead-shared-C34TvLVv.js","assets/scheduler-D64RlGvZ.css","assets/settings-rebase-DHIWk4mV.js","assets/LeadScreen-BWE4mfJI.js","assets/LeadScreen-CN53yR_e.css","assets/DocsWorkspace-Cr7AXz9z.js","assets/DocsWorkspace-CSak7xFX.css","assets/ReviewScreen-BIkpEspG.js","assets/SettingsScreen-B0-W2TeR.js","assets/SettingsScreen-DQZ3K43g.css"])))=>i.map(i=>d[i]);
|
|
2
2
|
var Wf=Object.defineProperty;var Vf=(e,a,n)=>a in e?Wf(e,a,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[a]=n;var Mu=(e,a,n)=>Vf(e,typeof a!="symbol"?a+"":a,n);import{r as Mt,a as Yf,R as c,B as Jf,u as Qf,b as Zf}from"./react-DfGhg7ZW.js";import{m as Xf,p as ey}from"./markdown-CWEY34jk.js";import{D as ay,o as ty}from"./xterm-3VOAfa_q.js";(function(){const a=document.createElement("link").relList;if(a&&a.supports&&a.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))i(r);new MutationObserver(r=>{for(const s of r)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&i(o)}).observe(document,{childList:!0,subtree:!0});function n(r){const s={};return r.integrity&&(s.integrity=r.integrity),r.referrerPolicy&&(s.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?s.credentials="include":r.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function i(r){if(r.ep)return;r.ep=!0;const s=n(r);fetch(r.href,s)}})();var $p={exports:{}},Vo={};/**
|
|
3
3
|
* @license React
|
|
4
4
|
* react-jsx-runtime.production.min.js
|
|
@@ -7,7 +7,7 @@ var Wf=Object.defineProperty;var Vf=(e,a,n)=>a in e?Wf(e,a,{enumerable:!0,config
|
|
|
7
7
|
*
|
|
8
8
|
* This source code is licensed under the MIT license found in the
|
|
9
9
|
* LICENSE file in the root directory of this source tree.
|
|
10
|
-
*/var ny=Mt,iy=Symbol.for("react.element"),sy=Symbol.for("react.fragment"),ry=Object.prototype.hasOwnProperty,oy=ny.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,ly={key:!0,ref:!0,__self:!0,__source:!0};function Bp(e,a,n){var i,r={},s=null,o=null;n!==void 0&&(s=""+n),a.key!==void 0&&(s=""+a.key),a.ref!==void 0&&(o=a.ref);for(i in a)ry.call(a,i)&&!ly.hasOwnProperty(i)&&(r[i]=a[i]);if(e&&e.defaultProps)for(i in a=e.defaultProps,a)r[i]===void 0&&(r[i]=a[i]);return{$$typeof:iy,type:e,key:s,ref:o,props:r,_owner:oy.current}}Vo.Fragment=sy;Vo.jsx=Bp;Vo.jsxs=Bp;$p.exports=Vo;var t=$p.exports,Dp,Iu=Yf;Dp=Iu.createRoot,Iu.hydrateRoot;const dy="modulepreload",cy=function(e){return"/"+e},Nu={},Xt=function(a,n,i){let r=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),l=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));r=Promise.allSettled(n.map(d=>{if(d=cy(d),d in Nu)return;Nu[d]=!0;const u=d.endsWith(".css"),m=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${d}"]${m}`))return;const h=document.createElement("link");if(h.rel=u?"stylesheet":dy,u||(h.as="script"),h.crossOrigin="",h.href=d,l&&h.setAttribute("nonce",l),document.head.appendChild(h),u)return new Promise((p,g)=>{h.addEventListener("load",p),h.addEventListener("error",()=>g(new Error(`Unable to preload CSS for ${d}`)))})}))}function s(o){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o}return r.then(o=>{for(const l of o||[])l.status==="rejected"&&s(l.reason);return a().catch(s)})};var fa;(function(e){e.assertEqual=r=>{};function a(r){}e.assertIs=a;function n(r){throw new Error}e.assertNever=n,e.arrayToEnum=r=>{const s={};for(const o of r)s[o]=o;return s},e.getValidEnumValues=r=>{const s=e.objectKeys(r).filter(l=>typeof r[r[l]]!="number"),o={};for(const l of s)o[l]=r[l];return e.objectValues(o)},e.objectValues=r=>e.objectKeys(r).map(function(s){return r[s]}),e.objectKeys=typeof Object.keys=="function"?r=>Object.keys(r):r=>{const s=[];for(const o in r)Object.prototype.hasOwnProperty.call(r,o)&&s.push(o);return s},e.find=(r,s)=>{for(const o of r)if(s(o))return o},e.isInteger=typeof Number.isInteger=="function"?r=>Number.isInteger(r):r=>typeof r=="number"&&Number.isFinite(r)&&Math.floor(r)===r;function i(r,s=" | "){return r.map(o=>typeof o=="string"?`'${o}'`:o).join(s)}e.joinValues=i,e.jsonStringifyReplacer=(r,s)=>typeof s=="bigint"?s.toString():s})(fa||(fa={}));var Ru;(function(e){e.mergeShapes=(a,n)=>({...a,...n})})(Ru||(Ru={}));const Pe=fa.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),ai=e=>{switch(typeof e){case"undefined":return Pe.undefined;case"string":return Pe.string;case"number":return Number.isNaN(e)?Pe.nan:Pe.number;case"boolean":return Pe.boolean;case"function":return Pe.function;case"bigint":return Pe.bigint;case"symbol":return Pe.symbol;case"object":return Array.isArray(e)?Pe.array:e===null?Pe.null:e.then&&typeof e.then=="function"&&e.catch&&typeof e.catch=="function"?Pe.promise:typeof Map<"u"&&e instanceof Map?Pe.map:typeof Set<"u"&&e instanceof Set?Pe.set:typeof Date<"u"&&e instanceof Date?Pe.date:Pe.object;default:return Pe.unknown}},me=fa.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);class Kn extends Error{get errors(){return this.issues}constructor(a){super(),this.issues=[],this.addIssue=i=>{this.issues=[...this.issues,i]},this.addIssues=(i=[])=>{this.issues=[...this.issues,...i]};const n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=a}format(a){const n=a||function(s){return s.message},i={_errors:[]},r=s=>{for(const o of s.issues)if(o.code==="invalid_union")o.unionErrors.map(r);else if(o.code==="invalid_return_type")r(o.returnTypeError);else if(o.code==="invalid_arguments")r(o.argumentsError);else if(o.path.length===0)i._errors.push(n(o));else{let l=i,d=0;for(;d<o.path.length;){const u=o.path[d];d===o.path.length-1?(l[u]=l[u]||{_errors:[]},l[u]._errors.push(n(o))):l[u]=l[u]||{_errors:[]},l=l[u],d++}}};return r(this),i}static assert(a){if(!(a instanceof Kn))throw new Error(`Not a ZodError: ${a}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,fa.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(a=n=>n.message){const n={},i=[];for(const r of this.issues)if(r.path.length>0){const s=r.path[0];n[s]=n[s]||[],n[s].push(a(r))}else i.push(a(r));return{formErrors:i,fieldErrors:n}}get formErrors(){return this.flatten()}}Kn.create=e=>new Kn(e);const xd=(e,a)=>{let n;switch(e.code){case me.invalid_type:e.received===Pe.undefined?n="Required":n=`Expected ${e.expected}, received ${e.received}`;break;case me.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(e.expected,fa.jsonStringifyReplacer)}`;break;case me.unrecognized_keys:n=`Unrecognized key(s) in object: ${fa.joinValues(e.keys,", ")}`;break;case me.invalid_union:n="Invalid input";break;case me.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${fa.joinValues(e.options)}`;break;case me.invalid_enum_value:n=`Invalid enum value. Expected ${fa.joinValues(e.options)}, received '${e.received}'`;break;case me.invalid_arguments:n="Invalid function arguments";break;case me.invalid_return_type:n="Invalid function return type";break;case me.invalid_date:n="Invalid date";break;case me.invalid_string:typeof e.validation=="object"?"includes"in e.validation?(n=`Invalid input: must include "${e.validation.includes}"`,typeof e.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?n=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?n=`Invalid input: must end with "${e.validation.endsWith}"`:fa.assertNever(e.validation):e.validation!=="regex"?n=`Invalid ${e.validation}`:n="Invalid";break;case me.too_small:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="bigint"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:n="Invalid input";break;case me.too_big:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="bigint"?n=`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:n="Invalid input";break;case me.custom:n="Invalid input";break;case me.invalid_intersection_types:n="Intersection results could not be merged";break;case me.not_multiple_of:n=`Number must be a multiple of ${e.multipleOf}`;break;case me.not_finite:n="Number must be finite";break;default:n=a.defaultError,fa.assertNever(e)}return{message:n}};let uy=xd;function my(){return uy}const hy=e=>{const{data:a,path:n,errorMaps:i,issueData:r}=e,s=[...n,...r.path||[]],o={...r,path:s};if(r.message!==void 0)return{...r,path:s,message:r.message};let l="";const d=i.filter(u=>!!u).slice().reverse();for(const u of d)l=u(o,{data:a,defaultError:l}).message;return{...r,path:s,message:l}};function Ae(e,a){const n=my(),i=hy({issueData:a,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,n,n===xd?void 0:xd].filter(r=>!!r)});e.common.issues.push(i)}class ft{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(a,n){const i=[];for(const r of n){if(r.status==="aborted")return Ye;r.status==="dirty"&&a.dirty(),i.push(r.value)}return{status:a.value,value:i}}static async mergeObjectAsync(a,n){const i=[];for(const r of n){const s=await r.key,o=await r.value;i.push({key:s,value:o})}return ft.mergeObjectSync(a,i)}static mergeObjectSync(a,n){const i={};for(const r of n){const{key:s,value:o}=r;if(s.status==="aborted"||o.status==="aborted")return Ye;s.status==="dirty"&&a.dirty(),o.status==="dirty"&&a.dirty(),s.value!=="__proto__"&&(typeof o.value<"u"||r.alwaysSet)&&(i[s.value]=o.value)}return{status:a.value,value:i}}}const Ye=Object.freeze({status:"aborted"}),ir=e=>({status:"dirty",value:e}),Ft=e=>({status:"valid",value:e}),Lu=e=>e.status==="aborted",$u=e=>e.status==="dirty",js=e=>e.status==="valid",bo=e=>typeof Promise<"u"&&e instanceof Promise;var Le;(function(e){e.errToObj=a=>typeof a=="string"?{message:a}:a||{},e.toString=a=>typeof a=="string"?a:a==null?void 0:a.message})(Le||(Le={}));class gn{constructor(a,n,i,r){this._cachedPath=[],this.parent=a,this.data=n,this._path=i,this._key=r}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const Bu=(e,a)=>{if(js(a))return{success:!0,data:a.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const n=new Kn(e.common.issues);return this._error=n,this._error}}};function na(e){if(!e)return{};const{errorMap:a,invalid_type_error:n,required_error:i,description:r}=e;if(a&&(n||i))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return a?{errorMap:a,description:r}:{errorMap:(o,l)=>{const{message:d}=e;return o.code==="invalid_enum_value"?{message:d??l.defaultError}:typeof l.data>"u"?{message:d??i??l.defaultError}:o.code!=="invalid_type"?{message:l.defaultError}:{message:d??n??l.defaultError}},description:r}}class ua{get description(){return this._def.description}_getType(a){return ai(a.data)}_getOrReturnCtx(a,n){return n||{common:a.parent.common,data:a.data,parsedType:ai(a.data),schemaErrorMap:this._def.errorMap,path:a.path,parent:a.parent}}_processInputParams(a){return{status:new ft,ctx:{common:a.parent.common,data:a.data,parsedType:ai(a.data),schemaErrorMap:this._def.errorMap,path:a.path,parent:a.parent}}}_parseSync(a){const n=this._parse(a);if(bo(n))throw new Error("Synchronous parse encountered promise.");return n}_parseAsync(a){const n=this._parse(a);return Promise.resolve(n)}parse(a,n){const i=this.safeParse(a,n);if(i.success)return i.data;throw i.error}safeParse(a,n){const i={common:{issues:[],async:(n==null?void 0:n.async)??!1,contextualErrorMap:n==null?void 0:n.errorMap},path:(n==null?void 0:n.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:a,parsedType:ai(a)},r=this._parseSync({data:a,path:i.path,parent:i});return Bu(i,r)}"~validate"(a){var i,r;const n={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:a,parsedType:ai(a)};if(!this["~standard"].async)try{const s=this._parseSync({data:a,path:[],parent:n});return js(s)?{value:s.value}:{issues:n.common.issues}}catch(s){(r=(i=s==null?void 0:s.message)==null?void 0:i.toLowerCase())!=null&&r.includes("encountered")&&(this["~standard"].async=!0),n.common={issues:[],async:!0}}return this._parseAsync({data:a,path:[],parent:n}).then(s=>js(s)?{value:s.value}:{issues:n.common.issues})}async parseAsync(a,n){const i=await this.safeParseAsync(a,n);if(i.success)return i.data;throw i.error}async safeParseAsync(a,n){const i={common:{issues:[],contextualErrorMap:n==null?void 0:n.errorMap,async:!0},path:(n==null?void 0:n.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:a,parsedType:ai(a)},r=this._parse({data:a,path:i.path,parent:i}),s=await(bo(r)?r:Promise.resolve(r));return Bu(i,s)}refine(a,n){const i=r=>typeof n=="string"||typeof n>"u"?{message:n}:typeof n=="function"?n(r):n;return this._refinement((r,s)=>{const o=a(r),l=()=>s.addIssue({code:me.custom,...i(r)});return typeof Promise<"u"&&o instanceof Promise?o.then(d=>d?!0:(l(),!1)):o?!0:(l(),!1)})}refinement(a,n){return this._refinement((i,r)=>a(i)?!0:(r.addIssue(typeof n=="function"?n(i,r):n),!1))}_refinement(a){return new Pi({schema:this,typeName:Qe.ZodEffects,effect:{type:"refinement",refinement:a}})}superRefine(a){return this._refinement(a)}constructor(a){this.spa=this.safeParseAsync,this._def=a,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:n=>this["~validate"](n)}}optional(){return Fn.create(this,this._def)}nullable(){return Mi.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return un.create(this)}promise(){return _o.create(this,this._def)}or(a){return xo.create([this,a],this._def)}and(a){return jo.create(this,a,this._def)}transform(a){return new Pi({...na(this._def),schema:this,typeName:Qe.ZodEffects,effect:{type:"transform",transform:a}})}default(a){const n=typeof a=="function"?a:()=>a;return new Ao({...na(this._def),innerType:this,defaultValue:n,typeName:Qe.ZodDefault})}brand(){return new Up({typeName:Qe.ZodBranded,type:this,...na(this._def)})}catch(a){const n=typeof a=="function"?a:()=>a;return new To({...na(this._def),innerType:this,catchValue:n,typeName:Qe.ZodCatch})}describe(a){const n=this.constructor;return new n({...this._def,description:a})}pipe(a){return fc.create(this,a)}readonly(){return Eo.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const py=/^c[^\s-]{8,}$/i,gy=/^[0-9a-z]+$/,ky=/^[0-9A-HJKMNP-TV-Z]{26}$/i,by=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,fy=/^[a-z0-9_-]{21}$/i,yy=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,vy=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,xy=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,jy="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let yl;const wy=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,Sy=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,_y=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,Ay=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,Ty=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,Ey=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,Op="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",Cy=new RegExp(`^${Op}$`);function Hp(e){let a="[0-5]\\d";e.precision?a=`${a}\\.\\d{${e.precision}}`:e.precision==null&&(a=`${a}(\\.\\d+)?`);const n=e.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${a})${n}`}function Py(e){return new RegExp(`^${Hp(e)}$`)}function My(e){let a=`${Op}T${Hp(e)}`;const n=[];return n.push(e.local?"Z?":"Z"),e.offset&&n.push("([+-]\\d{2}:?\\d{2})"),a=`${a}(${n.join("|")})`,new RegExp(`^${a}$`)}function Iy(e,a){return!!((a==="v4"||!a)&&wy.test(e)||(a==="v6"||!a)&&_y.test(e))}function Ny(e,a){if(!yy.test(e))return!1;try{const[n]=e.split(".");if(!n)return!1;const i=n.replace(/-/g,"+").replace(/_/g,"/").padEnd(n.length+(4-n.length%4)%4,"="),r=JSON.parse(atob(i));return!(typeof r!="object"||r===null||"typ"in r&&(r==null?void 0:r.typ)!=="JWT"||!r.alg||a&&r.alg!==a)}catch{return!1}}function Ry(e,a){return!!((a==="v4"||!a)&&Sy.test(e)||(a==="v6"||!a)&&Ay.test(e))}class cn extends ua{_parse(a){if(this._def.coerce&&(a.data=String(a.data)),this._getType(a)!==Pe.string){const s=this._getOrReturnCtx(a);return Ae(s,{code:me.invalid_type,expected:Pe.string,received:s.parsedType}),Ye}const i=new ft;let r;for(const s of this._def.checks)if(s.kind==="min")a.data.length<s.value&&(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.too_small,minimum:s.value,type:"string",inclusive:!0,exact:!1,message:s.message}),i.dirty());else if(s.kind==="max")a.data.length>s.value&&(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.too_big,maximum:s.value,type:"string",inclusive:!0,exact:!1,message:s.message}),i.dirty());else if(s.kind==="length"){const o=a.data.length>s.value,l=a.data.length<s.value;(o||l)&&(r=this._getOrReturnCtx(a,r),o?Ae(r,{code:me.too_big,maximum:s.value,type:"string",inclusive:!0,exact:!0,message:s.message}):l&&Ae(r,{code:me.too_small,minimum:s.value,type:"string",inclusive:!0,exact:!0,message:s.message}),i.dirty())}else if(s.kind==="email")xy.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"email",code:me.invalid_string,message:s.message}),i.dirty());else if(s.kind==="emoji")yl||(yl=new RegExp(jy,"u")),yl.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"emoji",code:me.invalid_string,message:s.message}),i.dirty());else if(s.kind==="uuid")by.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"uuid",code:me.invalid_string,message:s.message}),i.dirty());else if(s.kind==="nanoid")fy.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"nanoid",code:me.invalid_string,message:s.message}),i.dirty());else if(s.kind==="cuid")py.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"cuid",code:me.invalid_string,message:s.message}),i.dirty());else if(s.kind==="cuid2")gy.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"cuid2",code:me.invalid_string,message:s.message}),i.dirty());else if(s.kind==="ulid")ky.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"ulid",code:me.invalid_string,message:s.message}),i.dirty());else if(s.kind==="url")try{new URL(a.data)}catch{r=this._getOrReturnCtx(a,r),Ae(r,{validation:"url",code:me.invalid_string,message:s.message}),i.dirty()}else s.kind==="regex"?(s.regex.lastIndex=0,s.regex.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"regex",code:me.invalid_string,message:s.message}),i.dirty())):s.kind==="trim"?a.data=a.data.trim():s.kind==="includes"?a.data.includes(s.value,s.position)||(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.invalid_string,validation:{includes:s.value,position:s.position},message:s.message}),i.dirty()):s.kind==="toLowerCase"?a.data=a.data.toLowerCase():s.kind==="toUpperCase"?a.data=a.data.toUpperCase():s.kind==="startsWith"?a.data.startsWith(s.value)||(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.invalid_string,validation:{startsWith:s.value},message:s.message}),i.dirty()):s.kind==="endsWith"?a.data.endsWith(s.value)||(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.invalid_string,validation:{endsWith:s.value},message:s.message}),i.dirty()):s.kind==="datetime"?My(s).test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.invalid_string,validation:"datetime",message:s.message}),i.dirty()):s.kind==="date"?Cy.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.invalid_string,validation:"date",message:s.message}),i.dirty()):s.kind==="time"?Py(s).test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.invalid_string,validation:"time",message:s.message}),i.dirty()):s.kind==="duration"?vy.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"duration",code:me.invalid_string,message:s.message}),i.dirty()):s.kind==="ip"?Iy(a.data,s.version)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"ip",code:me.invalid_string,message:s.message}),i.dirty()):s.kind==="jwt"?Ny(a.data,s.alg)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"jwt",code:me.invalid_string,message:s.message}),i.dirty()):s.kind==="cidr"?Ry(a.data,s.version)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"cidr",code:me.invalid_string,message:s.message}),i.dirty()):s.kind==="base64"?Ty.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"base64",code:me.invalid_string,message:s.message}),i.dirty()):s.kind==="base64url"?Ey.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"base64url",code:me.invalid_string,message:s.message}),i.dirty()):fa.assertNever(s);return{status:i.value,value:a.data}}_regex(a,n,i){return this.refinement(r=>a.test(r),{validation:n,code:me.invalid_string,...Le.errToObj(i)})}_addCheck(a){return new cn({...this._def,checks:[...this._def.checks,a]})}email(a){return this._addCheck({kind:"email",...Le.errToObj(a)})}url(a){return this._addCheck({kind:"url",...Le.errToObj(a)})}emoji(a){return this._addCheck({kind:"emoji",...Le.errToObj(a)})}uuid(a){return this._addCheck({kind:"uuid",...Le.errToObj(a)})}nanoid(a){return this._addCheck({kind:"nanoid",...Le.errToObj(a)})}cuid(a){return this._addCheck({kind:"cuid",...Le.errToObj(a)})}cuid2(a){return this._addCheck({kind:"cuid2",...Le.errToObj(a)})}ulid(a){return this._addCheck({kind:"ulid",...Le.errToObj(a)})}base64(a){return this._addCheck({kind:"base64",...Le.errToObj(a)})}base64url(a){return this._addCheck({kind:"base64url",...Le.errToObj(a)})}jwt(a){return this._addCheck({kind:"jwt",...Le.errToObj(a)})}ip(a){return this._addCheck({kind:"ip",...Le.errToObj(a)})}cidr(a){return this._addCheck({kind:"cidr",...Le.errToObj(a)})}datetime(a){return typeof a=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:a}):this._addCheck({kind:"datetime",precision:typeof(a==null?void 0:a.precision)>"u"?null:a==null?void 0:a.precision,offset:(a==null?void 0:a.offset)??!1,local:(a==null?void 0:a.local)??!1,...Le.errToObj(a==null?void 0:a.message)})}date(a){return this._addCheck({kind:"date",message:a})}time(a){return typeof a=="string"?this._addCheck({kind:"time",precision:null,message:a}):this._addCheck({kind:"time",precision:typeof(a==null?void 0:a.precision)>"u"?null:a==null?void 0:a.precision,...Le.errToObj(a==null?void 0:a.message)})}duration(a){return this._addCheck({kind:"duration",...Le.errToObj(a)})}regex(a,n){return this._addCheck({kind:"regex",regex:a,...Le.errToObj(n)})}includes(a,n){return this._addCheck({kind:"includes",value:a,position:n==null?void 0:n.position,...Le.errToObj(n==null?void 0:n.message)})}startsWith(a,n){return this._addCheck({kind:"startsWith",value:a,...Le.errToObj(n)})}endsWith(a,n){return this._addCheck({kind:"endsWith",value:a,...Le.errToObj(n)})}min(a,n){return this._addCheck({kind:"min",value:a,...Le.errToObj(n)})}max(a,n){return this._addCheck({kind:"max",value:a,...Le.errToObj(n)})}length(a,n){return this._addCheck({kind:"length",value:a,...Le.errToObj(n)})}nonempty(a){return this.min(1,Le.errToObj(a))}trim(){return new cn({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new cn({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new cn({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(a=>a.kind==="datetime")}get isDate(){return!!this._def.checks.find(a=>a.kind==="date")}get isTime(){return!!this._def.checks.find(a=>a.kind==="time")}get isDuration(){return!!this._def.checks.find(a=>a.kind==="duration")}get isEmail(){return!!this._def.checks.find(a=>a.kind==="email")}get isURL(){return!!this._def.checks.find(a=>a.kind==="url")}get isEmoji(){return!!this._def.checks.find(a=>a.kind==="emoji")}get isUUID(){return!!this._def.checks.find(a=>a.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(a=>a.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(a=>a.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(a=>a.kind==="cuid2")}get isULID(){return!!this._def.checks.find(a=>a.kind==="ulid")}get isIP(){return!!this._def.checks.find(a=>a.kind==="ip")}get isCIDR(){return!!this._def.checks.find(a=>a.kind==="cidr")}get isBase64(){return!!this._def.checks.find(a=>a.kind==="base64")}get isBase64url(){return!!this._def.checks.find(a=>a.kind==="base64url")}get minLength(){let a=null;for(const n of this._def.checks)n.kind==="min"&&(a===null||n.value>a)&&(a=n.value);return a}get maxLength(){let a=null;for(const n of this._def.checks)n.kind==="max"&&(a===null||n.value<a)&&(a=n.value);return a}}cn.create=e=>new cn({checks:[],typeName:Qe.ZodString,coerce:(e==null?void 0:e.coerce)??!1,...na(e)});function Ly(e,a){const n=(e.toString().split(".")[1]||"").length,i=(a.toString().split(".")[1]||"").length,r=n>i?n:i,s=Number.parseInt(e.toFixed(r).replace(".","")),o=Number.parseInt(a.toFixed(r).replace(".",""));return s%o/10**r}class Ai extends ua{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(a){if(this._def.coerce&&(a.data=Number(a.data)),this._getType(a)!==Pe.number){const s=this._getOrReturnCtx(a);return Ae(s,{code:me.invalid_type,expected:Pe.number,received:s.parsedType}),Ye}let i;const r=new ft;for(const s of this._def.checks)s.kind==="int"?fa.isInteger(a.data)||(i=this._getOrReturnCtx(a,i),Ae(i,{code:me.invalid_type,expected:"integer",received:"float",message:s.message}),r.dirty()):s.kind==="min"?(s.inclusive?a.data<s.value:a.data<=s.value)&&(i=this._getOrReturnCtx(a,i),Ae(i,{code:me.too_small,minimum:s.value,type:"number",inclusive:s.inclusive,exact:!1,message:s.message}),r.dirty()):s.kind==="max"?(s.inclusive?a.data>s.value:a.data>=s.value)&&(i=this._getOrReturnCtx(a,i),Ae(i,{code:me.too_big,maximum:s.value,type:"number",inclusive:s.inclusive,exact:!1,message:s.message}),r.dirty()):s.kind==="multipleOf"?Ly(a.data,s.value)!==0&&(i=this._getOrReturnCtx(a,i),Ae(i,{code:me.not_multiple_of,multipleOf:s.value,message:s.message}),r.dirty()):s.kind==="finite"?Number.isFinite(a.data)||(i=this._getOrReturnCtx(a,i),Ae(i,{code:me.not_finite,message:s.message}),r.dirty()):fa.assertNever(s);return{status:r.value,value:a.data}}gte(a,n){return this.setLimit("min",a,!0,Le.toString(n))}gt(a,n){return this.setLimit("min",a,!1,Le.toString(n))}lte(a,n){return this.setLimit("max",a,!0,Le.toString(n))}lt(a,n){return this.setLimit("max",a,!1,Le.toString(n))}setLimit(a,n,i,r){return new Ai({...this._def,checks:[...this._def.checks,{kind:a,value:n,inclusive:i,message:Le.toString(r)}]})}_addCheck(a){return new Ai({...this._def,checks:[...this._def.checks,a]})}int(a){return this._addCheck({kind:"int",message:Le.toString(a)})}positive(a){return this._addCheck({kind:"min",value:0,inclusive:!1,message:Le.toString(a)})}negative(a){return this._addCheck({kind:"max",value:0,inclusive:!1,message:Le.toString(a)})}nonpositive(a){return this._addCheck({kind:"max",value:0,inclusive:!0,message:Le.toString(a)})}nonnegative(a){return this._addCheck({kind:"min",value:0,inclusive:!0,message:Le.toString(a)})}multipleOf(a,n){return this._addCheck({kind:"multipleOf",value:a,message:Le.toString(n)})}finite(a){return this._addCheck({kind:"finite",message:Le.toString(a)})}safe(a){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:Le.toString(a)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:Le.toString(a)})}get minValue(){let a=null;for(const n of this._def.checks)n.kind==="min"&&(a===null||n.value>a)&&(a=n.value);return a}get maxValue(){let a=null;for(const n of this._def.checks)n.kind==="max"&&(a===null||n.value<a)&&(a=n.value);return a}get isInt(){return!!this._def.checks.find(a=>a.kind==="int"||a.kind==="multipleOf"&&fa.isInteger(a.value))}get isFinite(){let a=null,n=null;for(const i of this._def.checks){if(i.kind==="finite"||i.kind==="int"||i.kind==="multipleOf")return!0;i.kind==="min"?(n===null||i.value>n)&&(n=i.value):i.kind==="max"&&(a===null||i.value<a)&&(a=i.value)}return Number.isFinite(n)&&Number.isFinite(a)}}Ai.create=e=>new Ai({checks:[],typeName:Qe.ZodNumber,coerce:(e==null?void 0:e.coerce)||!1,...na(e)});class Ti extends ua{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(a){if(this._def.coerce)try{a.data=BigInt(a.data)}catch{return this._getInvalidInput(a)}if(this._getType(a)!==Pe.bigint)return this._getInvalidInput(a);let i;const r=new ft;for(const s of this._def.checks)s.kind==="min"?(s.inclusive?a.data<s.value:a.data<=s.value)&&(i=this._getOrReturnCtx(a,i),Ae(i,{code:me.too_small,type:"bigint",minimum:s.value,inclusive:s.inclusive,message:s.message}),r.dirty()):s.kind==="max"?(s.inclusive?a.data>s.value:a.data>=s.value)&&(i=this._getOrReturnCtx(a,i),Ae(i,{code:me.too_big,type:"bigint",maximum:s.value,inclusive:s.inclusive,message:s.message}),r.dirty()):s.kind==="multipleOf"?a.data%s.value!==BigInt(0)&&(i=this._getOrReturnCtx(a,i),Ae(i,{code:me.not_multiple_of,multipleOf:s.value,message:s.message}),r.dirty()):fa.assertNever(s);return{status:r.value,value:a.data}}_getInvalidInput(a){const n=this._getOrReturnCtx(a);return Ae(n,{code:me.invalid_type,expected:Pe.bigint,received:n.parsedType}),Ye}gte(a,n){return this.setLimit("min",a,!0,Le.toString(n))}gt(a,n){return this.setLimit("min",a,!1,Le.toString(n))}lte(a,n){return this.setLimit("max",a,!0,Le.toString(n))}lt(a,n){return this.setLimit("max",a,!1,Le.toString(n))}setLimit(a,n,i,r){return new Ti({...this._def,checks:[...this._def.checks,{kind:a,value:n,inclusive:i,message:Le.toString(r)}]})}_addCheck(a){return new Ti({...this._def,checks:[...this._def.checks,a]})}positive(a){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:Le.toString(a)})}negative(a){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:Le.toString(a)})}nonpositive(a){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:Le.toString(a)})}nonnegative(a){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:Le.toString(a)})}multipleOf(a,n){return this._addCheck({kind:"multipleOf",value:a,message:Le.toString(n)})}get minValue(){let a=null;for(const n of this._def.checks)n.kind==="min"&&(a===null||n.value>a)&&(a=n.value);return a}get maxValue(){let a=null;for(const n of this._def.checks)n.kind==="max"&&(a===null||n.value<a)&&(a=n.value);return a}}Ti.create=e=>new Ti({checks:[],typeName:Qe.ZodBigInt,coerce:(e==null?void 0:e.coerce)??!1,...na(e)});class fo extends ua{_parse(a){if(this._def.coerce&&(a.data=!!a.data),this._getType(a)!==Pe.boolean){const i=this._getOrReturnCtx(a);return Ae(i,{code:me.invalid_type,expected:Pe.boolean,received:i.parsedType}),Ye}return Ft(a.data)}}fo.create=e=>new fo({typeName:Qe.ZodBoolean,coerce:(e==null?void 0:e.coerce)||!1,...na(e)});class ws extends ua{_parse(a){if(this._def.coerce&&(a.data=new Date(a.data)),this._getType(a)!==Pe.date){const s=this._getOrReturnCtx(a);return Ae(s,{code:me.invalid_type,expected:Pe.date,received:s.parsedType}),Ye}if(Number.isNaN(a.data.getTime())){const s=this._getOrReturnCtx(a);return Ae(s,{code:me.invalid_date}),Ye}const i=new ft;let r;for(const s of this._def.checks)s.kind==="min"?a.data.getTime()<s.value&&(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.too_small,message:s.message,inclusive:!0,exact:!1,minimum:s.value,type:"date"}),i.dirty()):s.kind==="max"?a.data.getTime()>s.value&&(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.too_big,message:s.message,inclusive:!0,exact:!1,maximum:s.value,type:"date"}),i.dirty()):fa.assertNever(s);return{status:i.value,value:new Date(a.data.getTime())}}_addCheck(a){return new ws({...this._def,checks:[...this._def.checks,a]})}min(a,n){return this._addCheck({kind:"min",value:a.getTime(),message:Le.toString(n)})}max(a,n){return this._addCheck({kind:"max",value:a.getTime(),message:Le.toString(n)})}get minDate(){let a=null;for(const n of this._def.checks)n.kind==="min"&&(a===null||n.value>a)&&(a=n.value);return a!=null?new Date(a):null}get maxDate(){let a=null;for(const n of this._def.checks)n.kind==="max"&&(a===null||n.value<a)&&(a=n.value);return a!=null?new Date(a):null}}ws.create=e=>new ws({checks:[],coerce:(e==null?void 0:e.coerce)||!1,typeName:Qe.ZodDate,...na(e)});class Du extends ua{_parse(a){if(this._getType(a)!==Pe.symbol){const i=this._getOrReturnCtx(a);return Ae(i,{code:me.invalid_type,expected:Pe.symbol,received:i.parsedType}),Ye}return Ft(a.data)}}Du.create=e=>new Du({typeName:Qe.ZodSymbol,...na(e)});class yo extends ua{_parse(a){if(this._getType(a)!==Pe.undefined){const i=this._getOrReturnCtx(a);return Ae(i,{code:me.invalid_type,expected:Pe.undefined,received:i.parsedType}),Ye}return Ft(a.data)}}yo.create=e=>new yo({typeName:Qe.ZodUndefined,...na(e)});class vo extends ua{_parse(a){if(this._getType(a)!==Pe.null){const i=this._getOrReturnCtx(a);return Ae(i,{code:me.invalid_type,expected:Pe.null,received:i.parsedType}),Ye}return Ft(a.data)}}vo.create=e=>new vo({typeName:Qe.ZodNull,...na(e)});class Ou extends ua{constructor(){super(...arguments),this._any=!0}_parse(a){return Ft(a.data)}}Ou.create=e=>new Ou({typeName:Qe.ZodAny,...na(e)});class jd extends ua{constructor(){super(...arguments),this._unknown=!0}_parse(a){return Ft(a.data)}}jd.create=e=>new jd({typeName:Qe.ZodUnknown,...na(e)});class si extends ua{_parse(a){const n=this._getOrReturnCtx(a);return Ae(n,{code:me.invalid_type,expected:Pe.never,received:n.parsedType}),Ye}}si.create=e=>new si({typeName:Qe.ZodNever,...na(e)});class Hu extends ua{_parse(a){if(this._getType(a)!==Pe.undefined){const i=this._getOrReturnCtx(a);return Ae(i,{code:me.invalid_type,expected:Pe.void,received:i.parsedType}),Ye}return Ft(a.data)}}Hu.create=e=>new Hu({typeName:Qe.ZodVoid,...na(e)});class un extends ua{_parse(a){const{ctx:n,status:i}=this._processInputParams(a),r=this._def;if(n.parsedType!==Pe.array)return Ae(n,{code:me.invalid_type,expected:Pe.array,received:n.parsedType}),Ye;if(r.exactLength!==null){const o=n.data.length>r.exactLength.value,l=n.data.length<r.exactLength.value;(o||l)&&(Ae(n,{code:o?me.too_big:me.too_small,minimum:l?r.exactLength.value:void 0,maximum:o?r.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:r.exactLength.message}),i.dirty())}if(r.minLength!==null&&n.data.length<r.minLength.value&&(Ae(n,{code:me.too_small,minimum:r.minLength.value,type:"array",inclusive:!0,exact:!1,message:r.minLength.message}),i.dirty()),r.maxLength!==null&&n.data.length>r.maxLength.value&&(Ae(n,{code:me.too_big,maximum:r.maxLength.value,type:"array",inclusive:!0,exact:!1,message:r.maxLength.message}),i.dirty()),n.common.async)return Promise.all([...n.data].map((o,l)=>r.type._parseAsync(new gn(n,o,n.path,l)))).then(o=>ft.mergeArray(i,o));const s=[...n.data].map((o,l)=>r.type._parseSync(new gn(n,o,n.path,l)));return ft.mergeArray(i,s)}get element(){return this._def.type}min(a,n){return new un({...this._def,minLength:{value:a,message:Le.toString(n)}})}max(a,n){return new un({...this._def,maxLength:{value:a,message:Le.toString(n)}})}length(a,n){return new un({...this._def,exactLength:{value:a,message:Le.toString(n)}})}nonempty(a){return this.min(1,a)}}un.create=(e,a)=>new un({type:e,minLength:null,maxLength:null,exactLength:null,typeName:Qe.ZodArray,...na(a)});function is(e){if(e instanceof Va){const a={};for(const n in e.shape){const i=e.shape[n];a[n]=Fn.create(is(i))}return new Va({...e._def,shape:()=>a})}else return e instanceof un?new un({...e._def,type:is(e.element)}):e instanceof Fn?Fn.create(is(e.unwrap())):e instanceof Mi?Mi.create(is(e.unwrap())):e instanceof Ei?Ei.create(e.items.map(a=>is(a))):e}class Va extends ua{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const a=this._def.shape(),n=fa.objectKeys(a);return this._cached={shape:a,keys:n},this._cached}_parse(a){if(this._getType(a)!==Pe.object){const u=this._getOrReturnCtx(a);return Ae(u,{code:me.invalid_type,expected:Pe.object,received:u.parsedType}),Ye}const{status:i,ctx:r}=this._processInputParams(a),{shape:s,keys:o}=this._getCached(),l=[];if(!(this._def.catchall instanceof si&&this._def.unknownKeys==="strip"))for(const u in r.data)o.includes(u)||l.push(u);const d=[];for(const u of o){const m=s[u],h=r.data[u];d.push({key:{status:"valid",value:u},value:m._parse(new gn(r,h,r.path,u)),alwaysSet:u in r.data})}if(this._def.catchall instanceof si){const u=this._def.unknownKeys;if(u==="passthrough")for(const m of l)d.push({key:{status:"valid",value:m},value:{status:"valid",value:r.data[m]}});else if(u==="strict")l.length>0&&(Ae(r,{code:me.unrecognized_keys,keys:l}),i.dirty());else if(u!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const u=this._def.catchall;for(const m of l){const h=r.data[m];d.push({key:{status:"valid",value:m},value:u._parse(new gn(r,h,r.path,m)),alwaysSet:m in r.data})}}return r.common.async?Promise.resolve().then(async()=>{const u=[];for(const m of d){const h=await m.key,p=await m.value;u.push({key:h,value:p,alwaysSet:m.alwaysSet})}return u}).then(u=>ft.mergeObjectSync(i,u)):ft.mergeObjectSync(i,d)}get shape(){return this._def.shape()}strict(a){return Le.errToObj,new Va({...this._def,unknownKeys:"strict",...a!==void 0?{errorMap:(n,i)=>{var s,o;const r=((o=(s=this._def).errorMap)==null?void 0:o.call(s,n,i).message)??i.defaultError;return n.code==="unrecognized_keys"?{message:Le.errToObj(a).message??r}:{message:r}}}:{}})}strip(){return new Va({...this._def,unknownKeys:"strip"})}passthrough(){return new Va({...this._def,unknownKeys:"passthrough"})}extend(a){return new Va({...this._def,shape:()=>({...this._def.shape(),...a})})}merge(a){return new Va({unknownKeys:a._def.unknownKeys,catchall:a._def.catchall,shape:()=>({...this._def.shape(),...a._def.shape()}),typeName:Qe.ZodObject})}setKey(a,n){return this.augment({[a]:n})}catchall(a){return new Va({...this._def,catchall:a})}pick(a){const n={};for(const i of fa.objectKeys(a))a[i]&&this.shape[i]&&(n[i]=this.shape[i]);return new Va({...this._def,shape:()=>n})}omit(a){const n={};for(const i of fa.objectKeys(this.shape))a[i]||(n[i]=this.shape[i]);return new Va({...this._def,shape:()=>n})}deepPartial(){return is(this)}partial(a){const n={};for(const i of fa.objectKeys(this.shape)){const r=this.shape[i];a&&!a[i]?n[i]=r:n[i]=r.optional()}return new Va({...this._def,shape:()=>n})}required(a){const n={};for(const i of fa.objectKeys(this.shape))if(a&&!a[i])n[i]=this.shape[i];else{let s=this.shape[i];for(;s instanceof Fn;)s=s._def.innerType;n[i]=s}return new Va({...this._def,shape:()=>n})}keyof(){return qp(fa.objectKeys(this.shape))}}Va.create=(e,a)=>new Va({shape:()=>e,unknownKeys:"strip",catchall:si.create(),typeName:Qe.ZodObject,...na(a)});Va.strictCreate=(e,a)=>new Va({shape:()=>e,unknownKeys:"strict",catchall:si.create(),typeName:Qe.ZodObject,...na(a)});Va.lazycreate=(e,a)=>new Va({shape:e,unknownKeys:"strip",catchall:si.create(),typeName:Qe.ZodObject,...na(a)});class xo extends ua{_parse(a){const{ctx:n}=this._processInputParams(a),i=this._def.options;function r(s){for(const l of s)if(l.result.status==="valid")return l.result;for(const l of s)if(l.result.status==="dirty")return n.common.issues.push(...l.ctx.common.issues),l.result;const o=s.map(l=>new Kn(l.ctx.common.issues));return Ae(n,{code:me.invalid_union,unionErrors:o}),Ye}if(n.common.async)return Promise.all(i.map(async s=>{const o={...n,common:{...n.common,issues:[]},parent:null};return{result:await s._parseAsync({data:n.data,path:n.path,parent:o}),ctx:o}})).then(r);{let s;const o=[];for(const d of i){const u={...n,common:{...n.common,issues:[]},parent:null},m=d._parseSync({data:n.data,path:n.path,parent:u});if(m.status==="valid")return m;m.status==="dirty"&&!s&&(s={result:m,ctx:u}),u.common.issues.length&&o.push(u.common.issues)}if(s)return n.common.issues.push(...s.ctx.common.issues),s.result;const l=o.map(d=>new Kn(d));return Ae(n,{code:me.invalid_union,unionErrors:l}),Ye}}get options(){return this._def.options}}xo.create=(e,a)=>new xo({options:e,typeName:Qe.ZodUnion,...na(a)});const Dn=e=>e instanceof Sd?Dn(e.schema):e instanceof Pi?Dn(e.innerType()):e instanceof So?[e.value]:e instanceof Ci?e.options:e instanceof _d?fa.objectValues(e.enum):e instanceof Ao?Dn(e._def.innerType):e instanceof yo?[void 0]:e instanceof vo?[null]:e instanceof Fn?[void 0,...Dn(e.unwrap())]:e instanceof Mi?[null,...Dn(e.unwrap())]:e instanceof Up||e instanceof Eo?Dn(e.unwrap()):e instanceof To?Dn(e._def.innerType):[];class bc extends ua{_parse(a){const{ctx:n}=this._processInputParams(a);if(n.parsedType!==Pe.object)return Ae(n,{code:me.invalid_type,expected:Pe.object,received:n.parsedType}),Ye;const i=this.discriminator,r=n.data[i],s=this.optionsMap.get(r);return s?n.common.async?s._parseAsync({data:n.data,path:n.path,parent:n}):s._parseSync({data:n.data,path:n.path,parent:n}):(Ae(n,{code:me.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[i]}),Ye)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(a,n,i){const r=new Map;for(const s of n){const o=Dn(s.shape[a]);if(!o.length)throw new Error(`A discriminator value for key \`${a}\` could not be extracted from all schema options`);for(const l of o){if(r.has(l))throw new Error(`Discriminator property ${String(a)} has duplicate value ${String(l)}`);r.set(l,s)}}return new bc({typeName:Qe.ZodDiscriminatedUnion,discriminator:a,options:n,optionsMap:r,...na(i)})}}function wd(e,a){const n=ai(e),i=ai(a);if(e===a)return{valid:!0,data:e};if(n===Pe.object&&i===Pe.object){const r=fa.objectKeys(a),s=fa.objectKeys(e).filter(l=>r.indexOf(l)!==-1),o={...e,...a};for(const l of s){const d=wd(e[l],a[l]);if(!d.valid)return{valid:!1};o[l]=d.data}return{valid:!0,data:o}}else if(n===Pe.array&&i===Pe.array){if(e.length!==a.length)return{valid:!1};const r=[];for(let s=0;s<e.length;s++){const o=e[s],l=a[s],d=wd(o,l);if(!d.valid)return{valid:!1};r.push(d.data)}return{valid:!0,data:r}}else return n===Pe.date&&i===Pe.date&&+e==+a?{valid:!0,data:e}:{valid:!1}}class jo extends ua{_parse(a){const{status:n,ctx:i}=this._processInputParams(a),r=(s,o)=>{if(Lu(s)||Lu(o))return Ye;const l=wd(s.value,o.value);return l.valid?(($u(s)||$u(o))&&n.dirty(),{status:n.value,value:l.data}):(Ae(i,{code:me.invalid_intersection_types}),Ye)};return i.common.async?Promise.all([this._def.left._parseAsync({data:i.data,path:i.path,parent:i}),this._def.right._parseAsync({data:i.data,path:i.path,parent:i})]).then(([s,o])=>r(s,o)):r(this._def.left._parseSync({data:i.data,path:i.path,parent:i}),this._def.right._parseSync({data:i.data,path:i.path,parent:i}))}}jo.create=(e,a,n)=>new jo({left:e,right:a,typeName:Qe.ZodIntersection,...na(n)});class Ei extends ua{_parse(a){const{status:n,ctx:i}=this._processInputParams(a);if(i.parsedType!==Pe.array)return Ae(i,{code:me.invalid_type,expected:Pe.array,received:i.parsedType}),Ye;if(i.data.length<this._def.items.length)return Ae(i,{code:me.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),Ye;!this._def.rest&&i.data.length>this._def.items.length&&(Ae(i,{code:me.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.dirty());const s=[...i.data].map((o,l)=>{const d=this._def.items[l]||this._def.rest;return d?d._parse(new gn(i,o,i.path,l)):null}).filter(o=>!!o);return i.common.async?Promise.all(s).then(o=>ft.mergeArray(n,o)):ft.mergeArray(n,s)}get items(){return this._def.items}rest(a){return new Ei({...this._def,rest:a})}}Ei.create=(e,a)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new Ei({items:e,typeName:Qe.ZodTuple,rest:null,...na(a)})};class wo extends ua{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(a){const{status:n,ctx:i}=this._processInputParams(a);if(i.parsedType!==Pe.object)return Ae(i,{code:me.invalid_type,expected:Pe.object,received:i.parsedType}),Ye;const r=[],s=this._def.keyType,o=this._def.valueType;for(const l in i.data)r.push({key:s._parse(new gn(i,l,i.path,l)),value:o._parse(new gn(i,i.data[l],i.path,l)),alwaysSet:l in i.data});return i.common.async?ft.mergeObjectAsync(n,r):ft.mergeObjectSync(n,r)}get element(){return this._def.valueType}static create(a,n,i){return n instanceof ua?new wo({keyType:a,valueType:n,typeName:Qe.ZodRecord,...na(i)}):new wo({keyType:cn.create(),valueType:a,typeName:Qe.ZodRecord,...na(n)})}}class qu extends ua{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(a){const{status:n,ctx:i}=this._processInputParams(a);if(i.parsedType!==Pe.map)return Ae(i,{code:me.invalid_type,expected:Pe.map,received:i.parsedType}),Ye;const r=this._def.keyType,s=this._def.valueType,o=[...i.data.entries()].map(([l,d],u)=>({key:r._parse(new gn(i,l,i.path,[u,"key"])),value:s._parse(new gn(i,d,i.path,[u,"value"]))}));if(i.common.async){const l=new Map;return Promise.resolve().then(async()=>{for(const d of o){const u=await d.key,m=await d.value;if(u.status==="aborted"||m.status==="aborted")return Ye;(u.status==="dirty"||m.status==="dirty")&&n.dirty(),l.set(u.value,m.value)}return{status:n.value,value:l}})}else{const l=new Map;for(const d of o){const u=d.key,m=d.value;if(u.status==="aborted"||m.status==="aborted")return Ye;(u.status==="dirty"||m.status==="dirty")&&n.dirty(),l.set(u.value,m.value)}return{status:n.value,value:l}}}}qu.create=(e,a,n)=>new qu({valueType:a,keyType:e,typeName:Qe.ZodMap,...na(n)});class gr extends ua{_parse(a){const{status:n,ctx:i}=this._processInputParams(a);if(i.parsedType!==Pe.set)return Ae(i,{code:me.invalid_type,expected:Pe.set,received:i.parsedType}),Ye;const r=this._def;r.minSize!==null&&i.data.size<r.minSize.value&&(Ae(i,{code:me.too_small,minimum:r.minSize.value,type:"set",inclusive:!0,exact:!1,message:r.minSize.message}),n.dirty()),r.maxSize!==null&&i.data.size>r.maxSize.value&&(Ae(i,{code:me.too_big,maximum:r.maxSize.value,type:"set",inclusive:!0,exact:!1,message:r.maxSize.message}),n.dirty());const s=this._def.valueType;function o(d){const u=new Set;for(const m of d){if(m.status==="aborted")return Ye;m.status==="dirty"&&n.dirty(),u.add(m.value)}return{status:n.value,value:u}}const l=[...i.data.values()].map((d,u)=>s._parse(new gn(i,d,i.path,u)));return i.common.async?Promise.all(l).then(d=>o(d)):o(l)}min(a,n){return new gr({...this._def,minSize:{value:a,message:Le.toString(n)}})}max(a,n){return new gr({...this._def,maxSize:{value:a,message:Le.toString(n)}})}size(a,n){return this.min(a,n).max(a,n)}nonempty(a){return this.min(1,a)}}gr.create=(e,a)=>new gr({valueType:e,minSize:null,maxSize:null,typeName:Qe.ZodSet,...na(a)});class Sd extends ua{get schema(){return this._def.getter()}_parse(a){const{ctx:n}=this._processInputParams(a);return this._def.getter()._parse({data:n.data,path:n.path,parent:n})}}Sd.create=(e,a)=>new Sd({getter:e,typeName:Qe.ZodLazy,...na(a)});class So extends ua{_parse(a){if(a.data!==this._def.value){const n=this._getOrReturnCtx(a);return Ae(n,{received:n.data,code:me.invalid_literal,expected:this._def.value}),Ye}return{status:"valid",value:a.data}}get value(){return this._def.value}}So.create=(e,a)=>new So({value:e,typeName:Qe.ZodLiteral,...na(a)});function qp(e,a){return new Ci({values:e,typeName:Qe.ZodEnum,...na(a)})}class Ci extends ua{_parse(a){if(typeof a.data!="string"){const n=this._getOrReturnCtx(a),i=this._def.values;return Ae(n,{expected:fa.joinValues(i),received:n.parsedType,code:me.invalid_type}),Ye}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(a.data)){const n=this._getOrReturnCtx(a),i=this._def.values;return Ae(n,{received:n.data,code:me.invalid_enum_value,options:i}),Ye}return Ft(a.data)}get options(){return this._def.values}get enum(){const a={};for(const n of this._def.values)a[n]=n;return a}get Values(){const a={};for(const n of this._def.values)a[n]=n;return a}get Enum(){const a={};for(const n of this._def.values)a[n]=n;return a}extract(a,n=this._def){return Ci.create(a,{...this._def,...n})}exclude(a,n=this._def){return Ci.create(this.options.filter(i=>!a.includes(i)),{...this._def,...n})}}Ci.create=qp;class _d extends ua{_parse(a){const n=fa.getValidEnumValues(this._def.values),i=this._getOrReturnCtx(a);if(i.parsedType!==Pe.string&&i.parsedType!==Pe.number){const r=fa.objectValues(n);return Ae(i,{expected:fa.joinValues(r),received:i.parsedType,code:me.invalid_type}),Ye}if(this._cache||(this._cache=new Set(fa.getValidEnumValues(this._def.values))),!this._cache.has(a.data)){const r=fa.objectValues(n);return Ae(i,{received:i.data,code:me.invalid_enum_value,options:r}),Ye}return Ft(a.data)}get enum(){return this._def.values}}_d.create=(e,a)=>new _d({values:e,typeName:Qe.ZodNativeEnum,...na(a)});class _o extends ua{unwrap(){return this._def.type}_parse(a){const{ctx:n}=this._processInputParams(a);if(n.parsedType!==Pe.promise&&n.common.async===!1)return Ae(n,{code:me.invalid_type,expected:Pe.promise,received:n.parsedType}),Ye;const i=n.parsedType===Pe.promise?n.data:Promise.resolve(n.data);return Ft(i.then(r=>this._def.type.parseAsync(r,{path:n.path,errorMap:n.common.contextualErrorMap})))}}_o.create=(e,a)=>new _o({type:e,typeName:Qe.ZodPromise,...na(a)});class Pi extends ua{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===Qe.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(a){const{status:n,ctx:i}=this._processInputParams(a),r=this._def.effect||null,s={addIssue:o=>{Ae(i,o),o.fatal?n.abort():n.dirty()},get path(){return i.path}};if(s.addIssue=s.addIssue.bind(s),r.type==="preprocess"){const o=r.transform(i.data,s);if(i.common.async)return Promise.resolve(o).then(async l=>{if(n.value==="aborted")return Ye;const d=await this._def.schema._parseAsync({data:l,path:i.path,parent:i});return d.status==="aborted"?Ye:d.status==="dirty"||n.value==="dirty"?ir(d.value):d});{if(n.value==="aborted")return Ye;const l=this._def.schema._parseSync({data:o,path:i.path,parent:i});return l.status==="aborted"?Ye:l.status==="dirty"||n.value==="dirty"?ir(l.value):l}}if(r.type==="refinement"){const o=l=>{const d=r.refinement(l,s);if(i.common.async)return Promise.resolve(d);if(d instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return l};if(i.common.async===!1){const l=this._def.schema._parseSync({data:i.data,path:i.path,parent:i});return l.status==="aborted"?Ye:(l.status==="dirty"&&n.dirty(),o(l.value),{status:n.value,value:l.value})}else return this._def.schema._parseAsync({data:i.data,path:i.path,parent:i}).then(l=>l.status==="aborted"?Ye:(l.status==="dirty"&&n.dirty(),o(l.value).then(()=>({status:n.value,value:l.value}))))}if(r.type==="transform")if(i.common.async===!1){const o=this._def.schema._parseSync({data:i.data,path:i.path,parent:i});if(!js(o))return Ye;const l=r.transform(o.value,s);if(l instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:n.value,value:l}}else return this._def.schema._parseAsync({data:i.data,path:i.path,parent:i}).then(o=>js(o)?Promise.resolve(r.transform(o.value,s)).then(l=>({status:n.value,value:l})):Ye);fa.assertNever(r)}}Pi.create=(e,a,n)=>new Pi({schema:e,typeName:Qe.ZodEffects,effect:a,...na(n)});Pi.createWithPreprocess=(e,a,n)=>new Pi({schema:a,effect:{type:"preprocess",transform:e},typeName:Qe.ZodEffects,...na(n)});class Fn extends ua{_parse(a){return this._getType(a)===Pe.undefined?Ft(void 0):this._def.innerType._parse(a)}unwrap(){return this._def.innerType}}Fn.create=(e,a)=>new Fn({innerType:e,typeName:Qe.ZodOptional,...na(a)});class Mi extends ua{_parse(a){return this._getType(a)===Pe.null?Ft(null):this._def.innerType._parse(a)}unwrap(){return this._def.innerType}}Mi.create=(e,a)=>new Mi({innerType:e,typeName:Qe.ZodNullable,...na(a)});class Ao extends ua{_parse(a){const{ctx:n}=this._processInputParams(a);let i=n.data;return n.parsedType===Pe.undefined&&(i=this._def.defaultValue()),this._def.innerType._parse({data:i,path:n.path,parent:n})}removeDefault(){return this._def.innerType}}Ao.create=(e,a)=>new Ao({innerType:e,typeName:Qe.ZodDefault,defaultValue:typeof a.default=="function"?a.default:()=>a.default,...na(a)});class To extends ua{_parse(a){const{ctx:n}=this._processInputParams(a),i={...n,common:{...n.common,issues:[]}},r=this._def.innerType._parse({data:i.data,path:i.path,parent:{...i}});return bo(r)?r.then(s=>({status:"valid",value:s.status==="valid"?s.value:this._def.catchValue({get error(){return new Kn(i.common.issues)},input:i.data})})):{status:"valid",value:r.status==="valid"?r.value:this._def.catchValue({get error(){return new Kn(i.common.issues)},input:i.data})}}removeCatch(){return this._def.innerType}}To.create=(e,a)=>new To({innerType:e,typeName:Qe.ZodCatch,catchValue:typeof a.catch=="function"?a.catch:()=>a.catch,...na(a)});class Uu extends ua{_parse(a){if(this._getType(a)!==Pe.nan){const i=this._getOrReturnCtx(a);return Ae(i,{code:me.invalid_type,expected:Pe.nan,received:i.parsedType}),Ye}return{status:"valid",value:a.data}}}Uu.create=e=>new Uu({typeName:Qe.ZodNaN,...na(e)});class Up extends ua{_parse(a){const{ctx:n}=this._processInputParams(a),i=n.data;return this._def.type._parse({data:i,path:n.path,parent:n})}unwrap(){return this._def.type}}class fc extends ua{_parse(a){const{status:n,ctx:i}=this._processInputParams(a);if(i.common.async)return(async()=>{const s=await this._def.in._parseAsync({data:i.data,path:i.path,parent:i});return s.status==="aborted"?Ye:s.status==="dirty"?(n.dirty(),ir(s.value)):this._def.out._parseAsync({data:s.value,path:i.path,parent:i})})();{const r=this._def.in._parseSync({data:i.data,path:i.path,parent:i});return r.status==="aborted"?Ye:r.status==="dirty"?(n.dirty(),{status:"dirty",value:r.value}):this._def.out._parseSync({data:r.value,path:i.path,parent:i})}}static create(a,n){return new fc({in:a,out:n,typeName:Qe.ZodPipeline})}}class Eo extends ua{_parse(a){const n=this._def.innerType._parse(a),i=r=>(js(r)&&(r.value=Object.freeze(r.value)),r);return bo(n)?n.then(r=>i(r)):i(n)}unwrap(){return this._def.innerType}}Eo.create=(e,a)=>new Eo({innerType:e,typeName:Qe.ZodReadonly,...na(a)});var Qe;(function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline",e.ZodReadonly="ZodReadonly"})(Qe||(Qe={}));const k=cn.create,ce=Ai.create;Ti.create;const ge=fo.create;ws.create;const $y=yo.create,By=vo.create,Yo=jd.create;si.create;const Te=un.create,O=Va.create,xr=xo.create,zp=bc.create;jo.create;Ei.create;const mn=wo.create,ja=So.create,Se=Ci.create;_o.create;Fn.create;Mi.create;const Dy={string:e=>cn.create({...e,coerce:!0}),number:e=>Ai.create({...e,coerce:!0}),boolean:e=>fo.create({...e,coerce:!0}),bigint:e=>Ti.create({...e,coerce:!0}),date:e=>ws.create({...e,coerce:!0})},yc=Se(["brainstorming","objective","spec-ready","planned","executing","done"]),jr=Se(["brief","qa","audit","help","goal","no_effort"]),Oy=Se(["ok","drift","broken"]),Wn=Se(["tinggi","sedang","rendah"]),Fp=Se(["from-scratch","existing"]),hn=Se(["claude","codex","antigravity"]);Se(["critical","major","minor"]);const Ad=Se(["bug","fitur","pertanyaan","lainnya"]),Hy=Se(["new","accepted","rejected"]),qy=["changed","full"],Gp=Se(qy),Uy=new Set(["goal","no_effort"]);function Ii(e){return e==="qa"?"qa":Uy.has(e)?"goal":"brief"}function vc(e){const a=e??{};return"severity"in a?"qa":"goal"in a?"goal":"brief"}function Kp(e,a){return vc(a)===Ii(e)}function zu(e){return e==="minor"?"sedang":"tinggi"}function Fu(e){return e==="tinggi"?"major":"minor"}const zy={brief:["context","outcome"],qa:["steps","expected","actual","env"],goal:["goal","done"]};function Fy(e,a){const n=a??{},i=m=>typeof n[m]=="string"?n[m]:"",r=()=>n.priority==="tinggi"||n.priority==="rendah"?n.priority:"sedang",s=m=>m.filter(h=>i(h)!==""),o=vc(a),l=Ii(e),d=i("fromAudit"),u=(m,h)=>({payload:m,dropped:h,missing:zy[l].filter(p=>typeof m[p]!="string"||m[p]==="")});if(o===l)return{payload:{...n},dropped:[],missing:[]};if(l==="qa")return o==="brief"?u({severity:Fu(r()),steps:"",expected:i("outcome"),actual:i("context"),env:"",constraints:i("constraints"),...d?{fromAudit:d}:{}},[]):u({severity:Fu(r()),steps:"",expected:i("goal"),actual:"",env:"",constraints:i("constraints")},s(["done"]));if(l==="goal"){if(o==="brief"){const m=i("outcome")||i("context");return u({goal:m,done:"",constraints:i("constraints"),priority:r()},s([...i("outcome")?["context"]:[],"fromAudit"]))}return u({goal:i("expected"),done:"",constraints:i("constraints"),priority:zu(n.severity)},s(["steps","actual","env","fromAudit"]))}return o==="qa"?u({context:i("actual"),outcome:i("expected"),constraints:i("constraints"),priority:zu(n.severity),...d?{fromAudit:d}:{}},s(["steps","env"])):u({context:"",outcome:i("goal"),constraints:i("constraints"),priority:r()},s(["done"]))}const Wp="superpowers",Jn="superpowers:verification-before-completion",Gy="Skill mattpocock yang kontraknya mewawancarai manusia (`/grill-me`, `/to-spec`, `/triage`) JANGAN dipakai: pakai primitif model-invoked-nya untuk menguji rancanganmu sendiri, bukan untuk mewawancarai siapa pun. Hal yang masih ambigu dan akan mempengaruhi hasil tetap JANGAN diputuskan sendiri — bila kamu agen fase, daftarkan di `Keputusan terbuka:` laporanmu; bila tidak, ajukan lewat jalur tanya di klausa otonomi prompt ini. `to-tickets` di fase Plan dipakai HANYA sebagai penghasil berkas plan berkotak `- [ ]` di `docs/matt/plans/`, BUKAN penerbit tiket — hanoman sendiri adalah issue tracker-nya, jadi jangan menulis ke tracker eksternal mana pun.",Ky="Pakai skill Agent Skills langsung sesuai fase, bukan slash-command atau meta-router `using-agent-skills`. Kontrak fase, instruksi project/pengguna, dan jalur keputusan/review hanoman tetap berlaku: `spec-driven-development` hanya menyusun spec pada fase Spec, jangan menjalankan Plan atau Execute dari fase itu. Simpan spec di `docs/agent-skills/specs/` dan plan beserta SELURUH checklist task `- [ ]` di `docs/agent-skills/plans/`, dengan id backlog pada nama berkas; ini menggantikan default `SPEC.md`, `tasks/plan.md`, dan `tasks/todo.md` upstream. Jangan menimpa plan lain yang belum tuntas atau membuat tiket di tracker eksternal: hanoman adalah issue tracker-nya. Centang task di berkas plan yang sama setelah implementasi dan verifikasi. Hal ambigu yang mempengaruhi hasil mengikuti jalur tanya prompt ini; bila kamu agen fase, daftarkan di `Keputusan terbuka:` laporanmu.",Ni={superpowers:{id:"superpowers",label:"superpowers",planDir:"docs/superpowers/plans",specDir:"docs/superpowers/specs",phaseSkills:{Brainstorm:["superpowers:brainstorming"],Audit:["superpowers:systematic-debugging"],Plan:["superpowers:writing-plans"],Execute:["superpowers:executing-plans","superpowers:test-driven-development",Jn],Verifikasi:[Jn]},orchestratedPhaseSkills:{Execute:["superpowers:subagent-driven-development","superpowers:test-driven-development",Jn]},exitSkills:[Jn],requires:["superpowers"],install:{antigravity:[],claude:["claude plugin marketplace add obra/superpowers-marketplace","claude plugin install superpowers@superpowers-marketplace"],codex:["codex plugin add superpowers@openai-curated"]}},matt:{id:"matt",label:"mattpocock",planDir:"docs/matt/plans",specDir:"docs/matt/specs",phaseSkills:{Brainstorm:["mattpocock-skills:grilling"],Audit:["mattpocock-skills:diagnosing-bugs"],Plan:["mattpocock-skills:to-tickets"],Execute:["mattpocock-skills:implement","mattpocock-skills:tdd","mattpocock-skills:code-review"],Verifikasi:[Jn]},exitSkills:[Jn],extraClause:Gy,requires:["mattpocock-skills","superpowers"],install:{antigravity:[],claude:["claude plugin install mattpocock-skills","claude plugin marketplace add obra/superpowers-marketplace","claude plugin install superpowers@superpowers-marketplace"],codex:["npx skills@latest add mattpocock/skills","codex plugin add superpowers@openai-curated"]}},"agent-skills":{id:"agent-skills",label:"Agent Skills (Addy Osmani)",planDir:"docs/agent-skills/plans",specDir:"docs/agent-skills/specs",phaseSkills:{Brainstorm:["agent-skills:idea-refine"],Spec:["agent-skills:spec-driven-development"],Audit:["agent-skills:debugging-and-error-recovery","agent-skills:code-review-and-quality"],Plan:["agent-skills:planning-and-task-breakdown"],Execute:["agent-skills:incremental-implementation","agent-skills:test-driven-development","agent-skills:code-review-and-quality"],Verifikasi:[Jn]},exitSkills:[Jn],extraClause:Ky,requires:["agent-skills","superpowers"],install:{antigravity:[],claude:["claude plugin marketplace add addyosmani/agent-skills","claude plugin install agent-skills@addy-agent-skills","claude plugin marketplace add obra/superpowers-marketplace","claude plugin install superpowers@superpowers-marketplace"],codex:["codex plugin marketplace add addyosmani/agent-skills","codex plugin add agent-skills@agent-skills","codex plugin add superpowers@openai-curated"]}}},xc=Object.keys(Ni),Vp=e=>[...new Set(e)];Vp(xc.map(e=>Ni[e].planDir));Vp(xc.map(e=>Ni[e].specDir));function Gu(e){return(e?Ni[e]:void 0)??Ni[Wp]}const Yp=O({enabled:ge().default(!1),agent:hn.default("claude"),model:k().default("opus"),effort:k().default("xhigh")}),Jo=["inherit","flash","pro"],Ss={model:"gemini-3.8-flash-high",effort:"high"};let Qo=[{id:Ss.model,label:"Gemini 3.8 Flash High",efforts:[Ss.effort]}];function Wy(e){Qo=e}function Jp(e){var i;const a=Qo.find(r=>r.id===e);if(a)return a.efforts;const n=(i=/-(low|medium|high)$/.exec(e))==null?void 0:i[1];return n?[n]:[]}function jc(e){return Jo.some(a=>a===e)}const Qp=O({enabled:ge().default(!1),progress:ge().default(!0),engine:Yp.default({})}),Vy=Qp.parse({}),Yy=Se(["disabled","misconfigured","ready","running","error"]);O({configured:ge(),enabled:ge(),running:ge(),readiness:Yy,botUsername:k().min(1).nullable().default(null),allowlistCount:ce().int().min(0),agentTokenConfigured:ge(),missingCapabilities:Te(k()).default([]),lastUpdateAt:k().datetime().nullable().default(null),lastError:k().nullable().default(null)});const Jy=O({id:k().min(1),chatId:k().min(1),content:k().trim().min(1).max(1e3),createdAt:k().datetime(),updatedAt:k().datetime()});O({chatId:k().min(1),userId:k().min(1),sessionId:k().nullable(),activeProjectId:k().nullable(),activeSessionId:k().nullable(),personalityAgentId:k().nullable(),summary:k().max(4e3).nullable(),agent:hn,model:k().min(1),effort:k().min(1),memories:Te(Jy)});const Qy=["progress","final","decision","failure","confirmation"],Zy=Se(Qy),Xy=O({description:k().trim().min(1).max(500),method:Se(["POST","PATCH","PUT","DELETE"]),path:k().startsWith("/api/").max(1e3)});O({chatId:k().min(1),updateId:ce().int().nonnegative(),kind:Zy,text:k().trim().min(1).max(12e3),summary:k().trim().min(1).max(4e3).optional(),remember:Te(k().trim().min(1).max(1e3)).max(20).optional(),confirmation:Xy.optional()}).superRefine((e,a)=>{e.kind==="confirmation"&&!e.confirmation&&a.addIssue({code:me.custom,path:["confirmation"],message:"confirmation required"}),e.kind!=="confirmation"&&e.confirmation&&a.addIssue({code:me.custom,path:["confirmation"],message:"confirmation only valid for confirmation replies"})});O({id:k().min(1),chatId:k().nullable(),userId:k().nullable(),updateId:ce().int().nonnegative().nullable(),action:k().min(1),outcome:k().min(1),correlationId:k().nullable(),method:k().nullable(),path:k().nullable(),statusCode:ce().int().nullable(),createdAt:k().datetime()});O({text:k().trim().min(1).max(16e3)});const ev=80;O({name:k().max(ev*4)});const av=["off","default-branch","branch"],wr=O({mode:Se(av).default("off"),dest:Se(["local","origin"]).default("local"),branch:k().min(1).nullable().default(null),deleteBranch:ge().default(!1)}),hs={mode:"off",dest:"local",branch:null,deleteBranch:!1};function Ku(e){if(e==null)return null;const a=wr.safeParse(e);return a.success?a.data:null}function tv(e,a){return Ku(a)??Ku(e)??hs}const Wu={local:"lokal",origin:"origin"};function Zp(e){return e.mode==="off"?"tanpa auto-merge":`auto-merge ke ${e.mode==="default-branch"?`default branch repo (${Wu[e.dest]})`:`${e.branch??"—"} (${Wu[e.dest]})`}${e.deleteBranch?" · hapus branch kerja":""}`}const nv=32*1024,wc=["sessions:read","sessions:write","sessions:spawn","backlog:read","backlog:write","ide:read"],Xp=Se(wc),iv=O({enabled:ge().default(!1),capabilities:Te(Xp).default([])}),sv={enabled:!1,capabilities:[]},rv=e=>e<128?1:e<2048?2:e<65536?3:4;function ov(e){let a=0;for(let n=0;n<e.length;n++){const i=e.codePointAt(n);a+=rv(i),i>65535&&n++}return a}const eg=O({hubOrigin:k().min(1).max(200),userId:k().min(1).max(200),email:k().min(1).max(320)}).strict(),vn=k().min(1).max(64),lv=/(^|\/)\.\.?(\/|$)|%2e|%2f|%5c|\\|[?#]/i,ag=k().max(2048).regex(/^\/api\//).refine(e=>!lv.test(e),"path relay tak sah"),Sc=k().refine(e=>ov(e)<=nv,"part relay > 32 KiB"),tg=["GET","POST","PUT","PATCH","DELETE"],dv=O({t:ja("welcome"),v:ja(1),protocol:ce().int(),version:k().max(40)}).strict(),cv=O({t:ja("req"),id:vn,method:Se(tg),path:ag,query:k().max(2048).optional(),body:Yo().optional(),actor:eg}).strict(),uv=O({t:ja("cancel"),id:vn}).strict(),mv=O({t:ja("open"),sid:vn,path:ag,mode:Se(["read","write"]),actor:eg}).strict(),hv=O({t:ja("data"),sid:vn,d:Sc}).strict(),pv=O({t:ja("credit"),sid:vn,n:ce().int().min(1).max(4*1024*1024)}).strict(),ng=O({t:ja("close"),sid:vn,code:ce().int().min(1e3).max(4999),reason:k().max(120).optional()}).strict();zp("t",[dv,cv,uv,mv,hv,pv,ng]);const gv=O({t:ja("hello"),v:ja(1),protocol:ce().int(),version:k().max(40),capabilities:Te(Xp).max(wc.length)}).strict(),kv=O({t:ja("res"),id:vn,status:ce().int().min(100).max(599).optional(),contentType:k().max(200).optional(),part:Sc,end:ge()}).strict(),ig={cols:ce().int().min(1).max(1e3),rows:ce().int().min(1).max(1e3)},bv=O({t:ja("opened"),sid:vn,geometry:O(ig).strict().optional()}).strict(),fv=O({t:ja("geometry"),sid:vn,...ig}).strict(),yv=O({t:ja("data"),sid:vn,d:Sc,more:ja(!0).optional()}).strict();zp("t",[gv,kv,bv,fv,yv,ng]);O({control:O({enabled:ge(),capabilities:Te(k().max(40)).max(20)}).strict().optional(),logs:O({event:ge(),server:ge(),transcript:ge()}).strict().optional()}).strict();const sg=["lihat","kerja","tulis"],rg=Se(sg),vv=(()=>{const e=["sessions:read","backlog:read","ide:read"],a=[...e,"backlog:write","sessions:spawn"],n=[...a,"sessions:write"];return{lihat:e,kerja:a,tulis:n}})();O({tier:rg}).strict();O({tier:rg,from:k().min(1).max(200)}).strict();const og=["event","server","transcript"],xv=Se(og),lg=["debug","info","warn","error"],dg=Se(lg),jv=4*1024,wv={event:!0,server:!1,transcript:!1},Sv=O({event:ge().default(!0),server:ge().default(!1),transcript:ge().default(!1)}),_v={eventDays:90,serverDays:7,transcriptDays:30,maxBytes:256*1024**2},vl=e=>ce().int().min(1).max(365).default(e),Av=O({eventDays:vl(90),serverDays:vl(7),transcriptDays:vl(30),maxBytes:ce().int().min(16*1024**2).max(4*1024**3).default(256*1024**2)}),Tv=500,Ev=1*1024*1024,Vu=31,Yu=200,Cv=O({seq:k().regex(/^\d+$/),ts:k().datetime(),level:dg,kind:k().min(1).max(64),projectId:k().nullish(),specId:k().nullish(),sessionId:k().nullish(),msg:k().max(jv),data:mn(Yo()).nullish(),transcript:k().max(Ev).nullish()}).strict();O({lane:xv,entries:Te(Cv).min(1).max(Tv)}).strict();O({from:k().datetime(),to:k().datetime(),deviceId:k().optional(),projectId:k().optional(),specId:k().optional(),lane:k().optional(),level:dg.optional(),kind:k().optional(),q:k().max(200).optional(),cursor:k().optional(),limit:Dy.number().int().min(1).max(Yu).default(Yu)}).strict().refine(e=>Date.parse(e.to)>=Date.parse(e.from),{message:"to < from"}).refine(e=>Date.parse(e.to)-Date.parse(e.from)<=Vu*864e5,{message:`rentang > ${Vu} hari`});const cg=["feature","qa","scaffold","reverse","prd","audit","breakdown","goal","no_effort"],_c={feature:["Brainstorm","Objective","Spec","Plan","Execute"],qa:["Audit","Spec","Plan","Execute"],scaffold:["Brainstorm","Objective","Doc index"],reverse:["Scan","Docs teknis","Wawancara","Konvensi & index","Serah terima"],prd:["Brainstorm","PRD"],audit:["Audit","Laporan"],breakdown:["Analisis","Breakdown"],goal:["Goal","Verifikasi"],no_effort:["Kerjakan"]},Ac="hanoman-fase-";function Ju(e){return Ac+e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}const Pv=e=>e.startsWith(Ac),SL=new Set(cg.filter(e=>_c[e].some(a=>a==="Execute"||a==="Goal"))),Qu="Review",Mv=new Set(["feature","qa"]),Iv={claude:{model:"opus",effort:"high"},codex:{model:"gpt-5.6-sol",effort:"high"},antigravity:{model:"inherit",effort:null}},ug="2026-09-23-v2",hi=Se(["seeded","user"]),Nv=O({version:k().default(ug),claude:O({model:hi.default("seeded"),effort:hi.default("seeded")}).default({}),codex:O({model:hi.default("seeded"),effort:hi.default("seeded")}).default({}),antigravity:O({model:hi.default("seeded"),effort:hi.default("seeded")}).default({}),orchestration:mn(k(),hi).default({})}),Fe=(e,a)=>({model:e,effort:a}),En=(e,a,n=!0)=>({enabled:n,executeMode:"inline",claude:e,codex:a,antigravity:Object.fromEntries(Object.keys(e).map(i=>[i,{model:"inherit",effort:null}]))}),Rv={feature:En({Brainstorm:Fe("sonnet","medium"),Objective:Fe("sonnet","medium"),Spec:Fe("opus","high"),Plan:Fe("opus","high"),Execute:Fe("sonnet","high")},{Brainstorm:Fe("gpt-5.6-terra","medium"),Objective:Fe("gpt-5.6-terra","medium"),Spec:Fe("gpt-5.6-sol","high"),Plan:Fe("gpt-5.6-sol","high"),Execute:Fe("gpt-5.6-terra","high")}),qa:En({Audit:Fe("opus","high"),Spec:Fe("opus","high"),Plan:Fe("sonnet","high"),Execute:Fe("sonnet","high")},{Audit:Fe("gpt-5.6-sol","high"),Spec:Fe("gpt-5.6-sol","high"),Plan:Fe("gpt-5.6-terra","high"),Execute:Fe("gpt-5.6-terra","high")}),scaffold:En({Brainstorm:Fe("sonnet","medium"),Objective:Fe("sonnet","medium"),"Doc index":Fe("opus","high")},{Brainstorm:Fe("gpt-5.6-terra","medium"),Objective:Fe("gpt-5.6-terra","medium"),"Doc index":Fe("gpt-5.6-sol","high")}),reverse:En({Scan:Fe("sonnet","medium"),"Docs teknis":Fe("sonnet","high"),Wawancara:Fe("sonnet","medium"),"Konvensi & index":Fe("opus","medium"),"Serah terima":Fe("sonnet","low")},{Scan:Fe("gpt-5.6-terra","medium"),"Docs teknis":Fe("gpt-5.6-terra","high"),Wawancara:Fe("gpt-5.6-terra","medium"),"Konvensi & index":Fe("gpt-5.6-sol","medium"),"Serah terima":Fe("gpt-5.6-terra","low")}),prd:En({Brainstorm:Fe("sonnet","medium"),PRD:Fe("opus","high")},{Brainstorm:Fe("gpt-5.6-terra","medium"),PRD:Fe("gpt-5.6-sol","high")}),audit:En({Audit:Fe("opus","high"),Laporan:Fe("sonnet","medium")},{Audit:Fe("gpt-5.6-sol","high"),Laporan:Fe("gpt-5.6-terra","medium")}),breakdown:En({Analisis:Fe("opus","high"),Breakdown:Fe("opus","medium")},{Analisis:Fe("gpt-5.6-sol","high"),Breakdown:Fe("gpt-5.6-sol","medium")}),goal:En({Goal:Fe("sonnet","high"),Verifikasi:Fe("opus","medium")},{Goal:Fe("gpt-5.6-terra","high"),Verifikasi:Fe("gpt-5.6-sol","medium")}),no_effort:En({Kerjakan:Fe("haiku","low")},{Kerjakan:Fe("gpt-5.6-terra","low")},!1)},Lv=Object.fromEntries(cg.flatMap(e=>[[`${e}.enabled`,"seeded"],...["claude","codex","antigravity"].flatMap(a=>_c[e].flatMap(n=>[[`${e}.${a}.${n}.model`,"seeded"],[`${e}.${a}.${n}.effort`,"seeded"]]))])),$v={version:ug,claude:{model:"seeded",effort:"seeded"},codex:{model:"seeded",effort:"seeded"},antigravity:{model:"seeded",effort:"seeded"},orchestration:Lv},Bv=O({id:k(),name:k(),desc:k(),kind:Fp,repoDir:k().nullable().optional(),gitRemote:k().nullable().optional(),stack:k().default(""),docStatus:Oy,coverage:ce().int().min(0).max(100),createdAt:k()}),Zo=O({context:k(),outcome:k(),constraints:k(),priority:Wn,fromAudit:k().optional()}),Xo=O({severity:Se(["critical","major","minor"]),steps:k(),expected:k(),actual:k(),env:k(),constraints:k().default(""),fromAudit:k().optional()}),el=O({goal:k(),done:k(),constraints:k(),priority:Wn}),Dv=O({id:k(),reason:Se(["missing","unfinished","unmerged"])}),Ov=O({at:k(),from:k(),to:k(),by:k(),payload:Yo().optional()}),Hv=O({at:k(),by:k(),reason:k().optional()}),mg=O({id:k(),projectId:k(),title:k(),source:jr,stage:yc,priority:Wn,author:k(),objective:k(),payload:xr([Zo,Xo,el]).nullable(),branchFrom:k().nullable(),baseSha:k().nullable(),createdAt:k(),startedAt:k().nullable(),dependsOn:Te(k()).default([]),blockedBy:Te(Dv).default([]),autoMerge:wr.nullable().default(null),sourceHistory:Te(Ov).default([]),manualDone:Hv.nullable().default(null),reviewedAt:k().nullable().default(null)}),qv=mg.omit({payload:!0,sourceHistory:!0}).extend({version:ce().optional(),updatedAt:k().optional()});qv.omit({objective:!0});const Zu=["off","short","medium","long","blip","pop","ping","coin","alert","chime","success","bell","marimba","fanfare"],ls=["xhigh","high","medium","low","max","ultracode"];let _s=[{id:"default",label:"Default (rekomendasi CLI)",efforts:ls},{id:"opus",label:"Opus",efforts:ls},{id:"sonnet",label:"Sonnet",efforts:ls},{id:"haiku",label:"Haiku"},{id:"fable",label:"Fable",efforts:ls}];const hg="default",xl=["ultra","max","xhigh","high","medium","low"],Uv=["max","xhigh","high","medium","low"],pg=["xhigh","high","medium","low"];let kn=[{id:"gpt-6-astra",label:"GPT-6 Astra",efforts:xl,fallback:"medium",minClient:""},{id:"gpt-5.6-sol",label:"GPT-5.6 Sol",efforts:xl,fallback:"xhigh",minClient:"0.144.0"},{id:"gpt-5.6-terra",label:"GPT-5.6 Terra",efforts:xl,fallback:"xhigh",minClient:"0.144.0"},{id:"gpt-5.6-luna",label:"GPT-5.6 Luna",efforts:Uv,fallback:"xhigh",minClient:"0.144.0"},{id:"gpt-5.5",label:"GPT-5.5",efforts:pg,fallback:"xhigh",minClient:"0.124.0"}];function zv(e,a,n){_s=e,kn=a,n&&Wy(n)}function al(e){return _s.find(a=>a.id===e)??_s.find(a=>a.resolved===e)}function gg(){return _s.filter(e=>e.id!==hg)}function kg(e){var a;return((a=al(e))==null?void 0:a.efforts)??ls}function bg(e,a){const n=e.map(r=>({value:r.id,label:r.label}));if(!a||n.some(r=>r.value===a))return n;const i=e.find(r=>r.resolved===a);return[{value:a,label:i?`${i.label} (terpatok: ${a})`:a},...n]}function Tc(e,a){var i;const n=(i=al(e))==null?void 0:i.efforts;return!(n!=null&&n.length)||n.includes(a)?a:n.includes("xhigh")?"xhigh":n[0]}function tl(e){return kn.find(a=>a.id===e)}function Fv(e){var a;return((a=tl(e))==null?void 0:a.efforts)??pg}function Ec(e,a){const n=tl(e);return n?n.efforts.includes(a)?a:n.fallback:a}function fg(e,a){const n=e.split(".").map(Number),i=a.split(".").map(Number);for(let r=0;r<Math.max(n.length,i.length);r++){const s=(n[r]??0)-(i[r]??0);if(s!==0)return s}return 0}function Gv(e,a){var i;const n=(i=tl(e))==null?void 0:i.minClient;return!n||!a?!1:fg(a,n)<0}const yg=O({model:k().default("gpt-5.6-terra"),effort:k().default("medium")}),Td=yg.parse({}),vg=O({model:k().default(Ss.model),effort:k().default(Ss.effort)}),Kv=vg.parse({}),Xu={enabled:ge().default(!1)},Cc=O({enabled:ge().default(!1),paused:ge().default(!1),maxConcurrent:ce().int().min(1).default(2),launchGuard:O({enabled:ge().default(!0),maxLoadPerCore:ce().finite().positive().default(2.5),minMemAvailablePct:ce().finite().min(0).max(100).default(15)}).default({}),autonomy:Se(["full-control","butuh-keputusan"]).default("butuh-keputusan"),sources:O({backlog:O({...Xu,everyMin:ce().int().min(1).default(15)}).default({}),triase:O({...Xu,everyMin:ce().int().min(1).default(30)}).default({})}).default({})}),Wv=Cc.parse({}),xg=O({enabled:ge().default(!1),condition:k().max(4e3).default("")}),Vv=xg.parse({}),jg=O({enabled:ge().default(!1),agent:hn.default("claude"),model:k().default("opus"),effort:k().default("xhigh")}),Yv=jg.parse({}),Jv=Yp,Pc=O({enabled:ge().default(!1),paused:ge().default(!1),pausedProjects:Te(k()).default([]),everyMin:ce().int().min(1).max(1440).default(5),timeoutSec:ce().int().min(10).max(900).default(600),maxAutoAnswers:ce().int().min(1).max(20).default(3),maxConcurrent:ce().int().min(1).max(16).default(2),queueWaitSec:ce().int().min(0).max(900).default(120),flowTtlMin:ce().int().min(1).max(1440).default(60),requireGreenBeforeIntegrate:ge().default(!0),engine:Jv.default({})}),Qv=Pc.parse({}),wg=O({enabled:ge().default(!1),brainstormPerMonth:ce().int().min(0).max(1e3).default(2),askPerMonth:ce().int().min(0).max(1e4).default(30),model:k().default("opus"),effort:k().default("high"),timeoutSec:ce().int().min(10).max(900).default(180)}),Zv=wg.parse({}),jl=O({model:k().nullable().default(null),effort:k().nullable().default(null)});O({model:Se(Jo).nullable().default(null),effort:By().default(null)});const qn={model:200,effort:64,phase:64,phases:32},Xv=O({model:k().min(1).max(qn.model).nullable().optional(),effort:k().min(1).max(qn.effort).nullable().optional()}),ex=mn(k().min(1).max(qn.phase),Xv).refine(e=>Object.keys(e).length<=qn.phases,{message:`phaseOverrides maksimal ${qn.phases} fase`}),Cn=O({enabled:ge().default(!0),executeMode:Se(["inline","subagent"]).catch("inline").default("inline"),claude:mn(k(),jl).default({}),codex:mn(k(),jl).default({}),antigravity:mn(k(),jl).default({})}),Sg=O({feature:Cn.default({}),qa:Cn.default({}),scaffold:Cn.default({}),reverse:Cn.default({}),prd:Cn.default({}),audit:Cn.default({}),breakdown:Cn.default({}),goal:Cn.default({}),no_effort:Cn.default({})}),Mc=Sg.parse(Rv);O({model:k().default("sonnet"),effort:k().default("medium"),autoDefault:ge(),autoScaffold:ge(),notifyFail:ge(),notifyDone:ge().default(!0),notifySound:Se(Zu).default("short"),notifyDecision:ge().default(!0),notifyDecisionSound:Se(Zu).default("alert"),agentAccessEnabled:ge().default(!1),scheduler:Cc.default(Wv),goal:xg.default(Vv),agent:hn.default("claude"),codex:yg.default(Td),antigravity:vg.default(Kv),verifyScope:Gp.default("changed"),method:k().default(Wp),conflict:jg.default(Yv),lead:Pc.default(Qv),telegram:Qp.default(Vy),portalChat:wg.default(Zv),orchestration:Sg.default(Mc),remoteControl:iv.default(sv),logShipping:Sv.default(wv),logRetention:Av.default(_v),builtinAgents:mn(k(),k()).default({}),builtinAgentPolicies:mn(k(),k()).default({}),builtinRuntimeDefaults:Nv.default($v)});O({id:k(),type:Se(["done","decision","ticket","fail","lead"]).default("done"),specId:k().nullable(),sessionId:k().nullable(),title:k(),projectId:k().nullable(),createdAt:k(),readAt:k().nullable()});O({projectId:k(),path:k(),category:k(),content:k(),linked:ge(),root:ge()});O({id:k(),name:k(),createdAt:k(),lastSeenAt:k().nullable(),revokedAt:k().nullable()});const Ic="inherit",_g="0.151.0";function ax(e){var n;const a=e?(n=/(\d+)\.(\d+)\.(\d+)/.exec(e))==null?void 0:n[0]:null;return a?fg(a,_g)>=0:!1}function tx(e,a){return e!=="antigravity"||!a?null:Object.values(a).some(n=>n.model!=null&&!jc(n.model)||n.effort!=null)?"Antigravity child memakai tier native tanpa effort independen":null}function nx(e){const a=tx(e.runtime,e.phaseOverrides);if(a)throw new Error(a);const n=(e.orchestration??Mc)[e.flow];if(!e.nativeAgents||(n==null?void 0:n.enabled)===!1)return null;const i=(n==null?void 0:n[e.runtime])??{},r=e.runtime==="codex"?Ec:Tc,s=(l,d)=>{var g;const u=i[l],m=(g=e.phaseOverrides)==null?void 0:g[l];if(e.runtime==="antigravity"){const b=((m==null?void 0:m.model)!==void 0?m.model:u==null?void 0:u.model)??"inherit",v=(m==null?void 0:m.effort)!==void 0?m.effort:u==null?void 0:u.effort;if(!jc(b)||v!=null)throw new Error("Antigravity child memakai tier native tanpa effort independen");return{model:b,effort:null}}const h=(m==null?void 0:m.model)??(u==null?void 0:u.model)??d.model,p=e.runtime==="claude"&&h===hg?Ic:h;return{model:p,effort:r(p,(m==null?void 0:m.effort)??(u==null?void 0:u.effort)??d.effort??"medium")}},o=Mv.has(e.flow)?{agentName:Ju(Qu),phase:"Execute",...s(Qu,Iv[e.runtime])}:void 0;return{flow:e.flow,runtime:e.runtime,phases:_c[e.flow].map(l=>({phase:l,agentName:Ju(l),...s(l,e.orchestrator)})),...o?{reviewer:o}:{},executeMode:(n==null?void 0:n.executeMode)??"inline"}}const Ag=["projects:read","projects:write","backlog:read","backlog:write","sessions:read","sessions:write","docs:read","docs:write","ide:read","ide:write","vps:read","vps:write","settings:read","settings:write","support:read","support:write","notifications:read","notifications:write","lead:read","lead:write","agents:read","agents:write","skills:read","skills:write","telegram:read","telegram:write","team:read","team:write","qa:read","qa:write","webhooks:read","webhooks:write","clients:read","clients:write","portal:read","sessions:spawn","ide:git","backlog:lifecycle","vps:exec","activity:read","activity:write","portal-chat:read","portal-chat:write","qa:delete","sessions:decide","scheduler:read","scheduler:write","telegram:admin","tokens:read","tokens:write","devices:read","devices:write","access:read","access:admin","remote:read","remote:control","relay:exec","logs:read","logs:write","presence:read","metrics:read","metrics:write","sync:read","sync:write","sync:resolve","instance:admin"],nl=Se(Ag);O({id:nl,domain:k(),access:Se(["read","write","danger"]),label:k(),desc:k(),risk:Se(["rce","exec","data"]).optional()});const _L=[{domain:"projects",label:"Projects",desc:"Project, branch, binding, Help Center."},{domain:"backlog",label:"Backlog / Spec",desc:"Spec/backlog, dokumen, review diff, integrate."},{domain:"sessions",label:"Sesi",desc:"Sesi terminal, fase, jalankan claude/shell."},{domain:"docs",label:"Docs & PRD",desc:"Dokumen SoT project & PRD."},{domain:"ide",label:"IDE / Git",desc:"Tree, file, status git, graph, commit, diff."},{domain:"vps",label:"VPS",desc:"VPS, checklist kepatuhan, audit, konsol."},{domain:"settings",label:"Settings",desc:"Setelan & config runtime."},{domain:"support",label:"Help Desk",desc:"Tiket Help Center (Help Desk): lihat, terima/tolak, promosikan ke backlog."},{domain:"notifications",label:"Notifikasi",desc:"Lihat & kelola notifikasi."},{domain:"lead",label:"Lead",desc:"Minta putusan ke hanoman-lead & baca jejak keputusannya."},{domain:"agents",label:"Custom agent",desc:"Katalog persona agen global & per project."},{domain:"skills",label:"Skills",desc:"Skill global hanoman, user, plugin & per project."},{domain:"telegram",label:"Telegram",desc:"Status, binding, memory, reply, dan audit kanal operator Telegram."},{domain:"team",label:"Tim",desc:"Kartu papan Tim (kerja manusia), direktori anggota, eskalasi kartu ke backlog."},{domain:"qa",label:"QA",desc:"Laporan QA per project: test case, temuan, lampiran, ekspor/impor."},{domain:"webhooks",label:"Webhook",desc:"Endpoint webhook keluar, secret penandatanganan, riwayat pengiriman."},{domain:"clients",label:"Akun klien",desc:"Akun login portal klien dan project yang boleh dilihatnya."},{domain:"portal",label:"Portal klien",desc:"Lihat portal atas nama satu akun klien (baca-saja)."},{domain:"activity",label:"Aktivitas",desc:"Log aktivitas lintas device (stage, commit, PR) dan purge-nya."},{domain:"portal-chat",label:"Chat portal",desc:"Percakapan klien di chat portal (berisi email klien), PRD draft, dan ekspor transkrip."},{domain:"decisions",label:"Keputusan sesi",desc:"Jawab/rebut dialog AskUserQuestion sesi — gerbang manusia yang memutuskan."},{domain:"scheduler",label:"Cronjob",desc:"Cronjob per project: sesi agen terjadwal. Eksekusinya juga menuntut Sesi — buka sesi baru."},{domain:"tokens",label:"Agent token",desc:"Cetak/ubah/cabut agent token — hanya sebatas capability milik pemanggil."},{domain:"devices",label:"Device token",desc:"Kredensial mesin untuk sync & relay: daftar, cetak, cabut."},{domain:"access",label:"Akun & password",desc:"Daftar akun, buat/hapus akun admin, setel ulang password — setara akses penuh."},{domain:"remote",label:"Kendali jarak jauh",desc:"Grant kendali jarak jauh mesin ini dan lajur log ke hub."},{domain:"relay",label:"Relay perangkat",desc:"Aksi sesi di mesin lain lewat relay hub."},{domain:"logs",label:"Log terpusat",desc:"Pencarian log lintas device, transkrip, retensi."},{domain:"presence",label:"Presence",desc:"Sesi yang sedang hidup di seluruh device operator."},{domain:"metrics",label:"Metrik custom agent",desc:"Metrik pemakaian custom agent & disposisi per invokasi."},{domain:"sync",label:"Sync",desc:"Antrean konflik rekonsil, penghapusan tertunda, pemicu sync manual ke hub."},{domain:"instance",label:"Instance",desc:"Pasang pembaruan hanoman dan restart proses server."}];O({id:k(),name:k(),tokenPrefix:k(),capabilities:Te(nl),enabled:ge(),createdBy:k().nullable(),createdAt:k(),lastUsedAt:k().nullable(),revokedAt:k().nullable()});O({name:k().min(1),capabilities:Te(nl)});O({name:k().min(1).optional(),capabilities:Te(nl).optional(),enabled:ge().optional()});const wi=["claude","codex","antigravity"];Se(wi);const Tg={claude:"Claude Code",codex:"Codex CLI",antigravity:"Antigravity CLI"},ix=["always","smart"],Eg=Se(ix),Cg=k().min(1).max(64).regex(/^[a-z][a-z0-9_-]*$/),sx=["inherit","read-only","isolated-worktree"],Pg=Se(sx),Nc=/^[a-z][a-z0-9-]{1,39}$/,Mg=["Read","Write","Edit","Bash","Glob","Grep","WebFetch","WebSearch"],em="Task";O({id:k(),projectId:k().nullable(),name:k().regex(Nc),description:k(),instructions:k(),tools:Te(k()).nullable(),model:k().nullable(),mentions:Te(k()).nullable(),runtime:Se(wi).nullable(),activation:Eg.default("always"),effort:Cg.nullable().default(null),workspacePolicy:Pg.default("inherit"),maxTurns:ce().int().min(1).max(200).nullable().default(null),timeoutSeconds:ce().int().min(30).max(3600).nullable().default(null),enabled:ge(),createdAt:k(),updatedAt:k()});const Ig=O({projectId:k().nullable().optional(),name:k().regex(Nc).refine(e=>!Pv(e),{message:`awalan ${Ac} dicadangkan untuk agen fase hanoman`}),description:k().trim().min(1).max(500),instructions:k().trim().min(1).max(2e4),tools:Te(k()).nullable().optional(),model:k().nullable().optional(),mentions:Te(k()).nullable().optional(),runtime:Se(wi).nullable().optional(),activation:Eg.optional(),effort:Cg.nullable().optional(),workspacePolicy:Pg.optional(),maxTurns:ce().int().min(1).max(200).nullable().optional(),timeoutSeconds:ce().int().min(30).max(3600).nullable().optional(),enabled:ge().optional()});function rx(e,a){Ng(e,a),e.workspacePolicy==="isolated-worktree"&&e.runtime!=="claude"&&a.addIssue({code:me.custom,path:["workspacePolicy"],message:"isolated-worktree hanya tersedia untuk Claude Code"})}function Ng(e,a){e.runtime==="antigravity"&&(e.model!=null&&!jc(e.model)&&a.addIssue({code:me.custom,path:["model"],message:"Antigravity child memakai tier inherit, flash, atau pro"}),e.effort!=null&&a.addIssue({code:me.custom,path:["effort"],message:"Antigravity child tidak mendukung effort independen"}))}Ig.superRefine(rx);Ig.omit({name:!0,projectId:!0}).partial().superRefine((e,a)=>{Ng(e,a),e.workspacePolicy==="isolated-worktree"&&e.runtime!==void 0&&e.runtime!=="claude"&&a.addIssue({code:me.custom,path:["workspacePolicy"],message:"isolated-worktree hanya tersedia untuk Claude Code"})});function ox(e){const a=e.tools??[...Mg],n=(e.mentions??[]).length>0,i=a.filter(r=>r!==em);return n&&i.push(em),i}const lx=[{name:"product-designer",description:"Gunakan saat alur pengguna atau UI perlu DIRANCANG dan diwujudkan sesuai design system: layout, hierarki, token, copy, state visual (loading/kosong/error/disabled), dan aksesibilitas dasar. Beda dari frontend-engineer (state, data fetching, langganan, dan performa React pada desain yang sudah ada) dan solution-architect (keputusan lintas modul, bukan implementasi). Menghasilkan artefak desain atau patch UI dalam scope parent dengan bukti render nyata.",tools:["Read","Glob","Grep","Bash","Write","Edit","WebFetch","WebSearch"],enabledByDefault:!1,activation:"smart",effort:"medium",workspacePolicy:"isolated-worktree",maxTurns:60,timeoutSeconds:null,models:{claude:"sonnet",codex:"gpt-5.6-terra"},mentions:["a11y-auditor"],instructions:["Kamu merancang pengalaman produk dan mewujudkan UI sesuai design system serta mandat parent — bukan mengubah state/data-fetching React yang sudah benar (itu frontend-engineer) dan bukan keputusan lintas modul (itu solution-architect).","Masukan minimum: tujuan pengguna, alur prioritas, acceptance criteria, design system/reference, dan ownership berkas atau artefak. Baca komponen dan token existing sebelum membuat pola baru.","1. Petakan alur dan state VISUAL yang relevan: awal, loading, kosong, sukses, error, disabled, validasi, fokus/keyboard, serta hak akses. Tandai state yang tidak berlaku beserta alasan.","2. Gunakan token dan komponen existing (design system proyek ini — docs/token repo, cari sebelum mengasumsikan lokasinya); periksa hirarki, copy, kontras, label, fokus, urutan keyboard, dan viewport sempit/lebar. Referensi web hanya bila perlu panduan primer.","3. Buat artefak atau patch hanya dalam ownership yang diserahkan; jangan memperluas fitur, mengubah kontrak data/state React, atau mengubah backend tanpa mandat — serahkan itu ke frontend-engineer/parent.","4. Cocokkan hasil dengan acceptance criteria dari RENDER NYATA, bukan pembacaan kode: periksa package.json proyek ini dulu — bila Playwright/Puppeteer terpasang, pakai itu; bila tidak, fallback ke Chrome headless (`--remote-debugging-port`) dikendalikan CDP (`/json/list`, `Page.navigate`, `Runtime.evaluate`, `Page.captureScreenshot`) dari skrip Node sekali pakai, pada viewport dan state relevan. Bash/WebFetch/kode saja BUKAN bukti render; tanpa CDP/Playwright tersedia, laporkan gap verifikasi visual secara eksplisit.","Berhenti saat mandat terpenuhi atau keputusan produk/dependensi menghalangi; kerjakan bagian independen lalu eskalasi ke parent. Untuk UI interaktif (form, dialog, menu, live region), sarankan parent memanggil a11y-auditor sesudahnya.","Handoff ringkas: artefak/berkas berubah, keputusan desain, state diperiksa, acceptance beserta bukti render, ketidakpastian dan gap, serta langkah parent. Jangan membuat proses berat untuk UI kecil.","Jangan mengklaim selesai bila acceptance penting belum terverifikasi."].join(`
|
|
10
|
+
*/var ny=Mt,iy=Symbol.for("react.element"),sy=Symbol.for("react.fragment"),ry=Object.prototype.hasOwnProperty,oy=ny.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,ly={key:!0,ref:!0,__self:!0,__source:!0};function Bp(e,a,n){var i,r={},s=null,o=null;n!==void 0&&(s=""+n),a.key!==void 0&&(s=""+a.key),a.ref!==void 0&&(o=a.ref);for(i in a)ry.call(a,i)&&!ly.hasOwnProperty(i)&&(r[i]=a[i]);if(e&&e.defaultProps)for(i in a=e.defaultProps,a)r[i]===void 0&&(r[i]=a[i]);return{$$typeof:iy,type:e,key:s,ref:o,props:r,_owner:oy.current}}Vo.Fragment=sy;Vo.jsx=Bp;Vo.jsxs=Bp;$p.exports=Vo;var t=$p.exports,Dp,Iu=Yf;Dp=Iu.createRoot,Iu.hydrateRoot;const dy="modulepreload",cy=function(e){return"/"+e},Nu={},Xt=function(a,n,i){let r=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),l=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));r=Promise.allSettled(n.map(d=>{if(d=cy(d),d in Nu)return;Nu[d]=!0;const u=d.endsWith(".css"),m=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${d}"]${m}`))return;const h=document.createElement("link");if(h.rel=u?"stylesheet":dy,u||(h.as="script"),h.crossOrigin="",h.href=d,l&&h.setAttribute("nonce",l),document.head.appendChild(h),u)return new Promise((p,g)=>{h.addEventListener("load",p),h.addEventListener("error",()=>g(new Error(`Unable to preload CSS for ${d}`)))})}))}function s(o){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o}return r.then(o=>{for(const l of o||[])l.status==="rejected"&&s(l.reason);return a().catch(s)})};var fa;(function(e){e.assertEqual=r=>{};function a(r){}e.assertIs=a;function n(r){throw new Error}e.assertNever=n,e.arrayToEnum=r=>{const s={};for(const o of r)s[o]=o;return s},e.getValidEnumValues=r=>{const s=e.objectKeys(r).filter(l=>typeof r[r[l]]!="number"),o={};for(const l of s)o[l]=r[l];return e.objectValues(o)},e.objectValues=r=>e.objectKeys(r).map(function(s){return r[s]}),e.objectKeys=typeof Object.keys=="function"?r=>Object.keys(r):r=>{const s=[];for(const o in r)Object.prototype.hasOwnProperty.call(r,o)&&s.push(o);return s},e.find=(r,s)=>{for(const o of r)if(s(o))return o},e.isInteger=typeof Number.isInteger=="function"?r=>Number.isInteger(r):r=>typeof r=="number"&&Number.isFinite(r)&&Math.floor(r)===r;function i(r,s=" | "){return r.map(o=>typeof o=="string"?`'${o}'`:o).join(s)}e.joinValues=i,e.jsonStringifyReplacer=(r,s)=>typeof s=="bigint"?s.toString():s})(fa||(fa={}));var Ru;(function(e){e.mergeShapes=(a,n)=>({...a,...n})})(Ru||(Ru={}));const Pe=fa.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),ai=e=>{switch(typeof e){case"undefined":return Pe.undefined;case"string":return Pe.string;case"number":return Number.isNaN(e)?Pe.nan:Pe.number;case"boolean":return Pe.boolean;case"function":return Pe.function;case"bigint":return Pe.bigint;case"symbol":return Pe.symbol;case"object":return Array.isArray(e)?Pe.array:e===null?Pe.null:e.then&&typeof e.then=="function"&&e.catch&&typeof e.catch=="function"?Pe.promise:typeof Map<"u"&&e instanceof Map?Pe.map:typeof Set<"u"&&e instanceof Set?Pe.set:typeof Date<"u"&&e instanceof Date?Pe.date:Pe.object;default:return Pe.unknown}},me=fa.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);class Kn extends Error{get errors(){return this.issues}constructor(a){super(),this.issues=[],this.addIssue=i=>{this.issues=[...this.issues,i]},this.addIssues=(i=[])=>{this.issues=[...this.issues,...i]};const n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=a}format(a){const n=a||function(s){return s.message},i={_errors:[]},r=s=>{for(const o of s.issues)if(o.code==="invalid_union")o.unionErrors.map(r);else if(o.code==="invalid_return_type")r(o.returnTypeError);else if(o.code==="invalid_arguments")r(o.argumentsError);else if(o.path.length===0)i._errors.push(n(o));else{let l=i,d=0;for(;d<o.path.length;){const u=o.path[d];d===o.path.length-1?(l[u]=l[u]||{_errors:[]},l[u]._errors.push(n(o))):l[u]=l[u]||{_errors:[]},l=l[u],d++}}};return r(this),i}static assert(a){if(!(a instanceof Kn))throw new Error(`Not a ZodError: ${a}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,fa.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(a=n=>n.message){const n={},i=[];for(const r of this.issues)if(r.path.length>0){const s=r.path[0];n[s]=n[s]||[],n[s].push(a(r))}else i.push(a(r));return{formErrors:i,fieldErrors:n}}get formErrors(){return this.flatten()}}Kn.create=e=>new Kn(e);const xd=(e,a)=>{let n;switch(e.code){case me.invalid_type:e.received===Pe.undefined?n="Required":n=`Expected ${e.expected}, received ${e.received}`;break;case me.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(e.expected,fa.jsonStringifyReplacer)}`;break;case me.unrecognized_keys:n=`Unrecognized key(s) in object: ${fa.joinValues(e.keys,", ")}`;break;case me.invalid_union:n="Invalid input";break;case me.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${fa.joinValues(e.options)}`;break;case me.invalid_enum_value:n=`Invalid enum value. Expected ${fa.joinValues(e.options)}, received '${e.received}'`;break;case me.invalid_arguments:n="Invalid function arguments";break;case me.invalid_return_type:n="Invalid function return type";break;case me.invalid_date:n="Invalid date";break;case me.invalid_string:typeof e.validation=="object"?"includes"in e.validation?(n=`Invalid input: must include "${e.validation.includes}"`,typeof e.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?n=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?n=`Invalid input: must end with "${e.validation.endsWith}"`:fa.assertNever(e.validation):e.validation!=="regex"?n=`Invalid ${e.validation}`:n="Invalid";break;case me.too_small:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="bigint"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:n="Invalid input";break;case me.too_big:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="bigint"?n=`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:n="Invalid input";break;case me.custom:n="Invalid input";break;case me.invalid_intersection_types:n="Intersection results could not be merged";break;case me.not_multiple_of:n=`Number must be a multiple of ${e.multipleOf}`;break;case me.not_finite:n="Number must be finite";break;default:n=a.defaultError,fa.assertNever(e)}return{message:n}};let uy=xd;function my(){return uy}const hy=e=>{const{data:a,path:n,errorMaps:i,issueData:r}=e,s=[...n,...r.path||[]],o={...r,path:s};if(r.message!==void 0)return{...r,path:s,message:r.message};let l="";const d=i.filter(u=>!!u).slice().reverse();for(const u of d)l=u(o,{data:a,defaultError:l}).message;return{...r,path:s,message:l}};function Ae(e,a){const n=my(),i=hy({issueData:a,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,n,n===xd?void 0:xd].filter(r=>!!r)});e.common.issues.push(i)}class ft{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(a,n){const i=[];for(const r of n){if(r.status==="aborted")return Ye;r.status==="dirty"&&a.dirty(),i.push(r.value)}return{status:a.value,value:i}}static async mergeObjectAsync(a,n){const i=[];for(const r of n){const s=await r.key,o=await r.value;i.push({key:s,value:o})}return ft.mergeObjectSync(a,i)}static mergeObjectSync(a,n){const i={};for(const r of n){const{key:s,value:o}=r;if(s.status==="aborted"||o.status==="aborted")return Ye;s.status==="dirty"&&a.dirty(),o.status==="dirty"&&a.dirty(),s.value!=="__proto__"&&(typeof o.value<"u"||r.alwaysSet)&&(i[s.value]=o.value)}return{status:a.value,value:i}}}const Ye=Object.freeze({status:"aborted"}),ir=e=>({status:"dirty",value:e}),Ft=e=>({status:"valid",value:e}),Lu=e=>e.status==="aborted",$u=e=>e.status==="dirty",js=e=>e.status==="valid",bo=e=>typeof Promise<"u"&&e instanceof Promise;var Le;(function(e){e.errToObj=a=>typeof a=="string"?{message:a}:a||{},e.toString=a=>typeof a=="string"?a:a==null?void 0:a.message})(Le||(Le={}));class gn{constructor(a,n,i,r){this._cachedPath=[],this.parent=a,this.data=n,this._path=i,this._key=r}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const Bu=(e,a)=>{if(js(a))return{success:!0,data:a.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const n=new Kn(e.common.issues);return this._error=n,this._error}}};function na(e){if(!e)return{};const{errorMap:a,invalid_type_error:n,required_error:i,description:r}=e;if(a&&(n||i))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return a?{errorMap:a,description:r}:{errorMap:(o,l)=>{const{message:d}=e;return o.code==="invalid_enum_value"?{message:d??l.defaultError}:typeof l.data>"u"?{message:d??i??l.defaultError}:o.code!=="invalid_type"?{message:l.defaultError}:{message:d??n??l.defaultError}},description:r}}class ua{get description(){return this._def.description}_getType(a){return ai(a.data)}_getOrReturnCtx(a,n){return n||{common:a.parent.common,data:a.data,parsedType:ai(a.data),schemaErrorMap:this._def.errorMap,path:a.path,parent:a.parent}}_processInputParams(a){return{status:new ft,ctx:{common:a.parent.common,data:a.data,parsedType:ai(a.data),schemaErrorMap:this._def.errorMap,path:a.path,parent:a.parent}}}_parseSync(a){const n=this._parse(a);if(bo(n))throw new Error("Synchronous parse encountered promise.");return n}_parseAsync(a){const n=this._parse(a);return Promise.resolve(n)}parse(a,n){const i=this.safeParse(a,n);if(i.success)return i.data;throw i.error}safeParse(a,n){const i={common:{issues:[],async:(n==null?void 0:n.async)??!1,contextualErrorMap:n==null?void 0:n.errorMap},path:(n==null?void 0:n.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:a,parsedType:ai(a)},r=this._parseSync({data:a,path:i.path,parent:i});return Bu(i,r)}"~validate"(a){var i,r;const n={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:a,parsedType:ai(a)};if(!this["~standard"].async)try{const s=this._parseSync({data:a,path:[],parent:n});return js(s)?{value:s.value}:{issues:n.common.issues}}catch(s){(r=(i=s==null?void 0:s.message)==null?void 0:i.toLowerCase())!=null&&r.includes("encountered")&&(this["~standard"].async=!0),n.common={issues:[],async:!0}}return this._parseAsync({data:a,path:[],parent:n}).then(s=>js(s)?{value:s.value}:{issues:n.common.issues})}async parseAsync(a,n){const i=await this.safeParseAsync(a,n);if(i.success)return i.data;throw i.error}async safeParseAsync(a,n){const i={common:{issues:[],contextualErrorMap:n==null?void 0:n.errorMap,async:!0},path:(n==null?void 0:n.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:a,parsedType:ai(a)},r=this._parse({data:a,path:i.path,parent:i}),s=await(bo(r)?r:Promise.resolve(r));return Bu(i,s)}refine(a,n){const i=r=>typeof n=="string"||typeof n>"u"?{message:n}:typeof n=="function"?n(r):n;return this._refinement((r,s)=>{const o=a(r),l=()=>s.addIssue({code:me.custom,...i(r)});return typeof Promise<"u"&&o instanceof Promise?o.then(d=>d?!0:(l(),!1)):o?!0:(l(),!1)})}refinement(a,n){return this._refinement((i,r)=>a(i)?!0:(r.addIssue(typeof n=="function"?n(i,r):n),!1))}_refinement(a){return new Pi({schema:this,typeName:Qe.ZodEffects,effect:{type:"refinement",refinement:a}})}superRefine(a){return this._refinement(a)}constructor(a){this.spa=this.safeParseAsync,this._def=a,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:n=>this["~validate"](n)}}optional(){return Fn.create(this,this._def)}nullable(){return Mi.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return un.create(this)}promise(){return _o.create(this,this._def)}or(a){return xo.create([this,a],this._def)}and(a){return jo.create(this,a,this._def)}transform(a){return new Pi({...na(this._def),schema:this,typeName:Qe.ZodEffects,effect:{type:"transform",transform:a}})}default(a){const n=typeof a=="function"?a:()=>a;return new Ao({...na(this._def),innerType:this,defaultValue:n,typeName:Qe.ZodDefault})}brand(){return new Up({typeName:Qe.ZodBranded,type:this,...na(this._def)})}catch(a){const n=typeof a=="function"?a:()=>a;return new To({...na(this._def),innerType:this,catchValue:n,typeName:Qe.ZodCatch})}describe(a){const n=this.constructor;return new n({...this._def,description:a})}pipe(a){return fc.create(this,a)}readonly(){return Eo.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const py=/^c[^\s-]{8,}$/i,gy=/^[0-9a-z]+$/,ky=/^[0-9A-HJKMNP-TV-Z]{26}$/i,by=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,fy=/^[a-z0-9_-]{21}$/i,yy=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,vy=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,xy=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,jy="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let yl;const wy=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,Sy=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,_y=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,Ay=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,Ty=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,Ey=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,Op="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",Cy=new RegExp(`^${Op}$`);function Hp(e){let a="[0-5]\\d";e.precision?a=`${a}\\.\\d{${e.precision}}`:e.precision==null&&(a=`${a}(\\.\\d+)?`);const n=e.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${a})${n}`}function Py(e){return new RegExp(`^${Hp(e)}$`)}function My(e){let a=`${Op}T${Hp(e)}`;const n=[];return n.push(e.local?"Z?":"Z"),e.offset&&n.push("([+-]\\d{2}:?\\d{2})"),a=`${a}(${n.join("|")})`,new RegExp(`^${a}$`)}function Iy(e,a){return!!((a==="v4"||!a)&&wy.test(e)||(a==="v6"||!a)&&_y.test(e))}function Ny(e,a){if(!yy.test(e))return!1;try{const[n]=e.split(".");if(!n)return!1;const i=n.replace(/-/g,"+").replace(/_/g,"/").padEnd(n.length+(4-n.length%4)%4,"="),r=JSON.parse(atob(i));return!(typeof r!="object"||r===null||"typ"in r&&(r==null?void 0:r.typ)!=="JWT"||!r.alg||a&&r.alg!==a)}catch{return!1}}function Ry(e,a){return!!((a==="v4"||!a)&&Sy.test(e)||(a==="v6"||!a)&&Ay.test(e))}class cn extends ua{_parse(a){if(this._def.coerce&&(a.data=String(a.data)),this._getType(a)!==Pe.string){const s=this._getOrReturnCtx(a);return Ae(s,{code:me.invalid_type,expected:Pe.string,received:s.parsedType}),Ye}const i=new ft;let r;for(const s of this._def.checks)if(s.kind==="min")a.data.length<s.value&&(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.too_small,minimum:s.value,type:"string",inclusive:!0,exact:!1,message:s.message}),i.dirty());else if(s.kind==="max")a.data.length>s.value&&(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.too_big,maximum:s.value,type:"string",inclusive:!0,exact:!1,message:s.message}),i.dirty());else if(s.kind==="length"){const o=a.data.length>s.value,l=a.data.length<s.value;(o||l)&&(r=this._getOrReturnCtx(a,r),o?Ae(r,{code:me.too_big,maximum:s.value,type:"string",inclusive:!0,exact:!0,message:s.message}):l&&Ae(r,{code:me.too_small,minimum:s.value,type:"string",inclusive:!0,exact:!0,message:s.message}),i.dirty())}else if(s.kind==="email")xy.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"email",code:me.invalid_string,message:s.message}),i.dirty());else if(s.kind==="emoji")yl||(yl=new RegExp(jy,"u")),yl.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"emoji",code:me.invalid_string,message:s.message}),i.dirty());else if(s.kind==="uuid")by.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"uuid",code:me.invalid_string,message:s.message}),i.dirty());else if(s.kind==="nanoid")fy.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"nanoid",code:me.invalid_string,message:s.message}),i.dirty());else if(s.kind==="cuid")py.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"cuid",code:me.invalid_string,message:s.message}),i.dirty());else if(s.kind==="cuid2")gy.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"cuid2",code:me.invalid_string,message:s.message}),i.dirty());else if(s.kind==="ulid")ky.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"ulid",code:me.invalid_string,message:s.message}),i.dirty());else if(s.kind==="url")try{new URL(a.data)}catch{r=this._getOrReturnCtx(a,r),Ae(r,{validation:"url",code:me.invalid_string,message:s.message}),i.dirty()}else s.kind==="regex"?(s.regex.lastIndex=0,s.regex.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"regex",code:me.invalid_string,message:s.message}),i.dirty())):s.kind==="trim"?a.data=a.data.trim():s.kind==="includes"?a.data.includes(s.value,s.position)||(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.invalid_string,validation:{includes:s.value,position:s.position},message:s.message}),i.dirty()):s.kind==="toLowerCase"?a.data=a.data.toLowerCase():s.kind==="toUpperCase"?a.data=a.data.toUpperCase():s.kind==="startsWith"?a.data.startsWith(s.value)||(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.invalid_string,validation:{startsWith:s.value},message:s.message}),i.dirty()):s.kind==="endsWith"?a.data.endsWith(s.value)||(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.invalid_string,validation:{endsWith:s.value},message:s.message}),i.dirty()):s.kind==="datetime"?My(s).test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.invalid_string,validation:"datetime",message:s.message}),i.dirty()):s.kind==="date"?Cy.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.invalid_string,validation:"date",message:s.message}),i.dirty()):s.kind==="time"?Py(s).test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.invalid_string,validation:"time",message:s.message}),i.dirty()):s.kind==="duration"?vy.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"duration",code:me.invalid_string,message:s.message}),i.dirty()):s.kind==="ip"?Iy(a.data,s.version)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"ip",code:me.invalid_string,message:s.message}),i.dirty()):s.kind==="jwt"?Ny(a.data,s.alg)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"jwt",code:me.invalid_string,message:s.message}),i.dirty()):s.kind==="cidr"?Ry(a.data,s.version)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"cidr",code:me.invalid_string,message:s.message}),i.dirty()):s.kind==="base64"?Ty.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"base64",code:me.invalid_string,message:s.message}),i.dirty()):s.kind==="base64url"?Ey.test(a.data)||(r=this._getOrReturnCtx(a,r),Ae(r,{validation:"base64url",code:me.invalid_string,message:s.message}),i.dirty()):fa.assertNever(s);return{status:i.value,value:a.data}}_regex(a,n,i){return this.refinement(r=>a.test(r),{validation:n,code:me.invalid_string,...Le.errToObj(i)})}_addCheck(a){return new cn({...this._def,checks:[...this._def.checks,a]})}email(a){return this._addCheck({kind:"email",...Le.errToObj(a)})}url(a){return this._addCheck({kind:"url",...Le.errToObj(a)})}emoji(a){return this._addCheck({kind:"emoji",...Le.errToObj(a)})}uuid(a){return this._addCheck({kind:"uuid",...Le.errToObj(a)})}nanoid(a){return this._addCheck({kind:"nanoid",...Le.errToObj(a)})}cuid(a){return this._addCheck({kind:"cuid",...Le.errToObj(a)})}cuid2(a){return this._addCheck({kind:"cuid2",...Le.errToObj(a)})}ulid(a){return this._addCheck({kind:"ulid",...Le.errToObj(a)})}base64(a){return this._addCheck({kind:"base64",...Le.errToObj(a)})}base64url(a){return this._addCheck({kind:"base64url",...Le.errToObj(a)})}jwt(a){return this._addCheck({kind:"jwt",...Le.errToObj(a)})}ip(a){return this._addCheck({kind:"ip",...Le.errToObj(a)})}cidr(a){return this._addCheck({kind:"cidr",...Le.errToObj(a)})}datetime(a){return typeof a=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:a}):this._addCheck({kind:"datetime",precision:typeof(a==null?void 0:a.precision)>"u"?null:a==null?void 0:a.precision,offset:(a==null?void 0:a.offset)??!1,local:(a==null?void 0:a.local)??!1,...Le.errToObj(a==null?void 0:a.message)})}date(a){return this._addCheck({kind:"date",message:a})}time(a){return typeof a=="string"?this._addCheck({kind:"time",precision:null,message:a}):this._addCheck({kind:"time",precision:typeof(a==null?void 0:a.precision)>"u"?null:a==null?void 0:a.precision,...Le.errToObj(a==null?void 0:a.message)})}duration(a){return this._addCheck({kind:"duration",...Le.errToObj(a)})}regex(a,n){return this._addCheck({kind:"regex",regex:a,...Le.errToObj(n)})}includes(a,n){return this._addCheck({kind:"includes",value:a,position:n==null?void 0:n.position,...Le.errToObj(n==null?void 0:n.message)})}startsWith(a,n){return this._addCheck({kind:"startsWith",value:a,...Le.errToObj(n)})}endsWith(a,n){return this._addCheck({kind:"endsWith",value:a,...Le.errToObj(n)})}min(a,n){return this._addCheck({kind:"min",value:a,...Le.errToObj(n)})}max(a,n){return this._addCheck({kind:"max",value:a,...Le.errToObj(n)})}length(a,n){return this._addCheck({kind:"length",value:a,...Le.errToObj(n)})}nonempty(a){return this.min(1,Le.errToObj(a))}trim(){return new cn({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new cn({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new cn({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(a=>a.kind==="datetime")}get isDate(){return!!this._def.checks.find(a=>a.kind==="date")}get isTime(){return!!this._def.checks.find(a=>a.kind==="time")}get isDuration(){return!!this._def.checks.find(a=>a.kind==="duration")}get isEmail(){return!!this._def.checks.find(a=>a.kind==="email")}get isURL(){return!!this._def.checks.find(a=>a.kind==="url")}get isEmoji(){return!!this._def.checks.find(a=>a.kind==="emoji")}get isUUID(){return!!this._def.checks.find(a=>a.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(a=>a.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(a=>a.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(a=>a.kind==="cuid2")}get isULID(){return!!this._def.checks.find(a=>a.kind==="ulid")}get isIP(){return!!this._def.checks.find(a=>a.kind==="ip")}get isCIDR(){return!!this._def.checks.find(a=>a.kind==="cidr")}get isBase64(){return!!this._def.checks.find(a=>a.kind==="base64")}get isBase64url(){return!!this._def.checks.find(a=>a.kind==="base64url")}get minLength(){let a=null;for(const n of this._def.checks)n.kind==="min"&&(a===null||n.value>a)&&(a=n.value);return a}get maxLength(){let a=null;for(const n of this._def.checks)n.kind==="max"&&(a===null||n.value<a)&&(a=n.value);return a}}cn.create=e=>new cn({checks:[],typeName:Qe.ZodString,coerce:(e==null?void 0:e.coerce)??!1,...na(e)});function Ly(e,a){const n=(e.toString().split(".")[1]||"").length,i=(a.toString().split(".")[1]||"").length,r=n>i?n:i,s=Number.parseInt(e.toFixed(r).replace(".","")),o=Number.parseInt(a.toFixed(r).replace(".",""));return s%o/10**r}class Ai extends ua{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(a){if(this._def.coerce&&(a.data=Number(a.data)),this._getType(a)!==Pe.number){const s=this._getOrReturnCtx(a);return Ae(s,{code:me.invalid_type,expected:Pe.number,received:s.parsedType}),Ye}let i;const r=new ft;for(const s of this._def.checks)s.kind==="int"?fa.isInteger(a.data)||(i=this._getOrReturnCtx(a,i),Ae(i,{code:me.invalid_type,expected:"integer",received:"float",message:s.message}),r.dirty()):s.kind==="min"?(s.inclusive?a.data<s.value:a.data<=s.value)&&(i=this._getOrReturnCtx(a,i),Ae(i,{code:me.too_small,minimum:s.value,type:"number",inclusive:s.inclusive,exact:!1,message:s.message}),r.dirty()):s.kind==="max"?(s.inclusive?a.data>s.value:a.data>=s.value)&&(i=this._getOrReturnCtx(a,i),Ae(i,{code:me.too_big,maximum:s.value,type:"number",inclusive:s.inclusive,exact:!1,message:s.message}),r.dirty()):s.kind==="multipleOf"?Ly(a.data,s.value)!==0&&(i=this._getOrReturnCtx(a,i),Ae(i,{code:me.not_multiple_of,multipleOf:s.value,message:s.message}),r.dirty()):s.kind==="finite"?Number.isFinite(a.data)||(i=this._getOrReturnCtx(a,i),Ae(i,{code:me.not_finite,message:s.message}),r.dirty()):fa.assertNever(s);return{status:r.value,value:a.data}}gte(a,n){return this.setLimit("min",a,!0,Le.toString(n))}gt(a,n){return this.setLimit("min",a,!1,Le.toString(n))}lte(a,n){return this.setLimit("max",a,!0,Le.toString(n))}lt(a,n){return this.setLimit("max",a,!1,Le.toString(n))}setLimit(a,n,i,r){return new Ai({...this._def,checks:[...this._def.checks,{kind:a,value:n,inclusive:i,message:Le.toString(r)}]})}_addCheck(a){return new Ai({...this._def,checks:[...this._def.checks,a]})}int(a){return this._addCheck({kind:"int",message:Le.toString(a)})}positive(a){return this._addCheck({kind:"min",value:0,inclusive:!1,message:Le.toString(a)})}negative(a){return this._addCheck({kind:"max",value:0,inclusive:!1,message:Le.toString(a)})}nonpositive(a){return this._addCheck({kind:"max",value:0,inclusive:!0,message:Le.toString(a)})}nonnegative(a){return this._addCheck({kind:"min",value:0,inclusive:!0,message:Le.toString(a)})}multipleOf(a,n){return this._addCheck({kind:"multipleOf",value:a,message:Le.toString(n)})}finite(a){return this._addCheck({kind:"finite",message:Le.toString(a)})}safe(a){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:Le.toString(a)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:Le.toString(a)})}get minValue(){let a=null;for(const n of this._def.checks)n.kind==="min"&&(a===null||n.value>a)&&(a=n.value);return a}get maxValue(){let a=null;for(const n of this._def.checks)n.kind==="max"&&(a===null||n.value<a)&&(a=n.value);return a}get isInt(){return!!this._def.checks.find(a=>a.kind==="int"||a.kind==="multipleOf"&&fa.isInteger(a.value))}get isFinite(){let a=null,n=null;for(const i of this._def.checks){if(i.kind==="finite"||i.kind==="int"||i.kind==="multipleOf")return!0;i.kind==="min"?(n===null||i.value>n)&&(n=i.value):i.kind==="max"&&(a===null||i.value<a)&&(a=i.value)}return Number.isFinite(n)&&Number.isFinite(a)}}Ai.create=e=>new Ai({checks:[],typeName:Qe.ZodNumber,coerce:(e==null?void 0:e.coerce)||!1,...na(e)});class Ti extends ua{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(a){if(this._def.coerce)try{a.data=BigInt(a.data)}catch{return this._getInvalidInput(a)}if(this._getType(a)!==Pe.bigint)return this._getInvalidInput(a);let i;const r=new ft;for(const s of this._def.checks)s.kind==="min"?(s.inclusive?a.data<s.value:a.data<=s.value)&&(i=this._getOrReturnCtx(a,i),Ae(i,{code:me.too_small,type:"bigint",minimum:s.value,inclusive:s.inclusive,message:s.message}),r.dirty()):s.kind==="max"?(s.inclusive?a.data>s.value:a.data>=s.value)&&(i=this._getOrReturnCtx(a,i),Ae(i,{code:me.too_big,type:"bigint",maximum:s.value,inclusive:s.inclusive,message:s.message}),r.dirty()):s.kind==="multipleOf"?a.data%s.value!==BigInt(0)&&(i=this._getOrReturnCtx(a,i),Ae(i,{code:me.not_multiple_of,multipleOf:s.value,message:s.message}),r.dirty()):fa.assertNever(s);return{status:r.value,value:a.data}}_getInvalidInput(a){const n=this._getOrReturnCtx(a);return Ae(n,{code:me.invalid_type,expected:Pe.bigint,received:n.parsedType}),Ye}gte(a,n){return this.setLimit("min",a,!0,Le.toString(n))}gt(a,n){return this.setLimit("min",a,!1,Le.toString(n))}lte(a,n){return this.setLimit("max",a,!0,Le.toString(n))}lt(a,n){return this.setLimit("max",a,!1,Le.toString(n))}setLimit(a,n,i,r){return new Ti({...this._def,checks:[...this._def.checks,{kind:a,value:n,inclusive:i,message:Le.toString(r)}]})}_addCheck(a){return new Ti({...this._def,checks:[...this._def.checks,a]})}positive(a){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:Le.toString(a)})}negative(a){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:Le.toString(a)})}nonpositive(a){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:Le.toString(a)})}nonnegative(a){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:Le.toString(a)})}multipleOf(a,n){return this._addCheck({kind:"multipleOf",value:a,message:Le.toString(n)})}get minValue(){let a=null;for(const n of this._def.checks)n.kind==="min"&&(a===null||n.value>a)&&(a=n.value);return a}get maxValue(){let a=null;for(const n of this._def.checks)n.kind==="max"&&(a===null||n.value<a)&&(a=n.value);return a}}Ti.create=e=>new Ti({checks:[],typeName:Qe.ZodBigInt,coerce:(e==null?void 0:e.coerce)??!1,...na(e)});class fo extends ua{_parse(a){if(this._def.coerce&&(a.data=!!a.data),this._getType(a)!==Pe.boolean){const i=this._getOrReturnCtx(a);return Ae(i,{code:me.invalid_type,expected:Pe.boolean,received:i.parsedType}),Ye}return Ft(a.data)}}fo.create=e=>new fo({typeName:Qe.ZodBoolean,coerce:(e==null?void 0:e.coerce)||!1,...na(e)});class ws extends ua{_parse(a){if(this._def.coerce&&(a.data=new Date(a.data)),this._getType(a)!==Pe.date){const s=this._getOrReturnCtx(a);return Ae(s,{code:me.invalid_type,expected:Pe.date,received:s.parsedType}),Ye}if(Number.isNaN(a.data.getTime())){const s=this._getOrReturnCtx(a);return Ae(s,{code:me.invalid_date}),Ye}const i=new ft;let r;for(const s of this._def.checks)s.kind==="min"?a.data.getTime()<s.value&&(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.too_small,message:s.message,inclusive:!0,exact:!1,minimum:s.value,type:"date"}),i.dirty()):s.kind==="max"?a.data.getTime()>s.value&&(r=this._getOrReturnCtx(a,r),Ae(r,{code:me.too_big,message:s.message,inclusive:!0,exact:!1,maximum:s.value,type:"date"}),i.dirty()):fa.assertNever(s);return{status:i.value,value:new Date(a.data.getTime())}}_addCheck(a){return new ws({...this._def,checks:[...this._def.checks,a]})}min(a,n){return this._addCheck({kind:"min",value:a.getTime(),message:Le.toString(n)})}max(a,n){return this._addCheck({kind:"max",value:a.getTime(),message:Le.toString(n)})}get minDate(){let a=null;for(const n of this._def.checks)n.kind==="min"&&(a===null||n.value>a)&&(a=n.value);return a!=null?new Date(a):null}get maxDate(){let a=null;for(const n of this._def.checks)n.kind==="max"&&(a===null||n.value<a)&&(a=n.value);return a!=null?new Date(a):null}}ws.create=e=>new ws({checks:[],coerce:(e==null?void 0:e.coerce)||!1,typeName:Qe.ZodDate,...na(e)});class Du extends ua{_parse(a){if(this._getType(a)!==Pe.symbol){const i=this._getOrReturnCtx(a);return Ae(i,{code:me.invalid_type,expected:Pe.symbol,received:i.parsedType}),Ye}return Ft(a.data)}}Du.create=e=>new Du({typeName:Qe.ZodSymbol,...na(e)});class yo extends ua{_parse(a){if(this._getType(a)!==Pe.undefined){const i=this._getOrReturnCtx(a);return Ae(i,{code:me.invalid_type,expected:Pe.undefined,received:i.parsedType}),Ye}return Ft(a.data)}}yo.create=e=>new yo({typeName:Qe.ZodUndefined,...na(e)});class vo extends ua{_parse(a){if(this._getType(a)!==Pe.null){const i=this._getOrReturnCtx(a);return Ae(i,{code:me.invalid_type,expected:Pe.null,received:i.parsedType}),Ye}return Ft(a.data)}}vo.create=e=>new vo({typeName:Qe.ZodNull,...na(e)});class Ou extends ua{constructor(){super(...arguments),this._any=!0}_parse(a){return Ft(a.data)}}Ou.create=e=>new Ou({typeName:Qe.ZodAny,...na(e)});class jd extends ua{constructor(){super(...arguments),this._unknown=!0}_parse(a){return Ft(a.data)}}jd.create=e=>new jd({typeName:Qe.ZodUnknown,...na(e)});class si extends ua{_parse(a){const n=this._getOrReturnCtx(a);return Ae(n,{code:me.invalid_type,expected:Pe.never,received:n.parsedType}),Ye}}si.create=e=>new si({typeName:Qe.ZodNever,...na(e)});class Hu extends ua{_parse(a){if(this._getType(a)!==Pe.undefined){const i=this._getOrReturnCtx(a);return Ae(i,{code:me.invalid_type,expected:Pe.void,received:i.parsedType}),Ye}return Ft(a.data)}}Hu.create=e=>new Hu({typeName:Qe.ZodVoid,...na(e)});class un extends ua{_parse(a){const{ctx:n,status:i}=this._processInputParams(a),r=this._def;if(n.parsedType!==Pe.array)return Ae(n,{code:me.invalid_type,expected:Pe.array,received:n.parsedType}),Ye;if(r.exactLength!==null){const o=n.data.length>r.exactLength.value,l=n.data.length<r.exactLength.value;(o||l)&&(Ae(n,{code:o?me.too_big:me.too_small,minimum:l?r.exactLength.value:void 0,maximum:o?r.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:r.exactLength.message}),i.dirty())}if(r.minLength!==null&&n.data.length<r.minLength.value&&(Ae(n,{code:me.too_small,minimum:r.minLength.value,type:"array",inclusive:!0,exact:!1,message:r.minLength.message}),i.dirty()),r.maxLength!==null&&n.data.length>r.maxLength.value&&(Ae(n,{code:me.too_big,maximum:r.maxLength.value,type:"array",inclusive:!0,exact:!1,message:r.maxLength.message}),i.dirty()),n.common.async)return Promise.all([...n.data].map((o,l)=>r.type._parseAsync(new gn(n,o,n.path,l)))).then(o=>ft.mergeArray(i,o));const s=[...n.data].map((o,l)=>r.type._parseSync(new gn(n,o,n.path,l)));return ft.mergeArray(i,s)}get element(){return this._def.type}min(a,n){return new un({...this._def,minLength:{value:a,message:Le.toString(n)}})}max(a,n){return new un({...this._def,maxLength:{value:a,message:Le.toString(n)}})}length(a,n){return new un({...this._def,exactLength:{value:a,message:Le.toString(n)}})}nonempty(a){return this.min(1,a)}}un.create=(e,a)=>new un({type:e,minLength:null,maxLength:null,exactLength:null,typeName:Qe.ZodArray,...na(a)});function is(e){if(e instanceof Va){const a={};for(const n in e.shape){const i=e.shape[n];a[n]=Fn.create(is(i))}return new Va({...e._def,shape:()=>a})}else return e instanceof un?new un({...e._def,type:is(e.element)}):e instanceof Fn?Fn.create(is(e.unwrap())):e instanceof Mi?Mi.create(is(e.unwrap())):e instanceof Ei?Ei.create(e.items.map(a=>is(a))):e}class Va extends ua{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const a=this._def.shape(),n=fa.objectKeys(a);return this._cached={shape:a,keys:n},this._cached}_parse(a){if(this._getType(a)!==Pe.object){const u=this._getOrReturnCtx(a);return Ae(u,{code:me.invalid_type,expected:Pe.object,received:u.parsedType}),Ye}const{status:i,ctx:r}=this._processInputParams(a),{shape:s,keys:o}=this._getCached(),l=[];if(!(this._def.catchall instanceof si&&this._def.unknownKeys==="strip"))for(const u in r.data)o.includes(u)||l.push(u);const d=[];for(const u of o){const m=s[u],h=r.data[u];d.push({key:{status:"valid",value:u},value:m._parse(new gn(r,h,r.path,u)),alwaysSet:u in r.data})}if(this._def.catchall instanceof si){const u=this._def.unknownKeys;if(u==="passthrough")for(const m of l)d.push({key:{status:"valid",value:m},value:{status:"valid",value:r.data[m]}});else if(u==="strict")l.length>0&&(Ae(r,{code:me.unrecognized_keys,keys:l}),i.dirty());else if(u!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const u=this._def.catchall;for(const m of l){const h=r.data[m];d.push({key:{status:"valid",value:m},value:u._parse(new gn(r,h,r.path,m)),alwaysSet:m in r.data})}}return r.common.async?Promise.resolve().then(async()=>{const u=[];for(const m of d){const h=await m.key,p=await m.value;u.push({key:h,value:p,alwaysSet:m.alwaysSet})}return u}).then(u=>ft.mergeObjectSync(i,u)):ft.mergeObjectSync(i,d)}get shape(){return this._def.shape()}strict(a){return Le.errToObj,new Va({...this._def,unknownKeys:"strict",...a!==void 0?{errorMap:(n,i)=>{var s,o;const r=((o=(s=this._def).errorMap)==null?void 0:o.call(s,n,i).message)??i.defaultError;return n.code==="unrecognized_keys"?{message:Le.errToObj(a).message??r}:{message:r}}}:{}})}strip(){return new Va({...this._def,unknownKeys:"strip"})}passthrough(){return new Va({...this._def,unknownKeys:"passthrough"})}extend(a){return new Va({...this._def,shape:()=>({...this._def.shape(),...a})})}merge(a){return new Va({unknownKeys:a._def.unknownKeys,catchall:a._def.catchall,shape:()=>({...this._def.shape(),...a._def.shape()}),typeName:Qe.ZodObject})}setKey(a,n){return this.augment({[a]:n})}catchall(a){return new Va({...this._def,catchall:a})}pick(a){const n={};for(const i of fa.objectKeys(a))a[i]&&this.shape[i]&&(n[i]=this.shape[i]);return new Va({...this._def,shape:()=>n})}omit(a){const n={};for(const i of fa.objectKeys(this.shape))a[i]||(n[i]=this.shape[i]);return new Va({...this._def,shape:()=>n})}deepPartial(){return is(this)}partial(a){const n={};for(const i of fa.objectKeys(this.shape)){const r=this.shape[i];a&&!a[i]?n[i]=r:n[i]=r.optional()}return new Va({...this._def,shape:()=>n})}required(a){const n={};for(const i of fa.objectKeys(this.shape))if(a&&!a[i])n[i]=this.shape[i];else{let s=this.shape[i];for(;s instanceof Fn;)s=s._def.innerType;n[i]=s}return new Va({...this._def,shape:()=>n})}keyof(){return qp(fa.objectKeys(this.shape))}}Va.create=(e,a)=>new Va({shape:()=>e,unknownKeys:"strip",catchall:si.create(),typeName:Qe.ZodObject,...na(a)});Va.strictCreate=(e,a)=>new Va({shape:()=>e,unknownKeys:"strict",catchall:si.create(),typeName:Qe.ZodObject,...na(a)});Va.lazycreate=(e,a)=>new Va({shape:e,unknownKeys:"strip",catchall:si.create(),typeName:Qe.ZodObject,...na(a)});class xo extends ua{_parse(a){const{ctx:n}=this._processInputParams(a),i=this._def.options;function r(s){for(const l of s)if(l.result.status==="valid")return l.result;for(const l of s)if(l.result.status==="dirty")return n.common.issues.push(...l.ctx.common.issues),l.result;const o=s.map(l=>new Kn(l.ctx.common.issues));return Ae(n,{code:me.invalid_union,unionErrors:o}),Ye}if(n.common.async)return Promise.all(i.map(async s=>{const o={...n,common:{...n.common,issues:[]},parent:null};return{result:await s._parseAsync({data:n.data,path:n.path,parent:o}),ctx:o}})).then(r);{let s;const o=[];for(const d of i){const u={...n,common:{...n.common,issues:[]},parent:null},m=d._parseSync({data:n.data,path:n.path,parent:u});if(m.status==="valid")return m;m.status==="dirty"&&!s&&(s={result:m,ctx:u}),u.common.issues.length&&o.push(u.common.issues)}if(s)return n.common.issues.push(...s.ctx.common.issues),s.result;const l=o.map(d=>new Kn(d));return Ae(n,{code:me.invalid_union,unionErrors:l}),Ye}}get options(){return this._def.options}}xo.create=(e,a)=>new xo({options:e,typeName:Qe.ZodUnion,...na(a)});const Dn=e=>e instanceof Sd?Dn(e.schema):e instanceof Pi?Dn(e.innerType()):e instanceof So?[e.value]:e instanceof Ci?e.options:e instanceof _d?fa.objectValues(e.enum):e instanceof Ao?Dn(e._def.innerType):e instanceof yo?[void 0]:e instanceof vo?[null]:e instanceof Fn?[void 0,...Dn(e.unwrap())]:e instanceof Mi?[null,...Dn(e.unwrap())]:e instanceof Up||e instanceof Eo?Dn(e.unwrap()):e instanceof To?Dn(e._def.innerType):[];class bc extends ua{_parse(a){const{ctx:n}=this._processInputParams(a);if(n.parsedType!==Pe.object)return Ae(n,{code:me.invalid_type,expected:Pe.object,received:n.parsedType}),Ye;const i=this.discriminator,r=n.data[i],s=this.optionsMap.get(r);return s?n.common.async?s._parseAsync({data:n.data,path:n.path,parent:n}):s._parseSync({data:n.data,path:n.path,parent:n}):(Ae(n,{code:me.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[i]}),Ye)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(a,n,i){const r=new Map;for(const s of n){const o=Dn(s.shape[a]);if(!o.length)throw new Error(`A discriminator value for key \`${a}\` could not be extracted from all schema options`);for(const l of o){if(r.has(l))throw new Error(`Discriminator property ${String(a)} has duplicate value ${String(l)}`);r.set(l,s)}}return new bc({typeName:Qe.ZodDiscriminatedUnion,discriminator:a,options:n,optionsMap:r,...na(i)})}}function wd(e,a){const n=ai(e),i=ai(a);if(e===a)return{valid:!0,data:e};if(n===Pe.object&&i===Pe.object){const r=fa.objectKeys(a),s=fa.objectKeys(e).filter(l=>r.indexOf(l)!==-1),o={...e,...a};for(const l of s){const d=wd(e[l],a[l]);if(!d.valid)return{valid:!1};o[l]=d.data}return{valid:!0,data:o}}else if(n===Pe.array&&i===Pe.array){if(e.length!==a.length)return{valid:!1};const r=[];for(let s=0;s<e.length;s++){const o=e[s],l=a[s],d=wd(o,l);if(!d.valid)return{valid:!1};r.push(d.data)}return{valid:!0,data:r}}else return n===Pe.date&&i===Pe.date&&+e==+a?{valid:!0,data:e}:{valid:!1}}class jo extends ua{_parse(a){const{status:n,ctx:i}=this._processInputParams(a),r=(s,o)=>{if(Lu(s)||Lu(o))return Ye;const l=wd(s.value,o.value);return l.valid?(($u(s)||$u(o))&&n.dirty(),{status:n.value,value:l.data}):(Ae(i,{code:me.invalid_intersection_types}),Ye)};return i.common.async?Promise.all([this._def.left._parseAsync({data:i.data,path:i.path,parent:i}),this._def.right._parseAsync({data:i.data,path:i.path,parent:i})]).then(([s,o])=>r(s,o)):r(this._def.left._parseSync({data:i.data,path:i.path,parent:i}),this._def.right._parseSync({data:i.data,path:i.path,parent:i}))}}jo.create=(e,a,n)=>new jo({left:e,right:a,typeName:Qe.ZodIntersection,...na(n)});class Ei extends ua{_parse(a){const{status:n,ctx:i}=this._processInputParams(a);if(i.parsedType!==Pe.array)return Ae(i,{code:me.invalid_type,expected:Pe.array,received:i.parsedType}),Ye;if(i.data.length<this._def.items.length)return Ae(i,{code:me.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),Ye;!this._def.rest&&i.data.length>this._def.items.length&&(Ae(i,{code:me.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.dirty());const s=[...i.data].map((o,l)=>{const d=this._def.items[l]||this._def.rest;return d?d._parse(new gn(i,o,i.path,l)):null}).filter(o=>!!o);return i.common.async?Promise.all(s).then(o=>ft.mergeArray(n,o)):ft.mergeArray(n,s)}get items(){return this._def.items}rest(a){return new Ei({...this._def,rest:a})}}Ei.create=(e,a)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new Ei({items:e,typeName:Qe.ZodTuple,rest:null,...na(a)})};class wo extends ua{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(a){const{status:n,ctx:i}=this._processInputParams(a);if(i.parsedType!==Pe.object)return Ae(i,{code:me.invalid_type,expected:Pe.object,received:i.parsedType}),Ye;const r=[],s=this._def.keyType,o=this._def.valueType;for(const l in i.data)r.push({key:s._parse(new gn(i,l,i.path,l)),value:o._parse(new gn(i,i.data[l],i.path,l)),alwaysSet:l in i.data});return i.common.async?ft.mergeObjectAsync(n,r):ft.mergeObjectSync(n,r)}get element(){return this._def.valueType}static create(a,n,i){return n instanceof ua?new wo({keyType:a,valueType:n,typeName:Qe.ZodRecord,...na(i)}):new wo({keyType:cn.create(),valueType:a,typeName:Qe.ZodRecord,...na(n)})}}class qu extends ua{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(a){const{status:n,ctx:i}=this._processInputParams(a);if(i.parsedType!==Pe.map)return Ae(i,{code:me.invalid_type,expected:Pe.map,received:i.parsedType}),Ye;const r=this._def.keyType,s=this._def.valueType,o=[...i.data.entries()].map(([l,d],u)=>({key:r._parse(new gn(i,l,i.path,[u,"key"])),value:s._parse(new gn(i,d,i.path,[u,"value"]))}));if(i.common.async){const l=new Map;return Promise.resolve().then(async()=>{for(const d of o){const u=await d.key,m=await d.value;if(u.status==="aborted"||m.status==="aborted")return Ye;(u.status==="dirty"||m.status==="dirty")&&n.dirty(),l.set(u.value,m.value)}return{status:n.value,value:l}})}else{const l=new Map;for(const d of o){const u=d.key,m=d.value;if(u.status==="aborted"||m.status==="aborted")return Ye;(u.status==="dirty"||m.status==="dirty")&&n.dirty(),l.set(u.value,m.value)}return{status:n.value,value:l}}}}qu.create=(e,a,n)=>new qu({valueType:a,keyType:e,typeName:Qe.ZodMap,...na(n)});class gr extends ua{_parse(a){const{status:n,ctx:i}=this._processInputParams(a);if(i.parsedType!==Pe.set)return Ae(i,{code:me.invalid_type,expected:Pe.set,received:i.parsedType}),Ye;const r=this._def;r.minSize!==null&&i.data.size<r.minSize.value&&(Ae(i,{code:me.too_small,minimum:r.minSize.value,type:"set",inclusive:!0,exact:!1,message:r.minSize.message}),n.dirty()),r.maxSize!==null&&i.data.size>r.maxSize.value&&(Ae(i,{code:me.too_big,maximum:r.maxSize.value,type:"set",inclusive:!0,exact:!1,message:r.maxSize.message}),n.dirty());const s=this._def.valueType;function o(d){const u=new Set;for(const m of d){if(m.status==="aborted")return Ye;m.status==="dirty"&&n.dirty(),u.add(m.value)}return{status:n.value,value:u}}const l=[...i.data.values()].map((d,u)=>s._parse(new gn(i,d,i.path,u)));return i.common.async?Promise.all(l).then(d=>o(d)):o(l)}min(a,n){return new gr({...this._def,minSize:{value:a,message:Le.toString(n)}})}max(a,n){return new gr({...this._def,maxSize:{value:a,message:Le.toString(n)}})}size(a,n){return this.min(a,n).max(a,n)}nonempty(a){return this.min(1,a)}}gr.create=(e,a)=>new gr({valueType:e,minSize:null,maxSize:null,typeName:Qe.ZodSet,...na(a)});class Sd extends ua{get schema(){return this._def.getter()}_parse(a){const{ctx:n}=this._processInputParams(a);return this._def.getter()._parse({data:n.data,path:n.path,parent:n})}}Sd.create=(e,a)=>new Sd({getter:e,typeName:Qe.ZodLazy,...na(a)});class So extends ua{_parse(a){if(a.data!==this._def.value){const n=this._getOrReturnCtx(a);return Ae(n,{received:n.data,code:me.invalid_literal,expected:this._def.value}),Ye}return{status:"valid",value:a.data}}get value(){return this._def.value}}So.create=(e,a)=>new So({value:e,typeName:Qe.ZodLiteral,...na(a)});function qp(e,a){return new Ci({values:e,typeName:Qe.ZodEnum,...na(a)})}class Ci extends ua{_parse(a){if(typeof a.data!="string"){const n=this._getOrReturnCtx(a),i=this._def.values;return Ae(n,{expected:fa.joinValues(i),received:n.parsedType,code:me.invalid_type}),Ye}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(a.data)){const n=this._getOrReturnCtx(a),i=this._def.values;return Ae(n,{received:n.data,code:me.invalid_enum_value,options:i}),Ye}return Ft(a.data)}get options(){return this._def.values}get enum(){const a={};for(const n of this._def.values)a[n]=n;return a}get Values(){const a={};for(const n of this._def.values)a[n]=n;return a}get Enum(){const a={};for(const n of this._def.values)a[n]=n;return a}extract(a,n=this._def){return Ci.create(a,{...this._def,...n})}exclude(a,n=this._def){return Ci.create(this.options.filter(i=>!a.includes(i)),{...this._def,...n})}}Ci.create=qp;class _d extends ua{_parse(a){const n=fa.getValidEnumValues(this._def.values),i=this._getOrReturnCtx(a);if(i.parsedType!==Pe.string&&i.parsedType!==Pe.number){const r=fa.objectValues(n);return Ae(i,{expected:fa.joinValues(r),received:i.parsedType,code:me.invalid_type}),Ye}if(this._cache||(this._cache=new Set(fa.getValidEnumValues(this._def.values))),!this._cache.has(a.data)){const r=fa.objectValues(n);return Ae(i,{received:i.data,code:me.invalid_enum_value,options:r}),Ye}return Ft(a.data)}get enum(){return this._def.values}}_d.create=(e,a)=>new _d({values:e,typeName:Qe.ZodNativeEnum,...na(a)});class _o extends ua{unwrap(){return this._def.type}_parse(a){const{ctx:n}=this._processInputParams(a);if(n.parsedType!==Pe.promise&&n.common.async===!1)return Ae(n,{code:me.invalid_type,expected:Pe.promise,received:n.parsedType}),Ye;const i=n.parsedType===Pe.promise?n.data:Promise.resolve(n.data);return Ft(i.then(r=>this._def.type.parseAsync(r,{path:n.path,errorMap:n.common.contextualErrorMap})))}}_o.create=(e,a)=>new _o({type:e,typeName:Qe.ZodPromise,...na(a)});class Pi extends ua{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===Qe.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(a){const{status:n,ctx:i}=this._processInputParams(a),r=this._def.effect||null,s={addIssue:o=>{Ae(i,o),o.fatal?n.abort():n.dirty()},get path(){return i.path}};if(s.addIssue=s.addIssue.bind(s),r.type==="preprocess"){const o=r.transform(i.data,s);if(i.common.async)return Promise.resolve(o).then(async l=>{if(n.value==="aborted")return Ye;const d=await this._def.schema._parseAsync({data:l,path:i.path,parent:i});return d.status==="aborted"?Ye:d.status==="dirty"||n.value==="dirty"?ir(d.value):d});{if(n.value==="aborted")return Ye;const l=this._def.schema._parseSync({data:o,path:i.path,parent:i});return l.status==="aborted"?Ye:l.status==="dirty"||n.value==="dirty"?ir(l.value):l}}if(r.type==="refinement"){const o=l=>{const d=r.refinement(l,s);if(i.common.async)return Promise.resolve(d);if(d instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return l};if(i.common.async===!1){const l=this._def.schema._parseSync({data:i.data,path:i.path,parent:i});return l.status==="aborted"?Ye:(l.status==="dirty"&&n.dirty(),o(l.value),{status:n.value,value:l.value})}else return this._def.schema._parseAsync({data:i.data,path:i.path,parent:i}).then(l=>l.status==="aborted"?Ye:(l.status==="dirty"&&n.dirty(),o(l.value).then(()=>({status:n.value,value:l.value}))))}if(r.type==="transform")if(i.common.async===!1){const o=this._def.schema._parseSync({data:i.data,path:i.path,parent:i});if(!js(o))return Ye;const l=r.transform(o.value,s);if(l instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:n.value,value:l}}else return this._def.schema._parseAsync({data:i.data,path:i.path,parent:i}).then(o=>js(o)?Promise.resolve(r.transform(o.value,s)).then(l=>({status:n.value,value:l})):Ye);fa.assertNever(r)}}Pi.create=(e,a,n)=>new Pi({schema:e,typeName:Qe.ZodEffects,effect:a,...na(n)});Pi.createWithPreprocess=(e,a,n)=>new Pi({schema:a,effect:{type:"preprocess",transform:e},typeName:Qe.ZodEffects,...na(n)});class Fn extends ua{_parse(a){return this._getType(a)===Pe.undefined?Ft(void 0):this._def.innerType._parse(a)}unwrap(){return this._def.innerType}}Fn.create=(e,a)=>new Fn({innerType:e,typeName:Qe.ZodOptional,...na(a)});class Mi extends ua{_parse(a){return this._getType(a)===Pe.null?Ft(null):this._def.innerType._parse(a)}unwrap(){return this._def.innerType}}Mi.create=(e,a)=>new Mi({innerType:e,typeName:Qe.ZodNullable,...na(a)});class Ao extends ua{_parse(a){const{ctx:n}=this._processInputParams(a);let i=n.data;return n.parsedType===Pe.undefined&&(i=this._def.defaultValue()),this._def.innerType._parse({data:i,path:n.path,parent:n})}removeDefault(){return this._def.innerType}}Ao.create=(e,a)=>new Ao({innerType:e,typeName:Qe.ZodDefault,defaultValue:typeof a.default=="function"?a.default:()=>a.default,...na(a)});class To extends ua{_parse(a){const{ctx:n}=this._processInputParams(a),i={...n,common:{...n.common,issues:[]}},r=this._def.innerType._parse({data:i.data,path:i.path,parent:{...i}});return bo(r)?r.then(s=>({status:"valid",value:s.status==="valid"?s.value:this._def.catchValue({get error(){return new Kn(i.common.issues)},input:i.data})})):{status:"valid",value:r.status==="valid"?r.value:this._def.catchValue({get error(){return new Kn(i.common.issues)},input:i.data})}}removeCatch(){return this._def.innerType}}To.create=(e,a)=>new To({innerType:e,typeName:Qe.ZodCatch,catchValue:typeof a.catch=="function"?a.catch:()=>a.catch,...na(a)});class Uu extends ua{_parse(a){if(this._getType(a)!==Pe.nan){const i=this._getOrReturnCtx(a);return Ae(i,{code:me.invalid_type,expected:Pe.nan,received:i.parsedType}),Ye}return{status:"valid",value:a.data}}}Uu.create=e=>new Uu({typeName:Qe.ZodNaN,...na(e)});class Up extends ua{_parse(a){const{ctx:n}=this._processInputParams(a),i=n.data;return this._def.type._parse({data:i,path:n.path,parent:n})}unwrap(){return this._def.type}}class fc extends ua{_parse(a){const{status:n,ctx:i}=this._processInputParams(a);if(i.common.async)return(async()=>{const s=await this._def.in._parseAsync({data:i.data,path:i.path,parent:i});return s.status==="aborted"?Ye:s.status==="dirty"?(n.dirty(),ir(s.value)):this._def.out._parseAsync({data:s.value,path:i.path,parent:i})})();{const r=this._def.in._parseSync({data:i.data,path:i.path,parent:i});return r.status==="aborted"?Ye:r.status==="dirty"?(n.dirty(),{status:"dirty",value:r.value}):this._def.out._parseSync({data:r.value,path:i.path,parent:i})}}static create(a,n){return new fc({in:a,out:n,typeName:Qe.ZodPipeline})}}class Eo extends ua{_parse(a){const n=this._def.innerType._parse(a),i=r=>(js(r)&&(r.value=Object.freeze(r.value)),r);return bo(n)?n.then(r=>i(r)):i(n)}unwrap(){return this._def.innerType}}Eo.create=(e,a)=>new Eo({innerType:e,typeName:Qe.ZodReadonly,...na(a)});var Qe;(function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline",e.ZodReadonly="ZodReadonly"})(Qe||(Qe={}));const k=cn.create,ce=Ai.create;Ti.create;const ge=fo.create;ws.create;const $y=yo.create,By=vo.create,Yo=jd.create;si.create;const Te=un.create,O=Va.create,xr=xo.create,zp=bc.create;jo.create;Ei.create;const mn=wo.create,ja=So.create,Se=Ci.create;_o.create;Fn.create;Mi.create;const Dy={string:e=>cn.create({...e,coerce:!0}),number:e=>Ai.create({...e,coerce:!0}),boolean:e=>fo.create({...e,coerce:!0}),bigint:e=>Ti.create({...e,coerce:!0}),date:e=>ws.create({...e,coerce:!0})},yc=Se(["brainstorming","objective","spec-ready","planned","executing","done"]),jr=Se(["brief","qa","audit","help","goal","no_effort"]),Oy=Se(["ok","drift","broken"]),Wn=Se(["tinggi","sedang","rendah"]),Fp=Se(["from-scratch","existing"]),hn=Se(["claude","codex","antigravity"]);Se(["critical","major","minor"]);const Ad=Se(["bug","fitur","pertanyaan","lainnya"]),Hy=Se(["new","accepted","rejected"]),qy=["changed","full"],Gp=Se(qy),Uy=new Set(["goal","no_effort"]);function Ii(e){return e==="qa"?"qa":Uy.has(e)?"goal":"brief"}function vc(e){const a=e??{};return"severity"in a?"qa":"goal"in a?"goal":"brief"}function Kp(e,a){return vc(a)===Ii(e)}function zu(e){return e==="minor"?"sedang":"tinggi"}function Fu(e){return e==="tinggi"?"major":"minor"}const zy={brief:["context","outcome"],qa:["steps","expected","actual","env"],goal:["goal","done"]};function Fy(e,a){const n=a??{},i=m=>typeof n[m]=="string"?n[m]:"",r=()=>n.priority==="tinggi"||n.priority==="rendah"?n.priority:"sedang",s=m=>m.filter(h=>i(h)!==""),o=vc(a),l=Ii(e),d=i("fromAudit"),u=(m,h)=>({payload:m,dropped:h,missing:zy[l].filter(p=>typeof m[p]!="string"||m[p]==="")});if(o===l)return{payload:{...n},dropped:[],missing:[]};if(l==="qa")return o==="brief"?u({severity:Fu(r()),steps:"",expected:i("outcome"),actual:i("context"),env:"",constraints:i("constraints"),...d?{fromAudit:d}:{}},[]):u({severity:Fu(r()),steps:"",expected:i("goal"),actual:"",env:"",constraints:i("constraints")},s(["done"]));if(l==="goal"){if(o==="brief"){const m=i("outcome")||i("context");return u({goal:m,done:"",constraints:i("constraints"),priority:r()},s([...i("outcome")?["context"]:[],"fromAudit"]))}return u({goal:i("expected"),done:"",constraints:i("constraints"),priority:zu(n.severity)},s(["steps","actual","env","fromAudit"]))}return o==="qa"?u({context:i("actual"),outcome:i("expected"),constraints:i("constraints"),priority:zu(n.severity),...d?{fromAudit:d}:{}},s(["steps","env"])):u({context:"",outcome:i("goal"),constraints:i("constraints"),priority:r()},s(["done"]))}const Wp="superpowers",Jn="superpowers:verification-before-completion",Gy="Skill mattpocock yang kontraknya mewawancarai manusia (`/grill-me`, `/to-spec`, `/triage`) JANGAN dipakai: pakai primitif model-invoked-nya untuk menguji rancanganmu sendiri, bukan untuk mewawancarai siapa pun. Hal yang masih ambigu dan akan mempengaruhi hasil tetap JANGAN diputuskan sendiri — bila kamu agen fase, daftarkan di `Keputusan terbuka:` laporanmu; bila tidak, ajukan lewat jalur tanya di klausa otonomi prompt ini. `to-tickets` di fase Plan dipakai HANYA sebagai penghasil berkas plan berkotak `- [ ]` di `docs/matt/plans/`, BUKAN penerbit tiket — hanoman sendiri adalah issue tracker-nya, jadi jangan menulis ke tracker eksternal mana pun.",Ky="Pakai skill Agent Skills langsung sesuai fase, bukan slash-command atau meta-router `using-agent-skills`. Kontrak fase, instruksi project/pengguna, dan jalur keputusan/review hanoman tetap berlaku: `spec-driven-development` hanya menyusun spec pada fase Spec, jangan menjalankan Plan atau Execute dari fase itu. Simpan spec di `docs/agent-skills/specs/` dan plan beserta SELURUH checklist task `- [ ]` di `docs/agent-skills/plans/`, dengan id backlog pada nama berkas; ini menggantikan default `SPEC.md`, `tasks/plan.md`, dan `tasks/todo.md` upstream. Jangan menimpa plan lain yang belum tuntas atau membuat tiket di tracker eksternal: hanoman adalah issue tracker-nya. Centang task di berkas plan yang sama setelah implementasi dan verifikasi. Hal ambigu yang mempengaruhi hasil mengikuti jalur tanya prompt ini; bila kamu agen fase, daftarkan di `Keputusan terbuka:` laporanmu.",Ni={superpowers:{id:"superpowers",label:"superpowers",planDir:"docs/superpowers/plans",specDir:"docs/superpowers/specs",phaseSkills:{Brainstorm:["superpowers:brainstorming"],Audit:["superpowers:systematic-debugging"],Plan:["superpowers:writing-plans"],Execute:["superpowers:executing-plans","superpowers:test-driven-development",Jn],Verifikasi:[Jn]},orchestratedPhaseSkills:{Execute:["superpowers:subagent-driven-development","superpowers:test-driven-development",Jn]},exitSkills:[Jn],requires:["superpowers"],install:{antigravity:[],claude:["claude plugin marketplace add obra/superpowers-marketplace","claude plugin install superpowers@superpowers-marketplace"],codex:["codex plugin add superpowers@openai-curated"]}},matt:{id:"matt",label:"mattpocock",planDir:"docs/matt/plans",specDir:"docs/matt/specs",phaseSkills:{Brainstorm:["mattpocock-skills:grilling"],Audit:["mattpocock-skills:diagnosing-bugs"],Plan:["mattpocock-skills:to-tickets"],Execute:["mattpocock-skills:implement","mattpocock-skills:tdd","mattpocock-skills:code-review"],Verifikasi:[Jn]},exitSkills:[Jn],extraClause:Gy,requires:["mattpocock-skills","superpowers"],install:{antigravity:[],claude:["claude plugin install mattpocock-skills","claude plugin marketplace add obra/superpowers-marketplace","claude plugin install superpowers@superpowers-marketplace"],codex:["npx skills@latest add mattpocock/skills","codex plugin add superpowers@openai-curated"]}},"agent-skills":{id:"agent-skills",label:"Agent Skills (Addy Osmani)",planDir:"docs/agent-skills/plans",specDir:"docs/agent-skills/specs",phaseSkills:{Brainstorm:["agent-skills:idea-refine"],Spec:["agent-skills:spec-driven-development"],Audit:["agent-skills:debugging-and-error-recovery","agent-skills:code-review-and-quality"],Plan:["agent-skills:planning-and-task-breakdown"],Execute:["agent-skills:incremental-implementation","agent-skills:test-driven-development","agent-skills:code-review-and-quality"],Verifikasi:[Jn]},exitSkills:[Jn],extraClause:Ky,requires:["agent-skills","superpowers"],install:{antigravity:[],claude:["claude plugin marketplace add addyosmani/agent-skills","claude plugin install agent-skills@addy-agent-skills","claude plugin marketplace add obra/superpowers-marketplace","claude plugin install superpowers@superpowers-marketplace"],codex:["codex plugin marketplace add addyosmani/agent-skills","codex plugin add agent-skills@agent-skills","codex plugin add superpowers@openai-curated"]}}},xc=Object.keys(Ni),Vp=e=>[...new Set(e)];Vp(xc.map(e=>Ni[e].planDir));Vp(xc.map(e=>Ni[e].specDir));function Gu(e){return(e?Ni[e]:void 0)??Ni[Wp]}const Yp=O({enabled:ge().default(!1),agent:hn.default("claude"),model:k().default("opus"),effort:k().default("xhigh")}),Jo=["inherit","flash","pro"],Ss={model:"gemini-3.8-flash-high",effort:"high"};let Qo=[{id:Ss.model,label:"Gemini 3.8 Flash High",efforts:[Ss.effort]}];function Wy(e){Qo=e}function Jp(e){var i;const a=Qo.find(r=>r.id===e);if(a)return a.efforts;const n=(i=/-(low|medium|high)$/.exec(e))==null?void 0:i[1];return n?[n]:[]}function jc(e){return Jo.some(a=>a===e)}const Qp=O({enabled:ge().default(!1),progress:ge().default(!0),engine:Yp.default({})}),Vy=Qp.parse({}),Yy=Se(["disabled","misconfigured","ready","running","error"]);O({configured:ge(),enabled:ge(),running:ge(),readiness:Yy,botUsername:k().min(1).nullable().default(null),allowlistCount:ce().int().min(0),agentTokenConfigured:ge(),missingCapabilities:Te(k()).default([]),lastUpdateAt:k().datetime().nullable().default(null),lastError:k().nullable().default(null)});const Jy=O({id:k().min(1),chatId:k().min(1),content:k().trim().min(1).max(1e3),createdAt:k().datetime(),updatedAt:k().datetime()});O({chatId:k().min(1),userId:k().min(1),sessionId:k().nullable(),activeProjectId:k().nullable(),activeSessionId:k().nullable(),personalityAgentId:k().nullable(),summary:k().max(4e3).nullable(),agent:hn,model:k().min(1),effort:k().min(1),memories:Te(Jy)});const Qy=["progress","final","decision","failure","confirmation"],Zy=Se(Qy),Xy=O({description:k().trim().min(1).max(500),method:Se(["POST","PATCH","PUT","DELETE"]),path:k().startsWith("/api/").max(1e3)});O({chatId:k().min(1),updateId:ce().int().nonnegative(),kind:Zy,text:k().trim().min(1).max(12e3),summary:k().trim().min(1).max(4e3).optional(),remember:Te(k().trim().min(1).max(1e3)).max(20).optional(),confirmation:Xy.optional()}).superRefine((e,a)=>{e.kind==="confirmation"&&!e.confirmation&&a.addIssue({code:me.custom,path:["confirmation"],message:"confirmation required"}),e.kind!=="confirmation"&&e.confirmation&&a.addIssue({code:me.custom,path:["confirmation"],message:"confirmation only valid for confirmation replies"})});O({id:k().min(1),chatId:k().nullable(),userId:k().nullable(),updateId:ce().int().nonnegative().nullable(),action:k().min(1),outcome:k().min(1),correlationId:k().nullable(),method:k().nullable(),path:k().nullable(),statusCode:ce().int().nullable(),createdAt:k().datetime()});O({text:k().trim().min(1).max(16e3)});const ev=80;O({name:k().max(ev*4)});const av=["off","default-branch","branch"],wr=O({mode:Se(av).default("off"),dest:Se(["local","origin"]).default("local"),branch:k().min(1).nullable().default(null),deleteBranch:ge().default(!1)}),hs={mode:"off",dest:"local",branch:null,deleteBranch:!1};function Ku(e){if(e==null)return null;const a=wr.safeParse(e);return a.success?a.data:null}function tv(e,a){return Ku(a)??Ku(e)??hs}const Wu={local:"lokal",origin:"origin"};function Zp(e){return e.mode==="off"?"tanpa auto-merge":`auto-merge ke ${e.mode==="default-branch"?`default branch repo (${Wu[e.dest]})`:`${e.branch??"—"} (${Wu[e.dest]})`}${e.deleteBranch?" · hapus branch kerja":""}`}const nv=32*1024,wc=["sessions:read","sessions:write","sessions:spawn","backlog:read","backlog:write","ide:read"],Xp=Se(wc),iv=O({enabled:ge().default(!1),capabilities:Te(Xp).default([])}),sv={enabled:!1,capabilities:[]},rv=e=>e<128?1:e<2048?2:e<65536?3:4;function ov(e){let a=0;for(let n=0;n<e.length;n++){const i=e.codePointAt(n);a+=rv(i),i>65535&&n++}return a}const eg=O({hubOrigin:k().min(1).max(200),userId:k().min(1).max(200),email:k().min(1).max(320)}).strict(),vn=k().min(1).max(64),lv=/(^|\/)\.\.?(\/|$)|%2e|%2f|%5c|\\|[?#]/i,ag=k().max(2048).regex(/^\/api\//).refine(e=>!lv.test(e),"path relay tak sah"),Sc=k().refine(e=>ov(e)<=nv,"part relay > 32 KiB"),tg=["GET","POST","PUT","PATCH","DELETE"],dv=O({t:ja("welcome"),v:ja(1),protocol:ce().int(),version:k().max(40)}).strict(),cv=O({t:ja("req"),id:vn,method:Se(tg),path:ag,query:k().max(2048).optional(),body:Yo().optional(),actor:eg}).strict(),uv=O({t:ja("cancel"),id:vn}).strict(),mv=O({t:ja("open"),sid:vn,path:ag,mode:Se(["read","write"]),actor:eg}).strict(),hv=O({t:ja("data"),sid:vn,d:Sc}).strict(),pv=O({t:ja("credit"),sid:vn,n:ce().int().min(1).max(4*1024*1024)}).strict(),ng=O({t:ja("close"),sid:vn,code:ce().int().min(1e3).max(4999),reason:k().max(120).optional()}).strict();zp("t",[dv,cv,uv,mv,hv,pv,ng]);const gv=O({t:ja("hello"),v:ja(1),protocol:ce().int(),version:k().max(40),capabilities:Te(Xp).max(wc.length)}).strict(),kv=O({t:ja("res"),id:vn,status:ce().int().min(100).max(599).optional(),contentType:k().max(200).optional(),part:Sc,end:ge()}).strict(),ig={cols:ce().int().min(1).max(1e3),rows:ce().int().min(1).max(1e3)},bv=O({t:ja("opened"),sid:vn,geometry:O(ig).strict().optional()}).strict(),fv=O({t:ja("geometry"),sid:vn,...ig}).strict(),yv=O({t:ja("data"),sid:vn,d:Sc,more:ja(!0).optional()}).strict();zp("t",[gv,kv,bv,fv,yv,ng]);O({control:O({enabled:ge(),capabilities:Te(k().max(40)).max(20)}).strict().optional(),logs:O({event:ge(),server:ge(),transcript:ge()}).strict().optional()}).strict();const sg=["lihat","kerja","tulis"],rg=Se(sg),vv=(()=>{const e=["sessions:read","backlog:read","ide:read"],a=[...e,"backlog:write","sessions:spawn"],n=[...a,"sessions:write"];return{lihat:e,kerja:a,tulis:n}})();O({tier:rg}).strict();O({tier:rg,from:k().min(1).max(200)}).strict();const og=["event","server","transcript"],xv=Se(og),lg=["debug","info","warn","error"],dg=Se(lg),jv=4*1024,wv={event:!0,server:!1,transcript:!1},Sv=O({event:ge().default(!0),server:ge().default(!1),transcript:ge().default(!1)}),_v={eventDays:90,serverDays:7,transcriptDays:30,maxBytes:256*1024**2},vl=e=>ce().int().min(1).max(365).default(e),Av=O({eventDays:vl(90),serverDays:vl(7),transcriptDays:vl(30),maxBytes:ce().int().min(16*1024**2).max(4*1024**3).default(256*1024**2)}),Tv=500,Ev=1*1024*1024,Vu=31,Yu=200,Cv=O({seq:k().regex(/^\d+$/),ts:k().datetime(),level:dg,kind:k().min(1).max(64),projectId:k().nullish(),specId:k().nullish(),sessionId:k().nullish(),msg:k().max(jv),data:mn(Yo()).nullish(),transcript:k().max(Ev).nullish()}).strict();O({lane:xv,entries:Te(Cv).min(1).max(Tv)}).strict();O({from:k().datetime(),to:k().datetime(),deviceId:k().optional(),projectId:k().optional(),specId:k().optional(),lane:k().optional(),level:dg.optional(),kind:k().optional(),q:k().max(200).optional(),cursor:k().optional(),limit:Dy.number().int().min(1).max(Yu).default(Yu)}).strict().refine(e=>Date.parse(e.to)>=Date.parse(e.from),{message:"to < from"}).refine(e=>Date.parse(e.to)-Date.parse(e.from)<=Vu*864e5,{message:`rentang > ${Vu} hari`});const cg=["feature","qa","scaffold","reverse","prd","audit","breakdown","goal","no_effort"],_c={feature:["Brainstorm","Objective","Spec","Plan","Execute"],qa:["Audit","Spec","Plan","Execute"],scaffold:["Brainstorm","Objective","Doc index"],reverse:["Scan","Docs teknis","Wawancara","Konvensi & index","Serah terima"],prd:["Brainstorm","PRD"],audit:["Audit","Laporan"],breakdown:["Analisis","Breakdown"],goal:["Goal","Verifikasi"],no_effort:["Kerjakan"]},Ac="hanoman-fase-";function Ju(e){return Ac+e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}const Pv=e=>e.startsWith(Ac),SL=new Set(cg.filter(e=>_c[e].some(a=>a==="Execute"||a==="Goal"))),Qu="Review",Mv=new Set(["feature","qa"]),Iv={claude:{model:"opus",effort:"high"},codex:{model:"gpt-5.6-sol",effort:"high"},antigravity:{model:"inherit",effort:null}},ug="2026-09-23-v2",hi=Se(["seeded","user"]),Nv=O({version:k().default(ug),claude:O({model:hi.default("seeded"),effort:hi.default("seeded")}).default({}),codex:O({model:hi.default("seeded"),effort:hi.default("seeded")}).default({}),antigravity:O({model:hi.default("seeded"),effort:hi.default("seeded")}).default({}),orchestration:mn(k(),hi).default({})}),Fe=(e,a)=>({model:e,effort:a}),En=(e,a,n=!0)=>({enabled:n,executeMode:"inline",claude:e,codex:a,antigravity:Object.fromEntries(Object.keys(e).map(i=>[i,{model:"inherit",effort:null}]))}),Rv={feature:En({Brainstorm:Fe("sonnet","medium"),Objective:Fe("sonnet","medium"),Spec:Fe("opus","high"),Plan:Fe("opus","high"),Execute:Fe("sonnet","high")},{Brainstorm:Fe("gpt-5.6-terra","medium"),Objective:Fe("gpt-5.6-terra","medium"),Spec:Fe("gpt-5.6-sol","high"),Plan:Fe("gpt-5.6-sol","high"),Execute:Fe("gpt-5.6-terra","high")}),qa:En({Audit:Fe("opus","high"),Spec:Fe("opus","high"),Plan:Fe("sonnet","high"),Execute:Fe("sonnet","high")},{Audit:Fe("gpt-5.6-sol","high"),Spec:Fe("gpt-5.6-sol","high"),Plan:Fe("gpt-5.6-terra","high"),Execute:Fe("gpt-5.6-terra","high")}),scaffold:En({Brainstorm:Fe("sonnet","medium"),Objective:Fe("sonnet","medium"),"Doc index":Fe("opus","high")},{Brainstorm:Fe("gpt-5.6-terra","medium"),Objective:Fe("gpt-5.6-terra","medium"),"Doc index":Fe("gpt-5.6-sol","high")}),reverse:En({Scan:Fe("sonnet","medium"),"Docs teknis":Fe("sonnet","high"),Wawancara:Fe("sonnet","medium"),"Konvensi & index":Fe("opus","medium"),"Serah terima":Fe("sonnet","low")},{Scan:Fe("gpt-5.6-terra","medium"),"Docs teknis":Fe("gpt-5.6-terra","high"),Wawancara:Fe("gpt-5.6-terra","medium"),"Konvensi & index":Fe("gpt-5.6-sol","medium"),"Serah terima":Fe("gpt-5.6-terra","low")}),prd:En({Brainstorm:Fe("sonnet","medium"),PRD:Fe("opus","high")},{Brainstorm:Fe("gpt-5.6-terra","medium"),PRD:Fe("gpt-5.6-sol","high")}),audit:En({Audit:Fe("opus","high"),Laporan:Fe("sonnet","medium")},{Audit:Fe("gpt-5.6-sol","high"),Laporan:Fe("gpt-5.6-terra","medium")}),breakdown:En({Analisis:Fe("opus","high"),Breakdown:Fe("opus","medium")},{Analisis:Fe("gpt-5.6-sol","high"),Breakdown:Fe("gpt-5.6-sol","medium")}),goal:En({Goal:Fe("sonnet","high"),Verifikasi:Fe("opus","medium")},{Goal:Fe("gpt-5.6-terra","high"),Verifikasi:Fe("gpt-5.6-sol","medium")}),no_effort:En({Kerjakan:Fe("haiku","low")},{Kerjakan:Fe("gpt-5.6-terra","low")},!1)},Lv=Object.fromEntries(cg.flatMap(e=>[[`${e}.enabled`,"seeded"],...["claude","codex","antigravity"].flatMap(a=>_c[e].flatMap(n=>[[`${e}.${a}.${n}.model`,"seeded"],[`${e}.${a}.${n}.effort`,"seeded"]]))])),$v={version:ug,claude:{model:"seeded",effort:"seeded"},codex:{model:"seeded",effort:"seeded"},antigravity:{model:"seeded",effort:"seeded"},orchestration:Lv},Bv=O({id:k(),name:k(),desc:k(),kind:Fp,repoDir:k().nullable().optional(),gitRemote:k().nullable().optional(),stack:k().default(""),docStatus:Oy,coverage:ce().int().min(0).max(100),createdAt:k()}),Zo=O({context:k(),outcome:k(),constraints:k(),priority:Wn,fromAudit:k().optional()}),Xo=O({severity:Se(["critical","major","minor"]),steps:k(),expected:k(),actual:k(),env:k(),constraints:k().default(""),fromAudit:k().optional()}),el=O({goal:k(),done:k(),constraints:k(),priority:Wn}),Dv=O({id:k(),reason:Se(["missing","unfinished","unmerged"])}),Ov=O({at:k(),from:k(),to:k(),by:k(),payload:Yo().optional()}),Hv=O({at:k(),by:k(),reason:k().optional()}),mg=O({id:k(),projectId:k(),title:k(),source:jr,stage:yc,priority:Wn,author:k(),objective:k(),payload:xr([Zo,Xo,el]).nullable(),branchFrom:k().nullable(),baseSha:k().nullable(),createdAt:k(),startedAt:k().nullable(),dependsOn:Te(k()).default([]),blockedBy:Te(Dv).default([]),autoMerge:wr.nullable().default(null),sourceHistory:Te(Ov).default([]),manualDone:Hv.nullable().default(null),reviewedAt:k().nullable().default(null)}),qv=mg.omit({payload:!0,sourceHistory:!0}).extend({version:ce().optional(),updatedAt:k().optional()});qv.omit({objective:!0});const Zu=["off","short","medium","long","blip","pop","ping","coin","alert","chime","success","bell","marimba","fanfare"],ls=["xhigh","high","medium","low","max","ultracode"];let _s=[{id:"default",label:"Default (rekomendasi CLI)",efforts:ls},{id:"opus",label:"Opus",efforts:ls},{id:"sonnet",label:"Sonnet",efforts:ls},{id:"haiku",label:"Haiku"},{id:"fable",label:"Fable",efforts:ls}];const hg="default",xl=["ultra","max","xhigh","high","medium","low"],Uv=["max","xhigh","high","medium","low"],pg=["xhigh","high","medium","low"];let kn=[{id:"gpt-6-astra",label:"GPT-6 Astra",efforts:xl,fallback:"medium",minClient:""},{id:"gpt-5.6-sol",label:"GPT-5.6 Sol",efforts:xl,fallback:"xhigh",minClient:"0.144.0"},{id:"gpt-5.6-terra",label:"GPT-5.6 Terra",efforts:xl,fallback:"xhigh",minClient:"0.144.0"},{id:"gpt-5.6-luna",label:"GPT-5.6 Luna",efforts:Uv,fallback:"xhigh",minClient:"0.144.0"},{id:"gpt-5.5",label:"GPT-5.5",efforts:pg,fallback:"xhigh",minClient:"0.124.0"}];function zv(e,a,n){_s=e,kn=a,n&&Wy(n)}function al(e){return _s.find(a=>a.id===e)??_s.find(a=>a.resolved===e)}function gg(){return _s.filter(e=>e.id!==hg)}function kg(e){var a;return((a=al(e))==null?void 0:a.efforts)??ls}function bg(e,a){const n=e.map(r=>({value:r.id,label:r.label}));if(!a||n.some(r=>r.value===a))return n;const i=e.find(r=>r.resolved===a);return[{value:a,label:i?`${i.label} (terpatok: ${a})`:a},...n]}function Tc(e,a){var i;const n=(i=al(e))==null?void 0:i.efforts;return!(n!=null&&n.length)||n.includes(a)?a:n.includes("xhigh")?"xhigh":n[0]}function tl(e){return kn.find(a=>a.id===e)}function Fv(e){var a;return((a=tl(e))==null?void 0:a.efforts)??pg}function Ec(e,a){const n=tl(e);return n?n.efforts.includes(a)?a:n.fallback:a}function fg(e,a){const n=e.split(".").map(Number),i=a.split(".").map(Number);for(let r=0;r<Math.max(n.length,i.length);r++){const s=(n[r]??0)-(i[r]??0);if(s!==0)return s}return 0}function Gv(e,a){var i;const n=(i=tl(e))==null?void 0:i.minClient;return!n||!a?!1:fg(a,n)<0}const yg=O({model:k().default("gpt-5.6-terra"),effort:k().default("medium")}),Td=yg.parse({}),vg=O({model:k().default(Ss.model),effort:k().default(Ss.effort)}),Kv=vg.parse({}),Xu={enabled:ge().default(!1)},Cc=O({enabled:ge().default(!1),paused:ge().default(!1),maxConcurrent:ce().int().min(1).default(2),launchGuard:O({enabled:ge().default(!0),maxLoadPerCore:ce().finite().positive().default(2.5),minMemAvailablePct:ce().finite().min(0).max(100).default(15)}).default({}),autonomy:Se(["full-control","butuh-keputusan"]).default("butuh-keputusan"),sources:O({backlog:O({...Xu,everyMin:ce().int().min(1).default(15)}).default({}),triase:O({...Xu,everyMin:ce().int().min(1).default(30)}).default({})}).default({})}),Wv=Cc.parse({}),xg=O({enabled:ge().default(!1),condition:k().max(4e3).default("")}),Vv=xg.parse({}),jg=O({enabled:ge().default(!1),agent:hn.default("claude"),model:k().default("opus"),effort:k().default("xhigh")}),Yv=jg.parse({}),Jv=Yp,Pc=O({enabled:ge().default(!1),paused:ge().default(!1),pausedProjects:Te(k()).default([]),everyMin:ce().int().min(1).max(1440).default(5),timeoutSec:ce().int().min(10).max(900).default(600),maxAutoAnswers:ce().int().min(1).max(20).default(3),maxConcurrent:ce().int().min(1).max(16).default(2),queueWaitSec:ce().int().min(0).max(900).default(120),flowTtlMin:ce().int().min(1).max(1440).default(60),requireGreenBeforeIntegrate:ge().default(!0),engine:Jv.default({})}),Qv=Pc.parse({}),wg=O({enabled:ge().default(!1),brainstormPerMonth:ce().int().min(0).max(1e3).default(2),askPerMonth:ce().int().min(0).max(1e4).default(30),model:k().default("opus"),effort:k().default("high"),timeoutSec:ce().int().min(10).max(900).default(180)}),Zv=wg.parse({}),jl=O({model:k().nullable().default(null),effort:k().nullable().default(null)});O({model:Se(Jo).nullable().default(null),effort:By().default(null)});const qn={model:200,effort:64,phase:64,phases:32},Xv=O({model:k().min(1).max(qn.model).nullable().optional(),effort:k().min(1).max(qn.effort).nullable().optional()}),ex=mn(k().min(1).max(qn.phase),Xv).refine(e=>Object.keys(e).length<=qn.phases,{message:`phaseOverrides maksimal ${qn.phases} fase`}),Cn=O({enabled:ge().default(!0),executeMode:Se(["inline","subagent"]).catch("inline").default("inline"),claude:mn(k(),jl).default({}),codex:mn(k(),jl).default({}),antigravity:mn(k(),jl).default({})}),Sg=O({feature:Cn.default({}),qa:Cn.default({}),scaffold:Cn.default({}),reverse:Cn.default({}),prd:Cn.default({}),audit:Cn.default({}),breakdown:Cn.default({}),goal:Cn.default({}),no_effort:Cn.default({})}),Mc=Sg.parse(Rv);O({model:k().default("sonnet"),effort:k().default("medium"),autoDefault:ge(),autoScaffold:ge(),notifyFail:ge(),notifyDone:ge().default(!0),notifySound:Se(Zu).default("short"),notifyDecision:ge().default(!0),notifyDecisionSound:Se(Zu).default("alert"),notifyDecisionTelegram:ge().default(!0),agentAccessEnabled:ge().default(!1),scheduler:Cc.default(Wv),goal:xg.default(Vv),agent:hn.default("claude"),codex:yg.default(Td),antigravity:vg.default(Kv),verifyScope:Gp.default("changed"),method:k().default(Wp),conflict:jg.default(Yv),lead:Pc.default(Qv),telegram:Qp.default(Vy),portalChat:wg.default(Zv),orchestration:Sg.default(Mc),remoteControl:iv.default(sv),logShipping:Sv.default(wv),logRetention:Av.default(_v),builtinAgents:mn(k(),k()).default({}),builtinAgentPolicies:mn(k(),k()).default({}),builtinRuntimeDefaults:Nv.default($v)});O({id:k(),type:Se(["done","decision","ticket","fail","lead"]).default("done"),specId:k().nullable(),sessionId:k().nullable(),title:k(),projectId:k().nullable(),createdAt:k(),readAt:k().nullable()});O({projectId:k(),path:k(),category:k(),content:k(),linked:ge(),root:ge()});O({id:k(),name:k(),createdAt:k(),lastSeenAt:k().nullable(),revokedAt:k().nullable()});const Ic="inherit",_g="0.151.0";function ax(e){var n;const a=e?(n=/(\d+)\.(\d+)\.(\d+)/.exec(e))==null?void 0:n[0]:null;return a?fg(a,_g)>=0:!1}function tx(e,a){return e!=="antigravity"||!a?null:Object.values(a).some(n=>n.model!=null&&!jc(n.model)||n.effort!=null)?"Antigravity child memakai tier native tanpa effort independen":null}function nx(e){const a=tx(e.runtime,e.phaseOverrides);if(a)throw new Error(a);const n=(e.orchestration??Mc)[e.flow];if(!e.nativeAgents||(n==null?void 0:n.enabled)===!1)return null;const i=(n==null?void 0:n[e.runtime])??{},r=e.runtime==="codex"?Ec:Tc,s=(l,d)=>{var g;const u=i[l],m=(g=e.phaseOverrides)==null?void 0:g[l];if(e.runtime==="antigravity"){const b=((m==null?void 0:m.model)!==void 0?m.model:u==null?void 0:u.model)??"inherit",v=(m==null?void 0:m.effort)!==void 0?m.effort:u==null?void 0:u.effort;if(!jc(b)||v!=null)throw new Error("Antigravity child memakai tier native tanpa effort independen");return{model:b,effort:null}}const h=(m==null?void 0:m.model)??(u==null?void 0:u.model)??d.model,p=e.runtime==="claude"&&h===hg?Ic:h;return{model:p,effort:r(p,(m==null?void 0:m.effort)??(u==null?void 0:u.effort)??d.effort??"medium")}},o=Mv.has(e.flow)?{agentName:Ju(Qu),phase:"Execute",...s(Qu,Iv[e.runtime])}:void 0;return{flow:e.flow,runtime:e.runtime,phases:_c[e.flow].map(l=>({phase:l,agentName:Ju(l),...s(l,e.orchestrator)})),...o?{reviewer:o}:{},executeMode:(n==null?void 0:n.executeMode)??"inline"}}const Ag=["projects:read","projects:write","backlog:read","backlog:write","sessions:read","sessions:write","docs:read","docs:write","ide:read","ide:write","vps:read","vps:write","settings:read","settings:write","support:read","support:write","notifications:read","notifications:write","lead:read","lead:write","agents:read","agents:write","skills:read","skills:write","telegram:read","telegram:write","team:read","team:write","qa:read","qa:write","webhooks:read","webhooks:write","clients:read","clients:write","portal:read","sessions:spawn","ide:git","backlog:lifecycle","vps:exec","activity:read","activity:write","portal-chat:read","portal-chat:write","qa:delete","sessions:decide","scheduler:read","scheduler:write","telegram:admin","tokens:read","tokens:write","devices:read","devices:write","access:read","access:admin","remote:read","remote:control","relay:exec","logs:read","logs:write","presence:read","metrics:read","metrics:write","sync:read","sync:write","sync:resolve","instance:admin"],nl=Se(Ag);O({id:nl,domain:k(),access:Se(["read","write","danger"]),label:k(),desc:k(),risk:Se(["rce","exec","data"]).optional()});const _L=[{domain:"projects",label:"Projects",desc:"Project, branch, binding, Help Center."},{domain:"backlog",label:"Backlog / Spec",desc:"Spec/backlog, dokumen, review diff, integrate."},{domain:"sessions",label:"Sesi",desc:"Sesi terminal, fase, jalankan claude/shell."},{domain:"docs",label:"Docs & PRD",desc:"Dokumen SoT project & PRD."},{domain:"ide",label:"IDE / Git",desc:"Tree, file, status git, graph, commit, diff."},{domain:"vps",label:"VPS",desc:"VPS, checklist kepatuhan, audit, konsol."},{domain:"settings",label:"Settings",desc:"Setelan & config runtime."},{domain:"support",label:"Help Desk",desc:"Tiket Help Center (Help Desk): lihat, terima/tolak, promosikan ke backlog."},{domain:"notifications",label:"Notifikasi",desc:"Lihat & kelola notifikasi."},{domain:"lead",label:"Lead",desc:"Minta putusan ke hanoman-lead & baca jejak keputusannya."},{domain:"agents",label:"Custom agent",desc:"Katalog persona agen global & per project."},{domain:"skills",label:"Skills",desc:"Skill global hanoman, user, plugin & per project."},{domain:"telegram",label:"Telegram",desc:"Status, binding, memory, reply, dan audit kanal operator Telegram."},{domain:"team",label:"Tim",desc:"Kartu papan Tim (kerja manusia), direktori anggota, eskalasi kartu ke backlog."},{domain:"qa",label:"QA",desc:"Laporan QA per project: test case, temuan, lampiran, ekspor/impor."},{domain:"webhooks",label:"Webhook",desc:"Endpoint webhook keluar, secret penandatanganan, riwayat pengiriman."},{domain:"clients",label:"Akun klien",desc:"Akun login portal klien dan project yang boleh dilihatnya."},{domain:"portal",label:"Portal klien",desc:"Lihat portal atas nama satu akun klien (baca-saja)."},{domain:"activity",label:"Aktivitas",desc:"Log aktivitas lintas device (stage, commit, PR) dan purge-nya."},{domain:"portal-chat",label:"Chat portal",desc:"Percakapan klien di chat portal (berisi email klien), PRD draft, dan ekspor transkrip."},{domain:"decisions",label:"Keputusan sesi",desc:"Jawab/rebut dialog AskUserQuestion sesi — gerbang manusia yang memutuskan."},{domain:"scheduler",label:"Cronjob",desc:"Cronjob per project: sesi agen terjadwal. Eksekusinya juga menuntut Sesi — buka sesi baru."},{domain:"tokens",label:"Agent token",desc:"Cetak/ubah/cabut agent token — hanya sebatas capability milik pemanggil."},{domain:"devices",label:"Device token",desc:"Kredensial mesin untuk sync & relay: daftar, cetak, cabut."},{domain:"access",label:"Akun & password",desc:"Daftar akun, buat/hapus akun admin, setel ulang password — setara akses penuh."},{domain:"remote",label:"Kendali jarak jauh",desc:"Grant kendali jarak jauh mesin ini dan lajur log ke hub."},{domain:"relay",label:"Relay perangkat",desc:"Aksi sesi di mesin lain lewat relay hub."},{domain:"logs",label:"Log terpusat",desc:"Pencarian log lintas device, transkrip, retensi."},{domain:"presence",label:"Presence",desc:"Sesi yang sedang hidup di seluruh device operator."},{domain:"metrics",label:"Metrik custom agent",desc:"Metrik pemakaian custom agent & disposisi per invokasi."},{domain:"sync",label:"Sync",desc:"Antrean konflik rekonsil, penghapusan tertunda, pemicu sync manual ke hub."},{domain:"instance",label:"Instance",desc:"Pasang pembaruan hanoman dan restart proses server."}];O({id:k(),name:k(),tokenPrefix:k(),capabilities:Te(nl),enabled:ge(),createdBy:k().nullable(),createdAt:k(),lastUsedAt:k().nullable(),revokedAt:k().nullable()});O({name:k().min(1),capabilities:Te(nl)});O({name:k().min(1).optional(),capabilities:Te(nl).optional(),enabled:ge().optional()});const wi=["claude","codex","antigravity"];Se(wi);const Tg={claude:"Claude Code",codex:"Codex CLI",antigravity:"Antigravity CLI"},ix=["always","smart"],Eg=Se(ix),Cg=k().min(1).max(64).regex(/^[a-z][a-z0-9_-]*$/),sx=["inherit","read-only","isolated-worktree"],Pg=Se(sx),Nc=/^[a-z][a-z0-9-]{1,39}$/,Mg=["Read","Write","Edit","Bash","Glob","Grep","WebFetch","WebSearch"],em="Task";O({id:k(),projectId:k().nullable(),name:k().regex(Nc),description:k(),instructions:k(),tools:Te(k()).nullable(),model:k().nullable(),mentions:Te(k()).nullable(),runtime:Se(wi).nullable(),activation:Eg.default("always"),effort:Cg.nullable().default(null),workspacePolicy:Pg.default("inherit"),maxTurns:ce().int().min(1).max(200).nullable().default(null),timeoutSeconds:ce().int().min(30).max(3600).nullable().default(null),enabled:ge(),createdAt:k(),updatedAt:k()});const Ig=O({projectId:k().nullable().optional(),name:k().regex(Nc).refine(e=>!Pv(e),{message:`awalan ${Ac} dicadangkan untuk agen fase hanoman`}),description:k().trim().min(1).max(500),instructions:k().trim().min(1).max(2e4),tools:Te(k()).nullable().optional(),model:k().nullable().optional(),mentions:Te(k()).nullable().optional(),runtime:Se(wi).nullable().optional(),activation:Eg.optional(),effort:Cg.nullable().optional(),workspacePolicy:Pg.optional(),maxTurns:ce().int().min(1).max(200).nullable().optional(),timeoutSeconds:ce().int().min(30).max(3600).nullable().optional(),enabled:ge().optional()});function rx(e,a){Ng(e,a),e.workspacePolicy==="isolated-worktree"&&e.runtime!=="claude"&&a.addIssue({code:me.custom,path:["workspacePolicy"],message:"isolated-worktree hanya tersedia untuk Claude Code"})}function Ng(e,a){e.runtime==="antigravity"&&(e.model!=null&&!jc(e.model)&&a.addIssue({code:me.custom,path:["model"],message:"Antigravity child memakai tier inherit, flash, atau pro"}),e.effort!=null&&a.addIssue({code:me.custom,path:["effort"],message:"Antigravity child tidak mendukung effort independen"}))}Ig.superRefine(rx);Ig.omit({name:!0,projectId:!0}).partial().superRefine((e,a)=>{Ng(e,a),e.workspacePolicy==="isolated-worktree"&&e.runtime!==void 0&&e.runtime!=="claude"&&a.addIssue({code:me.custom,path:["workspacePolicy"],message:"isolated-worktree hanya tersedia untuk Claude Code"})});function ox(e){const a=e.tools??[...Mg],n=(e.mentions??[]).length>0,i=a.filter(r=>r!==em);return n&&i.push(em),i}const lx=[{name:"product-designer",description:"Gunakan saat alur pengguna atau UI perlu DIRANCANG dan diwujudkan sesuai design system: layout, hierarki, token, copy, state visual (loading/kosong/error/disabled), dan aksesibilitas dasar. Beda dari frontend-engineer (state, data fetching, langganan, dan performa React pada desain yang sudah ada) dan solution-architect (keputusan lintas modul, bukan implementasi). Menghasilkan artefak desain atau patch UI dalam scope parent dengan bukti render nyata.",tools:["Read","Glob","Grep","Bash","Write","Edit","WebFetch","WebSearch"],enabledByDefault:!1,activation:"smart",effort:"medium",workspacePolicy:"isolated-worktree",maxTurns:60,timeoutSeconds:null,models:{claude:"sonnet",codex:"gpt-5.6-terra"},mentions:["a11y-auditor"],instructions:["Kamu merancang pengalaman produk dan mewujudkan UI sesuai design system serta mandat parent — bukan mengubah state/data-fetching React yang sudah benar (itu frontend-engineer) dan bukan keputusan lintas modul (itu solution-architect).","Masukan minimum: tujuan pengguna, alur prioritas, acceptance criteria, design system/reference, dan ownership berkas atau artefak. Baca komponen dan token existing sebelum membuat pola baru.","1. Petakan alur dan state VISUAL yang relevan: awal, loading, kosong, sukses, error, disabled, validasi, fokus/keyboard, serta hak akses. Tandai state yang tidak berlaku beserta alasan.","2. Gunakan token dan komponen existing (design system proyek ini — docs/token repo, cari sebelum mengasumsikan lokasinya); periksa hirarki, copy, kontras, label, fokus, urutan keyboard, dan viewport sempit/lebar. Referensi web hanya bila perlu panduan primer.","3. Buat artefak atau patch hanya dalam ownership yang diserahkan; jangan memperluas fitur, mengubah kontrak data/state React, atau mengubah backend tanpa mandat — serahkan itu ke frontend-engineer/parent.","4. Cocokkan hasil dengan acceptance criteria dari RENDER NYATA, bukan pembacaan kode: periksa package.json proyek ini dulu — bila Playwright/Puppeteer terpasang, pakai itu; bila tidak, fallback ke Chrome headless (`--remote-debugging-port`) dikendalikan CDP (`/json/list`, `Page.navigate`, `Runtime.evaluate`, `Page.captureScreenshot`) dari skrip Node sekali pakai, pada viewport dan state relevan. Bash/WebFetch/kode saja BUKAN bukti render; tanpa CDP/Playwright tersedia, laporkan gap verifikasi visual secara eksplisit.","Berhenti saat mandat terpenuhi atau keputusan produk/dependensi menghalangi; kerjakan bagian independen lalu eskalasi ke parent. Untuk UI interaktif (form, dialog, menu, live region), sarankan parent memanggil a11y-auditor sesudahnya.","Handoff ringkas: artefak/berkas berubah, keputusan desain, state diperiksa, acceptance beserta bukti render, ketidakpastian dan gap, serta langkah parent. Jangan membuat proses berat untuk UI kecil.","Jangan mengklaim selesai bila acceptance penting belum terverifikasi."].join(`
|
|
11
11
|
`)},{name:"feature-builder",description:"Gunakan saat spec atau desain yang cukup jelas perlu menjadi fitur di repo sesi ini (bukan repo lain) dengan batas ownership tegas, test relevan dan dokumentasi. Menghasilkan patch terisolasi; parent memegang keputusan scope dan integrasi.",tools:["Read","Glob","Grep","Bash","Write","Edit"],enabledByDefault:!1,activation:"smart",effort:"medium",workspacePolicy:"isolated-worktree",maxTurns:80,timeoutSeconds:null,models:{claude:"sonnet",codex:"gpt-5.6-terra"},instructions:["Kamu mengimplementasikan satu bagian fitur yang didelegasikan parent.","Masukan minimum: spec/desain, acceptance criteria, base SHA, ownership berkas/modul, batas","perubahan dan kontrak integrasi. Baca docs serta pola kode relevan; gunakan bukti parent.","1. Cocokkan requirement dengan keadaan kode. Tandai asumsi atau keputusan yang belum jelas;"," eskalasi yang memengaruhi kontrak sebelum menebaknya, lanjutkan bagian independen.","2. Buat patch terkecil yang memenuhi mandat di worktree sendiri. Kamu tidak sendirian:"," jangan membatalkan edit agen lain, mengubah worktree parent, atau memperluas refactor.","3. Uji perilaku yang berubah dan batas kontrak yang berisiko. Pasang dependensi & generate SEKALI di"," awal. Sebelum test/migrasi, pastikan `DATABASE_URL` tidak menunjuk DB operasional hanoman; jalankan"," dengan DB sekali-pakai. Catat perintah, output, dan kegagalan yang belum selesai.","4. Perbarui docs yang berubah sesuai konvensi repo. Nilai tiap acceptance dari keadaan akhir,"," bukan hanya keberadaan patch atau test hijau. Parent memegang merge dan integrasi.","Berhenti setelah scope terpenuhi atau dependensi menghalangi; laporkan kekurangan input,","konflik ownership, dan verifikasi yang tidak tersedia. Jangan mengklaim test yang tidak jalan.","Bentuk laporan: `Status:` (enum hanoman, bukan DONE/BLOCKED milik skill lain) · tabel AC → putusan","(terpenuhi/sebagian/belum) → bukti (perintah + potongan output, path:baris) · branch + SHA commit ·","berkas berubah · `Keputusan terbuka:`. Commit hanya dengan `git add <path>` eksplisit; jangan cd ke worktree lain.","Jangan mengklaim selesai bila acceptance penting belum terverifikasi."].join(`
|
|
12
12
|
`)},{name:"performance-engineer",description:"Gunakan saat latensi, throughput, penggunaan resource atau respons UI perlu diukur dan diperbaiki. Menghasilkan baseline berulang, profil bottleneck, dan patch optimasi dengan perbandingan setara serta risiko regresi.",tools:["Read","Glob","Grep","Bash","Write","Edit","WebFetch","WebSearch"],enabledByDefault:!1,activation:"smart",effort:"high",workspacePolicy:"isolated-worktree",maxTurns:40,timeoutSeconds:null,models:{claude:"sonnet",codex:"gpt-5.6-terra"},instructions:["Kamu membuktikan bottleneck dan dampak optimasi, bukan menebak kode yang tampak lambat.","Masukan minimum: gejala, skenario/data, environment, metrik dan acceptance target, base SHA,","ownership patch serta batas pengukuran. Bila akses profiler/browser/monitoring tidak ada,","nyatakan gap; jangan mengarang angka atau mengaku telah memprofil.","1. Catat versi, perangkat, beban, cache/warmup, concurrency dan kondisi lingkungan. Ukur"," baseline berulang sebelum mengubah kode; simpan perintah, jumlah run dan hasil individual.","2. Profil skenario yang sama untuk membedakan hipotesis bottleneck. Bedakan observasi dari"," dugaan. Gunakan referensi primer bila perlu memahami profiler atau perilaku runtime.","3. Optimalkan bottleneck yang terbukti dalam ownership parent. Jaga hasil fungsional dan"," kontrak API/data; jangan mengganti arsitektur atau menjalankan beban produksi tanpa mandat.","4. Ukur sesudah perubahan dengan skenario, data dan environment setara serta run berulang."," Laporkan sebaran/noise, warmup dan outlier; jangan memilih satu angka terbaik. Bila noise"," menutupi perbedaan, simpulkan belum terbukti. Periksa regresi correctness dan resource lain.","Berhenti saat target acceptance terbukti, manfaat tidak terbukti, atau alat/scope menghalangi;","serahkan keputusan tradeoff ke parent. Jangan memperluas eksperimen ke layanan eksternal sendiri.","Handoff: baseline/before-after dan bukti mentah, bottleneck, patch, penerimaan/regresi,","ketidakpastian dan kondisi reproduksi. Nyatakan pengukuran yang belum dilakukan secara jelas.","Jangan mengklaim selesai bila acceptance penting belum terverifikasi."].join(`
|
|
13
13
|
`)},{name:"product-analyst",description:"Gunakan saat brief atau permintaan fitur MENTAH (belum ada spec) perlu diperjelas menjadi kebutuhan tervalidasi, prioritas/MVP dan acceptance criteria yang dapat diuji — bukan laporan pengguna yang sudah masuk (itu support-triager), dan bukan penulisan spec formal (itu fase Spec; agen ini hanya menyiapkan bahan mentahnya). Membaca bukti yang tersedia dan menyerahkan keputusan terbuka ke parent.",tools:["Read","Glob","Grep","WebFetch","WebSearch"],enabledByDefault:!1,activation:"smart",effort:"medium",workspacePolicy:"read-only",maxTurns:30,timeoutSeconds:null,models:{claude:"sonnet",codex:"gpt-5.6-terra"},instructions:["Kamu mengubah brief menjadi kebutuhan yang dapat diuji; ownership-mu analisis, bukan patch.","Masukan minimum: masalah, pengguna, tujuan/outcome, batas scope, bukti pengguna yang tersedia","dan kendala. Tidak punya akses wawancara, analytics atau tiket live hanya karena peran ini.","1. Baca brief/docs/bukti. Pisahkan kebutuhan tervalidasi (sertakan sumber), asumsi, usulan,"," dan pertanyaan terbuka. Jangan mengubah preferensi sendiri menjadi kebutuhan pengguna.","2. Petakan alur utama, aktor, batas sistem, kegagalan dan kebutuhan nonfungsional relevan."," Gunakan sumber primer web bila konteks perlu referensi; catat tanggal dan batas sumber.","3. Usulkan MVP dan prioritas menurut dampak, kebutuhan terbukti, dependensi dan biaya yang"," diketahui. Tandai estimasi sebagai asumsi; sertakan yang ditunda dan alasan tradeoff.","4. Turunkan acceptance criteria yang observabel: kondisi/pemicu, perilaku dan hasil yang"," dapat diperiksa, termasuk kasus gagal relevan. Jangan menjanjikan validasi yang belum ada.","Berhenti ketika brief siap diputuskan atau bukti minimum tidak ada. Ajukan pertanyaan paling","menentukan ke parent; jangan menghubungi pengguna atau menulis berkas/issue sendiri.","Handoff: kebutuhan dan sumber bukti, MVP/prioritas, acceptance, ketidakpastian/asumsi,","keputusan terbuka serta input berikutnya. Sesuaikan kedalaman analisis dengan ukuran tugas.","Jangan mengklaim selesai bila acceptance penting belum terverifikasi."].join(`
|
|
@@ -1007,6 +1007,6 @@ Klik Masuk`,"aria-label":`Langkah pengujian ${e.code}`,...m("steps")})}),t.jsx(d
|
|
|
1007
1007
|
Isi akun yang benar
|
|
1008
1008
|
Klik Masuk`,value:o.steps,onChange:M("steps")})}),t.jsx(de,{label:"Hasil yang diharapkan",children:t.jsx(La,{rows:3,placeholder:"mis. Halaman beranda terbuka.",value:o.expected,onChange:M("expected")})}),t.jsx(de,{label:"Hasil yang terjadi",children:t.jsx(La,{rows:3,placeholder:"mis. Tombol diam, tak ada pesan galat.",value:o.actual,onChange:M("actual")})}),o.id&&t.jsx(de,{label:"Status",children:t.jsx(Be,{value:o.status,onChange:M("status"),options:[{value:"open",label:mo.open},{value:"wontfix",label:mo.wontfix}]})}),d&&t.jsx("p",{role:"alert",className:"hn-qa-error",children:d})]})}),i]})}function iN({f:e,p:a}){return t.jsxs("div",{className:"hn-qa-detail-stack",children:[t.jsxs("span",{className:"hn-qa-row-line",children:[t.jsx(la,{tone:Af[e.severity],size:"sm",children:fs[e.severity]}),t.jsx(la,{tone:Tf[e.status],variant:"dot",size:"sm",children:mo[e.status]}),t.jsxs("span",{children:["Prioritas ",e.priority]}),e.area&&t.jsx("span",{children:e.area}),e.caseCode&&t.jsx("span",{children:e.caseCode})]}),e.steps.length>0&&t.jsxs("div",{children:[t.jsx("div",{className:"hn-qa-label",children:"Cara memunculkan masalah"}),t.jsx("ol",{className:"hn-qa-steps",children:e.steps.map((n,i)=>t.jsx("li",{children:n},i))})]}),t.jsxs("div",{className:"hn-qa-detail-grid",children:[t.jsxs("div",{children:[t.jsx("div",{className:"hn-qa-label",children:"Hasil yang diharapkan"}),t.jsx("div",{className:"hn-qa-pre",children:e.expected||"—"})]}),t.jsxs("div",{children:[t.jsx("div",{className:"hn-qa-label",children:"Hasil yang terjadi"}),t.jsx("div",{className:"hn-qa-pre",children:e.actual||"—"})]})]}),t.jsxs("div",{children:[t.jsx("div",{className:"hn-qa-label",children:"Lampiran temuan"}),t.jsx(_u,{...a,ownerType:"finding",ownerId:e.id,compact:!0})]})]})}function sN({detail:e,projectId:a}){const n=_t(),i=Object.fromEntries(e.attachments.map(r=>[r.id,n.qaAttachmentUrl(a,e.id,r.id)]));return t.jsx("div",{className:"hn-qa-preview",children:t.jsx(Ms,{text:k0(e,i,{preview:!0}),name:`${e.code}.md`})})}const mc=[{key:"os",label:"Sistem operasi",example:"Windows 11 atau macOS 15"},{key:"browser",label:"Browser",example:"Chrome 130"},{key:"device",label:"Perangkat",example:"Laptop atau iPhone 15"},{key:"url",label:"Alamat aplikasi",example:"https://staging.example.com"},{key:"branch",label:"Branch (opsional)",example:"main"}],up=e=>({title:e.title,buildVersion:e.buildVersion,tester:e.tester,scope:e.scope,summary:e.summary,verdict:e.verdict??"",env:KI(Object.fromEntries(Object.entries(e.environment).filter(([a])=>!mc.some(n=>n.key===a)))),os:e.environment.os??"",browser:e.environment.browser??"",device:e.environment.device??"",url:e.environment.url??"",branch:e.environment.branch??""});function rN({detail:e,projectId:a,onChange:n,onBack:i,onDeleted:r,onToast:s,onOpenSession:o,startOpen:l=!1}){const d=_t(),{confirm:u,dialog:m}=st(),h=e.status==="closed",p=Object.prototype.hasOwnProperty.call(qd,e.status),[g,f]=c.useState("cases"),[b,v]=c.useState(()=>up(e)),[x,y]=c.useState(()=>up(e)),[T,S]=c.useState(l),[E,w]=c.useState(!1),[M,N]=c.useState(!1),[R,I]=c.useState(!1),[L,A]=c.useState(""),[B,G]=c.useState(""),[H,Y]=c.useState(""),X=JSON.stringify(b)!==JSON.stringify(x),q=e.status==="submitted"?"closed":"submitted",ie=b.title.trim().length>0,te=e.findings.filter(be=>be.status==="open").length,Z=e.attachments.filter(be=>be.ownerType==="report").length,xe=()=>({title:b.title,buildVersion:b.buildVersion,tester:b.tester,scope:b.scope,summary:b.summary,verdict:b.verdict||null,environment:{...WI(b.env),...Object.fromEntries(mc.filter(({key:be})=>b[be].trim()).map(({key:be})=>[be,b[be].trim()]))}}),_e=async(be,Ze)=>{const z=b;I(!0);try{const $e=await d.patchQaReport(a,e.id,{...h?{}:xe(),...be?{status:be}:{}});return y(z),A(""),G(""),n($e),null}catch($e){return Go(Ze,$e)}finally{I(!1)}},ae=async()=>{if(!ie){A("Isi judul laporan sebelum menyimpan."),S(!0);return}const be=await _e(void 0,"menyimpan laporan");be&&G(be)},ee=async()=>{const be=await _e("draft","membuka kembali laporan");be&&G(be)},le=()=>{Y(""),w(!0)},re=async()=>{Y("");const be=await _e(q,q==="closed"?"menyelesaikan laporan":"mengajukan laporan");be?Y(be):w(!1)},Ce=async()=>{if(await u({title:`Hapus ${e.code}?`,message:`"${e.title}"`,impact:["Test case, temuan, dan lampirannya ikut terhapus."],tone:"danger",confirmLabel:"Hapus"}))try{await d.deleteQaReport(a,e.id),r()}catch(be){s==null||s(wt(be))}},Ee=async()=>{X&&!await u({title:"Buang perubahan yang belum disimpan?",message:"Perubahan pada informasi laporan belum disimpan dan akan hilang.",impact:["Judul, versi, penguji, lingkungan, ringkasan, dan keputusan kembali ke nilai yang tersimpan."],tone:"danger",confirmLabel:"Buang perubahan"})||i()},J=be=>Ze=>v(z=>({...z,[be]:Ze.target.value})),ea=b.verdict&&b.verdict in or?or[b.verdict]:"Belum dipilih",Ke=[b.os,b.browser,b.device].map(be=>be.trim()).filter(Boolean),He=B||(h?"Laporan terkunci. Buka kembali untuk mengubah isinya.":X?"Ada perubahan belum disimpan.":"Semua perubahan tersimpan."),Ve=q==="closed"?"Selesaikan dan kunci":"Ajukan",ya=q==="closed"?"Selesaikan dan kunci":"Ajukan laporan",We=h?t.jsx(U,{disabled:R,loading:R,onClick:()=>void ee(),children:"Buka kembali"}):X?t.jsxs(t.Fragment,{children:[t.jsx(U,{disabled:R,loading:R,onClick:()=>void ae(),children:"Simpan"}),t.jsx(U,{variant:"secondary",disabled:R,onClick:le,children:Ve})]}):t.jsx(U,{disabled:R,onClick:le,children:Ve}),ga=[{key:"preview",label:"Pratinjau laporan",icon:"eye",onSelect:()=>N(!0)},...h?[]:[{key:"delete",label:"Hapus laporan",icon:"trash-2",tone:"danger",onSelect:()=>void Ce()}]],qa=ie&&b.verdict!=="",wa={detail:e,projectId:a,locked:h,onChange:n,onToast:s,onOpenSession:o};return t.jsxs("div",{className:"hn-qa-editor",children:[t.jsxs("div",{className:"hn-qa-bar",children:[t.jsxs("div",{className:"hn-qa-bar-title",children:[t.jsx(U,{variant:"ghost",size:"sm",leftIcon:"arrow-left",onClick:()=>void Ee(),children:"Kembali"}),t.jsx(la,{tone:"brass",variant:"outline",size:"sm",children:e.code}),p&&t.jsx(la,{tone:Ef[e.status],size:"sm",children:qd[e.status]}),t.jsx("h3",{className:"hn-qa-bar-name",children:b.title.trim()||"Tanpa judul"})]}),t.jsxs("div",{className:"hn-qa-bar-actions",children:[t.jsx("span",{role:B?"alert":"status",className:`hn-qa-bar-save${B?" is-error":""}`,children:He}),We,t.jsx(an,{label:"Menu laporan",title:"Ekspor dan tindakan lain",items:ga,children:t.jsx("div",{className:"hn-qa-export",children:GI.map(be=>t.jsx(U,{size:"sm",variant:be.format==="zip"?"secondary":"ghost",leftIcon:"download",as:"a",href:d.qaExportUrl(a,e.id,be.format),children:be.label},be.format))})})]})]}),t.jsxs("section",{className:"hn-qa-info","aria-labelledby":`${e.id}-info`,children:[t.jsxs("div",{className:"hn-qa-info-head",children:[t.jsx("h3",{id:`${e.id}-info`,className:"hn-qa-info-title",children:"Info laporan"}),X&&t.jsx(la,{tone:"warn",size:"sm",children:"Belum disimpan"}),t.jsx(U,{variant:"secondary",size:"sm",leftIcon:"pencil",onClick:()=>S(!0),children:h?"Lihat info":"Ubah info"})]}),t.jsxs("dl",{className:"hn-qa-facts",children:[t.jsxs("div",{children:[t.jsx("dt",{children:"Versi aplikasi"}),t.jsx("dd",{children:b.buildVersion.trim()||"Belum diisi"})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Penguji"}),t.jsx("dd",{children:b.tester.trim()||"Belum diisi"})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Keputusan"}),t.jsx("dd",{children:ea})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Perangkat dan lingkungan"}),t.jsx("dd",{children:Ke.length?Ke.join(" · "):"Belum diisi"})]})]})]}),t.jsx(St,{value:g,onChange:f,tabs:[{value:"cases",label:"Langkah uji",count:e.cases.length},{value:"findings",label:"Temuan",count:e.findings.length},{value:"attachments",label:"Lampiran",count:Z}]}),g==="cases"&&t.jsx(XI,{...wa}),g==="findings"&&t.jsx(nN,{...wa}),g==="attachments"&&t.jsx(_u,{...wa,ownerType:"report",ownerId:e.id}),t.jsx(ca,{open:T,title:"Info laporan",eyebrow:e.code,width:640,onClose:()=>S(!1),footer:t.jsx(U,{onClick:()=>S(!1),children:"Selesai"}),children:t.jsxs("div",{className:"hn-qa-form",children:[t.jsx(de,{label:"Judul laporan (wajib)",error:L||void 0,children:t.jsx(Oe,{placeholder:"Contoh: Pengujian fitur login versi 1.0",value:b.title,disabled:h,onChange:J("title")})}),t.jsxs("div",{className:"hn-qa-grid",children:[t.jsx(de,{label:"Versi aplikasi",children:t.jsx(Oe,{placeholder:"Contoh: 1.0.0",value:b.buildVersion,disabled:h,onChange:J("buildVersion")})}),t.jsx(de,{label:"Nama penguji",children:t.jsx(Oe,{placeholder:"Contoh: Rina Pratama",value:b.tester,disabled:h,onChange:J("tester")})})]}),t.jsx(de,{label:"Apa yang diuji?",hint:"Sebutkan fitur yang diperiksa dan batasan pengujiannya.",children:t.jsx(La,{rows:3,placeholder:"Contoh: Login dengan email dan kata sandi. Login Google belum diuji.",value:b.scope,disabled:h,onChange:J("scope")})}),t.jsxs("fieldset",{className:"hn-qa-fieldset",children:[t.jsx("legend",{className:"hn-qa-legend",children:"Perangkat dan lingkungan pengujian"}),t.jsx("div",{className:"hn-qa-grid",children:mc.map(({key:be,label:Ze,example:z})=>t.jsx(de,{label:Ze,children:t.jsx(Oe,{value:b[be],placeholder:z,disabled:h,onChange:J(be)})},be))}),t.jsxs("details",{className:"hn-qa-more",children:[t.jsx("summary",{children:"Informasi lingkungan tambahan (opsional)"}),t.jsx(de,{label:"Lingkungan tambahan",hint:"Satu per baris, misalnya jaringan=Wi-Fi",children:t.jsx(La,{rows:3,placeholder:"mis. jaringan=Wi-Fi",value:b.env,disabled:h,onChange:J("env")})})]})]}),t.jsx(de,{label:"Ringkasan hasil",hint:"Boleh diisi setelah langkah uji dan temuan selesai dicatat.",children:t.jsx(La,{rows:3,placeholder:"Contoh: Login berhasil di Chrome, tetapi tombol Masuk tidak bereaksi di Safari.",value:b.summary,disabled:h,onChange:J("summary")})}),t.jsx(de,{label:"Keputusan",hint:"Wajib saat mengajukan laporan. Pilih berdasarkan hasil pengujian.",children:t.jsx(Be,{value:b.verdict,disabled:h,onChange:J("verdict"),options:[{value:"",label:"Pilih setelah pengujian selesai"},...Co.map(be=>({value:be,label:or[be]}))]})})]})}),t.jsxs(ca,{open:E,title:q==="closed"?"Tinjau dan selesaikan":"Tinjau dan ajukan",eyebrow:e.code,width:560,dismissible:!R,onClose:()=>w(!1),footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",disabled:R,onClick:()=>w(!1),children:"Batal"}),t.jsx(U,{disabled:!qa||R,loading:R,onClick:()=>void re(),children:ya})]}),children:[t.jsxs("ul",{className:"hn-qa-check","aria-label":"Syarat pengajuan",children:[t.jsxs("li",{children:[t.jsx(md,{ok:ie}),t.jsxs("div",{className:"hn-qa-check-body",children:[t.jsx("div",{className:"hn-qa-check-name",children:"Judul laporan"}),t.jsx("div",{className:"hn-qa-check-note",children:ie?"Sudah diisi.":"Belum diisi. Isi judul di Info laporan, lalu tinjau lagi."})]})]}),t.jsxs("li",{children:[t.jsx(md,{ok:b.verdict!==""}),t.jsxs("div",{className:"hn-qa-check-body",children:[t.jsx("div",{className:"hn-qa-check-name",children:"Keputusan hasil pengujian"}),t.jsx("div",{className:"hn-qa-check-note",children:b.verdict!==""?`Dipilih: ${ea}.`:"Pilih satu keputusan. Wajib sebelum laporan diajukan."}),t.jsx(_r,{"aria-label":"Keputusan hasil pengujian",value:b.verdict,onChange:be=>v(Ze=>({...Ze,verdict:be})),children:Co.map(be=>t.jsx(Li,{value:be,label:or[be]},be))})]})]}),t.jsxs("li",{children:[t.jsx(md,{ok:te===0,warn:!0}),t.jsxs("div",{className:"hn-qa-check-body",children:[t.jsx("div",{className:"hn-qa-check-name",children:"Temuan belum ditangani"}),t.jsx("div",{className:"hn-qa-check-note",children:te===0?"Tidak ada temuan terbuka.":`${te} temuan belum ditangani. Ini tidak menghalangi pengajuan.`})]})]})]}),H&&t.jsx("p",{role:"alert",className:"hn-qa-error",children:H})]}),t.jsx(ca,{open:M,title:`Pratinjau ${e.code}`,width:880,onClose:()=>N(!1),footer:t.jsx(U,{variant:"ghost",onClick:()=>N(!1),children:"Tutup"}),children:t.jsx(sN,{detail:e,projectId:a})}),m]})}function md({ok:e,warn:a=!1}){const n=e?"is-ok":a?"is-warn":"is-miss";return t.jsx("span",{className:`hn-qa-check-icon ${n}`,children:t.jsx(Re,{name:e?"circle-check":a?"triangle-alert":"circle-x",size:16})})}function oN({projects:e,reports:a,onOpen:n}){const i=_t();if(a.length===0)return t.jsx(pe,{kind:"empty",title:"Belum ada laporan QA",hint:"Buat laporan baru, atau impor dari template Excel."});const r=Date.now();return t.jsx(bn,{label:"Daftar laporan QA",children:a.map((s,o)=>{var l,d;return t.jsxs(c.Fragment,{children:[e&&s.projectId!==((l=a[o-1])==null?void 0:l.projectId)&&t.jsx("h4",{className:"hn-qa-group-title",children:((d=e.find(u=>u.id===s.projectId))==null?void 0:d.name)??"Project lain"}),t.jsx(fn,{onClick:()=>n(s),actions:t.jsx(U,{as:"a",size:"sm",variant:"ghost",leftIcon:"download",href:i.qaExportUrl(s.projectId,s.id),"aria-label":`Unduh ZIP ${s.code}`,children:"Unduh ZIP"}),children:t.jsxs("span",{className:"hn-qa-row-body",children:[t.jsxs("span",{className:"hn-qa-row-head",children:[t.jsx("span",{className:"hn-qa-code",children:s.code}),t.jsx(la,{tone:Ef[s.status],variant:"dot",size:"sm",children:qd[s.status]})]}),t.jsx("span",{className:"hn-qa-row-title",children:s.title}),t.jsxs("span",{className:"hn-qa-row-line",children:[t.jsx("span",{children:[s.buildVersion&&`Versi ${s.buildVersion}`,s.tester].filter(Boolean).join(" · ")||"Belum ada versi atau penguji"}),t.jsxs("span",{className:"hn-qa-row-stat",children:[s.stats.cases.pass,"/",s.stats.cases.total," lulus (",FI(s.stats.passRate),") · ",s.stats.findings.total," temuan (",s.stats.findings.open," belum ditangani)"]}),s.verdict&&t.jsxs("span",{children:["Keputusan: ",or[s.verdict]]}),t.jsxs("span",{children:["Diubah ",yt(s.updatedAt,r)||"—"]})]})]})})]},s.id)})})}const io=10;function lN({projects:e,projectId:a,onSelectProject:n,onToast:i,onOpenSession:r}){var Ee;const s=_t(),o=!a&&e.length>0,[l,d]=c.useState(((Ee=e[0])==null?void 0:Ee.id)??""),u=a??l,[m,h]=c.useState(1),[p,g]=c.useState(!1),[f,b]=c.useState(null),[v,x]=c.useState(!1),[y,T]=c.useState(null),[S,E]=c.useState(null),[w,M]=c.useState(!1),[N,R]=c.useState(""),[I,L]=c.useState(!1),[A,B]=c.useState(),[G,H]=c.useState([]),[Y,X]=c.useState(!1),[q,ie]=c.useState(""),[te,Z]=c.useState([]),xe=c.useCallback(async()=>{if(!(!a&&!o)){x(!1);try{b(a?(await s.qaReports(a)).items:(await Promise.all(e.map(J=>s.qaReports(J.id)))).flatMap(J=>J.items))}catch{x(!0)}}},[s,a,o,e]);if(c.useEffect(()=>{T(null),E(null),b(null),Z([]),L(!1),B(void 0),H([]),h(1),xe()},[xe]),!a&&!o)return t.jsx(pe,{kind:"empty",title:"Belum ada project",hint:"Buat atau muat project di halaman Projects, lalu buka QA lagi."});const _e=async J=>{try{T(await s.qaReport(J.projectId,J.id))}catch(ea){i==null||i(wt(ea))}},ae=async()=>{if(!p){g(!0);try{const J=await s.syncNow();if(!J.ok){i==null||i(J.reason==="not-configured"?"Sinkronisasi belum dikonfigurasi. Hubungkan server dan device token di Settings.":J.reason??"Sinkronisasi gagal");return}await xe(),y&&T(await s.qaReport(y.projectId,y.id)),i==null||i("QA disinkronkan. Lampiran dipindahkan bertahap pada siklus sinkronisasi.")}catch(J){i==null||i(wt(J))}finally{g(!1)}}},ee=async()=>{const J=N.trim();if(J)try{const ea=await s.createQaReport(u,{title:J});M(!1),R(""),E(ea.id),T(ea),xe()}catch(ea){i==null||i(wt(ea))}},le=async()=>{if(!(!A||Y)){X(!0),ie(""),Z([]);try{const J=await s.importQaReport(u,A,G),ea=J.attachments.rejected.length?`, ${J.attachments.rejected.length} lampiran ditolak`:"";i==null||i(`${J.created?"Diimpor":"Diperbarui"}: ${J.cases} test case, ${J.findings} temuan, ${J.attachments.saved} lampiran${ea}`),Z(J.attachments.rejected.map(Ke=>`${Ke.filename}: ${Ke.reason==="missing"?"Berkas belum disertakan. Lampirkan dari laporan yang diimpor.":Ke.reason==="type"?"Tipe berkas tidak didukung.":Ke.reason}`)),L(!1),B(void 0),H([]),await xe(),await _e({projectId:u,id:J.reportId})}catch(J){ie(wt(J))}finally{X(!1)}}},re=Cs((f==null?void 0:f.length)??0,m,io),Ce=o&&t.jsx(de,{label:"Project",children:t.jsx(Be,{"aria-label":"Project tujuan",value:l,onChange:J=>d(J.target.value),options:e.map(J=>({value:J.id,label:J.name}))})});return t.jsxs("div",{className:"hn-qa-stack",children:[t.jsxs("div",{className:"hn-qa-toolbar",children:[t.jsx(Be,{"aria-label":"Project",className:"hn-qa-toolbar-project",value:a??"",onChange:J=>n(J.target.value),options:[{value:"",label:"Semua project"},...e.map(J=>({value:J.id,label:J.name}))]}),t.jsx(U,{variant:"secondary",disabled:p,loading:p,onClick:()=>void ae(),children:"Sinkronkan QA"}),!y&&t.jsxs(t.Fragment,{children:[t.jsx(U,{leftIcon:"plus",onClick:()=>M(!0),children:"Laporan baru"}),t.jsx(U,{variant:"secondary",leftIcon:"upload",onClick:()=>{ie(""),L(!0)},children:"Impor Excel, ZIP, atau .md"}),t.jsx(U,{variant:"ghost",leftIcon:"download",as:"a",href:s.qaTemplateUrl(),download:"qa-template.xlsx",children:"Unduh template Excel"})]})]}),!y&&t.jsx("p",{className:"hn-qa-intro",children:"Catat hasil pengujian aplikasi dalam satu laporan. Mulai dengan laporan baru, atau unduh template Excel lalu isi dan impor kembali bersama lampirannya."}),te.length>0&&t.jsx("div",{role:"status",children:t.jsx(gt,{tone:"warn",title:"Laporan berhasil diimpor. Beberapa lampiran perlu ditambahkan.",action:t.jsx(U,{size:"sm",variant:"ghost",onClick:()=>Z([]),children:"Tutup"}),children:t.jsx("ul",{className:"hn-qa-note-list",children:te.map((J,ea)=>t.jsx("li",{children:J},ea))})})}),y?t.jsx(rN,{detail:y,projectId:y.projectId,onChange:T,onToast:i,onOpenSession:r,startOpen:y.id===S,onBack:()=>{T(null),E(null),xe()},onDeleted:()=>{T(null),xe()}},y.id):v?t.jsx(pe,{kind:"error",title:"Gagal memuat laporan QA",action:()=>void xe(),actionLabel:"Coba lagi"}):f===null?t.jsx(Hk,{rows:3,label:"Memuat laporan QA…",rowHeight:64}):t.jsxs(t.Fragment,{children:[t.jsx(oN,{projects:o?e:void 0,reports:f.slice((re.page-1)*io,re.page*io),onOpen:J=>void _e(J)}),f.length>io&&t.jsx(Ps,{page:re.page,pageCount:re.pageCount,total:f.length,from:re.from,to:re.to,onPage:h,unit:"laporan"})]}),t.jsx(ca,{open:I,title:"Impor laporan QA",width:620,onClose:()=>{Y||L(!1)},footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",disabled:Y,onClick:()=>L(!1),children:"Batal"}),t.jsx(U,{disabled:!A||Y,loading:Y,onClick:()=>void le(),children:"Impor laporan"})]}),children:t.jsxs("div",{className:"hn-qa-modal-stack",children:[Ce,t.jsx("p",{className:"hn-qa-note",children:"Isi template Excel, lalu pilih berkasnya di bawah. Laporan hasil ekspor juga dapat diimpor kembali."}),t.jsx(de,{label:"Berkas laporan (wajib)",hint:"Excel (.xlsx), ZIP dengan Excel dan lampiran, atau Markdown (.md).",children:t.jsx("input",{type:"file",className:"hn-qa-file","aria-label":"Berkas laporan (wajib)",accept:".xlsx,.zip,.md",disabled:Y,onChange:J=>{var ea;return B((ea=J.target.files)==null?void 0:ea[0])}})}),t.jsx(de,{label:"Berkas lampiran (opsional)",hint:"Pilih semua screenshot atau log yang disebut pada sheet Lampiran. Nama berkas harus sama dengan kolom Berkas; kolom Pemilik diisi Laporan, TC-01, atau F-01.",children:t.jsx("input",{type:"file",multiple:!0,className:"hn-qa-file","aria-label":"Berkas lampiran (opsional)",accept:".png,.jpg,.jpeg,.webp,.pdf,.md,.txt,.log,.json,.csv",disabled:Y,onChange:J=>H(Array.from(J.target.files??[]))})}),t.jsx("p",{className:"hn-qa-note",children:"Maksimal 10 MB per lampiran, 30 lampiran dan 100 MB per laporan. Untuk ZIP, sertakan report.xlsx dan folder attachments/. Gambar yang ditempel di sel Excel perlu disertakan sebagai berkas terpisah."}),q&&t.jsx("p",{role:"alert",className:"hn-qa-error",children:q})]})}),t.jsxs(ca,{open:w,title:"Laporan QA baru",onClose:()=>M(!1),footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",onClick:()=>M(!1),children:"Batal"}),t.jsx(U,{onClick:()=>void ee(),disabled:!N.trim(),children:"Buat"})]}),children:[Ce,t.jsx(de,{label:"Judul",hint:"Contoh: Pengujian fitur login versi 1.0",children:t.jsx(Oe,{value:N,autoFocus:!0,placeholder:"mis. Regresi rilis 1.1",onChange:J=>R(J.target.value),onKeyDown:J=>{J.key==="Enter"&&ee()}})})]})]})}const dN=[{value:"all",label:Od.all},{value:"worktree",label:Od.worktree}],cN=e=>!!e.baseSha;function uN(e,a){return a==="all"?e:e.filter(cN)}const mN=[{value:"all",label:Hd.all},{value:"review",label:Hd.review}],hN=new Set;function pN(e,a=[]){const n=new Set;for(const i of e)i.specId&&Cr(i,hN)==="waiting"&&n.add(i.specId);for(const i of a)i.stage==="done"&&i.baseSha&&!i.reviewedAt&&n.add(i.id);return n}function gN(e,a,n){return a==="all"?e:e.filter(i=>n.has(i.id))}function kN({projectId:e,ownBranch:a,eyebrow:n,onClose:i,onIntegrate:r}){const[s,o]=c.useState({local:[],origin:[]}),[l,d]=c.useState(""),u=a;c.useEffect(()=>{let p=!0;return se.listBranches(e).then(g=>{p&&o({local:g.branches.filter(f=>f!==u),origin:g.remotes.filter(f=>f!==u)})}).catch(()=>{p&&o({local:[],origin:[]})}),()=>{p=!1}},[e,u]);const m=[{value:"",label:"Pilih target…"},...s.local.map(p=>({value:`local:${p}`,label:`${p} (lokal)`})),...s.origin.map(p=>({value:`origin:${p}`,label:`origin/${p}`}))],h=p=>{l&&r(p,l)};return t.jsxs(ca,{open:!0,title:"Rebase / Merge",eyebrow:`${n} · ${u}`,icon:"git-merge",onClose:i,children:[t.jsxs("div",{style:{fontSize:13,color:"var(--text-muted)",marginBottom:12,lineHeight:1.5},children:["Rebase menata ulang branch di atas target (force-push balik ke branch itu). Merge menggabungkan branch ke target. Bila ada konflik, sesi agen membereskannya di Terminal — agen, model & effort-nya diatur di ",t.jsx("b",{children:"Settings → Model sesi → Konflik rebase & merge"})," ","— selama kartu itu dinonaktifkan, ia mengikuti default global."]}),t.jsxs("div",{style:{marginBottom:16},children:[t.jsx("div",{className:"hn-eyebrow",style:{marginBottom:4},children:"Target"}),t.jsx(Be,{size:"sm","aria-label":"Target",value:l,disabled:m.length===1,onChange:p=>d(p.target.value),options:m})]}),t.jsxs("div",{style:{display:"flex",gap:8,justifyContent:"flex-end"},children:[t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"git-branch",disabled:!l,onClick:()=>h("rebase"),children:"Rebase"}),t.jsx(U,{size:"sm",variant:"primary",leftIcon:"git-merge",disabled:!l,onClick:()=>h("merge"),children:"Merge"})]})]})}function bN(e){return new Date(e.localUpdatedAt)>=new Date(e.serverUpdatedAt)?"local":"server"}function so(e){if(e===void 0)return"(kosong)";const a=typeof e=="string"?`"${e}"`:JSON.stringify(e)??String(e);return a.length>80?`${a.slice(0,77)}…`:a}function mp(e){const a=e.localData??{},n=e.serverData??{};return[...new Set([...Object.keys(a),...Object.keys(n)])].filter(r=>JSON.stringify(a[r])!==JSON.stringify(n[r]))}const fN={project:"Project",spec:"Item backlog",vps:"VPS",sessionResult:"Hasil sesi",ticket:"Tiket",ticketAttachment:"Lampiran tiket",customAgent:"Agen kustom",githubIssue:"Issue GitHub",member:"Anggota tim",task:"Tugas",qaReport:"Laporan QA",qaCase:"Kasus QA",qaFinding:"Temuan QA",qaAttachment:"Lampiran QA",cronReport:"Laporan cron"},hd=e=>fN[e]??"Data",yN={"still-conflict":"Server pusat bergeser lagi sebelum keputusan ini masuk. Coba lagi — datanya sudah disegarkan.","not-found":"Konflik ini sudah tidak ada di server pusat (mungkin sudah diselesaikan dari perangkat lain)."},vN="Server pusat menolak keputusan ini. Muat ulang daftar, lalu coba lagi.";function xN({open:e,onClose:a,onResolved:n}){const[i,r]=c.useState([]),[s,o]=c.useState(!1),[l,d]=c.useState(null),[u,m]=c.useState(null),[h,p]=c.useState(null),{confirm:g,dialog:f}=st(),b=Date.now(),v=c.useCallback(async()=>{o(!0),d(null);try{r((await se.listConflicts()).conflicts)}catch(S){r([]),d(va("memuat daftar konflik",S))}finally{o(!1)}},[]);c.useEffect(()=>{e&&v()},[e,v]);async function x(S,E){const w=`${S.entity}:${S.recordId}`;m(w),p(null);try{const M=await se.resolveConflict(S.entity,S.recordId,E);M.ok||p(yN[M.reason??""]??vN),await v(),M.ok&&n()}catch(M){p(va("menghubungi server",M))}finally{m(null)}}function y(S,E){const w=E==="local"?"Lokal":"Server",M=E==="local"?"Server":"Lokal",N=(E==="local"?S.localData:S.serverData)??{},R=(E==="local"?S.serverData:S.localData)??{},I=mp(S),L=I.length===0?["Tidak ada field yang berbeda antara kedua sisi."]:I.map(A=>`${A}: ${so(R[A])} → ${so(N[A])}`);g({title:`Pakai data ${w}?`,message:`Sisi ${M} di server pusat akan diganti dengan data ${w} untuk ${hd(S.entity).toLowerCase()} ${S.recordId}.`,impact:L,eyebrow:"konflik sinkron",confirmLabel:`Pakai data ${w}`,tone:"danger",run:()=>x(S,E)}).catch(A=>p(va("menyelesaikan konflik",A)))}const T=!s&&!l&&i.length===0;return t.jsxs(t.Fragment,{children:[t.jsxs(ca,{open:e,title:"Konflik sinkron",eyebrow:"sinkronisasi",icon:"git-merge",width:720,onClose:()=>{u===null&&a()},children:[h&&t.jsx("div",{"data-testid":"resolve-error",role:"alert",className:"hn-reconcile-error",children:h}),s&&i.length===0&&t.jsx(pe,{kind:"loading",compact:!0,title:"Memuat konflik…"}),l&&t.jsx(pe,{kind:"error",compact:!0,title:"Daftar konflik gagal dimuat",hint:l,action:()=>{v()},actionLabel:"Coba lagi"}),T&&t.jsx(pe,{kind:"empty",compact:!0,icon:"git-merge",title:"Tidak ada konflik",hint:"Data lokal dan server sudah sinkron."}),i.map(S=>{const E=bN(S),w=`${S.entity}:${S.recordId}`,M=mp(S),N=S.localData??{},R=S.serverData??{};return t.jsxs("section",{className:"hn-reconcile-card","aria-label":`${hd(S.entity)} ${S.recordId}`,children:[t.jsxs("div",{className:"hn-reconcile-head",children:[t.jsx("strong",{children:hd(S.entity)}),t.jsx("span",{className:"hn-reconcile-id",children:S.recordId}),t.jsxs("span",{"data-testid":"default-side",className:"hn-reconcile-hint",children:["disarankan: ",E==="local"?"Lokal":"Server"," (diubah terakhir)"]})]}),t.jsxs("div",{className:"hn-reconcile-meta",children:[t.jsxs("span",{children:["Lokal v",S.localVersion," · ",yt(S.localUpdatedAt,b)||"—"]}),t.jsxs("span",{children:["Server v",S.serverVersion," · ",yt(S.serverUpdatedAt,b)||"—"]})]}),M.length===0?t.jsx("p",{className:"hn-reconcile-same",children:"Kedua sisi berisi data yang sama."}):t.jsxs("dl",{className:"hn-reconcile-fields","aria-label":"Field yang berbeda",children:[t.jsxs("div",{className:"hn-reconcile-field hn-reconcile-field-head","aria-hidden":"true",children:[t.jsx("dt",{children:"Field"}),t.jsx("dd",{children:"Lokal"}),t.jsx("dd",{children:"Server"})]}),M.map(I=>t.jsxs("div",{className:"hn-reconcile-field",children:[t.jsx("dt",{children:I}),t.jsxs("dd",{children:[t.jsx("span",{className:"hn-reconcile-side",children:"Lokal"}),t.jsx("code",{children:so(N[I])})]}),t.jsxs("dd",{children:[t.jsx("span",{className:"hn-reconcile-side",children:"Server"}),t.jsx("code",{children:so(R[I])})]})]},I))]}),t.jsxs("div",{className:"hn-reconcile-actions",children:[t.jsx(U,{size:"sm",variant:E==="local"?"primary":"secondary",disabled:u!==null,loading:u===w,onClick:()=>y(S,"local"),children:"Pakai Lokal"}),t.jsx(U,{size:"sm",variant:E==="server"?"primary":"secondary",disabled:u!==null,onClick:()=>y(S,"server"),children:"Pakai Server"})]})]},w)})]}),f]})}let pd=null;function jN(){const[e,a]=c.useState(!1);return c.useEffect(()=>{pd||(pd=(async()=>{var i;try{return((i=(await se.getConfig()).sync)==null?void 0:i.running)??!1}catch{return!1}})());let n=!0;return pd.then(i=>{n&&a(i)}),()=>{n=!1}},[]),e}function wN({onDone:e,onToast:a}){const n=jN(),[i,r]=c.useState(""),[s,o]=c.useState(!1),[l,d]=c.useState(0),u=c.useCallback(()=>{se.getSyncPending().then(h=>d(h.total)).catch(()=>d(0))},[]);if(c.useEffect(()=>{n&&u()},[n,u]),!n)return null;async function m(h){r(h?"full":"once");try{const p=h?await se.syncNow({full:!0}):await se.syncNow();p.ok?a(`Sinkron: ↓${p.pulled??0} ↑${p.pushed??0}`+(p.deleted?` ⨯${p.deleted}`:"")+(p.conflicts?` · ${p.conflicts} konflik`:""),p.conflicts?"warn":"ok",p.conflicts?"triangle-alert":"check"):a("Instance ini hub — tak ada sync manual","info","info"),p.ok&&p.conflicts&&o(!0),e(),u()}catch{a("Gagal sync","err","x-circle")}finally{r("")}}return t.jsxs(t.Fragment,{children:[t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"rotate-ccw",onClick:()=>m(!1),disabled:i!=="",children:i==="once"?"Menyinkron…":"Sync"}),t.jsx(U,{size:"sm",variant:"ghost",leftIcon:"history",onClick:()=>m(!0),disabled:i!=="",title:"Tarik ulang seluruh feed dari awal — untuk data lama yang tak ikut tersinkron",children:i==="full"?"Menarik ulang…":"Tarik ulang"}),l>0&&t.jsxs("span",{className:"hn-muted",style:{fontSize:12},title:"Penghapusan sudah tercatat di mesin ini dan akan menyeberang ke hub pada sync berikutnya",children:[l," hapus menunggu"]}),t.jsx(xN,{open:s,onClose:()=>o(!1),onResolved:e})]})}const hp={qa:{label:Vi.qa,icon:"bug",tone:"err",color:"var(--clay-500)"},audit:{label:Vi.audit,icon:"search",tone:"info",color:"var(--wind-600)"},brief:{label:Vi.brief,icon:"lightbulb",tone:"brass",color:"var(--brass-500)"},goal:{label:Vi.goal,icon:"target",tone:"brass",color:"var(--brass-700)"},help:{label:Vi.help,icon:"life-buoy",tone:"info",color:"var(--wind-500)"},no_effort:{label:Vi.no_effort,icon:"zap",tone:"brass",color:"var(--brass-400)"}},ti=e=>hp[e]??hp.brief,SN=jr.options.map(e=>({value:e,label:ti(e).label})),_N=[["context","Konteks","mis. operator harus membuka tiga layar untuk tahu sesi mana yang menunggu"],["outcome","Outcome","mis. satu badge di Overview menunjukkan jumlah sesi yang menunggu"],["constraints","Batasan","mis. reuse queue yang ada"]],AN=[["goal","Goal","mis. p95 GET /api/specs di bawah 200 ms"],["done","Selesai bila","mis. output benchmark menunjukkan < 200 ms"],["constraints","Batasan","mis. tanpa cache eksternal"]],TN=[["severity","Severity",""],["steps","Langkah reproduksi",`1. Buka …
|
|
1009
1009
|
2. Lakukan …
|
|
1010
|
-
3. Amati …`],["expected","Diharapkan","mis. total funnel sama dengan jumlah baris laporan harian"],["actual","Aktual","mis. total funnel dua kali lipat untuk sesi yang melewati tengah malam"],["env","Environment","prod · web · v0.9.2"],["constraints","Batasan","mis. jangan ubah kontrak API"]],hc={brief:_N,qa:TN,goal:AN},pc=[{value:"tinggi",label:bs.tinggi},{value:"sedang",label:bs.sedang},{value:"rendah",label:bs.rendah}],Cf=[{value:"critical",label:Bl.critical},{value:"major",label:Bl.major},{value:"minor",label:Bl.minor}];function EN({spec:e,onClose:a,onSubmit:n}){var E;const i=e.stage!=="brainstorming"||e.baseSha!=null,r=SN.filter(w=>w.value!==e.source),[s,o]=c.useState(((E=r[0])==null?void 0:E.value)??""),l=i&&kr(s)!==kr(e.source),d=i&&!l,u=c.useMemo(()=>Fy(s,e.payload),[s,e.payload]),[m,h]=c.useState(()=>u.payload),[p,g]=c.useState(null),[f,b]=c.useState(!1);c.useEffect(()=>{h(u.payload),g(null)},[s]);const v=w=>M=>h(N=>({...N,[w]:M.target.value})),x=Ii(s),y=hc[x]??[],T=w=>{var M;return((M=(hc[vc(e.payload)]??[]).find(([N])=>N===w))==null?void 0:M[1])??w};async function S(w){if(!f){b(!0);try{const M=await n(s,d?void 0:{...m},w);M&&M.pending?g(M):a()}finally{b(!1)}}}return p?t.jsxs(ca,{open:!0,title:"Item ini akan dikembalikan ke Brainstorming",icon:"rotate-ccw",eyebrow:`${e.id} · ${ti(e.source).label} → ${ti(s).label}`,onClose:f?void 0:a,children:[t.jsxs("div",{className:"hn-dia-lead hn-dia-lead-sm",children:["Alur kerja ",ti(s).label," berbeda dari yang sudah dikerjakan, jadi item ini mulai lagi dari awal. Kode yang sudah ter-commit di branch lain tak disentuh."]}),t.jsxs("ul",{"data-testid":"source-reset-impact",className:"hn-dia-impact",children:[p.wouldDelete.map(w=>t.jsx("li",{children:w},w)),p.worktree&&t.jsx("li",{children:p.worktree}),p.branch&&t.jsx("li",{children:p.branch}),!p.wouldDelete.length&&!p.worktree&&!p.branch&&t.jsx("li",{children:"tak ada berkas yang perlu dibuang — hanya tahapnya yang mundur"})]}),t.jsxs("div",{className:"hn-dia-foot",children:[t.jsx(U,{size:"sm",variant:"secondary",disabled:f,onClick:a,children:"Batal"}),t.jsx(U,{size:"sm",variant:"danger",leftIcon:"rotate-ccw",loading:f,onClick:()=>S(!0),children:"Reset & ubah type"})]})]}):t.jsxs(ca,{open:!0,title:"Ubah type backlog item",icon:"shuffle",eyebrow:`${e.id} · ${ti(e.source).label}`,onClose:a,children:[t.jsx(de,{label:"Type tujuan",children:t.jsx(Be,{"aria-label":"Type tujuan",value:s,onChange:w=>o(w.target.value),options:r,className:"hn-dia-full"})}),!r.length&&t.jsx("div",{className:"hn-dia-note",children:"Tak ada type lain yang bisa dituju. Dialog tetap terbuka dan mengatakannya — menolak dengan diam adalah bug yang melahirkan ADR-0149."}),d?t.jsxs("div",{className:"hn-dia-note",children:["Item ini sudah pernah dikerjakan sesi, dan type tujuannya memakai alur kerja yang sama — yang berpindah hanya ",t.jsx("strong",{children:"labelnya"}),". Isi, worktree, dan berkas fase tak disentuh."]}):t.jsxs(t.Fragment,{children:[l&&t.jsxs("div",{"data-testid":"source-reset-warning",className:"hn-dia-box",children:[t.jsx(la,{tone:"warn",size:"sm",children:"alur kerja berbeda"})," ","Item ini akan kembali ke tahap ",t.jsx("strong",{children:"Brainstorming"}),"; dokumen fase, worktree, dan branch sesi lamanya dihapus. Daftar persisnya ditampilkan sebelum kamu menyetujui."]}),u.dropped.length>0&&t.jsxs("div",{"data-testid":"source-dropped",className:"hn-dia-box hn-dia-box-muted",children:[t.jsx(la,{tone:"warn",size:"sm",children:"tak punya padanan"})," ",u.dropped.map(T).join(", ")," tidak ada di bentuk"," ",ti(s).label,". Teks lamanya tetap tersimpan di"," ",t.jsx("strong",{children:"jejak konversi"})," item ini."]}),x!=="qa"&&t.jsx(de,{label:"Prioritas",children:t.jsx(Be,{"aria-label":"Prioritas",value:m.priority??"sedang",onChange:v("priority"),options:pc,className:"hn-dia-full"})}),y.map(([w,M,N])=>t.jsx(de,{label:M,children:w==="severity"?t.jsx(Be,{"aria-label":M,value:m[w]??"minor",onChange:v(w),options:Cf,className:"hn-dia-full"}):t.jsx(La,{"aria-label":M,value:m[w]??"",onChange:v(w),rows:2,placeholder:N})},w))]}),t.jsxs("div",{className:"hn-dia-foot hn-dia-foot-tight",children:[t.jsx(U,{size:"sm",variant:"secondary",onClick:a,children:"Batal"}),t.jsx(U,{size:"sm",variant:"primary",leftIcon:"shuffle",loading:f,disabled:!r.length,onClick:()=>S(),children:"Ubah type"})]})]})}const pp=280;function Pf({spec:e,onClose:a,onSubmit:n}){const[i,r]=c.useState(""),[s,o]=c.useState(null),[l,d]=c.useState(!1),u=c.useRef(!1);async function m(){if(!u.current){u.current=!0,d(!0);try{const h=await n(e,i.trim(),s!==null);if(h&&"needConfirm"in h){o(h.sessionId??"");return}h&&a()}finally{u.current=!1,d(!1)}}}return t.jsxs(ca,{open:!0,title:"Tandai selesai",icon:"circle-check",eyebrow:e.id+" · "+e.projectId,onClose:l?void 0:a,children:[t.jsx("div",{style:{fontSize:13,color:"var(--text-muted)",lineHeight:1.55,marginBottom:14},children:"Item keluar dari daftar siap-kerja dan berstatus selesai — sama seperti item yang selesai lewat sesi. Kode, commit, dan dokumen tidak disentuh, dan status ini masih bisa dikembalikan lewat “Ubah status”."}),s!==null&&t.jsxs("div",{"data-testid":"mark-done-live",style:{border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",background:"var(--bone-100)",padding:10,marginBottom:14,fontSize:12.5,color:"var(--text-strong)",lineHeight:1.5},children:["Masih ada sesi yang berjalan untuk item ini",s?` (${s})`:"",". Menandainya selesai tidak menghentikan sesi itu — tutup sesinya dari Terminal bila memang sudah tak dibutuhkan."]}),t.jsx(de,{label:"Alasan singkat (opsional)",hint:`${i.trim().length}/${pp} — mis. “sudah ter-merge lewat PR #12”`,children:t.jsx(La,{"aria-label":"Alasan singkat (opsional)",rows:2,value:i,maxLength:pp,disabled:l,onChange:h=>r(h.target.value),placeholder:"sudah dikerjakan langsung di checkout"})}),t.jsxs("div",{style:{display:"flex",gap:8,justifyContent:"flex-end"},children:[t.jsx(U,{size:"sm",variant:"secondary",disabled:l,onClick:a,children:"Batal"}),t.jsx(U,{size:"sm",variant:"primary",leftIcon:"circle-check",loading:l,onClick:m,children:s!==null?"Tandai selesai — sesi tetap berjalan":"Tandai selesai"})]})]})}const pn=[{key:"brainstorming",label:"Brainstorm"},{key:"objective",label:"Objective"},{key:"spec-ready",label:"Spec"},{key:"planned",label:"Plan"},{key:"executing",label:"Execute"},{key:"done",label:"Done"}],Mf=e=>pn.findIndex(a=>a.key===e),If={brainstorming:"Brainstorm: ide digali bersama agen sebelum tujuan dikunci",objective:"Objective: tujuan terukur dikunci sebelum spec ditulis","spec-ready":"Spec: dokumen spesifikasi ditulis",planned:"Plan: rencana langkah disusun",executing:"Execute: kode dikerjakan di worktree sesi",done:"Done: item selesai"},hr=[{key:"all",label:"Semua",stages:pn.map(e=>e.key)},{key:"brainstorm",label:"Brainstorm",stages:["brainstorming","objective"]},{key:"spec",label:"Spec",stages:["spec-ready","planned"]},{key:"doing",label:"Dikerjakan",stages:["executing"]},{key:"done",label:"Selesai",stages:["done"]}],gp=(e,a)=>{var n;return a==="all"||(((n=hr.find(i=>i.key===a))==null?void 0:n.stages.includes(e))??!1)},Nf=e=>{var a;return((a=hr.find(n=>n.key!=="all"&&n.stages.includes(e)))==null?void 0:a.label)??e},Rf={brainstorming:"idle",objective:"idle","spec-ready":"queued",planned:"queued",executing:"running",done:"done"},CN=e=>e==="brainstorming"?"Mulai":"Lanjutkan",kp={tinggi:{tone:"brass",label:bs.tinggi,level:"high"},sedang:{tone:"neutral",label:bs.sedang,level:"mid"},rendah:{tone:"neutral",label:bs.rendah,level:"low"}},Ko=e=>kp[e]??kp.sedang,bp=[{value:"all",label:"Semua sumber"},{value:"brief",label:"Dari brief"},{value:"qa",label:"Dari QA"},{value:"audit",label:"Audit"},{value:"goal",label:"Goal"},{value:"help",label:"Help Center"},{value:"no_effort",label:"Tanpa effort"}],PN=[{value:"all",label:"Semua prioritas"},{value:"tinggi",label:"Tinggi"},{value:"sedang",label:"Sedang"},{value:"rendah",label:"Rendah"}],fp={audit:"Audit: hasil pemeriksaan project. Dari sini bisa dinaikkan jadi Finding QA, feature brief, atau PRD.",goal:"Goal: item dengan tujuan terukur. Dikerjakan dua fase (Goal lalu Verifikasi) tanpa tahap perencanaan.",no_effort:"Tanpa effort: tugas remeh yang dikerjakan satu fase, tanpa perencanaan maupun verifikasi."},Lf=e=>e==="missing"?"tak ditemukan":e==="unmerged"?"belum ter-merge":"belum selesai";function Au({spec:e}){const a=e.blockedBy??[];return a.length?t.jsx(la,{tone:"warn",size:"sm",icon:"lock",title:a.map(n=>`${n.id} — ${Lf(n.reason)}`).join(" · "),children:"Terblokir"}):null}function Tu({priority:e,stage:a}){const n=Ko(e),i=a?Rf[a]??"idle":void 0,r=a?Nf(a):null;return t.jsx("span",{className:`hn-bl-prio hn-bl-prio-${n.level}`,"data-status":i,title:r?`Prioritas ${n.label} · Status ${r}`:`Prioritas ${n.label}`,children:t.jsxs("span",{className:"hn-sr-only",children:["Prioritas ",n.label,r?`, status ${r}`:""]})})}function $f({source:e}){const a=ti(e);return t.jsxs("span",{className:"hn-bl-source",children:[t.jsx(Re,{name:a.icon,size:12,color:a.color}),a.label]})}function Bf({stage:e}){return t.jsx(bt,{status:Rf[e]??"idle",size:"sm",variant:"dot",className:"hn-bl-stage-pill",title:If[e],children:Nf(e)})}function MN({stage:e}){var i;const a=Mf(e),n=((i=pn[a])==null?void 0:i.label)??e;return t.jsx("div",{role:"progressbar","aria-label":`Status ${n}`,"aria-valuemin":0,"aria-valuemax":pn.length-1,"aria-valuenow":Math.max(a,0),"aria-valuetext":n,className:"hn-bl-stagebar",children:pn.map((r,s)=>{const o=s<a||e==="done",l=s===a&&e!=="done",d=o?"done":l?"active":"todo";return t.jsxs("span",{className:"hn-bl-stage","data-state":d,title:If[r.key],children:[t.jsx("span",{className:"hn-bl-stage-dot","aria-hidden":"true"}),l&&t.jsx("span",{className:"hn-bl-stage-label",children:r.label})]},r.key)})})}function yp({label:e,value:a}){return t.jsxs("div",{className:"hn-bl-field",children:[t.jsx("div",{className:"hn-eyebrow",children:e}),t.jsx("div",{className:"hn-bl-field-value",children:a||"—"})]})}const IN={qa:"Finding QA — ada yang perlu diperbaiki.",brief:"Feature brief — kebutuhan yang bentuknya sudah jelas.",prd:"PRD — kebutuhan produk yang perlu didefinisikan dulu."},gd=(e,a)=>e&&e.target===a?"primary":"secondary",vp=e=>e==="audit";function NN({spec:e,onClose:a,onEditBranch:n,onRevertStage:i,onMarkDone:r,onOpenReview:s,onStart:o,onIntegrate:l,onEditSpec:d,onPromoteToQa:u,onPromoteToBrief:m,onPromoteToPrd:h,onEditDeps:p,onEditAutoMerge:g,onChangeSource:f,onRequestDelete:b,onUndoable:v,projectPolicy:x,allSpecs:y,onAttachmentToast:T,running:S,onOpenRun:E,projectName:w,presenceOn:M}){var sa,Ba,ta;const[N,R]=c.useState([]),[I,L]=c.useState(new Set),[A,B]=c.useState(null),[G,H]=c.useState(""),[Y,X]=c.useState(!1),[q,ie]=c.useState(!1),te=c.useRef(!1),[Z,xe]=c.useState(!1),[_e,ae]=c.useState(!1),[ee,le]=c.useState(!1),[re,Ce]=c.useState(!1),[Ee,J]=c.useState({}),ea=(e==null?void 0:e.stage)==="brainstorming"&&(e==null?void 0:e.baseSha)==null&&!!d&&e.payload!==void 0,Ke=()=>{if(!e)return;const ke=e.payload||{};J({title:e.title,priority:e.priority,...ke}),Ce(!0)},He=ke=>Ge=>J(ma=>({...ma,[ke]:Ge.target.value})),[Ve,ya]=c.useState(null),We=e&&vp(e.source)?e.id:null;c.useEffect(()=>{var Ge;if(ya(null),!We)return;let ke=!0;return(Ge=se.getEscalation)==null||Ge.call(se,We).then(ma=>{ke&&ya(ma.escalation)}).catch(()=>{ke&&ya(null)}),()=>{ke=!1}},[We]);const ga=()=>{if(!e||!d)return;const ke=e.source==="qa"?{title:Ee.title,payload:{severity:Ee.severity,steps:Ee.steps,expected:Ee.expected,actual:Ee.actual,env:Ee.env,constraints:Ee.constraints??""}}:Ii(e.source)==="goal"?{title:Ee.title,priority:Ee.priority,payload:{goal:Ee.goal,done:Ee.done??"",constraints:Ee.constraints??"",priority:Ee.priority}}:{title:Ee.title,priority:Ee.priority,payload:{context:Ee.context,outcome:Ee.outcome,constraints:Ee.constraints,priority:Ee.priority}};d(e,ke),Ce(!1)},qa=ke=>{if(!e||!d||ke===e.priority)return;const Ge=e.priority;d(e,{priority:ke}),v==null||v(`Prioritas ${e.id} diubah ke ${Ko(ke).label}`,()=>d(e,{priority:Ge}))},wa=e==null?void 0:e.projectId;c.useEffect(()=>{if(!wa){R([]),L(new Set);return}let ke=!0;return se.listBranches(wa).then(Ge=>{if(ke){const ma=[...new Set([...Ge.branches,...Ge.remotes])].sort();R(ma),L(new Set(Ge.remotes.filter(Ne=>!Ge.branches.includes(Ne))))}}).catch(()=>{ke&&(R([]),L(new Set))}),()=>{ke=!1}},[wa]),c.useEffect(()=>{G&&H(""),A&&B(null)},[e==null?void 0:e.id,e==null?void 0:e.stage]);async function be(ke){if(!te.current){te.current=!0,ie(!0);try{return await ke()}finally{te.current=!1,ie(!1)}}}async function Ze(){if(!e||!i||!G)return;const ke=await be(()=>i(e,G));ke&&ke.pending?B({target:G,files:ke.wouldDelete}):ke&&H("")}async function z(){if(!e||!i||!A)return;await be(()=>i(e,A.target,!0))&&(B(null),H(""))}function $e(){A||te.current||(Ce(!1),a())}if(!e)return null;const aa=pn.slice(0,Mf(e.stage)),da=((sa=pn.find(ke=>ke.key===e.stage))==null?void 0:sa.label)??e.stage,je=((Ba=pn.find(ke=>ke.key===G))==null?void 0:Ba.label)??G,ye=e.source==="qa",Ue=Ii(e.source),ve=e.payload||{},fe=(y??[]).filter(ke=>ke.projectId===e.projectId&&ke.id!==e.id),_a=hc[Ue],Ta=ti(e.source);return t.jsxs(ca,{open:!0,title:e.title,eyebrow:e.id,icon:Ta.icon,onClose:$e,width:600,children:[t.jsxs("div",{className:"hn-bl-detail",children:[t.jsxs("section",{className:"hn-bl-section","aria-labelledby":"bl-sec-ringkasan",children:[t.jsx("h3",{id:"bl-sec-ringkasan",className:"hn-bl-section-title",children:"Ringkasan"}),t.jsxs("div",{className:"hn-bl-summary-meta",children:[t.jsx(Bf,{stage:e.stage}),t.jsxs("span",{className:"hn-bl-prio-text",children:[t.jsx(Tu,{priority:e.priority}),Ko(e.priority).label]}),t.jsx(Au,{spec:e}),t.jsx(bl,{names:M})]}),t.jsx(MN,{stage:e.stage}),re?t.jsx(de,{label:"Judul",children:t.jsx(Oe,{value:Ee.title??"",onChange:He("title"),placeholder:"mis. Jadwal invoice berulang",className:"hn-bl-full"})}):t.jsx(yp,{label:"Tujuan",value:e.objective}),t.jsxs("dl",{className:"hn-bl-facts",children:[t.jsxs("div",{children:[t.jsx("dt",{children:"Project"}),t.jsx("dd",{children:w??e.projectId})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Penulis"}),t.jsx("dd",{children:e.author||"—"})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Dibuat"}),t.jsx("dd",{children:RN(e.createdAt)||"—"})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Branch asal"}),t.jsx("dd",{children:e.branchFrom||"—"})]})]}),ea&&!re&&t.jsxs("div",{className:"hn-bl-inline-row",children:[t.jsx(Be,{size:"sm","aria-label":"Prioritas item ini",value:e.priority,onChange:ke=>qa(ke.target.value),options:pc}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"pencil",onClick:Ke,children:"Edit"})]}),re?t.jsxs(t.Fragment,{children:[!ye&&t.jsx(de,{label:"Prioritas",children:t.jsx(Be,{value:Ee.priority??"sedang",onChange:He("priority"),options:pc,className:"hn-bl-full"})}),_a.map(([ke,Ge,ma])=>t.jsx(de,{label:Ge,children:ke==="severity"?t.jsx(Be,{value:Ee[ke]??"major",onChange:He(ke),options:Cf,className:"hn-bl-full"}):t.jsx(La,{value:Ee[ke]??"",onChange:He(ke),rows:2,placeholder:ma})},ke)),t.jsxs("div",{className:"hn-bl-inline-row hn-bl-end",children:[t.jsx(U,{size:"sm",variant:"secondary",onClick:()=>Ce(!1),children:"Batal"}),t.jsx(U,{size:"sm",variant:"primary",leftIcon:"check",onClick:ga,children:"Simpan"})]})]}):_a.map(([ke,Ge])=>t.jsx(yp,{label:Ge,value:ve[ke]??""},ke)),e.manualDone&&t.jsxs("div",{className:"hn-bl-field","data-testid":"manual-done-trail",children:[t.jsx("div",{className:"hn-eyebrow",children:"Ditandai selesai manual"}),t.jsxs("div",{className:"hn-bl-field-value hn-bl-muted",children:[e.manualDone.by," · ",new Date(e.manualDone.at).toLocaleString("id-ID"),e.manualDone.reason?t.jsx("div",{className:"hn-bl-gap-top",children:e.manualDone.reason}):null]})]})]}),t.jsxs("div",{className:"hn-bl-cta",children:[S&&E&&t.jsx(U,{variant:"primary",leftIcon:"terminal",onClick:()=>E(e),children:"Buka sesi"}),!S&&o&&t.jsx(U,{variant:"primary",leftIcon:"play",onClick:()=>o(e),children:"Jalankan"}),e.stage==="done"&&t.jsx("span",{className:"hn-bl-hint",children:"Sesi baru melanjutkan sisa kerja item ini."})]}),t.jsxs("section",{className:"hn-bl-section","aria-labelledby":"bl-sec-review",children:[t.jsx("h3",{id:"bl-sec-review",className:"hn-bl-section-title",children:"Review, dokumen, dan lampiran"}),t.jsxs("div",{className:"hn-bl-inline-row",children:[s&&t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"git-compare",onClick:()=>{s(e),a()},children:"Review perubahan"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"file-text",onClick:()=>ae(!0),children:"Lihat dokumen"})]}),vp(e.source)&&(u||m||h)&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Tindak lanjut"}),Ve&&t.jsxs("div",{className:"hn-bl-hint",children:[Ve.target==="none"?t.jsxs("span",{children:["Audit menilai ",t.jsx("strong",{children:"cukup jawaban"})," — tak perlu perbaikan."]}):t.jsxs("span",{children:[t.jsx(la,{tone:"brass",size:"sm",children:"direkomendasikan hanoman"})," ",IN[Ve.target]]}),Ve.reason?t.jsx("div",{className:"hn-bl-gap-top",children:Ve.reason}):null]}),t.jsxs("div",{className:"hn-bl-inline-row",children:[u&&t.jsx(U,{size:"sm",variant:gd(Ve,"qa"),leftIcon:"bug",onClick:()=>u(e,Ve),children:"Jadikan Finding QA"}),m&&t.jsx(U,{size:"sm",variant:gd(Ve,"brief"),leftIcon:"lightbulb",onClick:()=>m(e,Ve),children:"Jadikan Feature brief"}),h&&t.jsx(U,{size:"sm",variant:gd(Ve,"prd"),leftIcon:"scroll-text",onClick:()=>h(e,Ve),children:"Jadikan PRD"})]})]}),t.jsx(HE,{specId:e.id,onToast:T??(()=>{})})]}),t.jsxs("details",{className:"hn-bl-advanced","data-testid":"spec-advanced",children:[t.jsx("summary",{children:"Lanjutan"}),t.jsxs("div",{className:"hn-bl-advanced-body",children:[t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Branch worktree"}),t.jsx(Be,{size:"sm",value:e.branchFrom??"",disabled:!N.length,onChange:ke=>n&&n(e,ke.target.value||null),options:Cb(N,I)})]}),t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Bergantung pada"}),(e.dependsOn??[]).length===0?t.jsx("div",{className:"hn-bl-hint",children:"— berdiri sendiri"}):t.jsx("div",{className:"hn-bl-stack-list",children:(e.dependsOn??[]).map(ke=>{const Ge=(e.blockedBy??[]).find(ma=>ma.id===ke);return t.jsxs("div",{className:"hn-bl-dep",children:[t.jsx("span",{className:"hn-bl-id",children:ke}),Ge?t.jsx(la,{tone:"warn",size:"sm",children:Lf(Ge.reason)}):t.jsx(la,{tone:"ok",size:"sm",icon:"check",children:"selesai & ter-merge"})]},ke)})}),p&&fe.length>0&&t.jsx("div",{className:"hn-bl-checklist",children:fe.map(ke=>{const Ge=(e.dependsOn??[]).includes(ke.id);return t.jsx(As,{"aria-label":`Bergantung pada ${ke.id}`,checked:Ge,label:`${ke.id} · ${ke.title}`,onChange:()=>p(e,Ge?(e.dependsOn??[]).filter(ma=>ma!==ke.id):[...e.dependsOn??[],ke.id])},ke.id)})})]}),g&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Auto-merge saat selesai"}),t.jsx(Be,{size:"sm","aria-label":"Auto-merge item ini",value:e.autoMerge?e.autoMerge.mode:"inherit",onChange:ke=>{var ma;const Ge=ke.target.value;if(Ge==="inherit")return g(e,null);if(Ge==="off")return g(e,{...hs});g(e,{...e.autoMerge??hs,mode:Ge,branch:Ge==="branch"?((ma=e.autoMerge)==null?void 0:ma.branch)??N[0]??null:null})},options:[{value:"inherit",label:`Ikut project (${Zp(tv(x,null))})`},{value:"off",label:"Tanpa auto-merge untuk item ini"},{value:"default-branch",label:"Auto-merge ke default branch repo"},{value:"branch",label:"Auto-merge ke branch tujuan…"}]}),((ta=e.autoMerge)==null?void 0:ta.mode)==="branch"&&t.jsx("div",{className:"hn-bl-gap-top",children:t.jsx(Be,{size:"sm","aria-label":"Branch tujuan item ini",value:e.autoMerge.branch??"",onChange:ke=>g(e,{...e.autoMerge,branch:ke.target.value||null}),options:[{value:"",label:"Pilih branch…"},...N.map(ke=>({value:ke,label:ke}))]})})]}),(i||r)&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Ubah status"}),t.jsx("div",{className:"hn-bl-status-now",children:`Status saat ini: ${da}`}),e.stage!=="done"&&r&&t.jsx("div",{className:"hn-bl-gap-bottom",children:t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"circle-check",onClick:()=>X(!0),children:"Tandai selesai"})}),i?aa.length>0?t.jsxs(t.Fragment,{children:[t.jsx(Be,{size:"sm","aria-label":"Kembalikan stage",value:G,onChange:ke=>H(ke.target.value),disabled:q,placeholder:"Pilih status lebih awal…",options:aa.map(ke=>({value:ke.key,label:"← "+ke.label}))}),t.jsx("div",{className:"hn-bl-hint hn-bl-gap-top",children:"Status saat ini dan status berikutnya tidak dapat dipilih. Kemajuan hanya berasal dari fase sesi."}),G&&t.jsxs("div",{className:"hn-bl-callout",children:[t.jsxs("div",{className:"hn-bl-callout-title",children:[da," → ",je]}),"Fase sesi yang sudah berjalan tidak dibatalkan. Dokumen Spec/Plan di atas target mungkin perlu dihapus setelah konfirmasi; kode dan commit tidak disentuh."]}),t.jsx("div",{className:"hn-bl-gap-top",children:t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"rotate-ccw",disabled:!G,loading:q,onClick:Ze,children:"Simpan status"})})]}):t.jsxs("div",{className:"hn-bl-hint",children:[da," adalah status paling awal. Kemajuan hanya berasal dari fase sesi."]}):null]}),e.stage==="done"&&l&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Integrasi"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"git-merge",onClick:()=>xe(!0),children:"Rebase / Merge"})]}),f&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Type"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"shuffle",onClick:()=>le(!0),children:"Ubah type"})]}),(e.sourceHistory??[]).length>0&&t.jsxs("div",{className:"hn-bl-subsection","data-testid":"source-trail",children:[t.jsx("div",{className:"hn-eyebrow",children:"Jejak konversi type"}),t.jsx("div",{className:"hn-bl-stack-list",children:(e.sourceHistory??[]).map((ke,Ge)=>t.jsxs("div",{className:"hn-bl-trail",children:[t.jsxs("span",{className:"hn-bl-id",children:[ke.from," → ",ke.to]})," · ",new Date(ke.at).toLocaleString("id-ID")," · ",ke.by]},`${ke.at}-${Ge}`))})]})]})]}),b&&t.jsxs("section",{className:"hn-bl-danger","aria-labelledby":"bl-sec-bahaya",children:[t.jsx("h3",{id:"bl-sec-bahaya",className:"hn-bl-section-title",children:"Zona berbahaya"}),t.jsx("div",{className:"hn-bl-hint",children:"Menghapus item tak bisa dibatalkan. Kode dan commit di repo tidak disentuh."}),t.jsx("div",{className:"hn-bl-gap-top",children:t.jsx(U,{size:"sm",variant:"danger",leftIcon:"trash-2",onClick:()=>b(e),children:"Hapus spec"})})]})]}),A&&t.jsxs(ca,{open:!0,title:"Kembalikan status & hapus dokumen fase",icon:"rotate-ccw",eyebrow:e.id+" → "+A.target,onClose:q?void 0:()=>B(null),children:[t.jsxs("div",{className:"hn-bl-confirm-lead",children:[A.files.length," berkas docs akan dihapus dari disk (kode & commit tak disentuh):"]}),t.jsx("ul",{className:"hn-bl-file-list",children:A.files.map(ke=>t.jsx("li",{children:ke},ke))}),t.jsxs("div",{className:"hn-bl-inline-row hn-bl-end",children:[t.jsx(U,{size:"sm",variant:"secondary",disabled:q,onClick:()=>B(null),children:"Batal"}),t.jsx(U,{size:"sm",variant:"danger",leftIcon:"trash-2",loading:q,onClick:z,children:"Hapus & kembalikan"})]})]}),Z&&l&&t.jsx(kN,{projectId:e.projectId,ownBranch:`hanoman/${e.id.toLowerCase().replace(/[^a-z0-9_-]/g,"_")}`,eyebrow:e.id,onClose:()=>xe(!1),onIntegrate:(ke,Ge)=>{xe(!1),l(e,ke,Ge)}}),Y&&r&&t.jsx(Pf,{spec:e,onClose:()=>X(!1),onSubmit:r}),_e&&t.jsx(xu,{specId:e.id,onClose:()=>ae(!1)}),ee&&f&&e.payload!==void 0&&t.jsx(EN,{spec:e,onClose:()=>le(!1),onSubmit:(ke,Ge,ma)=>Promise.resolve(f(e,ke,Ge,ma)??null)})]})}function Df({spec:e,onStart:a,onDelete:n,onOpenRun:i,onOpenReview:r,onMarkDone:s,onMarkReviewed:o,running:l}){const[d,u]=c.useState(!1),[m,h]=c.useState(!1),p=e.stage!=="done",g=l?i?{label:"Buka sesi",icon:"terminal",run:()=>i(e)}:null:p?a?{label:CN(e.stage),icon:"play",run:()=>a(e)}:null:r?{label:"Review perubahan",icon:"git-compare",run:()=>r(e)}:null,b=[...!!r&&(g==null?void 0:g.label)!=="Review perubahan"&&r?[{key:"review",label:"Review perubahan",icon:"git-compare",onSelect:()=>r(e)}]:[],{key:"docs",label:"Lihat dokumen",icon:"file-text",onSelect:()=>u(!0)},...!p&&a?[{key:"rerun",label:"Jalankan lagi",icon:"play",onSelect:()=>a(e)}]:[],...p&&s?[{key:"done",label:"Tandai selesai",icon:"circle-check",onSelect:()=>h(!0)}]:[],...!p&&o?[{key:"reviewed",label:e.reviewedAt?"Batalkan tanda ditinjau":"Tandai ditinjau",icon:e.reviewedAt?"rotate-ccw":"circle-check",onSelect:()=>void o(e,!e.reviewedAt)}]:[],...n?[{key:"delete",label:"Hapus spec",icon:"trash-2",tone:"danger",onSelect:()=>n(e)}]:[]];return t.jsxs("div",{className:"hn-bl-actions",children:[g&&t.jsx(U,{size:"sm",variant:g.label==="Review perubahan"?"secondary":"primary",leftIcon:g.icon,onClick:g.run,children:g.label}),t.jsx(an,{label:`Aksi lain ${e.id}`,items:b}),m&&s&&t.jsx(Pf,{spec:e,onClose:()=>h(!1),onSubmit:s}),d&&t.jsx(xu,{specId:e.id,onClose:()=>u(!1)})]})}const RN=e=>{const a=e?new Date(e):null;return a&&!Number.isNaN(a.getTime())?a.toLocaleDateString("id-ID",{day:"numeric",month:"short",year:"numeric"}):""};function LN({spec:e,onOpenDetail:a,className:n="hn-bl-title"}){return t.jsx("button",{type:"button",className:n,onClick:()=>a&&a(e),children:e.title})}function $N({spec:e,presenceOn:a,onOpenDetail:n,projectName:i,...r}){return t.jsxs(fn,{onClick:n?()=>n(e):void 0,actions:t.jsx(Df,{spec:e,...r}),children:[t.jsx(Tu,{priority:e.priority,stage:e.stage}),t.jsxs("span",{className:"hn-bl-row-body",children:[t.jsx("span",{className:"hn-bl-row-title",children:e.title}),t.jsxs("span",{className:"hn-bl-row-meta",children:[t.jsx("span",{className:"hn-bl-id",children:e.id}),i&&t.jsx("span",{className:"hn-bl-proj",title:`Project: ${i}`,children:i}),t.jsx($f,{source:e.source}),t.jsx(Bf,{stage:e.stage}),t.jsx(Au,{spec:e}),t.jsx(bl,{names:a})]})]})]})}const fl="backlog",Of="success",BN=pn[0].key,xp=[{key:fl,label:"Backlog",icon:"inbox"},...pn.slice(0,5).map(e=>({key:e.key,label:e.label})),{key:Of,label:"Success",icon:"check-circle-2"}];function DN(e,a){return e.stage==="done"?Of:!a&&e.stage==="brainstorming"?fl:e.stage}const jp=(e,a)=>e===fl&&a===BN;function ON({spec:e,col:a,onOpenDetail:n,presenceOn:i,projectName:r,onDragStart:s,onDragEnd:o,dragging:l,...d}){const u=a===fl;return t.jsxs("div",{draggable:u,className:"hn-bl-card","data-dragging":l||void 0,onDragStart:m=>{m.dataTransfer.effectAllowed="move",m.dataTransfer.setData("text/plain",e.id),s()},onDragEnd:o,title:u?"Seret ke Brainstorm untuk memulai sesi":"Stage mengikuti fase yang dilaporkan agen — kartu tak bisa dipindah","data-draggable":u||void 0,children:[t.jsxs("div",{className:"hn-bl-card-head",children:[t.jsx(Tu,{priority:e.priority,stage:e.stage}),t.jsx("span",{className:"hn-bl-id",children:e.id}),t.jsx($f,{source:e.source})]}),t.jsx(LN,{spec:e,onOpenDetail:n}),r&&t.jsx("span",{className:"hn-bl-proj",title:`Project: ${r}`,children:r}),(e.blockedBy??[]).length>0||i!=null&&i.length?t.jsxs("div",{className:"hn-bl-card-badges",children:[t.jsx(Au,{spec:e}),t.jsx(bl,{names:i})]}):null,t.jsx("div",{className:"hn-bl-card-foot",children:t.jsx(Df,{spec:e,...d})})]})}function HN({specs:e,activeSpecs:a,presenceBySpec:n,onOpenDetail:i,projectNameOf:r,...s}){const[o,l]=c.useState(null),[d,u]=c.useState(null),m=c.useMemo(()=>{var g;const p=new Map(xp.map(f=>[f.key,[]]));for(const f of e)(g=p.get(DN(f,a==null?void 0:a.has(f.id))))==null||g.push(f);return p},[e,a]),h=p=>{o&&jp(o.from,p)&&s.onStart&&s.onStart(o.spec),l(null),u(null)};return t.jsx("div",{"data-testid":"backlog-board",className:"hn-board-local-overflow hn-bl-board",children:xp.map(p=>{const g=m.get(p.key),f=!!o&&jp(o.from,p.key),b=f&&d===p.key;return t.jsxs("div",{className:"hn-bl-col","data-active":f||void 0,"data-hot":b||void 0,"data-dimmed":o&&!f||void 0,onDragOver:v=>{f&&(v.preventDefault(),v.dataTransfer.dropEffect="move",u(p.key))},onDragLeave:()=>u(v=>v===p.key?null:v),onDrop:v=>{v.preventDefault(),h(p.key)},children:[t.jsxs("div",{className:"hn-bl-col-head",children:[p.icon&&t.jsx(Re,{name:p.icon,size:13,color:"var(--text-muted)"}),t.jsx("span",{className:"hn-eyebrow",children:p.label}),t.jsx("span",{className:"hn-bl-col-count",children:g.length})]}),t.jsx("div",{className:"hn-bl-col-body",children:g.map(v=>t.jsx(ON,{spec:v,col:p.key,onOpenDetail:i,projectName:r==null?void 0:r(v.projectId),presenceOn:n==null?void 0:n.get(v.id),...s,dragging:(o==null?void 0:o.spec.id)===v.id,running:a==null?void 0:a.has(v.id),onDragStart:()=>l({spec:v,from:p.key}),onDragEnd:()=>{l(null),u(null)}},v.id))})]},p.key)})})}const qN=[{value:"list",label:"Daftar",icon:"list"},{value:"board",label:"Papan",icon:"kanban"}];function UN({value:e,onChange:a}){return t.jsx("div",{className:"hn-bl-view-toggle",role:"group","aria-label":"Mode tampilan",children:qN.map(n=>t.jsx("button",{type:"button",className:"hn-bl-view-btn hn-touch-target","aria-pressed":e===n.value,"aria-label":n.label,title:n.label,onClick:()=>a(n.value),children:t.jsx(Re,{name:n.icon,size:15})},n.value))})}const zN=5,FN=new Set;function GN({backlog:e,projects:a,pageSize:n=20,onStart:i,activeSpecs:r,presenceBySpec:s,reviewSpecIds:o=FN,onDelete:l,onOpenRun:d,onOpenReview:u,onNew:m,onEditBranch:h,onRevertStage:p,onMarkDone:g,onMarkReviewed:f,onIntegrate:b,onEditSpec:v,onEditDeps:x,onEditAutoMerge:y,onChangeSource:T,onPromoteToQa:S,onPromoteToBrief:E,onPromoteToPrd:w,projectFilter:M,onProjectFilter:N,dataVersion:R,onToast:I,initialDetailId:L}){var Ct,sn,Rt,wn,Lt;const[A,B]=Oa("backlog","tab","all",Hn),[G,H]=c.useState(0),[Y,X]=Oa("backlog","view","list",vi("list","board")),[q,ie]=Oa("backlog","stageGroup","all",vi("all","brainstorm","spec","doing","done")),[te,Z]=Oa("backlog","q","",Hn),[xe,_e]=Oa("backlog","prio","all",Hn),[ae,ee]=Oa("backlog","worktree","all",vi("all","worktree")),[le,re]=Oa("backlog","review","all",vi("all","review")),[Ce,Ee]=Oa("backlog","dateField","created",vi("created","started")),[J,ea]=Oa("backlog","from","",Hn),[Ke,He]=Oa("backlog","to","",Hn),Ve=M,ya=N,[We,ga]=Oa("backlog","detailId",null,Qk);c.useEffect(()=>{L&&ga(L)},[L]);const qa=c.useCallback(he=>{var ra;return(ra=(a??[]).find(za=>za.id===he))==null?void 0:ra.name},[a]),wa=a||[...new Set(e.map(he=>he.projectId))].map(he=>({id:he,name:he})),[be,Ze]=c.useState(()=>e.map(he=>({objective:"",...he}))),[z,$e]=Oa("backlog","page",1,ou),[aa,da]=c.useState(()=>te.trim()),[je,ye]=c.useState(!1),[Ue,ve]=c.useState(!1),[fe,_a]=c.useState(!1),Ta=c.useRef(!1),[sa,Ba]=Rk(),ta=c.useCallback((he,ra)=>{Ba(he,"ok",void 0,{action:{label:"Urungkan",onAction:ra}})},[Ba]),ke=[A!=="all",Ve!=="all",te.trim()!=="",q!=="all",xe!=="all",J!=="",Ke!=="",ae!=="all",le!=="all"].filter(Boolean).length,Ge=lu("backlog","scroll",be.length>0);c.useEffect(()=>{const he=setTimeout(()=>da(te.trim()),250);return()=>clearTimeout(he)},[te]),Xk(JSON.stringify([A,Ve,q,xe,aa,Ce,J,Ke,ae,le]),()=>$e(1)),c.useEffect(()=>{var za;let he=!0;const ra=(za=se.listSpecs)==null?void 0:za.call(se,{project:Ve==="all"?void 0:Ve,source:A==="all"?void 0:A,q:aa||void 0,priority:xe==="all"?void 0:xe,dateField:J||Ke?Ce:void 0,from:J||void 0,to:Ke||void 0});return ve(!!ra),ra==null||ra.then(Wa=>{he&&(Ze(Wa.items),_a(!0),Ta.current=!1,ye(!1),ve(!1))}).catch(()=>{he&&(Ta.current||(Ta.current=!0,I==null||I("Gagal menyegarkan backlog — data di layar mungkin usang","warn")),ye(!0),ve(!1))}),()=>{he=!1}},[A,Ve,xe,aa,Ce,J,Ke,R,G]);const ma=c.useMemo(()=>new Map(e.map(he=>[he.id,he])),[e]),Ne=c.useMemo(()=>be.map(he=>sd(he,ma.get(he.id))),[be,ma]),Ja=c.useMemo(()=>gN(uN(Ne,ae),le,o),[Ne,ae,le,o]),At=c.useMemo(()=>{const he={};for(const ra of hr)he[ra.key]=Ja.filter(za=>gp(za.stage,ra.key)).length;return he},[Ja]),ut=c.useMemo(()=>Ja.filter(he=>gp(he.stage,q)),[Ja,q]),rt=Cs(ut.length,z,n),tn=ut.slice((rt.page-1)*n,rt.page*n),[Pa,ot]=c.useState(null);c.useEffect(()=>{if(!We||!se.getSpec){ot(null);return}let he=!0;return se.getSpec(We).then(ra=>{he&&ot(ra)}).catch(ra=>{!he||!(ra instanceof ba)||ra.status!==404||(ga(null),I==null||I(`${We} sudah tidak ada`,"warn"))}),()=>{he=!1}},[We,R]);const Ka=c.useMemo(()=>{if(!We)return null;const he=ma.get(We);if((Pa==null?void 0:Pa.id)===We)return sd(Pa,he);const ra=be.find(za=>za.id===We);return ra?sd(ra,he):he?{objective:"",...he}:null},[We,Pa,be,ma]),{confirm:Ua,dialog:It}=st(),Tt=l?he=>{var za;const ra=((za=a.find(Wa=>Wa.id===he.projectId))==null?void 0:za.name)??he.projectId;Ua({title:`Hapus ${he.id}?`,message:`"${he.title}" dihapus dari backlog ${ra}.`,impact:["Tindakan ini tidak bisa dibatalkan.","Lampiran item ini ikut dihapus dari disk.","Sesi yang masih berjalan untuk item ini tidak ikut dihentikan.","Item lain yang menunggu item ini tidak lagi bergantung padanya.","Kode dan commit di repo tidak disentuh."],confirmLabel:"Hapus spec",tone:"danger",icon:"trash-2",run:async()=>{await l(he),We===he.id&&ga(null)}}).catch(Wa=>I==null?void 0:I(va(`menghapus ${he.id}`,Wa),"err","x-circle"))}:void 0,vt=()=>{B("all"),ya("all"),Z(""),ie("all"),_e("all"),Ee("created"),ea(""),He(""),ee("all"),re("all"),$e(1)},jn=[...A!=="all"?[{key:"tab",label:`Sumber: ${((Ct=bp.find(he=>he.value===A))==null?void 0:Ct.label)??A}`,onRemove:()=>B("all")}]:[],...Ve!=="all"?[{key:"proj",label:`Project: ${((sn=wa.find(he=>he.id===Ve))==null?void 0:sn.name)??Ve}`,onRemove:()=>ya("all")}]:[],...xe!=="all"?[{key:"prio",label:`Prioritas: ${Ko(xe).label}`,onRemove:()=>_e("all")}]:[],...J||Ke?[{key:"date",label:`Tanggal ${Ce==="created"?"dibuat":"dikerjakan"}: ${J||"…"} – ${Ke||"…"}`,onRemove:()=>{ea(""),He("")}}]:[],...ae!=="all"?[{key:"wt",label:Od.worktree,onRemove:()=>ee("all")}]:[],...le!=="all"?[{key:"review",label:Hd.review,onRemove:()=>re("all")}]:[]],Et=t.jsxs(tA,{gap:3,children:[t.jsx(de,{label:"Sumber",children:t.jsx(Be,{size:"sm","aria-label":"Filter sumber",value:A,onChange:he=>B(he.target.value),options:bp})}),t.jsx(de,{label:"Project",children:t.jsx(Be,{size:"sm","aria-label":"Filter project",value:Ve,onChange:he=>ya(he.target.value),options:[{value:"all",label:"Semua project"}].concat(wa.map(he=>({value:he.id,label:he.name})))})}),t.jsx(de,{label:"Prioritas",children:t.jsx(Be,{size:"sm","aria-label":"Filter prioritas",value:xe,onChange:he=>_e(he.target.value),options:PN})}),t.jsx(de,{label:"Worktree",hint:"Hanya item yang pernah dibuatkan worktree oleh hanoman. Pekerjaan di luar hanoman tidak terhitung.",children:t.jsx(Be,{size:"sm","aria-label":"Filter worktree",value:ae,onChange:he=>ee(he.target.value),options:dN.map(he=>({value:he.value,label:he.label}))})}),t.jsx(de,{label:"Tinjauan",hint:"Item yang sesinya menunggu jawabanmu, dan item selesai yang belum kamu tandai sudah ditinjau. Tandai lewat menu item atau di Review perubahan.",children:t.jsx(Be,{size:"sm","aria-label":"Filter perlu ditinjau",value:le,onChange:he=>re(he.target.value),options:mN.map(he=>({value:he.value,label:he.label}))})}),t.jsx(de,{label:"Tanggal",children:t.jsxs("div",{className:"hn-bl-date-row",children:[t.jsx(Be,{size:"sm","aria-label":"Filter tanggal berdasarkan",value:Ce,onChange:he=>Ee(he.target.value),options:[{value:"created",label:"Dibuat"},{value:"started",label:"Dikerjakan"}]}),t.jsx(Oe,{size:"sm",type:"date","aria-label":"Tanggal dari",value:J,onChange:he=>ea(he.target.value)}),t.jsx("span",{className:"hn-eyebrow","aria-hidden":"true",children:"→"}),t.jsx(Oe,{size:"sm",type:"date","aria-label":"Tanggal sampai",value:Ke,onChange:he=>He(he.target.value)})]})})]}),Nt=!fe&&Ne.length===0&&Ue,mt={onStart:i,onDelete:Tt,onOpenRun:d,onOpenReview:u,onMarkDone:g,onMarkReviewed:f},nn=he=>ga(he.id),ha=((Rt=hr.find(he=>he.key===q))==null?void 0:Rt.label)??"";return t.jsxs("div",{className:"hn-bl-screen",children:[t.jsxs("section",{className:"hn-bl-toolbar",role:"region","aria-label":"Kontrol backlog",children:[t.jsx(aA,{label:"Penyaring backlog",search:{value:te,onChange:Z,label:"Cari backlog",placeholder:"mis. invoice atau SPEC-412"},chips:jn,filters:Et,filtersLabel:"Filter",onReset:ke>0?vt:void 0,resetLabel:"Reset filter",actions:t.jsxs(t.Fragment,{children:[t.jsx(UN,{value:Y,onChange:X}),t.jsx(wN,{onDone:()=>H(he=>he+1),onToast:I??(()=>{})})]})}),t.jsx(St,{variant:"pill","aria-label":"Tahap backlog",value:q,onChange:he=>ie(he),className:"hn-bl-stage-tabs",tabs:hr.map(he=>({value:he.key,label:he.label,count:At[he.key]}))}),fp[A]&&t.jsx("p",{className:"hn-bl-hint","data-testid":"backlog-tab-hint",children:fp[A]}),t.jsxs("div",{className:"hn-bl-status-line",children:[je&&t.jsx("span",{role:"status",className:"hn-bl-stale",title:"Server tak menjawab saat menyegarkan — angka ini dari muatan terakhir yang berhasil",children:"Data mungkin usang: server tak menjawab saat menyegarkan."}),Ue&&t.jsx("span",{"data-testid":"backlog-refreshing",className:"hn-bl-muted",children:"Memuat…"})]})]}),Nt?t.jsx(Hk,{rows:zN,label:"Memuat backlog"}):Ja.length===0?e.length===0?t.jsx(pe,{kind:"empty",illustration:"PST-002",title:"Backlog masih kosong",hint:"Ajukan feature brief atau Finding QA — hanoman menjalankannya dari brainstorm sampai execute.",action:m,actionLabel:"Tambah spec"}):t.jsx(pe,{kind:"empty",icon:"filter",title:"Tidak ada spec untuk filter ini",hint:`${e.length} spec ada di backlog, tapi tak ada yang cocok dengan filter aktif.`,action:vt,actionLabel:"Reset filter",actionIcon:"rotate-ccw"}):ut.length===0?t.jsx(pe,{kind:"empty",compact:!0,icon:"filter",title:`Tidak ada spec di tahap ${ha}`,hint:"Tahap lain tetap memuat item yang sama.",action:()=>ie("all"),actionLabel:"Tampilkan semua",actionIcon:"x"}):Y==="board"?t.jsxs("div",{className:"hn-bl-body",children:[t.jsx("p",{"data-testid":"board-drag-hint",className:"hn-bl-hint",children:"Seret kartu dari kolom Backlog ke Brainstorm untuk memulai sesi. Tombol di kartu melakukan hal yang sama."}),t.jsx(HN,{specs:ut,activeSpecs:r,presenceBySpec:s,projectNameOf:qa,onOpenDetail:nn,...mt})]}):t.jsxs("div",{className:"hn-bl-body",children:[t.jsx("div",{ref:Ge,"data-testid":"backlog-scroll","aria-busy":Ue||void 0,className:"hn-bl-list-scroll",children:t.jsx(bn,{label:"Daftar backlog",children:tn.map(he=>t.jsx($N,{spec:he,presenceOn:s==null?void 0:s.get(he.id),projectName:qa(he.projectId),running:r==null?void 0:r.has(he.id),onOpenDetail:nn,...mt},he.id))})}),t.jsx("div",{className:"hn-bl-pager",children:t.jsx(Ps,{page:rt.page,pageCount:rt.pageCount,total:ut.length,from:rt.from,to:rt.to,onPage:$e,unit:"spec"})})]}),t.jsx(NN,{spec:Ka,onClose:()=>ga(null),running:!!We&&!!(r!=null&&r.has(We)),onOpenRun:d,presenceOn:We?s==null?void 0:s.get(We):void 0,onEditBranch:h,onRevertStage:p,onMarkDone:g,onOpenReview:u,onStart:i,onIntegrate:b,onEditSpec:v,onPromoteToQa:S,onPromoteToBrief:E,onPromoteToPrd:w,onEditDeps:x,onEditAutoMerge:y,onChangeSource:T,onRequestDelete:Tt,onUndoable:ta,projectPolicy:(wn=a.find(he=>{var ra;return he.id===((ra=e.find(za=>za.id===We))==null?void 0:ra.projectId)}))==null?void 0:wn.autoMerge,projectName:(Lt=a.find(he=>he.id===(Ka==null?void 0:Ka.projectId)))==null?void 0:Lt.name,allSpecs:e,onAttachmentToast:(he,ra)=>I==null?void 0:I(he,ra??"ok","paperclip")}),t.jsx(Zc,{toast:sa}),It]})}const wp=20,Sp=m1,kd=e=>e?new Date(e).toLocaleDateString("id-ID",{day:"numeric",month:"short",year:"numeric"}):"—";function KN({projectId:e}){const[a,n]=c.useState(null),[i,r]=c.useState(0),[s,o]=c.useState(null),[l,d]=c.useState(1),[u,m]=c.useState(null),[h,p]=c.useState(""),[g,f]=c.useState(null),b=c.useCallback(()=>{$l.listSessions(e,{page:l,limit:wp}).then(T=>{n(T.items),r(T.total),o(T.kuota)}).catch(()=>{n([]),r(0),o(null)})},[e,l]);c.useEffect(()=>{m(null),b()},[b]),c.useEffect(()=>{d(1)},[e]);const v=T=>{f(null),p(""),$l.getSession(T).then(m).catch(()=>m(null))},x=async()=>{if(!(!u||!h.trim()))try{const T=await $l.materializePrd(u.id,h.trim());f(`PRD tersimpan di ${T.path}. Ia BELUM jadi backlog — eskalasi tetap keputusan Anda.`),b()}catch(T){f(T instanceof Error?T.message:"gagal menulis PRD")}};if(a===null)return t.jsx(pe,{kind:"loading",title:"Memuat obrolan…"});const y=Cs(i,l,wp);return t.jsxs("div",{className:"hn-pc",children:[s&&t.jsxs("div",{"data-testid":"portal-chat-kuota",className:"hn-pc-kuota",children:["Jatah bulan ini — Brainstorming ",t.jsxs("b",{children:[s.brainstorm.terpakai," / ",s.brainstorm.jatah]})," · ","Bertanya ",t.jsxs("b",{children:[s.tanya.terpakai," / ",s.tanya.jatah]})," · ","reset ",kd(s.resetPada),!s.enabled&&" · obrolan portal sedang MATI di Settings"]}),a.length===0?t.jsx(pe,{kind:"empty",icon:"messages-square",title:"Belum ada obrolan",hint:"Begitu klien memulai obrolan di portal, sesinya muncul di sini."}):t.jsxs(t.Fragment,{children:[t.jsx(Sa,{padding:0,children:a.map(T=>t.jsxs("button",{type:"button","data-testid":`portal-chat-row-${T.id}`,onClick:()=>v(T.id),className:"hn-pc-row",children:[t.jsx("span",{className:"hn-pc-type",children:Sp[T.type]??T.type}),t.jsx("span",{className:"hn-pc-summary",children:T.summary||"Belum ada ringkasan"}),T.prdSiap&&t.jsx(bt,{status:T.prdDocPath?"ok":"warn",size:"sm",children:T.prdDocPath?"PRD dokumen":"PRD draft"}),t.jsx("span",{className:"hn-pc-meta",children:T.clientEmail}),t.jsx("span",{className:"hn-pc-meta",children:kd(T.createdAt)})]},T.id))}),t.jsx(Ps,{page:y.page,pageCount:y.pageCount,total:i,from:y.from,to:y.to,onPage:d,unit:"obrolan"})]}),u&&t.jsxs(Sa,{eyebrow:`${Sp[u.type]??u.type} · ${u.clientEmail}`,title:u.summary||"Obrolan",children:[t.jsx("div",{"data-testid":"portal-chat-transkrip",className:"hn-pc-transcript",children:u.messages.map(T=>t.jsxs("div",{className:"hn-pc-msg","data-role":T.role,"data-blocked":T.blocked?"true":"false",children:[t.jsxs("div",{className:"hn-pc-msg-meta",children:[T.role==="klien"?"Klien":"hanoman"," · ",kd(T.createdAt)]}),t.jsx("div",{className:"hn-pc-msg-text",children:T.text}),T.blocked&&t.jsxs("div",{className:"hn-pc-blocked",children:[t.jsx("b",{children:"Diblokir"})," (",(T.blockReasons??[]).join(", "),") — teks asli agen:",t.jsx("div",{className:"hn-pc-raw",children:T.rawText})]})]},T.id))}),u.prdMarkdown&&t.jsxs(t.Fragment,{children:[t.jsx("div",{"data-testid":"portal-chat-prd",className:"hn-pc-prd",children:t.jsx(Ms,{text:u.prdMarkdown,name:"prd-draft.md"})}),t.jsxs("div",{className:"hn-pc-prd-actions",children:[t.jsx(Oe,{"data-testid":"portal-chat-slug","aria-label":"Slug dokumen PRD",placeholder:"nama-dokumen",value:h,className:"hn-pc-slug",onChange:T=>p(T.target.value)}),t.jsx(U,{"data-testid":"portal-chat-jadikan-prd",disabled:!h.trim(),onClick:()=>void x(),children:"Jadikan dokumen PRD"}),t.jsxs("span",{className:"hn-pc-meta",children:["Menyimpan ke ",t.jsx("code",{children:"docs/prd/"}),". Tidak membuat backlog."]})]})]}),g&&t.jsx("p",{className:"hn-pc-note",children:g})]})]})}function Hf({projects:e,defaultProject:a,onClose:n,onCreate:i,prefill:r,lockProject:s}){var f;const[o,l]=c.useState(a||((f=e[0])==null?void 0:f.id)||""),[d,u]=c.useState({title:(r==null?void 0:r.title)??"",context:(r==null?void 0:r.context)??"",outcome:(r==null?void 0:r.outcome)??"",constraints:(r==null?void 0:r.constraints)??""}),m=b=>v=>u(x=>({...x,[b]:v.target.value})),h=!!d.title.trim()&&!!o,p=()=>{h&&i(o,{title:d.title.trim(),context:d.context,outcome:d.outcome,constraints:d.constraints||void 0})},g=t.jsx("span",{"aria-hidden":"true",className:"hn-prj-required",children:"*"});return t.jsxs(ca,{open:!0,onClose:n,icon:"scroll-text",eyebrow:"PM → hanoman",title:"PRD baru",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",size:"sm",onClick:n,children:"Batal"}),t.jsx(U,{size:"sm",leftIcon:"messages-square",onClick:p,disabled:!h,children:"Buat brief → brainstorm PRD"})]}),children:[t.jsxs("p",{className:"hn-prj-note",children:["hanoman membuka sesi brainstorm interaktif di terminal, lalu menulis dokumen PRD ke ",t.jsx("code",{children:"docs/prd/"}),"."]}),t.jsxs("p",{className:"hn-prj-note",children:[t.jsx("span",{"aria-hidden":"true",className:"hn-prj-required",children:"*"})," wajib diisi"]}),t.jsx(de,{label:t.jsxs(t.Fragment,{children:["Project",g]}),hint:"Tujuan penulisan docs/prd/ — pilih di sini, tak perlu memfilter daftar dulu",children:t.jsx(Be,{"aria-label":"Project untuk PRD baru",value:o,disabled:s,onChange:b=>l(b.target.value),className:"hn-prj-full",options:e.map(b=>({value:b.id,label:b.name}))})}),t.jsx(de,{label:t.jsxs(t.Fragment,{children:["Judul",g]}),hint:d.title.trim()?void 0:"Wajib diisi — tanpa judul, brief tak bisa dibuat.",children:t.jsx(Oe,{value:d.title,onChange:m("title"),placeholder:"mis. Jadwal Invoice Berulang",className:"hn-prj-full"})}),t.jsx(de,{label:"Konteks",hint:"Latar belakang & alasan fitur ini dibutuhkan",children:t.jsx(La,{value:d.context,onChange:m("context"),rows:3,placeholder:"mis. operator harus membuka tiga layar untuk tahu sesi mana yang menunggu"})}),t.jsx(de,{label:"Hasil yang diharapkan",children:t.jsx(La,{value:d.outcome,onChange:m("outcome"),rows:2,placeholder:"mis. satu badge di Overview menunjukkan jumlah sesi yang menunggu"})}),t.jsx(de,{label:"Batasan",hint:"opsional",children:t.jsx(Oe,{value:d.constraints,onChange:m("constraints"),placeholder:"mis. reuse queue yang ada",className:"hn-prj-full"})})]})}const WN={draft:"neutral",dieskalasi:"info",terwujud:"ok"};function VN({prd:e}){const a=Ud[e.status]??e.status;return t.jsx(la,{tone:WN[e.status],size:"sm",children:e.specCount>0?`${a} ${e.doneCount}/${e.specCount}`:a})}function YN({open:e,onClose:a,prd:n,takeBase:i,items:r,include:s,setInclude:o,busy:l,onTake:d,onStartBreakdown:u,onMaterialize:m,projectId:h}){const p=r.filter((g,f)=>s[f]).length;return t.jsxs(ca,{open:e,onClose:a,icon:"list-checks",width:600,eyebrow:"PRD → backlog",title:"Jadikan backlog",footer:t.jsx(U,{variant:"ghost",size:"sm",onClick:a,children:"Batal"}),children:[t.jsxs("p",{className:"hn-prj-note",children:["Pilih bentuk backlog untuk ",t.jsx("b",{children:n.title}),". Manusia yang memutuskan."]}),t.jsxs("div",{className:"hn-prj-sheet-options",children:[t.jsxs("div",{className:"hn-prj-sheet-option",children:[t.jsx(U,{leftIcon:"lightbulb",onClick:()=>{a(),d({...i,kind:"brief",context:`Dari PRD: ${n.path}`,outcome:""})},children:"Sebagai feature brief"}),t.jsx("p",{className:"hn-prj-hint",children:"Sesi menjalankan pipeline penuh: brainstorm → objective → spec → plan → execute."})]}),t.jsxs("div",{className:"hn-prj-sheet-option",children:[t.jsx(U,{leftIcon:"target",variant:"secondary",onClick:()=>{a(),d({...i,kind:"goal",context:"",outcome:"",goal:`Wujudkan PRD ${n.path}`})},children:"Sebagai goal"}),t.jsx("p",{className:"hn-prj-hint",children:"Sesi dua fase (Goal → Verifikasi) yang langsung mengejar goal-nya, tanpa brainstorm, spec, maupun plan. Mode goal selalu aktif."})]}),t.jsx("div",{className:"hn-prj-sheet-option",children:r.length>0?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"hn-prj-sheet-head",children:[t.jsxs("span",{className:"hn-prj-sheet-title",children:["Breakdown · ",r.length," item"]}),t.jsxs("span",{className:"hn-prj-hint",children:[p,"/",r.length," dipilih"]})]}),t.jsx("ul",{className:"hn-prj-checklist",children:r.map((g,f)=>t.jsx("li",{children:t.jsxs("label",{className:"hn-prj-check",children:[t.jsx("input",{type:"checkbox",checked:s[f]??!1,className:"hn-prj-check-input",onChange:b=>o(v=>v.map((x,y)=>y===f?b.target.checked:x))}),t.jsxs("span",{className:"hn-prj-check-text",children:[t.jsxs("span",{className:"hn-prj-check-title",children:[g.title," ",t.jsx(la,{tone:"brass",size:"sm",children:g.priority})]}),g.outcome&&t.jsx("span",{className:"hn-prj-hint",children:g.outcome})]})]})},f))}),t.jsx(U,{size:"sm",leftIcon:"plus",disabled:!p||l,onClick:m,children:l?"Membuat…":`Buat ${p} backlog`})]}):t.jsxs(t.Fragment,{children:[t.jsx(U,{leftIcon:"split",variant:"secondary",onClick:()=>{a(),u(h,n.path)},children:"Breakdown ke backlog"}),t.jsx("p",{className:"hn-prj-hint",children:"Mulai sesi breakdown yang menulis usulan backlog paralel dari PRD ini."})]})})]})]})}function JN({prd:e,projectId:a,dataVersion:n,onTake:i,onStartBreakdown:r,onMaterialize:s}){const[o,l]=c.useState(null),[d,u]=c.useState(""),[m,h]=c.useState(0),[p,g]=c.useState([]),[f,b]=c.useState([]),[v,x]=c.useState(""),[y,T]=c.useState(0),[S,E]=c.useState(!1),[w,M]=c.useState(!1);c.useEffect(()=>{let L=!0;return l(null),u(""),se.getPrd(a,e.path).then(A=>{L&&l(A.content)}).catch(A=>{L&&u(Ts(A,"tidak diketahui"))}),()=>{L=!1}},[a,e.path,m]),c.useEffect(()=>{let L=!0;return se.getBreakdown(a,e.path).then(A=>{L&&(g(A.items),b(A.items.map(()=>!0)),x(""))}).catch(A=>{if(L){if((A==null?void 0:A.status)===404){g([]),b([]),x("");return}x(Ts(A,"tidak diketahui"))}}),()=>{L=!1}},[a,e.path,n,y]);const N={project:a,title:e.title,prdPath:e.path,branchFrom:lC(e.path)},R=p.filter((L,A)=>f[A]),I=async()=>{if(R.length){E(!0);try{await s(a,e.path,R),M(!1)}finally{E(!1)}}};return t.jsxs("div",{className:"hn-prd-pane",children:[t.jsxs("div",{className:"hn-prd-actionbar",role:"toolbar","aria-label":"Aksi PRD",children:[t.jsx("span",{className:"hn-prd-actionbar-title",children:e.title}),t.jsx(U,{size:"sm",leftIcon:"list-checks",onClick:()=>M(!0),children:"Jadikan backlog"}),t.jsx(an,{label:"Aksi lain PRD",icon:"ellipsis",items:[],children:t.jsx(cb,{href:L=>se.prdDownloadUrl(a,e.path,L),disabled:o===null})})]}),t.jsxs("div",{className:"hn-prd-read",children:[t.jsxs("header",{className:"hn-prd-head",children:[t.jsx("div",{className:"hn-prj-mono hn-prd-path",children:e.path}),t.jsxs("div",{className:"hn-prd-head-row",children:[t.jsx("h2",{className:"hn-prd-title",children:e.title}),t.jsx(VN,{prd:e})]})]}),v&&t.jsxs("div",{role:"alert",className:"hn-prj-stale",children:[t.jsxs("span",{className:"hn-prj-stale-text",children:["Usulan breakdown gagal dimuat: ",v]}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"rotate-ccw",onClick:()=>T(L=>L+1),children:"Coba lagi"})]}),p.length>0&&t.jsxs("details",{className:"hn-prd-breakdown",children:[t.jsxs("summary",{className:"hn-prd-breakdown-summary",children:["Usulan breakdown · ",p.length," item"]}),t.jsx("ul",{className:"hn-prd-breakdown-list",children:p.map((L,A)=>t.jsxs("li",{children:[t.jsx("span",{className:"hn-prd-breakdown-item",children:L.title}),t.jsx(la,{tone:"brass",size:"sm",children:L.priority})]},A))}),t.jsx("p",{className:"hn-prj-hint",children:"Pilih item yang dibuat lewat “Jadikan backlog”."})]}),d?t.jsx(pe,{kind:"error",title:"Gagal memuat isi PRD",hint:d,action:()=>h(L=>L+1)}):o===null?t.jsx(pe,{kind:"loading",title:"Memuat PRD…"}):t.jsx("div",{className:"hn-prd-doc",children:t.jsx(Ms,{text:o,name:e.name})})]}),t.jsx(YN,{open:w,onClose:()=>M(!1),prd:e,takeBase:N,items:p,include:f,setInclude:b,busy:S,onTake:i,onStartBreakdown:r,onMaterialize:()=>{I()},projectId:a})]})}function QN(e){const a=[],n=new Map;for(const i of e){let r=n.get(i.projectId);r||(r={projectId:i.projectId,projectName:i.projectName,items:[]},n.set(i.projectId,r),a.push(i.projectId)),r.items.push(i)}return a.map(i=>n.get(i))}function ZN({prd:e,active:a,showProject:n,onSelect:i}){return t.jsxs("button",{type:"button",onClick:i,"aria-current":a?"true":void 0,className:`hn-prd-item${a?" is-active":""}`,children:[t.jsxs("span",{className:"hn-prd-item-head",children:[t.jsx(Re,{name:"scroll-text",size:13,color:a?"var(--brass-700)":"var(--brass-500)"}),t.jsx("span",{className:"hn-prd-item-title",children:e.title}),e.live&&t.jsx(la,{tone:"brass",size:"sm",children:"sesi hidup"})]}),t.jsxs("span",{className:"hn-prd-item-meta",children:[n&&t.jsxs("span",{children:[e.projectName," · "]}),e.specCount>0&&t.jsxs("span",{children:[e.doneCount,"/",e.specCount," item selesai · "]}),t.jsx("span",{className:"hn-prj-mono",children:e.path})]})]})}function XN({projects:e,projectFilter:a,onProjectFilter:n,onNewPrd:i,onTakeToBacklog:r,onStartBreakdown:s,onMaterialize:o,dataVersion:l}){const[d,u]=c.useState([]),[m,h]=c.useState("loading"),[p,g]=c.useState(""),[f,b]=c.useState(0),[v,x]=Oa("prd","sel",null,Qk),[y,T]=c.useState("list"),S=c.useMemo(()=>d.find(q=>q.slug===v)??null,[d,v]),E=c.useCallback(q=>x(q?q.slug:null),[x]),[w,M]=c.useState(!1),N=a==="all",R=N?"":a,I=c.useRef(null);c.useEffect(()=>{I.current!==null&&I.current!==a&&E(null),I.current=a},[a,E]),c.useEffect(()=>{let q=!0;return(N?se.listAllPrds():R?se.listPrds(R):Promise.resolve({items:[]})).then(te=>{q&&(u(te.items),h("ready"),g(""))}).catch(te=>{q&&(h("error"),g(Ts(te,"tidak diketahui")))}),()=>{q=!1}},[a,l,f]);const[L,A]=c.useState(!1),B=S?S.projectId||R:"",G=[{value:"all",label:"Semua project"}].concat(e.map(q=>({value:q.id,label:q.name}))),H=[...Cd],Y=[...Cd.map(q=>({status:q,label:ri(Ud,q),items:d.filter(ie=>ie.status===q)})),...Array.from(new Set(d.map(q=>q.status).filter(q=>!H.includes(q)))).map(q=>({status:q,label:ri(Ud,q),items:d.filter(ie=>ie.status===q)}))],X=m==="loading"&&d.length===0?t.jsx(pe,{kind:"loading",compact:!0,title:"Memuat daftar PRD…"}):m==="error"&&d.length===0?t.jsx(pe,{kind:"error",compact:!0,title:"Gagal memuat daftar PRD",hint:p,action:()=>b(q=>q+1)}):d.length===0?t.jsx(pe,{kind:"empty",icon:"scroll-text",title:"Belum ada PRD",hint:"Buat PRD dari brief + brainstorm; hanoman menulisnya ke docs/prd/ lalu bisa di-take jadi backlog.",action:()=>M(!0),actionLabel:"PRD baru"}):t.jsxs(t.Fragment,{children:[m==="error"&&t.jsxs("div",{role:"alert",className:"hn-prj-stale hn-prd-stale",children:[t.jsx("span",{className:"hn-prj-stale-text",children:"Gagal memuat ulang — daftar dari muatan terakhir."}),t.jsx(U,{size:"sm",variant:"secondary",onClick:()=>b(q=>q+1),children:"Coba lagi"})]}),Y.filter(q=>q.items.length>0).map(q=>t.jsxs("details",{open:!0,className:"hn-prd-group",children:[t.jsxs("summary",{className:"hn-prd-group-summary",children:[q.label,t.jsx("span",{className:"hn-prj-chip-count",children:q.items.length})]}),QN(q.items).map(ie=>t.jsxs("div",{className:"hn-prd-group-body",children:[N&&t.jsx("div",{className:"hn-eyebrow hn-prd-project-label",children:ie.projectName}),ie.items.map(te=>t.jsx(ZN,{prd:te,showProject:!1,active:(S==null?void 0:S.path)===te.path&&(S==null?void 0:S.projectId)===te.projectId,onSelect:()=>{E(te),T("detail")}},`${te.projectId}:${te.path}`))]},ie.projectId))]},q.status))]});return t.jsxs("div",{style:$k,children:[t.jsxs("div",{style:Io,className:"hn-prd-toolbar",children:[t.jsx(Be,{size:"sm",value:a,"aria-label":"Project",onChange:q=>n(q.target.value),options:G}),t.jsx(AE,{screen:"prd",active:N?0:1}),t.jsx("span",{className:"hn-prd-toolbar-spacer"}),!N&&t.jsx(U,{size:"sm",variant:L?"primary":"ghost",leftIcon:"messages-square","aria-expanded":L,onClick:()=>A(q=>!q),children:"Draft dari portal klien"}),t.jsx(U,{size:"sm",leftIcon:"plus",onClick:()=>M(!0),children:"PRD baru"})]}),L&&!N&&t.jsx("div",{style:Io,className:"hn-prd-portal",children:t.jsx(KN,{projectId:a})}),t.jsx(dl,{ariaLabel:"Panel PRD",active:y,onActiveChange:q=>T(q),masterWidth:288,panels:[{id:"list",label:"Indeks",className:"hn-panel-flex",content:t.jsx("aside",{"aria-label":"Indeks PRD",className:"hn-prd-index",children:X})},{id:"detail",label:"Isi",className:"hn-panel-flex",content:t.jsx("section",{"aria-label":"Isi PRD",className:"hn-prd-detail",children:S?t.jsx(JN,{prd:S,projectId:B,dataVersion:l,onTake:q=>r(q),onStartBreakdown:s,onMaterialize:o}):t.jsx(pe,{kind:"empty",icon:"scroll-text",title:"Pilih PRD",hint:"Klik dokumen di indeks kiri untuk membacanya, lalu jadikan backlog."})})}]}),w&&t.jsx(Hf,{projects:e,defaultProject:R,onClose:()=>M(!1),onCreate:(q,ie)=>{M(!1),i(q,ie)}})]})}const _p=5e3,eR=12e3,aR=5*6e4,tR=new Set(["shipped","docs-updated","waiting","offline"]),nR={shipped:"selesai","docs-updated":"dokumen terbit",waiting:"butuh jawabanmu"},iR={shipped:"kabar","docs-updated":"dokumen",waiting:"sesi"},qf=(e,a)=>e.kind==="waiting"&&e.since!==null&&a-e.since>=Xd;function sR(e){const a=Math.floor(e/6e4);if(a<1)return`${Math.max(0,Math.floor(e/1e3))} detik`;if(a<60)return`${a} menit`;const n=Math.floor(a/60),i=a%60;return i>0?`${n} jam ${i} menit`:`${n} jam`}function rR(e,a){if(!tR.has(e.kind))return null;if(e.kind==="offline")return{kind:"pose",text:"Aku kehilangan sambungan",ttl:_p};let n=`${e.subject??"Backlog"} ${nR[e.kind]}`;return e.count>1&&(n+=` · ${e.count} ${iR[e.kind]}`),qf(e,a)&&(n+=` — ${sR(a-e.since)}`),{kind:"pose",text:n,ttl:_p}}function Uf(e){const a=hl(e.backlog),n={};for(const i of e.sessions){const r=Cr(i,a);r&&(n[i.id]=r)}return{at:e.now,sessions:n,notifiedAt:bb(e.notifications)}}function oR(e,a){const n=Uf(a),i=d=>Object.entries(n.sessions).filter(([u,m])=>m===d&&e.sessions[u]!==d).length,r=a.notifications.filter(d=>gb.has(d.type)&&d.createdAt>e.notifiedAt).length,s=i("waiting"),o=i("failed"),l=[r>0?`${r} selesai`:"",s>0?`${s} menunggu`:"",o>0?`${o} gagal`:""].filter(Boolean);return l.length>0?{kind:"recap",text:l.join(" · "),ttl:eR}:null}const lR="PET-001",dR=2,cR={w:192,h:208},uR=8,mR={x:.62,baseline:202},hR={h:168},pR=[{key:"idle",fps:6,loop:!0},{key:"walk-right",fps:10,loop:!0,dir:"right"},{key:"walk-left",fps:10,loop:!0,dir:"left"},{key:"working",fps:8,loop:!0},{key:"waiting",fps:6,loop:!0},{key:"blocked",fps:4,loop:!0},{key:"review",fps:6,loop:!0},{key:"shipped",fps:10,loop:!1,then:"idle"},{key:"docs-updated",fps:6,loop:!0},{key:"wave",fps:10,loop:!1,then:"idle"},{key:"deciding",fps:6,loop:!0},{key:"sleep",fps:4,loop:!0},{key:"thanks",fps:10,loop:!1,then:"idle"},{key:"held",fps:8,loop:!0},{key:"falling",fps:8,loop:!0},{key:"dizzy",fps:8,loop:!1,then:"idle"}],gR={idle:"4a0f06cacdad0fa8e0b0a369628e383fc2cb54cbdd5297285c88d1a33bd686ac","walk-right":"7bdfb2786b2b1c899fb7b170ce2cf5d1e3a922e251cbaca9600c210262629a52","walk-left":"c53c6f7b980d4179b45d55160145df73eb629ccbb809ce2b19946045e388ce60",working:"2ec0d0d4565eced3c55c32603c2b1c6fe9ff93f13f2a1061bc7d2e8d8864aa6f",waiting:"8bb1595bf280040e101949392c1048330c19142d7b5a1d6b74918734f72287e3",blocked:"134f48c60fa6fef038da266be7fb2a69755ecb9123d23dc4e270b14d7d077da6",review:"77c865ff6d49a8bbf3db4e0d7b91ce4663a1e3acef5d072ddd65eac9479b232c",shipped:"d32653efa6a64eb4d00fb63a6e8c0a7dc24de63ecd5a6cfda36f32b584de00b8","docs-updated":"2b3a01ddd640efd6e65d61c6ad4980da3a9fbceff251f1b42ce13389c02bb19c",wave:"4153420063211e6d196219b89c572f43f96ec32f28c63a1159e6d98630e0ed73",deciding:"6309ab706c8430cf97b187f353fd2d447ba729f6e0764efef1b75a3c96168984",sleep:"40f1fd6e27ddddb13a5702c05a03f5e015e44e7e77e96c4e1ed52a5d7741f2ec",thanks:"0f59f2c042b25ff47a7022d4452bf0dc433dcea796d90bf47d95a5c8ca359d8d",held:"8de04ba258b30acb105a27a81ed400b66f3b68953042957a75e63ebe8efe7c89",falling:"8bc3429c44ef4ba257da895080fa6458c3a66e51cebe103e09cd8bac25be5363",dizzy:"3e8c2072e2aa652e204e3c6b041cb6c9487d8dca1649b52f9695600880a94e49"},kR={id:lR,version:dR,cell:cR,columns:uR,anchor:mR,character:hR,rows:pR,sources:gR},bR="/assets/hnm-pet-anoman-atlas-v02-ClJhW17L.webp",dr=["idle","walk-right","walk-left","working","waiting","blocked","review","shipped","docs-updated","wave","deciding","sleep","thanks","held","falling","dizzy"],fR=e=>typeof e=="string"&&dr.includes(e),fi=e=>typeof e=="number"&&Number.isInteger(e)&&e>0,ns=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);function yR(e){const a=h=>{throw new Error(`pet.json tidak sah: ${h}`)};if(!ns(e))return a("bukan objek");const{id:n,version:i,cell:r,columns:s,anchor:o,character:l,rows:d,sources:u}=e;if(typeof n!="string"||!n)return a("id");if(!fi(i))return a("version");if(!ns(r)||!fi(r.w)||!fi(r.h))return a("cell");if(!fi(s))return a("columns");if(!ns(o)||typeof o.x!="number"||!(o.x>0&&o.x<1)||!fi(o.baseline)||o.baseline>r.h)return a("anchor");if(!ns(l)||!fi(l.h)||l.h>r.h)return a("character");if(!Array.isArray(d)||d.length!==dr.length)return a(`rows: butuh ${dr.length} baris`);const m=d.map((h,p)=>{const g=dr[p];if(!ns(h)||h.key!==g)return a(`rows[${p}]: harus "${g}"`);if(!fi(h.fps))return a(`rows[${p}].fps`);if(typeof h.loop!="boolean")return a(`rows[${p}].loop`);const f={key:g,fps:h.fps,loop:h.loop};if(h.then!==void 0){if(!fR(h.then)||h.loop)return a(`rows[${p}].then hanya untuk baris loop:false`);f.then=h.then}else if(!h.loop)return a(`rows[${p}] loop:false tanpa then`);if(h.dir!==void 0){if(h.dir!=="right"&&h.dir!=="left")return a(`rows[${p}].dir`);f.dir=h.dir}return f});return!ns(u)||dr.some(h=>typeof u[h]!="string")?a("sources"):{id:n,version:i,cell:{w:r.w,h:r.h},columns:s,anchor:{x:o.x,baseline:o.baseline},character:{h:l.h},rows:m,sources:u}}const Pr=yR(kR),vR=bR,Wo={ready:"idle",sleeping:"sleep",offline:"idle",working:"working",deciding:"deciding",waiting:"waiting",blocked:"blocked",review:"review",shipped:"shipped","docs-updated":"docs-updated"};function Eu(e,a=Pr){const n=a.rows.find(i=>i.key===e);if(!n)throw new Error(`baris ${e} tak ada di manifest`);return n}const xR=(e,a=Pr)=>a.rows.findIndex(n=>n.key===e),zf=(e,a=Pr)=>Math.round(a.columns/Eu(e,a).fps*1e3),jR=(e,a=Pr)=>Eu(e,a).then??null,Ap=40,pr=[1200,4500],wR=[5e3,14e3],gc=16,Tp=24,SR=240,_R=220,AR=new Set(["waiting","blocked"]),TR=new Set(["offline","sleeping"]),ro=(e,[a,n])=>a+e()*(n-a),bd=e=>e==="right"?"walk-right":"walk-left",Cu=(e,a)=>Math.max(gc,e-a-gc),ni=(e,a,n)=>Math.min(Math.max(e,gc),Cu(a,n)),Ff=(e,a,n)=>Math.min(Math.max(e,0),Math.max(0,a-n)),Ep=e=>e==="held"||e==="falling"||e==="dizzy",ER=e=>!e.roam||e.reduced||e.tier==="mobile";function Cp(e,a,n){return{x:Cu(e,a),y:0,facing:"right",mode:"stand",until:n+pr[0],parkedX:null}}function CR(e,a){const{now:n,laneWidth:i,petWidth:r,pose:s}=a,o=ni(a.currentX,i,r);return{state:{x:o,y:0,facing:e.facing,mode:"stand",until:n+pr[0],parkedX:e.parkedX===null?null:ni(e.parkedX,i,r)},row:Wo[s],move:{x:o,y:0,durationMs:0,ease:"linear"}}}const PR=(e,a,n,i,r)=>({...e,x:ni(e.x,a,i),y:Ff(e.y,n,r)});function MR(e,a,n){const{now:i,laneWidth:r,laneHeight:s,petWidth:o,petHeight:l,pose:d}=a,u=Cu(r,o),m=Wo[d],h=ni(a.currentX,r,o),p=e.mode==="walk"||e.mode==="home",g=e.mode==="dizzy",f=(E,w,M=e.facing)=>({x:E,y:0,facing:M,mode:"stand",until:w,parkedX:e.parkedX}),b=E=>p||Math.abs(h-E)>.5?{x:E,y:0,durationMs:0,ease:"linear"}:null,v=(E,w)=>{const M=Math.round(Math.abs(E-h)/Ap*1e3),N=E>=h?"right":"left";return{state:{x:E,y:0,facing:N,mode:w,until:i+M,parkedX:e.parkedX},row:bd(N),move:{x:E,y:0,durationMs:M,ease:"linear"}}},x=E=>{const w={x:E,y:0,durationMs:0,ease:"linear"};return a.reduced?{state:{...f(E,1/0),parkedX:E},row:m,move:w}:{state:{x:E,y:0,facing:e.facing,mode:"dizzy",until:i+zf("dizzy"),parkedX:E},row:"dizzy",move:w}};if(a.dragging){const E=ni(a.pointerX,r,o),w=Ff(a.pointerY,s,l);return{state:{x:E,y:w,facing:e.facing,mode:"held",until:1/0,parkedX:e.parkedX},row:"held",move:{x:E,y:w,durationMs:0,ease:"linear"}}}if(e.mode==="held"){if(a.reduced||e.y===0)return x(e.x);const E=Math.max(_R,Math.round(e.y/SR*1e3));return{state:{x:e.x,y:0,facing:e.facing,mode:"falling",until:i+E,parkedX:e.x},row:"falling",move:{x:e.x,y:0,durationMs:E,ease:"fall"}}}if(e.mode==="falling")return i<e.until?{state:e,row:"falling",move:null}:x(e.x);if(e.mode==="dizzy"&&i<e.until)return{state:e,row:"dizzy",move:null};if(ER(a)){const E=ni(e.parkedX??u,r,o);return{state:f(E,1/0,"right"),row:m,move:b(E)}}if(a.hovered||a.panelOpen||a.documentHidden)return{state:f(h,1/0),row:m,move:b(h)};if(TR.has(d))return{state:f(h,1/0),row:m,move:b(h)};if(AR.has(d))return Math.abs(h-u)>1?e.mode==="home"&&i<e.until?{state:e,row:bd(e.facing),move:null}:v(u,"home"):{state:f(u,1/0,"right"),row:m,move:b(u)};if(d==="shipped")return{state:f(h,1/0),row:m,move:b(h)};if(p)return i<e.until?{state:e,row:bd(e.facing),move:null}:{state:f(e.x,i+ro(n,pr)),row:m,move:null};if(g||e.until===1/0)return{state:f(h,i+ro(n,pr)),row:m,move:null};if(i<e.until)return{state:e,row:m,move:null};const y=ro(n,wR)*Ap/1e3;let T=n()<.5?-1:1,S=ni(h+T*y,r,o);return Math.abs(S-h)<Tp&&(T=-T,S=ni(h+T*y,r,o)),Math.abs(S-h)<Tp?{state:f(h,i+ro(n,pr)),row:m,move:null}:v(S,"walk")}const Bn={loading:"Membaca layar sesi…",none:"Pertanyaannya tak terbaca dari sini — buka Terminal untuk menjawabnya.",stale:"Layarnya sudah berubah — pertanyaannya dimuat ulang.",deciding:"hanoman-lead sedang menyusun keputusan untuk sesi ini.",failed:"Jawaban tak terkirim. Buka Terminal untuk menjawabnya.",answering:"hanoman-lead sudah mengirim jawabannya ke pane — terlambat mengambil alih.",taken:"Kamu mengambil alih sesi ini. hanoman-lead berhenti menjawabnya.",preparing:"Kotak jawabnya sedang disiapkan — dialognya belum tergambar di pane."},IR={queued:"hanoman-lead mengantre untuk sesi ini",deciding:"hanoman-lead sedang menyusun keputusan",answered:"hanoman-lead sudah menjawab","taken-over":"Kamu yang menjawab sesi ini",failed:"hanoman-lead tak sanggup menjawab sesi ini"},Pp=e=>{var a;return e instanceof ba?(a=e.detail)==null?void 0:a.reason:void 0};function Mp({sessionId:e,label:a,reduced:n,ask:i}){const[r,s]=c.useState(void 0),[o,l]=c.useState([]),[d,u]=c.useState(""),[m,h]=c.useState(!1),[p,g]=c.useState(!1),[f,b]=c.useState(null),[v,x]=c.useState(0);c.useEffect(()=>{let I=!0;return s(void 0),se.sessionDialog(e).then(L=>{I&&(s(L),l(L?L.dialog.options.filter(A=>A.checked).map(A=>A.n):[]))}).catch(()=>{I&&s(null)}),()=>{I=!1}},[e,v]);async function y(){if(!m){h(!0),b(null);try{await se.takeoverSessionDialog(e),b(Bn.taken),x(I=>I+1)}catch(I){b(Pp(I)==="answering"?Bn.answering:Bn.failed)}finally{h(!1)}}}async function T(I){if(!(!r||m)){h(!0),b(null);try{await se.answerSessionDialog(e,{screenHash:r.screenHash,...I}),g(!0)}catch(L){const A=Pp(L);A==="stale"?(b(Bn.stale),x(B=>B+1)):b(A==="deciding"?Bn.deciding:Bn.failed)}finally{h(!1)}}}const S=n?{transition:"none",transform:"none"}:void 0,E=I=>t.jsx("div",{"data-testid":"pet-answer-note",className:"hn-pet-note",children:I});if(p)return t.jsx("div",{className:"hn-pet-box",children:t.jsxs("div",{"data-testid":"pet-answer-sent",className:"hn-pet-sent",children:["Terkirim — menunggu ",a," bergerak"]})});const w=i==null?void 0:i.questions[Math.min(i.at,Math.max(0,i.questions.length-1))],M=i?t.jsxs("div",{className:"hn-pet-head",children:[t.jsx("div",{"data-testid":"pet-answer-lead-state",className:"hn-eyebrow",children:IR[i.state]}),i.total>1&&t.jsxs("div",{className:"hn-eyebrow hn-pet-eyebrow-top",children:["Pertanyaan ",Math.min(i.at+1,i.total)," dari ",i.total]}),i.source==="turn-end"&&t.jsx("div",{"data-testid":"pet-answer-source",className:"hn-eyebrow hn-pet-eyebrow-top",children:"Giliran terakhir sesi"}),((w==null?void 0:w.question)||i.message)&&t.jsx("div",{className:"hn-pet-question",children:(w==null?void 0:w.question)||i.message}),i.state!=="taken-over"&&t.jsx("div",{className:"hn-pet-mt-6",children:t.jsx(U,{"data-testid":"pet-answer-takeover",size:"sm",variant:"ghost",disabled:m,style:S,onClick:()=>{y()},children:"Ambil alih"})})]}):null;if(r===void 0)return t.jsxs("div",{className:"hn-pet-box",children:[M,E(Bn.loading)]});if(r===null)return t.jsxs("div",{className:"hn-pet-box",children:[M,E(f??(i?Bn.preparing:Bn.none))]});const{dialog:N}=r,R=N.tabs.filter(I=>I.answered).length;return t.jsxs("div",{"data-testid":"pet-answer","data-session":e,className:"hn-pet-box",children:[M,!i&&N.tabs.length>1&&t.jsxs("div",{className:"hn-eyebrow hn-pet-eyebrow-bottom",children:["Pertanyaan ",Math.min(R+1,N.tabs.length)," dari ",N.tabs.length]}),!i&&N.title&&t.jsx("div",{className:"hn-pet-title",children:N.title}),N.multi?t.jsx("div",{className:"hn-pet-stack",children:N.options.map(I=>t.jsx(As,{label:I.label,checked:o.includes(I.n),disabled:m,onChange:L=>l(A=>(L?[...A,I.n]:A.filter(B=>B!==I.n)).sort((B,G)=>B-G))},I.n))}):t.jsx("div",{className:"hn-pet-wrap",children:N.options.map(I=>t.jsx(U,{"data-testid":"pet-answer-option",size:"sm",variant:"ghost",disabled:m,style:S,onClick:()=>{T({choice:I.n})},children:I.label},I.n))}),(N.freeIndex!==null||N.notes)&&t.jsxs("div",{className:"hn-pet-free",children:[t.jsx(Oe,{"data-testid":"pet-answer-text",size:"sm",value:d,disabled:m,placeholder:"Jawab dengan kalimatmu sendiri",className:"hn-grow-min",onChange:I=>u(I.target.value)}),!N.multi&&t.jsx(U,{size:"sm",variant:"ghost",disabled:m||!d.trim(),style:S,onClick:()=>{T({text:d.trim()})},children:"Kirim"})]}),N.multi&&t.jsx("div",{className:"hn-pet-mt-8",children:t.jsx(U,{"data-testid":"pet-answer-submit",size:"sm",variant:"primary",disabled:m,style:S,onClick:()=>{T({choices:o,...d.trim()?{text:d.trim()}:{}})},children:"Submit"})}),f&&t.jsx("div",{className:"hn-pet-mt-6",children:E(f)})]})}const NR={mobile:96,tablet:112,desktop:112},os=44,Gf=22,RR=Gf+os,LR=56,$R=6,fd=268,BR=10,oo=12,lo=200,yd=8,DR=5e3,OR=1.5,HR=2e3,qR=3,UR=6,zR={linear:"linear",fall:"var(--ease-fall)"};function FR(){const e="(prefers-reduced-motion: reduce)",[a,n]=c.useState(()=>typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia(e).matches);return c.useEffect(()=>{var s;if(typeof window>"u"||typeof window.matchMedia!="function")return;const i=window.matchMedia(e),r=()=>n(i.matches);return(s=i.addEventListener)==null||s.call(i,"change",r),()=>{var o;return(o=i.removeEventListener)==null?void 0:o.call(i,"change",r)}},[]),a}function GR(){const[e,a]=c.useState(()=>typeof document<"u"&&document.hidden);return c.useEffect(()=>{const n=()=>a(document.hidden);return document.addEventListener("visibilitychange",n),()=>document.removeEventListener("visibilitychange",n)},[]),e}function KR(e,a,n){const i=c.useCallback(()=>{var o;return Math.round(((o=e.current)==null?void 0:o.getBoundingClientRect().width)??0)},[e]),[r,s]=c.useState(0);return c.useLayoutEffect(()=>{n&&s(i())},[i,a,n]),c.useEffect(()=>{const o=e.current;if(!n||!o)return;if(typeof ResizeObserver<"u"){const u=new ResizeObserver(()=>s(i()));return u.observe(o),()=>u.disconnect()}let l;const d=()=>{clearTimeout(l),l=setTimeout(()=>s(i()),150)};return window.addEventListener("resize",d),()=>{clearTimeout(l),window.removeEventListener("resize",d)}},[i,n,e]),r}const WR="(min-width: 1200px) and (max-height: 760px)";function VR(e){const a=c.useCallback(i=>{var s;if(typeof window>"u"||typeof window.matchMedia!="function")return()=>{};const r=window.matchMedia(e);return(s=r.addEventListener)==null||s.call(r,"change",i),()=>{var o;return(o=r.removeEventListener)==null?void 0:o.call(r,"change",i)}},[e]),n=c.useCallback(()=>typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia(e).matches,[e]);return c.useSyncExternalStore(a,n,()=>!1)}function YR({sessions:e,backlog:a,asks:n=[],onOpen:i}){const{items:r}=Qc(),[s,o]=c.useState(jE),[l,d]=c.useState(SE),[u,m]=c.useState(!1),[h,p]=c.useState(!1),[g,f]=c.useState(oo),[b,v]=c.useState(!1),[x,y]=c.useState(!1),[T,S]=c.useState(0),[E,w]=c.useState(null),M=FR(),[N,R]=c.useState(!1);c.useEffect(()=>{const oe=window;if(oe.requestIdleCallback){const ze=oe.requestIdleCallback(()=>R(!0),{timeout:1500});return()=>{var oa;return(oa=oe.cancelIdleCallback)==null?void 0:oa.call(oe,ze)}}const De=window.setTimeout(()=>R(!0),1);return()=>window.clearTimeout(De)},[]);const I=ll(),L=GR(),A=VR(WR)&&I==="desktop",B=I!=="desktop",[G,H]=c.useState(!1),Y=c.useRef(null),X=c.useRef(null),q=c.useRef(null),ie=KR(Y,I,N),[,te]=vb(),Z=U2(),xe=bE(e,r),[_e,ae]=c.useState(xe),[ee,le]=c.useState(()=>Date.now());_e!==xe&&(ae(xe),le(Date.now()));const re=c.useMemo(()=>xE({sessions:e,backlog:a,notifications:r,now:Date.now(),connection:Z,quietSince:ee}),[e,a,r,Z,ee,T]),Ce=c.useMemo(()=>fb(e,a),[e,a]),Ee=c.useMemo(()=>fE(e,a),[e,a]);c.useEffect(()=>{if(re.recheckAt===null)return;const oe=setTimeout(()=>S(De=>De+1),Math.max(0,re.recheckAt-Date.now()));return()=>clearTimeout(oe)},[re.recheckAt]),c.useEffect(()=>{if(!E)return;const oe=setTimeout(()=>w(null),E.ttl);return()=>clearTimeout(oe)},[E]);const J=c.useRef(null),ea=c.useRef(null);c.useEffect(()=>{const oe={sessions:e,backlog:a,notifications:r,now:Date.now()};if(L){J.current||(J.current=Uf(oe)),ea.current=null;return}const De=J.current;if(!De)return;if(ea.current===null&&(ea.current=oe.now),oe.now-De.at<aR){J.current=null;return}const ze=oR(De,oe);if(ze){J.current=null,w({...ze,id:oe.now});return}oe.now-ea.current>DR&&(J.current=null)},[L,e,a,r]);const Ke=rR(re,Date.now()),[He,Ve]=c.useState((Ke==null?void 0:Ke.text)??null);((Ke==null?void 0:Ke.text)??null)!==He&&(Ve((Ke==null?void 0:Ke.text)??null),Ke&&w({...Ke,id:Date.now()}));const{cell:ya,columns:We,anchor:ga,character:qa,rows:wa}=Pr,be=NR[I]/qa.h,Ze=Math.round(ya.w*be),z=Math.round(ya.h*be),$e=c.useRef(Cp(ie,Ze,Date.now())),[aa,da]=c.useState($e.current),[je,ye]=c.useState(Wo[re.pose]),[Ue,ve]=c.useState({x:$e.current.x,y:0,durationMs:0,ease:"linear"}),[fe,_a]=c.useState(null),Ta=c.useRef(null),sa=c.useRef(!1),Ba=c.useCallback(()=>{var ze,oa;const oe=(ze=X.current)==null?void 0:ze.getBoundingClientRect(),De=(oa=Y.current)==null?void 0:oa.getBoundingClientRect();return oe&&De&&oe.width>0?oe.left-De.left:$e.current.x},[]),ta=c.useCallback(()=>typeof window<"u"?window.innerHeight:z,[z]),ke=c.useMemo(()=>{const oe=Ue.x+ga.x*Ze-lo/2,De=Math.min(Math.max(oe,yd),Math.max(yd,ie-lo-yd));return Math.round(ga.x*Ze-lo/2+(De-oe))},[Ue.x,Ze,ga.x,ie]);c.useEffect(()=>{if(!E||u)return;const oe=ze=>{Y.current&&!Y.current.contains(ze.target)&&w(null)},De=ze=>{ze.key==="Escape"&&w(null)};return document.addEventListener("mousedown",oe),document.addEventListener("keydown",De),()=>{document.removeEventListener("mousedown",oe),document.removeEventListener("keydown",De)}},[E,u]);const Ge=c.useRef(0),ma=c.useCallback(()=>{if(ie<=0)return;const oe=Date.now();if(Ge.current===0){Ge.current=ie;const Fa=Cp(ie,Ze,oe);$e.current=Fa,da(Fa),ye(Wo[re.pose]),ve({x:Fa.x,y:0,durationMs:0,ease:"linear"});return}const De=Ge.current!==ie;Ge.current=ie;const ze=Ba(),oa=De&&fe===null&&!Ep($e.current.mode)?CR($e.current,{now:oe,currentX:ze,laneWidth:ie,petWidth:Ze,pose:re.pose}):MR($e.current,{now:oe,currentX:ze,laneWidth:ie,laneHeight:ta(),petWidth:Ze,petHeight:z,pose:re.pose,hovered:x,panelOpen:u,documentHidden:L,roam:l,reduced:M,tier:I,dragging:fe!==null,pointerX:(fe==null?void 0:fe.x)??0,pointerY:(fe==null?void 0:fe.y)??0},Math.random);$e.current=oa.state,da(oa.state),ye(oa.row),oa.move&&ve(oa.move)},[Ba,ta,ie,Ze,z,re.pose,x,u,L,l,M,I,fe]);c.useEffect(()=>{ma()},[ma]),c.useEffect(()=>{if(!Number.isFinite(aa.until))return;const oe=setTimeout(ma,Math.max(0,aa.until-Date.now()));return()=>clearTimeout(oe)},[aa.until,ma]);const[Ne,Ja]=c.useState(null),At=c.useRef(0),ut=c.useRef([]),[rt,tn]=c.useState(0),[Pa,ot]=c.useState(!1);c.useEffect(()=>{ot(!1)},[re.pose]);const Ka=je==="shipped"&&Pa?jR("shipped")??"idle":je,Ua=(Ne==null?void 0:Ne.row)??Ka,It=Eu(Ua),Tt=c.useCallback(()=>!M&&re.pose!=="offline"&&re.pose!=="sleeping"&&fe===null&&!Ep($e.current.mode),[M,re.pose,fe]),vt=c.useCallback(()=>{Tt()&&Ja(oe=>oe??{row:"wave",id:++At.current})},[Tt]),jn=c.useCallback(()=>{M||(Ja({row:"thanks",id:++At.current}),tn(oe=>oe+1))},[M]);c.useEffect(()=>{if(!u)return;const oe=ze=>{Y.current&&!Y.current.contains(ze.target)&&Nt()},De=ze=>{ze.key==="Escape"&&Nt()};return document.addEventListener("mousedown",oe),document.addEventListener("keydown",De),()=>{document.removeEventListener("mousedown",oe),document.removeEventListener("keydown",De)}},[u,M]),c.useEffect(()=>{M&&(v(!1),Ja(null),u||p(!1))},[M,u]),c.useEffect(()=>{var oe;(oe=q.current)==null||oe.toggleAttribute("inert",!u)},[u,h]);function Et(){var An,$t;const oe=typeof window<"u"?window.innerWidth:ie,De=(An=X.current)==null?void 0:An.getBoundingClientRect(),ze=(($t=Y.current)==null?void 0:$t.getBoundingClientRect().left)??0,Fa=(De&&De.width>0?De.left:ze+$e.current.x)+ga.x*Ze,_n=Math.min(Math.max(Fa-fd/2,oo),Math.max(oo,oe-fd-oo));f(Math.round(_n-ze)),p(!0),m(!0)}function Nt(){m(!1),M&&p(!1)}function mt(){u?Nt():Et()}function nn(){const oe=Date.now(),De=[...ut.current.filter(ze=>oe-ze<HR),oe];if(De.length>=qR){ut.current=[],jn();return}ut.current=De,M||v(!0),vt(),mt()}function ha(oe){var De,ze;(ze=(De=oe.currentTarget).setPointerCapture)==null||ze.call(De,oe.pointerId),Ta.current={id:oe.pointerId,dx:oe.clientX-Ba(),dy:oe.clientY+$e.current.y,x0:oe.clientX,y0:oe.clientY,moved:!1}}function Ct(oe){const De=Ta.current;if(!(!De||De.id!==oe.pointerId)){if(!De.moved){if(Math.hypot(oe.clientX-De.x0,oe.clientY-De.y0)<=UR)return;De.moved=!0,u&&Nt(),Ja(null)}_a({x:oe.clientX-De.dx,y:De.dy-oe.clientY})}}function sn(oe){var ze,oa;const De=Ta.current;!De||De.id!==oe.pointerId||(Ta.current=null,(oa=(ze=oe.currentTarget).releasePointerCapture)==null||oa.call(ze,oe.pointerId),De.moved&&(sa.current=!0,_a(null)))}function Rt(oe){o(oe),wE(oe),oe&&(m(!1),p(!1))}function wn(){if(I==="desktop"&&A){m(!1),p(!1),H(!1);return}I==="desktop"?Rt(!0):(m(!1),p(!1),te(!1))}function Lt(oe){d(oe),_E(oe)}const he=aa.mode==="held"||aa.mode==="falling",ra=s||(A||B)&&!G,za=B?LR:ra?RR:z,Wa=PR(Ue,ie,ta(),Ze,z);c.useEffect(()=>{ra&&u&&(m(!1),p(!1))},[ra,u]),c.useEffect(()=>{if(!B||!G)return;const oe=ze=>{Y.current&&!Y.current.contains(ze.target)&&H(!1)},De=ze=>{ze.key==="Escape"&&!u&&H(!1)};return document.addEventListener("mousedown",oe),document.addEventListener("keydown",De),()=>{document.removeEventListener("mousedown",oe),document.removeEventListener("keydown",De)}},[B,G,u]);const di={position:"relative",width:"100%",height:za,zIndex:80,pointerEvents:"none"},Sn=N?za:0;if(c.useLayoutEffect(()=>{const oe=document.documentElement;return oe.style.setProperty("--pet-h",`${Sn}px`),()=>{oe.style.removeProperty("--pet-h")}},[Sn]),!N)return null;if(ra)return t.jsx("div",{"data-testid":"pet-root",ref:Y,style:di,children:t.jsx("button",{"aria-label":"Tampilkan pet Hanoman",onClick:()=>{s&&Rt(!1),H(!0)},style:{pointerEvents:"auto",position:"absolute",width:os,height:os,padding:0,right:B?"max(var(--page-gutter-x), var(--safe-right))":"max(22px, var(--safe-right))",bottom:B?$R:Gf,display:"inline-flex",alignItems:"center",justifyContent:"center",cursor:"pointer",border:"1px solid var(--text-muted)",borderRadius:"var(--radius-pill)",background:"var(--surface-card)",color:"var(--text-strong)",boxShadow:"var(--shadow-sm)"},children:t.jsx(Xc,{id:"buntut",size:15})})});const ci=re.pose==="offline",$i=`Hanoman ${ah[re.pose]} · ${re.headline}`+(re.count>1?` · ${re.count} ${ql[re.kind]}`:""),Ns=Ua==="waiting"&&qf(re,Date.now()),ia=Math.round(zf(Ua)/(Ns?OR:1)),Bi=M?"none":`hn-pet-frames ${ia}ms steps(${We}, end) ${It.loop?"infinite":"1 forwards"}`;return t.jsxs("div",{"data-testid":"pet-root",ref:Y,style:di,children:[h&&t.jsxs("div",{ref:q,"data-testid":"pet-panel","aria-hidden":!u||void 0,onAnimationEnd:oe=>{oe.animationName==="hn-pet-panel-out"&&!u&&p(!1)},style:{pointerEvents:u?"auto":"none",position:"absolute",left:g,bottom:z+BR,width:fd,maxWidth:"calc(100vw - var(--safe-left) - var(--safe-right) - 24px)",maxHeight:"calc(100dvh - var(--safe-top) - var(--safe-bottom) - 120px)",overflowY:"auto",boxSizing:"border-box",padding:14,background:"var(--surface-card)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-md)",boxShadow:"var(--shadow-lg)",transformOrigin:"center bottom",animation:M?"none":`${u?"hn-pet-panel-in":"hn-pet-panel-out"} var(--dur-slow) var(--ease-out) both`},children:[t.jsx("div",{className:"hn-eyebrow",style:{marginBottom:8},children:ah[re.pose]}),t.jsx("ul",{"data-testid":"pet-conditions",style:{listStyle:"none",margin:0,padding:0,display:"flex",flexDirection:"column",gap:10},children:re.conditions.map((oe,De)=>t.jsxs("li",{"data-testid":"pet-condition","data-kind":oe.kind,style:De>0?{borderTop:"1px solid var(--border-hair)",paddingTop:10}:void 0,children:[t.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:6},children:[t.jsx("span",{style:De===0?{fontFamily:"var(--font-display)",fontSize:15,fontWeight:600,color:"var(--text-strong)",lineHeight:1.25}:{fontFamily:"var(--font-ui)",fontSize:13,fontWeight:600,color:"var(--text-strong)",lineHeight:1.3},children:oe.headline}),oe.count>1&&t.jsx("span",{"data-testid":"pet-condition-count",title:`${oe.count} ${ql[oe.kind]}`,style:{flex:"0 0 auto",padding:"2px 6px",fontFamily:"var(--font-ui)",fontSize:11,fontWeight:700,lineHeight:1,color:"var(--action-on)",background:"var(--action-bg)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-pill)"},children:oe.count})]}),t.jsx("div",{style:{marginTop:3,fontFamily:"var(--font-ui)",fontSize:12.5,color:"var(--text-muted)",lineHeight:1.45},children:oe.detail}),oe.target&&t.jsx("div",{style:{marginTop:7},children:t.jsx(U,{size:"sm",variant:De===0?"primary":"ghost",leftIcon:oe.target.section==="terminal"?"terminal":"list-checks",style:M?{transition:"none",transform:"none"}:void 0,onClick:()=>{const ze=oe.target;Nt(),i(ze)},children:oe.target.section==="terminal"?"Buka Terminal":"Buka Backlog"})}),oe.kind==="waiting"&&u&&Ce.map(ze=>t.jsx(Mp,{sessionId:ze.id,label:ze.specId??ze.id,reduced:M,ask:n.find(oa=>oa.sessionId===ze.id)},ze.id)),oe.kind==="deciding"&&u&&Ee.map(ze=>{const oa=n.find(Fa=>Fa.sessionId===ze.id);return oa?t.jsx(Mp,{sessionId:ze.id,label:ze.specId??ze.id,reduced:M,ask:oa},ze.id):null})]},`${oe.kind}:${De}`))}),t.jsxs("div",{style:{display:"flex",flexWrap:"wrap",gap:8,marginTop:12,borderTop:"1px solid var(--border-hair)",paddingTop:10},children:[I!=="mobile"&&t.jsx(U,{size:"sm",variant:"ghost",style:M?{transition:"none",transform:"none"}:void 0,onClick:()=>Lt(!l),children:l?aa.parkedX===null?"Diam di pojok":"Diam di sini":"Berkeliaran"}),t.jsx(U,{size:"sm",variant:"ghost",style:M?{transition:"none",transform:"none"}:void 0,onClick:wn,children:"Sembunyikan"})]})]}),ie>0&&t.jsxs("div",{"data-testid":"pet-actor",ref:X,"data-facing":aa.facing,"data-mode":aa.mode,onTransitionEnd:oe=>{oe.propertyName==="transform"&&ma()},style:{position:"absolute",left:0,bottom:0,width:Ze,height:z,transform:`translate(${Wa.x}px, ${-Wa.y}px)`,transition:M||Ue.durationMs===0?"none":`transform ${Ue.durationMs}ms ${zR[Ue.ease]}`,willChange:!M&&Ue.durationMs>0?"transform":void 0},children:[E&&!u&&t.jsxs("div",{"data-testid":"pet-bubble","data-kind":E.kind,"aria-hidden":E.kind==="pose"&&re.kind!=="waiting"?"true":void 0,style:{pointerEvents:"none",position:"absolute",left:ke,bottom:z-6,width:"max-content",maxWidth:lo,boxSizing:"border-box",padding:"6px 10px",fontFamily:"var(--font-ui)",fontSize:12.5,lineHeight:1.35,color:"var(--text-strong)",background:"var(--surface-card)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-md)",boxShadow:"var(--shadow-sm)",animation:M?"none":"hn-pet-bubble-in var(--dur-base) var(--ease-out) both"},children:[t.jsx("span",{"data-testid":"pet-bubble-text","aria-hidden":E.kind==="pose"?"true":void 0,children:E.text}),(E.kind==="recap"||re.kind==="waiting")&&t.jsx("div",{style:{marginTop:6,pointerEvents:"auto"},children:t.jsx(U,{size:"sm",variant:"ghost",leftIcon:E.kind==="recap"?"list-checks":"terminal","aria-label":E.kind==="recap"?`${E.text} — buka ringkasan pet`:`${E.text} — jawab di sini`,style:M?{transition:"none",transform:"none"}:void 0,onClick:()=>{w(null),Et()},children:E.kind==="recap"?"Lihat":"Jawab di sini"})})]}),t.jsxs("div",{"data-testid":"pet-stage",className:"hn-pet-stage","data-reduced-motion":M?"true":void 0,style:{position:"relative",width:Ze,height:z,animation:M?"none":"hn-pet-reveal var(--dur-slow) var(--ease-out) both"},children:[t.jsx("span",{className:"hn-sr-only",role:"status","aria-live":"polite","data-testid":"pet-status",children:$i}),re.count>1&&t.jsx("span",{"data-testid":"pet-badge","aria-hidden":"true",title:`${re.count} ${ql[re.kind]}`,style:{pointerEvents:"none",position:"absolute",top:4,right:8,zIndex:2,minWidth:18,height:18,padding:"0 5px",boxSizing:"border-box",display:"inline-flex",alignItems:"center",justifyContent:"center",fontFamily:"var(--font-ui)",fontSize:11,fontWeight:700,lineHeight:1,color:"var(--action-on)",background:"var(--action-bg)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-pill)",boxShadow:"var(--shadow-sm)"},children:re.count}),rt>0&&!M&&t.jsx("span",{"data-testid":"pet-hearts","aria-hidden":"true",style:{pointerEvents:"none",position:"absolute",zIndex:2,left:Math.round(ga.x*Ze),bottom:Math.round(z*.55)},onAnimationEnd:oe=>{oe.target.dataset.last==="1"&&tn(0)},children:[0,1,2].map(oe=>t.jsx("span",{"data-last":oe===2?"1":void 0,style:{position:"absolute",left:oe*9-9,fontFamily:"var(--font-ui)",fontSize:12,color:"var(--accent)",animation:`hn-pet-heart 900ms var(--ease-out) ${oe*120}ms both`},children:"♥"},oe))},rt),t.jsx("div",{"data-testid":"pet-reactor",className:"hn-pet-reactor",style:{position:"relative",width:"100%",height:"100%",transition:M?"none":"transform var(--dur-base) var(--ease-out)",animation:M||!b?"none":"hn-pet-click var(--dur-slow) var(--ease-out) both"},onAnimationEnd:oe=>{oe.animationName==="hn-pet-click"&&v(!1)},children:t.jsx("div",{"data-testid":"pet-viewport","data-offline":ci?"true":void 0,style:{position:"relative",overflow:"hidden",width:Ze,height:z,opacity:ci?.45:1,transition:M?"none":"opacity var(--dur-slow) var(--ease-out)"},children:t.jsx("div",{"data-testid":"pet-rowshift",className:"hn-pet-rowshift","data-row":Ua,style:{width:Ze,height:z,"--row":xR(Ua)},children:t.jsx("img",{"data-testid":"pet-atlas",src:vR,alt:"","aria-hidden":"true",draggable:!1,decoding:"async",onAnimationEnd:oe=>{if(oe.animationName==="hn-pet-frames"){if(Ne){Ne.row==="wave"&&x&&Tt()?Ja({row:"wave",id:++At.current}):Ja(null);return}Ua==="shipped"&&ot(!0)}},style:{display:"block",width:Ze*We,height:z*wa.length,animation:Bi}},`${Ua}:${(Ne==null?void 0:Ne.id)??0}`)})})}),t.jsx("button",{"data-testid":"pet-hit",className:"hn-pet-hit","aria-label":"Ringkasan status Hanoman",title:`${re.headline} — ${re.detail}`,onClick:()=>{if(sa.current){sa.current=!1;return}nn()},onPointerDown:ha,onPointerMove:Ct,onPointerUp:sn,onPointerCancel:sn,onPointerEnter:()=>{y(!0),vt()},onPointerLeave:()=>y(!1),onFocus:()=>y(!0),onBlur:()=>y(!1),style:{pointerEvents:"auto",position:"absolute",zIndex:3,left:Math.round(ga.x*Ze-os/2),bottom:0,width:os,height:os,padding:0,border:"none",background:"transparent",cursor:he?"grabbing":"grab"}})]})]})]})}const JR=c.lazy(()=>Xt(()=>import("./DalangHanomanScreen-Fd7_DcSP.js"),__vite__mapDeps([0,1,2,3,4])).then(e=>({default:e.DalangHanomanScreen}))),QR=c.lazy(()=>Xt(()=>import("./TeamScreen-BBAsYLpT.js"),__vite__mapDeps([5,1,6,2,3,7])).then(e=>({default:e.TeamScreen}))),ZR=c.lazy(()=>Xt(()=>import("./TriageScreen-wAPnttRe.js"),__vite__mapDeps([8,1,6,2,3,9])).then(e=>({default:e.TriageScreen}))),XR=c.lazy(()=>Xt(()=>import("./TerminalScreen-DpVp4h1n.js"),__vite__mapDeps([10,1,2,11,3,12])).then(e=>({default:e.TerminalScreen}))),eL=c.lazy(()=>Xt(()=>import("./IdeScreen-Cr9Vqdrc.js"),__vite__mapDeps([13,1,14,15,6,2,3,16])).then(e=>({default:e.IdeScreen}))),aL=c.lazy(()=>Xt(()=>import("./VpsScreen-DeQVx9Jy.js"),__vite__mapDeps([17,1,2,3,18])).then(e=>({default:e.VpsScreen}))),tL=c.lazy(()=>Xt(()=>import("./SchedulerScreen-D3rPdS-F.js"),__vite__mapDeps([19,1,6,2,20,21,22,3])).then(e=>({default:e.SchedulerScreen}))),nL=c.lazy(()=>Xt(()=>import("./LeadScreen-CQXpJy0y.js"),__vite__mapDeps([23,1,6,2,20,21,3,24])).then(e=>({default:e.LeadScreen}))),iL=c.lazy(()=>Xt(()=>import("./DocsWorkspace-pxj0N6QW.js"),__vite__mapDeps([25,1,2,3,26])).then(e=>({default:e.DocsWorkspace}))),sL=c.lazy(()=>Xt(()=>import("./ReviewScreen-B7NNEjxk.js"),__vite__mapDeps([27,1,15,2,3])).then(e=>({default:e.ReviewScreen}))),rL=c.lazy(()=>Xt(()=>import("./SettingsScreen-Bx13PWKQ.js"),__vite__mapDeps([28,1,2,11,22,21,15,3,29])).then(e=>({default:e.SettingsScreen}))),oL=[{value:"critical",label:"Critical"},{value:"major",label:"Major"},{value:"minor",label:"Minor"}],Ip=[{value:"tinggi",label:"Tinggi"},{value:"sedang",label:"Sedang"},{value:"rendah",label:"Rendah"}];function lL(e){switch(e){case"offline":return"offline";case"control-off":return"kendali jarak jauh mati";case"protocol-mismatch":return"versi tak cocok";case"no-spawn":return"tanpa izin mulai sesi";case"capacity-full":return"kapasitas penuh";default:return"tak tersedia"}}function dL({open:e,spec:a,onClose:n,onStarted:i,onError:r}){var z,$e,aa,da;const[s,o]=c.useState("sonnet"),[l,d]=c.useState("medium"),[u,m]=c.useState("claude"),[h,p]=c.useState({claude:{model:"sonnet",effort:"medium"},codex:{...Td},antigravity:{...Ss}}),[g,f]=c.useState({}),[b,v]=c.useState(!1),[x,y]=c.useState(""),[T,S]=c.useState("changed"),[E,w]=c.useState(Gu().id),[M,N]=c.useState(!1),[R,I]=c.useState(null);c.useEffect(()=>{I(null)},[e,a==null?void 0:a.id]);const[L,A]=c.useState([{deviceId:ln,name:"hub ini",eligible:!0}]),[B,G]=c.useState(ln),[H,Y]=c.useState(null),[X,q]=c.useState(null),[ie,te]=c.useState(void 0),[Z,xe]=c.useState(!1),[_e,ae]=c.useState(!1),[ee,le]=c.useState(!1),[re,Ce]=c.useState(null);c.useEffect(()=>{e&&(xe(!1),ae(!1),le(!1),f({}),se.getSettings().then(je=>{const ye={claude:{model:je.model,effort:je.effort},codex:{...Td,...je.codex??{}},antigravity:{...Ss,...je.antigravity??{}}},Ue=je.agent??"claude";p(ye),m(Ue),o(ye[Ue].model),d(ye[Ue].effort);const ve=!!a&&im(kr(a.source));v(ve||je.goal.enabled),y(ve?"":je.goal.condition),S(je.verifyScope??"changed"),w(Gu(je.method).id),te(je.orchestration),xe(!0)}).catch(()=>{ae(!0),xe(!0)}),se.getCodexVersion().then(je=>{q(je.version),le(!0)}).catch(()=>{le(!0)}),se.getMethodStatus().then(je=>Ce(je.methods)).catch(()=>Ce(null)))},[e,a]),c.useEffect(()=>{if(!e||!a)return;let je=!1;return(async()=>{try{const[ye,Ue]=await Promise.all([typeof se.presence=="function"?se.presence():Promise.resolve({enabled:!1,devices:[],hubVersion:""}),typeof se.getProject=="function"?se.getProject(a.projectId).then(_a=>_a.handledBy??[]).catch(()=>[]):Promise.resolve([])]);if(je)return;const ve=NE(ye,Ue);A(ve);const fe=ve.find(_a=>_a.deviceId!==ln&&_a.eligible);G((fe==null?void 0:fe.deviceId)??ln)}catch{if(je)return;A([{deviceId:ln,name:"hub ini",eligible:!0}]),G(ln)}})(),()=>{je=!0}},[e,a==null?void 0:a.id]);const Ee=B!==ln,J=c.useMemo(()=>Ee?Kc({base:`/api/devices/${B}/relay`}):se,[Ee,B]),ea=je=>{m(je),f({});const ye=$E(h,je);o(ye.model),d(ye.effort)},Ke=je=>{o(je),d(ye=>jb(u,je,ye))},He=xb(u,s);if(!a)return null;const Ve=a,ya=kr(Ve.source),We=im(ya),ga=u==="antigravity"&&b,qa=Ve.blockedBy??[],wa=qa.length>0,be=(re==null?void 0:re.find(je=>je.method===E&&je.agent===u))??null;async function Ze(je=!1,ye=!1){if(!ga){N(!0),I(null),Y(null);try{const{id:Ue,resumed:ve}=await J.startSession({spec:Ve.id,flow:ya,model:s,effort:l,agent:u,...Object.keys(g).length?{phaseOverrides:g}:{},goal:b,goalCondition:b&&x.trim()?x.trim():void 0,verifyScope:T,method:E,...wa||je?{force:!0}:{},...ye?{confirmRemote:!0}:{}});i(Ue,ve),n()}catch(Ue){if(Ue instanceof ba&&Ue.status===409&&Ue.detail&&typeof Ue.detail=="object"&&(Ue.detail.error==="remote-session"||Ue.detail.error==="confirm-required")){Y(Ue.detail);return}const ve=Ue instanceof ba&&Ue.status===409?zg.safeParse(Ue.detail):null;ve!=null&&ve.success?I(ve.data):r==null||r(Ue)}finally{N(!1)}}}return t.jsxs(ca,{open:e,onClose:n,icon:"play",eyebrow:`${Ve.id} · ${ya}`,title:"Mulai sesi",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",onClick:n,children:"Batal"}),t.jsx(U,{leftIcon:wa?"lock":"play",variant:wa?"danger":"primary",disabled:M||ga,onClick:()=>void Ze(),children:wa?"Mulai tetap":R?"Coba lagi":"Mulai"}),R&&!wa&&!Ee&&t.jsx(U,{leftIcon:"lock",variant:"danger",disabled:M||ga,onClick:()=>void Ze(!0),children:"Mulai tetap"})]}),children:[t.jsxs("div",{className:"hn-sheet-lead",children:["Agen, model & effort ",t.jsx("b",{children:"orchestrator"})," sesi ini. Default dari setelan global; ubah bila perlu. Bila orkestrasi flow ini aktif, tiap fase dikerjakan subagent dengan model & effort di bawah (Settings › Orkestrasi). Override di bawah hanya berlaku untuk sesi ini dan tidak mengubah Settings."]}),R&&t.jsxs("div",{role:"alert",className:"hn-sheet-alert",children:[t.jsx("b",{children:R.error}),t.jsxs("div",{children:[R.admission.liveCount," sesi hidup · ",R.admission.liveAgentCount," agen terstruktur · cap ",R.admission.maxConcurrent]}),t.jsxs("div",{children:["Load per core: ",R.admission.loadStatus==="available"&&R.admission.loadPerCore!==null?R.admission.loadPerCore.toFixed(2):"tidak tersedia",R.admission.loadStatus==="unsupported"?" (tidak didukung platform)":""," · ambang ",R.admission.maxLoadPerCore]}),t.jsx("div",{children:"Coba lagi setelah beban turun, atau pilih Mulai tetap untuk melewati cap dan pemeriksaan beban host."})]}),wa&&t.jsxs("div",{"data-testid":"dep-blocked-note",className:"hn-sheet-alert",children:["Backlog ini menunggu"," ",t.jsx("b",{children:qa.map(je=>`${je.id} (${je.reason==="missing"?"tak ditemukan":je.reason==="unmerged"?"belum ter-merge":"belum selesai"})`).join(", ")}),". Sesi tetap bisa dimulai, tapi worktree-nya lahir dari basis yang belum memuat pekerjaan itu."," ","Mulai tetap juga melewati cap sesi dan pemeriksaan beban host."]}),t.jsx(de,{label:"Target",hint:"Mesin yang menjalankan sesi ini. Tak terpilih tetap tampil beserta alasannya.",children:t.jsx(Be,{"aria-label":"target",value:B,className:"hn-w-full",options:L.map(je=>({value:je.deviceId,label:je.eligible?je.name:`${je.name} — ${lL(je.reason)}`,disabled:!je.eligible})),onChange:je=>{G(je.target.value),Y(null)}})}),(H==null?void 0:H.error)==="remote-session"&&H.remoteSession&&t.jsxs("div",{role:"alert",className:"hn-sheet-notice",children:["Sesi ini sudah berjalan di ",t.jsx("b",{children:H.remoteSession.name}),"."]}),(H==null?void 0:H.error)==="confirm-required"&&t.jsxs("div",{role:"alert",className:"hn-sheet-notice",children:[t.jsx("div",{children:"Device terakhir yang mengerjakan ini sudah offline."}),t.jsx(U,{variant:"danger",disabled:M||ga,onClick:()=>void Ze(!1,!0),children:"Tetap mulai"})]}),t.jsx(de,{label:"Agen",hint:"Mesin yang menjalankan sesi ini. Perilaku sesi sama; hanya CLI-nya berbeda.",children:t.jsx(Be,{"aria-label":"Agen",value:u,className:"hn-w-full",options:ih,onChange:je=>ea(je.target.value)})}),t.jsx(de,{label:"Model",children:t.jsx(Be,{"aria-label":"Model",value:s,className:"hn-w-full",options:LE(u,s),onChange:je=>Ke(je.target.value)})}),t.jsx(de,{label:"Effort",children:t.jsx(Be,{"aria-label":"Effort",value:l,className:"hn-w-full",options:He.map(je=>({value:je,label:je})),onChange:je=>d(je.target.value)})}),u==="codex"&&Gv(s,X)&&t.jsxs("div",{"data-testid":"codex-version-note",className:"hn-sheet-note",children:["Codex CLI terpasang ",t.jsx("b",{children:X}),", sedangkan ",t.jsx("b",{children:s})," butuh ",t.jsx("b",{children:(z=tl(s))==null?void 0:z.minClient}),". Sesi tetap boleh dijalankan, tapi modelnya belum tentu dikenali CLI ini."]}),t.jsx(zE,{flow:ya,agent:u,model:s,effort:l,orchestration:ie,codexVersion:X,phaseOverrides:g,onPhaseOverridesChange:f,loadError:_e,remoteTarget:Ee?(($e=L.find(je=>je.deviceId===B))==null?void 0:$e.name)??B:null,loading:!Z||u==="codex"&&!ee}),u==="antigravity"&&t.jsx("div",{role:"note",className:"hn-sheet-note",children:"Antigravity tersedia pada host/lab; sandbox dan mode goal native belum didukung. Matikan mode goal secara eksplisit atau pilih runtime lain. Telemetri native tidak diketahui."}),t.jsxs(de,{label:"Mode goal",hint:We?"Backlog goal selalu berjalan dalam mode goal — sesi menolak berhenti sampai goal item ini terbukti tercapai. Kosongkan kondisi untuk memakai goal item apa adanya.":"Sesi menolak berhenti sampai kondisinya terbukti. Kosongkan kondisi untuk memakai bawaan hanoman: semua fase tercatat, plan tak menyisakan task, push sukses.",children:[t.jsxs("div",{className:b?"hn-goal-row hn-goal-row--on":"hn-goal-row",children:[t.jsx(rl,{"aria-label":"Mode goal",checked:b,disabled:We||u==="antigravity"&&!b,onChange:je=>{We||v(je)}}),t.jsx("span",{className:"hn-sheet-meta",children:We?"aktif · terkunci":b?"aktif":"nonaktif"})]}),b&&t.jsx(La,{value:x,rows:4,mono:!0,placeholder:We?"Kosong = goal backlog item ini · mis. semua fase tercatat & plan tanpa - [ ]":"Kosong = kondisi bawaan hanoman · mis. semua fase tercatat & plan tanpa - [ ]",onChange:je=>y(je.target.value)})]}),t.jsx(de,{label:"Scope verifikasi",hint:"Hanya yang berubah = test/typecheck/lint hanya menyentuh berkas yang disentuh sesi ini. Suite penuh tetap dijalankan manusia sebelum merge.",children:t.jsx(Be,{"aria-label":"Scope verifikasi",value:T,className:"hn-w-full",options:[{value:"changed",label:"Hanya yang berubah — hemat RAM & CPU"},{value:"full",label:"Seluruh project"}],onChange:je=>S(je.target.value)})}),t.jsxs(de,{label:"Metode",hint:"Metodologi kerja sesi ini: skill per fase + direktori plan/spec. Fase-fasenya sendiri tak berubah. Item yang sudah pernah dijalankan memakai metode tercatatnya saat dilanjutkan.",children:[t.jsx(Be,{"aria-label":"Metode",value:E,className:"hn-w-full",options:xc.map(je=>({value:je,label:Ni[je].label})),onChange:je=>w(je.target.value)}),t.jsxs("div",{"data-testid":"method-requires",className:"hn-sheet-foot",children:["Butuh terpasang: ",((aa=Ni[E])==null?void 0:aa.requires.join(" · "))??"—"]}),be&&!be.ready&&t.jsxs("div",{"data-testid":"method-status-note",className:"hn-sheet-status",children:[be.availabilityReason&&t.jsx("div",{children:be.availabilityReason}),t.jsx("b",{children:be.label})," belum siap untuk ",t.jsx("b",{children:(da=ih.find(je=>je.value===u))==null?void 0:da.label})," di mesin ini",be.missingPackages.length>0&&t.jsxs(t.Fragment,{children:[" · paket kurang: ",t.jsx("code",{children:be.missingPackages.join(" · ")})]}),be.missingSkills.length>0&&t.jsxs(t.Fragment,{children:[" · skill kurang: ",t.jsx("code",{children:be.missingSkills.join(" · ")})]}),"."," ","Sesi tetap boleh dijalankan, tapi gerbang yang disebut prompt tak akan ada. Pasang dari Settings → Sesi."]})]})]})}function cL({open:e,onClose:a,projects:n,defaultProject:i,onCreate:r,prefill:s,specs:o}){const l={kind:(s==null?void 0:s.kind)??"brief",project:(s==null?void 0:s.project)||i,title:(s==null?void 0:s.title)??"",context:(s==null?void 0:s.context)??"",outcome:(s==null?void 0:s.outcome)??"",constraints:(s==null?void 0:s.constraints)??"",priority:"sedang",severity:(s==null?void 0:s.severity)??"major",steps:(s==null?void 0:s.steps)??"",expected:"",actual:(s==null?void 0:s.actual)??"",env:"",branchFrom:(s==null?void 0:s.branchFrom)??"",fromAudit:(s==null?void 0:s.fromAudit)??"",goal:(s==null?void 0:s.goal)??"",done:(s==null?void 0:s.done)??"",dependsOn:[],attachments:[]},[d,u]=c.useState(l);c.useEffect(()=>{e&&u({...l,project:(s==null?void 0:s.project)||i})},[e,i,s]);const[m,h]=c.useState([]),[p,g]=c.useState(new Set);c.useEffect(()=>{if(!e||!d.project){h([]),g(new Set);return}let M=!0;return se.listBranches(d.project).then(N=>{if(!M)return;const R=[...new Set([...N.branches,...N.remotes])].sort();h(R),g(new Set(N.remotes.filter(I=>!N.branches.includes(I)))),u(I=>I.branchFrom&&!R.includes(I.branchFrom)?{...I,branchFrom:""}:I)}).catch(()=>{M&&(h([]),g(new Set))}),()=>{M=!1}},[e,d.project]);const f=M=>N=>u(R=>({...R,[M]:N.target.value})),b=d.kind==="qa",v=d.kind==="audit",x=d.kind==="goal",y=d.kind==="no_effort",T=Ii(d.kind)==="goal",S=(o??[]).filter(M=>M.projectId===d.project),E=M=>u(N=>({...N,dependsOn:N.dependsOn.includes(M)?N.dependsOn.filter(R=>R!==M):[...N.dependsOn,M]})),w=()=>{!d.title.trim()||T&&!d.goal.trim()||r(d)};return t.jsxs(ca,{open:e,onClose:a,icon:b?"bug":v?"search":y?"zap":x?"target":"lightbulb",eyebrow:"human → hanoman",title:b?"QA finding baru":v?"Audit baru":y?"Task remeh baru":x?"Goal baru":"Feature brief baru",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",size:"sm",onClick:a,children:"Batal"}),t.jsx(U,{size:"sm",leftIcon:b?"radar":v?"search":y?"zap":x?"target":"messages-square",onClick:w,children:b?"Filekan finding → audit":v?"Buat audit → investigasi":y?"Buat task → sesi satu fase":x?"Buat goal → sesi goal":"Buat brief → brainstorm"})]}),children:[t.jsxs("div",{className:"hn-sheet-block",children:[t.jsx(St,{variant:"pill",className:"hn-sheet-kinds",value:d.kind,onChange:M=>u(N=>({...N,kind:M})),tabs:[{value:"brief",label:"Feature brief",icon:"lightbulb"},{value:"qa",label:"QA finding",icon:"bug"},{value:"audit",label:"Audit",icon:"search"},{value:"goal",label:"Goal",icon:"target"},{value:"no_effort",label:"Tanpa effort",icon:"zap"}]}),t.jsx("div",{className:"hn-sheet-hint",children:y?"Sesi satu fase (Kerjakan): langsung mengerjakan lalu berhenti — tanpa brainstorm, spec, plan, maupun fase pembuktian terpisah. Untuk ganti copy, bump konstanta, perbaiki typo docs, tambah satu baris allowlist.":x?"Sesi goal langsung mengejar goal-nya — tanpa brainstorm, spec, atau plan (fase: Goal → Verifikasi). Sesi lahir dengan mode goal aktif dan menolak berhenti sampai buktinya ada di transkrip.":b?"Finding masuk lewat alur audit → spec → plan → execute. hanoman menelusuri akar masalah dulu.":v?"Audit HANYA menghasilkan dokumen (audit → laporan) — tanpa perbaikan kode. Bisa dinaikkan jadi Finding QA bila perlu diperbaiki.":"Brief masuk lewat alur brainstorm → objective → spec → plan → execute."})]}),t.jsx(de,{label:"Project",children:t.jsx(Be,{value:d.project,onChange:f("project"),className:"hn-w-full",options:n.map(M=>({value:M.id,label:M.name}))})}),t.jsx(de,{label:"Branch",hint:"branch yang disalin ke worktree (salinan kerja terpisah untuk sesi ini) saat sesi dimulai",children:t.jsx(Be,{value:d.branchFrom,onChange:f("branchFrom"),disabled:!m.length,className:"hn-w-full",options:Cb(m,p)})}),t.jsx(de,{label:"Bergantung pada",hint:"Backlog yang harus selesai & ter-merge lebih dulu. Kosongkan bila item ini berdiri sendiri.",children:S.length===0?t.jsx("div",{className:"hn-sheet-empty",children:"Belum ada backlog lain di project ini."}):t.jsx("div",{className:"hn-dep-list",children:S.map(M=>t.jsx(As,{"aria-label":`Bergantung pada ${M.id}`,checked:d.dependsOn.includes(M.id),onChange:()=>E(M.id),label:`${M.id} · ${M.title}`},M.id))})}),t.jsx(de,{label:"Judul",children:t.jsx(Oe,{"aria-label":"Judul",value:d.title,onChange:f("title"),placeholder:b?"mis. Funnel double-count sesi lintas tengah malam":y?"mis. Label tombol Simpan di form backlog":x?"mis. Latensi daftar backlog":"mis. Jadwal invoice berulang",className:"hn-w-full"})}),T?t.jsxs(t.Fragment,{children:[t.jsx(de,{label:"Goal",hint:"Keadaan yang harus tercapai — inilah yang dikejar sesi sampai terbukti",children:t.jsx(La,{"aria-label":"Goal",value:d.goal,onChange:f("goal"),rows:3,placeholder:"mis. p95 GET /api/specs di bawah 200 ms"})}),t.jsx(de,{label:"Selesai bila",hint:"Bukti yang harus muncul di transkrip; kosongkan bila goal-nya sudah jadi buktinya sendiri",children:t.jsx(La,{"aria-label":"Selesai bila",value:d.done,onChange:f("done"),rows:2,placeholder:"mis. output benchmark menunjukkan < 200 ms"})}),t.jsxs("div",{className:"hn-grid-mobile hn-grid-split",children:[t.jsx(de,{label:"Batasan",hint:"opsional",children:t.jsx(Oe,{"aria-label":"Batasan",value:d.constraints,onChange:f("constraints"),placeholder:"mis. tanpa cache eksternal",className:"hn-w-full"})}),t.jsx(de,{label:"Prioritas",children:t.jsx(Be,{"aria-label":"Prioritas",value:d.priority,onChange:f("priority"),className:"hn-w-full",options:Ip})})]})]}):b?t.jsxs(t.Fragment,{children:[t.jsx(de,{label:"Severity",children:t.jsx(Be,{value:d.severity,onChange:f("severity"),className:"hn-w-full",options:oL})}),t.jsx(de,{label:"Langkah reproduksi",children:t.jsx(La,{value:d.steps,onChange:f("steps"),rows:3,mono:!0,placeholder:`1. Buka …
|
|
1010
|
+
3. Amati …`],["expected","Diharapkan","mis. total funnel sama dengan jumlah baris laporan harian"],["actual","Aktual","mis. total funnel dua kali lipat untuk sesi yang melewati tengah malam"],["env","Environment","prod · web · v0.9.2"],["constraints","Batasan","mis. jangan ubah kontrak API"]],hc={brief:_N,qa:TN,goal:AN},pc=[{value:"tinggi",label:bs.tinggi},{value:"sedang",label:bs.sedang},{value:"rendah",label:bs.rendah}],Cf=[{value:"critical",label:Bl.critical},{value:"major",label:Bl.major},{value:"minor",label:Bl.minor}];function EN({spec:e,onClose:a,onSubmit:n}){var E;const i=e.stage!=="brainstorming"||e.baseSha!=null,r=SN.filter(w=>w.value!==e.source),[s,o]=c.useState(((E=r[0])==null?void 0:E.value)??""),l=i&&kr(s)!==kr(e.source),d=i&&!l,u=c.useMemo(()=>Fy(s,e.payload),[s,e.payload]),[m,h]=c.useState(()=>u.payload),[p,g]=c.useState(null),[f,b]=c.useState(!1);c.useEffect(()=>{h(u.payload),g(null)},[s]);const v=w=>M=>h(N=>({...N,[w]:M.target.value})),x=Ii(s),y=hc[x]??[],T=w=>{var M;return((M=(hc[vc(e.payload)]??[]).find(([N])=>N===w))==null?void 0:M[1])??w};async function S(w){if(!f){b(!0);try{const M=await n(s,d?void 0:{...m},w);M&&M.pending?g(M):a()}finally{b(!1)}}}return p?t.jsxs(ca,{open:!0,title:"Item ini akan dikembalikan ke Brainstorming",icon:"rotate-ccw",eyebrow:`${e.id} · ${ti(e.source).label} → ${ti(s).label}`,onClose:f?void 0:a,children:[t.jsxs("div",{className:"hn-dia-lead hn-dia-lead-sm",children:["Alur kerja ",ti(s).label," berbeda dari yang sudah dikerjakan, jadi item ini mulai lagi dari awal. Kode yang sudah ter-commit di branch lain tak disentuh."]}),t.jsxs("ul",{"data-testid":"source-reset-impact",className:"hn-dia-impact",children:[p.wouldDelete.map(w=>t.jsx("li",{children:w},w)),p.worktree&&t.jsx("li",{children:p.worktree}),p.branch&&t.jsx("li",{children:p.branch}),!p.wouldDelete.length&&!p.worktree&&!p.branch&&t.jsx("li",{children:"tak ada berkas yang perlu dibuang — hanya tahapnya yang mundur"})]}),t.jsxs("div",{className:"hn-dia-foot",children:[t.jsx(U,{size:"sm",variant:"secondary",disabled:f,onClick:a,children:"Batal"}),t.jsx(U,{size:"sm",variant:"danger",leftIcon:"rotate-ccw",loading:f,onClick:()=>S(!0),children:"Reset & ubah type"})]})]}):t.jsxs(ca,{open:!0,title:"Ubah type backlog item",icon:"shuffle",eyebrow:`${e.id} · ${ti(e.source).label}`,onClose:a,children:[t.jsx(de,{label:"Type tujuan",children:t.jsx(Be,{"aria-label":"Type tujuan",value:s,onChange:w=>o(w.target.value),options:r,className:"hn-dia-full"})}),!r.length&&t.jsx("div",{className:"hn-dia-note",children:"Tak ada type lain yang bisa dituju. Dialog tetap terbuka dan mengatakannya — menolak dengan diam adalah bug yang melahirkan ADR-0149."}),d?t.jsxs("div",{className:"hn-dia-note",children:["Item ini sudah pernah dikerjakan sesi, dan type tujuannya memakai alur kerja yang sama — yang berpindah hanya ",t.jsx("strong",{children:"labelnya"}),". Isi, worktree, dan berkas fase tak disentuh."]}):t.jsxs(t.Fragment,{children:[l&&t.jsxs("div",{"data-testid":"source-reset-warning",className:"hn-dia-box",children:[t.jsx(la,{tone:"warn",size:"sm",children:"alur kerja berbeda"})," ","Item ini akan kembali ke tahap ",t.jsx("strong",{children:"Brainstorming"}),"; dokumen fase, worktree, dan branch sesi lamanya dihapus. Daftar persisnya ditampilkan sebelum kamu menyetujui."]}),u.dropped.length>0&&t.jsxs("div",{"data-testid":"source-dropped",className:"hn-dia-box hn-dia-box-muted",children:[t.jsx(la,{tone:"warn",size:"sm",children:"tak punya padanan"})," ",u.dropped.map(T).join(", ")," tidak ada di bentuk"," ",ti(s).label,". Teks lamanya tetap tersimpan di"," ",t.jsx("strong",{children:"jejak konversi"})," item ini."]}),x!=="qa"&&t.jsx(de,{label:"Prioritas",children:t.jsx(Be,{"aria-label":"Prioritas",value:m.priority??"sedang",onChange:v("priority"),options:pc,className:"hn-dia-full"})}),y.map(([w,M,N])=>t.jsx(de,{label:M,children:w==="severity"?t.jsx(Be,{"aria-label":M,value:m[w]??"minor",onChange:v(w),options:Cf,className:"hn-dia-full"}):t.jsx(La,{"aria-label":M,value:m[w]??"",onChange:v(w),rows:2,placeholder:N})},w))]}),t.jsxs("div",{className:"hn-dia-foot hn-dia-foot-tight",children:[t.jsx(U,{size:"sm",variant:"secondary",onClick:a,children:"Batal"}),t.jsx(U,{size:"sm",variant:"primary",leftIcon:"shuffle",loading:f,disabled:!r.length,onClick:()=>S(),children:"Ubah type"})]})]})}const pp=280;function Pf({spec:e,onClose:a,onSubmit:n}){const[i,r]=c.useState(""),[s,o]=c.useState(null),[l,d]=c.useState(!1),u=c.useRef(!1);async function m(){if(!u.current){u.current=!0,d(!0);try{const h=await n(e,i.trim(),s!==null);if(h&&"needConfirm"in h){o(h.sessionId??"");return}h&&a()}finally{u.current=!1,d(!1)}}}return t.jsxs(ca,{open:!0,title:"Tandai selesai",icon:"circle-check",eyebrow:e.id+" · "+e.projectId,onClose:l?void 0:a,children:[t.jsx("div",{style:{fontSize:13,color:"var(--text-muted)",lineHeight:1.55,marginBottom:14},children:"Item keluar dari daftar siap-kerja dan berstatus selesai — sama seperti item yang selesai lewat sesi. Kode, commit, dan dokumen tidak disentuh, dan status ini masih bisa dikembalikan lewat “Ubah status”."}),s!==null&&t.jsxs("div",{"data-testid":"mark-done-live",style:{border:"1px solid var(--border-hair)",borderRadius:"var(--radius-sm)",background:"var(--bone-100)",padding:10,marginBottom:14,fontSize:12.5,color:"var(--text-strong)",lineHeight:1.5},children:["Masih ada sesi yang berjalan untuk item ini",s?` (${s})`:"",". Menandainya selesai tidak menghentikan sesi itu — tutup sesinya dari Terminal bila memang sudah tak dibutuhkan."]}),t.jsx(de,{label:"Alasan singkat (opsional)",hint:`${i.trim().length}/${pp} — mis. “sudah ter-merge lewat PR #12”`,children:t.jsx(La,{"aria-label":"Alasan singkat (opsional)",rows:2,value:i,maxLength:pp,disabled:l,onChange:h=>r(h.target.value),placeholder:"sudah dikerjakan langsung di checkout"})}),t.jsxs("div",{style:{display:"flex",gap:8,justifyContent:"flex-end"},children:[t.jsx(U,{size:"sm",variant:"secondary",disabled:l,onClick:a,children:"Batal"}),t.jsx(U,{size:"sm",variant:"primary",leftIcon:"circle-check",loading:l,onClick:m,children:s!==null?"Tandai selesai — sesi tetap berjalan":"Tandai selesai"})]})]})}const pn=[{key:"brainstorming",label:"Brainstorm"},{key:"objective",label:"Objective"},{key:"spec-ready",label:"Spec"},{key:"planned",label:"Plan"},{key:"executing",label:"Execute"},{key:"done",label:"Done"}],Mf=e=>pn.findIndex(a=>a.key===e),If={brainstorming:"Brainstorm: ide digali bersama agen sebelum tujuan dikunci",objective:"Objective: tujuan terukur dikunci sebelum spec ditulis","spec-ready":"Spec: dokumen spesifikasi ditulis",planned:"Plan: rencana langkah disusun",executing:"Execute: kode dikerjakan di worktree sesi",done:"Done: item selesai"},hr=[{key:"all",label:"Semua",stages:pn.map(e=>e.key)},{key:"brainstorm",label:"Brainstorm",stages:["brainstorming","objective"]},{key:"spec",label:"Spec",stages:["spec-ready","planned"]},{key:"doing",label:"Dikerjakan",stages:["executing"]},{key:"done",label:"Selesai",stages:["done"]}],gp=(e,a)=>{var n;return a==="all"||(((n=hr.find(i=>i.key===a))==null?void 0:n.stages.includes(e))??!1)},Nf=e=>{var a;return((a=hr.find(n=>n.key!=="all"&&n.stages.includes(e)))==null?void 0:a.label)??e},Rf={brainstorming:"idle",objective:"idle","spec-ready":"queued",planned:"queued",executing:"running",done:"done"},CN=e=>e==="brainstorming"?"Mulai":"Lanjutkan",kp={tinggi:{tone:"brass",label:bs.tinggi,level:"high"},sedang:{tone:"neutral",label:bs.sedang,level:"mid"},rendah:{tone:"neutral",label:bs.rendah,level:"low"}},Ko=e=>kp[e]??kp.sedang,bp=[{value:"all",label:"Semua sumber"},{value:"brief",label:"Dari brief"},{value:"qa",label:"Dari QA"},{value:"audit",label:"Audit"},{value:"goal",label:"Goal"},{value:"help",label:"Help Center"},{value:"no_effort",label:"Tanpa effort"}],PN=[{value:"all",label:"Semua prioritas"},{value:"tinggi",label:"Tinggi"},{value:"sedang",label:"Sedang"},{value:"rendah",label:"Rendah"}],fp={audit:"Audit: hasil pemeriksaan project. Dari sini bisa dinaikkan jadi Finding QA, feature brief, atau PRD.",goal:"Goal: item dengan tujuan terukur. Dikerjakan dua fase (Goal lalu Verifikasi) tanpa tahap perencanaan.",no_effort:"Tanpa effort: tugas remeh yang dikerjakan satu fase, tanpa perencanaan maupun verifikasi."},Lf=e=>e==="missing"?"tak ditemukan":e==="unmerged"?"belum ter-merge":"belum selesai";function Au({spec:e}){const a=e.blockedBy??[];return a.length?t.jsx(la,{tone:"warn",size:"sm",icon:"lock",title:a.map(n=>`${n.id} — ${Lf(n.reason)}`).join(" · "),children:"Terblokir"}):null}function Tu({priority:e,stage:a}){const n=Ko(e),i=a?Rf[a]??"idle":void 0,r=a?Nf(a):null;return t.jsx("span",{className:`hn-bl-prio hn-bl-prio-${n.level}`,"data-status":i,title:r?`Prioritas ${n.label} · Status ${r}`:`Prioritas ${n.label}`,children:t.jsxs("span",{className:"hn-sr-only",children:["Prioritas ",n.label,r?`, status ${r}`:""]})})}function $f({source:e}){const a=ti(e);return t.jsxs("span",{className:"hn-bl-source",children:[t.jsx(Re,{name:a.icon,size:12,color:a.color}),a.label]})}function Bf({stage:e}){return t.jsx(bt,{status:Rf[e]??"idle",size:"sm",variant:"dot",className:"hn-bl-stage-pill",title:If[e],children:Nf(e)})}function MN({stage:e}){var i;const a=Mf(e),n=((i=pn[a])==null?void 0:i.label)??e;return t.jsx("div",{role:"progressbar","aria-label":`Status ${n}`,"aria-valuemin":0,"aria-valuemax":pn.length-1,"aria-valuenow":Math.max(a,0),"aria-valuetext":n,className:"hn-bl-stagebar",children:pn.map((r,s)=>{const o=s<a||e==="done",l=s===a&&e!=="done",d=o?"done":l?"active":"todo";return t.jsxs("span",{className:"hn-bl-stage","data-state":d,title:If[r.key],children:[t.jsx("span",{className:"hn-bl-stage-dot","aria-hidden":"true"}),l&&t.jsx("span",{className:"hn-bl-stage-label",children:r.label})]},r.key)})})}function yp({label:e,value:a}){return t.jsxs("div",{className:"hn-bl-field",children:[t.jsx("div",{className:"hn-eyebrow",children:e}),t.jsx("div",{className:"hn-bl-field-value",children:a||"—"})]})}const IN={qa:"Finding QA — ada yang perlu diperbaiki.",brief:"Feature brief — kebutuhan yang bentuknya sudah jelas.",prd:"PRD — kebutuhan produk yang perlu didefinisikan dulu."},gd=(e,a)=>e&&e.target===a?"primary":"secondary",vp=e=>e==="audit";function NN({spec:e,onClose:a,onEditBranch:n,onRevertStage:i,onMarkDone:r,onOpenReview:s,onStart:o,onIntegrate:l,onEditSpec:d,onPromoteToQa:u,onPromoteToBrief:m,onPromoteToPrd:h,onEditDeps:p,onEditAutoMerge:g,onChangeSource:f,onRequestDelete:b,onUndoable:v,projectPolicy:x,allSpecs:y,onAttachmentToast:T,running:S,onOpenRun:E,projectName:w,presenceOn:M}){var sa,Ba,ta;const[N,R]=c.useState([]),[I,L]=c.useState(new Set),[A,B]=c.useState(null),[G,H]=c.useState(""),[Y,X]=c.useState(!1),[q,ie]=c.useState(!1),te=c.useRef(!1),[Z,xe]=c.useState(!1),[_e,ae]=c.useState(!1),[ee,le]=c.useState(!1),[re,Ce]=c.useState(!1),[Ee,J]=c.useState({}),ea=(e==null?void 0:e.stage)==="brainstorming"&&(e==null?void 0:e.baseSha)==null&&!!d&&e.payload!==void 0,Ke=()=>{if(!e)return;const ke=e.payload||{};J({title:e.title,priority:e.priority,...ke}),Ce(!0)},He=ke=>Ge=>J(ma=>({...ma,[ke]:Ge.target.value})),[Ve,ya]=c.useState(null),We=e&&vp(e.source)?e.id:null;c.useEffect(()=>{var Ge;if(ya(null),!We)return;let ke=!0;return(Ge=se.getEscalation)==null||Ge.call(se,We).then(ma=>{ke&&ya(ma.escalation)}).catch(()=>{ke&&ya(null)}),()=>{ke=!1}},[We]);const ga=()=>{if(!e||!d)return;const ke=e.source==="qa"?{title:Ee.title,payload:{severity:Ee.severity,steps:Ee.steps,expected:Ee.expected,actual:Ee.actual,env:Ee.env,constraints:Ee.constraints??""}}:Ii(e.source)==="goal"?{title:Ee.title,priority:Ee.priority,payload:{goal:Ee.goal,done:Ee.done??"",constraints:Ee.constraints??"",priority:Ee.priority}}:{title:Ee.title,priority:Ee.priority,payload:{context:Ee.context,outcome:Ee.outcome,constraints:Ee.constraints,priority:Ee.priority}};d(e,ke),Ce(!1)},qa=ke=>{if(!e||!d||ke===e.priority)return;const Ge=e.priority;d(e,{priority:ke}),v==null||v(`Prioritas ${e.id} diubah ke ${Ko(ke).label}`,()=>d(e,{priority:Ge}))},wa=e==null?void 0:e.projectId;c.useEffect(()=>{if(!wa){R([]),L(new Set);return}let ke=!0;return se.listBranches(wa).then(Ge=>{if(ke){const ma=[...new Set([...Ge.branches,...Ge.remotes])].sort();R(ma),L(new Set(Ge.remotes.filter(Ne=>!Ge.branches.includes(Ne))))}}).catch(()=>{ke&&(R([]),L(new Set))}),()=>{ke=!1}},[wa]),c.useEffect(()=>{G&&H(""),A&&B(null)},[e==null?void 0:e.id,e==null?void 0:e.stage]);async function be(ke){if(!te.current){te.current=!0,ie(!0);try{return await ke()}finally{te.current=!1,ie(!1)}}}async function Ze(){if(!e||!i||!G)return;const ke=await be(()=>i(e,G));ke&&ke.pending?B({target:G,files:ke.wouldDelete}):ke&&H("")}async function z(){if(!e||!i||!A)return;await be(()=>i(e,A.target,!0))&&(B(null),H(""))}function $e(){A||te.current||(Ce(!1),a())}if(!e)return null;const aa=pn.slice(0,Mf(e.stage)),da=((sa=pn.find(ke=>ke.key===e.stage))==null?void 0:sa.label)??e.stage,je=((Ba=pn.find(ke=>ke.key===G))==null?void 0:Ba.label)??G,ye=e.source==="qa",Ue=Ii(e.source),ve=e.payload||{},fe=(y??[]).filter(ke=>ke.projectId===e.projectId&&ke.id!==e.id),_a=hc[Ue],Ta=ti(e.source);return t.jsxs(ca,{open:!0,title:e.title,eyebrow:e.id,icon:Ta.icon,onClose:$e,width:600,children:[t.jsxs("div",{className:"hn-bl-detail",children:[t.jsxs("section",{className:"hn-bl-section","aria-labelledby":"bl-sec-ringkasan",children:[t.jsx("h3",{id:"bl-sec-ringkasan",className:"hn-bl-section-title",children:"Ringkasan"}),t.jsxs("div",{className:"hn-bl-summary-meta",children:[t.jsx(Bf,{stage:e.stage}),t.jsxs("span",{className:"hn-bl-prio-text",children:[t.jsx(Tu,{priority:e.priority}),Ko(e.priority).label]}),t.jsx(Au,{spec:e}),t.jsx(bl,{names:M})]}),t.jsx(MN,{stage:e.stage}),re?t.jsx(de,{label:"Judul",children:t.jsx(Oe,{value:Ee.title??"",onChange:He("title"),placeholder:"mis. Jadwal invoice berulang",className:"hn-bl-full"})}):t.jsx(yp,{label:"Tujuan",value:e.objective}),t.jsxs("dl",{className:"hn-bl-facts",children:[t.jsxs("div",{children:[t.jsx("dt",{children:"Project"}),t.jsx("dd",{children:w??e.projectId})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Penulis"}),t.jsx("dd",{children:e.author||"—"})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Dibuat"}),t.jsx("dd",{children:RN(e.createdAt)||"—"})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Branch asal"}),t.jsx("dd",{children:e.branchFrom||"—"})]})]}),ea&&!re&&t.jsxs("div",{className:"hn-bl-inline-row",children:[t.jsx(Be,{size:"sm","aria-label":"Prioritas item ini",value:e.priority,onChange:ke=>qa(ke.target.value),options:pc}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"pencil",onClick:Ke,children:"Edit"})]}),re?t.jsxs(t.Fragment,{children:[!ye&&t.jsx(de,{label:"Prioritas",children:t.jsx(Be,{value:Ee.priority??"sedang",onChange:He("priority"),options:pc,className:"hn-bl-full"})}),_a.map(([ke,Ge,ma])=>t.jsx(de,{label:Ge,children:ke==="severity"?t.jsx(Be,{value:Ee[ke]??"major",onChange:He(ke),options:Cf,className:"hn-bl-full"}):t.jsx(La,{value:Ee[ke]??"",onChange:He(ke),rows:2,placeholder:ma})},ke)),t.jsxs("div",{className:"hn-bl-inline-row hn-bl-end",children:[t.jsx(U,{size:"sm",variant:"secondary",onClick:()=>Ce(!1),children:"Batal"}),t.jsx(U,{size:"sm",variant:"primary",leftIcon:"check",onClick:ga,children:"Simpan"})]})]}):_a.map(([ke,Ge])=>t.jsx(yp,{label:Ge,value:ve[ke]??""},ke)),e.manualDone&&t.jsxs("div",{className:"hn-bl-field","data-testid":"manual-done-trail",children:[t.jsx("div",{className:"hn-eyebrow",children:"Ditandai selesai manual"}),t.jsxs("div",{className:"hn-bl-field-value hn-bl-muted",children:[e.manualDone.by," · ",new Date(e.manualDone.at).toLocaleString("id-ID"),e.manualDone.reason?t.jsx("div",{className:"hn-bl-gap-top",children:e.manualDone.reason}):null]})]})]}),t.jsxs("div",{className:"hn-bl-cta",children:[S&&E&&t.jsx(U,{variant:"primary",leftIcon:"terminal",onClick:()=>E(e),children:"Buka sesi"}),!S&&o&&t.jsx(U,{variant:"primary",leftIcon:"play",onClick:()=>o(e),children:"Jalankan"}),e.stage==="done"&&t.jsx("span",{className:"hn-bl-hint",children:"Sesi baru melanjutkan sisa kerja item ini."})]}),t.jsxs("section",{className:"hn-bl-section","aria-labelledby":"bl-sec-review",children:[t.jsx("h3",{id:"bl-sec-review",className:"hn-bl-section-title",children:"Review, dokumen, dan lampiran"}),t.jsxs("div",{className:"hn-bl-inline-row",children:[s&&t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"git-compare",onClick:()=>{s(e),a()},children:"Review perubahan"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"file-text",onClick:()=>ae(!0),children:"Lihat dokumen"})]}),vp(e.source)&&(u||m||h)&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Tindak lanjut"}),Ve&&t.jsxs("div",{className:"hn-bl-hint",children:[Ve.target==="none"?t.jsxs("span",{children:["Audit menilai ",t.jsx("strong",{children:"cukup jawaban"})," — tak perlu perbaikan."]}):t.jsxs("span",{children:[t.jsx(la,{tone:"brass",size:"sm",children:"direkomendasikan hanoman"})," ",IN[Ve.target]]}),Ve.reason?t.jsx("div",{className:"hn-bl-gap-top",children:Ve.reason}):null]}),t.jsxs("div",{className:"hn-bl-inline-row",children:[u&&t.jsx(U,{size:"sm",variant:gd(Ve,"qa"),leftIcon:"bug",onClick:()=>u(e,Ve),children:"Jadikan Finding QA"}),m&&t.jsx(U,{size:"sm",variant:gd(Ve,"brief"),leftIcon:"lightbulb",onClick:()=>m(e,Ve),children:"Jadikan Feature brief"}),h&&t.jsx(U,{size:"sm",variant:gd(Ve,"prd"),leftIcon:"scroll-text",onClick:()=>h(e,Ve),children:"Jadikan PRD"})]})]}),t.jsx(HE,{specId:e.id,onToast:T??(()=>{})})]}),t.jsxs("details",{className:"hn-bl-advanced","data-testid":"spec-advanced",children:[t.jsx("summary",{children:"Lanjutan"}),t.jsxs("div",{className:"hn-bl-advanced-body",children:[t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Branch worktree"}),t.jsx(Be,{size:"sm",value:e.branchFrom??"",disabled:!N.length,onChange:ke=>n&&n(e,ke.target.value||null),options:Cb(N,I)})]}),t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Bergantung pada"}),(e.dependsOn??[]).length===0?t.jsx("div",{className:"hn-bl-hint",children:"— berdiri sendiri"}):t.jsx("div",{className:"hn-bl-stack-list",children:(e.dependsOn??[]).map(ke=>{const Ge=(e.blockedBy??[]).find(ma=>ma.id===ke);return t.jsxs("div",{className:"hn-bl-dep",children:[t.jsx("span",{className:"hn-bl-id",children:ke}),Ge?t.jsx(la,{tone:"warn",size:"sm",children:Lf(Ge.reason)}):t.jsx(la,{tone:"ok",size:"sm",icon:"check",children:"selesai & ter-merge"})]},ke)})}),p&&fe.length>0&&t.jsx("div",{className:"hn-bl-checklist",children:fe.map(ke=>{const Ge=(e.dependsOn??[]).includes(ke.id);return t.jsx(As,{"aria-label":`Bergantung pada ${ke.id}`,checked:Ge,label:`${ke.id} · ${ke.title}`,onChange:()=>p(e,Ge?(e.dependsOn??[]).filter(ma=>ma!==ke.id):[...e.dependsOn??[],ke.id])},ke.id)})})]}),g&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Auto-merge saat selesai"}),t.jsx(Be,{size:"sm","aria-label":"Auto-merge item ini",value:e.autoMerge?e.autoMerge.mode:"inherit",onChange:ke=>{var ma;const Ge=ke.target.value;if(Ge==="inherit")return g(e,null);if(Ge==="off")return g(e,{...hs});g(e,{...e.autoMerge??hs,mode:Ge,branch:Ge==="branch"?((ma=e.autoMerge)==null?void 0:ma.branch)??N[0]??null:null})},options:[{value:"inherit",label:`Ikut project (${Zp(tv(x,null))})`},{value:"off",label:"Tanpa auto-merge untuk item ini"},{value:"default-branch",label:"Auto-merge ke default branch repo"},{value:"branch",label:"Auto-merge ke branch tujuan…"}]}),((ta=e.autoMerge)==null?void 0:ta.mode)==="branch"&&t.jsx("div",{className:"hn-bl-gap-top",children:t.jsx(Be,{size:"sm","aria-label":"Branch tujuan item ini",value:e.autoMerge.branch??"",onChange:ke=>g(e,{...e.autoMerge,branch:ke.target.value||null}),options:[{value:"",label:"Pilih branch…"},...N.map(ke=>({value:ke,label:ke}))]})})]}),(i||r)&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Ubah status"}),t.jsx("div",{className:"hn-bl-status-now",children:`Status saat ini: ${da}`}),e.stage!=="done"&&r&&t.jsx("div",{className:"hn-bl-gap-bottom",children:t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"circle-check",onClick:()=>X(!0),children:"Tandai selesai"})}),i?aa.length>0?t.jsxs(t.Fragment,{children:[t.jsx(Be,{size:"sm","aria-label":"Kembalikan stage",value:G,onChange:ke=>H(ke.target.value),disabled:q,placeholder:"Pilih status lebih awal…",options:aa.map(ke=>({value:ke.key,label:"← "+ke.label}))}),t.jsx("div",{className:"hn-bl-hint hn-bl-gap-top",children:"Status saat ini dan status berikutnya tidak dapat dipilih. Kemajuan hanya berasal dari fase sesi."}),G&&t.jsxs("div",{className:"hn-bl-callout",children:[t.jsxs("div",{className:"hn-bl-callout-title",children:[da," → ",je]}),"Fase sesi yang sudah berjalan tidak dibatalkan. Dokumen Spec/Plan di atas target mungkin perlu dihapus setelah konfirmasi; kode dan commit tidak disentuh."]}),t.jsx("div",{className:"hn-bl-gap-top",children:t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"rotate-ccw",disabled:!G,loading:q,onClick:Ze,children:"Simpan status"})})]}):t.jsxs("div",{className:"hn-bl-hint",children:[da," adalah status paling awal. Kemajuan hanya berasal dari fase sesi."]}):null]}),e.stage==="done"&&l&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Integrasi"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"git-merge",onClick:()=>xe(!0),children:"Rebase / Merge"})]}),f&&t.jsxs("div",{className:"hn-bl-subsection",children:[t.jsx("div",{className:"hn-eyebrow",children:"Type"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"shuffle",onClick:()=>le(!0),children:"Ubah type"})]}),(e.sourceHistory??[]).length>0&&t.jsxs("div",{className:"hn-bl-subsection","data-testid":"source-trail",children:[t.jsx("div",{className:"hn-eyebrow",children:"Jejak konversi type"}),t.jsx("div",{className:"hn-bl-stack-list",children:(e.sourceHistory??[]).map((ke,Ge)=>t.jsxs("div",{className:"hn-bl-trail",children:[t.jsxs("span",{className:"hn-bl-id",children:[ke.from," → ",ke.to]})," · ",new Date(ke.at).toLocaleString("id-ID")," · ",ke.by]},`${ke.at}-${Ge}`))})]})]})]}),b&&t.jsxs("section",{className:"hn-bl-danger","aria-labelledby":"bl-sec-bahaya",children:[t.jsx("h3",{id:"bl-sec-bahaya",className:"hn-bl-section-title",children:"Zona berbahaya"}),t.jsx("div",{className:"hn-bl-hint",children:"Menghapus item tak bisa dibatalkan. Kode dan commit di repo tidak disentuh."}),t.jsx("div",{className:"hn-bl-gap-top",children:t.jsx(U,{size:"sm",variant:"danger",leftIcon:"trash-2",onClick:()=>b(e),children:"Hapus spec"})})]})]}),A&&t.jsxs(ca,{open:!0,title:"Kembalikan status & hapus dokumen fase",icon:"rotate-ccw",eyebrow:e.id+" → "+A.target,onClose:q?void 0:()=>B(null),children:[t.jsxs("div",{className:"hn-bl-confirm-lead",children:[A.files.length," berkas docs akan dihapus dari disk (kode & commit tak disentuh):"]}),t.jsx("ul",{className:"hn-bl-file-list",children:A.files.map(ke=>t.jsx("li",{children:ke},ke))}),t.jsxs("div",{className:"hn-bl-inline-row hn-bl-end",children:[t.jsx(U,{size:"sm",variant:"secondary",disabled:q,onClick:()=>B(null),children:"Batal"}),t.jsx(U,{size:"sm",variant:"danger",leftIcon:"trash-2",loading:q,onClick:z,children:"Hapus & kembalikan"})]})]}),Z&&l&&t.jsx(kN,{projectId:e.projectId,ownBranch:`hanoman/${e.id.toLowerCase().replace(/[^a-z0-9_-]/g,"_")}`,eyebrow:e.id,onClose:()=>xe(!1),onIntegrate:(ke,Ge)=>{xe(!1),l(e,ke,Ge)}}),Y&&r&&t.jsx(Pf,{spec:e,onClose:()=>X(!1),onSubmit:r}),_e&&t.jsx(xu,{specId:e.id,onClose:()=>ae(!1)}),ee&&f&&e.payload!==void 0&&t.jsx(EN,{spec:e,onClose:()=>le(!1),onSubmit:(ke,Ge,ma)=>Promise.resolve(f(e,ke,Ge,ma)??null)})]})}function Df({spec:e,onStart:a,onDelete:n,onOpenRun:i,onOpenReview:r,onMarkDone:s,onMarkReviewed:o,running:l}){const[d,u]=c.useState(!1),[m,h]=c.useState(!1),p=e.stage!=="done",g=l?i?{label:"Buka sesi",icon:"terminal",run:()=>i(e)}:null:p?a?{label:CN(e.stage),icon:"play",run:()=>a(e)}:null:r?{label:"Review perubahan",icon:"git-compare",run:()=>r(e)}:null,b=[...!!r&&(g==null?void 0:g.label)!=="Review perubahan"&&r?[{key:"review",label:"Review perubahan",icon:"git-compare",onSelect:()=>r(e)}]:[],{key:"docs",label:"Lihat dokumen",icon:"file-text",onSelect:()=>u(!0)},...!p&&a?[{key:"rerun",label:"Jalankan lagi",icon:"play",onSelect:()=>a(e)}]:[],...p&&s?[{key:"done",label:"Tandai selesai",icon:"circle-check",onSelect:()=>h(!0)}]:[],...!p&&o?[{key:"reviewed",label:e.reviewedAt?"Batalkan tanda ditinjau":"Tandai ditinjau",icon:e.reviewedAt?"rotate-ccw":"circle-check",onSelect:()=>void o(e,!e.reviewedAt)}]:[],...n?[{key:"delete",label:"Hapus spec",icon:"trash-2",tone:"danger",onSelect:()=>n(e)}]:[]];return t.jsxs("div",{className:"hn-bl-actions",children:[g&&t.jsx(U,{size:"sm",variant:g.label==="Review perubahan"?"secondary":"primary",leftIcon:g.icon,onClick:g.run,children:g.label}),t.jsx(an,{label:`Aksi lain ${e.id}`,items:b}),m&&s&&t.jsx(Pf,{spec:e,onClose:()=>h(!1),onSubmit:s}),d&&t.jsx(xu,{specId:e.id,onClose:()=>u(!1)})]})}const RN=e=>{const a=e?new Date(e):null;return a&&!Number.isNaN(a.getTime())?a.toLocaleDateString("id-ID",{day:"numeric",month:"short",year:"numeric"}):""};function LN({spec:e,onOpenDetail:a,className:n="hn-bl-title"}){return t.jsx("button",{type:"button",className:n,onClick:()=>a&&a(e),children:e.title})}function $N({spec:e,presenceOn:a,onOpenDetail:n,projectName:i,...r}){return t.jsxs(fn,{onClick:n?()=>n(e):void 0,actions:t.jsx(Df,{spec:e,...r}),children:[t.jsx(Tu,{priority:e.priority,stage:e.stage}),t.jsxs("span",{className:"hn-bl-row-body",children:[t.jsx("span",{className:"hn-bl-row-title",children:e.title}),t.jsxs("span",{className:"hn-bl-row-meta",children:[t.jsx("span",{className:"hn-bl-id",children:e.id}),i&&t.jsx("span",{className:"hn-bl-proj",title:`Project: ${i}`,children:i}),t.jsx($f,{source:e.source}),t.jsx(Bf,{stage:e.stage}),t.jsx(Au,{spec:e}),t.jsx(bl,{names:a})]})]})]})}const fl="backlog",Of="success",BN=pn[0].key,xp=[{key:fl,label:"Backlog",icon:"inbox"},...pn.slice(0,5).map(e=>({key:e.key,label:e.label})),{key:Of,label:"Success",icon:"check-circle-2"}];function DN(e,a){return e.stage==="done"?Of:!a&&e.stage==="brainstorming"?fl:e.stage}const jp=(e,a)=>e===fl&&a===BN;function ON({spec:e,col:a,onOpenDetail:n,presenceOn:i,projectName:r,onDragStart:s,onDragEnd:o,dragging:l,...d}){const u=a===fl;return t.jsxs("div",{draggable:u,className:"hn-bl-card","data-dragging":l||void 0,onDragStart:m=>{m.dataTransfer.effectAllowed="move",m.dataTransfer.setData("text/plain",e.id),s()},onDragEnd:o,title:u?"Seret ke Brainstorm untuk memulai sesi":"Stage mengikuti fase yang dilaporkan agen — kartu tak bisa dipindah","data-draggable":u||void 0,children:[t.jsxs("div",{className:"hn-bl-card-head",children:[t.jsx(Tu,{priority:e.priority,stage:e.stage}),t.jsx("span",{className:"hn-bl-id",children:e.id}),t.jsx($f,{source:e.source})]}),t.jsx(LN,{spec:e,onOpenDetail:n}),r&&t.jsx("span",{className:"hn-bl-proj",title:`Project: ${r}`,children:r}),(e.blockedBy??[]).length>0||i!=null&&i.length?t.jsxs("div",{className:"hn-bl-card-badges",children:[t.jsx(Au,{spec:e}),t.jsx(bl,{names:i})]}):null,t.jsx("div",{className:"hn-bl-card-foot",children:t.jsx(Df,{spec:e,...d})})]})}function HN({specs:e,activeSpecs:a,presenceBySpec:n,onOpenDetail:i,projectNameOf:r,...s}){const[o,l]=c.useState(null),[d,u]=c.useState(null),m=c.useMemo(()=>{var g;const p=new Map(xp.map(f=>[f.key,[]]));for(const f of e)(g=p.get(DN(f,a==null?void 0:a.has(f.id))))==null||g.push(f);return p},[e,a]),h=p=>{o&&jp(o.from,p)&&s.onStart&&s.onStart(o.spec),l(null),u(null)};return t.jsx("div",{"data-testid":"backlog-board",className:"hn-board-local-overflow hn-bl-board",children:xp.map(p=>{const g=m.get(p.key),f=!!o&&jp(o.from,p.key),b=f&&d===p.key;return t.jsxs("div",{className:"hn-bl-col","data-active":f||void 0,"data-hot":b||void 0,"data-dimmed":o&&!f||void 0,onDragOver:v=>{f&&(v.preventDefault(),v.dataTransfer.dropEffect="move",u(p.key))},onDragLeave:()=>u(v=>v===p.key?null:v),onDrop:v=>{v.preventDefault(),h(p.key)},children:[t.jsxs("div",{className:"hn-bl-col-head",children:[p.icon&&t.jsx(Re,{name:p.icon,size:13,color:"var(--text-muted)"}),t.jsx("span",{className:"hn-eyebrow",children:p.label}),t.jsx("span",{className:"hn-bl-col-count",children:g.length})]}),t.jsx("div",{className:"hn-bl-col-body",children:g.map(v=>t.jsx(ON,{spec:v,col:p.key,onOpenDetail:i,projectName:r==null?void 0:r(v.projectId),presenceOn:n==null?void 0:n.get(v.id),...s,dragging:(o==null?void 0:o.spec.id)===v.id,running:a==null?void 0:a.has(v.id),onDragStart:()=>l({spec:v,from:p.key}),onDragEnd:()=>{l(null),u(null)}},v.id))})]},p.key)})})}const qN=[{value:"list",label:"Daftar",icon:"list"},{value:"board",label:"Papan",icon:"kanban"}];function UN({value:e,onChange:a}){return t.jsx("div",{className:"hn-bl-view-toggle",role:"group","aria-label":"Mode tampilan",children:qN.map(n=>t.jsx("button",{type:"button",className:"hn-bl-view-btn hn-touch-target","aria-pressed":e===n.value,"aria-label":n.label,title:n.label,onClick:()=>a(n.value),children:t.jsx(Re,{name:n.icon,size:15})},n.value))})}const zN=5,FN=new Set;function GN({backlog:e,projects:a,pageSize:n=20,onStart:i,activeSpecs:r,presenceBySpec:s,reviewSpecIds:o=FN,onDelete:l,onOpenRun:d,onOpenReview:u,onNew:m,onEditBranch:h,onRevertStage:p,onMarkDone:g,onMarkReviewed:f,onIntegrate:b,onEditSpec:v,onEditDeps:x,onEditAutoMerge:y,onChangeSource:T,onPromoteToQa:S,onPromoteToBrief:E,onPromoteToPrd:w,projectFilter:M,onProjectFilter:N,dataVersion:R,onToast:I,initialDetailId:L}){var Ct,sn,Rt,wn,Lt;const[A,B]=Oa("backlog","tab","all",Hn),[G,H]=c.useState(0),[Y,X]=Oa("backlog","view","list",vi("list","board")),[q,ie]=Oa("backlog","stageGroup","all",vi("all","brainstorm","spec","doing","done")),[te,Z]=Oa("backlog","q","",Hn),[xe,_e]=Oa("backlog","prio","all",Hn),[ae,ee]=Oa("backlog","worktree","all",vi("all","worktree")),[le,re]=Oa("backlog","review","all",vi("all","review")),[Ce,Ee]=Oa("backlog","dateField","created",vi("created","started")),[J,ea]=Oa("backlog","from","",Hn),[Ke,He]=Oa("backlog","to","",Hn),Ve=M,ya=N,[We,ga]=Oa("backlog","detailId",null,Qk);c.useEffect(()=>{L&&ga(L)},[L]);const qa=c.useCallback(he=>{var ra;return(ra=(a??[]).find(za=>za.id===he))==null?void 0:ra.name},[a]),wa=a||[...new Set(e.map(he=>he.projectId))].map(he=>({id:he,name:he})),[be,Ze]=c.useState(()=>e.map(he=>({objective:"",...he}))),[z,$e]=Oa("backlog","page",1,ou),[aa,da]=c.useState(()=>te.trim()),[je,ye]=c.useState(!1),[Ue,ve]=c.useState(!1),[fe,_a]=c.useState(!1),Ta=c.useRef(!1),[sa,Ba]=Rk(),ta=c.useCallback((he,ra)=>{Ba(he,"ok",void 0,{action:{label:"Urungkan",onAction:ra}})},[Ba]),ke=[A!=="all",Ve!=="all",te.trim()!=="",q!=="all",xe!=="all",J!=="",Ke!=="",ae!=="all",le!=="all"].filter(Boolean).length,Ge=lu("backlog","scroll",be.length>0);c.useEffect(()=>{const he=setTimeout(()=>da(te.trim()),250);return()=>clearTimeout(he)},[te]),Xk(JSON.stringify([A,Ve,q,xe,aa,Ce,J,Ke,ae,le]),()=>$e(1)),c.useEffect(()=>{var za;let he=!0;const ra=(za=se.listSpecs)==null?void 0:za.call(se,{project:Ve==="all"?void 0:Ve,source:A==="all"?void 0:A,q:aa||void 0,priority:xe==="all"?void 0:xe,dateField:J||Ke?Ce:void 0,from:J||void 0,to:Ke||void 0});return ve(!!ra),ra==null||ra.then(Wa=>{he&&(Ze(Wa.items),_a(!0),Ta.current=!1,ye(!1),ve(!1))}).catch(()=>{he&&(Ta.current||(Ta.current=!0,I==null||I("Gagal menyegarkan backlog — data di layar mungkin usang","warn")),ye(!0),ve(!1))}),()=>{he=!1}},[A,Ve,xe,aa,Ce,J,Ke,R,G]);const ma=c.useMemo(()=>new Map(e.map(he=>[he.id,he])),[e]),Ne=c.useMemo(()=>be.map(he=>sd(he,ma.get(he.id))),[be,ma]),Ja=c.useMemo(()=>gN(uN(Ne,ae),le,o),[Ne,ae,le,o]),At=c.useMemo(()=>{const he={};for(const ra of hr)he[ra.key]=Ja.filter(za=>gp(za.stage,ra.key)).length;return he},[Ja]),ut=c.useMemo(()=>Ja.filter(he=>gp(he.stage,q)),[Ja,q]),rt=Cs(ut.length,z,n),tn=ut.slice((rt.page-1)*n,rt.page*n),[Pa,ot]=c.useState(null);c.useEffect(()=>{if(!We||!se.getSpec){ot(null);return}let he=!0;return se.getSpec(We).then(ra=>{he&&ot(ra)}).catch(ra=>{!he||!(ra instanceof ba)||ra.status!==404||(ga(null),I==null||I(`${We} sudah tidak ada`,"warn"))}),()=>{he=!1}},[We,R]);const Ka=c.useMemo(()=>{if(!We)return null;const he=ma.get(We);if((Pa==null?void 0:Pa.id)===We)return sd(Pa,he);const ra=be.find(za=>za.id===We);return ra?sd(ra,he):he?{objective:"",...he}:null},[We,Pa,be,ma]),{confirm:Ua,dialog:It}=st(),Tt=l?he=>{var za;const ra=((za=a.find(Wa=>Wa.id===he.projectId))==null?void 0:za.name)??he.projectId;Ua({title:`Hapus ${he.id}?`,message:`"${he.title}" dihapus dari backlog ${ra}.`,impact:["Tindakan ini tidak bisa dibatalkan.","Lampiran item ini ikut dihapus dari disk.","Sesi yang masih berjalan untuk item ini tidak ikut dihentikan.","Item lain yang menunggu item ini tidak lagi bergantung padanya.","Kode dan commit di repo tidak disentuh."],confirmLabel:"Hapus spec",tone:"danger",icon:"trash-2",run:async()=>{await l(he),We===he.id&&ga(null)}}).catch(Wa=>I==null?void 0:I(va(`menghapus ${he.id}`,Wa),"err","x-circle"))}:void 0,vt=()=>{B("all"),ya("all"),Z(""),ie("all"),_e("all"),Ee("created"),ea(""),He(""),ee("all"),re("all"),$e(1)},jn=[...A!=="all"?[{key:"tab",label:`Sumber: ${((Ct=bp.find(he=>he.value===A))==null?void 0:Ct.label)??A}`,onRemove:()=>B("all")}]:[],...Ve!=="all"?[{key:"proj",label:`Project: ${((sn=wa.find(he=>he.id===Ve))==null?void 0:sn.name)??Ve}`,onRemove:()=>ya("all")}]:[],...xe!=="all"?[{key:"prio",label:`Prioritas: ${Ko(xe).label}`,onRemove:()=>_e("all")}]:[],...J||Ke?[{key:"date",label:`Tanggal ${Ce==="created"?"dibuat":"dikerjakan"}: ${J||"…"} – ${Ke||"…"}`,onRemove:()=>{ea(""),He("")}}]:[],...ae!=="all"?[{key:"wt",label:Od.worktree,onRemove:()=>ee("all")}]:[],...le!=="all"?[{key:"review",label:Hd.review,onRemove:()=>re("all")}]:[]],Et=t.jsxs(tA,{gap:3,children:[t.jsx(de,{label:"Sumber",children:t.jsx(Be,{size:"sm","aria-label":"Filter sumber",value:A,onChange:he=>B(he.target.value),options:bp})}),t.jsx(de,{label:"Project",children:t.jsx(Be,{size:"sm","aria-label":"Filter project",value:Ve,onChange:he=>ya(he.target.value),options:[{value:"all",label:"Semua project"}].concat(wa.map(he=>({value:he.id,label:he.name})))})}),t.jsx(de,{label:"Prioritas",children:t.jsx(Be,{size:"sm","aria-label":"Filter prioritas",value:xe,onChange:he=>_e(he.target.value),options:PN})}),t.jsx(de,{label:"Worktree",hint:"Hanya item yang pernah dibuatkan worktree oleh hanoman. Pekerjaan di luar hanoman tidak terhitung.",children:t.jsx(Be,{size:"sm","aria-label":"Filter worktree",value:ae,onChange:he=>ee(he.target.value),options:dN.map(he=>({value:he.value,label:he.label}))})}),t.jsx(de,{label:"Tinjauan",hint:"Item yang sesinya menunggu jawabanmu, dan item selesai yang belum kamu tandai sudah ditinjau. Tandai lewat menu item atau di Review perubahan.",children:t.jsx(Be,{size:"sm","aria-label":"Filter perlu ditinjau",value:le,onChange:he=>re(he.target.value),options:mN.map(he=>({value:he.value,label:he.label}))})}),t.jsx(de,{label:"Tanggal",children:t.jsxs("div",{className:"hn-bl-date-row",children:[t.jsx(Be,{size:"sm","aria-label":"Filter tanggal berdasarkan",value:Ce,onChange:he=>Ee(he.target.value),options:[{value:"created",label:"Dibuat"},{value:"started",label:"Dikerjakan"}]}),t.jsx(Oe,{size:"sm",type:"date","aria-label":"Tanggal dari",value:J,onChange:he=>ea(he.target.value)}),t.jsx("span",{className:"hn-eyebrow","aria-hidden":"true",children:"→"}),t.jsx(Oe,{size:"sm",type:"date","aria-label":"Tanggal sampai",value:Ke,onChange:he=>He(he.target.value)})]})})]}),Nt=!fe&&Ne.length===0&&Ue,mt={onStart:i,onDelete:Tt,onOpenRun:d,onOpenReview:u,onMarkDone:g,onMarkReviewed:f},nn=he=>ga(he.id),ha=((Rt=hr.find(he=>he.key===q))==null?void 0:Rt.label)??"";return t.jsxs("div",{className:"hn-bl-screen",children:[t.jsxs("section",{className:"hn-bl-toolbar",role:"region","aria-label":"Kontrol backlog",children:[t.jsx(aA,{label:"Penyaring backlog",search:{value:te,onChange:Z,label:"Cari backlog",placeholder:"mis. invoice atau SPEC-412"},chips:jn,filters:Et,filtersLabel:"Filter",onReset:ke>0?vt:void 0,resetLabel:"Reset filter",actions:t.jsxs(t.Fragment,{children:[t.jsx(UN,{value:Y,onChange:X}),t.jsx(wN,{onDone:()=>H(he=>he+1),onToast:I??(()=>{})})]})}),t.jsx(St,{variant:"pill","aria-label":"Tahap backlog",value:q,onChange:he=>ie(he),className:"hn-bl-stage-tabs",tabs:hr.map(he=>({value:he.key,label:he.label,count:At[he.key]}))}),fp[A]&&t.jsx("p",{className:"hn-bl-hint","data-testid":"backlog-tab-hint",children:fp[A]}),t.jsxs("div",{className:"hn-bl-status-line",children:[je&&t.jsx("span",{role:"status",className:"hn-bl-stale",title:"Server tak menjawab saat menyegarkan — angka ini dari muatan terakhir yang berhasil",children:"Data mungkin usang: server tak menjawab saat menyegarkan."}),Ue&&t.jsx("span",{"data-testid":"backlog-refreshing",className:"hn-bl-muted",children:"Memuat…"})]})]}),Nt?t.jsx(Hk,{rows:zN,label:"Memuat backlog"}):Ja.length===0?e.length===0?t.jsx(pe,{kind:"empty",illustration:"PST-002",title:"Backlog masih kosong",hint:"Ajukan feature brief atau Finding QA — hanoman menjalankannya dari brainstorm sampai execute.",action:m,actionLabel:"Tambah spec"}):t.jsx(pe,{kind:"empty",icon:"filter",title:"Tidak ada spec untuk filter ini",hint:`${e.length} spec ada di backlog, tapi tak ada yang cocok dengan filter aktif.`,action:vt,actionLabel:"Reset filter",actionIcon:"rotate-ccw"}):ut.length===0?t.jsx(pe,{kind:"empty",compact:!0,icon:"filter",title:`Tidak ada spec di tahap ${ha}`,hint:"Tahap lain tetap memuat item yang sama.",action:()=>ie("all"),actionLabel:"Tampilkan semua",actionIcon:"x"}):Y==="board"?t.jsxs("div",{className:"hn-bl-body",children:[t.jsx("p",{"data-testid":"board-drag-hint",className:"hn-bl-hint",children:"Seret kartu dari kolom Backlog ke Brainstorm untuk memulai sesi. Tombol di kartu melakukan hal yang sama."}),t.jsx(HN,{specs:ut,activeSpecs:r,presenceBySpec:s,projectNameOf:qa,onOpenDetail:nn,...mt})]}):t.jsxs("div",{className:"hn-bl-body",children:[t.jsx("div",{ref:Ge,"data-testid":"backlog-scroll","aria-busy":Ue||void 0,className:"hn-bl-list-scroll",children:t.jsx(bn,{label:"Daftar backlog",children:tn.map(he=>t.jsx($N,{spec:he,presenceOn:s==null?void 0:s.get(he.id),projectName:qa(he.projectId),running:r==null?void 0:r.has(he.id),onOpenDetail:nn,...mt},he.id))})}),t.jsx("div",{className:"hn-bl-pager",children:t.jsx(Ps,{page:rt.page,pageCount:rt.pageCount,total:ut.length,from:rt.from,to:rt.to,onPage:$e,unit:"spec"})})]}),t.jsx(NN,{spec:Ka,onClose:()=>ga(null),running:!!We&&!!(r!=null&&r.has(We)),onOpenRun:d,presenceOn:We?s==null?void 0:s.get(We):void 0,onEditBranch:h,onRevertStage:p,onMarkDone:g,onOpenReview:u,onStart:i,onIntegrate:b,onEditSpec:v,onPromoteToQa:S,onPromoteToBrief:E,onPromoteToPrd:w,onEditDeps:x,onEditAutoMerge:y,onChangeSource:T,onRequestDelete:Tt,onUndoable:ta,projectPolicy:(wn=a.find(he=>{var ra;return he.id===((ra=e.find(za=>za.id===We))==null?void 0:ra.projectId)}))==null?void 0:wn.autoMerge,projectName:(Lt=a.find(he=>he.id===(Ka==null?void 0:Ka.projectId)))==null?void 0:Lt.name,allSpecs:e,onAttachmentToast:(he,ra)=>I==null?void 0:I(he,ra??"ok","paperclip")}),t.jsx(Zc,{toast:sa}),It]})}const wp=20,Sp=m1,kd=e=>e?new Date(e).toLocaleDateString("id-ID",{day:"numeric",month:"short",year:"numeric"}):"—";function KN({projectId:e}){const[a,n]=c.useState(null),[i,r]=c.useState(0),[s,o]=c.useState(null),[l,d]=c.useState(1),[u,m]=c.useState(null),[h,p]=c.useState(""),[g,f]=c.useState(null),b=c.useCallback(()=>{$l.listSessions(e,{page:l,limit:wp}).then(T=>{n(T.items),r(T.total),o(T.kuota)}).catch(()=>{n([]),r(0),o(null)})},[e,l]);c.useEffect(()=>{m(null),b()},[b]),c.useEffect(()=>{d(1)},[e]);const v=T=>{f(null),p(""),$l.getSession(T).then(m).catch(()=>m(null))},x=async()=>{if(!(!u||!h.trim()))try{const T=await $l.materializePrd(u.id,h.trim());f(`PRD tersimpan di ${T.path}. Ia BELUM jadi backlog — eskalasi tetap keputusan Anda.`),b()}catch(T){f(T instanceof Error?T.message:"gagal menulis PRD")}};if(a===null)return t.jsx(pe,{kind:"loading",title:"Memuat obrolan…"});const y=Cs(i,l,wp);return t.jsxs("div",{className:"hn-pc",children:[s&&t.jsxs("div",{"data-testid":"portal-chat-kuota",className:"hn-pc-kuota",children:["Jatah bulan ini — Brainstorming ",t.jsxs("b",{children:[s.brainstorm.terpakai," / ",s.brainstorm.jatah]})," · ","Bertanya ",t.jsxs("b",{children:[s.tanya.terpakai," / ",s.tanya.jatah]})," · ","reset ",kd(s.resetPada),!s.enabled&&" · obrolan portal sedang MATI di Settings"]}),a.length===0?t.jsx(pe,{kind:"empty",icon:"messages-square",title:"Belum ada obrolan",hint:"Begitu klien memulai obrolan di portal, sesinya muncul di sini."}):t.jsxs(t.Fragment,{children:[t.jsx(Sa,{padding:0,children:a.map(T=>t.jsxs("button",{type:"button","data-testid":`portal-chat-row-${T.id}`,onClick:()=>v(T.id),className:"hn-pc-row",children:[t.jsx("span",{className:"hn-pc-type",children:Sp[T.type]??T.type}),t.jsx("span",{className:"hn-pc-summary",children:T.summary||"Belum ada ringkasan"}),T.prdSiap&&t.jsx(bt,{status:T.prdDocPath?"ok":"warn",size:"sm",children:T.prdDocPath?"PRD dokumen":"PRD draft"}),t.jsx("span",{className:"hn-pc-meta",children:T.clientEmail}),t.jsx("span",{className:"hn-pc-meta",children:kd(T.createdAt)})]},T.id))}),t.jsx(Ps,{page:y.page,pageCount:y.pageCount,total:i,from:y.from,to:y.to,onPage:d,unit:"obrolan"})]}),u&&t.jsxs(Sa,{eyebrow:`${Sp[u.type]??u.type} · ${u.clientEmail}`,title:u.summary||"Obrolan",children:[t.jsx("div",{"data-testid":"portal-chat-transkrip",className:"hn-pc-transcript",children:u.messages.map(T=>t.jsxs("div",{className:"hn-pc-msg","data-role":T.role,"data-blocked":T.blocked?"true":"false",children:[t.jsxs("div",{className:"hn-pc-msg-meta",children:[T.role==="klien"?"Klien":"hanoman"," · ",kd(T.createdAt)]}),t.jsx("div",{className:"hn-pc-msg-text",children:T.text}),T.blocked&&t.jsxs("div",{className:"hn-pc-blocked",children:[t.jsx("b",{children:"Diblokir"})," (",(T.blockReasons??[]).join(", "),") — teks asli agen:",t.jsx("div",{className:"hn-pc-raw",children:T.rawText})]})]},T.id))}),u.prdMarkdown&&t.jsxs(t.Fragment,{children:[t.jsx("div",{"data-testid":"portal-chat-prd",className:"hn-pc-prd",children:t.jsx(Ms,{text:u.prdMarkdown,name:"prd-draft.md"})}),t.jsxs("div",{className:"hn-pc-prd-actions",children:[t.jsx(Oe,{"data-testid":"portal-chat-slug","aria-label":"Slug dokumen PRD",placeholder:"nama-dokumen",value:h,className:"hn-pc-slug",onChange:T=>p(T.target.value)}),t.jsx(U,{"data-testid":"portal-chat-jadikan-prd",disabled:!h.trim(),onClick:()=>void x(),children:"Jadikan dokumen PRD"}),t.jsxs("span",{className:"hn-pc-meta",children:["Menyimpan ke ",t.jsx("code",{children:"docs/prd/"}),". Tidak membuat backlog."]})]})]}),g&&t.jsx("p",{className:"hn-pc-note",children:g})]})]})}function Hf({projects:e,defaultProject:a,onClose:n,onCreate:i,prefill:r,lockProject:s}){var f;const[o,l]=c.useState(a||((f=e[0])==null?void 0:f.id)||""),[d,u]=c.useState({title:(r==null?void 0:r.title)??"",context:(r==null?void 0:r.context)??"",outcome:(r==null?void 0:r.outcome)??"",constraints:(r==null?void 0:r.constraints)??""}),m=b=>v=>u(x=>({...x,[b]:v.target.value})),h=!!d.title.trim()&&!!o,p=()=>{h&&i(o,{title:d.title.trim(),context:d.context,outcome:d.outcome,constraints:d.constraints||void 0})},g=t.jsx("span",{"aria-hidden":"true",className:"hn-prj-required",children:"*"});return t.jsxs(ca,{open:!0,onClose:n,icon:"scroll-text",eyebrow:"PM → hanoman",title:"PRD baru",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",size:"sm",onClick:n,children:"Batal"}),t.jsx(U,{size:"sm",leftIcon:"messages-square",onClick:p,disabled:!h,children:"Buat brief → brainstorm PRD"})]}),children:[t.jsxs("p",{className:"hn-prj-note",children:["hanoman membuka sesi brainstorm interaktif di terminal, lalu menulis dokumen PRD ke ",t.jsx("code",{children:"docs/prd/"}),"."]}),t.jsxs("p",{className:"hn-prj-note",children:[t.jsx("span",{"aria-hidden":"true",className:"hn-prj-required",children:"*"})," wajib diisi"]}),t.jsx(de,{label:t.jsxs(t.Fragment,{children:["Project",g]}),hint:"Tujuan penulisan docs/prd/ — pilih di sini, tak perlu memfilter daftar dulu",children:t.jsx(Be,{"aria-label":"Project untuk PRD baru",value:o,disabled:s,onChange:b=>l(b.target.value),className:"hn-prj-full",options:e.map(b=>({value:b.id,label:b.name}))})}),t.jsx(de,{label:t.jsxs(t.Fragment,{children:["Judul",g]}),hint:d.title.trim()?void 0:"Wajib diisi — tanpa judul, brief tak bisa dibuat.",children:t.jsx(Oe,{value:d.title,onChange:m("title"),placeholder:"mis. Jadwal Invoice Berulang",className:"hn-prj-full"})}),t.jsx(de,{label:"Konteks",hint:"Latar belakang & alasan fitur ini dibutuhkan",children:t.jsx(La,{value:d.context,onChange:m("context"),rows:3,placeholder:"mis. operator harus membuka tiga layar untuk tahu sesi mana yang menunggu"})}),t.jsx(de,{label:"Hasil yang diharapkan",children:t.jsx(La,{value:d.outcome,onChange:m("outcome"),rows:2,placeholder:"mis. satu badge di Overview menunjukkan jumlah sesi yang menunggu"})}),t.jsx(de,{label:"Batasan",hint:"opsional",children:t.jsx(Oe,{value:d.constraints,onChange:m("constraints"),placeholder:"mis. reuse queue yang ada",className:"hn-prj-full"})})]})}const WN={draft:"neutral",dieskalasi:"info",terwujud:"ok"};function VN({prd:e}){const a=Ud[e.status]??e.status;return t.jsx(la,{tone:WN[e.status],size:"sm",children:e.specCount>0?`${a} ${e.doneCount}/${e.specCount}`:a})}function YN({open:e,onClose:a,prd:n,takeBase:i,items:r,include:s,setInclude:o,busy:l,onTake:d,onStartBreakdown:u,onMaterialize:m,projectId:h}){const p=r.filter((g,f)=>s[f]).length;return t.jsxs(ca,{open:e,onClose:a,icon:"list-checks",width:600,eyebrow:"PRD → backlog",title:"Jadikan backlog",footer:t.jsx(U,{variant:"ghost",size:"sm",onClick:a,children:"Batal"}),children:[t.jsxs("p",{className:"hn-prj-note",children:["Pilih bentuk backlog untuk ",t.jsx("b",{children:n.title}),". Manusia yang memutuskan."]}),t.jsxs("div",{className:"hn-prj-sheet-options",children:[t.jsxs("div",{className:"hn-prj-sheet-option",children:[t.jsx(U,{leftIcon:"lightbulb",onClick:()=>{a(),d({...i,kind:"brief",context:`Dari PRD: ${n.path}`,outcome:""})},children:"Sebagai feature brief"}),t.jsx("p",{className:"hn-prj-hint",children:"Sesi menjalankan pipeline penuh: brainstorm → objective → spec → plan → execute."})]}),t.jsxs("div",{className:"hn-prj-sheet-option",children:[t.jsx(U,{leftIcon:"target",variant:"secondary",onClick:()=>{a(),d({...i,kind:"goal",context:"",outcome:"",goal:`Wujudkan PRD ${n.path}`})},children:"Sebagai goal"}),t.jsx("p",{className:"hn-prj-hint",children:"Sesi dua fase (Goal → Verifikasi) yang langsung mengejar goal-nya, tanpa brainstorm, spec, maupun plan. Mode goal selalu aktif."})]}),t.jsx("div",{className:"hn-prj-sheet-option",children:r.length>0?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"hn-prj-sheet-head",children:[t.jsxs("span",{className:"hn-prj-sheet-title",children:["Breakdown · ",r.length," item"]}),t.jsxs("span",{className:"hn-prj-hint",children:[p,"/",r.length," dipilih"]})]}),t.jsx("ul",{className:"hn-prj-checklist",children:r.map((g,f)=>t.jsx("li",{children:t.jsxs("label",{className:"hn-prj-check",children:[t.jsx("input",{type:"checkbox",checked:s[f]??!1,className:"hn-prj-check-input",onChange:b=>o(v=>v.map((x,y)=>y===f?b.target.checked:x))}),t.jsxs("span",{className:"hn-prj-check-text",children:[t.jsxs("span",{className:"hn-prj-check-title",children:[g.title," ",t.jsx(la,{tone:"brass",size:"sm",children:g.priority})]}),g.outcome&&t.jsx("span",{className:"hn-prj-hint",children:g.outcome})]})]})},f))}),t.jsx(U,{size:"sm",leftIcon:"plus",disabled:!p||l,onClick:m,children:l?"Membuat…":`Buat ${p} backlog`})]}):t.jsxs(t.Fragment,{children:[t.jsx(U,{leftIcon:"split",variant:"secondary",onClick:()=>{a(),u(h,n.path)},children:"Breakdown ke backlog"}),t.jsx("p",{className:"hn-prj-hint",children:"Mulai sesi breakdown yang menulis usulan backlog paralel dari PRD ini."})]})})]})]})}function JN({prd:e,projectId:a,dataVersion:n,onTake:i,onStartBreakdown:r,onMaterialize:s}){const[o,l]=c.useState(null),[d,u]=c.useState(""),[m,h]=c.useState(0),[p,g]=c.useState([]),[f,b]=c.useState([]),[v,x]=c.useState(""),[y,T]=c.useState(0),[S,E]=c.useState(!1),[w,M]=c.useState(!1);c.useEffect(()=>{let L=!0;return l(null),u(""),se.getPrd(a,e.path).then(A=>{L&&l(A.content)}).catch(A=>{L&&u(Ts(A,"tidak diketahui"))}),()=>{L=!1}},[a,e.path,m]),c.useEffect(()=>{let L=!0;return se.getBreakdown(a,e.path).then(A=>{L&&(g(A.items),b(A.items.map(()=>!0)),x(""))}).catch(A=>{if(L){if((A==null?void 0:A.status)===404){g([]),b([]),x("");return}x(Ts(A,"tidak diketahui"))}}),()=>{L=!1}},[a,e.path,n,y]);const N={project:a,title:e.title,prdPath:e.path,branchFrom:lC(e.path)},R=p.filter((L,A)=>f[A]),I=async()=>{if(R.length){E(!0);try{await s(a,e.path,R),M(!1)}finally{E(!1)}}};return t.jsxs("div",{className:"hn-prd-pane",children:[t.jsxs("div",{className:"hn-prd-actionbar",role:"toolbar","aria-label":"Aksi PRD",children:[t.jsx("span",{className:"hn-prd-actionbar-title",children:e.title}),t.jsx(U,{size:"sm",leftIcon:"list-checks",onClick:()=>M(!0),children:"Jadikan backlog"}),t.jsx(an,{label:"Aksi lain PRD",icon:"ellipsis",items:[],children:t.jsx(cb,{href:L=>se.prdDownloadUrl(a,e.path,L),disabled:o===null})})]}),t.jsxs("div",{className:"hn-prd-read",children:[t.jsxs("header",{className:"hn-prd-head",children:[t.jsx("div",{className:"hn-prj-mono hn-prd-path",children:e.path}),t.jsxs("div",{className:"hn-prd-head-row",children:[t.jsx("h2",{className:"hn-prd-title",children:e.title}),t.jsx(VN,{prd:e})]})]}),v&&t.jsxs("div",{role:"alert",className:"hn-prj-stale",children:[t.jsxs("span",{className:"hn-prj-stale-text",children:["Usulan breakdown gagal dimuat: ",v]}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"rotate-ccw",onClick:()=>T(L=>L+1),children:"Coba lagi"})]}),p.length>0&&t.jsxs("details",{className:"hn-prd-breakdown",children:[t.jsxs("summary",{className:"hn-prd-breakdown-summary",children:["Usulan breakdown · ",p.length," item"]}),t.jsx("ul",{className:"hn-prd-breakdown-list",children:p.map((L,A)=>t.jsxs("li",{children:[t.jsx("span",{className:"hn-prd-breakdown-item",children:L.title}),t.jsx(la,{tone:"brass",size:"sm",children:L.priority})]},A))}),t.jsx("p",{className:"hn-prj-hint",children:"Pilih item yang dibuat lewat “Jadikan backlog”."})]}),d?t.jsx(pe,{kind:"error",title:"Gagal memuat isi PRD",hint:d,action:()=>h(L=>L+1)}):o===null?t.jsx(pe,{kind:"loading",title:"Memuat PRD…"}):t.jsx("div",{className:"hn-prd-doc",children:t.jsx(Ms,{text:o,name:e.name})})]}),t.jsx(YN,{open:w,onClose:()=>M(!1),prd:e,takeBase:N,items:p,include:f,setInclude:b,busy:S,onTake:i,onStartBreakdown:r,onMaterialize:()=>{I()},projectId:a})]})}function QN(e){const a=[],n=new Map;for(const i of e){let r=n.get(i.projectId);r||(r={projectId:i.projectId,projectName:i.projectName,items:[]},n.set(i.projectId,r),a.push(i.projectId)),r.items.push(i)}return a.map(i=>n.get(i))}function ZN({prd:e,active:a,showProject:n,onSelect:i}){return t.jsxs("button",{type:"button",onClick:i,"aria-current":a?"true":void 0,className:`hn-prd-item${a?" is-active":""}`,children:[t.jsxs("span",{className:"hn-prd-item-head",children:[t.jsx(Re,{name:"scroll-text",size:13,color:a?"var(--brass-700)":"var(--brass-500)"}),t.jsx("span",{className:"hn-prd-item-title",children:e.title}),e.live&&t.jsx(la,{tone:"brass",size:"sm",children:"sesi hidup"})]}),t.jsxs("span",{className:"hn-prd-item-meta",children:[n&&t.jsxs("span",{children:[e.projectName," · "]}),e.specCount>0&&t.jsxs("span",{children:[e.doneCount,"/",e.specCount," item selesai · "]}),t.jsx("span",{className:"hn-prj-mono",children:e.path})]})]})}function XN({projects:e,projectFilter:a,onProjectFilter:n,onNewPrd:i,onTakeToBacklog:r,onStartBreakdown:s,onMaterialize:o,dataVersion:l}){const[d,u]=c.useState([]),[m,h]=c.useState("loading"),[p,g]=c.useState(""),[f,b]=c.useState(0),[v,x]=Oa("prd","sel",null,Qk),[y,T]=c.useState("list"),S=c.useMemo(()=>d.find(q=>q.slug===v)??null,[d,v]),E=c.useCallback(q=>x(q?q.slug:null),[x]),[w,M]=c.useState(!1),N=a==="all",R=N?"":a,I=c.useRef(null);c.useEffect(()=>{I.current!==null&&I.current!==a&&E(null),I.current=a},[a,E]),c.useEffect(()=>{let q=!0;return(N?se.listAllPrds():R?se.listPrds(R):Promise.resolve({items:[]})).then(te=>{q&&(u(te.items),h("ready"),g(""))}).catch(te=>{q&&(h("error"),g(Ts(te,"tidak diketahui")))}),()=>{q=!1}},[a,l,f]);const[L,A]=c.useState(!1),B=S?S.projectId||R:"",G=[{value:"all",label:"Semua project"}].concat(e.map(q=>({value:q.id,label:q.name}))),H=[...Cd],Y=[...Cd.map(q=>({status:q,label:ri(Ud,q),items:d.filter(ie=>ie.status===q)})),...Array.from(new Set(d.map(q=>q.status).filter(q=>!H.includes(q)))).map(q=>({status:q,label:ri(Ud,q),items:d.filter(ie=>ie.status===q)}))],X=m==="loading"&&d.length===0?t.jsx(pe,{kind:"loading",compact:!0,title:"Memuat daftar PRD…"}):m==="error"&&d.length===0?t.jsx(pe,{kind:"error",compact:!0,title:"Gagal memuat daftar PRD",hint:p,action:()=>b(q=>q+1)}):d.length===0?t.jsx(pe,{kind:"empty",icon:"scroll-text",title:"Belum ada PRD",hint:"Buat PRD dari brief + brainstorm; hanoman menulisnya ke docs/prd/ lalu bisa di-take jadi backlog.",action:()=>M(!0),actionLabel:"PRD baru"}):t.jsxs(t.Fragment,{children:[m==="error"&&t.jsxs("div",{role:"alert",className:"hn-prj-stale hn-prd-stale",children:[t.jsx("span",{className:"hn-prj-stale-text",children:"Gagal memuat ulang — daftar dari muatan terakhir."}),t.jsx(U,{size:"sm",variant:"secondary",onClick:()=>b(q=>q+1),children:"Coba lagi"})]}),Y.filter(q=>q.items.length>0).map(q=>t.jsxs("details",{open:!0,className:"hn-prd-group",children:[t.jsxs("summary",{className:"hn-prd-group-summary",children:[q.label,t.jsx("span",{className:"hn-prj-chip-count",children:q.items.length})]}),QN(q.items).map(ie=>t.jsxs("div",{className:"hn-prd-group-body",children:[N&&t.jsx("div",{className:"hn-eyebrow hn-prd-project-label",children:ie.projectName}),ie.items.map(te=>t.jsx(ZN,{prd:te,showProject:!1,active:(S==null?void 0:S.path)===te.path&&(S==null?void 0:S.projectId)===te.projectId,onSelect:()=>{E(te),T("detail")}},`${te.projectId}:${te.path}`))]},ie.projectId))]},q.status))]});return t.jsxs("div",{style:$k,children:[t.jsxs("div",{style:Io,className:"hn-prd-toolbar",children:[t.jsx(Be,{size:"sm",value:a,"aria-label":"Project",onChange:q=>n(q.target.value),options:G}),t.jsx(AE,{screen:"prd",active:N?0:1}),t.jsx("span",{className:"hn-prd-toolbar-spacer"}),!N&&t.jsx(U,{size:"sm",variant:L?"primary":"ghost",leftIcon:"messages-square","aria-expanded":L,onClick:()=>A(q=>!q),children:"Draft dari portal klien"}),t.jsx(U,{size:"sm",leftIcon:"plus",onClick:()=>M(!0),children:"PRD baru"})]}),L&&!N&&t.jsx("div",{style:Io,className:"hn-prd-portal",children:t.jsx(KN,{projectId:a})}),t.jsx(dl,{ariaLabel:"Panel PRD",active:y,onActiveChange:q=>T(q),masterWidth:288,panels:[{id:"list",label:"Indeks",className:"hn-panel-flex",content:t.jsx("aside",{"aria-label":"Indeks PRD",className:"hn-prd-index",children:X})},{id:"detail",label:"Isi",className:"hn-panel-flex",content:t.jsx("section",{"aria-label":"Isi PRD",className:"hn-prd-detail",children:S?t.jsx(JN,{prd:S,projectId:B,dataVersion:l,onTake:q=>r(q),onStartBreakdown:s,onMaterialize:o}):t.jsx(pe,{kind:"empty",icon:"scroll-text",title:"Pilih PRD",hint:"Klik dokumen di indeks kiri untuk membacanya, lalu jadikan backlog."})})}]}),w&&t.jsx(Hf,{projects:e,defaultProject:R,onClose:()=>M(!1),onCreate:(q,ie)=>{M(!1),i(q,ie)}})]})}const _p=5e3,eR=12e3,aR=5*6e4,tR=new Set(["shipped","docs-updated","waiting","offline"]),nR={shipped:"selesai","docs-updated":"dokumen terbit",waiting:"butuh jawabanmu"},iR={shipped:"kabar","docs-updated":"dokumen",waiting:"sesi"},qf=(e,a)=>e.kind==="waiting"&&e.since!==null&&a-e.since>=Xd;function sR(e){const a=Math.floor(e/6e4);if(a<1)return`${Math.max(0,Math.floor(e/1e3))} detik`;if(a<60)return`${a} menit`;const n=Math.floor(a/60),i=a%60;return i>0?`${n} jam ${i} menit`:`${n} jam`}function rR(e,a){if(!tR.has(e.kind))return null;if(e.kind==="offline")return{kind:"pose",text:"Aku kehilangan sambungan",ttl:_p};let n=`${e.subject??"Backlog"} ${nR[e.kind]}`;return e.count>1&&(n+=` · ${e.count} ${iR[e.kind]}`),qf(e,a)&&(n+=` — ${sR(a-e.since)}`),{kind:"pose",text:n,ttl:_p}}function Uf(e){const a=hl(e.backlog),n={};for(const i of e.sessions){const r=Cr(i,a);r&&(n[i.id]=r)}return{at:e.now,sessions:n,notifiedAt:bb(e.notifications)}}function oR(e,a){const n=Uf(a),i=d=>Object.entries(n.sessions).filter(([u,m])=>m===d&&e.sessions[u]!==d).length,r=a.notifications.filter(d=>gb.has(d.type)&&d.createdAt>e.notifiedAt).length,s=i("waiting"),o=i("failed"),l=[r>0?`${r} selesai`:"",s>0?`${s} menunggu`:"",o>0?`${o} gagal`:""].filter(Boolean);return l.length>0?{kind:"recap",text:l.join(" · "),ttl:eR}:null}const lR="PET-001",dR=2,cR={w:192,h:208},uR=8,mR={x:.62,baseline:202},hR={h:168},pR=[{key:"idle",fps:6,loop:!0},{key:"walk-right",fps:10,loop:!0,dir:"right"},{key:"walk-left",fps:10,loop:!0,dir:"left"},{key:"working",fps:8,loop:!0},{key:"waiting",fps:6,loop:!0},{key:"blocked",fps:4,loop:!0},{key:"review",fps:6,loop:!0},{key:"shipped",fps:10,loop:!1,then:"idle"},{key:"docs-updated",fps:6,loop:!0},{key:"wave",fps:10,loop:!1,then:"idle"},{key:"deciding",fps:6,loop:!0},{key:"sleep",fps:4,loop:!0},{key:"thanks",fps:10,loop:!1,then:"idle"},{key:"held",fps:8,loop:!0},{key:"falling",fps:8,loop:!0},{key:"dizzy",fps:8,loop:!1,then:"idle"}],gR={idle:"4a0f06cacdad0fa8e0b0a369628e383fc2cb54cbdd5297285c88d1a33bd686ac","walk-right":"7bdfb2786b2b1c899fb7b170ce2cf5d1e3a922e251cbaca9600c210262629a52","walk-left":"c53c6f7b980d4179b45d55160145df73eb629ccbb809ce2b19946045e388ce60",working:"2ec0d0d4565eced3c55c32603c2b1c6fe9ff93f13f2a1061bc7d2e8d8864aa6f",waiting:"8bb1595bf280040e101949392c1048330c19142d7b5a1d6b74918734f72287e3",blocked:"134f48c60fa6fef038da266be7fb2a69755ecb9123d23dc4e270b14d7d077da6",review:"77c865ff6d49a8bbf3db4e0d7b91ce4663a1e3acef5d072ddd65eac9479b232c",shipped:"d32653efa6a64eb4d00fb63a6e8c0a7dc24de63ecd5a6cfda36f32b584de00b8","docs-updated":"2b3a01ddd640efd6e65d61c6ad4980da3a9fbceff251f1b42ce13389c02bb19c",wave:"4153420063211e6d196219b89c572f43f96ec32f28c63a1159e6d98630e0ed73",deciding:"6309ab706c8430cf97b187f353fd2d447ba729f6e0764efef1b75a3c96168984",sleep:"40f1fd6e27ddddb13a5702c05a03f5e015e44e7e77e96c4e1ed52a5d7741f2ec",thanks:"0f59f2c042b25ff47a7022d4452bf0dc433dcea796d90bf47d95a5c8ca359d8d",held:"8de04ba258b30acb105a27a81ed400b66f3b68953042957a75e63ebe8efe7c89",falling:"8bc3429c44ef4ba257da895080fa6458c3a66e51cebe103e09cd8bac25be5363",dizzy:"3e8c2072e2aa652e204e3c6b041cb6c9487d8dca1649b52f9695600880a94e49"},kR={id:lR,version:dR,cell:cR,columns:uR,anchor:mR,character:hR,rows:pR,sources:gR},bR="/assets/hnm-pet-anoman-atlas-v02-ClJhW17L.webp",dr=["idle","walk-right","walk-left","working","waiting","blocked","review","shipped","docs-updated","wave","deciding","sleep","thanks","held","falling","dizzy"],fR=e=>typeof e=="string"&&dr.includes(e),fi=e=>typeof e=="number"&&Number.isInteger(e)&&e>0,ns=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);function yR(e){const a=h=>{throw new Error(`pet.json tidak sah: ${h}`)};if(!ns(e))return a("bukan objek");const{id:n,version:i,cell:r,columns:s,anchor:o,character:l,rows:d,sources:u}=e;if(typeof n!="string"||!n)return a("id");if(!fi(i))return a("version");if(!ns(r)||!fi(r.w)||!fi(r.h))return a("cell");if(!fi(s))return a("columns");if(!ns(o)||typeof o.x!="number"||!(o.x>0&&o.x<1)||!fi(o.baseline)||o.baseline>r.h)return a("anchor");if(!ns(l)||!fi(l.h)||l.h>r.h)return a("character");if(!Array.isArray(d)||d.length!==dr.length)return a(`rows: butuh ${dr.length} baris`);const m=d.map((h,p)=>{const g=dr[p];if(!ns(h)||h.key!==g)return a(`rows[${p}]: harus "${g}"`);if(!fi(h.fps))return a(`rows[${p}].fps`);if(typeof h.loop!="boolean")return a(`rows[${p}].loop`);const f={key:g,fps:h.fps,loop:h.loop};if(h.then!==void 0){if(!fR(h.then)||h.loop)return a(`rows[${p}].then hanya untuk baris loop:false`);f.then=h.then}else if(!h.loop)return a(`rows[${p}] loop:false tanpa then`);if(h.dir!==void 0){if(h.dir!=="right"&&h.dir!=="left")return a(`rows[${p}].dir`);f.dir=h.dir}return f});return!ns(u)||dr.some(h=>typeof u[h]!="string")?a("sources"):{id:n,version:i,cell:{w:r.w,h:r.h},columns:s,anchor:{x:o.x,baseline:o.baseline},character:{h:l.h},rows:m,sources:u}}const Pr=yR(kR),vR=bR,Wo={ready:"idle",sleeping:"sleep",offline:"idle",working:"working",deciding:"deciding",waiting:"waiting",blocked:"blocked",review:"review",shipped:"shipped","docs-updated":"docs-updated"};function Eu(e,a=Pr){const n=a.rows.find(i=>i.key===e);if(!n)throw new Error(`baris ${e} tak ada di manifest`);return n}const xR=(e,a=Pr)=>a.rows.findIndex(n=>n.key===e),zf=(e,a=Pr)=>Math.round(a.columns/Eu(e,a).fps*1e3),jR=(e,a=Pr)=>Eu(e,a).then??null,Ap=40,pr=[1200,4500],wR=[5e3,14e3],gc=16,Tp=24,SR=240,_R=220,AR=new Set(["waiting","blocked"]),TR=new Set(["offline","sleeping"]),ro=(e,[a,n])=>a+e()*(n-a),bd=e=>e==="right"?"walk-right":"walk-left",Cu=(e,a)=>Math.max(gc,e-a-gc),ni=(e,a,n)=>Math.min(Math.max(e,gc),Cu(a,n)),Ff=(e,a,n)=>Math.min(Math.max(e,0),Math.max(0,a-n)),Ep=e=>e==="held"||e==="falling"||e==="dizzy",ER=e=>!e.roam||e.reduced||e.tier==="mobile";function Cp(e,a,n){return{x:Cu(e,a),y:0,facing:"right",mode:"stand",until:n+pr[0],parkedX:null}}function CR(e,a){const{now:n,laneWidth:i,petWidth:r,pose:s}=a,o=ni(a.currentX,i,r);return{state:{x:o,y:0,facing:e.facing,mode:"stand",until:n+pr[0],parkedX:e.parkedX===null?null:ni(e.parkedX,i,r)},row:Wo[s],move:{x:o,y:0,durationMs:0,ease:"linear"}}}const PR=(e,a,n,i,r)=>({...e,x:ni(e.x,a,i),y:Ff(e.y,n,r)});function MR(e,a,n){const{now:i,laneWidth:r,laneHeight:s,petWidth:o,petHeight:l,pose:d}=a,u=Cu(r,o),m=Wo[d],h=ni(a.currentX,r,o),p=e.mode==="walk"||e.mode==="home",g=e.mode==="dizzy",f=(E,w,M=e.facing)=>({x:E,y:0,facing:M,mode:"stand",until:w,parkedX:e.parkedX}),b=E=>p||Math.abs(h-E)>.5?{x:E,y:0,durationMs:0,ease:"linear"}:null,v=(E,w)=>{const M=Math.round(Math.abs(E-h)/Ap*1e3),N=E>=h?"right":"left";return{state:{x:E,y:0,facing:N,mode:w,until:i+M,parkedX:e.parkedX},row:bd(N),move:{x:E,y:0,durationMs:M,ease:"linear"}}},x=E=>{const w={x:E,y:0,durationMs:0,ease:"linear"};return a.reduced?{state:{...f(E,1/0),parkedX:E},row:m,move:w}:{state:{x:E,y:0,facing:e.facing,mode:"dizzy",until:i+zf("dizzy"),parkedX:E},row:"dizzy",move:w}};if(a.dragging){const E=ni(a.pointerX,r,o),w=Ff(a.pointerY,s,l);return{state:{x:E,y:w,facing:e.facing,mode:"held",until:1/0,parkedX:e.parkedX},row:"held",move:{x:E,y:w,durationMs:0,ease:"linear"}}}if(e.mode==="held"){if(a.reduced||e.y===0)return x(e.x);const E=Math.max(_R,Math.round(e.y/SR*1e3));return{state:{x:e.x,y:0,facing:e.facing,mode:"falling",until:i+E,parkedX:e.x},row:"falling",move:{x:e.x,y:0,durationMs:E,ease:"fall"}}}if(e.mode==="falling")return i<e.until?{state:e,row:"falling",move:null}:x(e.x);if(e.mode==="dizzy"&&i<e.until)return{state:e,row:"dizzy",move:null};if(ER(a)){const E=ni(e.parkedX??u,r,o);return{state:f(E,1/0,"right"),row:m,move:b(E)}}if(a.hovered||a.panelOpen||a.documentHidden)return{state:f(h,1/0),row:m,move:b(h)};if(TR.has(d))return{state:f(h,1/0),row:m,move:b(h)};if(AR.has(d))return Math.abs(h-u)>1?e.mode==="home"&&i<e.until?{state:e,row:bd(e.facing),move:null}:v(u,"home"):{state:f(u,1/0,"right"),row:m,move:b(u)};if(d==="shipped")return{state:f(h,1/0),row:m,move:b(h)};if(p)return i<e.until?{state:e,row:bd(e.facing),move:null}:{state:f(e.x,i+ro(n,pr)),row:m,move:null};if(g||e.until===1/0)return{state:f(h,i+ro(n,pr)),row:m,move:null};if(i<e.until)return{state:e,row:m,move:null};const y=ro(n,wR)*Ap/1e3;let T=n()<.5?-1:1,S=ni(h+T*y,r,o);return Math.abs(S-h)<Tp&&(T=-T,S=ni(h+T*y,r,o)),Math.abs(S-h)<Tp?{state:f(h,i+ro(n,pr)),row:m,move:null}:v(S,"walk")}const Bn={loading:"Membaca layar sesi…",none:"Pertanyaannya tak terbaca dari sini — buka Terminal untuk menjawabnya.",stale:"Layarnya sudah berubah — pertanyaannya dimuat ulang.",deciding:"hanoman-lead sedang menyusun keputusan untuk sesi ini.",failed:"Jawaban tak terkirim. Buka Terminal untuk menjawabnya.",answering:"hanoman-lead sudah mengirim jawabannya ke pane — terlambat mengambil alih.",taken:"Kamu mengambil alih sesi ini. hanoman-lead berhenti menjawabnya.",preparing:"Kotak jawabnya sedang disiapkan — dialognya belum tergambar di pane."},IR={queued:"hanoman-lead mengantre untuk sesi ini",deciding:"hanoman-lead sedang menyusun keputusan",answered:"hanoman-lead sudah menjawab","taken-over":"Kamu yang menjawab sesi ini",failed:"hanoman-lead tak sanggup menjawab sesi ini"},Pp=e=>{var a;return e instanceof ba?(a=e.detail)==null?void 0:a.reason:void 0};function Mp({sessionId:e,label:a,reduced:n,ask:i}){const[r,s]=c.useState(void 0),[o,l]=c.useState([]),[d,u]=c.useState(""),[m,h]=c.useState(!1),[p,g]=c.useState(!1),[f,b]=c.useState(null),[v,x]=c.useState(0);c.useEffect(()=>{let I=!0;return s(void 0),se.sessionDialog(e).then(L=>{I&&(s(L),l(L?L.dialog.options.filter(A=>A.checked).map(A=>A.n):[]))}).catch(()=>{I&&s(null)}),()=>{I=!1}},[e,v]);async function y(){if(!m){h(!0),b(null);try{await se.takeoverSessionDialog(e),b(Bn.taken),x(I=>I+1)}catch(I){b(Pp(I)==="answering"?Bn.answering:Bn.failed)}finally{h(!1)}}}async function T(I){if(!(!r||m)){h(!0),b(null);try{await se.answerSessionDialog(e,{screenHash:r.screenHash,...I}),g(!0)}catch(L){const A=Pp(L);A==="stale"?(b(Bn.stale),x(B=>B+1)):b(A==="deciding"?Bn.deciding:Bn.failed)}finally{h(!1)}}}const S=n?{transition:"none",transform:"none"}:void 0,E=I=>t.jsx("div",{"data-testid":"pet-answer-note",className:"hn-pet-note",children:I});if(p)return t.jsx("div",{className:"hn-pet-box",children:t.jsxs("div",{"data-testid":"pet-answer-sent",className:"hn-pet-sent",children:["Terkirim — menunggu ",a," bergerak"]})});const w=i==null?void 0:i.questions[Math.min(i.at,Math.max(0,i.questions.length-1))],M=i?t.jsxs("div",{className:"hn-pet-head",children:[t.jsx("div",{"data-testid":"pet-answer-lead-state",className:"hn-eyebrow",children:IR[i.state]}),i.total>1&&t.jsxs("div",{className:"hn-eyebrow hn-pet-eyebrow-top",children:["Pertanyaan ",Math.min(i.at+1,i.total)," dari ",i.total]}),i.source==="turn-end"&&t.jsx("div",{"data-testid":"pet-answer-source",className:"hn-eyebrow hn-pet-eyebrow-top",children:"Giliran terakhir sesi"}),((w==null?void 0:w.question)||i.message)&&t.jsx("div",{className:"hn-pet-question",children:(w==null?void 0:w.question)||i.message}),i.state!=="taken-over"&&t.jsx("div",{className:"hn-pet-mt-6",children:t.jsx(U,{"data-testid":"pet-answer-takeover",size:"sm",variant:"ghost",disabled:m,style:S,onClick:()=>{y()},children:"Ambil alih"})})]}):null;if(r===void 0)return t.jsxs("div",{className:"hn-pet-box",children:[M,E(Bn.loading)]});if(r===null)return t.jsxs("div",{className:"hn-pet-box",children:[M,E(f??(i?Bn.preparing:Bn.none))]});const{dialog:N}=r,R=N.tabs.filter(I=>I.answered).length;return t.jsxs("div",{"data-testid":"pet-answer","data-session":e,className:"hn-pet-box",children:[M,!i&&N.tabs.length>1&&t.jsxs("div",{className:"hn-eyebrow hn-pet-eyebrow-bottom",children:["Pertanyaan ",Math.min(R+1,N.tabs.length)," dari ",N.tabs.length]}),!i&&N.title&&t.jsx("div",{className:"hn-pet-title",children:N.title}),N.multi?t.jsx("div",{className:"hn-pet-stack",children:N.options.map(I=>t.jsx(As,{label:I.label,checked:o.includes(I.n),disabled:m,onChange:L=>l(A=>(L?[...A,I.n]:A.filter(B=>B!==I.n)).sort((B,G)=>B-G))},I.n))}):t.jsx("div",{className:"hn-pet-wrap",children:N.options.map(I=>t.jsx(U,{"data-testid":"pet-answer-option",size:"sm",variant:"ghost",disabled:m,style:S,onClick:()=>{T({choice:I.n})},children:I.label},I.n))}),(N.freeIndex!==null||N.notes)&&t.jsxs("div",{className:"hn-pet-free",children:[t.jsx(Oe,{"data-testid":"pet-answer-text",size:"sm",value:d,disabled:m,placeholder:"Jawab dengan kalimatmu sendiri",className:"hn-grow-min",onChange:I=>u(I.target.value)}),!N.multi&&t.jsx(U,{size:"sm",variant:"ghost",disabled:m||!d.trim(),style:S,onClick:()=>{T({text:d.trim()})},children:"Kirim"})]}),N.multi&&t.jsx("div",{className:"hn-pet-mt-8",children:t.jsx(U,{"data-testid":"pet-answer-submit",size:"sm",variant:"primary",disabled:m,style:S,onClick:()=>{T({choices:o,...d.trim()?{text:d.trim()}:{}})},children:"Submit"})}),f&&t.jsx("div",{className:"hn-pet-mt-6",children:E(f)})]})}const NR={mobile:96,tablet:112,desktop:112},os=44,Gf=22,RR=Gf+os,LR=56,$R=6,fd=268,BR=10,oo=12,lo=200,yd=8,DR=5e3,OR=1.5,HR=2e3,qR=3,UR=6,zR={linear:"linear",fall:"var(--ease-fall)"};function FR(){const e="(prefers-reduced-motion: reduce)",[a,n]=c.useState(()=>typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia(e).matches);return c.useEffect(()=>{var s;if(typeof window>"u"||typeof window.matchMedia!="function")return;const i=window.matchMedia(e),r=()=>n(i.matches);return(s=i.addEventListener)==null||s.call(i,"change",r),()=>{var o;return(o=i.removeEventListener)==null?void 0:o.call(i,"change",r)}},[]),a}function GR(){const[e,a]=c.useState(()=>typeof document<"u"&&document.hidden);return c.useEffect(()=>{const n=()=>a(document.hidden);return document.addEventListener("visibilitychange",n),()=>document.removeEventListener("visibilitychange",n)},[]),e}function KR(e,a,n){const i=c.useCallback(()=>{var o;return Math.round(((o=e.current)==null?void 0:o.getBoundingClientRect().width)??0)},[e]),[r,s]=c.useState(0);return c.useLayoutEffect(()=>{n&&s(i())},[i,a,n]),c.useEffect(()=>{const o=e.current;if(!n||!o)return;if(typeof ResizeObserver<"u"){const u=new ResizeObserver(()=>s(i()));return u.observe(o),()=>u.disconnect()}let l;const d=()=>{clearTimeout(l),l=setTimeout(()=>s(i()),150)};return window.addEventListener("resize",d),()=>{clearTimeout(l),window.removeEventListener("resize",d)}},[i,n,e]),r}const WR="(min-width: 1200px) and (max-height: 760px)";function VR(e){const a=c.useCallback(i=>{var s;if(typeof window>"u"||typeof window.matchMedia!="function")return()=>{};const r=window.matchMedia(e);return(s=r.addEventListener)==null||s.call(r,"change",i),()=>{var o;return(o=r.removeEventListener)==null?void 0:o.call(r,"change",i)}},[e]),n=c.useCallback(()=>typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia(e).matches,[e]);return c.useSyncExternalStore(a,n,()=>!1)}function YR({sessions:e,backlog:a,asks:n=[],onOpen:i}){const{items:r}=Qc(),[s,o]=c.useState(jE),[l,d]=c.useState(SE),[u,m]=c.useState(!1),[h,p]=c.useState(!1),[g,f]=c.useState(oo),[b,v]=c.useState(!1),[x,y]=c.useState(!1),[T,S]=c.useState(0),[E,w]=c.useState(null),M=FR(),[N,R]=c.useState(!1);c.useEffect(()=>{const oe=window;if(oe.requestIdleCallback){const ze=oe.requestIdleCallback(()=>R(!0),{timeout:1500});return()=>{var oa;return(oa=oe.cancelIdleCallback)==null?void 0:oa.call(oe,ze)}}const De=window.setTimeout(()=>R(!0),1);return()=>window.clearTimeout(De)},[]);const I=ll(),L=GR(),A=VR(WR)&&I==="desktop",B=I!=="desktop",[G,H]=c.useState(!1),Y=c.useRef(null),X=c.useRef(null),q=c.useRef(null),ie=KR(Y,I,N),[,te]=vb(),Z=U2(),xe=bE(e,r),[_e,ae]=c.useState(xe),[ee,le]=c.useState(()=>Date.now());_e!==xe&&(ae(xe),le(Date.now()));const re=c.useMemo(()=>xE({sessions:e,backlog:a,notifications:r,now:Date.now(),connection:Z,quietSince:ee}),[e,a,r,Z,ee,T]),Ce=c.useMemo(()=>fb(e,a),[e,a]),Ee=c.useMemo(()=>fE(e,a),[e,a]);c.useEffect(()=>{if(re.recheckAt===null)return;const oe=setTimeout(()=>S(De=>De+1),Math.max(0,re.recheckAt-Date.now()));return()=>clearTimeout(oe)},[re.recheckAt]),c.useEffect(()=>{if(!E)return;const oe=setTimeout(()=>w(null),E.ttl);return()=>clearTimeout(oe)},[E]);const J=c.useRef(null),ea=c.useRef(null);c.useEffect(()=>{const oe={sessions:e,backlog:a,notifications:r,now:Date.now()};if(L){J.current||(J.current=Uf(oe)),ea.current=null;return}const De=J.current;if(!De)return;if(ea.current===null&&(ea.current=oe.now),oe.now-De.at<aR){J.current=null;return}const ze=oR(De,oe);if(ze){J.current=null,w({...ze,id:oe.now});return}oe.now-ea.current>DR&&(J.current=null)},[L,e,a,r]);const Ke=rR(re,Date.now()),[He,Ve]=c.useState((Ke==null?void 0:Ke.text)??null);((Ke==null?void 0:Ke.text)??null)!==He&&(Ve((Ke==null?void 0:Ke.text)??null),Ke&&w({...Ke,id:Date.now()}));const{cell:ya,columns:We,anchor:ga,character:qa,rows:wa}=Pr,be=NR[I]/qa.h,Ze=Math.round(ya.w*be),z=Math.round(ya.h*be),$e=c.useRef(Cp(ie,Ze,Date.now())),[aa,da]=c.useState($e.current),[je,ye]=c.useState(Wo[re.pose]),[Ue,ve]=c.useState({x:$e.current.x,y:0,durationMs:0,ease:"linear"}),[fe,_a]=c.useState(null),Ta=c.useRef(null),sa=c.useRef(!1),Ba=c.useCallback(()=>{var ze,oa;const oe=(ze=X.current)==null?void 0:ze.getBoundingClientRect(),De=(oa=Y.current)==null?void 0:oa.getBoundingClientRect();return oe&&De&&oe.width>0?oe.left-De.left:$e.current.x},[]),ta=c.useCallback(()=>typeof window<"u"?window.innerHeight:z,[z]),ke=c.useMemo(()=>{const oe=Ue.x+ga.x*Ze-lo/2,De=Math.min(Math.max(oe,yd),Math.max(yd,ie-lo-yd));return Math.round(ga.x*Ze-lo/2+(De-oe))},[Ue.x,Ze,ga.x,ie]);c.useEffect(()=>{if(!E||u)return;const oe=ze=>{Y.current&&!Y.current.contains(ze.target)&&w(null)},De=ze=>{ze.key==="Escape"&&w(null)};return document.addEventListener("mousedown",oe),document.addEventListener("keydown",De),()=>{document.removeEventListener("mousedown",oe),document.removeEventListener("keydown",De)}},[E,u]);const Ge=c.useRef(0),ma=c.useCallback(()=>{if(ie<=0)return;const oe=Date.now();if(Ge.current===0){Ge.current=ie;const Fa=Cp(ie,Ze,oe);$e.current=Fa,da(Fa),ye(Wo[re.pose]),ve({x:Fa.x,y:0,durationMs:0,ease:"linear"});return}const De=Ge.current!==ie;Ge.current=ie;const ze=Ba(),oa=De&&fe===null&&!Ep($e.current.mode)?CR($e.current,{now:oe,currentX:ze,laneWidth:ie,petWidth:Ze,pose:re.pose}):MR($e.current,{now:oe,currentX:ze,laneWidth:ie,laneHeight:ta(),petWidth:Ze,petHeight:z,pose:re.pose,hovered:x,panelOpen:u,documentHidden:L,roam:l,reduced:M,tier:I,dragging:fe!==null,pointerX:(fe==null?void 0:fe.x)??0,pointerY:(fe==null?void 0:fe.y)??0},Math.random);$e.current=oa.state,da(oa.state),ye(oa.row),oa.move&&ve(oa.move)},[Ba,ta,ie,Ze,z,re.pose,x,u,L,l,M,I,fe]);c.useEffect(()=>{ma()},[ma]),c.useEffect(()=>{if(!Number.isFinite(aa.until))return;const oe=setTimeout(ma,Math.max(0,aa.until-Date.now()));return()=>clearTimeout(oe)},[aa.until,ma]);const[Ne,Ja]=c.useState(null),At=c.useRef(0),ut=c.useRef([]),[rt,tn]=c.useState(0),[Pa,ot]=c.useState(!1);c.useEffect(()=>{ot(!1)},[re.pose]);const Ka=je==="shipped"&&Pa?jR("shipped")??"idle":je,Ua=(Ne==null?void 0:Ne.row)??Ka,It=Eu(Ua),Tt=c.useCallback(()=>!M&&re.pose!=="offline"&&re.pose!=="sleeping"&&fe===null&&!Ep($e.current.mode),[M,re.pose,fe]),vt=c.useCallback(()=>{Tt()&&Ja(oe=>oe??{row:"wave",id:++At.current})},[Tt]),jn=c.useCallback(()=>{M||(Ja({row:"thanks",id:++At.current}),tn(oe=>oe+1))},[M]);c.useEffect(()=>{if(!u)return;const oe=ze=>{Y.current&&!Y.current.contains(ze.target)&&Nt()},De=ze=>{ze.key==="Escape"&&Nt()};return document.addEventListener("mousedown",oe),document.addEventListener("keydown",De),()=>{document.removeEventListener("mousedown",oe),document.removeEventListener("keydown",De)}},[u,M]),c.useEffect(()=>{M&&(v(!1),Ja(null),u||p(!1))},[M,u]),c.useEffect(()=>{var oe;(oe=q.current)==null||oe.toggleAttribute("inert",!u)},[u,h]);function Et(){var An,$t;const oe=typeof window<"u"?window.innerWidth:ie,De=(An=X.current)==null?void 0:An.getBoundingClientRect(),ze=(($t=Y.current)==null?void 0:$t.getBoundingClientRect().left)??0,Fa=(De&&De.width>0?De.left:ze+$e.current.x)+ga.x*Ze,_n=Math.min(Math.max(Fa-fd/2,oo),Math.max(oo,oe-fd-oo));f(Math.round(_n-ze)),p(!0),m(!0)}function Nt(){m(!1),M&&p(!1)}function mt(){u?Nt():Et()}function nn(){const oe=Date.now(),De=[...ut.current.filter(ze=>oe-ze<HR),oe];if(De.length>=qR){ut.current=[],jn();return}ut.current=De,M||v(!0),vt(),mt()}function ha(oe){var De,ze;(ze=(De=oe.currentTarget).setPointerCapture)==null||ze.call(De,oe.pointerId),Ta.current={id:oe.pointerId,dx:oe.clientX-Ba(),dy:oe.clientY+$e.current.y,x0:oe.clientX,y0:oe.clientY,moved:!1}}function Ct(oe){const De=Ta.current;if(!(!De||De.id!==oe.pointerId)){if(!De.moved){if(Math.hypot(oe.clientX-De.x0,oe.clientY-De.y0)<=UR)return;De.moved=!0,u&&Nt(),Ja(null)}_a({x:oe.clientX-De.dx,y:De.dy-oe.clientY})}}function sn(oe){var ze,oa;const De=Ta.current;!De||De.id!==oe.pointerId||(Ta.current=null,(oa=(ze=oe.currentTarget).releasePointerCapture)==null||oa.call(ze,oe.pointerId),De.moved&&(sa.current=!0,_a(null)))}function Rt(oe){o(oe),wE(oe),oe&&(m(!1),p(!1))}function wn(){if(I==="desktop"&&A){m(!1),p(!1),H(!1);return}I==="desktop"?Rt(!0):(m(!1),p(!1),te(!1))}function Lt(oe){d(oe),_E(oe)}const he=aa.mode==="held"||aa.mode==="falling",ra=s||(A||B)&&!G,za=B?LR:ra?RR:z,Wa=PR(Ue,ie,ta(),Ze,z);c.useEffect(()=>{ra&&u&&(m(!1),p(!1))},[ra,u]),c.useEffect(()=>{if(!B||!G)return;const oe=ze=>{Y.current&&!Y.current.contains(ze.target)&&H(!1)},De=ze=>{ze.key==="Escape"&&!u&&H(!1)};return document.addEventListener("mousedown",oe),document.addEventListener("keydown",De),()=>{document.removeEventListener("mousedown",oe),document.removeEventListener("keydown",De)}},[B,G,u]);const di={position:"relative",width:"100%",height:za,zIndex:80,pointerEvents:"none"},Sn=N?za:0;if(c.useLayoutEffect(()=>{const oe=document.documentElement;return oe.style.setProperty("--pet-h",`${Sn}px`),()=>{oe.style.removeProperty("--pet-h")}},[Sn]),!N)return null;if(ra)return t.jsx("div",{"data-testid":"pet-root",ref:Y,style:di,children:t.jsx("button",{"aria-label":"Tampilkan pet Hanoman",onClick:()=>{s&&Rt(!1),H(!0)},style:{pointerEvents:"auto",position:"absolute",width:os,height:os,padding:0,right:B?"max(var(--page-gutter-x), var(--safe-right))":"max(22px, var(--safe-right))",bottom:B?$R:Gf,display:"inline-flex",alignItems:"center",justifyContent:"center",cursor:"pointer",border:"1px solid var(--text-muted)",borderRadius:"var(--radius-pill)",background:"var(--surface-card)",color:"var(--text-strong)",boxShadow:"var(--shadow-sm)"},children:t.jsx(Xc,{id:"buntut",size:15})})});const ci=re.pose==="offline",$i=`Hanoman ${ah[re.pose]} · ${re.headline}`+(re.count>1?` · ${re.count} ${ql[re.kind]}`:""),Ns=Ua==="waiting"&&qf(re,Date.now()),ia=Math.round(zf(Ua)/(Ns?OR:1)),Bi=M?"none":`hn-pet-frames ${ia}ms steps(${We}, end) ${It.loop?"infinite":"1 forwards"}`;return t.jsxs("div",{"data-testid":"pet-root",ref:Y,style:di,children:[h&&t.jsxs("div",{ref:q,"data-testid":"pet-panel","aria-hidden":!u||void 0,onAnimationEnd:oe=>{oe.animationName==="hn-pet-panel-out"&&!u&&p(!1)},style:{pointerEvents:u?"auto":"none",position:"absolute",left:g,bottom:z+BR,width:fd,maxWidth:"calc(100vw - var(--safe-left) - var(--safe-right) - 24px)",maxHeight:"calc(100dvh - var(--safe-top) - var(--safe-bottom) - 120px)",overflowY:"auto",boxSizing:"border-box",padding:14,background:"var(--surface-card)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-md)",boxShadow:"var(--shadow-lg)",transformOrigin:"center bottom",animation:M?"none":`${u?"hn-pet-panel-in":"hn-pet-panel-out"} var(--dur-slow) var(--ease-out) both`},children:[t.jsx("div",{className:"hn-eyebrow",style:{marginBottom:8},children:ah[re.pose]}),t.jsx("ul",{"data-testid":"pet-conditions",style:{listStyle:"none",margin:0,padding:0,display:"flex",flexDirection:"column",gap:10},children:re.conditions.map((oe,De)=>t.jsxs("li",{"data-testid":"pet-condition","data-kind":oe.kind,style:De>0?{borderTop:"1px solid var(--border-hair)",paddingTop:10}:void 0,children:[t.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:6},children:[t.jsx("span",{style:De===0?{fontFamily:"var(--font-display)",fontSize:15,fontWeight:600,color:"var(--text-strong)",lineHeight:1.25}:{fontFamily:"var(--font-ui)",fontSize:13,fontWeight:600,color:"var(--text-strong)",lineHeight:1.3},children:oe.headline}),oe.count>1&&t.jsx("span",{"data-testid":"pet-condition-count",title:`${oe.count} ${ql[oe.kind]}`,style:{flex:"0 0 auto",padding:"2px 6px",fontFamily:"var(--font-ui)",fontSize:11,fontWeight:700,lineHeight:1,color:"var(--action-on)",background:"var(--action-bg)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-pill)"},children:oe.count})]}),t.jsx("div",{style:{marginTop:3,fontFamily:"var(--font-ui)",fontSize:12.5,color:"var(--text-muted)",lineHeight:1.45},children:oe.detail}),oe.target&&t.jsx("div",{style:{marginTop:7},children:t.jsx(U,{size:"sm",variant:De===0?"primary":"ghost",leftIcon:oe.target.section==="terminal"?"terminal":"list-checks",style:M?{transition:"none",transform:"none"}:void 0,onClick:()=>{const ze=oe.target;Nt(),i(ze)},children:oe.target.section==="terminal"?"Buka Terminal":"Buka Backlog"})}),oe.kind==="waiting"&&u&&Ce.map(ze=>t.jsx(Mp,{sessionId:ze.id,label:ze.specId??ze.id,reduced:M,ask:n.find(oa=>oa.sessionId===ze.id)},ze.id)),oe.kind==="deciding"&&u&&Ee.map(ze=>{const oa=n.find(Fa=>Fa.sessionId===ze.id);return oa?t.jsx(Mp,{sessionId:ze.id,label:ze.specId??ze.id,reduced:M,ask:oa},ze.id):null})]},`${oe.kind}:${De}`))}),t.jsxs("div",{style:{display:"flex",flexWrap:"wrap",gap:8,marginTop:12,borderTop:"1px solid var(--border-hair)",paddingTop:10},children:[I!=="mobile"&&t.jsx(U,{size:"sm",variant:"ghost",style:M?{transition:"none",transform:"none"}:void 0,onClick:()=>Lt(!l),children:l?aa.parkedX===null?"Diam di pojok":"Diam di sini":"Berkeliaran"}),t.jsx(U,{size:"sm",variant:"ghost",style:M?{transition:"none",transform:"none"}:void 0,onClick:wn,children:"Sembunyikan"})]})]}),ie>0&&t.jsxs("div",{"data-testid":"pet-actor",ref:X,"data-facing":aa.facing,"data-mode":aa.mode,onTransitionEnd:oe=>{oe.propertyName==="transform"&&ma()},style:{position:"absolute",left:0,bottom:0,width:Ze,height:z,transform:`translate(${Wa.x}px, ${-Wa.y}px)`,transition:M||Ue.durationMs===0?"none":`transform ${Ue.durationMs}ms ${zR[Ue.ease]}`,willChange:!M&&Ue.durationMs>0?"transform":void 0},children:[E&&!u&&t.jsxs("div",{"data-testid":"pet-bubble","data-kind":E.kind,"aria-hidden":E.kind==="pose"&&re.kind!=="waiting"?"true":void 0,style:{pointerEvents:"none",position:"absolute",left:ke,bottom:z-6,width:"max-content",maxWidth:lo,boxSizing:"border-box",padding:"6px 10px",fontFamily:"var(--font-ui)",fontSize:12.5,lineHeight:1.35,color:"var(--text-strong)",background:"var(--surface-card)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-md)",boxShadow:"var(--shadow-sm)",animation:M?"none":"hn-pet-bubble-in var(--dur-base) var(--ease-out) both"},children:[t.jsx("span",{"data-testid":"pet-bubble-text","aria-hidden":E.kind==="pose"?"true":void 0,children:E.text}),(E.kind==="recap"||re.kind==="waiting")&&t.jsx("div",{style:{marginTop:6,pointerEvents:"auto"},children:t.jsx(U,{size:"sm",variant:"ghost",leftIcon:E.kind==="recap"?"list-checks":"terminal","aria-label":E.kind==="recap"?`${E.text} — buka ringkasan pet`:`${E.text} — jawab di sini`,style:M?{transition:"none",transform:"none"}:void 0,onClick:()=>{w(null),Et()},children:E.kind==="recap"?"Lihat":"Jawab di sini"})})]}),t.jsxs("div",{"data-testid":"pet-stage",className:"hn-pet-stage","data-reduced-motion":M?"true":void 0,style:{position:"relative",width:Ze,height:z,animation:M?"none":"hn-pet-reveal var(--dur-slow) var(--ease-out) both"},children:[t.jsx("span",{className:"hn-sr-only",role:"status","aria-live":"polite","data-testid":"pet-status",children:$i}),re.count>1&&t.jsx("span",{"data-testid":"pet-badge","aria-hidden":"true",title:`${re.count} ${ql[re.kind]}`,style:{pointerEvents:"none",position:"absolute",top:4,right:8,zIndex:2,minWidth:18,height:18,padding:"0 5px",boxSizing:"border-box",display:"inline-flex",alignItems:"center",justifyContent:"center",fontFamily:"var(--font-ui)",fontSize:11,fontWeight:700,lineHeight:1,color:"var(--action-on)",background:"var(--action-bg)",border:"1px solid var(--border-hair)",borderRadius:"var(--radius-pill)",boxShadow:"var(--shadow-sm)"},children:re.count}),rt>0&&!M&&t.jsx("span",{"data-testid":"pet-hearts","aria-hidden":"true",style:{pointerEvents:"none",position:"absolute",zIndex:2,left:Math.round(ga.x*Ze),bottom:Math.round(z*.55)},onAnimationEnd:oe=>{oe.target.dataset.last==="1"&&tn(0)},children:[0,1,2].map(oe=>t.jsx("span",{"data-last":oe===2?"1":void 0,style:{position:"absolute",left:oe*9-9,fontFamily:"var(--font-ui)",fontSize:12,color:"var(--accent)",animation:`hn-pet-heart 900ms var(--ease-out) ${oe*120}ms both`},children:"♥"},oe))},rt),t.jsx("div",{"data-testid":"pet-reactor",className:"hn-pet-reactor",style:{position:"relative",width:"100%",height:"100%",transition:M?"none":"transform var(--dur-base) var(--ease-out)",animation:M||!b?"none":"hn-pet-click var(--dur-slow) var(--ease-out) both"},onAnimationEnd:oe=>{oe.animationName==="hn-pet-click"&&v(!1)},children:t.jsx("div",{"data-testid":"pet-viewport","data-offline":ci?"true":void 0,style:{position:"relative",overflow:"hidden",width:Ze,height:z,opacity:ci?.45:1,transition:M?"none":"opacity var(--dur-slow) var(--ease-out)"},children:t.jsx("div",{"data-testid":"pet-rowshift",className:"hn-pet-rowshift","data-row":Ua,style:{width:Ze,height:z,"--row":xR(Ua)},children:t.jsx("img",{"data-testid":"pet-atlas",src:vR,alt:"","aria-hidden":"true",draggable:!1,decoding:"async",onAnimationEnd:oe=>{if(oe.animationName==="hn-pet-frames"){if(Ne){Ne.row==="wave"&&x&&Tt()?Ja({row:"wave",id:++At.current}):Ja(null);return}Ua==="shipped"&&ot(!0)}},style:{display:"block",width:Ze*We,height:z*wa.length,animation:Bi}},`${Ua}:${(Ne==null?void 0:Ne.id)??0}`)})})}),t.jsx("button",{"data-testid":"pet-hit",className:"hn-pet-hit","aria-label":"Ringkasan status Hanoman",title:`${re.headline} — ${re.detail}`,onClick:()=>{if(sa.current){sa.current=!1;return}nn()},onPointerDown:ha,onPointerMove:Ct,onPointerUp:sn,onPointerCancel:sn,onPointerEnter:()=>{y(!0),vt()},onPointerLeave:()=>y(!1),onFocus:()=>y(!0),onBlur:()=>y(!1),style:{pointerEvents:"auto",position:"absolute",zIndex:3,left:Math.round(ga.x*Ze-os/2),bottom:0,width:os,height:os,padding:0,border:"none",background:"transparent",cursor:he?"grabbing":"grab"}})]})]})]})}const JR=c.lazy(()=>Xt(()=>import("./DalangHanomanScreen-DdsEmtBl.js"),__vite__mapDeps([0,1,2,3,4])).then(e=>({default:e.DalangHanomanScreen}))),QR=c.lazy(()=>Xt(()=>import("./TeamScreen-DNdt2P1g.js"),__vite__mapDeps([5,1,6,2,3,7])).then(e=>({default:e.TeamScreen}))),ZR=c.lazy(()=>Xt(()=>import("./TriageScreen-CzM99CrG.js"),__vite__mapDeps([8,1,6,2,3,9])).then(e=>({default:e.TriageScreen}))),XR=c.lazy(()=>Xt(()=>import("./TerminalScreen-BjQF48XI.js"),__vite__mapDeps([10,1,2,11,3,12])).then(e=>({default:e.TerminalScreen}))),eL=c.lazy(()=>Xt(()=>import("./IdeScreen-hdbQW-ui.js"),__vite__mapDeps([13,1,14,15,6,2,3,16])).then(e=>({default:e.IdeScreen}))),aL=c.lazy(()=>Xt(()=>import("./VpsScreen-SGB_BpbS.js"),__vite__mapDeps([17,1,2,3,18])).then(e=>({default:e.VpsScreen}))),tL=c.lazy(()=>Xt(()=>import("./SchedulerScreen-3KVE-d_d.js"),__vite__mapDeps([19,1,6,2,20,21,22,3])).then(e=>({default:e.SchedulerScreen}))),nL=c.lazy(()=>Xt(()=>import("./LeadScreen-BWE4mfJI.js"),__vite__mapDeps([23,1,6,2,20,21,3,24])).then(e=>({default:e.LeadScreen}))),iL=c.lazy(()=>Xt(()=>import("./DocsWorkspace-Cr7AXz9z.js"),__vite__mapDeps([25,1,2,3,26])).then(e=>({default:e.DocsWorkspace}))),sL=c.lazy(()=>Xt(()=>import("./ReviewScreen-BIkpEspG.js"),__vite__mapDeps([27,1,15,2,3])).then(e=>({default:e.ReviewScreen}))),rL=c.lazy(()=>Xt(()=>import("./SettingsScreen-B0-W2TeR.js"),__vite__mapDeps([28,1,2,11,22,21,15,3,29])).then(e=>({default:e.SettingsScreen}))),oL=[{value:"critical",label:"Critical"},{value:"major",label:"Major"},{value:"minor",label:"Minor"}],Ip=[{value:"tinggi",label:"Tinggi"},{value:"sedang",label:"Sedang"},{value:"rendah",label:"Rendah"}];function lL(e){switch(e){case"offline":return"offline";case"control-off":return"kendali jarak jauh mati";case"protocol-mismatch":return"versi tak cocok";case"no-spawn":return"tanpa izin mulai sesi";case"capacity-full":return"kapasitas penuh";default:return"tak tersedia"}}function dL({open:e,spec:a,onClose:n,onStarted:i,onError:r}){var z,$e,aa,da;const[s,o]=c.useState("sonnet"),[l,d]=c.useState("medium"),[u,m]=c.useState("claude"),[h,p]=c.useState({claude:{model:"sonnet",effort:"medium"},codex:{...Td},antigravity:{...Ss}}),[g,f]=c.useState({}),[b,v]=c.useState(!1),[x,y]=c.useState(""),[T,S]=c.useState("changed"),[E,w]=c.useState(Gu().id),[M,N]=c.useState(!1),[R,I]=c.useState(null);c.useEffect(()=>{I(null)},[e,a==null?void 0:a.id]);const[L,A]=c.useState([{deviceId:ln,name:"hub ini",eligible:!0}]),[B,G]=c.useState(ln),[H,Y]=c.useState(null),[X,q]=c.useState(null),[ie,te]=c.useState(void 0),[Z,xe]=c.useState(!1),[_e,ae]=c.useState(!1),[ee,le]=c.useState(!1),[re,Ce]=c.useState(null);c.useEffect(()=>{e&&(xe(!1),ae(!1),le(!1),f({}),se.getSettings().then(je=>{const ye={claude:{model:je.model,effort:je.effort},codex:{...Td,...je.codex??{}},antigravity:{...Ss,...je.antigravity??{}}},Ue=je.agent??"claude";p(ye),m(Ue),o(ye[Ue].model),d(ye[Ue].effort);const ve=!!a&&im(kr(a.source));v(ve||je.goal.enabled),y(ve?"":je.goal.condition),S(je.verifyScope??"changed"),w(Gu(je.method).id),te(je.orchestration),xe(!0)}).catch(()=>{ae(!0),xe(!0)}),se.getCodexVersion().then(je=>{q(je.version),le(!0)}).catch(()=>{le(!0)}),se.getMethodStatus().then(je=>Ce(je.methods)).catch(()=>Ce(null)))},[e,a]),c.useEffect(()=>{if(!e||!a)return;let je=!1;return(async()=>{try{const[ye,Ue]=await Promise.all([typeof se.presence=="function"?se.presence():Promise.resolve({enabled:!1,devices:[],hubVersion:""}),typeof se.getProject=="function"?se.getProject(a.projectId).then(_a=>_a.handledBy??[]).catch(()=>[]):Promise.resolve([])]);if(je)return;const ve=NE(ye,Ue);A(ve);const fe=ve.find(_a=>_a.deviceId!==ln&&_a.eligible);G((fe==null?void 0:fe.deviceId)??ln)}catch{if(je)return;A([{deviceId:ln,name:"hub ini",eligible:!0}]),G(ln)}})(),()=>{je=!0}},[e,a==null?void 0:a.id]);const Ee=B!==ln,J=c.useMemo(()=>Ee?Kc({base:`/api/devices/${B}/relay`}):se,[Ee,B]),ea=je=>{m(je),f({});const ye=$E(h,je);o(ye.model),d(ye.effort)},Ke=je=>{o(je),d(ye=>jb(u,je,ye))},He=xb(u,s);if(!a)return null;const Ve=a,ya=kr(Ve.source),We=im(ya),ga=u==="antigravity"&&b,qa=Ve.blockedBy??[],wa=qa.length>0,be=(re==null?void 0:re.find(je=>je.method===E&&je.agent===u))??null;async function Ze(je=!1,ye=!1){if(!ga){N(!0),I(null),Y(null);try{const{id:Ue,resumed:ve}=await J.startSession({spec:Ve.id,flow:ya,model:s,effort:l,agent:u,...Object.keys(g).length?{phaseOverrides:g}:{},goal:b,goalCondition:b&&x.trim()?x.trim():void 0,verifyScope:T,method:E,...wa||je?{force:!0}:{},...ye?{confirmRemote:!0}:{}});i(Ue,ve),n()}catch(Ue){if(Ue instanceof ba&&Ue.status===409&&Ue.detail&&typeof Ue.detail=="object"&&(Ue.detail.error==="remote-session"||Ue.detail.error==="confirm-required")){Y(Ue.detail);return}const ve=Ue instanceof ba&&Ue.status===409?zg.safeParse(Ue.detail):null;ve!=null&&ve.success?I(ve.data):r==null||r(Ue)}finally{N(!1)}}}return t.jsxs(ca,{open:e,onClose:n,icon:"play",eyebrow:`${Ve.id} · ${ya}`,title:"Mulai sesi",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",onClick:n,children:"Batal"}),t.jsx(U,{leftIcon:wa?"lock":"play",variant:wa?"danger":"primary",disabled:M||ga,onClick:()=>void Ze(),children:wa?"Mulai tetap":R?"Coba lagi":"Mulai"}),R&&!wa&&!Ee&&t.jsx(U,{leftIcon:"lock",variant:"danger",disabled:M||ga,onClick:()=>void Ze(!0),children:"Mulai tetap"})]}),children:[t.jsxs("div",{className:"hn-sheet-lead",children:["Agen, model & effort ",t.jsx("b",{children:"orchestrator"})," sesi ini. Default dari setelan global; ubah bila perlu. Bila orkestrasi flow ini aktif, tiap fase dikerjakan subagent dengan model & effort di bawah (Settings › Orkestrasi). Override di bawah hanya berlaku untuk sesi ini dan tidak mengubah Settings."]}),R&&t.jsxs("div",{role:"alert",className:"hn-sheet-alert",children:[t.jsx("b",{children:R.error}),t.jsxs("div",{children:[R.admission.liveCount," sesi hidup · ",R.admission.liveAgentCount," agen terstruktur · cap ",R.admission.maxConcurrent]}),t.jsxs("div",{children:["Load per core: ",R.admission.loadStatus==="available"&&R.admission.loadPerCore!==null?R.admission.loadPerCore.toFixed(2):"tidak tersedia",R.admission.loadStatus==="unsupported"?" (tidak didukung platform)":""," · ambang ",R.admission.maxLoadPerCore]}),t.jsx("div",{children:"Coba lagi setelah beban turun, atau pilih Mulai tetap untuk melewati cap dan pemeriksaan beban host."})]}),wa&&t.jsxs("div",{"data-testid":"dep-blocked-note",className:"hn-sheet-alert",children:["Backlog ini menunggu"," ",t.jsx("b",{children:qa.map(je=>`${je.id} (${je.reason==="missing"?"tak ditemukan":je.reason==="unmerged"?"belum ter-merge":"belum selesai"})`).join(", ")}),". Sesi tetap bisa dimulai, tapi worktree-nya lahir dari basis yang belum memuat pekerjaan itu."," ","Mulai tetap juga melewati cap sesi dan pemeriksaan beban host."]}),t.jsx(de,{label:"Target",hint:"Mesin yang menjalankan sesi ini. Tak terpilih tetap tampil beserta alasannya.",children:t.jsx(Be,{"aria-label":"target",value:B,className:"hn-w-full",options:L.map(je=>({value:je.deviceId,label:je.eligible?je.name:`${je.name} — ${lL(je.reason)}`,disabled:!je.eligible})),onChange:je=>{G(je.target.value),Y(null)}})}),(H==null?void 0:H.error)==="remote-session"&&H.remoteSession&&t.jsxs("div",{role:"alert",className:"hn-sheet-notice",children:["Sesi ini sudah berjalan di ",t.jsx("b",{children:H.remoteSession.name}),"."]}),(H==null?void 0:H.error)==="confirm-required"&&t.jsxs("div",{role:"alert",className:"hn-sheet-notice",children:[t.jsx("div",{children:"Device terakhir yang mengerjakan ini sudah offline."}),t.jsx(U,{variant:"danger",disabled:M||ga,onClick:()=>void Ze(!1,!0),children:"Tetap mulai"})]}),t.jsx(de,{label:"Agen",hint:"Mesin yang menjalankan sesi ini. Perilaku sesi sama; hanya CLI-nya berbeda.",children:t.jsx(Be,{"aria-label":"Agen",value:u,className:"hn-w-full",options:ih,onChange:je=>ea(je.target.value)})}),t.jsx(de,{label:"Model",children:t.jsx(Be,{"aria-label":"Model",value:s,className:"hn-w-full",options:LE(u,s),onChange:je=>Ke(je.target.value)})}),t.jsx(de,{label:"Effort",children:t.jsx(Be,{"aria-label":"Effort",value:l,className:"hn-w-full",options:He.map(je=>({value:je,label:je})),onChange:je=>d(je.target.value)})}),u==="codex"&&Gv(s,X)&&t.jsxs("div",{"data-testid":"codex-version-note",className:"hn-sheet-note",children:["Codex CLI terpasang ",t.jsx("b",{children:X}),", sedangkan ",t.jsx("b",{children:s})," butuh ",t.jsx("b",{children:(z=tl(s))==null?void 0:z.minClient}),". Sesi tetap boleh dijalankan, tapi modelnya belum tentu dikenali CLI ini."]}),t.jsx(zE,{flow:ya,agent:u,model:s,effort:l,orchestration:ie,codexVersion:X,phaseOverrides:g,onPhaseOverridesChange:f,loadError:_e,remoteTarget:Ee?(($e=L.find(je=>je.deviceId===B))==null?void 0:$e.name)??B:null,loading:!Z||u==="codex"&&!ee}),u==="antigravity"&&t.jsx("div",{role:"note",className:"hn-sheet-note",children:"Antigravity tersedia pada host/lab; sandbox dan mode goal native belum didukung. Matikan mode goal secara eksplisit atau pilih runtime lain. Telemetri native tidak diketahui."}),t.jsxs(de,{label:"Mode goal",hint:We?"Backlog goal selalu berjalan dalam mode goal — sesi menolak berhenti sampai goal item ini terbukti tercapai. Kosongkan kondisi untuk memakai goal item apa adanya.":"Sesi menolak berhenti sampai kondisinya terbukti. Kosongkan kondisi untuk memakai bawaan hanoman: semua fase tercatat, plan tak menyisakan task, push sukses.",children:[t.jsxs("div",{className:b?"hn-goal-row hn-goal-row--on":"hn-goal-row",children:[t.jsx(rl,{"aria-label":"Mode goal",checked:b,disabled:We||u==="antigravity"&&!b,onChange:je=>{We||v(je)}}),t.jsx("span",{className:"hn-sheet-meta",children:We?"aktif · terkunci":b?"aktif":"nonaktif"})]}),b&&t.jsx(La,{value:x,rows:4,mono:!0,placeholder:We?"Kosong = goal backlog item ini · mis. semua fase tercatat & plan tanpa - [ ]":"Kosong = kondisi bawaan hanoman · mis. semua fase tercatat & plan tanpa - [ ]",onChange:je=>y(je.target.value)})]}),t.jsx(de,{label:"Scope verifikasi",hint:"Hanya yang berubah = test/typecheck/lint hanya menyentuh berkas yang disentuh sesi ini. Suite penuh tetap dijalankan manusia sebelum merge.",children:t.jsx(Be,{"aria-label":"Scope verifikasi",value:T,className:"hn-w-full",options:[{value:"changed",label:"Hanya yang berubah — hemat RAM & CPU"},{value:"full",label:"Seluruh project"}],onChange:je=>S(je.target.value)})}),t.jsxs(de,{label:"Metode",hint:"Metodologi kerja sesi ini: skill per fase + direktori plan/spec. Fase-fasenya sendiri tak berubah. Item yang sudah pernah dijalankan memakai metode tercatatnya saat dilanjutkan.",children:[t.jsx(Be,{"aria-label":"Metode",value:E,className:"hn-w-full",options:xc.map(je=>({value:je,label:Ni[je].label})),onChange:je=>w(je.target.value)}),t.jsxs("div",{"data-testid":"method-requires",className:"hn-sheet-foot",children:["Butuh terpasang: ",((aa=Ni[E])==null?void 0:aa.requires.join(" · "))??"—"]}),be&&!be.ready&&t.jsxs("div",{"data-testid":"method-status-note",className:"hn-sheet-status",children:[be.availabilityReason&&t.jsx("div",{children:be.availabilityReason}),t.jsx("b",{children:be.label})," belum siap untuk ",t.jsx("b",{children:(da=ih.find(je=>je.value===u))==null?void 0:da.label})," di mesin ini",be.missingPackages.length>0&&t.jsxs(t.Fragment,{children:[" · paket kurang: ",t.jsx("code",{children:be.missingPackages.join(" · ")})]}),be.missingSkills.length>0&&t.jsxs(t.Fragment,{children:[" · skill kurang: ",t.jsx("code",{children:be.missingSkills.join(" · ")})]}),"."," ","Sesi tetap boleh dijalankan, tapi gerbang yang disebut prompt tak akan ada. Pasang dari Settings → Sesi."]})]})]})}function cL({open:e,onClose:a,projects:n,defaultProject:i,onCreate:r,prefill:s,specs:o}){const l={kind:(s==null?void 0:s.kind)??"brief",project:(s==null?void 0:s.project)||i,title:(s==null?void 0:s.title)??"",context:(s==null?void 0:s.context)??"",outcome:(s==null?void 0:s.outcome)??"",constraints:(s==null?void 0:s.constraints)??"",priority:"sedang",severity:(s==null?void 0:s.severity)??"major",steps:(s==null?void 0:s.steps)??"",expected:"",actual:(s==null?void 0:s.actual)??"",env:"",branchFrom:(s==null?void 0:s.branchFrom)??"",fromAudit:(s==null?void 0:s.fromAudit)??"",goal:(s==null?void 0:s.goal)??"",done:(s==null?void 0:s.done)??"",dependsOn:[],attachments:[]},[d,u]=c.useState(l);c.useEffect(()=>{e&&u({...l,project:(s==null?void 0:s.project)||i})},[e,i,s]);const[m,h]=c.useState([]),[p,g]=c.useState(new Set);c.useEffect(()=>{if(!e||!d.project){h([]),g(new Set);return}let M=!0;return se.listBranches(d.project).then(N=>{if(!M)return;const R=[...new Set([...N.branches,...N.remotes])].sort();h(R),g(new Set(N.remotes.filter(I=>!N.branches.includes(I)))),u(I=>I.branchFrom&&!R.includes(I.branchFrom)?{...I,branchFrom:""}:I)}).catch(()=>{M&&(h([]),g(new Set))}),()=>{M=!1}},[e,d.project]);const f=M=>N=>u(R=>({...R,[M]:N.target.value})),b=d.kind==="qa",v=d.kind==="audit",x=d.kind==="goal",y=d.kind==="no_effort",T=Ii(d.kind)==="goal",S=(o??[]).filter(M=>M.projectId===d.project),E=M=>u(N=>({...N,dependsOn:N.dependsOn.includes(M)?N.dependsOn.filter(R=>R!==M):[...N.dependsOn,M]})),w=()=>{!d.title.trim()||T&&!d.goal.trim()||r(d)};return t.jsxs(ca,{open:e,onClose:a,icon:b?"bug":v?"search":y?"zap":x?"target":"lightbulb",eyebrow:"human → hanoman",title:b?"QA finding baru":v?"Audit baru":y?"Task remeh baru":x?"Goal baru":"Feature brief baru",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",size:"sm",onClick:a,children:"Batal"}),t.jsx(U,{size:"sm",leftIcon:b?"radar":v?"search":y?"zap":x?"target":"messages-square",onClick:w,children:b?"Filekan finding → audit":v?"Buat audit → investigasi":y?"Buat task → sesi satu fase":x?"Buat goal → sesi goal":"Buat brief → brainstorm"})]}),children:[t.jsxs("div",{className:"hn-sheet-block",children:[t.jsx(St,{variant:"pill",className:"hn-sheet-kinds",value:d.kind,onChange:M=>u(N=>({...N,kind:M})),tabs:[{value:"brief",label:"Feature brief",icon:"lightbulb"},{value:"qa",label:"QA finding",icon:"bug"},{value:"audit",label:"Audit",icon:"search"},{value:"goal",label:"Goal",icon:"target"},{value:"no_effort",label:"Tanpa effort",icon:"zap"}]}),t.jsx("div",{className:"hn-sheet-hint",children:y?"Sesi satu fase (Kerjakan): langsung mengerjakan lalu berhenti — tanpa brainstorm, spec, plan, maupun fase pembuktian terpisah. Untuk ganti copy, bump konstanta, perbaiki typo docs, tambah satu baris allowlist.":x?"Sesi goal langsung mengejar goal-nya — tanpa brainstorm, spec, atau plan (fase: Goal → Verifikasi). Sesi lahir dengan mode goal aktif dan menolak berhenti sampai buktinya ada di transkrip.":b?"Finding masuk lewat alur audit → spec → plan → execute. hanoman menelusuri akar masalah dulu.":v?"Audit HANYA menghasilkan dokumen (audit → laporan) — tanpa perbaikan kode. Bisa dinaikkan jadi Finding QA bila perlu diperbaiki.":"Brief masuk lewat alur brainstorm → objective → spec → plan → execute."})]}),t.jsx(de,{label:"Project",children:t.jsx(Be,{value:d.project,onChange:f("project"),className:"hn-w-full",options:n.map(M=>({value:M.id,label:M.name}))})}),t.jsx(de,{label:"Branch",hint:"branch yang disalin ke worktree (salinan kerja terpisah untuk sesi ini) saat sesi dimulai",children:t.jsx(Be,{value:d.branchFrom,onChange:f("branchFrom"),disabled:!m.length,className:"hn-w-full",options:Cb(m,p)})}),t.jsx(de,{label:"Bergantung pada",hint:"Backlog yang harus selesai & ter-merge lebih dulu. Kosongkan bila item ini berdiri sendiri.",children:S.length===0?t.jsx("div",{className:"hn-sheet-empty",children:"Belum ada backlog lain di project ini."}):t.jsx("div",{className:"hn-dep-list",children:S.map(M=>t.jsx(As,{"aria-label":`Bergantung pada ${M.id}`,checked:d.dependsOn.includes(M.id),onChange:()=>E(M.id),label:`${M.id} · ${M.title}`},M.id))})}),t.jsx(de,{label:"Judul",children:t.jsx(Oe,{"aria-label":"Judul",value:d.title,onChange:f("title"),placeholder:b?"mis. Funnel double-count sesi lintas tengah malam":y?"mis. Label tombol Simpan di form backlog":x?"mis. Latensi daftar backlog":"mis. Jadwal invoice berulang",className:"hn-w-full"})}),T?t.jsxs(t.Fragment,{children:[t.jsx(de,{label:"Goal",hint:"Keadaan yang harus tercapai — inilah yang dikejar sesi sampai terbukti",children:t.jsx(La,{"aria-label":"Goal",value:d.goal,onChange:f("goal"),rows:3,placeholder:"mis. p95 GET /api/specs di bawah 200 ms"})}),t.jsx(de,{label:"Selesai bila",hint:"Bukti yang harus muncul di transkrip; kosongkan bila goal-nya sudah jadi buktinya sendiri",children:t.jsx(La,{"aria-label":"Selesai bila",value:d.done,onChange:f("done"),rows:2,placeholder:"mis. output benchmark menunjukkan < 200 ms"})}),t.jsxs("div",{className:"hn-grid-mobile hn-grid-split",children:[t.jsx(de,{label:"Batasan",hint:"opsional",children:t.jsx(Oe,{"aria-label":"Batasan",value:d.constraints,onChange:f("constraints"),placeholder:"mis. tanpa cache eksternal",className:"hn-w-full"})}),t.jsx(de,{label:"Prioritas",children:t.jsx(Be,{"aria-label":"Prioritas",value:d.priority,onChange:f("priority"),className:"hn-w-full",options:Ip})})]})]}):b?t.jsxs(t.Fragment,{children:[t.jsx(de,{label:"Severity",children:t.jsx(Be,{value:d.severity,onChange:f("severity"),className:"hn-w-full",options:oL})}),t.jsx(de,{label:"Langkah reproduksi",children:t.jsx(La,{value:d.steps,onChange:f("steps"),rows:3,mono:!0,placeholder:`1. Buka …
|
|
1011
1011
|
2. Lakukan …
|
|
1012
1012
|
3. Amati …`})}),t.jsxs("div",{className:"hn-grid-mobile hn-grid-even",children:[t.jsx(de,{label:"Diharapkan",children:t.jsx(La,{value:d.expected,onChange:f("expected"),rows:2,placeholder:"mis. total funnel sama dengan jumlah baris laporan harian"})}),t.jsx(de,{label:"Aktual",children:t.jsx(La,{value:d.actual,onChange:f("actual"),rows:2,placeholder:"mis. total funnel dua kali lipat untuk sesi yang melewati tengah malam"})})]}),t.jsx(de,{label:"Environment",hint:"build / kanal tempat finding muncul",children:t.jsx(Oe,{value:d.env,onChange:f("env"),placeholder:"prod · web · v0.9.2",className:"hn-w-full"})}),t.jsx(de,{label:"Batasan",hint:"opsional — batasan pengerjaan yang sudah kamu ketahui",children:t.jsx(Oe,{"aria-label":"Batasan",value:d.constraints,onChange:f("constraints"),placeholder:"mis. jangan ubah kontrak API",className:"hn-w-full"})})]}):t.jsxs(t.Fragment,{children:[t.jsx(de,{label:v?"Apa yang diaudit / pertanyaan":"Konteks",hint:v?"Isu atau pertanyaan yang mau ditelusuri":"Latar belakang & alasan fitur ini dibutuhkan",children:t.jsx(La,{value:d.context,onChange:f("context"),rows:3,placeholder:v?"mis. apakah funnel double-count? cek log sesi lintas tengah malam…":"mis. operator harus membuka tiga layar untuk tahu sesi mana yang menunggu"})}),t.jsx(de,{label:v?"Temuan/jawaban yang diharapkan":"Hasil yang diharapkan",children:t.jsx(La,{value:d.outcome,onChange:f("outcome"),rows:2,placeholder:v?"Jawaban/kepastian yang dicari…":"mis. satu badge di Overview menunjukkan jumlah sesi yang menunggu"})}),t.jsxs("div",{className:"hn-grid-mobile hn-grid-split",children:[t.jsx(de,{label:"Batasan",hint:"opsional",children:t.jsx(Oe,{value:d.constraints,onChange:f("constraints"),placeholder:"mis. reuse queue yang ada",className:"hn-w-full"})}),t.jsx(de,{label:"Prioritas",children:t.jsx(Be,{value:d.priority,onChange:f("priority"),className:"hn-w-full",options:Ip})})]})]}),t.jsx(de,{label:"Lampiran",hint:"Gambar, log, CSV, JSON, atau PDF — sesi agen membacanya sebagai konteks",children:t.jsx(OE,{files:d.attachments,onChange:M=>u(N=>({...N,attachments:M}))})})]})}function uL({open:e,onClose:a,onCreate:n}){const i={kind:"from-scratch",mode:"local",name:"",desc:"",dir:"",gitRemote:"",objective:""},[r,s]=c.useState(i),[o,l]=c.useState(!1);c.useEffect(()=>{e&&(s(i),l(!1))},[e]);const d=v=>x=>s(y=>({...y,[v]:x.target.value})),u=r.kind==="from-scratch",m=!u&&r.mode==="clone",h=u?!!r.name.trim()&&!!r.dir.trim():m?!!r.gitRemote.trim()&&!!r.dir.trim():!!r.name.trim()||!!r.dir.trim(),p=async()=>{if(!(!h||o)){l(!0);try{await n(r)}finally{l(!1)}}},[g,f]=c.useState(!1),b=u?"Buat dan susun tujuan":m?o?"Menyalin repo…":"Salin repo dan susun dokumen":"Tambah dan susun dokumen";return t.jsxs(ca,{open:e,onClose:a,icon:"box",eyebrow:"workspace",title:"Project baru",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",size:"sm",onClick:a,disabled:o,children:"Batal"}),t.jsx(U,{size:"sm",leftIcon:u?"messages-square":m?"git-branch":"radar",onClick:p,disabled:!h||o,children:b})]}),children:[t.jsxs("div",{className:"hn-sheet-block",children:[t.jsx(St,{variant:"pill",value:r.kind,onChange:v=>s(x=>({...x,kind:v})),tabs:[{value:"from-scratch",label:"Dari nol",icon:"sparkles"},{value:"existing",label:"Kode yang sudah ada",icon:"folder-git-2"}]}),t.jsx("div",{className:"hn-sheet-hint",children:u?"hanoman menggali ide sampai tujuan MVP disepakati (brainstorm), lalu membuat kerangka dokumen acuan (Source of Truth).":"hanoman membaca kode yang sudah ada, lalu menyusun dokumen acuan (Source of Truth) dari kode itu."})]}),u?t.jsxs(t.Fragment,{children:[t.jsx(de,{label:"Nama project",hint:"lowercase, tanpa spasi",children:t.jsx(Oe,{value:r.name,onChange:d("name"),placeholder:"mis. kirana",className:"hn-w-full"})}),t.jsx(de,{label:"Direktori",hint:"folder tempat repo baru dibuat (mesin ini)",children:t.jsxs("div",{className:"hn-row-8",children:[t.jsx(Oe,{value:r.dir,onChange:d("dir"),leftIcon:"folder",mono:!0,placeholder:"/path/ke/project-baru",className:"hn-grow"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"folder-open",onClick:()=>f(!0),children:"Pilih folder"})]})}),t.jsx(fr,{open:g,onClose:()=>f(!1),start:r.dir,onPick:v=>s(x=>({...x,dir:v}))}),t.jsx(de,{label:"Ide awal",hint:"bahan awal brainstorm tujuan; menjadi deskripsi dan kerangka dokumen",children:t.jsx(La,{value:r.objective,onChange:d("objective"),rows:2,placeholder:"mis. POS ritel dengan stok multi-gudang dan laporan harian"})})]}):t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"hn-mb-12",children:t.jsx(St,{variant:"pill",value:r.mode,onChange:v=>s(x=>({...x,mode:v})),tabs:[{value:"local",label:"Dari folder lokal",icon:"folder"},{value:"clone",label:"Salin dari URL git",icon:"git-branch"}]})}),m?t.jsx(de,{label:"URL repository",hint:"GitHub/GitLab · https atau ssh",children:t.jsx(Oe,{value:r.gitRemote,onChange:d("gitRemote"),leftIcon:"git-branch",mono:!0,placeholder:"https://github.com/org/repo.git",className:"hn-w-full"})}):null,t.jsx(de,{label:m?"Folder tujuan salinan":"Direktori",hint:m?"folder lokal tempat repo disalin (git clone) di mesin ini":"opsional · folder checkout lokal (bisa diedit belakangan per-mesin)",children:t.jsxs("div",{className:"hn-row-8",children:[t.jsx(Oe,{value:r.dir,onChange:d("dir"),leftIcon:"folder",mono:!0,placeholder:"/path/ke/repo",className:"hn-grow"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"folder-open",onClick:()=>f(!0),children:"Pilih folder"})]})}),t.jsx(fr,{open:g,onClose:()=>f(!1),start:r.dir,onPick:v=>s(x=>({...x,dir:v}))}),t.jsx(de,{label:"Deskripsi",hint:"opsional",children:t.jsx(Oe,{value:r.desc,onChange:d("desc"),placeholder:"mis. POS ritel + inventori",className:"hn-w-full"})})]})]})}function mL({open:e,project:a,onClose:n,onSave:i}){const[r,s]=c.useState({id:"",name:"",desc:"",dir:"",gitRemote:""}),[o,l]=c.useState(!1),[d,u]=c.useState(null),[m,h]=c.useState([]),p=!!(d!=null&&d.length);c.useEffect(()=>{e&&a&&(s({id:a.id,name:a.name,desc:a.desc,dir:a.binding??"",gitRemote:a.gitRemote??""}),h((a.handledBy??[]).map(b=>({deviceId:b.deviceId,name:b.name}))))},[e,a]),c.useEffect(()=>{var v;if(!e)return;let b=!0;return(v=se.listDeviceTokens)==null||v.call(se).then(x=>{b&&u(x)}).catch(()=>{b&&u([])}),()=>{b=!1}},[e]);const g=/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/.test(r.id.trim()),f=!!r.name.trim()&&g;return t.jsxs(ca,{open:e,onClose:n,icon:"pencil",eyebrow:a?a.id:"project",title:"Edit project",footer:t.jsxs(t.Fragment,{children:[t.jsx(U,{variant:"ghost",size:"sm",onClick:n,children:"Batal"}),t.jsx(U,{size:"sm",leftIcon:"check",onClick:()=>f&&i({...r,handledBy:p?m:void 0}),children:"Simpan"})]}),children:[t.jsx(de,{label:"ID project",hint:"slug unik · huruf-kecil/angka/hubung · ganti = pengaruh Help Center & sync ke server",children:t.jsx(Oe,{value:r.id,onChange:b=>s(v=>({...v,id:b.target.value})),leftIcon:"hash",mono:!0,placeholder:"mis. erp-tumbuh-ai",className:"hn-w-full"})}),t.jsx(de,{label:"Nama project",hint:"label tampilan — boleh berbeda dari id",children:t.jsx(Oe,{value:r.name,onChange:b=>s(v=>({...v,name:b.target.value})),placeholder:"mis. ERP Tumbuh AI",className:"hn-w-full"})}),t.jsx(de,{label:"Deskripsi",children:t.jsx(Oe,{value:r.desc,onChange:b=>s(v=>({...v,desc:b.target.value})),placeholder:"mis. ERP manufaktur + inventori",className:"hn-w-full"})}),t.jsx(de,{label:"Path (mesin ini)",hint:"opsional · disimpan lokal, tak disync · kosongkan = pakai default",children:t.jsxs("div",{className:"hn-row-8",children:[t.jsx(Oe,{value:r.dir,onChange:b=>s(v=>({...v,dir:b.target.value})),leftIcon:"folder",mono:!0,placeholder:"/path/ke/repo (mesin ini)",className:"hn-grow-min"}),t.jsx(U,{size:"sm",variant:"secondary",leftIcon:"folder-open",onClick:()=>l(!0),children:"Pilih folder"})]})}),t.jsx(fr,{open:o,onClose:()=>l(!1),start:r.dir,onPick:b=>s(v=>({...v,dir:b}))}),t.jsx(de,{label:"Git remote",hint:"opsional · remote resmi agar device lain bisa clone project ini · disync antar-device",children:t.jsx(Oe,{value:r.gitRemote,onChange:b=>s(v=>({...v,gitRemote:b.target.value})),leftIcon:"git-branch",mono:!0,placeholder:"https://github.com/org/repo.git",className:"hn-w-full"})}),t.jsx(de,{label:"Ditangani oleh",hint:p?"hanoman client yang memegang project ini · disync ke semua mesin · boleh kosong":"disync ke semua mesin · hanya bisa diubah dari instance yang memegang katalog device",children:p?t.jsx(zd,{"aria-label":"Pilih hanoman client",placeholder:"Pilih client…",searchPlaceholder:"mis. mac-mini atau vps-jakarta",emptyText:"Tak ada device terdaftar yang cocok.",value:m.map(b=>b.deviceId),invalidValues:m.filter(b=>!d.some(v=>v.id===b.deviceId&&!v.revokedAt)).map(b=>b.deviceId),options:d.filter(b=>!b.revokedAt).map(b=>({value:b.id,label:b.lastSeenAt?`${b.name} · terakhir ${new Date(b.lastSeenAt).toLocaleDateString("id-ID")}`:b.name})),onChange:b=>h(b.map(v=>{var x;return m.find(y=>y.deviceId===v)??{deviceId:v,name:((x=d.find(y=>y.id===v))==null?void 0:x.name)??v}}))}):t.jsx(Pb,{list:a==null?void 0:a.handledBy})})]})}function hL(){return t.jsx(Jf,{children:t.jsx(pL,{})})}function pL(){var Rs,Ls,$s,Bs;const e=Qf(),a=Zf(),n=c.useMemo(()=>n1(e.pathname,Hl),[e.pathname]),[i,r]=Oa("app","section","overview",vi(...Hl)),s=(n==null?void 0:n.section)??i;c.useEffect(()=>{n&&Hl.includes(n.section)&&r(n.section)},[n==null?void 0:n.section]);const o=c.useCallback(_=>a(Vt({section:_})),[a]),l=c.useCallback(_=>a(Vt({section:"project",projectId:_})),[a]),[d,u]=c.useState(null),[m,h]=c.useState([]),[p,g]=c.useState([]),f=c.useRef(""),[b,v]=c.useState(0),[x,y]=c.useState([]),[T,S]=c.useState([]),[E,w]=Oa("app","projectId","",Hn),[M,N]=c.useState(null),[R,I]=Oa("app","projectFilter","all",Hn),[L,A]=c.useState(null),[B,G]=c.useState(null),[H,Y]=c.useState(null);c.useEffect(()=>{s!=="terminal"&&A(null)},[s]);const X=c.useCallback(_=>{A(_??null),o("terminal")},[o]),[q,ie]=Oa("projects","q","",Hn),[te,Z]=c.useState(null),{confirm:xe,dialog:_e}=st(),ae=BE(),[ee,le]=c.useState(null),[re,Ce]=c.useState(null),[Ee,J]=Rk(),[ea,Ke]=c.useState("loading"),[He,Ve]=c.useState(null),ya=c.useCallback(()=>Ve({needsSetup:!1,user:null}),[]);c.useEffect(()=>{se.authStatus().then(Ve).catch(()=>Ve({needsSetup:!1,user:null}))},[]);const We=(He==null?void 0:He.user)!=null&&He.user.role!=="client";wk(We);const[ga,qa]=vb(),wa=ll(),be=We&&ME(ga,wa),[Ze,z]=c.useState(null),[$e,aa]=c.useState(!1);c.useEffect(()=>{(He!=null&&He.needsSetup||We)&&se.setupStatus().then(z).catch(()=>z(null))},[He==null?void 0:He.needsSetup,We,(Rs=He==null?void 0:He.user)==null?void 0:Rs.id]),c.useEffect(()=>{hT()},[]),c.useEffect(()=>{const _=HM(window.location.hash);if(_){a(Vt({section:"backlog",specId:_}),{replace:!0});return}n||a(Vt({section:i}),{replace:!0})},[n]),c.useEffect(()=>{(n==null?void 0:n.section)==="project"&&n.projectId&&w(n.projectId),(n==null?void 0:n.section)==="backlog"&&u(n.specId??null)},[n==null?void 0:n.section,n==null?void 0:n.projectId,n==null?void 0:n.specId]);const[da,je]=c.useState({enabled:!1,devices:[],hubVersion:""}),[ye,Ue]=c.useState(null),[ve,fe]=c.useState(null),_a=c.useRef({sessions:x,leadAsks:T,pending:ye});_a.current={sessions:x,leadAsks:T,pending:ye};const Ta=c.useCallback(()=>{Ke("loading"),Promise.all([se.listProjects(),se.listSpecs(),se.listTerminals()]).then(([_,W,V])=>{h(_.items),g(W.items.map(BM)),y(V),f.current=tp(W.items),w(F=>{var ne;return F||((ne=_.items[0])==null?void 0:ne.id)||""}),v(F=>F+1),Ke("ready")}).catch(_=>{if(_ instanceof ba&&_.status===401){ya();return}Ke("error"),J("Gagal memuat data dari server","err","x-circle")})},[J,ya]);c.useEffect(()=>{We&&Ta()},[Ta,We,(Ls=He==null?void 0:He.user)==null?void 0:Ls.id]);const sa=m,Ba=c.useCallback(async _=>{try{const W=await se.getProject(_);h(V=>V.map(F=>F.id===W.id?W:F))}catch{}},[]),ta=c.useMemo(()=>new Set(x.filter(_=>_.specId&&!_.exited).map(_=>_.specId)),[x]),ke=c.useMemo(()=>pN(x,p),[x,p]),Ge=c.useMemo(()=>LM(da),[da]),ma=c.useMemo(()=>Object.fromEntries(p.map(_=>[_.id,_.title])),[p]);c.useEffect(()=>{if(We)return li(_=>{if(_.t==="specs"){const W=tp(_.specs);W!==f.current&&(f.current=W,g(_.specs),v(V=>V+1))}else if(_.t==="sessions")rd(_a.current.sessions,_.sessions,y);else if(_.t==="leadAsks")rd(_a.current.leadAsks,_.asks,S);else if(_.t==="presence"){const W={enabled:_.enabled,devices:_.devices,hubVersion:_.hubVersion};je(V=>np(V)===np(W)?V:W)}else _.t==="pending"?rd(_a.current.pending,_.counts,Ue):_.t==="overview"&&fe(_.overview)})},[We]);const Ne=sa.find(_=>_.id===E)||sa[0];function Ja(_){w(_.id),l(_.id)}const At=(_,W)=>a(Vt({section:"review",kind:_,id:W}));function ut(_){N({id:_.id,kind:"spec",title:_.title}),At("spec",_.id)}function rt(_){var W;N({id:_,kind:"spec",title:((W=p.find(V=>V.id===_))==null?void 0:W.title)??_}),At("spec",_)}function tn(_,W){N({id:_,kind:"session",title:W}),At("session",_)}const Pa=(n==null?void 0:n.section)==="review"?M&&M.id===n.id&&M.kind===n.kind?M:{id:n.id,kind:n.kind,title:(($s=p.find(_=>_.id===n.id))==null?void 0:$s.title)??n.id}:null,ot=c.useMemo(()=>ho.filter(_=>!_.gate||da.enabled),[da.enabled]),Ka=c.useMemo(()=>ot.map(_=>_.key),[ot]);pE({enabled:!!(He!=null&&He.user)&&He.user.role!=="client",navKeys:Ka,go:o});const Ua=c.useMemo(()=>sa.map(_=>({id:_.id,name:_.name})),[m]),It=c.useMemo(()=>({value:R,projects:Ua,onChange:I}),[R,Ua,I]),Tt=c.useMemo(()=>nE({nav:ho,gates:{clients:da.enabled},projects:Ua,specs:p,waiting:fb(x,p).map(_=>{const W=_.specId?ma[_.specId]:void 0;return{id:_.id,label:`${_.specId??_.id}${W?` · ${W}`:""}`}}),scope:R,go:o,openSpec:_=>a(Vt({section:"backlog",specId:_})),openSession:_=>X(_),newSpec:()=>Z("brief"),newProject:()=>Z("project"),setScope:I,petOn:be,setPetOn:qa}),[p,x,Ua,da.enabled,R,ma,o,a,X,be,qa]),vt=c.useRef(null);c.useEffect(()=>{s!=="dalang"&&(vt.current=s)},[s]);const jn=c.useCallback(_=>s==="terminal"&&!!_.sessionId&&L===_.sessionId,[s,L]),Et=c.useCallback(_=>{const W=O2(_,x);W.projectFilter&&I(W.projectFilter),W.focus&&A(W.focus),o(W.section)},[x]);async function Nt(_){if(!Ne)return;const W=_.id.trim();try{if(W&&W!==Ne.id){if(!await xe({title:`Ganti ID project "${Ne.id}" → "${W}"?`,message:"Ini berpengaruh ke SEMUA yang terkait project:",impact:[t.jsxs(t.Fragment,{children:["Link Help Center publik berubah jadi ",t.jsxs("code",{children:["/help/",W]})," — tautan lama rusak."]}),"Perubahan dirambatkan (sync) ke server; server ikut berganti id."],confirmLabel:"Ganti ID",icon:"pencil"}))return;const we=await se.renameProject(Ne.id,W);we.helpUrl&&J("Help Center baru: "+we.helpUrl,"ok","life-buoy")}const V=W&&W!==Ne.id?W:Ne.id;await se.updateProject(V,{name:_.name.trim(),desc:_.desc.trim(),gitRemote:_.gitRemote.trim(),..._.handledBy?{handledBy:_.handledBy}:{}});const F=_.dir.trim();F!==(Ne.binding??"")&&(F?await se.putBinding(V,F):await se.deleteBinding(V));const ne=await se.getProject(V);h(we=>[...we.filter(Xe=>Xe.id!==Ne.id&&Xe.id!==ne.id),ne]),w(ne.id),Z(null),J("Project "+ne.name+" diperbarui","ok","box")}catch{J("Gagal memperbarui project","err","x-circle")}}async function mt(_){var Xe;const W=_.kind==="from-scratch",V=!W&&_.mode==="clone",F=wu(_.gitRemote),ne=_.name.trim()||(V?F:_.dir.split("/").filter(Boolean).pop()||"repo");let we;try{we=await se.createProject({name:ne,kind:_.kind,desc:W&&_.objective.trim()||_.desc.trim(),repoDir:W?_.dir.trim():V?void 0:_.dir,gitRemote:V?_.gitRemote.trim():void 0})}catch{J("Gagal membuat project","err","x-circle");return}if(V)try{await se.cloneProject(we.id,_.dir.trim()),we=await se.getProject(we.id)}catch(Ea){const{error:Ra}=vf(Ea);h(ka=>[we,...ka]),w(we.id),Z(null),l(we.id),J(`Project ${we.id} dibuat, tapi clone gagal · ${Ra} · clone ulang dari detail project`,"warn","git-branch");return}if(h(Ea=>[we,...Ea]),Z(null),W){let Ea=!0;try{Ea=(await se.getSettings()).autoScaffold}catch{}if(Ea)try{const{id:Ra}=await se.scaffoldDocs(we.id);w(we.id),X(Ra),J(`Project ${we.id} dibuat · buat kerangka dokumen · sesi ${Ra} dimulai`,"ok","sparkles");return}catch{}w(we.id),l(we.id),J(`Project ${we.id} dibuat · tekan "Scaffold docs" untuk menyusun SoT`,"ok","box");return}w(we.id);try{const{id:Ea}=await se.reverseDocs(we.id);X(Ea),J(`Project ${we.id} dibuat · susun dokumen · sesi ${Ea} dimulai`,"ok","radar")}catch(Ea){const Ra=(Xe=Ea.detail)==null?void 0:Xe.error;l(we.id),J(`Project ${we.id} dibuat, tapi susun dokumen gagal dimulai`+(Ra?` · ${Ra}`:"")+' · ulangi lewat "Reverse docs"',"warn","radar")}}async function nn(_){try{if(!await xe({title:`Hapus project "${_.name}"?`,message:`Project "${_.id}" dan seluruh isinya dihapus dari dashboard ini.`,impact:["Semua backlog item project ini ikut terhapus.","Tindakan ini tak bisa dibatalkan."],confirmLabel:"Hapus project",run:()=>se.deleteProject(_.id)}))return;h(W=>W.filter(V=>V.id!==_.id)),g(W=>W.filter(V=>V.projectId!==_.id)),y(W=>W.filter(V=>V.projectId!==_.id)),w(W=>W===_.id?"":W),I(W=>W===_.id?"all":W),(s==="docs"||s==="project")&&o("projects"),J("Project "+_.id+" dihapus","warn","trash-2")}catch(W){const V=W instanceof ba&&W.status===409;J("Gagal hapus "+_.id+(V?" · masih ada sesi aktif":""),"err","x-circle")}}const[ha,Ct]=c.useState(null);function sn(_){Y("backlog"),Ct(_)}function Rt(_){Y("terminal"),Ct(_)}const wn=c.useCallback(()=>G(null),[]);async function Lt(_,W,V){try{const F=await se.integrateSpec(_.id,W,V);F.status==="conflict"?(X(F.sessionId),J(`${_.id} · konflik ${W} — selesaikan di Terminal`,"warn","git-merge")):J(`${_.id} · ${W} berhasil · ${F.detail}`,"ok","git-merge")}catch(F){const ne=F instanceof ba?F.status:0;J(`${_.id} · gagal ${W}`+(ne===409?" · cek target/branch":""),"err","x-circle")}}async function he(_,W,V){try{const F=await se.sessionIntegrate(_.id,W,V);F.status==="conflict"?(X(F.sessionId),J(`${_.id} · konflik ${W} — selesaikan di Terminal`,"warn","git-merge")):J(`${_.id} · ${W} berhasil · ${F.detail}`,"ok","git-merge")}catch(F){const ne=F instanceof ba?F.status:0;J(`${_.id} · gagal ${W}`+(ne===409?" · cek target/branch":""),"err","x-circle")}}async function ra(_,W){try{const{id:V}=await(W?se.reverseDocs(_.id,{force:W}):se.reverseDocs(_.id));X(V),J(_.id+" · susun dokumen · sesi "+V+" dimulai","info","radar")}catch(V){if(ae.offerRetry(V,`${_.id} · susun dokumen`,ne=>ra(_,ne)))return;const F=V instanceof ba&&(V.status===422||V.status===400);J(_.id+" · gagal mulai reverse"+(F?" · project belum punya repoDir":""),"warn","x-circle")}}async function za(_,W){try{const{id:V}=await(W?se.scaffoldDocs(_.id,{force:W}):se.scaffoldDocs(_.id));X(V),J(_.id+" · buat kerangka dokumen · sesi "+V+" dimulai","info","sparkles")}catch(V){if(ae.offerRetry(V,`${_.id} · buat kerangka dokumen`,ne=>za(_,ne)))return;const F=V instanceof ba&&(V.status===422||V.status===400);J(_.id+" · gagal mulai scaffold"+(F?" · project belum punya repoDir":""),"warn","x-circle")}}async function Wa(_,W,V,F){try{const{id:ne}=await se.startPrd(_,W,F?{...V,force:F}:V);X(ne),J(`PRD · sesi ${ne} dimulai`,"info","scroll-text")}catch(ne){if(ae.offerRetry(ne,`${_} · PRD`,Xe=>Wa(_,W,V,Xe)))return;const we=ne instanceof ba&&(ne.status===422||ne.status===400);J("gagal mulai PRD"+(we?" · project belum punya repoDir":""),"warn","x-circle")}}function di(_){le(_),Z("brief")}async function Sn(_,W,V){try{const{id:F}=await(V?se.startBreakdown(_,W,{force:V}):se.startBreakdown(_,W));X(F),J(`Breakdown · sesi ${F} dimulai`,"info","split")}catch(F){if(ae.offerRetry(F,`${_} · pecah jadi backlog`,we=>Sn(_,W,we)))return;const ne=F instanceof ba&&(F.status===422||F.status===400);J("gagal mulai breakdown"+(ne?" · project belum punya repoDir/PRD":""),"warn","x-circle")}}async function ci(_,W,V){try{const{created:F}=await se.createSpecsBatch({project:_,items:V,prdPath:W});return g(ne=>[...F,...ne]),o("backlog"),J(`${F.length} backlog dibuat dari PRD`,"ok","list-checks"),F.length}catch{return J("Gagal membuat backlog dari PRD","err","x-circle"),0}}function $i(_,W){const V=W==null?void 0:W.prefill,F=`Dari audit ${_.id}: ${_.objective}`;le({project:_.projectId,kind:"qa",title:(V==null?void 0:V.title)||_.title,steps:((V==null?void 0:V.steps)||F).slice(0,500),actual:(V==null?void 0:V.context)||_.objective,severity:V!=null&&V.severity&&["critical","major","minor"].includes(V.severity)?V.severity:"major",constraints:(V==null?void 0:V.constraints)??"",branchFrom:`hanoman/${_.id.toLowerCase()}`,fromAudit:_.id}),Z("brief")}function Ns(_,W){const V=W==null?void 0:W.prefill;le({project:_.projectId,kind:"brief",title:(V==null?void 0:V.title)||_.title,context:(V==null?void 0:V.context)||`Dari audit ${_.id}: ${_.objective}`,outcome:(V==null?void 0:V.outcome)||"",branchFrom:`hanoman/${_.id.toLowerCase()}`,fromAudit:_.id}),Z("brief")}function ia(_,W){const V=W==null?void 0:W.prefill;Ce({project:_.projectId,branchFrom:`hanoman/${_.id.toLowerCase()}`,fromAudit:_.id,title:(V==null?void 0:V.title)||_.title,context:(V==null?void 0:V.context)||`Dari audit ${_.id}: ${_.objective}`,outcome:(V==null?void 0:V.outcome)||""})}async function Bi(_,W){try{const V=await se.patchSpec(_.id,{branchFrom:W});if("pending"in V)return;g(F=>F.map(ne=>ne.id===V.id?V:ne)),J(_.id+" · branch "+(W??"main (default project)"),"ok","git-branch")}catch{J("Gagal mengubah branch "+_.id,"err","x-circle")}}async function oe(_,W){try{const V=await se.patchSpec(_.id,W);if("pending"in V)return;g(F=>F.map(ne=>ne.id===V.id?V:ne)),J(_.id+" diperbarui","ok","check")}catch(V){const F=V instanceof ba&&V.status===409;J(F?_.id+" sudah dimulai — tak bisa diedit":"Gagal menyimpan "+_.id,"warn","x-circle")}}async function De(_,W,V,F){try{const ne=await se.changeSpecSource(_.id,{source:W,payload:V,confirmReset:F});return"pending"in ne?ne:(g(we=>we.map(Xe=>Xe.id===ne.id?ne:Xe)),J(`${_.id} · type ${_.source} → ${W}`,"ok","shuffle"),null)}catch(ne){const we=ne instanceof ba&&ne.status===409;return J(we?`${_.id} punya sesi yang masih berjalan — tutup dulu sesinya`:`Gagal mengubah type ${_.id}`,"warn","x-circle"),null}}async function ze(_,W){try{const V=await se.patchSpec(_.id,{dependsOn:W});if("pending"in V)return;g(F=>F.map(ne=>ne.id===V.id?V:ne)),J(_.id+" · dependency diperbarui","ok","lock")}catch(V){const F=V instanceof ba&&V.status===400;J(F?"Dependency ditolak server":"Gagal menyimpan dependency "+_.id,"warn","x-circle")}}async function oa(_,W){try{const V=await se.patchSpec(_.id,{autoMerge:W});if("pending"in V)return;g(F=>F.map(ne=>ne.id===V.id?V:ne)),J(_.id+" · auto-merge diperbarui","ok","git-merge")}catch(V){const F=V instanceof ba?V.message:"Gagal menyimpan auto-merge "+_.id;J(F,"warn","x-circle")}}async function Fa(_,W,V){try{const F=await se.patchSpec(_.id,{stage:W,confirmDelete:V});return"pending"in F||(g(ne=>ne.map(we=>we.id===F.id?F:we)),J(_.id+" dikembalikan ke "+(Vc[W]??W),"warn","rotate-ccw")),F}catch{J("Gagal mengembalikan stage "+_.id,"err","x-circle");return}}async function _n(_){const{defaultBranch:W}=await se.listBranches(_.projectId),V=_.branchFrom??W;if(!V){J(_.id+" · cabang tujuan belum diketahui","err","x-circle");return}await Lt(_,"merge","local:"+V)}async function An(_){const W=await se.deleteSpecWorktree(_.id);if(!W.ok)throw new Error(W.error??"worktree tidak ditemukan");J(_.id+" · worktree dihapus","ok","trash-2")}async function $t(_,W,V){var F;try{const ne=await se.markSpecDone(_.id,{reason:W||void 0,confirm:V});return g(we=>we.map(Xe=>Xe.id===ne.id?ne:Xe)),J(_.id+" ditandai selesai","ok","circle-check"),ne}catch(ne){const we=ne instanceof ba?ne.detail:null;if((we==null?void 0:we.error)==="confirm-required")return{needConfirm:!0,sessionId:(F=we.session)==null?void 0:F.id};J((we==null?void 0:we.error)==="backlog item sudah selesai"?_.id+" sudah selesai":"Gagal menandai selesai "+_.id,"warn","x-circle");return}}async function Vn(_,W){const V=await se.markSpecReviewed(_.id,W);g(F=>F.map(ne=>ne.id===V.id?{...ne,reviewedAt:V.reviewedAt}:ne)),J(_.id+(W?" ditandai sudah ditinjau":" tanda ditinjau dibatalkan"),"ok",W?"circle-check":"rotate-ccw")}async function Di(_){await se.deleteSpec(_.id),g(W=>W.filter(V=>V.id!==_.id)),J(_.id+" dihapus dari backlog","warn","trash-2")}async function ui(_){const W=_.kind==="qa",V=Ii(_.kind)==="goal",F=W?{severity:_.severity,steps:_.steps,expected:_.expected,actual:_.actual,env:_.env,constraints:_.constraints,..._.fromAudit?{fromAudit:_.fromAudit}:{}}:V?{goal:_.goal.trim(),done:_.done,constraints:_.constraints,priority:_.priority}:{context:_.context,outcome:_.outcome,constraints:_.constraints,priority:_.priority,..._.fromAudit?{fromAudit:_.fromAudit}:{}};try{const ne=await se.createSpec({project:_.project,source:_.kind,title:_.title.trim(),priority:_.priority,payload:F,branchFrom:_.branchFrom||void 0,..._.dependsOn.length?{dependsOn:_.dependsOn}:{}});if(g(Xe=>[ne,...Xe]),_.attachments.length){const Xe=await se.uploadSpecAttachments(ne.id,_.attachments).catch(()=>null);Xe?Xe.rejected.length&&J(`${Xe.rejected.length} lampiran ditolak: ${Xe.rejected.map(Ea=>Ea.filename).join(", ")}`,"warn","paperclip"):J("Item dibuat, tapi lampiran gagal diunggah","warn","paperclip")}Z(null),le(null),o("backlog");const we=_.kind==="audit"?" dibuat · audit-only (dokumen)":_.kind==="no_effort"?" dibuat · sesi satu fase (Kerjakan)":_.kind==="goal"?" dibuat · sesi goal (Goal → Verifikasi)":W?" difilekan · masuk audit":" dibuat · masuk brainstorm";J(ne.id+we,"ok",_.kind==="audit"?"search":_.kind==="no_effort"?"zap":_.kind==="goal"?"target":W?"bug":"lightbulb")}catch{J("Gagal membuat spec","err","x-circle")}}const Yn=_=>t.jsx(I2,{children:t.jsx(c.Suspense,{fallback:t.jsx(pe,{kind:"loading",title:"Memuat halaman…"}),children:_})}),xt=_=>ea==="loading"?t.jsx(pe,{kind:"loading",title:"Memuat workspace…"}):ea==="error"?t.jsx(pe,{kind:"error",illustration:"PST-006",title:"Gagal memuat data dari server",hint:"Pastikan server hanoman berjalan, lalu coba lagi.",action:Ta}):Yn(_),Qa=t.jsx(JT,{section:s,onNavigate:o});if(!He)return t.jsx(pe,{kind:"loading",title:"Memuat hanoman…"});if(He.needsSetup&&(Ze!=null&&Ze.needed)&&!$e)return t.jsx(YE,{status:Ze,onDone:()=>aa(!0)});if(!He.user)return t.jsx(VE,{needsSetup:He.needsSetup,setupTokenRequired:He.setupTokenRequired??!1,setupTokenPath:He.setupTokenPath,setupStep:He.needsSetup&&$e?2:void 0,onDone:_=>Ve({needsSetup:!1,user:_})});if(He.user.role==="client")return t.jsx(oC,{user:He.user,onLoggedOut:ya});const Oi=He.user;let $a=null;if(s==="overview")$a=t.jsx(Za,{active:"overview",title:"Overview",breadcrumb:"nafanesia.id · ringkasan workspace",onNavigate:o,children:xt(t.jsx(gI,{projects:sa,backlog:p,sessions:x,overview:ve,onOpenProject:Ja,onGoto:o,onCreateProject:()=>Z("project"),onOpenSession:_=>{A(_),o("terminal")}}))});else if(s==="dalang"){const _=vt.current,W=(Bs=ho.find(V=>V.key===_))==null?void 0:Bs.label;$a=xt(t.jsx(JR,{projects:sa,backlog:p,sessions:x,onOpenProject:Ja,onGoto:o,onOpenSession:V=>{A(V),o("terminal")},previous:_&&W?{label:W,onBack:()=>o(_)}:void 0,onExit:()=>o("overview")}))}else if(s==="projects")$a=t.jsxs(Za,{active:"projects",title:"Projects",breadcrumb:"nafanesia.id · workspace",showSearch:!0,searchValue:q,onSearchChange:ie,onNavigate:o,actions:t.jsx(U,{size:"sm",leftIcon:"plus",onClick:()=>Z("project"),children:"Project baru"}),children:[Qa,xt(sa.length===0?t.jsx(pe,{kind:"empty",icon:"box",title:"Belum ada project",hint:"Mulai dari nol atau tambahkan codebase yang sudah ada — hanoman menyusun Source of Truth-nya.",action:()=>Z("project"),actionLabel:"Project baru"}):t.jsx(yI,{projects:sa,variant:"list",onOpen:Ja,onDelete:nn,pageSize:20,search:q,dataVersion:b,onClearSearch:()=>ie(""),presenceByProject:Ge.byProject}))]});else if(s==="project")$a=t.jsxs(Za,{active:"projects",title:Ne?Ne.name:"Project",breadcrumb:Ne?"projects · "+Ne.id:"projects",onNavigate:o,children:[Qa,xt(Ne?t.jsx(II,{p:Ne,onEdit:()=>Z("project-edit"),onToast:J,onProjectChanged:Ba,onGotoDocs:()=>o("docs"),onGotoTerminal:()=>{I(Ne.id),X()},onGotoBacklog:()=>{I(Ne.id),o("backlog")},onGotoSkills:()=>a(Vt({section:"skills",projectId:Ne.id})),onReverse:Ne.kind==="existing"&&(Ne.binding??Ne.repoDir)?()=>ra(Ne):void 0,onScaffold:Ne.kind==="from-scratch"&&(Ne.binding??Ne.repoDir)?()=>za(Ne):void 0,onDelete:()=>nn(Ne)}):t.jsx(pe,{kind:"empty",icon:"box",title:"Belum ada project",hint:"Mulai dari nol atau tambahkan codebase yang sudah ada.",action:()=>Z("project"),actionLabel:"Project baru"}))]});else if(s==="backlog")$a=t.jsxs(Za,{active:"backlog",title:"Backlog",breadcrumb:"specs · brainstorm → execute",onNavigate:o,actions:t.jsx(U,{size:"sm",leftIcon:"plus",onClick:()=>Z("brief"),children:"Tambah"}),children:[Qa,xt(t.jsx(GN,{backlog:p,projects:sa,pageSize:20,onStart:sn,activeSpecs:ta,presenceBySpec:Ge.bySpec,reviewSpecIds:ke,onNew:()=>Z("brief"),onDelete:Di,onOpenRun:_=>{var W;return X((W=x.find(V=>V.specId===_.id&&!V.exited))==null?void 0:W.id)},onOpenReview:ut,onEditBranch:Bi,onRevertStage:Fa,onMarkDone:$t,onMarkReviewed:(_,W)=>Vn(_,W).catch(()=>J(_.id+" gagal diperbarui","warn","x-circle")),onIntegrate:Lt,onEditSpec:oe,onEditDeps:ze,onEditAutoMerge:oa,onChangeSource:De,onPromoteToQa:$i,onPromoteToBrief:Ns,onPromoteToPrd:ia,onToast:J,initialDetailId:d,projectFilter:R,onProjectFilter:I,dataVersion:b}))]});else if(s==="team")$a=t.jsxs(Za,{active:"team",title:"Tim",breadcrumb:"tugas manusia · backlog → selesai",onNavigate:o,children:[Qa,t.jsx(QR,{projects:sa,projectFilter:R,onProjectFilter:I,onToast:J,onOpenSpec:_=>a(Vt({section:"backlog",specId:_}))})]});else if(s==="triage")$a=t.jsx(Za,{active:"triage",title:"Triase",breadcrumb:"keluhan · lapor → triase → backlog",onNavigate:o,children:t.jsx(ZR,{projects:sa,onToast:J,onAccepted:(_,W)=>{J(W?`Tiket sudah jadi ${_.id}`:`Diterima → ${_.id}`,"ok","arrow-up-right"),I(_.projectId),o("backlog")}})});else if(s==="prd")$a=t.jsxs(Za,{active:"prd",title:"PRD",breadcrumb:"brief → brainstorm → dokumen",onNavigate:o,children:[Qa,xt(sa.length===0?t.jsx(pe,{kind:"empty",icon:"box",title:"Belum ada project",hint:"PRD butuh project dengan repoDir untuk menulis docs/prd/.",action:()=>Z("project"),actionLabel:"Project baru"}):t.jsx(XN,{projects:sa,projectFilter:R,onProjectFilter:I,onNewPrd:Wa,onTakeToBacklog:di,onStartBreakdown:Sn,onMaterialize:ci,dataVersion:b}))]});else if(s==="terminal")$a=t.jsxs(Za,{active:"terminal",title:"Terminal",breadcrumb:"Claude Code · sesi interaktif",onNavigate:o,wide:!0,children:[Qa,xt(sa.length===0?t.jsx(pe,{kind:"empty",icon:"box",title:"Belum ada project",hint:"Terminal butuh project dengan repoDir untuk dijalankan.",action:()=>Z("project"),actionLabel:"Project baru"}):t.jsx(XR,{userId:Oi.id,projects:sa,backlog:p,focusSession:L,sessions:x,setSessions:y,startedSession:B,onStartedSessionHandled:wn,onStartBacklog:Rt,onOpenProject:l,onOpenReview:rt,onOpenSessionReview:tn,titleOf:_=>{var W;return(W=p.find(V=>V.id===_))==null?void 0:W.title},onIntegrate:Lt,onIntegrateSession:he,specOf:_=>p.find(W=>W.id===_)}))]});else if(s==="ide")$a=t.jsxs(Za,{active:"ide",title:"IDE",breadcrumb:Ne?Ne.name:"workspace",onNavigate:o,wide:!0,children:[Qa,xt(sa.length===0?t.jsx(pe,{kind:"empty",icon:"box",title:"Belum ada project",hint:"IDE butuh project dengan repoDir.",action:()=>Z("project"),actionLabel:"Project baru"}):t.jsx(eL,{projects:sa,projectId:Ne?Ne.id:sa[0].id,onProject:_=>w(_),onToast:J,onGotoTerminal:X}))]});else if(s==="vps")$a=t.jsxs(Za,{active:"vps",title:"VPS",breadcrumb:"infra · audit → harden",onNavigate:o,children:[Qa,t.jsx(aL,{onToast:J,onGotoTerminal:X})]});else if(s==="clients")$a=t.jsxs(Za,{active:"clients",title:"Klien",breadcrumb:"device · sesi yang sedang berjalan",onNavigate:o,children:[Qa,t.jsx(RM,{view:da,specTitles:ma,onOpenSpec:rt,onToast:J})]});else if(s==="scheduler")$a=t.jsxs(Za,{active:"scheduler",title:"Scheduler",breadcrumb:"otonom · jadwal → antrean → sesi",onNavigate:o,children:[Qa,t.jsx(tL,{projects:sa,backlog:p,onProjectChanged:Ba,onToast:J,onGotoTerminal:X})]});else if(s==="lead")$a=t.jsxs(Za,{active:"lead",title:"Lead",breadcrumb:"otonom · keputusan → jejak → kendali",onNavigate:o,children:[Qa,t.jsx(nL,{projects:sa,onProjectChanged:Ba,onToast:J,onGotoTerminal:X})]});else if(s==="docs")$a=t.jsxs(Za,{active:"docs",title:"Source of Truth",breadcrumb:Ne?Ne.name:"workspace",onNavigate:o,wide:!0,actions:Ne&&t.jsxs(t.Fragment,{children:[t.jsx(Be,{size:"sm","aria-label":"Pilih project",value:Ne.id,onChange:_=>w(_.target.value),options:sa.map(_=>({value:_.id,label:_.name}))}),t.jsx(an,{label:`Aksi untuk project ${Ne.name}`,icon:"ellipsis",items:[{key:"delete",label:"Hapus project…",icon:"trash-2",tone:"danger",onSelect:()=>nn(Ne)}]})]}),children:[Qa,xt(Ne?t.jsx(iL,{projectId:Ne.id,projectName:Ne.name,docStatus:Ne.docStatus}):t.jsx(pe,{kind:"empty",icon:"book-open",title:"Belum ada project",hint:"Source of Truth muncul setelah ada project yang dipantau.",action:()=>Z("project"),actionLabel:"Project baru"}))]});else if(s==="review"){const _=(Pa==null?void 0:Pa.kind)==="session"?"terminal":"backlog",W=(Pa==null?void 0:Pa.kind)==="spec"?p.find(V=>V.id===Pa.id):void 0;$a=t.jsxs(Za,{active:"backlog",title:"Review",wide:!0,onNavigate:o,breadcrumb:Pa?(Pa.kind==="session"?"terminal · ":"backlog · ")+Pa.id:"review",actions:t.jsx(U,{size:"sm",variant:"ghost",leftIcon:"arrow-left",onClick:()=>o(_),children:"Kembali"}),children:[Qa,xt(Pa?t.jsx(sL,{specId:Pa.id,kind:Pa.kind,title:Pa.title,onBack:()=>o(_),onGoto:V=>a(Vt(V)),...(W==null?void 0:W.stage)==="done"?{onIntegrate:()=>_n(W),integrateTarget:W.branchFrom??void 0,onRevert:async(V,F)=>{const ne=await Fa(W,"executing",F);return ne&&"pending"in ne?ne:void 0},reviewed:!!W.reviewedAt,onMarkReviewed:(V,F)=>Vn(W,F)}:{},...W&&W.stage!=="done"?{onDiscard:()=>An(W)}:{}}):t.jsx(pe,{kind:"empty",icon:"git-compare",title:"Pilih item untuk di-review",hint:"Buka Review dari Backlog atau dari sel sesi di Terminal.",action:()=>o("backlog"),actionLabel:"Ke Backlog"}))]})}else if(s==="qa"){const _=n==null?void 0:n.projectId;$a=t.jsxs(Za,{active:"qa",title:"QA",wide:!0,onNavigate:o,breadcrumb:"qa · laporan per project",children:[Qa,xt(t.jsx(lN,{projects:m,projectId:_,onSelectProject:W=>a(Vt({section:"qa",projectId:W||void 0})),onToast:J,onOpenSession:W=>{A(W),o("terminal")}},_??"all"))]})}else if(s==="skills"){const _=n!=null&&n.projectId?m.find(W=>W.id===n.projectId):void 0;$a=t.jsx(Za,{active:"skills",title:"Skills",wide:!0,onNavigate:o,breadcrumb:n!=null&&n.projectId?`skills · ${(_==null?void 0:_.name)??n.projectId}`:"skills · global & project",actions:n!=null&&n.projectId?t.jsx(U,{size:"sm",variant:"ghost",leftIcon:"arrow-left",onClick:()=>l(n.projectId),children:"Kembali ke project"}):void 0,children:xt(t.jsx(zI,{projectId:n==null?void 0:n.projectId,projectName:_==null?void 0:_.name,onToast:J},(n==null?void 0:n.projectId)??"all"))})}else s==="settings"&&($a=t.jsxs(Za,{active:"settings",title:"Settings",breadcrumb:"nafanesia.id · workspace",onNavigate:o,children:[Qa,Yn(t.jsx(rL,{onToast:J,me:Oi,onLoggedOut:ya}))]}));return t.jsx(sT,{user:Oi,onLoggedOut:ya,children:t.jsxs(D2,{showToast:J,onOpen:Et,isViewing:jn,children:[t.jsx(JE,{status:Ze}),t.jsx(nb.Provider,{value:It,children:t.jsx(uu.Provider,{value:{clients:da.enabled},children:t.jsx(cu.Provider,{value:ye,children:t.jsx(lb.Provider,{value:be?t.jsx(YR,{sessions:x,backlog:p,asks:T,onOpen:_=>{_.sessionId&&A(_.sessionId),o(_.section)}}):null,children:$a})})})}),t.jsx(cL,{open:te==="brief",onClose:()=>{Z(null),le(null)},projects:sa,defaultProject:Ne?Ne.id:"",onCreate:ui,prefill:ee??void 0,specs:p})," ",re&&t.jsx(Hf,{projects:sa,defaultProject:re.project,lockProject:!0,prefill:{title:re.title,context:re.context,outcome:re.outcome},onClose:()=>Ce(null),onCreate:(_,W)=>{Wa(_,W,{branchFrom:re.branchFrom,fromAudit:re.fromAudit}),Ce(null)}}),t.jsx(uL,{open:te==="project",onClose:()=>Z(null),onCreate:mt}),t.jsx(mL,{open:te==="project-edit",project:Ne,onClose:()=>Z(null),onSave:Nt}),t.jsx(dL,{open:!!ha,spec:ha,onClose:()=>{Ct(null),Y(null)},onStarted:(_,W)=>{const V=ha;if(H==="terminal"&&V){const F={id:_,projectId:V.projectId,specId:V.id,flow:kr(V.source),cwd:"",exited:!1};G(F),A(_),y(ne=>ne.some(we=>we.id===_)?ne:[...ne,F])}J(((V==null?void 0:V.id)??"")+" · sesi "+_+(W?" dilanjutkan":" dimulai"),"info","play")},onError:_=>{const W=_ instanceof ba&&(_.status===400||_.status===422);J(((ha==null?void 0:ha.id)??"")+" · gagal mulai sesi"+(W?" · project belum punya repoDir":""),"warn","x-circle")}}),_e,ae.dialog,t.jsx(oE,{commands:Tt}),t.jsx(dE,{nav:ot}),t.jsx(Zc,{toast:Ee})]})})}const kc={async getInfo(e){const a=await fetch(C.help(e));if(!a.ok)throw new Error("Help Center tak tersedia untuk project ini.");return a.json()},async submit(e,a){const n=await fetch(C.helpTickets(e),{method:"POST",body:a});if(n.status===429)throw new Error("Terlalu banyak permintaan. Coba lagi beberapa saat lagi.");if(n.status===404)throw new Error("Help Center tidak aktif untuk project ini.");if(!n.ok)throw new Error("Gagal mengirim keluhan. Pastikan semua isian wajib terisi.");const i=await n.json();if(typeof i.number!="number"||typeof i.statusPath!="string")throw new Error("Gagal mengirim keluhan. Silakan coba lagi.");return i},async status(e,a){const n=await fetch(C.helpStatus(e,a));if(!n.ok)throw new Error("Tiket tidak ditemukan.");return n.json()}},vd=3;function gL(e){const a=e.replace(/^\/+|\/+$/g,"").split("/");return a[0]!=="help"||!a[1]?null:a[2]==="status"&&a[3]?{slug:decodeURIComponent(a[1]),key:decodeURIComponent(a[3])}:{slug:decodeURIComponent(a[1])}}function ms({children:e}){return t.jsx("div",{"data-testid":"public-help-scroll",className:"hn-dynamic-viewport hn-public",style:{height:"100dvh",minHeight:0,overflowY:"auto",overscrollBehavior:"contain",boxSizing:"border-box",background:"var(--bone-100)",padding:"max(40px, var(--safe-top)) max(16px, var(--safe-right)) max(40px, var(--safe-bottom)) max(16px, var(--safe-left))"},children:t.jsx("div",{className:"hn-public-page",children:e})})}function kL({slug:e,statusKey:a}){const[n,i]=c.useState(null),[r,s]=c.useState("loading"),o=c.useCallback(()=>{s("loading"),kc.status(e,a).then(l=>{i(l),s("ready")}).catch(()=>s("error"))},[e,a]);return c.useEffect(()=>{o()},[o]),t.jsx(ms,{children:t.jsx(Sa,{eyebrow:"status keluhan",title:n?`Tiket #${n.number}`:"Status tiket",children:r==="loading"?t.jsx(pe,{kind:"loading"}):r==="error"||!n?t.jsx(pe,{kind:"error",title:"Status belum bisa dimuat",hint:"Periksa kembali link status Anda, lalu coba lagi.",action:o,actionLabel:"Coba lagi"}):t.jsxs("div",{className:"hn-public-form",children:[t.jsx("div",{children:t.jsx(bt,{status:tc(n.status),size:"sm",children:n.status})}),t.jsx(nc,{status:n.status}),t.jsx(Eb,{status:n.status}),t.jsxs("dl",{className:"hn-public-status-dl",children:[t.jsxs("div",{children:[t.jsx("dt",{children:"Kategori"}),t.jsx("dd",{children:Es(n.category)})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Judul"}),t.jsx("dd",{children:n.title})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Dilaporkan"}),t.jsx("dd",{children:new Date(n.createdAt).toLocaleString("id-ID")})]})]})]})})})}function bL({slug:e}){const[a,n]=c.useState(null),[i,r]=c.useState("loading"),[s,o]=c.useState("bug"),[l,d]=c.useState(""),[u,m]=c.useState(""),[h,p]=c.useState(""),[g,f]=c.useState(""),[b,v]=c.useState([]),[x,y]=c.useState(!1),[T,S]=c.useState(null),[E,w]=c.useState(null),[M,N]=c.useState(!1),R=c.useCallback(()=>{r("loading"),kc.getInfo(e).then(H=>{n(H),o(H.categories[0]??"bug"),r("ready")}).catch(()=>r("error"))},[e]);c.useEffect(()=>{R()},[R]);const[I,L]=c.useState("");function A(H){H.preventDefault();const Y=I.trim().split("/").pop()??I.trim();Y&&(window.location.href=`/help/${encodeURIComponent(e)}/status/${encodeURIComponent(Y)}`)}const B=async H=>{if(!navigator.clipboard){S("Salin tidak tersedia di browser ini. Pilih linknya lalu salin manual.");return}try{await navigator.clipboard.writeText(H),N(!0),window.setTimeout(()=>N(!1),2e3)}catch(Y){S(ur(Y,"Link belum bisa disalin. Pilih linknya lalu salin manual."))}};async function G(H){H.preventDefault(),S(null),y(!0);try{const Y=new FormData;Y.set("category",s),Y.set("title",l),Y.set("detail",u),Y.set("email",h),Y.set("hc_trap",g);for(const ie of b.slice(0,vd))Y.append("files",ie,ie.name);const X=await kc.submit(e,Y),q=`${window.location.origin}${X.statusPath}`;w({number:X.number,statusUrl:q})}catch(Y){S(ur(Y,"Keluhan belum terkirim. Coba lagi sebentar."))}finally{y(!1)}}return i==="loading"?t.jsx(ms,{children:t.jsx(pe,{kind:"loading"})}):i==="error"||!a?t.jsx(ms,{children:t.jsx(Sa,{title:"Help Center",children:t.jsx(pe,{kind:"error",title:"Belum bisa dibuka",hint:"Coba lagi sebentar. Jika tetap gagal, Help Center untuk project ini mungkin tidak aktif.",action:R,actionLabel:"Coba lagi"})})}):E?t.jsx(ms,{children:t.jsx(Sa,{eyebrow:"terkirim",title:`Terima kasih — tiket #${E.number}`,children:t.jsxs("div",{className:"hn-public-form",children:[t.jsx("p",{className:"hn-public-lead",children:"Keluhan Anda sudah kami terima. Simpan link berikut untuk memantau perkembangannya."}),t.jsxs("div",{className:"hn-public-linkbox",children:[t.jsx("code",{className:"hn-public-code",children:E.statusUrl}),t.jsxs("div",{className:"hn-public-actions",children:[t.jsx(U,{size:"sm",leftIcon:"copy",onClick:()=>void B(E.statusUrl),children:M?"Tersalin":"Salin link"}),t.jsx(U,{size:"sm",variant:"ghost",onClick:()=>window.location.assign(E.statusUrl),children:"Buka status"})]})]})]})})}):t.jsxs(ms,{children:[t.jsx(Sa,{eyebrow:"help center",title:`Lapor keluhan · ${a.projectName}`,children:t.jsxs("form",{onSubmit:G,className:"hn-public-form",children:[t.jsxs("div",{className:"hn-public-field",children:[t.jsx("label",{htmlFor:"hc-cat",className:"hn-public-label",children:"Kategori"}),t.jsx(Be,{id:"hc-cat",size:"lg",value:s,onChange:H=>o(H.target.value),options:a.categories.map(H=>({value:H,label:Es(H)}))})]}),t.jsxs("div",{className:"hn-public-field",children:[t.jsx("label",{htmlFor:"hc-title",className:"hn-public-label",children:"Judul"}),t.jsx("input",{id:"hc-title",className:"hn-public-input",value:l,onChange:H=>d(H.target.value),required:!0,maxLength:200,placeholder:"mis. Tombol Simpan tidak berfungsi di HP"})]}),t.jsxs("div",{className:"hn-public-field",children:[t.jsx("label",{htmlFor:"hc-detail",className:"hn-public-label",children:"Detail"}),t.jsx("textarea",{id:"hc-detail",className:"hn-public-input",value:u,onChange:H=>m(H.target.value),required:!0,maxLength:1e4,rows:6,placeholder:"mis. Buka halaman Pesanan di HP, tekan Simpan — layar diam dan datanya tidak tersimpan. Jangan sertakan data sensitif (kata sandi, dsb)."})]}),t.jsxs("div",{className:"hn-public-field",children:[t.jsx("label",{htmlFor:"hc-email",className:"hn-public-label",children:"Email Anda"}),t.jsx("input",{id:"hc-email",className:"hn-public-input",type:"email",value:h,onChange:H=>p(H.target.value),required:!0,maxLength:200,placeholder:"nama@contoh.id"})]}),t.jsxs("div",{className:"hn-public-field",children:[t.jsxs("label",{htmlFor:"hc-files",className:"hn-public-label",children:["Lampiran gambar (opsional, maks ",vd,")"]}),t.jsxs("div",{className:"hn-public-file",children:[t.jsx("input",{id:"hc-files",className:"hn-public-file-input",type:"file",accept:"image/png,image/jpeg,image/webp",multiple:!0,onChange:H=>v(Array.from(H.target.files??[]).slice(0,vd))}),t.jsx("label",{htmlFor:"hc-files",className:"hn-public-file-btn","aria-hidden":"true",children:"Pilih berkas"}),t.jsx("span",{className:"hn-public-files","aria-live":"polite",children:b.length>0?b.map(H=>H.name).join(", "):"Belum ada berkas dipilih"})]})]}),t.jsx("input",{tabIndex:-1,autoComplete:"new-password","aria-hidden":!0,value:g,onChange:H=>f(H.target.value),name:"hc_trap",style:{position:"absolute",left:"-9999px",width:1,height:1}}),T&&t.jsx("p",{role:"alert",className:"hn-portal-error",children:T}),t.jsx("div",{className:"hn-portal-foot",children:t.jsx(U,{type:"submit",disabled:x,loading:x,leftIcon:"send",children:"Kirim keluhan"})})]})}),t.jsx(Sa,{eyebrow:"sudah pernah lapor?",title:"Cek status keluhan",children:t.jsxs("form",{onSubmit:A,className:"hn-public-check",children:[t.jsxs("div",{className:"hn-public-field",children:[t.jsx("label",{htmlFor:"hc-check",className:"hn-public-label",children:"Kode status atau link"}),t.jsx("input",{id:"hc-check",className:"hn-public-input",value:I,onChange:H=>L(H.target.value),placeholder:"mis. a1b2c3d4e5f6, atau tempel link statusnya"})]}),t.jsx(U,{type:"submit",variant:"secondary",disabled:!I.trim(),children:"Cek status"})]})})]})}function fL(){const e=gL(window.location.pathname);return e?e.key?t.jsx(kL,{slug:e.slug,statusKey:e.key}):t.jsx(bL,{slug:e.slug}):t.jsx(ms,{children:t.jsx(Sa,{title:"Help Center",children:t.jsx(pe,{kind:"error",title:"Halaman tidak ditemukan",hint:"Link Help Center tidak valid."})})})}const yL=window.location.pathname.startsWith("/help/");Dp(document.getElementById("root")).render(t.jsx(c.StrictMode,{children:yL?t.jsx(fL,{}):t.jsx(hL,{})}));export{C as $,lT as A,U as B,gt as C,Hn as D,Zg as E,c1 as F,C$ as G,La as H,Re as I,lu as J,Xk as K,Hk as L,ca as M,h$ as N,an as O,bs as P,AE as Q,bn as R,Vc as S,Qg as T,dl as U,ou as V,Qk as W,fn as X,bt as Y,Cs as Z,U$ as _,p$ as a,AL as a$,rA as a0,yt as a1,Ps as a2,Zx as a3,CL as a4,PL as a5,Ss as a6,Td as a7,$E as a8,ih as a9,sf as aA,L$ as aB,rM as aC,pn as aD,kr as aE,xu as aF,kN as aG,Ek as aH,Sa as aI,As as aJ,N$ as aK,hf as aL,Uo as aM,gl as aN,db as aO,cb as aP,uM as aQ,Ms as aR,u$ as aS,I$ as aT,R$ as aU,b$ as aV,m$ as aW,ys as aX,Li as aY,f$ as aZ,Hg as a_,LE as aa,xb as ab,Gv as ac,tl as ad,jb as ae,dk as af,c$ as ag,ba as ah,d$ as ai,Ar as aj,qE as ak,mu as al,B$ as am,nu as an,BE as ao,H$ as ap,li as aq,T$ as ar,E$ as as,n5 as at,i5 as au,P$ as av,$$ as aw,s5 as ax,Uh as ay,O$ as az,ll as b,qc as b$,EL as b0,Cx as b1,rl as b2,RE as b3,Ex as b4,TL as b5,k$ as b6,ol as b7,LA as b8,$A as b9,QL as bA,ZL as bB,XL as bC,e$ as bD,a$ as bE,t$ as bF,n$ as bG,i$ as bH,s$ as bI,r$ as bJ,o$ as bK,l$ as bL,wk as bM,vb as bN,Ec as bO,Gu as bP,R2 as bQ,bg as bR,kn as bS,Fv as bT,xc as bU,Ni as bV,Vy as bW,Qv as bX,Yv as bY,Zv as bZ,Jg as b_,BA as ba,g$ as bb,Wv as bc,_r as bd,Tg as be,A$ as bf,x$ as bg,j$ as bh,_$ as bi,v$ as bj,w$ as bk,S$ as bl,M$ as bm,Jh as bn,Vt as bo,HL as bp,qL as bq,UL as br,zL as bs,FL as bt,GL as bu,KL as bv,WL as bw,VL as bx,YL as by,JL as bz,St as c,y0 as c0,b0 as c1,DL as c2,BL as c3,$L as c4,IL as c5,f0 as c6,NL as c7,LL as c8,RL as c9,ML as ca,_L as cb,Sf as cc,YE as cd,q$ as ce,gM as cf,y$ as cg,$v as ch,_v as ci,wv as cj,sv as ck,Mc as cl,Wp as cm,Vv as cn,Tc as co,_s as cp,kg as cq,cg as cr,SL as cs,_c as ct,nh as cu,Jo as cv,st as d,de as e,Oe as f,Be as g,se as h,va as i,t as j,pc as k,ri as l,pe as m,la as n,Sr as o,Rk as p,Oa as q,vi as r,ti as s,OL as t,U2 as u,Ts as v,tA as w,aA as x,wN as y,Zc as z};
|