@hunsu/bridge 0.2.0-next.8 → 0.2.0-next.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cli.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -32,7 +32,7 @@ For advanced local package verification only, run setup from an absolute
|
|
|
32
32
|
tarball path:
|
|
33
33
|
|
|
34
34
|
```sh
|
|
35
|
-
hunsu-bridge setup --runtime-package /absolute/path/hunsu-bridge-0.2.0-next.
|
|
35
|
+
hunsu-bridge setup --runtime-package /absolute/path/hunsu-bridge-0.2.0-next.9.tgz
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
This option rejects URLs, dist-tags, ranges, Git specs, relative paths, and
|
package/dist/cli.js
CHANGED
|
@@ -201,7 +201,7 @@ ${n}
|
|
|
201
201
|
`),s=n.slice(i+2).trim();if(o[0]!==r)return Dn(`Invalid Hunsu runtime header in ${e}`);let a=new Map(o.slice(1).map(l=>{let f=l.indexOf(":");return f===-1?[l.trim(),""]:[l.slice(0,f).trim(),l.slice(f+1).trim()]}));if(a.get("encoding")!==tM)return Dn(`Unsupported Hunsu runtime encoding in ${e}: ${a.get("encoding")??"missing"}`);let c=a.get("checksum")?.replace(/^sha256:/,"");if(!c)return Dn(`Missing Hunsu runtime checksum in ${e}`);let u;try{u=$ie(Buffer.from(s,"base64url")).toString("utf8")}catch(l){return Dn(`Invalid Hunsu runtime payload in ${e}: ${l instanceof Error?l.message:String(l)}`)}let d=Ng(u);if(d!==c)return Dn(`Hunsu runtime checksum mismatch in ${e}`);try{return S({value:JSON.parse(u),checksum:sp(d)})}catch(l){return Dn(`Invalid Hunsu runtime JSON in ${e}: ${l instanceof Error?l.message:String(l)}`)}}function xoe(t){let e=qt(t),r=fu(e,cA);if(!Pg(r))return;let n=Bg(lM(dA(r,"utf8"),r));return{state:n,checksum:fM(n)}}function Soe(t,e){let r=qt(t);try{let n=Re(["show",`${e}:${cA}`],{cwd:r}),i=Bg(lM(n,`${e}:${cA}`));return{state:i,checksum:fM(i)}}catch(n){if(n instanceof Dr)return;throw n}}function lM(t,e){let r=vb(t,e,Wie);if(!r.ok)return r;let n=r.value.value;if(!n||typeof n!="object")return Dn(`Invalid legacy Hunsu runtime state JSON in ${e}: expected object`);let i=n;if(i.version!==1||!Array.isArray(i.events))return Dn(`Invalid legacy Hunsu runtime state in ${e}`);let o=[];for(let[s,a]of i.events.entries()){let c=ib(a);if(!c.ok)return Dn(`Invalid legacy Hunsu runtime state event ${s} in ${e}: ${c.error.message}`);o.push(c.value)}return S({version:1,events:o,...typeof i.updatedAt=="string"?{updatedAt:i.updatedAt}:{}})}function fM(t){return sp(Ng(`${JSON.stringify(t)}
|
|
202
202
|
`))}function Dn(t){return oe({type:"DomainStoreError",message:t})}function Cg(t,e,r){let n=fu(t,e,r);try{return S(JSON.parse(dA(n,"utf8")))}catch(i){return Dn(`Cannot read ${e}/${r}: ${i instanceof Error?i.message:String(i)}`)}}function el(t){return JSON.parse(JSON.stringify(t))}function lb(t){return JSON.stringify(uA(t))}function uA(t){return Array.isArray(t)?t.map(uA):t&&typeof t=="object"?Object.fromEntries(Object.entries(t).sort(([e],[r])=>e.localeCompare(r)).map(([e,r])=>[e,uA(r)])):t}function Bg(t){if(t.ok)return t.value;throw new Error(t.error.message)}function boe(t){try{return Xr(Re(["rev-parse","--verify","HEAD^{commit}"],{cwd:t}).trim())}catch(e){if(e instanceof Dr)return;throw e}}function woe(t){return t instanceof Error?"code"in t&&t.code==="ENOENT":!1}function Ng(t){return Hie("sha256").update(t).digest("hex")}function Ioe(t){let[e,r,n]=t.split(zie);return{ref:e,object:r,objectType:n,ordinal:Eoe(e)}}function Eoe(t){let r=t.slice(t.lastIndexOf("/")+1).match(/^E(\d+)(?:-|$)/);return r?Number.parseInt(r[1],10):Number.MAX_SAFE_INTEGER}import{existsSync as Ls,readFileSync as hM,readdirSync as koe,statSync as Roe,writeFileSync as Aoe}from"node:fs";import{basename as Coe,join as Fa,resolve as Poe}from"node:path";var _oe="Port Git Project",Toe="Make this project ready for Hunsu-managed MOVEs and Artifact Actions.";function IA(t=process.cwd()){let e=Poe(t),r=[],n=e,i=!1;try{n=qt(e),i=!0}catch{r.push("Not a Git repository. Hunsu Port expects an existing Git project.")}let o=Noe(n),s=o?.scripts??{},a=Boe(n,o),c=pM(n,/^Dockerfile(?:\.|$)/),u=pM(n,/^(?:docker-)?compose(?:\.[^.]+)?\.ya?ml$/),d=i&&gM(n),l=Doe(n),f=Ooe(n,s),p=[];return!o&&i&&r.push("No package.json found. Port can still create Roadmap state, but Artifact Actions may need a later Hunsu setup."),i&&!d&&r.push("Hunsu runtime state is missing. Port apply will create Initial Team state."),{root:n,isGitRepository:i,isHunsuRoadmap:d,packageManager:a,packageScripts:s,docker:{dockerfiles:c,composeFiles:u},artifactActions:l,env:f,recommendedFiles:p,issues:r}}function EA(t={}){let e=IA(t.cwd);if(!e.isGitRepository)throw new Error("Hunsu Port requires an existing Git repository");let r=t.title?.trim()||Coe(e.root)||_oe,n=t.goal?.trim()||Toe,i=t.destinations&&t.destinations.length>0?t.destinations:[{id:"destination_001",title:"Establish artifact-action-ready product execution",priority:100}],o=e.isHunsuRoadmap?[]:[{type:"CreateInitialTeam",requestId:mM("req",r),lineId:`run/${mM("req",r)}`,title:r,goal:n,destinations:i,harness:t.harness}];return{root:e.root,title:r,goal:n,destinations:i,inspection:e,files:[],commands:o}}function kA(t={}){let e=EA(t),r=[];for(let i of e.files){let o=Fa(e.root,i.path);Ls(o)||(Aoe(o,i.content,"utf8"),r.push(i.path))}let n=e.commands.length>0?Tg(e.commands,{cwd:e.root,commitMessage:`hunsu: port ${e.title}`}):{acceptedEvents:[],board:Bn(e.root).board};return{root:e.root,plan:e,writtenFiles:r,acceptedEvents:n.acceptedEvents,board:n.board}}function Doe(t){if(!gM(t))return{configured:!1,count:0,issues:[]};let e=Bn(t).board;return{configured:e.artifactActions.length>0,count:e.artifactActions.length,issues:[]}}function Boe(t,e){if(Ls(Fa(t,"pnpm-lock.yaml"))||e?.packageManager?.startsWith("pnpm@"))return"pnpm";if(Ls(Fa(t,"yarn.lock"))||e?.packageManager?.startsWith("yarn@"))return"yarn";if(Ls(Fa(t,"bun.lockb"))||Ls(Fa(t,"bun.lock"))||e?.packageManager?.startsWith("bun@"))return"bun";if(Ls(Fa(t,"package-lock.json"))||e)return"npm"}function Noe(t){let e=Fa(t,"package.json");if(Ls(e))return JSON.parse(hM(e,"utf8"))}function pM(t,e){return!Ls(t)||!Roe(t).isDirectory()?[]:koe(t).filter(r=>e.test(r)).sort()}function gM(t){try{return Dg(t)||xA(t).length>0||Re(["for-each-ref","--count=1","--format=%(refname)","refs/hunsu"],{cwd:t}).trim().length>0}catch(e){if(e instanceof Dr)return!1;throw e}}function Ooe(t,e){let r=[".env",".env.local",".env.development",".env.example"].filter(i=>Ls(Fa(t,i))),n=Object.entries(e).filter(([,i])=>/\b(?:3000|5173|8080|4187)\b|localhost|127\.0\.0\.1/.test(i)).map(([i])=>`package.json scripts.${i}`);for(let i of["vite.config.ts","vite.config.js","next.config.js","next.config.mjs"]){let o=Fa(t,i);if(!Ls(o))continue;let s=hM(o,"utf8");/\b(?:3000|5173|8080|4187)\b|localhost|127\.0\.0\.1/.test(s)&&n.push(i)}return{files:r,hardcodedHints:n}}function mM(t,e){let r=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,48);return`${t}_${r||"project"}`}import{createHash as Moe}from"node:crypto";import{spawnSync as Loe}from"node:child_process";import{existsSync as wb,mkdirSync as yM,readFileSync as Hoe,readdirSync as Uoe,rmSync as vM,writeFileSync as $oe}from"node:fs";import{tmpdir as Foe}from"node:os";import{basename as joe,join as xb,resolve as CA}from"node:path";function xM(t=process.cwd(),e){let r=qt(t),n=Bn(r);if(e){let i=n.board.moves.find(s=>s.id===e);if(!i)throw new Error(`No MOVE found for Artifact Action source: ${e}`);let o=n.board.nodes.find(s=>s.id===i.toNodeId);return bb(i.snapshot?.artifactActions??o?.artifactActions??[])}return bb(n.board.artifactActions)}function PA(t){let e=qt(t.cwd??process.cwd()),r=qoe(e,t),n=r.actions.find(d=>d.id===t.actionId);if(!n)throw new Error(`Unknown Artifact Action for selected source: ${t.actionId}`);Woe(n,r.source);let i=t.now??new Date().toISOString(),o=Xoe(n.id,r.source,i),s=t.baseActionPath??Joe(t.roadmapId,o),a=n.kind==="host"?Goe(n,s):void 0,c=_A(n,t.env,t.ambientEnv),u={runId:o,actionId:n.id,roadmapId:t.roadmapId,action:AA(n),source:r.source,status:"queued",env:Voe(n,c),aliases:a,createdAt:i,updatedAt:i};return{action:AA(n),run:u,commands:IM(e,n,u,c)}}function SM(t,e={}){let r=qt(t.cwd??process.cwd()),n=PA(t),i=t.now??new Date().toISOString(),o=Koe(r,n.run.runId,n.run.source.commit,i,t.worktreeRoot),s=t.processEnv??e.processEnv,a=e.runner??((l,f,p)=>PM(l,f,{...p,processEnv:s})),c={...n.run,status:(n.action.kind==="host","running"),sourceWorktree:o,updatedAt:i},u=_A(n.action,t.env,t.ambientEnv),d=IM(r,n.action,c,u);try{if(n.action.runner.type==="docker_compose")Og(a,d[0]),Og(a,d[1]),c.aliases=zoe(r,c,a,u),c.status="running";else{let l=Og(a,d[0]);if(c.exitCode=l.status,c.stdout=l.stdout,c.stderr=l.stderr,c.status=n.action.kind==="host"?"running":"succeeded",n.action.kind==="check"){let f=Sb(r,o.path);c.sourceWorktree={...o,removedAt:f}}}c.updatedAt=new Date().toISOString()}catch(l){c.status="failed",c.updatedAt=new Date().toISOString(),c.error=l instanceof Error?l.message:String(l);let f=Sb(r,o.path);c.sourceWorktree={...o,removedAt:f}}if(e.store!==!1&&kM(r,c),c.status==="failed")throw new Error(c.error??`Artifact Action ${c.runId} failed`);return c}function bM(t=process.cwd()){let e=qt(t),r=TA(e);return wb(r)?Uoe(r).filter(n=>n.endsWith(".json")).map(n=>Mg(e,n.slice(0,-5))).sort((n,i)=>i.updatedAt.localeCompare(n.updatedAt)):[]}function Mg(t,e){let r=qt(t),n=RM(r,e);if(!wb(n))throw new Error(`Unknown Artifact Action Run: ${e}`);return JSON.parse(Hoe(n,"utf8"))}function wM(t,e,r={}){let n=qt(t),i=Mg(n,e),o=r.runner??((u,d,l)=>PM(u,d,{...l,processEnv:r.processEnv})),s=_A(i.action,i.env,r.processEnv);i.action.runner.type==="docker_compose"?Og(o,RA(n,i,["down"],s)):i.action.runner.stopCommand&&Og(o,EM(n,i,i.action.runner.stopCommand,s));let a=i.sourceWorktree?.path?Sb(n,i.sourceWorktree.path):void 0,c={...i,sourceWorktree:i.sourceWorktree?{...i.sourceWorktree,removedAt:a}:void 0,status:"stopped",stoppedAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return r.store!==!1&&kM(n,c),c}function qoe(t,e){if(e.moveId&&e.commit)throw new Error("Artifact Action source accepts either moveId or commit, not both");let r=Bn(t);if(e.moveId){let i=r.board.moves.find(s=>s.id===e.moveId);if(!i)throw new Error(`No MOVE found for Artifact Action source: ${e.moveId}`);let o=r.board.nodes.find(s=>s.id===i.toNodeId);return{source:{moveId:i.id,commit:Re(["rev-parse","--verify",`${i.commit}^{commit}`],{cwd:t}).trim(),ref:i.commit},actions:bb(i.snapshot?.artifactActions??o?.artifactActions??[])}}let n=e.commit??"HEAD";return{source:{commit:Re(["rev-parse","--verify",`${n}^{commit}`],{cwd:t}).trim(),ref:n},actions:bb(r.board.artifactActions)}}function Woe(t,e){if(t.sourceScope==="move"&&!e.moveId)throw new Error(`Artifact Action ${t.id} can only run against a MOVE source`);if(t.sourceScope==="commit"&&e.moveId)throw new Error(`Artifact Action ${t.id} can only run against a commit source`)}function _A(t,e={},r={}){let n={},i=new Set;for(let[o,s]of Object.entries(t.env??{}))if(i.add(o),"default"in s)n[o]=e[o]??String(s.default);else if("value"in s)n[o]=e[o]??String(s.value);else if("alias"in s){let a=t.aliases?.[s.alias];if(!a)throw new Error(`Artifact Action env ${o} references unknown alias: ${s.alias}`);n[o]=String(a.containerPort??a.target??"")}else if("fromAliasUrl"in s){let a=t.aliases?.[s.fromAliasUrl];if(!a)throw new Error(`Artifact Action env ${o} references unknown alias: ${s.fromAliasUrl}`);n[o]=a.service&&a.containerPort?`http://${a.service}:${a.containerPort}`:String(a.target??"")}else if(s.required){let a=e[o]??r[o];if(!a)throw new Error(`Artifact Action env ${o} is required but not set`);n[o]=a}for(let[o,s]of Object.entries(e))i.has(o)||(n[o]=s);return n}function Voe(t,e){let r={};for(let[n,i]of Object.entries(e)){let o=t.env?.[n];r[n]=o&&"required"in o&&o.secret?"<secret>":i}return r}function IM(t,e,r,n){return e.runner.type==="docker_compose"?[RA(t,r,["build"],n),RA(t,r,["up","-d"],n)]:[EM(t,r,e.runner.command,n)]}function RA(t,e,r,n){if(e.action.runner.type!=="docker_compose")throw new Error(`Artifact Action ${e.actionId} does not use docker compose`);let i=e.source.commit.slice(0,12),o=AM(CM(e.action.runner.projectName??`hunsu-${e.actionId}-${i}`,{actionId:e.actionId,runId:e.runId,commit:e.source.commit,shortCommit:i,moveId:e.source.moveId??""}));return{command:"docker",args:["compose","-f",CA(e.sourceWorktree?.path??t,e.action.runner.file),"-p",o,...r],cwd:e.sourceWorktree?.path??t,env:n}}function EM(t,e,r,n){return{command:"sh",args:["-lc",r],cwd:e.sourceWorktree?.path??t,env:n}}function Og(t,e){let r=t(e.command,e.args,{cwd:e.cwd,env:e.env});if(r.status!==0)throw new Error(`${e.command} ${e.args.join(" ")} failed
|
|
203
203
|
${r.stderr||r.stdout}`);return r}function Goe(t,e){if(t.aliases)return Object.fromEntries(Object.entries(t.aliases).map(([r,n])=>[r,{alias:r,service:n.service,containerPort:n.containerPort,healthPath:n.healthPath,target:n.target,internalUrl:n.service&&n.containerPort?`http://${n.service}:${n.containerPort}`:n.target,externalPath:`${e}/${encodeURIComponent(r)}/`}]))}function zoe(t,e,r,n){if(!e.aliases||e.action.runner.type!=="docker_compose")return e.aliases;let i=e.action.runner;return Object.fromEntries(Object.entries(e.aliases).map(([o,s])=>{if(!s.service||!s.containerPort)return[o,s];let a=r("docker",["compose","-f",CA(e.sourceWorktree?.path??t,i.file),"-p",AM(CM(i.projectName??`hunsu-${e.actionId}-${e.source.commit.slice(0,12)}`,{actionId:e.actionId,runId:e.runId,commit:e.source.commit,shortCommit:e.source.commit.slice(0,12),moveId:e.source.moveId??""})),"port",s.service,String(s.containerPort)],{cwd:e.sourceWorktree?.path??t,env:n});return a.status!==0||!a.stdout.trim()?[o,s]:[o,{...s,directUrl:Qoe(a.stdout.trim())}]}))}function Koe(t,e,r,n,i){let o=CA(i??xb(Foe(),"hunsu-action-runs",`${joe(t)}-${Yoe(t)}`)),s=xb(o,DA(e));return yM(o,{recursive:!0}),wb(s)&&(Sb(t,s),vM(s,{recursive:!0,force:!0})),Re(["worktree","add","--detach",s,r],{cwd:t}),{path:s,commit:r,createdAt:n}}function Sb(t,e){let r=new Date().toISOString();if(!wb(e))return r;try{Re(["worktree","remove","--force",e],{cwd:t})}catch{vM(e,{recursive:!0,force:!0}),Re(["worktree","prune"],{cwd:t})}return r}function kM(t,e){yM(TA(t),{recursive:!0}),$oe(RM(t,e.runId),`${JSON.stringify(e,null,2)}
|
|
204
|
-
`,"utf8")}function TA(t){return xb(t,".hunsu","action-runs")}function RM(t,e){return xb(TA(t),`${DA(e)}.json`)}function Joe(t,e){return t?`/api/roadmaps/${encodeURIComponent(t)}/action-runs/${encodeURIComponent(e)}/proxy`:`/api/action-runs/${encodeURIComponent(e)}/proxy`}function Xoe(t,e,r){return DA(`${t}-${e.moveId??e.commit.slice(0,12)}-${r.replace(/[^0-9A-Za-z]/g,"").slice(0,14)}`)}function DA(t){return t.toLowerCase().replace(/[^a-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"")||"action-run"}function AM(t){return t.toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,63)||"hunsu-action"}function CM(t,e){return t.replace(/\{([a-zA-Z][a-zA-Z0-9]*)\}/g,(r,n)=>e[n]??"")}function Yoe(t){return Moe("sha256").update(t).digest("hex").slice(0,12)}function Qoe(t){let e=t.split(/\r?\n/).find(Boolean)??t,r=e.match(/(?:0\.0\.0\.0|127\.0\.0\.1|localhost|\[::\]|::):(\d+)$/);return r?`http://127.0.0.1:${r[1]}`:/^https?:\/\//.test(e)?e:`http://${e}`}function PM(t,e,r){let n=Loe(t,e,{cwd:r.cwd,env:{...Zoe(r.processEnv),...r.env},encoding:"utf8",maxBuffer:16777216});return{status:n.status??1,stdout:n.stdout,stderr:n.stderr}}function Zoe(t){if(t===void 0)return;let e={};for(let[r,n]of Object.entries(t))n!==void 0&&(e[r]=n);return e}function bb(t){return t.map(AA).sort((e,r)=>e.displayOrder-r.displayOrder||String(e.id).localeCompare(String(r.id)))}function AA(t){return{...t,env:t.env?Object.fromEntries(Object.entries(t.env).map(([e,r])=>[e,{...r}])):void 0,runner:{...t.runner},aliases:t.aliases?Object.fromEntries(Object.entries(t.aliases).map(([e,r])=>[e,{...r}])):void 0,evidence:t.evidence?{...t.evidence,paths:t.evidence.paths?.slice()}:void 0}}import{createHash as ese}from"node:crypto";var tse="hunsu.hub-package-manifest.v1",_M="hunsu-json-c14n-v1+sha256:";function rse(t){MA(t);let{integrity:e,...r}=t;return JSON.stringify(OA(r,"manifest"))}function nse(t){let e=rse(t);return`${_M}${ese("sha256").update(e,"utf8").digest("hex")}`}async function Lg(t,e){if(!t.integrity.startsWith(_M))throw new Error(`Unsupported Hub package integrity prefix: ${t.integrity}`);let r=e.origins.find(a=>a.name===t.origin);if(!r)throw new Error(`Unknown Origin: ${t.origin}`);if(r.transport!=="http")throw new Error(`Origin ${r.name} uses unsupported transport ${r.transport}`);let i=await(e.fetch??fetch)(ise(r.url,t.kind,t.key,t.version));if(!i.ok)throw i.status===404?new Error(`Missing Hub package manifest: ${t.origin}/${t.kind}/${t.key}@${t.version}`):new Error(`Origin ${r.name} returned ${i.status} for ${t.kind}/${t.key}@${t.version}`);let o=await i.json();if(MA(o),o.kind!==t.kind||o.key!==t.key||o.version!==t.version)throw new Error(`Hub package manifest from ${r.name} does not match requested ${t.kind}/${t.key}@${t.version}`);let s=nse(o);if(s!==t.integrity)throw new Error(`Hub package integrity mismatch for ${t.origin}/${t.kind}/${t.key}@${t.version}: expected ${t.integrity}, got ${s}`);return{lock:{...t},manifest:o,integrity:s,origin:{...r}}}function ise(t,e,r,n){let i=new URL(t),o=`/v1/packages/${e}/${encodeURIComponent(r)}/versions/${encodeURIComponent(n)}`;return new URL(o,i).toString()}function TM(t){if(MA(t),t.kind!=="team")throw new Error(`Hub package ${t.kind}/${t.key}@${t.version} is not a team package`);return dse(t.team)}function MA(t){let e=BA(t,"manifest");if(e.schema!==tse)throw new Error(`Unsupported Hub package manifest schema: ${String(e.schema)}`);NA(e,["integrity","key","kind","team","member","manager","schema","skill","version"],"manifest");let r=use(e.kind,"manifest.kind");switch(up(e.key,"manifest.key"),up(e.version,"manifest.version"),e.integrity!==void 0&&up(e.integrity,"manifest.integrity"),r){case"team":if(ose(e.team),e.member!==void 0||e.manager!==void 0||e.skill!==void 0)throw new Error("Team package manifest must not include member, manager, or skill payloads");return;case"member":if(sse(e.member),e.team!==void 0||e.manager!==void 0||e.skill!==void 0)throw new Error("Member package manifest must not include team, manager, or skill payloads");return;case"manager":if(ase(e.manager),e.team!==void 0||e.member!==void 0||e.skill!==void 0)throw new Error("Manager package manifest must not include team, member, or skill payloads");return;case"skill":if(cse(e.skill),e.team!==void 0||e.member!==void 0||e.manager!==void 0)throw new Error("Skill package manifest must not include team, member, or manager payloads");return}}function ose(t){let e=Jd(t,"manifest.team");if(!e.ok)throw new Error(`Invalid manifest.team: ${e.error.message}`)}function sse(t){let e=p1(t,"manifest.member");if(!e.ok)throw new Error(`Invalid manifest.member: ${e.error.message}`)}function ase(t){let e=og(t,"manifest.manager");if(!e.ok)throw new Error(`Invalid manifest.manager: ${e.error.message}`)}function cse(t){let e=BA(t,"manifest.skill");if(NA(e,["contentHash","files","name"],"manifest.skill"),up(e.name,"manifest.skill.name"),up(e.contentHash,"manifest.skill.contentHash"),e.files!==void 0){if(!Array.isArray(e.files))throw new Error("manifest.skill.files must be an array");for(let[r,n]of e.files.entries()){let i=BA(n,`manifest.skill.files[${r}]`);NA(i,["path","text"],`manifest.skill.files[${r}]`),up(i.path,`manifest.skill.files[${r}].path`),DM(i.text,`manifest.skill.files[${r}].text`)}}}function use(t,e){if(t==="team"||t==="member"||t==="manager"||t==="skill")return t;throw new Error(`${e} must be team, member, manager, or skill`)}function BA(t,e){if(typeof t!="object"||t===null||Array.isArray(t))throw new Error(`${e} must be an object`);return t}function NA(t,e,r){let n=e.filter(o=>o!=="integrity"&&o!=="team"&&o!=="member"&&o!=="manager"&&o!=="skill"&&o!=="files"&&!(o in t));if(n.length>0)throw new Error(`${r} is missing required keys: ${n.join(", ")}`);let i=Object.keys(t).filter(o=>!e.includes(o));if(i.length>0)throw new Error(`${r} has unsupported keys: ${i.join(", ")}`)}function DM(t,e){if(typeof t!="string")throw new Error(`${e} must be a string`);return t}function up(t,e){let r=DM(t,e);if(r.trim().length===0)throw new Error(`${e} must be non-empty`);return r}function OA(t,e){if(t===null||typeof t=="string"||typeof t=="boolean")return t;if(typeof t=="number"){if(!Number.isFinite(t))throw new Error(`${e} must be a finite number`);return t}if(Array.isArray(t))return t.map((r,n)=>{if(r===void 0)throw new Error(`${e}[${n}] must not be undefined`);return OA(r,`${e}[${n}]`)});if(typeof t=="object"&&t!==null){let r=t,n={};for(let i of Object.keys(r).sort()){let o=r[i];o!==void 0&&(n[i]=OA(o,`${e}.${i}`))}return n}throw new Error(`${e} must be JSON-serializable`)}function dse(t){return JSON.parse(JSON.stringify(t))}function wt(t,e,r){return r===void 0?{code:t,message:e}:{code:t,message:e,details:r}}function Hg(t){let e=new Error(t.message);return e.name=`ExecuteOrchestrationError:${t.code}`,t.details!==void 0&&(e.details=t.details),e}function tl(t){if(t.ok)return t.value;throw Hg(t.error)}function HA(t){let e=jM(t,"Team planning final response must be a JSON ExecutionPlan object");return e.ok?$A(e.value,"execution"):e}function NM(t){let e=jM(t,"Goal evaluator final response must be a JSON object");if(!e.ok)return e;let r=e.value;if(r.type==="pass"){if(typeof r.summary!="string"||r.summary.trim()==="")return oe(wt("goal_evaluation_invalid","pass evaluation must include a non-empty summary"));let n=LA(r.evidence,"evidence");return n.ok?S({type:"pass",summary:r.summary,evidence:n.value}):n}if(r.type==="fail"){if(typeof r.reason!="string"||r.reason.trim()==="")return oe(wt("goal_evaluation_invalid","fail evaluation must include a non-empty reason"));if(typeof r.feedback!="string"||r.feedback.trim()==="")return oe(wt("goal_evaluation_invalid","fail evaluation must include non-empty feedback"));if(r.nextGoal!==void 0&&typeof r.nextGoal!="string")return oe(wt("goal_evaluation_invalid","fail evaluation nextGoal must be a string when present"));let n=LA(r.evidence,"evidence");return n.ok?S({type:"fail",reason:r.reason,feedback:r.feedback,nextGoal:typeof r.nextGoal=="string"&&r.nextGoal.trim()!==""?r.nextGoal:void 0,evidence:n.value}):n}return oe(wt("goal_evaluation_invalid","Goal evaluator response type must be pass or fail"))}function UA(t,e,r,n){if(e==="assignee")return{id:r,executorId:t.assignee.executorId,goal:t.assignee.goal,requires:n};let i=t.evaluator;if(!i)throw new Error(`Goal ${t.id} does not define an evaluator`);return{id:r,executorId:i.executorId,goal:i.prompt,requires:n}}function OM(t,e){let[,...r]=t.items;if(e)return{...t,items:[e,...r]};if(r.length!==0)return{...t,items:r}}function $A(t,e){return Ug(t)?t.kind==="queue"?lse(t,e):t.kind==="goal"?MM(t,e):t.kind==="continuation"?fse(t,e):oe(wt("execution_plan_invalid",`${e}.kind must be queue, goal, or continuation`)):oe(wt("execution_plan_invalid",`${e} must be an object`))}function lse(t,e){let r=HM(t.id,`${e}.id`);if(!r.ok)return r;if(!Array.isArray(t.items))return oe(wt("execution_plan_invalid",`${e}.items must be an array`));let n=[];for(let[i,o]of t.items.entries()){let s=$A(o,`${e}.items[${i}]`);if(!s.ok)return s;n.push(s.value)}return S({kind:"queue",id:r.value,items:n})}function MM(t,e){return t.stage==="needs_evaluation"?LM(t,e):t.stage==="needs_execution"?pse(t,e):oe(wt("execution_plan_invalid",`${e}.stage must be needs_evaluation or needs_execution`))}function fse(t,e){let r=FA(t.id,`${e}.id`);if(!r.ok)return r;let n=UM(t.teamScopeId,`${e}.teamScopeId`);if(!n.ok)return n;let i=$A(t.execution,`${e}.execution`);if(!i.ok)return i;let o=t.continuation===void 0?S(void 0):Ug(t.continuation)?MM(t.continuation,`${e}.continuation`):oe(wt("execution_plan_invalid",`${e}.continuation must be an object`));return o.ok?S({kind:"continuation",id:r.value,teamScopeId:n.value,execution:i.value,continuation:o.value}):o}function LM(t,e){let r=FA(t.id,`${e}.id`);if(!r.ok)return r;let n=BM(t.assignee,`${e}.assignee`,"goal");if(!n.ok)return n;let i=t.evaluator===void 0||t.evaluator===null?S(void 0):BM(t.evaluator,`${e}.evaluator`,"prompt");if(!i.ok)return i;let o=G3(t.remainingAttempts,`${e}.remainingAttempts`);if(!o.ok)return oe(wt("execution_plan_invalid",o.error.message));let s=hse(t.requires,`${e}.requires`);return s.ok?S({kind:"goal",stage:"needs_evaluation",id:r.value,assignee:{executorId:n.value.executorId,goal:n.value.text},evaluator:i.value?{executorId:i.value.executorId,prompt:i.value.text}:void 0,remainingAttempts:o.value,requires:s.value}):s}function pse(t,e){let r=LM({...t,stage:"needs_evaluation"},e);if(!r.ok)return r;let n=FA(t.evaluationPathId,`${e}.evaluationPathId`);if(!n.ok)return n;let i=mse(t.evaluation,`${e}.evaluation`);if(!i.ok)return i;if(!Array.isArray(t.requires))return oe(wt("execution_plan_invalid",`${e}.requires must be an array for needs_execution`));let o=$M(t.requires,`${e}.requires`);return o.ok?o.value.length!==1||o.value[0]!==n.value?oe(wt("execution_plan_invalid",`${e}.requires must contain only ${e}.evaluationPathId`)):S({...r.value,stage:"needs_execution",evaluationPathId:n.value,evaluation:i.value,requires:o.value}):o}function BM(t,e,r){if(!Ug(t))return oe(wt("execution_plan_invalid",`${e} must be an object`));let n=UM(t.executorId,`${e}.executorId`);if(!n.ok)return n;let i=HM(t[r],`${e}.${r}`);return i.ok?S({executorId:n.value,text:i.value}):i}function mse(t,e){if(!Ug(t))return oe(wt("execution_plan_invalid",`${e} must be an object`));if(t.type!=="fail")return oe(wt("execution_plan_invalid",`${e}.type must be fail`));if(typeof t.reason!="string"||t.reason.trim()==="")return oe(wt("execution_plan_invalid",`${e}.reason must be a non-empty string`));if(typeof t.feedback!="string"||t.feedback.trim()==="")return oe(wt("execution_plan_invalid",`${e}.feedback must be a non-empty string`));if(t.nextGoal!==void 0&&typeof t.nextGoal!="string")return oe(wt("execution_plan_invalid",`${e}.nextGoal must be a string when present`));let r=LA(t.evidence,`${e}.evidence`);return r.ok?S({type:"fail",reason:t.reason,feedback:t.feedback,nextGoal:typeof t.nextGoal=="string"&&t.nextGoal.trim()!==""?t.nextGoal:void 0,evidence:r.value}):r}function HM(t,e){return typeof t!="string"||t.trim()===""?oe(wt("execution_plan_invalid",`${e} must be a non-empty string`)):S(t)}function FA(t,e){let r=Ee(t,e);return r.ok?S(r.value):oe(wt("execution_plan_invalid",r.error.message))}function UM(t,e){let r=Ee(t,e);return r.ok?S(r.value):oe(wt("execution_plan_invalid",r.error.message))}function hse(t,e){return t==="PrevMove"?S("PrevMove"):$M(t,e)}function $M(t,e){let r=FM(t,e,"execution_plan_invalid");if(!r.ok)return r;let n=[];for(let[i,o]of r.value.entries()){let s=Ee(o,`${e}[${i}]`);if(!s.ok)return oe(wt("execution_plan_invalid",s.error.message));n.push(s.value)}return S(n)}function LA(t,e){return t===void 0?S(void 0):FM(t,e,"goal_evaluation_invalid")}function FM(t,e,r){return Array.isArray(t)?t.every(n=>typeof n=="string")?S([...t]):oe(wt(r,`${e} must be an array of strings`)):oe(wt(r,`${e} must be an array of strings`))}function jM(t,e){try{let r=JSON.parse(t);return Ug(r)?S(r):oe(wt("execution_plan_invalid",e))}catch(r){return oe(wt("execution_plan_invalid",e,{cause:r instanceof Error?r.message:String(r)}))}}function Ug(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function jA(t){let{line:e,lineNode:r}=t;if(!r)return oe(wt("invalid_start_state",`No execute-ready MOVE found for Team route ${e.id}`));if(e.status==="failed"||e.status==="complete"||e.status==="abandoned")return oe(wt("invalid_start_state",`Cannot start Execute from ${e.id} because the route is ${e.status}`));if(new Set(t.board.edges.filter(a=>a.type==="move").map(a=>a.fromNodeId)).has(r.id))return oe(wt("invalid_start_state",`Cannot start Execute from ${qM(r,t.formatMovePosition)} because Arrived or Accident already exists`));if(t.existingRuns.find(a=>a.sourceNodeId===r.id&&(a.status==="running"||a.status==="paused")))return oe(wt("active_execute_exists",`A Execute is already active for ${qM(r,t.formatMovePosition)}`));let o=Ba(r.ordinal+1,"targetMoveOrdinal");if(!o.ok)return oe(wt("invalid_start_state",o.error.message));let s=gse(t.selectedDestinationIds,t.activeDestinations);return s.ok?S({lineNode:r,selectedDestinationIds:s.value,targetMoveOrdinal:o.value}):s}function WM(t){return t?S(t):oe(wt("terminal_output_missing","ExecutionPlan completed without a terminal output"))}function gse(t,e){let r=yse(e);return t&&t.length>0?t.length!==1?oe(wt("invalid_start_state","Execute must select exactly one Destination")):r&&t[0]===r.id?S([...t]):oe(wt("invalid_start_state","Execute must select the next Destination in the queue")):S(r?[r.id]:[])}function yse(t){return[...t].sort(vse)[0]}function vse(t,e){return(e.priority??0)-(t.priority??0)}function qM(t,e){return e?e(t):`${t.teamName??"Team"} MOVE ${t.ordinal}`}import{execFile as Ese,spawn as kse}from"node:child_process";import{accessSync as Rse,constants as Ase,existsSync as $g,readdirSync as Cse,statSync as Pse}from"node:fs";import{delimiter as zM,isAbsolute as Rb,join as Hs}from"node:path";import{promisify as _se}from"node:util";function Ib(t,e,r,n=process.platform){return n!=="win32"||!/\.(?:cmd|bat)$/iu.test(t)?{command:t,args:e}:{command:r.ComSpec??r.COMSPEC??"cmd.exe",args:["/d","/s","/v:off","/c",xse(t,e)],windowsVerbatimArguments:!0}}function xse(t,e){return`"${[t,...e].map(Sse).join(" ")}"`}function Sse(t){if(/[%"\u0000-\u001f\u007f]/u.test(t))throw new Error("Windows command-shim paths and arguments cannot contain percent, quote, or control characters.");return`"${t}"`}var bn="0.2.0-next.8",rl="local-bridge-v1";import{win32 as bse}from"node:path";var wse=new Set(["psmodulepath","winpsmodulepath"]);function Eb(t,e){if(/[\u0000-\u001f\u007f]/u.test(t))throw new Error("Windows ACL paths cannot contain control characters.");if(!/^[A-Za-z][A-Za-z0-9]*$/u.test(e))throw new Error("Windows ACL PowerShell variable names must be identifiers.");let r=`$${e}`,n=["$ErrorActionPreference = 'Stop'",`${r} = ${Ise(t)}`,"$sid = [System.Security.Principal.WindowsIdentity]::GetCurrent().User","$acl = [System.Security.AccessControl.FileSecurity]::new()","$acl.SetOwner($sid)","$acl.SetAccessRuleProtection($true, $false)","$rule = [System.Security.AccessControl.FileSystemAccessRule]::new($sid, [System.Security.AccessControl.FileSystemRights]::FullControl, [System.Security.AccessControl.AccessControlType]::Allow)","$acl.SetAccessRule($rule)",`[System.IO.File]::SetAccessControl(${r}, $acl)`].join("; ");return{command:"powershell.exe",args:["-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-EncodedCommand",Buffer.from(n,"utf16le").toString("base64")]}}function kb(t){let e=bse.basename(t).toLowerCase();return e==="powershell"||e==="powershell.exe"}function Ko(t){let e={};for(let[r,n]of Object.entries(t))wse.has(r.toLowerCase())||n===void 0||(e[r]=n);return e}function Ise(t){return`'${t.replace(/'/g,"''")}'`}var Cb=_se(Ese),jg=3500;async function hu(t={}){let e=t.env??Ar(),r=t.platform??process.platform,n=await Tse({env:e,platform:r,customBinaryPath:t.customBinaryPath}),i=[];for(let c of n){let u=await Dse(c,e,r,t.timeoutMs);if(i.push(u),c.rejectWhitespace&&u.error?.includes("HUNSU_CODEX_APP_SERVER_COMMAND"))return{installed:!1,source:u.source,appServerAvailable:!1,discovery:i,error:u.error};if(u.usable&&u.path)return{installed:!0,binaryPath:u.path,source:u.source,version:u.version,appServerAvailable:!0,discovery:i}}let o=i.find(c=>c.path&&c.versionOk===!0&&c.appServerOk===!1);if(o?.path)return{installed:!0,binaryPath:o.path,source:o.source,version:o.version,appServerAvailable:!1,discovery:i,error:o.error??"Codex was found, but Codex app-server is not available."};let s=i.find(c=>c.source==="windows_apps_alias"||c.path&&GA(c.path,r));if(s)return{installed:!1,binaryPath:s.path,source:"windows_apps_alias",appServerAvailable:!1,discovery:i,aliasDetected:!0,error:s.error??"Codex resolved to a WindowsApps execution alias. Select the real Codex binary path in Hunsu Bridge."};let a=i.find(c=>c.path)??i[0];return{installed:!1,binaryPath:a?.path,source:a?.source??"unknown",appServerAvailable:!1,discovery:i,error:a?.error??"Codex CLI was not found by Hunsu Bridge."}}async function Pb(t){try{let e=t.env??Ar(),r=t.platform??process.platform,n=XM(t.binaryPath,["--version"],e,r),{stdout:i,stderr:o}=await Cb(n.command,n.args,{env:YM(e,r),timeout:t.timeoutMs??jg,windowsHide:!0,windowsVerbatimArguments:n.windowsVerbatimArguments,maxBuffer:64*1024});return`${i}
|
|
204
|
+
`,"utf8")}function TA(t){return xb(t,".hunsu","action-runs")}function RM(t,e){return xb(TA(t),`${DA(e)}.json`)}function Joe(t,e){return t?`/api/roadmaps/${encodeURIComponent(t)}/action-runs/${encodeURIComponent(e)}/proxy`:`/api/action-runs/${encodeURIComponent(e)}/proxy`}function Xoe(t,e,r){return DA(`${t}-${e.moveId??e.commit.slice(0,12)}-${r.replace(/[^0-9A-Za-z]/g,"").slice(0,14)}`)}function DA(t){return t.toLowerCase().replace(/[^a-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"")||"action-run"}function AM(t){return t.toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,63)||"hunsu-action"}function CM(t,e){return t.replace(/\{([a-zA-Z][a-zA-Z0-9]*)\}/g,(r,n)=>e[n]??"")}function Yoe(t){return Moe("sha256").update(t).digest("hex").slice(0,12)}function Qoe(t){let e=t.split(/\r?\n/).find(Boolean)??t,r=e.match(/(?:0\.0\.0\.0|127\.0\.0\.1|localhost|\[::\]|::):(\d+)$/);return r?`http://127.0.0.1:${r[1]}`:/^https?:\/\//.test(e)?e:`http://${e}`}function PM(t,e,r){let n=Loe(t,e,{cwd:r.cwd,env:{...Zoe(r.processEnv),...r.env},encoding:"utf8",maxBuffer:16777216});return{status:n.status??1,stdout:n.stdout,stderr:n.stderr}}function Zoe(t){if(t===void 0)return;let e={};for(let[r,n]of Object.entries(t))n!==void 0&&(e[r]=n);return e}function bb(t){return t.map(AA).sort((e,r)=>e.displayOrder-r.displayOrder||String(e.id).localeCompare(String(r.id)))}function AA(t){return{...t,env:t.env?Object.fromEntries(Object.entries(t.env).map(([e,r])=>[e,{...r}])):void 0,runner:{...t.runner},aliases:t.aliases?Object.fromEntries(Object.entries(t.aliases).map(([e,r])=>[e,{...r}])):void 0,evidence:t.evidence?{...t.evidence,paths:t.evidence.paths?.slice()}:void 0}}import{createHash as ese}from"node:crypto";var tse="hunsu.hub-package-manifest.v1",_M="hunsu-json-c14n-v1+sha256:";function rse(t){MA(t);let{integrity:e,...r}=t;return JSON.stringify(OA(r,"manifest"))}function nse(t){let e=rse(t);return`${_M}${ese("sha256").update(e,"utf8").digest("hex")}`}async function Lg(t,e){if(!t.integrity.startsWith(_M))throw new Error(`Unsupported Hub package integrity prefix: ${t.integrity}`);let r=e.origins.find(a=>a.name===t.origin);if(!r)throw new Error(`Unknown Origin: ${t.origin}`);if(r.transport!=="http")throw new Error(`Origin ${r.name} uses unsupported transport ${r.transport}`);let i=await(e.fetch??fetch)(ise(r.url,t.kind,t.key,t.version));if(!i.ok)throw i.status===404?new Error(`Missing Hub package manifest: ${t.origin}/${t.kind}/${t.key}@${t.version}`):new Error(`Origin ${r.name} returned ${i.status} for ${t.kind}/${t.key}@${t.version}`);let o=await i.json();if(MA(o),o.kind!==t.kind||o.key!==t.key||o.version!==t.version)throw new Error(`Hub package manifest from ${r.name} does not match requested ${t.kind}/${t.key}@${t.version}`);let s=nse(o);if(s!==t.integrity)throw new Error(`Hub package integrity mismatch for ${t.origin}/${t.kind}/${t.key}@${t.version}: expected ${t.integrity}, got ${s}`);return{lock:{...t},manifest:o,integrity:s,origin:{...r}}}function ise(t,e,r,n){let i=new URL(t),o=`/v1/packages/${e}/${encodeURIComponent(r)}/versions/${encodeURIComponent(n)}`;return new URL(o,i).toString()}function TM(t){if(MA(t),t.kind!=="team")throw new Error(`Hub package ${t.kind}/${t.key}@${t.version} is not a team package`);return dse(t.team)}function MA(t){let e=BA(t,"manifest");if(e.schema!==tse)throw new Error(`Unsupported Hub package manifest schema: ${String(e.schema)}`);NA(e,["integrity","key","kind","team","member","manager","schema","skill","version"],"manifest");let r=use(e.kind,"manifest.kind");switch(up(e.key,"manifest.key"),up(e.version,"manifest.version"),e.integrity!==void 0&&up(e.integrity,"manifest.integrity"),r){case"team":if(ose(e.team),e.member!==void 0||e.manager!==void 0||e.skill!==void 0)throw new Error("Team package manifest must not include member, manager, or skill payloads");return;case"member":if(sse(e.member),e.team!==void 0||e.manager!==void 0||e.skill!==void 0)throw new Error("Member package manifest must not include team, manager, or skill payloads");return;case"manager":if(ase(e.manager),e.team!==void 0||e.member!==void 0||e.skill!==void 0)throw new Error("Manager package manifest must not include team, member, or skill payloads");return;case"skill":if(cse(e.skill),e.team!==void 0||e.member!==void 0||e.manager!==void 0)throw new Error("Skill package manifest must not include team, member, or manager payloads");return}}function ose(t){let e=Jd(t,"manifest.team");if(!e.ok)throw new Error(`Invalid manifest.team: ${e.error.message}`)}function sse(t){let e=p1(t,"manifest.member");if(!e.ok)throw new Error(`Invalid manifest.member: ${e.error.message}`)}function ase(t){let e=og(t,"manifest.manager");if(!e.ok)throw new Error(`Invalid manifest.manager: ${e.error.message}`)}function cse(t){let e=BA(t,"manifest.skill");if(NA(e,["contentHash","files","name"],"manifest.skill"),up(e.name,"manifest.skill.name"),up(e.contentHash,"manifest.skill.contentHash"),e.files!==void 0){if(!Array.isArray(e.files))throw new Error("manifest.skill.files must be an array");for(let[r,n]of e.files.entries()){let i=BA(n,`manifest.skill.files[${r}]`);NA(i,["path","text"],`manifest.skill.files[${r}]`),up(i.path,`manifest.skill.files[${r}].path`),DM(i.text,`manifest.skill.files[${r}].text`)}}}function use(t,e){if(t==="team"||t==="member"||t==="manager"||t==="skill")return t;throw new Error(`${e} must be team, member, manager, or skill`)}function BA(t,e){if(typeof t!="object"||t===null||Array.isArray(t))throw new Error(`${e} must be an object`);return t}function NA(t,e,r){let n=e.filter(o=>o!=="integrity"&&o!=="team"&&o!=="member"&&o!=="manager"&&o!=="skill"&&o!=="files"&&!(o in t));if(n.length>0)throw new Error(`${r} is missing required keys: ${n.join(", ")}`);let i=Object.keys(t).filter(o=>!e.includes(o));if(i.length>0)throw new Error(`${r} has unsupported keys: ${i.join(", ")}`)}function DM(t,e){if(typeof t!="string")throw new Error(`${e} must be a string`);return t}function up(t,e){let r=DM(t,e);if(r.trim().length===0)throw new Error(`${e} must be non-empty`);return r}function OA(t,e){if(t===null||typeof t=="string"||typeof t=="boolean")return t;if(typeof t=="number"){if(!Number.isFinite(t))throw new Error(`${e} must be a finite number`);return t}if(Array.isArray(t))return t.map((r,n)=>{if(r===void 0)throw new Error(`${e}[${n}] must not be undefined`);return OA(r,`${e}[${n}]`)});if(typeof t=="object"&&t!==null){let r=t,n={};for(let i of Object.keys(r).sort()){let o=r[i];o!==void 0&&(n[i]=OA(o,`${e}.${i}`))}return n}throw new Error(`${e} must be JSON-serializable`)}function dse(t){return JSON.parse(JSON.stringify(t))}function wt(t,e,r){return r===void 0?{code:t,message:e}:{code:t,message:e,details:r}}function Hg(t){let e=new Error(t.message);return e.name=`ExecuteOrchestrationError:${t.code}`,t.details!==void 0&&(e.details=t.details),e}function tl(t){if(t.ok)return t.value;throw Hg(t.error)}function HA(t){let e=jM(t,"Team planning final response must be a JSON ExecutionPlan object");return e.ok?$A(e.value,"execution"):e}function NM(t){let e=jM(t,"Goal evaluator final response must be a JSON object");if(!e.ok)return e;let r=e.value;if(r.type==="pass"){if(typeof r.summary!="string"||r.summary.trim()==="")return oe(wt("goal_evaluation_invalid","pass evaluation must include a non-empty summary"));let n=LA(r.evidence,"evidence");return n.ok?S({type:"pass",summary:r.summary,evidence:n.value}):n}if(r.type==="fail"){if(typeof r.reason!="string"||r.reason.trim()==="")return oe(wt("goal_evaluation_invalid","fail evaluation must include a non-empty reason"));if(typeof r.feedback!="string"||r.feedback.trim()==="")return oe(wt("goal_evaluation_invalid","fail evaluation must include non-empty feedback"));if(r.nextGoal!==void 0&&typeof r.nextGoal!="string")return oe(wt("goal_evaluation_invalid","fail evaluation nextGoal must be a string when present"));let n=LA(r.evidence,"evidence");return n.ok?S({type:"fail",reason:r.reason,feedback:r.feedback,nextGoal:typeof r.nextGoal=="string"&&r.nextGoal.trim()!==""?r.nextGoal:void 0,evidence:n.value}):n}return oe(wt("goal_evaluation_invalid","Goal evaluator response type must be pass or fail"))}function UA(t,e,r,n){if(e==="assignee")return{id:r,executorId:t.assignee.executorId,goal:t.assignee.goal,requires:n};let i=t.evaluator;if(!i)throw new Error(`Goal ${t.id} does not define an evaluator`);return{id:r,executorId:i.executorId,goal:i.prompt,requires:n}}function OM(t,e){let[,...r]=t.items;if(e)return{...t,items:[e,...r]};if(r.length!==0)return{...t,items:r}}function $A(t,e){return Ug(t)?t.kind==="queue"?lse(t,e):t.kind==="goal"?MM(t,e):t.kind==="continuation"?fse(t,e):oe(wt("execution_plan_invalid",`${e}.kind must be queue, goal, or continuation`)):oe(wt("execution_plan_invalid",`${e} must be an object`))}function lse(t,e){let r=HM(t.id,`${e}.id`);if(!r.ok)return r;if(!Array.isArray(t.items))return oe(wt("execution_plan_invalid",`${e}.items must be an array`));let n=[];for(let[i,o]of t.items.entries()){let s=$A(o,`${e}.items[${i}]`);if(!s.ok)return s;n.push(s.value)}return S({kind:"queue",id:r.value,items:n})}function MM(t,e){return t.stage==="needs_evaluation"?LM(t,e):t.stage==="needs_execution"?pse(t,e):oe(wt("execution_plan_invalid",`${e}.stage must be needs_evaluation or needs_execution`))}function fse(t,e){let r=FA(t.id,`${e}.id`);if(!r.ok)return r;let n=UM(t.teamScopeId,`${e}.teamScopeId`);if(!n.ok)return n;let i=$A(t.execution,`${e}.execution`);if(!i.ok)return i;let o=t.continuation===void 0?S(void 0):Ug(t.continuation)?MM(t.continuation,`${e}.continuation`):oe(wt("execution_plan_invalid",`${e}.continuation must be an object`));return o.ok?S({kind:"continuation",id:r.value,teamScopeId:n.value,execution:i.value,continuation:o.value}):o}function LM(t,e){let r=FA(t.id,`${e}.id`);if(!r.ok)return r;let n=BM(t.assignee,`${e}.assignee`,"goal");if(!n.ok)return n;let i=t.evaluator===void 0||t.evaluator===null?S(void 0):BM(t.evaluator,`${e}.evaluator`,"prompt");if(!i.ok)return i;let o=G3(t.remainingAttempts,`${e}.remainingAttempts`);if(!o.ok)return oe(wt("execution_plan_invalid",o.error.message));let s=hse(t.requires,`${e}.requires`);return s.ok?S({kind:"goal",stage:"needs_evaluation",id:r.value,assignee:{executorId:n.value.executorId,goal:n.value.text},evaluator:i.value?{executorId:i.value.executorId,prompt:i.value.text}:void 0,remainingAttempts:o.value,requires:s.value}):s}function pse(t,e){let r=LM({...t,stage:"needs_evaluation"},e);if(!r.ok)return r;let n=FA(t.evaluationPathId,`${e}.evaluationPathId`);if(!n.ok)return n;let i=mse(t.evaluation,`${e}.evaluation`);if(!i.ok)return i;if(!Array.isArray(t.requires))return oe(wt("execution_plan_invalid",`${e}.requires must be an array for needs_execution`));let o=$M(t.requires,`${e}.requires`);return o.ok?o.value.length!==1||o.value[0]!==n.value?oe(wt("execution_plan_invalid",`${e}.requires must contain only ${e}.evaluationPathId`)):S({...r.value,stage:"needs_execution",evaluationPathId:n.value,evaluation:i.value,requires:o.value}):o}function BM(t,e,r){if(!Ug(t))return oe(wt("execution_plan_invalid",`${e} must be an object`));let n=UM(t.executorId,`${e}.executorId`);if(!n.ok)return n;let i=HM(t[r],`${e}.${r}`);return i.ok?S({executorId:n.value,text:i.value}):i}function mse(t,e){if(!Ug(t))return oe(wt("execution_plan_invalid",`${e} must be an object`));if(t.type!=="fail")return oe(wt("execution_plan_invalid",`${e}.type must be fail`));if(typeof t.reason!="string"||t.reason.trim()==="")return oe(wt("execution_plan_invalid",`${e}.reason must be a non-empty string`));if(typeof t.feedback!="string"||t.feedback.trim()==="")return oe(wt("execution_plan_invalid",`${e}.feedback must be a non-empty string`));if(t.nextGoal!==void 0&&typeof t.nextGoal!="string")return oe(wt("execution_plan_invalid",`${e}.nextGoal must be a string when present`));let r=LA(t.evidence,`${e}.evidence`);return r.ok?S({type:"fail",reason:t.reason,feedback:t.feedback,nextGoal:typeof t.nextGoal=="string"&&t.nextGoal.trim()!==""?t.nextGoal:void 0,evidence:r.value}):r}function HM(t,e){return typeof t!="string"||t.trim()===""?oe(wt("execution_plan_invalid",`${e} must be a non-empty string`)):S(t)}function FA(t,e){let r=Ee(t,e);return r.ok?S(r.value):oe(wt("execution_plan_invalid",r.error.message))}function UM(t,e){let r=Ee(t,e);return r.ok?S(r.value):oe(wt("execution_plan_invalid",r.error.message))}function hse(t,e){return t==="PrevMove"?S("PrevMove"):$M(t,e)}function $M(t,e){let r=FM(t,e,"execution_plan_invalid");if(!r.ok)return r;let n=[];for(let[i,o]of r.value.entries()){let s=Ee(o,`${e}[${i}]`);if(!s.ok)return oe(wt("execution_plan_invalid",s.error.message));n.push(s.value)}return S(n)}function LA(t,e){return t===void 0?S(void 0):FM(t,e,"goal_evaluation_invalid")}function FM(t,e,r){return Array.isArray(t)?t.every(n=>typeof n=="string")?S([...t]):oe(wt(r,`${e} must be an array of strings`)):oe(wt(r,`${e} must be an array of strings`))}function jM(t,e){try{let r=JSON.parse(t);return Ug(r)?S(r):oe(wt("execution_plan_invalid",e))}catch(r){return oe(wt("execution_plan_invalid",e,{cause:r instanceof Error?r.message:String(r)}))}}function Ug(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function jA(t){let{line:e,lineNode:r}=t;if(!r)return oe(wt("invalid_start_state",`No execute-ready MOVE found for Team route ${e.id}`));if(e.status==="failed"||e.status==="complete"||e.status==="abandoned")return oe(wt("invalid_start_state",`Cannot start Execute from ${e.id} because the route is ${e.status}`));if(new Set(t.board.edges.filter(a=>a.type==="move").map(a=>a.fromNodeId)).has(r.id))return oe(wt("invalid_start_state",`Cannot start Execute from ${qM(r,t.formatMovePosition)} because Arrived or Accident already exists`));if(t.existingRuns.find(a=>a.sourceNodeId===r.id&&(a.status==="running"||a.status==="paused")))return oe(wt("active_execute_exists",`A Execute is already active for ${qM(r,t.formatMovePosition)}`));let o=Ba(r.ordinal+1,"targetMoveOrdinal");if(!o.ok)return oe(wt("invalid_start_state",o.error.message));let s=gse(t.selectedDestinationIds,t.activeDestinations);return s.ok?S({lineNode:r,selectedDestinationIds:s.value,targetMoveOrdinal:o.value}):s}function WM(t){return t?S(t):oe(wt("terminal_output_missing","ExecutionPlan completed without a terminal output"))}function gse(t,e){let r=yse(e);return t&&t.length>0?t.length!==1?oe(wt("invalid_start_state","Execute must select exactly one Destination")):r&&t[0]===r.id?S([...t]):oe(wt("invalid_start_state","Execute must select the next Destination in the queue")):S(r?[r.id]:[])}function yse(t){return[...t].sort(vse)[0]}function vse(t,e){return(e.priority??0)-(t.priority??0)}function qM(t,e){return e?e(t):`${t.teamName??"Team"} MOVE ${t.ordinal}`}import{execFile as Ese,spawn as kse}from"node:child_process";import{accessSync as Rse,constants as Ase,existsSync as $g,readdirSync as Cse,statSync as Pse}from"node:fs";import{delimiter as zM,isAbsolute as Rb,join as Hs}from"node:path";import{promisify as _se}from"node:util";function Ib(t,e,r,n=process.platform){return n!=="win32"||!/\.(?:cmd|bat)$/iu.test(t)?{command:t,args:e}:{command:r.ComSpec??r.COMSPEC??"cmd.exe",args:["/d","/s","/v:off","/c",xse(t,e)],windowsVerbatimArguments:!0}}function xse(t,e){return`"${[t,...e].map(Sse).join(" ")}"`}function Sse(t){if(/[%"\u0000-\u001f\u007f]/u.test(t))throw new Error("Windows command-shim paths and arguments cannot contain percent, quote, or control characters.");return`"${t}"`}var bn="0.2.0-next.9",rl="local-bridge-v1";import{win32 as bse}from"node:path";var wse=new Set(["psmodulepath","winpsmodulepath"]);function Eb(t,e){if(/[\u0000-\u001f\u007f]/u.test(t))throw new Error("Windows ACL paths cannot contain control characters.");if(!/^[A-Za-z][A-Za-z0-9]*$/u.test(e))throw new Error("Windows ACL PowerShell variable names must be identifiers.");let r=`$${e}`,n=["$ErrorActionPreference = 'Stop'",`${r} = ${Ise(t)}`,"$sid = [System.Security.Principal.WindowsIdentity]::GetCurrent().User","$acl = [System.Security.AccessControl.FileSecurity]::new()","$acl.SetOwner($sid)","$acl.SetAccessRuleProtection($true, $false)","$rule = [System.Security.AccessControl.FileSystemAccessRule]::new($sid, [System.Security.AccessControl.FileSystemRights]::FullControl, [System.Security.AccessControl.AccessControlType]::Allow)","$acl.SetAccessRule($rule)",`[System.IO.File]::SetAccessControl(${r}, $acl)`].join("; ");return{command:"powershell.exe",args:["-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-EncodedCommand",Buffer.from(n,"utf16le").toString("base64")]}}function kb(t){let e=bse.basename(t).toLowerCase();return e==="powershell"||e==="powershell.exe"}function Ko(t){let e={};for(let[r,n]of Object.entries(t))wse.has(r.toLowerCase())||n===void 0||(e[r]=n);return e}function Ise(t){return`'${t.replace(/'/g,"''")}'`}var Cb=_se(Ese),jg=3500;async function hu(t={}){let e=t.env??Ar(),r=t.platform??process.platform,n=await Tse({env:e,platform:r,customBinaryPath:t.customBinaryPath}),i=[];for(let c of n){let u=await Dse(c,e,r,t.timeoutMs);if(i.push(u),c.rejectWhitespace&&u.error?.includes("HUNSU_CODEX_APP_SERVER_COMMAND"))return{installed:!1,source:u.source,appServerAvailable:!1,discovery:i,error:u.error};if(u.usable&&u.path)return{installed:!0,binaryPath:u.path,source:u.source,version:u.version,appServerAvailable:!0,discovery:i}}let o=i.find(c=>c.path&&c.versionOk===!0&&c.appServerOk===!1);if(o?.path)return{installed:!0,binaryPath:o.path,source:o.source,version:o.version,appServerAvailable:!1,discovery:i,error:o.error??"Codex was found, but Codex app-server is not available."};let s=i.find(c=>c.source==="windows_apps_alias"||c.path&&GA(c.path,r));if(s)return{installed:!1,binaryPath:s.path,source:"windows_apps_alias",appServerAvailable:!1,discovery:i,aliasDetected:!0,error:s.error??"Codex resolved to a WindowsApps execution alias. Select the real Codex binary path in Hunsu Bridge."};let a=i.find(c=>c.path)??i[0];return{installed:!1,binaryPath:a?.path,source:a?.source??"unknown",appServerAvailable:!1,discovery:i,error:a?.error??"Codex CLI was not found by Hunsu Bridge."}}async function Pb(t){try{let e=t.env??Ar(),r=t.platform??process.platform,n=XM(t.binaryPath,["--version"],e,r),{stdout:i,stderr:o}=await Cb(n.command,n.args,{env:YM(e,r),timeout:t.timeoutMs??jg,windowsHide:!0,windowsVerbatimArguments:n.windowsVerbatimArguments,maxBuffer:64*1024});return`${i}
|
|
205
205
|
${o}`.trim().split(/\r?\n/).map(a=>a.trim()).find(Boolean)}catch{return}}async function KM(t){let e=t.env??Ar(),r=t.command?{ok:!0,value:{command:t.command,args:t.args??["app-server","--stdio"]}}:qA({env:e,cliBinaryPath:t.binaryPath});if(!r.ok)return{available:!1,error:r.error};let n=new Fg(r.value.command,t.timeoutMs??jg,{env:e,platform:t.platform,args:r.value.args});try{let i=await n.initialize();return{available:!0,initialized:Qr(i)}}catch(i){return{available:!1,error:nl(i)}}finally{n.close()}}function qA(t){let e=t.env.HUNSU_CODEX_APP_SERVER_COMMAND?.trim();if(e&&/\s/.test(e))return{ok:!1,error:"HUNSU_CODEX_APP_SERVER_COMMAND must be a binary path or command name without arguments. Put arguments in HUNSU_CODEX_APP_SERVER_ARGS."};let r=Zh(t.env);if(!r.ok)return{ok:!1,error:r.error.message};let n=t.cliBinaryPath?.trim();return{ok:!0,value:{command:r.value.command==="codex"&&n?n:r.value.command,args:r.value.args}}}function WA(t,e){if(e!=="win32")return[];let r=dp(t,"LOCALAPPDATA","LocalAppData","localappdata"),n=dp(t,"APPDATA","AppData","appdata");return Tb([r?Hs(r,"OpenAI","Codex","bin"):void 0,n?Hs(n,"npm"):void 0,r?Hs(r,"Programs","OpenAI Codex"):void 0])}function VA(t,e){return e!=="win32"?t.PATH??"":[t.PATH,t.Path,t.path,t.HUNSU_WINDOWS_USER_PATH,t.HUNSU_WINDOWS_MACHINE_PATH].filter(r=>typeof r=="string"&&r.trim().length>0).join(";")}async function Tse(t){let{env:e,platform:r}=t,n=[],i=t.customBinaryPath?.trim();i&&n.push({candidate:i,source:"custom"});let o=e.HUNSU_CODEX_BINARY_PATH?.trim();o&&n.push({candidate:o,source:e.HUNSU_CODEX_BINARY_PATH_SOURCE==="user_config"?"custom":"env"});let s=e.HUNSU_CODEX_APP_SERVER_COMMAND?.trim();if(s&&n.push({candidate:s,source:"env",rejectWhitespace:!0}),n.push(...Ab("codex",e,r,_b(e,r)).map(a=>({candidate:a,source:"process_path"}))),r==="win32"){n.push(...Ab("codex",e,r,await VM("user",e,r)).map(c=>({candidate:c,source:"registry_user_path"}))),n.push(...Ab("codex",e,r,await VM("machine",e,r)).map(c=>({candidate:c,source:"registry_machine_path"}))),n.push(...(await Mse(e)).map(c=>({candidate:c,source:"where"}))),n.push(...(await Lse(e)).map(c=>({candidate:c,source:"powershell_get_command"}))),n.push(...Ose(e,r).map(c=>({candidate:c,source:"known_install_dir"})));let a=Use(e,r);a&&n.push({candidate:a,source:"windows_apps_alias"})}return Fse(n)}async function Dse(t,e,r,n){let i=Bse(t.candidate,t.source,e,r,{rejectWhitespace:t.rejectWhitespace});if(i.kind!=="binary")return{source:i.source==="unknown"?t.source:i.source,path:i.kind==="missing"?i.binaryPath:void 0,usable:!1,error:i.error};let o=GA(i.binaryPath,r)?"windows_apps_alias":i.source;if(o==="windows_apps_alias")return{source:o,path:i.binaryPath,usable:!1,versionOk:!1,appServerOk:!1,error:"Codex resolved to a WindowsApps execution alias. Select the real Codex binary path in Hunsu Bridge."};let s=await Pb({binaryPath:i.binaryPath,timeoutMs:n,env:e,platform:r});if(!s)return{source:o,path:i.binaryPath,usable:!1,versionOk:!1,appServerOk:!1,error:"Codex candidate did not return a CLI version."};let a=await KM({binaryPath:i.binaryPath,timeoutMs:n,env:e,platform:r});return a.available?{source:o,path:i.binaryPath,usable:!0,versionOk:!0,appServerOk:!0,version:s}:{source:o,path:i.binaryPath,usable:!1,versionOk:!0,appServerOk:!1,version:s,error:a.error}}function Bse(t,e,r,n,i={}){let o=t.trim();if(!o)return{kind:"missing",installed:!1,source:e??"unknown",error:"Codex command is empty."};if(i.rejectWhitespace&&/\s/.test(o))return{kind:"unsupported_command_string",installed:!1,source:"env",error:"HUNSU_CODEX_APP_SERVER_COMMAND must be a binary path or command name without arguments. Put arguments in HUNSU_CODEX_APP_SERVER_ARGS."};let s=Rb(o)?o:Nse(o,r,n,_b(r,n));if(!s)return{kind:"missing",installed:!1,source:e??"unknown",binaryPath:Rb(o)?o:void 0,error:Rb(o)?"Configured Codex path does not exist.":`Codex command was not found on PATH: ${o}`};if(GA(s,n))return{kind:"missing",installed:!1,source:"windows_apps_alias",binaryPath:s,error:"Codex resolved to a WindowsApps execution alias. Select the real Codex binary path in Hunsu Bridge."};try{return Pse(s).isFile()?(n!=="win32"&&Rse(s,Ase.X_OK),{kind:"binary",installed:!0,binaryPath:s,source:e==="unknown"||e===void 0?"process_path":e}):{kind:"missing",installed:!1,binaryPath:s,source:e??"unknown",error:"Configured Codex path is not a file."}}catch(a){return{kind:"missing",installed:!1,binaryPath:s,source:e??"unknown",error:nl(a)}}}function Nse(t,e,r=process.platform,n=_b(e,r)){return Ab(t,e,r,n)[0]}function Ab(t,e,r=process.platform,n=_b(e,r)){if(Rb(t))return $g(t)?[t]:[];let i=r==="win32"?["",...(e.PATHEXT??e.PathExt??".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean)]:[""],o=r==="win32"?";":zM,s=[];for(let a of n.split(o).filter(Boolean))for(let c of i){let u=Hs(a,r==="win32"&&!t.toUpperCase().endsWith(c.toUpperCase())?`${t}${c}`:t);$g(u)&&s.push(u)}return Tb(s)}function Ose(t,e){if(e!=="win32")return[];let r=dp(t,"LOCALAPPDATA","LocalAppData","localappdata"),n=dp(t,"APPDATA","AppData","appdata"),i=[];if(r){let o=Hs(r,"OpenAI","Codex","bin");if($g(o))for(let s of $se(o))i.push(Hs(o,s,"codex.exe"));i.push(Hs(r,"OpenAI","Codex","bin","codex.exe"),Hs(r,"Programs","OpenAI Codex","codex.exe"))}return n&&i.push(Hs(n,"npm","codex.cmd")),Tb(i.filter($g))}async function VM(t,e,r){if(r!=="win32")return"";let n=t==="user"?e.HUNSU_WINDOWS_USER_PATH:e.HUNSU_WINDOWS_MACHINE_PATH;if(n?.trim())return GM(n,e);let i=t==="user"?"HKCU\\Environment":"HKLM\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment";try{let{stdout:o}=await Cb("reg.exe",["query",i,"/v","Path"],{env:e,timeout:1500,windowsHide:!0,maxBuffer:65536});return GM(Hse(o),e)}catch{return""}}async function Mse(t){try{let{stdout:e}=await Cb("where.exe",["codex"],{env:t,timeout:1500,windowsHide:!0,maxBuffer:65536});return JM(e)}catch{return[]}}async function Lse(t){let e="Get-Command codex -All | ForEach-Object { $_.Source }";for(let r of["powershell.exe","pwsh"])try{let{stdout:n}=await Cb(r,["-NoProfile","-Command",e],{env:r==="powershell.exe"?Ko(t):t,timeout:2e3,windowsHide:!0,maxBuffer:65536}),i=JM(n);if(i.length>0)return i}catch{}return[]}function Hse(t){return t.split(/\r?\n/).map(r=>r.trim()).find(r=>/^Path\s+REG_/i.test(r))?.replace(/^Path\s+REG_\w+\s+/i,"").trim()??""}function JM(t){return Tb(t.split(/\r?\n/).map(e=>e.trim()).filter(e=>e.length>0&&!/^[-\s]+$/.test(e)&&!/^CommandType\b|^Name\b|^Source\b/i.test(e)))}function Use(t,e){if(e!=="win32")return;let r=dp(t,"LOCALAPPDATA","LocalAppData","localappdata"),n=r?Hs(r,"Microsoft","WindowsApps","codex.exe"):void 0;return n&&$g(n)?n:void 0}function _b(t,e){return e!=="win32"?t.PATH??"":[t.PATH,t.Path,t.path].filter(r=>typeof r=="string"&&r.trim().length>0).join(";")}function $se(t){try{return Cse(t,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return[]}}function Fse(t){let e=new Set,r=[];for(let n of t){let i=`${n.source}:${n.candidate}`;e.has(i)||(e.add(i),r.push(n))}return r}function dp(t,...e){return e.map(r=>t[r]).find(r=>typeof r=="string"&&r.trim().length>0)?.trim()}function Tb(t){return[...new Set(t.filter(e=>typeof e=="string"&&e.length>0))]}function GA(t,e){return e==="win32"&&/(?:^|[\\/])WindowsApps[\\/]/i.test(t)}function GM(t,e){return t.replace(/%([^%]+)%/g,(r,n)=>{let i=n.trim(),o=Ar();return dp(e,i,i.toUpperCase(),i.toLowerCase())??o[i]??r})}function XM(t,e,r,n){return Ib(t,e,r,n)}function YM(t,e){let r=Ar(),n={...r,...t},i=e==="win32"?";":zM;for(let o of["PATH","Path","path"]){let s=t[o],a=r[o];if(s===""&&a){n[o]=a;continue}s&&a&&!s.split(i).includes(a)&&(n[o]=`${s}${i}${a}`)}return n}var Fg=class{command;args;timeoutMs;child;nextId=1;buffer="";pending=new Map;constructor(e,r,n={}){this.command=e,this.args=n.args??["app-server","--stdio"],this.timeoutMs=r;let i=n.env??Ar(),o=n.platform??process.platform,s=XM(this.command,this.args,i,o);this.child=kse(s.command,s.args,{env:YM(i,o),stdio:["pipe","pipe","pipe"],windowsHide:!0,windowsVerbatimArguments:s.windowsVerbatimArguments}),this.child.stdout.setEncoding("utf8"),this.child.stdout.on("data",a=>this.read(a)),this.child.stderr.setEncoding("utf8"),this.child.on("error",a=>this.rejectAll(a)),this.child.on("exit",()=>this.rejectAll(new Error("Codex app-server process exited before probe completed.")))}request(e,r){let n=this.nextId;return this.nextId+=1,new Promise((i,o)=>{let s=setTimeout(()=>{this.pending.delete(n),o(new Error(`Codex app-server probe timed out: ${e}`))},this.timeoutMs);this.pending.set(n,{resolve:i,reject:o,timer:s});try{this.write({jsonrpc:"2.0",id:n,method:e,params:r})}catch(a){clearTimeout(s),this.pending.delete(n),o(a instanceof Error?a:new Error(String(a)))}})}async initialize(){let e=await this.request("initialize",{clientInfo:{name:"hunsu-bridge",title:"Hunsu Bridge",version:bn}});return this.notify("initialized",{}),e}notify(e,r){this.write({jsonrpc:"2.0",method:e,params:r})}close(){this.rejectAll(new Error("Codex app-server probe closed.")),this.child.kill()}write(e){this.child.stdin.write(`${JSON.stringify(e)}
|
|
206
206
|
`)}read(e){this.buffer+=e;let r=this.buffer.indexOf(`
|
|
207
207
|
`);for(;r>=0;){let n=this.buffer.slice(0,r).trim();if(this.buffer=this.buffer.slice(r+1),r=this.buffer.indexOf(`
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const HUNSU_BRIDGE_VERSION: "0.2.0-next.
|
|
1
|
+
export const HUNSU_BRIDGE_VERSION: "0.2.0-next.9";
|
|
2
2
|
export const HUNSU_BRIDGE_PROTOCOL_VERSION: "local-bridge-v1";
|
|
3
3
|
export const BRIDGE_CLI_RESULT_SCHEMA: "hunsu.bridge.cli-result.v1";
|
|
4
4
|
export const BRIDGE_DEPLOYMENT_PROFILES: readonly ["production", "preview"];
|
package/dist/index.js
CHANGED
|
@@ -201,7 +201,7 @@ ${n}
|
|
|
201
201
|
`),s=n.slice(i+2).trim();if(o[0]!==r)return Dn(`Invalid Hunsu runtime header in ${e}`);let a=new Map(o.slice(1).map(l=>{let f=l.indexOf(":");return f===-1?[l.trim(),""]:[l.slice(0,f).trim(),l.slice(f+1).trim()]}));if(a.get("encoding")!==vM)return Dn(`Unsupported Hunsu runtime encoding in ${e}: ${a.get("encoding")??"missing"}`);let c=a.get("checksum")?.replace(/^sha256:/,"");if(!c)return Dn(`Missing Hunsu runtime checksum in ${e}`);let u;try{u=boe(Buffer.from(s,"base64url")).toString("utf8")}catch(l){return Dn(`Invalid Hunsu runtime payload in ${e}: ${l instanceof Error?l.message:String(l)}`)}let d=$g(u);if(d!==c)return Dn(`Hunsu runtime checksum mismatch in ${e}`);try{return S({value:JSON.parse(u),checksum:ap(d)})}catch(l){return Dn(`Invalid Hunsu runtime JSON in ${e}: ${l instanceof Error?l.message:String(l)}`)}}function ese(t){let e=qt(t),r=gu(e,hA);if(!Og(r))return;let n=Ug(CM(yA(r,"utf8"),r));return{state:n,checksum:PM(n)}}function tse(t,e){let r=qt(t);try{let n=Re(["show",`${e}:${hA}`],{cwd:r}),i=Ug(CM(n,`${e}:${hA}`));return{state:i,checksum:PM(i)}}catch(n){if(n instanceof Dr)return;throw n}}function CM(t,e){let r=Rb(t,e,koe);if(!r.ok)return r;let n=r.value.value;if(!n||typeof n!="object")return Dn(`Invalid legacy Hunsu runtime state JSON in ${e}: expected object`);let i=n;if(i.version!==1||!Array.isArray(i.events))return Dn(`Invalid legacy Hunsu runtime state in ${e}`);let o=[];for(let[s,a]of i.events.entries()){let c=fb(a);if(!c.ok)return Dn(`Invalid legacy Hunsu runtime state event ${s} in ${e}: ${c.error.message}`);o.push(c.value)}return S({version:1,events:o,...typeof i.updatedAt=="string"?{updatedAt:i.updatedAt}:{}})}function PM(t){return ap($g(`${JSON.stringify(t)}
|
|
202
202
|
`))}function Dn(t){return oe({type:"DomainStoreError",message:t})}function Ng(t,e,r){let n=gu(t,e,r);try{return S(JSON.parse(yA(n,"utf8")))}catch(i){return Dn(`Cannot read ${e}/${r}: ${i instanceof Error?i.message:String(i)}`)}}function rl(t){return JSON.parse(JSON.stringify(t))}function xb(t){return JSON.stringify(gA(t))}function gA(t){return Array.isArray(t)?t.map(gA):t&&typeof t=="object"?Object.fromEntries(Object.entries(t).sort(([e],[r])=>e.localeCompare(r)).map(([e,r])=>[e,gA(r)])):t}function Ug(t){if(t.ok)return t.value;throw new Error(t.error.message)}function rse(t){try{return Xr(Re(["rev-parse","--verify","HEAD^{commit}"],{cwd:t}).trim())}catch(e){if(e instanceof Dr)return;throw e}}function nse(t){return t instanceof Error?"code"in t&&t.code==="ENOENT":!1}function $g(t){return xoe("sha256").update(t).digest("hex")}function ise(t){let[e,r,n]=t.split(Coe);return{ref:e,object:r,objectType:n,ordinal:ose(e)}}function ose(t){let r=t.slice(t.lastIndexOf("/")+1).match(/^E(\d+)(?:-|$)/);return r?Number.parseInt(r[1],10):Number.MAX_SAFE_INTEGER}import{existsSync as Ls,readFileSync as DM,readdirSync as sse,statSync as ase,writeFileSync as cse}from"node:fs";import{basename as use,join as ja,resolve as dse}from"node:path";var lse="Port Git Project",fse="Make this project ready for Hunsu-managed MOVEs and Artifact Actions.";function _A(t=process.cwd()){let e=dse(t),r=[],n=e,i=!1;try{n=qt(e),i=!0}catch{r.push("Not a Git repository. Hunsu Port expects an existing Git project.")}let o=hse(n),s=o?.scripts??{},a=mse(n,o),c=_M(n,/^Dockerfile(?:\.|$)/),u=_M(n,/^(?:docker-)?compose(?:\.[^.]+)?\.ya?ml$/),d=i&&BM(n),l=pse(n),f=gse(n,s),p=[];return!o&&i&&r.push("No package.json found. Port can still create Roadmap state, but Artifact Actions may need a later Hunsu setup."),i&&!d&&r.push("Hunsu runtime state is missing. Port apply will create Initial Team state."),{root:n,isGitRepository:i,isHunsuRoadmap:d,packageManager:a,packageScripts:s,docker:{dockerfiles:c,composeFiles:u},artifactActions:l,env:f,recommendedFiles:p,issues:r}}function TA(t={}){let e=_A(t.cwd);if(!e.isGitRepository)throw new Error("Hunsu Port requires an existing Git repository");let r=t.title?.trim()||use(e.root)||lse,n=t.goal?.trim()||fse,i=t.destinations&&t.destinations.length>0?t.destinations:[{id:"destination_001",title:"Establish artifact-action-ready product execution",priority:100}],o=e.isHunsuRoadmap?[]:[{type:"CreateInitialTeam",requestId:TM("req",r),lineId:`run/${TM("req",r)}`,title:r,goal:n,destinations:i,harness:t.harness}];return{root:e.root,title:r,goal:n,destinations:i,inspection:e,files:[],commands:o}}function DA(t={}){let e=TA(t),r=[];for(let i of e.files){let o=ja(e.root,i.path);Ls(o)||(cse(o,i.content,"utf8"),r.push(i.path))}let n=e.commands.length>0?Lg(e.commands,{cwd:e.root,commitMessage:`hunsu: port ${e.title}`}):{acceptedEvents:[],board:Bn(e.root).board};return{root:e.root,plan:e,writtenFiles:r,acceptedEvents:n.acceptedEvents,board:n.board}}function pse(t){if(!BM(t))return{configured:!1,count:0,issues:[]};let e=Bn(t).board;return{configured:e.artifactActions.length>0,count:e.artifactActions.length,issues:[]}}function mse(t,e){if(Ls(ja(t,"pnpm-lock.yaml"))||e?.packageManager?.startsWith("pnpm@"))return"pnpm";if(Ls(ja(t,"yarn.lock"))||e?.packageManager?.startsWith("yarn@"))return"yarn";if(Ls(ja(t,"bun.lockb"))||Ls(ja(t,"bun.lock"))||e?.packageManager?.startsWith("bun@"))return"bun";if(Ls(ja(t,"package-lock.json"))||e)return"npm"}function hse(t){let e=ja(t,"package.json");if(Ls(e))return JSON.parse(DM(e,"utf8"))}function _M(t,e){return!Ls(t)||!ase(t).isDirectory()?[]:sse(t).filter(r=>e.test(r)).sort()}function BM(t){try{return Hg(t)||RA(t).length>0||Re(["for-each-ref","--count=1","--format=%(refname)","refs/hunsu"],{cwd:t}).trim().length>0}catch(e){if(e instanceof Dr)return!1;throw e}}function gse(t,e){let r=[".env",".env.local",".env.development",".env.example"].filter(i=>Ls(ja(t,i))),n=Object.entries(e).filter(([,i])=>/\b(?:3000|5173|8080|4187)\b|localhost|127\.0\.0\.1/.test(i)).map(([i])=>`package.json scripts.${i}`);for(let i of["vite.config.ts","vite.config.js","next.config.js","next.config.mjs"]){let o=ja(t,i);if(!Ls(o))continue;let s=DM(o,"utf8");/\b(?:3000|5173|8080|4187)\b|localhost|127\.0\.0\.1/.test(s)&&n.push(i)}return{files:r,hardcodedHints:n}}function TM(t,e){let r=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,48);return`${t}_${r||"project"}`}import{createHash as yse}from"node:crypto";import{spawnSync as vse}from"node:child_process";import{existsSync as _b,mkdirSync as NM,readFileSync as xse,readdirSync as Sse,rmSync as OM,writeFileSync as bse}from"node:fs";import{tmpdir as wse}from"node:os";import{basename as Ise,join as Ab,resolve as OA}from"node:path";function MM(t=process.cwd(),e){let r=qt(t),n=Bn(r);if(e){let i=n.board.moves.find(s=>s.id===e);if(!i)throw new Error(`No MOVE found for Artifact Action source: ${e}`);let o=n.board.nodes.find(s=>s.id===i.toNodeId);return Pb(i.snapshot?.artifactActions??o?.artifactActions??[])}return Pb(n.board.artifactActions)}function MA(t){let e=qt(t.cwd??process.cwd()),r=Ese(e,t),n=r.actions.find(d=>d.id===t.actionId);if(!n)throw new Error(`Unknown Artifact Action for selected source: ${t.actionId}`);kse(n,r.source);let i=t.now??new Date().toISOString(),o=Tse(n.id,r.source,i),s=t.baseActionPath??_se(t.roadmapId,o),a=n.kind==="host"?Ase(n,s):void 0,c=LA(n,t.env,t.ambientEnv),u={runId:o,actionId:n.id,roadmapId:t.roadmapId,action:NA(n),source:r.source,status:"queued",env:Rse(n,c),aliases:a,createdAt:i,updatedAt:i};return{action:NA(n),run:u,commands:$M(e,n,u,c)}}function LM(t,e={}){let r=qt(t.cwd??process.cwd()),n=MA(t),i=t.now??new Date().toISOString(),o=Pse(r,n.run.runId,n.run.source.commit,i,t.worktreeRoot),s=t.processEnv??e.processEnv,a=e.runner??((l,f,p)=>GM(l,f,{...p,processEnv:s})),c={...n.run,status:(n.action.kind==="host","running"),sourceWorktree:o,updatedAt:i},u=LA(n.action,t.env,t.ambientEnv),d=$M(r,n.action,c,u);try{if(n.action.runner.type==="docker_compose")Fg(a,d[0]),Fg(a,d[1]),c.aliases=Cse(r,c,a,u),c.status="running";else{let l=Fg(a,d[0]);if(c.exitCode=l.status,c.stdout=l.stdout,c.stderr=l.stderr,c.status=n.action.kind==="host"?"running":"succeeded",n.action.kind==="check"){let f=Cb(r,o.path);c.sourceWorktree={...o,removedAt:f}}}c.updatedAt=new Date().toISOString()}catch(l){c.status="failed",c.updatedAt=new Date().toISOString(),c.error=l instanceof Error?l.message:String(l);let f=Cb(r,o.path);c.sourceWorktree={...o,removedAt:f}}if(e.store!==!1&&jM(r,c),c.status==="failed")throw new Error(c.error??`Artifact Action ${c.runId} failed`);return c}function HM(t=process.cwd()){let e=qt(t),r=HA(e);return _b(r)?Sse(r).filter(n=>n.endsWith(".json")).map(n=>jg(e,n.slice(0,-5))).sort((n,i)=>i.updatedAt.localeCompare(n.updatedAt)):[]}function jg(t,e){let r=qt(t),n=qM(r,e);if(!_b(n))throw new Error(`Unknown Artifact Action Run: ${e}`);return JSON.parse(xse(n,"utf8"))}function UM(t,e,r={}){let n=qt(t),i=jg(n,e),o=r.runner??((u,d,l)=>GM(u,d,{...l,processEnv:r.processEnv})),s=LA(i.action,i.env,r.processEnv);i.action.runner.type==="docker_compose"?Fg(o,BA(n,i,["down"],s)):i.action.runner.stopCommand&&Fg(o,FM(n,i,i.action.runner.stopCommand,s));let a=i.sourceWorktree?.path?Cb(n,i.sourceWorktree.path):void 0,c={...i,sourceWorktree:i.sourceWorktree?{...i.sourceWorktree,removedAt:a}:void 0,status:"stopped",stoppedAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return r.store!==!1&&jM(n,c),c}function Ese(t,e){if(e.moveId&&e.commit)throw new Error("Artifact Action source accepts either moveId or commit, not both");let r=Bn(t);if(e.moveId){let i=r.board.moves.find(s=>s.id===e.moveId);if(!i)throw new Error(`No MOVE found for Artifact Action source: ${e.moveId}`);let o=r.board.nodes.find(s=>s.id===i.toNodeId);return{source:{moveId:i.id,commit:Re(["rev-parse","--verify",`${i.commit}^{commit}`],{cwd:t}).trim(),ref:i.commit},actions:Pb(i.snapshot?.artifactActions??o?.artifactActions??[])}}let n=e.commit??"HEAD";return{source:{commit:Re(["rev-parse","--verify",`${n}^{commit}`],{cwd:t}).trim(),ref:n},actions:Pb(r.board.artifactActions)}}function kse(t,e){if(t.sourceScope==="move"&&!e.moveId)throw new Error(`Artifact Action ${t.id} can only run against a MOVE source`);if(t.sourceScope==="commit"&&e.moveId)throw new Error(`Artifact Action ${t.id} can only run against a commit source`)}function LA(t,e={},r={}){let n={},i=new Set;for(let[o,s]of Object.entries(t.env??{}))if(i.add(o),"default"in s)n[o]=e[o]??String(s.default);else if("value"in s)n[o]=e[o]??String(s.value);else if("alias"in s){let a=t.aliases?.[s.alias];if(!a)throw new Error(`Artifact Action env ${o} references unknown alias: ${s.alias}`);n[o]=String(a.containerPort??a.target??"")}else if("fromAliasUrl"in s){let a=t.aliases?.[s.fromAliasUrl];if(!a)throw new Error(`Artifact Action env ${o} references unknown alias: ${s.fromAliasUrl}`);n[o]=a.service&&a.containerPort?`http://${a.service}:${a.containerPort}`:String(a.target??"")}else if(s.required){let a=e[o]??r[o];if(!a)throw new Error(`Artifact Action env ${o} is required but not set`);n[o]=a}for(let[o,s]of Object.entries(e))i.has(o)||(n[o]=s);return n}function Rse(t,e){let r={};for(let[n,i]of Object.entries(e)){let o=t.env?.[n];r[n]=o&&"required"in o&&o.secret?"<secret>":i}return r}function $M(t,e,r,n){return e.runner.type==="docker_compose"?[BA(t,r,["build"],n),BA(t,r,["up","-d"],n)]:[FM(t,r,e.runner.command,n)]}function BA(t,e,r,n){if(e.action.runner.type!=="docker_compose")throw new Error(`Artifact Action ${e.actionId} does not use docker compose`);let i=e.source.commit.slice(0,12),o=WM(VM(e.action.runner.projectName??`hunsu-${e.actionId}-${i}`,{actionId:e.actionId,runId:e.runId,commit:e.source.commit,shortCommit:i,moveId:e.source.moveId??""}));return{command:"docker",args:["compose","-f",OA(e.sourceWorktree?.path??t,e.action.runner.file),"-p",o,...r],cwd:e.sourceWorktree?.path??t,env:n}}function FM(t,e,r,n){return{command:"sh",args:["-lc",r],cwd:e.sourceWorktree?.path??t,env:n}}function Fg(t,e){let r=t(e.command,e.args,{cwd:e.cwd,env:e.env});if(r.status!==0)throw new Error(`${e.command} ${e.args.join(" ")} failed
|
|
203
203
|
${r.stderr||r.stdout}`);return r}function Ase(t,e){if(t.aliases)return Object.fromEntries(Object.entries(t.aliases).map(([r,n])=>[r,{alias:r,service:n.service,containerPort:n.containerPort,healthPath:n.healthPath,target:n.target,internalUrl:n.service&&n.containerPort?`http://${n.service}:${n.containerPort}`:n.target,externalPath:`${e}/${encodeURIComponent(r)}/`}]))}function Cse(t,e,r,n){if(!e.aliases||e.action.runner.type!=="docker_compose")return e.aliases;let i=e.action.runner;return Object.fromEntries(Object.entries(e.aliases).map(([o,s])=>{if(!s.service||!s.containerPort)return[o,s];let a=r("docker",["compose","-f",OA(e.sourceWorktree?.path??t,i.file),"-p",WM(VM(i.projectName??`hunsu-${e.actionId}-${e.source.commit.slice(0,12)}`,{actionId:e.actionId,runId:e.runId,commit:e.source.commit,shortCommit:e.source.commit.slice(0,12),moveId:e.source.moveId??""})),"port",s.service,String(s.containerPort)],{cwd:e.sourceWorktree?.path??t,env:n});return a.status!==0||!a.stdout.trim()?[o,s]:[o,{...s,directUrl:Bse(a.stdout.trim())}]}))}function Pse(t,e,r,n,i){let o=OA(i??Ab(wse(),"hunsu-action-runs",`${Ise(t)}-${Dse(t)}`)),s=Ab(o,UA(e));return NM(o,{recursive:!0}),_b(s)&&(Cb(t,s),OM(s,{recursive:!0,force:!0})),Re(["worktree","add","--detach",s,r],{cwd:t}),{path:s,commit:r,createdAt:n}}function Cb(t,e){let r=new Date().toISOString();if(!_b(e))return r;try{Re(["worktree","remove","--force",e],{cwd:t})}catch{OM(e,{recursive:!0,force:!0}),Re(["worktree","prune"],{cwd:t})}return r}function jM(t,e){NM(HA(t),{recursive:!0}),bse(qM(t,e.runId),`${JSON.stringify(e,null,2)}
|
|
204
|
-
`,"utf8")}function HA(t){return Ab(t,".hunsu","action-runs")}function qM(t,e){return Ab(HA(t),`${UA(e)}.json`)}function _se(t,e){return t?`/api/roadmaps/${encodeURIComponent(t)}/action-runs/${encodeURIComponent(e)}/proxy`:`/api/action-runs/${encodeURIComponent(e)}/proxy`}function Tse(t,e,r){return UA(`${t}-${e.moveId??e.commit.slice(0,12)}-${r.replace(/[^0-9A-Za-z]/g,"").slice(0,14)}`)}function UA(t){return t.toLowerCase().replace(/[^a-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"")||"action-run"}function WM(t){return t.toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,63)||"hunsu-action"}function VM(t,e){return t.replace(/\{([a-zA-Z][a-zA-Z0-9]*)\}/g,(r,n)=>e[n]??"")}function Dse(t){return yse("sha256").update(t).digest("hex").slice(0,12)}function Bse(t){let e=t.split(/\r?\n/).find(Boolean)??t,r=e.match(/(?:0\.0\.0\.0|127\.0\.0\.1|localhost|\[::\]|::):(\d+)$/);return r?`http://127.0.0.1:${r[1]}`:/^https?:\/\//.test(e)?e:`http://${e}`}function GM(t,e,r){let n=vse(t,e,{cwd:r.cwd,env:{...Nse(r.processEnv),...r.env},encoding:"utf8",maxBuffer:16777216});return{status:n.status??1,stdout:n.stdout,stderr:n.stderr}}function Nse(t){if(t===void 0)return;let e={};for(let[r,n]of Object.entries(t))n!==void 0&&(e[r]=n);return e}function Pb(t){return t.map(NA).sort((e,r)=>e.displayOrder-r.displayOrder||String(e.id).localeCompare(String(r.id)))}function NA(t){return{...t,env:t.env?Object.fromEntries(Object.entries(t.env).map(([e,r])=>[e,{...r}])):void 0,runner:{...t.runner},aliases:t.aliases?Object.fromEntries(Object.entries(t.aliases).map(([e,r])=>[e,{...r}])):void 0,evidence:t.evidence?{...t.evidence,paths:t.evidence.paths?.slice()}:void 0}}import{createHash as Ose}from"node:crypto";var Mse="hunsu.hub-package-manifest.v1",zM="hunsu-json-c14n-v1+sha256:";function Lse(t){qA(t);let{integrity:e,...r}=t;return JSON.stringify(jA(r,"manifest"))}function Hse(t){let e=Lse(t);return`${zM}${Ose("sha256").update(e,"utf8").digest("hex")}`}async function qg(t,e){if(!t.integrity.startsWith(zM))throw new Error(`Unsupported Hub package integrity prefix: ${t.integrity}`);let r=e.origins.find(a=>a.name===t.origin);if(!r)throw new Error(`Unknown Origin: ${t.origin}`);if(r.transport!=="http")throw new Error(`Origin ${r.name} uses unsupported transport ${r.transport}`);let i=await(e.fetch??fetch)(Use(r.url,t.kind,t.key,t.version));if(!i.ok)throw i.status===404?new Error(`Missing Hub package manifest: ${t.origin}/${t.kind}/${t.key}@${t.version}`):new Error(`Origin ${r.name} returned ${i.status} for ${t.kind}/${t.key}@${t.version}`);let o=await i.json();if(qA(o),o.kind!==t.kind||o.key!==t.key||o.version!==t.version)throw new Error(`Hub package manifest from ${r.name} does not match requested ${t.kind}/${t.key}@${t.version}`);let s=Hse(o);if(s!==t.integrity)throw new Error(`Hub package integrity mismatch for ${t.origin}/${t.kind}/${t.key}@${t.version}: expected ${t.integrity}, got ${s}`);return{lock:{...t},manifest:o,integrity:s,origin:{...r}}}function Use(t,e,r,n){let i=new URL(t),o=`/v1/packages/${e}/${encodeURIComponent(r)}/versions/${encodeURIComponent(n)}`;return new URL(o,i).toString()}function KM(t){if(qA(t),t.kind!=="team")throw new Error(`Hub package ${t.kind}/${t.key}@${t.version} is not a team package`);return Vse(t.team)}function qA(t){let e=$A(t,"manifest");if(e.schema!==Mse)throw new Error(`Unsupported Hub package manifest schema: ${String(e.schema)}`);FA(e,["integrity","key","kind","team","member","manager","schema","skill","version"],"manifest");let r=Wse(e.kind,"manifest.kind");switch(dp(e.key,"manifest.key"),dp(e.version,"manifest.version"),e.integrity!==void 0&&dp(e.integrity,"manifest.integrity"),r){case"team":if($se(e.team),e.member!==void 0||e.manager!==void 0||e.skill!==void 0)throw new Error("Team package manifest must not include member, manager, or skill payloads");return;case"member":if(Fse(e.member),e.team!==void 0||e.manager!==void 0||e.skill!==void 0)throw new Error("Member package manifest must not include team, manager, or skill payloads");return;case"manager":if(jse(e.manager),e.team!==void 0||e.member!==void 0||e.skill!==void 0)throw new Error("Manager package manifest must not include team, member, or skill payloads");return;case"skill":if(qse(e.skill),e.team!==void 0||e.member!==void 0||e.manager!==void 0)throw new Error("Skill package manifest must not include team, member, or manager payloads");return}}function $se(t){let e=Yd(t,"manifest.team");if(!e.ok)throw new Error(`Invalid manifest.team: ${e.error.message}`)}function Fse(t){let e=S1(t,"manifest.member");if(!e.ok)throw new Error(`Invalid manifest.member: ${e.error.message}`)}function jse(t){let e=lg(t,"manifest.manager");if(!e.ok)throw new Error(`Invalid manifest.manager: ${e.error.message}`)}function qse(t){let e=$A(t,"manifest.skill");if(FA(e,["contentHash","files","name"],"manifest.skill"),dp(e.name,"manifest.skill.name"),dp(e.contentHash,"manifest.skill.contentHash"),e.files!==void 0){if(!Array.isArray(e.files))throw new Error("manifest.skill.files must be an array");for(let[r,n]of e.files.entries()){let i=$A(n,`manifest.skill.files[${r}]`);FA(i,["path","text"],`manifest.skill.files[${r}]`),dp(i.path,`manifest.skill.files[${r}].path`),JM(i.text,`manifest.skill.files[${r}].text`)}}}function Wse(t,e){if(t==="team"||t==="member"||t==="manager"||t==="skill")return t;throw new Error(`${e} must be team, member, manager, or skill`)}function $A(t,e){if(typeof t!="object"||t===null||Array.isArray(t))throw new Error(`${e} must be an object`);return t}function FA(t,e,r){let n=e.filter(o=>o!=="integrity"&&o!=="team"&&o!=="member"&&o!=="manager"&&o!=="skill"&&o!=="files"&&!(o in t));if(n.length>0)throw new Error(`${r} is missing required keys: ${n.join(", ")}`);let i=Object.keys(t).filter(o=>!e.includes(o));if(i.length>0)throw new Error(`${r} has unsupported keys: ${i.join(", ")}`)}function JM(t,e){if(typeof t!="string")throw new Error(`${e} must be a string`);return t}function dp(t,e){let r=JM(t,e);if(r.trim().length===0)throw new Error(`${e} must be non-empty`);return r}function jA(t,e){if(t===null||typeof t=="string"||typeof t=="boolean")return t;if(typeof t=="number"){if(!Number.isFinite(t))throw new Error(`${e} must be a finite number`);return t}if(Array.isArray(t))return t.map((r,n)=>{if(r===void 0)throw new Error(`${e}[${n}] must not be undefined`);return jA(r,`${e}[${n}]`)});if(typeof t=="object"&&t!==null){let r=t,n={};for(let i of Object.keys(r).sort()){let o=r[i];o!==void 0&&(n[i]=jA(o,`${e}.${i}`))}return n}throw new Error(`${e} must be JSON-serializable`)}function Vse(t){return JSON.parse(JSON.stringify(t))}function wt(t,e,r){return r===void 0?{code:t,message:e}:{code:t,message:e,details:r}}function Wg(t){let e=new Error(t.message);return e.name=`ExecuteOrchestrationError:${t.code}`,t.details!==void 0&&(e.details=t.details),e}function nl(t){if(t.ok)return t.value;throw Wg(t.error)}function VA(t){let e=o5(t,"Team planning final response must be a JSON ExecutionPlan object");return e.ok?zA(e.value,"execution"):e}function YM(t){let e=o5(t,"Goal evaluator final response must be a JSON object");if(!e.ok)return e;let r=e.value;if(r.type==="pass"){if(typeof r.summary!="string"||r.summary.trim()==="")return oe(wt("goal_evaluation_invalid","pass evaluation must include a non-empty summary"));let n=WA(r.evidence,"evidence");return n.ok?S({type:"pass",summary:r.summary,evidence:n.value}):n}if(r.type==="fail"){if(typeof r.reason!="string"||r.reason.trim()==="")return oe(wt("goal_evaluation_invalid","fail evaluation must include a non-empty reason"));if(typeof r.feedback!="string"||r.feedback.trim()==="")return oe(wt("goal_evaluation_invalid","fail evaluation must include non-empty feedback"));if(r.nextGoal!==void 0&&typeof r.nextGoal!="string")return oe(wt("goal_evaluation_invalid","fail evaluation nextGoal must be a string when present"));let n=WA(r.evidence,"evidence");return n.ok?S({type:"fail",reason:r.reason,feedback:r.feedback,nextGoal:typeof r.nextGoal=="string"&&r.nextGoal.trim()!==""?r.nextGoal:void 0,evidence:n.value}):n}return oe(wt("goal_evaluation_invalid","Goal evaluator response type must be pass or fail"))}function GA(t,e,r,n){if(e==="assignee")return{id:r,executorId:t.assignee.executorId,goal:t.assignee.goal,requires:n};let i=t.evaluator;if(!i)throw new Error(`Goal ${t.id} does not define an evaluator`);return{id:r,executorId:i.executorId,goal:i.prompt,requires:n}}function QM(t,e){let[,...r]=t.items;if(e)return{...t,items:[e,...r]};if(r.length!==0)return{...t,items:r}}function zA(t,e){return Vg(t)?t.kind==="queue"?Gse(t,e):t.kind==="goal"?ZM(t,e):t.kind==="continuation"?zse(t,e):oe(wt("execution_plan_invalid",`${e}.kind must be queue, goal, or continuation`)):oe(wt("execution_plan_invalid",`${e} must be an object`))}function Gse(t,e){let r=t5(t.id,`${e}.id`);if(!r.ok)return r;if(!Array.isArray(t.items))return oe(wt("execution_plan_invalid",`${e}.items must be an array`));let n=[];for(let[i,o]of t.items.entries()){let s=zA(o,`${e}.items[${i}]`);if(!s.ok)return s;n.push(s.value)}return S({kind:"queue",id:r.value,items:n})}function ZM(t,e){return t.stage==="needs_evaluation"?e5(t,e):t.stage==="needs_execution"?Kse(t,e):oe(wt("execution_plan_invalid",`${e}.stage must be needs_evaluation or needs_execution`))}function zse(t,e){let r=KA(t.id,`${e}.id`);if(!r.ok)return r;let n=r5(t.teamScopeId,`${e}.teamScopeId`);if(!n.ok)return n;let i=zA(t.execution,`${e}.execution`);if(!i.ok)return i;let o=t.continuation===void 0?S(void 0):Vg(t.continuation)?ZM(t.continuation,`${e}.continuation`):oe(wt("execution_plan_invalid",`${e}.continuation must be an object`));return o.ok?S({kind:"continuation",id:r.value,teamScopeId:n.value,execution:i.value,continuation:o.value}):o}function e5(t,e){let r=KA(t.id,`${e}.id`);if(!r.ok)return r;let n=XM(t.assignee,`${e}.assignee`,"goal");if(!n.ok)return n;let i=t.evaluator===void 0||t.evaluator===null?S(void 0):XM(t.evaluator,`${e}.evaluator`,"prompt");if(!i.ok)return i;let o=u4(t.remainingAttempts,`${e}.remainingAttempts`);if(!o.ok)return oe(wt("execution_plan_invalid",o.error.message));let s=Xse(t.requires,`${e}.requires`);return s.ok?S({kind:"goal",stage:"needs_evaluation",id:r.value,assignee:{executorId:n.value.executorId,goal:n.value.text},evaluator:i.value?{executorId:i.value.executorId,prompt:i.value.text}:void 0,remainingAttempts:o.value,requires:s.value}):s}function Kse(t,e){let r=e5({...t,stage:"needs_evaluation"},e);if(!r.ok)return r;let n=KA(t.evaluationPathId,`${e}.evaluationPathId`);if(!n.ok)return n;let i=Jse(t.evaluation,`${e}.evaluation`);if(!i.ok)return i;if(!Array.isArray(t.requires))return oe(wt("execution_plan_invalid",`${e}.requires must be an array for needs_execution`));let o=n5(t.requires,`${e}.requires`);return o.ok?o.value.length!==1||o.value[0]!==n.value?oe(wt("execution_plan_invalid",`${e}.requires must contain only ${e}.evaluationPathId`)):S({...r.value,stage:"needs_execution",evaluationPathId:n.value,evaluation:i.value,requires:o.value}):o}function XM(t,e,r){if(!Vg(t))return oe(wt("execution_plan_invalid",`${e} must be an object`));let n=r5(t.executorId,`${e}.executorId`);if(!n.ok)return n;let i=t5(t[r],`${e}.${r}`);return i.ok?S({executorId:n.value,text:i.value}):i}function Jse(t,e){if(!Vg(t))return oe(wt("execution_plan_invalid",`${e} must be an object`));if(t.type!=="fail")return oe(wt("execution_plan_invalid",`${e}.type must be fail`));if(typeof t.reason!="string"||t.reason.trim()==="")return oe(wt("execution_plan_invalid",`${e}.reason must be a non-empty string`));if(typeof t.feedback!="string"||t.feedback.trim()==="")return oe(wt("execution_plan_invalid",`${e}.feedback must be a non-empty string`));if(t.nextGoal!==void 0&&typeof t.nextGoal!="string")return oe(wt("execution_plan_invalid",`${e}.nextGoal must be a string when present`));let r=WA(t.evidence,`${e}.evidence`);return r.ok?S({type:"fail",reason:t.reason,feedback:t.feedback,nextGoal:typeof t.nextGoal=="string"&&t.nextGoal.trim()!==""?t.nextGoal:void 0,evidence:r.value}):r}function t5(t,e){return typeof t!="string"||t.trim()===""?oe(wt("execution_plan_invalid",`${e} must be a non-empty string`)):S(t)}function KA(t,e){let r=Ee(t,e);return r.ok?S(r.value):oe(wt("execution_plan_invalid",r.error.message))}function r5(t,e){let r=Ee(t,e);return r.ok?S(r.value):oe(wt("execution_plan_invalid",r.error.message))}function Xse(t,e){return t==="PrevMove"?S("PrevMove"):n5(t,e)}function n5(t,e){let r=i5(t,e,"execution_plan_invalid");if(!r.ok)return r;let n=[];for(let[i,o]of r.value.entries()){let s=Ee(o,`${e}[${i}]`);if(!s.ok)return oe(wt("execution_plan_invalid",s.error.message));n.push(s.value)}return S(n)}function WA(t,e){return t===void 0?S(void 0):i5(t,e,"goal_evaluation_invalid")}function i5(t,e,r){return Array.isArray(t)?t.every(n=>typeof n=="string")?S([...t]):oe(wt(r,`${e} must be an array of strings`)):oe(wt(r,`${e} must be an array of strings`))}function o5(t,e){try{let r=JSON.parse(t);return Vg(r)?S(r):oe(wt("execution_plan_invalid",e))}catch(r){return oe(wt("execution_plan_invalid",e,{cause:r instanceof Error?r.message:String(r)}))}}function Vg(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function JA(t){let{line:e,lineNode:r}=t;if(!r)return oe(wt("invalid_start_state",`No execute-ready MOVE found for Team route ${e.id}`));if(e.status==="failed"||e.status==="complete"||e.status==="abandoned")return oe(wt("invalid_start_state",`Cannot start Execute from ${e.id} because the route is ${e.status}`));if(new Set(t.board.edges.filter(a=>a.type==="move").map(a=>a.fromNodeId)).has(r.id))return oe(wt("invalid_start_state",`Cannot start Execute from ${s5(r,t.formatMovePosition)} because Arrived or Accident already exists`));if(t.existingRuns.find(a=>a.sourceNodeId===r.id&&(a.status==="running"||a.status==="paused")))return oe(wt("active_execute_exists",`A Execute is already active for ${s5(r,t.formatMovePosition)}`));let o=Na(r.ordinal+1,"targetMoveOrdinal");if(!o.ok)return oe(wt("invalid_start_state",o.error.message));let s=Yse(t.selectedDestinationIds,t.activeDestinations);return s.ok?S({lineNode:r,selectedDestinationIds:s.value,targetMoveOrdinal:o.value}):s}function a5(t){return t?S(t):oe(wt("terminal_output_missing","ExecutionPlan completed without a terminal output"))}function Yse(t,e){let r=Qse(e);return t&&t.length>0?t.length!==1?oe(wt("invalid_start_state","Execute must select exactly one Destination")):r&&t[0]===r.id?S([...t]):oe(wt("invalid_start_state","Execute must select the next Destination in the queue")):S(r?[r.id]:[])}function Qse(t){return[...t].sort(Zse)[0]}function Zse(t,e){return(e.priority??0)-(t.priority??0)}function s5(t,e){return e?e(t):`${t.teamName??"Team"} MOVE ${t.ordinal}`}import{execFile as rae,spawn as nae}from"node:child_process";import{accessSync as iae,constants as oae,existsSync as Gg,readdirSync as sae,statSync as aae}from"node:fs";import{delimiter as d5,isAbsolute as Db,join as Hs}from"node:path";import{promisify as cae}from"node:util";function Tb(t,e,r,n=process.platform){return n!=="win32"||!/\.(?:cmd|bat)$/iu.test(t)?{command:t,args:e}:{command:r.ComSpec??r.COMSPEC??"cmd.exe",args:["/d","/s","/v:off","/c",eae(t,e)],windowsVerbatimArguments:!0}}function eae(t,e){return`"${[t,...e].map(tae).join(" ")}"`}function tae(t){if(/[%"\u0000-\u001f\u007f]/u.test(t))throw new Error("Windows command-shim paths and arguments cannot contain percent, quote, or control characters.");return`"${t}"`}var ln="0.2.0-next.8",xu="local-bridge-v1";var Nb=cae(rae),Kg=3500;async function Su(t={}){let e=t.env??Ar(),r=t.platform??process.platform,n=await uae({env:e,platform:r,customBinaryPath:t.customBinaryPath}),i=[];for(let c of n){let u=await dae(c,e,r,t.timeoutMs);if(i.push(u),c.rejectWhitespace&&u.error?.includes("HUNSU_CODEX_APP_SERVER_COMMAND"))return{installed:!1,source:u.source,appServerAvailable:!1,discovery:i,error:u.error};if(u.usable&&u.path)return{installed:!0,binaryPath:u.path,source:u.source,version:u.version,appServerAvailable:!0,discovery:i}}let o=i.find(c=>c.path&&c.versionOk===!0&&c.appServerOk===!1);if(o?.path)return{installed:!0,binaryPath:o.path,source:o.source,version:o.version,appServerAvailable:!1,discovery:i,error:o.error??"Codex was found, but Codex app-server is not available."};let s=i.find(c=>c.source==="windows_apps_alias"||c.path&&ZA(c.path,r));if(s)return{installed:!1,binaryPath:s.path,source:"windows_apps_alias",appServerAvailable:!1,discovery:i,aliasDetected:!0,error:s.error??"Codex resolved to a WindowsApps execution alias. Select the real Codex binary path in Hunsu Bridge."};let a=i.find(c=>c.path)??i[0];return{installed:!1,binaryPath:a?.path,source:a?.source??"unknown",appServerAvailable:!1,discovery:i,error:a?.error??"Codex CLI was not found by Hunsu Bridge."}}async function Ob(t){try{let e=t.env??Ar(),r=t.platform??process.platform,n=p5(t.binaryPath,["--version"],e,r),{stdout:i,stderr:o}=await Nb(n.command,n.args,{env:m5(e,r),timeout:t.timeoutMs??Kg,windowsHide:!0,windowsVerbatimArguments:n.windowsVerbatimArguments,maxBuffer:64*1024});return`${i}
|
|
204
|
+
`,"utf8")}function HA(t){return Ab(t,".hunsu","action-runs")}function qM(t,e){return Ab(HA(t),`${UA(e)}.json`)}function _se(t,e){return t?`/api/roadmaps/${encodeURIComponent(t)}/action-runs/${encodeURIComponent(e)}/proxy`:`/api/action-runs/${encodeURIComponent(e)}/proxy`}function Tse(t,e,r){return UA(`${t}-${e.moveId??e.commit.slice(0,12)}-${r.replace(/[^0-9A-Za-z]/g,"").slice(0,14)}`)}function UA(t){return t.toLowerCase().replace(/[^a-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"")||"action-run"}function WM(t){return t.toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,63)||"hunsu-action"}function VM(t,e){return t.replace(/\{([a-zA-Z][a-zA-Z0-9]*)\}/g,(r,n)=>e[n]??"")}function Dse(t){return yse("sha256").update(t).digest("hex").slice(0,12)}function Bse(t){let e=t.split(/\r?\n/).find(Boolean)??t,r=e.match(/(?:0\.0\.0\.0|127\.0\.0\.1|localhost|\[::\]|::):(\d+)$/);return r?`http://127.0.0.1:${r[1]}`:/^https?:\/\//.test(e)?e:`http://${e}`}function GM(t,e,r){let n=vse(t,e,{cwd:r.cwd,env:{...Nse(r.processEnv),...r.env},encoding:"utf8",maxBuffer:16777216});return{status:n.status??1,stdout:n.stdout,stderr:n.stderr}}function Nse(t){if(t===void 0)return;let e={};for(let[r,n]of Object.entries(t))n!==void 0&&(e[r]=n);return e}function Pb(t){return t.map(NA).sort((e,r)=>e.displayOrder-r.displayOrder||String(e.id).localeCompare(String(r.id)))}function NA(t){return{...t,env:t.env?Object.fromEntries(Object.entries(t.env).map(([e,r])=>[e,{...r}])):void 0,runner:{...t.runner},aliases:t.aliases?Object.fromEntries(Object.entries(t.aliases).map(([e,r])=>[e,{...r}])):void 0,evidence:t.evidence?{...t.evidence,paths:t.evidence.paths?.slice()}:void 0}}import{createHash as Ose}from"node:crypto";var Mse="hunsu.hub-package-manifest.v1",zM="hunsu-json-c14n-v1+sha256:";function Lse(t){qA(t);let{integrity:e,...r}=t;return JSON.stringify(jA(r,"manifest"))}function Hse(t){let e=Lse(t);return`${zM}${Ose("sha256").update(e,"utf8").digest("hex")}`}async function qg(t,e){if(!t.integrity.startsWith(zM))throw new Error(`Unsupported Hub package integrity prefix: ${t.integrity}`);let r=e.origins.find(a=>a.name===t.origin);if(!r)throw new Error(`Unknown Origin: ${t.origin}`);if(r.transport!=="http")throw new Error(`Origin ${r.name} uses unsupported transport ${r.transport}`);let i=await(e.fetch??fetch)(Use(r.url,t.kind,t.key,t.version));if(!i.ok)throw i.status===404?new Error(`Missing Hub package manifest: ${t.origin}/${t.kind}/${t.key}@${t.version}`):new Error(`Origin ${r.name} returned ${i.status} for ${t.kind}/${t.key}@${t.version}`);let o=await i.json();if(qA(o),o.kind!==t.kind||o.key!==t.key||o.version!==t.version)throw new Error(`Hub package manifest from ${r.name} does not match requested ${t.kind}/${t.key}@${t.version}`);let s=Hse(o);if(s!==t.integrity)throw new Error(`Hub package integrity mismatch for ${t.origin}/${t.kind}/${t.key}@${t.version}: expected ${t.integrity}, got ${s}`);return{lock:{...t},manifest:o,integrity:s,origin:{...r}}}function Use(t,e,r,n){let i=new URL(t),o=`/v1/packages/${e}/${encodeURIComponent(r)}/versions/${encodeURIComponent(n)}`;return new URL(o,i).toString()}function KM(t){if(qA(t),t.kind!=="team")throw new Error(`Hub package ${t.kind}/${t.key}@${t.version} is not a team package`);return Vse(t.team)}function qA(t){let e=$A(t,"manifest");if(e.schema!==Mse)throw new Error(`Unsupported Hub package manifest schema: ${String(e.schema)}`);FA(e,["integrity","key","kind","team","member","manager","schema","skill","version"],"manifest");let r=Wse(e.kind,"manifest.kind");switch(dp(e.key,"manifest.key"),dp(e.version,"manifest.version"),e.integrity!==void 0&&dp(e.integrity,"manifest.integrity"),r){case"team":if($se(e.team),e.member!==void 0||e.manager!==void 0||e.skill!==void 0)throw new Error("Team package manifest must not include member, manager, or skill payloads");return;case"member":if(Fse(e.member),e.team!==void 0||e.manager!==void 0||e.skill!==void 0)throw new Error("Member package manifest must not include team, manager, or skill payloads");return;case"manager":if(jse(e.manager),e.team!==void 0||e.member!==void 0||e.skill!==void 0)throw new Error("Manager package manifest must not include team, member, or skill payloads");return;case"skill":if(qse(e.skill),e.team!==void 0||e.member!==void 0||e.manager!==void 0)throw new Error("Skill package manifest must not include team, member, or manager payloads");return}}function $se(t){let e=Yd(t,"manifest.team");if(!e.ok)throw new Error(`Invalid manifest.team: ${e.error.message}`)}function Fse(t){let e=S1(t,"manifest.member");if(!e.ok)throw new Error(`Invalid manifest.member: ${e.error.message}`)}function jse(t){let e=lg(t,"manifest.manager");if(!e.ok)throw new Error(`Invalid manifest.manager: ${e.error.message}`)}function qse(t){let e=$A(t,"manifest.skill");if(FA(e,["contentHash","files","name"],"manifest.skill"),dp(e.name,"manifest.skill.name"),dp(e.contentHash,"manifest.skill.contentHash"),e.files!==void 0){if(!Array.isArray(e.files))throw new Error("manifest.skill.files must be an array");for(let[r,n]of e.files.entries()){let i=$A(n,`manifest.skill.files[${r}]`);FA(i,["path","text"],`manifest.skill.files[${r}]`),dp(i.path,`manifest.skill.files[${r}].path`),JM(i.text,`manifest.skill.files[${r}].text`)}}}function Wse(t,e){if(t==="team"||t==="member"||t==="manager"||t==="skill")return t;throw new Error(`${e} must be team, member, manager, or skill`)}function $A(t,e){if(typeof t!="object"||t===null||Array.isArray(t))throw new Error(`${e} must be an object`);return t}function FA(t,e,r){let n=e.filter(o=>o!=="integrity"&&o!=="team"&&o!=="member"&&o!=="manager"&&o!=="skill"&&o!=="files"&&!(o in t));if(n.length>0)throw new Error(`${r} is missing required keys: ${n.join(", ")}`);let i=Object.keys(t).filter(o=>!e.includes(o));if(i.length>0)throw new Error(`${r} has unsupported keys: ${i.join(", ")}`)}function JM(t,e){if(typeof t!="string")throw new Error(`${e} must be a string`);return t}function dp(t,e){let r=JM(t,e);if(r.trim().length===0)throw new Error(`${e} must be non-empty`);return r}function jA(t,e){if(t===null||typeof t=="string"||typeof t=="boolean")return t;if(typeof t=="number"){if(!Number.isFinite(t))throw new Error(`${e} must be a finite number`);return t}if(Array.isArray(t))return t.map((r,n)=>{if(r===void 0)throw new Error(`${e}[${n}] must not be undefined`);return jA(r,`${e}[${n}]`)});if(typeof t=="object"&&t!==null){let r=t,n={};for(let i of Object.keys(r).sort()){let o=r[i];o!==void 0&&(n[i]=jA(o,`${e}.${i}`))}return n}throw new Error(`${e} must be JSON-serializable`)}function Vse(t){return JSON.parse(JSON.stringify(t))}function wt(t,e,r){return r===void 0?{code:t,message:e}:{code:t,message:e,details:r}}function Wg(t){let e=new Error(t.message);return e.name=`ExecuteOrchestrationError:${t.code}`,t.details!==void 0&&(e.details=t.details),e}function nl(t){if(t.ok)return t.value;throw Wg(t.error)}function VA(t){let e=o5(t,"Team planning final response must be a JSON ExecutionPlan object");return e.ok?zA(e.value,"execution"):e}function YM(t){let e=o5(t,"Goal evaluator final response must be a JSON object");if(!e.ok)return e;let r=e.value;if(r.type==="pass"){if(typeof r.summary!="string"||r.summary.trim()==="")return oe(wt("goal_evaluation_invalid","pass evaluation must include a non-empty summary"));let n=WA(r.evidence,"evidence");return n.ok?S({type:"pass",summary:r.summary,evidence:n.value}):n}if(r.type==="fail"){if(typeof r.reason!="string"||r.reason.trim()==="")return oe(wt("goal_evaluation_invalid","fail evaluation must include a non-empty reason"));if(typeof r.feedback!="string"||r.feedback.trim()==="")return oe(wt("goal_evaluation_invalid","fail evaluation must include non-empty feedback"));if(r.nextGoal!==void 0&&typeof r.nextGoal!="string")return oe(wt("goal_evaluation_invalid","fail evaluation nextGoal must be a string when present"));let n=WA(r.evidence,"evidence");return n.ok?S({type:"fail",reason:r.reason,feedback:r.feedback,nextGoal:typeof r.nextGoal=="string"&&r.nextGoal.trim()!==""?r.nextGoal:void 0,evidence:n.value}):n}return oe(wt("goal_evaluation_invalid","Goal evaluator response type must be pass or fail"))}function GA(t,e,r,n){if(e==="assignee")return{id:r,executorId:t.assignee.executorId,goal:t.assignee.goal,requires:n};let i=t.evaluator;if(!i)throw new Error(`Goal ${t.id} does not define an evaluator`);return{id:r,executorId:i.executorId,goal:i.prompt,requires:n}}function QM(t,e){let[,...r]=t.items;if(e)return{...t,items:[e,...r]};if(r.length!==0)return{...t,items:r}}function zA(t,e){return Vg(t)?t.kind==="queue"?Gse(t,e):t.kind==="goal"?ZM(t,e):t.kind==="continuation"?zse(t,e):oe(wt("execution_plan_invalid",`${e}.kind must be queue, goal, or continuation`)):oe(wt("execution_plan_invalid",`${e} must be an object`))}function Gse(t,e){let r=t5(t.id,`${e}.id`);if(!r.ok)return r;if(!Array.isArray(t.items))return oe(wt("execution_plan_invalid",`${e}.items must be an array`));let n=[];for(let[i,o]of t.items.entries()){let s=zA(o,`${e}.items[${i}]`);if(!s.ok)return s;n.push(s.value)}return S({kind:"queue",id:r.value,items:n})}function ZM(t,e){return t.stage==="needs_evaluation"?e5(t,e):t.stage==="needs_execution"?Kse(t,e):oe(wt("execution_plan_invalid",`${e}.stage must be needs_evaluation or needs_execution`))}function zse(t,e){let r=KA(t.id,`${e}.id`);if(!r.ok)return r;let n=r5(t.teamScopeId,`${e}.teamScopeId`);if(!n.ok)return n;let i=zA(t.execution,`${e}.execution`);if(!i.ok)return i;let o=t.continuation===void 0?S(void 0):Vg(t.continuation)?ZM(t.continuation,`${e}.continuation`):oe(wt("execution_plan_invalid",`${e}.continuation must be an object`));return o.ok?S({kind:"continuation",id:r.value,teamScopeId:n.value,execution:i.value,continuation:o.value}):o}function e5(t,e){let r=KA(t.id,`${e}.id`);if(!r.ok)return r;let n=XM(t.assignee,`${e}.assignee`,"goal");if(!n.ok)return n;let i=t.evaluator===void 0||t.evaluator===null?S(void 0):XM(t.evaluator,`${e}.evaluator`,"prompt");if(!i.ok)return i;let o=u4(t.remainingAttempts,`${e}.remainingAttempts`);if(!o.ok)return oe(wt("execution_plan_invalid",o.error.message));let s=Xse(t.requires,`${e}.requires`);return s.ok?S({kind:"goal",stage:"needs_evaluation",id:r.value,assignee:{executorId:n.value.executorId,goal:n.value.text},evaluator:i.value?{executorId:i.value.executorId,prompt:i.value.text}:void 0,remainingAttempts:o.value,requires:s.value}):s}function Kse(t,e){let r=e5({...t,stage:"needs_evaluation"},e);if(!r.ok)return r;let n=KA(t.evaluationPathId,`${e}.evaluationPathId`);if(!n.ok)return n;let i=Jse(t.evaluation,`${e}.evaluation`);if(!i.ok)return i;if(!Array.isArray(t.requires))return oe(wt("execution_plan_invalid",`${e}.requires must be an array for needs_execution`));let o=n5(t.requires,`${e}.requires`);return o.ok?o.value.length!==1||o.value[0]!==n.value?oe(wt("execution_plan_invalid",`${e}.requires must contain only ${e}.evaluationPathId`)):S({...r.value,stage:"needs_execution",evaluationPathId:n.value,evaluation:i.value,requires:o.value}):o}function XM(t,e,r){if(!Vg(t))return oe(wt("execution_plan_invalid",`${e} must be an object`));let n=r5(t.executorId,`${e}.executorId`);if(!n.ok)return n;let i=t5(t[r],`${e}.${r}`);return i.ok?S({executorId:n.value,text:i.value}):i}function Jse(t,e){if(!Vg(t))return oe(wt("execution_plan_invalid",`${e} must be an object`));if(t.type!=="fail")return oe(wt("execution_plan_invalid",`${e}.type must be fail`));if(typeof t.reason!="string"||t.reason.trim()==="")return oe(wt("execution_plan_invalid",`${e}.reason must be a non-empty string`));if(typeof t.feedback!="string"||t.feedback.trim()==="")return oe(wt("execution_plan_invalid",`${e}.feedback must be a non-empty string`));if(t.nextGoal!==void 0&&typeof t.nextGoal!="string")return oe(wt("execution_plan_invalid",`${e}.nextGoal must be a string when present`));let r=WA(t.evidence,`${e}.evidence`);return r.ok?S({type:"fail",reason:t.reason,feedback:t.feedback,nextGoal:typeof t.nextGoal=="string"&&t.nextGoal.trim()!==""?t.nextGoal:void 0,evidence:r.value}):r}function t5(t,e){return typeof t!="string"||t.trim()===""?oe(wt("execution_plan_invalid",`${e} must be a non-empty string`)):S(t)}function KA(t,e){let r=Ee(t,e);return r.ok?S(r.value):oe(wt("execution_plan_invalid",r.error.message))}function r5(t,e){let r=Ee(t,e);return r.ok?S(r.value):oe(wt("execution_plan_invalid",r.error.message))}function Xse(t,e){return t==="PrevMove"?S("PrevMove"):n5(t,e)}function n5(t,e){let r=i5(t,e,"execution_plan_invalid");if(!r.ok)return r;let n=[];for(let[i,o]of r.value.entries()){let s=Ee(o,`${e}[${i}]`);if(!s.ok)return oe(wt("execution_plan_invalid",s.error.message));n.push(s.value)}return S(n)}function WA(t,e){return t===void 0?S(void 0):i5(t,e,"goal_evaluation_invalid")}function i5(t,e,r){return Array.isArray(t)?t.every(n=>typeof n=="string")?S([...t]):oe(wt(r,`${e} must be an array of strings`)):oe(wt(r,`${e} must be an array of strings`))}function o5(t,e){try{let r=JSON.parse(t);return Vg(r)?S(r):oe(wt("execution_plan_invalid",e))}catch(r){return oe(wt("execution_plan_invalid",e,{cause:r instanceof Error?r.message:String(r)}))}}function Vg(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function JA(t){let{line:e,lineNode:r}=t;if(!r)return oe(wt("invalid_start_state",`No execute-ready MOVE found for Team route ${e.id}`));if(e.status==="failed"||e.status==="complete"||e.status==="abandoned")return oe(wt("invalid_start_state",`Cannot start Execute from ${e.id} because the route is ${e.status}`));if(new Set(t.board.edges.filter(a=>a.type==="move").map(a=>a.fromNodeId)).has(r.id))return oe(wt("invalid_start_state",`Cannot start Execute from ${s5(r,t.formatMovePosition)} because Arrived or Accident already exists`));if(t.existingRuns.find(a=>a.sourceNodeId===r.id&&(a.status==="running"||a.status==="paused")))return oe(wt("active_execute_exists",`A Execute is already active for ${s5(r,t.formatMovePosition)}`));let o=Na(r.ordinal+1,"targetMoveOrdinal");if(!o.ok)return oe(wt("invalid_start_state",o.error.message));let s=Yse(t.selectedDestinationIds,t.activeDestinations);return s.ok?S({lineNode:r,selectedDestinationIds:s.value,targetMoveOrdinal:o.value}):s}function a5(t){return t?S(t):oe(wt("terminal_output_missing","ExecutionPlan completed without a terminal output"))}function Yse(t,e){let r=Qse(e);return t&&t.length>0?t.length!==1?oe(wt("invalid_start_state","Execute must select exactly one Destination")):r&&t[0]===r.id?S([...t]):oe(wt("invalid_start_state","Execute must select the next Destination in the queue")):S(r?[r.id]:[])}function Qse(t){return[...t].sort(Zse)[0]}function Zse(t,e){return(e.priority??0)-(t.priority??0)}function s5(t,e){return e?e(t):`${t.teamName??"Team"} MOVE ${t.ordinal}`}import{execFile as rae,spawn as nae}from"node:child_process";import{accessSync as iae,constants as oae,existsSync as Gg,readdirSync as sae,statSync as aae}from"node:fs";import{delimiter as d5,isAbsolute as Db,join as Hs}from"node:path";import{promisify as cae}from"node:util";function Tb(t,e,r,n=process.platform){return n!=="win32"||!/\.(?:cmd|bat)$/iu.test(t)?{command:t,args:e}:{command:r.ComSpec??r.COMSPEC??"cmd.exe",args:["/d","/s","/v:off","/c",eae(t,e)],windowsVerbatimArguments:!0}}function eae(t,e){return`"${[t,...e].map(tae).join(" ")}"`}function tae(t){if(/[%"\u0000-\u001f\u007f]/u.test(t))throw new Error("Windows command-shim paths and arguments cannot contain percent, quote, or control characters.");return`"${t}"`}var ln="0.2.0-next.9",xu="local-bridge-v1";var Nb=cae(rae),Kg=3500;async function Su(t={}){let e=t.env??Ar(),r=t.platform??process.platform,n=await uae({env:e,platform:r,customBinaryPath:t.customBinaryPath}),i=[];for(let c of n){let u=await dae(c,e,r,t.timeoutMs);if(i.push(u),c.rejectWhitespace&&u.error?.includes("HUNSU_CODEX_APP_SERVER_COMMAND"))return{installed:!1,source:u.source,appServerAvailable:!1,discovery:i,error:u.error};if(u.usable&&u.path)return{installed:!0,binaryPath:u.path,source:u.source,version:u.version,appServerAvailable:!0,discovery:i}}let o=i.find(c=>c.path&&c.versionOk===!0&&c.appServerOk===!1);if(o?.path)return{installed:!0,binaryPath:o.path,source:o.source,version:o.version,appServerAvailable:!1,discovery:i,error:o.error??"Codex was found, but Codex app-server is not available."};let s=i.find(c=>c.source==="windows_apps_alias"||c.path&&ZA(c.path,r));if(s)return{installed:!1,binaryPath:s.path,source:"windows_apps_alias",appServerAvailable:!1,discovery:i,aliasDetected:!0,error:s.error??"Codex resolved to a WindowsApps execution alias. Select the real Codex binary path in Hunsu Bridge."};let a=i.find(c=>c.path)??i[0];return{installed:!1,binaryPath:a?.path,source:a?.source??"unknown",appServerAvailable:!1,discovery:i,error:a?.error??"Codex CLI was not found by Hunsu Bridge."}}async function Ob(t){try{let e=t.env??Ar(),r=t.platform??process.platform,n=p5(t.binaryPath,["--version"],e,r),{stdout:i,stderr:o}=await Nb(n.command,n.args,{env:m5(e,r),timeout:t.timeoutMs??Kg,windowsHide:!0,windowsVerbatimArguments:n.windowsVerbatimArguments,maxBuffer:64*1024});return`${i}
|
|
205
205
|
${o}`.trim().split(/\r?\n/).map(a=>a.trim()).find(Boolean)}catch{return}}async function l5(t){let e=t.env??Ar(),r=t.command?{ok:!0,value:{command:t.command,args:t.args??["app-server","--stdio"]}}:XA({env:e,cliBinaryPath:t.binaryPath});if(!r.ok)return{available:!1,error:r.error};let n=new zg(r.value.command,t.timeoutMs??Kg,{env:e,platform:t.platform,args:r.value.args});try{let i=await n.initialize();return{available:!0,initialized:Qr(i)}}catch(i){return{available:!1,error:il(i)}}finally{n.close()}}function XA(t){let e=t.env.HUNSU_CODEX_APP_SERVER_COMMAND?.trim();if(e&&/\s/.test(e))return{ok:!1,error:"HUNSU_CODEX_APP_SERVER_COMMAND must be a binary path or command name without arguments. Put arguments in HUNSU_CODEX_APP_SERVER_ARGS."};let r=og(t.env);if(!r.ok)return{ok:!1,error:r.error.message};let n=t.cliBinaryPath?.trim();return{ok:!0,value:{command:r.value.command==="codex"&&n?n:r.value.command,args:r.value.args}}}function YA(t,e){if(e!=="win32")return[];let r=lp(t,"LOCALAPPDATA","LocalAppData","localappdata"),n=lp(t,"APPDATA","AppData","appdata");return Lb([r?Hs(r,"OpenAI","Codex","bin"):void 0,n?Hs(n,"npm"):void 0,r?Hs(r,"Programs","OpenAI Codex"):void 0])}function QA(t,e){return e!=="win32"?t.PATH??"":[t.PATH,t.Path,t.path,t.HUNSU_WINDOWS_USER_PATH,t.HUNSU_WINDOWS_MACHINE_PATH].filter(r=>typeof r=="string"&&r.trim().length>0).join(";")}async function uae(t){let{env:e,platform:r}=t,n=[],i=t.customBinaryPath?.trim();i&&n.push({candidate:i,source:"custom"});let o=e.HUNSU_CODEX_BINARY_PATH?.trim();o&&n.push({candidate:o,source:e.HUNSU_CODEX_BINARY_PATH_SOURCE==="user_config"?"custom":"env"});let s=e.HUNSU_CODEX_APP_SERVER_COMMAND?.trim();if(s&&n.push({candidate:s,source:"env",rejectWhitespace:!0}),n.push(...Bb("codex",e,r,Mb(e,r)).map(a=>({candidate:a,source:"process_path"}))),r==="win32"){n.push(...Bb("codex",e,r,await c5("user",e,r)).map(c=>({candidate:c,source:"registry_user_path"}))),n.push(...Bb("codex",e,r,await c5("machine",e,r)).map(c=>({candidate:c,source:"registry_machine_path"}))),n.push(...(await mae(e)).map(c=>({candidate:c,source:"where"}))),n.push(...(await hae(e)).map(c=>({candidate:c,source:"powershell_get_command"}))),n.push(...pae(e,r).map(c=>({candidate:c,source:"known_install_dir"})));let a=yae(e,r);a&&n.push({candidate:a,source:"windows_apps_alias"})}return xae(n)}async function dae(t,e,r,n){let i=lae(t.candidate,t.source,e,r,{rejectWhitespace:t.rejectWhitespace});if(i.kind!=="binary")return{source:i.source==="unknown"?t.source:i.source,path:i.kind==="missing"?i.binaryPath:void 0,usable:!1,error:i.error};let o=ZA(i.binaryPath,r)?"windows_apps_alias":i.source;if(o==="windows_apps_alias")return{source:o,path:i.binaryPath,usable:!1,versionOk:!1,appServerOk:!1,error:"Codex resolved to a WindowsApps execution alias. Select the real Codex binary path in Hunsu Bridge."};let s=await Ob({binaryPath:i.binaryPath,timeoutMs:n,env:e,platform:r});if(!s)return{source:o,path:i.binaryPath,usable:!1,versionOk:!1,appServerOk:!1,error:"Codex candidate did not return a CLI version."};let a=await l5({binaryPath:i.binaryPath,timeoutMs:n,env:e,platform:r});return a.available?{source:o,path:i.binaryPath,usable:!0,versionOk:!0,appServerOk:!0,version:s}:{source:o,path:i.binaryPath,usable:!1,versionOk:!0,appServerOk:!1,version:s,error:a.error}}function lae(t,e,r,n,i={}){let o=t.trim();if(!o)return{kind:"missing",installed:!1,source:e??"unknown",error:"Codex command is empty."};if(i.rejectWhitespace&&/\s/.test(o))return{kind:"unsupported_command_string",installed:!1,source:"env",error:"HUNSU_CODEX_APP_SERVER_COMMAND must be a binary path or command name without arguments. Put arguments in HUNSU_CODEX_APP_SERVER_ARGS."};let s=Db(o)?o:fae(o,r,n,Mb(r,n));if(!s)return{kind:"missing",installed:!1,source:e??"unknown",binaryPath:Db(o)?o:void 0,error:Db(o)?"Configured Codex path does not exist.":`Codex command was not found on PATH: ${o}`};if(ZA(s,n))return{kind:"missing",installed:!1,source:"windows_apps_alias",binaryPath:s,error:"Codex resolved to a WindowsApps execution alias. Select the real Codex binary path in Hunsu Bridge."};try{return aae(s).isFile()?(n!=="win32"&&iae(s,oae.X_OK),{kind:"binary",installed:!0,binaryPath:s,source:e==="unknown"||e===void 0?"process_path":e}):{kind:"missing",installed:!1,binaryPath:s,source:e??"unknown",error:"Configured Codex path is not a file."}}catch(a){return{kind:"missing",installed:!1,binaryPath:s,source:e??"unknown",error:il(a)}}}function fae(t,e,r=process.platform,n=Mb(e,r)){return Bb(t,e,r,n)[0]}function Bb(t,e,r=process.platform,n=Mb(e,r)){if(Db(t))return Gg(t)?[t]:[];let i=r==="win32"?["",...(e.PATHEXT??e.PathExt??".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean)]:[""],o=r==="win32"?";":d5,s=[];for(let a of n.split(o).filter(Boolean))for(let c of i){let u=Hs(a,r==="win32"&&!t.toUpperCase().endsWith(c.toUpperCase())?`${t}${c}`:t);Gg(u)&&s.push(u)}return Lb(s)}function pae(t,e){if(e!=="win32")return[];let r=lp(t,"LOCALAPPDATA","LocalAppData","localappdata"),n=lp(t,"APPDATA","AppData","appdata"),i=[];if(r){let o=Hs(r,"OpenAI","Codex","bin");if(Gg(o))for(let s of vae(o))i.push(Hs(o,s,"codex.exe"));i.push(Hs(r,"OpenAI","Codex","bin","codex.exe"),Hs(r,"Programs","OpenAI Codex","codex.exe"))}return n&&i.push(Hs(n,"npm","codex.cmd")),Lb(i.filter(Gg))}async function c5(t,e,r){if(r!=="win32")return"";let n=t==="user"?e.HUNSU_WINDOWS_USER_PATH:e.HUNSU_WINDOWS_MACHINE_PATH;if(n?.trim())return u5(n,e);let i=t==="user"?"HKCU\\Environment":"HKLM\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment";try{let{stdout:o}=await Nb("reg.exe",["query",i,"/v","Path"],{env:e,timeout:1500,windowsHide:!0,maxBuffer:65536});return u5(gae(o),e)}catch{return""}}async function mae(t){try{let{stdout:e}=await Nb("where.exe",["codex"],{env:t,timeout:1500,windowsHide:!0,maxBuffer:65536});return f5(e)}catch{return[]}}async function hae(t){let e="Get-Command codex -All | ForEach-Object { $_.Source }";for(let r of["powershell.exe","pwsh"])try{let{stdout:n}=await Nb(r,["-NoProfile","-Command",e],{env:r==="powershell.exe"?Wo(t):t,timeout:2e3,windowsHide:!0,maxBuffer:65536}),i=f5(n);if(i.length>0)return i}catch{}return[]}function gae(t){return t.split(/\r?\n/).map(r=>r.trim()).find(r=>/^Path\s+REG_/i.test(r))?.replace(/^Path\s+REG_\w+\s+/i,"").trim()??""}function f5(t){return Lb(t.split(/\r?\n/).map(e=>e.trim()).filter(e=>e.length>0&&!/^[-\s]+$/.test(e)&&!/^CommandType\b|^Name\b|^Source\b/i.test(e)))}function yae(t,e){if(e!=="win32")return;let r=lp(t,"LOCALAPPDATA","LocalAppData","localappdata"),n=r?Hs(r,"Microsoft","WindowsApps","codex.exe"):void 0;return n&&Gg(n)?n:void 0}function Mb(t,e){return e!=="win32"?t.PATH??"":[t.PATH,t.Path,t.path].filter(r=>typeof r=="string"&&r.trim().length>0).join(";")}function vae(t){try{return sae(t,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return[]}}function xae(t){let e=new Set,r=[];for(let n of t){let i=`${n.source}:${n.candidate}`;e.has(i)||(e.add(i),r.push(n))}return r}function lp(t,...e){return e.map(r=>t[r]).find(r=>typeof r=="string"&&r.trim().length>0)?.trim()}function Lb(t){return[...new Set(t.filter(e=>typeof e=="string"&&e.length>0))]}function ZA(t,e){return e==="win32"&&/(?:^|[\\/])WindowsApps[\\/]/i.test(t)}function u5(t,e){return t.replace(/%([^%]+)%/g,(r,n)=>{let i=n.trim(),o=Ar();return lp(e,i,i.toUpperCase(),i.toLowerCase())??o[i]??r})}function p5(t,e,r,n){return Tb(t,e,r,n)}function m5(t,e){let r=Ar(),n={...r,...t},i=e==="win32"?";":d5;for(let o of["PATH","Path","path"]){let s=t[o],a=r[o];if(s===""&&a){n[o]=a;continue}s&&a&&!s.split(i).includes(a)&&(n[o]=`${s}${i}${a}`)}return n}var zg=class{command;args;timeoutMs;child;nextId=1;buffer="";pending=new Map;constructor(e,r,n={}){this.command=e,this.args=n.args??["app-server","--stdio"],this.timeoutMs=r;let i=n.env??Ar(),o=n.platform??process.platform,s=p5(this.command,this.args,i,o);this.child=nae(s.command,s.args,{env:m5(i,o),stdio:["pipe","pipe","pipe"],windowsHide:!0,windowsVerbatimArguments:s.windowsVerbatimArguments}),this.child.stdout.setEncoding("utf8"),this.child.stdout.on("data",a=>this.read(a)),this.child.stderr.setEncoding("utf8"),this.child.on("error",a=>this.rejectAll(a)),this.child.on("exit",()=>this.rejectAll(new Error("Codex app-server process exited before probe completed.")))}request(e,r){let n=this.nextId;return this.nextId+=1,new Promise((i,o)=>{let s=setTimeout(()=>{this.pending.delete(n),o(new Error(`Codex app-server probe timed out: ${e}`))},this.timeoutMs);this.pending.set(n,{resolve:i,reject:o,timer:s});try{this.write({jsonrpc:"2.0",id:n,method:e,params:r})}catch(a){clearTimeout(s),this.pending.delete(n),o(a instanceof Error?a:new Error(String(a)))}})}async initialize(){let e=await this.request("initialize",{clientInfo:{name:"hunsu-bridge",title:"Hunsu Bridge",version:ln}});return this.notify("initialized",{}),e}notify(e,r){this.write({jsonrpc:"2.0",method:e,params:r})}close(){this.rejectAll(new Error("Codex app-server probe closed.")),this.child.kill()}write(e){this.child.stdin.write(`${JSON.stringify(e)}
|
|
206
206
|
`)}read(e){this.buffer+=e;let r=this.buffer.indexOf(`
|
|
207
207
|
`);for(;r>=0;){let n=this.buffer.slice(0,r).trim();if(this.buffer=this.buffer.slice(r+1),r=this.buffer.indexOf(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hunsu/bridge",
|
|
3
|
-
"version": "0.2.0-next.
|
|
3
|
+
"version": "0.2.0-next.9",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Headless Hunsu Bridge daemon, authenticated CLI, and local Web API.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -37,10 +37,10 @@
|
|
|
37
37
|
"werift": "0.23.0",
|
|
38
38
|
"ws": "8.21.0",
|
|
39
39
|
"@hunsu/codex-runner": "0.1.1",
|
|
40
|
-
"@hunsu/
|
|
41
|
-
"@hunsu/protocol-registry": "0.1.1",
|
|
40
|
+
"@hunsu/config": "0.1.1",
|
|
42
41
|
"@hunsu/core": "0.1.1",
|
|
43
|
-
"@hunsu/
|
|
42
|
+
"@hunsu/protocol": "0.1.1",
|
|
43
|
+
"@hunsu/protocol-registry": "0.1.1"
|
|
44
44
|
},
|
|
45
45
|
"scripts": {
|
|
46
46
|
"dev": "node --conditions=development src/cli.ts dev",
|