@hlix/cli 1.2.0 → 1.3.1

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.
@@ -0,0 +1,423 @@
1
+ #!/usr/bin/env node
2
+ import{resolve as Np}from"node:path";import{parseArgs as Fp}from"node:util";import nd from"openapi-fetch";function So(d){return nd({baseUrl:d.baseUrl,headers:d.headers,fetch:d.fetch})}var an=(d)=>({kind:"apiKey",apiKey:d});var jn=(d)=>({kind:"bearer",token:d});function rd(d){switch(d.kind){case"apiKey":return{"x-api-key":d.apiKey};case"session":return{cookie:d.cookie};case"bearer":return{authorization:`Bearer ${d.token}`}}}function od(d){return d?{"X-Organization-Id":d}:{}}function Ki(d,u){return{...rd(d),...od(u)}}function sd(d){if(typeof d!=="object"||d===null)return null;let{error:u}=d;return typeof u==="string"?u:null}class mt extends Error{status;body;requestId;method;url;constructor(d,u){super(d);this.name=new.target.name,this.status=u.status,this.body=u.body,this.requestId=u.requestId??null,this.method=u.method,this.url=u.url}}class Pn extends mt{issues;constructor(d,u,f){super(d,u);this.issues=f}}class Xn extends mt{}class cn extends mt{}class A extends mt{}class h extends mt{}class ln extends mt{}class dn extends mt{retryAfter;constructor(d,u,f){super(d,u);this.retryAfter=f}}class Yn extends mt{}class pn extends mt{}class St extends Error{method;url;constructor(d,u){super(d,{cause:u.cause});this.name="HlixTransportError",this.method=u.method,this.url=u.url}}function id(d){if(typeof d!=="object"||d===null)return null;let u=d;if(u.success!==!1)return null;let f=u.error?.message;if(typeof f!=="string")return null;try{let v=JSON.parse(f);return Array.isArray(v)?v:[]}catch{return[]}}function ad(d){let u=d.get("retry-after");if(!u)return null;let f=Number(u);return Number.isFinite(f)&&f>=0?f:null}function Kt(d,u,f){let v={status:d.status,body:u,requestId:d.headers.get("x-request-id"),method:f.method,url:f.url},j=sd(u),P=`${f.method} ${f.url} failed with ${d.status}`,I=id(u);if(I)return new Pn(`${f.method} ${f.url}: request body failed validation`,v,I);let C=j??P;switch(d.status){case 400:return new Xn(C,v);case 401:return new cn(C,v);case 403:return new A(C,v);case 404:return new h(C,v);case 409:return new ln(C,v);case 429:return new dn(C,v,ad(d.headers));case 501:return new Yn(C,v);default:return d.status>=500?new pn(C,v):new mt(C,v)}}function wt(d,u){return new Promise((f)=>{if(u?.aborted)return f();let v=setTimeout(j,d);function j(){clearTimeout(v),u?.removeEventListener("abort",j),f()}u?.addEventListener("abort",j,{once:!0})})}var Vi=new Set(["GET","HEAD","PUT","DELETE","OPTIONS","TRACE"]);function $r(d){return Vi.has(d.toUpperCase())}var cd=new Set([429,500,502,503,504]);function ld(d){return cd.has(d)}var jo={attempts:3,baseDelayMs:200,maxDelayMs:5000};function En(d,u,f,v=Math.random){if(f!==null)return Math.min(f*1000,u.maxDelayMs);let j=Math.min(u.baseDelayMs*2**d,u.maxDelayMs);return Math.round(v()*j)}function Po(d){if(!$r(d.method))return!1;if(d.attempt+1>=d.policy.attempts)return!1;return d.status===null||ld(d.status)}function dd(d){let u=d.headers.get("retry-after");if(!u)return null;let f=Number(u);return Number.isFinite(f)&&f>=0?f:null}function Xi(d){let{base:u,policy:f}=d,v=d.sleep??wt,j=d.random??Math.random;return async(P)=>{let I=P.method.toUpperCase(),C=$r(I)?P.clone():null;for(let T=0;;T+=1){P.signal.throwIfAborted();let R=T===0?P:C.clone(),F;try{F=await u(R)}catch(L){if(P.signal.aborted)throw L;if(!C||!Po({method:I,attempt:T,policy:f,status:null}))throw new St(`${I} ${P.url}: ${L instanceof Error?L.message:String(L)}`,{method:I,url:P.url,cause:L});await v(En(T,f,null,j),P.signal);continue}if(!Po({method:I,attempt:T,policy:f,status:F.status}))return F;if(!C)return F;await v(En(T,f,dd(F),j),P.signal)}}}function re(d,u){if(d.response.ok)return d.data;throw Kt(d.response,d.error??d.data,u)}var Zn=(d)=>typeof d==="string"?d:"";function Eo(d){let u;try{u=JSON.parse(d)}catch{return null}if(typeof u!=="object"||u===null)return null;let f=u;switch(f.type){case"idle":return{type:"idle"};case"done":return{type:"done"};case"active":return typeof f.runId==="string"?{type:"active",runId:f.runId}:{type:"active"};case"on_chat_model_stream":return{type:"on_chat_model_stream",delta:Zn(f.delta)};case"reasoning":return{type:"reasoning",delta:Zn(f.delta)};case"on_tool_start":return{type:"on_tool_start",name:Zn(f.name),input:f.input};case"on_tool_end":return{type:"on_tool_end",name:Zn(f.name),output:f.output};case"error":return{type:"error",message:Zn(f.message)};default:return null}}var Io=(d)=>d.type==="done"||d.type==="idle"||d.type==="error";var pd=()=>({event:null,data:[],id:null,retry:null});function Yi(d,u,f){switch(u){case"event":d.event=f;return;case"data":d.data.push(f);return;case"id":if(!f.includes("\x00"))d.id=f;return;case"retry":{if(/^\d+$/.test(f))d.retry=Number(f);return}default:return}}function Qi(d){let u=d.data.join(`
3
+ `),{event:f,id:v}=d;if(d.data=[],d.event=null,u==="")return null;return{event:f,data:u,id:v,retry:d.retry}}function Zi(d,u){if(u==="")return Qi(d);if(u.startsWith(":"))return null;let f=u.indexOf(":");if(f===-1)return Yi(d,u,""),null;let v=u.slice(0,f),j=u.slice(f+1);if(j.startsWith(" "))j=j.slice(1);return Yi(d,v,j),null}function ud(d){let u=[],f=0;for(let v=0;v<d.length;v+=1){let j=d[v];if(j!==`
4
+ `&&j!=="\r")continue;if(u.push(d.slice(f,v)),j==="\r"&&d[v+1]===`
5
+ `)v+=1;f=v+1}return{lines:u,rest:d.slice(f)}}async function*Qn(d,u){let f=d.getReader(),v=new TextDecoder,j=pd(),P="",I=()=>void f.cancel().catch(()=>{});u?.addEventListener("abort",I,{once:!0});try{for(;;){let{done:T,value:R}=await f.read();if(T)break;P+=v.decode(R,{stream:!0});let{lines:F,rest:L}=ud(P);P=L;for(let H of F){let X=Zi(j,H);if(X)yield X}if(u?.aborted)return}if(P+=v.decode(),P!==""){let T=Zi(j,P);if(T)yield T}let C=Qi(j);if(C)yield C}finally{u?.removeEventListener("abort",I),f.releaseLock()}}var er=(d)=>typeof d==="object"&&d!==null&&!Array.isArray(d),md=(d)=>er(d)&&typeof d.type==="string";function ea(d){let u;try{u=JSON.parse(d)}catch{return null}if(!er(u)||u.source!=="leader"&&u.source!=="engineer"&&u.source!=="user"||typeof u.cursor!=="number"||!Number.isSafeInteger(u.cursor)||u.cursor<0)return null;for(let f of["cycleId","runId","target","epoch"])if(u[f]!==void 0&&typeof u[f]!=="string")return null;if(u.frames!==void 0&&(!Array.isArray(u.frames)||!u.frames.every(md)))return null;if(u.message!==void 0&&(!er(u.message)||typeof u.message.id!=="string"||typeof u.message.content!=="string"||u.message.authorUserId!==void 0&&typeof u.message.authorUserId!=="string"||u.message.delivery!==void 0&&!["queued","sent","canceled"].includes(u.message.delivery)))return null;return{source:u.source,cursor:u.cursor,...typeof u.epoch==="string"?{epoch:u.epoch}:{},...typeof u.cycleId==="string"?{cycleId:u.cycleId}:{},...typeof u.runId==="string"?{runId:u.runId}:{},...typeof u.target==="string"?{target:u.target}:{},...Array.isArray(u.frames)?{frames:u.frames}:{},...er(u.message)?{message:{id:u.message.id,content:u.message.content,...typeof u.message.authorUserId==="string"?{authorUserId:u.message.authorUserId}:{},...u.message.delivery==="queued"||u.message.delivery==="sent"||u.message.delivery==="canceled"?{delivery:u.message.delivery}:{}}}:{}}}function ta(d){let u;try{u=JSON.parse(d)}catch{return null}return er(u)&&u.cursor===-1&&(u.epoch===null||typeof u.epoch==="string")?{epoch:u.epoch}:null}var Co=()=>crypto.randomUUID();function oa(d){return{threadId:d.threadId,runId:d.runId??Co(),state:{},messages:[{id:d.messageId??Co(),role:"user",content:d.text}],tools:[],context:[],forwardedProps:d.forwardedProps??{}}}function sa(d,u){return{threadId:d,runId:Co(),state:{},messages:[],tools:[],context:[],...u?{lastSeenEventId:u}:{}}}function $o(d){let u=d.metadata;if(typeof u!=="object"||u===null)return;let f=u.eventId;return typeof f==="string"&&f?f:void 0}function Ao(d){let u;try{u=JSON.parse(d)}catch{return null}if(typeof u!=="object"||u===null)return null;return typeof u.type==="string"?u:null}function un(d,u={}){if(u.taskId)return`project:${d}:task:${u.taskId}`;if(u.cycleId)return`project:${d}:cycle:${u.cycleId}`;return`project:${d}`}var ia=5000;function aa(d,u){if(u.taskId){let f=d.tasks.find((v)=>v.id===u.taskId);return{...d,tasks:f?[f]:[],cycles:d.cycles.filter((v)=>v.id===f?.cycleId)}}if(u.cycleId)return{...d,cycles:d.cycles.filter((f)=>f.id===u.cycleId),tasks:d.tasks.filter((f)=>f.cycleId===u.cycleId)};return d}var gd=new Set(["done","merged","failed","pr_created","ci_passing"]),fd=new Set(["done","pr_created","failed","canceled"]);function To(d,u){let f=d.tasks.find((I)=>I.id===u);if(!f)return{state:"running",task:f};let v=f.cycleId?d.cycles.find((I)=>I.id===f.cycleId):void 0;if(!(!f.cycleId||v!==void 0&&fd.has(v.status)))return{state:"running",task:f};if(gd.has(f.status))return{state:"finished",task:f};if(!v)return{state:"running",task:f};let P=v?.status==="canceled"?"Task cycle was canceled":v?.status==="failed"?"Task cycle failed":"Task cycle ended before this task completed";return{state:"unmet",task:f,reason:P}}async function*Oo(d){let u;for await(let f of d){if(f.type==="STATE_SNAPSHOT")u=structuredClone(f.snapshot);else if(f.type==="STATE_DELTA"){if(u===void 0)continue;u=ca(u,f.delta)}else if(f.type!=="CUSTOM"||u===void 0)continue;yield{state:u,event:f}}}function Ro(d){if(d==="")return[];if(!d.startsWith("/"))throw Error(`Invalid JSON pointer: ${d}`);return d.slice(1).split("/").map((u)=>u.replace(/~1/g,"/").replace(/~0/g,"~"))}function No(d,u){let f=d;for(let v of u.slice(0,-1)){if(typeof f!=="object"||f===null)throw Error(`Path not found: /${u.join("/")}`);f=f[v]}if(typeof f!=="object"||f===null)throw Error(`Path not found: /${u.join("/")}`);return{parent:f,key:u[u.length-1]}}function Ar(d,u,f){if(u==="-"&&f)return d.length;let v=Number(u);if(!/^(0|[1-9]\d*)$/.test(u)||v>d.length||!f&&v===d.length)throw Error(`Invalid array index: ${u}`);return v}function na(d,u){let f=Ro(u);if(f.length===0)return d;let{parent:v,key:j}=No(d,f);if(Array.isArray(v))return v[Ar(v,j,!1)];if(!(j in v))throw Error(`Path not found: ${u}`);return v[j]}function ra(d,u){let{parent:f,key:v}=No(d,Ro(u));if(Array.isArray(f))return f.splice(Ar(f,v,!1),1)[0];if(!(v in f))throw Error(`Path not found: ${u}`);let j=f[v];return delete f[v],j}function _o(d,u,f,v){let j=Ro(u);if(j.length===0)return f;let{parent:P,key:I}=No(d,j);if(Array.isArray(P))if(v==="add")P.splice(Ar(P,I,!0),0,f);else P[Ar(P,I,!1)]=f;else{if(v==="replace"&&!(I in P))throw Error(`Path not found: ${u}`);P[I]=f}return d}function ca(d,u){let f=structuredClone(d);for(let v of u)switch(v.op){case"add":case"replace":f=_o(f,v.path,structuredClone(v.value),v.op);break;case"remove":ra(f,v.path);break;case"copy":f=_o(f,v.path,structuredClone(na(f,v.from)),"add");break;case"move":{let j=ra(f,v.from);f=_o(f,v.path,j,"add");break}case"test":if(JSON.stringify(na(f,v.path))!==JSON.stringify(v.value))throw Error(`Test failed at ${v.path}`);break;default:throw Error(`Unknown patch operation: ${v.op}`)}return f}var hd="urn:ietf:params:oauth:grant-type:device_code",yd="/v1/api/auth/device";class Tt extends Error{reason;constructor(d,u){super(u);this.name="HlixDeviceLoginError",this.reason=d}}var Tr=()=>new Tt("cancelled","Login cancelled."),tr=()=>new Tt("expired","The login code expired. Run the login again.");function wd(d,u){let f=new AbortController,v=[d,u].map((j)=>{let P=()=>f.abort(j.reason);if(j.aborted)f.abort(j.reason);else j.addEventListener("abort",P,{once:!0});return()=>j.removeEventListener("abort",P)});return{signal:f.signal,release:()=>v.forEach((j)=>j())}}async function pa(d,u,f,v){if(!v||!d.signal)return la(d,u,f,v,v??d.signal);let j=wd(d.signal,v);try{return await la(d,u,f,v,j.signal)}finally{j.release()}}async function la(d,u,f,v,j){let P=`${d.baseUrl.replace(/\/+$/,"")}${yd}/${u}`,I=d.fetch??((R)=>globalThis.fetch(R)),C;try{C=await I(new Request(P,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(f),...j?{signal:j}:{}}))}catch(R){if(d.signal?.aborted)throw Tr();if(v?.aborted)throw tr();throw new St(`POST ${P}: ${R instanceof Error?R.message:String(R)}`,{method:"POST",url:P,cause:R})}let T=await C.json().catch(()=>null);if(d.signal?.aborted)throw Tr();if(v?.aborted&&!T)throw tr();return{ok:C.ok,json:T??{}}}function da(d){try{let u=new URL(d);return u.protocol==="https:"||u.protocol==="http:"?u.href:null}catch{return null}}var jt=(d)=>typeof d==="string"?d:"";async function Fo(d){let{ok:u,json:f}=await pa(d,"code",{client_id:d.clientId});if(!u||!jt(f.device_code)||!jt(f.user_code))throw new Tt("rejected",jt(f.error_description)||jt(f.error)||"The server would not start a browser login.");let v=da(jt(f.verification_uri)),j=jt(f.verification_uri_complete)?da(jt(f.verification_uri_complete)):v;if(!v||!j)throw new Tt("rejected","The server's sign-in page is not a web address.");return{deviceCode:jt(f.device_code),userCode:jt(f.user_code),verificationUri:v,verificationUriComplete:j,expiresInSeconds:Number(f.expires_in)||600,intervalSeconds:Number(f.interval)||5}}async function Lo(d){let u=d.sleep??wt,f=d.now??Date.now,v=f()+d.code.expiresInSeconds*1000,j=d.code.intervalSeconds*1000;for(;;){if(d.signal?.aborted)throw Tr();if(f()>=v)throw tr();if(await u(j,d.signal),d.signal?.aborted)throw Tr();let P=v-f();if(P<=0)throw tr();let{ok:I,json:C}=await pa(d,"token",{grant_type:hd,device_code:d.code.deviceCode,client_id:d.clientId},AbortSignal.timeout(P)),T=jt(C.access_token);if(I&&T)return T;let R=jt(C.error);if(R==="authorization_pending")continue;if(R==="slow_down"){j+=5000;continue}if(R==="access_denied")throw new Tt("denied","The login was denied in the browser.");if(R==="expired_token")throw tr();throw new Tt("rejected",jt(C.error_description)||R||"The browser login failed.")}}var ua={attempts:6,baseDelayMs:500,maxDelayMs:15000};function ma(d){if(d instanceof pn||d instanceof dn)return!0;return!(d instanceof mt)}class mn{raw;baseUrl;headers;fetcher;get origin(){return new URL(this.baseUrl).origin}constructor(d){this.baseUrl=d.baseUrl.replace(/\/+$/,"");let u=Ki(d.credential,d.organizationId),f=new Set(Object.keys(u).map((P)=>P.toLowerCase()));this.headers={...Object.fromEntries(Object.entries(d.headers??{}).filter(([P])=>!f.has(P.toLowerCase()))),...u};let v={...jo,...d.retry},j=d.fetch??((P)=>globalThis.fetch(P));this.fetcher=Xi({base:j,policy:v}),this.raw=So({baseUrl:this.baseUrl,headers:this.headers,fetch:this.fetcher})}at(d,u){return{method:d,url:`${this.baseUrl}${u}`}}workspaces={list:async(d={})=>re(await this.raw.GET("/v1/api/workspaces",d),this.at("GET","/v1/api/workspaces"))};projects={feed:(d,u={})=>this.followProjectFeed(d,u),messages:async(d,u,f)=>re(await this.raw.GET("/v1/api/projects/{id}/messages",{...f,params:{path:{id:d},query:{...u,limit:u?.limit===void 0?void 0:String(u.limit)}}}),this.at("GET",`/v1/api/projects/${d}/messages`)),list:async(d)=>re(await this.raw.GET("/v1/api/projects",{...d}),this.at("GET","/v1/api/projects")),get:async(d,u={})=>re(await this.raw.GET("/v1/api/projects/{id}",{...u,params:{path:{id:d}}}),this.at("GET",`/v1/api/projects/${d}`)),board:async(d,u={})=>re(await this.raw.GET("/v1/api/projects/{id}/board",{...u,params:{path:{id:d}}}),this.at("GET",`/v1/api/projects/${d}/board`)),create:async(d)=>re(await this.raw.POST("/v1/api/projects",{body:d}),this.at("POST","/v1/api/projects")),update:async(d,u)=>re(await this.raw.PATCH("/v1/api/projects/{id}",{params:{path:{id:d}},body:u}),this.at("PATCH",`/v1/api/projects/${d}`)),delete:async(d)=>re(await this.raw.DELETE("/v1/api/projects/{id}",{params:{path:{id:d}}}),this.at("DELETE",`/v1/api/projects/${d}`)),start:async(d,u)=>re(await this.raw.POST("/v1/api/projects/{id}/start",{params:{path:{id:d}},body:u}),this.at("POST",`/v1/api/projects/${d}/start`)),stop:async(d,u)=>re(await this.raw.POST("/v1/api/projects/{id}/stop",{...u,params:{path:{id:d}}}),this.at("POST",`/v1/api/projects/${d}/stop`)),resume:async(d)=>re(await this.raw.POST("/v1/api/projects/{id}/resume",{params:{path:{id:d}}}),this.at("POST",`/v1/api/projects/${d}/resume`)),status:async(d,u={})=>re(await this.raw.GET("/v1/api/projects/{id}/status",{...u,params:{path:{id:d}}}),this.at("GET",`/v1/api/projects/${d}/status`)),canvas:{view:async(d)=>re(await this.raw.GET("/v1/api/projects/{id}/canvas/agent",{params:{path:{id:d}}}),this.at("GET",`/v1/api/projects/${d}/canvas/agent`)),apply:async(d,u,f)=>re(await this.raw.POST("/v1/api/projects/{id}/canvas/agent/ops",{params:{path:{id:d}},body:{ops:u,...f?{reason:f}:{}}}),this.at("POST",`/v1/api/projects/${d}/canvas/agent/ops`)),undo:async(d)=>re(await this.raw.POST("/v1/api/projects/{id}/canvas/agent/undo",{params:{path:{id:d}}}),this.at("POST",`/v1/api/projects/${d}/canvas/agent/undo`))},deliver:async(d)=>re(await this.raw.POST("/v1/api/projects/{id}/delivery",{params:{path:{id:d}}}),this.at("POST",`/v1/api/projects/${d}/delivery`)),attachGithubRepository:async(d,u,f)=>re(await this.raw.POST("/v1/api/projects/{id}/repos/github",{...f,params:{path:{id:d}},body:{githubRepository:u}}),this.at("POST",`/v1/api/projects/${d}/repos/github`)),makeRepositoryPrimary:async(d,u,f)=>re(await this.raw.POST("/v1/api/projects/{id}/repos/{repoId}/primary",{...f,params:{path:{id:d,repoId:u}}}),this.at("POST",`/v1/api/projects/${d}/repos/${u}/primary`)),terminal:async(d)=>re(await this.raw.GET("/v1/api/projects/{id}/terminal",{params:{path:{id:d}}}),this.at("GET",`/v1/api/projects/${d}/terminal`)),observeCycle:(d,u)=>this.observeCycle(d,u),workspace:(d)=>({environment:async()=>re(await this.raw.GET("/v1/api/projects/{id}/environment",{params:{path:{id:d}}}),this.at("GET",`/v1/api/projects/${d}/environment`)),fs:async(u)=>re(await this.raw.POST("/v1/api/projects/{id}/workspace/fs",{params:{path:{id:d}},body:u}),this.at("POST",`/v1/api/projects/${d}/workspace/fs`)),exec:async(u)=>re(await this.raw.POST("/v1/api/projects/{id}/workspace/exec",{params:{path:{id:d}},body:u}),this.at("POST",`/v1/api/projects/${d}/workspace/exec`))})};secrets={listEntries:async(d)=>re(await this.raw.GET("/v1/api/secrets/project/{projectId}/entries",{params:{path:{projectId:d}}}),this.at("GET",`/v1/api/secrets/project/${d}/entries`)),upsertEntries:async(d,u)=>re(await this.raw.PUT("/v1/api/secrets/project/{projectId}/entries",{params:{path:{projectId:d}},body:u}),this.at("PUT",`/v1/api/secrets/project/${d}/entries`)),importFiles:async(d,u)=>re(await this.raw.PUT("/v1/api/secrets/project/{projectId}/files",{params:{path:{projectId:d}},body:{files:u}}),this.at("PUT",`/v1/api/secrets/project/${d}/files`)),deleteEntry:async(d,u,f)=>re(await this.raw.DELETE("/v1/api/secrets/project/{projectId}/entries/{key}",{params:{path:{projectId:d,key:u},...f===void 0?{}:{query:{source:f}}}}),this.at("DELETE",`/v1/api/secrets/project/${d}/entries/${encodeURIComponent(u)}`)),exportEntries:async(d,u={})=>{let f=`/v1/api/secrets/project/${d}/export`,v=`${this.baseUrl}${f}`,j=await this.fetcher(new Request(v,{method:"POST",headers:{...this.headers,"content-type":"application/json"},body:JSON.stringify({...u.source===void 0?{}:{source:u.source},...u.format===void 0?{}:{format:u.format}})}));if(!j.ok)throw Kt(j,await j.json().catch(()=>{return}),{method:"POST",url:v});return j.text()}};repos={access:async(d,u,f="read")=>re(await this.raw.POST("/v1/api/projects/{id}/repos/{repoId}/access",{params:{path:{id:d,repoId:u}},body:{scope:f}}),this.at("POST",`/v1/api/projects/${d}/repos/${u}/access`)),head:async(d,u,f={})=>re(await this.raw.GET("/v1/api/projects/{id}/repos/{repoId}/head",{...f,params:{path:{id:d,repoId:u}}}),this.at("GET",`/v1/api/projects/${d}/repos/${u}/head`)),protectedFiles:async(d,u)=>re(await this.raw.GET("/v1/api/projects/{id}/protected-files",{...u,params:{path:{id:d}}}),this.at("GET",`/v1/api/projects/${d}/protected-files`)),watch:(d,u,f={})=>this.watchRepo(d,u,f)};resources={importSkill:async(d,u)=>re(await this.raw.POST("/v1/api/projects/{id}/resources/skill",{params:{path:{id:d}},body:u}),this.at("POST",`/v1/api/projects/${d}/resources/skill`)),importAgent:async(d,u)=>re(await this.raw.POST("/v1/api/projects/{id}/resources/agent",{params:{path:{id:d}},body:u}),this.at("POST",`/v1/api/projects/${d}/resources/agent`)),importMcp:async(d,u)=>re(await this.raw.POST("/v1/api/projects/{id}/resources/mcp",{params:{path:{id:d}},body:u}),this.at("POST",`/v1/api/projects/${d}/resources/mcp`))};async throwUploadError(d,u){let f=null;try{f=await d.json()}catch{f=await d.text().catch(()=>null)}throw Kt(d,f,{method:"PUT",url:u})}environments={list:async(d,u)=>re(await this.raw.GET("/v1/api/environments/project/{projectId}",{...u,params:{path:{projectId:d}}}),this.at("GET",`/v1/api/environments/project/${d}`))};packs={list:async(d,u)=>re(await this.raw.GET("/v1/api/packs",{...u,params:{query:{projectId:d}}}),this.at("GET","/v1/api/packs"))};skills={list:async(d)=>re(await this.raw.GET("/v1/api/packs/custom-skills",{...d}),this.at("GET","/v1/api/packs/custom-skills"))};tasks={list:async(d)=>re(await this.raw.GET("/v1/api/tasks",{params:{query:d??{}}}),this.at("GET","/v1/api/tasks")),get:async(d)=>re(await this.raw.GET("/v1/api/tasks/{id}",{params:{path:{id:d}}}),this.at("GET",`/v1/api/tasks/${d}`)),create:async(d,u)=>re(await this.raw.POST("/v1/api/tasks",{...u,body:d}),this.at("POST","/v1/api/tasks")),update:async(d,u)=>re(await this.raw.PATCH("/v1/api/tasks/{id}",{params:{path:{id:d}},body:u}),this.at("PATCH",`/v1/api/tasks/${d}`)),listComments:async(d)=>re(await this.raw.GET("/v1/api/tasks/{id}/comments",{params:{path:{id:d}}}),this.at("GET",`/v1/api/tasks/${d}/comments`)),addComment:async(d,u)=>re(await this.raw.POST("/v1/api/tasks/{id}/comments",{params:{path:{id:d}},body:u}),this.at("POST",`/v1/api/tasks/${d}/comments`))};modelConfig={list:async()=>re(await this.raw.GET("/v1/api/model-config"),this.at("GET","/v1/api/model-config")),resolved:async(d)=>d?re(await this.raw.GET("/v1/api/model-config/projects/{projectId}/resolved",{params:{path:{projectId:d}}}),this.at("GET",`/v1/api/model-config/projects/${d}/resolved`)):re(await this.raw.GET("/v1/api/model-config/resolved"),this.at("GET","/v1/api/model-config/resolved")),set:async(d,u,f)=>f?re(await this.raw.PUT("/v1/api/model-config/projects/{projectId}/{slot}",{params:{path:{projectId:f,slot:d}},body:u}),this.at("PUT",`/v1/api/model-config/projects/${f}/${d}`)):re(await this.raw.PUT("/v1/api/model-config/{slot}",{params:{path:{slot:d}},body:u}),this.at("PUT",`/v1/api/model-config/${d}`)),clear:async(d,u)=>u?re(await this.raw.DELETE("/v1/api/model-config/projects/{projectId}/{slot}",{params:{path:{projectId:u,slot:d}}}),this.at("DELETE",`/v1/api/model-config/projects/${u}/${d}`)):re(await this.raw.DELETE("/v1/api/model-config/{slot}",{params:{path:{slot:d}}}),this.at("DELETE",`/v1/api/model-config/${d}`)),setProjectHarness:async(d,u)=>this.modelConfig.set("cycle",{harness:u},d),clearProjectHarness:async(d)=>this.modelConfig.clear("cycle",d),setHarness:async(d)=>this.modelConfig.set("cycle",{harness:d}),clearHarness:async()=>this.modelConfig.clear("cycle")};ai={models:async(d,u)=>re(await this.raw.GET("/v1/api/ai/w/{workspaceId}/models",{params:{path:{workspaceId:d}},...u?.signal?{signal:u.signal}:{}}),this.at("GET",`/v1/api/ai/w/${d}/models`))};managedMailboxes={configuration:async()=>re(await this.raw.GET("/v1/api/growth/managed-mailboxes/configuration",{}),this.at("GET","/v1/api/growth/managed-mailboxes/configuration")),quote:async(d)=>re(await this.raw.POST("/v1/api/growth/managed-mailboxes/quotes",{body:d}),this.at("POST","/v1/api/growth/managed-mailboxes/quotes")),order:async(d)=>re(await this.raw.POST("/v1/api/growth/managed-mailboxes/orders",{body:d}),this.at("POST","/v1/api/growth/managed-mailboxes/orders")),get:async(d)=>re(await this.raw.GET("/v1/api/growth/managed-mailboxes/orders/{orderId}",{params:{path:{orderId:d}}}),this.at("GET","/v1/api/growth/managed-mailboxes/orders/{orderId}")),reconcile:async(d)=>re(await this.raw.POST("/v1/api/growth/managed-mailboxes/orders/{orderId}/reconcile",{params:{path:{orderId:d}}}),this.at("POST","/v1/api/growth/managed-mailboxes/orders/{orderId}/reconcile")),listOrders:async(d)=>re(await this.raw.GET("/v1/api/growth/managed-mailboxes/orders",{params:{query:{...d,limit:d?.limit===void 0?void 0:String(d.limit)}}}),this.at("GET","/v1/api/growth/managed-mailboxes/orders")),listResources:async(d)=>re(await this.raw.GET("/v1/api/growth/managed-mailboxes/resources",{params:{query:{...d,limit:d?.limit===void 0?void 0:String(d.limit)}}}),this.at("GET","/v1/api/growth/managed-mailboxes/resources")),repair:async(d,u)=>re(await this.raw.POST("/v1/api/growth/managed-mailboxes/resources/{resourceId}/repair",{params:{path:{resourceId:d}},body:u}),this.at("POST","/v1/api/growth/managed-mailboxes/resources/{resourceId}/repair")),cancelHosting:async(d,u)=>re(await this.raw.POST("/v1/api/growth/managed-mailboxes/resources/{resourceId}/cancel-hosting",{params:{path:{resourceId:d}},body:u}),this.at("POST","/v1/api/growth/managed-mailboxes/resources/{resourceId}/cancel-hosting")),cancelWarmup:async(d,u)=>re(await this.raw.POST("/v1/api/growth/managed-mailboxes/resources/{resourceId}/cancel-warmup",{params:{path:{resourceId:d}},body:u}),this.at("POST","/v1/api/growth/managed-mailboxes/resources/{resourceId}/cancel-warmup")),removeDomain:async(d,u)=>re(await this.raw.POST("/v1/api/growth/managed-mailboxes/resources/{resourceId}/remove-domain",{params:{path:{resourceId:d}},body:u}),this.at("POST","/v1/api/growth/managed-mailboxes/resources/{resourceId}/remove-domain"))};mcpServers={list:async(d,u)=>re(await this.raw.GET("/v1/api/mcp-servers",{...u,params:{query:{projectId:d}}}),this.at("GET","/v1/api/mcp-servers")),get:async(d)=>re(await this.raw.GET("/v1/api/mcp-servers/{id}",{params:{path:{id:d}}}),this.at("GET",`/v1/api/mcp-servers/${d}`)),create:async(d,u)=>re(await this.raw.POST("/v1/api/mcp-servers",{...u,body:d}),this.at("POST","/v1/api/mcp-servers")),update:async(d,u)=>re(await this.raw.PATCH("/v1/api/mcp-servers/{id}",{params:{path:{id:d}},body:u}),this.at("PATCH",`/v1/api/mcp-servers/${d}`)),delete:async(d)=>re(await this.raw.DELETE("/v1/api/mcp-servers/{id}",{params:{path:{id:d}}}),this.at("DELETE",`/v1/api/mcp-servers/${d}`)),discover:async(d)=>re(await this.raw.POST("/v1/api/mcp-servers/{id}/discover",{params:{path:{id:d}}}),this.at("POST",`/v1/api/mcp-servers/${d}/discover`)),connect:async(d)=>re(await this.raw.POST("/v1/api/mcp-servers/{id}/connect",{params:{path:{id:d}}}),this.at("POST",`/v1/api/mcp-servers/${d}/connect`)),disconnect:async(d)=>re(await this.raw.POST("/v1/api/mcp-servers/{id}/disconnect",{params:{path:{id:d}}}),this.at("POST",`/v1/api/mcp-servers/${d}/disconnect`))};tools={search:async(d)=>re(await this.raw.GET("/v1/api/tools",{params:{query:{...d,limit:d?.limit===void 0?void 0:String(d.limit)}}}),this.at("GET","/v1/api/tools")),describe:async(d)=>re(await this.raw.GET("/v1/api/tools/{toolId}",{params:{path:{toolId:d}}}),this.at("GET",`/v1/api/tools/${d}`)),call:async(d,u)=>re(await this.raw.POST("/v1/api/tools/{toolId}/call",{params:{path:{toolId:d}},body:u}),this.at("POST",`/v1/api/tools/${d}/call`)),status:async(d)=>re(await this.raw.GET("/v1/api/tool-calls/{callId}",{params:{path:{callId:d}}}),this.at("GET",`/v1/api/tool-calls/${d}`)),listCalls:async(d)=>re(await this.raw.GET("/v1/api/tool-calls",{params:{query:{...d,limit:d?.limit===void 0?void 0:String(d.limit)}}}),this.at("GET","/v1/api/tool-calls"))};cycles={stop:async(d,u)=>re(await this.raw.POST("/v1/api/cycles/{id}/stop",{...u,params:{path:{id:d}}}),this.at("POST",`/v1/api/cycles/${d}/stop`)),messages:async(d,u,f)=>re(await this.raw.GET("/v1/api/cycles/{id}/messages",{...f,params:{path:{id:d},query:{...u,limit:u?.limit===void 0?void 0:String(u.limit)}}}),this.at("GET",`/v1/api/cycles/${d}/messages`)),message:async(d,u,f)=>re(await this.raw.POST("/v1/api/cycles/{id}/messages",{...f,params:{path:{id:d}},body:u}),this.at("POST",`/v1/api/cycles/${d}/messages`)),list:async(d)=>re(await this.raw.GET("/v1/api/cycles",{params:{query:{...d,limit:d?.limit===void 0?void 0:String(d.limit)}}}),this.at("GET","/v1/api/cycles")),get:async(d)=>re(await this.raw.GET("/v1/api/cycles/{id}",{params:{path:{id:d}}}),this.at("GET",`/v1/api/cycles/${d}`)),propose:async(d)=>re(await this.raw.POST("/v1/api/cycles",{body:d}),this.at("POST","/v1/api/cycles")),openFromBranch:async(d)=>re(await this.raw.POST("/v1/api/cycles/from-branch",{body:d}),this.at("POST","/v1/api/cycles/from-branch")),continueFromBranch:async(d)=>re(await this.raw.POST("/v1/api/cycles/{id}/continue",{params:{path:{id:d}}}),this.at("POST",`/v1/api/cycles/${d}/continue`)),review:async(d)=>re(await this.raw.GET("/v1/api/cycles/{id}/review",{params:{path:{id:d}}}),this.at("GET",`/v1/api/cycles/${d}/review`)),reviewComments:async(d)=>re(await this.raw.GET("/v1/api/cycles/{id}/review/comments",{params:{path:{id:d}}}),this.at("GET",`/v1/api/cycles/${d}/review/comments`))};chat={stop:async(d,u)=>re(await this.raw.POST("/v1/api/chat/stop",{...u,body:d}),this.at("POST","/v1/api/chat/stop")),send:async(d,u)=>re(await this.raw.POST("/v1/api/chat/turns",{...u,body:d}),this.at("POST","/v1/api/chat/turns")),turn:async(d,u,f)=>re(await this.raw.GET("/v1/api/chat/turns/{turnId}",{...f,params:{path:{turnId:d},query:u}}),this.at("GET",`/v1/api/chat/turns/${d}`))};live={run:(d,u,f)=>this.liveStream(`/agent/${d}/run`,oa(u),f),connect:(d,u,f)=>this.liveStream(`/agent/${d}/connect`,sa(u,f?.lastSeenEventId),f),follow:(d,u,f={})=>this.followLive(d,u,f),stop:async(d,u,f)=>{let v=`/agent/${d}/stop/${encodeURIComponent(u)}`;return await(await this.livePost(v,f?{runId:f}:{})).json()},project:(d,u={})=>this.watchProject(d,u),task:(d,u,f={})=>this.watchTask(d,u,f)};async*watchProject(d,u){let f=new AbortController;u.signal?.addEventListener("abort",()=>f.abort(),{once:!0});let v=Oo(this.live.follow("project-live",un(d,u),{...u,signal:f.signal}))[Symbol.asyncIterator](),j=async()=>aa(await this.projects.board(d,u.signal?{signal:u.signal}:{}),u),P=(R,F)=>{let L=new Set(R.activity.map((H)=>H.id));return{...R,activity:[...R.activity,...F.activity.filter((H)=>!L.has(H.id))],steps:F.steps}},I,C="",T=v.next();try{while(!u.signal?.aborted){let R,F=new Promise((X)=>{R=setTimeout(()=>X("poll"),ia)}),L=await Promise.race([T,F]);if(clearTimeout(R),L==="poll"){if(!I)continue;let X=await j(),D=JSON.stringify(X);if(D===C)continue;C=D,yield{state:P(X,I.state),event:{type:"STATE_DELTA",delta:[]}};continue}if(L.done)return;T=v.next(),I=L.value;let H=await j();C=JSON.stringify(H),yield{state:P(H,I.state),event:I.event}}}finally{f.abort(),T.catch(()=>{}),v.return?.(void 0).catch(()=>{})}}async*watchTask(d,u,f){let v="";for await(let{state:j}of this.live.project(d,{taskId:u,...f})){let P=To(j,u),I=JSON.stringify(P);if(I===v)continue;if(v=I,yield P,P.state!=="running")return}}async*followLive(d,u,f){let v=f.retry??ua,j=f.lastSeenEventId,P=0;while(!f.signal?.aborted){let I=!1,C=null;try{for await(let T of this.live.connect(d,u,{...f.signal?{signal:f.signal}:{},...j?{lastSeenEventId:j}:{}})){let R=$o(T);if(R)j=R;if(T.type!=="STATE_SNAPSHOT"&&T.type!=="MESSAGES_SNAPSHOT")P=0;if(T.type==="RUN_STARTED"||T.type==="STATE_SNAPSHOT"||R)I=!0;if(yield T,T.type==="RUN_FINISHED"||T.type==="RUN_ERROR")return}if(!I)return}catch(T){if(f.signal?.aborted)return;if(!ma(T))throw T;C=T}if(f.signal?.aborted)return;if(P+=1,P>=v.attempts)throw C??new St(`POST ${this.baseUrl}/v1/api/live/agent/${d}/connect: the stream kept closing`,{method:"POST",url:`${this.baseUrl}/v1/api/live/agent/${d}/connect`});await wt(En(P,v,null),f.signal)}}async*followProjectFeed(d,u){let f=u.retry??ua,{cursor:v,epoch:j}=u,P=0,I=!1;while(!u.signal?.aborted){let C=`/v1/api/projects/${encodeURIComponent(d)}/feed`,T=new URLSearchParams;if(v!==void 0)T.set("cursor",String(v));if(j!==void 0)T.set("epoch",j);let R=`${this.baseUrl}${C}${T.size?`?${T}`:""}`,F=v,L,H=!1;try{let X=await this.fetcher(new Request(R,{headers:{...this.headers,accept:"text/event-stream"},signal:u.signal}));if(!X.ok){let D=await X.json().catch(()=>null);throw Kt(X,D,{method:"GET",url:R})}if(!X.body)throw new St(`GET ${R}: the stream has no body`,{method:"GET",url:R});try{try{u.onConnect?.()}catch(D){throw H=!0,D}if(I&&u.onReconnect)try{await u.onReconnect()}catch(D){throw H=!0,D}for await(let D of Qn(X.body,u.signal)){if(D.event==="reset"){let Z=ta(D.data);if(!Z)continue;j=Z.epoch??void 0,v=void 0,F=void 0;try{await u.onReconnect?.()}catch(Q){throw H=!0,Q}continue}let B=ea(D.data);if(!B)continue;if(B.cursor===0&&v!==void 0&&v>0)v=void 0,F=void 0;if(F!==void 0&&B.cursor<=F)continue;if(B.epoch!==void 0)j=B.epoch;v=Math.max(v??0,B.cursor),P=0,yield B}}finally{X.body.cancel().catch(()=>{})}}catch(X){if(u.signal?.aborted)return;if(H||!ma(X))throw X;L=X}if(u.signal?.aborted)return;if(P+=1,P>=f.attempts)throw L??new St(`GET ${R}: the stream kept closing`,{method:"GET",url:R});I=!0,await wt(En(P,f,null),u.signal)}}async livePost(d,u,f){let v=`${this.baseUrl}/v1/api/live${d}`,j=await this.fetcher(new Request(v,{method:"POST",headers:{...this.headers,"content-type":"application/json",accept:"text/event-stream"},body:JSON.stringify(u),signal:f?.signal}));if(j.ok)return j;let P=null;try{P=await j.json()}catch{P=null}throw Kt(j,P,{method:"POST",url:v})}async*liveStream(d,u,f){let v=await this.livePost(d,u,f);if(!v.body)return;try{for await(let j of Qn(v.body,f?.signal)){let P=Ao(j.data);if(!P)continue;if(yield P,P.type==="RUN_FINISHED"||P.type==="RUN_ERROR")return}}finally{v.body.cancel().catch(()=>{})}}pendingRequests={list:async(d)=>re(await this.raw.GET("/v1/api/pending-requests",{params:{query:d??{}}}),this.at("GET","/v1/api/pending-requests")),resolve:async(d,u)=>re(await this.raw.POST("/v1/api/pending-requests/{id}/resolve",{params:{path:{id:d}},body:u}),this.at("POST",`/v1/api/pending-requests/${d}/resolve`))};clientInvoices={list:async(d)=>re(await this.raw.GET("/v1/api/client-billing/invoices",{params:{query:d??{}}}),this.at("GET","/v1/api/client-billing/invoices")),get:async(d)=>re(await this.raw.GET("/v1/api/client-billing/invoices/{id}",{params:{path:{id:d}}}),this.at("GET",`/v1/api/client-billing/invoices/${d}`)),createDraft:async(d)=>re(await this.raw.POST("/v1/api/client-billing/invoices",{body:d}),this.at("POST","/v1/api/client-billing/invoices")),issue:async(d)=>re(await this.raw.POST("/v1/api/client-billing/invoices/{id}/issue",{params:{path:{id:d}},body:{}}),this.at("POST",`/v1/api/client-billing/invoices/${d}/issue`)),void:async(d,u)=>re(await this.raw.POST("/v1/api/client-billing/invoices/{id}/void",{params:{path:{id:d}},body:{reason:u}}),this.at("POST",`/v1/api/client-billing/invoices/${d}/void`)),pay:async(d)=>re(await this.raw.POST("/v1/api/client-billing/invoices/{id}/pay",{params:{path:{id:d}},body:{}}),this.at("POST",`/v1/api/client-billing/invoices/${d}/pay`)),paymentLink:async(d,u={})=>re(await this.raw.POST("/v1/api/client-billing/invoices/{id}/payment-link",{params:{path:{id:d}},body:u}),this.at("POST",`/v1/api/client-billing/invoices/${d}/payment-link`))};async*observeCycle(d,u){let f=`/v1/api/cycles/${d}/observe`;for await(let v of this.stream(f,u)){let j=Eo(v.data);if(!j)continue;if(yield j,Io(j))return}}async*watchRepo(d,u,f){let v;while(!f.signal?.aborted){let j=await this.repos.head(d,u,f);if(j.commitSha!==v)v=j.commitSha,yield{commitSha:v};await wt(15000,f.signal)}}async*stream(d,u){let f=`${this.baseUrl}${d}`,v=new Request(f,{headers:{...this.headers,accept:"text/event-stream"},signal:u?.signal}),j=await globalThis.fetch(v);if(!j.ok||!j.body){let P=null;try{P=await j.json()}catch{P=null}throw Kt(j,P,{method:"GET",url:f})}yield*Qn(j.body,u?.signal)}}class e extends Error{code;details;constructor(d,u,f){super(u);if(this.name="CliError",this.code=d,f!==void 0)this.details=f}}import{spawn as Tp}from"node:child_process";import{closeSync as Mo,constants as nr,existsSync as Or,fsyncSync as ga,lstatSync as Ho,mkdirSync as vd,openSync as fa,readFileSync as ha,renameSync as bd,statSync as ya,unlinkSync as wa,writeFileSync as kd}from"node:fs";import{homedir as xd}from"node:os";import{dirname as Sd,join as Uo}from"node:path";var In="https://server.hlix.ai";function Ot(d=process.env){let u=d.HLIX_CONFIG_HOME??d.XDG_CONFIG_HOME??Uo(xd(),".config");return Uo(u,"hlix","credentials.json")}function G(d=process.env){let u=d.HLIX_API_KEY;if(!u&&d.HLIX_SESSION_TOKEN)return{baseUrl:d.HLIX_BASE_URL??In,apiKey:"",sessionToken:d.HLIX_SESSION_TOKEN,...d.HLIX_WORKSPACE_ID?{organizationId:d.HLIX_WORKSPACE_ID}:{}};if(u)return{baseUrl:d.HLIX_BASE_URL??In,apiKey:u,...d.HLIX_WORKSPACE_ID?{organizationId:d.HLIX_WORKSPACE_ID}:{}};try{let f=JSON.parse(ha(Ot(d),"utf8"));return(f.apiKey||f.sessionToken)&&f.baseUrl?f:null}catch{return null}}function va(d=process.env){let u=Ot(d);return Or(u)?u:null}function Do(d=process.env){let u=Ot(d);if(!Or(u))return{path:u,removed:!1,reason:"absent"};let f=Ho(u);if(f.isSymbolicLink()||!f.isFile())throw Error("Refusing to remove a credential path that is not a regular file.");let v=process.getuid?.();if(v!==void 0&&ya(u).uid!==v)throw Error("Refusing to remove a credential file owned by another user.");let j;try{j=JSON.parse(ha(u,"utf8"))}catch{j=null}let P=j;if(!P||typeof P.apiKey!=="string"||typeof P.baseUrl!=="string")throw Error(`Refusing to remove ${u}: it is not a credential written by this CLI.`);return wa(u),{path:u,removed:!0,reason:"removed"}}function ba(d,u=process.env){let f=Ot(u),v=Sd(f);if(vd(v,{recursive:!0,mode:448}),Ho(v).isSymbolicLink())throw Error("Refusing to write credentials through a symlinked directory.");if(Or(f)){let I=Ho(f);if(I.isSymbolicLink()||!I.isFile())throw Error("Refusing to replace a credential path that is not a regular file.");let C=process.getuid?.();if(C!==void 0&&ya(f).uid!==C)throw Error("Refusing to replace a credential file owned by another user.")}let j=Uo(v,`.credentials.${process.pid}.${crypto.randomUUID()}.tmp`),P;try{P=fa(j,nr.O_WRONLY|nr.O_CREAT|nr.O_EXCL|nr.O_NOFOLLOW,384),kd(P,`${JSON.stringify(d,null,2)}
6
+ `,"utf8"),ga(P),Mo(P),P=void 0,bd(j,f);let I=fa(v,nr.O_RDONLY);try{try{ga(I)}catch(C){let T=C.code;if(T!=="EINVAL"&&T!=="ENOTSUP")throw C}}finally{Mo(I)}}catch(I){if(P!==void 0)Mo(P);if(Or(j))wa(j);throw I}return f}import{statSync as Pp}from"node:fs";import{dirname as Wa,resolve as Ba}from"node:path";import{createHash as mp}from"node:crypto";import{existsSync as es,lstatSync as gp,readFileSync as ts,statSync as fp,writeFileSync as ns}from"node:fs";import{readFile as hp}from"node:fs/promises";import{join as Xt}from"node:path";import{parseAllDocuments as Qd,stringify as ep,visit as Ra}from"yaml";import{z as ve}from"zod";var c={"claude-fable-5-1":{provider:"anthropic",contextWindow:1e6,displayName:"Fable 5.1",tier:"frontier",capabilities:{inputModalities:["text","image","file"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["max","xhigh","high","medium","low"]}}},"claude-opus-5":{provider:"anthropic",contextWindow:1e6,displayName:"Opus 5",tier:"frontier",capabilities:{inputModalities:["text","image","file"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["max","xhigh","high","medium","low","none"]}}},"claude-sonnet-5":{provider:"anthropic",contextWindow:1e6,displayName:"Sonnet 5",tier:"primary",capabilities:{inputModalities:["text","image","file"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["max","xhigh","high","medium","low","none"]}}},"claude-haiku-4-5":{provider:"anthropic",contextWindow:200000,displayName:"Haiku 4.5",tier:"fast",capabilities:{inputModalities:["text","image","file"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:null}}},"claude-haiku-5-5":{provider:"anthropic",contextWindow:1e6,displayName:"Haiku 5.5",tier:"fast",capabilities:{inputModalities:["text","image","file"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["max","xhigh","high","medium","low","none"]}}},"gpt-6-astra":{provider:"openai",contextWindow:1050000,displayName:"GPT-6 Astra",tier:"frontier",capabilities:{inputModalities:["file","image","text"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["max","xhigh","high","medium","low"]}}},"gpt-6.1-sol":{provider:"openai",contextWindow:1050000,displayName:"GPT-6.1 Sol",tier:"frontier",capabilities:{inputModalities:["file","image","text"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["max","xhigh","high","medium","low"]}}},"gpt-6.1-terra":{provider:"openai",contextWindow:1050000,displayName:"GPT-6.1 Terra",tier:"primary",capabilities:{inputModalities:["file","image","text"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["max","xhigh","high","medium","low","none"]}}},"gpt-6-luna":{provider:"openai",contextWindow:1050000,displayName:"GPT-6 Luna",tier:"fast",capabilities:{inputModalities:["file","image","text"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["max","xhigh","high","medium","low","none"]}}},"gpt-5.6-sol":{provider:"openai",contextWindow:1050000,displayName:"GPT-5.6 Sol",tier:"frontier",capabilities:{inputModalities:["file","image","text"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["max","xhigh","high","medium","low","none"]}}},"gpt-5.6-terra":{provider:"openai",contextWindow:1050000,displayName:"GPT-5.6 Terra",tier:"primary",capabilities:{inputModalities:["file","image","text"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["max","xhigh","high","medium","low","none"]}}},"gpt-5.6-luna":{provider:"openai",contextWindow:1050000,displayName:"GPT-5.6 Luna",tier:"fast",capabilities:{inputModalities:["file","image","text"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["max","xhigh","high","medium","low","none"]}}},"jev-latest":{provider:"openrouter",contextWindow:32000,displayName:"Decision Model",tier:"fast",picker:!1},"gemini-3.8-flash":{provider:"google_genai",contextWindow:1048576,displayName:"Gemini 3.8 Flash",tier:"fast",capabilities:{inputModalities:["text","image","video","file","audio"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["high","medium","low"]}}},"gemini-embedding-2":{provider:"google_genai",contextWindow:8192,displayName:"Gemini Embedding 2",tier:"embedding",picker:!1},"grok-4.6":{provider:"openrouter",contextWindow:500000,displayName:"Grok 4.6",tier:"frontier",capabilities:{inputModalities:["text","image","file"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["xhigh","high","medium","low"]}}},"kimi-k3.1-pro":{provider:"openrouter",contextWindow:1048576,displayName:"Kimi K3.1 Pro",tier:"primary",capabilities:{inputModalities:["text","image","video"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["max","high","low","none"]}}},"kimi-k3":{provider:"openrouter",contextWindow:1048576,displayName:"Kimi K3",tier:"primary",capabilities:{inputModalities:["text","image","video"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["max","high","low","none"]}}},"deepseek-v4-pro":{provider:"openrouter",contextWindow:1048576,displayName:"DeepSeek V4 Pro",tier:"primary",capabilities:{inputModalities:["text"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["xhigh","high","none"]}}},"deepseek-v4.1-flash":{provider:"openrouter",contextWindow:1048576,displayName:"DeepSeek V4.1 Flash",tier:"fast",capabilities:{inputModalities:["text","image"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["max","high","low","none"]}}},"glm-5.3":{provider:"openrouter",contextWindow:1310720,displayName:"GLM 5.3",tier:"primary",capabilities:{inputModalities:["text"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["max","high","low"]}}},"glm-5.3-flash":{provider:"openrouter",contextWindow:1310720,displayName:"GLM 5.3 Flash",tier:"fast",capabilities:{inputModalities:["text","image","video"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["max","high","low"]}}},"qwen3.8-max":{provider:"openrouter",contextWindow:1e6,displayName:"Qwen 3.8 Max",tier:"primary",capabilities:{inputModalities:["text","image","video"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["xhigh","high","medium","low","minimal"]}}},"qwen3.8-flash":{provider:"openrouter",contextWindow:1e6,displayName:"Qwen 3.8 Flash",tier:"fast",capabilities:{inputModalities:["text","image","video"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:null}}},auto:{provider:"openrouter",contextWindow:2000000,displayName:"Auto",tier:"primary",routesAutomatically:!0},"pareto-code":{provider:"openrouter",contextWindow:2000000,displayName:"Auto for coding",tier:"primary",routesAutomatically:!0,capabilities:{inputModalities:["text"],structuredOutput:!0,tools:!0}},"fable-latest":{provider:"anthropic",contextWindow:1e6,displayName:"Claude Fable (Latest)",tier:"frontier",capabilities:{inputModalities:["text","image","file"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["max","xhigh","high","medium","low"]}}},"opus-latest":{provider:"anthropic",contextWindow:1e6,displayName:"Claude Opus (Latest)",tier:"frontier",capabilities:{inputModalities:["text","image","file"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["max","xhigh","high","medium","low"]}}},"sonnet-latest":{provider:"anthropic",contextWindow:1e6,displayName:"Claude Sonnet (Latest)",tier:"primary",capabilities:{inputModalities:["text","image","file"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["max","xhigh","high","medium","low"]}}},"haiku-latest":{provider:"anthropic",contextWindow:200000,displayName:"Claude Haiku (Latest)",tier:"fast",capabilities:{inputModalities:["text","image","file"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["max","xhigh","high","medium","low","none"]}}},"sol-latest":{provider:"openai",contextWindow:1050000,displayName:"GPT Sol (Latest)",tier:"frontier",capabilities:{inputModalities:["text","image","file"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["max","xhigh","high","medium","low"]}}},"luna-latest":{provider:"openai",contextWindow:1050000,displayName:"GPT Luna (Latest)",tier:"fast",capabilities:{inputModalities:["text","image","file"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["max","xhigh","high","medium","low","none"]}}},"terra-latest":{provider:"openai",contextWindow:1050000,displayName:"GPT Terra (Latest)",tier:"primary",capabilities:{inputModalities:["text","image","file"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["max","xhigh","high","medium","low","none"]}}},"astra-latest":{provider:"openai",contextWindow:1050000,displayName:"GPT Astra (Latest)",tier:"frontier",capabilities:{inputModalities:["file","image","text"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["max","xhigh","high","medium","low"]}}},"grok-latest":{provider:"openrouter",contextWindow:500000,displayName:"Grok (Latest)",tier:"frontier",capabilities:{inputModalities:["text","image","file"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["xhigh","high","medium","low"]}}},"gemini-pro-latest":{provider:"google_genai",contextWindow:1048576,displayName:"Gemini Pro (Latest)",tier:"primary",capabilities:{inputModalities:["audio","file","image","text","video"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["high","medium","low"]}}},"gemini-flash-latest":{provider:"google_genai",contextWindow:1048576,displayName:"Gemini Flash (Latest)",tier:"fast",capabilities:{inputModalities:["text","image","video","file","audio"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["high","medium","low"]}}},"deepseek-pro-latest":{provider:"openrouter",contextWindow:1048576,displayName:"DeepSeek Pro (Latest)",tier:"primary",capabilities:{inputModalities:["text"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["max","high","low","none"]}}},"deepseek-flash-latest":{provider:"openrouter",contextWindow:1048576,displayName:"DeepSeek Flash (Latest)",tier:"fast",capabilities:{inputModalities:["text","image"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["max","high","low","none"]}}},"glm-latest":{provider:"openrouter",contextWindow:1310720,displayName:"GLM (Latest)",tier:"primary",capabilities:{inputModalities:["text"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["max","high","low"]}}},"glm-flash-latest":{provider:"openrouter",contextWindow:1310720,displayName:"GLM Flash (Latest)",tier:"fast",capabilities:{inputModalities:["text","image","video"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!0,efforts:["max","high","low"]}}},"kimi-latest":{provider:"openrouter",contextWindow:1048576,displayName:"Kimi (Latest)",tier:"primary",capabilities:{inputModalities:["text","image","video"],structuredOutput:!0,tools:!0,reasoning:{mandatory:!1,efforts:["max","high","low","none"]}}},"whisper-1":{provider:"openrouter",contextWindow:0,displayName:"Whisper 1 (Speech-to-Text)",tier:"media",picker:!1},"voxtral-mini-tts":{provider:"openrouter",contextWindow:4096,displayName:"Voxtral Mini TTS (Text-to-Speech)",tier:"media",picker:!1},"seedream-4-5":{provider:"openrouter",contextWindow:4096,displayName:"Seedream 4.5 (Image)",tier:"media",picker:!1},"veo-3-1":{provider:"openrouter",contextWindow:0,displayName:"Veo 3.1 (Video)",tier:"media",picker:!1}},Go={"claude-code":"claude-sonnet-4-5",codex:"gpt-5.4"};var Se=["auto","frontier","frontierMax","ownSubscription"],jd=Object.keys(c);var ka={"jev-latest":"openrouter/~typesafe/jev-latest","claude-fable-5-1":"openrouter/anthropic/claude-fable-5.1","claude-opus-5":"openrouter/anthropic/claude-opus-5","claude-sonnet-5":"openrouter/anthropic/claude-sonnet-5","claude-haiku-4-5":"openrouter/anthropic/claude-haiku-4.5","claude-haiku-5-5":"openrouter/anthropic/claude-haiku-5.5","gpt-6-astra":"openrouter/openai/gpt-6-astra","gpt-6.1-sol":"openrouter/openai/gpt-6.1-sol","gpt-6.1-terra":"openrouter/openai/gpt-6.1-terra","gpt-6-luna":"openrouter/openai/gpt-6-luna","gpt-5.6-sol":"openrouter/openai/gpt-5.6-sol","gpt-5.6-terra":"openrouter/openai/gpt-5.6-terra","gpt-5.6-luna":"openrouter/openai/gpt-5.6-luna","gemini-3.8-flash":"openrouter/google/gemini-3.8-flash","gemini-embedding-2":"direct:google/gemini-embedding-2","grok-4.6":"openrouter/x-ai/grok-4.6","kimi-k3.1-pro":"openrouter/moonshotai/kimi-k3.1-pro","kimi-k3":"openrouter/moonshotai/kimi-k3","deepseek-v4-pro":"openrouter/deepseek/deepseek-v4-pro","deepseek-v4.1-flash":"openrouter/deepseek/deepseek-v4.1-flash","glm-5.3":"openrouter/z-ai/glm-5.3","glm-5.3-flash":"openrouter/z-ai/glm-5.3-flash","qwen3.8-max":"openrouter/qwen/qwen3.8-max-0902","qwen3.8-flash":"openrouter/qwen/qwen3.8-flash",auto:"openrouter/openrouter/auto","pareto-code":"openrouter/openrouter/pareto-code","fable-latest":"openrouter/~anthropic/claude-fable-latest","opus-latest":"openrouter/~anthropic/claude-opus-latest","sonnet-latest":"openrouter/~anthropic/claude-sonnet-latest","haiku-latest":"openrouter/~anthropic/claude-haiku-latest","astra-latest":"openrouter/~openai/gpt-astra-latest","sol-latest":"openrouter/~openai/gpt-sol-latest","luna-latest":"openrouter/~openai/gpt-luna-latest","terra-latest":"openrouter/~openai/gpt-terra-latest","grok-latest":"openrouter/~x-ai/grok-latest","gemini-pro-latest":"openrouter/~google/gemini-pro-latest","gemini-flash-latest":"openrouter/~google/gemini-flash-latest","deepseek-pro-latest":"openrouter/~deepseek/deepseek-pro-latest","deepseek-flash-latest":"openrouter/~deepseek/deepseek-flash-latest","glm-latest":"openrouter/~z-ai/glm-latest","glm-flash-latest":"openrouter/~z-ai/glm-flash-latest","kimi-latest":"openrouter/~moonshotai/kimi-latest","whisper-1":"openrouter/openai/whisper-1","voxtral-mini-tts":"openrouter/mistralai/voxtral-mini-tts-2603","seedream-4-5":"openrouter/bytedance-seed/seedream-4.5","veo-3-1":"openrouter/google/veo-3.1"},se={default:"jev-latest"};var O="◆",Pd=(()=>{let d={};for(let u of Object.keys(c)){let f=c[u];d[u]=f.displayName,d[ka[u]]=f.displayName,d[`${f.provider}:${u}`]=f.displayName}return d})();function De(d){if(!d)return d;let f=Pd[d]??d.split(/[/:]/).pop()??d;return`${O} ${f}`}function Ed(d){let u=ka[d];if(!u)throw Error(`No router slug registered for model id: "${d}"`);return u}var Bh=new Set(jd.filter((d)=>c[d].routesAutomatically).map((d)=>Ed(d)));var s={"claude-code":{id:"claude-code",localAccount:{command:"claude",args:["auth","status","--json"],fallback:"claude"},execution:{transport:"acp",sandboxKey:"claudeCode",command:"claude-agent-acp",args:[],oneshot:{command:"claude",args:["-p","--output-format","stream-json","--verbose","--dangerously-skip-permissions"],parser:"claude"},install:"npm i -g @agentclientprotocol/claude-agent-acp",auth:{envVars:["ANTHROPIC_API_KEY"]},models:{selection:"agent-config",modelEnv:"ANTHROPIC_MODEL",effort:!1},pricing:{model:Go["claude-code"],input:3,output:15,cachedRead:0.3,cachedWrite:3.75},where:["local","cloud"]},displayName:"Claude Code",description:"Anthropic coding CLI. Flagship, always installed.",driverKind:"external-acp",capabilities:["structured-result","usage-report","model-select"],credentials:{required:["ANTHROPIC_API_KEY"],anyOf:[]},supportedPlatforms:["linux"],resultProtocol:{kind:"hlix-result-line",version:1},modelSupport:{selection:"runtime",effort:!1},available:!0},"openai-agents":{id:"openai-agents",displayName:"OpenAI Agents SDK",description:"Model-agnostic agent SDK. Not yet available for running tasks.",driverKind:"external-acp",capabilities:["structured-result","usage-report","model-select"],credentials:{required:[],anyOf:["OPENAI_API_KEY","ANTHROPIC_API_KEY","GOOGLE_API_KEY","OPENROUTER_API_KEY"]},supportedPlatforms:["linux"],resultProtocol:{kind:"hlix-result-line",version:1},modelSupport:{selection:"runtime",effort:!1},available:!1},codex:{id:"codex",localAccount:{command:"codex",args:["login","status"],fallback:"codex"},execution:{transport:"acp",sandboxKey:"codex",command:"codex-acp",args:[],oneshot:{command:"codex",args:["exec","--json","--dangerously-bypass-approvals-and-sandbox","-"],parser:"codex"},env:{NO_BROWSER:"1"},install:"npm i -g @agentclientprotocol/codex-acp",auth:{envVars:["OPENAI_API_KEY"],method:"api-key"},models:{selection:"agent-config",modelEnv:"CODEX_MODEL",effort:!1},pricing:{model:Go.codex,input:2.5,output:15,cachedRead:0.25,cachedWrite:2.5},where:["local","cloud"]},displayName:"Codex",description:"OpenAI coding CLI. Installed on demand.",driverKind:"external-acp",capabilities:["structured-result","usage-report","model-select"],credentials:{required:["OPENAI_API_KEY"],anyOf:[]},supportedPlatforms:["linux"],resultProtocol:{kind:"hlix-result-line",version:1},modelSupport:{selection:"runtime",effort:!1},available:!0},aider:{id:"aider",localAccount:{command:"aider"},displayName:"Aider",description:"Model-agnostic coding CLI. Not yet available for running tasks.",driverKind:"external-acp",capabilities:["structured-result","model-select"],credentials:{required:[],anyOf:["OPENAI_API_KEY","ANTHROPIC_API_KEY","GOOGLE_API_KEY","OPENROUTER_API_KEY"]},supportedPlatforms:["linux"],resultProtocol:{kind:"hlix-result-line",version:1},modelSupport:{selection:"runtime",effort:!1},available:!1},gemini:{id:"gemini",localAccount:{command:"gemini",fallback:"gemini"},displayName:"Gemini CLI",localOnly:!0,description:"Verified local ACP adapter. Cloud provisioning is not enabled.",driverKind:"external-acp",capabilities:["structured-result"],credentials:{required:[],anyOf:[]},supportedPlatforms:["linux"],resultProtocol:{kind:"hlix-result-line",version:1},modelSupport:{selection:"runtime",effort:!1},available:!1,execution:{transport:"acp",sandboxKey:"gemini",command:"gemini",args:["--acp"],install:"npm i -g @google/gemini-cli",auth:{envVars:["GEMINI_API_KEY"],method:"gemini-api-key"},models:{selection:"agent-config",effort:!1},pricing:null,where:["local"]}},opencode:{id:"opencode",localAccount:{command:"opencode",args:["auth","list"]},displayName:"OpenCode",description:"SST's open-source coding agent.",driverKind:"external-acp",capabilities:["structured-result"],credentials:{required:[],anyOf:[]},supportedPlatforms:["linux"],resultProtocol:{kind:"hlix-result-line",version:1},modelSupport:{selection:"runtime",effort:!1},available:!0,execution:{localAvailable:!1,transport:"acp",sandboxKey:"opencode",command:"opencode",args:["acp"],install:"npm i -g opencode-ai",auth:{envVars:[]},models:{selection:"agent-config",effort:!1},pricing:null,where:["local","cloud"]}},goose:{id:"goose",localAccount:{command:"goose",fallback:"goose"},displayName:"Goose",description:"Block's open-source coding agent.",driverKind:"external-acp",capabilities:["structured-result"],credentials:{required:[],anyOf:[]},supportedPlatforms:["linux"],resultProtocol:{kind:"hlix-result-line",version:1},modelSupport:{selection:"runtime",effort:!1},available:!0,execution:{transport:"acp",sandboxKey:"goose",command:"goose",args:["acp"],install:"brew install block-goose-cli",auth:{envVars:[]},models:{selection:"agent-config",effort:!1},pricing:null,where:["local","cloud"]}},"qwen-code":{id:"qwen-code",displayName:"Qwen Code",description:"Qwen's open-source coding agent.",driverKind:"external-acp",capabilities:["structured-result"],credentials:{required:[],anyOf:[]},supportedPlatforms:["linux"],resultProtocol:{kind:"hlix-result-line",version:1},modelSupport:{selection:"runtime",effort:!1},available:!0,execution:{localAvailable:!1,transport:"acp",sandboxKey:"qwenCode",command:"qwen",args:["--acp","--auth-type","openai","--approval-mode","yolo"],install:"npm i -g @qwen-code/qwen-code",auth:{envVars:[]},models:{selection:"agent-config",effort:!1},pricing:null,where:["cloud"]}},pi:{id:"pi",displayName:"Pi",description:"Minimal open-source coding agent.",driverKind:"external-acp",capabilities:["structured-result"],credentials:{required:[],anyOf:[]},supportedPlatforms:["linux"],resultProtocol:{kind:"hlix-result-line",version:1},modelSupport:{selection:"runtime",effort:!1},available:!0,execution:{localAvailable:!1,transport:"acp",sandboxKey:"pi",command:"pi-acp",args:[],install:"npm i -g pi-acp @earendil-works/pi-coding-agent",auth:{envVars:[]},models:{selection:"agent-config",effort:!1},pricing:null,where:["cloud"]}},hlix:{id:"hlix",displayName:"Hlix",description:"Our own coding agent, built into hlix and run by the platform.",driverKind:"native",capabilities:["structured-result"],credentials:{required:[],anyOf:[]},supportedPlatforms:["linux"],resultProtocol:{kind:"native-runner",version:1},modelSupport:{selection:"orchestration",effort:!1},available:!0}},Rr=Object.keys(s).filter((d)=>!("localOnly"in s[d])),Wo=Object.values(s).filter((d)=>!("localOnly"in d)),Jh=Wo.filter(({driverKind:d})=>d==="external-acp").map(({id:d})=>d),Id=Wo.filter(({available:d,driverKind:u})=>d&&u==="external-acp"),xa=Id.map(({id:d})=>d),_d=Wo.filter(({available:d})=>d),x=_d.map(({id:d})=>d),Sa="hlix";var S=Object.values(s).filter((d)=>("execution"in d)),y=S.map(({id:d})=>d);var Cd=/^[a-z0-9](?:[a-z0-9_-]{0,18}[a-z0-9])?$/,$d=["main","master","develop","development","dev","staging","production","prod","release","preview","trunk","head"];function ja(d){return Cd.test(d)&&!$d.includes(d)}import{z as Ad}from"zod";var Pa=Ad.enum(["small","standard","large"]);import{z as Nr}from"zod";var Ea=Nr.array(Nr.object({id:Nr.string().min(1).max(200).regex(/^[\w./:~@+-]+$/),name:Nr.string().min(1).max(256).regex(/^[^\x00-\x1f\x7f]+$/)}).strict()).max(1000);import{z as Ht}from"zod";var Ia=Ht.string().trim().max(200).regex(/^[^<>\x00-\x1f\x7f]*$/),Td=Ht.union([Ht.literal(""),Ht.email().max(254)]).transform((d)=>d.trim()),ty=Ht.object({gitName:Ia,gitEmail:Td,hlixCoauthor:Ht.boolean()}).strict(),_a=Ht.object({name:Ia.min(1),email:Ht.email().max(254),hlixCoauthor:Ht.boolean()}).strict();import{z as U}from"zod";import{z as Me}from"zod";import{z as Ut}from"zod";var Ca=Ut.discriminatedUnion("phase",[Ut.object({designId:Ut.string().uuid(),phase:Ut.literal("prototype"),revisionId:Ut.string().uuid().optional()}),Ut.object({designId:Ut.string().uuid(),phase:Ut.literal("implementation"),revisionId:Ut.string().uuid()})]);var $a=Me.object({version:Me.literal(1),organizationId:Me.string().min(1),projectId:Me.string().min(1),cycleId:Me.string().min(1),taskId:Me.string().min(1),source:Me.string().nullable(),sourceRevision:Me.string().min(1),requestDigest:Me.string().regex(/^[a-f0-9]{64}$/),requestRevision:Me.number().int().min(1),sourceId:Me.string().nullable(),project:Me.object({name:Me.string(),stack:Me.string().nullable(),goal:Me.string()}),cycleGoal:Me.string(),designWork:Ca.optional(),taskGoal:Me.string(),requirements:Me.string(),implementationPlan:Me.string(),repo:Me.object({id:Me.string(),owner:Me.string().nullable(),name:Me.string().nullable(),cloneUrl:Me.string().nullable(),ref:Me.string()}).nullable(),prerequisite:Me.object({applicability:Me.enum(["application","tooling","unknown"]),sourceExcerpt:Me.string()}).optional(),checks:Me.array(Me.object({kind:Me.enum(["verification","startup"]),required:Me.literal(!0),command:Me.string().nullable(),executionDigest:Me.string().nullable(),port:Me.number().int().min(1).max(65535).nullable().optional(),source:Me.enum(["repo","project","runtime","candidate-discovery"])})).min(1)});import{z as Od}from"zod";var Bo=Od.string().regex(/^op-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}-(0|[1-9][0-9]*)$/,"Invalid operation id");import{z as ct}from"zod";var Rd=["queued","building","done","blocked"],Nd=["operator","engineer","review","platform"],gt={id:64,title:200,description:1000,note:280,feedback:1000,dependsOn:8,commit:40,source:8,updatedAt:40},Aa=100,Fd=gt.id+gt.title+2*gt.description+gt.note+gt.feedback+gt.dependsOn*gt.id+gt.commit+gt.source+gt.updatedAt,Rt={maxItems:Aa,maxBytes:Aa*(Fd*6+1024)+1024,maxEngineerItems:50,titleChars:gt.title,descriptionChars:gt.description,feedbackChars:gt.feedback,noteChars:gt.note,maxDependsOn:gt.dependsOn},Fr=/^[\w-]{1,64}$/;var Ta=ct.object({id:ct.string().regex(Fr),title:ct.string().min(1).max(Rt.titleChars),description:ct.string().max(Rt.descriptionChars).default(""),doneWhen:ct.string().max(Rt.descriptionChars).nullable().optional(),status:ct.enum(Rd),dependsOn:ct.array(ct.string().regex(Fr)).max(Rt.maxDependsOn).default([]),note:ct.string().max(Rt.noteChars).default(""),commit:ct.string().regex(/^[a-f0-9]{40}$/).nullable().default(null),feedback:ct.string().max(Rt.feedbackChars).nullable().default(null),source:ct.enum(Nd).default("operator"),updatedAt:ct.string().max(gt.updatedAt).default("")}),py=ct.object({version:ct.literal(1),cycleId:ct.string().min(1),tasks:ct.array(Ta).max(Rt.maxItems)}),Oa=Ta.partial({description:!0,doneWhen:!0,dependsOn:!0,note:!0,commit:!0,feedback:!0,source:!0,updatedAt:!0}).extend({deleted:ct.boolean().optional()});var Ld=U.enum(Rr),Md=U.enum(["coder","reviewer","planner","setup"]),qo=U.enum(xa),zo=U.union([U.string(),U.number().transform(String)]),Jo=U.object({node:zo.optional(),python:zo.optional(),bun:zo.optional(),playwright:U.boolean().optional()}).catchall(U.union([U.string().min(1).max(200),U.number().transform(String),U.boolean()])).refine((d)=>Object.entries(d).every(([u,f])=>u==="playwright"||typeof f==="string"),"Tool versions must be strings"),Ko=U.object({name:U.enum(["mysql","postgres","redis"]),start:U.string().max(1e4).optional(),ready:U.string().max(1e4).optional(),stop:U.string().max(1e4).optional()}),Py=U.object({startedAt:U.string(),finishedAt:U.string().optional(),status:U.enum(["ok","partial"]),steps:U.array(U.object({name:U.string(),status:U.enum(["ok","fixed-by-override","failed"]),reason:U.string().optional()}))}),Vo=U.object({agents:U.array(qo).optional(),toolchain:Jo.optional(),aptPackages:U.array(U.string()).optional(),setup:U.string().optional(),services:U.array(Ko).max(3).optional(),envOverrides:U.record(U.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/),U.string().max(1e4)).optional(),verifyCommand:U.string().max(1e4).optional(),preview:U.object({command:U.string().min(1).max(1e4),port:U.number().int().min(1024).max(65535)}).optional(),deployment:U.discriminatedUnion("kind",[U.object({repoId:U.string().min(1),kind:U.literal("static"),buildCommand:U.string().trim().min(1).max(1e4),outDir:U.string().min(1).max(2000).refine((d)=>/^(?!\/|[A-Za-z]:)(?!.*(?:^|\/)(?:\.\.?|\.env(?:\.[^/]*)?|\.git|\.hlix[^/]*|node_modules)(?:\/|$))[^\\\x00-\x1f\x7f]+$/i.test(d),"Output must be a public directory inside the repository")}),U.object({repoId:U.string().min(1),kind:U.literal("server"),startCommand:U.string().trim().min(1).max(1e4)})]).optional(),notes:U.array(U.string().max(2000)).max(100).optional(),source:U.record(U.string(),U.enum(["auto","person"])).optional(),hash:U.string().optional(),imageTag:U.string().nullable().optional(),linearProjectId:U.string().optional(),linearTeamId:U.string().optional()}).partial(),Ey=U.object({owner:U.string(),name:U.string(),cloneUrl:U.string(),defaultBranch:U.string()}),Hd=U.object({key:U.string(),cloneUrl:U.string(),owner:U.string().nullable(),name:U.string().nullable(),defaultBranch:U.string(),setupCommand:U.string().nullable().optional(),verifyCommand:U.string().nullable().optional()}),Ud=U.object({system:U.boolean().optional(),name:U.string(),skillSlugs:U.array(U.string()),agentSlugs:U.array(U.string())}),Dd=U.object({path:U.string(),content:U.string(),executable:U.boolean().optional(),encoding:U.enum(["utf8","base64"]).optional()}).refine((d)=>d.encoding!=="base64"||d.content.length%4===0&&/^[A-Za-z0-9+/]*={0,2}$/.test(d.content),{message:"Base64 file content must use valid padded base64",path:["content"]}),Gd=U.object({vars:U.record(U.string(),U.string()).default({}),files:U.array(Dd).optional(),skills:U.array(U.string()).optional(),mcpServers:U.array(U.unknown()).optional(),managedPaths:U.array(U.string().refine((d)=>d.length>0&&d===d.normalize("NFC")&&!d.startsWith("/")&&!d.includes("\\")&&!/[\u0000-\u001f\u007f]/.test(d)&&d.split("/").every((u)=>u&&u!=="."&&u!==".."),"managed path must be a canonical project-relative path")).optional()}),Wd=U.object({path:U.string(),kind:U.enum(["dotenv","credential","detected-content"]),contentBase64:U.string(),size:U.number().int().nonnegative(),sha256:U.string().regex(/^[0-9a-f]{64}$/)}),Bd=U.object({providerId:U.string().min(1).max(200).nullable().optional(),mode:U.enum(["managed","api_key","subscription"]),accountId:U.string().min(1).max(200).nullable(),nativeModel:U.string().trim().min(1).max(200).nullable()}).strict().refine((d)=>!d.providerId||d.mode==="api_key"&&d.accountId===null&&!!d.nativeModel,{message:"Select one API provider and its model, without a native account"}).refine((d)=>d.mode!=="managed"||d.accountId===null&&d.nativeModel===null,{message:"Managed funding cannot select an external account or native model"}),zd=U.object({attemptId:U.string().uuid(),sequence:U.number().int().min(1).max(2147483647),tokensIn:U.number().int().min(0).max(2147483647).optional(),tokensOut:U.number().int().min(0).max(2147483647).optional(),costUsd:U.number().finite().min(0).max(1e6).optional(),completeness:U.enum(["partial","complete","unknown"]),model:U.string().max(200).optional()}).strict().refine((d)=>d.completeness!=="complete"||d.tokensIn!==void 0&&d.tokensOut!==void 0,{message:"Complete native usage requires both token totals"}),qd=U.object({path:U.string().min(1).max(4096),change:U.enum(["add","modify","delete"]),mode:U.enum(["file","executable","symlink"]).optional(),content:U.string().max(16777216).optional()}).strict(),Jd=U.object({revision:U.number().int().positive(),sha:U.string().regex(/^[a-f0-9]{40}$/),overlay:U.array(qd).max(5000),packet:U.string().max(200000)}).strict(),Kd=U.object({commitAttribution:_a.optional(),taskId:U.string(),cycleId:U.string(),threadId:U.string(),organizationId:U.string().optional(),projectId:U.string().optional(),description:U.string(),acceptedScope:$a.optional(),baseSha:U.string().regex(/^[a-f0-9]{40}$/).optional(),reviewFeedback:U.string().optional(),iteration:U.number().default(0),operationId:Bo.optional(),repo:Hd,branch:U.string(),baseBranch:U.string(),gitToken:U.string().optional(),secrets:U.record(U.string(),U.string()),packs:U.array(Ud),systemPrompt:U.string().optional(),timeoutSeconds:U.number().default(1800),funding:Bd.optional(),nativeAttemptId:U.string().uuid().optional(),agentEnv:U.record(U.string(),U.string()).optional(),agent:Ld.default(Sa),model:U.string().min(1).optional(),effort:U.enum(["low","medium","high"]).optional(),role:Md.optional(),resultPath:U.string().optional(),answerPrompt:U.string().min(1).optional(),startupCommand:U.string().nullable().optional(),startupPort:U.number().int().min(1).max(65535).nullable().optional(),projectRuntime:Vo.optional(),preparedEnvironment:U.string().optional(),environment:Gd.optional(),protectedFiles:U.array(Wd).optional(),checklist:U.array(Oa).max(Rt.maxItems).optional(),checklistRemoved:U.array(U.string().regex(Fr)).max(Rt.maxItems*2).optional(),continuation:Jd.optional()}),Iy=U.enum(["acp"]),_y=U.enum(["builder","desktop","e2e"]),Cy=U.object({batchId:U.string(),tasks:U.array(Kd).min(1).max(20)}),Vd=U.object({inputTokens:U.number(),outputTokens:U.number(),costUsd:U.number().optional()}),Xd=U.object({status:U.enum(["passed","failed","skipped"]),commandDigest:U.string().regex(/^[a-f0-9]{64}$/).optional(),candidateRevision:U.string().regex(/^[a-f0-9]{40,64}$/).optional(),scopeRevision:U.string(),source:U.enum(["configured","candidate-discovery"]),port:U.number().int().min(1).max(65535).nullable()}),Yd=U.object({startup:Xd.optional(),status:U.enum(["passed","failed","skipped"]),commandDigest:U.string().regex(/^[a-f0-9]{64}$/).optional(),scopeRevision:U.string(),candidateRevision:U.string().regex(/^[a-f0-9]{40,64}$/).optional()}),Zd=["succeeded","failed","incomplete"],$y=U.object({taskId:U.string(),status:U.enum(["success","failed"]),checkEvidence:Yd.optional(),baseSha:U.string().regex(/^[a-f0-9]{40}$/).optional(),preCodingSha:U.string().regex(/^[a-f0-9]{40}$/).optional(),cost:Vd.optional(),model:U.string().optional(),error:U.string().optional(),answer:U.string().optional(),nativeUsage:zd.optional(),availableModels:Ea.optional(),failureKind:U.enum(["auth","usage_limit"]).optional(),resetsAt:U.string().datetime().optional(),rateLimits:U.array(U.object({window:U.string(),usedPercent:U.number().min(0).max(100),resetsAt:U.string().optional()})).optional(),outcome:U.enum(Zd).optional()});var tp=new Set([5901,6080,22222,22223]),Yo=ve.number().int().min(1024).max(65535).refine((d)=>!tp.has(d),{message:"That port is reserved by the environment's terminal or desktop"}),gn=ve.string().min(1).max(1e4),Xo=ve.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/),np=ve.union([ve.object({run:gn}).strict(),ve.object({workflow:ve.string().min(1).max(40)}).strict(),ve.object({wait:ve.object({port:Yo}).strict()}).strict()]),rp=ve.object({mode:ve.enum(["sequential","parallel"]),steps:ve.array(np).min(1).max(50)}).strict(),fn=ve.object({schema:ve.literal(1),hlix:ve.object({workspace:ve.string().min(1).max(200),project:ve.string().min(1).max(200).optional(),api:ve.string().url().max(300).optional()}).strict().optional(),project:ve.object({name:ve.string().min(1).max(100).optional(),brief:ve.string().max(5000).optional(),stack:ve.string().min(1).max(200).optional(),branchPrefix:ve.string().refine(ja,"Use a branch prefix of letters, digits, _ and -, up to 20 characters").optional()}).strict().optional(),coder:ve.object({harness:ve.enum(Rr).optional(),model:ve.string().min(1).max(200).optional(),memoryTokens:ve.number().int().min(1).max(2000000).optional(),maskToolOutputs:ve.union([ve.boolean(),ve.number().int().min(1).max(2000000)]).optional(),yolo:ve.boolean().optional()}).strict().optional(),machine:ve.object({size:Pa.optional(),toolchain:Jo.optional(),apt:ve.array(ve.string().min(1).max(200)).max(64).optional(),services:ve.array(Ko).max(3).optional(),setup:gn.optional()}).strict().optional(),workflows:ve.record(ve.string().min(1).max(40),rp).optional(),ports:ve.array(ve.object({name:ve.string().min(1).max(40),port:Yo,primary:ve.boolean().optional()}).strict()).max(10).optional(),commands:ve.object({verify:gn.optional(),preview:ve.object({command:gn,port:Yo}).strict().optional(),deploy:ve.discriminatedUnion("kind",[ve.object({kind:ve.literal("server"),start:gn}).strict(),ve.object({kind:ve.literal("static"),build:gn,outDir:ve.string().min(1).max(2000)}).strict()]).optional()}).strict().optional(),env:ve.object({required:ve.array(Xo).max(200).optional(),public:ve.record(Xo,ve.string().max(1e4)).optional()}).strict().optional(),team:ve.object({agents:ve.array(qo).max(8).optional(),notes:ve.array(ve.string().max(2000)).max(100).optional()}).strict().optional(),intake:ve.object({github:ve.boolean().optional(),linear:ve.boolean().optional()}).strict().optional(),local:ve.object({runtime:ve.enum(["cloud","local","docker"]).optional(),image:ve.string().min(1).max(300).optional(),setup:gn.optional()}).strict().optional(),providers:ve.array(ve.object({name:ve.string().min(1).max(80),url:ve.string().url().max(300),models:ve.array(ve.string().min(1).max(200)).min(1).max(100),apiKeyEnv:Xo.optional(),apiKey:ve.string().min(1).max(2000).optional()}).strict()).max(20).optional()}).strict(),op=`# Project setup for Hlix.
7
+ # Commit this file. Secret values belong in the environment, not here.
8
+ `,Zo="https://server.hlix.ai";function Hr(d){return d.replace(/\/+$/,"")===Zo}function Qo(d){if(!d||Hr(d))return;return d}function _n(d){if(d.length>262144)return{ok:!1,issues:[{path:"(file)",message:"hlix.yml is over 256 KB."}]};let u;try{u=Qd(d,{uniqueKeys:!0})}catch(I){return{ok:!1,issues:[{path:"(file)",message:I instanceof Error?I.message:"Could not read YAML."}]}}if(u.length!==1)return{ok:!1,issues:[{path:"(file)",message:"hlix.yml must contain one document."}]};let f=u[0];if(f.errors.length)return{ok:!1,issues:f.errors.map((I)=>({path:"(file)",message:I.message}))};let v=!1;if(Ra(f,{Alias(){return v=!0,Ra.BREAK}}),v)return{ok:!1,issues:[{path:"(file)",message:"YAML aliases are not allowed."}]};let j=fn.safeParse(f.toJS());if(!j.success)return{ok:!1,issues:lp(j.error)};let P=Fa(j.data);if(P.length)return{ok:!1,issues:P};return{ok:!0,file:j.data}}function Na(d,u){let f=fn.parse(La(d,u)),v=Fa(f);if(v.length)throw Error(v.map((j)=>`${j.path}: ${j.message}`).join("; "));return f}function Vt(d){let u=d.machine?.setup??rr(d,"setup",[]),f=d.commands?.verify??rr(d,"verify",[]),v=d.commands?.preview??ip(d),j=Vo.parse({agents:d.team?.agents,toolchain:d.machine?.toolchain,aptPackages:d.machine?.apt,setup:u,services:d.machine?.services,envOverrides:d.env?.public,verifyCommand:f,preview:v,notes:d.team?.notes}),P=d.intake&&(d.intake.github!==void 0||d.intake.linear!==void 0)?{github:d.intake.github,linear:d.intake.linear}:void 0;return{name:d.project?.name,stack:d.project?.stack,brief:d.project?.brief,branchPrefix:d.project?.branchPrefix,sandboxSize:d.machine?.size,verifyCommand:f,previewCommand:v?.command,previewPort:v?.port,intake:sp(P),requiredEnv:d.env?.required??[],runtime:j,binding:{workspaceId:d.hlix?.workspace,projectId:d.hlix?.project,apiUrl:d.hlix?.api,harness:d.coder?.harness,model:d.coder?.model,memoryTokens:d.coder?.memoryTokens===void 0?void 0:String(d.coder.memoryTokens),maskToolOutputs:d.coder?.maskToolOutputs===void 0?void 0:String(d.coder.maskToolOutputs),yolo:d.coder?.yolo===void 0?void 0:d.coder.yolo?"true":"false",sandbox:d.local?.runtime,dockerImage:d.local?.image}}}function Ur(d){let u={schema:1};if(d.hlix){let f=Qo(d.hlix.api);u.hlix={workspace:d.hlix.workspace,...f?{api:f}:{},...d.hlix.project?{project:d.hlix.project}:{}}}if(d.name||d.stack)u.project={name:d.name,stack:d.stack};if(d.setup||d.toolchain)u.machine={setup:d.setup,toolchain:d.toolchain};if(d.verify||d.previewCommand&&d.previewPort)u.commands={verify:d.verify,preview:d.previewCommand&&d.previewPort?{command:d.previewCommand,port:d.previewPort}:void 0};if(d.workflows&&Object.keys(d.workflows).length)u.workflows=d.workflows;if(d.requiredEnv?.length)u.env={required:d.requiredEnv};return fn.parse(Mr(u))}function or(d,u=op){let f=ep(Mr(d),{lineWidth:0}).trimEnd();return`${u}${f}
9
+ `}function sp(d){if(!d)return;let u={};if(d.github!==void 0)u.github=d.github;if(d.linear!==void 0)u.linear=d.linear;return Object.keys(u).length?u:void 0}function ip(d){let u=rr(d,"preview",[]),f=d.ports?.find((v)=>v.primary)?.port??d.ports?.[0]?.port;if(!u||f===void 0)return;return{command:u,port:f}}function ap(d){return`timeout 60 bash -c 'until (echo >/dev/tcp/127.0.0.1/${d}) 2>/dev/null; do sleep 0.25; done'`}function cp(d){let u=d.map((j,P)=>`( ${j} ) & p${P}=$!`),f=d.map((j,P)=>`wait $p${P}; s${P}=$?`),v=d.map((j,P)=>`s${P}`).join("||");return`( ${u.join("; ")}; ${f.join("; ")}; exit $(( ${v} )) )`}function rr(d,u,f){if(f.includes(u))throw Error(`workflows.${u} refers to itself.`);if(f.length>=3)throw Error(`workflows.${u} is nested more than 3 levels deep.`);let v=d.workflows?.[u];if(!v){if(f.length===0)return;throw Error(`workflows.${u} does not exist.`)}let j=[];for(let P of v.steps)if("run"in P)j.push(P.run);else if("workflow"in P){let I=rr(d,P.workflow,[...f,u]);if(I)j.push(I)}else j.push(ap(P.wait.port));if(!j.length)return;return v.mode==="parallel"?cp(j):j.join(" && ")}function Fa(d){try{for(let u of Object.keys(d.workflows??{}))rr(d,u,[])}catch(u){return[{path:"workflows",message:u instanceof Error?u.message:"Invalid workflow."}]}return[]}function lp(d){return d.issues.map((u)=>{let f="keys"in u&&Array.isArray(u.keys)?u.keys.map(String):[];return{path:[...u.path.map(String),...f].join(".")||"(file)",message:u.message}})}function Lr(d){return Boolean(d)&&typeof d==="object"&&!Array.isArray(d)}function La(d,u){if(Array.isArray(u)||!Lr(u)||!Lr(d))return u;let f={...d};for(let[v,j]of Object.entries(u))f[v]=v in d?La(d[v],j):j;return f}function Mr(d){if(Array.isArray(d))return d.map(Mr);if(!Lr(d))return d;let u={};for(let[f,v]of Object.entries(d)){if(v===void 0)continue;let j=Mr(v);if(Lr(j)&&Object.keys(j).length===0)continue;u[f]=j}return u}var Ma=["hlix.yml","hlix.yaml"],Cn=["hlix.local.yml","hlix.local.yaml"];var dp=/-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----|npm_[A-Za-z0-9]{30,}|gh[opusr]_[A-Za-z0-9_]{30,}|glpat-[A-Za-z0-9_-]{20,}|AKIA[0-9A-Z]{16}|AIza[0-9A-Za-z_-]{30,}|(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{16,}|xox[baprs]-[A-Za-z0-9-]{20,}/,pp=/\.(?:json|ya?ml|toml|ini|conf|config)$/i,up=/(?:^|[,{\s])(?:["']?(?:api[_-]?key|access[_-]?token|auth(?:orization)?|client[_-]?secret|password|private[_-]?key|secret|token)["']?)\s*(?::|=)\s*["']?(?!\$\{|process\.env|import\.meta\.env|os\.(?:getenv|environ\.get)|<|replace|example|changeme)[A-Za-z0-9+/_=.:-]{12,}/im;function sr(d,u){return dp.test(u)||pp.test(d)&&up.test(u)}var yp=Cn;function p(d){let u=Ua(d,Ma),f=Ua(d,Cn);if(u&&"error"in u)return{file:null,base:null,local:null,baseName:null,error:u.error};if(f&&"error"in f)return{file:null,base:null,local:null,baseName:null,error:f.error};let v=u?.name??null,j=f?.name??null,P=v?Da(d,v):{file:null,error:null},I=j?Da(d,j):{file:null,error:null},C=P.error??I.error;if(C||!P.file)return{file:P.file,base:P.file,local:I.file,baseName:v,error:C};try{return{file:I.file?Na(P.file,I.file):P.file,base:P.file,local:I.file,baseName:v,error:null}}catch(T){let R=T instanceof Error?T.message:"Could not merge hlix.local.yml.";return{file:null,base:P.file,local:I.file,baseName:v,error:R}}}function N(d){if(!d)return null;let u=Vt(d).binding;if(!u.workspaceId)return null;return{schemaVersion:1,workspaceId:u.workspaceId,apiUrl:u.apiUrl??Zo,projectId:u.projectId,sandbox:u.sandbox,dockerImage:u.dockerImage,memoryTokens:u.memoryTokens,maskToolOutputs:u.maskToolOutputs,harness:Sp(u.harness),model:u.model,yolo:u.yolo}}function Fe(d,u){ce(d,(f)=>{let v={...f.local},j=!1;if(!f.local?.runtime&&u.sandbox)v.runtime=u.sandbox,j=!0;if(!f.local?.image&&u.dockerImage)v.image=u.dockerImage,j=!0;let P={...f.coder},I=!1;if(!f.coder?.harness&&u.harness)P.harness=u.harness,I=!0;if(!f.coder?.model&&u.model)P.model=u.model,I=!0;if(f.coder?.memoryTokens===void 0&&u.memoryTokens){let C=Number(u.memoryTokens);if(Number.isInteger(C)&&C>=20000&&C<=2000000)P.memoryTokens=C,I=!0}if(f.coder?.yolo===void 0&&(u.yolo==="true"||u.yolo==="false"))P.yolo=u.yolo==="true",I=!0;if(!j&&!I)return f;return{...f,...j?{local:v}:{},...I?{coder:P}:{}}})}function He(d){if(d.error)return d.error;if(d.baseName)return d.baseName;return"will write hlix.yml"}async function ie(d){let u=Xt(d,".gitignore"),f=es(u)?await hp(u,"utf8"):"",v=yp.filter((P)=>!jp(f,P));if(!v.length)return;let j=f.length===0||f.endsWith(`
10
+ `)?"":`
11
+ `;rs(u),ns(u,`${f}${j}${v.join(`
12
+ `)}
13
+ `,{mode:420})}function ae(d,u){let f=p(d);if(f.error)throw Error(f.error);if(f.base)return{written:!1,file:f.base};let v=Ur(u),j=Xt(d,"hlix.yml");return rs(j),ns(j,or(v),{mode:420}),{written:!0,file:v}}function ce(d,u){let f=p(d);if(f.error)throw Error(f.error);let v=f.base??{schema:1},j=u(v),P=f.baseName??"hlix.yml",I=Xt(d,P);if(f.base&&j===v)return{path:I,name:P,file:v,changed:!1};let C=or(j),T=_n(C);if(!T.ok)throw Error(T.issues.map((R)=>`${R.path}: ${R.message}`).join("; "));return rs(I),ns(I,C,{mode:420}),{path:I,name:P,file:T.file,changed:!0}}function le(d,u){let f=ce(d,(v)=>{let j=u.project??v.hlix?.project,P=v.hlix?.api&&Hr(v.hlix.api)&&Hr(u.api)?v.hlix.api:Qo(u.api),I={workspace:u.workspace,...P?{api:P}:{},...j?{project:j}:{}};if(v.hlix?.workspace===I.workspace&&v.hlix?.api===I.api&&v.hlix?.project===I.project)return v;return{...v,hlix:I}});return{path:f.path,name:f.name,changed:f.changed}}function Ue(d){let u=p(d);if(u.error||!u.baseName)return null;return Xt(d,u.baseName)}var wp=new Set([5901,6080,22222,22223]),vp=new Set(["setup","preview","verify","deploy"]);function de(d,u){return{verify:u?.commands.verifyCommand,packageManager:u?.commands.packageManager??null,scripts:bp(d),toolchain:u?.toolchain}}function bp(d){try{let u=JSON.parse(ts(Xt(d,"package.json"),"utf8"));if(!u.scripts||typeof u.scripts!=="object"||Array.isArray(u.scripts))return{};return Object.fromEntries(Object.entries(u.scripts).filter((f)=>typeof f[1]==="string"))}catch{return{}}}function Ha(d){let u={};for(let f of["node","python","bun"]){let v=d?.[f];if(typeof v==="string"&&v.trim())u[f]=v.trim()}return u}function kp(d,u){if(!u)return;let f={};for(let[v,j]of Object.entries(d)){if(!j.trim()||/infisical|\.env\b|secret/i.test(`${v}
14
+ ${j}`))continue;let P=/^dev:([A-Za-z][\w-]{0,30})$/.exec(v)?.[1],I=P??(v==="build"||v==="typecheck"?v:null);if(!I||vp.has(I)||I.length>40)continue;if(P&&d.dev&&j.trim()===d.dev.trim())continue;f[I]={mode:"sequential",steps:[{run:`${u} run ${v}`}]}}return Object.keys(f).length?f:void 0}function W(d,u,f,v){let j=d.install.map((T)=>T.trim()).filter(Boolean).join(`
15
+ `),P=d.ports.find((T)=>T.port>=1024&&T.port<=65535&&!wp.has(T.port))?.port,I=d.start&&P?d.start:void 0,C={...Ha(d.toolchain),...Ha(v?.toolchain)};return{name:f?.name,stack:f?.stack,setup:j||void 0,verify:v?.verify||void 0,previewCommand:I,previewPort:I?P:void 0,toolchain:Object.keys(C).length?C:void 0,workflows:kp(v?.scripts??{},v?.packageManager??null),requiredEnv:d.requiredSecretKeys,hlix:u}}function ue(d,u){let f=Xt(d.root,u);if(!es(f))return;let v=ts(f),j=fp(f),P=mp("sha256").update(v).digest("hex"),I=v.toString("utf8"),C=d.protectedFiles.find((R)=>R.path===u);if(C||sr(u,I)){let R=v.toString("base64");if(C)C.contentBase64=R;else d.protectedFiles.push({path:u,kind:"detected-content",contentBase64:R});let F=C&&(C.kind==="dotenv"||C.kind==="credential"||C.kind==="detected-content")?C.kind:"detected-content",L=d.manifest.secretFiles.find((X)=>X.path===u);if(L)L.size=j.size,L.sha256=P;else d.manifest.secretFiles.push({path:u,kind:F,keys:[],size:j.size,sha256:P});let H=d.manifest.files.findIndex((X)=>X.path===u);if(H>=0){let X=d.manifest.files[H];d.manifest.totals.files-=1,d.manifest.totals.bytes-=X.size,d.manifest.files.splice(H,1)}return}let T=d.manifest.files.find((R)=>R.path===u);if(!T){d.manifest.files.push({path:u,size:j.size,sha256:P,tracked:!1,executable:!1}),d.manifest.totals.files+=1,d.manifest.totals.bytes+=j.size;return}d.manifest.totals.bytes+=j.size-T.size,T.size=j.size,T.sha256=P}function rs(d){try{if(gp(d).isSymbolicLink())throw Error(`Refusing to write through a symlink: ${d}`)}catch(u){if(u.code==="ENOENT")return;throw u}}var xp=["claude-code","codex","opencode","goose","qwen-code","pi","hlix"];function Ua(d,u){let f=u.filter((P)=>es(Xt(d,P))),[v,j]=f;if(v&&j)return{error:`${f.join(" and ")} both exist. Keep one.`};return v?{name:v}:null}function Sp(d){return xp.find((u)=>u===d)}function Da(d,u){let f=_n(ts(Xt(d,u),"utf8"));if(!f.ok){let v=f.issues.map((j)=>`${j.path}: ${j.message}`).join("; ");return{file:null,error:`${u} ${v}`}}return{file:f.file,error:null}}function jp(d,u){return d.split(/\r?\n/).some((f)=>f.trim()===u)}function M(d){if(!d.credential)return null;if(d.credentialSource==="session")return"session (desktop)";if(d.credentialSource==="env")return"environment (HLIX_API_KEY)";return`file (${d.credentialPath})`}function n(d){let u=Ba(d);for(;;){let f=p(u);if(f.error)throw new e("invalid_project_file",f.error);let v=N(f.file);if(v?.workspaceId&&v.apiUrl)return{root:u,config:v};let j=Wa(u);if(j===u)return null;u=j}}function os(d){let u=Ba(d);for(;;){let f=p(u);if(f.error)throw new e("invalid_project_file",f.error);if(f.base)return{root:u,loaded:f};let v=Wa(u);if(v===u)return null;u=v}}function za(d){try{return Pp(d).isDirectory()}catch{return!1}}function Dr(d){if(typeof d!=="string")return;let u=d.trim();return u?u:void 0}var Ga=(d,u)=>d.replace(/\/+$/,"")===u.replace(/\/+$/,"");function o(d){let{env:u,flags:f,cwd:v}=d,j=n(v),P=G(u),I=P?u.HLIX_API_KEY?"env":u.HLIX_SESSION_TOKEN?"session":"file":null,C=I==="file"?P:null,T=Dr(f["base-url"]),R=Dr(u.HLIX_BASE_URL),F=Dr(f.workspace),L=Dr(u.HLIX_WORKSPACE_ID),H=T??R??j?.config.apiUrl??C?.baseUrl??In,X=T?"flag":R?"env":j?.config.apiUrl?"project":C?.baseUrl?"credential":"default",D=F??L??j?.config.workspaceId??C?.organizationId??null,B=F?"flag":L?"env":j?.config.workspaceId?"project":C?.organizationId?"credential":null;return{baseUrl:H,baseUrlSource:X,workspaceId:D,workspaceSource:B,credential:P,credentialSource:I,credentialPath:Ot(u),binding:j,conflict:Ep(j,{flagBaseUrl:T,envBaseUrl:R,flagWorkspace:F,envWorkspace:L})}}function Ep(d,u){if(!d)return null;let f=`${d.root} is bound to`,v="Drop the override, or point --cwd at a folder bound to it.";if(u.flagWorkspace&&u.flagWorkspace!==d.config.workspaceId)return`${f} workspace ${d.config.workspaceId}, but --workspace names ${u.flagWorkspace}. ${v}`;if(u.envWorkspace&&u.envWorkspace!==d.config.workspaceId)return`${f} workspace ${d.config.workspaceId}, but HLIX_WORKSPACE_ID names ${u.envWorkspace}. ${v}`;if(u.flagBaseUrl&&!Ga(u.flagBaseUrl,d.config.apiUrl))return`${f} ${d.config.apiUrl}, but --base-url names ${u.flagBaseUrl}. ${v}`;if(u.envBaseUrl&&!Ga(u.envBaseUrl,d.config.apiUrl))return`${f} ${d.config.apiUrl}, but HLIX_BASE_URL names ${u.envBaseUrl}. ${v}`;return null}var Ip=/\x1b(?:\[[0-?]*[ -/]*[@-~]?|\][^\x07\x1b]*(?:\x07|\x1b\\)?|[PX^_][^\x1b]*(?:\x1b\\)?|[\x20-\x7e]?)|\x9b[0-?]*[ -/]*[@-~]?/g,_p=/[\x00-\x08\x0b-\x1f\x7f-\x9f]/g,Cp=/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/g,$p=/(?<![\p{Extended_Pictographic}\p{Emoji_Modifier}\uFE0F])\u200D|\u200D(?!\p{Extended_Pictographic})|[^\P{Cf}\u200D]/gu,Ap=/[\u2028\u2029]/g;function t(d,u={}){return d.replace(Ip,"").replace(u.carriageReturn?Cp:_p,"").replace($p,"").replace(Ap,`
16
+ `)}var qa="hlix-desktop";async function Op(d,u,f){let v=u.map((C)=>C.id);if(f){if(!v.includes(f))throw new e("workspace_mismatch",u.length===0?`This account is not a member of any workspace, including ${f}.`:`This account cannot act in workspace ${f}. Available: ${v.join(", ")}.`);return f}if(u.length===0)throw new e("workspace_required","This account is not a member of any workspace. Create or join one first.");let j=u[0];if(j&&u.length===1)return d.stderr(`Using your only workspace: ${j.name} (${j.id})
17
+ `),j.id;if(d.json||!d.promptChoice)throw new e("missing_argument",`--workspace is required here: this account can act in ${u.length} workspaces. Pass one of: ${v.join(", ")}.`);let P=Math.max(...u.map((C)=>C.name.length));d.stderr(`${u.map((C,T)=>` ${T+1}) ${C.name.padEnd(P)} ${C.slug} ${C.role} ${C.id}`).join(`
18
+ `)}
19
+ `);let I=await d.promptChoice(`Workspace [1-${u.length}]: `,u.length);return v[I]}function ss(d){let u=new URL(d),f=u.hostname==="localhost"||u.hostname==="127.0.0.1"||u.hostname==="::1";if(u.protocol!=="https:"&&!(u.protocol==="http:"&&f))throw new e("invalid_base_url","--base-url must use HTTPS (HTTP is allowed only for localhost).")}function _(d){let u;try{let j=new URL(d);if(j.protocol!=="https:"&&j.protocol!=="http:")return;u=j.href}catch{return}let[f,v]=process.platform==="darwin"?["open",[u]]:process.platform==="win32"?["rundll32.exe",["url.dll,FileProtocolHandler",u]]:["xdg-open",[u]];try{let j=Tp(f,v,{stdio:"ignore",detached:!0});j.on("error",()=>{}),j.unref()}catch{}}async function is(d,u){let{baseUrl:f,credential:v}=u,j=new mn({baseUrl:f,credential:v,retry:{attempts:1}}),P=await Op(d,await j.workspaces.list(),u.requested);if(await new mn({baseUrl:f,credential:v,organizationId:P,retry:{attempts:1}}).projects.list(),d.signal?.aborted)throw new e("cancelled","Login cancelled.");let I=ba(v.kind==="bearer"?{baseUrl:f,apiKey:"",sessionToken:v.token,organizationId:P}:{baseUrl:f,apiKey:v.kind==="apiKey"?v.apiKey:"",organizationId:P},d.env);return{baseUrl:f,organizationId:P,path:I}}async function as(d,u){ss(u.baseUrl);let f;try{let v=d.signal?{signal:d.signal}:{},j=await Fo({baseUrl:u.baseUrl,clientId:qa,...v});d.stderr(`Sign in to Hlix in your browser:
20
+ ${t(j.verificationUriComplete)}
21
+ and confirm the code: ${t(j.userCode)}
22
+ Waiting for approval…
23
+ `),d.openUrl?.(j.verificationUriComplete),f=await Lo({baseUrl:u.baseUrl,clientId:qa,code:j,...v})}catch(v){if(!(v instanceof Tt))throw v;if(v.reason==="denied")throw new e("login_denied",v.message);if(v.reason==="expired")throw new e("login_expired",v.message);if(v.reason==="cancelled")throw new e("cancelled",v.message);throw new e("login_failed",v.message)}return is(d,{baseUrl:u.baseUrl,credential:jn(f),requested:u.requested})}var Rp="Run `hlix login`, or set HLIX_API_KEY for CI.";async function k(d,u){let f=o({env:d.env,flags:u.flags,cwd:u.cwd});if(f.conflict)return;let v=f.credential;if(v){if(!u.verify)return;try{await new mn({baseUrl:f.baseUrl,credential:v.sessionToken?jn(v.sessionToken):an(v.apiKey),retry:{attempts:1}}).workspaces.list();return}catch(I){if(!(I instanceof cn))throw I;if(f.credentialSource!=="file"||d.json||!d.promptChoice)throw I;d.stderr(`Your stored credential was rejected — signing in again.
24
+ `)}}else{if(d.json||!d.promptChoice)throw new e("unauthenticated",`Not signed in. ${Rp}`);d.stderr(`Not signed in — starting the browser login.
25
+ `)}let j=f.workspaceSource==="credential"?void 0:f.workspaceId??void 0,P=await as(d,{baseUrl:f.baseUrl,requested:j});d.stderr(`Signed in to ${P.baseUrl}
26
+ `)}var dt=1,_e=(d,u)=>({schemaVersion:1,command:d,data:u}),ir=(d,u)=>({schemaVersion:1,command:d,error:u});function xe(d){return`${JSON.stringify(d,null,2)}
27
+ `}function at(d){let u=Math.max(0,...d.map(([f])=>f.length));return d.map(([f,v])=>`${f.padEnd(u)} ${v}`).join(`
28
+ `)}function Dt(d,u){let f=d.map((j,P)=>Math.max(j.length,...u.map((I)=>(I[P]??"").length))),v=(j)=>j.map((P,I)=>P.padEnd(f[I])).join(" ").trimEnd();return[v(d),v(f.map((j)=>"-".repeat(j))),...u.map(v)].join(`
29
+ `)}function ke(d){if(d instanceof e)return{code:d.code,status:null};if(d instanceof Pn)return{code:"invalid_request",status:400};if(d instanceof Xn)return{code:"bad_request",status:400};if(d instanceof cn)return{code:"unauthenticated",status:401};if(d instanceof A)return{code:"forbidden",status:403};if(d instanceof h)return{code:"not_found",status:404};if(d instanceof ln)return{code:"conflict",status:409};if(d instanceof dn)return{code:"rate_limited",status:429};if(d instanceof Yn)return{code:"not_implemented",status:501};if(d instanceof pn)return{code:"server_error",status:d.status};if(d instanceof St)return{code:"unreachable",status:null};return{code:"unknown",status:null}}var Gr=(d)=>{if(d instanceof Pn&&d.issues.length>0){let u=d.issues.map((f)=>{let v=f;return` - ${Array.isArray(v.path)&&v.path.length>0?`${v.path.join(".")}: `:""}${typeof v.message==="string"?v.message:JSON.stringify(f)}`});return`${d.message}
30
+ ${u.join(`
31
+ `)}`}return d instanceof Error?d.message:String(d)};function r(d,u){let f=o({env:d,flags:u.flags,cwd:u.cwd});if(f.conflict)throw new e("workspace_mismatch",f.conflict);if(!f.credential)throw new e("unauthenticated","No credential. Run `hlix login`, or set HLIX_API_KEY for CI.");return new mn({baseUrl:f.baseUrl,credential:f.credential.sessionToken?jn(f.credential.sessionToken):an(f.credential.apiKey),...f.workspaceId?{organizationId:f.workspaceId}:{}})}function Ja(d){let u=Math.max(...d.map((v)=>v.name.length));return`hlix — the hlix control-plane CLI
32
+
33
+ Usage:
34
+ hlix <command> [options]
35
+
36
+ Commands:
37
+ ${[` hlix ${"".padEnd(u)} Open Hlix Code (interactive)`,...d.map((v)=>` hlix ${v.name.padEnd(u)} ${v.summary}`)].join(`
38
+ `)}
39
+
40
+ Options:
41
+ --json Machine-readable output (a versioned, stable contract)
42
+ --cwd <dir> Operate on another directory instead of the current one
43
+ --workspace <id> Workspace to act in, overriding the folder's binding
44
+ --base-url <url> API to talk to, overriding the folder's binding
45
+ --help Show this help
46
+ --version Show the installed CLI version
47
+
48
+ Hlix Code (hlix with no command):
49
+ --sandbox <choice> cloud (Cloud Machine), docker (Docker container), or local
50
+ (local environment); --local is short for --sandbox local
51
+ --docker-image <r> image the Docker container runs in
52
+ --harness <name> which coder does the work
53
+ --project <id> project to act in, when this folder is not bound
54
+ -p "<prompt>" one turn, print the answer, exit
55
+ --json with -p: one JSON object per event instead of prose
56
+ --allow-writes with -p: let the turn change files and run commands
57
+ --yolo approve every tool call for the whole session
58
+
59
+ A command targets the workspace named by, in order: an explicit flag, the
60
+ HLIX_* environment, the nearest hlix.yml, then the stored credential.
61
+ Run \`hlix status\` to see which one applied.
62
+ `}function Va(d,u){let f=[...Array(u.length+1).keys()];for(let v=1;v<=d.length;v+=1){let j=[v];for(let P=1;P<=u.length;P+=1)j[P]=Math.min(f[P]+1,j[P-1]+1,f[P-1]+(d[v-1]===u[P-1]?0:1));f=j}return f[u.length]}function Lp(d,u,f){let v=/Unknown option '--([^'=]+)/.exec(f)?.[1];if(!v)return f;let j=u.findIndex((T)=>T.startsWith("-")),P=j===-1?u:u.slice(0,j),I=new Set(["json","help","version","cwd","workspace","base-url",...Wr(d,P)?.command.options??[]]),C=null;for(let T of I){let R=Va(v,T);if(R<=2&&(!C||R<C.distance))C={name:T,distance:R}}return C?`${f}
63
+ Did you mean --${C.name}?`:f}function Ka(d,u){let f=new Set;for(let P of d)f.add(P.name),f.add(P.name.split(" ")[0]);let v=null;for(let P of f){let I=Va(u,P);if(I<=2&&(!v||I<v.distance))v={name:P,distance:I}}if(!v)return null;if(d.some((P)=>P.name===v.name))return v.name;let j=d.filter((P)=>P.name.startsWith(`${v.name} `)).sort((P,I)=>P.name.length-I.name.length)[0];return j?j.name:v.name}function Wr(d,u){for(let f of[...d].sort((v,j)=>j.name.length-v.name.length)){let v=f.name.split(" ");if(v.every((j,P)=>u[P]===j))return{command:f,rest:u.slice(v.length)}}return null}function Mp(d,u,f){let v=Lp(d,u,f);if(!/^Unknown option '/.test(f))return v;let j=v.replace(/\. To specify a positional argument[\s\S]*?after '--'[^\n]*/,"."),P=Wr(d,u.filter((I)=>!I.startsWith("-")));return P?`${j}
64
+
65
+ ${P.command.usage}`:j}async function m(d,u,f){let v=u.findIndex((ye)=>ye==="--api-key"||ye.startsWith("--api-key=")),j=u[v+1];if(v!==-1&&(u[v].includes("=")||j!==void 0&&!j.startsWith("-")))return f.stderr("error: API keys are never accepted as command-line arguments. Run `hlix login --api-key` and enter it at the hidden prompt, or pipe it in.\n"),2;let P;try{P=Fp({args:u,allowPositionals:!0,strict:!0,options:{json:{type:"boolean"},help:{type:"boolean"},version:{type:"boolean"},cwd:{type:"string"},"base-url":{type:"string"},workspace:{type:"string"},"dry-run":{type:"boolean"},"no-connect-origin":{type:"boolean"},attach:{type:"boolean"},print:{type:"boolean"},web:{type:"boolean"},"env-file":{type:"string"},include:{type:"string"},history:{type:"string"},name:{type:"string"},stack:{type:"string"},status:{type:"string"},project:{type:"string"},yes:{type:"boolean"},global:{type:"boolean"},org:{type:"boolean"},title:{type:"string"},description:{type:"string"},force:{type:"boolean"},runtime:{type:"string"},duty:{type:"string"},profile:{type:"string"},server:{type:"string"},"allow-stdio":{type:"boolean"},source:{type:"string"},format:{type:"string"},out:{type:"string"},"from-stdin":{type:"boolean"},once:{type:"boolean"},"api-key":{type:"boolean"}}})}catch(ye){let Oe=u.includes("--json"),oe=Mp(d,u,Gr(ye));if(f.onFailure?.({code:"invalid_usage",message:oe,status:null}),Oe)f.stdout(xe(ir("cli",{code:"invalid_usage",message:oe,status:null})));else f.stderr(`${oe}
66
+ `);return 2}let I=P.values.json===!0,C=P.positionals;if(P.values.version===!0){let{version:ye}=await import("./package-kttrhq89.js");return f.stdout(`${ye}
67
+ `),0}if(C.length===0||P.values.help===!0){let ye=Wr(d,C);return f.stdout(ye?`${ye.command.usage}
68
+ `:Ja(d)),C.length===0&&P.values.help!==!0?1:0}let T=Wr(d,C);if(!T){let ye=C.join(" "),Oe=Ka(d,ye)??Ka(d,C[0]),oe=Oe?`Unknown command: ${ye}
69
+ Did you mean \`hlix ${Oe}\`?`:`Unknown command: ${ye}`;if(f.onFailure?.({code:"unknown_command",message:oe,status:null}),I)f.stdout(xe(ir(ye,{code:"unknown_command",message:oe,status:null})));else f.stderr(`${oe}
70
+
71
+ ${Ja(d)}`);return 2}let R=new Set(["json","help","version","cwd","workspace","base-url"]),F=new Set(T.command.options??[]),L=Object.entries(P.values).filter(([ye,Oe])=>Oe!==void 0&&!R.has(ye)&&!F.has(ye)).map(([ye])=>`--${ye}`),H=T.command.args??{min:0,max:0},X=T.rest.length<H.min?{code:"missing_argument",message:T.command.usage.split(`
72
+ `)[0]}:T.rest.length>H.max?{code:"invalid_usage",message:T.command.usage.split(`
73
+ `)[0]}:null,D=typeof P.values.cwd==="string"?P.values.cwd:void 0,B=Np(D??"."),Z=D!==void 0&&!za(B)?{code:"invalid_usage",message:`--cwd is not a directory: ${B}`}:null,Q=L.length>0?{code:"invalid_usage",message:`Unsupported option for ${T.command.name}: ${L.join(", ")}`}:Z??X;if(Q){if(f.onFailure?.({...Q,status:null}),I)f.stdout(xe(ir(T.command.name,{...Q,status:null})));else{let ye=T.command.usage.startsWith(Q.message)?T.command.usage:`${Q.message}
74
+
75
+ ${T.command.usage}`;f.stderr(`error: ${ye}
76
+ `)}return 2}let we=P.values,Te={...f,args:T.rest,json:I,flags:we,cwd:B,requireClient:(ye)=>r(f.env,{cwd:ye??B,flags:we})};try{if(T.command.signIn)await k(Te,{cwd:B,flags:we});return await T.command.run(Te)}catch(ye){let{code:Oe,status:oe}=ke(ye);if(f.onFailure?.({code:Oe,message:t(Gr(ye)),status:oe,...ye instanceof e&&ye.details!==void 0?{details:ye.details}:{}}),I)f.stdout(xe(ir(T.command.name,{code:Oe,message:Gr(ye),status:oe})));else if(f.stderr(`error: ${t(Gr(ye))}
77
+ `),process.env.HLIX_DEBUG&&ye instanceof Error&&ye.stack)f.stderr(`${ye.stack}
78
+ `);return Oe==="unauthenticated"||Oe==="forbidden"?3:1}}var Br={name:"auth login",summary:"Sign in through your browser and store the credential for this machine",usage:["Usage: hlix auth login [--workspace <id>] [--base-url <url>] [--api-key]",""," --base-url Defaults to HLIX_BASE_URL, else this folder's API, else the",` one you last signed in to, else ${In}`," --workspace Workspace (organization) id to act in. Optional: your"," workspaces are listed after you sign in, and the only one"," is taken automatically."," --api-key Sign in with an API key instead of the browser. The key is"," read from a hidden prompt, or from stdin when piped; it is"," never accepted as an argument.","","Opens your browser to approve a one-time code. For CI, set HLIX_API_KEY","and HLIX_WORKSPACE_ID in the environment instead. `hlix login` is the same command."].join(`
79
+ `),supportsJson:!0,options:["base-url","workspace","api-key"],agentTool:!1,async run(d){let u=typeof d.flags.workspace==="string"?d.flags.workspace:d.env.HLIX_WORKSPACE_ID,f=o({env:d.env,flags:d.flags,cwd:d.cwd}).baseUrl;ss(f);let v;if(d.env.HLIX_API_KEY||d.flags["api-key"]===!0){let j=(d.env.HLIX_API_KEY??(d.promptChoice?await d.readSecret?.("Hlix API key: "):await d.readStdin?.())??"").trim();if(!j)throw new e("missing_credential","No API key entered. Enter it at the hidden prompt, pipe it to `hlix auth login --api-key`, or set HLIX_API_KEY for CI.");v=await is(d,{baseUrl:f,credential:an(j),requested:u})}else{if(d.json||!d.promptChoice)throw new e("missing_credential","A browser login needs a terminal. Set HLIX_API_KEY for CI, or pipe a key to `hlix auth login --api-key`.");v=await as(d,{baseUrl:f,requested:u})}if(d.json)d.stdout(xe(_e(this.name,{baseUrl:v.baseUrl,organizationId:v.organizationId,credentialPath:v.path})));else d.stdout(`Signed in to ${v.baseUrl}
80
+ Credential stored at ${v.path}
81
+ `);return 0}},Xa={...Br,name:"login",usage:Br.usage.replace("hlix auth login","hlix login")},cs={name:"auth status",summary:"Show which credential is in use, where it came from, and whether it works",usage:["Usage: hlix auth status [--json]","","Names the SOURCE of the credential — the stored file, HLIX_API_KEY, or the","desktop app's own session when hlix was opened from its Terminal tab — and","verifies it against the API. The credential itself is never printed, not even","a prefix: machine output gets piped into logs."].join(`
82
+ `),supportsJson:!0,async run(d){let u=o({env:d.env,flags:d.flags,cwd:d.cwd});if(u.conflict)throw new e("workspace_mismatch",u.conflict);if(!u.credential)throw new e("unauthenticated","No credential. Run `hlix login`, or set HLIX_API_KEY for CI.");try{await d.requireClient().projects.list()}catch(v){throw d.stderr(`credential from ${u.credentialSource}, workspace ${u.workspaceId??"none"}, api ${u.baseUrl}
83
+ `),v}let f={credentialSource:u.credentialSource,credentialPath:u.credentialSource==="file"?u.credentialPath:null,baseUrl:u.baseUrl,baseUrlSource:u.baseUrlSource,workspaceId:u.workspaceId,workspaceSource:u.workspaceSource,valid:!0};if(d.json)return d.stdout(xe(_e(cs.name,f))),0;return d.stdout(`${at([["credential",M(u)??"none"],["api",`${u.baseUrl} (from ${u.baseUrlSource})`],["workspace",u.workspaceId?`${u.workspaceId} (from ${u.workspaceSource})`:"none"],["status","valid"]])}
84
+ `),0}},zr={name:"auth logout",summary:"Remove the stored credential from this machine",usage:["Usage: hlix auth logout [--yes] [--json]","","Removes ~/.config/hlix/credentials.json after confirming. A credential","supplied through HLIX_API_KEY is not removed — unset it in the shell that","set it — and neither is the desktop app's own session; sign out in the app."].join(`
85
+ `),supportsJson:!0,options:["yes"],async run(d){let u=o({env:d.env,flags:d.flags,cwd:d.cwd});if(u.credentialSource==="env"||u.credentialSource==="session"){let v=u.credentialSource==="session",j=v?"session":"environment",P=v?"This session belongs to the Hlix desktop app; sign out there to end it.":"HLIX_API_KEY is set in this environment; unset it there to sign out.",I=va(d.env);if(!I){let T={removed:!1,reason:j,path:null};if(d.json)d.stdout(xe(_e(this.name,T)));else d.stdout(`${P}
86
+ `);return 0}if(d.flags.yes!==!0){let T={removed:!1,reason:j,path:I};if(d.json)d.stdout(xe(_e(this.name,T)));else d.stdout(`${P}
87
+ A stored credential also exists at ${I} — repeat with --yes to remove it.
88
+ `);return 0}let C=Do(d.env);if(d.json)d.stdout(xe(_e(this.name,C)));else d.stdout(`Removed ${C.path}
89
+ ${v?"The desktop app's session is still in use; sign out there to finish.":"HLIX_API_KEY is still set in this environment; unset it there to finish signing out."}
90
+ `);return 0}if(d.flags.yes!==!0&&u.credential){if(d.json||!d.confirm)throw new e("approval_required","Removing the stored credential needs approval. Repeat with `--yes`.");if(!await d.confirm(`Remove the stored credential at ${u.credentialPath}? Signing back in takes \`hlix login\`.`))throw new e("cancelled","Logout cancelled.")}let f=Do(d.env);if(d.json)d.stdout(xe(_e(this.name,f)));else d.stdout(f.removed?`Removed ${f.path}
91
+ `:`No stored credential at ${f.path}
92
+ `);return 0}},Ya={...zr,name:"logout",usage:zr.usage.replace("hlix auth logout","hlix logout"),agentTool:!1};import{existsSync as qp,readFileSync as oc}from"node:fs";import{homedir as sc}from"node:os";import{join as ic}from"node:path";import{constants as qr,existsSync as ds,lstatSync as Jr,mkdirSync as Qa,openSync as Hp,closeSync as Za,fsyncSync as Up,readFileSync as ec,renameSync as Dp,unlinkSync as Gp,writeFileSync as ls}from"node:fs";import{dirname as Wp,join as $n,resolve as Kr}from"node:path";function tc(d){if(!ds(d))return;let u=Jr(d);if(u.isSymbolicLink()||!u.isFile())throw Error(`Refusing to replace a non-regular Hlix file: ${d}`)}function ps(d,u){let f=Wp(d);if(Qa(f,{recursive:!0,mode:448}),Jr(f).isSymbolicLink())throw Error(`Refusing to write through a symlinked Hlix directory: ${f}`);tc(d);let v=$n(f,`.hlix-${process.pid}-${crypto.randomUUID()}.tmp`),j;try{j=Hp(v,qr.O_WRONLY|qr.O_CREAT|qr.O_EXCL|qr.O_NOFOLLOW,384),ls(j,u.endsWith(`
93
+ `)?u:`${u}
94
+ `,"utf8"),Up(j),Za(j),j=void 0,Dp(v,d)}catch(P){if(j!==void 0)Za(j);if(ds(v))Gp(v);throw P}}function Bp(d,u){ps(d,`${JSON.stringify(u,null,2)}
95
+ `)}function zp(d){return $n(Kr(d),".hlix","config.json")}function nc(d){return $n(Kr(d),".hlix","state.json")}function Vr(d){try{let u=JSON.parse(ec(zp(d),"utf8"));return u.schemaVersion===1&&u.workspaceId&&u.apiUrl?u:null}catch{return null}}function Xr(d){let u=$n(Kr(d),".hlix");if(Qa(u,{recursive:!0,mode:448}),Jr(u).isSymbolicLink())throw Error(`Refusing to write through a symlinked Hlix directory: ${u}`);let f=$n(u,".gitignore");if(!ds(f))ls(f,`state.json
96
+ `,{mode:420,flag:"wx"});tc(f);let v=$n(Kr(d),".hlixignore");if(!Jr(v,{throwIfNoEntry:!1}))ls(v,`# Additional project-local paths to exclude from Hlix snapshots.
97
+ `,{mode:420,flag:"wx"})}function us(d,u){Bp(nc(d),{...u,snapshotOnly:u.snapshotOnly??l(d)?.snapshotOnly,includedPaths:u.includedPaths??l(d)?.includedPaths})}function l(d){try{let u=JSON.parse(ec(nc(d),"utf8"));return u.schemaVersion===1&&u.repoId&&/^[a-f0-9]{40}$/.test(u.commitSha)?u:null}catch{return null}}var ar=20000,ms=2000000;function q(d){if(d===void 0)return;let u=typeof d==="number"?d:Number(d.trim());return Number.isInteger(u)&&u>=ar&&u<=ms?u:void 0}function pe(d){if(d===void 0)return!1;let u=z(d);if(u!==void 0)return u;let f=Number(d.trim());return Number.isInteger(f)&&f>=ar?f:void 0}var b=["cloud","docker","local"],w={cloud:"Cloud Machine",docker:"Docker container",local:"local environment"},Yr={"claude-code":!0,codex:!0,opencode:!0,goose:!0,"qwen-code":!0,pi:!0,hlix:!0},i=Object.keys(Yr),Ee="hlix",ac={dockerImage:"Docker containers only",harness:"local environments and Docker containers only",memoryTokens:"all execution environments",maskToolOutputs:"all execution environments",model:"local environments and Docker containers only",sandbox:"all execution environments",yolo:"all execution environments"},An=["dockerImage","harness","maskToolOutputs","memoryTokens","model","sandbox","yolo"],gs=["projectId","workspaceId","apiUrl"],Jp=`# Machine-wide setup for Hlix.
98
+ # A model server of your own goes under providers. Name its secret with apiKeyEnv.
99
+ `;function Zr(d=process.env){return ic(d.HLIX_CONFIG_HOME??sc(),".hlix","hlix.yml")}function Kp(d){return ic(d.HLIX_CONFIG_HOME??sc(),".hlix","config.json")}function Vp(d=process.env){let u=dc(d);return u?Yp(u):null}function K(d,u=process.env){let f=Vp(u),v=os(d),P=n(d)?.config??null,I=v?.loaded.file?Vt(v.loaded.file).binding:null,C={},T={},R=(F)=>{let L=eu(I,F),H=L!==void 0?L:P?.[F],X=f?.[F];if(H!==void 0)C[F]=H,T[F]="project";else if(X!==void 0)C[F]=X,T[F]="global"};for(let F of An)R(F);for(let F of gs){let L=P?.[F];if(L!==void 0)C[F]=L,T[F]="project"}return{merged:C,sources:T,global:f,project:P,paths:{global:Zr(u),project:v?Ue(v.root):null},providers:tu(v?.loaded??null,f?.providers)}}function cc(d){return[...An,...gs].map((f)=>({key:f,value:d.merged[f]??null,source:d.sources[f]??"default"}))}function Xp(d,u){if(d==="sandbox"&&!b.includes(u))return`sandbox must be one of ${b.join(", ")}; got "${u}".`;if(d==="harness"&&!i.includes(u))return`harness must be one of ${i.join(", ")}; got "${u}".`;if(d==="model"&&u.trim()==="")return"model must not be empty.";if(d==="memoryTokens"){let f=Number(u.trim());if(!Number.isInteger(f)||f<ar)return`memoryTokens must be a whole number of tokens, at least ${ar}; got "${u}".`;if(f>ms)return`memoryTokens must be at most ${ms}; got "${u}".`}if(d==="dockerImage"&&u.trim()==="")return"dockerImage must not be empty.";if(d==="maskToolOutputs"&&pe(u)===void 0)return`maskToolOutputs must be true, false or a whole number of tokens of at least ${ar}; got "${u}".`;if(d==="yolo"&&z(u)===void 0)return`yolo must be true or false; got "${u}".`;return null}function z(d){if(d===void 0)return;let u=d.trim().toLowerCase();if(["true","1","yes","on"].includes(u))return!0;if(["false","0","no","off"].includes(u))return!1;return}function fs(d){if(An.includes(d))return d;let u=gs.includes(d);throw new e("invalid_usage",u?`${d} is written by \`hlix init\` and \`hlix import\`, not by \`hlix config set\`.`:`Unknown setting: ${d}. Known settings: ${An.join(", ")}.`)}function hs(d,u){let f=Xp(d,u);if(f)throw new e("invalid_usage",f);return u}function me(d){if(hs(d.key,d.value),d.scope==="global"){let f=Zr(d.env),v=dc(d.env)??{schema:1},j=rc(v,d.key,d.value);if(j!==v)lc(d.env,j);return f}let u=os(d.cwd);if(!u)throw new e("not_initialized","This folder is not bound to hlix. Run `hlix init` here, or set it machine-wide with --global.");try{return ce(u.root,(f)=>rc(f,d.key,d.value)).path}catch(f){if(f instanceof e)throw f;throw new e("invalid_project_file",f instanceof Error?f.message:"Could not write hlix.yml.")}}function lc(d,u){let f=Zr(d),v=or(u,Jp),j=_n(v);if(!j.ok){let P=j.issues.map((I)=>`${I.path}: ${I.message}`).join("; ");throw new e("invalid_project_file",`${f}: ${P}`)}ps(f,v)}function dc(d){let u=Zr(d);if(qp(u)){let v;try{v=oc(u,"utf8")}catch{return null}let j=_n(v);if(!j.ok){let P=j.issues.map((I)=>`${I.path}: ${I.message}`).join("; ");throw new e("invalid_project_file",`${u}: ${P}`)}return j.file}let f=Zp(d);if(!f)return null;return lc(d,f),f}function Yp(d){let u=Vt(d).binding,f=u.harness&&u.harness in Yr?u.harness:void 0;return{schemaVersion:1,...u.dockerImage?{dockerImage:u.dockerImage}:{},...f?{harness:f}:{},...u.memoryTokens?{memoryTokens:u.memoryTokens}:{},...u.maskToolOutputs?{maskToolOutputs:u.maskToolOutputs}:{},...u.model?{model:u.model}:{},...u.sandbox?{sandbox:u.sandbox}:{},...u.yolo?{yolo:u.yolo}:{},...d.providers?{providers:d.providers}:{}}}function Zp(d){let u;try{u=JSON.parse(oc(Kp(d),"utf8"))}catch{return null}if(!u||typeof u!=="object"||u.schemaVersion!==1)return null;let f=u,v={schema:1},j={};if(typeof f.harness==="string"&&f.harness in Yr)j.harness=f.harness;if(typeof f.model==="string"&&f.model.trim())j.model=f.model.trim();let P=typeof f.memoryTokens==="number"?f.memoryTokens:typeof f.memoryTokens==="string"?Number(f.memoryTokens):void 0;if(P!==void 0&&Number.isInteger(P)&&P>=1&&P<=2000000)j.memoryTokens=P;if(f.yolo==="true"||f.yolo===!0)j.yolo=!0;if(f.yolo==="false"||f.yolo===!1)j.yolo=!1;if(Object.keys(j).length)v.coder=j;let I={};if(f.sandbox==="cloud"||f.sandbox==="local"||f.sandbox==="docker")I.runtime=f.sandbox;if(typeof f.dockerImage==="string"&&f.dockerImage.trim())I.image=f.dockerImage.trim();if(Object.keys(I).length)v.local=I;let C=Qp(f.providers);if(C)v.providers=C;let T=fn.safeParse(v);if(T.success)return T.data;if(!v.providers)return null;let R={...v,providers:void 0},F=fn.safeParse(R);return F.success?F.data:null}function Qp(d){if(!Array.isArray(d))return;let u=[];for(let f of d){if(!f||typeof f!=="object")continue;let v=f;if(typeof v.name!=="string"||typeof v.url!=="string"||!Array.isArray(v.models))continue;let j=v.models.filter((T)=>typeof T==="string"&&T.length>0);if(!j.length)continue;let P={name:v.name,url:v.url,models:j,...typeof v.apiKeyEnv==="string"?{apiKeyEnv:v.apiKeyEnv}:{},...typeof v.apiKey==="string"&&v.apiKey.length>0?{apiKey:v.apiKey}:{}},I=fn.safeParse({schema:1,providers:[P]}),C=I.success?I.data.providers?.[0]:void 0;if(C)u.push(C)}return u.length?u:void 0}function eu(d,u){if(!d)return;if(u==="harness"){let f=d.harness;return f&&f in Yr?f:void 0}return d[u]}function tu(d,u){let f=d?.file?.providers;if(f===void 0)return u;if(d?.local?.providers!==void 0)return f;return f.map(({name:v,url:j,models:P})=>({name:v,url:j,models:P}))}function rc(d,u,f){if(u==="sandbox"){let v=f==="docker"?"docker":f==="local"?"local":"cloud";if(d.local?.runtime===v)return d;return{...d,local:{...d.local,runtime:v}}}if(u==="dockerImage"){let v=f.trim();if(d.local?.image===v)return d;return{...d,local:{...d.local,image:v}}}if(u==="harness"){if(d.coder?.harness===f)return d;return{...d,coder:{...d.coder,harness:f}}}if(u==="model"){let v=f.trim();if(d.coder?.model===v)return d;return{...d,coder:{...d.coder,model:v}}}if(u==="memoryTokens"){let v=q(f);if(v===void 0||d.coder?.memoryTokens===v)return d;return{...d,coder:{...d.coder,memoryTokens:v}}}if(u==="maskToolOutputs"){let v=pe(f);if(v===void 0||d.coder?.maskToolOutputs===v)return d;return{...d,coder:{...d.coder,maskToolOutputs:v}}}if(u==="yolo"){let v=z(f);if(v===void 0||d.coder?.yolo===v)return d;return{...d,coder:{...d.coder,yolo:v}}}return d}var pc=An.join(" | "),ys={name:"config list",summary:"Show every setting in effect and which file supplied it",usage:["Usage: hlix config list [--cwd <dir>] [--json]","","Merges the machine-wide file with this folder's, per key, and names the","source of each value: project, global, or default (no file names it)."].join(`
100
+ `),supportsJson:!0,async run(d){let u=K(d.cwd,d.env),f=cc(u);if(d.json)return d.stdout(xe(_e(ys.name,{settings:f,paths:u.paths}))),0;return d.stdout(`${Dt(["setting","value","source","applies to"],f.map((v)=>[v.key,v.value??"-",v.source,ac[v.key]??"this folder's binding"]))}
101
+ `),d.stdout(`
102
+ global ${u.paths.global}
103
+ `),d.stdout(`project ${u.paths.project??"- (this folder is not bound to hlix)"}
104
+ `),0}},ws={name:"config get",summary:"Print one setting's effective value",usage:[`Usage: hlix config get <${pc}> [--cwd <dir>] [--json]`,"","Prints the value the cascade resolves for one key, or exits 1 when no","file names it."].join(`
105
+ `),supportsJson:!0,args:{min:1,max:1},async run(d){let u=fs(d.args[0]),f=K(d.cwd,d.env),v=f.merged[u]??null,j=f.sources[u]??"default";if(d.json)return d.stdout(xe(_e(ws.name,{key:u,value:v,source:j}))),v===null?1:0;if(v===null)return d.stderr(`${u} is not set. Set it with \`hlix config set ${u} <value>\`.
106
+ `),1;return d.stdout(`${v}
107
+ `),0}},vs={name:"config set",summary:"Set one setting for this folder, or for the machine with --global",usage:[`Usage: hlix config set <${pc}> <value> [--global] [--cwd <dir>] [--json]`,"","Writes this folder's hlix.yml, or ~/.hlix/hlix.yml with --global.","Other keys in the file are left untouched. The binding keys","(projectId, workspaceId, apiUrl) are written by init/import and are","refused here."].join(`
108
+ `),supportsJson:!0,options:["global"],args:{min:2,max:2},async run(d){let u=fs(d.args[0]),f=hs(u,d.args[1]),v=d.flags.global===!0?"global":"project",j=me({key:u,value:f,scope:v,cwd:d.cwd,env:d.env});if(d.json)return d.stdout(xe(_e(vs.name,{key:u,value:f,scope:v,path:j}))),0;return d.stdout(`${u} = ${f} (${v}: ${j})
109
+ `),0}};var nu="project-manager",ru=2000,ou="Cloud work landed. Run /pull (hlix pull) to bring it into this folder.",uc=new Set(["done","pr_created"]),su=new Set(["done","pr_created","failed","canceled"]),iu={"project-manager":"Project Manager","senior-engineer":"Senior Engineer","product-engineer":"Product Engineer","ui-engineer":"UI Engineer","qa-engineer":"QA Engineer","security-engineer":"Security Engineer","technical-writer":"Technical Writer"};function au(d){let u=d.role?iu[d.role]:void 0;return u?`${d.name} · ${u}`:d.name}function cu(d){return d.replace(/^project-/,"").replace(/[-_]+/g," ")}function Gt(d){return typeof d==="string"&&d.trim()?d.trim():void 0}function mc(d){if(d.status==="running")return null;let u=d.detail??{kind:""},f=cu(d.stepId);if(u.kind==="narration"){let v=Array.isArray(u.tasks)?u.tasks.filter((P)=>typeof P==="string"):[];f=Gt(u.title)??(v.length>0?v.join(", "):f);let j=Gt(u.reason);if(j)f+=` — ${j}`}else if(u.kind==="reason"&&Gt(u.reason))f+=` — ${Gt(u.reason)}`;else if(u.kind==="verdict")f=u.approved===!0?"review approved":`review asked for changes${Gt(u.feedback)?` — ${Gt(u.feedback)}`:""}`;else if(u.kind==="dispatch"&&typeof u.launched==="number")f+=` — ${u.launched} started`;return d.status==="failed"?`${f} (failed)`:f}function gc(d){return{kind:"cycle",text:`cycle "${d.title}": ${d.stage}`}}function lu(d){return{kind:"task",text:`task "${d.title||d.id}": ${d.status}`}}function fc(d){return{kind:"preview",text:`preview: ${d.state}${d.url?` ${d.url}`:""}`}}function du(d,u,f){let v=[],j=u.activity.filter((P)=>mc(P)!==null&&!f.has(P.id));if(!d){v.push({kind:"project",text:`${u.project.name}: ${u.project.status} (${u.project.runStatus})`});for(let P of u.cycles)if(!su.has(P.status))v.push(gc(P));if(u.preview.url)v.push(fc(u.preview))}else{if(d.project.status!==u.project.status||d.project.runStatus!==u.project.runStatus)v.push({kind:"project",text:`project: ${u.project.status} (${u.project.runStatus})`});let P=!1;for(let I of u.cycles){let C=d.cycles.find((T)=>T.id===I.id);if(C&&C.status===I.status)continue;if(v.push(gc(I)),uc.has(I.status)&&!(C&&uc.has(C.status)))P=!0}for(let I of u.tasks){let C=d.tasks.find((T)=>T.id===I.id);if(!C||C.status!==I.status)v.push(lu(I))}for(let I of u.agents){let C=d.agents.find((T)=>T.id===I.id);if(C&&C.state!==I.state)v.push({kind:"agent",text:`${au(I)} ${I.state==="working"?"started working":"is idle"}`})}if(d.preview.url!==u.preview.url||d.preview.state!==u.preview.state){if(v.push(fc(u.preview)),u.preview.url&&d.preview.url!==u.preview.url)P=!0}if(P)v.push({kind:"landed",text:ou})}for(let P of j){if(f.has(P.id))continue;f.add(P.id),v.push({kind:"activity",text:mc(P)})}return v}function hc(d){if(typeof d==="string")return Gt(d);if(Array.isArray(d))return Gt(d.map((u)=>u&&typeof u==="object"&&u.type==="text"?String(u.text??""):"").join(""));return}var pu=(d)=>d==="assistant"?"project manager":"to project manager";class yc{seen=new Set;drafts=new Map;spoke=!1;unsaved;lines(d){switch(d.type){case"MESSAGES_SNAPSHOT":{let u=d.messages.filter((f)=>{if(typeof f.id!=="string"||this.seen.has(f.id))return!1;if(f.role==="assistant"&&this.unsaved!==void 0&&hc(f.content)===this.unsaved)return this.unsaved=void 0,this.seen.add(f.id),!1;return!0});for(let f of u)this.seen.add(f.id);return u.flatMap((f)=>{if(f.role!=="user"&&f.role!=="assistant")return[];let v=hc(f.content);return v?[{kind:"message",text:`${pu(f.role)}: ${v}`}]:[]})}case"RUN_STARTED":return this.spoke=!1,[{kind:"run",text:"project manager is working…"}];case"TEXT_MESSAGE_START":return this.drafts.set(d.messageId,""),[];case"TEXT_MESSAGE_CONTENT":return this.drafts.set(d.messageId,(this.drafts.get(d.messageId)??"")+d.delta),[];case"TEXT_MESSAGE_END":{let u=Gt(this.drafts.get(d.messageId));if(this.drafts.delete(d.messageId),this.seen.has(d.messageId))return[];if(this.seen.add(d.messageId),!u)return[];return this.spoke=!0,this.unsaved=u,[{kind:"message",text:`project manager: ${u}`}]}case"TOOL_CALL_START":return[{kind:"tool",text:`project manager → ${d.toolCallName.replace(/[_-]+/g," ")}`}];case"CUSTOM":{let u=d.name==="hlix.turn_saved"?d.value?.messageId:void 0;if(typeof u==="string"&&this.spoke)this.seen.add(u),this.unsaved=void 0;return[]}case"RUN_FINISHED":return this.spoke=!1,[{kind:"run",text:"project manager finished"}];case"RUN_ERROR":return this.spoke=!1,[{kind:"run",text:`project manager stopped: ${d.message}`}];default:return[]}}}async function wc(d,u,f){let v=un(u),j=new AbortController,P=()=>j.abort();if(f.signal?.aborted)return;f.signal?.addEventListener("abort",P,{once:!0});let I=new yc,C,T=null,R=!1,F=null,L=()=>{if(T){R=!0;return}T=(async()=>{do{R=!1;let B=new AbortController,Z=()=>B.abort();j.signal.addEventListener("abort",Z,{once:!0}),F=Z;try{for await(let Q of d.live.follow(nu,v,{signal:B.signal}))for(let we of I.lines(Q))f.emit(we)}finally{F=null,j.signal.removeEventListener("abort",Z)}}while(R&&!j.signal.aborted)})().catch((B)=>{if(j.signal.aborted)return;C=B,j.abort()}).finally(()=>{T=null})},H=()=>{let B=F;if(!B)return L();R=!0,wt(ru,j.signal).then(()=>{if(F===B)B()})},X=new Set,D;try{L();for await(let{state:B,event:Z}of d.live.project(u,{signal:j.signal})){if(Z.type==="CUSTOM"){let Q=Z.value;if(Z.name==="hlix.thread_changed"&&Q?.threadId===v){if(Q.kind==="run_finished")H();else if(Q.kind!=="renamed")L()}continue}for(let Q of du(D,B,X))f.emit(Q);D=B}}catch(B){if(!j.signal.aborted)C??=B}finally{j.abort(),f.signal?.removeEventListener("abort",P),await T}if(C!==void 0)throw C}function bc(d){let f=(typeof d.flags.project==="string"?d.flags.project.trim():"")||n(d.cwd)?.config.projectId;if(!f)throw new e("missing_argument","A project is required: pass --project <id>, or run this inside a folder bound to a project.");return f}var vc="The project manager is busy with another message. Try again in a moment; /watch shows what it is doing.";function hn(d,u){if(typeof d!=="object"||d===null)return"";let f=d[u];return f===null||f===void 0?"":String(f)}var bs={name:"projects list",summary:"List the projects in your workspace",usage:"Usage: hlix projects list [--json]",supportsJson:!0,signIn:!0,async run(d){let u=await d.requireClient().projects.list();if(d.json)return d.stdout(xe(_e(bs.name,u))),0;let f=Array.isArray(u)?u:[];if(f.length===0)return d.stdout(`No projects.
110
+ `),0;return d.stdout(`${Dt(["ID","NAME","STACK"],f.map((v)=>[hn(v,"id"),hn(v,"name"),hn(v,"stack")]))}
111
+ `),0}},ks={name:"projects get",summary:"Show one project, defaulting to the one this folder is bound to",usage:["Usage: hlix projects get [project-id] [--json]","","With no id, the project this folder is bound to is used."].join(`
112
+ `),supportsJson:!0,signIn:!0,args:{min:0,max:1},async run(d){let u=d.args[0]??n(d.cwd)?.config.projectId;if(!u)throw new e("missing_argument","A project id is required, or run this inside a folder bound to a project.");let f=await d.requireClient().projects.get(u);if(d.json)return d.stdout(xe(_e(ks.name,f))),0;let v=f.repos;return d.stdout(`${at([["id",hn(f,"id")],["name",hn(f,"name")],["stack",hn(f,"stack")],["status",hn(f,"status")],["repos",Array.isArray(v)?String(v.length):""]].filter(([,j])=>j!==""))}
113
+ `),0}},xs={name:"projects delete",summary:"Delete a project from your workspace",usage:"Usage: hlix projects delete <id|name> [--yes] [--json]",supportsJson:!0,signIn:!0,options:["yes"],args:{min:1,max:1},async run(d){let u=d.requireClient(),f=d.args[0],v=await u.projects.list(),j=v.find((R)=>R.id===f),P=j?[j]:v.filter((R)=>R.name===f);if(P.length===0)throw new e("not_found",`No project named or identified by "${f}".`);if(P.length>1)throw new e("invalid_usage",`More than one project is named "${f}". Use its ID.`);let I=P[0],C=`Delete project "${I.name}"?`;if(d.stderr(`${C}
114
+ `),d.flags.yes!==!0){if(n(d.cwd)?.config.projectId===I.id)throw new e("approval_required","This folder is bound to that project. Pass --yes to delete it.");if(d.json||!d.confirm)throw new e("approval_required","Project deletion requires --yes when not interactive.");if(!await d.confirm(C))throw new e("cancelled","Project deletion cancelled.")}let T=await u.projects.delete(I.id);if(d.json)d.stdout(xe(_e(xs.name,T)));else d.stdout(`Deleted project "${I.name}".
115
+ `);return 0}},Ss={name:"projects watch",summary:"Stream the project manager's feed: decisions, cycles, tasks and messages",usage:["Usage: hlix projects watch [--project <id>] [--json]","","Follows the project as its manager sees it: cycle and task changes, the","decisions it makes, its messages, and the runs it starts, including the ones","it starts on its own. Read-only; it runs until you stop it.","","With no --project, the project this folder is bound to is watched.","","With --json, each line is one envelope (JSONL): data is { kind, text }, where","kind is project, cycle, task, agent, preview, activity, message, tool, run or","landed (finished cloud work to pull)."].join(`
116
+ `),supportsJson:!0,signIn:!0,options:["project"],agentTool:!1,async run(d){let u=bc(d),f=d.requireClient();return await f.projects.get(u),await wc(f,u,{...d.signal?{signal:d.signal}:{},emit:(v)=>d.stdout(d.json?`${JSON.stringify(_e(Ss.name,v))}
117
+ `:`${t(v.text)}
118
+ `)}),0}},js={name:"projects message",summary:"Send a message to the project manager and print its answer",usage:["Usage: hlix projects message [--project <id>] <text> [--json]","","Posts to the project's thread, the same one the dashboard chat uses, and","prints the project manager's answer as it is written. A manager already","answering someone else is busy: the command fails with conflict and nothing","is sent. With --json, data is { answer }."].join(`
119
+ `),supportsJson:!0,signIn:!0,options:["project"],args:{min:1,max:1e4},freeText:!0,async run(d){let u=bc(d),f=d.args.join(" ").trim();if(!f)throw new e("missing_argument","A message is required.");let v=d.requireClient(),j="";try{for await(let P of v.live.run("project-manager",{threadId:un(u),text:f},d.signal?{signal:d.signal}:void 0))if(P.type==="TEXT_MESSAGE_CONTENT"){if(j+=P.delta,!d.json)d.stdout(t(P.delta))}else if(P.type==="RUN_ERROR"){if(P.code==="409")throw new e("conflict",vc);throw new e("server_error",`The project manager could not answer: ${P.message}`)}}catch(P){if(P instanceof ln)throw new e("conflict",vc);throw P}if(d.json)d.stdout(xe(_e(js.name,{answer:j})));else if(!j)d.stdout(`Sent. The project manager answered without text.
120
+ `);else if(!j.endsWith(`
121
+ `))d.stdout(`
122
+ `);return 0}};function Ps(d,u){let f=d.args[0];if(!f)throw new e("missing_argument",`A ${u} id is required.`);return f}function kc(d,u){let f=d.flags[u];return typeof f==="string"&&f.trim()?f.trim():void 0}function Wt(d,u){if(typeof d!=="object"||d===null)return"";let f=d[u];return f===null||f===void 0?"":String(f)}var Es={name:"tasks list",summary:"List tasks, defaulting to the project this folder is bound to",usage:["Usage: hlix tasks list [--project <id>] [--status <status>] [--json]","","With no --project, a folder bound to a project lists that project's tasks;","anywhere else it lists the workspace's tasks."].join(`
123
+ `),supportsJson:!0,signIn:!0,options:["project","status"],async run(d){let u=kc(d,"project")??n(d.cwd)?.config.projectId,f=kc(d,"status"),v=await d.requireClient().tasks.list({...u?{projectId:u}:{},...f?{status:f}:{}});if(d.json)return d.stdout(xe(_e(Es.name,v))),0;let j=Array.isArray(v)?v:[];if(j.length===0)return d.stdout(`No tasks.
124
+ `),0;return d.stdout(`${Dt(["ID","STATUS","TITLE"],j.map((P)=>[Wt(P,"id"),Wt(P,"status"),Wt(P,"title")||Wt(P,"description").split(`
125
+ `)[0]||""]))}
126
+ `),0}},Is={name:"tasks get",summary:"Show one task",usage:"Usage: hlix tasks get <task-id> [--json]",supportsJson:!0,signIn:!0,args:{min:1,max:1},async run(d){let u=Ps(d,"task"),f=await d.requireClient().tasks.get(u);if(d.json)return d.stdout(xe(_e(Is.name,f))),0;return d.stdout(`${at([["id",Wt(f,"id")],["status",Wt(f,"status")],["title",Wt(f,"title")],["project",Wt(f,"projectId")],["description",Wt(f,"description")]])}
127
+ `),0}},_s={name:"tasks review",summary:"Show the verified review evidence of a task's cycle",usage:"Usage: hlix tasks review <task-id> [--json]",supportsJson:!0,signIn:!0,args:{min:1,max:1},async run(d){let u=Ps(d,"task"),f=d.requireClient(),v=await f.tasks.get(u);if(!v.cycleId)throw new e("not_found",`Task ${u} belongs to no cycle, so there is no change to review.`);let j=await f.cycles.review(v.cycleId);if(d.json)return d.stdout(xe(_e(_s.name,j))),0;return d.stdout(`${JSON.stringify(j,null,2)}
128
+ `),0}},Cs={name:"tasks watch",summary:"Stream a task's status changes until it finishes",usage:["Usage: hlix tasks watch <task-id> [--json]","","Prints the task's status each time it changes and exits when the task is","over: finished, or left unfinished by a cycle that ended (with the reason).","A task the reviewer failed is retried while its cycle is in review, so","watching continues through it.","","With --json, each change is printed as one envelope per line (JSONL) so a","consumer can read them as they arrive: data is { state, task, reason? },","where state is running, finished or unmet."].join(`
129
+ `),supportsJson:!0,signIn:!0,args:{min:1,max:1},async run(d){let u=Ps(d,"task"),f=d.requireClient(),{projectId:v}=await f.tasks.get(u),j;for await(let P of f.live.task(v,u))if(d.json)d.stdout(`${JSON.stringify(_e(Cs.name,P))}
130
+ `);else if(P.state==="unmet")d.stdout(`error: ${t(P.reason)}
131
+ `);else if(P.task&&P.task.status!==j)j=P.task.status,d.stdout(`${t(j)}
132
+ `);return 0}};import{realpath as Xm}from"node:fs/promises";import{resolve as Ym}from"node:path";import{parse as Tu}from"jsonc-parser";import{parse as Ou}from"smol-toml";import{parse as Ru}from"yaml";var cr={install:null,previewCommand:null,previewPort:null,verifyCommand:null,packageManager:null};var uu=[["next",3000],["nuxt",3000],["@remix-run/dev",5173],["@sveltejs/kit",5173],["astro",4321],["@angular/cli",4200],["gatsby",8000],["react-scripts",3000],["vite",5173],["hono",3000]],mu=/^(?:vite(?!\s+build\b)|astro\s+(?:dev|preview)|next\s+(?:dev|start)|nux[ti]\s+dev|ng\s+serve|gatsby\s+(?:develop|serve)|react-router\s+dev|remix\s+vite:(?:dev|preview))(?:\s+[^|;&]*)?$/,gu=["vite","next","webpack","react-scripts","@rsbuild/core","parcel"],lr=8080,Qr=8000,fu=String.raw`import http.server as h, urllib.parse as u, sys, os, re, io
133
+ B = (sys.argv[2] if len(sys.argv) > 2 else "").rstrip("/")
134
+ D = os.path.abspath(sys.argv[3] if len(sys.argv) > 3 and sys.argv[3] else ".")
135
+ E = sys.argv[4] if len(sys.argv) > 4 else "index.html"
136
+ P = int(os.environ.get("PORT") or ${lr})
137
+ L = re.compile(rb"((?:src|href|action|poster)\s*=\s*[\"'])/(?!/)" + (rb"(?!" + re.escape(B[1:].encode()) + rb"(?:/|[\"']))" if B else b""))
138
+ class H(h.SimpleHTTPRequestHandler):
139
+ def __init__(s, *a, **k):
140
+ super().__init__(*a, directory=D, **k)
141
+ def send_head(s):
142
+ raw = u.urlsplit(s.path).path
143
+ if B and (raw == B or raw.startswith(B + "/")):
144
+ s.path = s.path[len(B):] or "/"
145
+ p = u.unquote(u.urlsplit(s.path).path).replace(chr(92), "/")
146
+ if any(x.startswith(".") for x in p.split("/")):
147
+ s.send_error(404)
148
+ return None
149
+ f = s.translate_path(s.path)
150
+ if os.path.isdir(f) and p.endswith("/"):
151
+ f = os.path.join(f, E if os.path.abspath(f) == D else "index.html")
152
+ elif not os.path.exists(f) and "." not in p.rsplit("/", 1)[-1]:
153
+ f = f + ".html" if os.path.isfile(f + ".html") else os.path.join(D, E)
154
+ if not (f.lower().endswith((".html", ".htm")) and os.path.isfile(f)):
155
+ return super().send_head()
156
+ with open(f, "rb") as fh:
157
+ body = fh.read()
158
+ if B:
159
+ body = L.sub(lambda m: m.group(1) + B.encode() + b"/", body)
160
+ s.send_response(200)
161
+ s.send_header("Content-Type", "text/html; charset=utf-8")
162
+ s.send_header("Content-Length", str(len(body)))
163
+ s.end_headers()
164
+ return io.BytesIO(body)
165
+ def list_directory(s, path):
166
+ s.send_error(404)
167
+ return None
168
+ h.ThreadingHTTPServer(("", P), H).serve_forever()
169
+ `;function no(d=".",u="index.html"){return`python3 -c 'import base64,sys;exec(base64.b64decode(sys.argv[1]))' ${dr(fu)} "$PREVIEW_PUBLIC_PATH" ${d}${u==="index.html"?"":` ${Ic(u)}`}`}function Pc(d){if(d.has("index.html"))return"index.html";let u=[...d].filter((f)=>!f.startsWith(".")&&!/[\\/]/.test(f)&&/\.html?$/i.test(f));return u.length===1?u[0]:null}var Ec="HLIX_PREVIEW_FAILURE";function eo(d){return`{ echo "${Ec}=${d}"; exit 1; }`}var hu=`const handler = {
170
+ get(target, key) {
171
+ if (key === 'then' || key === 'prototype' || key === '$$typeof') return undefined
172
+ if (key === '__esModule') return false
173
+ if (key === Symbol.toPrimitive) return () => ''
174
+ if (key === 'displayName' || key === 'name') return 'Unavailable'
175
+ return stub
176
+ },
177
+ apply(target, self, args) {
178
+ const props = args[0]
179
+ return props !== null && typeof props === 'object' && !Array.isArray(props) ? null : stub
180
+ },
181
+ }
182
+ const stub = new Proxy(function Unavailable() {}, handler)
183
+ module.exports = stub
184
+ `,yu=`const path = require('path')
185
+ const loaded = __CONFIG__
186
+ const dir = path.join(__dirname, 'hlix-web')
187
+ // React Native Web's own names, as imported directly and as Expo rewrites them.
188
+ const WEB_ROOT = new Set(['react-native', 'react-native-web', 'react-native-web/dist/index'])
189
+ function withNativeStubs(config) {
190
+ const upstream = config.resolver.resolveRequest
191
+ config.resolver.resolveRequest = (context, moduleName, platform) => {
192
+ if (platform === 'web' && !context.originModulePath.startsWith(dir)) {
193
+ if (WEB_ROOT.has(moduleName)) return { type: 'sourceFile', filePath: path.join(dir, 'react-native.js') }
194
+ if (moduleName.startsWith('react-native/Libraries/')) return { type: 'sourceFile', filePath: path.join(dir, 'native-stub.js') }
195
+ }
196
+ return (upstream || context.resolveRequest)(context, moduleName, platform)
197
+ }
198
+ return config
199
+ }
200
+ module.exports = typeof loaded === 'function'
201
+ ? async (...args) => withNativeStubs(await loaded(...args))
202
+ : loaded && typeof loaded.then === 'function' ? loaded.then(withNativeStubs) : withNativeStubs(loaded)
203
+ `,wu=String.raw`const fs = require("fs"), cp = require("child_process")
204
+ const [base, pm] = process.argv.slice(-2)
205
+ // No preview path: not the preview's own copy. Prepared already: a restart.
206
+ if (!base || fs.existsSync("hlix-web/native-stub.js")) process.exit(0)
207
+ const fail = (code, why) => { console.error("hlix: " + why); console.log("${Ec}=" + code); process.exit(1) }
208
+ const run = (cmd, args) => {
209
+ const res = cp.spawnSync(cmd, args, { stdio: "inherit", env: { ...process.env, CI: "1", EXPO_NO_TELEMETRY: "1" } })
210
+ if (res.status !== 0) fail("packages_unavailable", "could not install " + args.join(" "))
211
+ }
212
+ const pkg = JSON.parse(fs.readFileSync("package.json", "utf8"))
213
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies }
214
+ if (!("expo" in deps)) fail("web_build_failed", "This project no longer declares Expo; open its native preview")
215
+ // npm refuses a React Native major change over peer ranges; the others only warn.
216
+ const peers = pm === "npm" ? ["--", "--legacy-peer-deps"] : []
217
+ const missing = ["react-dom", "react-native-web", "@expo/metro-runtime", "babel-preset-expo"].filter((name) => !(name in deps))
218
+ if (missing.length) run("npx", ["expo", "install", ...missing, ...peers])
219
+ fs.mkdirSync("hlix-web", { recursive: true })
220
+ fs.writeFileSync("hlix-web/native-stub.js", ${JSON.stringify(hu)})
221
+ fs.writeFileSync("hlix-web/react-native.js", "const web = require('react-native-web/dist/index')\nconst stub = require('./native-stub')\nmodule.exports = new Proxy(web, { get: (target, key) => (key in target ? target[key] : stub) })\n")
222
+ const own = ["metro.config.js", "metro.config.cjs"].find((file) => fs.existsSync(file))
223
+ let config = "require('expo/metro-config').getDefaultConfig(__dirname)"
224
+ if (own && /expo/.test(fs.readFileSync(own, "utf8"))) {
225
+ // Beside the original, so its own __dirname still names the project.
226
+ fs.renameSync(own, "metro.config.hlix-original.js")
227
+ config = "require('./metro.config.hlix-original.js')"
228
+ }
229
+ if (own) fs.rmSync(own, { force: true })
230
+ fs.writeFileSync("metro.config.js", ${JSON.stringify(yu)}.replace("__CONFIG__", config))
231
+ `,vu=String.raw`const fs = require("fs")
232
+ const base = (process.argv[process.argv.length - 1] || "").replace(/\/+$/, "")
233
+ if (!base) process.exit(0)
234
+ const dynamic = ["app.config.ts", "app.config.js"].filter((file) => fs.existsSync(file))
235
+ if (dynamic.length || fs.existsSync("app.json")) {
236
+ const json = dynamic.length ? { expo: require("expo/config").getConfig(process.cwd()).exp } : JSON.parse(fs.readFileSync("app.json", "utf8"))
237
+ const expo = json.expo || json
238
+ expo.experiments = { ...expo.experiments, baseUrl: base }
239
+ fs.writeFileSync("app.json", JSON.stringify(json, null, 2))
240
+ for (const file of dynamic) fs.rmSync(file)
241
+ }
242
+ `,bu=String.raw`import json, os, shutil, sys, tarfile, tempfile, urllib.request
243
+ root = sys.argv[1]
244
+ base = "https://storage.googleapis.com/flutter_infra_release/releases"
245
+ index = json.load(urllib.request.urlopen(base + "/releases_linux.json", timeout=60))
246
+ stable = index["current_release"]["stable"]
247
+ release = next(r for r in index["releases"] if r["hash"] == stable)
248
+ tmp = tempfile.mkdtemp(dir=root)
249
+ archive = os.path.join(tmp, "flutter.tar.xz")
250
+ with urllib.request.urlopen(base + "/" + release["archive"], timeout=600) as src, open(archive, "wb") as out:
251
+ shutil.copyfileobj(src, out)
252
+ with tarfile.open(archive) as tar:
253
+ tar.extractall(tmp, filter="tar")
254
+ os.remove(archive)
255
+ os.rename(os.path.join(tmp, "flutter"), os.path.join(root, "sdk"))
256
+ shutil.rmtree(tmp, ignore_errors=True)
257
+ print("hlix: Flutter " + release["version"] + " installed")
258
+ `,ku=String.raw`import sys, zipfile
259
+ args = [a for a in sys.argv[1:] if a not in ("-o", "-q")]
260
+ dest = args[args.index("-d") + 1] if "-d" in args else "."
261
+ zipfile.ZipFile(args[0]).extractall(dest)
262
+ `;function xc(d,u){return`python3 -c 'import base64,sys;exec(base64.b64decode(sys.argv[1]))' ${dr(d)} ${u}`}function xu(){return['mkdir -p "$HOME/.cache/hlix-flutter"/bin',`{ [ -x "$HOME/.cache/hlix-flutter"/sdk/bin/flutter ] || { echo "hlix: installing the Flutter SDK (first run only)"; ${xc(bu,'"$HOME/.cache/hlix-flutter"')}; } || ${eo("flutter_sdk_unavailable")}; }`,`{ command -v unzip >/dev/null 2>&1 || { printf '#!/bin/sh\\n%s "$@"\\n' ${Ic(xc(ku,""))} > "$HOME/.cache/hlix-flutter"/bin/unzip && chmod +x "$HOME/.cache/hlix-flutter"/bin/unzip; }; }`,'PATH="$HOME/.cache/hlix-flutter"/sdk/bin:"$HOME/.cache/hlix-flutter"/bin:$PATH',"export PATH","{ flutter config --no-analytics >/dev/null 2>&1 || true; }",`{ flutter pub get || ${eo("packages_unavailable")}; }`,`{ flutter run -d web-server --web-hostname 0.0.0.0 --web-port "$PORT" </dev/null || { echo "hlix: the dev server stopped; serving a web build instead"; flutter build web --base-href "$PREVIEW_PUBLIC_PATH/" && ${no("build/web")}; } || ${eo("web_build_failed")}; }`].join(" && ")}function Su(d){let u=`printf %s ${dr(wu)} | base64 -d | node - "$PREVIEW_PUBLIC_PATH" ${d}`,f=`CI=1 npx expo export --platform web --output-dir dist && ${no("dist")}`;return`${u} && ${_c(vu,"PREVIEW_PUBLIC_PATH")} && { BROWSER=none EXPO_NO_TELEMETRY=1 npx expo start --no-dev --port "$PORT" </dev/null || { echo "hlix: the dev server stopped; serving a web build instead"; ${f}; } || ${eo("web_build_failed")}; }`}function Ic(d){return`'${d.replace(/'/g,"'\\''")}'`}var ju=String.raw`const fs = require("fs")
263
+ const base = (process.argv[process.argv.length - 1] || "").replace(/\/+$/, "")
264
+ if (!base) process.exit(0)
265
+ const file = ["next.config.ts", "next.config.mts", "next.config.mjs", "next.config.js", "next.config.cjs"].find((name) => fs.existsSync(name))
266
+ const wrap = (name) => "(async (...args) => { const c = typeof " + name + " === \"function\" ? await " + name + "(...args) : await " + name + "; return { ...c, basePath: " + JSON.stringify(base) + " } })"
267
+ if (!file) {
268
+ fs.writeFileSync("next.config.mjs", "export default { basePath: " + JSON.stringify(base) + " }\n")
269
+ process.exit(0)
270
+ }
271
+ let text = fs.readFileSync(file, "utf8")
272
+ if (text.includes("__hlixPreviewConfig")) process.exit(0)
273
+ if (/\bexport\s+default\b/.test(text)) {
274
+ text = text.replace(/\bexport\s+default\b/, "const __hlixPreviewConfig =") + "\nexport default " + wrap("__hlixPreviewConfig") + "\n"
275
+ } else if (/\bmodule\.exports\s*=/.test(text)) {
276
+ text += "\nconst __hlixPreviewConfig = module.exports\nmodule.exports = " + wrap("__hlixPreviewConfig") + "\n"
277
+ } else {
278
+ process.exit(0)
279
+ }
280
+ fs.writeFileSync(file, text)
281
+ `,Pu=String.raw`import os, re, sys
282
+ hosts = [h for h in (sys.argv[2] if len(sys.argv) > 2 else "").split(",") if h]
283
+ if not hosts:
284
+ sys.exit(0)
285
+ match = re.search(r"DJANGO_SETTINGS_MODULE['\"]\s*,\s*['\"]([\w.]+)['\"]", open("manage.py").read())
286
+ if not match:
287
+ sys.exit(0)
288
+ module = match.group(1).replace(".", "/")
289
+ path = module + ".py" if os.path.isfile(module + ".py") else os.path.join(module, "__init__.py")
290
+ if not os.path.isfile(path) or "# hlix preview hosts" in open(path).read():
291
+ sys.exit(0)
292
+ with open(path, "a") as f:
293
+ f.write("\n# hlix preview hosts\nALLOWED_HOSTS = list(globals().get('ALLOWED_HOSTS') or ['.localhost', '127.0.0.1', '[::1]']) + %r\n" % hosts)
294
+ `;function _c(d,u){return`printf %s ${dr(d)} | base64 -d | node - "$${u}"`}var Eu=["test","typecheck","check","build","lint"],Iu=/^(?:\.eslintrc(?:\.(?:js|cjs|mjs|json|ya?ml))?|eslint\.config\.(?:js|cjs|mjs|ts|cts|mts))$/;function _u(d,u){return/\bnext\s+lint\b/.test(d)&&![...u].some((f)=>Iu.test(f))}var iv=Object.freeze({CI:"true",DEBIAN_FRONTEND:"noninteractive",GIT_TERMINAL_PROMPT:"0",GIT_EDITOR:"true",npm_config_yes:"true",NPM_CONFIG_FUND:"false",NPM_CONFIG_AUDIT:"false",NPM_CONFIG_UPDATE_NOTIFIER:"false",PIP_NO_INPUT:"1",PIP_DISABLE_PIP_VERSION_CHECK:"1",NEXT_TELEMETRY_DISABLED:"1",NO_COLOR:"1",TERM:"dumb"});var Cu=["dev","start","serve","preview"];function ro(d){if(!d)return{};try{let u=JSON.parse(d);return u&&typeof u==="object"?u:{}}catch{return{}}}function Cc(d){return{...Bt(d.dependencies)?d.dependencies:{},...Bt(d.devDependencies)?d.devDependencies:{}}}function Sc(d){let u=Cc(ro(d.packageJson));if("expo"in u||"react-native"in u)return!0;if(Array.from(d.rootFiles).some((f)=>f==="hlix.mobile.json"||f==="AndroidManifest.xml"||/\.xc(?:odeproj|workspace)$/.test(f)))return!0;return As(d)}function As(d){if(!new Set(d.rootFiles).has("pubspec.yaml"))return!1;let u=d.configFiles?.["pubspec.yaml"];return u===void 0||/^\s+sdk:\s*flutter\s*$/m.test(u)}function $c(d){let u=new Set(d.rootFiles),f=ro(d.packageJson),v=typeof f.packageManager==="string"?f.packageManager.split("@")[0]:"",j=v==="bun"||u.has("bun.lock")||u.has("bun.lockb")?"bun":v==="pnpm"||u.has("pnpm-lock.yaml")?"pnpm":v==="yarn"||u.has("yarn.lock")?"yarn":v==="npm"||u.has("package.json")?"npm":null,P=Pc(u);if(!j){if(Sc(d)&&!As(d))return{...cr,mobile:!0};if(As(d))return{...cr,previewCommand:xu(),previewPort:lr,mobile:!0};let R=Au(u,d.configFiles??{});if(R)return R;return P?{...cr,previewCommand:no(".",P),previewPort:lr}:cr}let I=Ac(f,u,j),C={install:`${j} install`,verifyCommand:I.verifyCommand,packageManager:j},T=I.webApp?null:$u(d.workspacePackages??[],j)[0]??null;if(T){let R=(F)=>`cd ${T.dir} && ${F}`;return{...C,previewCommand:R(T.previewCommand),previewPort:T.previewPort,verifyCommand:C.verifyCommand??(T.verifyCommand?R(T.verifyCommand):null),...T.mobile?{mobile:!0}:{}}}return{...C,previewCommand:I.previewCommand,previewPort:I.previewPort,...I.mobile||!I.previewCommand&&Sc(d)?{mobile:!0}:{}}}function Ac(d,u,f,v){let j=Bt(d.scripts)?d.scripts:{},P=(ye)=>`${f} run ${ye}`,I=(ye,Oe)=>`${P(ye)}${f==="npm"?" --":""} ${Oe}`,C=Cu.find((ye)=>typeof j[ye]==="string"),T=Eu.find((ye)=>typeof j[ye]==="string"&&!/no test specified/i.test(String(j[ye]))&&!/(?:^|\s)(?:--watch(?:All)?|-w)(?:\s|=|$)/.test(String(j[ye]))&&!_u(String(j[ye]),u)),R=T?P(T):null,F=Cc(d),L={previewCommand:null,previewPort:null,verifyCommand:R,webApp:!1,mobile:!1,explicitPort:!1};if("react-native"in F&&!("expo"in F)&&!gu.some((ye)=>(ye in F)))return{...L,mobile:!0};if("expo"in F)return{previewCommand:Su(f),previewPort:v??lr,verifyCommand:R,webApp:!0,mobile:!0,explicitPort:!1};let H=uu.find(([ye])=>(ye in F)),X=C?$s(String(j[C]))??H?.[1]??null:null,D=Pc(u);if(!C&&!H&&D)return{...L,previewCommand:no(".",D),previewPort:v??lr};if(!C)return L;let B=String(j[C]).trim(),Z=v!=null?` --port ${v}`:"",Q=B.split("&&").map((ye)=>ye.trim()),we=Z||(X!=null&&$s(B)==null&&mu.test(Q.at(-1))?` --port ${X}`:""),Te=we?I(C,we.trim()):P(C);if(Q.length>1&&Q.every((ye)=>/^vite(?:\s|$)/.test(ye))&&!("@sveltejs/kit"in F)){let ye={npm:"npx",bun:"bunx",pnpm:"pnpm exec",yarn:"yarn exec"}[f];Te=Q.map((Oe,oe)=>`${ye} ${Oe} --base "$PREVIEW_BASE_PATH/"${/^vite\s+build\b/.test(Oe)?"":" --host 0.0.0.0"}${oe===Q.length-1?we:""}`).join(" && ")}else if(/^vite(?:\s+(?:dev|serve|preview))?(?:\s|$)/.test(B)&&!/&&|;|\|/.test(B)&&!("@sveltejs/kit"in F))Te=I(C,`--base "$PREVIEW_BASE_PATH/" --host 0.0.0.0${we}`);else if(/^astro\s+(?:dev|preview)(?:\s|$)/.test(B))Te=I(C,`--base "$PREVIEW_BASE_PATH"${we}`);else if(/^next\s+(?:dev|start)(?:\s|$)/.test(B))Te=`${_c(ju,"PREVIEW_BASE_PATH")} && ${Te}`;else if(/^nuxt\s+(?:dev|preview|start)(?:\s|$)/.test(B))Te=`NUXT_APP_BASE_URL="$PREVIEW_BASE_PATH/" ${Te}`;return{previewCommand:Te,previewPort:v??X,verifyCommand:R,webApp:Boolean(H),mobile:!1,explicitPort:$s(B)!=null}}var jc=["web","app","frontend","site","www","client","dashboard"];function $u(d,u){let f=d.filter((j)=>to(j.dir)).map((j)=>{let P=ro(j.packageJson),I=new Set(j.rootFiles??[]);return{dir:j.dir,pkg:P,files:I,...Ac(P,I,u)}}).filter((j)=>j.webApp&&j.previewCommand&&j.previewPort!=null),v=(j)=>{let P=jc.indexOf(j.split("/").at(-1)??"");return P<0?jc.length:P};return f.sort((j,P)=>Number(j.mobile)-Number(P.mobile)||Number(!j.dir.startsWith("apps/"))-Number(!P.dir.startsWith("apps/"))||v(j.dir)-v(P.dir)||(j.dir<P.dir?-1:j.dir>P.dir?1:0))}function to(d){return/^[A-Za-z0-9._@-]+(?:\/[A-Za-z0-9._@-]+)*$/.test(d)&&!d.split("/").some((u)=>u===".."||u===".")}function Tc(d){let u=ro(d.packageJson),f=Array.isArray(u.workspaces)?u.workspaces:Bt(u.workspaces)&&Array.isArray(u.workspaces.packages)?u.workspaces.packages:[],v=d.configFiles?.["pnpm-workspace.yaml"]??"";for(let C of v.split(/\r?\n/)){let T=C.match(/^\s*-\s*["']?([^"'#\s]+)["']?/);if(T)f.push(T[1])}let j=f.filter((C)=>typeof C==="string"&&!C.startsWith("!"));if(j.length===0&&new Set(d.rootFiles).has("turbo.json"))j.push("apps/*","packages/*");for(let C of Object.values(Bt(u.scripts)?u.scripts:{})){if(typeof C!=="string")continue;let T=C.match(/^\s*cd\s+([A-Za-z0-9._@/-]+)\s*&&/)?.[1];if(T&&to(T))j.push(T)}let P=new Set,I=new Set;for(let C of j){let T=C.replace(/^\.\//,"").replace(/\/$/,"");if(/^[^*]+\/\*$/.test(T)&&to(T.slice(0,-2)))P.add(T.slice(0,-2));else if(!T.includes("*")&&to(T))I.add(T)}return{parents:[...P].sort(),packages:[...I].sort()}}function Au(d,u){let f=`${u["requirements.txt"]??""}
295
+ ${u["pyproject.toml"]??""}`.toLowerCase(),v=(F)=>new RegExp(`(^|[\\s"'\\[,])${F}\\b`,"m").test(f),j=d.has("requirements.txt")?'"$V/bin/pip" install -q -r requirements.txt':d.has("pyproject.toml")?'"$V/bin/pip" install -q .':null,P=(F,L="")=>j?`V="$HOME/.cache/hlix-venvs/$(cat requirements.txt pyproject.toml 2>/dev/null | cksum | cut -d " " -f1)"; { [ -f "$V/.ready" ] || { rm -rf "$V" && python3 -m venv "$V" && ${j}${L} && touch "$V/.ready"; }; } && "$V/bin/python" ${F}`:null,I=v("pytest")?P("-m pytest",' && "$V/bin/pip" install -q pytest'):null,T=["main.py","app.py","server.py","api.py"].find((F)=>d.has(F))?.replace(/\.py$/,""),R=(F,L=I)=>({...cr,previewCommand:F,previewPort:Qr,verifyCommand:L});if(d.has("manage.py")){let F=`python3 -c 'import base64,sys;exec(base64.b64decode(sys.argv[1]))' ${dr(Pu)} "$PREVIEW_ALLOWED_HOSTS"`;return R(`${F} && python3 manage.py runserver 0.0.0.0:${Qr}`,I??(v("django")?P("manage.py test"):null))}if(T&&v("fastapi"))return R(`python3 -m uvicorn ${T}:app --host 0.0.0.0 --port ${Qr} --root-path "$PREVIEW_PUBLIC_PATH"`);if(T&&v("flask"))return R(`python3 -m flask --app ${T} run --host 0.0.0.0 --port ${Qr}`);return null}function dr(d){return btoa(d)}function $s(d){let u=d.match(/(?:--port(?:=|\s+)|-p\s+|\bPORT=)(\d{2,5})\b/),f=u?Number(u[1]):NaN;return Number.isInteger(f)&&f>0&&f<=65535?f:null}function Bt(d){return Boolean(d)&&typeof d==="object"&&!Array.isArray(d)}function Oc(d){let u=new Set(d.rootFiles),f=new Set;if(u.has("package.json")){for(let j of["coverage",".cache"])f.add(j);if(["package-lock.json","pnpm-lock.yaml","yarn.lock","bun.lock","bun.lockb"].some((j)=>u.has(j)))f.add("node_modules")}if(u.has("Cargo.toml"))f.add("target");if(["pyproject.toml","requirements.txt","setup.py"].some((j)=>u.has(j)))f.add("__pycache__");if(u.has("composer.json")&&u.has("composer.lock"))f.add("vendor");for(let j of Ts({...d,rootFiles:u}))f.add(j);return[...f].sort()}function Nt(d,u,f){let v=(d.match(/"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`(?:\\.|[^`\\])*`|\/\*[\s\S]*?\*\/|\/\/[^\n]*|[A-Za-z_$][\w$]*|[^\s]/g)??[]).filter((T)=>!T.startsWith("//")&&!T.startsWith("/*"));if(v[0]!=="{"){let T=v.findIndex((F,L)=>F==="export"&&v[L+1]==="default"),R=v.findIndex((F,L)=>F==="module"&&v.slice(L+1,L+4).join("")===".exports=");if(T<0&&R<0)return null;if(v=v.slice(T>=0?T+2:R+4),["defineConfig","defineNuxtConfig"].includes(v[0]??"")&&v[1]==="(")v=v.slice(2);if(v[0]!=="{")return null}if(v.some((T,R)=>T==="."&&v[R+1]==="."&&v[R+2]==="."))return null;let j=(T="")=>T.replace(/^["']|["']$/g,""),P=[],I,C=0;for(let T=0;T<v.length;T++){let R=v[T];if(R==="{")P.push(v[T-1]===":"?j(v[T-2]):"");if(R==="}")P.pop();if(!P.length)break;if(R==="["&&["{",","].includes(v[T-1]??""))return null;if(u&&P.length===1&&j(R)===u){if(v[T+1]!==":"||v[T+2]!=="{"||++C>1)return null}if(j(R)===f&&(u?P.length===2&&P.at(-1)===u:P.length===1)&&v[T+1]!==":")return null;if(j(R)!==f||v[T+1]!==":"||(u?P.length!==2||P.at(-1)!==u:P.length!==1))continue;let F=v[T+2]??"";if(I!==void 0||!/^["'`][^\\$]*["'`]$/.test(F)||![",","}"].includes(v[T+3]??""))return null;I=F.slice(1,-1)}return I}function Ts(d){let u={};try{let H=JSON.parse(d.packageJson??"{}");if(Bt(H))u=H}catch{}let f={...Bt(u.dependencies)?u.dependencies:{},...Bt(u.devDependencies)?u.devDependencies:{}},v=Bt(u.scripts)?Object.entries(u.scripts).filter((H)=>typeof H[1]==="string"):[],j=(H,X=H)=>(H in f)||v.some(([,D])=>new RegExp(`(?:^|[;&|\\s])${X}(?:\\s|$)`).test(D)),P=d.configFiles??{},I=new Set,C=(H)=>{if(typeof H!=="string")return null;let X=H.replace(/^\.\//,"").replace(/\/$/,"");return X&&!X.startsWith("/")&&!/[\\:*?\[\]#!$`"'\r\n]/.test(X)&&!X.split("/").some((D)=>!D||[".","..",".git",".hlix"].includes(D))?X:null},T=(H)=>{let X=C(H);if(X)I.add(X)},R=(H,X)=>{let D=v.filter(([we,Te])=>/(?:^|:)build(?:$|:)/.test(we)||new RegExp(`\\b${H} build\\b`).test(Te)),B=D.filter(([,we])=>new RegExp(`(?:^|\\s)${H}(?:\\s|$)`).test(we));if(!B.length&&(D.length||u.workspaces!==void 0))return null;if(D.some((we)=>!B.includes(we)&&/--(?:out|dist|root|config|project)|\s-[dpc]\b/.test(we[1])))return null;let Z,Q=!1;for(let[,we]of B){if(/[$`\\;|<>\n]/.test(we)||/(?:^|\s)(?:cd|pushd|popd)\s/.test(we))return null;for(let Te of we.split("&&")){let ye=Te.match(/"[^"\n]*"|'[^'\n]*'|[^\s]+/g)??[];if(ye.some((te)=>/["']/.test(te)&&!/^(?:"[^"\n]*"|'[^'\n]*')$/.test(te)))return null;let Oe=ye.map((te)=>te.replace(/^["']|["']$/g,"")),oe=Oe.indexOf(H);if(oe<0)continue;if(oe!==0&&!(oe===1&&["npx","bunx"].includes(Oe[0])))return null;let Y=Oe.slice(oe+1);if(Y[0]==="build")Y.shift();let ne;for(let te=0;te<Y.length;te++){let[Pe,...$e]=Y[te].split("="),Qe=$e.length?$e.join("="):void 0;if(!X.includes(Pe)||ne!==void 0)return null;let st=Qe??Y[++te],et=C(st);if(!et)return null;ne=et}if(Q&&ne!==Z)return null;Q=!0,Z=ne}}return Z},F=(H)=>{let X=[...new Set([...d.rootFiles,...Object.keys(P)])].filter((D)=>D.startsWith(`${H}.config.`)||H==="turbo"&&D==="turbo.json");if(!X.length)return"{}";return X.length===1?P[X[0]]??null:null},L=(H,X,D,B,Z,Q,we)=>{let Te=F(H),ye=R(H,Z);if(Te===null||ye===null)return;let Oe=Q?Nt(Te,null,Q):void 0,oe=Nt(Te,X,D);if(Oe===null||oe===null)return;let Y=Oe===void 0||Oe==="."||Oe==="./"?"":C(Oe);if(Y===null)return;let te=C(ye??oe??B);if(!te)return;T(Y?`${Y}/${te}`:te);for(let Pe of we??[])T(Y?`${Y}/${Pe}`:Pe)};if(j("vite"))L("vite","build","outDir","dist",["--outDir","--out-dir"],"root");if(j("next")){let H=F("next"),X=H===null?null:Nt(H,null,"output");if(H!==null&&(X===void 0||X==="standalone"||X==="export"&&Nt(H,null,"distDir")===void 0))L("next",null,"distDir",".next",[],void 0,X==="export"?["out"]:[])}if(j("astro"))L("astro",null,"outDir","dist",["--outDir","--out-dir"],"root");if(j("nuxt")){let H=F("nuxt");if(H!==null&&Nt(H,null,"nitro")===void 0&&Nt(H,null,"extends")===void 0)L("nuxt",null,"buildDir",".nuxt",[],"rootDir",[".output"])}if(j("turbo"))L("turbo",null,"cacheDir",".turbo",["--cache-dir"]);if(j("webpack")){let H=F("webpack");if(H!==null&&Nt(H,null,"context")===void 0)L("webpack","output","path","dist",["--output-path"])}if(j("rollup"))L("rollup","output","dir",void 0,["--dir","-d"]);if(j("parcel")||j("parcel-bundler","parcel")){let H=R("parcel",["--dist-dir"]);if(H!==null&&u.targets===void 0&&!["main","module","browser"].some((X)=>typeof u[X]==="string"))T(H??"dist")}if(j("react-scripts")&&R("react-scripts",[])!==null)T("build");if(j("typescript","tsc")){let H=R("tsc",["--outDir"]),X=Object.keys(P).filter((D)=>/^tsconfig(?:\.[^/]*)?\.json$/.test(D));if(H!==null&&X.length===1&&X[0]==="tsconfig.json"){let D=P["tsconfig.json"];if(Nt(D,null,"extends")===void 0&&Nt(D,null,"references")===void 0){let B=Nt(D,"compilerOptions","outDir");if(B!==null)T(H??B)}}}if(Os(P)){T("build"),T("dist");for(let H of d.rootFiles)if(H.endsWith(".egg-info"))T(H)}return[...I].sort()}function Os(d){let u=(d["pyproject.toml"]??"").split(/^\[build-system\]\s*$/m)[1]?.split(/^\[/m)[0]??"";return/^build-backend\s*=\s*["'][^"']+["']/m.test(u)||/(?:from\s+(?:setuptools|distutils.core)\s+import\s+.*\bsetup\b|(?:setuptools|distutils.core)\.setup\s*\()/.test(d["setup.py"]??"")}var pt=(d)=>d&&typeof d==="object"&&!Array.isArray(d)?d:{},Tn=(d)=>Array.isArray(d)?d.filter((u)=>typeof u==="string"):[];function Rc(d){let u=[];function f(Y,ne="json"){let te=d.get(Y);if(!te)return{};try{if(ne==="yaml")return pt(Ru(te,{maxAliasCount:50}));if(ne==="toml")return pt(Ou(te));if(ne==="jsonc"){let Pe=[],$e=Tu(te,Pe,{allowTrailingComma:!0});if(Pe.length)throw Error("invalid JSONC");return pt($e)}return pt(JSON.parse(te))}catch{return u.push(`Could not parse ${Y}`),{}}}let v=[...d.keys()].sort(),j=f("package.json"),P={packageJson:d.get("package.json")??null,rootFiles:v.filter((Y)=>!Y.includes("/")),configFiles:Object.fromEntries(["requirements.txt","pyproject.toml","pnpm-workspace.yaml"].flatMap((Y)=>d.get(Y)?[[Y,d.get(Y)]]:[]))},I=Tc(P),C=v.flatMap((Y)=>{let ne=Y.replace(/\/package\.json$/,""),te=ne!==Y&&(I.packages.includes(ne)||I.parents.some(($e)=>ne.startsWith(`${$e}/`)&&!ne.slice($e.length+1).includes("/"))),Pe=d.get(Y);return te&&Pe?[{dir:ne,packageJson:Pe}]:[]}),T=$c({...P,workspacePackages:C}),R=typeof j.packageManager==="string"?/^(npm|pnpm|yarn|bun)@(.+)$/.exec(j.packageManager):null,F=Object.create(null);for(let[Y,ne]of Object.entries(pt(j.engines)))if(typeof ne==="string")F[Y]=ne;if(R)F[R[1]]=R[2].split("+")[0];let L=f("composer.json"),H={...pt(L["require-dev"]),...pt(L.require)},X={...typeof H.php==="string"?{constraint:H.php}:{},extensions:Object.keys(H).filter((Y)=>Y.startsWith("ext-")).map((Y)=>Y.slice(4)).sort()};for(let[Y,ne]of[[".nvmrc","node"],[".node-version","node"],[".python-version","python"],[".php-version","php"],[".bun-version","bun"]]){let te=d.get(Y)?.trim();if(te)F[ne]=te}for(let Y of(d.get(".tool-versions")??"").split(/\r?\n/)){let[ne,te]=Y.replace(/#.*/,"").trim().split(/\s+/);if(ne&&te)F[ne==="nodejs"?"node":ne]=te}for(let Y of[".mise.toml","mise.toml"])for(let[ne,te]of Object.entries(pt(f(Y,"toml").tools)))if(typeof te==="string"||typeof te==="number")F[ne]=String(te);else u.push(`Unsupported tool version for ${ne} in ${Y}`);let D=[];for(let Y of v.filter((ne)=>/(^|\/)package.json$/.test(ne))){let ne=Y==="package.json"?j:f(Y),te={...pt(ne.dependencies),...pt(ne.devDependencies)};for(let Pe of["nuxt","next","astro","@sveltejs/kit","vite"])if(Pe in te)D.push({path:Y,name:Pe})}for(let[Y,ne]of[["yiisoft/yii2","yii2"],["laravel/framework","laravel"]])if(Y in H)D.push({path:"composer.json",name:ne});let B=new Set,Z=Object.create(null);function Q(Y,ne){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(Y))return;if(B.add(Y),/(?:^|_)HOST$/.test(Y)&&typeof ne==="string"&&/^[a-zA-Z0-9_.-]+$/.test(ne))Z[Y]=ne}for(let Y of v.filter((ne)=>/(^|\/)\.env\.(example|sample|template)$/.test(ne)))for(let ne of(d.get(Y)??"").split(/\r?\n/)){let te=/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*?)\s*(?:#.*)?$/.exec(ne);if(te)Q(te[1],te[2].replace(/^['"]|['"]$/g,""))}let we=[],Te=[];for(let Y of v.filter((ne)=>/(^|\/)(?:docker-compose|compose)(?:[.-][^/]*)?\.ya?ml$/.test(ne)))for(let[ne,te]of Object.entries(pt(f(Y,"yaml").services))){let Pe=pt(te),$e=typeof Pe.image==="string"?Pe.image:"",Qe=$e.split("/").at(-1)?.split(/[:@]/)[0],st=Qe==="mysql"||Qe==="mariadb"?"mysql":Qe==="postgres"?"postgres":Qe==="redis"?"redis":null;if(st)we.push({file:Y,name:ne,kind:st,image:$e});else if(Qe!=="traefik"&&Qe!=="nginx"&&Qe!=="caddy")Te.push({file:Y,name:ne});for(let[et,nt]of Object.entries(pt(Pe.environment)))Q(et,nt);for(let et of Tn(Pe.environment)){let nt=et.indexOf("=");Q(nt<0?et:et.slice(0,nt),nt<0?null:et.slice(nt+1))}}let ye=v.find((Y)=>Y===".devcontainer/devcontainer.json")??v.find((Y)=>Y==="devcontainer.json"),Oe;if(ye){let Y=f(ye,"jsonc");for(let ne of[Y.containerEnv,Y.remoteEnv])for(let[te,Pe]of Object.entries(pt(ne)))Q(te,Pe);Oe={...typeof Y.image==="string"?{image:Y.image}:{},services:[...typeof Y.service==="string"?[Y.service]:[],...Tn(Y.runServices)],ports:Array.isArray(Y.forwardPorts)?Y.forwardPorts.filter((ne)=>Number.isInteger(ne)&&Number(ne)>0&&Number(ne)<=65535):[],commands:[Y.onCreateCommand,Y.updateContentCommand,Y.postCreateCommand,Y.postStartCommand].filter((ne)=>typeof ne==="string")}}let oe=Tn(j.workspaces).length?Tn(j.workspaces):Tn(pt(j.workspaces).packages);return oe.push(...Tn(f("pnpm-workspace.yaml","yaml").packages)),{language:d.has("package.json")?"typescript":d.has("pyproject.toml")||d.has("requirements.txt")?"python":d.has("go.mod")?"go":d.has("Cargo.toml")?"rust":d.has("composer.json")?"php":d.has("Gemfile")?"ruby":"other",commands:T,packageManager:R?{name:R[1],version:R[2]}:T.packageManager?{name:T.packageManager}:null,lockfiles:v.filter((Y)=>/(^|\/)(bun.lockb?|pnpm-lock.yaml|yarn.lock|package-lock.json|composer.lock|uv.lock|poetry.lock|Pipfile.lock|Cargo.lock|Gemfile.lock)$/.test(Y)),toolchain:F,php:X,workspaces:[...new Set(oe)].sort(),frameworks:D,turbo:d.has("turbo.json")||"turbo"in pt(j.devDependencies)||"turbo"in pt(j.dependencies),services:we,unsupportedServices:Te,envKeys:[...B].sort(),envHosts:Z,...Oe?{devcontainer:Oe}:{},warnings:u}}import{createHash as br}from"node:crypto";import{createReadStream as Vu}from"node:fs";import{lstat as el,mkdir as Xu,readFile as wr,readdir as Yu,readlink as Zu,realpath as co,stat as tl,writeFile as Qu}from"node:fs/promises";import{basename as Zt,dirname as em,isAbsolute as tm,join as kr,relative as fr,resolve as hr,sep as zs}from"node:path";import{execFile as nm,spawnSync as rm}from"node:child_process";import yr from"ignore";import{createReadStream as Nu}from"node:fs";import{lstat as On,mkdtemp as Fu,readFile as Fs,readdir as oo,rename as Lu,rm as Mu,writeFile as Hu}from"node:fs/promises";import{join as vt}from"node:path";import Ls from"ignore";function pr(d){let u=d.replace(/\/$/,"").split("/");return u.some((f,v)=>f.toLowerCase()===".hlix"&&v<u.length-1&&u[v+1]!=="skills"&&!(v===u.length-2&&["AGENTS.md","mcp.json"].includes(u[v+1])))}function ur(d,u){if(Array.isArray(u))return u.some((f)=>ur(d,f));if(!u||pr(d)||d.split("/").includes(".git"))return!1;return d===u||d.startsWith(`${u}/`)}function mr(d,u){if(typeof u!=="string")return u?.some((f)=>mr(d,f))??!1;if(pr(d)||pr(u))return!1;return ur(d,u)||u.startsWith(`${d}/`)}function Nc(d,u,f,v){let j=new Map,P=d.length,I=0;for(let F of d){let L=F.path.indexOf("/"),H=L<0?F.path:F.path.slice(0,L+1),X=j.get(H)??{count:0,bytes:0,included:!1};X.count++,X.bytes+=F.size??0,X.included||=ur(F.path,v),j.set(H,X),I+=F.size??0}let C=I>f,T=[...j].sort(([F,L],[H,X])=>Number(L.included)-Number(X.included)||(C?X.bytes-L.bytes:X.count-L.count)||F.localeCompare(H)),R=[];for(let[F,L]of T){if(P<=u&&I<=f)break;R.push(F),P-=L.count,I-=L.bytes}return R}function Rs(d,u){return u.some((f)=>d===f||f.endsWith("/")&&d.startsWith(f))}function Ns(d){return`upload limit; add /${d} to .hlixignore, or try --include ${d.replace(/\/$/,"")}`.slice(0,200)}function Fc(d){if(d.length<=5000)return d;return[...d.slice(0,4999),{path:d[4999].path,reason:`${d.length-4999} additional skipped paths (including this path); full list: hlix import --dry-run --json`}]}var Hc="# --- managed by Hlix: safe to edit above/below, this block is regenerated ---",Ms="# --- end managed by Hlix ---",Rn=new Set(["agent-artifacts",".context",".claude/worktrees"]),Hs=".claude/worktrees";function Us(d){for(let u of Rn)if(d===u||d.startsWith(`${u}/`))return!0;return!1}function Uc(d){return d===Hs||d.startsWith(`${Hs}/`)}var Uu=/(?:^|\/)(?:Makefile|Dockerfile|Containerfile|Justfile|Rakefile|Gemfile)(?:\.[^/]*)?$/i,Du=/\.(?:md|txt|json)$/i,Lc=/(?:^|\n)\s*(?:\/\/|\/\*+|\*|#|<!--)\s*(?:@generated\b|generated by\b|do not edit\b)|(?:^|\n)\s*\/\/[#@]\s*sourceMappingURL=/i,Mc=/\.(?:log(?:\.\d+)?|tmp|cache|pyc|tsbuildinfo|map)$/i;function gr(d){let u=[...d.matchAll(new RegExp(`^${Hc}\\r?$`,"gm"))],f=[...d.matchAll(new RegExp(`^${Ms}\\r?$`,"gm"))];if(!u.length&&!f.length)return{before:d,after:"",managed:""};if(u.length!==1||f.length!==1||f[0].index<u[0].index)return null;let v=u[0].index,P=f[0].index+Ms.length,I=d.slice(P).match(/^\r?\n/)?.[0]??"";return{before:d.slice(0,v),after:d.slice(P+I.length),managed:d.slice(v,P)}}function Gu(d,u){let f=d.filter((C)=>C.endsWith("/")),v=d.filter((C)=>!C.endsWith("/")),j=new Map,P=[];for(let C of v){let T=/\.[^./]+$/.exec(C)?.[0];if(!T){P.push(C);continue}let R=j.get(T)??[];R.push(C),j.set(T,R)}let I=[];for(let[C,T]of j){if(T.length<2){P.push(T[0]);continue}let R=Wu(T,C);if(!R){P.push(...T);continue}if(u.some((L)=>{let H=L.replace(/^\//,"").replace(/\/$/,"");return H.length>0&&Ls().add(R).ignores(H)}))P.push(...T);else I.push(R)}return[...f,...I,...P]}function Wu(d,u){let f=d.map((P)=>P.split("/")),v=[],j=Math.min(...f.map((P)=>P.length))-1;for(let P=0;P<j;P++)if(f.every((I)=>I[P]===f[0][P]))v.push(f[0][P]);else break;if(!v.some((P)=>P.length>0))return null;return`${v.join("/")}/**/*${u}`}function Ds(d){let u=gr(d);return(u?u.before+`
296
+ `+u.after:d).split(/\r?\n/).filter((f)=>f.startsWith("!")&&f.length>1).map((f)=>f.slice(1))}async function Dc(d,u){let f=vt(d,".hlixignore"),v="";try{let j=await On(f).catch((te)=>{if(te.code==="ENOENT")return null;throw te});if(j&&!j.isFile())return{warning:"Kept .hlixignore unchanged: managed rules require a regular file."};if(j)v=await Fs(f,"utf8");let P=gr(v);if(!P)return{warning:"Kept .hlixignore unchanged: repair its managed-block markers before refreshing."};let I=Ds(v),C=Ls().add(I),T=[],R=[],F=Ls(),L=new Set;for(let te of u.tracked){let Pe=te.split("/");while(Pe.length)L.add(Pe.join("/")),Pe.pop()}let H=0,X=0,D=()=>H<30000&&X<268435456,B=(te)=>L.has(te)||mr(te,u.includes)||I.some((Pe)=>{let $e=Pe.replace(/^\//,"").split(/[?*[\\]/)[0];return!$e||$e.startsWith(`${te}/`)||C.ignores(`${te}/`)||C.ignores(te)}),Z=async(te,Pe,$e=!1)=>{if(u.signal?.throwIfAborted(),!D()||B(te)||u.protectedPath(te,Pe))return!1;H++;let Qe=await On(vt(d,te));if(Qe.isSymbolicLink())return Pe;if(Qe.isDirectory()){let nt=(await oo(vt(d,te))).sort();for(let kt of nt){if(kt===".git")continue;if(!await Z(`${te}/${kt}`,Pe,$e))return!1}return!0}if(!Qe.isFile()||X+Qe.size>268435456)return!1;let st="",et="";for await(let nt of Nu(vt(d,te),{encoding:"utf8",signal:u.signal})){if(X+=Buffer.byteLength(nt),st.length<4096)st+=nt.slice(0,4096-st.length);let kt=et+nt;if(u.protectedContent(te,kt))return!1;et=kt.slice(-4096)}return Pe||Lc.test(st)||Lc.test(et)||!Uu.test(te)&&!/^#!|^<\?php/.test(st)&&($e&&Du.test(te)||Mc.test(te))},Q=new Set,we=async(te,Pe=[],$e=!1)=>{if(u.signal?.throwIfAborted(),!D())return;let Qe=vt(d,te),st=await oo(Qe,{withFileTypes:!0}),et=async(Re)=>st.find((ft)=>ft.name===Re)?.isFile()&&(await On(vt(Qe,Re))).size<1048576?Fs(vt(Qe,Re),"utf8"):null,nt=await et("package.json"),kt=await et("composer.json"),Lt=!1,rt=new Set;try{let Re=JSON.parse(await et("composer.lock")??"null");Lt=Array.isArray(Re?.packages);for(let Ne of[...Re?.packages??[],...Re?.["packages-dev"]??[]]){if(typeof Ne.name==="string")rt.add(Ne.name);if(Ne.dist?.type==="path")Lt=!1}}catch{}try{let Re=JSON.parse(nt??"{}"),Ne=Array.isArray(Re.workspaces)?Re.workspaces:Re.workspaces?.packages;for(let ft of Array.isArray(Ne)?Ne:[]){if(typeof ft!=="string"||ft.startsWith("!"))continue;let nn=(te?`${te}/`:"")+ft.replace(/^\.\//,"");R.push(nn),F.add(nn)}}catch{}let Un=[nt,kt].filter(Boolean).join(`
297
+ `),qt={};for(let Re of st){if(!/^(?:(?:vite|next|nuxt|astro|webpack|rollup)\.config\.[cm]?[jt]s|tsconfig(?:\.[^/]*)?\.json|turbo\.json|pyproject\.toml|setup\.py)$/.test(Re.name))continue;let Ne=await et(Re.name);if(Ne!==null)qt[Re.name]=Ne}let Dn={packageJson:nt,rootFiles:st.map((Re)=>Re.name),configFiles:qt};$e||=Os(qt);let Gn=Oc(Dn);for(let Re of Ts(Dn))Q.add(te?`${te}/${Re}`:Re);let Jt=new Set([...Gn,...Pe]);for(let Re of st.sort((Ne,ft)=>Ne.name<ft.name?-1:Ne.name>ft.name?1:0)){if([".git",".hlix",".hlixignore"].includes(Re.name)||Re.isSymbolicLink())continue;let Ne=te?`${te}/${Re.name}`:Re.name;if(/[\n\r\\*?[\]!#]/.test(Ne)||Ne.endsWith(" "))continue;if(H++,!D())return;if(Re.isDirectory()){if(Ne===Hs&&!B(Ne)){T.push(`/${Ne}/`);continue}let ft=[...Rn].find((ot)=>Ne===ot||Ne.startsWith(`${ot}/`));if(ft&&Re.name===".agents"){let ot=`/${ft}/**/.agents/`;if(!T.includes(ot))T.push(ot);continue}let nn=await On(vt(d,Ne,".git")).then(()=>u.isRepository(Ne),()=>!1),rn=Rn.has(Ne)||[...Rn].some((ot)=>Ne.startsWith(`${ot}/`)),Ct=u.gitIgnored.directories.some((ot)=>`${Ne}/`.startsWith(ot)),Et=F.ignores(`${Ne}/`)||R.some((ot)=>ot.split(/[?*[\\]/)[0].startsWith(`${Ne}/`))||Un.includes(Re.name)||/(?:^|\/)(?:src|lib|apps|packages|tests|resources|public)(?:\/|$)/.test(Ne),Wn=nn&&(rn||Ct)&&!Et;if(Re.name==="vendor"&&Lt)for(let ot of await oo(vt(d,Ne),{withFileTypes:!0})){if(["autoload.php","composer","bin"].includes(ot.name))continue;if(!ot.isDirectory()){Lt=!1;break}for(let on of await oo(vt(d,Ne,ot.name)))if(!rt.has(`${ot.name}/${on}`))Lt=!1}let Bn=Gn.includes(Re.name)&&(Re.name==="node_modules"||Re.name==="vendor"&&Lt&&!/"type"\s*:\s*"path"/.test(kt??"")),zn=Q.has(Ne)||$e&&Re.name.endsWith(".egg-info");if(((Re.name==="node_modules"||Re.name==="vendor"?Bn:Jt.has(Re.name))||Rn.has(Ne)&&!Et||["logs","runtime","tmp"].includes(Re.name)||Wn||zn)&&!B(Ne)&&await Z(Ne,Bn||Wn||zn,Jt.has(Re.name)||Rn.has(Ne))){T.push(`/${Ne}/`);continue}if(!nn&&!["node_modules","vendor"].includes(Re.name))await we(Ne,Jt.has("__pycache__")?["__pycache__"]:[],$e)}else if(Re.isFile()&&(Mc.test(Re.name)||(await On(vt(d,Ne))).size>u.maxFileBytes)&&!B(Ne)&&await Z(Ne,!1))T.push(`/${Ne}`)}};await we("");let Te=Gu(T,I),ye=v.includes(`\r
298
+ `)?`\r
299
+ `:`
300
+ `,Oe=[Hc,...Te.sort(),Ms,""].join(ye),Y=P.before+(P.before&&!P.before.endsWith(`
301
+ `)?ye:"")+Oe+P.after;if(u.write!==!1&&Y!==v){let te=await Fu(vt(d,".hlixignore-"));try{let Pe=vt(te,"rules");await Hu(Pe,Y,{mode:j?.mode??420});let $e=await On(f).catch((Qe)=>{if(Qe.code==="ENOENT")return null;throw Qe});if($e?!$e.isFile()||$e.ino!==j?.ino||$e.dev!==j?.dev||await Fs(f,"utf8")!==v:j!==null)return{warning:"Kept .hlixignore unchanged: it changed while generated paths were being checked."};await Lu(Pe,f)}finally{await Mu(te,{recursive:!0,force:!0})}}let ne=Te.every((te)=>te.endsWith("/"))?"generated folders":"generated paths";return{rules:Te,report:`Hlix ignored ${Te.length} ${ne} — see .hlixignore`}}catch(j){return u.signal?.throwIfAborted(),{warning:`Kept .hlixignore unchanged: could not safely refresh generated paths (${j.code??"unreadable"}).`}}}import{readFile as zu}from"node:fs/promises";import{join as qu}from"node:path";function Bu(d){let u=d.trim();if(!u||/^[|>[{]/.test(u))return null;let f=u.match(/^(["'])([\s\S]*)\1$/);if(!f&&/^["']/.test(u))return null;return(f?f[2].trim():u.replace(/(?:^|\s)#.*$/,"").trim())||null}function Gc(d){let u=d.split(/\r?\n/),f=u.findIndex((I)=>/^tasks:\s*(?:#.*)?$/.test(I));if(f===-1)return{tasks:[],partial:/^tasks:\s*\S/m.test(d)};let v=[],j=!1,P=-1;for(let I of u.slice(f+1)){if(!I.trim()||/^\s*#/.test(I))continue;let C=I.length-I.trimStart().length,T=I.match(/^(\s*-(?:\s+|$))(.*)$/);if(T){if(P!==-1&&C>=P)continue;if(v.push({}),P=T[2]?T[1].length:-1,!T[2])continue}else if(C===0)break;else if(v.length===0)continue;else if(P===-1)P=C;else if(C!==P)continue;let R=(T?T[2]:I.trim()).match(/^([A-Za-z_][A-Za-z0-9_-]*):\s*(.*)$/);if(!R)continue;let F=R[1];if(F!=="name"&&F!=="before"&&F!=="init"&&F!=="command")continue;let L=Bu(R[2]);if(L===null)j=!0;else v[v.length-1][F]=L}return{tasks:v,partial:j}}async function yn(d,u){try{return await zu(qu(d,...u.split("/")),"utf8")}catch(f){if(f.code==="ENOENT")return null;throw f}}function Wc(d){try{let u=d.replace(/(^|[^:\\])\/\/.*$/gm,"$1").replace(/\/\*[\s\S]*?\*\//g,"").replace(/,\s*([}\]])/g,"$1");return JSON.parse(u)}catch{return null}}function Yt(d){if(typeof d==="string"&&d.trim())return[d.trim()];if(Array.isArray(d))return d.flatMap(Yt);if(d&&typeof d==="object")return Object.values(d).flatMap(Yt);return[]}function Gs(d){if(!d||typeof d!=="object")return[];return Object.keys(d).filter((u)=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(u))}function Ju(d,u){let f=new Set,v=[/\bprocess\.env\.([A-Za-z_][A-Za-z0-9_]*)/g,/\bimport\.meta\.env\.([A-Za-z_][A-Za-z0-9_]*)/g,/\bos\.(?:getenv|environ\.get)\(\s*["']([A-Za-z_][A-Za-z0-9_]*)/g,/\bos\.Getenv\(\s*["']([A-Za-z_][A-Za-z0-9_]*)/g,/\bENV\[\s*["']([A-Za-z_][A-Za-z0-9_]*)/g];if(u)v.push(/\$\{([A-Za-z_][A-Za-z0-9_]*)(?::[-?][^}]*)?\}/g);for(let j of v)for(let P of d.matchAll(j))f.add(P[1]);return[...f]}function Ku(d,u){if(d.has("bun.lock")||d.has("bun.lockb")||u?.startsWith("bun@"))return"bun install";if(d.has("pnpm-lock.yaml")||u?.startsWith("pnpm@"))return"pnpm install";if(d.has("yarn.lock")||u?.startsWith("yarn@"))return"yarn install";if(d.has("package.json"))return"npm install";return null}function Bc(d){let u=typeof d==="number"?d:Number(d);return Number.isInteger(u)&&u>0&&u<=65535?u:null}function Pt(d,u,f){if(!d.some((v)=>v.path===u&&v.kind===f))d.push({path:u,kind:f})}async function zc(d,u,f){let v=[],j=[],P=[],I=[],C=new Map,T=new Set,R=new Set,F=[],L={},H=null,X=0,D=await yn(d,".cursor/environment.json");if(D){Pt(v,".cursor/environment.json","cursor");let oe=Wc(D);if(!oe)F.push("Could not parse .cursor/environment.json; it remains quarantined.");else{j.push(...Yt(oe.install));let Y=Yt(oe.start);if(Y[0])H=Y[0];if(Array.isArray(oe.terminals))for(let ne of oe.terminals){if(!ne||typeof ne!=="object")continue;let te=ne;if(typeof te.command!=="string"||!te.command.trim())continue;I.push({name:typeof te.name==="string"&&te.name.trim()?te.name.trim():"Terminal",command:te.command.trim(),...typeof te.cwd==="string"&&te.cwd.trim()?{cwd:te.cwd.trim()}:{}})}}}let B=u.has(".devcontainer/devcontainer.json")?".devcontainer/devcontainer.json":u.has("devcontainer.json")?"devcontainer.json":null;if(B){Pt(v,B,"devcontainer");let oe=Wc(f.get(B)??await yn(d,B)??"");if(!oe)F.push(`Could not parse ${B}; it remains quarantined.`);else{j.push(...Yt(oe.onCreateCommand),...Yt(oe.updateContentCommand),...Yt(oe.postCreateCommand));let Y=Yt(oe.postStartCommand);if(!H&&Y[0])H=Y[0];for(let ne of Gs(oe.secrets))T.add(ne);for(let ne of[...Gs(oe.containerEnv),...Gs(oe.remoteEnv)])T.add(ne);if(Array.isArray(oe.forwardPorts))for(let ne of oe.forwardPorts){let te=Bc(ne);if(te)C.set(te,{port:te,visibility:"private"})}}}if(u.has(".gitpod.yml")){Pt(v,".gitpod.yml","gitpod");let oe=f.get(".gitpod.yml")??await yn(d,".gitpod.yml");if(oe===null)F.push("Could not read .gitpod.yml; its task commands were not imported.");else{let Y=Gc(oe);X=Y.tasks.filter((ne)=>ne.before).length;for(let ne of Y.tasks){if(ne.before)j.push(ne.before);if(ne.init)j.push(ne.init);if(!ne.command)continue;if(!H)H=ne.command;else I.push({name:ne.name??"Terminal",command:ne.command})}if(Y.partial)F.push("Some .gitpod.yml task values are not plain `key: value` scalars and were not imported; review .gitpod.yml before approving cloud setup.")}}for(let oe of["Dockerfile","docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml"])if(u.has(oe))Pt(v,oe,"docker");for(let oe of["project.toml","nixpacks.toml","railpack.json","Aptfile"])if(u.has(oe))Pt(v,oe,"buildpack");for(let oe of["fly.toml","railway.json","render.yaml","vercel.json","netlify.toml"])if(u.has(oe))Pt(v,oe,"platform");let Z=f.get("package.json")??await yn(d,"package.json");if(Z){Pt(v,"package.json","package");try{let oe=JSON.parse(Z);if(oe.engines?.node)L.node=oe.engines.node;let Y=Ku(u,oe.packageManager);if(Y&&j.length===X)j.push(Y);if(oe.scripts?.build&&P.length===0)P.push(`${oe.packageManager?.split("@")[0]??(u.has("bun.lock")?"bun":"npm")} run build`);let ne=oe.scripts?.dev?`${u.has("bun.lock")?"bun":"npm"} run dev`:null,te=oe.scripts?.start?`${u.has("bun.lock")?"bun":"npm"} run start`:ne;if(!H&&te)H=te}catch{F.push("Could not parse package.json for environment discovery.")}}if(u.has("uv.lock"))j.push("uv sync --frozen");else if(u.has("poetry.lock"))j.push("poetry install --no-interaction");else if(u.has("requirements.txt"))j.push("python -m pip install -r requirements.txt");if(u.has("go.mod"))j.push("go mod download");if(u.has("Procfile")){Pt(v,"Procfile","procfile");let Y=(f.get("Procfile")??"").split(/\r?\n/).find((ne)=>/^web\s*:/.test(ne));if(Y)H=Y.replace(/^web\s*:\s*/,"").trim()||H}let Q=[[".node-version","node"],[".nvmrc","node"],[".python-version","python"]];for(let[oe,Y]of Q){let ne=(f.get(oe)??await yn(d,oe))?.trim();if(ne)L[Y]=ne,Pt(v,oe,"tool-version")}let we=f.get(".tool-versions")??await yn(d,".tool-versions");if(we){Pt(v,".tool-versions","tool-version");for(let oe of we.split(/\r?\n/)){let[Y,ne]=oe.trim().split(/\s+/,2);if(!ne)continue;if(Y==="nodejs")L.node=ne;else if(Y==="python")L.python=ne;else if(Y==="bun")L.bun=ne}}let Te=f.get("mise.toml")??await yn(d,"mise.toml");if(Te){Pt(v,"mise.toml","tool-version");for(let oe of Te.matchAll(/^\s*(node|python|bun)\s*=\s*["']([^"']+)["']/gm))L[oe[1]]=oe[2]}for(let[oe,Y]of f){let ne=/(?:^|\/)(?:Dockerfile|Procfile)$/i.test(oe)||/\.(?:jsonc?|ya?ml|toml|ini|conf|config|env|sh|bash|zsh|fish)$/i.test(oe);for(let te of Ju(Y,ne))R.add(te);for(let te of Y.matchAll(/(?:--port(?:=|\s+)|PORT\s*=\s*)(\d{2,5})/g)){let Pe=Bc(te[1]);if(Pe)C.set(Pe,{port:Pe,visibility:"private"})}}if(v.length===0&&u.size>0)Pt(v,"repository","detected");let ye=(oe)=>[...new Set(oe.filter(Boolean))],Oe=v.length+j.length+(H?1:0);return{sources:v.sort((oe,Y)=>oe.path.localeCompare(Y.path)),toolchain:L,install:ye(j),build:ye(P),start:H,terminals:I,ports:[...C.values()].sort((oe,Y)=>oe.port-Y.port),requiredSecretKeys:[...T].sort(),observedSecretKeys:[...R].sort(),confidence:Oe>=4?"high":Oe>=2?"medium":"low",warnings:F}}var qc=2;var nl=300000,om=25000,Jc=52428800,rl=524288000,vr=1e4,sm="Potential secrets exist in Git history",im="Never delete .git folders or files to get past this; use .hlixignore instead.",so=1048576,am=rl,ol=[".git/","node_modules/",".next/",".turbo/",".cache/","dist/","build/","coverage/","__pycache__/",".venv/","venv/","target/",".DS_Store",...Cn],Dv=yr().add(ol);var Js="Required project environment value was not found locally: ",cm=/(^|\/)\.env\.(example|sample|template)$/i,lm=/(^|\/)\.env(?:\.[^/]+)?$/i,dm=/(^|\/)(?:\.envrc|\.netrc|\.npmrc|\.pypirc|credentials(?:\.[^/]+)?(?:\.json|\.toml)?|service-account[^/]*\.json|firebase-adminsdk[^/]*\.json|application_default_credentials\.json|\.docker\/config\.json|\.cargo\/credentials(?:\.toml)?|\.gem\/credentials|\.bundle\/config|(?:pip|pypi)\.conf|\.aws\/credentials|[^/]+\.(?:pem|key|p12|pfx)|[^/]*\.(?:auto\.)?tfvars(?:\.json)?|application[^/]*\.(?:properties|ya?ml)|(?:local|keystore|gradle|secrets?)\.properties|appsettings[^/]*\.json|local\.settings\.json|config\/database\.ya?ml|wrangler\.toml|fly\.toml|serverless\.ya?ml|(?:credentials|secrets?)[^/]*\.(?:json|ya?ml|toml|ini|conf|cfg))$/i,pm=/\.(?:example|sample|template)$/i,um=/(^|\/)\.(?:npmrc|yarnrc(?:\.yml)?|pypirc)$/i,mm=/(?:^|\/)(?:__tests__|tests?|fixtures)\/|\.(?:test|spec)\.[^/]+$|\.snap$/i,gm=/\.(?:md|mdx|txt|rst)$/i,fm=/fake|dummy|example|placeholder|unused|changeme|xxxx|redacted|your[_-]|<[^>]*>/i,hm=/^(.)\1+$/,ym=/RegExp\(/,Ks="BEGIN (RSA |EC |OPENSSH )?PRIVATE KEY|npm_[A-Za-z0-9]{30,}|gh[opusr]_[A-Za-z0-9_]{30,}|AKIA[0-9A-Z]{16}|xox[baprs]-[A-Za-z0-9-]{20,}",wm=new RegExp(Ks,"g"),vm=/(^|\/)(?:\.mcp\.json|mcp\.json|claude_desktop_config\.json)$/i,bm=/(^|\/)(?:\.agents|\.claude|\.hlix)\/skills\//i,Qt=new Set(["HLIX_AGENT_RUN_ID","HLIX_API_KEY","HLIX_API_URL","HLIX_BASE_URL","HLIX_PROJECT_ID","HLIX_SESSION_TOKEN","HLIX_WORKSPACE_ID"]),Ws="Your hlix credentials were left out of the project's secrets — the platform provides them.",Bs=new Set(["CI","HOME","LANG","LOGNAME","NODE_ENV","OLDPWD","PATH","PORT","PWD","SHELL","SHLVL","TERM","TMPDIR","USER","_"]),km=100,Kc=12;function xm(d){let u=d.slice(0,Kc).join(", "),f=d.length-Kc;return d.length===1?`Observed environment reference has no local value: ${d[0]}`:`${d.length} observed environment references have no local value: ${u}${f>0?`, +${f} more`:""}`}var Sm=250;function en(d){return d.split(zs).join("/")}function zt(d){if(d>=1048576)return`${(d/1048576).toFixed(1)} MB`;if(d>=1024)return`${(d/1024).toFixed(1)} KB`;return`${d} bytes`}function Vc(d,u=5){return[...d].sort((f,v)=>v.size-f.size||f.path.localeCompare(v.path)).slice(0,u).map((f)=>`${f.path} (${zt(f.size)})`).join(", ")}function jm(d,u=5){let f=new Map;for(let v of d){let j=v.indexOf("/"),P=j===-1?".":v.slice(0,j);f.set(P,(f.get(P)??0)+1)}return[...f].sort((v,j)=>j[1]-v[1]||v[0].localeCompare(j[0])).slice(0,u).map(([v,j])=>`${v}/ (${j} files)`).join(", ")}function It(d,u,f=10485760){return rm("git",["-C",d,...u],{encoding:"utf8",timeout:nl,maxBuffer:f,stdio:["ignore","pipe","pipe"]})}var Pm=20;function Em(d){let u=[];for(let f of d.split(`
302
+ `)){if(f.length<4)continue;let v=f.slice(3),j=v.lastIndexOf(" -> ");if(j!==-1)v=v.slice(j+4);if(v.startsWith('"')&&v.endsWith('"'))v=v.slice(1,-1);if(!v)continue;if(u.push(v),u.length>=Pm)break}return u}function lo(d){let u=d.branch?` on ${d.branch}`:"";if(!d.inProgress)return`${d.name}${u}`;let f=d.changes.slice(0,3),v=d.changes.length>f.length?`, +${d.changes.length-f.length} more`:"",j=f.length?`: ${f.join(", ")}${v}`:"",P=d.pushed?", already on the remote":"";return`${d.name}${u}, work in progress${j}${P}`}function Im(d){return d.startsWith('"')&&d.endsWith('"')?d.slice(1,-1):d}function _m(d){let u=[],f="",v="",j=null,P=!1,I=()=>{if(f&&v&&!P)u.push({path:f,commit:v,branch:j});f="",v="",j=null,P=!1};for(let C of d.split(`
303
+ `)){if(!C){I();continue}if(C.startsWith("worktree ")){I(),f=Im(C.slice(9));continue}if(C.startsWith("HEAD ")){v=C.slice(5).trim();continue}if(C.startsWith("branch ")){j=C.slice(7).trim().replace(/^refs\/heads\//,"");continue}if(C==="detached"){j=null;continue}if(C.startsWith("prunable"))P=!0}return I(),u}async function Cm(d,u){let[f,v]=await Promise.all([a(u,["status","--porcelain"]),a(d,["rev-parse","HEAD"])]),j=f.status===0?Em(f.stdout):[],P=!1,I=v.status===0?v.stdout.trim():"";if(I){let C=await a(u,["rev-list","--count",`${I}..HEAD`]);P=C.status===0&&Number(C.stdout.trim())>0}return{inProgress:j.length>0||P,changes:j,ahead:P}}function Xc(d){return/^[A-Za-z0-9._/-]+$/.test(d)&&!d.includes("..")&&!d.startsWith("/")&&!d.endsWith("/")}async function $m(d,u,f){if(!Xc(u)||!/^[0-9a-f]{40}$/i.test(f))return!1;let v=await a(d,["remote"]);if(v.status!==0)return!1;for(let j of v.stdout.split(`
304
+ `)){let P=j.trim();if(!P||!Xc(P))continue;if((await a(d,["merge-base","--is-ancestor",f,`refs/remotes/${P}/${u}`])).status===0)return!0}return!1}async function Am(d,u=!1){let f=await a(d,["worktree","list","--porcelain"]);if(f.status!==0)return{cycles:[],inside:new Set};let v=await co(d).catch(()=>hr(d)),j=[],P=new Set;for(let I of _m(f.stdout)){let C=await co(I.path).catch(()=>I.path);if(C===v)continue;let T=fr(v,C),R=T!==""&&T!==".."&&!T.startsWith(`..${zs}`)&&!tm(T),F=R?T.split(zs).join("/"):C;if(R)P.add(F);if(u)continue;let L=await Cm(d,C),H=Boolean(I.branch&&I.commit&&L.ahead&&await $m(d,I.branch,I.commit));j.push({name:Zt(C),path:F,branch:I.branch,commit:I.commit,inProgress:L.inProgress,changes:L.changes,pushed:H})}return j.sort((I,C)=>I.path.localeCompare(C.path)),{cycles:j,inside:P}}function a(d,u,f={}){return new Promise((v)=>{nm("git",["-C",d,...u],{encoding:"utf8",timeout:nl,maxBuffer:f.maxBuffer??10485760,...f.signal?{signal:f.signal}:{}},(j,P)=>{let I=j?.code;v({status:j===null?0:typeof I==="number"?I:1,stdout:typeof P==="string"?P:""})})})}async function Tm(d){let u=br("sha256");for await(let f of Vu(d))u.update(f);return u.digest("hex")}function qs(d){if(Array.isArray(d))return`[${d.map(qs).join(",")}]`;if(d&&typeof d==="object")return`{${Object.entries(d).sort(([u],[f])=>u.localeCompare(f)).map(([u,f])=>`${JSON.stringify(u)}:${qs(f)}`).join(",")}}`;return JSON.stringify(d)}function sl(d,u){let f={};for(let[v,j]of String(d).replace(/^\uFEFF/,"").split(/\r?\n/).entries()){let P=j.trim();if(!P||P.startsWith("#"))continue;let C=(P.startsWith("export ")?P.slice(7).trimStart():P).match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);if(!C){let R=`Invalid dotenv assignment on line ${v+1}`;if(u){u(R);continue}throw Error(R)}let T=C[2]??"";if(T.startsWith('"')){if(!T.endsWith('"'))throw Error(`Unclosed dotenv quote on line ${v+1}`);T=T.slice(1,-1).replace(/\\n/g,`
305
+ `).replace(/\\r/g,"\r")}else if(T.startsWith("'")){if(!T.endsWith("'"))throw Error(`Unclosed dotenv quote on line ${v+1}`);T=T.slice(1,-1)}else T=T.replace(/\s+#.*$/,"").trimEnd();f[C[1]]=T}return f}function Om(d,u){return d.split(/(?<=\n)/).filter((f)=>{let v=f.trim(),P=(v.startsWith("export ")?v.slice(7).trimStart():v).match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=/)?.[1];return P===void 0||!u.has(P)}).join("")}function Rm(d){let u=null;for(let f=0;f<d.length;f+=1){let v=d[f];if(v==="\\"&&u!=="single"){if(d[f+1]!=="$")return!0;f+=1;continue}if(v==="'"&&u!=="double"){u=u==="single"?null:"single";continue}if(v==='"'&&u!=="single"){u=u==="double"?null:"double";continue}if(u!=="single"&&(v==="$"||v==="`"))return!0;if(u===null&&(v==="<"||v===">")&&d[f+1]==="(")return!0}return u!==null}function Nm(d){let u={},f=new Set,v=new Set;for(let j of String(d).replace(/^\uFEFF/,"").split(/\r?\n/)){let P=j.trim();if(!P||P.startsWith("#"))continue;let C=(P.startsWith("export ")?P.slice(7).trimStart():P).match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);if(!C)continue;let T=C[1],R=C[2]??"";if(f.add(T),Rm(R)){delete u[T],v.add(T);continue}try{let L=sl(`${T}=${R}`)[T];if(L===void 0)throw Error("missing literal");u[T]=R.trimStart().startsWith("'")?L:L.replace(/\\\$/g,"$"),v.delete(T)}catch{delete u[T],v.add(T)}}return{values:u,keys:[...f].sort(),dynamicKeys:[...v].sort()}}async function Fm(d){let u=It(d,["rev-parse","--show-toplevel"]);if(u.status!==0)return!1;try{return await co(u.stdout.trim())===d}catch{return!1}}function Lm(d,u){if(!u)return new Set;let f=It(d,["ls-files","-z"]);if(f.status!==0)throw Error("Could not enumerate tracked files.");return new Set(f.stdout.split("\x00").filter(Boolean).map(en))}function Mm(d,u){if(!u)return[];let f=It(d,["config","--get-regexp","^remote\\..*\\.url$"]);if(f.status!==0)return[];let v=[];for(let j of f.stdout.split(`
306
+ `)){let P=j.trim();if(!P)continue;let I=/^remote\.(.*)\.url (.+)$/.exec(P);if(I)v.push({name:I[1],url:I[2]})}return v}function Hm(d,u){if(!u)return{files:new Set,directories:[]};let f=It(d,["ls-files","-z","--others","--ignored","--exclude-standard","--directory"]);if(f.status!==0)throw Error("Could not enumerate ignored files.");let v=new Set,j=[];for(let P of f.stdout.split("\x00").filter(Boolean)){let I=en(P);if(I.endsWith("/"))j.push(I);else v.add(I)}return{files:v,directories:j}}async function Yc(d,u){let f=[],v=[],j=[],P="";for(let F of[".gitignore",".hlixignore"])try{let L=kr(d,F),H=await el(L);if(F===".gitignore"&&H.isSymbolicLink()){v.push(F);continue}if(H.isFile()||H.isSymbolicLink())try{if(H.isSymbolicLink()&&!(await tl(L)).isFile()){f.push(F);continue}let X=await wr(L,"utf8");if(F===".hlixignore")P=X;let D=F===".hlixignore"?gr(X):null;if(u&&D?.managed)X=X.replace(D.managed,u.join(`
307
+ `));j.push(X)}catch{f.push(F)}}catch(L){if(L.code!=="ENOENT")f.push(F)}let I=gr(P)?.managed??"",C=[".git/",...Cn],T=I?C:ol,R=Ds(P);return{hardMatcher:yr().add(R.length?C:T),matcher:yr().add([...T,...j.flatMap((F)=>F.split(/\r?\n/))]),unignored:yr().add(R),managedMatcher:yr().add(u??I),hasManaged:Boolean(I),negations:R,unreadable:f,symlinked:v}}function io(d){if(vm.test(d)||/^\.claude\/settings(?:\.local)?\.json$/.test(d))return"mcp";if(bm.test(d))return"skill";return null}function ao(d){if(lm.test(d)&&!cm.test(d))return"dotenv";if(dm.test(d))return"credential";return null}function Um(d,u){if(u)return[en(u)];let f=new Map([[".env",0],[".env.development",1],[".env.local",2],[".env.development.local",3]]),v=d.filter((j)=>f.has(Zt(j).toLocaleLowerCase("en-US"))).sort((j,P)=>j.slice(0,-Zt(j).length).localeCompare(P.slice(0,-Zt(P).length))||f.get(Zt(j).toLocaleLowerCase("en-US"))-f.get(Zt(P).toLocaleLowerCase("en-US")));return v.length>0?v:d.length===1?[...d]:[]}function Dm(d,u){try{let f=JSON.parse(u);if(!f.mcpServers||typeof f.mcpServers!=="object")return[];return Object.entries(f.mcpServers).map(([v,j])=>{let P=j&&typeof j==="object"?j:{},I=P.type==="http"||P.type==="sse"||P.type==="stdio"?P.type:typeof P.command==="string"?"stdio":typeof P.url==="string"?"http":"unknown",C=P.env&&typeof P.env==="object"?P.env:{};return{sourcePath:d,name:v,transport:I,...typeof P.command==="string"?{command:P.command}:{},...Array.isArray(P.args)&&P.args.every((T)=>typeof T==="string")?{args:P.args}:{},...typeof P.url==="string"?{url:P.url}:{},envKeys:Object.keys(C).sort(),enabled:!1}})}catch{return[]}}function Gm(d){let u=!1,f=!1;for(let v of d.split(/\r?\n/)){let j=v.trim();if(!j||j.startsWith("#")||j.startsWith(";")||j.startsWith("["))continue;let P=j.indexOf("=");if(P===-1)continue;let I=j.slice(0,P).trim().toLowerCase(),C=j.slice(P+1).trim().replace(/^["']|["']$/g,"");if(!C||/^\$(?:\{[^}]*\}|[A-Za-z_][A-Za-z0-9_]*)$/.test(C))continue;if(I.endsWith("_authtoken")||I.endsWith("_password"))return!0;if(I.endsWith("password"))f=!0;else if(I.endsWith("username"))u=!0}return u&&f}async function Wm(d,u,f,v){if(pm.test(f))return!1;if(!um.test(f))return!0;let j=await a(d,["show",`${u}:${f}`],{...v?{signal:v}:{}});return j.status===0&&Gm(j.stdout)}function Bm(d,u,f){let v=d.lastIndexOf("/",u),j=d.indexOf("/",f);return v!==-1&&j!==-1&&!/\s/.test(d.slice(v,u)+d.slice(f,j))}function zm(d){if(mm.test(d))return"test fixture";if(gm.test(d))return"documentation or pattern definition";return null}function qm(d,u){let f=null;for(let v of d.split(/\r?\n/))for(let j of v.matchAll(u)){let P=j[0],I=j.index??0,C=ym.test(v)||Bm(v,I,I+P.length)?"documentation or pattern definition":fm.test(P)||hm.test(P)?"placeholder value":null;if(C===null)return null;f??=C}return f}async function Jm(d,u,f,v){let j=zm(f);if(j!==null)return j;let P=await a(d,["show",`${u}:${f}`],{...v?{signal:v}:{}});return P.status===0?qm(P.stdout,wm):null}async function Zc(d,u,f){let v=[],j="unknown";for(let P of d.split(/\r?\n/)){if(P.startsWith("@@"))j=P.slice(2);else if(P.trim()){let I=en(P.trim());if(await f(j,I))v.push({commit:j,path:I,reason:u})}if(v.length>=100)break}return v}async function Qc(d,u,f={}){if(!u)return{head:null,branch:null,refs:[],commitCount:0,complete:!0,findings:[],blockingFindings:[],waivedReasons:[]};let v=It(d,["rev-parse","HEAD"]).stdout.trim()||null,j=It(d,["symbolic-ref","--short","-q","HEAD"]),P=j.status===0?j.stdout.trim()||null:null,I=Number.parseInt(It(d,["rev-list","--count","--all"]).stdout.trim(),10)||0,C=It(d,["for-each-ref","--format=%(refname)%00%(objectname)","refs/heads","refs/tags"]),T=C.stdout.split(`
308
+ `).filter(Boolean).map((Q)=>{let[we,Te]=Q.split("\x00");return{name:we,oid:Te}}).filter(({name:Q,oid:we})=>/^refs\/(?:heads|tags)\/.+/.test(Q)&&/^[0-9a-f]{40,64}$/.test(we)).sort((Q,we)=>Q.name.localeCompare(we.name)),R=f.signal,F=R?{signal:R}:{};f.onProgress?.(`history: ${I} commit${I===1?"":"s"}…`);let L=["log","--all",`--max-count=${vr}`,"--pretty=format:@@%H","--name-only"],H=await a(d,[...L,"--",".env",".env.*","*.pem","*.key",".npmrc","*.tfvars"],F),X=await a(d,["log","--all",`--max-count=${vr}`,"-G",Ks,"--pretty=format:@@%H","--name-only"],F);R?.throwIfAborted();let D=new Map;for(let Q of[...await Zc(H.stdout,"sensitive-path",(we,Te)=>Wm(d,we,Te,R)),...await Zc(X.stdout,"secret-pattern",async()=>!0)])D.set(`${Q.commit}:${Q.path}:${Q.reason}`,Q);let B=[...D.values()].slice(0,100),Z=new Map;for(let Q of B){if(Q.reason!=="secret-pattern")continue;let we=await Jm(d,Q.commit,Q.path,R);if(we!==null)Z.set(Q,we)}return f.onProgress?.(`history: ${I} commit${I===1?"":"s"} scanned`),{head:v,branch:P,refs:T,commitCount:I,complete:I<=vr&&T.length<=1000&&C.status===0&&H.status===0&&X.status===0,findings:B,blockingFindings:B.filter((Q)=>!Z.has(Q)),waivedReasons:[...Z.values()]}}function Km(d,u){let f=u?.XDG_CACHE_HOME??(u?.HOME?kr(u.HOME,".cache"):null);if(!f)return null;return kr(f,"hlix","history",`${br("sha256").update(d).digest("hex")}.json`)}async function Vm(d,u,f){let v=u?Km(d,f.environment):null;if(!v)return Qc(d,u,f);let j=br("sha256").update([It(d,["for-each-ref","--format=%(refname)%00%(objectname)"]).stdout,It(d,["rev-parse","HEAD"]).stdout,It(d,["symbolic-ref","--short","-q","HEAD"]).stdout,Ks,String(vr)].join("\x00")).digest("hex");try{let I=JSON.parse(await wr(v,"utf8"));if(I.key===j&&I.history)return f.onProgress?.(`history: ${I.history.commitCount} commits, unchanged since the last scan`),I.history}catch{}let P=await Qc(d,u,f);if(P.complete)try{await Xu(em(v),{recursive:!0,mode:448}),await Qu(v,JSON.stringify({key:j,history:P}),{mode:384})}catch{}return P}async function Ft(d,u={}){let f=await co(hr(d));if(!(await tl(f)).isDirectory())throw Error("Import target must be a directory.");let v=await Fm(f),j=Mm(f,v),P=Lm(f,v),I=new Set(v?(await a(f,["ls-files","--stage","-z"])).stdout.split("\x00").filter((ee)=>ee.startsWith("160000 ")).map((ee)=>ee.slice(ee.indexOf("\t")+1)):[]),C=Hm(f,v),T=[...new Set([...l(f)?.includedPaths??[],...u.include?[u.include]:[]].map((ee)=>ee.replace(/^\.\//,"").replace(/\/$/,"")))],R=await Yc(f),F=u.refreshIgnore||R.hasManaged?await Dc(f,{write:u.refreshIgnore===!0,tracked:v?P:new Set((await a(f,["ls-files","-z"])).stdout.split("\x00").filter(Boolean)),includes:T,gitIgnored:C,signal:u.signal,maxFileBytes:u.maxFileBytes??Jc,isRepository:async(ee)=>{let je=await a(kr(f,ee),["rev-parse","--show-toplevel"]);return je.status===0&&hr(je.stdout.trim())===hr(f,ee)},protectedPath:(ee,je)=>Boolean(ao(ee)||!je&&io(ee)),protectedContent:(ee,je)=>sr(ee,je)}):void 0,{hardMatcher:L,matcher:H,unignored:X,managedMatcher:D,unreadable:B,symlinked:Z,negations:Q}=F?await Yc(f,F.rules??[]):R,we=Q.some((ee)=>{let je=ee.replace(/^\//,"");return je===".claude/worktrees"||je.startsWith(".claude/worktrees/")}),Te=B.length?`Upload left unchanged: cannot read ${B.join(", ")}; check the ignore file target and permissions before retrying.`:void 0,ye=[],Oe=[],oe=[],Y=[],ne=[],te=[],Pe=[],$e=[],Qe=u.envFile?en(fr(f,hr(f,u.envFile))):void 0,st=Qe!==void 0&&Qe!==""&&Qe!==".."&&!Qe.startsWith("../");if(u.envFile&&!st)$e.push(`Selected environment file must stay inside the project: ${u.envFile}`);let et=new Map,nt=new Map,kt=new Map,Lt=new Map,rt=F?.warning?[F.warning]:[],Un=new Set,qt=[],Dn=[],Gn=new Set,Jt=[],Re=new Map,Ne=u.maxFiles??om,ft=u.maxFileBytes??Jc,nn=u.maxTotalBytes??rl,rn=u.maxProtectedTotalBytes??am,Ct=u.historyMode==="sanitize",Et=0,Wn=0,Bn=async(ee,je=!1)=>{let it=await Yu(ee,{withFileTypes:!0}).catch((ut)=>{let ht=en(fr(f,ee))||"repository";if(Pe.push({path:ht,reason:`Cannot read folder (${ut.code??"unreadable"}); check read and search permissions`}),rt.push(`Cannot read folder ${ht}; check its read and search permissions. Existing cloud files are preserved.`),ee===f)Te="Upload left unchanged: cannot read the project folder; check its permissions.";return[]});it.sort((ut,ht)=>ut.name.localeCompare(ht.name));for(let ut of it){if(u.signal?.throwIfAborted(),Wn+=1,Wn%Sm===0)u.onProgress?.(`scanning … ${ye.length} files`);let ht=kr(ee,ut.name),be=en(fr(f,ht));if(ut.name===".git"){if(be!==".git"&&!je)Un.add(en(fr(f,ee)));continue}if(be.length>1000||be.includes("\\")||be.includes("\x00")){rt.push(`Skipped a path that cannot be represented safely: ${be.slice(0,350)}`);continue}try{let lt=await el(ht);if(pr(be)||ut.name.toLowerCase()===".hlix"&&!lt.isDirectory())continue;let wn=ut.isDirectory()?`${be}/`:be,qi=P.has(be)&&!I.has(be),Jn=ur(be,T)||X.ignores(wn),vn=!Jn&&!qi&&(H.ignores(wn)||C.files.has(be)||C.directories.some((tt)=>wn.startsWith(tt))),Ji=!mr(be,T)&&L.ignores(wn);if(Ji){if(be!==".hlix")Pe.push({path:be,reason:"built-in ignore"});continue}if(vn&&D.ignores(wn))Pe.push({path:be,reason:"Hlix-managed ignore"});if(lt.isSymbolicLink()){if(vn)continue;if(Oe.push({path:be,target:await Zu(ht)}),io(be)||ao(be))oe.push(be);continue}if(ut.isDirectory()){if(Gn.has(be)&&!Jn)continue;if(Uc(be)&&!Jn&&!we){if(!(vn&&D.ignores(wn)))Pe.push({path:be,reason:"Hlix-managed ignore"});continue}if(Us(be)&&ut.name===".agents"&&!Jn){Pe.push({path:be,reason:"Hlix-managed ignore"});continue}if(Ji)continue;if(I.has(be)&&!vn)Un.add(be);await Bn(ht,vn);continue}let sn=io(be),bn=ao(be);if(sn&&Us(be)&&!Jn){Pe.push({path:be,reason:"Hlix-managed ignore"});continue}if(vn&&!sn&&!bn)continue;if(!ut.isFile()){Pe.push({path:be,reason:"non-regular-file"});continue}if(lt.size>ft&&!sn&&!bn){Pe.push({path:be,reason:Ns(be)});continue}if(lt.size>ft){$e.push(`File ${be} is ${zt(lt.size)}, over the ${zt(ft)} per-file limit. Exclude it with .hlixignore.`);continue}let Kn=await Tm(ht);if(sn){if(lt.size>so){$e.push(`Protected configuration ${be} is ${zt(lt.size)}, over the ${zt(so)} per-file limit. Move the large content out of it, or exclude it with .hlixignore.`);continue}let tt=await wr(ht);if(Et+=tt.byteLength,Jt.push({path:be,size:tt.byteLength}),Et>rn)continue;if(ne.push({path:be,kind:sn,size:lt.size,sha256:Kn}),qt.push({path:be,kind:sn,contentBase64:tt.toString("base64")}),sn==="mcp")te.push(...Dm(be,tt.toString("utf8")));continue}if(bn){if(lt.size>so){$e.push(`Protected file ${be} is ${zt(lt.size)}, over the ${zt(so)} per-file limit. Move the large content out of it, or exclude it with .hlixignore.`);continue}let tt=await wr(ht);if(Et+=tt.byteLength,Jt.push({path:be,size:tt.byteLength}),Et>rn)continue;let kn=[],Vn=new Set;if(bn==="dotenv")try{let Cr=sl(tt,(At)=>rt.push(`${be}: ${At}; ignored while discovering values.`)),xn={};for(let[At,Sn]of Object.entries(Cr)){if(Qt.has(At)){Vn.add(At);continue}xn[At]=Sn}et.set(be,xn),kn=Object.keys(xn).sort()}catch{$e.push(`Could not parse environment file: ${be}`)}else if(Zt(be)===".envrc"){let Cr=Nm(tt),xn={},At=new Set,Sn=[];for(let[yt,td]of Object.entries(Cr.values)){if(Qt.has(yt)){Vn.add(yt);continue}if(Bs.has(yt)){rt.push(`Ignored ambient runtime assignment in ${be}: ${yt}`);continue}At.add(yt),xn[yt]=td}nt.set(be,xn);for(let yt of Cr.dynamicKeys){if(Qt.has(yt)){Vn.add(yt);continue}if(Bs.has(yt)){rt.push(`Ignored ambient runtime assignment in ${be}: ${yt}`);continue}At.add(yt),Sn.push(yt)}if(kt.set(be,[...At].sort()),Lt.set(be,Sn.sort()),kn=[...At].sort(),Sn.length>0)rt.push(`Did not execute dynamic .envrc assignments; collect their resolved local values when available: ${Sn.join(", ")}`)}if(Vn.size>0)rt.push(Ws),tt=Buffer.from(Om(tt.toString("utf8"),Vn),"utf8"),Kn=br("sha256").update(tt).digest("hex");Y.push({path:be,kind:bn,keys:kn,size:tt.byteLength,sha256:Kn}),qt.push({path:be,kind:bn,contentBase64:tt.toString("base64")});continue}if(lt.size<=1048576){let tt=await wr(ht),kn=tt.toString("utf8");if(Re.set(be,kn),sr(be,kn)){if(Et+=tt.byteLength,Jt.push({path:be,size:tt.byteLength}),Et>rn)continue;Y.push({path:be,kind:"detected-content",keys:[],size:lt.size,sha256:Kn}),qt.push({path:be,kind:"detected-content",contentBase64:tt.toString("base64")});continue}}ye.push({path:be,size:lt.size,sha256:Kn,tracked:qi,executable:(lt.mode&73)!==0})}catch(lt){if(u.signal?.throwIfAborted(),ao(be)||io(be))throw lt;Pe.push({path:be,reason:`Cannot read file (${lt.code??"unreadable"})`})}}},zn=await Am(f,u.historyMode==="sanitize");Dn.push(...zn.cycles);for(let ee of zn.inside)Gn.add(ee);await Bn(f);let qn=Nc([...ye,...Oe],Math.max(0,Ne-Y.length-ne.length),nn,T);if(qn.length)ye=ye.filter((ee)=>!Rs(ee.path,qn)),Oe=Oe.filter((ee)=>!Rs(ee.path,qn)),Pe.push(...qn.map((ee)=>({path:ee.replace(/\/$/,""),reason:Ns(ee)})));if(u.onProgress?.(`scanning … ${ye.length} files`),u.onProgress?.(`secrets: ${Y.length+ne.length} files`),u.signal?.throwIfAborted(),oe.length>0){let ee=oe.slice(0,5).join(", "),je=oe.length-5;rt.push(`Imported as symlinks, so no content was read or uploaded for them and the cloud recreates the link: ${ee}${je>0?`, +${je} more`:""}`)}for(let ee of Z)rt.push(`Ignore file ${ee} is a symlink, so its rules were not applied. Replace it with a regular file inside the project.`);if(Te)rt.push(Te);if(Et>rn)$e.push(`Protected project files total ${zt(Et)}, over the ${zt(rn)} limit. Largest: ${Vc(Jt)}. Move large assets out of skill and config folders, or add them to .hlixignore.`);if(Y.length>2000)$e.push(`Project has ${Y.length} environment and credential files, over the 2000 limit. Largest: ${Vc(Y)}. Exclude the ones the cloud project does not need with .hlixignore.`);if(ne.length>5000)$e.push(`Project has ${ne.length} agent, skill and MCP files, over the 5000 limit. Largest folders: ${jm(ne.map((ee)=>ee.path))}. Exclude the ones the cloud project does not need with .hlixignore.`);ye.sort((ee,je)=>ee.path.localeCompare(je.path)),Oe.sort((ee,je)=>ee.path.localeCompare(je.path)),Y.sort((ee,je)=>ee.path.localeCompare(je.path)),ne.sort((ee,je)=>ee.path.localeCompare(je.path)),te.sort((ee,je)=>`${ee.sourcePath}:${ee.name}`.localeCompare(`${je.sourcePath}:${je.name}`));let ot=Um([...et.keys()].sort(),st?Qe:void 0);if(u.envFile&&st&&!et.has(ot[0]))$e.push(`Selected environment file was not found or is not a dotenv file: ${u.envFile}`);let on=new Map;for(let[ee,je]of et)for(let it of Object.keys(je))on.set(it,[...on.get(it)??[],ee]);for(let[ee,je]of kt)for(let it of je)on.set(it,[...on.get(it)??[],ee]);let Xl=[...on].filter(([,ee])=>ee.length>1).map(([ee,je])=>({key:ee,paths:je.sort()})).sort((ee,je)=>ee.key.localeCompare(je.key)),Mt={};for(let ee of ot)Object.assign(Mt,et.get(ee)??{});let Yl=[...nt.keys()].sort((ee,je)=>{if(ee===".envrc")return 1;if(je===".envrc")return-1;return ee.localeCompare(je)}),bo=new Set;for(let ee of Yl){let je=new Set(Lt.get(ee)??[]);for(let it of kt.get(ee)??[]){if(je.has(it)){delete Mt[it],bo.add(it);continue}let ut=nt.get(ee)?.[it];if(ut!==void 0)Mt[it]=ut;bo.delete(it)}}for(let ee of Un)rt.push(`${ee} has its own Git repository — uploaded as files, its history not included`);let Zl=u.historyMode==="abort_on_findings"?"abort_on_findings":"preserve";if(Ct)rt.push("Git history omitted; uploading a snapshot of the current files.");let xt=await Vm(f,v,u);if(!xt.complete)rt.push(`Git history scan exceeded ${vr} commits or failed; history is preserved, but the findings may be incomplete.`);if(v&&!xt.head)Ct=!0,rt.push("Git has no readable HEAD; uploading the current files as a snapshot.");let Ui=xt.waivedReasons;for(let ee of[...new Set(Ui)].sort()){let je=Ui.filter((ut)=>ut===ee).length,it=je===1;rt.push(`${je} Git history finding${it?"":"s"} did not block this import — ${ee}, not ${it?"a real credential":"real credentials"}; --history preserve is not needed for ${it?"it":"them"}.`)}if(xt.blockingFindings.length>0){let ee=xt.blockingFindings.length;rt.unshift([`${sm} (${ee} finding${ee===1?"":"s"}${ee>5?", first 5 shown":""}); ${Ct?"history is omitted":"history is preserved"}:`,...xt.blockingFindings.slice(0,5).map((je)=>` ${je.commit.slice(0,7)} ${je.path} — ${je.reason}`)," To exclude old commits, use --history sanitize; local Git history stays intact."].join(`
309
+ `))}let Di=new Set(ye.map((ee)=>ee.path)),Ql=await zc(f,Di,Re),{observedSecretKeys:Gi,...$t}=Ql;$t.warnings.unshift(...rt);let ko=new Set($t.requiredSecretKeys);for(let ee of bo)ko.add(ee);for(let ee of te)for(let je of ee.envKeys)Gi.push(je);for(let ee of Qt)if(ko.delete(ee))$t.warnings.push(Ws);$t.requiredSecretKeys=[...ko].sort();for(let ee of $t.requiredSecretKeys){if(Mt[ee]!==void 0)continue;let je=u.environment?.[ee];if(je===void 0){$e.push(`${Js}${ee}`);continue}Mt[ee]=je}let xo=[];for(let ee of Gi){if(Qt.has(ee)){$t.warnings.push(Ws);continue}if(Bs.has(ee))continue;if(Mt[ee]!==void 0)continue;let je=u.environment?.[ee];if(je===void 0){xo.push(ee);continue}Mt[ee]=je}if(xo.length>0)$t.warnings.push(xm(xo.sort()));$t.warnings=[...new Set($t.warnings.flatMap((ee)=>ee.split(`
310
+ `)))].map((ee)=>ee.slice(0,500)).slice(0,km);let Wi=Rc(new Map([...Di].map((ee)=>[ee,Re.get(ee)??null]))),Bi={schemaVersion:qc,rootName:u.rootName??Zt(f),stack:Wi.language,git:{detected:v&&!Ct,head:Ct?null:xt.head,branch:Ct?null:xt.branch,refs:Ct?[]:xt.refs,commitCount:Ct?0:xt.commitCount,historyScanComplete:xt.complete,historyMode:Zl},files:ye,symlinks:Oe,secretFiles:Y,activeEnvFiles:ot,secretKeys:Object.keys(Mt).sort(),envCollisions:Xl,quarantinedResources:ne,mcpServers:te,historicalSecretFindings:xt.blockingFindings,skipped:Fc(Pe),environment:$t,totals:{files:ye.length,bytes:ye.reduce((ee,je)=>ee+je.size,0)}},zi=qs(Bi),ed=br("sha256").update(zi).digest("hex");return{root:f,includedPaths:T,ignoreReport:u.refreshIgnore?F?.report??F?.warning:void 0,uploadWarning:Te,stackFacts:Wi,manifest:Bi,...Pe.length>5000?{skippedEntries:Pe}:{},manifestJson:zi,manifestSha256:ed,secretValues:Mt,protectedFiles:qt.sort((ee,je)=>ee.path.localeCompare(je.path)),blocking:[...new Set($e)].map((ee)=>`${ee}
311
+ ${im}`),blockingHistoryFindings:[],gitRemotes:j,cycles:Dn}}var Vs={name:"init",summary:"Configure a local folder for Hlix",usage:["Usage: hlix init [folder] [--project <id>] [--json]","","Creates hlix.yml, or fills its hlix: block when the file already exists.","hlix.api is written only when the server is not https://server.hlix.ai.","A folder that only has .hlix/config.json is copied into hlix.yml.","Also creates .hlix/.gitignore and .hlixignore.","hlix.yml is the committed project file. Secret values do not belong in it.","Project configuration is safe to commit; local revision state is ignored.",""," --project <id> Bind the folder to an existing cloud project"," Then `hlix pull`, or `hlix push` if it has no files yet"].join(`
312
+ `),supportsJson:!0,options:["project"],args:{min:0,max:1},async run(d){if(d.args.length>1)throw Error("init accepts at most one folder.");let u=await Xm(Ym(d.cwd,d.args[0]??"."));await k(d,{cwd:u,flags:d.flags});let f=o({env:d.env,flags:d.flags,cwd:u});if(f.conflict)throw new e("workspace_mismatch",f.conflict);if(!f.workspaceId)throw Error("No workspace selected. Run `hlix login --workspace <id>` first.");let v=d.requireClient(u);await v.projects.list();let j=p(u);if(j.error)throw new e("invalid_project_file",j.error);let P=N(j.base),I=P?null:Vr(u),C=P??I;if(I&&(I.workspaceId!==f.workspaceId||!Zm(I.apiUrl,f.baseUrl)))throw new e("workspace_mismatch",`This folder is bound to workspace ${I.workspaceId} at ${I.apiUrl}; refusing to bind it to ${f.workspaceId} at ${f.baseUrl}.`);let T=typeof d.flags.project==="string"?d.flags.project:void 0;if(T&&C?.projectId&&C.projectId!==T)throw new e("workspace_mismatch",`This folder is bound to project ${C.projectId}; refusing to rebind it to ${T}.`);if(T)await v.projects.get(T);let R=T??C?.projectId,F={schemaVersion:1,workspaceId:f.workspaceId,apiUrl:f.baseUrl,...R?{projectId:R}:{}},L={workspace:F.workspaceId,api:F.apiUrl,...F.projectId?{project:F.projectId}:{}};Xr(u),await ie(u);let H=await Ft(u,{environment:d.env,refreshIgnore:!0});if(!ae(u,W(H.manifest.environment,L,void 0,de(u,H.stackFacts))).written)le(u,L);if(I)Fe(u,I);let D={root:u,config:F,ignoreReport:H.ignoreReport,scan:{files:H.manifest.totals.files,bytes:H.manifest.totals.bytes,secretFiles:H.manifest.secretFiles.map((B)=>B.path),quarantinedResources:H.manifest.quarantinedResources.map((B)=>B.path),blocking:H.blocking,cycles:H.cycles}};if(d.json)d.stdout(xe(_e(Vs.name,D)));else{if(H.ignoreReport)d.stdout(`${H.ignoreReport}
313
+ `);if(d.stdout(`Initialized ${u}
314
+ Project: ${F.projectId??"not imported yet"}
315
+ Workspace: ${F.workspaceId}
316
+ `),H.cycles.length)d.stdout(`${H.cycles.map((B)=>`Cycle: ${lo(B)}
317
+ `).join("")}`);if(H.blocking.length)d.stdout(`
318
+ Review before import:
319
+ ${H.blocking.map((B)=>`- ${B}`).join(`
320
+ `)}
321
+ `)}return 0}};function Zm(d,u){return d.replace(/\/+$/,"")===u.replace(/\/+$/,"")}import{basename as Tg,resolve as Og}from"node:path";import{realpath as Rg}from"node:fs/promises";import{mkdtemp as kg,rm as fo,readFile as xg,writeFile as Sg,chmod as jg,symlink as Pg,lstat as Eg}from"node:fs/promises";import{tmpdir as Ig}from"node:os";import{join as Zs}from"node:path";import{createHash as Qm}from"node:crypto";import{createReadStream as eg}from"node:fs";import{chmod as il,copyFile as tg,lstat as ng,mkdir as Xs,mkdtemp as rg,readdir as og,readlink as sg,rm as Ys,symlink as ig}from"node:fs/promises";import{tmpdir as ag}from"node:os";import{dirname as al,join as tn}from"node:path";import{spawnSync as po}from"node:child_process";var uo=300000;function _t(d,u){let f=po("git",["-c","core.hooksPath=/dev/null","-C",d,...u],{encoding:"utf8",timeout:uo,maxBuffer:20971520,stdio:["ignore","pipe","pipe"]});if(f.status!==0){let v=f.stderr.trim().split(`
322
+ `).at(-1)??"git command failed";throw Error(v)}return f.stdout.trim()}async function cg(d){let u=Qm("sha256");for await(let f of eg(d))u.update(f);return u.digest("hex")}async function lg(d){for(let u of await og(d)){if(u===".git")continue;await Ys(tn(d,u),{recursive:!0,force:!0})}}async function cl(d){if(d.manifest.git.detected&&(d.manifest.historicalSecretFindings.length||!d.manifest.git.historyScanComplete))throw Error("Git history has secrets or could not be fully scanned. Use --history sanitize to import current files.");if(d.uploadWarning)throw Error(d.uploadWarning);if(d.blocking.length>0)throw Error(`Project scan has blocking findings:
323
+ - ${d.blocking.join(`
324
+ - `)}`);let u=await rg(tn(ag(),"hlix-snapshot-"));await il(u,448);let f=tn(u,"repo"),v=tn(u,"source.git");try{if(d.manifest.git.detected){let C=po("git",["clone","--mirror","--no-hardlinks",d.root,v],{encoding:"utf8",timeout:uo,stdio:["ignore","pipe","pipe"]});if(C.status!==0)throw Error(C.stderr.trim()||"Could not mirror repository.");let T=new Map(_t(v,["for-each-ref","--format=%(refname)%00%(objectname)","refs/heads","refs/tags"]).split(`
325
+ `).filter(Boolean).map((F)=>F.split("\x00",2)));for(let F of d.manifest.git.refs)if(T.get(F.name)!==F.oid)throw Error(`Git ref changed after scan: ${F.name}`);let R=po("git",["clone","--no-hardlinks",v,f],{encoding:"utf8",timeout:uo,stdio:["ignore","pipe","pipe"]});if(R.status!==0)throw Error(R.stderr.trim()||"Could not create snapshot clone.");if(!d.manifest.git.head)throw Error("Git repository has no HEAD commit.");_t(f,["checkout","-B","main",d.manifest.git.head])}else await Xs(f,{recursive:!0,mode:448}),_t(f,["init","-b","main"]);await lg(f);for(let C of d.manifest.files){let T=tn(d.root,...C.path.split("/")),R=await ng(T);if(!R.isFile()||R.isSymbolicLink())throw Error(`Source changed after scan: ${C.path}`);if(R.size!==C.size||await cg(T)!==C.sha256)throw Error(`Source changed after scan: ${C.path}`);let F=tn(f,...C.path.split("/"));await Xs(al(F),{recursive:!0,mode:493}),await tg(T,F),await il(F,C.executable?493:420)}for(let C of d.manifest.symlinks){let T=tn(d.root,...C.path.split("/"));if(await sg(T).catch(()=>null)!==C.target)throw Error(`Source changed after scan: ${C.path}`);let R=tn(f,...C.path.split("/"));await Xs(al(R),{recursive:!0,mode:493}),await ig(C.target,R)}_t(f,["config","user.name","Hlix Import"]),_t(f,["config","user.email","import@hlix.ai"]),_t(f,["read-tree","--empty"]),_t(f,["add","--force","-A"]),_t(f,["commit","--allow-empty","-m","chore(hlix): import snapshot"]);let j=_t(f,["rev-parse","HEAD"]),P=new Set(d.manifest.git.refs.map((C)=>C.name));for(let C of _t(f,["for-each-ref","--format=%(refname)","refs/heads","refs/tags"]).split(`
326
+ `).filter(Boolean))if(C!=="refs/heads/main"&&!P.has(C))_t(f,["update-ref","-d",C]);let I=d.manifest.git.refs.filter((C)=>C.name!=="refs/heads/main");if(I.length>0){let C=po("git",["-C",f,"update-ref","--stdin"],{encoding:"utf8",timeout:uo,input:I.map((T)=>`update ${T.name} ${T.oid}`).join(`
327
+ `)+`
328
+ `,stdio:["pipe","pipe","pipe"]});if(C.status!==0)throw Error(C.stderr.trim()||"Could not recreate the approved Git refs.")}return{directory:f,commitSha:j,dispose:()=>Ys(u,{recursive:!0,force:!0})}}catch(j){throw await Ys(u,{recursive:!0,force:!0}),j}}import{lstat as dl,mkdir as dg,realpath as pg}from"node:fs/promises";import{dirname as ug,join as mg,relative as gg,resolve as fg,sep as ll}from"node:path";function pl(d,u){let f=d;if(typeof f==="string")try{f=JSON.parse(f)}catch{return[]}if(!f||typeof f!=="object")return[];let v=f[u];if(!Array.isArray(v))return[];return v.filter((j)=>!!j&&typeof j==="object")}function ul(d){return pl(d,"files").flatMap((u)=>typeof u.path==="string"&&typeof u.sha256==="string"?[{path:u.path,sha256:u.sha256}]:[])}function ml(d){return pl(d,"symlinks").flatMap((u)=>typeof u.path==="string"&&typeof u.target==="string"?[{path:u.path,target:u.target}]:[])}async function xr(d,u,f){let v=await pg(d),j=fg(v,...u.split("/"));if(j!==v&&!j.startsWith(v+ll))throw Error(`Protected path escapes the project: ${u}`);let P=gg(v,ug(j)),I=v;for(let C of P.split(ll).filter(Boolean)){I=mg(I,C);try{let T=await dl(I);if(T.isSymbolicLink()&&f){f.push(I);break}if(!T.isDirectory()||T.isSymbolicLink())throw Error(`Protected path crosses a non-directory: ${u}`)}catch(T){if(T.code!=="ENOENT")throw T;if(!f)await dg(I,{mode:448})}}return j}async function gl(d,u,f){let v=f.length,j=await xr(d,u,f);if(f.length>v)return;try{let P=await dl(j);if(P.isSymbolicLink()){f.push(j);return}if(!P.isFile())throw Error(`Refusing to replace non-regular project file: ${u}`)}catch(P){if(P.code!=="ENOENT")throw P}}import{spawnSync as hg}from"node:child_process";import{mkdtemp as yg,writeFile as wg,rm as vg}from"node:fs/promises";import{tmpdir as bg}from"node:os";import{join as fl}from"node:path";function mo(d,u,f){let v=hg("git",["-c","core.hooksPath=/dev/null","-C",d,...u],{encoding:"utf8",timeout:120000,maxBuffer:41943040,env:{PATH:process.env.PATH,GIT_CONFIG_GLOBAL:f??"/dev/null",GIT_CONFIG_NOSYSTEM:"1",GIT_TERMINAL_PROMPT:"0",GIT_AUTHOR_NAME:"HLIX",GIT_AUTHOR_EMAIL:"repos@hlix.ai",GIT_COMMITTER_NAME:"HLIX",GIT_COMMITTER_EMAIL:"repos@hlix.ai"}});if(v.status!==0)throw Error("HLIX Repos Git operation failed. The remote may have changed; refresh and retry.");return v.stdout.trim()}async function go(d,u){let f=new URL(d.cloneUrl);if(f.href!==d.cloneUrl||/[\r\n"\\]/.test(d.cloneUrl)||f.protocol!=="https:"||f.username||f.password||f.search||f.hash||f.port||!(f.hostname==="github.com"||/^[a-f0-9]{32}\.artifacts\.cloudflare\.net$/.test(f.hostname)))throw Error("Invalid HLIX Repos remote");if(/[\r\n]/.test(d.token))throw Error("Invalid repository credential");let v=await yg(fl(bg(),"hlix-git-auth-")),j=fl(v,"config"),P=d.token.replace(/\?expires=\d+$/,""),I=Buffer.from(`x-access-token:${P}`).toString("base64");try{return await wg(j,`[http "${d.cloneUrl}"]
329
+ extraHeader = Authorization: Basic ${I}
330
+ followRedirects = false
331
+ `,{mode:384}),await u(j)}finally{await vg(v,{recursive:!0,force:!0})}}function Nn(d){return new Map([...ul(d).map((u)=>[u.path,`blob:${u.sha256}`]),...ml(d).map((u)=>[u.path,`link:${u.target}`])])}var hl={git:mo,access:go};async function Fn(d){let u=n(d);if(!u?.config.projectId)throw new e("not_initialized","Run hlix import or hlix init to bind this folder to a project.");return{...u,state:l(u.root)}}async function yl(d,u){let f=await Ft(d,{environment:u,historyMode:"sanitize",maxFiles:50000,maxFileBytes:33554432,maxTotalBytes:1073741824});if(f.manifest.files=f.manifest.files.filter((v)=>v.path!==".hlixignore"),f.blocking.length)throw new e("scan_blocked",f.blocking.join(`
332
+ `));return f}function _g(d,u){let f=Object.fromEntries(Nn(d.manifest));return!u?.files?d.manifest.files.length+d.manifest.symlinks.length>0:JSON.stringify(Object.entries(f).sort())!==JSON.stringify(Object.entries(u.files).sort())}async function Qs(d,u,f){let v=await d.projects.get(u),j=f?v.repos.find((P)=>P.id===f):v.repos.find((P)=>P.isPrimary)??(v.repos.length===1?v.repos[0]:void 0);if(!j)throw new e("conflict","Select a primary repository for this project before syncing.");return j}async function ei(d,u,f,v,j=!1,P=hl){let{config:I,state:C}=await Fn(d),T=await Qs(u,I.projectId,C?.repoId),R=await u.repos.head(I.projectId,T.id);if((v??C?.commitSha)&&R.commitSha!==(v??C?.commitSha))throw new e("conflict","HLIX Repos changed. Pull or sync before pushing.");let F=await cl(f);try{let L=await u.repos.access(I.projectId,T.id,"write"),H=await P.access(L,async(X)=>{P.git(F.directory,["fetch","--no-tags",L.cloneUrl,`refs/heads/${T.defaultBranch}`],X);let D=P.git(F.directory,["rev-parse","FETCH_HEAD"]);if(D!==R.commitSha)throw new e("conflict","HLIX Repos changed during upload. Retry sync.");let B=P.git(F.directory,["rev-parse",`${F.commitSha}^{tree}`]),Z=P.git(F.directory,["commit-tree",B,"-p",D,...j&&f.manifest.git.detected?["-p",F.commitSha]:[],"-m","Update HLIX Repos files"]);return P.git(F.directory,["push",`--force-with-lease=refs/heads/${T.defaultBranch}:${D}`,L.cloneUrl,`${Z}:refs/heads/${T.defaultBranch}`],X),Z});return us(d,{schemaVersion:1,repoId:T.id,commitSha:H,files:Object.fromEntries(Nn(f.manifest)),snapshotOnly:!0,rootName:f.manifest.rootName}),{action:"push",commitSha:H}}finally{await F.dispose()}}async function Cg(d,u,f,v,j,P){let{config:I}=await Fn(d),C=await Qs(u,I.projectId,f),T=await kg(Zs(Ig(),"hlix-pull-"));try{let R=await u.repos.access(I.projectId,f,"read");await P.access(R,async(Z)=>{P.git(T,["init"]),P.git(T,["fetch","--no-tags",R.cloneUrl,`refs/heads/${C.defaultBranch}`],Z),P.git(T,["checkout","--detach",v])});let F=await yl(T),L=[],H=[...F.manifest.files,...F.manifest.symlinks],X=[...j.manifest.files,...j.manifest.symlinks].filter((Z)=>!H.some((Q)=>Q.path===Z.path)),D=new Set([...j.manifest.files,...j.manifest.symlinks].map((Z)=>Z.path));for(let Z of H){let Q=Z.path.split("/");for(let we=1;we<=Q.length;we++){let Te=Q.slice(0,we).join("/"),ye=await Eg(Zs(d,Te)).catch((Oe)=>{if(Oe.code!=="ENOENT")throw Oe;return null});if(ye&&!ye.isDirectory()&&!D.has(Te))throw new e("conflict",`Incoming repository file would replace an excluded local file: ${Te}`)}}for(let Z of[...H,...X])await gl(d,Z.path,L);let B=await Promise.all(F.manifest.files.map(async(Z)=>({...Z,bytes:await xg(Zs(T,Z.path))})));for(let Z of[...new Set(L)].sort((Q,we)=>Q.length-we.length))await fo(Z,{force:!0});for(let Z of X)await fo(await xr(d,Z.path),{force:!0});for(let Z of B){let Q=await xr(d,Z.path);await Sg(Q,Z.bytes,{mode:Z.executable?493:420}),await jg(Q,Z.executable?493:420)}for(let Z of F.manifest.symlinks){let Q=await xr(d,Z.path);await fo(Q,{force:!0}),await Pg(Z.target,Q)}return us(d,{schemaVersion:1,repoId:f,commitSha:v,files:Object.fromEntries(Nn(F.manifest)),snapshotOnly:!0,rootName:j.manifest.rootName}),{action:"pull",commitSha:v}}finally{await fo(T,{recursive:!0,force:!0})}}async function ti(d,u,f,v="sync",j=!1,P=hl){let{config:I,state:C}=await Fn(d),T=await Qs(u,I.projectId,C?.repoId),[R,F]=await Promise.all([yl(d,f),u.repos.head(I.projectId,T.id)]),L=_g(R,C),H=C?.commitSha!==F.commitSha,X=!C&&L&&!F.isEmpty?"conflict":v==="push"?H&&C?"conflict":L?"push":"none":v==="pull"?L?"conflict":H?"pull":"none":L&&H&&C?"conflict":L?"push":H?"pull":"none";if(j)return{action:X,localChanged:L,cloudChanged:H,commitSha:F.commitSha};if(X==="conflict")throw new e("conflict","This folder and HLIX Repos have both changed. Resolve the differences before syncing; no files were replaced.");if(X==="push")return ei(d,u,R,F.commitSha,!1,P);if(X==="pull")return Cg(d,u,T.id,F.commitSha,R,P);return{action:"none",commitSha:F.commitSha}}function ni(d){return{name:d,summary:`${d} files with HLIX Repos`,usage:`Usage: hlix ${d} [--dry-run] [--json]`,supportsJson:!0,signIn:!0,options:["dry-run"],async run(u){let{root:f}=await Fn(u.cwd),v=await ti(f,u.requireClient(),u.env,d,u.flags["dry-run"]===!0);return u.stdout(u.json?xe(_e(`hlix ${d}`,v)):`HLIX Repos: ${v.action} (${v.commitSha})
333
+ `),v.action==="conflict"?1:0}}}var wl=ni("push"),vl=ni("pull"),bl=ni("sync");var $g=new Set(["https:","http:","ssh:","git:"]);function kl(d,u){if(!d.trim())return null;let v=u.replace(/^\/+/,"").replace(/\/+$/,"").replace(/\.git$/i,"").split("/").filter(Boolean);if(v.length!==2)return null;let[j,P]=v;return{host:d.toLowerCase(),owner:j,name:P}}function ri(d){let u=d.trim();if(!u)return null;if(!/^[a-zA-Z][a-zA-Z\d+.-]*:\/\//.test(u)){let v=/^(?:[^@/\s]+@)?([^:/\s]+):(.+)$/.exec(u);return v?kl(v[1],v[2]):null}let f;try{f=new URL(u)}catch{return null}if(!$g.has(f.protocol))return null;return kl(f.hostname,f.pathname)}function oi(d){return d.host==="github.com"}function si(d){let u=d.find((f)=>f.name==="origin");if(u)return u;return d.length===1?d[0]:void 0}var Ag=new Set([".mcp.json","mcp.json",".hlix/mcp.json",".claude/mcp.json",".cursor/mcp.json",".vscode/mcp.json"]),Sr=(d)=>d!==null&&typeof d==="object"&&!Array.isArray(d)?d:{};async function xl(d,u,f,v,j){let P=[],I=new Set,C=new Set;for(let R of[".claude/settings.json",".claude/settings.local.json"]){let F=f.find((L)=>L.path===R);if(!F)continue;try{let L=Sr(JSON.parse(Buffer.from(F.contentBase64,"base64").toString("utf8")));if(Array.isArray(L.disabledMcpjsonServers)){for(let H of L.disabledMcpjsonServers)if(typeof H==="string")C.add(H)}}catch{P.push({name:R,sourcePath:R,status:"action_required"})}}let T=(R)=>R.replace(/\$\{(?:env:)?([A-Za-z_][A-Za-z0-9_]*)\}/g,(F,L)=>(!Qt.has(L)?v[L]:void 0)??F.replace("env:",""));for(let R of f){if(R.kind!=="mcp"||!Ag.has(R.path))continue;j?.throwIfAborted();let F;try{F=Sr(JSON.parse(Buffer.from(R.contentBase64,"base64").toString("utf8")))}catch{P.push({name:R.path,sourcePath:R.path,status:"action_required"});continue}let L=Sr(F.mcpServers??F.servers);for(let[H,X]of Object.entries(L)){j?.throwIfAborted();let D=Sr(X);if(I.has(H)){P.push({name:H,sourcePath:R.path,status:"action_required"});continue}I.add(H);let B=D.type==="sse"?"sse":D.type==="http"||typeof D.url==="string"?"http":"stdio",Z=Sr(B==="stdio"?D.env:D.headers??D.env),Q={projectId:u,name:H,transport:B,enabled:!(R.path===".mcp.json"&&C.has(H))&&D.enabled!==!1&&D.disabled!==!0&&!(Array.isArray(F.disabledMcpServers)&&F.disabledMcpServers.includes(H)),...typeof D.command==="string"?{command:D.command}:{},...Array.isArray(D.args)&&D.args.every((we)=>typeof we==="string")?{args:D.args}:{},...typeof D.url==="string"?{url:T(D.url)}:{},env:Object.fromEntries(Object.entries(Z).filter((we)=>typeof we[1]==="string"&&!Qt.has(we[0])).map(([we,Te])=>[we,T(Te)])),...D.authentication==="oauth"?{authentication:"oauth"}:{},...typeof D.oauthClientId==="string"?{oauthClientId:D.oauthClientId}:{}};try{let we=await d.mcpServers.create(Q,{signal:j});P.push({name:H,sourcePath:R.path,id:we.id,status:!we.enabled?"disabled":we.connection.status==="authorization_required"||we.authentication==="oauth"?"action_required":"imported"})}catch{j?.throwIfAborted(),P.push({name:H,sourcePath:R.path,status:"action_required"})}}}return P}async function Be(d,u,f,v){if(!/^[\w.-]+\/[\w.-]+$/.test(f))throw Error("Use a GitHub repository in owner/name form.");try{let j=await d.projects.attachGithubRepository(u,f,{signal:v});return{status:(j.isPrimary?j:await d.projects.makeRepositoryPrimary(u,j.id,{signal:v})).connectionStatus==="connecting"?"connecting":"connected",repository:f}}catch(j){if(v?.aborted)throw j;let P=j instanceof mt&&j.body&&typeof j.body==="object"?j.body:{};if(P.code==="repository_on_another_project")return{status:"action_required",repository:f,reason:"repository_on_another_project",...typeof P.projectId==="string"?{existingProjectId:P.projectId}:{}};return{status:"action_required",repository:f,reason:P.code==="github_repository_unreachable"?"github_access_required":"connection_failed"}}}function Ge(d){if(d.status!=="action_required")return d.status==="connected"?`GitHub linked: ${d.repository}`:`Connecting ${d.repository}; the imported code stays available while the repository handoff completes.`;if(d.reason==="repository_on_another_project")return`${d.repository} is already linked to project ${d.existingProjectId??"another project"}. Choose that project or a different GitHub repository.`;if(d.reason==="github_access_required")return`Connect GitHub and grant access to ${d.repository} in this workspace, then retry /github ${d.repository}.`;return`Could not verify the GitHub connection to ${d.repository}. Your imported project is available; retry /github ${d.repository}.`}var Sl=(d)=>`${(d/1024/1024).toFixed(1)} MB`,jr=(d,u=3)=>d.slice(0,u).join(", ")+(d.length>u?`, +${d.length-u} more`:"");function Ng(d,u,f,v,j){let{manifest:P}=d,I=si(d.gitRemotes),C=I?ri(I.url):null,T=new Map;for(let L of P.files){let H=L.path.includes("/")?`${L.path.split("/")[0]}/`:"(root files)";T.set(H,(T.get(H)??0)+1)}let R=[...T].sort((L,H)=>H[1]-L[1]).map(([L,H])=>`${L} ${H}`);return["Import plan",...[["Project",`${u} (${f})`],["Config",j],["GitHub",C&&oi(C)?`${C.owner}/${C.name} — link using this workspace's GitHub connection`:"no GitHub origin detected; choose one with /github owner/name"],["Files",`${P.totals.files} files, ${Sl(P.totals.bytes)}`],["Folders",jr(R,5)||"none"],["Secrets",P.secretFiles.length?`${P.secretFiles.length} encrypted: ${jr(P.secretFiles.map((L)=>L.path))}`:"none found"],["Skills",`${P.quarantinedResources.filter((L)=>L.kind==="skill").length} project skill files`],["MCP",`${P.mcpServers.length} discovered definitions; project configurations retain enabled state`],["History",v==="sanitize"?"current files only; local Git history unchanged":!P.git.detected?"no git history":`kept: ${P.git.commitCount} commits${P.git.branch?` on ${P.git.branch}`:""}`],["Skipped",P.skipped.length?jr(P.skipped.map((L)=>L.path)):"nothing"],...d.cycles.length?[["Cycles",jr(d.cycles.map((L)=>lo(L)))]]:[],...P.environment.warnings.length?[["Warnings",jr(P.environment.warnings)]]:[]].map(([L,H])=>` ${L.padEnd(9)}${H}`),"","To change it: --name <name>, --include <path>, or list paths in .hlixignore."].join(`
334
+ `)}var We={name:"import",summary:"Import a local project into HLIX Repos",usage:"Usage: hlix import [folder] [--history preserve|sanitize] [--name name] [--stack stack] [--dry-run] [--yes] [--json]",supportsJson:!0,options:["history","name","stack","dry-run","yes","env-file","include"],args:{min:0,max:1},async run(d){let u=await Rg(Og(d.cwd,d.args[0]??"."));await k(d,{cwd:u,flags:d.flags,verify:!0});let f=o({env:d.env,flags:d.flags,cwd:u});if(f.conflict)throw new e("conflict",f.conflict);if(!f.workspaceId||!f.credential)throw new e("workspace_required","Run hlix login to select a workspace.");let v=p(u);if(v.error)throw new e("invalid_project_file",v.error);let j=N(v.base),P=j?void 0:Vr(u)?.projectId;if(j?.projectId||P)throw new e("conflict","This folder is already bound to a project. Use hlix push or sync.");let I=d.flags.history??"preserve";if(I!=="preserve"&&I!=="sanitize")throw new e("invalid_usage","--history accepts preserve or sanitize.");let C=await Ft(u,{signal:d.signal,onProgress:d.json?void 0:($e)=>d.stdout(`${$e}
335
+ `),environment:d.env,historyMode:I,envFile:typeof d.flags["env-file"]==="string"?d.flags["env-file"]:void 0,maxFiles:50000,maxFileBytes:33554432,maxTotalBytes:1073741824,include:typeof d.flags.include==="string"?d.flags.include:void 0});if(C.blocking.length)throw new e("scan_blocked",C.blocking.join(`
336
+ `));if(C.manifest.git.detected&&(C.manifest.historicalSecretFindings.length||!C.manifest.git.historyScanComplete))throw new e("scan_blocked","History contains potential secrets or was not completely scanned. Review it or use --history sanitize.");let T={files:C.manifest.totals.files,bytes:C.manifest.totals.bytes,protectedFiles:C.protectedFiles.length,history:I},R=v.base?Vt(v.base):null,F=typeof d.flags.name==="string"?d.flags.name:R?.name??Tg(u),L=typeof d.flags.stack==="string"?d.flags.stack:R?.stack??C.manifest.stack,H=de(u,C.stackFacts),X=v.base??Ur(W(C.manifest.environment,{workspace:f.workspaceId,api:f.baseUrl},void 0,H)),D=Hg(X,{name:F,stack:L}),B=Ng(C,F,L,I,He(v));if(d.flags["dry-run"]===!0)return d.stdout(d.json?xe(_e("hlix import",T)):`${B}
337
+ `),0;if(d.flags.yes!==!0){if(!d.confirm)throw new e("invalid_usage","Import requires approval. Review --dry-run, then use --yes.");if(!await d.confirm(B))return d.stdout(`Import cancelled. Nothing was sent.
338
+ `),0}let Z=d.requireClient(u);if(d.signal?.throwIfAborted(),!d.json)d.stdout(`Creating cloud project…
339
+ `);let Q=await Z.projects.create(D.create);await ie(u),ue(C,".gitignore"),Xr(u);let we={workspace:f.workspaceId,api:f.baseUrl,project:Q.id};if(!v.base){if(ae(u,W(C.manifest.environment,we,{name:F,stack:L},H)).written)ue(C,"hlix.yml")}let Te=le(u,we);if(Te.changed)ue(C,Te.name);if(Object.keys(D.patch).length>0)await Z.projects.update(Q.id,D.patch);for(let $e=0;$e<C.protectedFiles.length;$e+=64){if(!d.json)d.stdout(`Uploading protected configuration: ${Math.min($e+64,C.protectedFiles.length)}/${C.protectedFiles.length}
340
+ `);await Z.secrets.importFiles(Q.id,C.protectedFiles.slice($e,$e+64).map((Qe)=>({path:Qe.path,contentBase64:Qe.contentBase64})))}if(!d.json)d.stdout(`Uploading source snapshot: ${C.manifest.totals.files} files, ${Sl(C.manifest.totals.bytes)}
341
+ `);let ye=await ei(u,Z,C,void 0,I==="preserve"),Oe=await xl(Z,Q.id,C.protectedFiles,{...d.env,...C.secretValues},d.signal);if(!d.json&&Oe.length){for(let $e of Oe)d.stdout(`MCP ${t($e.name)}: ${$e.status==="action_required"?"action required in project Integrations":$e.status}
342
+ `);d.stdout(`Project MCP settings: /projects/${Q.id}/integrations#mcps
343
+ `)}let oe=await Lg(u,Z,Q.id,C.cycles),Y=si(C.gitRemotes),ne=Y?ri(Y.url):null,te=ne&&oi(ne)?await Be(Z,Q.id,`${ne.owner}/${ne.name}`,d.signal):void 0;if(te&&!d.json)d.stdout(`${Ge(te)}
344
+ `);let Pe=oe.map(($e)=>`Cycle: ${$e.name} continues on ${$e.branch}
345
+ `).join("");return d.stdout(d.json?xe(_e("hlix import",{...T,projectId:Q.id,...te?{github:te}:{},...Oe.length?{mcp:Oe}:{},commitSha:ye.commitSha,...oe.length?{cycles:oe}:{}})):`Imported into HLIX Repos: ${Q.name} (${ye.commitSha})
346
+ ${Pe}`),0}};function ii(d){throw new e("conflict",`The project was imported. Continuing ${d} did not finish. The folder is already bound.`)}async function Fg(d,u,f,v){if(!/^[0-9a-f]{40}$/i.test(f))throw Error("Cycle base is not a commit");if(!/^[A-Za-z0-9._/-]+$/.test(v)||v.includes("..")||v.startsWith("/")||v.endsWith("/"))throw Error("Invalid cycle branch");await go(u,async(j)=>{mo(d,["push",u.cloneUrl,`${f}:refs/heads/${v}`],j)})}async function Lg(d,u,f,v,j=Fg){let P=v.filter((L)=>L.pushed&&L.branch&&L.commit);if(P.length===0)return[];let C=(await u.projects.get(f)).repos??[],T=C.find((L)=>L.isPrimary)??(C.length===1?C[0]:void 0);if(!T)throw new e("conflict","The project was imported. Select a primary repository for this project before continuing a branch. The folder is already bound.");let R=await u.repos.access(f,T.id,"write"),F=[];for(let L of P){let H;try{H=await u.cycles.openFromBranch({projectId:f,branch:L.branch,commit:L.commit})}catch{ii(L.branch)}if(H.status!=="triage"){F.push({name:L.name,branch:H.branch});continue}try{if(await j(d,R,H.baseRef,H.branch),(await u.cycles.continueFromBranch(H.id)).status!=="draft")ii(L.branch)}catch(X){if(X instanceof e)throw X;ii(L.branch)}F.push({name:L.name,branch:H.branch})}return F}var Mg=["claude-code","codex","goose","opencode","pi","qwen-code"];function Hg(d,u){let f=Vt(d),v=Ug(f.runtime);return{create:{name:u.name,stack:u.stack,repos:[],...f.brief?{brief:f.brief}:{},...v?{runtime:v}:{}},patch:{...f.verifyCommand?{verifyCommand:f.verifyCommand}:{},...f.previewCommand?{previewCommand:f.previewCommand}:{},...f.previewPort!==void 0?{previewPort:f.previewPort}:{},...f.sandboxSize?{sandboxSize:f.sandboxSize}:{},...f.branchPrefix?{branchPrefix:f.branchPrefix}:{},...f.intake?{intake:f.intake}:{}}}}function Ug(d){let u=d.agents?.filter((v)=>Mg.includes(v)),f={};if(u?.length)f.agents=u;if(d.toolchain)f.toolchain=d.toolchain;if(d.aptPackages)f.aptPackages=d.aptPackages;if(d.setup)f.setup=d.setup;if(d.services)f.services=d.services;if(d.envOverrides)f.envOverrides=d.envOverrides;if(d.verifyCommand)f.verifyCommand=d.verifyCommand;if(d.preview)f.preview=d.preview;if(d.notes)f.notes=d.notes;return Object.keys(f).length?f:void 0}import{spawnSync as gf}from"node:child_process";import{existsSync as ff,mkdirSync as hf,writeFileSync as yf}from"node:fs";import{dirname as wf}from"node:path";import{createHash as Dg}from"node:crypto";import{mkdirSync as Gg,readdirSync as Cl,readFileSync as Wg,rmSync as Bg,statSync as $l,writeFileSync as zg}from"node:fs";import{homedir as qg,tmpdir as Jg}from"node:os";import{basename as Al,isAbsolute as Kg,join as Le,relative as Vg}from"node:path";var g=(d=process.env)=>d.HOME??d.USERPROFILE??qg();function bt(d){try{if(!$l(d).isFile())return null;return Wg(d,"utf8")}catch{return null}}function Xg(d){try{return $l(d).isDirectory()}catch{return!1}}function Ln(d,u){try{return Cl(d,{withFileTypes:!0}).filter((f)=>f.isFile()&&f.name.endsWith(u)).map((f)=>Le(d,f.name)).sort()}catch{return[]}}function Yg(d){try{return Cl(d,{withFileTypes:!0}).filter((u)=>u.isDirectory()||u.isSymbolicLink()).map((u)=>Le(d,u.name)).sort()}catch{return[]}}function ci(d){let u=d.replace(/^\uFEFF/,""),f=u.indexOf(`
347
+ `);if(!u.startsWith("---")||f===-1)return{fields:{},body:u.trim()};let v=u.indexOf(`
348
+ ---`,f);if(v===-1)return{fields:{},body:u.trim()};let j={};for(let I of u.slice(f+1,v).split(`
349
+ `)){let C=/^([A-Za-z_][\w-]*)\s*:\s*(.*)$/.exec(I);if(!C)continue;j[C[1]]=C[2].trim().replace(/^["']|["']$/g,"")}let P=u.indexOf(`
350
+ `,v+1);return{fields:j,body:P===-1?"":u.slice(P+1).trim()}}function Zg(d){let u=d.trimStart(),f=/^"((?:[^"\\]|\\.)*)"/.exec(u)??/^'([^']*)'/.exec(u);if(f)return f[1].replace(/\\"/g,'"').replace(/\\n/g,`
351
+ `);if(u.startsWith("["))return[...u.matchAll(/"((?:[^"\\]|\\.)*)"|'([^']*)'/g)].map((j)=>j[1]??j[2]??"");if(u.startsWith("{")){let j={};for(let P of u.matchAll(/([A-Za-z0-9_.-]+)\s*=\s*"((?:[^"\\]|\\.)*)"/g))j[P[1]]=P[2].replace(/\\"/g,'"');return j}let v=/^[^\s#]+/.exec(u)?.[0];if(v===void 0)return;if(v==="true"||v==="false")return v==="true";if(/^-?\d+(\.\d+)?$/.test(v))return Number(v);return v}function Tl(d){let u={"":{}},f="",v=d.split(`
352
+ `);for(let j=0;j<v.length;j+=1){let I=v[j].trim();if(!I||I.startsWith("#"))continue;let C=/^\[\[?([^\]]+)\]\]?$/.exec(I);if(C){f=C[1].trim(),u[f]??={};continue}let T=/^([A-Za-z0-9_.-]+|"[^"]+")\s*=\s*(.*)$/.exec(I);if(!T)continue;let R=T[1].replace(/^"|"$/g,""),F=T[2];if(F.startsWith('"""')){let H=[],X=F.slice(3);if(X.includes('"""'))H.push(X.slice(0,X.indexOf('"""')));else{if(X)H.push(X);while(j+1<v.length){j+=1;let D=v[j],B=D.indexOf('"""');if(B===-1){H.push(D);continue}H.push(D.slice(0,B));break}}u[f][R]=H.join(`
353
+ `).replace(/^\n/,"");continue}let L=Zg(F);if(L!==void 0)u[f][R]=L}return u}function ai(d,u){return d.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\}/g,(f,v,j)=>{let P=u[v];return P!==void 0&&P!==""?P:j??""})}var jl=(d,u)=>{let f={};for(let[v,j]of Object.entries(d))if(typeof j==="string")f[v]=ai(j,u);return f},Qg=[{relative:"GEMINI.md",source:"gemini"},{relative:Le(".gemini","GEMINI.md"),source:"gemini"},{relative:".cursorrules",source:"cursor"},{relative:".windsurfrules",source:"windsurf"},{relative:Le(".github","copilot-instructions.md"),source:"copilot"}],ef=[{relative:Le(".gemini","GEMINI.md"),source:"gemini"}],tf=[{relative:Le(".cursor","rules"),source:"cursor",extension:".mdc"},{relative:Le(".windsurf","rules"),source:"windsurf",extension:".md"}];function nf(d,u){let f=Le(d,".clinerules"),v=Xg(f)?Ln(f,".md"):[f],j=[];for(let P of v){let I=bt(P)?.trim();if(I)j.push({path:P,source:"cline",scope:u,content:I})}return j}function rf(d,u,f){let{fields:v,body:j}=ci(u);if(v.alwaysApply==="false")return{path:d,source:"cursor",scope:f,reason:"alwaysApply: false"};if(!j)return{path:d,source:"cursor",scope:f,reason:"no rule body"};let P=v.globs?.replace(/^\[|\]$/g,"").trim();return{path:d,source:"cursor",scope:f,content:j,...P?{note:`Applies to: ${P}`}:{}}}var of=["AGENTS.md","CLAUDE.md"],Ol=["",".claude"],qe=["commands"];function sf(d,u){let f=[],v=new Set;for(let j of[...Ol,u])for(let P of of){let I=Le(d,j,P),C=bt(I)?.trim();if(!C||v.has(C))continue;v.add(C),f.push({path:I,content:C})}return f}function Pl(d,u){return sf(d,u).map((f)=>f.content)}var V=["AGENTS.md","CLAUDE.md","GEMINI.md"];function li(d,u){for(let f of V)for(let v of[...Ol,u]){let j=Le(d,v,f),P=bt(j)?.trim();if(P)return{path:j,content:P}}return null}var di=(d=process.env)=>Le(d.HLIX_CONFIG_HOME??Le(g(d),".hlix"),"AGENTS.md");function ge(d){let u=d.env??process.env,f=di(u),v=bt(f)?.trim();return{global:v?{path:f,content:v}:null,project:li(d.cwd,d.configDir)}}var El=(d)=>{let u=Math.round(d.length/4);return u>=1000?`${(u/1000).toFixed(1)}k tokens`:`${u} tokens`};function Ke(d,u,f=process.env){let v=[...d.global?[Nl(d.global.path,f)]:[],...d.project?[Er(d.project.path,u)]:[]];return v.length===0?"":`rules: ${v.join(" + ")}`}function fe(d,u,f=process.env,v=[]){let j=(P,I,C)=>I?`${P.padEnd(8)} ${C(I.path)} (${El(I.content)})`:`${P.padEnd(8)} none`;return[j("user",d.global,(P)=>Nl(P,f)),j("project",d.project,(P)=>Er(P,u)),...v.map((P)=>`${"nested".padEnd(8)} ${Er(P.path,u)} (${El(P.content)})`),"","User rules go first, the project's after, so the project wins a conflict.",v.length===0?"A subdirectory's own rules file is added when the agent first works in it.":"A nested file was added when the agent first touched a path under it.","Edit them with `hlix rules --edit` (this project) or `hlix rules --edit --global`."].join(`
354
+ `)}var Il=[{dir:".claude",source:"claude",harnessReads:!0},{dir:".agents",source:"agents",harnessReads:!0},{dir:".hlix",source:"hlix",harnessReads:!0},{dir:".codex",source:"codex",harnessReads:!1}],af=[{relative:Le(".cursor","commands"),source:"cursor"},{relative:Le(".codex","prompts"),source:"codex"}],cf=[{relative:Le(".cursor","mcp.json"),source:"cursor",key:"mcpServers",format:"json"},{relative:Le(".windsurf","mcp.json"),source:"windsurf",key:"mcpServers",format:"json"},{relative:Le(".gemini","settings.json"),source:"gemini",key:"mcpServers",format:"json"},{relative:Le(".vscode","mcp.json"),source:"vscode",key:"servers",format:"json"},{relative:Le(".codex","config.toml"),source:"codex",key:"mcp_servers",format:"toml"},{relative:".mcp.json",source:"claude",key:"mcpServers",format:"json"}];function Rl(d){return[...cf,{relative:Le(d,"mcp.json"),source:"hlix",key:"mcpServers",format:"json"}]}var lf="found, not loaded (machine-wide; enable per project by copying into .hlix/mcp.json)",df=(d)=>Rl(d).filter((u)=>u.source!=="vscode");function pf(d,u){if(!d||typeof d!=="object"||Array.isArray(d))return{reason:"not an object"};let f=d;if(f.enabled===!1||f.disabled===!0)return{reason:"disabled"};let v=typeof f.command==="string"&&f.command!=="",j=typeof f.url==="string"&&f.url!=="";if(v&&j)return{reason:'has both "command" and "url"'};if(v){let L=Array.isArray(f.args)?f.args.filter((X)=>typeof X==="string"):void 0,H=f.env&&typeof f.env==="object"&&!Array.isArray(f.env)?jl(f.env,u):void 0;return{config:{command:f.command,...L&&L.length>0?{args:L}:{},...H&&Object.keys(H).length>0?{env:H}:{}}}}if(!j)return{reason:'missing "command" or "url"'};let P=f.headers??f.http_headers,I=P&&typeof P==="object"&&!Array.isArray(P)?jl(P,u):{},C=f.bearer_token_env_var;if(typeof C==="string"&&/^[A-Za-z_][A-Za-z0-9_]*$/.test(C)&&!Object.keys(I).some((L)=>L.toLowerCase()==="authorization"))I.Authorization=`Bearer ${ai(`\${${C}}`,u)}`;let T=Object.entries(I).find(([L])=>L.toLowerCase()==="authorization")?.[1]?.trim(),R=T&&!/^Bearer$/i.test(T)&&!T.includes("${"),F=f.oauth===!0||f.oauth&&typeof f.oauth==="object"||typeof C==="string"&&!u[C];return{config:{url:ai(f.url,u),...F&&!R?{needsSignIn:!0}:{},...Object.keys(I).length>0?{headers:I}:{}}}}function _l(d,u,f,v){let j=bt(d),P=[],I=[];if(j===null)return{servers:P,skipped:I};let C=[];if(u.format==="toml"){let T=Tl(j);C=Object.entries(T).filter(([R])=>R.startsWith(`${u.key}.`)).map(([R,F])=>[R.slice(u.key.length+1),F])}else try{let R=JSON.parse(j)?.[u.key];if(R&&typeof R==="object"&&!Array.isArray(R))C=Object.entries(R)}catch{return I.push({path:d,source:u.source,scope:f,reason:"not valid JSON"}),{servers:P,skipped:I}}for(let[T,R]of C){let F=pf(R,v);if("reason"in F){I.push({path:d,source:u.source,scope:f,reason:`${T}: ${F.reason}`});continue}P.push({path:d,source:u.source,scope:f,name:T,config:F.config})}return{servers:P,skipped:I}}function uf(d,u,f){let{fields:v,body:j}=ci(u);if(!j)return{path:d,source:"claude",scope:f,reason:"no instructions"};let P=v.tools?.replace(/^\[|\]$/g,"").split(",").map((I)=>I.trim()).filter(Boolean);return{path:d,source:"claude",scope:f,name:v.name||Al(d,".md"),description:v.description??"",instructions:j,...P&&P.length>0&&P[0]!=="*"?{tools:P}:{},...v.model?{model:v.model}:{}}}function mf(d){let u=Tl(d)[""]??{},f=typeof u.prompt==="string"?u.prompt.trim():"";if(!f)return null;return{description:typeof u.description==="string"?u.description:"",body:f}}function he(d,u,f={}){let v=f.configDir??".hlix",j=f.env??process.env,P={instructions:[],skills:[],commands:[],generatedCommands:[],mcpServers:[],subagents:[],skipped:[]},I=(D)=>{if("reason"in D)P.skipped.push(D);else P.instructions.push(D)};for(let D of Qg){let B=Le(d,D.relative),Z=bt(B)?.trim();if(Z)P.instructions.push({path:B,source:D.source,scope:"project",content:Z})}for(let D of tf)for(let B of Ln(Le(d,D.relative),D.extension)){let Z=bt(B);if(Z===null)continue;if(D.source==="cursor"){I(rf(B,Z,"project"));continue}let{body:Q}=ci(Z);if(Q)P.instructions.push({path:B,source:D.source,scope:"project",content:Q})}for(let D of nf(d,"project"))I(D);let C=Pl(d,v),T=Le(d,".codex","AGENTS.md"),R=bt(T)?.trim();if(R&&C.includes(R))P.skipped.push({path:T,source:"codex",scope:"project",reason:"same content as the project's AGENTS.md"});else if(R)P.instructions.push({path:T,source:"codex",scope:"project",content:R});for(let D of ef){let B=Le(u,D.relative),Z=bt(B)?.trim();if(Z)P.instructions.push({path:B,source:D.source,scope:"global",content:Z})}let F=Le(u,".codex","AGENTS.md"),L=bt(F)?.trim(),H=Pl(u,v);if(L&&H.includes(L))P.skipped.push({path:F,source:"codex",scope:"global",reason:"same content as the machine's AGENTS.md"});else if(L)P.instructions.push({path:F,source:"codex",scope:"global",content:L});for(let[D,B]of[[d,"project"],[u,"global"]])for(let Z of Il){let Q=Le(D,Z.dir===".hlix"?v:Z.dir,"skills");if(!Yg(Q).some((Te)=>bt(Le(Te,"SKILL.md"))!==null))continue;P.skills.push({path:Q,source:Z.source,scope:B,harnessReads:Z.harnessReads})}for(let[D,B]of[[d,"project"],[u,"global"]]){for(let Z of Il){if(!Z.harnessReads)continue;let Q=Le(D,Z.dir,"commands");if(Ln(Q,".md").length===0)continue;P.commands.push({path:Q,source:Z.source,scope:B,harnessReads:!0})}for(let Z of af){let Q=Le(D,Z.relative);if(Ln(Q,".md").length===0)continue;P.commands.push({path:Q,source:Z.source,scope:B})}for(let Z of Ln(Le(D,".gemini","commands"),".toml")){let Q=bt(Z),we=Q===null?null:mf(Q);if(!we){P.skipped.push({path:Z,source:"gemini",scope:B,reason:"no prompt field"});continue}P.generatedCommands.push({path:Z,source:"gemini",scope:B,name:Al(Z,".toml"),body:`---
355
+ description: ${we.description}
356
+ ---
357
+
358
+ ${we.body}
359
+ `})}}for(let D of Rl(v)){let B=_l(Le(d,D.relative),D,"project",j);P.skipped.push(...B.skipped);for(let Z of B.servers){let Q=P.mcpServers.findIndex((we)=>we.name===Z.name);if(Q===-1)P.mcpServers.push(Z);else P.mcpServers[Q]=Z}}for(let D of df(v)){let B=_l(Le(u,D.relative),D,"global",j);for(let Z of B.servers)P.skipped.push({path:Z.path,source:Z.source,scope:"global",reason:`${Z.name}: ${lf}`})}let X=[{dir:Le(".claude","agents"),source:"claude"},{dir:Le(v,"agents"),source:"hlix"}];for(let[D,B]of[[d,"project"],[u,"global"]])for(let Z of X.flatMap((Q)=>Ln(Le(D,Q.dir),".md"))){let Q=bt(Z);if(Q===null)continue;let we=uf(Z,Q,B);if("reason"in we)P.skipped.push(we);else if(P.subagents.some((Te)=>Te.name===we.name))P.skipped.push({path:Z,source:"claude",scope:B,reason:`a project agent already claims the name ${we.name}`});else P.subagents.push(we)}return P}function ze(d,u){if(d.length===0)return null;let f=Le(Jg(),"hlix-standards-commands",Dg("sha256").update(u).digest("hex").slice(0,16));try{Bg(f,{recursive:!0,force:!0}),Gg(f,{recursive:!0});for(let v of d)zg(Le(f,`${v.name}.md`),v.body,"utf8");return f}catch{return null}}var Er=(d,u)=>{let f=Vg(u,d);return!f||f.startsWith("..")||Kg(f)?d:f},Nl=(d,u=process.env)=>{let f=u.HLIX_CONFIG_HOME;if(f&&d.startsWith(`${f}/`))return`~/.hlix/${d.slice(f.length+1)}`;let v=g(u);return v&&d.startsWith(`${v}/`)?`~/${d.slice(v.length+1)}`:d};function Ve(d,u){if(d.length===0)return"";let f=["# Project standards from other agent tools","","These files were written for other coding agents working in this same","project. Treat them as the project's instructions and follow them."].join(`
360
+ `),v=d.map((j)=>{let P=`# From ${Er(j.path,u)} (${j.source})`;return`${j.note?`${P}
361
+ ${j.note}`:P}
362
+
363
+ ${j.content}`});return`${f}
364
+
365
+ ${v.join(`
366
+
367
+ `)}`}var Pr=(d,u,f)=>`${d} ${d===1?u:f}`;function Je(d){let u=[];if(d.instructions.length>0)u.push(Pr(d.instructions.length,"instruction file","instruction files"));if(d.skills.length>0)u.push(Pr(d.skills.length,"skill directory","skill directories"));let f=d.commands.length+d.generatedCommands.length;if(f>0)u.push(Pr(f,"command source","command sources"));if(d.mcpServers.length>0)u.push(Pr(d.mcpServers.length,"mcp server","mcp servers"));if(d.subagents.length>0)u.push(Pr(d.subagents.length,"subagent","subagents"));if(u.length===0)return"";let v=[...new Set([...d.instructions,...d.skills,...d.commands,...d.generatedCommands,...d.mcpServers,...d.subagents].map((j)=>j.source))].sort();return`standards: ${u.join(" · ")} (${v.join(", ")})`}function Fl(d,u){let f=[],v=(P,I)=>{if(I.length===0)return;f.push(P,...I.map((C)=>` ${C}`),"")},j=(P)=>`${P.source}${P.scope==="global"?" (global)":""} ${Er(P.path,u)}`;if(v("Instructions",d.instructions.map((P)=>`${j(P)}${P.note?` — ${P.note}`:""}`)),v("Skills",d.skills.map((P)=>`${j(P)}${P.harnessReads?" — already read by the harness":""}`)),v("Commands",[...d.commands.map((P)=>`${j(P)}${P.harnessReads?" — already read by the harness":""}`),...d.generatedCommands.map((P)=>`${j(P)} → /${P.name}`)]),v("MCP servers",d.mcpServers.map((P)=>`${j(P)} → ${P.name} (${"command"in P.config?"stdio":"http"})`)),v("Subagents",d.subagents.map((P)=>`${j(P)} → ${P.name}`)),v("Skipped",d.skipped.map((P)=>`${j(P)} — ${P.reason}`)),f.length===0)return`No standards from other agent tools were found in this folder.
368
+ `;return`${f.join(`
369
+ `).trimEnd()}
370
+ `}function vf(d){return d==="global"?["# My rules","","Hlix Code reads this file in every project you open, before the project's","own rules. Write how you want an agent to work with you: the tone, the","things to always do, the things to never do.",""].join(`
371
+ `):["# Project rules","","Hlix Code and every other coding agent that opens this repository read","this file. Write the rules that are true of THIS project: how to run its","tests, its conventions, what not to touch.",""].join(`
372
+ `)}function bf(d){return d.VISUAL?.trim()||d.EDITOR?.trim()||"vi"}var pi={name:"rules",summary:"Show or edit the rules files the coding agent reads",usage:["Usage: hlix rules [--edit] [--global] [--cwd <dir>] [--json]","","Without --edit it reports which files Hlix Code loads and how big they are.","","--edit opens one in $EDITOR, creating it with a short header if it does not","exist yet. --global edits your own rules (~/.hlix/AGENTS.md, read in every",`project); without it the project's file (${V.join(", then ")}).`].join(`
373
+ `),supportsJson:!0,options:["edit","global"],async run(d){let u=ge({cwd:d.cwd,configDir:".hlix",env:d.env}),f=d.flags.global===!0;if(d.flags.edit===!0){if(d.json)throw new e("invalid_usage","`hlix rules --edit` opens an editor, so it has no --json form.");let v=f?di(d.env):li(d.cwd,".hlix")?.path??`${d.cwd}/AGENTS.md`;if(!ff(v))hf(wf(v),{recursive:!0}),yf(v,vf(f?"global":"project"),"utf8"),d.stdout(`Created ${v}.
374
+ `);let j=bf(d.env),P=gf(j,[v],{stdio:"inherit"});if(P.error)throw new e("invalid_usage",`Could not run ${j}: ${P.error.message}`);return P.status??0}if(d.json){let v=(j)=>j?{path:j.path,characters:j.content.length}:null;return d.stdout(xe(_e(pi.name,{user:v(u.global),project:v(u.project)}))),0}return d.stdout(`${fe(u,d.cwd)}
375
+ `),0}};var ui={name:"standards",summary:"Show the standards other agent tools left in this folder",usage:["Usage: hlix standards [--cwd <dir>] [--json]","","Reads the instruction files, skills, slash commands, MCP servers and","subagents this project already carries for Claude Code, Cursor, Windsurf,","Gemini, Codex, Cline, Copilot and VS Code, and shows where each came from.","Hlix Code loads all of it at startup; nothing has to be copied or rewritten.","","Server urls, headers and environment values are never printed."].join(`
376
+ `),supportsJson:!0,async run(d){let u=he(d.cwd,g(d.env),{env:d.env});if(d.json)return d.stdout(xe(_e(ui.name,{instructions:u.instructions.map((f)=>({path:f.path,source:f.source,scope:f.scope,characters:f.content.length,...f.note?{note:f.note}:{}})),skills:u.skills,commands:[...u.commands.map((f)=>({path:f.path,source:f.source,scope:f.scope})),...u.generatedCommands.map((f)=>({path:f.path,source:f.source,scope:f.scope,command:f.name}))],mcpServers:u.mcpServers.map((f)=>({path:f.path,source:f.source,scope:f.scope,name:f.name,transport:"command"in f.config?"stdio":"http"})),subagents:u.subagents.map((f)=>({path:f.path,source:f.source,scope:f.scope,name:f.name,description:f.description,...f.model?{model:f.model}:{}})),skipped:u.skipped}))),0;return d.stdout(Fl(u,d.cwd)),0}};import{accessSync as kf,constants as xf,mkdirSync as Sf,readFileSync as jf,realpathSync as Pf,statSync as Ml,writeFileSync as Ef}from"node:fs";import{homedir as If}from"node:os";import{basename as _f,dirname as Ll,join as Mn}from"node:path";var Cf={homebrew:"Homebrew",npm:"npm",installer:"installer",unknown:"unknown origin"},Hl=(d)=>d.HOME||If();function gi(d){return Mn(d.XDG_DATA_HOME||Mn(Hl(d),".local","share"),"hlix","hlix")}function Ul(d){try{return Pf(d)}catch{return null}}function $f(d){try{let u=JSON.parse(jf(Mn(gi(d),"install.json"),"utf8"));if(typeof u.path==="string")return u.path}catch{}return Mn(Hl(d),".local","bin","hlix")}function Af(d,u){if(/\/Cellar\/hlix\//.test(d))return"homebrew";if(/\/node_modules\/@hlix\/cli\//.test(d))return"npm";if(Ul($f(u))===d)return"installer";return"unknown"}function mi(d,u){let f=Ul(d);if(!f)return null;try{if(!Ml(f).isFile())return null;kf(f,xf.X_OK)}catch{return null}return{path:d,realPath:f,channel:Af(f,u)}}function Tf(d){let u=[];for(let f of(d.PATH??"").split(":")){if(!f)continue;let v=mi(Mn(f,"hlix"),d);if(v&&!u.some((j)=>j.realPath===v.realPath))u.push(v)}return u}function fi(d,u=process.execPath){if(d.HLIX_SELF)return mi(d.HLIX_SELF,d);if(/^(node|bun(?:\.native)?)(\.exe)?$/.test(_f(u)))return null;return mi(u,d)}function hi(d){switch(d.channel){case"homebrew":return"brew uninstall hlix";case"npm":return"npm uninstall -g @hlix/cli";case"installer":return`${d.path} uninstall`;case"unknown":return`rm ${d.path}`}}var ho=(d)=>`${d.path} (${Cf[d.channel]})`;function yi(d,u=process.execPath){let f=fi(d,u),v=Tf(d);if(f&&!v.some((C)=>C.realPath===f.realPath))v.push(f);if(v.length<2)return{running:f,copies:v,duplicate:null};let[j,...P]=v,I=`${v.length} copies of hlix are installed: ${ho(j)} runs, ${P.map(ho).join(" and ")} ${P.length===1?"does":"do"} not. Keep one: ${P.map(hi).join(" && ")}`;return{running:f,copies:v,duplicate:I}}var Of=86400000;function Ye(d,u=Date.now(),f=process.execPath){let{duplicate:v}=yi(d,f);if(!v)return null;let j=Mn(Ll(Ot(d)),"duplicate-notice");try{if(u-Ml(j).mtimeMs<Of)return null}catch{}try{Sf(Ll(j),{recursive:!0}),Ef(j,`${v}
377
+ `)}catch{}return v}var Gl=(d)=>d instanceof Error?d.message:String(d),Dl=(d)=>d.split(/\s*\n\s*/).join(" ").trim();async function Ce(d,u,f,v,j){try{let P=await Ft(u,{historyMode:f,environment:d.env,rootName:v}),I=l(u)?.files,C=Nn(P.manifest);return{changedFiles:I?[...new Set([...Object.keys(I),...C.keys()])].filter((R)=>I[R]!==C.get(R)).length:null,files:P.manifest.totals.files,manifestSha256:P.manifestSha256,changed:j?P.manifestSha256!==j:null,blocking:P.blocking,error:null}}catch(P){return{changedFiles:null,files:null,manifestSha256:null,changed:null,blocking:[],error:Gl(P)}}}var wi={name:"status",summary:"Show the workspace, folder binding, and local-vs-cloud drift",usage:["Usage: hlix status [--cwd <dir>] [--json]","","Reports the resolved workspace and API with the source that decided each,","whether this folder is bound to a project, and whether the working tree or","the cloud head has moved since the last sync. Every finding is a line in","the output, so the command itself always exits 0; only an argument error","(rejected before it runs) exits 2."].join(`
378
+ `),supportsJson:!0,async run(d){let u=o({env:d.env,flags:d.flags,cwd:d.cwd}),f=u.binding,v=f?l(f.root):null,j=f?await Ce(d,f.root,v?.snapshotOnly?"sanitize":v?.historyMode??"preserve",v?.rootName,v?.manifestSha256):null,P=null;if(f?.config.projectId&&u.credential&&!u.conflict)try{let R=d.requireClient(),F=await R.projects.get(f.config.projectId),L=v?.repoId??F.repos.find((X)=>X.isPrimary)?.id??F.repos[0]?.id;if(!L)throw Error("Select a primary HLIX Repos");let H=await R.repos.head(f.config.projectId,L);P={commitSha:H.commitSha,changed:v?H.commitSha!==v.commitSha:null,error:null,errorMessage:null}}catch(R){P={commitSha:"",changed:null,error:ke(R).code,errorMessage:R instanceof h?"no HLIX Repos commit yet — `hlix push` publishes this folder":Gl(R)}}let I=yi(d.env),C={cwd:d.cwd,workspace:{id:u.workspaceId,source:u.workspaceSource},api:{baseUrl:u.baseUrl,source:u.baseUrlSource},credential:{present:u.credential!==null,source:u.credentialSource,path:u.credentialPath},conflict:u.conflict,project:f?{root:f.root,projectId:f.config.projectId??null,workspaceId:f.config.workspaceId,apiUrl:f.config.apiUrl}:null,repository:v?{repoId:v.repoId,commitSha:v.commitSha}:null,local:j,cloud:P,install:{channel:I.running?.channel??null,path:I.running?.path??null,copies:I.copies.map(({path:R,channel:F})=>({path:R,channel:F})),duplicate:I.duplicate}};if(d.json)return d.stdout(xe(_e(wi.name,C))),0;let T=[["folder",d.cwd],["workspace",u.workspaceId?`${u.workspaceId} (from ${u.workspaceSource})`:"none — run `hlix login --workspace <id>`"],["api",`${u.baseUrl} (from ${u.baseUrlSource})`],["credential",M(u)??"none — run `hlix login`"],["project",f?f.config.projectId??`initialized at ${f.root}, not imported yet`:"none — run `hlix import .` to bind this folder"]];if(v)T.push(["HLIX Repos",v.commitSha]);if(j){if(T.push(["local",j.error?`could not scan: ${j.error}`:j.changed===null?`${j.files} files, no synced base commit`:j.changed?`${j.files} files, modified since the last sync`:`${j.files} files, matches the last sync`]),j.blocking.length>0)T.push(["blocking",j.blocking.join("; ")])}if(P)T.push(["cloud",P.error==="not_found"?Dl(P.errorMessage??P.error):P.error?`not checked — ${Dl(P.errorMessage??P.error)}`:P.changed?`commit ${P.commitSha} available — run \`hlix pull\``:`commit ${P.commitSha}, up to date`]);if(u.conflict)T.push(["conflict",u.conflict]);if(I.running)T.push(["installed",ho(I.running)]);if(I.duplicate)T.push(["duplicate",I.duplicate]);return d.stdout(`${at(T)}
379
+ `),0}};import{spawnSync as Wl}from"node:child_process";var vi={name:"terminal",summary:"Open a shell into the project's Cloud Machine",usage:["Usage: hlix terminal [project-id] [--print] [--web] [--json]","","With no id, the project this folder is bound to is used."," --print Show the ssh command and browser url instead of connecting"," --web Open the browser terminal instead of ssh"].join(`
380
+ `),supportsJson:!0,signIn:!0,options:["print","web"],args:{min:0,max:1},async run(d){let u=d.args[0]??n(d.cwd)?.config.projectId;if(!u)throw new e("missing_argument","A project id is required, or run this inside a folder bound to a project.");let f=await d.requireClient().projects.terminal(u);if(d.json)return d.stdout(xe(_e(vi.name,f))),f.available?0:1;if(!f.available){let I=f.environmentState?` (environment: ${f.environmentState})`:"";throw new e("not_found",`${f.reason??"Terminal unavailable"}${I}`)}let v=d.flags.print===!0,j=d.flags.web===!0;if(v||j&&!f.webTerminalUrl||!j&&!f.sshCommand)return d.stdout(`${at([["ssh",f.sshCommand??"not available"],["browser",f.webTerminalUrl??"not available"]])}
381
+ `),0;if(j){if(Wl(process.platform==="darwin"?"open":"xdg-open",[f.webTerminalUrl],{stdio:"ignore"}).status!==0)d.stdout(`${f.webTerminalUrl}
382
+ `);return 0}return Wl("sh",["-c",f.sshCommand],{stdio:"inherit"}).status??1}};import{rmSync as Bl}from"node:fs";import{dirname as Rf}from"node:path";var bi={name:"uninstall",summary:"Remove this hlix if the installer put it here (keeps your login)",usage:["Usage: hlix uninstall [--yes] [--json]","","Removes the executable the one-line installer installed, and its notices.","Your login in ~/.config/hlix is kept. A copy installed with Homebrew or npm","is removed with that tool instead; this command names it."].join(`
383
+ `),supportsJson:!0,options:["yes"],async run(d){let u=fi(d.env);if(!u||u.channel!=="installer")throw new e("invalid_request",u&&u.channel!=="unknown"?`This hlix was installed with ${u.channel==="homebrew"?"Homebrew":"npm"}. Remove it with: ${hi(u)}`:"Only an hlix installed by the one-line installer can remove itself.");if(d.flags.yes!==!0){if(d.json||!d.confirm)throw new e("approval_required","Removing hlix needs approval. Repeat with `--yes`.");if(!await d.confirm(`Remove ${u.path}? Your login is kept.`))throw new e("cancelled","Uninstall cancelled.")}let f=gi(d.env);Bl(u.path,{force:!0}),Bl(f,{recursive:!0,force:!0});let v=Rf(Ot(d.env));if(d.json)d.stdout(xe(_e(bi.name,{removed:[u.path,f],kept:v})));else d.stdout(`Removed ${u.path}
384
+ Your login in ${v} is kept.
385
+ `);return 0}};function Ie(d){return[...d.pulled?[`HLIX Repos: pulled ${d.pulled}`]:[],...d.pushed?[`HLIX Repos: pushed ${d.pushed}`]:[]]}async function Ae(d,u,f){let v=!1;while(!f.signal?.aborted){try{let j=await ti(d,u.client,u.env);if(f.onReport({conflicts:[],...j.action==="push"?{pushed:j.commitSha}:j.action==="pull"?{pulled:j.commitSha}:{}}),!v)v=!0,f.onCaughtUp?.()}catch(j){f.onError(j)}await wt(15000,f.signal)}}var zl={name:"mirror",summary:"Follow HLIX Repos using Git",usage:"Usage: hlix mirror [--json]",supportsJson:!0,signIn:!0,options:[],agentTool:!1,async run(d){let{root:u}=await Fn(d.cwd);return await Ae(u,{client:d.requireClient(),env:d.env},{signal:d.signal,onReport:(f)=>{if(d.json)d.stdout(xe(_e("hlix mirror",f)));else for(let v of Ie(f))d.stdout(`${v}
386
+ `)},onError:(f)=>d.stderr(`${f instanceof Error?f.message:String(f)}
387
+ `)}),0}};import{lstat as xi,readFile as Nf,realpath as Ff}from"node:fs/promises";import{basename as ki,dirname as Lf,extname as Mf,join as yo,parse as ql,resolve as wo}from"node:path";function Hn(d,u){let f=d.flags[u];return typeof f==="string"&&f.trim()?f.trim():void 0}function Si(d){let u=Hn(d,"project");if(u)return{root:d.cwd,projectId:u};return Hf(d.cwd)}function Hf(d){let u=n(d);if(!u?.config.projectId)throw new e("not_initialized","This folder is not bound to an Hlix project. Run `hlix import .` first.");return{root:u.root,projectId:u.config.projectId}}async function ji(d,u){let f=await xi(d);if(f.isSymbolicLink()||!f.isFile())throw Error(`Refusing to import a non-regular file: ${d}`);if(f.size>u)throw Error(`Import file exceeds ${u} bytes: ${d}`);return{path:await Ff(d),content:await Nf(d,"utf8")}}function Pi(d,u,f,v){if(d.json)d.stdout(xe(_e(u,f)));else d.stdout(`${v}
388
+ `)}function Uf(d){let u=/^---\r?\n([\s\S]*?)\r?\n---/.exec(d)?.[1];return(u?/^name:\s*(.+?)\s*$/m.exec(u)?.[1]:void 0)?.replace(/^["']|["']$/g,"").trim()||void 0}var Df=[yo(".claude","skills"),yo(".agents","skills"),yo(".hlix","skills")];async function Gf(d,u){let f=[wo(d,u),...Df.map((v)=>wo(d,v,u))];for(let v of f)if(await xi(v).then(()=>!0,()=>!1))return v;throw new e("not_found",`No skill at ${u}. Pass the SKILL.md or its folder, for example .claude/skills/${u}.`)}var Ei={name:"skill import",summary:"Activate a local skill for the bound cloud project",usage:"Usage: hlix skill import <SKILL.md|folder> [--name <slug>] [--project <id>] [--json]",supportsJson:!0,signIn:!0,options:["name","project"],args:{min:1,max:1},async run(d){if(d.args.length!==1)throw Error("skill import requires one file or folder.");let u=Si(d),f=await Gf(d.cwd,d.args[0]),v=await xi(f);if(v.isSymbolicLink())throw Error(`Refusing to import a symlink: ${f}`);let j=v.isDirectory()?yo(f,"SKILL.md"):f,P=await ji(j,200000),I=v.isDirectory()?ki(f):ki(j)==="SKILL.md"?ki(Lf(j)):ql(j).name,C=Hn(d,"name")??I;if(!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(C))throw Error("Skill name must be a lowercase kebab-case slug.");let T=await d.requireClient().resources.importSkill(u.projectId,{slug:C,content:P.content});return Pi(d,Ei.name,T.skill,`Imported skill ${C}`),0}},Ii={name:"agent import",summary:"Create a project-scoped agent from a local Markdown brief",usage:"Usage: hlix agent import <markdown-file> [--name <name>] [--runtime <runtime>] [--duty <duty>] [--profile <profile>] [--project <id>] [--json]",supportsJson:!0,signIn:!0,options:["name","runtime","duty","profile","project"],args:{min:1,max:1},async run(d){if(d.args.length!==1)throw Error("agent import requires one Markdown file.");let u=Si(d),f=wo(d.cwd,d.args[0]);if(![".md",".mdx"].includes(Mf(f).toLowerCase()))throw Error("Agent imports must be Markdown files.");let v=await ji(f,20000),j=Hn(d,"runtime");if(j!==void 0&&!i.includes(j)){let T=new Intl.ListFormat("en",{type:"disjunction"}).format(i);throw Error(`--runtime must be ${T}.`)}let P=Hn(d,"duty")??"executor";if(P!=="executor"&&P!=="intake")throw Error("--duty must be executor or intake.");let I=Hn(d,"name")??Uf(v.content)??ql(f).name.replace(/[-_]+/g," "),C=await d.requireClient().resources.importAgent(u.projectId,{name:I,instructions:v.content,...j?{runtimeKind:j}:{},duty:P});return Pi(d,Ii.name,C.agent,C.agent.duty==="intake"?`Imported agent ${C.agent.name} as this project's intake agent`:`Imported agent ${C.agent.name}`),0}},_i={name:"mcp import",summary:"Explicitly activate one validated local MCP server",usage:"Usage: hlix mcp import <.mcp.json> [--server <name>] [--allow-stdio] [--project <id>] [--json]",supportsJson:!0,signIn:!0,options:["server","allow-stdio","project"],args:{min:1,max:1},async run(d){if(d.args.length!==1)throw Error("mcp import requires one MCP JSON file.");let u=Si(d),f=await ji(wo(d.cwd,d.args[0]),200000),v;try{v=JSON.parse(f.content)}catch{throw Error("MCP config is not valid JSON.")}let j=Object.entries(v.mcpServers??{});if(j.length===0)throw Error("MCP config contains no servers.");let P=Hn(d,"server");if(!P&&j.length>1)throw Error("MCP config contains multiple servers; select one with --server <name>.");let I=P?j.find(([B])=>B===P):j[0];if(!I)throw Error(`MCP server not found: ${P}`);let[C,T]=I,R=T.type==="http"||T.type==="sse"?T.type:typeof T.command==="string"?"stdio":typeof T.url==="string"?"http":null;if(!R)throw Error(`MCP server ${C} has no supported transport.`);if(R==="stdio"&&d.flags["allow-stdio"]!==!0)throw Error("Stdio MCP servers execute a command on the Cloud Machine; repeat with --allow-stdio.");let F=T.env&&typeof T.env==="object"&&!Array.isArray(T.env)?T.env:{},L=T.headers&&typeof T.headers==="object"&&!Array.isArray(T.headers)?T.headers:{};if(Object.values(L).some((B)=>typeof B!=="string"))throw Error(`MCP server ${C} headers must be strings.`);for(let[B,Z]of Object.entries(F)){if(typeof Z!=="string")continue;let Q=/^\$\{([A-Za-z_][A-Za-z0-9_]*)\}$/.exec(Z)?.[1];if(Q&&Q!==B)throw new e("invalid_usage",`MCP server ${C}: env ${B} references \${${Q}}, but a placeholder must be the variable's own name — write "${B}": "\${${B}}" and store the secret as ${B}.`)}let H=Object.values(L).flatMap((B)=>[...B.matchAll(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g)].map((Z)=>Z[1]));if(Object.keys(L).length>0&&H.length===0)throw Error("MCP remote headers must use ${KEY} placeholders; literal credentials are refused.");let X=/^(?:(?:Bearer|Basic|Token) )?\$\{[A-Za-z_][A-Za-z0-9_]*\}$/i;if(Object.values(L).some((B)=>!X.test(B)))throw Error("MCP remote headers must be ${KEY} or an approved auth scheme followed by ${KEY}.");let D=await d.requireClient().resources.importMcp(u.projectId,{name:C,transport:R,...typeof T.command==="string"?{command:T.command}:{},...Array.isArray(T.args)&&T.args.every((B)=>typeof B==="string")?{args:T.args}:{},...typeof T.url==="string"?{url:T.url}:{},...Object.keys(L).length>0?{headers:L}:{},envKeys:[...new Set([...Object.keys(F),...H])].sort()});return Pi(d,_i.name,D.mcpServer,`Imported MCP server ${C}`),0}};import{spawnSync as Wf}from"node:child_process";import{chmod as Bf,realpath as zf,writeFile as qf}from"node:fs/promises";import{basename as Jf,dirname as Kf,relative as Vf,resolve as Kl,sep as Xf}from"node:path";var Jl=64;function _r(d){let u=n(d.cwd),v=(typeof d.flags.project==="string"?d.flags.project:void 0)??u?.config.projectId;if(!v)throw new e("not_initialized","This folder is not bound to a Hlix project. Run `hlix import .`, or pass --project <id>.");return{projectId:v,root:u?.root??d.cwd}}var Ir=(d,u)=>typeof d[u]==="string"?d[u]:void 0,Ci={name:"secrets list",summary:"Show every secret the project holds, masked, with its source file",usage:["Usage: hlix secrets list [--project <id>] [--json]","","One row per (key, source file). Values are masked to their last four","characters and there is no flag that unmasks them — `hlix secrets export`","is the one command that returns plaintext, and it is audited."].join(`
389
+ `),supportsJson:!0,signIn:!0,options:["project"],async run(d){let{projectId:u}=_r(d),f=await d.requireClient().secrets.listEntries(u);if(d.json)return d.stdout(xe(_e(Ci.name,f))),0;if(f.entries.length===0)d.stdout(`No secrets stored for this project.
390
+ `);else d.stdout(`${Dt(["key","source","format","value","updated"],f.entries.map((v)=>[v.key,v.source,v.format||"-",v.maskedValue,v.updatedAt?.slice(0,10)??"-"]))}
391
+ `);for(let v of f.warnings)d.stderr(`warning: ${v}
392
+ `);return 0}},$i={name:"secrets set",summary:"Create or replace one secret in the store",usage:["Usage: hlix secrets set <KEY> [value] [--from-stdin] [--source <file>] [--project <id>] [--json]",""," --from-stdin Read the value from stdin instead of the argument, so it"," never reaches shell history or `ps`. Use this for real"," credentials: `pbpaste | hlix secrets set API_KEY --from-stdin`."," --source The file the value belongs to, e.g. apps/api/.env.local."," Omitted means the project root .env.","","Exactly one trailing newline is stripped from stdin, so a piped value does","not acquire the shell's."].join(`
393
+ `),supportsJson:!0,signIn:!0,options:["from-stdin","source","project"],args:{min:1,max:2},async run(d){let{projectId:u}=_r(d),f=d.args[0],v=d.flags["from-stdin"]===!0;if(v&&d.args.length>1)throw new e("invalid_usage","Pass the value as an argument or with --from-stdin, not both.");if(!v&&d.args.length<2)throw new e("missing_argument","A value is required. Pass it as an argument, or pipe it with --from-stdin.");let j;if(v){if(!d.readStdin)throw new e("invalid_usage","--from-stdin is not available in this context.");j=(await d.readStdin()).replace(/\r?\n$/,"")}else j=d.args[1];let P=Ir(d.flags,"source"),I=await d.requireClient().secrets.upsertEntries(u,{entries:[{key:f,value:j,...P?{source:P}:{}}]});if(d.json)return d.stdout(xe(_e($i.name,I))),I.written>0?0:1;if(I.written===0)throw new e("bad_request",`The store refused ${f}: --source must be a project-relative file path.`);return d.stdout(`${at([["key",f],["source",P??".env"]])}
394
+ `),0}},Ai={name:"secrets delete",summary:"Remove one secret from the store",usage:["Usage: hlix secrets delete <KEY> [--source <file>] [--project <id>] [--json]","","Without --source the key is removed from EVERY file that declares it,",'which is what "delete this secret" usually means. Removing nothing exits 1.'].join(`
395
+ `),supportsJson:!0,signIn:!0,options:["source","project"],args:{min:1,max:1},async run(d){let{projectId:u}=_r(d),f=d.args[0],v=Ir(d.flags,"source"),j=await d.requireClient().secrets.deleteEntry(u,f,v);if(d.json)return d.stdout(xe(_e(Ai.name,j))),j.removed>0?0:1;if(j.removed===0)return d.stderr(`No stored secret named ${f}${v?` in ${v}`:""}.
396
+ `),1;return d.stdout(`Removed ${j.removed} entr${j.removed===1?"y":"ies"} for ${f}.
397
+ `),0}},vo={name:"secrets import",summary:"Load this folder's secret files into the project secrets store",usage:["Usage: hlix secrets import [file...] [--project <id>] [--json]","","With no arguments, every secret file the project scanner detects. Naming","files narrows it to those; a named file the scanner does not consider a","secret is refused rather than uploaded.","","The files are uploaded as bytes and the server parses them, so every shape","it knows lands here: dotenv and .envrc, Terraform variables, Java","properties, Spring YAML, .NET appsettings, Azure Functions local settings,","npm credentials, Rails database.yml, wrangler/fly TOML and Serverless all","become readable entries under their own path. An opaque credential (a","private key, a keystore, a service-account JSON) is kept byte-exact","instead. A file whose plaintext this platform does not hold — SOPS,","Ansible Vault, git-crypt — and a .env.example are reported as skipped.","","A file that holds key/value pairs REPLACES what the store held for that","path: the file on this machine is the truth."].join(`
398
+ `),supportsJson:!0,signIn:!0,options:["project"],args:{min:0,max:64},async run(d){let{projectId:u,root:f}=_r(d),v=await Ft(f,{historyMode:"preserve",environment:d.env}),j=v.blocking.filter((L)=>!L.startsWith(Js));if(j.length>0)throw new e("scan_blocked",`Project scan blocked the import:
399
+ - ${j.join(`
400
+ - `)}`);let P=v.protectedFiles.filter((L)=>L.kind==="dotenv"||L.kind==="credential"),I=await zf(d.cwd),C=d.args.map((L)=>Vf(v.root,Kl(I,L)).split(Xf).join("/")),T=C.filter((L)=>!P.some((H)=>H.path===L));if(T.length>0)throw new e("invalid_usage",`Not a secret file in this project: ${T.join(", ")}`);let R=C.length>0?P.filter((L)=>C.includes(L.path)):P;if(R.length===0)return d.stdout(d.json?xe(_e(vo.name,{imported:[],skipped:[],warnings:[],written:0,rejected:[]})):`No secret files found in this project.
401
+ `),0;if(R.length>Jl)throw new e("invalid_usage",`${R.length} secret files exceeds the ${Jl} the store accepts in one request. Name the files to import, a batch at a time.`);let F=await d.requireClient().secrets.importFiles(u,R.map((L)=>({path:L.path,contentBase64:L.contentBase64})));if(d.json)return d.stdout(xe(_e(vo.name,F))),0;if(F.imported.length>0)d.stdout(`${Dt(["source","format","stored"],F.imported.map((L)=>[L.path,L.format||"-",L.kind==="file"?"as file":`${L.entries} entr${L.entries===1?"y":"ies"}`]))}
402
+ `);if(d.stdout(`${F.written} value${F.written===1?"":"s"} stored.
403
+ `),F.imported.some((L)=>L.kind!=="file"))d.stdout(`Each imported file replaced what the store held under its path; keys the file no longer has are gone.
404
+ `);for(let L of F.skipped)d.stderr(`skipped ${L.path}: ${L.reason}
405
+ `);for(let L of F.warnings)d.stderr(`warning: ${L}
406
+ `);for(let L of F.rejected)d.stderr(`rejected ${L}: the store refused its source path
407
+ `);return 0}};function Yf(d){return Wf("git",["-C",Kf(d),"ls-files","--error-unmatch","--",Jf(d)],{encoding:"utf8",stdio:["ignore","pipe","pipe"]}).status===0}var Ti={name:"secrets export",summary:"Render one source file back out of the store, values in clear",usage:["Usage: hlix secrets export [--source <file>] [--format <id>] [--out <path>] [--project <id>] [--json]",""," --source Which stored file to render. Omitted means the root .env."," --format Re-render it as a different shape (dotenv, tfvars, …)."," Omitted means the shape the values were parsed as."," --out Write it to this path, mode 0600, instead of stdout. A path"," git TRACKS is refused: an exported file carries plaintext and"," must not become a commit.","","This is the one command that returns secret values, and the server writes","an audit row for every call."].join(`
408
+ `),supportsJson:!0,signIn:!0,options:["source","format","out","project"],async run(d){let{projectId:u}=_r(d),f=Ir(d.flags,"source"),v=Ir(d.flags,"format"),j=Ir(d.flags,"out"),P=j===void 0?void 0:Kl(d.cwd,j);if(P!==void 0&&Yf(P))throw new e("invalid_usage",`Refusing to overwrite a git-tracked file with secret values: ${P}`);let I=await d.requireClient().secrets.exportEntries(u,{...f?{source:f}:{},...v?{format:v}:{}});if(P!==void 0)await qf(P,I,{mode:384}),await Bf(P,384);if(d.json)return d.stdout(xe(_e(Ti.name,{source:f??null,format:v??null,out:P??null,bytes:Buffer.byteLength(I),...P===void 0?{content:I}:{}}))),0;if(P===void 0)d.stdout(I);else d.stdout(`${at([["wrote",P],["mode","0600"],["bytes",String(Buffer.byteLength(I))]])}
409
+ `);return 0}};function Ri(d){let u=d.flags.project;if(typeof u==="string"&&u)return u;return n(d.cwd)?.config.projectId??void 0}function Oi(d,u){let f=d[u];if(typeof f!=="string"||f.trim()==="")throw new e("missing_argument",`--${u} is required.`);return f}var Ni={name:"cycles create",summary:"Propose a cycle, which starts the project working on it",usage:["Usage: hlix cycles create <project-id> --title <t> --description <d> [--json]","","This is the command that DISPATCHES work. The proposal enters the project's","own loop, which plans the cycle, creates its tasks and starts the coders —","using the project's harness (see `hlix harness get`).","","`adopted` is true when the loop took it on this call, false when it was","recorded and will be planned on the next pass. Neither is an error. The API","returns no cycle id: the roadmap owns cycles, so find it with `hlix tasks","list --project <id>` once planning has run."].join(`
410
+ `),supportsJson:!0,signIn:!0,options:["title","description"],args:{min:1,max:1},async run(d){let u=d.args[0],f=Oi(d.flags,"title"),v=Oi(d.flags,"description"),j=await d.requireClient().cycles.propose({projectId:u,title:f,description:v});if(d.json)return d.stdout(xe(_e(Ni.name,j))),0;return d.stdout(`${at([["project",u],["title",f],["status",j.adopted?"adopted — the project is planning it now":"recorded — it will be planned on the next pass"]])}
411
+ `),0}},Fi={name:"tasks create",summary:"Add a task to a project's board",usage:["Usage: hlix tasks create <project-id> --description <d> [--title <t>] [--json]","","Creates the task row. It does NOT start it: standalone task execution is","not implemented server-side and answers 501 by design. Work is dispatched","by its cycle — use `hlix cycles create` for that."].join(`
412
+ `),supportsJson:!0,signIn:!0,options:["title","description"],args:{min:1,max:1},async run(d){let u=d.args[0],f=Oi(d.flags,"description"),v=typeof d.flags.title==="string"?d.flags.title:void 0,j=await d.requireClient().tasks.create({projectId:u,description:f,...v?{title:v}:{}});if(d.json)return d.stdout(xe(_e(Fi.name,j))),0;return d.stdout(`${at([["task",j.id],["project",u],["status",j.status??"queued"],["note","not started — dispatch with `hlix cycles create`"]])}
413
+ `),0}},Li={name:"harness get",summary:"Show which coder runs, and which setting chose it",usage:["Usage: hlix harness get [project-id] [--project <id>] [--json]","","With a project id — or from a bound folder — what that project would run.","Otherwise the workspace-wide answer. `source` names the setting that","decided: a project override, the workspace setting, or the default. The","JSON carries the whole Cycle group (provider, model, effort, how many run","at once) and the Operator model beside the harness."].join(`
414
+ `),supportsJson:!0,signIn:!0,options:["project"],args:{min:0,max:1},async run(d){let u=d.args[0]??Ri(d),f=d.requireClient(),v=u?await f.modelConfig.resolved(u):await f.modelConfig.resolved();if(d.json)return d.stdout(xe(_e(Li.name,v))),0;return d.stdout(`${at([["scope",u?`project ${u}`:"workspace"],["harness",v.cycle.harness],["source",v.cycle.source.harness]])}
415
+ `),0}},Mi={name:"harness set",summary:"Choose the coder a project or the workspace runs",usage:[`Usage: hlix harness set <${i.join("|")}> [project-id] [--org] [--json]`,"","With a project id, sets that project's Cycle harness. With --org, the","workspace-wide one that projects fall back to. This is a PERSISTENT server","setting that every future run on that scope uses, and it is audited. A","provider the new harness cannot use (a ChatGPT login under Goose) goes","back to hlix-managed.","","It is not the same thing as the local `harness` config key, which only","picks the coder Hlix Code spawns on this machine."].join(`
416
+ `),supportsJson:!0,signIn:!0,options:["org"],args:{min:1,max:2},async run(d){let u=d.args[0];if(!i.includes(u))throw new e("invalid_usage",`harness must be one of ${i.join(", ")}; got "${u}".`);let f=d.flags.org===!0,v=d.args[1]??(f?void 0:Ri(d));if(v&&f)throw new e("invalid_usage","Name a project or pass --org, not both: they are different scopes.");if(!v&&!f)throw new e("invalid_usage","Name the project to set, or pass --org for the whole workspace.");let j=d.requireClient(),P=v?await j.modelConfig.setProjectHarness(v,u):await j.modelConfig.setHarness(u);if(d.json)return d.stdout(xe(_e(Mi.name,P))),0;return d.stdout(`${at([["scope",v?`project ${v}`:"workspace"],["harness",u]])}
417
+ `),0}},Hi={name:"harness clear",summary:"Remove a Cycle setting so the scope below it decides",usage:["Usage: hlix harness clear [project-id] [--org] [--json]","","With a project id, drops that project's Cycle override (harness, provider,","model, effort) so it inherits the workspace's. With --org, resets the","workspace's Cycle group to the default. Audited, like every write on this","setting.","","Answers `not_found` when that scope had no setting to clear — the","setting is already off, and saying so beats reporting a change that was","never made. Check the result with `hlix harness get`."].join(`
418
+ `),supportsJson:!0,signIn:!0,options:["org"],args:{min:0,max:1},async run(d){let u=d.flags.org===!0,f=d.args[0]??(u?void 0:Ri(d));if(f&&u)throw new e("invalid_usage","Name a project or pass --org, not both: they are different scopes.");if(!f&&!u)throw new e("invalid_usage","Name the project to clear, or pass --org for the whole workspace.");let v=d.requireClient(),j=f?await v.modelConfig.clearProjectHarness(f):await v.modelConfig.clearHarness();if(d.json)return d.stdout(xe(_e(Hi.name,j))),0;return d.stdout(`${at([["scope",f?`project ${f}`:"workspace"],["harness","cleared — the scope below decides now"]])}
419
+ `),0}};var E=[Br,cs,zr,Xa,Ya,wi,bi,vi,ui,pi,ys,ws,vs,Vs,We,bl,vl,wl,zl,Ei,Ii,_i,Ci,$i,Ai,vo,Ti,bs,ks,xs,Ss,js,Es,Is,_s,Cs,Fi,Ni,Li,Mi,Hi];import{emitKeypressEvents as Zf}from"node:readline";import{createInterface as Vl}from"node:readline/promises";async function Xe(d){if(!process.stdin.isTTY||!process.stdin.setRawMode)throw Error("Interactive login requires a terminal. Set HLIX_API_KEY for CI.");return process.stderr.write(d),Zf(process.stdin),process.stdin.setRawMode(!0),process.stdin.resume(),new Promise((u,f)=>{let v="",j=()=>{process.stdin.off("keypress",P),process.stdin.setRawMode(!1),process.stdin.pause(),process.stderr.write(`
420
+ `)},P=(I,C)=>{if(C.ctrl&&C.name==="c"||C.name==="escape"){j(),f(Error("Login cancelled."));return}if(C.name==="return"||C.name==="enter"){j(),u(v);return}if(C.name==="backspace"){v=v.slice(0,-1);return}if(I&&!C.ctrl)v+=I};process.stdin.on("keypress",P)})}async function J(d,u){if(!process.stdin.isTTY||!process.stderr.isTTY)throw Error("Interactive selection requires a terminal. Pass --workspace <id>.");let f=Vl({input:process.stdin,output:process.stderr});try{for(let v=0;v<3;v+=1){let j=(await f.question(d)).trim(),P=Number(j);if(Number.isInteger(P)&&P>=1&&P<=u)return P-1;process.stderr.write(`Enter a number between 1 and ${u}.
421
+ `)}throw Error("No workspace selected.")}finally{f.close()}}async function Ze(d){if(!process.stdin.isTTY||!process.stderr.isTTY)throw Error("Interactive approval requires a terminal. Review with --dry-run, then pass --yes.");let u=Vl({input:process.stdin,output:process.stderr});try{let f=(await u.question(`${d}
422
+ Continue? [y/N] `)).trim().toLowerCase();return f==="y"||f==="yes"}finally{u.close()}}
423
+ export{A,h,e,G,c,Se,se,O,De,s,x,S,y,p,N,Fe,He,ie,ae,ce,le,Ue,de,W,ue,M,n,o,t,_,k,dt,ke,r,m,l,q,pe,b,w,i,Ee,K,z,me,a,Be,Ge,We,g,qe,V,ge,Ke,fe,he,ze,Ve,Je,Ye,Ce,Ie,Ae,E,Xe,J,Ze};