@hlix/cli 1.2.0 → 1.2.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,416 @@
1
+ #!/usr/bin/env node
2
+ import{resolve as wp}from"node:path";import{parseArgs as vp}from"node:util";import Hl from"openapi-fetch";function ao(z){return Hl({baseUrl:z.baseUrl,headers:z.headers,fetch:z.fetch})}var Ht=(z)=>({kind:"apiKey",apiKey:z});var rn=(z)=>({kind:"bearer",token:z});function Ml(z){switch(z.kind){case"apiKey":return{"x-api-key":z.apiKey};case"session":return{cookie:z.cookie};case"bearer":return{authorization:`Bearer ${z.token}`}}}function Dl(z){return z?{"X-Organization-Id":z}:{}}function Ni(z,J){return{...Ml(z),...Dl(J)}}function Ul(z){if(typeof z!=="object"||z===null)return null;let{error:J}=z;return typeof J==="string"?J:null}class qe extends Error{status;body;requestId;method;url;constructor(z,J){super(z);this.name=new.target.name,this.status=J.status,this.body=J.body,this.requestId=J.requestId??null,this.method=J.method,this.url=J.url}}class on extends qe{issues;constructor(z,J,V){super(z,J);this.issues=V}}class $n extends qe{}class Mt extends qe{}class Tn extends qe{}class Dt extends qe{}class Ut extends qe{}class Gt extends qe{retryAfter;constructor(z,J,V){super(z,J);this.retryAfter=V}}class An extends qe{}class Wt extends qe{}class ct extends Error{method;url;constructor(z,J){super(z,{cause:J.cause});this.name="HlixTransportError",this.method=J.method,this.url=J.url}}function Gl(z){if(typeof z!=="object"||z===null)return null;let J=z;if(J.success!==!1)return null;let V=J.error?.message;if(typeof V!=="string")return null;try{let X=JSON.parse(V);return Array.isArray(X)?X:[]}catch{return[]}}function Wl(z){let J=z.get("retry-after");if(!J)return null;let V=Number(J);return Number.isFinite(V)&&V>=0?V:null}function Bt(z,J,V){let X={status:z.status,body:J,requestId:z.headers.get("x-request-id"),method:V.method,url:V.url},Y=Ul(J),Z=`${V.method} ${V.url} failed with ${z.status}`,Q=Gl(J);if(Q)return new on(`${V.method} ${V.url}: request body failed validation`,X,Q);let ee=Y??Z;switch(z.status){case 400:return new $n(ee,X);case 401:return new Mt(ee,X);case 403:return new Tn(ee,X);case 404:return new Dt(ee,X);case 409:return new Ut(ee,X);case 429:return new Gt(ee,X,Wl(z.headers));case 501:return new An(ee,X);default:return z.status>=500?new Wt(ee,X):new qe(ee,X)}}var Fi=new Set(["GET","HEAD","PUT","DELETE","OPTIONS","TRACE"]);function dr(z){return Fi.has(z.toUpperCase())}var Bl=new Set([429,500,502,503,504]);function zl(z){return Bl.has(z)}var co={attempts:3,baseDelayMs:200,maxDelayMs:5000};function Rn(z,J,V,X=Math.random){if(V!==null)return Math.min(V*1000,J.maxDelayMs);let Y=Math.min(J.baseDelayMs*2**z,J.maxDelayMs);return Math.round(X()*Y)}function lo(z){if(!dr(z.method))return!1;if(z.attempt+1>=z.policy.attempts)return!1;return z.status===null||zl(z.status)}var Jl=(z)=>new Promise((J)=>setTimeout(J,z));function Kl(z){let J=z.headers.get("retry-after");if(!J)return null;let V=Number(J);return Number.isFinite(V)&&V>=0?V:null}function Li(z){let{base:J,policy:V}=z,X=z.sleep??Jl,Y=z.random??Math.random;return async(Z)=>{let Q=Z.method.toUpperCase(),ee=dr(Q)?Z.clone():null;for(let te=0;;te+=1){let re=te===0?Z:ee.clone(),ne;try{ne=await J(re)}catch(se){if(!ee||!lo({method:Q,attempt:te,policy:V,status:null}))throw new ct(`${Q} ${Z.url}: ${se instanceof Error?se.message:String(se)}`,{method:Q,url:Z.url,cause:se});await X(Rn(te,V,null,Y));continue}if(!lo({method:Q,attempt:te,policy:V,status:ne.status}))return ne;if(!ee)return ne;await X(Rn(te,V,Kl(ne),Y))}}}function we(z,J){if(z.response.ok)return z.data;throw Bt(z.response,z.error??z.data,J)}var On=(z)=>typeof z==="string"?z:"";function po(z){let J;try{J=JSON.parse(z)}catch{return null}if(typeof J!=="object"||J===null)return null;let V=J;switch(V.type){case"idle":return{type:"idle"};case"done":return{type:"done"};case"active":return typeof V.runId==="string"?{type:"active",runId:V.runId}:{type:"active"};case"on_chat_model_stream":return{type:"on_chat_model_stream",delta:On(V.delta)};case"reasoning":return{type:"reasoning",delta:On(V.delta)};case"on_tool_start":return{type:"on_tool_start",name:On(V.name),input:V.input};case"on_tool_end":return{type:"on_tool_end",name:On(V.name),output:V.output};case"error":return{type:"error",message:On(V.message)};default:return null}}var uo=(z)=>z.type==="done"||z.type==="idle"||z.type==="error";var ql=()=>({event:null,data:[],id:null,retry:null});function Hi(z,J,V){switch(J){case"event":z.event=V;return;case"data":z.data.push(V);return;case"id":if(!V.includes("\x00"))z.id=V;return;case"retry":{if(/^\d+$/.test(V))z.retry=Number(V);return}default:return}}function Di(z){let J=z.data.join(`
3
+ `),{event:V,id:X}=z;if(z.data=[],z.event=null,J==="")return null;return{event:V,data:J,id:X,retry:z.retry}}function Mi(z,J){if(J==="")return Di(z);if(J.startsWith(":"))return null;let V=J.indexOf(":");if(V===-1)return Hi(z,J,""),null;let X=J.slice(0,V),Y=J.slice(V+1);if(Y.startsWith(" "))Y=Y.slice(1);return Hi(z,X,Y),null}function Vl(z){let J=[],V=0;for(let X=0;X<z.length;X+=1){let Y=z[X];if(Y!==`
4
+ `&&Y!=="\r")continue;if(J.push(z.slice(V,X)),Y==="\r"&&z[X+1]===`
5
+ `)X+=1;V=X+1}return{lines:J,rest:z.slice(V)}}async function*pr(z,J){let V=z.getReader(),X=new TextDecoder,Y=ql(),Z="",Q=()=>void V.cancel().catch(()=>{});J?.addEventListener("abort",Q,{once:!0});try{for(;;){let{done:te,value:re}=await V.read();if(te)break;Z+=X.decode(re,{stream:!0});let{lines:ne,rest:se}=Vl(Z);Z=se;for(let ie of ne){let le=Mi(Y,ie);if(le)yield le}if(J?.aborted)return}if(Z+=X.decode(),Z!==""){let te=Mi(Y,Z);if(te)yield te}let ee=Di(Y);if(ee)yield ee}finally{J?.removeEventListener("abort",Q),V.releaseLock()}}function lt(z,J){return new Promise((V)=>{if(J?.aborted)return V();let X=setTimeout(Y,z);function Y(){clearTimeout(X),J?.removeEventListener("abort",Y),V()}J?.addEventListener("abort",Y,{once:!0})})}var go=()=>crypto.randomUUID();function Wi(z){return{threadId:z.threadId,runId:z.runId??go(),state:{},messages:[{id:z.messageId??go(),role:"user",content:z.text}],tools:[],context:[],forwardedProps:z.forwardedProps??{}}}function Bi(z,J){return{threadId:z,runId:go(),state:{},messages:[],tools:[],context:[],...J?{lastSeenEventId:J}:{}}}function fo(z){let J=z.metadata;if(typeof J!=="object"||J===null)return;let V=J.eventId;return typeof V==="string"&&V?V:void 0}function ho(z){let J;try{J=JSON.parse(z)}catch{return null}if(typeof J!=="object"||J===null)return null;return typeof J.type==="string"?J:null}function zt(z,J={}){if(J.taskId)return`project:${z}:task:${J.taskId}`;if(J.cycleId)return`project:${z}:cycle:${J.cycleId}`;return`project:${z}`}var Xl=new Set(["done","merged","failed","pr_created","ci_passing"]),Yl=new Set(["done","pr_created","failed","canceled"]);function yo(z,J){let V=z.tasks.find((Q)=>Q.id===J);if(!V)return{state:"running",task:V};let X=V.cycleId?z.cycles.find((Q)=>Q.id===V.cycleId):void 0;if(!(!V.cycleId||X!==void 0&&Yl.has(X.status)))return{state:"running",task:V};if(Xl.has(V.status))return{state:"finished",task:V};if(!X)return{state:"running",task:V};let Z=X?.status==="canceled"?"Task cycle was canceled":X?.status==="failed"?"Task cycle failed":"Task cycle ended before this task completed";return{state:"unmet",task:V,reason:Z}}async function*wo(z){let J;for await(let V of z){if(V.type==="STATE_SNAPSHOT")J=structuredClone(V.snapshot);else if(V.type==="STATE_DELTA"){if(J===void 0)continue;J=zi(J,V.delta)}else if(V.type!=="CUSTOM"||J===void 0)continue;yield{state:J,event:V}}}function vo(z){if(z==="")return[];if(!z.startsWith("/"))throw Error(`Invalid JSON pointer: ${z}`);return z.slice(1).split("/").map((J)=>J.replace(/~1/g,"/").replace(/~0/g,"~"))}function bo(z,J){let V=z;for(let X of J.slice(0,-1)){if(typeof V!=="object"||V===null)throw Error(`Path not found: /${J.join("/")}`);V=V[X]}if(typeof V!=="object"||V===null)throw Error(`Path not found: /${J.join("/")}`);return{parent:V,key:J[J.length-1]}}function ur(z,J,V){if(J==="-"&&V)return z.length;let X=Number(J);if(!/^(0|[1-9]\d*)$/.test(J)||X>z.length||!V&&X===z.length)throw Error(`Invalid array index: ${J}`);return X}function Ui(z,J){let V=vo(J);if(V.length===0)return z;let{parent:X,key:Y}=bo(z,V);if(Array.isArray(X))return X[ur(X,Y,!1)];if(!(Y in X))throw Error(`Path not found: ${J}`);return X[Y]}function Gi(z,J){let{parent:V,key:X}=bo(z,vo(J));if(Array.isArray(V))return V.splice(ur(V,X,!1),1)[0];if(!(X in V))throw Error(`Path not found: ${J}`);let Y=V[X];return delete V[X],Y}function mo(z,J,V,X){let Y=vo(J);if(Y.length===0)return V;let{parent:Z,key:Q}=bo(z,Y);if(Array.isArray(Z))if(X==="add")Z.splice(ur(Z,Q,!0),0,V);else Z[ur(Z,Q,!1)]=V;else{if(X==="replace"&&!(Q in Z))throw Error(`Path not found: ${J}`);Z[Q]=V}return z}function zi(z,J){let V=structuredClone(z);for(let X of J)switch(X.op){case"add":case"replace":V=mo(V,X.path,structuredClone(X.value),X.op);break;case"remove":Gi(V,X.path);break;case"copy":V=mo(V,X.path,structuredClone(Ui(V,X.from)),"add");break;case"move":{let Y=Gi(V,X.from);V=mo(V,X.path,Y,"add");break}case"test":if(JSON.stringify(Ui(V,X.path))!==JSON.stringify(X.value))throw Error(`Test failed at ${X.path}`);break;default:throw Error(`Unknown patch operation: ${X.op}`)}return V}var Zl="urn:ietf:params:oauth:grant-type:device_code",Ql="/v1/api/auth/device";class dt extends Error{reason;constructor(z,J){super(J);this.name="HlixDeviceLoginError",this.reason=z}}var mr=()=>new dt("cancelled","Login cancelled."),Nn=()=>new dt("expired","The login code expired. Run the login again.");function ed(z,J){let V=new AbortController,X=[z,J].map((Y)=>{let Z=()=>V.abort(Y.reason);if(Y.aborted)V.abort(Y.reason);else Y.addEventListener("abort",Z,{once:!0});return()=>Y.removeEventListener("abort",Z)});return{signal:V.signal,release:()=>X.forEach((Y)=>Y())}}async function qi(z,J,V,X){if(!X||!z.signal)return Ji(z,J,V,X,X??z.signal);let Y=ed(z.signal,X);try{return await Ji(z,J,V,X,Y.signal)}finally{Y.release()}}async function Ji(z,J,V,X,Y){let Z=`${z.baseUrl.replace(/\/+$/,"")}${Ql}/${J}`,Q=z.fetch??((re)=>globalThis.fetch(re)),ee;try{ee=await Q(new Request(Z,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(V),...Y?{signal:Y}:{}}))}catch(re){if(z.signal?.aborted)throw mr();if(X?.aborted)throw Nn();throw new ct(`POST ${Z}: ${re instanceof Error?re.message:String(re)}`,{method:"POST",url:Z,cause:re})}let te=await ee.json().catch(()=>null);if(z.signal?.aborted)throw mr();if(X?.aborted&&!te)throw Nn();return{ok:ee.ok,json:te??{}}}function Ki(z){try{let J=new URL(z);return J.protocol==="https:"||J.protocol==="http:"?J.href:null}catch{return null}}var tt=(z)=>typeof z==="string"?z:"";async function ko(z){let{ok:J,json:V}=await qi(z,"code",{client_id:z.clientId});if(!J||!tt(V.device_code)||!tt(V.user_code))throw new dt("rejected",tt(V.error_description)||tt(V.error)||"The server would not start a browser login.");let X=Ki(tt(V.verification_uri)),Y=tt(V.verification_uri_complete)?Ki(tt(V.verification_uri_complete)):X;if(!X||!Y)throw new dt("rejected","The server's sign-in page is not a web address.");return{deviceCode:tt(V.device_code),userCode:tt(V.user_code),verificationUri:X,verificationUriComplete:Y,expiresInSeconds:Number(V.expires_in)||600,intervalSeconds:Number(V.interval)||5}}async function So(z){let J=z.sleep??lt,V=z.now??Date.now,X=V()+z.code.expiresInSeconds*1000,Y=z.code.intervalSeconds*1000;for(;;){if(z.signal?.aborted)throw mr();if(V()>=X)throw Nn();if(await J(Y,z.signal),z.signal?.aborted)throw mr();let Z=X-V();if(Z<=0)throw Nn();let{ok:Q,json:ee}=await qi(z,"token",{grant_type:Zl,device_code:z.code.deviceCode,client_id:z.clientId},AbortSignal.timeout(Z)),te=tt(ee.access_token);if(Q&&te)return te;let re=tt(ee.error);if(re==="authorization_pending")continue;if(re==="slow_down"){Y+=5000;continue}if(re==="access_denied")throw new dt("denied","The login was denied in the browser.");if(re==="expired_token")throw Nn();throw new dt("rejected",tt(ee.error_description)||re||"The browser login failed.")}}var td={attempts:6,baseDelayMs:500,maxDelayMs:15000};function nd(z){if(z instanceof Wt||z instanceof Gt)return!0;return!(z instanceof qe)}class Jt{raw;baseUrl;headers;fetcher;constructor(z){this.baseUrl=z.baseUrl.replace(/\/+$/,"");let J=Ni(z.credential,z.organizationId),V=new Set(Object.keys(J).map((Z)=>Z.toLowerCase()));this.headers={...Object.fromEntries(Object.entries(z.headers??{}).filter(([Z])=>!V.has(Z.toLowerCase()))),...J};let X={...co,...z.retry},Y=z.fetch??((Z)=>globalThis.fetch(Z));this.fetcher=Li({base:Y,policy:X}),this.raw=ao({baseUrl:this.baseUrl,headers:this.headers,fetch:this.fetcher})}at(z,J){return{method:z,url:`${this.baseUrl}${J}`}}workspaces={list:async(z={})=>we(await this.raw.GET("/v1/api/workspaces",z),this.at("GET","/v1/api/workspaces"))};projects={list:async()=>we(await this.raw.GET("/v1/api/projects"),this.at("GET","/v1/api/projects")),get:async(z,J={})=>we(await this.raw.GET("/v1/api/projects/{id}",{...J,params:{path:{id:z}}}),this.at("GET",`/v1/api/projects/${z}`)),create:async(z)=>we(await this.raw.POST("/v1/api/projects",{body:z}),this.at("POST","/v1/api/projects")),update:async(z,J)=>we(await this.raw.PATCH("/v1/api/projects/{id}",{params:{path:{id:z}},body:J}),this.at("PATCH",`/v1/api/projects/${z}`)),delete:async(z)=>we(await this.raw.DELETE("/v1/api/projects/{id}",{params:{path:{id:z}}}),this.at("DELETE",`/v1/api/projects/${z}`)),start:async(z,J)=>we(await this.raw.POST("/v1/api/projects/{id}/start",{params:{path:{id:z}},body:J}),this.at("POST",`/v1/api/projects/${z}/start`)),stop:async(z)=>we(await this.raw.POST("/v1/api/projects/{id}/stop",{params:{path:{id:z}}}),this.at("POST",`/v1/api/projects/${z}/stop`)),resume:async(z)=>we(await this.raw.POST("/v1/api/projects/{id}/resume",{params:{path:{id:z}}}),this.at("POST",`/v1/api/projects/${z}/resume`)),status:async(z,J={})=>we(await this.raw.GET("/v1/api/projects/{id}/status",{...J,params:{path:{id:z}}}),this.at("GET",`/v1/api/projects/${z}/status`)),canvas:{view:async(z)=>we(await this.raw.GET("/v1/api/projects/{id}/canvas/agent",{params:{path:{id:z}}}),this.at("GET",`/v1/api/projects/${z}/canvas/agent`)),apply:async(z,J,V)=>we(await this.raw.POST("/v1/api/projects/{id}/canvas/agent/ops",{params:{path:{id:z}},body:{ops:J,...V?{reason:V}:{}}}),this.at("POST",`/v1/api/projects/${z}/canvas/agent/ops`)),undo:async(z)=>we(await this.raw.POST("/v1/api/projects/{id}/canvas/agent/undo",{params:{path:{id:z}}}),this.at("POST",`/v1/api/projects/${z}/canvas/agent/undo`))},deliver:async(z)=>we(await this.raw.POST("/v1/api/projects/{id}/delivery",{params:{path:{id:z}}}),this.at("POST",`/v1/api/projects/${z}/delivery`)),attachGithubRepository:async(z,J)=>we(await this.raw.POST("/v1/api/projects/{id}/repos/github",{params:{path:{id:z}},body:{githubRepository:J}}),this.at("POST",`/v1/api/projects/${z}/repos/github`)),terminal:async(z)=>we(await this.raw.GET("/v1/api/projects/{id}/terminal",{params:{path:{id:z}}}),this.at("GET",`/v1/api/projects/${z}/terminal`)),observeCycle:(z,J)=>this.observeCycle(z,J),workspace:(z)=>({environment:async()=>we(await this.raw.GET("/v1/api/projects/{id}/environment",{params:{path:{id:z}}}),this.at("GET",`/v1/api/projects/${z}/environment`)),fs:async(J)=>we(await this.raw.POST("/v1/api/projects/{id}/workspace/fs",{params:{path:{id:z}},body:J}),this.at("POST",`/v1/api/projects/${z}/workspace/fs`)),exec:async(J)=>we(await this.raw.POST("/v1/api/projects/{id}/workspace/exec",{params:{path:{id:z}},body:J}),this.at("POST",`/v1/api/projects/${z}/workspace/exec`))})};secrets={listEntries:async(z)=>we(await this.raw.GET("/v1/api/secrets/project/{projectId}/entries",{params:{path:{projectId:z}}}),this.at("GET",`/v1/api/secrets/project/${z}/entries`)),upsertEntries:async(z,J)=>we(await this.raw.PUT("/v1/api/secrets/project/{projectId}/entries",{params:{path:{projectId:z}},body:J}),this.at("PUT",`/v1/api/secrets/project/${z}/entries`)),importFiles:async(z,J)=>we(await this.raw.PUT("/v1/api/secrets/project/{projectId}/files",{params:{path:{projectId:z}},body:{files:J}}),this.at("PUT",`/v1/api/secrets/project/${z}/files`)),deleteEntry:async(z,J,V)=>we(await this.raw.DELETE("/v1/api/secrets/project/{projectId}/entries/{key}",{params:{path:{projectId:z,key:J},...V===void 0?{}:{query:{source:V}}}}),this.at("DELETE",`/v1/api/secrets/project/${z}/entries/${encodeURIComponent(J)}`)),exportEntries:async(z,J={})=>{let V=`/v1/api/secrets/project/${z}/export`,X=`${this.baseUrl}${V}`,Y=await this.fetcher(new Request(X,{method:"POST",headers:{...this.headers,"content-type":"application/json"},body:JSON.stringify({...J.source===void 0?{}:{source:J.source},...J.format===void 0?{}:{format:J.format}})}));if(!Y.ok)throw Bt(Y,await Y.json().catch(()=>{return}),{method:"POST",url:X});return Y.text()}};repos={access:async(z,J,V="read")=>we(await this.raw.POST("/v1/api/projects/{id}/repos/{repoId}/access",{params:{path:{id:z,repoId:J}},body:{scope:V}}),this.at("POST",`/v1/api/projects/${z}/repos/${J}/access`)),head:async(z,J,V={})=>we(await this.raw.GET("/v1/api/projects/{id}/repos/{repoId}/head",{...V,params:{path:{id:z,repoId:J}}}),this.at("GET",`/v1/api/projects/${z}/repos/${J}/head`)),protectedFiles:async(z)=>we(await this.raw.GET("/v1/api/projects/{id}/protected-files",{params:{path:{id:z}}}),this.at("GET",`/v1/api/projects/${z}/protected-files`)),watch:(z,J,V={})=>this.watchRepo(z,J,V)};resources={importSkill:async(z,J)=>we(await this.raw.POST("/v1/api/projects/{id}/resources/skill",{params:{path:{id:z}},body:J}),this.at("POST",`/v1/api/projects/${z}/resources/skill`)),importAgent:async(z,J)=>we(await this.raw.POST("/v1/api/projects/{id}/resources/agent",{params:{path:{id:z}},body:J}),this.at("POST",`/v1/api/projects/${z}/resources/agent`)),importMcp:async(z,J)=>we(await this.raw.POST("/v1/api/projects/{id}/resources/mcp",{params:{path:{id:z}},body:J}),this.at("POST",`/v1/api/projects/${z}/resources/mcp`))};async throwUploadError(z,J){let V=null;try{V=await z.json()}catch{V=await z.text().catch(()=>null)}throw Bt(z,V,{method:"PUT",url:J})}tasks={list:async(z)=>we(await this.raw.GET("/v1/api/tasks",{params:{query:z??{}}}),this.at("GET","/v1/api/tasks")),get:async(z)=>we(await this.raw.GET("/v1/api/tasks/{id}",{params:{path:{id:z}}}),this.at("GET",`/v1/api/tasks/${z}`)),create:async(z)=>we(await this.raw.POST("/v1/api/tasks",{body:z}),this.at("POST","/v1/api/tasks")),update:async(z,J)=>we(await this.raw.PATCH("/v1/api/tasks/{id}",{params:{path:{id:z}},body:J}),this.at("PATCH",`/v1/api/tasks/${z}`)),listComments:async(z)=>we(await this.raw.GET("/v1/api/tasks/{id}/comments",{params:{path:{id:z}}}),this.at("GET",`/v1/api/tasks/${z}/comments`)),addComment:async(z,J)=>we(await this.raw.POST("/v1/api/tasks/{id}/comments",{params:{path:{id:z}},body:J}),this.at("POST",`/v1/api/tasks/${z}/comments`))};modelConfig={list:async()=>we(await this.raw.GET("/v1/api/model-config"),this.at("GET","/v1/api/model-config")),resolved:async(z)=>z?we(await this.raw.GET("/v1/api/model-config/projects/{projectId}/resolved",{params:{path:{projectId:z}}}),this.at("GET",`/v1/api/model-config/projects/${z}/resolved`)):we(await this.raw.GET("/v1/api/model-config/resolved"),this.at("GET","/v1/api/model-config/resolved")),set:async(z,J,V)=>V?we(await this.raw.PUT("/v1/api/model-config/projects/{projectId}/{slot}",{params:{path:{projectId:V,slot:z}},body:J}),this.at("PUT",`/v1/api/model-config/projects/${V}/${z}`)):we(await this.raw.PUT("/v1/api/model-config/{slot}",{params:{path:{slot:z}},body:J}),this.at("PUT",`/v1/api/model-config/${z}`)),clear:async(z,J)=>J?we(await this.raw.DELETE("/v1/api/model-config/projects/{projectId}/{slot}",{params:{path:{projectId:J,slot:z}}}),this.at("DELETE",`/v1/api/model-config/projects/${J}/${z}`)):we(await this.raw.DELETE("/v1/api/model-config/{slot}",{params:{path:{slot:z}}}),this.at("DELETE",`/v1/api/model-config/${z}`)),setProjectHarness:async(z,J)=>this.modelConfig.set("cycle",{harness:J},z),clearProjectHarness:async(z)=>this.modelConfig.clear("cycle",z),setHarness:async(z)=>this.modelConfig.set("cycle",{harness:z}),clearHarness:async()=>this.modelConfig.clear("cycle")};ai={models:async(z,J)=>we(await this.raw.GET("/v1/api/ai/w/{workspaceId}/models",{params:{path:{workspaceId:z}},...J?.signal?{signal:J.signal}:{}}),this.at("GET",`/v1/api/ai/w/${z}/models`))};managedMailboxes={configuration:async()=>we(await this.raw.GET("/v1/api/growth/managed-mailboxes/configuration",{}),this.at("GET","/v1/api/growth/managed-mailboxes/configuration")),quote:async(z)=>we(await this.raw.POST("/v1/api/growth/managed-mailboxes/quotes",{body:z}),this.at("POST","/v1/api/growth/managed-mailboxes/quotes")),order:async(z)=>we(await this.raw.POST("/v1/api/growth/managed-mailboxes/orders",{body:z}),this.at("POST","/v1/api/growth/managed-mailboxes/orders")),get:async(z)=>we(await this.raw.GET("/v1/api/growth/managed-mailboxes/orders/{orderId}",{params:{path:{orderId:z}}}),this.at("GET","/v1/api/growth/managed-mailboxes/orders/{orderId}")),reconcile:async(z)=>we(await this.raw.POST("/v1/api/growth/managed-mailboxes/orders/{orderId}/reconcile",{params:{path:{orderId:z}}}),this.at("POST","/v1/api/growth/managed-mailboxes/orders/{orderId}/reconcile")),listOrders:async(z)=>we(await this.raw.GET("/v1/api/growth/managed-mailboxes/orders",{params:{query:{...z,limit:z?.limit===void 0?void 0:String(z.limit)}}}),this.at("GET","/v1/api/growth/managed-mailboxes/orders")),listResources:async(z)=>we(await this.raw.GET("/v1/api/growth/managed-mailboxes/resources",{params:{query:{...z,limit:z?.limit===void 0?void 0:String(z.limit)}}}),this.at("GET","/v1/api/growth/managed-mailboxes/resources")),repair:async(z,J)=>we(await this.raw.POST("/v1/api/growth/managed-mailboxes/resources/{resourceId}/repair",{params:{path:{resourceId:z}},body:J}),this.at("POST","/v1/api/growth/managed-mailboxes/resources/{resourceId}/repair")),cancelHosting:async(z,J)=>we(await this.raw.POST("/v1/api/growth/managed-mailboxes/resources/{resourceId}/cancel-hosting",{params:{path:{resourceId:z}},body:J}),this.at("POST","/v1/api/growth/managed-mailboxes/resources/{resourceId}/cancel-hosting")),cancelWarmup:async(z,J)=>we(await this.raw.POST("/v1/api/growth/managed-mailboxes/resources/{resourceId}/cancel-warmup",{params:{path:{resourceId:z}},body:J}),this.at("POST","/v1/api/growth/managed-mailboxes/resources/{resourceId}/cancel-warmup")),removeDomain:async(z,J)=>we(await this.raw.POST("/v1/api/growth/managed-mailboxes/resources/{resourceId}/remove-domain",{params:{path:{resourceId:z}},body:J}),this.at("POST","/v1/api/growth/managed-mailboxes/resources/{resourceId}/remove-domain"))};mcpServers={list:async()=>we(await this.raw.GET("/v1/api/mcp-servers",{}),this.at("GET","/v1/api/mcp-servers")),get:async(z)=>we(await this.raw.GET("/v1/api/mcp-servers/{id}",{params:{path:{id:z}}}),this.at("GET",`/v1/api/mcp-servers/${z}`)),create:async(z)=>we(await this.raw.POST("/v1/api/mcp-servers",{body:z}),this.at("POST","/v1/api/mcp-servers")),update:async(z,J)=>we(await this.raw.PATCH("/v1/api/mcp-servers/{id}",{params:{path:{id:z}},body:J}),this.at("PATCH",`/v1/api/mcp-servers/${z}`)),delete:async(z)=>we(await this.raw.DELETE("/v1/api/mcp-servers/{id}",{params:{path:{id:z}}}),this.at("DELETE",`/v1/api/mcp-servers/${z}`)),discover:async(z)=>we(await this.raw.POST("/v1/api/mcp-servers/{id}/discover",{params:{path:{id:z}}}),this.at("POST",`/v1/api/mcp-servers/${z}/discover`)),connect:async(z)=>we(await this.raw.POST("/v1/api/mcp-servers/{id}/connect",{params:{path:{id:z}}}),this.at("POST",`/v1/api/mcp-servers/${z}/connect`)),disconnect:async(z)=>we(await this.raw.POST("/v1/api/mcp-servers/{id}/disconnect",{params:{path:{id:z}}}),this.at("POST",`/v1/api/mcp-servers/${z}/disconnect`))};tools={search:async(z)=>we(await this.raw.GET("/v1/api/tools",{params:{query:{...z,limit:z?.limit===void 0?void 0:String(z.limit)}}}),this.at("GET","/v1/api/tools")),describe:async(z)=>we(await this.raw.GET("/v1/api/tools/{toolId}",{params:{path:{toolId:z}}}),this.at("GET",`/v1/api/tools/${z}`)),call:async(z,J)=>we(await this.raw.POST("/v1/api/tools/{toolId}/call",{params:{path:{toolId:z}},body:J}),this.at("POST",`/v1/api/tools/${z}/call`)),status:async(z)=>we(await this.raw.GET("/v1/api/tool-calls/{callId}",{params:{path:{callId:z}}}),this.at("GET",`/v1/api/tool-calls/${z}`)),listCalls:async(z)=>we(await this.raw.GET("/v1/api/tool-calls",{params:{query:{...z,limit:z?.limit===void 0?void 0:String(z.limit)}}}),this.at("GET","/v1/api/tool-calls"))};cycles={list:async(z)=>we(await this.raw.GET("/v1/api/cycles",{params:{query:z??{}}}),this.at("GET","/v1/api/cycles")),get:async(z)=>we(await this.raw.GET("/v1/api/cycles/{id}",{params:{path:{id:z}}}),this.at("GET",`/v1/api/cycles/${z}`)),propose:async(z)=>we(await this.raw.POST("/v1/api/cycles",{body:z}),this.at("POST","/v1/api/cycles")),openFromBranch:async(z)=>we(await this.raw.POST("/v1/api/cycles/from-branch",{body:z}),this.at("POST","/v1/api/cycles/from-branch")),continueFromBranch:async(z)=>we(await this.raw.POST("/v1/api/cycles/{id}/continue",{params:{path:{id:z}}}),this.at("POST",`/v1/api/cycles/${z}/continue`)),review:async(z)=>we(await this.raw.GET("/v1/api/cycles/{id}/review",{params:{path:{id:z}}}),this.at("GET",`/v1/api/cycles/${z}/review`)),reviewComments:async(z)=>we(await this.raw.GET("/v1/api/cycles/{id}/review/comments",{params:{path:{id:z}}}),this.at("GET",`/v1/api/cycles/${z}/review/comments`))};chat={send:async(z)=>we(await this.raw.POST("/v1/api/chat/turns",{body:z}),this.at("POST","/v1/api/chat/turns")),turn:async(z,J)=>we(await this.raw.GET("/v1/api/chat/turns/{turnId}",{params:{path:{turnId:z},query:J}}),this.at("GET",`/v1/api/chat/turns/${z}`))};live={run:(z,J,V)=>this.liveStream(`/agent/${z}/run`,Wi(J),V),connect:(z,J,V)=>this.liveStream(`/agent/${z}/connect`,Bi(J,V?.lastSeenEventId),V),follow:(z,J,V={})=>this.followLive(z,J,V),stop:async(z,J,V)=>{let X=`/agent/${z}/stop/${encodeURIComponent(J)}`;return await(await this.livePost(X,V?{runId:V}:{})).json()},project:(z,J={})=>wo(this.live.follow("project-live",zt(z,J),J)),task:(z,J,V={})=>this.watchTask(z,J,V)};async*watchTask(z,J,V){let X="";for await(let{state:Y}of this.live.project(z,{taskId:J,...V})){let Z=yo(Y,J),Q=JSON.stringify(Z);if(Q===X)continue;if(X=Q,yield Z,Z.state!=="running")return}}async*followLive(z,J,V){let X=V.retry??td,Y=V.lastSeenEventId,Z=0;while(!V.signal?.aborted){let Q=!1,ee=null;try{for await(let te of this.live.connect(z,J,{...V.signal?{signal:V.signal}:{},...Y?{lastSeenEventId:Y}:{}})){let re=fo(te);if(re)Y=re;if(te.type!=="STATE_SNAPSHOT"&&te.type!=="MESSAGES_SNAPSHOT")Z=0;if(te.type==="RUN_STARTED"||te.type==="STATE_SNAPSHOT"||re)Q=!0;if(yield te,te.type==="RUN_FINISHED"||te.type==="RUN_ERROR")return}if(!Q)return}catch(te){if(V.signal?.aborted)return;if(!nd(te))throw te;ee=te}if(V.signal?.aborted)return;if(Z+=1,Z>=X.attempts)throw ee??new ct(`POST ${this.baseUrl}/v1/api/live/agent/${z}/connect: the stream kept closing`,{method:"POST",url:`${this.baseUrl}/v1/api/live/agent/${z}/connect`});await lt(Rn(Z,X,null),V.signal)}}async livePost(z,J,V){let X=`${this.baseUrl}/v1/api/live${z}`,Y=await this.fetcher(new Request(X,{method:"POST",headers:{...this.headers,"content-type":"application/json",accept:"text/event-stream"},body:JSON.stringify(J),signal:V?.signal}));if(Y.ok)return Y;let Z=null;try{Z=await Y.json()}catch{Z=null}throw Bt(Y,Z,{method:"POST",url:X})}async*liveStream(z,J,V){let X=await this.livePost(z,J,V);if(!X.body)return;try{for await(let Y of pr(X.body,V?.signal)){let Z=ho(Y.data);if(!Z)continue;if(yield Z,Z.type==="RUN_FINISHED"||Z.type==="RUN_ERROR")return}}finally{X.body.cancel().catch(()=>{})}}pendingRequests={list:async(z)=>we(await this.raw.GET("/v1/api/pending-requests",{params:{query:z??{}}}),this.at("GET","/v1/api/pending-requests")),resolve:async(z,J)=>we(await this.raw.POST("/v1/api/pending-requests/{id}/resolve",{params:{path:{id:z}},body:J}),this.at("POST",`/v1/api/pending-requests/${z}/resolve`))};clientInvoices={list:async(z)=>we(await this.raw.GET("/v1/api/client-billing/invoices",{params:{query:z??{}}}),this.at("GET","/v1/api/client-billing/invoices")),get:async(z)=>we(await this.raw.GET("/v1/api/client-billing/invoices/{id}",{params:{path:{id:z}}}),this.at("GET",`/v1/api/client-billing/invoices/${z}`)),createDraft:async(z)=>we(await this.raw.POST("/v1/api/client-billing/invoices",{body:z}),this.at("POST","/v1/api/client-billing/invoices")),issue:async(z)=>we(await this.raw.POST("/v1/api/client-billing/invoices/{id}/issue",{params:{path:{id:z}},body:{}}),this.at("POST",`/v1/api/client-billing/invoices/${z}/issue`)),void:async(z,J)=>we(await this.raw.POST("/v1/api/client-billing/invoices/{id}/void",{params:{path:{id:z}},body:{reason:J}}),this.at("POST",`/v1/api/client-billing/invoices/${z}/void`)),pay:async(z)=>we(await this.raw.POST("/v1/api/client-billing/invoices/{id}/pay",{params:{path:{id:z}},body:{}}),this.at("POST",`/v1/api/client-billing/invoices/${z}/pay`)),paymentLink:async(z,J={})=>we(await this.raw.POST("/v1/api/client-billing/invoices/{id}/payment-link",{params:{path:{id:z}},body:J}),this.at("POST",`/v1/api/client-billing/invoices/${z}/payment-link`))};async*observeCycle(z,J){let V=`/v1/api/cycles/${z}/observe`;for await(let X of this.stream(V,J)){let Y=po(X.data);if(!Y)continue;if(yield Y,uo(Y))return}}async*watchRepo(z,J,V){let X;while(!V.signal?.aborted){let Y=await this.repos.head(z,J,V);if(Y.commitSha!==X)X=Y.commitSha,yield{commitSha:X};await lt(15000,V.signal)}}async*stream(z,J){let V=`${this.baseUrl}${z}`,X=new Request(V,{headers:{...this.headers,accept:"text/event-stream"},signal:J?.signal}),Y=await globalThis.fetch(X);if(!Y.ok||!Y.body){let Z=null;try{Z=await Y.json()}catch{Z=null}throw Bt(Y,Z,{method:"GET",url:V})}yield*pr(Y.body,J?.signal)}}class e extends Error{code;details;constructor(z,J,V){super(J);if(this.name="CliError",this.code=z,V!==void 0)this.details=V}}import{spawn as fp}from"node:child_process";import{closeSync as xo,constants as Fn,existsSync as gr,fsyncSync as Vi,lstatSync as jo,mkdirSync as rd,openSync as Xi,readFileSync as Yi,renameSync as od,statSync as Zi,unlinkSync as Qi,writeFileSync as sd}from"node:fs";import{homedir as id}from"node:os";import{dirname as ad,join as Eo}from"node:path";var sn="https://server.hlix.ai";function pt(z=process.env){let J=z.HLIX_CONFIG_HOME??z.XDG_CONFIG_HOME??Eo(id(),".config");return Eo(J,"hlix","credentials.json")}function v(z=process.env){let J=z.HLIX_API_KEY;if(!J&&z.HLIX_SESSION_TOKEN)return{baseUrl:z.HLIX_BASE_URL??sn,apiKey:"",sessionToken:z.HLIX_SESSION_TOKEN,...z.HLIX_WORKSPACE_ID?{organizationId:z.HLIX_WORKSPACE_ID}:{}};if(J)return{baseUrl:z.HLIX_BASE_URL??sn,apiKey:J,...z.HLIX_WORKSPACE_ID?{organizationId:z.HLIX_WORKSPACE_ID}:{}};try{let V=JSON.parse(Yi(pt(z),"utf8"));return(V.apiKey||V.sessionToken)&&V.baseUrl?V:null}catch{return null}}function ea(z=process.env){let J=pt(z);return gr(J)?J:null}function Po(z=process.env){let J=pt(z);if(!gr(J))return{path:J,removed:!1,reason:"absent"};let V=jo(J);if(V.isSymbolicLink()||!V.isFile())throw Error("Refusing to remove a credential path that is not a regular file.");let X=process.getuid?.();if(X!==void 0&&Zi(J).uid!==X)throw Error("Refusing to remove a credential file owned by another user.");let Y;try{Y=JSON.parse(Yi(J,"utf8"))}catch{Y=null}let Z=Y;if(!Z||typeof Z.apiKey!=="string"||typeof Z.baseUrl!=="string")throw Error(`Refusing to remove ${J}: it is not a credential written by this CLI.`);return Qi(J),{path:J,removed:!0,reason:"removed"}}function ta(z,J=process.env){let V=pt(J),X=ad(V);if(rd(X,{recursive:!0,mode:448}),jo(X).isSymbolicLink())throw Error("Refusing to write credentials through a symlinked directory.");if(gr(V)){let Q=jo(V);if(Q.isSymbolicLink()||!Q.isFile())throw Error("Refusing to replace a credential path that is not a regular file.");let ee=process.getuid?.();if(ee!==void 0&&Zi(V).uid!==ee)throw Error("Refusing to replace a credential file owned by another user.")}let Y=Eo(X,`.credentials.${process.pid}.${crypto.randomUUID()}.tmp`),Z;try{Z=Xi(Y,Fn.O_WRONLY|Fn.O_CREAT|Fn.O_EXCL|Fn.O_NOFOLLOW,384),sd(Z,`${JSON.stringify(z,null,2)}
6
+ `,"utf8"),Vi(Z),xo(Z),Z=void 0,od(Y,V);let Q=Xi(X,Fn.O_RDONLY);try{try{Vi(Q)}catch(ee){let te=ee.code;if(te!=="EINVAL"&&te!=="ENOTSUP")throw ee}}finally{xo(Q)}}catch(Q){if(Z!==void 0)xo(Z);if(gr(Y))Qi(Y);throw Q}return V}import{statSync as cp}from"node:fs";import{dirname as Pa,resolve as Ia}from"node:path";import{createHash as Xd}from"node:crypto";import{existsSync as Wo,lstatSync as Yd,readFileSync as Bo,statSync as Zd,writeFileSync as zo}from"node:fs";import{readFile as Qd}from"node:fs/promises";import{join as Ct}from"node:path";import{parseAllDocuments as Fd,stringify as Ld,visit as ga}from"yaml";import{z as ve}from"zod";var $o={"claude-fable-5-1":{provider:"anthropic",contextWindow:1e6,displayName:"Fable 5.1",tier:"frontier"},"claude-opus-5":{provider:"anthropic",contextWindow:1e6,displayName:"Opus 5",tier:"frontier"},"claude-sonnet-5":{provider:"anthropic",contextWindow:1e6,displayName:"Sonnet 5",tier:"primary"},"claude-haiku-4-5":{provider:"anthropic",contextWindow:200000,displayName:"Haiku 4.5",tier:"fast"},"claude-haiku-5-5":{provider:"anthropic",contextWindow:1e6,displayName:"Haiku 5.5",tier:"fast"},"gpt-6-astra":{provider:"openai",contextWindow:1050000,displayName:"GPT-6 Astra",tier:"frontier"},"gpt-6.1-sol":{provider:"openai",contextWindow:1050000,displayName:"GPT-6.1 Sol",tier:"frontier"},"gpt-6.1-terra":{provider:"openai",contextWindow:1050000,displayName:"GPT-6.1 Terra",tier:"primary"},"gpt-6-luna":{provider:"openai",contextWindow:1050000,displayName:"GPT-6 Luna",tier:"fast"},"gpt-5.6-sol":{provider:"openai",contextWindow:1050000,displayName:"GPT-5.6 Sol",tier:"frontier"},"gpt-5.6-terra":{provider:"openai",contextWindow:1050000,displayName:"GPT-5.6 Terra",tier:"primary"},"gpt-5.6-luna":{provider:"openai",contextWindow:1050000,displayName:"GPT-5.6 Luna",tier:"fast"},"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"},"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"},"kimi-k3":{provider:"openrouter",contextWindow:1048576,displayName:"Kimi K3",tier:"primary"},"deepseek-v4-pro":{provider:"openrouter",contextWindow:1048576,displayName:"DeepSeek V4 Pro",tier:"primary"},"deepseek-v4.1-flash":{provider:"openrouter",contextWindow:1048576,displayName:"DeepSeek V4.1 Flash",tier:"fast"},"glm-5.3":{provider:"openrouter",contextWindow:1310720,displayName:"GLM 5.3",tier:"primary"},"glm-5.3-flash":{provider:"openrouter",contextWindow:1310720,displayName:"GLM 5.3 Flash",tier:"fast"},"qwen3.8-max":{provider:"openrouter",contextWindow:1e6,displayName:"Qwen 3.8 Max",tier:"primary"},"qwen3.8-flash":{provider:"openrouter",contextWindow:1e6,displayName:"Qwen 3.8 Flash",tier:"fast"},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},"fable-latest":{provider:"anthropic",contextWindow:1e6,displayName:"Claude Fable (Latest)",tier:"frontier"},"opus-latest":{provider:"anthropic",contextWindow:1e6,displayName:"Claude Opus (Latest)",tier:"frontier"},"sonnet-latest":{provider:"anthropic",contextWindow:1e6,displayName:"Claude Sonnet (Latest)",tier:"primary"},"haiku-latest":{provider:"anthropic",contextWindow:200000,displayName:"Claude Haiku (Latest)",tier:"fast"},"gpt-latest":{provider:"openai",contextWindow:1050000,displayName:"GPT Astra (Latest)",tier:"frontier"},"grok-latest":{provider:"openrouter",contextWindow:500000,displayName:"Grok (Latest)",tier:"frontier"},"gemini-pro-latest":{provider:"google_genai",contextWindow:1048576,displayName:"Gemini Pro (Latest)",tier:"primary"},"gemini-flash-latest":{provider:"google_genai",contextWindow:1048576,displayName:"Gemini Flash (Latest)",tier:"fast"},"deepseek-pro-latest":{provider:"openrouter",contextWindow:1048576,displayName:"DeepSeek Pro (Latest)",tier:"primary"},"deepseek-flash-latest":{provider:"openrouter",contextWindow:1048576,displayName:"DeepSeek Flash (Latest)",tier:"fast"},"glm-latest":{provider:"openrouter",contextWindow:1310720,displayName:"GLM (Latest)",tier:"primary"},"glm-flash-latest":{provider:"openrouter",contextWindow:1310720,displayName:"GLM Flash (Latest)",tier:"fast"},"kimi-latest":{provider:"openrouter",contextWindow:1048576,displayName:"Kimi (Latest)",tier:"primary"},"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}},To={"claude-code":"claude-sonnet-4-5",codex:"gpt-5.4"};var Io=["deepseek-v4.1-flash","gpt-6-luna","claude-haiku-5-5"],_o={simple:{coder:Io,reviewer:Io},medium:{coder:Io,reviewer:["gpt-6.1-terra","claude-sonnet-5"]},complex:{coder:["gpt-6.1-terra","kimi-k3"],reviewer:["gpt-6.1-terra","claude-sonnet-5"]}},Co={planner:["deepseek-v4-pro","gpt-5.6-terra","kimi-k3"],reviewer:_o.complex.reviewer,coder:_o.complex.coder,light:_o.simple.coder},na={planner:["claude-opus-5","gpt-6-astra"],reviewer:["gpt-6-astra","claude-opus-5"],coder:["claude-sonnet-5","gpt-6.1-sol","gpt-6.1-terra"],light:["gpt-6-luna","claude-haiku-5-5"]},xh={auto:Co,frontier:na,frontierMax:na,ownSubscription:{planner:Co.planner,reviewer:Co.reviewer,coder:[],light:[]}},jh=Object.keys($o);var cd={"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":"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","gpt-latest":"openrouter/~openai/gpt-astra-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"};var h="◆",ld=(()=>{let z={};for(let J of Object.keys($o)){let V=$o[J];z[J]=V.displayName,z[cd[J]]=V.displayName,z[`${V.provider}:${J}`]=V.displayName}return z})();function j(z){if(!z)return z;let V=ld[z]??z.split(/[/:]/).pop()??z;return`${h} ${V}`}var n={"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:To["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:To.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}},fr=Object.keys(n).filter((z)=>!("localOnly"in n[z])),Ao=Object.values(n).filter((z)=>!("localOnly"in z)),Ih=Ao.filter(({driverKind:z})=>z==="external-acp").map(({id:z})=>z),dd=Ao.filter(({available:z,driverKind:J})=>z&&J==="external-acp"),ra=dd.map(({id:z})=>z),pd=Ao.filter(({available:z})=>z),x=pd.map(({id:z})=>z),oa="hlix";var y=Object.values(n).filter((z)=>("execution"in z)),d=y.map(({id:z})=>z);var ud=/^[a-z0-9](?:[a-z0-9_-]{0,18}[a-z0-9])?$/,md=["main","master","develop","development","dev","staging","production","prod","release","preview","trunk","head"];function sa(z){return ud.test(z)&&!md.includes(z)}import{z as gd}from"zod";var ia=gd.enum(["small","standard","large"]);import{z as wt}from"zod";var aa=wt.string().trim().max(200).regex(/^[^<>\x00-\x1f\x7f]*$/),fd=wt.union([wt.literal(""),wt.email().max(254)]).transform((z)=>z.trim()),Rh=wt.object({gitName:aa,gitEmail:fd,hlixCoauthor:wt.boolean()}).strict(),ca=wt.object({name:aa.min(1),email:wt.email().max(254),hlixCoauthor:wt.boolean()}).strict();import{z as oe}from"zod";import{z as Ae}from"zod";import{z as vt}from"zod";var la=vt.discriminatedUnion("phase",[vt.object({designId:vt.string().uuid(),phase:vt.literal("prototype"),revisionId:vt.string().uuid().optional()}),vt.object({designId:vt.string().uuid(),phase:vt.literal("implementation"),revisionId:vt.string().uuid()})]);var da=Ae.object({version:Ae.literal(1),organizationId:Ae.string().min(1),projectId:Ae.string().min(1),cycleId:Ae.string().min(1),taskId:Ae.string().min(1),source:Ae.string().nullable(),sourceRevision:Ae.string().min(1),requestDigest:Ae.string().regex(/^[a-f0-9]{64}$/),requestRevision:Ae.number().int().min(1),sourceId:Ae.string().nullable(),project:Ae.object({name:Ae.string(),stack:Ae.string().nullable(),goal:Ae.string()}),cycleGoal:Ae.string(),designWork:la.optional(),taskGoal:Ae.string(),requirements:Ae.string(),implementationPlan:Ae.string(),repo:Ae.object({id:Ae.string(),owner:Ae.string().nullable(),name:Ae.string().nullable(),cloneUrl:Ae.string().nullable(),ref:Ae.string()}).nullable(),prerequisite:Ae.object({applicability:Ae.enum(["application","tooling","unknown"]),sourceExcerpt:Ae.string()}).optional(),checks:Ae.array(Ae.object({kind:Ae.enum(["verification","startup"]),required:Ae.literal(!0),command:Ae.string().nullable(),executionDigest:Ae.string().nullable(),port:Ae.number().int().min(1).max(65535).nullable().optional(),source:Ae.enum(["repo","project","runtime","candidate-discovery"])})).min(1)});import{z as hd}from"zod";var Ro=hd.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 Ge}from"zod";var yd=["queued","building","done","blocked"],wd=["operator","engineer","review","platform"],ze={id:64,title:200,description:1000,note:280,feedback:1000,dependsOn:8,commit:40,source:8,updatedAt:40},pa=100,vd=ze.id+ze.title+2*ze.description+ze.note+ze.feedback+ze.dependsOn*ze.id+ze.commit+ze.source+ze.updatedAt,ut={maxItems:pa,maxBytes:pa*(vd*6+1024)+1024,maxEngineerItems:50,titleChars:ze.title,descriptionChars:ze.description,feedbackChars:ze.feedback,noteChars:ze.note,maxDependsOn:ze.dependsOn},hr=/^[\w-]{1,64}$/;var ua=Ge.object({id:Ge.string().regex(hr),title:Ge.string().min(1).max(ut.titleChars),description:Ge.string().max(ut.descriptionChars).default(""),doneWhen:Ge.string().max(ut.descriptionChars).nullable().optional(),status:Ge.enum(yd),dependsOn:Ge.array(Ge.string().regex(hr)).max(ut.maxDependsOn).default([]),note:Ge.string().max(ut.noteChars).default(""),commit:Ge.string().regex(/^[a-f0-9]{40}$/).nullable().default(null),feedback:Ge.string().max(ut.feedbackChars).nullable().default(null),source:Ge.enum(wd).default("operator"),updatedAt:Ge.string().max(ze.updatedAt).default("")}),Wh=Ge.object({version:Ge.literal(1),cycleId:Ge.string().min(1),tasks:Ge.array(ua).max(ut.maxItems)}),ma=ua.partial({description:!0,doneWhen:!0,dependsOn:!0,note:!0,commit:!0,feedback:!0,source:!0,updatedAt:!0}).extend({deleted:Ge.boolean().optional()});var bd=oe.enum(fr),kd=oe.enum(["coder","reviewer","planner","setup"]),No=oe.enum(ra),Oo=oe.union([oe.string(),oe.number().transform(String)]),Fo=oe.object({node:Oo.optional(),python:Oo.optional(),bun:Oo.optional(),playwright:oe.boolean().optional()}).catchall(oe.union([oe.string().min(1).max(200),oe.number().transform(String),oe.boolean()])).refine((z)=>Object.entries(z).every(([J,V])=>J==="playwright"||typeof V==="string"),"Tool versions must be strings"),Lo=oe.object({name:oe.enum(["mysql","postgres","redis"]),start:oe.string().max(1e4).optional(),ready:oe.string().max(1e4).optional(),stop:oe.string().max(1e4).optional()}),ny=oe.object({startedAt:oe.string(),finishedAt:oe.string().optional(),status:oe.enum(["ok","partial"]),steps:oe.array(oe.object({name:oe.string(),status:oe.enum(["ok","fixed-by-override","failed"]),reason:oe.string().optional()}))}),Ho=oe.object({agents:oe.array(No).optional(),toolchain:Fo.optional(),aptPackages:oe.array(oe.string()).optional(),setup:oe.string().optional(),services:oe.array(Lo).max(3).optional(),envOverrides:oe.record(oe.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/),oe.string().max(1e4)).optional(),verifyCommand:oe.string().max(1e4).optional(),preview:oe.object({command:oe.string().min(1).max(1e4),port:oe.number().int().min(1024).max(65535)}).optional(),deployment:oe.discriminatedUnion("kind",[oe.object({repoId:oe.string().min(1),kind:oe.literal("static"),buildCommand:oe.string().trim().min(1).max(1e4),outDir:oe.string().min(1).max(2000).refine((z)=>/^(?!\/|[A-Za-z]:)(?!.*(?:^|\/)(?:\.\.?|\.env(?:\.[^/]*)?|\.git|\.hlix[^/]*|node_modules)(?:\/|$))[^\\\x00-\x1f\x7f]+$/i.test(z),"Output must be a public directory inside the repository")}),oe.object({repoId:oe.string().min(1),kind:oe.literal("server"),startCommand:oe.string().trim().min(1).max(1e4)})]).optional(),notes:oe.array(oe.string().max(2000)).max(100).optional(),source:oe.record(oe.string(),oe.enum(["auto","person"])).optional(),hash:oe.string().optional(),imageTag:oe.string().nullable().optional(),linearProjectId:oe.string().optional(),linearTeamId:oe.string().optional()}).partial(),ry=oe.object({owner:oe.string(),name:oe.string(),cloneUrl:oe.string(),defaultBranch:oe.string()}),Sd=oe.object({key:oe.string(),cloneUrl:oe.string(),owner:oe.string().nullable(),name:oe.string().nullable(),defaultBranch:oe.string(),setupCommand:oe.string().nullable().optional(),verifyCommand:oe.string().nullable().optional()}),xd=oe.object({system:oe.boolean().optional(),name:oe.string(),skillSlugs:oe.array(oe.string()),agentSlugs:oe.array(oe.string())}),jd=oe.object({path:oe.string(),content:oe.string(),executable:oe.boolean().optional(),encoding:oe.enum(["utf8","base64"]).optional()}).refine((z)=>z.encoding!=="base64"||z.content.length%4===0&&/^[A-Za-z0-9+/]*={0,2}$/.test(z.content),{message:"Base64 file content must use valid padded base64",path:["content"]}),Ed=oe.object({vars:oe.record(oe.string(),oe.string()).default({}),files:oe.array(jd).optional(),skills:oe.array(oe.string()).optional(),mcpServers:oe.array(oe.unknown()).optional(),managedPaths:oe.array(oe.string().refine((z)=>z.length>0&&z===z.normalize("NFC")&&!z.startsWith("/")&&!z.includes("\\")&&!/[\u0000-\u001f\u007f]/.test(z)&&z.split("/").every((J)=>J&&J!=="."&&J!==".."),"managed path must be a canonical project-relative path")).optional()}),Pd=oe.object({path:oe.string(),kind:oe.enum(["dotenv","credential","detected-content"]),contentBase64:oe.string(),size:oe.number().int().nonnegative(),sha256:oe.string().regex(/^[0-9a-f]{64}$/)}),Id=oe.object({mode:oe.enum(["managed","api_key","subscription"]),accountId:oe.string().min(1).max(200).nullable(),nativeModel:oe.string().trim().min(1).max(200).nullable()}).strict().refine((z)=>z.mode!=="managed"||z.accountId===null&&z.nativeModel===null,{message:"Managed funding cannot select an external account or native model"}),_d=oe.object({attemptId:oe.string().uuid(),sequence:oe.number().int().min(1).max(2147483647),tokensIn:oe.number().int().min(0).max(2147483647).optional(),tokensOut:oe.number().int().min(0).max(2147483647).optional(),costUsd:oe.number().finite().min(0).max(1e6).optional(),completeness:oe.enum(["partial","complete","unknown"]),model:oe.string().max(200).optional()}).strict().refine((z)=>z.completeness!=="complete"||z.tokensIn!==void 0&&z.tokensOut!==void 0,{message:"Complete native usage requires both token totals"}),Cd=oe.object({path:oe.string().min(1).max(4096),change:oe.enum(["add","modify","delete"]),mode:oe.enum(["file","executable","symlink"]).optional(),content:oe.string().max(16777216).optional()}).strict(),$d=oe.object({revision:oe.number().int().positive(),sha:oe.string().regex(/^[a-f0-9]{40}$/),overlay:oe.array(Cd).max(5000),packet:oe.string().max(200000)}).strict(),Td=oe.object({commitAttribution:ca.optional(),taskId:oe.string(),cycleId:oe.string(),threadId:oe.string(),organizationId:oe.string().optional(),projectId:oe.string().optional(),description:oe.string(),acceptedScope:da.optional(),baseSha:oe.string().regex(/^[a-f0-9]{40}$/).optional(),reviewFeedback:oe.string().optional(),iteration:oe.number().default(0),operationId:Ro.optional(),repo:Sd,branch:oe.string(),baseBranch:oe.string(),gitToken:oe.string().optional(),secrets:oe.record(oe.string(),oe.string()),packs:oe.array(xd),systemPrompt:oe.string().optional(),timeoutSeconds:oe.number().default(1800),funding:Id.optional(),nativeAttemptId:oe.string().uuid().optional(),agentEnv:oe.record(oe.string(),oe.string()).optional(),agent:bd.default(oa),model:oe.string().min(1).optional(),effort:oe.enum(["low","medium","high"]).optional(),role:kd.optional(),resultPath:oe.string().optional(),answerPrompt:oe.string().min(1).optional(),startupCommand:oe.string().nullable().optional(),startupPort:oe.number().int().min(1).max(65535).nullable().optional(),projectRuntime:Ho.optional(),preparedEnvironment:oe.string().optional(),environment:Ed.optional(),protectedFiles:oe.array(Pd).optional(),checklist:oe.array(ma).max(ut.maxItems).optional(),checklistRemoved:oe.array(oe.string().regex(hr)).max(ut.maxItems*2).optional(),continuation:$d.optional()}),oy=oe.enum(["acp"]),sy=oe.enum(["builder","desktop","e2e"]),iy=oe.object({batchId:oe.string(),tasks:oe.array(Td).min(1).max(20)}),Ad=oe.object({inputTokens:oe.number(),outputTokens:oe.number(),costUsd:oe.number().optional()}),Rd=oe.object({status:oe.enum(["passed","failed","skipped"]),commandDigest:oe.string().regex(/^[a-f0-9]{64}$/).optional(),candidateRevision:oe.string().regex(/^[a-f0-9]{40,64}$/).optional(),scopeRevision:oe.string(),source:oe.enum(["configured","candidate-discovery"]),port:oe.number().int().min(1).max(65535).nullable()}),Od=oe.object({startup:Rd.optional(),status:oe.enum(["passed","failed","skipped"]),commandDigest:oe.string().regex(/^[a-f0-9]{64}$/).optional(),scopeRevision:oe.string(),candidateRevision:oe.string().regex(/^[a-f0-9]{40,64}$/).optional()}),Nd=["succeeded","failed","incomplete"],ay=oe.object({taskId:oe.string(),status:oe.enum(["success","failed"]),checkEvidence:Od.optional(),baseSha:oe.string().regex(/^[a-f0-9]{40}$/).optional(),preCodingSha:oe.string().regex(/^[a-f0-9]{40}$/).optional(),cost:Ad.optional(),model:oe.string().optional(),error:oe.string().optional(),answer:oe.string().optional(),nativeUsage:_d.optional(),failureKind:oe.enum(["auth","usage_limit"]).optional(),resetsAt:oe.string().datetime().optional(),rateLimits:oe.array(oe.object({window:oe.string(),usedPercent:oe.number().min(0).max(100),resetsAt:oe.string().optional()})).optional(),outcome:oe.enum(Nd).optional()});var Hd=new Set([5901,6080,22222,22223]),Do=ve.number().int().min(1024).max(65535).refine((z)=>!Hd.has(z),{message:"That port is reserved by the environment's terminal or desktop"}),Kt=ve.string().min(1).max(1e4),Mo=ve.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/),Md=ve.union([ve.object({run:Kt}).strict(),ve.object({workflow:ve.string().min(1).max(40)}).strict(),ve.object({wait:ve.object({port:Do}).strict()}).strict()]),Dd=ve.object({mode:ve.enum(["sequential","parallel"]),steps:ve.array(Md).min(1).max(50)}).strict(),qt=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(sa,"Use a branch prefix of letters, digits, _ and -, up to 20 characters").optional()}).strict().optional(),coder:ve.object({harness:ve.enum(fr).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:ia.optional(),toolchain:Fo.optional(),apt:ve.array(ve.string().min(1).max(200)).max(64).optional(),services:ve.array(Lo).max(3).optional(),setup:Kt.optional()}).strict().optional(),workflows:ve.record(ve.string().min(1).max(40),Dd).optional(),ports:ve.array(ve.object({name:ve.string().min(1).max(40),port:Do,primary:ve.boolean().optional()}).strict()).max(10).optional(),commands:ve.object({verify:Kt.optional(),preview:ve.object({command:Kt,port:Do}).strict().optional(),deploy:ve.discriminatedUnion("kind",[ve.object({kind:ve.literal("server"),start:Kt}).strict(),ve.object({kind:ve.literal("static"),build:Kt,outDir:ve.string().min(1).max(2000)}).strict()]).optional()}).strict().optional(),env:ve.object({required:ve.array(Mo).max(200).optional(),public:ve.record(Mo,ve.string().max(1e4)).optional()}).strict().optional(),team:ve.object({agents:ve.array(No).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:Kt.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:Mo.optional(),apiKey:ve.string().min(1).max(2000).optional()}).strict()).max(20).optional()}).strict(),Ud=`# Project setup for Hlix.
7
+ # Commit this file. Secret values belong in the environment, not here.
8
+ `,Uo="https://server.hlix.ai";function vr(z){return z.replace(/\/+$/,"")===Uo}function Go(z){if(!z||vr(z))return;return z}function an(z){if(z.length>262144)return{ok:!1,issues:[{path:"(file)",message:"hlix.yml is over 256 KB."}]};let J;try{J=Fd(z,{uniqueKeys:!0})}catch(Q){return{ok:!1,issues:[{path:"(file)",message:Q instanceof Error?Q.message:"Could not read YAML."}]}}if(J.length!==1)return{ok:!1,issues:[{path:"(file)",message:"hlix.yml must contain one document."}]};let V=J[0];if(V.errors.length)return{ok:!1,issues:V.errors.map((Q)=>({path:"(file)",message:Q.message}))};let X=!1;if(ga(V,{Alias(){return X=!0,ga.BREAK}}),X)return{ok:!1,issues:[{path:"(file)",message:"YAML aliases are not allowed."}]};let Y=qt.safeParse(V.toJS());if(!Y.success)return{ok:!1,issues:Jd(Y.error)};let Z=ha(Y.data);if(Z.length)return{ok:!1,issues:Z};return{ok:!0,file:Y.data}}function fa(z,J){let V=qt.parse(ya(z,J)),X=ha(V);if(X.length)throw Error(X.map((Y)=>`${Y.path}: ${Y.message}`).join("; "));return V}function _t(z){let J=z.machine?.setup??Ln(z,"setup",[]),V=z.commands?.verify??Ln(z,"verify",[]),X=z.commands?.preview??Wd(z),Y=Ho.parse({agents:z.team?.agents,toolchain:z.machine?.toolchain,aptPackages:z.machine?.apt,setup:J,services:z.machine?.services,envOverrides:z.env?.public,verifyCommand:V,preview:X,notes:z.team?.notes}),Z=z.intake&&(z.intake.github!==void 0||z.intake.linear!==void 0)?{github:z.intake.github,linear:z.intake.linear}:void 0;return{name:z.project?.name,stack:z.project?.stack,brief:z.project?.brief,branchPrefix:z.project?.branchPrefix,sandboxSize:z.machine?.size,verifyCommand:V,previewCommand:X?.command,previewPort:X?.port,intake:Gd(Z),requiredEnv:z.env?.required??[],runtime:Y,binding:{workspaceId:z.hlix?.workspace,projectId:z.hlix?.project,apiUrl:z.hlix?.api,harness:z.coder?.harness,model:z.coder?.model,memoryTokens:z.coder?.memoryTokens===void 0?void 0:String(z.coder.memoryTokens),maskToolOutputs:z.coder?.maskToolOutputs===void 0?void 0:String(z.coder.maskToolOutputs),yolo:z.coder?.yolo===void 0?void 0:z.coder.yolo?"true":"false",sandbox:z.local?.runtime,dockerImage:z.local?.image}}}function br(z){let J={schema:1};if(z.hlix){let V=Go(z.hlix.api);J.hlix={workspace:z.hlix.workspace,...V?{api:V}:{},...z.hlix.project?{project:z.hlix.project}:{}}}if(z.name||z.stack)J.project={name:z.name,stack:z.stack};if(z.setup||z.toolchain)J.machine={setup:z.setup,toolchain:z.toolchain};if(z.verify||z.previewCommand&&z.previewPort)J.commands={verify:z.verify,preview:z.previewCommand&&z.previewPort?{command:z.previewCommand,port:z.previewPort}:void 0};if(z.workflows&&Object.keys(z.workflows).length)J.workflows=z.workflows;if(z.requiredEnv?.length)J.env={required:z.requiredEnv};return qt.parse(wr(J))}function Hn(z,J=Ud){let V=Ld(wr(z),{lineWidth:0}).trimEnd();return`${J}${V}
9
+ `}function Gd(z){if(!z)return;let J={};if(z.github!==void 0)J.github=z.github;if(z.linear!==void 0)J.linear=z.linear;return Object.keys(J).length?J:void 0}function Wd(z){let J=Ln(z,"preview",[]),V=z.ports?.find((X)=>X.primary)?.port??z.ports?.[0]?.port;if(!J||V===void 0)return;return{command:J,port:V}}function Bd(z){return`timeout 60 bash -c 'until (echo >/dev/tcp/127.0.0.1/${z}) 2>/dev/null; do sleep 0.25; done'`}function zd(z){let J=z.map((Y,Z)=>`( ${Y} ) & p${Z}=$!`),V=z.map((Y,Z)=>`wait $p${Z}; s${Z}=$?`),X=z.map((Y,Z)=>`s${Z}`).join("||");return`( ${J.join("; ")}; ${V.join("; ")}; exit $(( ${X} )) )`}function Ln(z,J,V){if(V.includes(J))throw Error(`workflows.${J} refers to itself.`);if(V.length>=3)throw Error(`workflows.${J} is nested more than 3 levels deep.`);let X=z.workflows?.[J];if(!X){if(V.length===0)return;throw Error(`workflows.${J} does not exist.`)}let Y=[];for(let Z of X.steps)if("run"in Z)Y.push(Z.run);else if("workflow"in Z){let Q=Ln(z,Z.workflow,[...V,J]);if(Q)Y.push(Q)}else Y.push(Bd(Z.wait.port));if(!Y.length)return;return X.mode==="parallel"?zd(Y):Y.join(" && ")}function ha(z){try{for(let J of Object.keys(z.workflows??{}))Ln(z,J,[])}catch(J){return[{path:"workflows",message:J instanceof Error?J.message:"Invalid workflow."}]}return[]}function Jd(z){return z.issues.map((J)=>{let V="keys"in J&&Array.isArray(J.keys)?J.keys.map(String):[];return{path:[...J.path.map(String),...V].join(".")||"(file)",message:J.message}})}function yr(z){return Boolean(z)&&typeof z==="object"&&!Array.isArray(z)}function ya(z,J){if(Array.isArray(J)||!yr(J)||!yr(z))return J;let V={...z};for(let[X,Y]of Object.entries(J))V[X]=X in z?ya(z[X],Y):Y;return V}function wr(z){if(Array.isArray(z))return z.map(wr);if(!yr(z))return z;let J={};for(let[V,X]of Object.entries(z)){if(X===void 0)continue;let Y=wr(X);if(yr(Y)&&Object.keys(Y).length===0)continue;J[V]=Y}return J}var wa=["hlix.yml","hlix.yaml"],cn=["hlix.local.yml","hlix.local.yaml"];var Kd=/-----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,}/,qd=/\.(?:json|ya?ml|toml|ini|conf|config)$/i,Vd=/(?:^|[,{\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 Mn(z,J){return Kd.test(J)||qd.test(z)&&Vd.test(J)}var ep=cn;function mt(z){let J=ba(z,wa),V=ba(z,cn);if(J&&"error"in J)return{file:null,base:null,local:null,baseName:null,error:J.error};if(V&&"error"in V)return{file:null,base:null,local:null,baseName:null,error:V.error};let X=J?.name??null,Y=V?.name??null,Z=X?ka(z,X):{file:null,error:null},Q=Y?ka(z,Y):{file:null,error:null},ee=Z.error??Q.error;if(ee||!Z.file)return{file:Z.file,base:Z.file,local:Q.file,baseName:X,error:ee};try{return{file:Q.file?fa(Z.file,Q.file):Z.file,base:Z.file,local:Q.file,baseName:X,error:null}}catch(te){let re=te instanceof Error?te.message:"Could not merge hlix.local.yml.";return{file:null,base:Z.file,local:Q.file,baseName:X,error:re}}}function ln(z){if(!z)return null;let J=_t(z).binding;if(!J.workspaceId)return null;return{schemaVersion:1,workspaceId:J.workspaceId,apiUrl:J.apiUrl??Uo,projectId:J.projectId,sandbox:J.sandbox,dockerImage:J.dockerImage,memoryTokens:J.memoryTokens,maskToolOutputs:J.maskToolOutputs,harness:ip(J.harness),model:J.model,yolo:J.yolo}}function Sa(z,J){xr(z,(V)=>{let X={...V.local},Y=!1;if(!V.local?.runtime&&J.sandbox)X.runtime=J.sandbox,Y=!0;if(!V.local?.image&&J.dockerImage)X.image=J.dockerImage,Y=!0;let Z={...V.coder},Q=!1;if(!V.coder?.harness&&J.harness)Z.harness=J.harness,Q=!0;if(!V.coder?.model&&J.model)Z.model=J.model,Q=!0;if(V.coder?.memoryTokens===void 0&&J.memoryTokens){let ee=Number(J.memoryTokens);if(Number.isInteger(ee)&&ee>=20000&&ee<=2000000)Z.memoryTokens=ee,Q=!0}if(V.coder?.yolo===void 0&&(J.yolo==="true"||J.yolo==="false"))Z.yolo=J.yolo==="true",Q=!0;if(!Y&&!Q)return V;return{...V,...Y?{local:X}:{},...Q?{coder:Z}:{}}})}function xa(z){if(z.error)return z.error;if(z.baseName)return z.baseName;return"will write hlix.yml"}async function kr(z){let J=Ct(z,".gitignore"),V=Wo(J)?await Qd(J,"utf8"):"",X=ep.filter((Z)=>!ap(V,Z));if(!X.length)return;let Y=V.length===0||V.endsWith(`
10
+ `)?"":`
11
+ `;Jo(J),zo(J,`${V}${Y}${X.join(`
12
+ `)}
13
+ `,{mode:420})}function Sr(z,J){let V=mt(z);if(V.error)throw Error(V.error);if(V.base)return{written:!1,file:V.base};let X=br(J),Y=Ct(z,"hlix.yml");return Jo(Y),zo(Y,Hn(X),{mode:420}),{written:!0,file:X}}function xr(z,J){let V=mt(z);if(V.error)throw Error(V.error);let X=V.base??{schema:1},Y=J(X),Z=V.baseName??"hlix.yml",Q=Ct(z,Z);if(V.base&&Y===X)return{path:Q,name:Z,file:X,changed:!1};let ee=Hn(Y),te=an(ee);if(!te.ok)throw Error(te.issues.map((re)=>`${re.path}: ${re.message}`).join("; "));return Jo(Q),zo(Q,ee,{mode:420}),{path:Q,name:Z,file:te.file,changed:!0}}function jr(z,J){let V=xr(z,(X)=>{let Y=J.project??X.hlix?.project,Z=X.hlix?.api&&vr(X.hlix.api)&&vr(J.api)?X.hlix.api:Go(J.api),Q={workspace:J.workspace,...Z?{api:Z}:{},...Y?{project:Y}:{}};if(X.hlix?.workspace===Q.workspace&&X.hlix?.api===Q.api&&X.hlix?.project===Q.project)return X;return{...X,hlix:Q}});return{path:V.path,name:V.name,changed:V.changed}}function ja(z){let J=mt(z);if(J.error||!J.baseName)return null;return Ct(z,J.baseName)}var tp=new Set([5901,6080,22222,22223]),np=new Set(["setup","preview","verify","deploy"]);function Er(z,J){return{verify:J?.commands.verifyCommand,packageManager:J?.commands.packageManager??null,scripts:rp(z),toolchain:J?.toolchain}}function rp(z){try{let J=JSON.parse(Bo(Ct(z,"package.json"),"utf8"));if(!J.scripts||typeof J.scripts!=="object"||Array.isArray(J.scripts))return{};return Object.fromEntries(Object.entries(J.scripts).filter((V)=>typeof V[1]==="string"))}catch{return{}}}function va(z){let J={};for(let V of["node","python","bun"]){let X=z?.[V];if(typeof X==="string"&&X.trim())J[V]=X.trim()}return J}function op(z,J){if(!J)return;let V={};for(let[X,Y]of Object.entries(z)){if(!Y.trim()||/infisical|\.env\b|secret/i.test(`${X}
14
+ ${Y}`))continue;let Z=/^dev:([A-Za-z][\w-]{0,30})$/.exec(X)?.[1],Q=Z??(X==="build"||X==="typecheck"?X:null);if(!Q||np.has(Q)||Q.length>40)continue;if(Z&&z.dev&&Y.trim()===z.dev.trim())continue;V[Q]={mode:"sequential",steps:[{run:`${J} run ${X}`}]}}return Object.keys(V).length?V:void 0}function Dn(z,J,V,X){let Y=z.install.map((te)=>te.trim()).filter(Boolean).join(`
15
+ `),Z=z.ports.find((te)=>te.port>=1024&&te.port<=65535&&!tp.has(te.port))?.port,Q=z.start&&Z?z.start:void 0,ee={...va(z.toolchain),...va(X?.toolchain)};return{name:V?.name,stack:V?.stack,setup:Y||void 0,verify:X?.verify||void 0,previewCommand:Q,previewPort:Q?Z:void 0,toolchain:Object.keys(ee).length?ee:void 0,workflows:op(X?.scripts??{},X?.packageManager??null),requiredEnv:z.requiredSecretKeys,hlix:J}}function Pr(z,J){let V=Ct(z.root,J);if(!Wo(V))return;let X=Bo(V),Y=Zd(V),Z=Xd("sha256").update(X).digest("hex"),Q=X.toString("utf8"),ee=z.protectedFiles.find((re)=>re.path===J);if(ee||Mn(J,Q)){let re=X.toString("base64");if(ee)ee.contentBase64=re;else z.protectedFiles.push({path:J,kind:"detected-content",contentBase64:re});let ne=ee&&(ee.kind==="dotenv"||ee.kind==="credential"||ee.kind==="detected-content")?ee.kind:"detected-content",se=z.manifest.secretFiles.find((le)=>le.path===J);if(se)se.size=Y.size,se.sha256=Z;else z.manifest.secretFiles.push({path:J,kind:ne,keys:[],size:Y.size,sha256:Z});let ie=z.manifest.files.findIndex((le)=>le.path===J);if(ie>=0){let le=z.manifest.files[ie];z.manifest.totals.files-=1,z.manifest.totals.bytes-=le.size,z.manifest.files.splice(ie,1)}return}let te=z.manifest.files.find((re)=>re.path===J);if(!te){z.manifest.files.push({path:J,size:Y.size,sha256:Z,tracked:!1,executable:!1}),z.manifest.totals.files+=1,z.manifest.totals.bytes+=Y.size;return}z.manifest.totals.bytes+=Y.size-te.size,te.size=Y.size,te.sha256=Z}function Jo(z){try{if(Yd(z).isSymbolicLink())throw Error(`Refusing to write through a symlink: ${z}`)}catch(J){if(J.code==="ENOENT")return;throw J}}var sp=["claude-code","codex","opencode","goose","qwen-code","pi","hlix"];function ba(z,J){let V=J.filter((Z)=>Wo(Ct(z,Z))),[X,Y]=V;if(X&&Y)return{error:`${V.join(" and ")} both exist. Keep one.`};return X?{name:X}:null}function ip(z){return sp.find((J)=>J===z)}function ka(z,J){let V=an(Bo(Ct(z,J),"utf8"));if(!V.ok){let X=V.issues.map((Y)=>`${Y.path}: ${Y.message}`).join("; ");return{file:null,error:`${J} ${X}`}}return{file:V.file,error:null}}function ap(z,J){return z.split(/\r?\n/).some((V)=>V.trim()===J)}function b(z){if(!z.credential)return null;if(z.credentialSource==="session")return"session (desktop)";if(z.credentialSource==="env")return"environment (HLIX_API_KEY)";return`file (${z.credentialPath})`}function t(z){let J=Ia(z);for(;;){let V=mt(J);if(V.error)throw new e("invalid_project_file",V.error);let X=ln(V.file);if(X?.workspaceId&&X.apiUrl)return{root:J,config:X};let Y=Pa(J);if(Y===J)return null;J=Y}}function Ko(z){let J=Ia(z);for(;;){let V=mt(J);if(V.error)throw new e("invalid_project_file",V.error);if(V.base)return{root:J,loaded:V};let X=Pa(J);if(X===J)return null;J=X}}function _a(z){try{return cp(z).isDirectory()}catch{return!1}}function Ir(z){if(typeof z!=="string")return;let J=z.trim();return J?J:void 0}var Ea=(z,J)=>z.replace(/\/+$/,"")===J.replace(/\/+$/,"");function r(z){let{env:J,flags:V,cwd:X}=z,Y=t(X),Z=v(J),Q=Z?J.HLIX_API_KEY?"env":J.HLIX_SESSION_TOKEN?"session":"file":null,ee=Q==="file"?Z:null,te=Ir(V["base-url"]),re=Ir(J.HLIX_BASE_URL),ne=Ir(V.workspace),se=Ir(J.HLIX_WORKSPACE_ID),ie=te??re??Y?.config.apiUrl??ee?.baseUrl??sn,le=te?"flag":re?"env":Y?.config.apiUrl?"project":ee?.baseUrl?"credential":"default",fe=ne??se??Y?.config.workspaceId??ee?.organizationId??null,ce=ne?"flag":se?"env":Y?.config.workspaceId?"project":ee?.organizationId?"credential":null;return{baseUrl:ie,baseUrlSource:le,workspaceId:fe,workspaceSource:ce,credential:Z,credentialSource:Q,credentialPath:pt(J),binding:Y,conflict:lp(Y,{flagBaseUrl:te,envBaseUrl:re,flagWorkspace:ne,envWorkspace:se})}}function lp(z,J){if(!z)return null;let V=`${z.root} is bound to`,X="Drop the override, or point --cwd at a folder bound to it.";if(J.flagWorkspace&&J.flagWorkspace!==z.config.workspaceId)return`${V} workspace ${z.config.workspaceId}, but --workspace names ${J.flagWorkspace}. ${X}`;if(J.envWorkspace&&J.envWorkspace!==z.config.workspaceId)return`${V} workspace ${z.config.workspaceId}, but HLIX_WORKSPACE_ID names ${J.envWorkspace}. ${X}`;if(J.flagBaseUrl&&!Ea(J.flagBaseUrl,z.config.apiUrl))return`${V} ${z.config.apiUrl}, but --base-url names ${J.flagBaseUrl}. ${X}`;if(J.envBaseUrl&&!Ea(J.envBaseUrl,z.config.apiUrl))return`${V} ${z.config.apiUrl}, but HLIX_BASE_URL names ${J.envBaseUrl}. ${X}`;return null}var dp=/\x1b(?:\[[0-?]*[ -/]*[@-~]?|\][^\x07\x1b]*(?:\x07|\x1b\\)?|[PX^_][^\x1b]*(?:\x1b\\)?|[\x20-\x7e]?)|\x9b[0-?]*[ -/]*[@-~]?/g,pp=/[\x00-\x08\x0b-\x1f\x7f-\x9f]/g,up=/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/g,mp=/(?<![\p{Extended_Pictographic}\p{Emoji_Modifier}\uFE0F])\u200D|\u200D(?!\p{Extended_Pictographic})|[^\P{Cf}\u200D]/gu,gp=/[\u2028\u2029]/g;function a(z,J={}){return z.replace(dp,"").replace(J.carriageReturn?up:pp,"").replace(mp,"").replace(gp,`
16
+ `)}var Ca="hlix-desktop";async function hp(z,J,V){let X=J.map((ee)=>ee.id);if(V){if(!X.includes(V))throw new e("workspace_mismatch",J.length===0?`This account is not a member of any workspace, including ${V}.`:`This account cannot act in workspace ${V}. Available: ${X.join(", ")}.`);return V}if(J.length===0)throw new e("workspace_required","This account is not a member of any workspace. Create or join one first.");let Y=J[0];if(Y&&J.length===1)return z.stderr(`Using your only workspace: ${Y.name} (${Y.id})
17
+ `),Y.id;if(z.json||!z.promptChoice)throw new e("missing_argument",`--workspace is required here: this account can act in ${J.length} workspaces. Pass one of: ${X.join(", ")}.`);let Z=Math.max(...J.map((ee)=>ee.name.length));z.stderr(`${J.map((ee,te)=>` ${te+1}) ${ee.name.padEnd(Z)} ${ee.slug} ${ee.role} ${ee.id}`).join(`
18
+ `)}
19
+ `);let Q=await z.promptChoice(`Workspace [1-${J.length}]: `,J.length);return X[Q]}function qo(z){let J=new URL(z),V=J.hostname==="localhost"||J.hostname==="127.0.0.1"||J.hostname==="::1";if(J.protocol!=="https:"&&!(J.protocol==="http:"&&V))throw new e("invalid_base_url","--base-url must use HTTPS (HTTP is allowed only for localhost).")}function w(z){let J;try{let Y=new URL(z);if(Y.protocol!=="https:"&&Y.protocol!=="http:")return;J=Y.href}catch{return}let[V,X]=process.platform==="darwin"?["open",[J]]:process.platform==="win32"?["rundll32.exe",["url.dll,FileProtocolHandler",J]]:["xdg-open",[J]];try{let Y=fp(V,X,{stdio:"ignore",detached:!0});Y.on("error",()=>{}),Y.unref()}catch{}}async function Vo(z,J){let{baseUrl:V,credential:X}=J,Y=new Jt({baseUrl:V,credential:X,retry:{attempts:1}}),Z=await hp(z,await Y.workspaces.list(),J.requested);if(await new Jt({baseUrl:V,credential:X,organizationId:Z,retry:{attempts:1}}).projects.list(),z.signal?.aborted)throw new e("cancelled","Login cancelled.");let Q=ta(X.kind==="bearer"?{baseUrl:V,apiKey:"",sessionToken:X.token,organizationId:Z}:{baseUrl:V,apiKey:X.kind==="apiKey"?X.apiKey:"",organizationId:Z},z.env);return{baseUrl:V,organizationId:Z,path:Q}}async function Xo(z,J){qo(J.baseUrl);let V;try{let X=z.signal?{signal:z.signal}:{},Y=await ko({baseUrl:J.baseUrl,clientId:Ca,...X});z.stderr(`Sign in to Hlix in your browser:
20
+ ${a(Y.verificationUriComplete)}
21
+ and confirm the code: ${a(Y.userCode)}
22
+ Waiting for approval…
23
+ `),z.openUrl?.(Y.verificationUriComplete),V=await So({baseUrl:J.baseUrl,clientId:Ca,code:Y,...X})}catch(X){if(!(X instanceof dt))throw X;if(X.reason==="denied")throw new e("login_denied",X.message);if(X.reason==="expired")throw new e("login_expired",X.message);if(X.reason==="cancelled")throw new e("cancelled",X.message);throw new e("login_failed",X.message)}return Vo(z,{baseUrl:J.baseUrl,credential:rn(V),requested:J.requested})}var yp="Run `hlix login`, or set HLIX_API_KEY for CI.";async function g(z,J){let V=r({env:z.env,flags:J.flags,cwd:J.cwd});if(V.conflict)return;let X=V.credential;if(X){if(!J.verify)return;try{await new Jt({baseUrl:V.baseUrl,credential:X.sessionToken?rn(X.sessionToken):Ht(X.apiKey),retry:{attempts:1}}).workspaces.list();return}catch(Q){if(!(Q instanceof Mt))throw Q;if(V.credentialSource!=="file"||z.json||!z.promptChoice)throw Q;z.stderr(`Your stored credential was rejected — signing in again.
24
+ `)}}else{if(z.json||!z.promptChoice)throw new e("unauthenticated",`Not signed in. ${yp}`);z.stderr(`Not signed in — starting the browser login.
25
+ `)}let Y=V.workspaceSource==="credential"?void 0:V.workspaceId??void 0,Z=await Xo(z,{baseUrl:V.baseUrl,requested:Y});z.stderr(`Signed in to ${Z.baseUrl}
26
+ `)}var q=1,je=(z,J)=>({schemaVersion:1,command:z,data:J}),Un=(z,J)=>({schemaVersion:1,command:z,error:J});function Se(z){return`${JSON.stringify(z,null,2)}
27
+ `}function Ue(z){let J=Math.max(0,...z.map(([V])=>V.length));return z.map(([V,X])=>`${V.padEnd(J)} ${X}`).join(`
28
+ `)}function bt(z,J){let V=z.map((Y,Z)=>Math.max(Y.length,...J.map((Q)=>(Q[Z]??"").length))),X=(Y)=>Y.map((Z,Q)=>Z.padEnd(V[Q])).join(" ").trimEnd();return[X(z),X(V.map((Y)=>"-".repeat(Y))),...J.map(X)].join(`
29
+ `)}function Yo(z){if(z instanceof e)return{code:z.code,status:null};if(z instanceof on)return{code:"invalid_request",status:400};if(z instanceof $n)return{code:"bad_request",status:400};if(z instanceof Mt)return{code:"unauthenticated",status:401};if(z instanceof Tn)return{code:"forbidden",status:403};if(z instanceof Dt)return{code:"not_found",status:404};if(z instanceof Ut)return{code:"conflict",status:409};if(z instanceof Gt)return{code:"rate_limited",status:429};if(z instanceof An)return{code:"not_implemented",status:501};if(z instanceof Wt)return{code:"server_error",status:z.status};if(z instanceof ct)return{code:"unreachable",status:null};return{code:"unknown",status:null}}var _r=(z)=>{if(z instanceof on&&z.issues.length>0){let J=z.issues.map((V)=>{let X=V;return` - ${Array.isArray(X.path)&&X.path.length>0?`${X.path.join(".")}: `:""}${typeof X.message==="string"?X.message:JSON.stringify(V)}`});return`${z.message}
30
+ ${J.join(`
31
+ `)}`}return z instanceof Error?z.message:String(z)};function o(z,J){let V=r({env:z,flags:J.flags,cwd:J.cwd});if(V.conflict)throw new e("workspace_mismatch",V.conflict);if(!V.credential)throw new e("unauthenticated","No credential. Run `hlix login`, or set HLIX_API_KEY for CI.");return new Jt({baseUrl:V.baseUrl,credential:V.credential.sessionToken?rn(V.credential.sessionToken):Ht(V.credential.apiKey),...V.workspaceId?{organizationId:V.workspaceId}:{}})}function $a(z){let J=Math.max(...z.map((X)=>X.name.length));return`hlix — the hlix control-plane CLI
32
+
33
+ Usage:
34
+ hlix <command> [options]
35
+
36
+ Commands:
37
+ ${[` hlix ${"".padEnd(J)} Open Hlix Code (interactive)`,...z.map((X)=>` hlix ${X.name.padEnd(J)} ${X.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 Aa(z,J){let V=[...Array(J.length+1).keys()];for(let X=1;X<=z.length;X+=1){let Y=[X];for(let Z=1;Z<=J.length;Z+=1)Y[Z]=Math.min(V[Z]+1,Y[Z-1]+1,V[Z-1]+(z[X-1]===J[Z-1]?0:1));V=Y}return V[J.length]}function bp(z,J,V){let X=/Unknown option '--([^'=]+)/.exec(V)?.[1];if(!X)return V;let Y=J.findIndex((te)=>te.startsWith("-")),Z=Y===-1?J:J.slice(0,Y),Q=new Set(["json","help","version","cwd","workspace","base-url",...Cr(z,Z)?.command.options??[]]),ee=null;for(let te of Q){let re=Aa(X,te);if(re<=2&&(!ee||re<ee.distance))ee={name:te,distance:re}}return ee?`${V}
63
+ Did you mean --${ee.name}?`:V}function Ta(z,J){let V=new Set;for(let Z of z)V.add(Z.name),V.add(Z.name.split(" ")[0]);let X=null;for(let Z of V){let Q=Aa(J,Z);if(Q<=2&&(!X||Q<X.distance))X={name:Z,distance:Q}}if(!X)return null;if(z.some((Z)=>Z.name===X.name))return X.name;let Y=z.filter((Z)=>Z.name.startsWith(`${X.name} `)).sort((Z,Q)=>Z.name.length-Q.name.length)[0];return Y?Y.name:X.name}function Cr(z,J){for(let V of[...z].sort((X,Y)=>Y.name.length-X.name.length)){let X=V.name.split(" ");if(X.every((Y,Z)=>J[Z]===Y))return{command:V,rest:J.slice(X.length)}}return null}function kp(z,J,V){let X=bp(z,J,V);if(!/^Unknown option '/.test(V))return X;let Y=X.replace(/\. To specify a positional argument[\s\S]*?after '--'[^\n]*/,"."),Z=Cr(z,J.filter((Q)=>!Q.startsWith("-")));return Z?`${Y}
64
+
65
+ ${Z.command.usage}`:Y}async function u(z,J,V){let X=J.findIndex((he)=>he==="--api-key"||he.startsWith("--api-key=")),Y=J[X+1];if(X!==-1&&(J[X].includes("=")||Y!==void 0&&!Y.startsWith("-")))return V.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 Z;try{Z=vp({args:J,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(he){let Ie=J.includes("--json"),ye=kp(z,J,_r(he));if(V.onFailure?.({code:"invalid_usage",message:ye,status:null}),Ie)V.stdout(Se(Un("cli",{code:"invalid_usage",message:ye,status:null})));else V.stderr(`${ye}
66
+ `);return 2}let Q=Z.values.json===!0,ee=Z.positionals;if(Z.values.version===!0){let{version:he}=await import("./package-wqp10n7m.js");return V.stdout(`${he}
67
+ `),0}if(ee.length===0||Z.values.help===!0){let he=Cr(z,ee);return V.stdout(he?`${he.command.usage}
68
+ `:$a(z)),ee.length===0&&Z.values.help!==!0?1:0}let te=Cr(z,ee);if(!te){let he=ee.join(" "),Ie=Ta(z,he)??Ta(z,ee[0]),ye=Ie?`Unknown command: ${he}
69
+ Did you mean \`hlix ${Ie}\`?`:`Unknown command: ${he}`;if(V.onFailure?.({code:"unknown_command",message:ye,status:null}),Q)V.stdout(Se(Un(he,{code:"unknown_command",message:ye,status:null})));else V.stderr(`${ye}
70
+
71
+ ${$a(z)}`);return 2}let re=new Set(["json","help","version","cwd","workspace","base-url"]),ne=new Set(te.command.options??[]),se=Object.entries(Z.values).filter(([he,Ie])=>Ie!==void 0&&!re.has(he)&&!ne.has(he)).map(([he])=>`--${he}`),ie=te.command.args??{min:0,max:0},le=te.rest.length<ie.min?{code:"missing_argument",message:te.command.usage.split(`
72
+ `)[0]}:te.rest.length>ie.max?{code:"invalid_usage",message:te.command.usage.split(`
73
+ `)[0]}:null,fe=typeof Z.values.cwd==="string"?Z.values.cwd:void 0,ce=wp(fe??"."),de=fe!==void 0&&!_a(ce)?{code:"invalid_usage",message:`--cwd is not a directory: ${ce}`}:null,me=se.length>0?{code:"invalid_usage",message:`Unsupported option for ${te.command.name}: ${se.join(", ")}`}:de??le;if(me){if(V.onFailure?.({...me,status:null}),Q)V.stdout(Se(Un(te.command.name,{...me,status:null})));else{let he=te.command.usage.startsWith(me.message)?te.command.usage:`${me.message}
74
+
75
+ ${te.command.usage}`;V.stderr(`error: ${he}
76
+ `)}return 2}let be=Z.values,Pe={...V,args:te.rest,json:Q,flags:be,cwd:ce,requireClient:(he)=>o(V.env,{cwd:he??ce,flags:be})};try{if(te.command.signIn)await g(Pe,{cwd:ce,flags:be});return await te.command.run(Pe)}catch(he){let{code:Ie,status:ye}=Yo(he);if(V.onFailure?.({code:Ie,message:a(_r(he)),status:ye,...he instanceof e&&he.details!==void 0?{details:he.details}:{}}),Q)V.stdout(Se(Un(te.command.name,{code:Ie,message:_r(he),status:ye})));else if(V.stderr(`error: ${a(_r(he))}
77
+ `),process.env.HLIX_DEBUG&&he instanceof Error&&he.stack)V.stderr(`${he.stack}
78
+ `);return Ie==="unauthenticated"||Ie==="forbidden"?3:1}}var $r={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 ${sn}`," --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(z){let J=typeof z.flags.workspace==="string"?z.flags.workspace:z.env.HLIX_WORKSPACE_ID,V=r({env:z.env,flags:z.flags,cwd:z.cwd}).baseUrl;qo(V);let X;if(z.env.HLIX_API_KEY||z.flags["api-key"]===!0){let Y=(z.env.HLIX_API_KEY??(z.promptChoice?await z.readSecret?.("Hlix API key: "):await z.readStdin?.())??"").trim();if(!Y)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.");X=await Vo(z,{baseUrl:V,credential:Ht(Y),requested:J})}else{if(z.json||!z.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`.");X=await Xo(z,{baseUrl:V,requested:J})}if(z.json)z.stdout(Se(je(this.name,{baseUrl:X.baseUrl,organizationId:X.organizationId,credentialPath:X.path})));else z.stdout(`Signed in to ${X.baseUrl}
80
+ Credential stored at ${X.path}
81
+ `);return 0}},Ra={...$r,name:"login",usage:$r.usage.replace("hlix auth login","hlix login")},Zo={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(z){let J=r({env:z.env,flags:z.flags,cwd:z.cwd});if(J.conflict)throw new e("workspace_mismatch",J.conflict);if(!J.credential)throw new e("unauthenticated","No credential. Run `hlix login`, or set HLIX_API_KEY for CI.");try{await z.requireClient().projects.list()}catch(X){throw z.stderr(`credential from ${J.credentialSource}, workspace ${J.workspaceId??"none"}, api ${J.baseUrl}
83
+ `),X}let V={credentialSource:J.credentialSource,credentialPath:J.credentialSource==="file"?J.credentialPath:null,baseUrl:J.baseUrl,baseUrlSource:J.baseUrlSource,workspaceId:J.workspaceId,workspaceSource:J.workspaceSource,valid:!0};if(z.json)return z.stdout(Se(je(Zo.name,V))),0;return z.stdout(`${Ue([["credential",b(J)??"none"],["api",`${J.baseUrl} (from ${J.baseUrlSource})`],["workspace",J.workspaceId?`${J.workspaceId} (from ${J.workspaceSource})`:"none"],["status","valid"]])}
84
+ `),0}},Tr={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(z){let J=r({env:z.env,flags:z.flags,cwd:z.cwd});if(J.credentialSource==="env"||J.credentialSource==="session"){let X=J.credentialSource==="session",Y=X?"session":"environment",Z=X?"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.",Q=ea(z.env);if(!Q){let te={removed:!1,reason:Y,path:null};if(z.json)z.stdout(Se(je(this.name,te)));else z.stdout(`${Z}
86
+ `);return 0}if(z.flags.yes!==!0){let te={removed:!1,reason:Y,path:Q};if(z.json)z.stdout(Se(je(this.name,te)));else z.stdout(`${Z}
87
+ A stored credential also exists at ${Q} — repeat with --yes to remove it.
88
+ `);return 0}let ee=Po(z.env);if(z.json)z.stdout(Se(je(this.name,ee)));else z.stdout(`Removed ${ee.path}
89
+ ${X?"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(z.flags.yes!==!0&&J.credential){if(z.json||!z.confirm)throw new e("approval_required","Removing the stored credential needs approval. Repeat with `--yes`.");if(!await z.confirm(`Remove the stored credential at ${J.credentialPath}? Signing back in takes \`hlix login\`.`))throw new e("cancelled","Logout cancelled.")}let V=Po(z.env);if(z.json)z.stdout(Se(je(this.name,V)));else z.stdout(V.removed?`Removed ${V.path}
91
+ `:`No stored credential at ${V.path}
92
+ `);return 0}},Oa={...Tr,name:"logout",usage:Tr.usage.replace("hlix auth logout","hlix logout"),agentTool:!1};import{existsSync as Cp,readFileSync as Ua}from"node:fs";import{homedir as Ga}from"node:os";import{join as Wa}from"node:path";import{constants as Ar,existsSync as es,lstatSync as Rr,mkdirSync as Fa,openSync as Sp,closeSync as Na,fsyncSync as xp,readFileSync as La,renameSync as jp,unlinkSync as Ep,writeFileSync as Qo}from"node:fs";import{dirname as Pp,join as dn,resolve as Or}from"node:path";function Ha(z){if(!es(z))return;let J=Rr(z);if(J.isSymbolicLink()||!J.isFile())throw Error(`Refusing to replace a non-regular Hlix file: ${z}`)}function ts(z,J){let V=Pp(z);if(Fa(V,{recursive:!0,mode:448}),Rr(V).isSymbolicLink())throw Error(`Refusing to write through a symlinked Hlix directory: ${V}`);Ha(z);let X=dn(V,`.hlix-${process.pid}-${crypto.randomUUID()}.tmp`),Y;try{Y=Sp(X,Ar.O_WRONLY|Ar.O_CREAT|Ar.O_EXCL|Ar.O_NOFOLLOW,384),Qo(Y,J.endsWith(`
93
+ `)?J:`${J}
94
+ `,"utf8"),xp(Y),Na(Y),Y=void 0,jp(X,z)}catch(Z){if(Y!==void 0)Na(Y);if(es(X))Ep(X);throw Z}}function Ip(z,J){ts(z,`${JSON.stringify(J,null,2)}
95
+ `)}function _p(z){return dn(Or(z),".hlix","config.json")}function Ma(z){return dn(Or(z),".hlix","state.json")}function Nr(z){try{let J=JSON.parse(La(_p(z),"utf8"));return J.schemaVersion===1&&J.workspaceId&&J.apiUrl?J:null}catch{return null}}function Fr(z){let J=dn(Or(z),".hlix");if(Fa(J,{recursive:!0,mode:448}),Rr(J).isSymbolicLink())throw Error(`Refusing to write through a symlinked Hlix directory: ${J}`);let V=dn(J,".gitignore");if(!es(V))Qo(V,`state.json
96
+ `,{mode:420,flag:"wx"});Ha(V);let X=dn(Or(z),".hlixignore");if(!Rr(X,{throwIfNoEntry:!1}))Qo(X,`# Additional project-local paths to exclude from Hlix snapshots.
97
+ `,{mode:420,flag:"wx"})}function ns(z,J){Ip(Ma(z),{...J,snapshotOnly:J.snapshotOnly??c(z)?.snapshotOnly,includedPaths:J.includedPaths??c(z)?.includedPaths})}function c(z){try{let J=JSON.parse(La(Ma(z),"utf8"));return J.schemaVersion===1&&J.repoId&&/^[a-f0-9]{40}$/.test(J.commitSha)?J:null}catch{return null}}var Gn=20000,rs=2000000;function S(z){if(z===void 0)return;let J=typeof z==="number"?z:Number(z.trim());return Number.isInteger(J)&&J>=Gn&&J<=rs?J:void 0}function A(z){if(z===void 0)return!1;let J=E(z);if(J!==void 0)return J;let V=Number(z.trim());return Number.isInteger(V)&&V>=Gn?V:void 0}var p=["cloud","docker","local"],m={cloud:"Cloud Machine",docker:"Docker container",local:"local environment"},Lr={"claude-code":!0,codex:!0,opencode:!0,goose:!0,"qwen-code":!0,pi:!0,hlix:!0},s=Object.keys(Lr),O="hlix",Ba={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"},pn=["dockerImage","harness","maskToolOutputs","memoryTokens","model","sandbox","yolo"],os=["projectId","workspaceId","apiUrl"],$p=`# Machine-wide setup for Hlix.
98
+ # A model server of your own goes under providers. Name its secret with apiKeyEnv.
99
+ `;function Hr(z=process.env){return Wa(z.HLIX_CONFIG_HOME??Ga(),".hlix","hlix.yml")}function Tp(z){return Wa(z.HLIX_CONFIG_HOME??Ga(),".hlix","config.json")}function Ap(z=process.env){let J=Ka(z);return J?Op(J):null}function k(z,J=process.env){let V=Ap(J),X=Ko(z),Z=t(z)?.config??null,Q=X?.loaded.file?_t(X.loaded.file).binding:null,ee={},te={},re=(ne)=>{let se=Lp(Q,ne),ie=se!==void 0?se:Z?.[ne],le=V?.[ne];if(ie!==void 0)ee[ne]=ie,te[ne]="project";else if(le!==void 0)ee[ne]=le,te[ne]="global"};for(let ne of pn)re(ne);for(let ne of os){let se=Z?.[ne];if(se!==void 0)ee[ne]=se,te[ne]="project"}return{merged:ee,sources:te,global:V,project:Z,paths:{global:Hr(J),project:X?ja(X.root):null},providers:Hp(X?.loaded??null,V?.providers)}}function za(z){return[...pn,...os].map((V)=>({key:V,value:z.merged[V]??null,source:z.sources[V]??"default"}))}function Rp(z,J){if(z==="sandbox"&&!p.includes(J))return`sandbox must be one of ${p.join(", ")}; got "${J}".`;if(z==="harness"&&!s.includes(J))return`harness must be one of ${s.join(", ")}; got "${J}".`;if(z==="model"&&J.trim()==="")return"model must not be empty.";if(z==="memoryTokens"){let V=Number(J.trim());if(!Number.isInteger(V)||V<Gn)return`memoryTokens must be a whole number of tokens, at least ${Gn}; got "${J}".`;if(V>rs)return`memoryTokens must be at most ${rs}; got "${J}".`}if(z==="dockerImage"&&J.trim()==="")return"dockerImage must not be empty.";if(z==="maskToolOutputs"&&A(J)===void 0)return`maskToolOutputs must be true, false or a whole number of tokens of at least ${Gn}; got "${J}".`;if(z==="yolo"&&E(J)===void 0)return`yolo must be true or false; got "${J}".`;return null}function E(z){if(z===void 0)return;let J=z.trim().toLowerCase();if(["true","1","yes","on"].includes(J))return!0;if(["false","0","no","off"].includes(J))return!1;return}function ss(z){if(pn.includes(z))return z;let J=os.includes(z);throw new e("invalid_usage",J?`${z} is written by \`hlix init\` and \`hlix import\`, not by \`hlix config set\`.`:`Unknown setting: ${z}. Known settings: ${pn.join(", ")}.`)}function is(z,J){let V=Rp(z,J);if(V)throw new e("invalid_usage",V);return J}function I(z){if(is(z.key,z.value),z.scope==="global"){let V=Hr(z.env),X=Ka(z.env)??{schema:1},Y=Da(X,z.key,z.value);if(Y!==X)Ja(z.env,Y);return V}let J=Ko(z.cwd);if(!J)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 xr(J.root,(V)=>Da(V,z.key,z.value)).path}catch(V){if(V instanceof e)throw V;throw new e("invalid_project_file",V instanceof Error?V.message:"Could not write hlix.yml.")}}function Ja(z,J){let V=Hr(z),X=Hn(J,$p),Y=an(X);if(!Y.ok){let Z=Y.issues.map((Q)=>`${Q.path}: ${Q.message}`).join("; ");throw new e("invalid_project_file",`${V}: ${Z}`)}ts(V,X)}function Ka(z){let J=Hr(z);if(Cp(J)){let X;try{X=Ua(J,"utf8")}catch{return null}let Y=an(X);if(!Y.ok){let Z=Y.issues.map((Q)=>`${Q.path}: ${Q.message}`).join("; ");throw new e("invalid_project_file",`${J}: ${Z}`)}return Y.file}let V=Np(z);if(!V)return null;return Ja(z,V),V}function Op(z){let J=_t(z).binding,V=J.harness&&J.harness in Lr?J.harness:void 0;return{schemaVersion:1,...J.dockerImage?{dockerImage:J.dockerImage}:{},...V?{harness:V}:{},...J.memoryTokens?{memoryTokens:J.memoryTokens}:{},...J.maskToolOutputs?{maskToolOutputs:J.maskToolOutputs}:{},...J.model?{model:J.model}:{},...J.sandbox?{sandbox:J.sandbox}:{},...J.yolo?{yolo:J.yolo}:{},...z.providers?{providers:z.providers}:{}}}function Np(z){let J;try{J=JSON.parse(Ua(Tp(z),"utf8"))}catch{return null}if(!J||typeof J!=="object"||J.schemaVersion!==1)return null;let V=J,X={schema:1},Y={};if(typeof V.harness==="string"&&V.harness in Lr)Y.harness=V.harness;if(typeof V.model==="string"&&V.model.trim())Y.model=V.model.trim();let Z=typeof V.memoryTokens==="number"?V.memoryTokens:typeof V.memoryTokens==="string"?Number(V.memoryTokens):void 0;if(Z!==void 0&&Number.isInteger(Z)&&Z>=1&&Z<=2000000)Y.memoryTokens=Z;if(V.yolo==="true"||V.yolo===!0)Y.yolo=!0;if(V.yolo==="false"||V.yolo===!1)Y.yolo=!1;if(Object.keys(Y).length)X.coder=Y;let Q={};if(V.sandbox==="cloud"||V.sandbox==="local"||V.sandbox==="docker")Q.runtime=V.sandbox;if(typeof V.dockerImage==="string"&&V.dockerImage.trim())Q.image=V.dockerImage.trim();if(Object.keys(Q).length)X.local=Q;let ee=Fp(V.providers);if(ee)X.providers=ee;let te=qt.safeParse(X);if(te.success)return te.data;if(!X.providers)return null;let re={...X,providers:void 0},ne=qt.safeParse(re);return ne.success?ne.data:null}function Fp(z){if(!Array.isArray(z))return;let J=[];for(let V of z){if(!V||typeof V!=="object")continue;let X=V;if(typeof X.name!=="string"||typeof X.url!=="string"||!Array.isArray(X.models))continue;let Y=X.models.filter((te)=>typeof te==="string"&&te.length>0);if(!Y.length)continue;let Z={name:X.name,url:X.url,models:Y,...typeof X.apiKeyEnv==="string"?{apiKeyEnv:X.apiKeyEnv}:{},...typeof X.apiKey==="string"&&X.apiKey.length>0?{apiKey:X.apiKey}:{}},Q=qt.safeParse({schema:1,providers:[Z]}),ee=Q.success?Q.data.providers?.[0]:void 0;if(ee)J.push(ee)}return J.length?J:void 0}function Lp(z,J){if(!z)return;if(J==="harness"){let V=z.harness;return V&&V in Lr?V:void 0}return z[J]}function Hp(z,J){let V=z?.file?.providers;if(V===void 0)return J;if(z?.local?.providers!==void 0)return V;return V.map(({name:X,url:Y,models:Z})=>({name:X,url:Y,models:Z}))}function Da(z,J,V){if(J==="sandbox"){let X=V==="docker"?"docker":V==="local"?"local":"cloud";if(z.local?.runtime===X)return z;return{...z,local:{...z.local,runtime:X}}}if(J==="dockerImage"){let X=V.trim();if(z.local?.image===X)return z;return{...z,local:{...z.local,image:X}}}if(J==="harness"){if(z.coder?.harness===V)return z;return{...z,coder:{...z.coder,harness:V}}}if(J==="model"){let X=V.trim();if(z.coder?.model===X)return z;return{...z,coder:{...z.coder,model:X}}}if(J==="memoryTokens"){let X=S(V);if(X===void 0||z.coder?.memoryTokens===X)return z;return{...z,coder:{...z.coder,memoryTokens:X}}}if(J==="maskToolOutputs"){let X=A(V);if(X===void 0||z.coder?.maskToolOutputs===X)return z;return{...z,coder:{...z.coder,maskToolOutputs:X}}}if(J==="yolo"){let X=E(V);if(X===void 0||z.coder?.yolo===X)return z;return{...z,coder:{...z.coder,yolo:X}}}return z}var qa=pn.join(" | "),as={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(z){let J=k(z.cwd,z.env),V=za(J);if(z.json)return z.stdout(Se(je(as.name,{settings:V,paths:J.paths}))),0;return z.stdout(`${bt(["setting","value","source","applies to"],V.map((X)=>[X.key,X.value??"-",X.source,Ba[X.key]??"this folder's binding"]))}
101
+ `),z.stdout(`
102
+ global ${J.paths.global}
103
+ `),z.stdout(`project ${J.paths.project??"- (this folder is not bound to hlix)"}
104
+ `),0}},cs={name:"config get",summary:"Print one setting's effective value",usage:[`Usage: hlix config get <${qa}> [--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(z){let J=ss(z.args[0]),V=k(z.cwd,z.env),X=V.merged[J]??null,Y=V.sources[J]??"default";if(z.json)return z.stdout(Se(je(cs.name,{key:J,value:X,source:Y}))),X===null?1:0;if(X===null)return z.stderr(`${J} is not set. Set it with \`hlix config set ${J} <value>\`.
106
+ `),1;return z.stdout(`${X}
107
+ `),0}},ls={name:"config set",summary:"Set one setting for this folder, or for the machine with --global",usage:[`Usage: hlix config set <${qa}> <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(z){let J=ss(z.args[0]),V=is(J,z.args[1]),X=z.flags.global===!0?"global":"project",Y=I({key:J,value:V,scope:X,cwd:z.cwd,env:z.env});if(z.json)return z.stdout(Se(je(ls.name,{key:J,value:V,scope:X,path:Y}))),0;return z.stdout(`${J} = ${V} (${X}: ${Y})
109
+ `),0}};var Mp="project-manager",Dp=2000,Up="Cloud work landed. Run /pull (hlix pull) to bring it into this folder.",Va=new Set(["done","pr_created"]),Gp=new Set(["done","pr_created","failed","canceled"]),Wp={"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 Bp(z){let J=z.role?Wp[z.role]:void 0;return J?`${z.name} · ${J}`:z.name}function zp(z){return z.replace(/^project-/,"").replace(/[-_]+/g," ")}function kt(z){return typeof z==="string"&&z.trim()?z.trim():void 0}function Xa(z){if(z.status==="running")return null;let J=z.detail??{kind:""},V=zp(z.stepId);if(J.kind==="narration"){let X=Array.isArray(J.tasks)?J.tasks.filter((Z)=>typeof Z==="string"):[];V=kt(J.title)??(X.length>0?X.join(", "):V);let Y=kt(J.reason);if(Y)V+=` — ${Y}`}else if(J.kind==="reason"&&kt(J.reason))V+=` — ${kt(J.reason)}`;else if(J.kind==="verdict")V=J.approved===!0?"review approved":`review asked for changes${kt(J.feedback)?` — ${kt(J.feedback)}`:""}`;else if(J.kind==="dispatch"&&typeof J.launched==="number")V+=` — ${J.launched} started`;return z.status==="failed"?`${V} (failed)`:V}function Ya(z){return{kind:"cycle",text:`cycle "${z.title}": ${z.stage}`}}function Jp(z){return{kind:"task",text:`task "${z.title||z.id}": ${z.status}`}}function Za(z){return{kind:"preview",text:`preview: ${z.state}${z.url?` ${z.url}`:""}`}}function Kp(z,J,V){let X=[],Y=J.activity.filter((Z)=>Xa(Z)!==null&&!V.has(Z.id));if(!z){X.push({kind:"project",text:`${J.project.name}: ${J.project.status} (${J.project.runStatus})`});for(let Z of J.cycles)if(!Gp.has(Z.status))X.push(Ya(Z));if(J.preview.url)X.push(Za(J.preview))}else{if(z.project.status!==J.project.status||z.project.runStatus!==J.project.runStatus)X.push({kind:"project",text:`project: ${J.project.status} (${J.project.runStatus})`});let Z=!1;for(let Q of J.cycles){let ee=z.cycles.find((te)=>te.id===Q.id);if(ee&&ee.status===Q.status)continue;if(X.push(Ya(Q)),Va.has(Q.status)&&!(ee&&Va.has(ee.status)))Z=!0}for(let Q of J.tasks){let ee=z.tasks.find((te)=>te.id===Q.id);if(!ee||ee.status!==Q.status)X.push(Jp(Q))}for(let Q of J.agents){let ee=z.agents.find((te)=>te.id===Q.id);if(ee&&ee.state!==Q.state)X.push({kind:"agent",text:`${Bp(Q)} ${Q.state==="working"?"started working":"is idle"}`})}if(z.preview.url!==J.preview.url||z.preview.state!==J.preview.state){if(X.push(Za(J.preview)),J.preview.url&&z.preview.url!==J.preview.url)Z=!0}if(Z)X.push({kind:"landed",text:Up})}for(let Z of Y){if(V.has(Z.id))continue;V.add(Z.id),X.push({kind:"activity",text:Xa(Z)})}return X}function Qa(z){if(typeof z==="string")return kt(z);if(Array.isArray(z))return kt(z.map((J)=>J&&typeof J==="object"&&J.type==="text"?String(J.text??""):"").join(""));return}var qp=(z)=>z==="assistant"?"project manager":"to project manager";class ec{seen=new Set;drafts=new Map;spoke=!1;unsaved;lines(z){switch(z.type){case"MESSAGES_SNAPSHOT":{let J=z.messages.filter((V)=>{if(typeof V.id!=="string"||this.seen.has(V.id))return!1;if(V.role==="assistant"&&this.unsaved!==void 0&&Qa(V.content)===this.unsaved)return this.unsaved=void 0,this.seen.add(V.id),!1;return!0});for(let V of J)this.seen.add(V.id);return J.flatMap((V)=>{if(V.role!=="user"&&V.role!=="assistant")return[];let X=Qa(V.content);return X?[{kind:"message",text:`${qp(V.role)}: ${X}`}]:[]})}case"RUN_STARTED":return this.spoke=!1,[{kind:"run",text:"project manager is working…"}];case"TEXT_MESSAGE_START":return this.drafts.set(z.messageId,""),[];case"TEXT_MESSAGE_CONTENT":return this.drafts.set(z.messageId,(this.drafts.get(z.messageId)??"")+z.delta),[];case"TEXT_MESSAGE_END":{let J=kt(this.drafts.get(z.messageId));if(this.drafts.delete(z.messageId),this.seen.has(z.messageId))return[];if(this.seen.add(z.messageId),!J)return[];return this.spoke=!0,this.unsaved=J,[{kind:"message",text:`project manager: ${J}`}]}case"TOOL_CALL_START":return[{kind:"tool",text:`project manager → ${z.toolCallName.replace(/[_-]+/g," ")}`}];case"CUSTOM":{let J=z.name==="hlix.turn_saved"?z.value?.messageId:void 0;if(typeof J==="string"&&this.spoke)this.seen.add(J),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: ${z.message}`}];default:return[]}}}async function tc(z,J,V){let X=zt(J),Y=new AbortController,Z=()=>Y.abort();if(V.signal?.aborted)return;V.signal?.addEventListener("abort",Z,{once:!0});let Q=new ec,ee,te=null,re=!1,ne=null,se=()=>{if(te){re=!0;return}te=(async()=>{do{re=!1;let ce=new AbortController,de=()=>ce.abort();Y.signal.addEventListener("abort",de,{once:!0}),ne=de;try{for await(let me of z.live.follow(Mp,X,{signal:ce.signal}))for(let be of Q.lines(me))V.emit(be)}finally{ne=null,Y.signal.removeEventListener("abort",de)}}while(re&&!Y.signal.aborted)})().catch((ce)=>{if(Y.signal.aborted)return;ee=ce,Y.abort()}).finally(()=>{te=null})},ie=()=>{let ce=ne;if(!ce)return se();re=!0,lt(Dp,Y.signal).then(()=>{if(ne===ce)ce()})},le=new Set,fe;try{se();for await(let{state:ce,event:de}of z.live.project(J,{signal:Y.signal})){if(de.type==="CUSTOM"){let me=de.value;if(de.name==="hlix.thread_changed"&&me?.threadId===X){if(me.kind==="run_finished")ie();else if(me.kind!=="renamed")se()}continue}for(let me of Kp(fe,ce,le))V.emit(me);fe=ce}}catch(ce){if(!Y.signal.aborted)ee??=ce}finally{Y.abort(),V.signal?.removeEventListener("abort",Z),await te}if(ee!==void 0)throw ee}function rc(z){let V=(typeof z.flags.project==="string"?z.flags.project.trim():"")||t(z.cwd)?.config.projectId;if(!V)throw new e("missing_argument","A project is required: pass --project <id>, or run this inside a folder bound to a project.");return V}var nc="The project manager is busy with another message. Try again in a moment; /watch shows what it is doing.";function Vt(z,J){if(typeof z!=="object"||z===null)return"";let V=z[J];return V===null||V===void 0?"":String(V)}var ds={name:"projects list",summary:"List the projects in your workspace",usage:"Usage: hlix projects list [--json]",supportsJson:!0,signIn:!0,async run(z){let J=await z.requireClient().projects.list();if(z.json)return z.stdout(Se(je(ds.name,J))),0;let V=Array.isArray(J)?J:[];if(V.length===0)return z.stdout(`No projects.
110
+ `),0;return z.stdout(`${bt(["ID","NAME","STACK"],V.map((X)=>[Vt(X,"id"),Vt(X,"name"),Vt(X,"stack")]))}
111
+ `),0}},ps={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(z){let J=z.args[0]??t(z.cwd)?.config.projectId;if(!J)throw new e("missing_argument","A project id is required, or run this inside a folder bound to a project.");let V=await z.requireClient().projects.get(J);if(z.json)return z.stdout(Se(je(ps.name,V))),0;let X=V.repos;return z.stdout(`${Ue([["id",Vt(V,"id")],["name",Vt(V,"name")],["stack",Vt(V,"stack")],["status",Vt(V,"status")],["repos",Array.isArray(X)?String(X.length):""]].filter(([,Y])=>Y!==""))}
113
+ `),0}},us={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(z){let J=z.requireClient(),V=z.args[0],X=await J.projects.list(),Y=X.find((re)=>re.id===V),Z=Y?[Y]:X.filter((re)=>re.name===V);if(Z.length===0)throw new e("not_found",`No project named or identified by "${V}".`);if(Z.length>1)throw new e("invalid_usage",`More than one project is named "${V}". Use its ID.`);let Q=Z[0],ee=`Delete project "${Q.name}"?`;if(z.stderr(`${ee}
114
+ `),z.flags.yes!==!0){if(t(z.cwd)?.config.projectId===Q.id)throw new e("approval_required","This folder is bound to that project. Pass --yes to delete it.");if(z.json||!z.confirm)throw new e("approval_required","Project deletion requires --yes when not interactive.");if(!await z.confirm(ee))throw new e("cancelled","Project deletion cancelled.")}let te=await J.projects.delete(Q.id);if(z.json)z.stdout(Se(je(us.name,te)));else z.stdout(`Deleted project "${Q.name}".
115
+ `);return 0}},ms={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(z){let J=rc(z),V=z.requireClient();return await V.projects.get(J),await tc(V,J,{...z.signal?{signal:z.signal}:{},emit:(X)=>z.stdout(z.json?`${JSON.stringify(je(ms.name,X))}
117
+ `:`${a(X.text)}
118
+ `)}),0}},gs={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(z){let J=rc(z),V=z.args.join(" ").trim();if(!V)throw new e("missing_argument","A message is required.");let X=z.requireClient(),Y="";try{for await(let Z of X.live.run("project-manager",{threadId:zt(J),text:V},z.signal?{signal:z.signal}:void 0))if(Z.type==="TEXT_MESSAGE_CONTENT"){if(Y+=Z.delta,!z.json)z.stdout(a(Z.delta))}else if(Z.type==="RUN_ERROR"){if(Z.code==="409")throw new e("conflict",nc);throw new e("server_error",`The project manager could not answer: ${Z.message}`)}}catch(Z){if(Z instanceof Ut)throw new e("conflict",nc);throw Z}if(z.json)z.stdout(Se(je(gs.name,{answer:Y})));else if(!Y)z.stdout(`Sent. The project manager answered without text.
120
+ `);else if(!Y.endsWith(`
121
+ `))z.stdout(`
122
+ `);return 0}};function fs(z,J){let V=z.args[0];if(!V)throw new e("missing_argument",`A ${J} id is required.`);return V}function oc(z,J){let V=z.flags[J];return typeof V==="string"&&V.trim()?V.trim():void 0}function St(z,J){if(typeof z!=="object"||z===null)return"";let V=z[J];return V===null||V===void 0?"":String(V)}var hs={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(z){let J=oc(z,"project")??t(z.cwd)?.config.projectId,V=oc(z,"status"),X=await z.requireClient().tasks.list({...J?{projectId:J}:{},...V?{status:V}:{}});if(z.json)return z.stdout(Se(je(hs.name,X))),0;let Y=Array.isArray(X)?X:[];if(Y.length===0)return z.stdout(`No tasks.
124
+ `),0;return z.stdout(`${bt(["ID","STATUS","TITLE"],Y.map((Z)=>[St(Z,"id"),St(Z,"status"),St(Z,"title")||St(Z,"description").split(`
125
+ `)[0]||""]))}
126
+ `),0}},ys={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(z){let J=fs(z,"task"),V=await z.requireClient().tasks.get(J);if(z.json)return z.stdout(Se(je(ys.name,V))),0;return z.stdout(`${Ue([["id",St(V,"id")],["status",St(V,"status")],["title",St(V,"title")],["project",St(V,"projectId")],["description",St(V,"description")]])}
127
+ `),0}},ws={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(z){let J=fs(z,"task"),V=z.requireClient(),X=await V.tasks.get(J);if(!X.cycleId)throw new e("not_found",`Task ${J} belongs to no cycle, so there is no change to review.`);let Y=await V.cycles.review(X.cycleId);if(z.json)return z.stdout(Se(je(ws.name,Y))),0;return z.stdout(`${JSON.stringify(Y,null,2)}
128
+ `),0}},vs={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(z){let J=fs(z,"task"),V=z.requireClient(),{projectId:X}=await V.tasks.get(J),Y;for await(let Z of V.live.task(X,J))if(z.json)z.stdout(`${JSON.stringify(je(vs.name,Z))}
130
+ `);else if(Z.state==="unmet")z.stdout(`error: ${a(Z.reason)}
131
+ `);else if(Z.task&&Z.task.status!==Y)Y=Z.task.status,z.stdout(`${a(Y)}
132
+ `);return 0}};import{realpath as Rm}from"node:fs/promises";import{resolve as Om}from"node:path";import{parse as fu}from"jsonc-parser";import{parse as hu}from"smol-toml";import{parse as yu}from"yaml";var Wn={install:null,previewCommand:null,previewPort:null,verifyCommand:null,packageManager:null};var Vp=[["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]],Xp=/^(?: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+[^|;&]*)?$/,Yp=["vite","next","webpack","react-scripts","@rsbuild/core","parcel"],Bn=8080,Mr=8000,Zp=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 ${Bn})
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 Gr(z=".",J="index.html"){return`python3 -c 'import base64,sys;exec(base64.b64decode(sys.argv[1]))' ${zn(Zp)} "$PREVIEW_PUBLIC_PATH" ${z}${J==="index.html"?"":` ${dc(J)}`}`}function cc(z){if(z.has("index.html"))return"index.html";let J=[...z].filter((V)=>!V.startsWith(".")&&!/[\\/]/.test(V)&&/\.html?$/i.test(V));return J.length===1?J[0]:null}var lc="HLIX_PREVIEW_FAILURE";function Dr(z){return`{ echo "${lc}=${z}"; exit 1; }`}var Qp=`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
+ `,eu=`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
+ `,tu=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("${lc}=" + 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(Qp)})
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(eu)}.replace("__CONFIG__", config))
231
+ `,nu=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
+ `,ru=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
+ `,ou=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 sc(z,J){return`python3 -c 'import base64,sys;exec(base64.b64decode(sys.argv[1]))' ${zn(z)} ${J}`}function su(){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)"; ${sc(ru,'"$HOME/.cache/hlix-flutter"')}; } || ${Dr("flutter_sdk_unavailable")}; }`,`{ command -v unzip >/dev/null 2>&1 || { printf '#!/bin/sh\\n%s "$@"\\n' ${dc(sc(ou,""))} > "$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 || ${Dr("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/" && ${Gr("build/web")}; } || ${Dr("web_build_failed")}; }`].join(" && ")}function iu(z){let J=`printf %s ${zn(tu)} | base64 -d | node - "$PREVIEW_PUBLIC_PATH" ${z}`,V=`CI=1 npx expo export --platform web --output-dir dist && ${Gr("dist")}`;return`${J} && ${pc(nu,"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"; ${V}; } || ${Dr("web_build_failed")}; }`}function dc(z){return`'${z.replace(/'/g,"'\\''")}'`}var au=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
+ `,cu=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 pc(z,J){return`printf %s ${zn(z)} | base64 -d | node - "$${J}"`}var lu=["test","typecheck","check","build","lint"],du=/^(?:\.eslintrc(?:\.(?:js|cjs|mjs|json|ya?ml))?|eslint\.config\.(?:js|cjs|mjs|ts|cts|mts))$/;function pu(z,J){return/\bnext\s+lint\b/.test(z)&&![...J].some((V)=>du.test(V))}var Lw=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 uu=["dev","start","serve","preview"];function Wr(z){if(!z)return{};try{let J=JSON.parse(z);return J&&typeof J==="object"?J:{}}catch{return{}}}function uc(z){return{...xt(z.dependencies)?z.dependencies:{},...xt(z.devDependencies)?z.devDependencies:{}}}function ic(z){let J=uc(Wr(z.packageJson));if("expo"in J||"react-native"in J)return!0;if(Array.from(z.rootFiles).some((V)=>V==="hlix.mobile.json"||V==="AndroidManifest.xml"||/\.xc(?:odeproj|workspace)$/.test(V)))return!0;return ks(z)}function ks(z){if(!new Set(z.rootFiles).has("pubspec.yaml"))return!1;let J=z.configFiles?.["pubspec.yaml"];return J===void 0||/^\s+sdk:\s*flutter\s*$/m.test(J)}function mc(z){let J=new Set(z.rootFiles),V=Wr(z.packageJson),X=typeof V.packageManager==="string"?V.packageManager.split("@")[0]:"",Y=X==="bun"||J.has("bun.lock")||J.has("bun.lockb")?"bun":X==="pnpm"||J.has("pnpm-lock.yaml")?"pnpm":X==="yarn"||J.has("yarn.lock")?"yarn":X==="npm"||J.has("package.json")?"npm":null,Z=cc(J);if(!Y){if(ic(z)&&!ks(z))return{...Wn,mobile:!0};if(ks(z))return{...Wn,previewCommand:su(),previewPort:Bn,mobile:!0};let re=gu(J,z.configFiles??{});if(re)return re;return Z?{...Wn,previewCommand:Gr(".",Z),previewPort:Bn}:Wn}let Q=gc(V,J,Y),ee={install:`${Y} install`,verifyCommand:Q.verifyCommand,packageManager:Y},te=Q.webApp?null:mu(z.workspacePackages??[],Y)[0]??null;if(te){let re=(ne)=>`cd ${te.dir} && ${ne}`;return{...ee,previewCommand:re(te.previewCommand),previewPort:te.previewPort,verifyCommand:ee.verifyCommand??(te.verifyCommand?re(te.verifyCommand):null),...te.mobile?{mobile:!0}:{}}}return{...ee,previewCommand:Q.previewCommand,previewPort:Q.previewPort,...Q.mobile||!Q.previewCommand&&ic(z)?{mobile:!0}:{}}}function gc(z,J,V,X){let Y=xt(z.scripts)?z.scripts:{},Z=(he)=>`${V} run ${he}`,Q=(he,Ie)=>`${Z(he)}${V==="npm"?" --":""} ${Ie}`,ee=uu.find((he)=>typeof Y[he]==="string"),te=lu.find((he)=>typeof Y[he]==="string"&&!/no test specified/i.test(String(Y[he]))&&!/(?:^|\s)(?:--watch(?:All)?|-w)(?:\s|=|$)/.test(String(Y[he]))&&!pu(String(Y[he]),J)),re=te?Z(te):null,ne=uc(z),se={previewCommand:null,previewPort:null,verifyCommand:re,webApp:!1,mobile:!1,explicitPort:!1};if("react-native"in ne&&!("expo"in ne)&&!Yp.some((he)=>(he in ne)))return{...se,mobile:!0};if("expo"in ne)return{previewCommand:iu(V),previewPort:X??Bn,verifyCommand:re,webApp:!0,mobile:!0,explicitPort:!1};let ie=Vp.find(([he])=>(he in ne)),le=ee?bs(String(Y[ee]))??ie?.[1]??null:null,fe=cc(J);if(!ee&&!ie&&fe)return{...se,previewCommand:Gr(".",fe),previewPort:X??Bn};if(!ee)return se;let ce=String(Y[ee]).trim(),de=X!=null?` --port ${X}`:"",me=ce.split("&&").map((he)=>he.trim()),be=de||(le!=null&&bs(ce)==null&&Xp.test(me.at(-1))?` --port ${le}`:""),Pe=be?Q(ee,be.trim()):Z(ee);if(me.length>1&&me.every((he)=>/^vite(?:\s|$)/.test(he))&&!("@sveltejs/kit"in ne)){let he={npm:"npx",bun:"bunx",pnpm:"pnpm exec",yarn:"yarn exec"}[V];Pe=me.map((Ie,ye)=>`${he} ${Ie} --base "$PREVIEW_BASE_PATH/"${/^vite\s+build\b/.test(Ie)?"":" --host 0.0.0.0"}${ye===me.length-1?be:""}`).join(" && ")}else if(/^vite(?:\s+(?:dev|serve|preview))?(?:\s|$)/.test(ce)&&!/&&|;|\|/.test(ce)&&!("@sveltejs/kit"in ne))Pe=Q(ee,`--base "$PREVIEW_BASE_PATH/" --host 0.0.0.0${be}`);else if(/^astro\s+(?:dev|preview)(?:\s|$)/.test(ce))Pe=Q(ee,`--base "$PREVIEW_BASE_PATH"${be}`);else if(/^next\s+(?:dev|start)(?:\s|$)/.test(ce))Pe=`${pc(au,"PREVIEW_BASE_PATH")} && ${Pe}`;else if(/^nuxt\s+(?:dev|preview|start)(?:\s|$)/.test(ce))Pe=`NUXT_APP_BASE_URL="$PREVIEW_BASE_PATH/" ${Pe}`;return{previewCommand:Pe,previewPort:X??le,verifyCommand:re,webApp:Boolean(ie),mobile:!1,explicitPort:bs(ce)!=null}}var ac=["web","app","frontend","site","www","client","dashboard"];function mu(z,J){let V=z.filter((Y)=>Ur(Y.dir)).map((Y)=>{let Z=Wr(Y.packageJson),Q=new Set(Y.rootFiles??[]);return{dir:Y.dir,pkg:Z,files:Q,...gc(Z,Q,J)}}).filter((Y)=>Y.webApp&&Y.previewCommand&&Y.previewPort!=null),X=(Y)=>{let Z=ac.indexOf(Y.split("/").at(-1)??"");return Z<0?ac.length:Z};return V.sort((Y,Z)=>Number(Y.mobile)-Number(Z.mobile)||Number(!Y.dir.startsWith("apps/"))-Number(!Z.dir.startsWith("apps/"))||X(Y.dir)-X(Z.dir)||(Y.dir<Z.dir?-1:Y.dir>Z.dir?1:0))}function Ur(z){return/^[A-Za-z0-9._@-]+(?:\/[A-Za-z0-9._@-]+)*$/.test(z)&&!z.split("/").some((J)=>J===".."||J===".")}function fc(z){let J=Wr(z.packageJson),V=Array.isArray(J.workspaces)?J.workspaces:xt(J.workspaces)&&Array.isArray(J.workspaces.packages)?J.workspaces.packages:[],X=z.configFiles?.["pnpm-workspace.yaml"]??"";for(let ee of X.split(/\r?\n/)){let te=ee.match(/^\s*-\s*["']?([^"'#\s]+)["']?/);if(te)V.push(te[1])}let Y=V.filter((ee)=>typeof ee==="string"&&!ee.startsWith("!"));if(Y.length===0&&new Set(z.rootFiles).has("turbo.json"))Y.push("apps/*","packages/*");for(let ee of Object.values(xt(J.scripts)?J.scripts:{})){if(typeof ee!=="string")continue;let te=ee.match(/^\s*cd\s+([A-Za-z0-9._@/-]+)\s*&&/)?.[1];if(te&&Ur(te))Y.push(te)}let Z=new Set,Q=new Set;for(let ee of Y){let te=ee.replace(/^\.\//,"").replace(/\/$/,"");if(/^[^*]+\/\*$/.test(te)&&Ur(te.slice(0,-2)))Z.add(te.slice(0,-2));else if(!te.includes("*")&&Ur(te))Q.add(te)}return{parents:[...Z].sort(),packages:[...Q].sort()}}function gu(z,J){let V=`${J["requirements.txt"]??""}
295
+ ${J["pyproject.toml"]??""}`.toLowerCase(),X=(ne)=>new RegExp(`(^|[\\s"'\\[,])${ne}\\b`,"m").test(V),Y=z.has("requirements.txt")?'"$V/bin/pip" install -q -r requirements.txt':z.has("pyproject.toml")?'"$V/bin/pip" install -q .':null,Z=(ne,se="")=>Y?`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" && ${Y}${se} && touch "$V/.ready"; }; } && "$V/bin/python" ${ne}`:null,Q=X("pytest")?Z("-m pytest",' && "$V/bin/pip" install -q pytest'):null,te=["main.py","app.py","server.py","api.py"].find((ne)=>z.has(ne))?.replace(/\.py$/,""),re=(ne,se=Q)=>({...Wn,previewCommand:ne,previewPort:Mr,verifyCommand:se});if(z.has("manage.py")){let ne=`python3 -c 'import base64,sys;exec(base64.b64decode(sys.argv[1]))' ${zn(cu)} "$PREVIEW_ALLOWED_HOSTS"`;return re(`${ne} && python3 manage.py runserver 0.0.0.0:${Mr}`,Q??(X("django")?Z("manage.py test"):null))}if(te&&X("fastapi"))return re(`python3 -m uvicorn ${te}:app --host 0.0.0.0 --port ${Mr} --root-path "$PREVIEW_PUBLIC_PATH"`);if(te&&X("flask"))return re(`python3 -m flask --app ${te} run --host 0.0.0.0 --port ${Mr}`);return null}function zn(z){return btoa(z)}function bs(z){let J=z.match(/(?:--port(?:=|\s+)|-p\s+|\bPORT=)(\d{2,5})\b/),V=J?Number(J[1]):NaN;return Number.isInteger(V)&&V>0&&V<=65535?V:null}function xt(z){return Boolean(z)&&typeof z==="object"&&!Array.isArray(z)}function hc(z){let J=new Set(z.rootFiles),V=new Set;if(J.has("package.json")){for(let Y of["coverage",".cache"])V.add(Y);if(["package-lock.json","pnpm-lock.yaml","yarn.lock","bun.lock","bun.lockb"].some((Y)=>J.has(Y)))V.add("node_modules")}if(J.has("Cargo.toml"))V.add("target");if(["pyproject.toml","requirements.txt","setup.py"].some((Y)=>J.has(Y)))V.add("__pycache__");if(J.has("composer.json")&&J.has("composer.lock"))V.add("vendor");for(let Y of Ss({...z,rootFiles:J}))V.add(Y);return[...V].sort()}function gt(z,J,V){let X=(z.match(/"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`(?:\\.|[^`\\])*`|\/\*[\s\S]*?\*\/|\/\/[^\n]*|[A-Za-z_$][\w$]*|[^\s]/g)??[]).filter((te)=>!te.startsWith("//")&&!te.startsWith("/*"));if(X[0]!=="{"){let te=X.findIndex((ne,se)=>ne==="export"&&X[se+1]==="default"),re=X.findIndex((ne,se)=>ne==="module"&&X.slice(se+1,se+4).join("")===".exports=");if(te<0&&re<0)return null;if(X=X.slice(te>=0?te+2:re+4),["defineConfig","defineNuxtConfig"].includes(X[0]??"")&&X[1]==="(")X=X.slice(2);if(X[0]!=="{")return null}if(X.some((te,re)=>te==="."&&X[re+1]==="."&&X[re+2]==="."))return null;let Y=(te="")=>te.replace(/^["']|["']$/g,""),Z=[],Q,ee=0;for(let te=0;te<X.length;te++){let re=X[te];if(re==="{")Z.push(X[te-1]===":"?Y(X[te-2]):"");if(re==="}")Z.pop();if(!Z.length)break;if(re==="["&&["{",","].includes(X[te-1]??""))return null;if(J&&Z.length===1&&Y(re)===J){if(X[te+1]!==":"||X[te+2]!=="{"||++ee>1)return null}if(Y(re)===V&&(J?Z.length===2&&Z.at(-1)===J:Z.length===1)&&X[te+1]!==":")return null;if(Y(re)!==V||X[te+1]!==":"||(J?Z.length!==2||Z.at(-1)!==J:Z.length!==1))continue;let ne=X[te+2]??"";if(Q!==void 0||!/^["'`][^\\$]*["'`]$/.test(ne)||![",","}"].includes(X[te+3]??""))return null;Q=ne.slice(1,-1)}return Q}function Ss(z){let J={};try{let ie=JSON.parse(z.packageJson??"{}");if(xt(ie))J=ie}catch{}let V={...xt(J.dependencies)?J.dependencies:{},...xt(J.devDependencies)?J.devDependencies:{}},X=xt(J.scripts)?Object.entries(J.scripts).filter((ie)=>typeof ie[1]==="string"):[],Y=(ie,le=ie)=>(ie in V)||X.some(([,fe])=>new RegExp(`(?:^|[;&|\\s])${le}(?:\\s|$)`).test(fe)),Z=z.configFiles??{},Q=new Set,ee=(ie)=>{if(typeof ie!=="string")return null;let le=ie.replace(/^\.\//,"").replace(/\/$/,"");return le&&!le.startsWith("/")&&!/[\\:*?\[\]#!$`"'\r\n]/.test(le)&&!le.split("/").some((fe)=>!fe||[".","..",".git",".hlix"].includes(fe))?le:null},te=(ie)=>{let le=ee(ie);if(le)Q.add(le)},re=(ie,le)=>{let fe=X.filter(([be,Pe])=>/(?:^|:)build(?:$|:)/.test(be)||new RegExp(`\\b${ie} build\\b`).test(Pe)),ce=fe.filter(([,be])=>new RegExp(`(?:^|\\s)${ie}(?:\\s|$)`).test(be));if(!ce.length&&(fe.length||J.workspaces!==void 0))return null;if(fe.some((be)=>!ce.includes(be)&&/--(?:out|dist|root|config|project)|\s-[dpc]\b/.test(be[1])))return null;let de,me=!1;for(let[,be]of ce){if(/[$`\\;|<>\n]/.test(be)||/(?:^|\s)(?:cd|pushd|popd)\s/.test(be))return null;for(let Pe of be.split("&&")){let he=Pe.match(/"[^"\n]*"|'[^'\n]*'|[^\s]+/g)??[];if(he.some((ge)=>/["']/.test(ge)&&!/^(?:"[^"\n]*"|'[^'\n]*')$/.test(ge)))return null;let Ie=he.map((ge)=>ge.replace(/^["']|["']$/g,"")),ye=Ie.indexOf(ie);if(ye<0)continue;if(ye!==0&&!(ye===1&&["npx","bunx"].includes(Ie[0])))return null;let ae=Ie.slice(ye+1);if(ae[0]==="build")ae.shift();let ue;for(let ge=0;ge<ae.length;ge++){let[Ee,...$e]=ae[ge].split("="),Re=$e.length?$e.join("="):void 0;if(!le.includes(Ee)||ue!==void 0)return null;let He=Re??ae[++ge],Oe=ee(He);if(!Oe)return null;ue=Oe}if(me&&ue!==de)return null;me=!0,de=ue}}return de},ne=(ie)=>{let le=[...new Set([...z.rootFiles,...Object.keys(Z)])].filter((fe)=>fe.startsWith(`${ie}.config.`)||ie==="turbo"&&fe==="turbo.json");if(!le.length)return"{}";return le.length===1?Z[le[0]]??null:null},se=(ie,le,fe,ce,de,me,be)=>{let Pe=ne(ie),he=re(ie,de);if(Pe===null||he===null)return;let Ie=me?gt(Pe,null,me):void 0,ye=gt(Pe,le,fe);if(Ie===null||ye===null)return;let ae=Ie===void 0||Ie==="."||Ie==="./"?"":ee(Ie);if(ae===null)return;let ge=ee(he??ye??ce);if(!ge)return;te(ae?`${ae}/${ge}`:ge);for(let Ee of be??[])te(ae?`${ae}/${Ee}`:Ee)};if(Y("vite"))se("vite","build","outDir","dist",["--outDir","--out-dir"],"root");if(Y("next")){let ie=ne("next"),le=ie===null?null:gt(ie,null,"output");if(ie!==null&&(le===void 0||le==="standalone"||le==="export"&&gt(ie,null,"distDir")===void 0))se("next",null,"distDir",".next",[],void 0,le==="export"?["out"]:[])}if(Y("astro"))se("astro",null,"outDir","dist",["--outDir","--out-dir"],"root");if(Y("nuxt")){let ie=ne("nuxt");if(ie!==null&&gt(ie,null,"nitro")===void 0&&gt(ie,null,"extends")===void 0)se("nuxt",null,"buildDir",".nuxt",[],"rootDir",[".output"])}if(Y("turbo"))se("turbo",null,"cacheDir",".turbo",["--cache-dir"]);if(Y("webpack")){let ie=ne("webpack");if(ie!==null&&gt(ie,null,"context")===void 0)se("webpack","output","path","dist",["--output-path"])}if(Y("rollup"))se("rollup","output","dir",void 0,["--dir","-d"]);if(Y("parcel")||Y("parcel-bundler","parcel")){let ie=re("parcel",["--dist-dir"]);if(ie!==null&&J.targets===void 0&&!["main","module","browser"].some((le)=>typeof J[le]==="string"))te(ie??"dist")}if(Y("react-scripts")&&re("react-scripts",[])!==null)te("build");if(Y("typescript","tsc")){let ie=re("tsc",["--outDir"]),le=Object.keys(Z).filter((fe)=>/^tsconfig(?:\.[^/]*)?\.json$/.test(fe));if(ie!==null&&le.length===1&&le[0]==="tsconfig.json"){let fe=Z["tsconfig.json"];if(gt(fe,null,"extends")===void 0&&gt(fe,null,"references")===void 0){let ce=gt(fe,"compilerOptions","outDir");if(ce!==null)te(ie??ce)}}}if(xs(Z)){te("build"),te("dist");for(let ie of z.rootFiles)if(ie.endsWith(".egg-info"))te(ie)}return[...Q].sort()}function xs(z){let J=(z["pyproject.toml"]??"").split(/^\[build-system\]\s*$/m)[1]?.split(/^\[/m)[0]??"";return/^build-backend\s*=\s*["'][^"']+["']/m.test(J)||/(?:from\s+(?:setuptools|distutils.core)\s+import\s+.*\bsetup\b|(?:setuptools|distutils.core)\.setup\s*\()/.test(z["setup.py"]??"")}var We=(z)=>z&&typeof z==="object"&&!Array.isArray(z)?z:{},un=(z)=>Array.isArray(z)?z.filter((J)=>typeof J==="string"):[];function yc(z){let J=[];function V(ae,ue="json"){let ge=z.get(ae);if(!ge)return{};try{if(ue==="yaml")return We(yu(ge,{maxAliasCount:50}));if(ue==="toml")return We(hu(ge));if(ue==="jsonc"){let Ee=[],$e=fu(ge,Ee,{allowTrailingComma:!0});if(Ee.length)throw Error("invalid JSONC");return We($e)}return We(JSON.parse(ge))}catch{return J.push(`Could not parse ${ae}`),{}}}let X=[...z.keys()].sort(),Y=V("package.json"),Z={packageJson:z.get("package.json")??null,rootFiles:X.filter((ae)=>!ae.includes("/")),configFiles:Object.fromEntries(["requirements.txt","pyproject.toml","pnpm-workspace.yaml"].flatMap((ae)=>z.get(ae)?[[ae,z.get(ae)]]:[]))},Q=fc(Z),ee=X.flatMap((ae)=>{let ue=ae.replace(/\/package\.json$/,""),ge=ue!==ae&&(Q.packages.includes(ue)||Q.parents.some(($e)=>ue.startsWith(`${$e}/`)&&!ue.slice($e.length+1).includes("/"))),Ee=z.get(ae);return ge&&Ee?[{dir:ue,packageJson:Ee}]:[]}),te=mc({...Z,workspacePackages:ee}),re=typeof Y.packageManager==="string"?/^(npm|pnpm|yarn|bun)@(.+)$/.exec(Y.packageManager):null,ne=Object.create(null);for(let[ae,ue]of Object.entries(We(Y.engines)))if(typeof ue==="string")ne[ae]=ue;if(re)ne[re[1]]=re[2].split("+")[0];let se=V("composer.json"),ie={...We(se["require-dev"]),...We(se.require)},le={...typeof ie.php==="string"?{constraint:ie.php}:{},extensions:Object.keys(ie).filter((ae)=>ae.startsWith("ext-")).map((ae)=>ae.slice(4)).sort()};for(let[ae,ue]of[[".nvmrc","node"],[".node-version","node"],[".python-version","python"],[".php-version","php"],[".bun-version","bun"]]){let ge=z.get(ae)?.trim();if(ge)ne[ue]=ge}for(let ae of(z.get(".tool-versions")??"").split(/\r?\n/)){let[ue,ge]=ae.replace(/#.*/,"").trim().split(/\s+/);if(ue&&ge)ne[ue==="nodejs"?"node":ue]=ge}for(let ae of[".mise.toml","mise.toml"])for(let[ue,ge]of Object.entries(We(V(ae,"toml").tools)))if(typeof ge==="string"||typeof ge==="number")ne[ue]=String(ge);else J.push(`Unsupported tool version for ${ue} in ${ae}`);let fe=[];for(let ae of X.filter((ue)=>/(^|\/)package.json$/.test(ue))){let ue=ae==="package.json"?Y:V(ae),ge={...We(ue.dependencies),...We(ue.devDependencies)};for(let Ee of["nuxt","next","astro","@sveltejs/kit","vite"])if(Ee in ge)fe.push({path:ae,name:Ee})}for(let[ae,ue]of[["yiisoft/yii2","yii2"],["laravel/framework","laravel"]])if(ae in ie)fe.push({path:"composer.json",name:ue});let ce=new Set,de=Object.create(null);function me(ae,ue){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(ae))return;if(ce.add(ae),/(?:^|_)HOST$/.test(ae)&&typeof ue==="string"&&/^[a-zA-Z0-9_.-]+$/.test(ue))de[ae]=ue}for(let ae of X.filter((ue)=>/(^|\/)\.env\.(example|sample|template)$/.test(ue)))for(let ue of(z.get(ae)??"").split(/\r?\n/)){let ge=/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*?)\s*(?:#.*)?$/.exec(ue);if(ge)me(ge[1],ge[2].replace(/^['"]|['"]$/g,""))}let be=[],Pe=[];for(let ae of X.filter((ue)=>/(^|\/)(?:docker-compose|compose)(?:[.-][^/]*)?\.ya?ml$/.test(ue)))for(let[ue,ge]of Object.entries(We(V(ae,"yaml").services))){let Ee=We(ge),$e=typeof Ee.image==="string"?Ee.image:"",Re=$e.split("/").at(-1)?.split(/[:@]/)[0],He=Re==="mysql"||Re==="mariadb"?"mysql":Re==="postgres"?"postgres":Re==="redis"?"redis":null;if(He)be.push({file:ae,name:ue,kind:He,image:$e});else if(Re!=="traefik"&&Re!=="nginx"&&Re!=="caddy")Pe.push({file:ae,name:ue});for(let[Oe,Fe]of Object.entries(We(Ee.environment)))me(Oe,Fe);for(let Oe of un(Ee.environment)){let Fe=Oe.indexOf("=");me(Fe<0?Oe:Oe.slice(0,Fe),Fe<0?null:Oe.slice(Fe+1))}}let he=X.find((ae)=>ae===".devcontainer/devcontainer.json")??X.find((ae)=>ae==="devcontainer.json"),Ie;if(he){let ae=V(he,"jsonc");for(let ue of[ae.containerEnv,ae.remoteEnv])for(let[ge,Ee]of Object.entries(We(ue)))me(ge,Ee);Ie={...typeof ae.image==="string"?{image:ae.image}:{},services:[...typeof ae.service==="string"?[ae.service]:[],...un(ae.runServices)],ports:Array.isArray(ae.forwardPorts)?ae.forwardPorts.filter((ue)=>Number.isInteger(ue)&&Number(ue)>0&&Number(ue)<=65535):[],commands:[ae.onCreateCommand,ae.updateContentCommand,ae.postCreateCommand,ae.postStartCommand].filter((ue)=>typeof ue==="string")}}let ye=un(Y.workspaces).length?un(Y.workspaces):un(We(Y.workspaces).packages);return ye.push(...un(V("pnpm-workspace.yaml","yaml").packages)),{language:z.has("package.json")?"typescript":z.has("pyproject.toml")||z.has("requirements.txt")?"python":z.has("go.mod")?"go":z.has("Cargo.toml")?"rust":z.has("composer.json")?"php":z.has("Gemfile")?"ruby":"other",commands:te,packageManager:re?{name:re[1],version:re[2]}:te.packageManager?{name:te.packageManager}:null,lockfiles:X.filter((ae)=>/(^|\/)(bun.lockb?|pnpm-lock.yaml|yarn.lock|package-lock.json|composer.lock|uv.lock|poetry.lock|Pipfile.lock|Cargo.lock|Gemfile.lock)$/.test(ae)),toolchain:ne,php:le,workspaces:[...new Set(ye)].sort(),frameworks:fe,turbo:z.has("turbo.json")||"turbo"in We(Y.devDependencies)||"turbo"in We(Y.dependencies),services:be,unsupportedServices:Pe,envKeys:[...ce].sort(),envHosts:de,...Ie?{devcontainer:Ie}:{},warnings:J}}import{createHash as tr}from"node:crypto";import{createReadStream as Au}from"node:fs";import{lstat as Lc,mkdir as Ru,readFile as Qn,readdir as Ou,readlink as Nu,realpath as qr,stat as Hc,writeFile as Fu}from"node:fs/promises";import{basename as Tt,dirname as Lu,isAbsolute as Hu,join as nr,relative as Xn,resolve as Yn,sep as Ns}from"node:path";import{execFile as Mu,spawnSync as Du}from"node:child_process";import Zn from"ignore";import{createReadStream as wu}from"node:fs";import{lstat as mn,mkdtemp as vu,readFile as Ps,readdir as Br,rename as bu,rm as ku,writeFile as Su}from"node:fs/promises";import{join as Ye}from"node:path";import Is from"ignore";function Jn(z,J){if(Array.isArray(J))return J.some((V)=>Jn(z,V));if(!J||z.split("/").some((V)=>V===".git"||V===".hlix"))return!1;return z===J||z.startsWith(`${J}/`)}function Kn(z,J){if(typeof J!=="string")return J?.some((V)=>Kn(z,V))??!1;return Jn(z,J)||J.startsWith(`${z}/`)}function wc(z,J,V,X){let Y=new Map,Z=z.length,Q=0;for(let ne of z){let se=ne.path.indexOf("/"),ie=se<0?ne.path:ne.path.slice(0,se+1),le=Y.get(ie)??{count:0,bytes:0,included:!1};le.count++,le.bytes+=ne.size??0,le.included||=Jn(ne.path,X),Y.set(ie,le),Q+=ne.size??0}let ee=Q>V,te=[...Y].sort(([ne,se],[ie,le])=>Number(se.included)-Number(le.included)||(ee?le.bytes-se.bytes:le.count-se.count)||ne.localeCompare(ie)),re=[];for(let[ne,se]of te){if(Z<=J&&Q<=V)break;re.push(ne),Z-=se.count,Q-=se.bytes}return re}function js(z,J){return J.some((V)=>z===V||V.endsWith("/")&&z.startsWith(V))}function Es(z){return`upload limit; add /${z} to .hlixignore, or try --include ${z.replace(/\/$/,"")}`.slice(0,200)}function vc(z){if(z.length<=5000)return z;return[...z.slice(0,4999),{path:z[4999].path,reason:`${z.length-4999} additional skipped paths (including this path); full list: hlix import --dry-run --json`}]}var Sc="# --- managed by Hlix: safe to edit above/below, this block is regenerated ---",_s="# --- end managed by Hlix ---",gn=new Set(["agent-artifacts",".context",".claude/worktrees"]),Cs=".claude/worktrees";function $s(z){for(let J of gn)if(z===J||z.startsWith(`${J}/`))return!0;return!1}function xc(z){return z===Cs||z.startsWith(`${Cs}/`)}var xu=/(?:^|\/)(?:Makefile|Dockerfile|Containerfile|Justfile|Rakefile|Gemfile)(?:\.[^/]*)?$/i,ju=/\.(?:md|txt|json)$/i,bc=/(?:^|\n)\s*(?:\/\/|\/\*+|\*|#|<!--)\s*(?:@generated\b|generated by\b|do not edit\b)|(?:^|\n)\s*\/\/[#@]\s*sourceMappingURL=/i,kc=/\.(?:log(?:\.\d+)?|tmp|cache|pyc|tsbuildinfo|map)$/i;function qn(z){let J=[...z.matchAll(new RegExp(`^${Sc}\\r?$`,"gm"))],V=[...z.matchAll(new RegExp(`^${_s}\\r?$`,"gm"))];if(!J.length&&!V.length)return{before:z,after:"",managed:""};if(J.length!==1||V.length!==1||V[0].index<J[0].index)return null;let X=J[0].index,Z=V[0].index+_s.length,Q=z.slice(Z).match(/^\r?\n/)?.[0]??"";return{before:z.slice(0,X),after:z.slice(Z+Q.length),managed:z.slice(X,Z)}}function Eu(z,J){let V=z.filter((ee)=>ee.endsWith("/")),X=z.filter((ee)=>!ee.endsWith("/")),Y=new Map,Z=[];for(let ee of X){let te=/\.[^./]+$/.exec(ee)?.[0];if(!te){Z.push(ee);continue}let re=Y.get(te)??[];re.push(ee),Y.set(te,re)}let Q=[];for(let[ee,te]of Y){if(te.length<2){Z.push(te[0]);continue}let re=Pu(te,ee);if(!re){Z.push(...te);continue}if(J.some((se)=>{let ie=se.replace(/^\//,"").replace(/\/$/,"");return ie.length>0&&Is().add(re).ignores(ie)}))Z.push(...te);else Q.push(re)}return[...V,...Q,...Z]}function Pu(z,J){let V=z.map((Z)=>Z.split("/")),X=[],Y=Math.min(...V.map((Z)=>Z.length))-1;for(let Z=0;Z<Y;Z++)if(V.every((Q)=>Q[Z]===V[0][Z]))X.push(V[0][Z]);else break;if(!X.some((Z)=>Z.length>0))return null;return`${X.join("/")}/**/*${J}`}function Ts(z){let J=qn(z);return(J?J.before+`
296
+ `+J.after:z).split(/\r?\n/).filter((V)=>V.startsWith("!")&&V.length>1).map((V)=>V.slice(1))}async function jc(z,J){let V=Ye(z,".hlixignore"),X="";try{let Y=await mn(V).catch((ge)=>{if(ge.code==="ENOENT")return null;throw ge});if(Y&&!Y.isFile())return{warning:"Kept .hlixignore unchanged: managed rules require a regular file."};if(Y)X=await Ps(V,"utf8");let Z=qn(X);if(!Z)return{warning:"Kept .hlixignore unchanged: repair its managed-block markers before refreshing."};let Q=Ts(X),ee=Is().add(Q),te=[],re=[],ne=Is(),se=new Set;for(let ge of J.tracked){let Ee=ge.split("/");while(Ee.length)se.add(Ee.join("/")),Ee.pop()}let ie=0,le=0,fe=()=>ie<30000&&le<268435456,ce=(ge)=>se.has(ge)||Kn(ge,J.includes)||Q.some((Ee)=>{let $e=Ee.replace(/^\//,"").split(/[?*[\\]/)[0];return!$e||$e.startsWith(`${ge}/`)||ee.ignores(`${ge}/`)||ee.ignores(ge)}),de=async(ge,Ee,$e=!1)=>{if(J.signal?.throwIfAborted(),!fe()||ce(ge)||J.protectedPath(ge,Ee))return!1;ie++;let Re=await mn(Ye(z,ge));if(Re.isSymbolicLink())return Ee;if(Re.isDirectory()){let Fe=(await Br(Ye(z,ge))).sort();for(let Qe of Fe){if(Qe===".git")continue;if(!await de(`${ge}/${Qe}`,Ee,$e))return!1}return!0}if(!Re.isFile()||le+Re.size>268435456)return!1;let He="",Oe="";for await(let Fe of wu(Ye(z,ge),{encoding:"utf8",signal:J.signal})){if(le+=Buffer.byteLength(Fe),He.length<4096)He+=Fe.slice(0,4096-He.length);let Qe=Oe+Fe;if(J.protectedContent(ge,Qe))return!1;Oe=Qe.slice(-4096)}return Ee||bc.test(He)||bc.test(Oe)||!xu.test(ge)&&!/^#!|^<\?php/.test(He)&&($e&&ju.test(ge)||kc.test(ge))},me=new Set,be=async(ge,Ee=[],$e=!1)=>{if(J.signal?.throwIfAborted(),!fe())return;let Re=Ye(z,ge),He=await Br(Re,{withFileTypes:!0}),Oe=async(_e)=>He.find((Je)=>Je.name===_e)?.isFile()&&(await mn(Ye(Re,_e))).size<1048576?Ps(Ye(Re,_e),"utf8"):null,Fe=await Oe("package.json"),Qe=await Oe("composer.json"),ht=!1,Me=new Set;try{let _e=JSON.parse(await Oe("composer.lock")??"null");ht=Array.isArray(_e?.packages);for(let Ce of[..._e?.packages??[],..._e?.["packages-dev"]??[]]){if(typeof Ce.name==="string")Me.add(Ce.name);if(Ce.dist?.type==="path")ht=!1}}catch{}try{let _e=JSON.parse(Fe??"{}"),Ce=Array.isArray(_e.workspaces)?_e.workspaces:_e.workspaces?.packages;for(let Je of Array.isArray(Ce)?Ce:[]){if(typeof Je!=="string"||Je.startsWith("!"))continue;let Ot=(ge?`${ge}/`:"")+Je.replace(/^\.\//,"");re.push(Ot),ne.add(Ot)}}catch{}let bn=[Fe,Qe].filter(Boolean).join(`
297
+ `),Et={};for(let _e of He){if(!/^(?:(?:vite|next|nuxt|astro|webpack|rollup)\.config\.[cm]?[jt]s|tsconfig(?:\.[^/]*)?\.json|turbo\.json|pyproject\.toml|setup\.py)$/.test(_e.name))continue;let Ce=await Oe(_e.name);if(Ce!==null)Et[_e.name]=Ce}let kn={packageJson:Fe,rootFiles:He.map((_e)=>_e.name),configFiles:Et};$e||=xs(Et);let Sn=hc(kn);for(let _e of Ss(kn))me.add(ge?`${ge}/${_e}`:_e);let Pt=new Set([...Sn,...Ee]);for(let _e of He.sort((Ce,Je)=>Ce.name<Je.name?-1:Ce.name>Je.name?1:0)){if([".git",".hlix",".hlixignore"].includes(_e.name)||_e.isSymbolicLink())continue;let Ce=ge?`${ge}/${_e.name}`:_e.name;if(/[\n\r\\*?[\]!#]/.test(Ce)||Ce.endsWith(" "))continue;if(ie++,!fe())return;if(_e.isDirectory()){if(Ce===Cs&&!ce(Ce)){te.push(`/${Ce}/`);continue}let Je=[...gn].find((Le)=>Ce===Le||Ce.startsWith(`${Le}/`));if(Je&&_e.name===".agents"){let Le=`/${Je}/**/.agents/`;if(!te.includes(Le))te.push(Le);continue}let Ot=await mn(Ye(z,Ce,".git")).then(()=>J.isRepository(Ce),()=>!1),Nt=gn.has(Ce)||[...gn].some((Le)=>Ce.startsWith(`${Le}/`)),it=J.gitIgnored.directories.some((Le)=>`${Ce}/`.startsWith(Le)),rt=ne.ignores(`${Ce}/`)||re.some((Le)=>Le.split(/[?*[\\]/)[0].startsWith(`${Ce}/`))||bn.includes(_e.name)||/(?:^|\/)(?:src|lib|apps|packages|tests|resources|public)(?:\/|$)/.test(Ce),xn=Ot&&(Nt||it)&&!rt;if(_e.name==="vendor"&&ht)for(let Le of await Br(Ye(z,Ce),{withFileTypes:!0})){if(["autoload.php","composer","bin"].includes(Le.name))continue;if(!Le.isDirectory()){ht=!1;break}for(let Ft of await Br(Ye(z,Ce,Le.name)))if(!Me.has(`${Le.name}/${Ft}`))ht=!1}let jn=Sn.includes(_e.name)&&(_e.name==="node_modules"||_e.name==="vendor"&&ht&&!/"type"\s*:\s*"path"/.test(Qe??"")),En=me.has(Ce)||$e&&_e.name.endsWith(".egg-info");if(((_e.name==="node_modules"||_e.name==="vendor"?jn:Pt.has(_e.name))||gn.has(Ce)&&!rt||["logs","runtime","tmp"].includes(_e.name)||xn||En)&&!ce(Ce)&&await de(Ce,jn||xn||En,Pt.has(_e.name)||gn.has(Ce))){te.push(`/${Ce}/`);continue}if(!Ot&&!["node_modules","vendor"].includes(_e.name))await be(Ce,Pt.has("__pycache__")?["__pycache__"]:[],$e)}else if(_e.isFile()&&(kc.test(_e.name)||(await mn(Ye(z,Ce))).size>J.maxFileBytes)&&!ce(Ce)&&await de(Ce,!1))te.push(`/${Ce}`)}};await be("");let Pe=Eu(te,Q),he=X.includes(`\r
298
+ `)?`\r
299
+ `:`
300
+ `,Ie=[Sc,...Pe.sort(),_s,""].join(he),ae=Z.before+(Z.before&&!Z.before.endsWith(`
301
+ `)?he:"")+Ie+Z.after;if(J.write!==!1&&ae!==X){let ge=await vu(Ye(z,".hlixignore-"));try{let Ee=Ye(ge,"rules");await Su(Ee,ae,{mode:Y?.mode??420});let $e=await mn(V).catch((Re)=>{if(Re.code==="ENOENT")return null;throw Re});if($e?!$e.isFile()||$e.ino!==Y?.ino||$e.dev!==Y?.dev||await Ps(V,"utf8")!==X:Y!==null)return{warning:"Kept .hlixignore unchanged: it changed while generated paths were being checked."};await bu(Ee,V)}finally{await ku(ge,{recursive:!0,force:!0})}}let ue=Pe.every((ge)=>ge.endsWith("/"))?"generated folders":"generated paths";return{rules:Pe,report:`Hlix ignored ${Pe.length} ${ue} — see .hlixignore`}}catch(Y){return J.signal?.throwIfAborted(),{warning:`Kept .hlixignore unchanged: could not safely refresh generated paths (${Y.code??"unreadable"}).`}}}import{readFile as _u}from"node:fs/promises";import{join as Cu}from"node:path";function Iu(z){let J=z.trim();if(!J||/^[|>[{]/.test(J))return null;let V=J.match(/^(["'])([\s\S]*)\1$/);if(!V&&/^["']/.test(J))return null;return(V?V[2].trim():J.replace(/(?:^|\s)#.*$/,"").trim())||null}function Ec(z){let J=z.split(/\r?\n/),V=J.findIndex((Q)=>/^tasks:\s*(?:#.*)?$/.test(Q));if(V===-1)return{tasks:[],partial:/^tasks:\s*\S/m.test(z)};let X=[],Y=!1,Z=-1;for(let Q of J.slice(V+1)){if(!Q.trim()||/^\s*#/.test(Q))continue;let ee=Q.length-Q.trimStart().length,te=Q.match(/^(\s*-(?:\s+|$))(.*)$/);if(te){if(Z!==-1&&ee>=Z)continue;if(X.push({}),Z=te[2]?te[1].length:-1,!te[2])continue}else if(ee===0)break;else if(X.length===0)continue;else if(Z===-1)Z=ee;else if(ee!==Z)continue;let re=(te?te[2]:Q.trim()).match(/^([A-Za-z_][A-Za-z0-9_-]*):\s*(.*)$/);if(!re)continue;let ne=re[1];if(ne!=="name"&&ne!=="before"&&ne!=="init"&&ne!=="command")continue;let se=Iu(re[2]);if(se===null)Y=!0;else X[X.length-1][ne]=se}return{tasks:X,partial:Y}}async function Xt(z,J){try{return await _u(Cu(z,...J.split("/")),"utf8")}catch(V){if(V.code==="ENOENT")return null;throw V}}function Pc(z){try{let J=z.replace(/(^|[^:\\])\/\/.*$/gm,"$1").replace(/\/\*[\s\S]*?\*\//g,"").replace(/,\s*([}\]])/g,"$1");return JSON.parse(J)}catch{return null}}function $t(z){if(typeof z==="string"&&z.trim())return[z.trim()];if(Array.isArray(z))return z.flatMap($t);if(z&&typeof z==="object")return Object.values(z).flatMap($t);return[]}function As(z){if(!z||typeof z!=="object")return[];return Object.keys(z).filter((J)=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(J))}function $u(z,J){let V=new Set,X=[/\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(J)X.push(/\$\{([A-Za-z_][A-Za-z0-9_]*)(?::[-?][^}]*)?\}/g);for(let Y of X)for(let Z of z.matchAll(Y))V.add(Z[1]);return[...V]}function Tu(z,J){if(z.has("bun.lock")||z.has("bun.lockb")||J?.startsWith("bun@"))return"bun install";if(z.has("pnpm-lock.yaml")||J?.startsWith("pnpm@"))return"pnpm install";if(z.has("yarn.lock")||J?.startsWith("yarn@"))return"yarn install";if(z.has("package.json"))return"npm install";return null}function Ic(z){let J=typeof z==="number"?z:Number(z);return Number.isInteger(J)&&J>0&&J<=65535?J:null}function nt(z,J,V){if(!z.some((X)=>X.path===J&&X.kind===V))z.push({path:J,kind:V})}async function _c(z,J,V){let X=[],Y=[],Z=[],Q=[],ee=new Map,te=new Set,re=new Set,ne=[],se={},ie=null,le=0,fe=await Xt(z,".cursor/environment.json");if(fe){nt(X,".cursor/environment.json","cursor");let ye=Pc(fe);if(!ye)ne.push("Could not parse .cursor/environment.json; it remains quarantined.");else{Y.push(...$t(ye.install));let ae=$t(ye.start);if(ae[0])ie=ae[0];if(Array.isArray(ye.terminals))for(let ue of ye.terminals){if(!ue||typeof ue!=="object")continue;let ge=ue;if(typeof ge.command!=="string"||!ge.command.trim())continue;Q.push({name:typeof ge.name==="string"&&ge.name.trim()?ge.name.trim():"Terminal",command:ge.command.trim(),...typeof ge.cwd==="string"&&ge.cwd.trim()?{cwd:ge.cwd.trim()}:{}})}}}let ce=J.has(".devcontainer/devcontainer.json")?".devcontainer/devcontainer.json":J.has("devcontainer.json")?"devcontainer.json":null;if(ce){nt(X,ce,"devcontainer");let ye=Pc(V.get(ce)??await Xt(z,ce)??"");if(!ye)ne.push(`Could not parse ${ce}; it remains quarantined.`);else{Y.push(...$t(ye.onCreateCommand),...$t(ye.updateContentCommand),...$t(ye.postCreateCommand));let ae=$t(ye.postStartCommand);if(!ie&&ae[0])ie=ae[0];for(let ue of As(ye.secrets))te.add(ue);for(let ue of[...As(ye.containerEnv),...As(ye.remoteEnv)])te.add(ue);if(Array.isArray(ye.forwardPorts))for(let ue of ye.forwardPorts){let ge=Ic(ue);if(ge)ee.set(ge,{port:ge,visibility:"private"})}}}if(J.has(".gitpod.yml")){nt(X,".gitpod.yml","gitpod");let ye=V.get(".gitpod.yml")??await Xt(z,".gitpod.yml");if(ye===null)ne.push("Could not read .gitpod.yml; its task commands were not imported.");else{let ae=Ec(ye);le=ae.tasks.filter((ue)=>ue.before).length;for(let ue of ae.tasks){if(ue.before)Y.push(ue.before);if(ue.init)Y.push(ue.init);if(!ue.command)continue;if(!ie)ie=ue.command;else Q.push({name:ue.name??"Terminal",command:ue.command})}if(ae.partial)ne.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 ye of["Dockerfile","docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml"])if(J.has(ye))nt(X,ye,"docker");for(let ye of["project.toml","nixpacks.toml","railpack.json","Aptfile"])if(J.has(ye))nt(X,ye,"buildpack");for(let ye of["fly.toml","railway.json","render.yaml","vercel.json","netlify.toml"])if(J.has(ye))nt(X,ye,"platform");let de=V.get("package.json")??await Xt(z,"package.json");if(de){nt(X,"package.json","package");try{let ye=JSON.parse(de);if(ye.engines?.node)se.node=ye.engines.node;let ae=Tu(J,ye.packageManager);if(ae&&Y.length===le)Y.push(ae);if(ye.scripts?.build&&Z.length===0)Z.push(`${ye.packageManager?.split("@")[0]??(J.has("bun.lock")?"bun":"npm")} run build`);let ue=ye.scripts?.dev?`${J.has("bun.lock")?"bun":"npm"} run dev`:null,ge=ye.scripts?.start?`${J.has("bun.lock")?"bun":"npm"} run start`:ue;if(!ie&&ge)ie=ge}catch{ne.push("Could not parse package.json for environment discovery.")}}if(J.has("uv.lock"))Y.push("uv sync --frozen");else if(J.has("poetry.lock"))Y.push("poetry install --no-interaction");else if(J.has("requirements.txt"))Y.push("python -m pip install -r requirements.txt");if(J.has("go.mod"))Y.push("go mod download");if(J.has("Procfile")){nt(X,"Procfile","procfile");let ae=(V.get("Procfile")??"").split(/\r?\n/).find((ue)=>/^web\s*:/.test(ue));if(ae)ie=ae.replace(/^web\s*:\s*/,"").trim()||ie}let me=[[".node-version","node"],[".nvmrc","node"],[".python-version","python"]];for(let[ye,ae]of me){let ue=(V.get(ye)??await Xt(z,ye))?.trim();if(ue)se[ae]=ue,nt(X,ye,"tool-version")}let be=V.get(".tool-versions")??await Xt(z,".tool-versions");if(be){nt(X,".tool-versions","tool-version");for(let ye of be.split(/\r?\n/)){let[ae,ue]=ye.trim().split(/\s+/,2);if(!ue)continue;if(ae==="nodejs")se.node=ue;else if(ae==="python")se.python=ue;else if(ae==="bun")se.bun=ue}}let Pe=V.get("mise.toml")??await Xt(z,"mise.toml");if(Pe){nt(X,"mise.toml","tool-version");for(let ye of Pe.matchAll(/^\s*(node|python|bun)\s*=\s*["']([^"']+)["']/gm))se[ye[1]]=ye[2]}for(let[ye,ae]of V){let ue=/(?:^|\/)(?:Dockerfile|Procfile)$/i.test(ye)||/\.(?:jsonc?|ya?ml|toml|ini|conf|config|env|sh|bash|zsh|fish)$/i.test(ye);for(let ge of $u(ae,ue))re.add(ge);for(let ge of ae.matchAll(/(?:--port(?:=|\s+)|PORT\s*=\s*)(\d{2,5})/g)){let Ee=Ic(ge[1]);if(Ee)ee.set(Ee,{port:Ee,visibility:"private"})}}if(X.length===0&&J.size>0)nt(X,"repository","detected");let he=(ye)=>[...new Set(ye.filter(Boolean))],Ie=X.length+Y.length+(ie?1:0);return{sources:X.sort((ye,ae)=>ye.path.localeCompare(ae.path)),toolchain:se,install:he(Y),build:he(Z),start:ie,terminals:Q,ports:[...ee.values()].sort((ye,ae)=>ye.port-ae.port),requiredSecretKeys:[...te].sort(),observedSecretKeys:[...re].sort(),confidence:Ie>=4?"high":Ie>=2?"medium":"low",warnings:ne}}var Cc=2;var Mc=300000,Uu=25000,$c=52428800,Dc=524288000,er=1e4,Gu="Potential secrets exist in Git history",Wu="Never delete .git folders or files to get past this; use .hlixignore instead.",zr=1048576,Bu=Dc,Uc=[".git/",".hlix/","node_modules/",".next/",".turbo/",".cache/","dist/","build/","coverage/","__pycache__/",".venv/","venv/","target/",".DS_Store",...cn],wv=Zn().add(Uc);var Ls="Required project environment value was not found locally: ",zu=/(^|\/)\.env\.(example|sample|template)$/i,Ju=/(^|\/)\.env(?:\.[^/]+)?$/i,Ku=/(^|\/)(?:\.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,qu=/\.(?:example|sample|template)$/i,Vu=/(^|\/)\.(?:npmrc|yarnrc(?:\.yml)?|pypirc)$/i,Xu=/(?:^|\/)(?:__tests__|tests?|fixtures)\/|\.(?:test|spec)\.[^/]+$|\.snap$/i,Yu=/\.(?:md|mdx|txt|rst)$/i,Zu=/fake|dummy|example|placeholder|unused|changeme|xxxx|redacted|your[_-]|<[^>]*>/i,Qu=/^(.)\1+$/,em=/RegExp\(/,Hs="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,}",tm=new RegExp(Hs,"g"),nm=/(^|\/)(?:\.mcp\.json|mcp\.json|claude_desktop_config\.json)$/i,rm=/(^|\/)(?:\.agents|\.claude)\/skills\//i,Vn=new Set(["HLIX_AGENT_RUN_ID","HLIX_API_KEY","HLIX_API_URL","HLIX_BASE_URL","HLIX_PROJECT_ID","HLIX_SESSION_TOKEN","HLIX_WORKSPACE_ID"]),Rs="Your hlix credentials were left out of the project's secrets — the platform provides them.",Os=new Set(["CI","HOME","LANG","LOGNAME","NODE_ENV","OLDPWD","PATH","PORT","PWD","SHELL","SHLVL","TERM","TMPDIR","USER","_"]),om=100,Tc=12;function sm(z){let J=z.slice(0,Tc).join(", "),V=z.length-Tc;return z.length===1?`Observed environment reference has no local value: ${z[0]}`:`${z.length} observed environment references have no local value: ${J}${V>0?`, +${V} more`:""}`}var im=250;function At(z){return z.split(Ns).join("/")}function jt(z){if(z>=1048576)return`${(z/1048576).toFixed(1)} MB`;if(z>=1024)return`${(z/1024).toFixed(1)} KB`;return`${z} bytes`}function Ac(z,J=5){return[...z].sort((V,X)=>X.size-V.size||V.path.localeCompare(X.path)).slice(0,J).map((V)=>`${V.path} (${jt(V.size)})`).join(", ")}function am(z,J=5){let V=new Map;for(let X of z){let Y=X.indexOf("/"),Z=Y===-1?".":X.slice(0,Y);V.set(Z,(V.get(Z)??0)+1)}return[...V].sort((X,Y)=>Y[1]-X[1]||X[0].localeCompare(Y[0])).slice(0,J).map(([X,Y])=>`${X}/ (${Y} files)`).join(", ")}function ot(z,J,V=10485760){return Du("git",["-C",z,...J],{encoding:"utf8",timeout:Mc,maxBuffer:V,stdio:["ignore","pipe","pipe"]})}var cm=20;function lm(z){let J=[];for(let V of z.split(`
302
+ `)){if(V.length<4)continue;let X=V.slice(3),Y=X.lastIndexOf(" -> ");if(Y!==-1)X=X.slice(Y+4);if(X.startsWith('"')&&X.endsWith('"'))X=X.slice(1,-1);if(!X)continue;if(J.push(X),J.length>=cm)break}return J}function Vr(z){let J=z.branch?` on ${z.branch}`:"";if(!z.inProgress)return`${z.name}${J}`;let V=z.changes.slice(0,3),X=z.changes.length>V.length?`, +${z.changes.length-V.length} more`:"",Y=V.length?`: ${V.join(", ")}${X}`:"",Z=z.pushed?", already on the remote":"";return`${z.name}${J}, work in progress${Y}${Z}`}function dm(z){return z.startsWith('"')&&z.endsWith('"')?z.slice(1,-1):z}function pm(z){let J=[],V="",X="",Y=null,Z=!1,Q=()=>{if(V&&X&&!Z)J.push({path:V,commit:X,branch:Y});V="",X="",Y=null,Z=!1};for(let ee of z.split(`
303
+ `)){if(!ee){Q();continue}if(ee.startsWith("worktree ")){Q(),V=dm(ee.slice(9));continue}if(ee.startsWith("HEAD ")){X=ee.slice(5).trim();continue}if(ee.startsWith("branch ")){Y=ee.slice(7).trim().replace(/^refs\/heads\//,"");continue}if(ee==="detached"){Y=null;continue}if(ee.startsWith("prunable"))Z=!0}return Q(),J}async function um(z,J){let[V,X]=await Promise.all([i(J,["status","--porcelain"]),i(z,["rev-parse","HEAD"])]),Y=V.status===0?lm(V.stdout):[],Z=!1,Q=X.status===0?X.stdout.trim():"";if(Q){let ee=await i(J,["rev-list","--count",`${Q}..HEAD`]);Z=ee.status===0&&Number(ee.stdout.trim())>0}return{inProgress:Y.length>0||Z,changes:Y,ahead:Z}}function Rc(z){return/^[A-Za-z0-9._/-]+$/.test(z)&&!z.includes("..")&&!z.startsWith("/")&&!z.endsWith("/")}async function mm(z,J,V){if(!Rc(J)||!/^[0-9a-f]{40}$/i.test(V))return!1;let X=await i(z,["remote"]);if(X.status!==0)return!1;for(let Y of X.stdout.split(`
304
+ `)){let Z=Y.trim();if(!Z||!Rc(Z))continue;if((await i(z,["merge-base","--is-ancestor",V,`refs/remotes/${Z}/${J}`])).status===0)return!0}return!1}async function gm(z){let J=await i(z,["worktree","list","--porcelain"]);if(J.status!==0)return{cycles:[],inside:new Set};let V=await qr(z).catch(()=>Yn(z)),X=[],Y=new Set;for(let Z of pm(J.stdout)){let Q=await qr(Z.path).catch(()=>Z.path);if(Q===V)continue;let ee=Xn(V,Q),te=ee!==""&&ee!==".."&&!ee.startsWith(`..${Ns}`)&&!Hu(ee),re=te?ee.split(Ns).join("/"):Q;if(te)Y.add(re);let ne=await um(z,Q),se=Boolean(Z.branch&&Z.commit&&ne.ahead&&await mm(z,Z.branch,Z.commit));X.push({name:Tt(Q),path:re,branch:Z.branch,commit:Z.commit,inProgress:ne.inProgress,changes:ne.changes,pushed:se})}return X.sort((Z,Q)=>Z.path.localeCompare(Q.path)),{cycles:X,inside:Y}}function i(z,J,V={}){return new Promise((X)=>{Mu("git",["-C",z,...J],{encoding:"utf8",timeout:Mc,maxBuffer:V.maxBuffer??10485760,...V.signal?{signal:V.signal}:{}},(Y,Z)=>{let Q=Y?.code;X({status:Y===null?0:typeof Q==="number"?Q:1,stdout:typeof Z==="string"?Z:""})})})}async function fm(z){let J=tr("sha256");for await(let V of Au(z))J.update(V);return J.digest("hex")}function Fs(z){if(Array.isArray(z))return`[${z.map(Fs).join(",")}]`;if(z&&typeof z==="object")return`{${Object.entries(z).sort(([J],[V])=>J.localeCompare(V)).map(([J,V])=>`${JSON.stringify(J)}:${Fs(V)}`).join(",")}}`;return JSON.stringify(z)}function Gc(z){let J={};for(let[V,X]of String(z).replace(/^\uFEFF/,"").split(/\r?\n/).entries()){let Y=X.trim();if(!Y||Y.startsWith("#"))continue;let Q=(Y.startsWith("export ")?Y.slice(7).trimStart():Y).match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);if(!Q)throw Error(`Invalid dotenv assignment on line ${V+1}`);let ee=Q[2]??"";if(ee.startsWith('"')){if(!ee.endsWith('"'))throw Error(`Unclosed dotenv quote on line ${V+1}`);ee=ee.slice(1,-1).replace(/\\n/g,`
305
+ `).replace(/\\r/g,"\r")}else if(ee.startsWith("'")){if(!ee.endsWith("'"))throw Error(`Unclosed dotenv quote on line ${V+1}`);ee=ee.slice(1,-1)}else ee=ee.replace(/\s+#.*$/,"").trimEnd();J[Q[1]]=ee}return J}function hm(z,J){return z.split(/(?<=\n)/).filter((V)=>{let X=V.trim(),Z=(X.startsWith("export ")?X.slice(7).trimStart():X).match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=/)?.[1];return Z===void 0||!J.has(Z)}).join("")}function ym(z){let J=null;for(let V=0;V<z.length;V+=1){let X=z[V];if(X==="\\"&&J!=="single"){if(z[V+1]!=="$")return!0;V+=1;continue}if(X==="'"&&J!=="double"){J=J==="single"?null:"single";continue}if(X==='"'&&J!=="single"){J=J==="double"?null:"double";continue}if(J!=="single"&&(X==="$"||X==="`"))return!0;if(J===null&&(X==="<"||X===">")&&z[V+1]==="(")return!0}return J!==null}function wm(z){let J={},V=new Set,X=new Set;for(let Y of String(z).replace(/^\uFEFF/,"").split(/\r?\n/)){let Z=Y.trim();if(!Z||Z.startsWith("#"))continue;let ee=(Z.startsWith("export ")?Z.slice(7).trimStart():Z).match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);if(!ee)continue;let te=ee[1],re=ee[2]??"";if(V.add(te),ym(re)){delete J[te],X.add(te);continue}try{let se=Gc(`${te}=${re}`)[te];if(se===void 0)throw Error("missing literal");J[te]=re.trimStart().startsWith("'")?se:se.replace(/\\\$/g,"$"),X.delete(te)}catch{delete J[te],X.add(te)}}return{values:J,keys:[...V].sort(),dynamicKeys:[...X].sort()}}async function vm(z){let J=ot(z,["rev-parse","--show-toplevel"]);if(J.status!==0)return!1;try{return await qr(J.stdout.trim())===z}catch{return!1}}function bm(z,J){if(!J)return new Set;let V=ot(z,["ls-files","-z"]);if(V.status!==0)throw Error("Could not enumerate tracked files.");return new Set(V.stdout.split("\x00").filter(Boolean).map(At))}function km(z,J){if(!J)return[];let V=ot(z,["config","--get-regexp","^remote\\..*\\.url$"]);if(V.status!==0)return[];let X=[];for(let Y of V.stdout.split(`
306
+ `)){let Z=Y.trim();if(!Z)continue;let Q=/^remote\.(.*)\.url (.+)$/.exec(Z);if(Q)X.push({name:Q[1],url:Q[2]})}return X}function Sm(z,J){if(!J)return{files:new Set,directories:[]};let V=ot(z,["ls-files","-z","--others","--ignored","--exclude-standard","--directory"]);if(V.status!==0)throw Error("Could not enumerate ignored files.");let X=new Set,Y=[];for(let Z of V.stdout.split("\x00").filter(Boolean)){let Q=At(Z);if(Q.endsWith("/"))Y.push(Q);else X.add(Q)}return{files:X,directories:Y}}async function Oc(z,J){let V=[],X=[],Y=[],Z="";for(let ne of[".gitignore",".hlixignore"])try{let se=nr(z,ne),ie=await Lc(se);if(ne===".gitignore"&&ie.isSymbolicLink()){X.push(ne);continue}if(ie.isFile()||ie.isSymbolicLink())try{if(ie.isSymbolicLink()&&!(await Hc(se)).isFile()){V.push(ne);continue}let le=await Qn(se,"utf8");if(ne===".hlixignore")Z=le;let fe=ne===".hlixignore"?qn(le):null;if(J&&fe?.managed)le=le.replace(fe.managed,J.join(`
307
+ `));Y.push(le)}catch{V.push(ne)}}catch(se){if(se.code!=="ENOENT")V.push(ne)}let Q=qn(Z)?.managed??"",ee=[".git/",".hlix/",...cn],te=Q?ee:Uc,re=Ts(Z);return{hardMatcher:Zn().add(re.length?ee:te),matcher:Zn().add([...te,...Y.flatMap((ne)=>ne.split(/\r?\n/))]),unignored:Zn().add(re),managedMatcher:Zn().add(J??Q),hasManaged:Boolean(Q),negations:re,unreadable:V,symlinked:X}}function Jr(z){if(nm.test(z))return"mcp";if(rm.test(z))return"skill";return null}function Kr(z){if(Ju.test(z)&&!zu.test(z))return"dotenv";if(Ku.test(z))return"credential";return null}function xm(z,J){if(J)return[At(J)];let V=new Map([[".env",0],[".env.development",1],[".env.local",2],[".env.development.local",3]]),X=z.filter((Y)=>V.has(Tt(Y).toLocaleLowerCase("en-US"))).sort((Y,Z)=>Y.slice(0,-Tt(Y).length).localeCompare(Z.slice(0,-Tt(Z).length))||V.get(Tt(Y).toLocaleLowerCase("en-US"))-V.get(Tt(Z).toLocaleLowerCase("en-US")));return X.length>0?X:z.length===1?[...z]:[]}function jm(z,J){try{let V=JSON.parse(J);if(!V.mcpServers||typeof V.mcpServers!=="object")return[];return Object.entries(V.mcpServers).map(([X,Y])=>{let Z=Y&&typeof Y==="object"?Y:{},Q=Z.type==="http"||Z.type==="sse"||Z.type==="stdio"?Z.type:typeof Z.command==="string"?"stdio":typeof Z.url==="string"?"http":"unknown",ee=Z.env&&typeof Z.env==="object"?Z.env:{};return{sourcePath:z,name:X,transport:Q,...typeof Z.command==="string"?{command:Z.command}:{},...Array.isArray(Z.args)&&Z.args.every((te)=>typeof te==="string")?{args:Z.args}:{},...typeof Z.url==="string"?{url:Z.url}:{},envKeys:Object.keys(ee).sort(),enabled:!1}})}catch{return[]}}function Em(z){let J=!1,V=!1;for(let X of z.split(/\r?\n/)){let Y=X.trim();if(!Y||Y.startsWith("#")||Y.startsWith(";")||Y.startsWith("["))continue;let Z=Y.indexOf("=");if(Z===-1)continue;let Q=Y.slice(0,Z).trim().toLowerCase(),ee=Y.slice(Z+1).trim().replace(/^["']|["']$/g,"");if(!ee||/^\$(?:\{[^}]*\}|[A-Za-z_][A-Za-z0-9_]*)$/.test(ee))continue;if(Q.endsWith("_authtoken")||Q.endsWith("_password"))return!0;if(Q.endsWith("password"))V=!0;else if(Q.endsWith("username"))J=!0}return J&&V}async function Pm(z,J,V,X){if(qu.test(V))return!1;if(!Vu.test(V))return!0;let Y=await i(z,["show",`${J}:${V}`],{...X?{signal:X}:{}});return Y.status===0&&Em(Y.stdout)}function Im(z,J,V){let X=z.lastIndexOf("/",J),Y=z.indexOf("/",V);return X!==-1&&Y!==-1&&!/\s/.test(z.slice(X,J)+z.slice(V,Y))}function _m(z){if(Xu.test(z))return"test fixture";if(Yu.test(z))return"documentation or pattern definition";return null}function Cm(z,J){let V=null;for(let X of z.split(/\r?\n/))for(let Y of X.matchAll(J)){let Z=Y[0],Q=Y.index??0,ee=em.test(X)||Im(X,Q,Q+Z.length)?"documentation or pattern definition":Zu.test(Z)||Qu.test(Z)?"placeholder value":null;if(ee===null)return null;V??=ee}return V}async function $m(z,J,V,X){let Y=_m(V);if(Y!==null)return Y;let Z=await i(z,["show",`${J}:${V}`],{...X?{signal:X}:{}});return Z.status===0?Cm(Z.stdout,tm):null}async function Nc(z,J,V){let X=[],Y="unknown";for(let Z of z.split(/\r?\n/)){if(Z.startsWith("@@"))Y=Z.slice(2);else if(Z.trim()){let Q=At(Z.trim());if(await V(Y,Q))X.push({commit:Y,path:Q,reason:J})}if(X.length>=100)break}return X}async function Fc(z,J,V={}){if(!J)return{head:null,branch:null,refs:[],commitCount:0,complete:!0,findings:[],blockingFindings:[],waivedReasons:[]};let X=ot(z,["rev-parse","HEAD"]).stdout.trim()||null,Y=ot(z,["symbolic-ref","--short","-q","HEAD"]),Z=Y.status===0?Y.stdout.trim()||null:null,Q=Number.parseInt(ot(z,["rev-list","--count","--all"]).stdout.trim(),10)||0,ee=ot(z,["for-each-ref","--format=%(refname)%00%(objectname)","refs/heads","refs/tags"]),te=ee.stdout.split(`
308
+ `).filter(Boolean).map((me)=>{let[be,Pe]=me.split("\x00");return{name:be,oid:Pe}}).filter(({name:me,oid:be})=>/^refs\/(?:heads|tags)\/.+/.test(me)&&/^[0-9a-f]{40,64}$/.test(be)).sort((me,be)=>me.name.localeCompare(be.name)),re=V.signal,ne=re?{signal:re}:{};V.onProgress?.(`history: ${Q} commit${Q===1?"":"s"}…`);let se=["log","--all",`--max-count=${er}`,"--pretty=format:@@%H","--name-only"],ie=await i(z,[...se,"--",".env",".env.*","*.pem","*.key",".npmrc","*.tfvars"],ne),le=await i(z,["log","--all",`--max-count=${er}`,"-G",Hs,"--pretty=format:@@%H","--name-only"],ne);re?.throwIfAborted();let fe=new Map;for(let me of[...await Nc(ie.stdout,"sensitive-path",(be,Pe)=>Pm(z,be,Pe,re)),...await Nc(le.stdout,"secret-pattern",async()=>!0)])fe.set(`${me.commit}:${me.path}:${me.reason}`,me);let ce=[...fe.values()].slice(0,100),de=new Map;for(let me of ce){if(me.reason!=="secret-pattern")continue;let be=await $m(z,me.commit,me.path,re);if(be!==null)de.set(me,be)}return V.onProgress?.(`history: ${Q} commit${Q===1?"":"s"} scanned`),{head:X,branch:Z,refs:te,commitCount:Q,complete:Q<=er&&te.length<=1000&&ee.status===0&&ie.status===0&&le.status===0,findings:ce,blockingFindings:ce.filter((me)=>!de.has(me)),waivedReasons:[...de.values()]}}function Tm(z,J){let V=J?.XDG_CACHE_HOME??(J?.HOME?nr(J.HOME,".cache"):null);if(!V)return null;return nr(V,"hlix","history",`${tr("sha256").update(z).digest("hex")}.json`)}async function Am(z,J,V){let X=J?Tm(z,V.environment):null;if(!X)return Fc(z,J,V);let Y=tr("sha256").update([ot(z,["for-each-ref","--format=%(refname)%00%(objectname)"]).stdout,ot(z,["rev-parse","HEAD"]).stdout,ot(z,["symbolic-ref","--short","-q","HEAD"]).stdout,Hs,String(er)].join("\x00")).digest("hex");try{let Q=JSON.parse(await Qn(X,"utf8"));if(Q.key===Y&&Q.history)return V.onProgress?.(`history: ${Q.history.commitCount} commits, unchanged since the last scan`),Q.history}catch{}let Z=await Fc(z,J,V);if(Z.complete)try{await Ru(Lu(X),{recursive:!0,mode:448}),await Fu(X,JSON.stringify({key:Y,history:Z}),{mode:384})}catch{}return Z}async function ft(z,J={}){let V=await qr(Yn(z));if(!(await Hc(V)).isDirectory())throw Error("Import target must be a directory.");let X=await vm(V),Y=km(V,X),Z=bm(V,X),Q=new Set(X?(await i(V,["ls-files","--stage","-z"])).stdout.split("\x00").filter((pe)=>pe.startsWith("160000 ")).map((pe)=>pe.slice(pe.indexOf("\t")+1)):[]),ee=Sm(V,X),te=[...new Set([...c(V)?.includedPaths??[],...J.include?[J.include]:[]].map((pe)=>pe.replace(/^\.\//,"").replace(/\/$/,"")))],re=await Oc(V),ne=J.refreshIgnore||re.hasManaged?await jc(V,{write:J.refreshIgnore===!0,tracked:X?Z:new Set((await i(V,["ls-files","-z"])).stdout.split("\x00").filter(Boolean)),includes:te,gitIgnored:ee,signal:J.signal,maxFileBytes:J.maxFileBytes??$c,isRepository:async(pe)=>{let xe=await i(nr(V,pe),["rev-parse","--show-toplevel"]);return xe.status===0&&Yn(xe.stdout.trim())===Yn(V,pe)},protectedPath:(pe,xe)=>Boolean(Kr(pe)||!xe&&Jr(pe)),protectedContent:(pe,xe)=>Mn(pe,xe)}):void 0,{hardMatcher:se,matcher:ie,unignored:le,managedMatcher:fe,unreadable:ce,symlinked:de,negations:me}=ne?await Oc(V,ne.rules??[]):re,be=me.some((pe)=>{let xe=pe.replace(/^\//,"");return xe===".claude/worktrees"||xe.startsWith(".claude/worktrees/")}),Pe=ce.length?`Upload left unchanged: cannot read ${ce.join(", ")}; check the ignore file target and permissions before retrying.`:void 0,he=[],Ie=[],ye=[],ae=[],ue=[],ge=[],Ee=[],$e=[],Re=J.envFile?At(Xn(V,Yn(V,J.envFile))):void 0,He=Re!==void 0&&Re!==""&&Re!==".."&&!Re.startsWith("../");if(J.envFile&&!He)$e.push(`Selected environment file must stay inside the project: ${J.envFile}`);let Oe=new Map,Fe=new Map,Qe=new Map,ht=new Map,Me=ne?.warning?[ne.warning]:[],bn=new Set,Et=[],kn=[],Sn=new Set,Pt=[],_e=new Map,Ce=J.maxFiles??Uu,Je=J.maxFileBytes??$c,Ot=J.maxTotalBytes??Dc,Nt=J.maxProtectedTotalBytes??Bu,it=J.historyMode==="sanitize",rt=0,xn=0,jn=async(pe,xe=!1)=>{let De=await Ou(pe,{withFileTypes:!0}).catch((Ke)=>{let Ve=At(Xn(V,pe))||"repository";if(Ee.push({path:Ve,reason:`Cannot read folder (${Ke.code??"unreadable"}); check read and search permissions`}),Me.push(`Cannot read folder ${Ve}; check its read and search permissions. Existing cloud files are preserved.`),pe===V)Pe="Upload left unchanged: cannot read the project folder; check its permissions.";return[]});De.sort((Ke,Ve)=>Ke.name.localeCompare(Ve.name));for(let Ke of De){if(J.signal?.throwIfAborted(),xn+=1,xn%im===0)J.onProgress?.(`scanning … ${he.length} files`);let Ve=nr(pe,Ke.name),ke=At(Xn(V,Ve));if(Ke.name===".git"){if(ke!==".git"&&!xe)bn.add(At(Xn(V,pe)));continue}if(ke.length>1000||ke.includes("\\")||ke.includes("\x00")){Me.push(`Skipped a path that cannot be represented safely: ${ke.slice(0,350)}`);continue}try{let Be=await Lc(Ve),Yt=Ke.isDirectory()?`${ke}/`:ke,Ri=Z.has(ke)&&!Q.has(ke),In=Jn(ke,te)||le.ignores(Yt),Zt=!In&&!Ri&&(ie.ignores(Yt)||ee.files.has(ke)||ee.directories.some((Ne)=>Yt.startsWith(Ne))),Oi=!Kn(ke,te)&&se.ignores(Yt);if(Oi){if(ke!==".hlix")Ee.push({path:ke,reason:"built-in ignore"});continue}if(Zt&&fe.ignores(Yt))Ee.push({path:ke,reason:"Hlix-managed ignore"});if(Be.isSymbolicLink()){if(Zt)continue;if(Ie.push({path:ke,target:await Nu(Ve)}),Jr(ke)||Kr(ke))ye.push(ke);continue}if(Ke.isDirectory()){if(Sn.has(ke)&&!In)continue;if(xc(ke)&&!In&&!be){if(!(Zt&&fe.ignores(Yt)))Ee.push({path:ke,reason:"Hlix-managed ignore"});continue}if($s(ke)&&Ke.name===".agents"&&!In){Ee.push({path:ke,reason:"Hlix-managed ignore"});continue}if(Oi)continue;if(Q.has(ke)&&!Zt)bn.add(ke);await jn(Ve,Zt);continue}let Lt=Jr(ke),Qt=Kr(ke);if(Lt&&$s(ke)&&!In){Ee.push({path:ke,reason:"Hlix-managed ignore"});continue}if(Zt&&!Lt&&!Qt)continue;if(!Ke.isFile()){Ee.push({path:ke,reason:"non-regular-file"});continue}if(Be.size>Je&&!Lt&&!Qt){Ee.push({path:ke,reason:Es(ke)});continue}if(Be.size>Je){$e.push(`File ${ke} is ${jt(Be.size)}, over the ${jt(Je)} per-file limit. Exclude it with .hlixignore.`);continue}let _n=await fm(Ve);if(Lt){if(Be.size>zr){$e.push(`Protected configuration ${ke} is ${jt(Be.size)}, over the ${jt(zr)} per-file limit. Move the large content out of it, or exclude it with .hlixignore.`);continue}let Ne=await Qn(Ve);if(rt+=Ne.byteLength,Pt.push({path:ke,size:Ne.byteLength}),rt>Nt)continue;if(ue.push({path:ke,kind:Lt,size:Be.size,sha256:_n}),Et.push({path:ke,kind:Lt,contentBase64:Ne.toString("base64")}),Lt==="mcp")ge.push(...jm(ke,Ne.toString("utf8")));continue}if(Qt){if(Be.size>zr){$e.push(`Protected file ${ke} is ${jt(Be.size)}, over the ${jt(zr)} per-file limit. Move the large content out of it, or exclude it with .hlixignore.`);continue}let Ne=await Qn(Ve);if(rt+=Ne.byteLength,Pt.push({path:ke,size:Ne.byteLength}),rt>Nt)continue;let en=[],Cn=new Set;if(Qt==="dotenv")try{let lr=Gc(Ne),tn={};for(let[It,nn]of Object.entries(lr)){if(Vn.has(It)){Cn.add(It);continue}tn[It]=nn}Oe.set(ke,tn),en=Object.keys(tn).sort()}catch{$e.push(`Could not parse environment file: ${ke}`)}else if(Tt(ke)===".envrc"){let lr=wm(Ne),tn={},It=new Set,nn=[];for(let[Xe,Ll]of Object.entries(lr.values)){if(Vn.has(Xe)){Cn.add(Xe);continue}if(Os.has(Xe)){Me.push(`Ignored ambient runtime assignment in ${ke}: ${Xe}`);continue}It.add(Xe),tn[Xe]=Ll}Fe.set(ke,tn);for(let Xe of lr.dynamicKeys){if(Vn.has(Xe)){Cn.add(Xe);continue}if(Os.has(Xe)){Me.push(`Ignored ambient runtime assignment in ${ke}: ${Xe}`);continue}It.add(Xe),nn.push(Xe)}if(Qe.set(ke,[...It].sort()),ht.set(ke,nn.sort()),en=[...It].sort(),nn.length>0)Me.push(`Did not execute dynamic .envrc assignments; collect their resolved local values when available: ${nn.join(", ")}`)}if(Cn.size>0)Me.push(Rs),Ne=Buffer.from(hm(Ne.toString("utf8"),Cn),"utf8"),_n=tr("sha256").update(Ne).digest("hex");ae.push({path:ke,kind:Qt,keys:en,size:Ne.byteLength,sha256:_n}),Et.push({path:ke,kind:Qt,contentBase64:Ne.toString("base64")});continue}if(Be.size<=1048576){let Ne=await Qn(Ve),en=Ne.toString("utf8");if(_e.set(ke,en),Mn(ke,en)){if(rt+=Ne.byteLength,Pt.push({path:ke,size:Ne.byteLength}),rt>Nt)continue;ae.push({path:ke,kind:"detected-content",keys:[],size:Be.size,sha256:_n}),Et.push({path:ke,kind:"detected-content",contentBase64:Ne.toString("base64")});continue}}he.push({path:ke,size:Be.size,sha256:_n,tracked:Ri,executable:(Be.mode&73)!==0})}catch(Be){if(J.signal?.throwIfAborted(),Kr(ke)||Jr(ke))throw Be;Ee.push({path:ke,reason:`Cannot read file (${Be.code??"unreadable"})`})}}},En=await gm(V);kn.push(...En.cycles);for(let pe of En.inside)Sn.add(pe);await jn(V);let Pn=wc([...he,...Ie],Math.max(0,Ce-ae.length-ue.length),Ot,te);if(Pn.length)he=he.filter((pe)=>!js(pe.path,Pn)),Ie=Ie.filter((pe)=>!js(pe.path,Pn)),Ee.push(...Pn.map((pe)=>({path:pe.replace(/\/$/,""),reason:Es(pe)})));if(J.onProgress?.(`scanning … ${he.length} files`),J.onProgress?.(`secrets: ${ae.length+ue.length} files`),J.signal?.throwIfAborted(),ye.length>0){let pe=ye.slice(0,5).join(", "),xe=ye.length-5;Me.push(`Imported as symlinks, so no content was read or uploaded for them and the cloud recreates the link: ${pe}${xe>0?`, +${xe} more`:""}`)}for(let pe of de)Me.push(`Ignore file ${pe} is a symlink, so its rules were not applied. Replace it with a regular file inside the project.`);if(Pe)Me.push(Pe);if(rt>Nt)$e.push(`Protected project files total ${jt(rt)}, over the ${jt(Nt)} limit. Largest: ${Ac(Pt)}. Move large assets out of skill and config folders, or add them to .hlixignore.`);if(ae.length>2000)$e.push(`Project has ${ae.length} environment and credential files, over the 2000 limit. Largest: ${Ac(ae)}. Exclude the ones the cloud project does not need with .hlixignore.`);if(ue.length>5000)$e.push(`Project has ${ue.length} agent, skill and MCP files, over the 5000 limit. Largest folders: ${am(ue.map((pe)=>pe.path))}. Exclude the ones the cloud project does not need with .hlixignore.`);he.sort((pe,xe)=>pe.path.localeCompare(xe.path)),Ie.sort((pe,xe)=>pe.path.localeCompare(xe.path)),ae.sort((pe,xe)=>pe.path.localeCompare(xe.path)),ue.sort((pe,xe)=>pe.path.localeCompare(xe.path)),ge.sort((pe,xe)=>`${pe.sourcePath}:${pe.name}`.localeCompare(`${xe.sourcePath}:${xe.name}`));let Le=xm([...Oe.keys()].sort(),He?Re:void 0);if(J.envFile&&He&&!Oe.has(Le[0]))$e.push(`Selected environment file was not found or is not a dotenv file: ${J.envFile}`);let Ft=new Map;for(let[pe,xe]of Oe)for(let De of Object.keys(xe))Ft.set(De,[...Ft.get(De)??[],pe]);for(let[pe,xe]of Qe)for(let De of xe)Ft.set(De,[...Ft.get(De)??[],pe]);let Tl=[...Ft].filter(([,pe])=>pe.length>1).map(([pe,xe])=>({key:pe,paths:xe.sort()})).sort((pe,xe)=>pe.key.localeCompare(xe.key)),yt={};for(let pe of Le)Object.assign(yt,Oe.get(pe)??{});let Al=[...Fe.keys()].sort((pe,xe)=>{if(pe===".envrc")return 1;if(xe===".envrc")return-1;return pe.localeCompare(xe)}),so=new Set;for(let pe of Al){let xe=new Set(ht.get(pe)??[]);for(let De of Qe.get(pe)??[]){if(xe.has(De)){delete yt[De],so.add(De);continue}let Ke=Fe.get(pe)?.[De];if(Ke!==void 0)yt[De]=Ke;so.delete(De)}}for(let pe of bn)Me.push(`${pe} has its own Git repository — uploaded as files, its history not included`);let Rl=J.historyMode==="abort_on_findings"?"abort_on_findings":"preserve";if(it)Me.push("Git history omitted; uploading a snapshot of the current files.");let et=await Am(V,X,J);if(!et.complete)Me.push(`Git history scan exceeded ${er} commits or failed; history is preserved, but the findings may be incomplete.`);if(X&&!et.head)it=!0,Me.push("Git has no readable HEAD; uploading the current files as a snapshot.");let _i=et.waivedReasons;for(let pe of[...new Set(_i)].sort()){let xe=_i.filter((Ke)=>Ke===pe).length,De=xe===1;Me.push(`${xe} Git history finding${De?"":"s"} did not block this import — ${pe}, not ${De?"a real credential":"real credentials"}; --history preserve is not needed for ${De?"it":"them"}.`)}if(et.blockingFindings.length>0){let pe=et.blockingFindings.length;Me.unshift([`${Gu} (${pe} finding${pe===1?"":"s"}${pe>5?", first 5 shown":""}); ${it?"history is omitted":"history is preserved"}:`,...et.blockingFindings.slice(0,5).map((xe)=>` ${xe.commit.slice(0,7)} ${xe.path} — ${xe.reason}`)," To exclude old commits, use --history sanitize; local Git history stays intact."].join(`
309
+ `))}let Ci=new Set(he.map((pe)=>pe.path)),Ol=await _c(V,Ci,_e),{observedSecretKeys:Nl,...at}=Ol;at.warnings.unshift(...Me);let cr=new Set(at.requiredSecretKeys);for(let pe of so)cr.add(pe);for(let pe of ge)for(let xe of pe.envKeys)cr.add(xe);for(let pe of Vn)if(cr.delete(pe))at.warnings.push(Rs);at.requiredSecretKeys=[...cr].sort();for(let pe of at.requiredSecretKeys){if(yt[pe]!==void 0)continue;let xe=J.environment?.[pe];if(xe===void 0){$e.push(`${Ls}${pe}`);continue}yt[pe]=xe}let io=[];for(let pe of Nl){if(Vn.has(pe)){at.warnings.push(Rs);continue}if(Os.has(pe))continue;if(yt[pe]!==void 0)continue;let xe=J.environment?.[pe];if(xe===void 0){io.push(pe);continue}yt[pe]=xe}if(io.length>0)at.warnings.push(sm(io.sort()));at.warnings=[...new Set(at.warnings.flatMap((pe)=>pe.split(`
310
+ `)))].map((pe)=>pe.slice(0,500)).slice(0,om);let $i=yc(new Map([...Ci].map((pe)=>[pe,_e.get(pe)??null]))),Ti={schemaVersion:Cc,rootName:J.rootName??Tt(V),stack:$i.language,git:{detected:X&&!it,head:it?null:et.head,branch:it?null:et.branch,refs:it?[]:et.refs,commitCount:it?0:et.commitCount,historyScanComplete:et.complete,historyMode:Rl},files:he,symlinks:Ie,secretFiles:ae,activeEnvFiles:Le,secretKeys:Object.keys(yt).sort(),envCollisions:Tl,quarantinedResources:ue,mcpServers:ge,historicalSecretFindings:et.blockingFindings,skipped:vc(Ee),environment:at,totals:{files:he.length,bytes:he.reduce((pe,xe)=>pe+xe.size,0)}},Ai=Fs(Ti),Fl=tr("sha256").update(Ai).digest("hex");return{root:V,includedPaths:te,ignoreReport:J.refreshIgnore?ne?.report??ne?.warning:void 0,uploadWarning:Pe,stackFacts:$i,manifest:Ti,...Ee.length>5000?{skippedEntries:Ee}:{},manifestJson:Ai,manifestSha256:Fl,secretValues:yt,protectedFiles:Et.sort((pe,xe)=>pe.path.localeCompare(xe.path)),blocking:[...new Set($e)].map((pe)=>`${pe}
311
+ ${Wu}`),blockingHistoryFindings:[],gitRemotes:Y,cycles:kn}}var Ms={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(z){if(z.args.length>1)throw Error("init accepts at most one folder.");let J=await Rm(Om(z.cwd,z.args[0]??"."));await g(z,{cwd:J,flags:z.flags});let V=r({env:z.env,flags:z.flags,cwd:J});if(V.conflict)throw new e("workspace_mismatch",V.conflict);if(!V.workspaceId)throw Error("No workspace selected. Run `hlix login --workspace <id>` first.");let X=z.requireClient(J);await X.projects.list();let Y=mt(J);if(Y.error)throw new e("invalid_project_file",Y.error);let Z=ln(Y.base),Q=Z?null:Nr(J),ee=Z??Q;if(Q&&(Q.workspaceId!==V.workspaceId||!Nm(Q.apiUrl,V.baseUrl)))throw new e("workspace_mismatch",`This folder is bound to workspace ${Q.workspaceId} at ${Q.apiUrl}; refusing to bind it to ${V.workspaceId} at ${V.baseUrl}.`);let te=typeof z.flags.project==="string"?z.flags.project:void 0;if(te&&ee?.projectId&&ee.projectId!==te)throw new e("workspace_mismatch",`This folder is bound to project ${ee.projectId}; refusing to rebind it to ${te}.`);if(te)await X.projects.get(te);let re=te??ee?.projectId,ne={schemaVersion:1,workspaceId:V.workspaceId,apiUrl:V.baseUrl,...re?{projectId:re}:{}},se={workspace:ne.workspaceId,api:ne.apiUrl,...ne.projectId?{project:ne.projectId}:{}};Fr(J),await kr(J);let ie=await ft(J,{environment:z.env,refreshIgnore:!0});if(!Sr(J,Dn(ie.manifest.environment,se,void 0,Er(J,ie.stackFacts))).written)jr(J,se);if(Q)Sa(J,Q);let fe={root:J,config:ne,ignoreReport:ie.ignoreReport,scan:{files:ie.manifest.totals.files,bytes:ie.manifest.totals.bytes,secretFiles:ie.manifest.secretFiles.map((ce)=>ce.path),quarantinedResources:ie.manifest.quarantinedResources.map((ce)=>ce.path),blocking:ie.blocking,cycles:ie.cycles}};if(z.json)z.stdout(Se(je(Ms.name,fe)));else{if(ie.ignoreReport)z.stdout(`${ie.ignoreReport}
313
+ `);if(z.stdout(`Initialized ${J}
314
+ Project: ${ne.projectId??"not imported yet"}
315
+ Workspace: ${ne.workspaceId}
316
+ `),ie.cycles.length)z.stdout(`${ie.cycles.map((ce)=>`Cycle: ${Vr(ce)}
317
+ `).join("")}`);if(ie.blocking.length)z.stdout(`
318
+ Review before import:
319
+ ${ie.blocking.map((ce)=>`- ${ce}`).join(`
320
+ `)}
321
+ `)}return 0}};function Nm(z,J){return z.replace(/\/+$/,"")===J.replace(/\/+$/,"")}import{basename as mg,resolve as gg}from"node:path";import{realpath as fg}from"node:fs/promises";import{mkdtemp as og,rm as eo,readFile as sg,writeFile as ig,chmod as ag,symlink as cg,lstat as lg}from"node:fs/promises";import{tmpdir as dg}from"node:os";import{join as Gs}from"node:path";import{createHash as Fm}from"node:crypto";import{createReadStream as Lm}from"node:fs";import{chmod as Wc,copyFile as Hm,lstat as Mm,mkdir as Ds,mkdtemp as Dm,readdir as Um,readlink as Gm,rm as Us,symlink as Wm}from"node:fs/promises";import{tmpdir as Bm}from"node:os";import{dirname as Bc,join as Rt}from"node:path";import{spawnSync as Xr}from"node:child_process";var Yr=300000;function st(z,J){let V=Xr("git",["-c","core.hooksPath=/dev/null","-C",z,...J],{encoding:"utf8",timeout:Yr,maxBuffer:20971520,stdio:["ignore","pipe","pipe"]});if(V.status!==0){let X=V.stderr.trim().split(`
322
+ `).at(-1)??"git command failed";throw Error(X)}return V.stdout.trim()}async function zm(z){let J=Fm("sha256");for await(let V of Lm(z))J.update(V);return J.digest("hex")}async function Jm(z){for(let J of await Um(z)){if(J===".git")continue;await Us(Rt(z,J),{recursive:!0,force:!0})}}async function zc(z){if(z.manifest.git.detected&&(z.manifest.historicalSecretFindings.length||!z.manifest.git.historyScanComplete))throw Error("Git history has secrets or could not be fully scanned. Use --history sanitize to import current files.");if(z.uploadWarning)throw Error(z.uploadWarning);if(z.blocking.length>0)throw Error(`Project scan has blocking findings:
323
+ - ${z.blocking.join(`
324
+ - `)}`);let J=await Dm(Rt(Bm(),"hlix-snapshot-"));await Wc(J,448);let V=Rt(J,"repo"),X=Rt(J,"source.git");try{if(z.manifest.git.detected){let ee=Xr("git",["clone","--mirror","--no-hardlinks",z.root,X],{encoding:"utf8",timeout:Yr,stdio:["ignore","pipe","pipe"]});if(ee.status!==0)throw Error(ee.stderr.trim()||"Could not mirror repository.");let te=new Map(st(X,["for-each-ref","--format=%(refname)%00%(objectname)","refs/heads","refs/tags"]).split(`
325
+ `).filter(Boolean).map((ne)=>ne.split("\x00",2)));for(let ne of z.manifest.git.refs)if(te.get(ne.name)!==ne.oid)throw Error(`Git ref changed after scan: ${ne.name}`);let re=Xr("git",["clone","--no-hardlinks",X,V],{encoding:"utf8",timeout:Yr,stdio:["ignore","pipe","pipe"]});if(re.status!==0)throw Error(re.stderr.trim()||"Could not create snapshot clone.");if(!z.manifest.git.head)throw Error("Git repository has no HEAD commit.");st(V,["checkout","-B","main",z.manifest.git.head])}else await Ds(V,{recursive:!0,mode:448}),st(V,["init","-b","main"]);await Jm(V);for(let ee of z.manifest.files){let te=Rt(z.root,...ee.path.split("/")),re=await Mm(te);if(!re.isFile()||re.isSymbolicLink())throw Error(`Source changed after scan: ${ee.path}`);if(re.size!==ee.size||await zm(te)!==ee.sha256)throw Error(`Source changed after scan: ${ee.path}`);let ne=Rt(V,...ee.path.split("/"));await Ds(Bc(ne),{recursive:!0,mode:493}),await Hm(te,ne),await Wc(ne,ee.executable?493:420)}for(let ee of z.manifest.symlinks){let te=Rt(z.root,...ee.path.split("/"));if(await Gm(te).catch(()=>null)!==ee.target)throw Error(`Source changed after scan: ${ee.path}`);let re=Rt(V,...ee.path.split("/"));await Ds(Bc(re),{recursive:!0,mode:493}),await Wm(ee.target,re)}st(V,["config","user.name","Hlix Import"]),st(V,["config","user.email","import@hlix.ai"]),st(V,["read-tree","--empty"]),st(V,["add","--force","-A"]),st(V,["commit","--allow-empty","-m","chore(hlix): import snapshot"]);let Y=st(V,["rev-parse","HEAD"]),Z=new Set(z.manifest.git.refs.map((ee)=>ee.name));for(let ee of st(V,["for-each-ref","--format=%(refname)","refs/heads","refs/tags"]).split(`
326
+ `).filter(Boolean))if(ee!=="refs/heads/main"&&!Z.has(ee))st(V,["update-ref","-d",ee]);let Q=z.manifest.git.refs.filter((ee)=>ee.name!=="refs/heads/main");if(Q.length>0){let ee=Xr("git",["-C",V,"update-ref","--stdin"],{encoding:"utf8",timeout:Yr,input:Q.map((te)=>`update ${te.name} ${te.oid}`).join(`
327
+ `)+`
328
+ `,stdio:["pipe","pipe","pipe"]});if(ee.status!==0)throw Error(ee.stderr.trim()||"Could not recreate the approved Git refs.")}return{directory:V,commitSha:Y,dispose:()=>Us(J,{recursive:!0,force:!0})}}catch(Y){throw await Us(J,{recursive:!0,force:!0}),Y}}import{lstat as Kc,mkdir as Km,realpath as qm}from"node:fs/promises";import{dirname as Vm,join as Xm,relative as Ym,resolve as Zm,sep as Jc}from"node:path";function qc(z,J){let V=z;if(typeof V==="string")try{V=JSON.parse(V)}catch{return[]}if(!V||typeof V!=="object")return[];let X=V[J];if(!Array.isArray(X))return[];return X.filter((Y)=>!!Y&&typeof Y==="object")}function Vc(z){return qc(z,"files").flatMap((J)=>typeof J.path==="string"&&typeof J.sha256==="string"?[{path:J.path,sha256:J.sha256}]:[])}function Xc(z){return qc(z,"symlinks").flatMap((J)=>typeof J.path==="string"&&typeof J.target==="string"?[{path:J.path,target:J.target}]:[])}async function rr(z,J,V){let X=await qm(z),Y=Zm(X,...J.split("/"));if(Y!==X&&!Y.startsWith(X+Jc))throw Error(`Protected path escapes the project: ${J}`);let Z=Ym(X,Vm(Y)),Q=X;for(let ee of Z.split(Jc).filter(Boolean)){Q=Xm(Q,ee);try{let te=await Kc(Q);if(te.isSymbolicLink()&&V){V.push(Q);break}if(!te.isDirectory()||te.isSymbolicLink())throw Error(`Protected path crosses a non-directory: ${J}`)}catch(te){if(te.code!=="ENOENT")throw te;if(!V)await Km(Q,{mode:448})}}return Y}async function Yc(z,J,V){let X=V.length,Y=await rr(z,J,V);if(V.length>X)return;try{let Z=await Kc(Y);if(Z.isSymbolicLink()){V.push(Y);return}if(!Z.isFile())throw Error(`Refusing to replace non-regular project file: ${J}`)}catch(Z){if(Z.code!=="ENOENT")throw Z}}import{spawnSync as Qm}from"node:child_process";import{mkdtemp as eg,writeFile as tg,rm as ng}from"node:fs/promises";import{tmpdir as rg}from"node:os";import{join as Zc}from"node:path";function Zr(z,J,V){let X=Qm("git",["-c","core.hooksPath=/dev/null","-C",z,...J],{encoding:"utf8",timeout:120000,maxBuffer:41943040,env:{PATH:process.env.PATH,GIT_CONFIG_GLOBAL:V??"/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(X.status!==0)throw Error("HLIX Repos Git operation failed. The remote may have changed; refresh and retry.");return X.stdout.trim()}async function Qr(z,J){let V=new URL(z.cloneUrl);if(V.href!==z.cloneUrl||/[\r\n"\\]/.test(z.cloneUrl)||V.protocol!=="https:"||V.username||V.password||V.search||V.hash||V.port||!(V.hostname==="github.com"||/^[a-f0-9]{32}\.artifacts\.cloudflare\.net$/.test(V.hostname)))throw Error("Invalid HLIX Repos remote");if(/[\r\n]/.test(z.token))throw Error("Invalid repository credential");let X=await eg(Zc(rg(),"hlix-git-auth-")),Y=Zc(X,"config"),Z=z.token.replace(/\?expires=\d+$/,""),Q=Buffer.from(`x-access-token:${Z}`).toString("base64");try{return await tg(Y,`[http "${z.cloneUrl}"]
329
+ extraHeader = Authorization: Basic ${Q}
330
+ followRedirects = false
331
+ `,{mode:384}),await J(Y)}finally{await ng(X,{recursive:!0,force:!0})}}function fn(z){return new Map([...Vc(z).map((J)=>[J.path,`blob:${J.sha256}`]),...Xc(z).map((J)=>[J.path,`link:${J.target}`])])}var Qc={git:Zr,access:Qr};async function hn(z){let J=t(z);if(!J?.config.projectId)throw new e("not_initialized","Run hlix import or hlix init to bind this folder to a project.");return{...J,state:c(J.root)}}async function el(z,J){let V=await ft(z,{environment:J,historyMode:"sanitize",maxFiles:50000,maxFileBytes:33554432,maxTotalBytes:1073741824});if(V.manifest.files=V.manifest.files.filter((X)=>X.path!==".hlixignore"),V.blocking.length)throw new e("scan_blocked",V.blocking.join(`
332
+ `));return V}function pg(z,J){let V=Object.fromEntries(fn(z.manifest));return!J?.files?z.manifest.files.length+z.manifest.symlinks.length>0:JSON.stringify(Object.entries(V).sort())!==JSON.stringify(Object.entries(J.files).sort())}async function Ws(z,J,V){let X=await z.projects.get(J),Y=V?X.repos.find((Z)=>Z.id===V):X.repos.find((Z)=>Z.isPrimary)??(X.repos.length===1?X.repos[0]:void 0);if(!Y)throw new e("conflict","Select a primary repository for this project before syncing.");return Y}async function Bs(z,J,V,X,Y=!1,Z=Qc){let{config:Q,state:ee}=await hn(z),te=await Ws(J,Q.projectId,ee?.repoId),re=await J.repos.head(Q.projectId,te.id);if((X??ee?.commitSha)&&re.commitSha!==(X??ee?.commitSha))throw new e("conflict","HLIX Repos changed. Pull or sync before pushing.");let ne=await zc(V);try{let se=await J.repos.access(Q.projectId,te.id,"write"),ie=await Z.access(se,async(le)=>{Z.git(ne.directory,["fetch","--no-tags",se.cloneUrl,`refs/heads/${te.defaultBranch}`],le);let fe=Z.git(ne.directory,["rev-parse","FETCH_HEAD"]);if(fe!==re.commitSha)throw new e("conflict","HLIX Repos changed during upload. Retry sync.");let ce=Z.git(ne.directory,["rev-parse",`${ne.commitSha}^{tree}`]),de=Z.git(ne.directory,["commit-tree",ce,"-p",fe,...Y&&V.manifest.git.detected?["-p",ne.commitSha]:[],"-m","Update HLIX Repos files"]);return Z.git(ne.directory,["push",`--force-with-lease=refs/heads/${te.defaultBranch}:${fe}`,se.cloneUrl,`${de}:refs/heads/${te.defaultBranch}`],le),de});return ns(z,{schemaVersion:1,repoId:te.id,commitSha:ie,files:Object.fromEntries(fn(V.manifest)),snapshotOnly:!0,rootName:V.manifest.rootName}),{action:"push",commitSha:ie}}finally{await ne.dispose()}}async function ug(z,J,V,X,Y,Z){let{config:Q}=await hn(z),ee=await Ws(J,Q.projectId,V),te=await og(Gs(dg(),"hlix-pull-"));try{let re=await J.repos.access(Q.projectId,V,"read");await Z.access(re,async(de)=>{Z.git(te,["init"]),Z.git(te,["fetch","--no-tags",re.cloneUrl,`refs/heads/${ee.defaultBranch}`],de),Z.git(te,["checkout","--detach",X])});let ne=await el(te),se=[],ie=[...ne.manifest.files,...ne.manifest.symlinks],le=[...Y.manifest.files,...Y.manifest.symlinks].filter((de)=>!ie.some((me)=>me.path===de.path)),fe=new Set([...Y.manifest.files,...Y.manifest.symlinks].map((de)=>de.path));for(let de of ie){let me=de.path.split("/");for(let be=1;be<=me.length;be++){let Pe=me.slice(0,be).join("/"),he=await lg(Gs(z,Pe)).catch((Ie)=>{if(Ie.code!=="ENOENT")throw Ie;return null});if(he&&!he.isDirectory()&&!fe.has(Pe))throw new e("conflict",`Incoming repository file would replace an excluded local file: ${Pe}`)}}for(let de of[...ie,...le])await Yc(z,de.path,se);let ce=await Promise.all(ne.manifest.files.map(async(de)=>({...de,bytes:await sg(Gs(te,de.path))})));for(let de of[...new Set(se)].sort((me,be)=>me.length-be.length))await eo(de,{force:!0});for(let de of le)await eo(await rr(z,de.path),{force:!0});for(let de of ce){let me=await rr(z,de.path);await ig(me,de.bytes,{mode:de.executable?493:420}),await ag(me,de.executable?493:420)}for(let de of ne.manifest.symlinks){let me=await rr(z,de.path);await eo(me,{force:!0}),await cg(de.target,me)}return ns(z,{schemaVersion:1,repoId:V,commitSha:X,files:Object.fromEntries(fn(ne.manifest)),snapshotOnly:!0,rootName:Y.manifest.rootName}),{action:"pull",commitSha:X}}finally{await eo(te,{recursive:!0,force:!0})}}async function zs(z,J,V,X="sync",Y=!1,Z=Qc){let{config:Q,state:ee}=await hn(z),te=await Ws(J,Q.projectId,ee?.repoId),[re,ne]=await Promise.all([el(z,V),J.repos.head(Q.projectId,te.id)]),se=pg(re,ee),ie=ee?.commitSha!==ne.commitSha,le=!ee&&se&&!ne.isEmpty?"conflict":X==="push"?ie&&ee?"conflict":se?"push":"none":X==="pull"?se?"conflict":ie?"pull":"none":se&&ie&&ee?"conflict":se?"push":ie?"pull":"none";if(Y)return{action:le,localChanged:se,cloudChanged:ie,commitSha:ne.commitSha};if(le==="conflict")throw new e("conflict","This folder and HLIX Repos have both changed. Resolve the differences before syncing; no files were replaced.");if(le==="push")return Bs(z,J,re,ne.commitSha,!1,Z);if(le==="pull")return ug(z,J,te.id,ne.commitSha,re,Z);return{action:"none",commitSha:ne.commitSha}}function Js(z){return{name:z,summary:`${z} files with HLIX Repos`,usage:`Usage: hlix ${z} [--dry-run] [--json]`,supportsJson:!0,signIn:!0,options:["dry-run"],async run(J){let{root:V}=await hn(J.cwd),X=await zs(V,J.requireClient(),J.env,z,J.flags["dry-run"]===!0);return J.stdout(J.json?Se(je(`hlix ${z}`,X)):`HLIX Repos: ${X.action} (${X.commitSha})
333
+ `),X.action==="conflict"?1:0}}}var tl=Js("push"),nl=Js("pull"),rl=Js("sync");var hg=(z)=>`${(z/1024/1024).toFixed(1)} MB`,Ks=(z,J=3)=>z.slice(0,J).join(", ")+(z.length>J?`, +${z.length-J} more`:"");function yg(z,J,V,X,Y){let{manifest:Z}=z,Q=new Map;for(let re of Z.files){let ne=re.path.includes("/")?`${re.path.split("/")[0]}/`:"(root files)";Q.set(ne,(Q.get(ne)??0)+1)}let ee=[...Q].sort((re,ne)=>ne[1]-re[1]).map(([re,ne])=>`${re} ${ne}`);return["Import plan",...[["Project",`${J} (${V})`],["Config",Y],["Files",`${Z.totals.files} files, ${hg(Z.totals.bytes)}`],["Folders",Ks(ee,5)||"none"],["Secrets",z.protectedFiles.length?`${z.protectedFiles.length} encrypted: ${Ks(z.protectedFiles.map((re)=>re.path))}`:"none found"],["History",!Z.git.detected?"no git history":X==="preserve"?`kept: ${Z.git.commitCount} commits${Z.git.branch?` on ${Z.git.branch}`:""}`:"not sent (sanitize)"],["Skipped",Z.skipped.length?Ks(Z.skipped.map((re)=>re.path)):"nothing"],...z.cycles.length?[["Cycles",z.cycles.map((re)=>Vr(re)).join(", ")]]:[]].map(([re,ne])=>` ${re.padEnd(9)}${ne}`),"","To change it: --name <name>, --include <path>, or list paths in .hlixignore."].join(`
334
+ `)}var ol={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(z){let J=await fg(gg(z.cwd,z.args[0]??"."));await g(z,{cwd:J,flags:z.flags,verify:!0});let V=r({env:z.env,flags:z.flags,cwd:J});if(V.conflict)throw new e("conflict",V.conflict);if(!V.workspaceId||!V.credential)throw new e("workspace_required","Run hlix login to select a workspace.");let X=mt(J);if(X.error)throw new e("invalid_project_file",X.error);let Y=ln(X.base),Z=Y?void 0:Nr(J)?.projectId;if(Y?.projectId||Z)throw new e("conflict","This folder is already bound to a project. Use hlix push or sync.");let Q=z.flags.history??"preserve";if(Q!=="preserve"&&Q!=="sanitize")throw new e("invalid_usage","--history accepts preserve or sanitize.");let ee=await ft(J,{environment:z.env,historyMode:Q,envFile:typeof z.flags["env-file"]==="string"?z.flags["env-file"]:void 0,maxFiles:50000,maxFileBytes:33554432,maxTotalBytes:1073741824,include:typeof z.flags.include==="string"?z.flags.include:void 0});if(ee.blocking.length)throw new e("scan_blocked",ee.blocking.join(`
335
+ `));if(ee.manifest.git.detected&&(ee.manifest.historicalSecretFindings.length||!ee.manifest.git.historyScanComplete))throw new e("scan_blocked","History contains potential secrets or was not completely scanned. Review it or use --history sanitize.");let te={files:ee.manifest.totals.files,bytes:ee.manifest.totals.bytes,protectedFiles:ee.protectedFiles.length,history:Q},re=X.base?_t(X.base):null,ne=typeof z.flags.name==="string"?z.flags.name:re?.name??mg(J),se=typeof z.flags.stack==="string"?z.flags.stack:re?.stack??ee.manifest.stack,ie=Er(J,ee.stackFacts),le=X.base??br(Dn(ee.manifest.environment,{workspace:V.workspaceId,api:V.baseUrl},void 0,ie)),fe=kg(le,{name:ne,stack:se}),ce=yg(ee,ne,se,Q,xa(X));if(z.flags["dry-run"]===!0)return z.stdout(z.json?Se(je("hlix import",te)):`${ce}
336
+ `),0;if(z.flags.yes!==!0){if(!z.confirm)throw new e("invalid_usage","Import requires approval. Review --dry-run, then use --yes.");if(!await z.confirm(ce))return z.stdout(`Import cancelled. Nothing was sent.
337
+ `),0}let de=z.requireClient(J),me=await de.projects.create(fe.create);await kr(J),Pr(ee,".gitignore"),Fr(J);let be={workspace:V.workspaceId,api:V.baseUrl,project:me.id};if(!X.base){if(Sr(J,Dn(ee.manifest.environment,be,{name:ne,stack:se},ie)).written)Pr(ee,"hlix.yml")}let Pe=jr(J,be);if(Pe.changed)Pr(ee,Pe.name);if(Object.keys(fe.patch).length>0)await de.projects.update(me.id,fe.patch);for(let ae=0;ae<ee.protectedFiles.length;ae+=64)await de.secrets.importFiles(me.id,ee.protectedFiles.slice(ae,ae+64).map((ue)=>({path:ue.path,contentBase64:ue.contentBase64})));let he=await Bs(J,de,ee,void 0,Q==="preserve"),Ie=await vg(J,de,me.id,ee.cycles),ye=Ie.map((ae)=>`Cycle: ${ae.name} continues on ${ae.branch}
338
+ `).join("");return z.stdout(z.json?Se(je("hlix import",{...te,projectId:me.id,commitSha:he.commitSha,...Ie.length?{cycles:Ie}:{}})):`Imported into HLIX Repos: ${me.name} (${he.commitSha})
339
+ ${ye}`),0}};function qs(z){throw new e("conflict",`The project was imported. Continuing ${z} did not finish. The folder is already bound.`)}async function wg(z,J,V,X){if(!/^[0-9a-f]{40}$/i.test(V))throw Error("Cycle base is not a commit");if(!/^[A-Za-z0-9._/-]+$/.test(X)||X.includes("..")||X.startsWith("/")||X.endsWith("/"))throw Error("Invalid cycle branch");await Qr(J,async(Y)=>{Zr(z,["push",J.cloneUrl,`${V}:refs/heads/${X}`],Y)})}async function vg(z,J,V,X,Y=wg){let Z=X.filter((se)=>se.pushed&&se.branch&&se.commit);if(Z.length===0)return[];let ee=(await J.projects.get(V)).repos??[],te=ee.find((se)=>se.isPrimary)??(ee.length===1?ee[0]:void 0);if(!te)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 re=await J.repos.access(V,te.id,"write"),ne=[];for(let se of Z){let ie;try{ie=await J.cycles.openFromBranch({projectId:V,branch:se.branch,commit:se.commit})}catch{qs(se.branch)}if(ie.status!=="triage"){ne.push({name:se.name,branch:ie.branch});continue}try{if(await Y(z,re,ie.baseRef,ie.branch),(await J.cycles.continueFromBranch(ie.id)).status!=="draft")qs(se.branch)}catch(le){if(le instanceof e)throw le;qs(se.branch)}ne.push({name:se.name,branch:ie.branch})}return ne}var bg=["claude-code","codex","goose","opencode","pi","qwen-code"];function kg(z,J){let V=_t(z),X=Sg(V.runtime);return{create:{name:J.name,stack:J.stack,repos:[],...V.brief?{brief:V.brief}:{},...X?{runtime:X}:{}},patch:{...V.verifyCommand?{verifyCommand:V.verifyCommand}:{},...V.previewCommand?{previewCommand:V.previewCommand}:{},...V.previewPort!==void 0?{previewPort:V.previewPort}:{},...V.sandboxSize?{sandboxSize:V.sandboxSize}:{},...V.branchPrefix?{branchPrefix:V.branchPrefix}:{},...V.intake?{intake:V.intake}:{}}}}function Sg(z){let J=z.agents?.filter((X)=>bg.includes(X)),V={};if(J?.length)V.agents=J;if(z.toolchain)V.toolchain=z.toolchain;if(z.aptPackages)V.aptPackages=z.aptPackages;if(z.setup)V.setup=z.setup;if(z.services)V.services=z.services;if(z.envOverrides)V.envOverrides=z.envOverrides;if(z.verifyCommand)V.verifyCommand=z.verifyCommand;if(z.preview)V.preview=z.preview;if(z.notes)V.notes=z.notes;return Object.keys(V).length?V:void 0}import{spawnSync as Vg}from"node:child_process";import{existsSync as Xg,mkdirSync as Yg,writeFileSync as Zg}from"node:fs";import{dirname as Qg}from"node:path";import{createHash as xg}from"node:crypto";import{mkdirSync as jg,readdirSync as dl,readFileSync as Eg,rmSync as Pg,statSync as pl,writeFileSync as Ig}from"node:fs";import{homedir as _g,tmpdir as Cg}from"node:os";import{basename as ul,isAbsolute as $g,join as Te,relative as Tg}from"node:path";var l=(z=process.env)=>z.HOME??z.USERPROFILE??_g();function Ze(z){try{if(!pl(z).isFile())return null;return Eg(z,"utf8")}catch{return null}}function Ag(z){try{return pl(z).isDirectory()}catch{return!1}}function yn(z,J){try{return dl(z,{withFileTypes:!0}).filter((V)=>V.isFile()&&V.name.endsWith(J)).map((V)=>Te(z,V.name)).sort()}catch{return[]}}function Rg(z){try{return dl(z,{withFileTypes:!0}).filter((J)=>J.isDirectory()||J.isSymbolicLink()).map((J)=>Te(z,J.name)).sort()}catch{return[]}}function Xs(z){let J=z.replace(/^\uFEFF/,""),V=J.indexOf(`
340
+ `);if(!J.startsWith("---")||V===-1)return{fields:{},body:J.trim()};let X=J.indexOf(`
341
+ ---`,V);if(X===-1)return{fields:{},body:J.trim()};let Y={};for(let Q of J.slice(V+1,X).split(`
342
+ `)){let ee=/^([A-Za-z_][\w-]*)\s*:\s*(.*)$/.exec(Q);if(!ee)continue;Y[ee[1]]=ee[2].trim().replace(/^["']|["']$/g,"")}let Z=J.indexOf(`
343
+ `,X+1);return{fields:Y,body:Z===-1?"":J.slice(Z+1).trim()}}function Og(z){let J=z.trimStart(),V=/^"((?:[^"\\]|\\.)*)"/.exec(J)??/^'([^']*)'/.exec(J);if(V)return V[1].replace(/\\"/g,'"').replace(/\\n/g,`
344
+ `);if(J.startsWith("["))return[...J.matchAll(/"((?:[^"\\]|\\.)*)"|'([^']*)'/g)].map((Y)=>Y[1]??Y[2]??"");if(J.startsWith("{")){let Y={};for(let Z of J.matchAll(/([A-Za-z0-9_.-]+)\s*=\s*"((?:[^"\\]|\\.)*)"/g))Y[Z[1]]=Z[2].replace(/\\"/g,'"');return Y}let X=/^[^\s#]+/.exec(J)?.[0];if(X===void 0)return;if(X==="true"||X==="false")return X==="true";if(/^-?\d+(\.\d+)?$/.test(X))return Number(X);return X}function ml(z){let J={"":{}},V="",X=z.split(`
345
+ `);for(let Y=0;Y<X.length;Y+=1){let Q=X[Y].trim();if(!Q||Q.startsWith("#"))continue;let ee=/^\[\[?([^\]]+)\]\]?$/.exec(Q);if(ee){V=ee[1].trim(),J[V]??={};continue}let te=/^([A-Za-z0-9_.-]+|"[^"]+")\s*=\s*(.*)$/.exec(Q);if(!te)continue;let re=te[1].replace(/^"|"$/g,""),ne=te[2];if(ne.startsWith('"""')){let ie=[],le=ne.slice(3);if(le.includes('"""'))ie.push(le.slice(0,le.indexOf('"""')));else{if(le)ie.push(le);while(Y+1<X.length){Y+=1;let fe=X[Y],ce=fe.indexOf('"""');if(ce===-1){ie.push(fe);continue}ie.push(fe.slice(0,ce));break}}J[V][re]=ie.join(`
346
+ `).replace(/^\n/,"");continue}let se=Og(ne);if(se!==void 0)J[V][re]=se}return J}function Vs(z,J){return z.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\}/g,(V,X,Y)=>{let Z=J[X];return Z!==void 0&&Z!==""?Z:Y??""})}var sl=(z,J)=>{let V={};for(let[X,Y]of Object.entries(z))if(typeof Y==="string")V[X]=Vs(Y,J);return V},Ng=[{relative:"GEMINI.md",source:"gemini"},{relative:Te(".gemini","GEMINI.md"),source:"gemini"},{relative:".cursorrules",source:"cursor"},{relative:".windsurfrules",source:"windsurf"},{relative:Te(".github","copilot-instructions.md"),source:"copilot"}],Fg=[{relative:Te(".gemini","GEMINI.md"),source:"gemini"}],Lg=[{relative:Te(".cursor","rules"),source:"cursor",extension:".mdc"},{relative:Te(".windsurf","rules"),source:"windsurf",extension:".md"}];function Hg(z,J){let V=Te(z,".clinerules"),X=Ag(V)?yn(V,".md"):[V],Y=[];for(let Z of X){let Q=Ze(Z)?.trim();if(Q)Y.push({path:Z,source:"cline",scope:J,content:Q})}return Y}function Mg(z,J,V){let{fields:X,body:Y}=Xs(J);if(X.alwaysApply==="false")return{path:z,source:"cursor",scope:V,reason:"alwaysApply: false"};if(!Y)return{path:z,source:"cursor",scope:V,reason:"no rule body"};let Z=X.globs?.replace(/^\[|\]$/g,"").trim();return{path:z,source:"cursor",scope:V,content:Y,...Z?{note:`Applies to: ${Z}`}:{}}}var Dg=["AGENTS.md","CLAUDE.md"],gl=["",".claude"],D=["commands"];function Ug(z,J){let V=[],X=new Set;for(let Y of[...gl,J])for(let Z of Dg){let Q=Te(z,Y,Z),ee=Ze(Q)?.trim();if(!ee||X.has(ee))continue;X.add(ee),V.push({path:Q,content:ee})}return V}function il(z,J){return Ug(z,J).map((V)=>V.content)}var _=["AGENTS.md","CLAUDE.md","GEMINI.md"];function Ys(z,J){for(let V of _)for(let X of[...gl,J]){let Y=Te(z,X,V),Z=Ze(Y)?.trim();if(Z)return{path:Y,content:Z}}return null}var Zs=(z=process.env)=>Te(z.HLIX_CONFIG_HOME??Te(l(z),".hlix"),"AGENTS.md");function P(z){let J=z.env??process.env,V=Zs(J),X=Ze(V)?.trim();return{global:X?{path:V,content:X}:null,project:Ys(z.cwd,z.configDir)}}var al=(z)=>{let J=Math.round(z.length/4);return J>=1000?`${(J/1000).toFixed(1)}k tokens`:`${J} tokens`};function F(z,J,V=process.env){let X=[...z.global?[hl(z.global.path,V)]:[],...z.project?[sr(z.project.path,J)]:[]];return X.length===0?"":`rules: ${X.join(" + ")}`}function T(z,J,V=process.env,X=[]){let Y=(Z,Q,ee)=>Q?`${Z.padEnd(8)} ${ee(Q.path)} (${al(Q.content)})`:`${Z.padEnd(8)} none`;return[Y("user",z.global,(Z)=>hl(Z,V)),Y("project",z.project,(Z)=>sr(Z,J)),...X.map((Z)=>`${"nested".padEnd(8)} ${sr(Z.path,J)} (${al(Z.content)})`),"","User rules go first, the project's after, so the project wins a conflict.",X.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(`
347
+ `)}var cl=[{dir:".claude",source:"claude",harnessReads:!0},{dir:".agents",source:"agents",harnessReads:!0},{dir:".hlix",source:"hlix",harnessReads:!0},{dir:".codex",source:"codex",harnessReads:!1}],Gg=[{relative:Te(".cursor","commands"),source:"cursor"},{relative:Te(".codex","prompts"),source:"codex"}],Wg=[{relative:Te(".cursor","mcp.json"),source:"cursor",key:"mcpServers",format:"json"},{relative:Te(".windsurf","mcp.json"),source:"windsurf",key:"mcpServers",format:"json"},{relative:Te(".gemini","settings.json"),source:"gemini",key:"mcpServers",format:"json"},{relative:Te(".vscode","mcp.json"),source:"vscode",key:"servers",format:"json"},{relative:Te(".codex","config.toml"),source:"codex",key:"mcp_servers",format:"toml"},{relative:".mcp.json",source:"claude",key:"mcpServers",format:"json"}];function fl(z){return[...Wg,{relative:Te(z,"mcp.json"),source:"hlix",key:"mcpServers",format:"json"}]}var Bg="found, not loaded (machine-wide; enable per project by copying into .hlix/mcp.json)",zg=(z)=>fl(z).filter((J)=>J.source!=="vscode");function Jg(z,J){if(!z||typeof z!=="object"||Array.isArray(z))return{reason:"not an object"};let V=z;if(V.enabled===!1||V.disabled===!0)return{reason:"disabled"};let X=typeof V.command==="string"&&V.command!=="",Y=typeof V.url==="string"&&V.url!=="";if(X&&Y)return{reason:'has both "command" and "url"'};if(X){let se=Array.isArray(V.args)?V.args.filter((le)=>typeof le==="string"):void 0,ie=V.env&&typeof V.env==="object"&&!Array.isArray(V.env)?sl(V.env,J):void 0;return{config:{command:V.command,...se&&se.length>0?{args:se}:{},...ie&&Object.keys(ie).length>0?{env:ie}:{}}}}if(!Y)return{reason:'missing "command" or "url"'};let Z=V.headers??V.http_headers,Q=Z&&typeof Z==="object"&&!Array.isArray(Z)?sl(Z,J):{},ee=V.bearer_token_env_var;if(typeof ee==="string"&&/^[A-Za-z_][A-Za-z0-9_]*$/.test(ee)&&!Object.keys(Q).some((se)=>se.toLowerCase()==="authorization"))Q.Authorization=`Bearer ${Vs(`\${${ee}}`,J)}`;let te=Object.entries(Q).find(([se])=>se.toLowerCase()==="authorization")?.[1]?.trim(),re=te&&!/^Bearer$/i.test(te)&&!te.includes("${"),ne=V.oauth===!0||V.oauth&&typeof V.oauth==="object"||typeof ee==="string"&&!J[ee];return{config:{url:Vs(V.url,J),...ne&&!re?{needsSignIn:!0}:{},...Object.keys(Q).length>0?{headers:Q}:{}}}}function ll(z,J,V,X){let Y=Ze(z),Z=[],Q=[];if(Y===null)return{servers:Z,skipped:Q};let ee=[];if(J.format==="toml"){let te=ml(Y);ee=Object.entries(te).filter(([re])=>re.startsWith(`${J.key}.`)).map(([re,ne])=>[re.slice(J.key.length+1),ne])}else try{let re=JSON.parse(Y)?.[J.key];if(re&&typeof re==="object"&&!Array.isArray(re))ee=Object.entries(re)}catch{return Q.push({path:z,source:J.source,scope:V,reason:"not valid JSON"}),{servers:Z,skipped:Q}}for(let[te,re]of ee){let ne=Jg(re,X);if("reason"in ne){Q.push({path:z,source:J.source,scope:V,reason:`${te}: ${ne.reason}`});continue}Z.push({path:z,source:J.source,scope:V,name:te,config:ne.config})}return{servers:Z,skipped:Q}}function Kg(z,J,V){let{fields:X,body:Y}=Xs(J);if(!Y)return{path:z,source:"claude",scope:V,reason:"no instructions"};let Z=X.tools?.replace(/^\[|\]$/g,"").split(",").map((Q)=>Q.trim()).filter(Boolean);return{path:z,source:"claude",scope:V,name:X.name||ul(z,".md"),description:X.description??"",instructions:Y,...Z&&Z.length>0&&Z[0]!=="*"?{tools:Z}:{},...X.model?{model:X.model}:{}}}function qg(z){let J=ml(z)[""]??{},V=typeof J.prompt==="string"?J.prompt.trim():"";if(!V)return null;return{description:typeof J.description==="string"?J.description:"",body:V}}function R(z,J,V={}){let X=V.configDir??".hlix",Y=V.env??process.env,Z={instructions:[],skills:[],commands:[],generatedCommands:[],mcpServers:[],subagents:[],skipped:[]},Q=(fe)=>{if("reason"in fe)Z.skipped.push(fe);else Z.instructions.push(fe)};for(let fe of Ng){let ce=Te(z,fe.relative),de=Ze(ce)?.trim();if(de)Z.instructions.push({path:ce,source:fe.source,scope:"project",content:de})}for(let fe of Lg)for(let ce of yn(Te(z,fe.relative),fe.extension)){let de=Ze(ce);if(de===null)continue;if(fe.source==="cursor"){Q(Mg(ce,de,"project"));continue}let{body:me}=Xs(de);if(me)Z.instructions.push({path:ce,source:fe.source,scope:"project",content:me})}for(let fe of Hg(z,"project"))Q(fe);let ee=il(z,X),te=Te(z,".codex","AGENTS.md"),re=Ze(te)?.trim();if(re&&ee.includes(re))Z.skipped.push({path:te,source:"codex",scope:"project",reason:"same content as the project's AGENTS.md"});else if(re)Z.instructions.push({path:te,source:"codex",scope:"project",content:re});for(let fe of Fg){let ce=Te(J,fe.relative),de=Ze(ce)?.trim();if(de)Z.instructions.push({path:ce,source:fe.source,scope:"global",content:de})}let ne=Te(J,".codex","AGENTS.md"),se=Ze(ne)?.trim(),ie=il(J,X);if(se&&ie.includes(se))Z.skipped.push({path:ne,source:"codex",scope:"global",reason:"same content as the machine's AGENTS.md"});else if(se)Z.instructions.push({path:ne,source:"codex",scope:"global",content:se});for(let[fe,ce]of[[z,"project"],[J,"global"]])for(let de of cl){let me=Te(fe,de.dir===".hlix"?X:de.dir,"skills");if(!Rg(me).some((Pe)=>Ze(Te(Pe,"SKILL.md"))!==null))continue;Z.skills.push({path:me,source:de.source,scope:ce,harnessReads:de.harnessReads})}for(let[fe,ce]of[[z,"project"],[J,"global"]]){for(let de of cl){if(!de.harnessReads)continue;let me=Te(fe,de.dir,"commands");if(yn(me,".md").length===0)continue;Z.commands.push({path:me,source:de.source,scope:ce,harnessReads:!0})}for(let de of Gg){let me=Te(fe,de.relative);if(yn(me,".md").length===0)continue;Z.commands.push({path:me,source:de.source,scope:ce})}for(let de of yn(Te(fe,".gemini","commands"),".toml")){let me=Ze(de),be=me===null?null:qg(me);if(!be){Z.skipped.push({path:de,source:"gemini",scope:ce,reason:"no prompt field"});continue}Z.generatedCommands.push({path:de,source:"gemini",scope:ce,name:ul(de,".toml"),body:`---
348
+ description: ${be.description}
349
+ ---
350
+
351
+ ${be.body}
352
+ `})}}for(let fe of fl(X)){let ce=ll(Te(z,fe.relative),fe,"project",Y);Z.skipped.push(...ce.skipped);for(let de of ce.servers){let me=Z.mcpServers.findIndex((be)=>be.name===de.name);if(me===-1)Z.mcpServers.push(de);else Z.mcpServers[me]=de}}for(let fe of zg(X)){let ce=ll(Te(J,fe.relative),fe,"global",Y);for(let de of ce.servers)Z.skipped.push({path:de.path,source:de.source,scope:"global",reason:`${de.name}: ${Bg}`})}let le=[{dir:Te(".claude","agents"),source:"claude"},{dir:Te(X,"agents"),source:"hlix"}];for(let[fe,ce]of[[z,"project"],[J,"global"]])for(let de of le.flatMap((me)=>yn(Te(fe,me.dir),".md"))){let me=Ze(de);if(me===null)continue;let be=Kg(de,me,ce);if("reason"in be)Z.skipped.push(be);else if(Z.subagents.some((Pe)=>Pe.name===be.name))Z.skipped.push({path:de,source:"claude",scope:ce,reason:`a project agent already claims the name ${be.name}`});else Z.subagents.push(be)}return Z}function H(z,J){if(z.length===0)return null;let V=Te(Cg(),"hlix-standards-commands",xg("sha256").update(J).digest("hex").slice(0,16));try{Pg(V,{recursive:!0,force:!0}),jg(V,{recursive:!0});for(let X of z)Ig(Te(V,`${X.name}.md`),X.body,"utf8");return V}catch{return null}}var sr=(z,J)=>{let V=Tg(J,z);return!V||V.startsWith("..")||$g(V)?z:V},hl=(z,J=process.env)=>{let V=J.HLIX_CONFIG_HOME;if(V&&z.startsWith(`${V}/`))return`~/.hlix/${z.slice(V.length+1)}`;let X=l(J);return X&&z.startsWith(`${X}/`)?`~/${z.slice(X.length+1)}`:z};function U(z,J){if(z.length===0)return"";let V=["# 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(`
353
+ `),X=z.map((Y)=>{let Z=`# From ${sr(Y.path,J)} (${Y.source})`;return`${Y.note?`${Z}
354
+ ${Y.note}`:Z}
355
+
356
+ ${Y.content}`});return`${V}
357
+
358
+ ${X.join(`
359
+
360
+ `)}`}var or=(z,J,V)=>`${z} ${z===1?J:V}`;function B(z){let J=[];if(z.instructions.length>0)J.push(or(z.instructions.length,"instruction file","instruction files"));if(z.skills.length>0)J.push(or(z.skills.length,"skill directory","skill directories"));let V=z.commands.length+z.generatedCommands.length;if(V>0)J.push(or(V,"command source","command sources"));if(z.mcpServers.length>0)J.push(or(z.mcpServers.length,"mcp server","mcp servers"));if(z.subagents.length>0)J.push(or(z.subagents.length,"subagent","subagents"));if(J.length===0)return"";let X=[...new Set([...z.instructions,...z.skills,...z.commands,...z.generatedCommands,...z.mcpServers,...z.subagents].map((Y)=>Y.source))].sort();return`standards: ${J.join(" · ")} (${X.join(", ")})`}function yl(z,J){let V=[],X=(Z,Q)=>{if(Q.length===0)return;V.push(Z,...Q.map((ee)=>` ${ee}`),"")},Y=(Z)=>`${Z.source}${Z.scope==="global"?" (global)":""} ${sr(Z.path,J)}`;if(X("Instructions",z.instructions.map((Z)=>`${Y(Z)}${Z.note?` — ${Z.note}`:""}`)),X("Skills",z.skills.map((Z)=>`${Y(Z)}${Z.harnessReads?" — already read by the harness":""}`)),X("Commands",[...z.commands.map((Z)=>`${Y(Z)}${Z.harnessReads?" — already read by the harness":""}`),...z.generatedCommands.map((Z)=>`${Y(Z)} → /${Z.name}`)]),X("MCP servers",z.mcpServers.map((Z)=>`${Y(Z)} → ${Z.name} (${"command"in Z.config?"stdio":"http"})`)),X("Subagents",z.subagents.map((Z)=>`${Y(Z)} → ${Z.name}`)),X("Skipped",z.skipped.map((Z)=>`${Y(Z)} — ${Z.reason}`)),V.length===0)return`No standards from other agent tools were found in this folder.
361
+ `;return`${V.join(`
362
+ `).trimEnd()}
363
+ `}function ef(z){return z==="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(`
364
+ `):["# 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(`
365
+ `)}function tf(z){return z.VISUAL?.trim()||z.EDITOR?.trim()||"vi"}var Qs={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 (${_.join(", then ")}).`].join(`
366
+ `),supportsJson:!0,options:["edit","global"],async run(z){let J=P({cwd:z.cwd,configDir:".hlix",env:z.env}),V=z.flags.global===!0;if(z.flags.edit===!0){if(z.json)throw new e("invalid_usage","`hlix rules --edit` opens an editor, so it has no --json form.");let X=V?Zs(z.env):Ys(z.cwd,".hlix")?.path??`${z.cwd}/AGENTS.md`;if(!Xg(X))Yg(Qg(X),{recursive:!0}),Zg(X,ef(V?"global":"project"),"utf8"),z.stdout(`Created ${X}.
367
+ `);let Y=tf(z.env),Z=Vg(Y,[X],{stdio:"inherit"});if(Z.error)throw new e("invalid_usage",`Could not run ${Y}: ${Z.error.message}`);return Z.status??0}if(z.json){let X=(Y)=>Y?{path:Y.path,characters:Y.content.length}:null;return z.stdout(Se(je(Qs.name,{user:X(J.global),project:X(J.project)}))),0}return z.stdout(`${T(J,z.cwd)}
368
+ `),0}};var ei={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(`
369
+ `),supportsJson:!0,async run(z){let J=R(z.cwd,l(z.env),{env:z.env});if(z.json)return z.stdout(Se(je(ei.name,{instructions:J.instructions.map((V)=>({path:V.path,source:V.source,scope:V.scope,characters:V.content.length,...V.note?{note:V.note}:{}})),skills:J.skills,commands:[...J.commands.map((V)=>({path:V.path,source:V.source,scope:V.scope})),...J.generatedCommands.map((V)=>({path:V.path,source:V.source,scope:V.scope,command:V.name}))],mcpServers:J.mcpServers.map((V)=>({path:V.path,source:V.source,scope:V.scope,name:V.name,transport:"command"in V.config?"stdio":"http"})),subagents:J.subagents.map((V)=>({path:V.path,source:V.source,scope:V.scope,name:V.name,description:V.description,...V.model?{model:V.model}:{}})),skipped:J.skipped}))),0;return z.stdout(yl(J,z.cwd)),0}};import{accessSync as nf,constants as rf,mkdirSync as of,readFileSync as sf,realpathSync as af,statSync as vl,writeFileSync as cf}from"node:fs";import{homedir as lf}from"node:os";import{basename as df,dirname as wl,join as wn}from"node:path";var pf={homebrew:"Homebrew",npm:"npm",installer:"installer",unknown:"unknown origin"},bl=(z)=>z.HOME||lf();function ni(z){return wn(z.XDG_DATA_HOME||wn(bl(z),".local","share"),"hlix","hlix")}function kl(z){try{return af(z)}catch{return null}}function uf(z){try{let J=JSON.parse(sf(wn(ni(z),"install.json"),"utf8"));if(typeof J.path==="string")return J.path}catch{}return wn(bl(z),".local","bin","hlix")}function mf(z,J){if(/\/Cellar\/hlix\//.test(z))return"homebrew";if(/\/node_modules\/@hlix\/cli\//.test(z))return"npm";if(kl(uf(J))===z)return"installer";return"unknown"}function ti(z,J){let V=kl(z);if(!V)return null;try{if(!vl(V).isFile())return null;nf(V,rf.X_OK)}catch{return null}return{path:z,realPath:V,channel:mf(V,J)}}function gf(z){let J=[];for(let V of(z.PATH??"").split(":")){if(!V)continue;let X=ti(wn(V,"hlix"),z);if(X&&!J.some((Y)=>Y.realPath===X.realPath))J.push(X)}return J}function ri(z,J=process.execPath){if(z.HLIX_SELF)return ti(z.HLIX_SELF,z);if(/^(node|bun)(\.exe)?$/.test(df(J)))return null;return ti(J,z)}function oi(z){switch(z.channel){case"homebrew":return"brew uninstall hlix";case"npm":return"npm uninstall -g @hlix/cli";case"installer":return`${z.path} uninstall`;case"unknown":return`rm ${z.path}`}}var to=(z)=>`${z.path} (${pf[z.channel]})`;function si(z,J=process.execPath){let V=ri(z,J),X=gf(z);if(V&&!X.some((ee)=>ee.realPath===V.realPath))X.push(V);if(X.length<2)return{running:V,copies:X,duplicate:null};let[Y,...Z]=X,Q=`${X.length} copies of hlix are installed: ${to(Y)} runs, ${Z.map(to).join(" and ")} ${Z.length===1?"does":"do"} not. Keep one: ${Z.map(oi).join(" && ")}`;return{running:V,copies:X,duplicate:Q}}var ff=86400000;function G(z,J=Date.now(),V=process.execPath){let{duplicate:X}=si(z,V);if(!X)return null;let Y=wn(wl(pt(z)),"duplicate-notice");try{if(J-vl(Y).mtimeMs<ff)return null}catch{}try{of(wl(Y),{recursive:!0}),cf(Y,`${X}
370
+ `)}catch{}return X}var xl=(z)=>z instanceof Error?z.message:String(z),Sl=(z)=>z.split(/\s*\n\s*/).join(" ").trim();async function N(z,J,V,X,Y){try{let Z=await ft(J,{historyMode:V,environment:z.env,rootName:X}),Q=c(J)?.files,ee=fn(Z.manifest);return{changedFiles:Q?[...new Set([...Object.keys(Q),...ee.keys()])].filter((re)=>Q[re]!==ee.get(re)).length:null,files:Z.manifest.totals.files,manifestSha256:Z.manifestSha256,changed:Y?Z.manifestSha256!==Y:null,blocking:Z.blocking,error:null}}catch(Z){return{changedFiles:null,files:null,manifestSha256:null,changed:null,blocking:[],error:xl(Z)}}}var ii={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(`
371
+ `),supportsJson:!0,async run(z){let J=r({env:z.env,flags:z.flags,cwd:z.cwd}),V=J.binding,X=V?c(V.root):null,Y=V?await N(z,V.root,X?.snapshotOnly?"sanitize":X?.historyMode??"preserve",X?.rootName,X?.manifestSha256):null,Z=null;if(V?.config.projectId&&J.credential&&!J.conflict)try{let re=z.requireClient(),ne=await re.projects.get(V.config.projectId),se=X?.repoId??ne.repos.find((le)=>le.isPrimary)?.id??ne.repos[0]?.id;if(!se)throw Error("Select a primary HLIX Repos");let ie=await re.repos.head(V.config.projectId,se);Z={commitSha:ie.commitSha,changed:X?ie.commitSha!==X.commitSha:null,error:null,errorMessage:null}}catch(re){Z={commitSha:"",changed:null,error:Yo(re).code,errorMessage:re instanceof Dt?"no HLIX Repos commit yet — `hlix push` publishes this folder":xl(re)}}let Q=si(z.env),ee={cwd:z.cwd,workspace:{id:J.workspaceId,source:J.workspaceSource},api:{baseUrl:J.baseUrl,source:J.baseUrlSource},credential:{present:J.credential!==null,source:J.credentialSource,path:J.credentialPath},conflict:J.conflict,project:V?{root:V.root,projectId:V.config.projectId??null,workspaceId:V.config.workspaceId,apiUrl:V.config.apiUrl}:null,repository:X?{repoId:X.repoId,commitSha:X.commitSha}:null,local:Y,cloud:Z,install:{channel:Q.running?.channel??null,path:Q.running?.path??null,copies:Q.copies.map(({path:re,channel:ne})=>({path:re,channel:ne})),duplicate:Q.duplicate}};if(z.json)return z.stdout(Se(je(ii.name,ee))),0;let te=[["folder",z.cwd],["workspace",J.workspaceId?`${J.workspaceId} (from ${J.workspaceSource})`:"none — run `hlix login --workspace <id>`"],["api",`${J.baseUrl} (from ${J.baseUrlSource})`],["credential",b(J)??"none — run `hlix login`"],["project",V?V.config.projectId??`initialized at ${V.root}, not imported yet`:"none — run `hlix import .` to bind this folder"]];if(X)te.push(["HLIX Repos",X.commitSha]);if(Y){if(te.push(["local",Y.error?`could not scan: ${Y.error}`:Y.changed===null?`${Y.files} files, no synced base commit`:Y.changed?`${Y.files} files, modified since the last sync`:`${Y.files} files, matches the last sync`]),Y.blocking.length>0)te.push(["blocking",Y.blocking.join("; ")])}if(Z)te.push(["cloud",Z.error==="not_found"?Sl(Z.errorMessage??Z.error):Z.error?`not checked — ${Sl(Z.errorMessage??Z.error)}`:Z.changed?`commit ${Z.commitSha} available — run \`hlix pull\``:`commit ${Z.commitSha}, up to date`]);if(J.conflict)te.push(["conflict",J.conflict]);if(Q.running)te.push(["installed",to(Q.running)]);if(Q.duplicate)te.push(["duplicate",Q.duplicate]);return z.stdout(`${Ue(te)}
372
+ `),0}};import{spawnSync as jl}from"node:child_process";var ai={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(`
373
+ `),supportsJson:!0,signIn:!0,options:["print","web"],args:{min:0,max:1},async run(z){let J=z.args[0]??t(z.cwd)?.config.projectId;if(!J)throw new e("missing_argument","A project id is required, or run this inside a folder bound to a project.");let V=await z.requireClient().projects.terminal(J);if(z.json)return z.stdout(Se(je(ai.name,V))),V.available?0:1;if(!V.available){let Q=V.environmentState?` (environment: ${V.environmentState})`:"";throw new e("not_found",`${V.reason??"Terminal unavailable"}${Q}`)}let X=z.flags.print===!0,Y=z.flags.web===!0;if(X||Y&&!V.webTerminalUrl||!Y&&!V.sshCommand)return z.stdout(`${Ue([["ssh",V.sshCommand??"not available"],["browser",V.webTerminalUrl??"not available"]])}
374
+ `),0;if(Y){if(jl(process.platform==="darwin"?"open":"xdg-open",[V.webTerminalUrl],{stdio:"ignore"}).status!==0)z.stdout(`${V.webTerminalUrl}
375
+ `);return 0}return jl("sh",["-c",V.sshCommand],{stdio:"inherit"}).status??1}};import{rmSync as El}from"node:fs";import{dirname as hf}from"node:path";var ci={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(`
376
+ `),supportsJson:!0,options:["yes"],async run(z){let J=ri(z.env);if(!J||J.channel!=="installer")throw new e("invalid_request",J&&J.channel!=="unknown"?`This hlix was installed with ${J.channel==="homebrew"?"Homebrew":"npm"}. Remove it with: ${oi(J)}`:"Only an hlix installed by the one-line installer can remove itself.");if(z.flags.yes!==!0){if(z.json||!z.confirm)throw new e("approval_required","Removing hlix needs approval. Repeat with `--yes`.");if(!await z.confirm(`Remove ${J.path}? Your login is kept.`))throw new e("cancelled","Uninstall cancelled.")}let V=ni(z.env);El(J.path,{force:!0}),El(V,{recursive:!0,force:!0});let X=hf(pt(z.env));if(z.json)z.stdout(Se(je(ci.name,{removed:[J.path,V],kept:X})));else z.stdout(`Removed ${J.path}
377
+ Your login in ${X} is kept.
378
+ `);return 0}};function M(z){return[...z.pulled?[`HLIX Repos: pulled ${z.pulled}`]:[],...z.pushed?[`HLIX Repos: pushed ${z.pushed}`]:[]]}async function L(z,J,V){let X=!1;while(!V.signal?.aborted){try{let Y=await zs(z,J.client,J.env);if(V.onReport({conflicts:[],...Y.action==="push"?{pushed:Y.commitSha}:Y.action==="pull"?{pulled:Y.commitSha}:{}}),!X)X=!0,V.onCaughtUp?.()}catch(Y){V.onError(Y)}await lt(15000,V.signal)}}var Pl={name:"mirror",summary:"Follow HLIX Repos using Git",usage:"Usage: hlix mirror [--json]",supportsJson:!0,signIn:!0,options:[],agentTool:!1,async run(z){let{root:J}=await hn(z.cwd);return await L(J,{client:z.requireClient(),env:z.env},{signal:z.signal,onReport:(V)=>{if(z.json)z.stdout(Se(je("hlix mirror",V)));else for(let X of M(V))z.stdout(`${X}
379
+ `)},onError:(V)=>z.stderr(`${V instanceof Error?V.message:String(V)}
380
+ `)}),0}};import{lstat as di,readFile as yf,realpath as wf}from"node:fs/promises";import{basename as li,dirname as vf,extname as bf,join as no,parse as Il,resolve as ro}from"node:path";function vn(z,J){let V=z.flags[J];return typeof V==="string"&&V.trim()?V.trim():void 0}function pi(z){let J=vn(z,"project");if(J)return{root:z.cwd,projectId:J};return kf(z.cwd)}function kf(z){let J=t(z);if(!J?.config.projectId)throw new e("not_initialized","This folder is not bound to an Hlix project. Run `hlix import .` first.");return{root:J.root,projectId:J.config.projectId}}async function ui(z,J){let V=await di(z);if(V.isSymbolicLink()||!V.isFile())throw Error(`Refusing to import a non-regular file: ${z}`);if(V.size>J)throw Error(`Import file exceeds ${J} bytes: ${z}`);return{path:await wf(z),content:await yf(z,"utf8")}}function mi(z,J,V,X){if(z.json)z.stdout(Se(je(J,V)));else z.stdout(`${X}
381
+ `)}function Sf(z){let J=/^---\r?\n([\s\S]*?)\r?\n---/.exec(z)?.[1];return(J?/^name:\s*(.+?)\s*$/m.exec(J)?.[1]:void 0)?.replace(/^["']|["']$/g,"").trim()||void 0}var xf=[no(".claude","skills"),no(".agents","skills"),no(".hlix","skills")];async function jf(z,J){let V=[ro(z,J),...xf.map((X)=>ro(z,X,J))];for(let X of V)if(await di(X).then(()=>!0,()=>!1))return X;throw new e("not_found",`No skill at ${J}. Pass the SKILL.md or its folder, for example .claude/skills/${J}.`)}var gi={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(z){if(z.args.length!==1)throw Error("skill import requires one file or folder.");let J=pi(z),V=await jf(z.cwd,z.args[0]),X=await di(V);if(X.isSymbolicLink())throw Error(`Refusing to import a symlink: ${V}`);let Y=X.isDirectory()?no(V,"SKILL.md"):V,Z=await ui(Y,200000),Q=X.isDirectory()?li(V):li(Y)==="SKILL.md"?li(vf(Y)):Il(Y).name,ee=vn(z,"name")??Q;if(!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(ee))throw Error("Skill name must be a lowercase kebab-case slug.");let te=await z.requireClient().resources.importSkill(J.projectId,{slug:ee,content:Z.content});return mi(z,gi.name,te.skill,`Imported skill ${ee}`),0}},fi={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(z){if(z.args.length!==1)throw Error("agent import requires one Markdown file.");let J=pi(z),V=ro(z.cwd,z.args[0]);if(![".md",".mdx"].includes(bf(V).toLowerCase()))throw Error("Agent imports must be Markdown files.");let X=await ui(V,20000),Y=vn(z,"runtime");if(Y!==void 0&&!s.includes(Y)){let te=new Intl.ListFormat("en",{type:"disjunction"}).format(s);throw Error(`--runtime must be ${te}.`)}let Z=vn(z,"duty")??"executor";if(Z!=="executor"&&Z!=="intake")throw Error("--duty must be executor or intake.");let Q=vn(z,"name")??Sf(X.content)??Il(V).name.replace(/[-_]+/g," "),ee=await z.requireClient().resources.importAgent(J.projectId,{name:Q,instructions:X.content,...Y?{runtimeKind:Y}:{},duty:Z});return mi(z,fi.name,ee.agent,ee.agent.duty==="intake"?`Imported agent ${ee.agent.name} as this project's intake agent`:`Imported agent ${ee.agent.name}`),0}},hi={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(z){if(z.args.length!==1)throw Error("mcp import requires one MCP JSON file.");let J=pi(z),V=await ui(ro(z.cwd,z.args[0]),200000),X;try{X=JSON.parse(V.content)}catch{throw Error("MCP config is not valid JSON.")}let Y=Object.entries(X.mcpServers??{});if(Y.length===0)throw Error("MCP config contains no servers.");let Z=vn(z,"server");if(!Z&&Y.length>1)throw Error("MCP config contains multiple servers; select one with --server <name>.");let Q=Z?Y.find(([ce])=>ce===Z):Y[0];if(!Q)throw Error(`MCP server not found: ${Z}`);let[ee,te]=Q,re=te.type==="http"||te.type==="sse"?te.type:typeof te.command==="string"?"stdio":typeof te.url==="string"?"http":null;if(!re)throw Error(`MCP server ${ee} has no supported transport.`);if(re==="stdio"&&z.flags["allow-stdio"]!==!0)throw Error("Stdio MCP servers execute a command on the Cloud Machine; repeat with --allow-stdio.");let ne=te.env&&typeof te.env==="object"&&!Array.isArray(te.env)?te.env:{},se=te.headers&&typeof te.headers==="object"&&!Array.isArray(te.headers)?te.headers:{};if(Object.values(se).some((ce)=>typeof ce!=="string"))throw Error(`MCP server ${ee} headers must be strings.`);for(let[ce,de]of Object.entries(ne)){if(typeof de!=="string")continue;let me=/^\$\{([A-Za-z_][A-Za-z0-9_]*)\}$/.exec(de)?.[1];if(me&&me!==ce)throw new e("invalid_usage",`MCP server ${ee}: env ${ce} references \${${me}}, but a placeholder must be the variable's own name — write "${ce}": "\${${ce}}" and store the secret as ${ce}.`)}let ie=Object.values(se).flatMap((ce)=>[...ce.matchAll(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g)].map((de)=>de[1]));if(Object.keys(se).length>0&&ie.length===0)throw Error("MCP remote headers must use ${KEY} placeholders; literal credentials are refused.");let le=/^(?:(?:Bearer|Basic|Token) )?\$\{[A-Za-z_][A-Za-z0-9_]*\}$/i;if(Object.values(se).some((ce)=>!le.test(ce)))throw Error("MCP remote headers must be ${KEY} or an approved auth scheme followed by ${KEY}.");let fe=await z.requireClient().resources.importMcp(J.projectId,{name:ee,transport:re,...typeof te.command==="string"?{command:te.command}:{},...Array.isArray(te.args)&&te.args.every((ce)=>typeof ce==="string")?{args:te.args}:{},...typeof te.url==="string"?{url:te.url}:{},...Object.keys(se).length>0?{headers:se}:{},envKeys:[...new Set([...Object.keys(ne),...ie])].sort()});return mi(z,hi.name,fe.mcpServer,`Imported MCP server ${ee}`),0}};import{spawnSync as Ef}from"node:child_process";import{chmod as Pf,realpath as If,writeFile as _f}from"node:fs/promises";import{basename as Cf,dirname as $f,relative as Tf,resolve as Cl,sep as Af}from"node:path";var _l=64;function ar(z){let J=t(z.cwd),X=(typeof z.flags.project==="string"?z.flags.project:void 0)??J?.config.projectId;if(!X)throw new e("not_initialized","This folder is not bound to a Hlix project. Run `hlix import .`, or pass --project <id>.");return{projectId:X,root:J?.root??z.cwd}}var ir=(z,J)=>typeof z[J]==="string"?z[J]:void 0,yi={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(`
382
+ `),supportsJson:!0,signIn:!0,options:["project"],async run(z){let{projectId:J}=ar(z),V=await z.requireClient().secrets.listEntries(J);if(z.json)return z.stdout(Se(je(yi.name,V))),0;if(V.entries.length===0)z.stdout(`No secrets stored for this project.
383
+ `);else z.stdout(`${bt(["key","source","format","value","updated"],V.entries.map((X)=>[X.key,X.source,X.format||"-",X.maskedValue,X.updatedAt?.slice(0,10)??"-"]))}
384
+ `);for(let X of V.warnings)z.stderr(`warning: ${X}
385
+ `);return 0}},wi={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(`
386
+ `),supportsJson:!0,signIn:!0,options:["from-stdin","source","project"],args:{min:1,max:2},async run(z){let{projectId:J}=ar(z),V=z.args[0],X=z.flags["from-stdin"]===!0;if(X&&z.args.length>1)throw new e("invalid_usage","Pass the value as an argument or with --from-stdin, not both.");if(!X&&z.args.length<2)throw new e("missing_argument","A value is required. Pass it as an argument, or pipe it with --from-stdin.");let Y;if(X){if(!z.readStdin)throw new e("invalid_usage","--from-stdin is not available in this context.");Y=(await z.readStdin()).replace(/\r?\n$/,"")}else Y=z.args[1];let Z=ir(z.flags,"source"),Q=await z.requireClient().secrets.upsertEntries(J,{entries:[{key:V,value:Y,...Z?{source:Z}:{}}]});if(z.json)return z.stdout(Se(je(wi.name,Q))),Q.written>0?0:1;if(Q.written===0)throw new e("bad_request",`The store refused ${V}: --source must be a project-relative file path.`);return z.stdout(`${Ue([["key",V],["source",Z??".env"]])}
387
+ `),0}},vi={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(`
388
+ `),supportsJson:!0,signIn:!0,options:["source","project"],args:{min:1,max:1},async run(z){let{projectId:J}=ar(z),V=z.args[0],X=ir(z.flags,"source"),Y=await z.requireClient().secrets.deleteEntry(J,V,X);if(z.json)return z.stdout(Se(je(vi.name,Y))),Y.removed>0?0:1;if(Y.removed===0)return z.stderr(`No stored secret named ${V}${X?` in ${X}`:""}.
389
+ `),1;return z.stdout(`Removed ${Y.removed} entr${Y.removed===1?"y":"ies"} for ${V}.
390
+ `),0}},oo={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(`
391
+ `),supportsJson:!0,signIn:!0,options:["project"],args:{min:0,max:64},async run(z){let{projectId:J,root:V}=ar(z),X=await ft(V,{historyMode:"preserve",environment:z.env}),Y=X.blocking.filter((se)=>!se.startsWith(Ls));if(Y.length>0)throw new e("scan_blocked",`Project scan blocked the import:
392
+ - ${Y.join(`
393
+ - `)}`);let Z=X.protectedFiles.filter((se)=>se.kind==="dotenv"||se.kind==="credential"),Q=await If(z.cwd),ee=z.args.map((se)=>Tf(X.root,Cl(Q,se)).split(Af).join("/")),te=ee.filter((se)=>!Z.some((ie)=>ie.path===se));if(te.length>0)throw new e("invalid_usage",`Not a secret file in this project: ${te.join(", ")}`);let re=ee.length>0?Z.filter((se)=>ee.includes(se.path)):Z;if(re.length===0)return z.stdout(z.json?Se(je(oo.name,{imported:[],skipped:[],warnings:[],written:0,rejected:[]})):`No secret files found in this project.
394
+ `),0;if(re.length>_l)throw new e("invalid_usage",`${re.length} secret files exceeds the ${_l} the store accepts in one request. Name the files to import, a batch at a time.`);let ne=await z.requireClient().secrets.importFiles(J,re.map((se)=>({path:se.path,contentBase64:se.contentBase64})));if(z.json)return z.stdout(Se(je(oo.name,ne))),0;if(ne.imported.length>0)z.stdout(`${bt(["source","format","stored"],ne.imported.map((se)=>[se.path,se.format||"-",se.kind==="file"?"as file":`${se.entries} entr${se.entries===1?"y":"ies"}`]))}
395
+ `);if(z.stdout(`${ne.written} value${ne.written===1?"":"s"} stored.
396
+ `),ne.imported.some((se)=>se.kind!=="file"))z.stdout(`Each imported file replaced what the store held under its path; keys the file no longer has are gone.
397
+ `);for(let se of ne.skipped)z.stderr(`skipped ${se.path}: ${se.reason}
398
+ `);for(let se of ne.warnings)z.stderr(`warning: ${se}
399
+ `);for(let se of ne.rejected)z.stderr(`rejected ${se}: the store refused its source path
400
+ `);return 0}};function Rf(z){return Ef("git",["-C",$f(z),"ls-files","--error-unmatch","--",Cf(z)],{encoding:"utf8",stdio:["ignore","pipe","pipe"]}).status===0}var bi={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(`
401
+ `),supportsJson:!0,signIn:!0,options:["source","format","out","project"],async run(z){let{projectId:J}=ar(z),V=ir(z.flags,"source"),X=ir(z.flags,"format"),Y=ir(z.flags,"out"),Z=Y===void 0?void 0:Cl(z.cwd,Y);if(Z!==void 0&&Rf(Z))throw new e("invalid_usage",`Refusing to overwrite a git-tracked file with secret values: ${Z}`);let Q=await z.requireClient().secrets.exportEntries(J,{...V?{source:V}:{},...X?{format:X}:{}});if(Z!==void 0)await _f(Z,Q,{mode:384}),await Pf(Z,384);if(z.json)return z.stdout(Se(je(bi.name,{source:V??null,format:X??null,out:Z??null,bytes:Buffer.byteLength(Q),...Z===void 0?{content:Q}:{}}))),0;if(Z===void 0)z.stdout(Q);else z.stdout(`${Ue([["wrote",Z],["mode","0600"],["bytes",String(Buffer.byteLength(Q))]])}
402
+ `);return 0}};function Si(z){let J=z.flags.project;if(typeof J==="string"&&J)return J;return t(z.cwd)?.config.projectId??void 0}function ki(z,J){let V=z[J];if(typeof V!=="string"||V.trim()==="")throw new e("missing_argument",`--${J} is required.`);return V}var xi={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(`
403
+ `),supportsJson:!0,signIn:!0,options:["title","description"],args:{min:1,max:1},async run(z){let J=z.args[0],V=ki(z.flags,"title"),X=ki(z.flags,"description"),Y=await z.requireClient().cycles.propose({projectId:J,title:V,description:X});if(z.json)return z.stdout(Se(je(xi.name,Y))),0;return z.stdout(`${Ue([["project",J],["title",V],["status",Y.adopted?"adopted — the project is planning it now":"recorded — it will be planned on the next pass"]])}
404
+ `),0}},ji={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(`
405
+ `),supportsJson:!0,signIn:!0,options:["title","description"],args:{min:1,max:1},async run(z){let J=z.args[0],V=ki(z.flags,"description"),X=typeof z.flags.title==="string"?z.flags.title:void 0,Y=await z.requireClient().tasks.create({projectId:J,description:V,...X?{title:X}:{}});if(z.json)return z.stdout(Se(je(ji.name,Y))),0;return z.stdout(`${Ue([["task",Y.id],["project",J],["status",Y.status??"queued"],["note","not started — dispatch with `hlix cycles create`"]])}
406
+ `),0}},Ei={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(`
407
+ `),supportsJson:!0,signIn:!0,options:["project"],args:{min:0,max:1},async run(z){let J=z.args[0]??Si(z),V=z.requireClient(),X=J?await V.modelConfig.resolved(J):await V.modelConfig.resolved();if(z.json)return z.stdout(Se(je(Ei.name,X))),0;return z.stdout(`${Ue([["scope",J?`project ${J}`:"workspace"],["harness",X.cycle.harness],["source",X.cycle.source.harness]])}
408
+ `),0}},Pi={name:"harness set",summary:"Choose the coder a project or the workspace runs",usage:[`Usage: hlix harness set <${s.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(`
409
+ `),supportsJson:!0,signIn:!0,options:["org"],args:{min:1,max:2},async run(z){let J=z.args[0];if(!s.includes(J))throw new e("invalid_usage",`harness must be one of ${s.join(", ")}; got "${J}".`);let V=z.flags.org===!0,X=z.args[1]??(V?void 0:Si(z));if(X&&V)throw new e("invalid_usage","Name a project or pass --org, not both: they are different scopes.");if(!X&&!V)throw new e("invalid_usage","Name the project to set, or pass --org for the whole workspace.");let Y=z.requireClient(),Z=X?await Y.modelConfig.setProjectHarness(X,J):await Y.modelConfig.setHarness(J);if(z.json)return z.stdout(Se(je(Pi.name,Z))),0;return z.stdout(`${Ue([["scope",X?`project ${X}`:"workspace"],["harness",J]])}
410
+ `),0}},Ii={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(`
411
+ `),supportsJson:!0,signIn:!0,options:["org"],args:{min:0,max:1},async run(z){let J=z.flags.org===!0,V=z.args[0]??(J?void 0:Si(z));if(V&&J)throw new e("invalid_usage","Name a project or pass --org, not both: they are different scopes.");if(!V&&!J)throw new e("invalid_usage","Name the project to clear, or pass --org for the whole workspace.");let X=z.requireClient(),Y=V?await X.modelConfig.clearProjectHarness(V):await X.modelConfig.clearHarness();if(z.json)return z.stdout(Se(je(Ii.name,Y))),0;return z.stdout(`${Ue([["scope",V?`project ${V}`:"workspace"],["harness","cleared — the scope below decides now"]])}
412
+ `),0}};var f=[$r,Zo,Tr,Ra,Oa,ii,ci,ai,ei,Qs,as,cs,ls,Ms,ol,rl,nl,tl,Pl,gi,fi,hi,yi,wi,vi,oo,bi,ds,ps,us,ms,gs,hs,ys,ws,vs,ji,xi,Ei,Pi,Ii];import{emitKeypressEvents as Of}from"node:readline";import{createInterface as $l}from"node:readline/promises";async function W(z){if(!process.stdin.isTTY||!process.stdin.setRawMode)throw Error("Interactive login requires a terminal. Set HLIX_API_KEY for CI.");return process.stderr.write(z),Of(process.stdin),process.stdin.setRawMode(!0),process.stdin.resume(),new Promise((J,V)=>{let X="",Y=()=>{process.stdin.off("keypress",Z),process.stdin.setRawMode(!1),process.stdin.pause(),process.stderr.write(`
413
+ `)},Z=(Q,ee)=>{if(ee.ctrl&&ee.name==="c"||ee.name==="escape"){Y(),V(Error("Login cancelled."));return}if(ee.name==="return"||ee.name==="enter"){Y(),J(X);return}if(ee.name==="backspace"){X=X.slice(0,-1);return}if(Q&&!ee.ctrl)X+=Q};process.stdin.on("keypress",Z)})}async function C(z,J){if(!process.stdin.isTTY||!process.stderr.isTTY)throw Error("Interactive selection requires a terminal. Pass --workspace <id>.");let V=$l({input:process.stdin,output:process.stderr});try{for(let X=0;X<3;X+=1){let Y=(await V.question(z)).trim(),Z=Number(Y);if(Number.isInteger(Z)&&Z>=1&&Z<=J)return Z-1;process.stderr.write(`Enter a number between 1 and ${J}.
414
+ `)}throw Error("No workspace selected.")}finally{V.close()}}async function K(z){if(!process.stdin.isTTY||!process.stderr.isTTY)throw Error("Interactive approval requires a terminal. Review with --dry-run, then pass --yes.");let J=$l({input:process.stdin,output:process.stderr});try{let V=(await J.question(`${z}
415
+ Continue? [y/N] `)).trim().toLowerCase();return V==="y"||V==="yes"}finally{J.close()}}
416
+ export{e,v,h,j,n,x,y,d,b,t,r,a,w,g,q,o,u,c,S,A,p,m,s,O,k,E,I,i,l,D,_,P,F,T,R,H,U,B,G,N,M,L,f,W,C,K};